diff --git a/maven-ojc-archeType-v2/Developing_Component_From_Archtype_Guide.txt b/maven-ojc-archeType-v2/Developing_Component_From_Archtype_Guide.txt new file mode 100644 index 000000000..8937b0b96 --- /dev/null +++ b/maven-ojc-archeType-v2/Developing_Component_From_Archtype_Guide.txt @@ -0,0 +1,114 @@ +Command to buid OpenESB component from maven archetype : + +Description : + +This document shows how to develop openESB components, which will be build with OpenESB build only. +The project generated using these archtype will be similar to existing component built with OpenESB. +Folder structure for these new project will be based on openESB. + +- Plugin project can be build with netbeans-soa project. +- Component project can be build with ojc-core in openesb-component + +Install Archtype in Local repository : +====================================== + +NOTE: Maven version should be 2.0.9 as per OpenESB + +1) Checkout following Projects from repository : + + maven-archetype-service-engine-v2 + maven-archetype-binding-component-v2 + maven-archetype-service-engine-plugin-v2 + maven-archetype-binding-component-plugin-v2 + +For archetype of Service Engine +--------------------------------- +1) Change directory to maven-archetype-service-engine-v2/ + $ mvn clean install + +For archetype of Binding Component +--------------------------------- +1) Change directory to maven-archetype-binding-component-v2/ + $ mvn clean install + +For archetype of Service Engine Netbeans Plugin Project +--------------------------------- +1) Change directory to maven-archetype-service-engine-plugin-v2/ + $ mvn clean install + +For archetype of Binding Component Netbeans Plugin Project +--------------------------------- +1) Change directory to maven-archetype-binding-component-plugin-v2/ + $ mvn clean install + +==================Installation complete for all archetype in User's Local repository============== + +================================================= +Building Projects from archetypes +================================================= + +1) For Creating new service engine: + mvn archetype:generate -DarchetypeGroupId=open-jbi-components -DarchetypeArtifactId=service-engine-ojc-archetype \ + -DarchetypeVersion=2.3.0 -DgroupId=newse -DartifactId=newse + + --OutPut for above command requires user input + + [INFO] Scanning for projects... + [INFO] Searching repository for plugin with prefix: 'archetype'. + ...... + [GIVE THE Command line params options as per your wish and openESB configuration. + [INFO] Using property: groupId = newse + [INFO] Using property: artifactId = newse + Define value for property 'version': 1.0-SNAPSHOT: + [INFO] Using property: package = newse + [INFO] Using property: componentName = newse + Confirm properties configuration: + groupId: newse + artifactId: newse + version: 1.0-SNAPSHOT + package: newse + componentName: newse + Y: + [INFO] ---------------------------------------------------------------------------- + [INFO] Using following parameters for creating project from Archetype: service-engine-ojc-archetype:2.3.0 + [INFO] ---------------------------------------------------------------------------- + [INFO] ------------------------------------------------------------------------ + [INFO] BUILD SUCCESSFUL + [INFO] ------------------------------------------------------------------------ + [INFO] Total time: 2 minutes 49 seconds + [INFO] Finished at: Wed Jul 31 12:34:16 IST 2013 + [INFO] Final Memory: 20M/50M + [INFO] ------------------------------------------------------------------------ + + =========================== Project build is done ================================== + Open New project in OpenESB 2.3, and to build run smvn.bat clean install. + + +2) For Creating new binding component: + mvn archetype:generate -DarchetypeGroupId=open-jbi-components -DarchetypeArtifactId=binding-component-ojc-archetype \ + -DarchetypeVersion=2.3.0 -DgroupId=newbc -DartifactId=newbc + + --OutPut for above command requires user input + --Follow same steps and give input as it will ask. + + Open New project in OpenESB 2.3, and to build run smvn.bat clean install. + +3) For Creating new service engine plugin: + mvn archetype:generate -DarchetypeGroupId=open-jbi-components -DarchetypeArtifactId=ServiceEngine-Plugin-archetype \ + -DarchetypeVersion=1.0-SNAPSHOT -DgroupId=newsemodule -DartifactId=newsemodule -Dgoals=antrun:run + + --OutPut for above command requires user input + --Follow same steps and give input as it will ask. + + Open New project in OpenESB 2.3. + +3) For Creating new service engine plugin: + mvn archetype:generate -DarchetypeGroupId=open-jbi-components -DarchetypeArtifactId=BindingComponent-Plugin-archetype \ + -DarchetypeVersion=2.3.0 -DgroupId=newbcmodule -DartifactId=newbcmodule -Dgoals=antrun:run + + --OutPut for above command requires user input + --Follow same steps and give input as it will ask. + + Open New project in OpenESB 2.3. + + diff --git a/maven-ojc-archeType-v2/Developing_Component_From_Archtype_Guide.txt~ b/maven-ojc-archeType-v2/Developing_Component_From_Archtype_Guide.txt~ new file mode 100644 index 000000000..8937b0b96 --- /dev/null +++ b/maven-ojc-archeType-v2/Developing_Component_From_Archtype_Guide.txt~ @@ -0,0 +1,114 @@ +Command to buid OpenESB component from maven archetype : + +Description : + +This document shows how to develop openESB components, which will be build with OpenESB build only. +The project generated using these archtype will be similar to existing component built with OpenESB. +Folder structure for these new project will be based on openESB. + +- Plugin project can be build with netbeans-soa project. +- Component project can be build with ojc-core in openesb-component + +Install Archtype in Local repository : +====================================== + +NOTE: Maven version should be 2.0.9 as per OpenESB + +1) Checkout following Projects from repository : + + maven-archetype-service-engine-v2 + maven-archetype-binding-component-v2 + maven-archetype-service-engine-plugin-v2 + maven-archetype-binding-component-plugin-v2 + +For archetype of Service Engine +--------------------------------- +1) Change directory to maven-archetype-service-engine-v2/ + $ mvn clean install + +For archetype of Binding Component +--------------------------------- +1) Change directory to maven-archetype-binding-component-v2/ + $ mvn clean install + +For archetype of Service Engine Netbeans Plugin Project +--------------------------------- +1) Change directory to maven-archetype-service-engine-plugin-v2/ + $ mvn clean install + +For archetype of Binding Component Netbeans Plugin Project +--------------------------------- +1) Change directory to maven-archetype-binding-component-plugin-v2/ + $ mvn clean install + +==================Installation complete for all archetype in User's Local repository============== + +================================================= +Building Projects from archetypes +================================================= + +1) For Creating new service engine: + mvn archetype:generate -DarchetypeGroupId=open-jbi-components -DarchetypeArtifactId=service-engine-ojc-archetype \ + -DarchetypeVersion=2.3.0 -DgroupId=newse -DartifactId=newse + + --OutPut for above command requires user input + + [INFO] Scanning for projects... + [INFO] Searching repository for plugin with prefix: 'archetype'. + ...... + [GIVE THE Command line params options as per your wish and openESB configuration. + [INFO] Using property: groupId = newse + [INFO] Using property: artifactId = newse + Define value for property 'version': 1.0-SNAPSHOT: + [INFO] Using property: package = newse + [INFO] Using property: componentName = newse + Confirm properties configuration: + groupId: newse + artifactId: newse + version: 1.0-SNAPSHOT + package: newse + componentName: newse + Y: + [INFO] ---------------------------------------------------------------------------- + [INFO] Using following parameters for creating project from Archetype: service-engine-ojc-archetype:2.3.0 + [INFO] ---------------------------------------------------------------------------- + [INFO] ------------------------------------------------------------------------ + [INFO] BUILD SUCCESSFUL + [INFO] ------------------------------------------------------------------------ + [INFO] Total time: 2 minutes 49 seconds + [INFO] Finished at: Wed Jul 31 12:34:16 IST 2013 + [INFO] Final Memory: 20M/50M + [INFO] ------------------------------------------------------------------------ + + =========================== Project build is done ================================== + Open New project in OpenESB 2.3, and to build run smvn.bat clean install. + + +2) For Creating new binding component: + mvn archetype:generate -DarchetypeGroupId=open-jbi-components -DarchetypeArtifactId=binding-component-ojc-archetype \ + -DarchetypeVersion=2.3.0 -DgroupId=newbc -DartifactId=newbc + + --OutPut for above command requires user input + --Follow same steps and give input as it will ask. + + Open New project in OpenESB 2.3, and to build run smvn.bat clean install. + +3) For Creating new service engine plugin: + mvn archetype:generate -DarchetypeGroupId=open-jbi-components -DarchetypeArtifactId=ServiceEngine-Plugin-archetype \ + -DarchetypeVersion=1.0-SNAPSHOT -DgroupId=newsemodule -DartifactId=newsemodule -Dgoals=antrun:run + + --OutPut for above command requires user input + --Follow same steps and give input as it will ask. + + Open New project in OpenESB 2.3. + +3) For Creating new service engine plugin: + mvn archetype:generate -DarchetypeGroupId=open-jbi-components -DarchetypeArtifactId=BindingComponent-Plugin-archetype \ + -DarchetypeVersion=2.3.0 -DgroupId=newbcmodule -DartifactId=newbcmodule -Dgoals=antrun:run + + --OutPut for above command requires user input + --Follow same steps and give input as it will ask. + + Open New project in OpenESB 2.3. + + diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/pom.xml b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/pom.xml new file mode 100644 index 000000000..1fae9e48f --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/pom.xml @@ -0,0 +1,35 @@ + + + 4.0.0 + + open-jbi-components + BindingComponent-Plugin-archetype + 2.3.0 + jar + + BindingComponent-Plugin-archetype + + + + + org.apache.maven.archetype + archetype-packaging + 2.2 + + + + + + + maven-archetype-plugin + 2.2 + + + + + + Maven project for JBI Component that contains the + maven and netbeans build setup and component code to build and test the JBI Component. + + http://open-esb.org + diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/META-INF/maven/archetype-metadata.xml b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/META-INF/maven/archetype-metadata.xml new file mode 100644 index 000000000..709092f22 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/META-INF/maven/archetype-metadata.xml @@ -0,0 +1,50 @@ + + + + + + + nbproject + + **/*.xml + **/*.properties + + + + src + + **/*.java + **/*.xml + **/*.properties + + + + src + + **/*.ExtensibilityElementTemplateProvider + **/*.ElementFactory + **/*.png + **/*.ValidatorSchemaFactory + **/*.Validator + **/*.xsd + + + + + + build.xml + pom.xml + **/*.mf + + + + diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/build.xml b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/build.xml new file mode 100644 index 000000000..158b4a4f7 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/build.xml @@ -0,0 +1,8 @@ + + + + + + Builds, tests, and runs the project bcdeployplugin. + + diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/manifest.mf b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/manifest.mf new file mode 100644 index 000000000..e2ee77258 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/manifest.mf @@ -0,0 +1,6 @@ +Manifest-Version: 1.0 +OpenIDE-Module: bcdeployplugin +OpenIDE-Module-Layer: bcdeployplugin/layer.xml +OpenIDE-Module-Localizing-Bundle: bcdeployplugin/Bundle.properties +OpenIDE-Module-Specification-Version: 1.0 + diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/nbproject/build-impl.xml b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/nbproject/build-impl.xml new file mode 100644 index 000000000..877727427 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/nbproject/build-impl.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + You must set 'suite.dir' to point to your containing module suite + + + + + + + + + + + + + + + + + + + + + diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/nbproject/genfiles.properties b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/nbproject/genfiles.properties new file mode 100644 index 000000000..0b8724d2a --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/nbproject/genfiles.properties @@ -0,0 +1,8 @@ +build.xml.data.CRC32=1dc6d1f3 +build.xml.script.CRC32=30e09a00 +build.xml.stylesheet.CRC32=a56c6a5b@2.50.1 +# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. +# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. +nbproject/build-impl.xml.data.CRC32=4558c72b +nbproject/build-impl.xml.script.CRC32=d06ccb3f +nbproject/build-impl.xml.stylesheet.CRC32=68e521fc@2.50.1 diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/nbproject/platform.properties b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/nbproject/platform.properties new file mode 100644 index 000000000..90eaca546 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/nbproject/platform.properties @@ -0,0 +1,27 @@ +branding.token=soa +cluster.path=\ + ${nbplatform.active.dir}/apisupport:\ + ${nbplatform.active.dir}/cnd:\ + ${nbplatform.active.dir}/dlight:\ + ${nbplatform.active.dir}/enterprise:\ + ${nbplatform.active.dir}/ergonomics:\ + ${nbplatform.active.dir}/groovy:\ + ${nbplatform.active.dir}/harness:\ + ${nbplatform.active.dir}/ide:\ + ${nbplatform.active.dir}/java:\ + ${nbplatform.active.dir}/javacard:\ + ${nbplatform.active.dir}/javafx:\ + ${nbplatform.active.dir}/mobility:\ + ${nbplatform.active.dir}/nb:\ + ${nbplatform.active.dir}/php:\ + ${nbplatform.active.dir}/platform:\ + ${nbplatform.active.dir}/profiler:\ + ${nbplatform.active.dir}/webcommon:\ + ${nbplatform.active.dir}/websvccommon +suite.dir=${basedir} +dest.dir=${suite.dir}/soabuild +nb.dest.dir=${dest.dir}/netbeans + +nbplatform.active=default +nbplatform.nb721.netbeans.dest.dir=${dest.dir}/netbeans +nbplatform.nb721.harness.dir=${nbplatform.nb721.netbeans.dest.dir}/harness diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/nbproject/private/platform-private.properties b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/nbproject/private/platform-private.properties new file mode 100644 index 000000000..b52edef60 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/nbproject/private/platform-private.properties @@ -0,0 +1 @@ +user.properties.file=D:\\softwares\\openesb_logicoy_last_working57\\.netbeans\\openesb\\build.properties diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/nbproject/project.properties b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/nbproject/project.properties new file mode 100644 index 000000000..7b829ab89 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/nbproject/project.properties @@ -0,0 +1,30 @@ +javac.source=1.6 +javac.compilerargs=-Xlint -Xlint:-serial + +test.unit.cp.extra=\ + ${netbeans.dest.dir}/ide7/modules/org-netbeans-modules-xml-xdm.jar:\ + ${netbeans.dest.dir}/ide7/modules/org-netbeans-modules-xml-xam.jar:\ + ${netbeans.dest.dir}/ide7/modules/org-netbeans-modules-xml-retriever.jar:\ + ${netbeans.dest.dir}/ide7/modules/org-netbeans-modules-xml-schema-model.jar:\ + ${netbeans.dest.dir}/ide7/modules/org-netbeans-modules-xml-wsdl-model.jar:\ + ${netbeans.dest.dir}/ide7/modules/org-netbeans-modules-editor.jar:\ + ${netbeans.dest.dir}/platform6/lib/org-openide-modules.jar:\ + ${netbeans.dest.dir}/platform6/lib/org-openide-util.jar:\ + ${netbeans.dest.dir}/platform6/modules/org-openide-options.jar:\ + ${netbeans.dest.dir}/platform6/modules/org-openide-text.jar:\ + ${netbeans.dest.dir}/platform6/modules/org-openide-nodes.jar:\ + ${netbeans.dest.dir}/platform6/modules/org-openide-loaders.jar:\ + ${netbeans.dest.dir}/platform6/modules/org-openide-dialogs.jar:\ + ${netbeans.dest.dir}/platform6/modules/org-openide-windows.jar:\ + ${netbeans.dest.dir}/platform6/modules/org-openide-awt.jar:\ + ${netbeans.dest.dir}/platform6/modules/org-netbeans-modules-masterfs.jar:\ + ${netbeans.dest.dir}/platform6/core/org-openide-filesystems.jar:\ + ${netbeans.dest.dir}/ide7/modules/org-netbeans-modules-projectapi.jar:\ + ${netbeans.dest.dir}/ide7/modules/org-netbeans-modules-editor-util.jar:\ + ${netbeans.dest.dir}/ide7/modules/org-netbeans-modules-xml-text.jar:\ + ${netbeans.dest.dir}/ide7/modules/org-netbeans-modules-xml-core.jar:\ + ${netbeans.dest.dir}/ide7/modules/org-netbeans-modules-editor-lib.jar:\ + ${netbeans.dest.dir}/ide7/modules/org-apache-xml-resolver.jar:\ + ${netbeans.dest.dir}/soa1/modules/org-netbeans-modules-wsdlextensions-jms.jar + +test.unit.run.cp=${test.unit.cp.extra} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/nbproject/project.xml b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/nbproject/project.xml new file mode 100644 index 000000000..9fdac1d87 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/nbproject/project.xml @@ -0,0 +1,56 @@ + + + org.netbeans.modules.apisupport.project + + + bcdeployplugin + + + + org.netbeans.modules.soa.wsdl.bindingsupport + + + + 7.2.1 + + + + org.netbeans.modules.xml.schema.model + + + + 1 + 1.2 + + + + org.netbeans.modules.xml.wsdl.model + + + + 1 + 1.2 + + + + org.netbeans.modules.xml.xam + + + + 1 + 1.2 + + + + org.openide.util + + + + 7.9.0.1 + + + + + + + diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/nbproject/suite.properties b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/nbproject/suite.properties new file mode 100644 index 000000000..364e160e1 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/nbproject/suite.properties @@ -0,0 +1 @@ +suite.dir=${basedir}/.. diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/pom.xml b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/pom.xml new file mode 100644 index 000000000..6d46b589f --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/pom.xml @@ -0,0 +1,95 @@ + + + + 4.0.0 + ${groupId} + ${artifactId} + jar + ${version} + JBI Component[BindingComponent] + Maven project for JBI Component that contains the + maven and netbeans build setup and component code to build and test the JBI Component. + http://open-esb.org + + build + src/java + test/java + build/classes + build/test/classes + package + + + + maven-antrun-plugin + 1.2 + + + default-cli + + run + + + + !!!!!!!!!!!!!!!!!!!!!! Moving Files and organizing package !!!!!!!!!!!!!!!!!!!!!!!! + + !!!!!!!!!!!!!!!!!!!!!! Moving Files and organizing package completed successfully!!!!!!!!!!!!!!!!!!!!!!!! + + + + + + + + ant + ant-nodeps + 1.6.5 + + + ant + ant-junit + 1.6.5 + test + + + junit + junit + 3.8.2 + test + + + + + + + + ant + ant-nodeps + 1.6.5 + + + ant + ant-junit + 1.6.5 + test + + + junit + junit + 3.8.2 + test + + + org.apache.maven + maven-ant-tasks + 2.0.7 + + diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/META-INF/services/org.netbeans.modules.xml.wsdl.bindingsupport.spi.ExtensibilityElementTemplateProvider b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/META-INF/services/org.netbeans.modules.xml.wsdl.bindingsupport.spi.ExtensibilityElementTemplateProvider new file mode 100644 index 000000000..5d706f033 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/META-INF/services/org.netbeans.modules.xml.wsdl.bindingsupport.spi.ExtensibilityElementTemplateProvider @@ -0,0 +1 @@ +cname.template.WSDLExtTemplateProvider diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/META-INF/services/org.netbeans.modules.xml.wsdl.model.spi.ElementFactory b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/META-INF/services/org.netbeans.modules.xml.wsdl.model.spi.ElementFactory new file mode 100644 index 000000000..90f3ddb3c --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/META-INF/services/org.netbeans.modules.xml.wsdl.model.spi.ElementFactory @@ -0,0 +1,6 @@ +cname.model.ExtElementFactoryProvider$BindingExtFactory +cname.model.ExtElementFactoryProvider$OperationExtFactory +cname.model.ExtElementFactoryProvider$InputExtFactory +cname.model.ExtElementFactoryProvider$OutputExtFactory +cname.model.ExtElementFactoryProvider$FaultExtFactory +cname.model.ExtElementFactoryProvider$PortExtFactory diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/META-INF/services/org.netbeans.modules.xml.wsdl.validator.spi.ValidatorSchemaFactory b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/META-INF/services/org.netbeans.modules.xml.wsdl.validator.spi.ValidatorSchemaFactory new file mode 100644 index 000000000..5caf7af1f --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/META-INF/services/org.netbeans.modules.xml.wsdl.validator.spi.ValidatorSchemaFactory @@ -0,0 +1 @@ +cname.validator.WSDLExtValidatorSchemaFactory diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/META-INF/services/org.netbeans.modules.xml.xam.spi.Validator b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/META-INF/services/org.netbeans.modules.xml.xam.spi.Validator new file mode 100644 index 000000000..695264745 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/META-INF/services/org.netbeans.modules.xml.xam.spi.Validator @@ -0,0 +1,2 @@ +cname.validator.WSDLExtValidator + diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/BindingComponentWsdlExt.xsd b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/BindingComponentWsdlExt.xsd new file mode 100644 index 000000000..9e9dcb129 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/BindingComponentWsdlExt.xsd @@ -0,0 +1,112 @@ + + + + + + + + + "binding" defines a protocol based binding details. + + + + + + + + + + + + + + "operation" defines the protocol based binding operation details. + + + + + + + + + + + + + + + + "input" defines the protocol based binding input details. + + + + + + + + + + + + + + + "output" defines the protocol based binding output details. + + + + + + + + + + + + + + + "fault" defines the protocol based binding fault details. + + + + + + + + + + + + + + + "address" indicates protocol based binding port details. + + + + + + + + + + + + + diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/Bundle.properties b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/Bundle.properties new file mode 100644 index 000000000..44d1bd26e --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/Bundle.properties @@ -0,0 +1,21 @@ +# binding component deployment plugin resource bundle +# binding deploy plugin +OpenIDE-Module-Name=BCDeployPlugin +# deployment plugin +OpenIDE-Module-Short-Description=Binding component deployment plugin for BindingComponent +# deployment plugin for adding wsdl extensions related to the binding component to the wsdl editor +OpenIDE-Module-Long-Description=Deployment plugin for adding wsdl extensions related to this binding component to the wsdl editor +# category +OpenIDE-Module-Display-Category=CAPS + +# WSDLEditor mapping names for the Binding +WSDLEditor/Binding/BindingComponentBindingExt=BindingComponent Binding +WSDLEditor/BindingOperation/BindingComponentOperationExt=BindingComponent Binding Operation extension +WSDLEditor/BindingOperationInput/BindingComponentInputExt=BindingComponent Binding Input extension +WSDLEditor/BindingOperationOutput/BindingComponentOutputExt=BindingComponent Binding Output extension +WSDLEditor/BindingOperationFault/BindingComponentFaultExt=BindingComponent Binding Fault extension +WSDLEditor/ServicePort/BindingComponentPortExt=BindingComponent Service Port extension + + + + diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/layer.xml b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/layer.xml new file mode 100644 index 000000000..7b545db1e --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/layer.xml @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/model/BindingExt.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/model/BindingExt.java new file mode 100644 index 000000000..3d50c6f9e --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/model/BindingExt.java @@ -0,0 +1,47 @@ +/* + * BindingExt.java + */ +package net.openesb.component.${artifactId}.model; + +import org.netbeans.modules.xml.wsdl.model.Binding; +import org.netbeans.modules.xml.wsdl.model.WSDLModel; +import org.netbeans.modules.xml.xam.Component; +import org.w3c.dom.Element; +import org.w3c.dom.Element; + +/** + * This interface and its implementation represents the java model for binding + * extension element. + * + * @author chikkala + */ +public interface BindingExt extends ExtComponent { + +//TODO: define get/set methods for properties for BindingExt if the extension element has attributes. + /** + * This class is an implementation of BindingExt interface that provides + * java model for binding extensibility element. + */ + public static class BindingExtImpl extends ExtModelImpl implements BindingExt { + + public BindingExtImpl(WSDLModel model, Element e) { + super(model, e); + } + + public BindingExtImpl(WSDLModel model) { + this(model, createPrefixedElement(QN_BINDING_EXT, model)); + } + + public void accept(ExtVisitor visitor) { + visitor.visit(this); + } + + @Override + public boolean canBeAddedTo(Component target) { + if (target instanceof Binding) { + return true; + } + return false; + } + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/model/ExtAttribute.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/model/ExtAttribute.java new file mode 100644 index 000000000..58abbf15c --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/model/ExtAttribute.java @@ -0,0 +1,53 @@ +/* + * ExtAttribute.java + */ +package net.openesb.component.${artifactId}.model; + +import org.netbeans.modules.xml.xam.dom.Attribute; + +/** + * @author chikkala + */ +public enum ExtAttribute implements Attribute, ExtConstants { + + //TODO: define any additional extension elements attributes here + ACTION(ATTR_ACTION), + SERVICE_URL(ATTR_SERVICE_URL), + USERNAME(ATTR_USERNAME), + PASSWORD(ATTR_PASSWORD), + MBEAN(ATTR_MBEAN); + private String name; + private Class type; + private Class subtype; + + ExtAttribute(String name) { + this(name, String.class); + } + + ExtAttribute(String name, Class type) { + this(name, type, null); + } + + ExtAttribute(String name, Class type, Class subtype) { + this.name = name; + this.type = type; + this.subtype = subtype; + } + + @Override + public String toString() { + return name; + } + + public Class getType() { + return type; + } + + public String getName() { + return name; + } + + public Class getMemberType() { + return subtype; + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/model/ExtComponent.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/model/ExtComponent.java new file mode 100644 index 000000000..cf3f28f42 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/model/ExtComponent.java @@ -0,0 +1,35 @@ +/* + * ExtComponent.java + */ +package net.openesb.component.${artifactId}.model; + +import org.netbeans.modules.xml.wsdl.model.ExtensibilityElement; +import org.netbeans.modules.xml.wsdl.model.WSDLModel; +import org.netbeans.modules.xml.wsdl.model.spi.GenericExtensibilityElement; +import org.w3c.dom.Element; + +/** + * This is the base class for the extension model + * + * @author chikkala + */ +public interface ExtComponent extends ExtConstants, ExtensibilityElement { + + void accept(ExtVisitor visitor); + + /** + * this class is the base class for the extension model objects + */ + public static abstract class ExtModelImpl + extends GenericExtensibilityElement implements ExtComponent { + + public ExtModelImpl(WSDLModel model, Element e) { + super(model, e); + } + + @Override + protected String getNamespaceURI() { + return NS_URI; + } + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/model/ExtConstants.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/model/ExtConstants.java new file mode 100644 index 000000000..3e00176d2 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/model/ExtConstants.java @@ -0,0 +1,47 @@ +/* + * ExtConstants.java + * + */ +package net.openesb.component.${artifactId}.model; + +import javax.xml.namespace.QName; + +/** + * This interface defines the constants for the namespace, elements, attributes + * and qnames corresponding to the wsdl extensions that this component + * processes. These constants will be used in the wsdl extension model used to + * process a particular wsdl extensions. + * + * @author chikkala + */ +public interface ExtConstants { + + public static final String NS_URI_WSDL = "http://schemas.xmlsoap.org/wsdl/"; + public static final String NS_URI_XMLNS = "http://www.w3.org/2000/xmlns/"; + /** + * wsdl extension namespace processed by this wsdl extension model + */ + public static final String NS_URI = "http://java.sun.com/jbi/wsdl-extensions/sample/jmx-bc/"; + public static final String NS_DEF_PREFIX = "jmxbc"; + // wsdl extension element names. + public static final String EL_BINDING_EXT = "binding"; + public static final String EL_OPERATION_EXT = "operation"; + public static final String EL_INPUT_EXT = "input"; + public static final String EL_OUTPUT_EXT = "output"; + public static final String EL_FAULT_EXT = "fault"; + public static final String EL_PORT_EXT = "address"; + // Qualified wsdl extension element names. + public static final QName QN_BINDING_EXT = new QName(NS_URI, EL_BINDING_EXT); + public static final QName QN_OPERATION_EXT = new QName(NS_URI, EL_OPERATION_EXT); + public static final QName QN_INPUT_EXT = new QName(NS_URI, EL_INPUT_EXT); + public static final QName QN_OUTPUT_EXT = new QName(NS_URI, EL_OUTPUT_EXT); + public static final QName QN_FAULT_EXT = new QName(NS_URI, EL_FAULT_EXT); + public static final QName QN_PORT_EXT = new QName(NS_URI, EL_PORT_EXT); + //TODO: define any additional extension element attribute names here. + // wsdl extension elements attribute names. + public static final String ATTR_ACTION = "action"; + public static final String ATTR_SERVICE_URL = "serviceURL"; + public static final String ATTR_USERNAME = "username"; + public static final String ATTR_PASSWORD = "password"; + public static final String ATTR_MBEAN = "mbean"; +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/model/ExtElementFactoryProvider.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/model/ExtElementFactoryProvider.java new file mode 100644 index 000000000..0d3711cc4 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/model/ExtElementFactoryProvider.java @@ -0,0 +1,85 @@ +/* + * ExtElementFactoryProvider + */ +package net.openesb.component.${artifactId}.model; + +import java.util.Collections; +import java.util.Set; +import javax.xml.namespace.QName; +import org.netbeans.modules.xml.wsdl.model.WSDLComponent; +import org.netbeans.modules.xml.wsdl.model.spi.ElementFactory; +import org.w3c.dom.Element; + +/** + * Factory class that has wsdl extension elements model factories + * + * @author chikkala + */ +public class ExtElementFactoryProvider { + + public static class BindingExtFactory extends ElementFactory { + + public Set getElementQNames() { + return Collections.singleton(ExtConstants.QN_BINDING_EXT); + } + + public WSDLComponent create(WSDLComponent context, Element element) { + return new BindingExt.BindingExtImpl(context.getModel(), element); + } + } + + public static class OperationExtFactory extends ElementFactory { + + public Set getElementQNames() { + return Collections.singleton(ExtConstants.QN_OPERATION_EXT); + } + + public WSDLComponent create(WSDLComponent context, Element element) { + return new OperationExt.OperationExtImpl(context.getModel(), element); + } + } + + public static class InputExtFactory extends ElementFactory { + + public Set getElementQNames() { + return Collections.singleton(ExtConstants.QN_INPUT_EXT); + } + + public WSDLComponent create(WSDLComponent context, Element element) { + return new InputExt.InputExtImpl(context.getModel(), element); + } + } + + public static class OutputExtFactory extends ElementFactory { + + public Set getElementQNames() { + return Collections.singleton(ExtConstants.QN_OUTPUT_EXT); + } + + public WSDLComponent create(WSDLComponent context, Element element) { + return new OutputExt.OutputExtImpl(context.getModel(), element); + } + } + + public static class FaultExtFactory extends ElementFactory { + + public Set getElementQNames() { + return Collections.singleton(ExtConstants.QN_FAULT_EXT); + } + + public WSDLComponent create(WSDLComponent context, Element element) { + return new FaultExt.FaultExtImpl(context.getModel(), element); + } + } + + public static class PortExtFactory extends ElementFactory { + + public Set getElementQNames() { + return Collections.singleton(ExtConstants.QN_PORT_EXT); + } + + public WSDLComponent create(WSDLComponent context, Element element) { + return new PortExt.PortExtImpl(context.getModel(), element); + } + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/model/ExtVisitor.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/model/ExtVisitor.java new file mode 100644 index 000000000..606b4da96 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/model/ExtVisitor.java @@ -0,0 +1,25 @@ +/* + * ExtVisitor.java + */ +package net.openesb.component.${artifactId}.model; + +/** + * This interface provides the visitor pattern to validate the extension model + * objects. + * + * @author chikkala + */ +public interface ExtVisitor { + + void visit(BindingExt bindingExt); + + void visit(OperationExt operationExt); + + void visit(InputExt inputExt); + + void visit(OutputExt outputExt); + + void visit(FaultExt faultExt); + + void visit(PortExt portExt); +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/model/FaultExt.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/model/FaultExt.java new file mode 100644 index 000000000..7816822ac --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/model/FaultExt.java @@ -0,0 +1,47 @@ +/* + * FaultExt.java + */ +package net.openesb.component.${artifactId}.model; + +import org.netbeans.modules.xml.wsdl.model.BindingFault; +import org.netbeans.modules.xml.wsdl.model.WSDLModel; +import org.netbeans.modules.xml.xam.Component; +import org.w3c.dom.Element; +import org.w3c.dom.Element; + +/** + * This interface and its implementation represents the java model for binding + * operation fault extension element. + * + * @author chikkala + */ +public interface FaultExt extends ExtComponent { + +//TODO: define get/set methods for properties for FaultExt if the extension element has attributes. + /** + * This class is an implementation of FaultExt interface that provides java + * model for binding operation fault extensibility element. + */ + public static class FaultExtImpl extends ExtModelImpl implements FaultExt { + + public FaultExtImpl(WSDLModel model, Element e) { + super(model, e); + } + + public FaultExtImpl(WSDLModel model) { + this(model, createPrefixedElement(QN_FAULT_EXT, model)); + } + + public void accept(ExtVisitor visitor) { + visitor.visit(this); + } + + @Override + public boolean canBeAddedTo(Component target) { + if (target instanceof BindingFault) { + return true; + } + return false; + } + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/model/InputExt.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/model/InputExt.java new file mode 100644 index 000000000..4aeb4fcd7 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/model/InputExt.java @@ -0,0 +1,47 @@ +/* + * InputExt.java + */ +package net.openesb.component.${artifactId}.model; + +import org.netbeans.modules.xml.wsdl.model.BindingInput; +import org.netbeans.modules.xml.wsdl.model.WSDLModel; +import org.netbeans.modules.xml.xam.Component; +import org.w3c.dom.Element; +import org.w3c.dom.Element; + +/** + * This interface and its implementation represents the java model for binding + * operation input extension element. + * + * @author chikkala + */ +public interface InputExt extends ExtComponent { + +//TODO: define get/set methods for properties for InputExt if the extension element has attributes. + /** + * This class is an implementation of InputExt interface that provides java + * model for binding operation input extensibility element. + */ + public static class InputExtImpl extends ExtModelImpl implements InputExt { + + public InputExtImpl(WSDLModel model, Element e) { + super(model, e); + } + + public InputExtImpl(WSDLModel model) { + this(model, createPrefixedElement(QN_INPUT_EXT, model)); + } + + public void accept(ExtVisitor visitor) { + visitor.visit(this); + } + + @Override + public boolean canBeAddedTo(Component target) { + if (target instanceof BindingInput) { + return true; + } + return false; + } + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/model/OperationExt.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/model/OperationExt.java new file mode 100644 index 000000000..408774e38 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/model/OperationExt.java @@ -0,0 +1,68 @@ +/* + * OperationExt.java + */ +package net.openesb.component.${artifactId}.model; + +import org.netbeans.modules.xml.wsdl.model.BindingOperation; +import org.netbeans.modules.xml.wsdl.model.WSDLModel; +import org.netbeans.modules.xml.xam.Component; +import org.w3c.dom.Element; +import org.w3c.dom.Element; + +/** + * This interface and its implementation represents the java model for binding + * operation extension element. + * + * @author chikkala + */ +public interface OperationExt extends ExtComponent { + + /** + * Getter for property action. + * + * @return Value of property action. + */ + public String getAction(); + + /** + * Setter for property action. + * + * @param action New value of property action. + */ + public void setAction(String action); + + /** + * This class is an implementation of OperationExt interface that provides + * java model for binding operation extensibility element. + */ + public static class OperationExtImpl extends ExtModelImpl implements OperationExt { + + public OperationExtImpl(WSDLModel model, Element e) { + super(model, e); + } + + public OperationExtImpl(WSDLModel model) { + this(model, createPrefixedElement(QN_OPERATION_EXT, model)); + } + + public void accept(ExtVisitor visitor) { + visitor.visit(this); + } + + @Override + public boolean canBeAddedTo(Component target) { + if (target instanceof BindingOperation) { + return true; + } + return false; + } + + public String getAction() { + return getAttribute(ExtAttribute.ACTION); + } + + public void setAction(String action) { + setAttribute(ATTR_ACTION, ExtAttribute.ACTION, action); + } + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/model/OutputExt.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/model/OutputExt.java new file mode 100644 index 000000000..70c9ff12b --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/model/OutputExt.java @@ -0,0 +1,47 @@ +/* + * OutputExt.java + */ +package net.openesb.component.${artifactId}.model; + +import org.netbeans.modules.xml.wsdl.model.BindingOutput; +import org.netbeans.modules.xml.wsdl.model.WSDLModel; +import org.netbeans.modules.xml.xam.Component; +import org.w3c.dom.Element; +import org.w3c.dom.Element; + +/** + * This interface and its implementation represents the java model for binding + * operation output extension element. + * + * @author chikkala + */ +public interface OutputExt extends ExtComponent { + +//TODO: define get/set methods for properties for OutputExt if the extension element has attributes. + /** + * This class is an implementation of OutputExt interface that provides java + * model for binding operation output extension element. + */ + public static class OutputExtImpl extends ExtModelImpl implements OutputExt { + + public OutputExtImpl(WSDLModel model, Element e) { + super(model, e); + } + + public OutputExtImpl(WSDLModel model) { + this(model, createPrefixedElement(QN_OUTPUT_EXT, model)); + } + + public void accept(ExtVisitor visitor) { + visitor.visit(this); + } + + @Override + public boolean canBeAddedTo(Component target) { + if (target instanceof BindingOutput) { + return true; + } + return false; + } + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/model/PortExt.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/model/PortExt.java new file mode 100644 index 000000000..b2e817bac --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/model/PortExt.java @@ -0,0 +1,134 @@ +/* + * PortExt.java + */ +package net.openesb.component.${artifactId}.model; + +import org.netbeans.modules.xml.wsdl.model.Port; +import org.netbeans.modules.xml.wsdl.model.WSDLModel; +import org.netbeans.modules.xml.xam.Component; +import org.w3c.dom.Element; +import org.w3c.dom.Element; + +/** + * This interface and its implementation represents the java model for service + * port extension element. + * + * @author chikkala + */ +public interface PortExt extends ExtComponent { + + /** + * Getter for property serviceURL. + * + * @return Value of property serviceURL. + */ + public String getServiceURL(); + + /** + * Setter for property serviceURL. + * + * @param serviceURL New value of property serviceURL. + */ + public void setServiceURL(String serviceURL); + + /** + * Getter for property username. + * + * @return Value of property username. + */ + public String getUsername(); + + /** + * Setter for property username. + * + * @param username New value of property username. + */ + public void setUsername(String username); + + /** + * Getter for property password. + * + * @return Value of property password. + */ + public String getPassword(); + + /** + * Setter for property password. + * + * @param password New value of property password. + */ + public void setPassword(String password); + + /** + * Getter for property name. + * + * @return Value of property name. + */ + public String getMBean(); + + /** + * Setter for property mbean. + * + * @param name New value of property mbean. + */ + public void setMBean(String mbean); + + /** + * This class is an implementation of PortExt interface that provides java + * model for service port extensibility element. + */ + public static class PortExtImpl extends ExtModelImpl implements PortExt { + + public PortExtImpl(WSDLModel model, Element e) { + super(model, e); + } + + public PortExtImpl(WSDLModel model) { + this(model, createPrefixedElement(QN_PORT_EXT, model)); + } + + public void accept(ExtVisitor visitor) { + visitor.visit(this); + } + + @Override + public boolean canBeAddedTo(Component target) { + if (target instanceof Port) { + return true; + } + return false; + } + + public String getServiceURL() { + return getAttribute(ExtAttribute.SERVICE_URL); + } + + public void setServiceURL(String serviceURL) { + setAttribute(ATTR_SERVICE_URL, ExtAttribute.SERVICE_URL, serviceURL); + } + + public String getUsername() { + return getAttribute(ExtAttribute.USERNAME); + } + + public void setUsername(String username) { + setAttribute(ATTR_USERNAME, ExtAttribute.USERNAME, username); + } + + public String getPassword() { + return getAttribute(ExtAttribute.PASSWORD); + } + + public void setPassword(String password) { + setAttribute(ATTR_PASSWORD, ExtAttribute.PASSWORD, password); + } + + public String getMBean() { + return getAttribute(ExtAttribute.MBEAN); + } + + public void setMBean(String mbean) { + setAttribute(ATTR_MBEAN, ExtAttribute.MBEAN, mbean); + } + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/resources/binding-ext.png b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/resources/binding-ext.png new file mode 100644 index 000000000..c378d1276 Binary files /dev/null and b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/resources/binding-ext.png differ diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/resources/fault-ext.png b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/resources/fault-ext.png new file mode 100644 index 000000000..493433031 Binary files /dev/null and b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/resources/fault-ext.png differ diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/resources/input-ext.png b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/resources/input-ext.png new file mode 100644 index 000000000..559909e3d Binary files /dev/null and b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/resources/input-ext.png differ diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/resources/operation-ext.png b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/resources/operation-ext.png new file mode 100644 index 000000000..5c63b31f7 Binary files /dev/null and b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/resources/operation-ext.png differ diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/resources/output-ext.png b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/resources/output-ext.png new file mode 100644 index 000000000..559909e3d Binary files /dev/null and b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/resources/output-ext.png differ diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/resources/port-ext.png b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/resources/port-ext.png new file mode 100644 index 000000000..a6b7f8415 Binary files /dev/null and b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/resources/port-ext.png differ diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/template/Bundle.properties b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/template/Bundle.properties new file mode 100644 index 000000000..6e61ecc5a --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/template/Bundle.properties @@ -0,0 +1,12 @@ +# WSDL Wizard template resources for this biding extensions +#template group name. must be jbi component name for which this template is present. +TEMPLATEGROUP_name=BINDINGCOMPONENT +# wsdl extension prefix i18n property. TEMPLATEGROUP_prefix_{wsdlext_prefix} +# wsdlext_prefix is the prefix attribute value of templateGroup element in the template.xml +TEMPLATEGROUP_prefix_bindingcomponent=bindingcomponent +# template name i18n property. An entry per template element in the template.xml +# TEMPLATE_name_{t_name} t_name is the name attribute value of the template element in the template.xml +TEMPLATE_name_mybcTransport=mybc Transport + + + diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/template/WSDLExtTemplateProvider.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/template/WSDLExtTemplateProvider.java new file mode 100644 index 000000000..dcd434326 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/template/WSDLExtTemplateProvider.java @@ -0,0 +1,24 @@ +/* + * WSDLExtTemplateProvider.java + */ +package net.openesb.component.${artifactId}.template; + +import java.io.InputStream; +import org.netbeans.modules.xml.wsdl.bindingsupport.spi.ExtensibilityElementTemplateProvider; +import org.openide.util.NbBundle; + +/** + * @author chikkala + */ +public class WSDLExtTemplateProvider extends ExtensibilityElementTemplateProvider { + + private final String templateUrl = "template.xml"; // relative path. + + public InputStream getTemplateInputStream() { + return this.getClass().getResourceAsStream(templateUrl); + } + + public String getLocalizedMessage(String str, Object[] objects) { + return NbBundle.getMessage(this.getClass(), str, objects); + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/template/template.xml b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/template/template.xml new file mode 100644 index 000000000..7beeb0eba --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/template/template.xml @@ -0,0 +1,71 @@ + + + + + + diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/validator/WSDLExtValidator.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/validator/WSDLExtValidator.java new file mode 100644 index 000000000..3f2119f66 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/validator/WSDLExtValidator.java @@ -0,0 +1,229 @@ +/* + * WSDLExtValidator.java + */ +package net.openesb.component.${artifactId}.validator; + +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; +import net.openesb.component.${artifactId}.model.BindingExt; +import net.openesb.component.${artifactId}.model.ExtVisitor; +import net.openesb.component.${artifactId}.model.FaultExt; +import net.openesb.component.${artifactId}.model.InputExt; +import net.openesb.component.${artifactId}.model.OperationExt; +import net.openesb.component.${artifactId}.model.OutputExt; +import net.openesb.component.${artifactId}.model.PortExt; +import org.netbeans.modules.xml.wsdl.model.Binding; +import org.netbeans.modules.xml.wsdl.model.BindingFault; +import org.netbeans.modules.xml.wsdl.model.BindingInput; +import org.netbeans.modules.xml.wsdl.model.BindingOperation; +import org.netbeans.modules.xml.wsdl.model.BindingOutput; +import org.netbeans.modules.xml.wsdl.model.Definitions; +import org.netbeans.modules.xml.wsdl.model.Port; +import org.netbeans.modules.xml.wsdl.model.Service; +import org.netbeans.modules.xml.wsdl.model.WSDLModel; +import org.netbeans.modules.xml.xam.Model; +import org.netbeans.modules.xml.xam.Model.State; +import org.netbeans.modules.xml.xam.spi.Validation; +import org.netbeans.modules.xml.xam.spi.Validation.ValidationType; +import org.netbeans.modules.xml.xam.spi.ValidationResult; +import org.netbeans.modules.xml.xam.spi.Validator; +import org.netbeans.modules.xml.xam.spi.Validator.ResultItem; +import org.openide.util.NbBundle; + +/** + * This class implements the wsdl model validation with respect to the wsdl + * extension elements supported by the specific wsdl extension namespace. + * + * @author ${user} + */ +public class WSDLExtValidator implements Validator, ExtVisitor { + + public static final Set EMPTY_RESULT_ITEM = Collections.emptySet(); + public static final Set EMPTY_MODEL = Collections.emptySet(); + public static final ValidationResult EMPTY_RESULT = new ValidationResult(EMPTY_RESULT_ITEM, EMPTY_MODEL); + private Validation mValidation; + private ValidationType mValidationType; + private ValidationResult mValidationResult; + + public WSDLExtValidator() { + } + + /** + * @return name of the validation service. + */ + public String getName() { + return getClass().getName(); + } + + /** + * Validates given model. + * + * @param model model to validate. + * @param validation reference to the validation context. + * @param validationType the type of validation to perform + * @return ValidationResult. + */ + public ValidationResult validate(Model model, Validation validation, ValidationType validationType) { + + mValidation = validation; + mValidationType = validationType; + + HashSet results = new HashSet(); + HashSet models = new HashSet(); + models.add(model); + + mValidationResult = new ValidationResult(results, models); + + if (model instanceof WSDLModel) { + WSDLModel wsdlModel = (WSDLModel) model; + + if (model.getState() == State.NOT_WELL_FORMED) { + return EMPTY_RESULT; + } + + validateWSDLModel(wsdlModel, results); // validate WSDL Model + } + // Clear out our state + mValidation = null; + mValidationType = null; + + return mValidationResult; + } + + /** + * this method validates the WSDLModel and updates the result set with the + * possible ERRORs, ADVICEs or WARNINGS It calls each wsdl extension element + * models visitor method to validate each extension element. Modify this + * method to add more validations such as scope and limit of the extension + * elements etc. + */ + public void validateWSDLModel(WSDLModel wsdlModel, HashSet results) { + //TODO: add any specific validations such as extension element size etc in addition + // to the element validation itself. + Definitions defs = wsdlModel.getDefinitions(); + // for each binding + for (Binding binding : defs.getBindings()) { + // validate binding extensions + for (BindingExt bindingExt : binding.getExtensibilityElements(BindingExt.class)) { + bindingExt.accept(this); + } + // for each binding operation + for (BindingOperation bindingOp : binding.getBindingOperations()) { + // validate binding operation extensions + for (OperationExt operationExt : bindingOp.getExtensibilityElements(OperationExt.class)) { + operationExt.accept(this); + } + // validate binidng operation input extensions + BindingInput bindingInput = bindingOp.getBindingInput(); + if (bindingInput != null) { + for (InputExt inputExt : bindingInput.getExtensibilityElements(InputExt.class)) { + inputExt.accept(this); + } + } + // validate binding operation output extensions + BindingOutput bindingOutput = bindingOp.getBindingOutput(); + if (bindingOutput != null) { + for (OutputExt outputExt : bindingOutput.getExtensibilityElements(OutputExt.class)) { + outputExt.accept(this); + } + } + // validate binding operation fault extensions + for (BindingFault bindingFault : bindingOp.getBindingFaults()) { + for (FaultExt faultExt : bindingFault.getExtensibilityElements(FaultExt.class)) { + faultExt.accept(this); + } + } + } + } + // for each service + for (Service service : defs.getServices()) { + // for each port + for (Port port : service.getPorts()) { + // validate port extension + for (PortExt portExt : port.getExtensibilityElements(PortExt.class)) { + portExt.accept(this); + } + } + } + } + + public void visit(BindingExt bindingExt) { + Collection results = mValidationResult.getValidationResult(); + //TODO: validate attributes and other required things and add appropriate results. + // + //results.add( + // new Validator.ResultItem(this, // validator + // Validator.ResultType.ERROR, // .ADVICE | .ERROR | .WARNING + // bindingExt, // Validated object + // NbBundle.getMessage(this.getClass(), "I18NKEY") // I18Ned message + // )); + // + } + + public void visit(OperationExt operationExt) { + Collection results = mValidationResult.getValidationResult(); + //TODO: validate attributes and other required things and add appropriate results. + // + //results.add( + // new Validator.ResultItem(this, // validator + // Validator.ResultType.ERROR, // .ADVICE | .ERROR | .WARNING + // operationExt, // Validated object + // NbBundle.getMessage(this.getClass(), "I18NKEY") // I18Ned message + // )); + // + } + + public void visit(InputExt inputExt) { + Collection results = mValidationResult.getValidationResult(); + //TODO: validate attributes and other required things and add appropriate results. + // + //results.add( + // new Validator.ResultItem(this, // validator + // Validator.ResultType.ERROR, // .ADVICE | .ERROR | .WARNING + // inputExt, // Validated object + // NbBundle.getMessage(this.getClass(), "I18NKEY") // I18Ned message + // )); + // + } + + public void visit(OutputExt outputExt) { + Collection results = mValidationResult.getValidationResult(); + //TODO: validate attributes and other required things and add appropriate results. + // + //results.add( + // new Validator.ResultItem(this, // validator + // Validator.ResultType.ERROR, // .ADVICE | .ERROR | .WARNING + // outputExt, // Validated object + // NbBundle.getMessage(this.getClass(), "I18NKEY") // I18Ned message + // )); + // + } + + public void visit(FaultExt faultExt) { + Collection results = mValidationResult.getValidationResult(); + //TODO: validate attributes and other required things and add appropriate results. + // + //results.add( + // new Validator.ResultItem(this, // validator + // Validator.ResultType.ERROR, // .ADVICE | .ERROR | .WARNING + // faultExt, // Validated object + // NbBundle.getMessage(this.getClass(), "I18NKEY") // I18Ned message + // )); + // + } + + public void visit(PortExt portExt) { + Collection results = mValidationResult.getValidationResult(); + //TODO: validate attributes and other required things and add appropriate results. + // + //results.add( + // new Validator.ResultItem(this, // validator + // Validator.ResultType.ERROR, // .ADVICE | .ERROR | .WARNING + // portExt, // Validated object + // NbBundle.getMessage(this.getClass(), "I18NKEY") // I18Ned message + // )); + // + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/validator/WSDLExtValidatorSchemaFactory.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/validator/WSDLExtValidatorSchemaFactory.java new file mode 100644 index 000000000..c9fa35498 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/validator/WSDLExtValidatorSchemaFactory.java @@ -0,0 +1,43 @@ +/* + * WSDLExtValidatorSchemaFactory.java + */ +package net.openesb.component.${artifactId}.validator; + +import java.io.InputStream; +import java.io.InputStream; +import javax.xml.transform.Source; +import javax.xml.transform.stream.StreamSource; +import org.netbeans.modules.xml.wsdl.validator.spi.ValidatorSchemaFactory; + +/** + * This class implements ValidatorSchemaFactory interface. + * + * @author chikkala + */ +public class WSDLExtValidatorSchemaFactory extends ValidatorSchemaFactory { + + private final String NS_URL = + "http://java.sun.com/jbi/wsdl-extensions/sample/jmx-bc/"; + private final String wsdlExtXSDResourcePath = + "/${artifactId}/mybcWsdlExt.xsd"; + + ; + + public String getNamespaceURI() { + return NS_URL; + } + + public InputStream getSchemaInputStream() { + return this.getClass().getResourceAsStream(wsdlExtXSDResourcePath); + } + + /** + * Returns the Inputstream related to this schema + */ + public Source getSchemaSource() { + InputStream in = this.getClass().getResourceAsStream(wsdlExtXSDResourcePath); + Source s = new StreamSource(in); + s.setSystemId(this.getClass().getResource(wsdlExtXSDResourcePath).toString()); + return s; + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/test/resources/projects/basic/archetype.properties b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/test/resources/projects/basic/archetype.properties new file mode 100644 index 000000000..112db0dc2 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/test/resources/projects/basic/archetype.properties @@ -0,0 +1,5 @@ +#Wed Jul 24 14:12:01 IST 2013 +package=it.pkg +version=0.1-SNAPSHOT +groupId=archetype.it +artifactId=basic diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/test/resources/projects/basic/goal.txt b/maven-ojc-archeType-v2/maven-archetype-binding-component-plugin-v2/src/test/resources/projects/basic/goal.txt new file mode 100644 index 000000000..e69de29bb diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/pom.xml b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/pom.xml new file mode 100644 index 000000000..f26510bf0 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/pom.xml @@ -0,0 +1,58 @@ + + + + + + + 4.0.0 + + open-jbi-components + binding-component-ojc-archetype + 2.3.0 + jar + + binding-component-ojc-archetype + + + + + org.apache.maven.archetype + archetype-packaging + 2.2 + + + + + + + maven-archetype-plugin + 2.2 + + + + + + Top-level Build for filebc-top + + https://open-jbi-components.dev.java.net/filebc-top + + + + openesb-release + OpenESB repo release + http://openesb-dev.org:8081/nexus/content/repositories/openesb-release/ + + + openesb-snapshot + OpenESB repo release + http://nexus.openesb-dev.org:8081/nexus/content/repositories/openesb-snapshot/ + + + diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/META-INF/maven/archetype-metadata.xml b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/META-INF/maven/archetype-metadata.xml new file mode 100644 index 000000000..886b94d51 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/META-INF/maven/archetype-metadata.xml @@ -0,0 +1,114 @@ + + + + + + + ${artifactId} + + + + + + + + nbactions.xml + + + + + + smvn.bat + + + + + + + + + src/net + + **/*.java + **/*.properties + + + + + + + nbactions.xml + + + + + + + + src + + **/*.xml + + + + + src + + **/*.xsd + + + + + + nbactions.xml + + + + + + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/nbactions.xml b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/nbactions.xml new file mode 100644 index 000000000..b4b786307 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/nbactions.xml @@ -0,0 +1,75 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + + + clean + + * + + + clean + + + true + + + + build + + * + + + install + + + true + + + + test + + * + + + package + + + false + + + + rebuild + + * + + + clean + install + + + true + + + + CUSTOM-testreport + testreport + + surefire-report:report-only + + + true + + + + CUSTOM-allreports + allreports + + site + + + true + + + diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/pom.xml b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/pom.xml new file mode 100644 index 000000000..8d7aabb49 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/pom.xml @@ -0,0 +1,219 @@ + + + + build-common + open-jbi-components + 1.1 + ../../build-common + + 4.0.0 + open-jbi-components + ${componentName}-jbiadapter + ${componentName}-jbiadapter + ${version} + ${componentName}-jbiadapter description + + sun-${componentName}-binding + + + bld/test + + + test + + + **/*.java + **/*.ref + **/.* + **/*.wsdl + **/*.pom + + + + + + maven-surefire-plugin + + + true + + + + maven-antrun-plugin + + + ${project.artifactId}-substitute-ant-variables + process-test-resources + + run + + + + + + + + + SRCROOT=${SRCROOT} + alaska_root=${SRCROOT}/ojc-core + alaska_sharedlibrary=${SRCROOT}/ojc-core/component-common + asadmin_cmd=bin/asadmin + asant_cmd=bin/asant + drivertest_dir=${SRCROOT}/ojc-core/driver-tests + encoder_sharedlibrary=${SRCROOT}/ojc-core/encodersl/encoder- + shell_cmd=sh + jbicomps_home=${SRCROOT}/ojc-core + tempdir=/tmp + + + + + + + + + + + + + + ${project.artifactId}-ant-junit + test + + run + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + maven-jar-plugin + + + + ${version} + ${componentName} + + + + + + + + + open-jbi-components + componentsl + + + + open-jbi-components + qos + + + open-jbi-components + compositelock + + + + jbicompsplatform + compileconf + test + + + jmock + jmock + test + + + jmock + jmock-cglib + test + + + + + + open-esb + jbi-admin-common + test + + + junit + junit + test + + + + diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/JMXBindingComponentLifeCycle.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/JMXBindingComponentLifeCycle.java new file mode 100644 index 000000000..6c6e56507 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/JMXBindingComponentLifeCycle.java @@ -0,0 +1,52 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * JMX${componentName}LifeCycle.java + */ +package net.openesb.component.${componentName}; + +import net.openesb.component.${componentName}.common.BasicComponentLifeCycle; +import net.openesb.component.${componentName}.common.DefaultMessageExchangeReceiver; +import net.openesb.component.${componentName}.common.MessageExchangeReceiver; +import net.openesb.component.${componentName}.common.RuntimeContext; +import javax.jbi.JBIException; +import javax.jbi.component.Component; + +/** + * This class extends the basic ComponentLifeCycle implementation to provide + * component specific implementation of the ComponentLifeCycle. + * + * @see javax.jbi.ComponentLifeCycle + * @see com.sun.jbi.sample.component.common.BasicComponentLifeCycle + * @author chikkala + */ +public class JMXBindingComponentLifeCycle extends BasicComponentLifeCycle { + + /** + * constructor for the ComponentLifecycle implementation. + */ + public JMXBindingComponentLifeCycle(Component compRuntime) { + super(compRuntime); + } + + /** + * creates DefaultMessageExchangeReceiver to handles receiving and + * processing the message exchanges from the delivery channel. + */ + @Override + protected MessageExchangeReceiver createMessageExchangeReceiver() { + return new DefaultMessageExchangeReceiver(); + } + + /** + * chance to extended classes to do the component specific init + * + * @throws javax.jbi.JBIException + */ + @Override + protected void doInit() throws JBIException { + // NOOP + RuntimeContext.getInstance().setLogger(this.getClass().getName(), null); + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/JMXBindingConsumerEndpoint.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/JMXBindingConsumerEndpoint.java new file mode 100644 index 000000000..fffdd22f1 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/JMXBindingConsumerEndpoint.java @@ -0,0 +1,153 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * JMXBindingConsumerEndpoint.java + */ +package net.openesb.component.${componentName}; + +import net.openesb.component.${componentName}.wsdlext.PortExt; +import net.openesb.component.${componentName}.wsdlext.WSDLExtHelper; +import net.openesb.component.${componentName}.common.RuntimeHelper; +import net.openesb.component.${componentName}.common.deployment.ConsumerEndpoint; +import net.openesb.component.${componentName}.common.deployment.SUDescriptor; +import net.openesb.component.${componentName}.common.deployment.ServiceUnit; +import javax.jbi.JBIException; +import javax.management.InstanceNotFoundException; +import javax.management.MBeanRegistrationException; +import javax.management.ObjectName; +import javax.management.StandardMBean; +import javax.wsdl.Definition; +import javax.xml.namespace.QName; + +/** + * This class extends ConsumerEndpoint to implement the component specific + * consumer endpoint configuration. It uses JMXBindingConsumerProxy to receive + * messages from external service consumers and initiate the InOut message + * exchange. This implementation shows how a synchronous send/receive from the + * delivery channel will be used in InOut message exchange in a service + * invocation by the external consumers. + * + * @author chikkala + */ +public class JMXBindingConsumerEndpoint extends ConsumerEndpoint { + + private ObjectName mJMXEndpointMBeanName; + private JMXEndpointMBean mJMXEndpointMBean; + + /** + * Creates a new instance of XSLTProviderEndpoint + */ + public JMXBindingConsumerEndpoint(SUDescriptor.Consumes consumes, Definition wsdlDef, ServiceUnit su) { + super(consumes, wsdlDef, su); + } + + @Override + protected void doInit() throws JBIException { + RuntimeHelper.getLogger().fine("JMXBindingEndpoint(Consumer): init called"); + this.initJMXEndpoint(); + } + + @Override + protected void doActivate() throws JBIException { + RuntimeHelper.getLogger().fine("JMXBindingEndpoint(Consumer): activate called"); + this.activateJMXEndpoint(); + } + + @Override + protected void doDeactivate() throws JBIException { + RuntimeHelper.getLogger().fine("JMXBindingEndpoint(Consumer): deactivate called"); + this.deactivateJMXEndpoint(); + } + + @Override + protected void doClean() throws JBIException { + RuntimeHelper.getLogger().fine("JMXBindingEndpoint(Consumer): clean called"); + this.cleanJMXEndpoint(); + } + + /** + * creates the JMXEndpointMBean implementation. + */ + protected JMXEndpointMBean createJMXEndpointMBean() { + // JMX EndpointMBean implementation that initiates in-out message exchange. + return new JMXBindingConsumerProxy(this); + } + + /** + * get the mbean object name from the endpoint address of the jmx wsdl + * extension element + */ + protected ObjectName createJMXEndpointMBeanName() throws JBIException { + ObjectName mbeanObjectName = null; + try { + mbeanObjectName = new ObjectName(findMBeanNameFromWSDL()); + } catch (Exception ex) { + throw new JBIException(ex); + } + return mbeanObjectName; + } + + public final ObjectName getJMXEndpointMBeanName() { + return this.mJMXEndpointMBeanName; + } + + public final JMXEndpointMBean getJMXEndpointMBean() { + return this.mJMXEndpointMBean; + } + + protected final void initJMXEndpoint() throws JBIException { + // create jmx mbean resources + this.mJMXEndpointMBeanName = createJMXEndpointMBeanName(); + this.mJMXEndpointMBean = createJMXEndpointMBean(); + } + + protected final void activateJMXEndpoint() throws JBIException { + // open jmx connectivity to external consumers by registering the + // external endpoint mbean implementation. + try { + StandardMBean mbean = new StandardMBean(this.mJMXEndpointMBean, JMXEndpointMBean.class); + this.getComponentContext().getMBeanServer().registerMBean(mbean, this.mJMXEndpointMBeanName); + } catch (Exception ex) { + throw new JBIException(ex); + } + } + + protected final void deactivateJMXEndpoint() throws JBIException { + // close the jmx connectivity to external consumers by unregistering + // the external endpoint mbean. + try { + this.getComponentContext().getMBeanServer().unregisterMBean(this.mJMXEndpointMBeanName); + } catch (InstanceNotFoundException ex) { + ex.printStackTrace(); + } catch (MBeanRegistrationException ex) { + ex.printStackTrace(); + } + } + + protected final void cleanJMXEndpoint() throws JBIException { + // release jmx mbean resources + this.mJMXEndpointMBean = null; + this.mJMXEndpointMBeanName = null; + } + + /** + * get the mbean object name from the endpoint address of the jmx wsdl + * extension element + */ + protected String findMBeanNameFromWSDL() { + String mbeanName = null; + try { + QName serviceName = this.getService().getServiceName(); + String endpointName = this.getService().getEndpointName(); + Definition def = this.getWSDL(); + PortExt address = WSDLExtHelper.getPortExt(def, serviceName, endpointName); + if (address != null) { + mbeanName = address.getMBean(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + return mbeanName; + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/JMXBindingConsumerProxy.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/JMXBindingConsumerProxy.java new file mode 100644 index 000000000..d60d57443 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/JMXBindingConsumerProxy.java @@ -0,0 +1,237 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * JMXBindingConsumerProxy.java + */ +package net.openesb.component.${componentName}; + +import net.openesb.component.${componentName}.common.RuntimeHelper; +import net.openesb.component.${componentName}.common.deployment.ConsumerEndpoint; +import java.io.StringReader; +import javax.jbi.JBIException; +import javax.jbi.component.ComponentContext; +import javax.jbi.messaging.DeliveryChannel; +import javax.jbi.messaging.ExchangeStatus; +import javax.jbi.messaging.Fault; +import javax.jbi.messaging.InOnly; +import javax.jbi.messaging.InOut; +import javax.jbi.messaging.NormalizedMessage; +import javax.wsdl.Operation; +import javax.wsdl.OperationType; +import javax.xml.namespace.QName; +import javax.xml.transform.Source; + +/** + * This class acts as a proxy to the external service consumer that can receive + * messages from the external consumer using JMX interface and then initiate the + * InOut message exchange to invoke a service provided by the component in the + * jbi environment. + * + * this code shows how a synchronous send/receive messages from the delivery + * channel can be used in InOut message exchange to complete a service + * invocation. + * + * @author chikkala + */ +public class JMXBindingConsumerProxy implements JMXEndpointMBean { + + /** + * Synchronous send timeout + */ + private static final long SEND_SYNC_TIMEOUT = 60000; + private ConsumerEndpoint mEndpoint; + private JMXBindingNormalizer mNormalizer; + + /** + * Creates a new instance of JMXEndpointMBeanImpl + */ + public JMXBindingConsumerProxy(ConsumerEndpoint endpoint) { + this.mEndpoint = endpoint; + this.mNormalizer = new JMXBindingNormalizer(endpoint.getWSDL(), endpoint.getWSDLBinding()); + } + + public StringBuffer sendMessage(String operation, StringBuffer inputDoc) throws Exception { + // when receive input from external service consumer, + // 1. normalized the message, 2. send in-out message exchange. 3. denormalize out message. + Source inMsgSource = RuntimeHelper.createDOMSource(new StringReader(inputDoc.toString())); + QName operationQName = this.mEndpoint.getOperationQName(operation); + Source out = initiateMessageExchange(operationQName, inMsgSource); + StringBuffer outBuff = null; + if (out != null) { + // read the denormalized out message to string buffer. + outBuff = RuntimeHelper.readFromSource(out); + } + // return the out message content to the external service consumer. + return outBuff; + } + + public Source initiateMessageExchange(QName operation, Source inSource) throws JBIException { + // 1. Decide what type of message exchange needed for this operation. + Source outSource = null; + try { + Operation wsdlOp = this.mEndpoint.getWSDLOperation(operation); + if (OperationType.REQUEST_RESPONSE.equals(wsdlOp.getStyle())) { + outSource = doInOutMessageExchange(operation, inSource); + } else if (OperationType.ONE_WAY.equals(wsdlOp.getStyle())) { + doInOnlyMessageExchange(operation, inSource); + } else { + throw new JBIException("Unsupported MEP " + wsdlOp.getStyle() + + "for operation " + operation); + } + return outSource; + } catch (Exception ex) { + throw new JBIException(ex); + } + } + + /** + * invokes the service provider with in-only message exchange sent to + * delivery channel by the consumer + * + * @param operation operation name on a service + * @param inSource input xml document for the InOut operation + * @throws java.lang.Exception if any error occurs in invoking the operation + * on the service. + * @return output xml document as a Source object received from InOut + * operation of the service invoked. + */ + private void doInOnlyMessageExchange(QName operation, Source inSource) + throws Exception { + // 2. normalized the message. + // 3. locate service endpoint + // 4. create message exchange according to the Opeations MEP + + // get the component context and the delivery channel for preparing to send message + ComponentContext compContext = this.mEndpoint.getComponentContext(); + DeliveryChannel channel = this.mEndpoint.getDeliveryChannel(); + // create INOUT Message Exchange + InOnly inOnlyME = this.mEndpoint.createInOnlyMessageExchange(operation); + // set the content of the IN normalized message ( Normalize the message ) + NormalizedMessage inMsg = inOnlyME.getInMessage(); + Operation wsdlOperation = this.mEndpoint.getWSDLOperation(inOnlyME.getOperation()); + this.mNormalizer.normalizeInput(wsdlOperation, inMsg, RuntimeHelper.sourceToDOMSource(inSource)); + // send the message exchange and wait for response + boolean isSent = channel.sendSync(inOnlyME, SEND_SYNC_TIMEOUT); + if (!isSent) { + throw new Exception("JMXBinding:Timeout occured in sending the message to provider"); + } + // check if you got a done message or error ( done or error are only allowed in in-only) + // process the Message Exchange to check for done or error message and + // complete InOut message exchange with provider + //TODO: put this below code in processInOnlyMessageExchangeOnConsumer() + ExchangeStatus status = inOnlyME.getStatus(); + this.mEndpoint.getLogger().fine("Consumer:InOnly:Processing Message Exchange with status " + status); + if (ExchangeStatus.DONE.equals(status)) { + this.mEndpoint.getLogger().fine("Consumer: Completed the INONLY MessageExchange"); + return; + } else if (ExchangeStatus.ERROR.equals(status)) { + // error can occur any time. so just return the error back to client. + Exception serverSideEx = inOnlyME.getError(); + StringBuffer exMsgBuff = RuntimeHelper.getExceptionStackTrace(serverSideEx); + throw new Exception("Consumer:INONLY Message Exchange status ERROR.${symbol_escape}n" + exMsgBuff); + } else { + // any other status is error. + throw new Exception("Consumer:INONLY Message Exchange error. status: " + status); + } + } + + /** + * invokes service provider with in-out message exchange sent to delivery + * channel by the consumer + * + * @param operation operation name on a service + * @param inSource input xml document for the InOut operation + * @throws java.lang.Exception if any error occurs in invoking the operation + * on the service. + * @return output xml document as a Source object received from InOut + * operation of the service invoked. + */ + private Source doInOutMessageExchange(QName operation, Source inSource) + throws Exception { + // 2. normalized the message. + // 3. locate service endpoint + // 4. create message exchange according to the Opeations MEP + + // get the component context and the delivery channel for preparing to send message + ComponentContext compContext = this.mEndpoint.getComponentContext(); + DeliveryChannel channel = this.mEndpoint.getDeliveryChannel(); + // create INOUT Message Exchange + InOut inOutME = this.mEndpoint.createInOutMessageExchange(operation); + // set the content of the IN normalized message ( Normalize the message ) + NormalizedMessage inMsg = inOutME.getInMessage(); + Operation wsdlOperation = this.mEndpoint.getWSDLOperation(inOutME.getOperation()); + this.mNormalizer.normalizeInput(wsdlOperation, inMsg, RuntimeHelper.sourceToDOMSource(inSource)); + // send the message exchange and wait for response + boolean isSent = channel.sendSync(inOutME, SEND_SYNC_TIMEOUT); + if (!isSent) { + throw new Exception("JMXBinding:Timeout occured in sending the message to provider"); + } + // check if you got a out message or fault or error + // process the Message Exchange to get the output message and + // complete InOut message exchange with provider + NormalizedMessage outMsg = processInOutMessageExchangeOnConsumer(inOutME); + Source outSource = this.mNormalizer.denormalizeOutput(wsdlOperation, outMsg); + return outSource; + } + + /** + * takes the InOut message exchange received from sendSync call and + * processes it further to complete InOut message exchange with provider and + * returns the out message or throws exception in case of error or faults. + */ + private NormalizedMessage processInOutMessageExchangeOnConsumer(InOut inoutExchange) + throws Exception { + // InOut MessageExchange processing on consumer side + // 1. ACTIVE status receives a fault or out message, + // send the done status to complete message exchange + // return the fault/out message to external consumer + // 2. can not receive DONE status + // 3. when received ERROR status, return the error to consumer. + + // process the message exchange based on its state. + ExchangeStatus status = inoutExchange.getStatus(); + this.mEndpoint.getLogger().fine("Consumer:Processing Message Exchange with status " + status); + + if (ExchangeStatus.ACTIVE.equals(status)) { + + Fault fault = inoutExchange.getFault(); + NormalizedMessage outMsg = inoutExchange.getOutMessage(); + + // send done to complete message exchange. + DeliveryChannel channel = this.mEndpoint.getDeliveryChannel(); + inoutExchange.setStatus(ExchangeStatus.DONE); + channel.send(inoutExchange); + this.mEndpoint.getLogger().fine("Consumer: Completed the INOUT MessageExchange"); + + // process fault or out message + if (fault != null) { + // throw an exception if there is a fault message. + Source faultContent = fault.getContent(); + StringBuffer faultContentBuff = null; + if (faultContent != null) { + faultContentBuff = RuntimeHelper.readFromSource(faultContent); + } + throw new Exception("Consumer:INOUT message exchange Fault ${symbol_escape}n" + + faultContentBuff); + } + + // return the outMessage for processing + if (outMsg != null) { + return outMsg; + } else { + throw new Exception("Consumer: Null Out message in INOUT message exchange. "); + } + } else if (ExchangeStatus.DONE.equals(status)) { + // can not get DONE on Consumer side in INOUT message exchange. + throw new Exception("Consumer: Illegal status DONE on INOUT message exchange"); + } else if (ExchangeStatus.ERROR.equals(status)) { + // error can occur any time. so just return the error back to client. + Exception serverSideEx = inoutExchange.getError(); + StringBuffer exMsgBuff = RuntimeHelper.getExceptionStackTrace(serverSideEx); + throw new Exception("Consumer:INOUT Message Exchange status ERROR.${symbol_escape}n" + exMsgBuff); + } else { + throw new Exception("Consumer:INOUT Message Exchange error. status: " + status); + } + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/JMXBindingInstaller.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/JMXBindingInstaller.java new file mode 100644 index 000000000..fc6572beb --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/JMXBindingInstaller.java @@ -0,0 +1,34 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + /* + * JMXBindingInstaller.java + */ +package net.openesb.component.${componentName}; + +import net.openesb.component.${componentName}.common.ComponentInstaller; + +/** + * This class extends the ComponentInstaller that implements the + * javax.jbi.component.Bootstrap for a component installation contract. + * + * If the default implemenation of the javax.jbi.component.Bootstrap in + * com.sun.jbi.sample.component.common.ComponentInstaller is not sufficient for + * this components install, uninstall and upgrade requirements, override the + * default implementation here to add component specific installation and + * upgrade tasks such as initializing configuration mbean and creating resources + * specific to component or upgrade workspace and service units during upgrading + * the component. + * + * @see javax.jbi.Bootstrap + * @see com.sun.jbi.sample.component.common.ComponentInstaller + * @author chikkala + */ +public class JMXBindingInstaller extends ComponentInstaller { + + /** + * Constructor to create the ComponentInstaller. + */ + public JMXBindingInstaller() { + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/JMXBindingNormalizer.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/JMXBindingNormalizer.java new file mode 100644 index 000000000..1df0a4d62 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/JMXBindingNormalizer.java @@ -0,0 +1,242 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * JMXBindingNormalizer.java + */ +package net.openesb.component.${componentName}; + +import net.openesb.component.${componentName}.common.wsdl.AbstractNormalizer; +import net.openesb.component.${componentName}.common.wsdl.WSDL11JBIWrapper; +import net.openesb.component.${componentName}.common.RuntimeHelper; +import java.util.List; +import javax.jbi.messaging.MessagingException; +import javax.jbi.messaging.NormalizedMessage; +import javax.wsdl.Binding; +import javax.wsdl.Definition; +import javax.wsdl.Fault; +import javax.wsdl.Input; +import javax.wsdl.Message; +import javax.wsdl.Operation; +import javax.wsdl.Output; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.transform.dom.DOMSource; +import org.w3c.dom.DOMException; +import org.w3c.dom.Document; +import org.w3c.dom.Element; + +/** + * This class is a concrete implementation of the AbstractNormalizer to + * implement normalize jmx binding specific concrete messages to jbi wrapper + * messages and denormalize the jbi wrapper messages to jmx binding specific + * messages. The jmx binding concrete message has "message" as the root element + * that contains the part elements as its children. for example + * + * + * + * + * This is the sample code that demonstrate how to normalize and denormalize + * messages to/from jbi wrapper from/to concrete messages specific to a binding + * protocol + * + * @author chikkala + */ +public class JMXBindingNormalizer extends AbstractNormalizer { + + public static final String JMXBC_MSG_NS = "http://java.sun.com/jbi/sample/jmx-bc/envelope/"; + public static final String DEF_NS_PREFIX = "jmxbc"; + public static final String MESSAGE_EL = "message"; + + /** + * Creates a new instance of JMXBCNormalizer + */ + public JMXBindingNormalizer(Definition wsdl, Binding binding) { + super(wsdl, binding); + } + + /** + * normalizes the jmx binding protocol specific concrete message to jbi + * normalized message + */ + public void normalizeInput(Operation operation, NormalizedMessage normMsg, + DOMSource msgSource) throws MessagingException { + try { + WSDL11JBIWrapper jbiWrapper = WSDL11JBIWrapper.createInputWrapper(operation); + Input input = operation.getInput(); + Message wsdlMsg = input.getMessage(); + //TODO: get the binding input extension here if needed. + Element jmxMessage = RuntimeHelper.getElement(msgSource); + + if (!JMXBC_MSG_NS.equals(jmxMessage.getNamespaceURI()) + || !MESSAGE_EL.equals(jmxMessage.getLocalName())) { + throw new MessagingException("invalid root element for jmxbc envelope"); + } + List jmxMsgParts = getChildElements(jmxMessage); + + addMessagePartsToJBIWrapper(jbiWrapper, wsdlMsg, jmxMsgParts); + + DOMSource wrappedSource = jbiWrapper.toDOMSource(); + normMsg.setContent(wrappedSource); + } catch (ParserConfigurationException ex) { + throw new MessagingException(ex); + } + } + + /** + * normalizes the jmx binding protocol specific concrete message to jbi + * normalized message + */ + public void normalizeOutput(Operation operation, NormalizedMessage normMsg, + DOMSource msgSource) throws MessagingException { + try { + WSDL11JBIWrapper jbiWrapper = WSDL11JBIWrapper.createInputWrapper(operation); + Output output = operation.getOutput(); + Message wsdlMsg = output.getMessage(); + //TODO: get the binding output extension here if needed. + Element jmxMessage = RuntimeHelper.getElement(msgSource); + + if (!JMXBC_MSG_NS.equals(jmxMessage.getNamespaceURI()) + || !MESSAGE_EL.equals(jmxMessage.getLocalName())) { + throw new MessagingException("invalid root element for jmxbc envelope"); + } + List jmxMsgParts = getChildElements(jmxMessage); + + addMessagePartsToJBIWrapper(jbiWrapper, wsdlMsg, jmxMsgParts); + + DOMSource wrappedSource = jbiWrapper.toDOMSource(); + normMsg.setContent(wrappedSource); + } catch (ParserConfigurationException ex) { + throw new MessagingException(ex); + } + } + + /** + * normalizes the jmx binding protocol specific concrete message to jbi + * normalized message + */ + public void normalizeFault(Operation operation, String faultName, NormalizedMessage normMsg, + DOMSource msgSource) throws MessagingException { + try { + WSDL11JBIWrapper jbiWrapper = WSDL11JBIWrapper.createInputWrapper(operation); + Fault wsdlFault = operation.getFault(faultName); + Message wsdlMsg = wsdlFault.getMessage(); + //TODO: get the binding fault extension here if needed. + Element jmxMessage = RuntimeHelper.getElement(msgSource); + + if (!JMXBC_MSG_NS.equals(jmxMessage.getNamespaceURI()) + || !MESSAGE_EL.equals(jmxMessage.getLocalName())) { + throw new MessagingException("invalid root element for jmxbc envelope"); + } + List jmxMsgParts = getChildElements(jmxMessage); + + addMessagePartsToJBIWrapper(jbiWrapper, wsdlMsg, jmxMsgParts); + + DOMSource wrappedSource = jbiWrapper.toDOMSource(); + normMsg.setContent(wrappedSource); + } catch (ParserConfigurationException ex) { + throw new MessagingException(ex); + } + } + + /** + * denormalizes the jbi message to the jmx binding protocol specific + * concrete message. + */ + public DOMSource denormalizeInput(Operation operation, NormalizedMessage normMsg) + throws MessagingException { + try { + + WSDL11JBIWrapper jbiWrapper = WSDL11JBIWrapper.sourceToWrapper( + RuntimeHelper.sourceToDOMSource(normMsg.getContent())); + Input input = operation.getInput(); + Message wsdlMsg = input.getMessage(); + //TODO: get the binding input extension here if needed. + + Document jmxMsgDoc = jbiWrapper.getDocumentBuilder().newDocument(); + Element jmxMessage = jmxMsgDoc.createElementNS(JMXBC_MSG_NS, DEF_NS_PREFIX + ":" + MESSAGE_EL); + jmxMessage.setAttributeNS(XMLNS_NS, "xmlns:" + DEF_NS_PREFIX, JMXBC_MSG_NS); + jmxMsgDoc.appendChild(jmxMessage); + + List jmxMsgParts = getMessagePartsFromJBIWrapper(jbiWrapper, wsdlMsg); + for (int i = 0; i < jmxMsgParts.size(); ++i) { + jmxMessage.appendChild(jmxMsgDoc.importNode(jmxMsgParts.get(i), true)); + } + + DOMSource unwrappedSource = new DOMSource(jmxMsgDoc); + return unwrappedSource; + } catch (DOMException ex) { + throw new MessagingException(ex); + } catch (ParserConfigurationException ex) { + throw new MessagingException(ex); + } + } + + /** + * denormalizes the jbi message to the jmx binding protocol specific + * concrete message. + */ + public DOMSource denormalizeOutput(Operation operation, NormalizedMessage normMsg) + throws MessagingException { + try { + + WSDL11JBIWrapper jbiWrapper = WSDL11JBIWrapper.sourceToWrapper( + RuntimeHelper.sourceToDOMSource(normMsg.getContent())); + Output output = operation.getOutput(); + Message wsdlMsg = output.getMessage(); + //TODO: get the binding output extension here if needed. + + Document jmxMsgDoc = jbiWrapper.getDocumentBuilder().newDocument(); + Element jmxMessage = jmxMsgDoc.createElementNS(JMXBC_MSG_NS, DEF_NS_PREFIX + ":" + MESSAGE_EL); + jmxMessage.setAttributeNS(XMLNS_NS, "xmlns:" + DEF_NS_PREFIX, JMXBC_MSG_NS); + + List jmxMsgParts = getMessagePartsFromJBIWrapper(jbiWrapper, wsdlMsg); + + for (int i = 0; i < jmxMsgParts.size(); ++i) { + jmxMessage.appendChild(jmxMsgDoc.importNode(jmxMsgParts.get(i), true)); + } + jmxMsgDoc.appendChild(jmxMessage); + DOMSource unwrappedSource = new DOMSource(jmxMsgDoc); + return unwrappedSource; + } catch (DOMException ex) { + throw new MessagingException(ex); + } catch (ParserConfigurationException ex) { + throw new MessagingException(ex); + } + } + + /** + * denormalizes the jbi message to the jmx binding protocol specific + * concrete message. + */ + public DOMSource denormalizeFault(Operation operation, String faultName, NormalizedMessage normMsg) + throws MessagingException { + try { + WSDL11JBIWrapper jbiWrapper = WSDL11JBIWrapper.sourceToWrapper( + RuntimeHelper.sourceToDOMSource(normMsg.getContent())); + Fault wsdlFault = operation.getFault(faultName); + Message wsdlMsg = wsdlFault.getMessage(); + //TODO: get the binding fault extension here if needed. + + Document jmxMsgDoc = jbiWrapper.getDocumentBuilder().newDocument(); + Element jmxMessage = jmxMsgDoc.createElementNS(JMXBC_MSG_NS, DEF_NS_PREFIX + ":" + MESSAGE_EL); + jmxMessage.setAttributeNS(XMLNS_NS, "xmlns:" + DEF_NS_PREFIX, JMXBC_MSG_NS); + + List jmxMsgParts = getMessagePartsFromJBIWrapper(jbiWrapper, wsdlMsg); + + for (int i = 0; i < jmxMsgParts.size(); ++i) { + jmxMessage.appendChild(jmxMsgDoc.importNode(jmxMsgParts.get(i), true)); + } + jmxMsgDoc.appendChild(jmxMessage); + DOMSource unwrappedSource = new DOMSource(jmxMsgDoc); + return unwrappedSource; + } catch (DOMException ex) { + throw new MessagingException(ex); + } catch (ParserConfigurationException ex) { + throw new MessagingException(ex); + } + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/JMXBindingProviderEndpoint.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/JMXBindingProviderEndpoint.java new file mode 100644 index 000000000..9c861e4b9 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/JMXBindingProviderEndpoint.java @@ -0,0 +1,87 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * JMXBindingProviderEndpoint.java + * + */ +package net.openesb.component.${componentName}; + +import net.openesb.component.${componentName}.wsdlext.PortExt; +import net.openesb.component.${componentName}.wsdlext.WSDLExtHelper; +import net.openesb.component.${componentName}.common.MessageExchangeHandler; +import net.openesb.component.${componentName}.common.RuntimeHelper; +import net.openesb.component.${componentName}.common.MessageExchangeListener; +import net.openesb.component.${componentName}.common.deployment.ProviderEndpoint; +import net.openesb.component.${componentName}.common.deployment.SUDescriptor; +import net.openesb.component.${componentName}.common.deployment.ServiceUnit; +import java.util.logging.Level; +import javax.jbi.JBIException; +import javax.jbi.messaging.ExchangeStatus; +import javax.jbi.messaging.MessageExchange; +import javax.wsdl.Definition; +import javax.xml.namespace.QName; + +/** + * This class extends the ProviderEndpoint to implement component specific + * endpoint configuration. It implements the MessageExchangeListener to receive + * message exchange notifications from the MessageExchangeSupport fired by + * MessageExchangeReceiver and process it using a message exchange handler to + * show how an asynchronous processing of message exchange can be done. + * + * This endpoint uses the JMXBindingProviderProxy as a message exchange handler + * that can invoke the external provider to send a message and receive the + * response in a InOut message exchange. + * + * @author chikkala + */ +public class JMXBindingProviderEndpoint extends ProviderEndpoint implements MessageExchangeListener { + + JMXBindingProviderProxy mProviderProxy; + + /** + * Creates a new instance of XSLTProviderEndpoint + */ + public JMXBindingProviderEndpoint(SUDescriptor.Provides provides, Definition wsdlDef, ServiceUnit su) { + super(provides, wsdlDef, su); + } + + @Override + public void doInit() throws JBIException { + RuntimeHelper.getLogger().info("JMXBindingProviderEndpoint:doInit called"); + this.mProviderProxy = new JMXBindingProviderProxy(this); + } + + @Override + public MessageExchangeHandler createMessageExchangeHandler() { + return this.mProviderProxy; + } + + @Override + protected MessageExchangeListener createMessageExchangeListener() { + return this; + } + + public void messageExchangeReceived(ExchangeStatus status, MessageExchange me) { + try { + RuntimeHelper.getLogger().fine("MXListener.MessageExchangeReceived: with Status: " + status); + processMessageExchangeWithHandler(status, me); + // processMessageExchange(me); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + public PortExt getJMXProviderInfo() { + PortExt portExt = null; + try { + QName serviceName = this.getService().getServiceName(); + String endpointName = this.getService().getEndpointName(); + Definition def = this.getWSDL(); + portExt = WSDLExtHelper.getPortExt(def, serviceName, endpointName); + } catch (Exception ex) { + getLogger().log(Level.FINE, ex.getMessage(), ex); + } + return portExt; + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/JMXBindingProviderProxy.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/JMXBindingProviderProxy.java new file mode 100644 index 000000000..d611c8383 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/JMXBindingProviderProxy.java @@ -0,0 +1,235 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * JMXBindingProviderProxy.java + * + */ +package net.openesb.component.${componentName}; + +import net.openesb.component.${componentName}.wsdlext.PortExt; +import net.openesb.component.${componentName}.common.AbstractMessageExchangeHandler; +import net.openesb.component.${componentName}.common.RuntimeHelper; +import java.io.IOException; +import java.io.StringReader; +import java.util.HashMap; +import java.util.Map; +import java.util.logging.Logger; +import javax.jbi.JBIException; +import javax.jbi.messaging.DeliveryChannel; +import javax.jbi.messaging.Fault; +import javax.jbi.messaging.InOut; +import javax.jbi.messaging.MessageExchange; +import javax.jbi.messaging.MessagingException; +import javax.jbi.messaging.NormalizedMessage; +import javax.management.MBeanServerConnection; +import javax.management.ObjectName; +import javax.management.remote.JMXConnector; +import javax.management.remote.JMXConnectorFactory; +import javax.management.remote.JMXServiceURL; +import javax.wsdl.Operation; +import javax.xml.namespace.QName; +import javax.xml.transform.Source; +import javax.xml.transform.dom.DOMSource; + +/** + * This is a provider side implementation of the message exchange handler on a + * binding component which acts as a service provider proxy for the external + * provider. During the message exchange processing of the InOut message + * exchange, this handler acting as a proxy to the external provider invokes the + * service operation on the external provider and does required normalization + * and denormalization in processing out and in messages received from or send + * to the external service provider. + * + * @author chikkala + */ +public class JMXBindingProviderProxy extends AbstractMessageExchangeHandler { + + private JMXBindingProviderEndpoint mEndpoint; + private String mServiceURL; + private String mUsername; + private String mPassword; + private String mMBeanName; + private JMXBindingNormalizer mNormalizer; + + /** + * Creates a new instance of ProviderSEMXHandler + */ + public JMXBindingProviderProxy(JMXBindingProviderEndpoint endpoint) { + + this.mEndpoint = endpoint; + + PortExt jmxInfo = this.mEndpoint.getJMXProviderInfo(); + this.mServiceURL = jmxInfo.getServiceURL(); + this.mUsername = jmxInfo.getUsername(); + this.mPassword = jmxInfo.getPassword(); + this.mMBeanName = jmxInfo.getMBean(); + + this.mNormalizer = new JMXBindingNormalizer(endpoint.getWSDL(), endpoint.getWSDLBinding()); + } + + protected Logger getLogger() { + return this.mEndpoint.getLogger(); + } + + protected DeliveryChannel getDeliveryChannel() { + return this.mEndpoint.getDeliveryChannel(); + } + + protected void validateMessageExchange() throws MessagingException { + MessageExchange msgExchange = this.getMessageExchange(); + + if (this.getMessageExchange() == null) { + throw new MessagingException("MessageExchange Object is null in MessageExchageHandler"); + } + + if (MessageExchange.Role.CONSUMER.equals(msgExchange.getRole())) { + throw new MessagingException("Provider Message Exchange Handler can not have MessageExchange with CONSUMER Role"); + } + + if (!(msgExchange instanceof InOut)) { + throw new MessagingException("InOut Message Exchange Handler MessageExchange object should be instanceof javax.jbi.messaging.InOut "); + } + } + + protected void processError(Exception ex) { + MessageExchange msgExchange = this.getMessageExchange(); + Exception errEx = msgExchange.getError(); // get the error and print + RuntimeHelper.getLogger().info( + "InOut Message Exchange Provider received Error: " + errEx.getMessage()); + msgExchange.getError().printStackTrace(); + } + + protected void processDone() { + MessageExchange msgExchange = this.getMessageExchange(); + RuntimeHelper.getLogger().info("InOut Message Exchange Provider received DONE :" + + " END of service invocation"); + } + + protected void processFault(Fault fault) { + MessageExchange msgExchange = this.getMessageExchange(); + RuntimeHelper.logError("InOut Message Exchange Provider Handler can not receive Fault on Provider side"); + } + + protected void processMessage() { + try { + processInMessageOnProvider((InOut) this.getMessageExchange()); + } catch (JBIException ex) { + ex.printStackTrace(); + } + } + + protected void processInMessageOnProvider(InOut inOutExchange) throws JBIException { + RuntimeHelper.getLogger().fine("Processing In Message on Provider side " + inOutExchange); + // receive IN message. + NormalizedMessage inMsg = inOutExchange.getInMessage(); + NormalizedMessage outMsg = null; + Fault fault = null; + DOMSource inContent = null; + DOMSource outContent = null; + Source faultContent = null; + String faultAsText = null; + + QName opName = inOutExchange.getOperation(); + QName svcName = inOutExchange.getEndpoint().getServiceName(); + Operation wsdlOperation = this.mEndpoint.getWSDLOperation(opName); + + // process in message + // invoke the service operation + try { + inContent = this.mNormalizer.denormalizeInput(wsdlOperation, inMsg); + StringBuffer outputDoc = invokeOperation(opName.getLocalPart(), + RuntimeHelper.readFromDOMSource(inContent)); + outContent = RuntimeHelper.createDOMSource(new StringReader(outputDoc.toString())); + } catch (Exception ex) { + // exception invoking the operation. so, set exception text as fault content. + ex.printStackTrace(); + faultAsText = RuntimeHelper.getExceptionAsText(ex); + String faultText = RuntimeHelper.getExceptionAsXmlText(ex); + faultContent = RuntimeHelper.createDOMSource(new StringReader(faultText)); + } + // set out or fault message + if (outContent != null) { + // set the out message content. + outMsg = inOutExchange.createMessage(); + inOutExchange.setOutMessage(outMsg); + this.mNormalizer.normalizeOutput(wsdlOperation, outMsg, outContent); + // outMsg.setContent(outContent); + } else if (faultContent != null) { + fault = inOutExchange.createFault(); + inOutExchange.setFault(fault); + fault.setContent(faultContent); // may need to normalize the content. + } + // send out or fault message. + this.send(); + } + + protected StringBuffer invokeOperation(String operation, StringBuffer inputDoc) throws MessagingException { + try { + StringBuffer outputDoc = invokeSendMessage(this.mServiceURL, this.mUsername, this.mPassword, + this.mMBeanName, operation, inputDoc); + return outputDoc; + } catch (Exception ex) { + ex.printStackTrace(); + throw new MessagingException(ex); + } + } + + /** + * invokes a jmx mbean to send message. + */ + protected StringBuffer invokeSendMessage(String serviceURL, String username, String password, + String mbeanName, String operation, StringBuffer inputDoc) + throws MessagingException { + + JMXConnector jmxConnector = null; + MBeanServerConnection jmxConn = null; + JMXServiceURL jmxURL = null; + ObjectName epAddressName = null; + + Map env = new HashMap(); + if (username != null) { + String[] credentials = new String[]{username, password}; + env.put("jmx.remote.credentials", credentials); + env.put(JMXConnectorFactory.DEFAULT_CLASS_LOADER, this.getClass().getClassLoader()); + } + + StringBuffer outDoc = null; + + Object result = null; + String mbeanOperation = "sendMessage"; + + Object[] params = new Object[2]; + params[0] = operation; + params[1] = inputDoc; + + String[] signature = new String[2]; + signature[0] = "java.lang.String"; + signature[1] = "java.lang.StringBuffer"; + + try { + jmxURL = new JMXServiceURL(serviceURL); + epAddressName = new ObjectName(mbeanName); + + jmxConnector = JMXConnectorFactory.connect(jmxURL, env); + jmxConn = jmxConnector.getMBeanServerConnection(); + + result = jmxConn.invoke(epAddressName, mbeanOperation, params, signature); + if (result != null) { + outDoc = (StringBuffer) result; + } + } catch (Exception ex) { + throw new MessagingException(ex); + } finally { + if (jmxConnector != null) { + try { + jmxConnector.close(); + } catch (IOException ex) { + RuntimeHelper.logDebug(ex); + // ingore + } + } + } + return outDoc; + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/JMXBindingRuntime.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/JMXBindingRuntime.java new file mode 100644 index 000000000..6eef597b6 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/JMXBindingRuntime.java @@ -0,0 +1,57 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * JMXBindingRuntime.java + */ +package net.openesb.component.${componentName}; + +import net.openesb.component.${componentName}.common.ComponentRuntime; +import javax.jbi.component.ComponentLifeCycle; +import javax.jbi.component.ServiceUnitManager; + +/** + * This class extends the ComponentRuntime that implements + * javax.jbi.component.Component interface required for the component contract + * at runtime. + * + * This class provides the component specific ComponentLifeCycle implementation + * as well as the component specific ServiceUnitManager implementation. + * + * Add any additional component runtime specific functionality here. + * + * @see javax.jbi.component.Component + * @see com.sun.jbi.sample.component.common.ComponentRuntime + * @see com.sun.jbi.sample.component.common.BasicComponentLifecycle + * @see + * com.sun.jbi.sample.component.common.deployment.AbstractServiceUnitManager + * @author chikkala + */ +public class JMXBindingRuntime extends ComponentRuntime { + + /** + * Creates a new instance of MyBindingRuntime + */ + public JMXBindingRuntime() { + super(); + } + + /** + * overriding the parent's createComponentLifeCycle to create MyBinding + * specific component lifecycle implementation. + */ + @Override + protected ComponentLifeCycle createComponentLifeCycle() { + return new JMXBindingComponentLifeCycle(this); + } + + /** + * if this component supports service unit deployment, then return the + * service unit manager, else return null. Extended classes can override + * this method and do their own ServiceUnitManager specific creation. + */ + @Override + protected ServiceUnitManager createServiceUnitManager() { + return new JMXBindingSUManager(this); + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/JMXBindingSUManager.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/JMXBindingSUManager.java new file mode 100644 index 000000000..ad8dd31b4 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/JMXBindingSUManager.java @@ -0,0 +1,51 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * JMXBindingSUManager.java + * + */ +package net.openesb.component.${componentName}; + +import net.openesb.component.${componentName}.common.RuntimeHelper; +import net.openesb.component.${componentName}.common.deployment.AbstractServiceUnitManager; +import net.openesb.component.${componentName}.common.deployment.ServiceUnit; +import java.util.logging.Logger; +import javax.jbi.management.DeploymentException; + +/** + * This class extends the AbstractServiceUnitManager to implement component + * specific service unit manager by creating the component specific ServiceUnit + * implementation. + * + * @see + * com.sun.jbi.sample.component.common.deployment.AbstractServiceUnitManager + * @see com.sun.jbi.sample.component.common.deployment.ServiceUnit + * + * @author chikkala + */ +public class JMXBindingSUManager extends AbstractServiceUnitManager { + + private JMXBindingRuntime mRuntime; + + /** + * Creates a new instance of JMXBindingSUManager + */ + public JMXBindingSUManager(JMXBindingRuntime compRuntime) { + super(); + this.mRuntime = compRuntime; + } + + protected Logger getLogger() { + return RuntimeHelper.getLogger(); + } + + protected String getComponentName() { + return RuntimeHelper.getComponentName(); + } + + //TODO implement ProviderSEServiceUnit + protected ServiceUnit createServiceUnit(String suName, String suRootPath) throws DeploymentException { + return new JMXBindingServiceUnit(suName, suRootPath); + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/JMXBindingServiceUnit.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/JMXBindingServiceUnit.java new file mode 100644 index 000000000..0d6d0182c --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/JMXBindingServiceUnit.java @@ -0,0 +1,55 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * JMXBindingServiceUnit.java + * + */ +package net.openesb.component.${componentName}; + +import net.openesb.component.${componentName}.common.deployment.ConsumerEndpoint; +import net.openesb.component.${componentName}.common.deployment.ProviderEndpoint; +import net.openesb.component.${componentName}.common.deployment.SUDescriptor.Consumes; +import net.openesb.component.${componentName}.common.deployment.SUDescriptor.Provides; +import net.openesb.component.${componentName}.common.deployment.ServiceUnit; +import net.openesb.component.${componentName}.common.wsdl.WSDLProcessor; +import javax.jbi.management.DeploymentException; +import javax.wsdl.Definition; + +/** + * This class extends the ServiceUnit to implement the component specific + * service unit processing. It creates the component specific ProviderEndpoint + * and ConsumerEndpoint implementation to configure the service provider and + * consumer endpoints on this component deployed in the service unit. + * + * @author chikkala + */ +public class JMXBindingServiceUnit extends ServiceUnit { + + /** + * Creates a new instance of ProviderSEServiceUnit + */ + public JMXBindingServiceUnit(String suName, String suRootPath) { + super(suName, suRootPath); + } + + @Override + protected WSDLProcessor createWSDLProcessor() { + return new JMXBindingWSDLProcessor(this.getSURootPath()); + } + + @Override + protected ConsumerEndpoint createConsumerEndpoint(Consumes consumes, Definition wsdlDef) { + return new JMXBindingConsumerEndpoint(consumes, wsdlDef, this); + } + + @Override + protected ProviderEndpoint createProviderEndpoint(Provides provides, Definition wsdlDef) { + return new JMXBindingProviderEndpoint(provides, wsdlDef, this); + } + + @Override + protected void loadOtherArtifacts() throws DeploymentException { + //TODO: load any component specific service unit artifacts + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/JMXBindingWSDLProcessor.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/JMXBindingWSDLProcessor.java new file mode 100644 index 000000000..a262a5bd0 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/JMXBindingWSDLProcessor.java @@ -0,0 +1,43 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * JMXBindingWSDLProcessor.java + * + */ +package net.openesb.component.${componentName}; + +import net.openesb.component.${componentName}.wsdlext.WSDLExtensionRegistry; +import net.openesb.component.${componentName}.common.wsdl.WSDLProcessor; +import javax.wsdl.extensions.ExtensionRegistry; + +/** + * This class extends form the WSDLProcessor to configure the wsdl processor use + * the wsdl extension registry configured to process the binding specific + * extension elements in the wsdl documents. + * + * WSDLExtensionRegistry that is created here has the wsdl extension model + * required to process the extension elements specific to the binding used by + * this binding component. + * + * @author chikkala + */ +public class JMXBindingWSDLProcessor extends WSDLProcessor { + + private WSDLExtensionRegistry mExtRegistry; + + /** + * Creates a new instance of JMXBindingWSDLProcessor + */ + public JMXBindingWSDLProcessor(String wsdlDir) { + super(wsdlDir); + } + + @Override + protected ExtensionRegistry getExtensionRegistry() { + if (this.mExtRegistry == null) { + this.mExtRegistry = new WSDLExtensionRegistry(); + } + return this.mExtRegistry; + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/JMXEndpointMBean.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/JMXEndpointMBean.java new file mode 100644 index 000000000..80c6c08ad --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/JMXEndpointMBean.java @@ -0,0 +1,41 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * JMXEndpointMBean.java + */ +package net.openesb.component.${componentName}; + +/** + * The sample BC implemented as a jmx binding component exposes this interface + * as a external connectivity (endpoint address) to the external service + * consumers that can exchange messages over jmx protocol to invoke services + * provided inside jbi environment. + * + * A jmx client can send a message by invoking this method using jmx management + * interface. When this mbean method is executed in the BC as a result of mbean + * call from the jmx client, the BC acts as a proxy service consumer inside the + * jbi environment and starts a message exchange with the service provider. + * + * If the operation being executed is a InOut operation, the BC should return + * the Out or Fault message from the InOut message exchange as a return value to + * complete invocation of the service by the external consumer. + * + * @author chikkala + */ +public interface JMXEndpointMBean { + + /** + * This method will be called by a jmx client as a service consumer to send + * message to the echo service provider to invoke the service for a InOut + * message exchange. + * + * @param operation operation name on a service + * @param inputDoc input xml document for the InOut operation + * @return output xml document in a StringBuffer received from InOut + * operation of the service invoked. or null if the operation is InOnly. + * @throws java.lang.Exception if any error occurs in invoking the operation + * on the service. + */ + StringBuffer sendMessage(String operation, StringBuffer inputDoc) throws Exception; +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/AbstractMessageExchangeHandler.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/AbstractMessageExchangeHandler.java new file mode 100644 index 000000000..d589dbc1b --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/AbstractMessageExchangeHandler.java @@ -0,0 +1,141 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * AbstractMessageExchangeHandler.java + * + */ + +package net.openesb.component.${componentName}.common; + +import java.io.StringReader; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.jbi.messaging.DeliveryChannel; +import javax.jbi.messaging.ExchangeStatus; +import javax.jbi.messaging.Fault; +import javax.jbi.messaging.MessageExchange; +import javax.jbi.messaging.MessagingException; +import javax.xml.namespace.QName; + +/** + * This class is an abstract implementation of the MessageExchangeHandler which + * provides the base implementation of the ME processing and provides hooks to + * extended classes to implement component specific processing. + * + * @author chikkala + */ +public abstract class AbstractMessageExchangeHandler implements MessageExchangeHandler { + + public static String IN_MESSAGE = "in"; + public static String OUT_MESSAGE = "out"; + + private MessageExchange mMessageExchange; + private ExchangeStatus mStatus; + /** Creates a new instance of AbstractMessageExchangeHandler */ + protected AbstractMessageExchangeHandler() { + this.mMessageExchange = null; + } + + protected abstract Logger getLogger(); + protected abstract DeliveryChannel getDeliveryChannel(); + protected abstract void validateMessageExchange() throws MessagingException; + protected abstract void processError(Exception ex); + protected abstract void processDone(); + protected abstract void processMessage(); + protected abstract void processFault(Fault fault); + + public final MessageExchange getMessageExchange() { + return this.mMessageExchange; + } + + public final void setMessageExchange(MessageExchange msgExchange) { + this.mMessageExchange = msgExchange; + } + + public final ExchangeStatus getMessageExchangeStatus() { + if ( this.mStatus != null ) { + return this.mStatus; + } else if ( this.mMessageExchange != null ) { + return this.mMessageExchange.getStatus(); + } else { + return null; + } + } + + public final void setMessageExchangeStatus(ExchangeStatus status) { + this.mStatus = status; + } + + protected void send() throws MessagingException { + this.getDeliveryChannel().send(this.mMessageExchange); + } + + protected boolean sendSync(long timeout) throws MessagingException { + return this.getDeliveryChannel().sendSync(this.mMessageExchange, timeout); + } + + protected void sendDone() throws MessagingException { + this.mMessageExchange.setStatus(ExchangeStatus.DONE); + this.getDeliveryChannel().send(this.mMessageExchange); + } + + protected void sendError(Exception ex) throws MessagingException { + this.mMessageExchange.setError(ex); + this.getDeliveryChannel().send(this.mMessageExchange); + } + + protected void sendFault(Exception ex, QName type, String name) throws MessagingException { + Fault fault = this.mMessageExchange.createFault(); + if ( ex != null ) { + String xmlText = RuntimeHelper.getExceptionAsXmlText(ex); + fault.setContent(RuntimeHelper.createDOMSource(new StringReader(xmlText))); + } + this.mMessageExchange.setFault(fault); + this.getDeliveryChannel().send(this.mMessageExchange); + } + + protected void processActive() { + Fault fault = this.getMessageExchange().getFault(); + if ( fault != null ) { + processFault(fault); + } else { + processMessage(); + } + } + /** + * implementation of the MessageExchangeHandler${symbol_pound}processMessageExchange method. + */ + public void processMessageExchange(ExchangeStatus status, MessageExchange msgEx) { + + getLogger().fine("MessageExchangeHandler.processMessageExchange:status: " + status ); + + this.setMessageExchangeStatus(status); + this.setMessageExchange(msgEx); + + try { + validateMessageExchange(); + } catch (MessagingException ex) { + getLogger().log(Level.FINE, "Invalid message exchange for processing ", ex); + if ( this.getMessageExchange() != null ) { + try { + sendError(ex); + } catch (MessagingException errEx) { + getLogger().log(Level.FINE, "Can not send invalid message exchange error", errEx); + } + } + return; + } + + MessageExchange msgExchange = this.getMessageExchange(); + + if (ExchangeStatus.ACTIVE.equals(status) ) { + processActive(); + } else if (ExchangeStatus.DONE.equals(status) ) { + processDone(); + } else if (ExchangeStatus.ERROR.equals(status) ) { + processError(msgExchange.getError()); + } + } + +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/BasicComponentLifeCycle.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/BasicComponentLifeCycle.java new file mode 100644 index 000000000..d23330373 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/BasicComponentLifeCycle.java @@ -0,0 +1,398 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * AbstractComponentLifeCycle.java + */ + +package net.openesb.component.${componentName}.common; + +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.jbi.JBIException; +import javax.jbi.component.Component; +import javax.jbi.component.ComponentContext; +import javax.jbi.component.ComponentLifeCycle; +import javax.jbi.messaging.DeliveryChannel; +import javax.jbi.messaging.MessagingException; +import javax.management.MBeanServer; +import javax.management.ObjectName; +import javax.management.StandardMBean; + +/** + * This class implements the javax.jbi.component.ComponentLifeCycle. This is an + * abstract class that keeps the reference to the component context and the lifecycle + * extension mbeans. It implements the lifecycle method and provide the extended methods + * for each lifecycle methods to implement component specific functionality. + *

+ * It makes sure that the mininum initialization required for the component + * lifecycle is implemented by this class or the classes extending this class. + *

+ * Another important functionality implemented in this class is that it initializes the global + * RuntimeContext for the component with the ComponentContext passed by the JBI runtime and the + * opened delivery channel to make them available globally to any class in the component implementation + * that may need it during component lifecycle + *

+ * Service engine or a binding component lifecycle implementation can directly extend + * this class for their required functionality and override some of the methods to provide + * their own implementation. + * + * @see javax.jbi.ComponentLifeCycle + * @author chikkala + */ +public class BasicComponentLifeCycle implements ComponentLifeCycle { + /** reference to the component runtime */ + private Component mCompRuntime; + /** component context */ + private ComponentContext mComponentContext; + /** Extension Mbean Name*/ + private ObjectName mExtensionMBeanName; + /** Extension Mbean Implementation*/ + private StandardMBean mExtensionMBeanImpl; + /** a message receiver that accepts messages from delivery channel */ + private MessageExchangeReceiver mMsgExchReceiver; + + /** + * constructor for the ComponentLifecycle implementation. + * @param compRuntime + */ + protected BasicComponentLifeCycle(Component compRuntime) { + this.mCompRuntime = compRuntime; + } + /** + * @return Component + */ + public final Component getComponentRuntime() { + return this.mCompRuntime; + } + /** + * @return ComponentContext component context. + */ + public final ComponentContext getComponentContext() { + return mComponentContext; + } + /** + * @return component name + */ + protected String getComponentName() { + return (this.mComponentContext != null) ? + this.mComponentContext.getComponentName() : null; + } + /////////////////////////////////////////////////////////////////////////// + // ComponentLifeCycle interface implemenation + /////////////////////////////////////////////////////////////////////////// + + /** + * Initializes the component lifecycle. This method makes sure that the + * component context passed by the jbi runtime is saved in the lifecycle + * object before calling the other component initialization methods to + * completely initialize the component. + * @param context Component context + * @see javax.jbi.component.ComponentLifeCycle${symbol_pound}init(javax.jbi.component.ComponentContext) + * @throws javax.jbi.JBIException on error + */ + public final void init(ComponentContext context) throws JBIException { + + if ( context == null ) { + throw new JBIException("Null Component Context received in " + + "Component Lifecycle init "); + } + this.mComponentContext = context; // 0. save the component context passed by jbi framework. + // initialize the content + initGlobalContext(); // 1. Initialize component runtime context. + registerExtensionMBean(); // 2. Create and register extension mbean. + openDeliveryChannel(); // 3. Open delivery channel. + initMessageExchangeReceiver(); // 4. Create message exchange receiver. + doInit(); // 5. Do any component specific initialization such + // as static service providers and consumers initialization. + + this.getLogger().fine("Component " + this.getComponentName() + " initialized"); + } + + /** + * Starts the component. Extended classes can override/implement the methods called + * in this method to provide component specify start functionality. + * + * @see javax.jbi.component.ComponentLifeCycle${symbol_pound}start() + * @throws javax.jbi.JBIException on error + */ + public final void start() throws JBIException { + + doStart(); // 1. do any other component specific start tasks such as + // activating any static service providers and consumers. + startMessageExchangeProcessing(); // 2. begin accepting and processing message exchanges. + + this.getLogger().fine("Component " + this.getComponentName() + " started"); + } + + /** + * Stop the component.Extended classes can override/implement the methods called + * in this method to provide component specify stop functionality. + * @throws javax.jbi.JBIException + * @see javax.jbi.component.ComponentLifeCycle${symbol_pound}stop() + */ + public final void stop() throws JBIException { + + stopMessageExchangeProcessing(); // 1. stop accepting and processing message exchanges. + doStop(); // 2. do any other component specific stop tasks such as + // deactivating any static service providers and consumers. + this.getLogger().fine("Component " + this.getComponentName() + " stopped."); + } + + /** + * Shut down the component. Extended classes can override/implement the methods called + * in this method to provide component specify shut down functionality. + * @throws javax.jbi.JBIException + * @see javax.jbi.component.ComponentLifeCycle${symbol_pound}shutDown() + */ + public final void shutDown() throws JBIException { + // clean up all resources. + shutdownMessageExchangeReceiver(); // 1. remove the message receiver. + closeDeliveryChannel(); // 2. close delivery channel + unregisterExtensionMBean(); // 3. unregister and remove extension mbean if exists. + doShutDown(); // 4. do any other component specific clean up tasks such + // as clean any static service providers and consumer resource. + this.getLogger().fine("Component " + this.getComponentName() + " shut down"); + } + /** + * create jmx object name for the extension mbean. default implementation does + * not required to have the extension mbean. + * @return ObjectName of the extension mbean + */ + protected ObjectName createExtensionMBeanName() { + return null; + } + /** + * gets the reference to the extension mbean name. + * @see javax.jbi.component.ComponentLifeCycle${symbol_pound}getExtensionMBeanName() + * @return ObjectName of the extension mbean objectname or null if component + * does not support extension mbean + */ + public final ObjectName getExtensionMBeanName() { + if ( this.mExtensionMBeanName == null ) { + this.mExtensionMBeanName = this.createExtensionMBeanName(); + } + return this.mExtensionMBeanName; + } + /** + * create mbean implementation for the extension mbean as a StandardMBean. default + * implementation does not require the extension mbean + * @return the ExtensionMBean implementation as StandardMBean + */ + protected StandardMBean createExtensionMBean() { + return null; + } + /** + * gets the reference to the extension mbean. + * @return extension mbean implementation or null if component does not support. + */ + protected final StandardMBean getExtensionMBean() { + if ( this.mExtensionMBeanImpl == null ) { + this.mExtensionMBeanImpl = this.createExtensionMBean(); + } + return this.mExtensionMBeanImpl; + } + /** + * if there is an extension mbean supported by the component, then register + * it with the mbean server. + * @throws JBIException on error registering mbean + */ + protected final void registerExtensionMBean() throws JBIException { + // creatre the extension mbean's object name + ObjectName mbeanName = this.getExtensionMBeanName(); + // create the extension mbean implemenation. + StandardMBean mbeanImpl = this.getExtensionMBean(); + + if ( mbeanName == null || mbeanImpl == null ) { + this.getLogger().fine(this.getComponentName() + + " Does not have Extension MBean implemenation "); + return; + } + // register with mbean only if object name and implementation are non null + try { + MBeanServer mbServer = RuntimeHelper.getComponentContext().getMBeanServer(); + mbServer.registerMBean(mbeanImpl, mbeanName); + } catch (Exception e) { + throw new JBIException("Failed to register Extension MBean for " + + this.getComponentName(), e); + } + } + /** + * remove the registered extension mbean from the mbean server if any. + */ + protected final void unregisterExtensionMBean() { + ObjectName mbeanName = this.getExtensionMBeanName(); + if ( mbeanName == null ) { + return; + } + try { + MBeanServer mbServer = RuntimeHelper.getComponentContext().getMBeanServer(); + mbServer.unregisterMBean(mbeanName); + } catch (Exception e) { + this.getLogger().log(Level.WARNING, + "Failed to unregister Extension MBean from MBeanServer for " + this.getComponentName(), e); + } + } + /** + * creates MessageExchangeReceiver implementation that handles receiving and processing + * the message exchanges from the delivery channel. Component should implement + * this method to provide the MessageReceiver. + * + * Component may return null indicating that they don't need the message receiver + * that can receive and process message exchanges from delivery channel. For example, + * components that have only service consumers which send a synchronous messages to + * providers don't need this. + * + * @throws java.lang.Exception + * @return MessageExchangeReceiver implementation. null if the component does not support it. + * @see com.sun.jbi.sample.component.common.DefaultComponentLifecycle${symbol_pound}createMessageExchangeReceiver + */ + protected MessageExchangeReceiver createMessageExchangeReceiver() { + return null; + } + /** + * returns the message exchange receiver implementation reference + * @return MessageExchangeReceiver interface + */ + protected final MessageExchangeReceiver getMessageExchangeReceiver() { + if ( this.mMsgExchReceiver == null ) { + this.mMsgExchReceiver = createMessageExchangeReceiver(); + } + return this.mMsgExchReceiver; + } + /** + * creates a message receiver object as part of the component initialization. + * @throws javax.jbi.JBIException + */ + protected void initMessageExchangeReceiver() throws JBIException { + // create and initialize the MessageExchangeReceiver + MessageExchangeReceiver mxReceiver = getMessageExchangeReceiver(); + if ( mxReceiver != null ) { + mxReceiver.initReceiver(); + } + } + /** + * allows the component to accept the message exchange objects from the + * delivery channel and process it as part of the component startup process. + * @throws javax.jbi.JBIException + */ + protected void startMessageExchangeProcessing() throws JBIException { + // start message processing + MessageExchangeReceiver mxReceiver = getMessageExchangeReceiver(); + if ( mxReceiver != null ) { + mxReceiver.startProcessing(); + } + } + /** + * stops the component from accepting the message exchange objects from the + * delivery channel as part of the component stop process + * @throws javax.jbi.JBIException + */ + protected void stopMessageExchangeProcessing() throws JBIException { + // stop message processing + MessageExchangeReceiver mxReceiver = getMessageExchangeReceiver(); + if ( mxReceiver != null ) { + mxReceiver.stopProcessing(); + } + } + /** + * removes the message receiver as part of the component shutdown process + * @throws javax.jbi.JBIException + */ + protected void shutdownMessageExchangeReceiver() throws JBIException { + // clean up message processing. + MessageExchangeReceiver mxReceiver = getMessageExchangeReceiver(); + if ( mxReceiver != null ) { + mxReceiver.shutdownReceiver(); + } + } + /** + * Returns logger initialized from the component context or a default logger. + * @return Logger + */ + protected Logger getLogger() { + return RuntimeHelper.getLogger(); + } + /** + * initializes the RuntimeContext during component init lifecycle phase. This + * includes setting the ComponentContext and loggers etc. extended classes must + * save the component context in the RuntimeContext in this methods implementation. + * @see com.sun.jbi.sample.component.common.DefaultComponentLifecycle${symbol_pound}initGlobalContext + */ + protected void initGlobalContext() { + RuntimeContext.getInstance().setComponentContext(this.getComponentContext()); + RuntimeContext.getInstance().setLogger(this.getClass().getName(), null); + } + /** opens the delivery channel to accept or send message exchange objects + * @see com.sun.jbi.sample.component.common.DefaultComponentLifecycle${symbol_pound}openDeliveryChannel + */ + protected void openDeliveryChannel() { + try { + DeliveryChannel channel = this.getComponentContext().getDeliveryChannel(); + RuntimeContext.getInstance().setDeliveryChannel(channel); + } catch (MessagingException ex) { + ex.printStackTrace(); + } + } + /** closes the delivery channel as part of the component shutdown process. + * @see com.sun.jbi.sample.component.common.DefaultComponentLifecycle${symbol_pound}closeDeliveryChannel + */ + protected void closeDeliveryChannel() { + // closes delivery channel and remove the reference. + try { + DeliveryChannel channel = RuntimeHelper.getDeliveryChannel(); + if ( channel != null ) { + channel.close(); + } + } catch (MessagingException ex) { + ex.printStackTrace(); + } finally { + RuntimeContext.getInstance().setDeliveryChannel(null); + } + } + /** + * chance to extended classes to do any extra component specific init tasks. If the component + * supports static service providers or consumers without deployment support, they can be + * initialized here in the class extended from this class in implementing such a component. + * This method is invoked in the implementation of ComponentLifeCycle${symbol_pound}init method by this class. + * @throws javax.jbi.JBIException + * @see com.sun.jbi.sample.component.common.AbstractComponentLifecycle${symbol_pound}init + */ + protected void doInit() throws JBIException { + //NOOP + } + /** + * chance to extended classes to do any extra component specific start tasks. If the component + * supports static service providers or consumers without deployment support, they can be + * activated here in the class extended from this class in implementing such a component. + * This method is invoked in the implementation of ComponentLifeCycle${symbol_pound}start method by this class. + * @throws javax.jbi.JBIException + * @see com.sun.jbi.sample.component.common.AbstractComponentLifecycle${symbol_pound}start + */ + protected void doStart() throws JBIException { + //NOOP + } + /** + * chance to extended classes to do any extra component specific stop tasks. If the component + * supports static service providers or consumers without deployment support, they can be + * deactivated here in the class extended from this class in implementing such a component. + * This method is invoked in the implementation of ComponentLifeCycle${symbol_pound}stop method by this class. + * @throws javax.jbi.JBIException + * @see com.sun.jbi.sample.component.common.AbstractComponentLifecycle${symbol_pound}stop + */ + protected void doStop() throws JBIException { + //NOOP + } + /** + * chance to extended classes to do any extra component specific shutdown tasks.If the component + * supports static service providers or consumers without deployment support, they can be + * cleaned up here in the class extended from this class in implementing such a component. + * This method is invoked in the implementation of ComponentLifeCycle${symbol_pound}shutdown method by this class. + * @throws javax.jbi.JBIException + * @see com.sun.jbi.sample.component.common.AbstractComponentLifecycle${symbol_pound}shutdown + */ + protected void doShutDown() throws JBIException { + //NOOP + } + +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/ComponentInstaller.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/ComponentInstaller.java new file mode 100644 index 000000000..748a57ade --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/ComponentInstaller.java @@ -0,0 +1,275 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + /* + * ComponentInstaller.java + */ +package net.openesb.component.${componentName}.common; + +import java.util.List; +import java.util.logging.Level; +import javax.jbi.component.Bootstrap; +import javax.jbi.component.InstallationContext; +import java.util.logging.Logger; +import javax.jbi.JBIException; +import javax.management.MBeanServer; +import javax.management.ObjectName; +import javax.management.StandardMBean; + +/** + * This class implements the javax.jbi.component.Bootstrap. This class implements + * the minimum required functionality for component installation contract + * of the jbi component in the jbi environment. It also takes care of maintaining + * the installation context reference and installation specific logger creation and + * installation extension mbean registration and unregistration during initialization + * and cleanup. Extended classes only need to supply the mbean name and its implementation + * object for the installation extensions. + * + * It makes sure that the installation context and the loggers are available to + * the classes extended from this class to add more installation specific functionality. + * + * Service engine or a binding component installation implementation can directly use + * this class or extend this class to add more functionality to their installation + * process. + * + * @see javax.jbi.Bootstrap + * @author chikkala + */ +public class ComponentInstaller implements Bootstrap { + /** default logger*/ + private Logger mDefLogger; + /** bootstrap logger */ + private Logger mBTLogger ; + /** Installation Context . */ + private InstallationContext mInstallationContext; + /** Extension Mbean Name*/ + private ObjectName mExtensionMBeanName; + /** Extension Mbean Implementation*/ + private StandardMBean mExtensionMBeanImpl; + + /** Constructor to create the ComponentInstaller. */ + public ComponentInstaller() { + } + /** + * @return InstallationContext of the component. + */ + public final InstallationContext getInstallationContext() { + return this.mInstallationContext; + } + protected String getComponentName() { + return (this.mInstallationContext != null) ? + this.mInstallationContext.getComponentName() : null; + } + /** + * @return logger initialized from the installation context or a default + * logger. + */ + protected Logger getLogger() { + // try init bootstrap logger + if (this.mBTLogger == null && this.mInstallationContext != null ) { + try { + this.mBTLogger = + this.mInstallationContext.getContext().getLogger(this.getClass().getName(), null); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + // init default logger if required + if ( this.mBTLogger == null && this.mDefLogger == null) { + this.mDefLogger = Logger.getLogger(this.getClass().getName(), null); + } + return (this.mBTLogger != null) ? this.mBTLogger : this.mDefLogger; + } + /** + * Initializes the installation environment for a component. + * @see javax.jbi.component.Bootstrap${symbol_pound}init(javax.jbi.component.InstallationContext) + */ + public final void init(InstallationContext installContext) throws javax.jbi.JBIException { + + if ( installContext == null ) { + throw new JBIException("Null Installation Context received in " + + "Component Bootstrap initialization"); + } + // save the installation context reference passed by the jbi framework. + this.mInstallationContext = installContext; + registerExtensionMBean(); // create and register extension mbean + doInit(); // do any other extra initialization required specific to the component installation. + // initialize logger + this.getLogger().fine(this.mInstallationContext.getComponentName() + + " : Component Installer initialized"); + } + /** + * default implementation just logs the method call. extended classes should override this. + * @see javax.jbi.component.Bootstrap${symbol_pound}onInstall() + */ + public void onInstall() throws javax.jbi.JBIException { + //TODO: do required initializaton and resource creation + this.getLogger().fine(this.mInstallationContext.getComponentName() + + " : Component installed."); + } + /** + * default implementation just logs the method call. + * @see javax.jbi.component.Bootstrap${symbol_pound}onUninstall() + */ + public void onUninstall() throws javax.jbi.JBIException { + //TODO: do clean up the resource and other stuff. + this.getLogger().fine(this.mInstallationContext.getComponentName() + + " : Component uninstalled"); + } + /** + * default noop implementation of the cleanup. + * @see javax.jbi.component.Bootstrap${symbol_pound}cleanUp() + */ + public final void cleanUp() throws javax.jbi.JBIException { + + unregisterExtensionMBean(); // unregister extension mbean and remove it + doCleanUp(); // do any other extra cleanup specific to the component installation. + this.getLogger().fine( this.mInstallationContext.getComponentName() + + " Component Installer Cleaned up"); + } + + /** + * create jmx object name for the extension mbean. Extended classes should + * return the component specific installer extension mbean name here. + */ + protected ObjectName createExtensionMBeanName() { + return null; + } + /** + * default implementation that does not have extension mbean return null. + * @see javax.jbi.component.Bootstrap${symbol_pound}getExtensionMBeanName() + */ + public final javax.management.ObjectName getExtensionMBeanName() { + if ( this.mExtensionMBeanName == null ) { + this.mExtensionMBeanName = createExtensionMBeanName(); + } + return this.mExtensionMBeanName; + } + /** + * create mbean implementation for the extension mbean as a StandardMBean. Extended + * classes should return the installer extension mbean implementation as the + * standard mbean. + */ + protected StandardMBean createExtensionMBean() { + return null; + } + /** + * returns the installation extension mbean implementation. + * @return StandardMBean for the extension mbean implementation. + */ + protected final StandardMBean getExtensionMBean() { + if ( this.mExtensionMBeanImpl == null ) { + this.mExtensionMBeanImpl = this.createExtensionMBean(); + } + return this.mExtensionMBeanImpl; + } + /** + * Chance to extended classes to do the component installation specific init. + * Installation context will be initialized before calling this method. So, + * initialize other things if required in this method. + * @throws javax.jbi.JBIException on error + * @see com.sun.jbi.sample.component.common.ComponentInstaller${symbol_pound}init( + * javax.jbi.component.InstallationContext) + */ + protected void doInit() throws JBIException { + this.getLogger().info(this.getInstallationContext().getComponentName() + + " : Component Installer initialized"); + } + /** + * Chance to extended classes to do the component installation specific cleanup. + * ExtensionMbean will be unregistered before calling this method. + * @throws javax.jbi.JBIException on error + * @see com.sun.jbi.sample.component.common.ComponentInstaller${symbol_pound}cleanUp( + * javax.jbi.component.InstallationContext) + */ + protected void doCleanUp() throws JBIException { + this.getLogger().fine(this.getInstallationContext().getComponentName() + + " : Component Installer doCleanUp"); + } + /** + * if there is an extension mbean supported by the component, then register + * it with the mbean server. + */ + protected void registerExtensionMBean() throws JBIException { + // creatre the installation extension mbean's object name + ObjectName mbeanName = this.getExtensionMBeanName(); + // create the extension mbean implemenation if the object name is created. + StandardMBean mbeanImpl = this.getExtensionMBean(); + + if ( mbeanName == null || mbeanImpl == null ) { + this.getLogger().fine(this.getComponentName() + + " Does not have Installation Extension MBean implemenation "); + return; + } + // register with mbean only if object name and implementation are non null + try { + MBeanServer mbServer = this.getInstallationContext().getContext().getMBeanServer(); + mbServer.registerMBean(mbeanImpl, mbeanName); + } catch (Exception e) { + throw new JBIException("Failed to register Installation Extension MBean for " + + this.getComponentName(), e); + } + } + /** + * remove the registered extension mbean from the mbean server. + */ + protected void unregisterExtensionMBean() { + ObjectName mbeanName = this.getExtensionMBeanName(); + if ( mbeanName == null ) { + return; + } + try { + MBeanServer mbServer = this.getInstallationContext().getContext().getMBeanServer(); + mbServer.unregisterMBean(mbeanName); + } catch (Exception e) { + this.getLogger().log(Level.WARNING, + "Failed to unregister Installation extension MBean for " + this.getComponentName(), e); + } + } + /** + * This method is called by the JBI runtime to allow a component to upgrade + * it's workspace and any existing Service Units to match the new version of + * the component. The JBI runtime copies the existing workspace root to the + * new workspace root prior to calling this method, so that the component + * can examine the contents of the workspace root to determine the version + * of the component from which the upgrade is being made. All updates to the + * workspace root are done in-place; in the event of a failure, the JBI + * runtime reverts back to the original workspace root, the original install + * root, and the original Service Unit roots for the component. + * + * Note1: The component must ensure that it never holds open references + * to any files in the workspace root or any of the Service Unit roots upon + * returning from this method. Failure to do so will cause problems when + * the runtime attempts to complete the upgrade processing. + * + * Note2: The installation context that is normally initialized + * by the runtime by calling ${symbol_pound}init method of the javax.jbi.Bootstrap interface + * before install and uninstall will not be called before calling this + * upgrade method. So, installation context can not be used in this method's + * implementation. + * + * Note3: Since there won't be any installation context available, the logger + * that returned from the ${symbol_pound}getLogger method is a default logger created using + * the package name of this class or extended class if the method is overridden + * in the extended class. + * + * @param workspaceRoot the workspace root for the new version of the + * component that will replace the currently installed version. This is + * populated with the contents of the original workspace root and the + * component must update it to match the new version of the component. + * @param serviceUnitRoots a list of directory paths to all of the Service + * Units currently deployed to the component. The component must update all + * of these to match the new version of the component. + * @exception JBIException when there is an error requiring that the upgrade + * be terminated. + */ + public void upgrade(String workspaceRoot, List serviceUnitRoots) + throws javax.jbi.JBIException + { + //TODO: override this method in the extended class to handle the + // workspace root and service unit roots upgrade according to the + // component's requirement. + this.getLogger().fine("Default upgrade implementation. " + + "TODO: Implement workspace root and service unit roots upgrade."); + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/ComponentRuntime.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/ComponentRuntime.java new file mode 100644 index 000000000..50b0bd3b5 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/ComponentRuntime.java @@ -0,0 +1,174 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * ComponentRuntime.java + */ +package net.openesb.component.${componentName}.common; + +import java.util.logging.Logger; +import javax.jbi.component.Component; +import javax.jbi.component.ComponentContext; +import javax.jbi.component.ComponentLifeCycle; +import javax.jbi.component.ServiceUnitManager; +import javax.jbi.messaging.MessageExchange; +import javax.jbi.servicedesc.ServiceEndpoint; +import org.w3c.dom.Document; +import org.w3c.dom.DocumentFragment; + +/** + * This class implements javax.jbi.component.Component interface which is + * responsible for creating the Component Lifecycle implementation and the + * ServiceUnitManager implementation for the jbi component. + * + * This class makes sure that non null component lifecycle implementation is + * returns by this class or any classes extended from this class which is + * required as a component contract. It also provides default implementation of + * all methods of the Component interface which the extended classes can + * override to add more functionality. + * + * @see javax.jbi.component.Component + * @author chikkala + */ +public class ComponentRuntime implements Component { + /** Component LifeCycle implementation */ + private ComponentLifeCycle mLifeCycle; + /** ServiceUnitManager implementation */ + private ServiceUnitManager mSUManager; + /** default logger*/ + private Logger mDefLogger; + + /** Creates a new instance of ComponentImpl */ + public ComponentRuntime() { + this.mLifeCycle = null; + this.mSUManager = null; + } + /** + * returns the ComponentContext. Any component runtime class extended from + * this class can override this method to return their own reference to the + * ComponentContext. + * @return ComponentContext component context. + */ + public ComponentContext getComponentContext() { + ComponentContext ctx = null; + if ( this.mLifeCycle != null && this.mLifeCycle instanceof BasicComponentLifeCycle ) { + ctx = ((BasicComponentLifeCycle) this.mLifeCycle).getComponentContext(); + } + return ctx; + } + /** + * Returns logger initialized from the component context or a default logger. + * @return Logger + */ + public Logger getLogger() { + Logger logger = null; + if ( this.mLifeCycle != null && this.mLifeCycle instanceof BasicComponentLifeCycle ) { + logger = ((BasicComponentLifeCycle) this.mLifeCycle).getLogger(); + } + // init default logger if required + if ( logger == null && this.mDefLogger == null) { + this.mDefLogger = Logger.getLogger(this.getClass().getName(), null); + } + return (logger != null) ? logger : this.mDefLogger; + } + /** + * return the ComponentLifeCycle implementation. if returned null, the + * ComponentLifeCycleImpl will be used as the component lifecycle + * Extended classes can override this method and do their own ComponentLifecyle + * specific creation. + */ + protected ComponentLifeCycle createComponentLifeCycle() { + return new BasicComponentLifeCycle(this); + } + /** + * Get the life cycle control interface for this component. + * + * @return the life cycle control interface for this component + * @see javax.jbi.Component${symbol_pound}getLifeCycle() + */ + public final ComponentLifeCycle getLifeCycle() { + if ( this.mLifeCycle == null ) { + this.mLifeCycle = createComponentLifeCycle(); + if ( this.mLifeCycle == null ) { + this.getLogger().fine("Creating basic component lifecycle implemenation"); + // use the default ComponentLifeCycle Impl if a component + // specific implementation return null in createComponentLifeCycle. + this.mLifeCycle = new BasicComponentLifeCycle(this); + } + } + return this.mLifeCycle; + } + /** + * if this component supports service unit deployment, then return the + * service unit manager, else return null. + * Extended classes can override this method and do their own ServiceUnitManager + * specific creation. + */ + protected ServiceUnitManager createServiceUnitManager() { + return null; + } + /** + * Get the Service Unit manager for this component. + * + * @return the ServiceUnitManager for this component, or + * null if there is none. + * @see javax.jbi.Component${symbol_pound}getServiceUnitManager() + */ + public final ServiceUnitManager getServiceUnitManager() { + if ( this.mSUManager == null ) { + this.mSUManager = createServiceUnitManager(); + } + return this.mSUManager; + } + /** + * Retrieves a DOM representation containing metadata which describes the + * service provided by this component, through the given endpoint. + * + * Default implementation does not support service description. + * + * @see javax.jbi.Component${symbol_pound}getServiceDescription(javax.jbi.servicedesc.ServiceEndpoint) + */ + public Document getServiceDescription(ServiceEndpoint serviceEndpoint) { + return null; + } + /** + * This method is called by JBI to check if this component, in the role of + * provider of the service indicated by the given exchange, can actually + * perform the operation desired. + * + * Default implementation has no policy and allows all exchanges with consumer. + * + * @see javax.jbi.Component${symbol_pound}isExchangeWithProviderOkay( + * javax.jbi.servicedesc.ServiceEndpoint, javax.jbi.messaging.MessageExchange) + */ + public boolean isExchangeWithConsumerOkay( + ServiceEndpoint serviceEndpoint, MessageExchange messageExchange) { + return true; + } + /** + * This method is called by JBI to check if this component, in the role of + * consumer of the service indicated by the given exchange, can actually + * interact with the provider properly. The provider is described by the + * given endpoint and the service description supplied by that endpoint. + * + * Default implementation has no policy and allows all exchanges with provider. + * + * @see javax.jbi.Component${symbol_pound}isExchangeWithProviderOkay( + * javax.jbi.servicedesc.ServiceEndpoint, javax.jbi.messaging.MessageExchange) + */ + public boolean isExchangeWithProviderOkay( + ServiceEndpoint serviceEndpoint, MessageExchange messageExchange) { + return true; + } + /** + * Resolve the given endpoint reference. + * + * Default implementation does not have any XML dialect. So can not resolve the + * endpoint from the document fragment. + * + * @see javax.jbi.Component${symbol_pound}resolveEndpointReference(org.w3c.dom.DocumentFragment) + */ + public ServiceEndpoint resolveEndpointReference(DocumentFragment documentFragment) { + return null; + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/DefaultMessageExchangeReceiver.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/DefaultMessageExchangeReceiver.java new file mode 100644 index 000000000..a64ca5141 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/DefaultMessageExchangeReceiver.java @@ -0,0 +1,180 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * DefaultMessageExchangeReceiver.java + * + */ + +package net.openesb.component.${componentName}.common; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; +import javax.jbi.JBIException; +import javax.jbi.messaging.DeliveryChannel; +import javax.jbi.messaging.ExchangeStatus; +import javax.jbi.messaging.MessageExchange; +import javax.jbi.messaging.MessagingException; + +/** + * This class implements MessageExchangeReceiver interface. This is a default implementation that + * demonstrates the multi-threaded environment to receive and process message exchanges from the + * delivery channel. It uses a main thread to receive message exchanges from the delivery channel + * and then processes the received message exchanges in a individual threads from the thread pool. + * The controller methods of MessageExchangeReceiver controls the main thread and the thread pool + * execution. + * + * @author chikkala + */ +public class DefaultMessageExchangeReceiver implements MessageExchangeReceiver { + + /** delivery channel accept time out */ + private final static long DC_ACCEPT_TIME_OUT = 3000; // milliseconds + /** receiver thread wait time before polling for messages after woke up **/ + private final static long RECEIVER_WAIT_TIME = 2000; // milliseconds + /** receiver thread wait time before force shutdown */ + private final static long RECEIVER_SHUTDOWN_WAIT_TIME = 10; // seconds + /** handler threads wait time before forced shutdown */ + private final static long HANDLERS_SHUTDOWN_WAIT_TIME = 30; // seconds + /** handler thread pool size */ + private final static int HANDLER_THREAD_POOL_SIZE = 5; + /** receiver thread accept message exchange condition */ + private Boolean mCanAccept = false; + /** receiver thread termination condition */ + private Boolean mContinue = true; + /** receiver thread executor service */ + private ExecutorService mReceiverThreadMgr; + /** handler thread executor service */ + private ExecutorService mHandlerThreadPool; + + /** no default constructor for extended classes */ + public DefaultMessageExchangeReceiver() { + } + /** + * this method is called from the ComponentLifecyle.init method of the AbstractComponentLifecycle + * to initialize the message exchange receiving resources such as threads and thread pools + * throws JBIException on error + */ + public final void initReceiver() throws JBIException { + + this.mHandlerThreadPool = Executors.newFixedThreadPool(HANDLER_THREAD_POOL_SIZE); + this.mReceiverThreadMgr = Executors.newSingleThreadExecutor(); + + this.mReceiverThreadMgr.execute(new Runnable() { + public void run() { + Thread t = Thread.currentThread(); + while ( mContinue ) { + if (mCanAccept) { + receiveAndProcessMessageExchange(); + } else { + try { + t.sleep(RECEIVER_WAIT_TIME); + } catch (InterruptedException interruptException) { + // someone must have interrupted this thread + // do nothing + RuntimeHelper.logDebug("Interrupted the MessageReceiverThread in Sleep"); + } + } + } + } + }); + } + /** + * this method is called from the ComponentLifecyle.shutdown method of the AbstractComponentLifecycle + * to cleanup the message exchange receiving resources such as threads and thread pools. + * throws JBIException on error + */ + public final void shutdownReceiver() throws JBIException { + + synchronized ( mContinue ) { + mContinue = false; + } + boolean terminated = false; + try { + this.mReceiverThreadMgr.shutdown(); + terminated = this.mReceiverThreadMgr.awaitTermination( + RECEIVER_SHUTDOWN_WAIT_TIME, TimeUnit.SECONDS); + } catch (InterruptedException ex) { + RuntimeHelper.logDebug(ex); + } finally { + if ( !terminated ) { + RuntimeHelper.logDebug("Message Receiver not shutdown. Forcing shutdown"); + this.mReceiverThreadMgr.shutdownNow(); + } + } + shutdownHandlers(); + } + /** + * shutdown all the working threads from the thread pool. + */ + private final void shutdownHandlers() throws JBIException { + + boolean terminated = false; + try { + this.mHandlerThreadPool.shutdown(); + terminated = this.mHandlerThreadPool.awaitTermination( + HANDLERS_SHUTDOWN_WAIT_TIME, TimeUnit.SECONDS); + } catch (InterruptedException ex) { + RuntimeHelper.logDebug(ex); + } finally { + if ( !terminated ) { + RuntimeHelper.logDebug("Handler threads not shutdown. Forcing shutdown"); + this.mHandlerThreadPool.shutdownNow(); + } + } + } + /** + * this method is called from the ComponentLifecyle.start method of the AbstractComponentLifecycle + * to start receiving the message exchanges from the delivery channel and process them. + * throws JBIException on error + */ + public final void startProcessing() throws JBIException { + + synchronized ( this.mCanAccept ) { + this.mCanAccept = true; + } + } + /** + * this method is called from the ComponentLifecyle.stop method of the AbstractComponentLifecycle + * to stop receiving the message exchanges from the delivery channel. + * throws JBIException on error + */ + public final void stopProcessing() throws JBIException { + + synchronized ( this.mCanAccept ) { + this.mCanAccept = false; + } + } + + protected MessageExchangeSupport getMessageExchangeSupport() { + return RuntimeHelper.getMessageExchangeSupport(); + } + + private void receiveAndProcessMessageExchange() { + try { + DeliveryChannel channel = RuntimeHelper.getDeliveryChannel(); + if ( channel == null ) { + RuntimeHelper.logDebug("DeliveryChannel Not Opened for receiving messages"); + return; + } + final MessageExchange msgExchange = channel.accept(DC_ACCEPT_TIME_OUT); + if ( msgExchange == null ) { + // delivery channel timeout occurred. do nothing. + // RuntimeHelper.logDebug("DeliveryChannel returned null message exchange from accept"); + return; + } + final ExchangeStatus status = msgExchange.getStatus(); + // process message exchange in a separate thread + this.mHandlerThreadPool.execute(new Runnable() { + public void run() { + getMessageExchangeSupport().fireMessageExchangeReceived(status, msgExchange); + } + }); + + } catch (MessagingException ex) { + RuntimeHelper.logWarning(ex); + ex.printStackTrace(); + } + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/MessageExchangeHandler.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/MessageExchangeHandler.java new file mode 100644 index 000000000..4631b23a1 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/MessageExchangeHandler.java @@ -0,0 +1,31 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * MessageExchangeHandler.java + * + */ + +package net.openesb.component.${componentName}.common; + +import javax.jbi.messaging.ExchangeStatus; +import javax.jbi.messaging.MessageExchange; + +/** + * This interface is a Handler to perform message exchanges when the component + * receives the MessageExchange object from the delivery channel. + * Implementation of this interface should implement the processing of + * the active, error, done status of the MessageExchange object according to + * the MEP for which the MessageExchange object is created. + * + * @author chikkala + */ +public interface MessageExchangeHandler { + /** + * this method will be invoked to process the MessageExchange + * object. + * @param msgExchange MessageExchange object to process. + */ + void processMessageExchange(ExchangeStatus status, MessageExchange msgExchange); + +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/MessageExchangeListener.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/MessageExchangeListener.java new file mode 100644 index 000000000..7701fc300 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/MessageExchangeListener.java @@ -0,0 +1,36 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * MessageExchangeListener.java + */ + +package net.openesb.component.${componentName}.common; + +import javax.jbi.messaging.ExchangeStatus; +import javax.jbi.messaging.MessageExchange; + +/** + * This interface defines the notification mechanism with which the message exchange object received + * from the delivery channel is processed by the interesting parties. A particular service endpoint + * implementation would first register the implementation of this interface with MessageExchangeSupport + * to get the notification of a received message exchange on a particular service endpoint and the + * implementation of the interface would process the message exchange when notified. + * + * When the com.sun.jbi.sample.component.common.DefaultMessageExchangeReceiver receives the message exchange + * object, it asks the MessageExchangeSupport to notify the MessageExchangeLister that is registered for the + * received message exchange object to process the message exchange object. + * @see com.sun.jbi.sample.component.common.MessageExchangeSupport + * @see com.sun.jbi.sample.component.common.DefaultMessageExchangeReceiver + * @see com.sun.jbi.sample.component.common.deployment.ProviderEndpoint + * @see com.sun.jbi.sample.component.common.deployment.ProviderEndpoint + * @author chikkala + */ +public interface MessageExchangeListener { + /** + * MessageExchangeSupport will call this method to notify the lister implementation that a + * message exchange is received from the delivery channel. + * @param me MessageExchange Object + */ + void messageExchangeReceived(ExchangeStatus status, MessageExchange me); +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/MessageExchangeReceiver.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/MessageExchangeReceiver.java new file mode 100644 index 000000000..3efd441f4 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/MessageExchangeReceiver.java @@ -0,0 +1,47 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * MessageExchangeReceiver.java + * + */ + +package net.openesb.component.${componentName}.common; + +import javax.jbi.JBIException; + +/** + * This interface provides the methods can controls the receiving and processing of the message + * exchange objects from the delivery channel during the component lifecycle operations. + * The implementation of this interface can use multi-threaded environment to receive and process + * message exchanges from the delivery channel during the component lifecycle. + * @see com.sun.jbi.sample.component.common.DefaultMessageExchangeReceiver + * @author chikkala + */ +public interface MessageExchangeReceiver { + /** + * this method is called from the ComponentLifecyle.init method of the AbstractComponentLifecycle + * to initialize the message exchange receiving resources such as threads and thread pools + * throws JBIException on error + */ + void initReceiver() throws JBIException; + /** + * this method is called from the ComponentLifecyle.start method of the AbstractComponentLifecycle + * to start receiving the message exchanges from the delivery channel and process them. + * throws JBIException on error + */ + void startProcessing() throws JBIException; + /** + * this method is called from the ComponentLifecyle.stop method of the AbstractComponentLifecycle + * to stop receiving the message exchanges from the delivery channel. + * throws JBIException on error + */ + void stopProcessing() throws JBIException; + /** + * this method is called from the ComponentLifecyle.shutdown method of the AbstractComponentLifecycle + * to cleanup the message exchange receiving resources such as threads and thread pools. + * throws JBIException on error + */ + void shutdownReceiver() throws JBIException; + +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/MessageExchangeSupport.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/MessageExchangeSupport.java new file mode 100644 index 000000000..2ebdc602d --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/MessageExchangeSupport.java @@ -0,0 +1,170 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * MessageExchangeSupport.java + * + */ + +package net.openesb.component.${componentName}.common; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import javax.jbi.messaging.ExchangeStatus; +import javax.jbi.messaging.MessageExchange; +import javax.jbi.messaging.MessageExchange.Role; +import javax.xml.namespace.QName; + +/** + * This class supports the registering and unregistering MessageExchangeListeners and the + * MessageExchangeHandlers that can be used to process the received message exchange from a + * delivery channel. A global reference to this class will be created in RuntimeContext object to + * provide access to this class from any where in the component runtime. + * + * A ProviderEndpoint or ConsumerEndpoint interested in a MessageExchange received from a delivery + * channel for a particular service endpoint will register the MessageExchangeListener with this + * class. The DefaultMessageExchangeReceiver when received a message exchange object from the delivery + * channel uses MessageExchangeSupport.processMessageExchange method to notify the registered listener. + * + * The MessageExchangeListener implementation ( ProviderEndpoint or ConsumerEndpoint ) while processing + * received message ( messageExchangeReceived()) will create and register the message exchange handlers + * to process the message exchange. + * + * @see RuntimeContext${symbol_pound}getMessageExchangeSupport + * @see RuntimeHelper${symbol_pound}getMessageExchangeSupport + * @see DefaultMessageExchangeReceiver${symbol_pound}receiveAndProcessMessageExchange + * @see com.sun.jbi.sample.component.common.deployment.ProviderEndpoint + * @author chikkala + */ +public class MessageExchangeSupport { + /** listener map to notify a message exchange received event */ + private Map mListeners; + /** handlers that can process the message exchange */ + private Map mHandlers; + /** Creates a new instance of MessageExchangeSupport */ + public MessageExchangeSupport() { + this.mListeners = Collections.synchronizedMap(new HashMap()); + this.mHandlers = Collections.synchronizedMap(new HashMap()); + } + /** + * generates key that will be used to store the MessageExchangeListener objects. + * @param serviceName QName of the service + * @param endpointName endpoint name of the service. + */ + public String createListenerKey(Role role, QName interfaceName, QName serviceName, String endpointName) { + + StringBuffer strBuff = new StringBuffer(); + strBuff.append(interfaceName).append("+"); + strBuff.append(serviceName).append("+"); + strBuff.append(endpointName).append("+"); + String roleType = null; + if ( Role.CONSUMER.equals(role) ) { + roleType = "CONSUMER"; + } else if ( Role.PROVIDER.equals(role) ) { + roleType = "PROVIDER"; + } + strBuff.append(roleType); + return strBuff.toString(); + } + /** + * adds message exchange listener who are interested in receiving the notification when the + * message exchange is received from delivery channel. The listener can be registered with the + * following combination of the parameters: (role,interfaceName,serviceName, endpointName), + * (role,interfaceName,null, null), (role, null,serviceName, endpointName), (role, null,serviceName, null) + * + * @param role role of the message exchange listener PROVIDER or CONSUMER - can not be null. + * @param interfaceName QName of the interface ( protType ) - can be null if the serviceName is not null + * @param serviceName QName of the service - can be null if interfaceName is not null. + * @param endpointName endpoint name of the service. - can be null if the serviceName is not null. + * @param listener MessageExchangeListener object + */ + public synchronized void addMessageExchangeListener(Role role, QName interfaceName, QName serviceName, String endpointName, MessageExchangeListener listener) { + String key = createListenerKey(role, interfaceName, serviceName, endpointName); + this.mListeners.put(key, listener); + } + /** + * removes any message exchange listener registered for the service endpoint specified by the serviceName and + * endpoint name. + * @param serviceName QName of the service + * @param endpointName endpoint name of the service. + */ + public synchronized void removeMessageExchangeListener(Role role, QName interfaceName, QName serviceName, String endpointName) { + String key = createListenerKey(role, interfaceName, serviceName, endpointName); + MessageExchangeListener listener = this.mListeners.remove(key); + if ( listener == null ) { + RuntimeHelper.getLogger().fine("No message exchange listener removed with key " + key); + } + } + /** + * finds the MessageExchangeListner registers for the endpoint for which the message exchange is + * received and call the method on the listener + */ + public boolean fireMessageExchangeReceived(ExchangeStatus status, MessageExchange me) { + boolean notified = false; + Role role = me.getRole(); + QName interfaceName = me.getInterfaceName(); + QName serviceName = me.getEndpoint().getServiceName(); + String endpointName = me.getEndpoint().getEndpointName(); + // lookup with complete service description ( role + interface + service + endpoint ) + String key = createListenerKey(role, interfaceName, serviceName, endpointName); + RuntimeHelper.getLogger().fine("looking up for mx listener with key " + key); + MessageExchangeListener listener = this.mListeners.get(key); + + if ( listener == null ) { // lookup with role+interface name + key = createListenerKey(role, interfaceName, null, null); + RuntimeHelper.getLogger().fine("looking up for mx listener with key " + key); + listener = this.mListeners.get(key); + } + if ( listener == null ) { // lookup with role + serviceName + endpointName + key = createListenerKey(role, null, serviceName, endpointName); + RuntimeHelper.getLogger().fine("looking up for mx listener with key " + key); + listener = this.mListeners.get(key); + } + if ( listener == null ) { // lookup with with role + serviceName + key = createListenerKey(role, null, serviceName, null); + RuntimeHelper.getLogger().fine("looking up for mx listener with key " + key); + listener = this.mListeners.get(key); + } + if ( listener == null ) { + RuntimeHelper.getLogger().fine("Could not find listener for message exchange" + me); + notified = false; + } else { + listener.messageExchangeReceived(status,me); + notified = true; + } + return notified; + } + /** + * registers the MessageExchangeHandler implementation against the message exchange id. + * @param me MessageExchange for which the handler need to be assigned + * @param handler MessageExchangeHandler implementation that will be registers. + */ + public synchronized void addMessageExchangeHandler(MessageExchange me, MessageExchangeHandler handler) { + this.mHandlers.put(me.getExchangeId(), handler); + } + /** + * removes the MessageExchangeHandler for the particular message exchange object + */ + public synchronized void removeMessageExchangeHandler(MessageExchange me) { + MessageExchangeHandler handler = this.mHandlers.remove(me.getExchangeId()); + if ( handler == null ) { + RuntimeHelper.getLogger().fine("No MessageExchangeHandler found for removing " + me.getExchangeId()); + } + } + /** + * looks up the registered message exchange handler for the message exchange object + * @param me MessageExchangeHandler. + */ + public synchronized MessageExchangeHandler findMessageExchangeHandler(MessageExchange me) { + return this.mHandlers.get(me.getExchangeId()); + } + /** + * looks up the registered message exchange handler for the message exchange object with Id + * @param exchangeId message exchange object's id + */ + public synchronized MessageExchangeHandler findMessageExchangeHandler(String exchangeId) { + return this.mHandlers.get(exchangeId); + } + +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/RuntimeContext.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/RuntimeContext.java new file mode 100644 index 000000000..ac67bb2f1 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/RuntimeContext.java @@ -0,0 +1,176 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * RuntimeContext.java + * + */ + +package net.openesb.component.${componentName}.common; + +import java.util.logging.Logger; +import javax.jbi.component.ComponentContext; +import javax.jbi.messaging.DeliveryChannel; + +/** + * This class is global context for all the component runtime to store and + * retrieve the information that should be available anywhere in the component runtime. + * + * Each instance variable of this class will be initialized at various points of the + * component runtime using setter methods on this class. + * + * The two important objects that will be initialized and available from this context are + * ComponentContext and the opened DeliveryChannel objects both of which will be set from the + * implementation {@link BasicComponentLifeCycle}. + * + * Note that the ComponentContext from this global context will not be available until + * the jbi framework calls the init method of the ComponentLifeCycle of the component and + * then intern the implementation of the init method sets the context. + * + * @see BasicComponentLifeCycle${symbol_pound}initGlobalContext + * @see BasicComponentLifeCycle${symbol_pound}openDeliveryChannel + * @see BasicComponentLifeCycle${symbol_pound}closeDeliveryChannel + * @author chikkala + */ +public final class RuntimeContext { + /** RuntimeContext singleton instance */ + private static RuntimeContext sRuntimeContext; + /** default logger*/ + private Logger mDefLogger; + /** Logger object. */ + private Logger mLogger; + /** Holds value of property ComponentContext. */ + private ComponentContext mComponentContext; + /** Holds value of property DeliveryChannel. */ + private DeliveryChannel mDeliveryChannel; + /** MessageExchange processing support **/ + private MessageExchangeSupport mMESupport; + + /** outside code can not instantiate RuntimeContext */ + private RuntimeContext() { + } + /** + * @return RuntimeContext instance. + */ + public static RuntimeContext getInstance() { + if ( sRuntimeContext == null ) { + synchronized (RuntimeContext.class) { + if ( sRuntimeContext == null ) { + sRuntimeContext = new RuntimeContext(); + } + } + } + return sRuntimeContext; + } + /** + * Getter for to obtaining ComponentContext from any where in the component runtime. + * @return ComponentContext. + */ + public ComponentContext getComponentContext() { + return this.mComponentContext; + } + /** + * Sets the Component context reference in Runtime context for global access + * any class in the component runtime. + * com.sun.jbi.sample.component.common.AbstractComponentLifeCycle${symbol_pound}initContext + * method implementation should call this method to set the global context. + * see com.sun.jbi.sample.component.common.DefaultComponentLifeCycle${symbol_pound}initContext + * for details. + * @param componentContext New value of property ComponentContext. + * @see BasicComponentLifeCycle${symbol_pound}initGlobalContext + */ + public void setComponentContext(ComponentContext componentContext) { + if ( this.mComponentContext != null ) { + (new IllegalStateException("Component Context already " + + "initialized in RuntimeContext")).printStackTrace(); + } + this.mComponentContext = componentContext; + } + /** + * Getter for obtaining opened delivery channel from any where in the component runtime. + * @return DeliveryChannel. + */ + public DeliveryChannel getDeliveryChannel() { + return this.mDeliveryChannel; + } + /** + * Sets the opened delivery channel reference in Runtime context for global access + * any class in the component runtime. + * com.sun.jbi.sample.component.common.AbstractComponentLifeCycle${symbol_pound}initContext + * method implementation should call this method to set the global context. + * see com.sun.jbi.sample.component.common.DefaultComponentLifeCycle${symbol_pound}initContext + * for details. + * + * @param componentContext New value of property ComponentContext. + */ + public void setDeliveryChannel(DeliveryChannel deliveryChannel) { + if ( deliveryChannel != null && this.mDeliveryChannel != null ) { + (new IllegalStateException("Delivery Channel already " + + "initialized in RuntimeContext")).printStackTrace(); + } + this.mDeliveryChannel = deliveryChannel; + } + /** + * Sets the logger. + * + * @param name name for the Logger. + * @param resourceBundle resource bundle for the logger. can be null. + */ + public void setLogger(String name, String resourceBundle) { + + if (this.mComponentContext != null) { + // get the logger from component context if the component context is not null + try { + this.mLogger = this.mComponentContext.getLogger(name, resourceBundle); + } catch (Exception ex) { + ex.printStackTrace(); + } + } else { + this.mDefLogger = Logger.getLogger(name, resourceBundle); + } + } + /** + * Returns the logger. + * + * @return Logger + */ + public Logger getLogger() { + + // try init logger + if (this.mLogger == null && this.mComponentContext != null ) { + try { + this.mLogger = + this.mComponentContext.getLogger(this.getClass().getName(), null); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + // init default logger if required + if ( this.mLogger == null && this.mDefLogger == null) { + this.mDefLogger = Logger.getLogger(this.getClass().getName(), null); + } + return (this.mLogger != null) ? this.mLogger : this.mDefLogger; + } + /** + * Returns the Component Name if the ComponentContext is set. else null + * @return component name + */ + public String getComponentName() { + String componentName = null; + if (this.mComponentContext != null) { + componentName = this.mComponentContext.getComponentName(); + } + return componentName; + } + /** + * Global MessageExchangeSupport reference. Various classes in the common + * component runtime would use this method to obtain the MessageExchangeSupport + * for processing message exchange objects received from delivery channel. + */ + public MessageExchangeSupport getMessageExchangeSupport() { + if ( this.mMESupport == null ) { + this.mMESupport = new MessageExchangeSupport(); + } + return this.mMESupport; + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/RuntimeHelper.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/RuntimeHelper.java new file mode 100644 index 000000000..9f86d1fd4 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/RuntimeHelper.java @@ -0,0 +1,360 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * RuntimeHelper.java + */ + +package net.openesb.component.${componentName}.common; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.PrintWriter; +import java.io.Reader; +import java.io.StringReader; +import java.io.StringWriter; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.jbi.component.ComponentContext; +import javax.jbi.messaging.DeliveryChannel; +import javax.xml.namespace.QName; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.transform.OutputKeys; +import javax.xml.transform.Source; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerConfigurationException; +import javax.xml.transform.TransformerException; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.sax.SAXSource; +import javax.xml.transform.stream.StreamResult; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.EntityResolver; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.SAXParseException; +import org.xml.sax.helpers.DefaultHandler; + +/** + * This is a helper class that have bunch of methods for xml processing. + * @author chikkala + */ +public class RuntimeHelper { + + public static Logger getLogger() { + return RuntimeContext.getInstance().getLogger(); + } + + public static void logWarning(Object logObj) { + if ( logObj instanceof Throwable) { + getLogger().log(Level.WARNING, ((Throwable)logObj).getMessage(), (Throwable)logObj); + } else { + getLogger().warning(logObj.toString()); + } + } + + public static void logError(Object logObj) { + if ( logObj instanceof Throwable) { + getLogger().log(Level.SEVERE, ((Throwable)logObj).getMessage(), (Throwable)logObj); + } else { + getLogger().severe(logObj.toString()); + } + } + + public static void logDebug(Object logObj) { + if ( logObj instanceof Throwable) { + getLogger().log(Level.FINER, ((Throwable)logObj).getMessage(), (Throwable)logObj); + } else { + getLogger().finer(logObj.toString()); + } + } + + public static String getComponentName() { + return RuntimeContext.getInstance().getComponentName(); + } + public static ComponentContext getComponentContext() { + return RuntimeContext.getInstance().getComponentContext(); + } + public static DeliveryChannel getDeliveryChannel() { + return RuntimeContext.getInstance().getDeliveryChannel(); + } + + public static MessageExchangeSupport getMessageExchangeSupport() { + return RuntimeContext.getInstance().getMessageExchangeSupport(); + } + + /** + * return the DOM Document + * @param xmlReader Reader + * @return dom document + * @throws Exception on parser exception or any other exception + */ + public static Document buildDOMDocument(Reader xmlReader) throws Exception { + InputSource xmlSource = new InputSource(xmlReader); + return buildDOMDocument(xmlSource); + } + /** + * return the DOM Document + * @param xmlReader Reader + * @return dom document + * @throws Exception on parser exception or any other exception + */ + public static Document buildDOMDocument(InputSource xmlSource) throws Exception { + Document xmlDoc = null; + DocumentBuilderFactory docBuilderFactory = + DocumentBuilderFactory.newInstance(); + docBuilderFactory.setValidating(false); + docBuilderFactory.setNamespaceAware(true); + DocumentBuilder docBuilder = + docBuilderFactory.newDocumentBuilder(); + docBuilder.setErrorHandler( new DefaultHandler() { + public void fatalError(SAXParseException e) + throws SAXException { + throw new SAXException(e.getMessage()); + } + }); + + docBuilder.setEntityResolver(new EntityResolver() { + public InputSource resolveEntity(String publicId, String systemId) + throws SAXException, IOException { + StringReader reader = + new StringReader(""); // NOI18N + InputSource source = new InputSource(reader); + source.setPublicId(publicId); + source.setSystemId(systemId); + return source; + } + }); + + xmlDoc = docBuilder.parse(xmlSource); + + return xmlDoc; + } + /** + * reads xml text from DOMSource to StringBuffer + */ + public static StringBuffer readFromDOMSource(DOMSource domSource) { + + StringWriter writer = new StringWriter(); + + TransformerFactory tFactory = TransformerFactory.newInstance(); + Transformer trans = null; + try { + trans = tFactory.newTransformer(); + trans.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, + "yes"); + trans.setOutputProperty(OutputKeys.INDENT, "yes"); + StreamResult result = new StreamResult(writer); + trans.transform(domSource, result); + } catch (TransformerConfigurationException ex) { + ex.printStackTrace(); + } catch (TransformerException ex) { + ex.printStackTrace(); + } + + return writer.getBuffer(); + } + /** + * reads the xml text from InputSource into a StringBuffer + */ + public static StringBuffer readFromInputSource(InputSource inSource) { + + StringWriter writer = new StringWriter(); + PrintWriter out = new PrintWriter(writer); + InputStream inStream = inSource.getByteStream(); + Reader reader = inSource.getCharacterStream(); + if ( reader == null ) { + reader = new InputStreamReader(inStream); + } + BufferedReader buff = new BufferedReader(reader); + try { + + for ( String line = null; (line = buff.readLine()) != null ; ) { + out.println(line); + } + } catch (IOException ex) { + ex.printStackTrace(); + } + + return writer.getBuffer(); + } + /** + * reads xml from from DOM, SAX or Stream Source into a string buffer + */ + public static StringBuffer readFromSource(Source source) { + if ( source instanceof DOMSource ) { + return readFromDOMSource((DOMSource)source); + } else { + InputSource inSource = SAXSource.sourceToInputSource(source); + if ( inSource != null ) { + return readFromInputSource(inSource); + } else { + return null; + } + } + } + /** + * creates a DOMSource from the xml text read from the reader. + */ + public static DOMSource createDOMSource(Reader xmlReader) { + Document doc = null; + try { + doc = buildDOMDocument(xmlReader); + } catch (Exception ex) { + ex.printStackTrace(); + } + return new DOMSource(doc); + } + /** + * creates a DOMSource from any source. If the source itself is DOMSource, + * the source is returned as it is as DOMSource. + */ + public static DOMSource sourceToDOMSource(Source source) { + if ( source instanceof DOMSource) { + return (DOMSource) source; + } + InputSource xmlSource = SAXSource.sourceToInputSource(source); + Document doc = null; + try { + doc = buildDOMDocument(xmlSource); + } catch (Exception ex) { + ex.printStackTrace(); + } + return new DOMSource(doc); + } + /** + * converts the ex stracktrace to string. + */ + public static StringBuffer getExceptionStackTrace(Exception ex) { + StringWriter strWriter = new StringWriter(); + if ( ex != null ) { + PrintWriter out = new PrintWriter(strWriter); + ex.printStackTrace(out); + } + return strWriter.getBuffer(); + } + /** + * may be used to set the exception as fault content. + */ + public static String getExceptionAsXmlText(Exception ex) { + String message = replaceXmlEscapeCharsToEntityRefereces(ex.getMessage()); + String stackTrace = replaceXmlEscapeCharsToEntityRefereces( + getExceptionStackTrace(ex).toString()); + String exXmlText = + "" + + "" + message + "" + + "" + stackTrace + "" + + "" ; + return exXmlText; + } + + /** + * may be used to set the exception as fault content. + */ + public static String getExceptionAsText(Exception ex) { + String message = replaceXmlEscapeCharsToEntityRefereces(ex.getMessage()); + String stackTrace = replaceXmlEscapeCharsToEntityRefereces( + getExceptionStackTrace(ex).toString()); + StringBuffer buff = new StringBuffer(); + buff.append(message); + buff.append(System.getProperty("line.separator", "${symbol_escape}n")); + buff.append(stackTrace); + return buff.toString(); + } + + + /** + * For attribute values which denote a QName, i.e. include a namespace prefix, + * resolve the value into a QName. + * If a namespace can not be resolved, it is set to empty - it does not + * result in an exception + * @param attrValue the string value of the attribute + * @param element the element the attribute belongs to + */ + public static QName resolveAttrQName(String attrValue, Element element) { + int aColonLoc = attrValue.indexOf(":"); + String aLocalName = attrValue; + String aPrefix = null; + String aNS = null; + if (aColonLoc > -1) { + aPrefix = attrValue.substring(0, aColonLoc); + aLocalName = attrValue.substring(aColonLoc + 1); + + // Traverse up the hierarchy until a namespace definition is found + // or the top of the document is reached. + Node currNode = element; + while ((aNS == null || aNS.equals("")) && currNode != null) { + if (currNode.getNodeType() == Node.ELEMENT_NODE) { + aNS = ((Element) currNode).getAttribute("xmlns:" + aPrefix); + } + currNode = currNode.getParentNode(); + } + } + + QName qName = new QName(aNS, aLocalName, aPrefix); + + return qName; + } + + /** + * replaces the xml entity references with the xml escape chars + * @param xmlString Text with the xml escape chars + * @param Text with the xml entity references + */ + public static String replaceXmlEscapeCharsToEntityRefereces(String xmlString) { + if ( xmlString == null ) { + return xmlString; + } + + // just convert < , > and & only + StringBuffer sbuff = new StringBuffer(2 * xmlString.length()); + for ( int i = 0; i < xmlString.length(); ++i ) { + switch ( xmlString.charAt(i) ) { + case '&': sbuff.append("&"); + break; + case '<': sbuff.append("<"); + break; + case '>': sbuff.append(">"); + break; + default: sbuff.append( xmlString.charAt(i) ); + } + } + return sbuff.toString(); + } + + /** + * return Element node from a document node or non document. Use to extract + * the message root element. + * @root node from which the Element node will be extracted. + * @return Element node. + */ + public static Element getElement(Node root) { + Element msgEl = null; + if ( root instanceof Document) { + msgEl = ((Document)root).getDocumentElement(); + } else if (root instanceof Element) { + msgEl = (Element)root; + } else { + NodeList nodeList = root.getChildNodes(); + for ( int i=0; i < nodeList.getLength(); ++i) { + Node node = nodeList.item(i); + if ( node instanceof Element ) { + msgEl = (Element) node; + break; + } + } + } + return msgEl; + } + + public static Element getElement(DOMSource domSource) { + return getElement(domSource.getNode()); + } + +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/deployment/AbstractServiceUnitManager.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/deployment/AbstractServiceUnitManager.java new file mode 100644 index 000000000..7a188abea --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/deployment/AbstractServiceUnitManager.java @@ -0,0 +1,312 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * AbstractServiceUnitManager.java + * + */ + +package net.openesb.component.${componentName}.common.deployment; + +import net.openesb.component.${componentName}.common.RuntimeHelper; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.jbi.component.ServiceUnitManager; +import javax.jbi.management.DeploymentException; + +/** + * This is an abstract class that implements {@link javax.jbi.component.ServiceUnitManager} to provide a + * service unit deployment support for the component. The implementation supported by this service + * unit manager and related classes in this package provides WSDL1.1 based service unit deployment + * in the component. + * + * @see javax.jbi.component.ServiceUnitManager + * @see ServiceUnit + * + * @author chikkala + */ +public abstract class AbstractServiceUnitManager implements ServiceUnitManager { + + /** Map of ServiceUnit Name to the ServiceUnit Object for all the service units + * deployed in the component */ + private Map mSUMap; + + /** Creates a new instance of AbstractSUManager */ + protected AbstractServiceUnitManager() { + this.mSUMap = Collections.synchronizedMap(new HashMap()); + } + /** returns the component name + * @return component name. + */ + protected abstract String getComponentName(); + /** + * @return Logger + */ + protected abstract Logger getLogger(); + /** + * returns the creation of the ServiceUnit implementation specific to the service unit deployment + * for the component. + * @param suName service unit name + * @param suRootPath service unit root path + * @param concrete implementation of the ServiceUnit class. + */ + protected abstract ServiceUnit createServiceUnit(String suName, String suRootPath) + throws DeploymentException; + /** + * returns the service unit object deployed by the specified name. or null if not deployed. + * @param suName service unit name to look for + * @param ServiceUnit object for the suName. or null if not present. + */ + private ServiceUnit getServiceUnit(String suName) { + return this.mSUMap.get(suName); + } + /** + * lookup for the deployed service unit. If not there, throws a deployment exception. + * @param suName service unit name + * @return ServiceUnit object + * @throws DeploymentException if the service unit is not present. + */ + private ServiceUnit findServiceUnit(String suName) throws DeploymentException { + ServiceUnit serviceUnit = getServiceUnit(suName); + if ( serviceUnit == null ) { + throw new DeploymentException("Service unit " + suName + " does not exist"); + } + return serviceUnit; + } + /** + * add the service unit object to the list of deployed service units. if there is already a + * service unit present with the name, throws a deployment exception. + * @param su service unit to add + * @return ServiceUnit object that is added. + * @throws DeploymentException if the service unit already present. + */ + private ServiceUnit addServiceUnit(ServiceUnit su) throws DeploymentException { + String suName = su.getName(); + ServiceUnit oldSU = getServiceUnit(suName); + if ( oldSU != null ) { + throw new DeploymentException("Service unit " + suName + "already exists"); + } + this.mSUMap.put(suName, su); + return su; + } + /** + * removes service unit object from the list of deployed service units. if there is no + * service unit present with the name, throws a deployment exception. + * @param su service unit to add + * @return ServiceUnit object that is being removed. + * @throws DeploymentException if the service unit already present. + */ + private ServiceUnit removeServiceUnit(ServiceUnit su) throws DeploymentException { + String suName = su.getName(); + ServiceUnit oldSU = getServiceUnit(suName); + if ( oldSU == null ) { + throw new DeploymentException("Service unit " + suName + " does not exist"); + } + return this.mSUMap.remove(suName); + } + /** + * creates the concrete service unit implementation and calls the load method on it to initialize + * the created service unit. + * @param suName service unit name to create + * @param suRootPath service unit root path. + * @return ServiceUnit that is created and loaded. + */ + private ServiceUnit loadServiceUnit(String suName, String suRootPath) throws DeploymentException { + ServiceUnit serviceUnit = createServiceUnit(suName, suRootPath); + serviceUnit.doLoad(); + return serviceUnit; + } + /** + * deploys a service unit. it creates and loads the service unit object for the suName and then call + * doDeploy on the service unit and adds it to the deployed service unit list + * @return result as jbi management xml + * @throws DeploymentException if there is an error deploying. + */ + private synchronized String deployServiceUnit(String suName, String suRootPath) throws DeploymentException { + String result = suName; + ServiceUnit oldSU = getServiceUnit(suName); + if ( oldSU != null ) { + throw new DeploymentException("Service unit " + suName + "already exists"); + } + ServiceUnit serviceUnit = loadServiceUnit(suName, suRootPath); + serviceUnit.doDeploy(); + addServiceUnit(serviceUnit); + return result; + } + /** + * Deploy a Service Unit to the component. + * @see javax.jbi.component.ServiceUnitManager${symbol_pound}deploy(String, String); + */ + public final String deploy(String suName, String suRootPath) throws DeploymentException { + this.getLogger().fine("Deploying service unit " + suName + " with suRootPath " + suRootPath); + String compName = this.getComponentName(); + boolean isSuccess = true; + String mainMsg = "Successfully deployed service unit " + suName; + Exception errEx = null; + try { + deployServiceUnit(suName, suRootPath); + } catch (Exception ex) { + isSuccess = false; + errEx = ex; + mainMsg = "Failed to deploy service unit " + suName ; + this.getLogger().log(Level.FINE, mainMsg, ex); + } + return createComponentTaskResultXML(compName, "deployTask", isSuccess, mainMsg, errEx); + } + + /** + * undeploys the service unit. it looks up the existing deployed service unit and call doUndeploy + * on it and then removes from the deployed service unit list. + */ + private synchronized String undeployServiceUnit(String suName, String suRootPath) throws DeploymentException { + String result = suName; + ServiceUnit serviceUnit = findServiceUnit(suName); + serviceUnit.doUndeploy(); + removeServiceUnit(serviceUnit); + return result; + } + /** + * Undeploy a service unit from the component. + * @see javax.jbi.component.ServiceUnitManager${symbol_pound}undeploy(String, String); + */ + public final String undeploy(String suName, String suRootPath) throws DeploymentException { + this.getLogger().fine("Undeploying service unit " + suName + " with suRootPath " + suRootPath); + String compName = this.getComponentName(); + boolean isSuccess = true; + String mainMsg = "Successfully undeployed service unit " + suName; + Exception errEx = null; + try { + undeployServiceUnit(suName, suRootPath); + } catch (Exception ex) { + isSuccess = false; + errEx = ex; + mainMsg = "Failed to undeploy service unit " + suName ; + this.getLogger().log(Level.FINE, mainMsg, errEx); + } + return createComponentTaskResultXML(compName, "undeployTask", isSuccess, mainMsg, errEx); + } + /** + * Initialize the given deployed service unit. + * @see javax.jbi.component.ServiceUnitManager${symbol_pound}init(String, String); */ + public final void init(String suName, String suRootPath) + throws DeploymentException { + this.getLogger().fine("Initializing service unit " + suName + " with suRootPath " + suRootPath); + String result = suName; + ServiceUnit serviceUnit = getServiceUnit(suName); + if ( serviceUnit == null ) { // if the service unit not exists, create and add + serviceUnit = loadServiceUnit(suName, suRootPath); // create and load service unit + addServiceUnit(serviceUnit); // add service unit to existing service units + } + serviceUnit.doInit(); // Do Service unit initialization tasks + this.getLogger().fine("Service unit initialized:" + suName); + } + /** + * Shut down the deployment. + * @see javax.jbi.component.ServiceUnitManager${symbol_pound}shutdown(String); + */ + public final void shutDown(String suName) throws DeploymentException { + ServiceUnit serviceUnit = findServiceUnit(suName); // find service unit + serviceUnit.doShutdown(); // Do Service unit shutdown tasks + this.getLogger().fine("Service unit shut down:" + suName); + } + /** + * Start the deployed service unit. + * @see javax.jbi.component.ServiceUnitManager${symbol_pound}start(String); + */ + public final void start(String suName) throws DeploymentException { + ServiceUnit serviceUnit = findServiceUnit(suName); // find service unit + serviceUnit.doStart(); // Do service unit start tasks. + this.getLogger().fine("Service unit started:" + suName ); + } + /** + * Stop the deployed service unit. + * @see javax.jbi.component.ServiceUnitManager${symbol_pound}stop(String); + */ + public final void stop(String suName) throws DeploymentException { + ServiceUnit serviceUnit = findServiceUnit(suName); // find service unit + serviceUnit.doStop(); // do service unit stop tasks + this.getLogger().fine("Service unit stopped: " + suName + " stopped."); + } + + /** + * helper method to create result message as jbi management message xml. + * @param componentName name of the component for this xml. + * @param taskId task id + * @param isSuccess true to format a success result, false to format a failed result. + * @param mainMsg main result message + * @param errEx Exception, null if there is no exception in failure message. + * @return XML string. + */ + protected static String createComponentTaskResultXML( + String componentName, String taskId, boolean isSuccess, String mainMsg, Exception errEx ) { + + String exMsgXml = getComponentTaskResultExceptionXML(errEx); + String mainMsgXmlEsc = RuntimeHelper.replaceXmlEscapeCharsToEntityRefereces(mainMsg); + String taskResult = isSuccess ? "SUCCESS" : "FAILED"; + String msgType = isSuccess ? "INFO" : "ERROR"; + + String xmlResult = + "" + + " " + componentName + "" + + " " + + " " + + " " + taskId + "" + + " " + taskResult + "" + + " " + msgType + "" + + " " + + " " + + " SU_MGR_MSG_ID" + + " " + mainMsgXmlEsc + "" + + " " + + " " + + exMsgXml + + " " + + " " + + ""; + + return xmlResult; + } + /** + * converts the exception to the jbi management message xml chunk. + */ + private static String getComponentTaskResultExceptionXML(Exception errEx) { + StringBuffer exMsgBuff = new StringBuffer(); + if ( errEx == null ) { + return exMsgBuff.toString(); // empty string. + } + + List exList = new ArrayList(); + int exLevel = 0; + for ( Throwable cause = errEx ; cause != null ; cause = cause.getCause() ) { + String causeMsg = RuntimeHelper.replaceXmlEscapeCharsToEntityRefereces( + cause.getMessage()); + StringWriter stBuff = new StringWriter(); + PrintWriter stOut = new PrintWriter(stBuff); + StackTraceElement[] stList = cause.getStackTrace(); + for (StackTraceElement stEl : stList) { + stOut.println(stEl.toString()); + } + stOut.close(); + String causeStackTrace = RuntimeHelper.replaceXmlEscapeCharsToEntityRefereces( + stBuff.getBuffer().toString()); + + exMsgBuff.append(""); + exMsgBuff.append(" " + exLevel + ""); + exMsgBuff.append(" " + "SU_MGR_EXP_ID"); + exMsgBuff.append(" " + causeMsg + ""); + exMsgBuff.append(" "); + exMsgBuff.append(" " + causeStackTrace + ""); + exMsgBuff.append(""); + ++exLevel; + } + + return exMsgBuff.toString(); + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/deployment/ConsumerEndpoint.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/deployment/ConsumerEndpoint.java new file mode 100644 index 000000000..b954fe260 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/deployment/ConsumerEndpoint.java @@ -0,0 +1,208 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * ConsumerEndpoint.java + */ + +package net.openesb.component.${componentName}.common.deployment; + +import javax.jbi.JBIException; +import javax.jbi.component.ComponentContext; +import javax.jbi.messaging.DeliveryChannel; +import javax.jbi.messaging.InOnly; +import javax.jbi.messaging.InOut; +import javax.jbi.messaging.MessageExchange.Role; +import javax.jbi.messaging.MessageExchangeFactory; +import javax.jbi.messaging.MessagingException; +import javax.jbi.messaging.NormalizedMessage; +import javax.jbi.servicedesc.ServiceEndpoint; +import javax.wsdl.Definition; +import javax.xml.namespace.QName; + +/** + * This class extends from Endpoint class and implements lifecycle methods functionality required for the + * endpoint for a service consumer. {@link ServiceUnit${symbol_pound}createConsumerEndpoint} creates the object of this + * type to implement the service consumer functionality. + * + * @see ServiceUnit${symbol_pound}createConsumerEndpoint + * @author chikkala + */ + +public class ConsumerEndpoint extends Endpoint { + /** + * This constructor initializes the endpoint with CONSUMER role and makes sure that the service + * description passed to it is of consumer description. + */ + protected ConsumerEndpoint(SUDescriptor.Consumes consumes, Definition wsdlDef, ServiceUnit su) { + super(Role.CONSUMER, consumes, wsdlDef, su); + } + /** + * constructor that does not need service unit information. useful for creating the endpoint for + * static services provided by the component. + */ + protected ConsumerEndpoint(SUDescriptor.Consumes consumes, Definition wsdlDef) { + this(consumes, wsdlDef, null); + } + public final void init() throws JBIException { + getLogger().fine("ConsumerEndpoint: init called"); + doInit(); //1. initialize the endpiont resources + addMessageExchangeListener(); //2. register message exchange linster. + } + public final void activate() throws JBIException { + getLogger().fine("ConsumerEndpoint: activate called"); + //1. do common ativation tasks. + doActivate(); //2. do any other activation related tasks. + } + + public final void deactivate() throws JBIException { + getLogger().fine("ConsumerEndpoint: deactivate called"); + //1. do common deactivation tasks. + doDeactivate(); //2. do any other deactivation related tasks. + } + + public final void clean() throws JBIException { + getLogger().fine("ConsumerEndpoint: clean called"); + removeMessageExchangeListener(); //1. remove message exchange listener + doClean(); //2. clean up any other resources. + } + + protected void doInit() throws JBIException { + //NOOP + } + protected void doActivate() throws JBIException { + //NOOP + } + protected void doDeactivate() throws JBIException { + //NOOP + } + protected void doClean() throws JBIException { + //NOOP + } + + /** + * helper method to find the active ServiceEndpiont for the service described with the + * serviceDescriptor. This method looks for the Active ServiceEndpoint using interface or + * service name or service name and the endpoint name. + */ + public ServiceEndpoint findServiceEndpoint() { + + QName serviceType = this.getService().getInterface(); + QName serviceName = this.getService().getServiceName(); + String endpointName = this.getService().getEndpointName(); + + ServiceEndpoint [] refs = null; + ServiceEndpoint serviceEndpoint = null; + ComponentContext compContext = this.getComponentContext(); + + if ( compContext == null ) { + this.getLogger().info("Null Component context. Can not find ServiceEndpoint"); + return null; + } + // lookup ServiceEndpiont with concrete service(serice qname + endpoint name). + if ( serviceName != null && endpointName != null ) { + this.getLogger().info("Looking for ServiceEndpoint with:" + + " ServiceName: " + serviceName + " EndpointName: " + endpointName); + serviceEndpoint = compContext.getEndpoint(serviceName, endpointName); + } + // else lookup ServiceEndpiont with Service Name + if ( serviceEndpoint == null && serviceName != null && endpointName == null) { + this.getLogger().info("Looking for ServiceEndpoint with Service name: " + serviceName); + refs = compContext.getEndpointsForService(serviceName); + if ( refs != null && refs.length > 0 ) { + serviceEndpoint = refs[0]; + } + } + // else lookup ServiceEndpont with serviceType + if ( serviceEndpoint == null && serviceType != null && + serviceName == null && endpointName == null) { + this.getLogger().info("Looking for ServiceEndpoint with Service type: " + serviceType); + refs = compContext.getEndpoints(serviceType); + if ( refs != null && refs.length > 0 ) { + serviceEndpoint = refs[0]; + } + } + + return serviceEndpoint; + } + + /** + * this method creates a InOutMessageExchange Object and sets the required + * data on the MessageExchange object including the create and set the Normalized + * message object to hold the input message on the MessageExchange object. + */ + public InOut createInOutMessageExchange(QName operation) + throws MessagingException, JBIException { + + ServiceEndpoint serviceEndpoint = null; + // find a ServiceEndpoint activated by the Service Providers for this service + serviceEndpoint = findServiceEndpoint(); + + if ( serviceEndpoint == null ) { + // if not found a activated ServiceEndpoint for this service, throw exception. + throw new JBIException("Can not find an Active ServiceEndpoint for ${symbol_escape}n" + this.getService()); + } else { + this.setServiceEndpoint(serviceEndpoint); + } + + InOut inOutME = null; + DeliveryChannel channel = this.getDeliveryChannel(); + // create message exchange factory for the endpiont + MessageExchangeFactory factory = channel.createExchangeFactory(serviceEndpoint); + // create INOUT Message Exchange + inOutME = factory.createInOutExchange(); + // set operation + inOutME.setOperation(operation); + // set interface if that is not set + if ( inOutME.getInterfaceName() == null ) { + inOutME.setInterfaceName(this.getService().getInterface()); + } + // create IN Nomralized Message + NormalizedMessage inMsg = inOutME.createMessage(); + // set IN Normalized message on message exchange + inOutME.setInMessage(inMsg); + + return inOutME; + } + + /** + * this method creates a InOnlyMessageExchange Object and sets the required + * data on the MessageExchange object including the create and set the Normalized + * message object to hold the input message on the MessageExchange object. + */ + public InOnly createInOnlyMessageExchange(QName operation) + throws MessagingException, JBIException { + + ServiceEndpoint serviceEndpoint = null; + // find a ServiceEndpoint activated by the Service Providers for this service + serviceEndpoint = findServiceEndpoint(); + + if ( serviceEndpoint == null ) { + // if not found a activated ServiceEndpoint for this service, throw exception. + throw new JBIException("Can not find an Active ServiceEndpoint for ${symbol_escape}n" + this.getService()); + } else { + this.setServiceEndpoint(serviceEndpoint); + } + + InOnly inOnlyME = null; + DeliveryChannel channel = this.getDeliveryChannel(); + // create message exchange factory for the endpiont + MessageExchangeFactory factory = channel.createExchangeFactory(serviceEndpoint); + // create INOUT Message Exchange + inOnlyME = factory.createInOnlyExchange(); + // set operation + inOnlyME.setOperation(operation); + // set interface if that is not set + if ( inOnlyME.getInterfaceName() == null ) { + inOnlyME.setInterfaceName(this.getService().getInterface()); + } + // create IN Nomralized Message + NormalizedMessage inMsg = inOnlyME.createMessage(); + // set IN Normalized message on message exchange + inOnlyME.setInMessage(inMsg); + + return inOnlyME; + } + + +} \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/deployment/Endpoint.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/deployment/Endpoint.java new file mode 100644 index 000000000..4102a227e --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/deployment/Endpoint.java @@ -0,0 +1,289 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * Endpoint.java + * + */ + +package net.openesb.component.${componentName}.common.deployment; + +import net.openesb.component.${componentName}.common.MessageExchangeHandler; +import net.openesb.component.${componentName}.common.MessageExchangeListener; +import net.openesb.component.${componentName}.common.MessageExchangeSupport; +import net.openesb.component.${componentName}.common.RuntimeHelper; +import net.openesb.component.${componentName}.common.wsdl.WSDLProcessor; +import java.util.logging.Logger; +import javax.jbi.JBIException; +import javax.jbi.component.ComponentContext; +import javax.jbi.messaging.DeliveryChannel; +import javax.jbi.messaging.ExchangeStatus; +import javax.jbi.messaging.MessageExchange; +import javax.jbi.messaging.MessageExchange.Role; +import javax.jbi.servicedesc.ServiceEndpoint; +import javax.wsdl.Binding; +import javax.wsdl.Definition; +import javax.wsdl.Operation; +import javax.xml.namespace.QName; + +/** + * This is an abstract class that represents the Endpoint defined for service provisioning or + * consumption in a jbi component. It stores the required service description ( wsdl definition, + * role, service unit to which it belongs etc) and defines the lifecycle operations {@link ${symbol_pound}init}, + * {@link ${symbol_pound}activate}, {@link ${symbol_pound}deactivate}, {@link ${symbol_pound}clean} to control a service endpoint that + * provides or consumes the service. + *

+ * Extended classes implement the abstract methods defined in this class to implement the endpoint + * functionality by providing the functionality to process the deployment artifacts specific to this + * endpoint, configure the endpoint to send/receive messages to/from delivery channel and process them + * according to the specific service implementation. + * + * @author chikkala + */ +public abstract class Endpoint { + /** Role of this endpoint. CONSUMER or PROVIDER */ + private Role mRole; + /** Service description from the SU descriptor for which this endpoint is configured */ + private SUDescriptor.Service mService; + /** WSDL definition corresponding to this endpoint */ + private Definition mWsdlDef; + /** service endpoint corresponding to this endpoint */ + private ServiceEndpoint mServiceEndpoint; + /** service unit from which this endpoint is created */ + private ServiceUnit mSU; // can be null + /** private constructor to force extended classes to use the parameterized constructor */ + private Endpoint() { + } + /** Creates a new instance of Endpoint + * @param role CONSUMER or PRVODER role. + * @param service service description from the su descriptor + * @param wsdl wsdl definition corresponding to this endpoint + * @param su service unit object which created this endpoint. + */ + protected Endpoint(Role role, SUDescriptor.Service service, Definition wsdl, ServiceUnit su) { + this.mService = service; + this.mRole = role; + this.mWsdlDef = wsdl; + this.mSU = su; + } + /** Creates a new instance of Endpoint without service unit. may be useful for static endpoints that + * are not part of the deployment + * @param role CONSUMER or PRVODER role. + * @param service service info from the su descriptor + * @param wsdl wsdl definition corresponding to this endpoint + */ + protected Endpoint(Role role, SUDescriptor.Service service, Definition wsdl) { + this(role, service, wsdl, null); + } + /** + * should be called to initialize any resources related to this endpoint object + * throws JBIException + */ + public abstract void init() throws JBIException; + /** + * activates the endpoint to send/receive messages + * throws JBIException + */ + public abstract void activate() throws JBIException; + /** + * deactivates the endpoint + * throws JBIException + */ + public abstract void deactivate() throws JBIException; + /** + * clean endpoint + * throws JBIException + */ + public abstract void clean() throws JBIException; + + public final Role getRole() { + return this.mRole; + } + public final boolean isProvider() { + return (Role.PROVIDER.equals(this.getRole())); + } + public final boolean isConsumer() { + return (Role.CONSUMER.equals(this.getRole())); + } + public final Definition getWSDL() { + return this.mWsdlDef; + } + public final SUDescriptor.Service getService() { + return this.mService; + } + public final ServiceEndpoint getServiceEndpoint() { + return this.mServiceEndpoint; + } + protected final void setServiceEndpoint(ServiceEndpoint svcEP) { + this.mServiceEndpoint = svcEP; + } + public final ServiceUnit getServiceUnit() { + return this.mSU; + } + /** + * generates an ID that would uniquely identify this endpoint implementation. Use as a key to map + * any information to store that is related to this endpoint. + */ + public final String getID() { + StringBuffer strBuff = new StringBuffer(); + strBuff.append(this.mService.getInterface()).append("+"); + strBuff.append(this.mService.getServiceName()).append("+"); + strBuff.append(this.mService.getEndpointName()).append("+"); + String roleType = null; + if ( Role.CONSUMER.equals(this.mRole) ) { + roleType = "CONSUMER"; + } else if ( Role.PROVIDER.equals(this.mRole) ) { + roleType = "PROVIDER"; + } + strBuff.append(roleType); + return strBuff.toString(); + } + + @Override + public String toString() { + return "Endpoint : " + "${symbol_escape}n" + this.mService; + } + /** + * checks if this endpoint is configured for the binding component or service engine. + */ + public boolean isFor${componentName}() { + boolean isFor${componentName} = false; + if ( this.mSU != null ) { + try { + isFor${componentName} = this.mSU.getSUDescriptor().isFor${componentName}(); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + return isFor${componentName}; + } + + public QName getOperationQName(String opName) { + return new QName(this.getService().getInterface().getNamespaceURI(), opName); + } + + public Operation getWSDLOperation(QName opQName) { + String opName = null; + if ( opQName != null ) { + opName = opQName.getLocalPart(); + } + Operation operation = WSDLProcessor.findOperation(this.getWSDL(), + this.getService().getInterface(), opName); + return operation; + } + + public Binding getWSDLBinding() { + QName interfaceName = this.getService().getInterface(); + QName serviceName = this.getService().getServiceName(); + String endpointName = this.getService().getEndpointName(); + if ( serviceName != null ) { + return WSDLProcessor.findServiceBinding(this.getWSDL(), serviceName, endpointName); + } else { + return WSDLProcessor.findInterfaceBinding(this.getWSDL(), interfaceName, null); + } + } + /** @return logger */ + public Logger getLogger() { + return RuntimeHelper.getLogger(); + } + /** @return ComponentContext */ + public ComponentContext getComponentContext() { + return RuntimeHelper.getComponentContext(); + } + /** @return DeliveryChannel */ + public DeliveryChannel getDeliveryChannel() { + return RuntimeHelper.getDeliveryChannel(); + } + /** + * helper function to get the MessageExchangeSupport object + */ + public MessageExchangeSupport getMessageExchangeSupport() { + return RuntimeHelper.getMessageExchangeSupport(); + } + + public MessageExchangeHandler createMessageExchangeHandler() { + return null; + } + /** + * creates the message exchange listener. Extended classes should return + * MessageExchangeListener implementation. + * @return MessageExchangeListener or null. + * + */ + protected MessageExchangeListener createMessageExchangeListener() { + return null; + } + /** + * Creates and adds message exchange listener to receive message exchange received notification. + */ + protected void addMessageExchangeListener() { + QName interfaceName = this.getService().getInterface(); + QName serviceName = this.getService().getServiceName(); + String endpointName = this.getService().getEndpointName(); + MessageExchangeListener meListener = createMessageExchangeListener(); + MessageExchangeSupport meListenerSupport = getMessageExchangeSupport(); + if ( meListenerSupport != null && meListener != null ) { + meListenerSupport.addMessageExchangeListener( + this.getRole(), interfaceName, serviceName, endpointName, meListener); + if ( serviceName != null ) { + meListenerSupport.addMessageExchangeListener( + this.getRole(), null, serviceName, endpointName, meListener); + } + } + } + /** + * Removes message exchange listener from the MessageExchangeSupport. + */ + protected void removeMessageExchangeListener() { + QName interfaceName = this.getService().getInterface(); + QName serviceName = this.getService().getServiceName(); + String endpointName = this.getService().getEndpointName(); + MessageExchangeSupport meListenerSupport = getMessageExchangeSupport(); + if ( meListenerSupport != null ) { + meListenerSupport.removeMessageExchangeListener( + this.getRole(), interfaceName, serviceName, endpointName); + if ( serviceName != null ) { + meListenerSupport.removeMessageExchangeListener( + this.getRole(), null, serviceName, endpointName); + } + } + } + + public final boolean processMessageExchangeWithHandler(ExchangeStatus status, MessageExchange me) { + + //1. lookup handler + //2. if not there create one and register + //3. call process message exchange on it + //4. check status. if that is the end, remove the handler + + MessageExchangeSupport support = this.getMessageExchangeSupport(); + if ( support == null ) { + getLogger().fine("No MessageExchangeSupport present"); + return false; + } + MessageExchangeHandler handler = support.findMessageExchangeHandler(me); + if ( handler == null ) { + handler = this.createMessageExchangeHandler(); + if ( handler == null ) { + getLogger().fine("MessageExchangeHandler not supported"); + return false; + } + support.addMessageExchangeHandler(me, handler); + } + + handler.processMessageExchange(status, me); + + getLogger().fine("XXX MX Handler processed ME with STATUS: " + status); + + if (!ExchangeStatus.ACTIVE.equals(status) ) { + // DONE or ERROR means done with the me. + getLogger().fine("End of ME processing. STATUS: " + status + + ". Removing the MX Handler ..."); + support.removeMessageExchangeHandler(me); + } + + return true; + } + +} + diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/deployment/ProviderEndpoint.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/deployment/ProviderEndpoint.java new file mode 100644 index 000000000..63a17e906 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/deployment/ProviderEndpoint.java @@ -0,0 +1,107 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * ProviderEndpoint.java + * + */ + +package net.openesb.component.${componentName}.common.deployment; + +import net.openesb.component.${componentName}.common.deployment.SUDescriptor.Service; +import javax.jbi.JBIException; +import javax.jbi.messaging.MessageExchange.Role; +import javax.jbi.servicedesc.ServiceEndpoint; +import javax.wsdl.Definition; + +/** + * This class extends from Endpoint class and implements lifecycle methods functionality required for the + * endpoint for a service provider. {@link ServiceUnit${symbol_pound}createProviderEndpoint} creates the object of this + * type to implement the service provider functionality. It makes sure that this class or the extended + * classes will activate or deactivate the ServiceEndpoint corresponding to the service + * provided by the endpoint is performed during the activate and deactivate method calls as part of the + * endpoint lifecycle. + * + * @see ServiceUnit${symbol_pound}createProviderEndpoint + * @author chikkala + */ + +public class ProviderEndpoint extends Endpoint { + /** + * This constructor initializes the endpoint with PROVIDER role and makes sure that the service + * description passed to it is of provider description. + */ + protected ProviderEndpoint(SUDescriptor.Provides provides, Definition wsdlDef, ServiceUnit su) { + super(Role.PROVIDER, provides, wsdlDef, su); + } + /** + * constructor that does not need service unit information. useful for creating the endpoint for + * static services provided by the component. + */ + protected ProviderEndpoint(SUDescriptor.Provides provides, Definition wsdlDef) { + this(provides, wsdlDef, null); + } + /** + * initializes the endpoint and creates and registers the MessageExchangeListener with + * MessageExchangeSupport. + */ + public final void init() throws JBIException { + getLogger().fine("ProviderEndpiont: init called"); + doInit(); //1. initialize the endpiont resources + addMessageExchangeListener(); //2. register message exchange linster. + } + /** + * calls activatesServiceEndpoint for the Provider. + */ + public final void activate() throws JBIException { + getLogger().fine("ProviderEndpiont: activate called"); + activateServiceEndpoint(); //1. activate service endpoint in NMR + doActivate(); //2. do any other activation related tasks. + } + /** + * calls deactivateServiceEndpoint for the Provider. + */ + public final void deactivate() throws JBIException { + getLogger().fine("ProviderEndpiont: deactivate called"); + deactivateServiceEndpoint(); //1. deactivates the service endpoint in NMR + doDeactivate(); //2. do any other deactivation related tasks. + } + /** + * removes the message exchange listener. cleans up other resources + */ + public final void clean() throws JBIException { + getLogger().fine("ProviderEndpiont: clean called"); + removeMessageExchangeListener(); //1. remove message exchange listener + doClean(); //2. clean up any other resources. + } + /** + * Activates the ServiceEndpoint with NMR + */ + private void activateServiceEndpoint() throws JBIException { + Service service = this.getService(); + ServiceEndpoint svcEP = this.getComponentContext().activateEndpoint( + service.getServiceName(), service.getEndpointName()); + this.setServiceEndpoint(svcEP); + } + /** + * Deactivates ServiceEndpoint in NMR + */ + private void deactivateServiceEndpoint() throws JBIException { + this.getComponentContext().deactivateEndpoint(this.getServiceEndpoint()); + this.setServiceEndpoint(null); + } + + protected void doInit() throws JBIException { + //NOOP + } + protected void doActivate() throws JBIException { + //NOOP + } + protected void doDeactivate() throws JBIException { + //NOOP + } + protected void doClean() throws JBIException { + //NOOP + } + +} \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/deployment/SUDescriptor.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/deployment/SUDescriptor.java new file mode 100644 index 000000000..da9edda8a --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/deployment/SUDescriptor.java @@ -0,0 +1,364 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * SUDescriptor.java + */ + +package net.openesb.component.${componentName}.common.deployment; + +import net.openesb.component.${componentName}.common.RuntimeHelper; +import java.io.FileReader; +import java.io.IOException; +import java.io.Reader; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import javax.jbi.management.DeploymentException; +import javax.xml.namespace.QName; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; + +/** + * This interface represent the service unit descriptor (jbi.xml) model. This will be used in + * ServiceUnit implementation to find the services provided and consumed by this service unit. + * {@link SUDescriptorFactory${symbol_pound}getSUDescriptor} method reads the jbi.xml in the service unit to + * to the implementation of this interface. + * + * @see SUDescriptorFactory + * @see Consumes + * @see Provides + * @see ServiceUnit + * + * @author chikkala + */ +public interface SUDescriptor { + + Collection getProvidedServices(); + + Collection getConsumedServices(); + + boolean isFor${componentName}(); + + /** + * base interface that models the service information described in the service unit descriptor for + * consumed services and provided services. + */ + public interface Service { + /** + * Getter for property interfaceQName. + * @return Value of property interfaceQName. + */ + QName getInterface(); + /** + * Getter for property serviceName. + * @return Value of property serviceName. + */ + QName getServiceName(); + /** + * Getter for property endpointName. + * @return Value of property endpointName. + */ + String getEndpointName(); + } + /** + * marker interface that represents the provided services in the service unit + */ + public interface Provides extends Service { + } + /** + * this interface represents the consumed service information in the su descriptor. + */ + public interface Consumes extends Service { + + public final static String STANDARD_LINK = "standard"; + public final static String SOFT_LINK = "soft"; + public final static String HARD_LINK = "hard"; + /** + * Getter for property linkType. + * @return Value of property linkType. + */ + String getLinkType(); + } + /** + * This is a factory class that can build the Service Unit Descriptor model from the jbi.xml + */ + public static class SUDescriptorFactory { + + protected final static String JBI_TAG_NAME = "services"; + protected final static String SERVICES_TAG_NAME = "services"; + protected final static String BC_TAG_NAME = "binding-component"; + protected final static String PROVIDES_TAG_NAME = "provides"; + protected final static String CONSUMES_TAG_NAME = "consumes"; + protected final static String INTERFACE_TAG_NAME = "interface-name"; + protected final static String SERVICE_TAG_NAME = "service-name"; + protected final static String ENDPOINT_TAG_NAME = "endpoint-name"; + protected final static String LINK_TYPE_TAG_NAME = "link-type"; + /** + * method that builds the Service unit descriptor model from the jbi.xml + */ + public static SUDescriptor getSUDescriptor(String jbiXmlPath) throws Exception { + FileReader reader = null; + try { + reader = new FileReader(jbiXmlPath); + SUDescriptor suDesc = getSUDescriptor(reader); + return suDesc; + } finally { + if ( reader != null ) { + try { + reader.close(); + } catch (IOException ex) { + // ignore + } + } + } + } + /** + * method that builds the Service unit descriptor model from the jbi.xml + */ + public static SUDescriptor getSUDescriptor(Reader reader) throws Exception { + SUDescriptor suDescriptor = null; + Document suDescDoc = RuntimeHelper.buildDOMDocument(reader); + Element jbiEl = suDescDoc.getDocumentElement(); + if (JBI_TAG_NAME.equals(jbiEl.getTagName())) { + throw new DeploymentException("Invalid service unit descriptor : no jbi root element"); + } + + NodeList servicesNL = jbiEl.getElementsByTagName(SERVICES_TAG_NAME); + if (servicesNL != null && servicesNL.getLength() == 1) { + Element servicesEl = (Element) servicesNL.item(0); + suDescriptor = SUDescriptorImpl.createSUDescriptor(servicesEl); + } else { + throw new DeploymentException("Invalid service unit descriptor : invalid services element"); + } + + return suDescriptor; + } + + } + /** + * This class implements SUDescriptor + */ + public static class SUDescriptorImpl implements SUDescriptor { + + private List mConsumedList; + private List mProvidedList; + private boolean mIsFor${componentName}; + + protected SUDescriptorImpl(boolean isFor${componentName}) { + this.mIsFor${componentName} = isFor${componentName}; + this.mConsumedList = new ArrayList(); + this.mProvidedList = new ArrayList(); + } + + protected void addProvidedService(Provides provides) { + this.mProvidedList.add(provides); + } + + protected void addConsumedService(Consumes consumes) { + this.mConsumedList.add(consumes); + } + + public Collection getProvidedServices() { + // return unmodifiable collection + return Collections.unmodifiableCollection(this.mProvidedList); + } + + public Collection getConsumedServices() { + // return unmodifiable collection + return Collections.unmodifiableCollection(this.mConsumedList); + } + + public boolean isFor${componentName}() { + return this.mIsFor${componentName}; + } + + protected static SUDescriptor createSUDescriptor(Element servicesEl) throws Exception { + boolean isForBC = false; + String bcTagString = servicesEl.getAttribute(SUDescriptorFactory.BC_TAG_NAME); + isForBC = Boolean.valueOf(bcTagString).booleanValue(); + SUDescriptorImpl suDesc = new SUDescriptorImpl(isForBC); + // add consumes + NodeList consumesNL = servicesEl.getElementsByTagName(SUDescriptorFactory.CONSUMES_TAG_NAME); + for ( int i=0; i < consumesNL.getLength(); ++i) { + Element consumesEl = (Element) consumesNL.item(i); + Consumes consumes = ConsumedService.createConsumedService(consumesEl); + suDesc.addConsumedService(consumes); + } + // add provides + NodeList providesNL = servicesEl.getElementsByTagName(SUDescriptorFactory.PROVIDES_TAG_NAME); + for ( int i=0; i < providesNL.getLength(); ++i) { + Element providesEl = (Element) providesNL.item(i); + Provides provides = ProvidedService.createProvidedService(providesEl); + suDesc.addProvidedService(provides); + } + + return suDesc; + } + } + /** + * Base class that implements the Service interface + */ + public static abstract class AbstractService implements Service { + + private QName mInterface; + private QName mServiceName; + private String mEndpointName; + + private AbstractService() { + } + /** + * Getter for property interfaceQName. + * @return Value of property interfaceQName. + */ + public QName getInterface() { + return this.mInterface; + } + + /** + * Setter for property interfaceQName. + * @param interfaceQName New value of property interfaceQName. + */ + protected void setInterface(QName interfaceQName) { + this.mInterface = interfaceQName; + } + + /** + * Getter for property serviceName. + * @return Value of property serviceName. + */ + public QName getServiceName() { + return this.mServiceName; + } + + /** + * Setter for property serviceName. + * @param serviceName New value of property serviceName. + */ + protected void setServiceName(QName serviceName) { + this.mServiceName = serviceName; + } + + /** + * Getter for property endpointName. + * @return Value of property endpointName. + */ + public String getEndpointName() { + return this.mEndpointName; + } + + /** + * Setter for property endpointName. + * @param endpointName New value of property endpointName. + */ + protected void setEndpointName(String endpointName) { + this.mEndpointName = endpointName; + } + + } + /** + * This class implements the Provides interface + */ + public static class ProvidedService + extends AbstractService + implements Provides { + protected ProvidedService(QName interfaceQName, QName serviceName, String endpointName) { + this.setInterface(interfaceQName); + this.setServiceName(serviceName); + this.setEndpointName(endpointName); + } + + @Override + public String toString() { + return "Provides :" + + "${symbol_escape}n${symbol_escape}t interface-name= " + getInterface() + + "${symbol_escape}n${symbol_escape}t service-name= " + getServiceName() + + "${symbol_escape}n${symbol_escape}t endpont-name= " + getEndpointName(); + } + + protected static Provides createProvidedService(Element providesEl) throws Exception { + + String ifName = providesEl.getAttribute(SUDescriptorFactory.INTERFACE_TAG_NAME); + String serviceName = providesEl.getAttribute(SUDescriptorFactory.SERVICE_TAG_NAME); + String endpointName = providesEl.getAttribute(SUDescriptorFactory.ENDPOINT_TAG_NAME); + if ( ifName == null || serviceName == null || endpointName == null ) { + throw new Exception("Invalid provides element: missing " + SUDescriptorFactory.INTERFACE_TAG_NAME + + " or " + SUDescriptorFactory.SERVICE_TAG_NAME + " or " + SUDescriptorFactory.ENDPOINT_TAG_NAME ); + } + QName ifQName = RuntimeHelper.resolveAttrQName(ifName, providesEl); + QName serviceQName = RuntimeHelper.resolveAttrQName(serviceName, providesEl); + + return new ProvidedService(ifQName, serviceQName, endpointName); + } + } + /** + * This class implements the Consumes interface. + */ + public static class ConsumedService + extends AbstractService + implements Consumes { + private String mLinkType; + protected ConsumedService(QName interfaceQName, + QName serviceName, String endpointName, String linkType) { + this.setInterface(interfaceQName); + this.setServiceName(serviceName); + this.setEndpointName(endpointName); + this.mLinkType = linkType; + } + + /** + * Getter for property linkType. + * @return Value of property linkType. + */ + public String getLinkType() { + return this.mLinkType; + } + + @Override + public String toString() { + return "Cosumes :" + + "${symbol_escape}n${symbol_escape}t interface-name= " + getInterface() + + "${symbol_escape}n${symbol_escape}t service-name= " + getServiceName() + + "${symbol_escape}n${symbol_escape}t endpont-name= " + getEndpointName() + + "${symbol_escape}n${symbol_escape}t link-type= " + getLinkType(); + } + + protected static Consumes createConsumedService(Element consumesEl) throws Exception { + + String ifName = consumesEl.getAttribute(SUDescriptorFactory.INTERFACE_TAG_NAME); + String serviceName = consumesEl.getAttribute(SUDescriptorFactory.SERVICE_TAG_NAME); + String endpointName = consumesEl.getAttribute(SUDescriptorFactory.ENDPOINT_TAG_NAME); + String linkType = consumesEl.getAttribute(SUDescriptorFactory.LINK_TYPE_TAG_NAME); + if ( linkType == null || linkType.trim().length() == 0 ) { + linkType = STANDARD_LINK; + } + + if ( ifName == null ) { + throw new Exception("Invalid consumes element: missing " + + SUDescriptorFactory.INTERFACE_TAG_NAME ); + } + if ( serviceName == null || endpointName == null ) { + throw new Exception("Invalid consumes element: missing " + + SUDescriptorFactory.SERVICE_TAG_NAME + " or " + + SUDescriptorFactory.ENDPOINT_TAG_NAME ); + } + + QName ifQName = RuntimeHelper.resolveAttrQName(ifName, consumesEl); + QName serviceQName = null; + if ( serviceName != null ) { + serviceQName = RuntimeHelper.resolveAttrQName(serviceName, consumesEl); + } + if ( serviceQName != null && endpointName != null && linkType != null ) { + if (!(STANDARD_LINK.equals(linkType) || + SOFT_LINK.equals(linkType) || HARD_LINK.equals(linkType)) ) { + throw new Exception("Invalid consumes attribute value" + + SUDescriptorFactory.LINK_TYPE_TAG_NAME + "=" + linkType); + } + } + return new ConsumedService(ifQName, serviceQName, endpointName, linkType); + } + } + +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/deployment/ServiceUnit.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/deployment/ServiceUnit.java new file mode 100644 index 000000000..5be35c8a3 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/deployment/ServiceUnit.java @@ -0,0 +1,464 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * ServiceUnit.java + * + */ + +package net.openesb.component.${componentName}.common.deployment; + +import net.openesb.component.${componentName}.common.RuntimeHelper; +import net.openesb.component.${componentName}.common.deployment.SUDescriptor.Consumes; +import net.openesb.component.${componentName}.common.deployment.SUDescriptor.Provides; +import net.openesb.component.${componentName}.common.deployment.SUDescriptor.Service; +import net.openesb.component.${componentName}.common.wsdl.WSDLProcessor; +import java.io.File; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.jbi.management.DeploymentException; +import javax.wsdl.Definition; +import javax.wsdl.WSDLException; + +/** + * This is an abstract class that implements the service unit functionality in the component which + * processes the service unit artifacts and implement the actual service unit lifecycle functionality. + * The AbstractServiceUnitManager and its extended classes that implement the ServiceUnitManager + * functionality creates and maintains the reference to the concrete implementation of this class to + * invoke the functionality implemented by this class and its concrete implementation during the + * execution of the ServiceUnitMangers lifecycle methods by the jbi runtime. + *

+ * The main lifecycle methods of this class that will be called by the ServiceUnitManger implementation + * during the service unit deployment lifecycle are {@link ${symbol_pound}doload}, {@link ${symbol_pound}doDeploy}, {@link ${symbol_pound}doUndeploy}, + * {@link ${symbol_pound}doInit}, {@link ${symbol_pound}doStart}, {@link ${symbol_pound}doStop} and {@link ${symbol_pound}doShutdown} + *

+ * Service unit processing supported by this implementation is based on wsdl 1.1 deployments where the + * services provided and consumed in this service unit are described using wsdl 1.1 definitions. + *

+ * The main service unit artifacts that will be processed during deployment lifecycle of the service + * unit are 1.Service unit descriptor(jbi.xml) that describes the services provided and consumed by + * this service unit. 2.WSDL 1.1 document that describes the service definition 3.Component specific + * configurations related to services provided and consumed by this service unit. + *

+ * When the service unit is for Binding Component, the component specific configurations are read + * from the WSDL1.1 extensions defined in the WSDL document corresponding to the service provider + * or consumer deployed with this service unit. + *

+ * When the service unit is for Service Engine, the component specific configurations are read + * from the deployment artifacts such as xslt files and mapping files in the service unit zip file + * along with the WSDL document corresponding to the service provider or consumer deployed with this + * service unit. + * + * @see SUDescriptor + * @see Endpoint + * @see ProviderEndpoint + * @see ConsumerEndpoint + * @see WSDLProcessor + * @author chikkala + */ +public abstract class ServiceUnit { + /** Service Unit Name */ + private String mSUName; + /** Service Unit Root path passed by jbi runtime */ + private String mSURootPath; + /** service unit descriptor model unmarshalled from service unit jbi.xml */ + private SUDescriptor mSUDescriptor; + /** Map of Endpoint Key to ProviderEndpoint configurations in this service unit */ + private Map mProviderEndpointMap; + /** Map of Endpoint Key to ConsumerEndpoint configurations in this service unit */ + private Map mConsumerEndpointMap; + /** Map of Service Key to the WSDL Definition in this service unit */ + private Map mWSDLMap; + /** WSDLProcessor configured for this service unit to process wsdls in the service unit */ + private WSDLProcessor mWSDLProcessor; + /** + * + * @param suName + * @param suRootPath + */ + protected ServiceUnit(String suName, String suRootPath) { + this.mSUName = suName; + this.mSURootPath = suRootPath; + this.mSUDescriptor = null; + this.mWSDLMap = new HashMap(); + this.mProviderEndpointMap = new HashMap(); + this.mConsumerEndpointMap = new HashMap(); + } + /** returns service unit name + * @return service unit name + */ + public String getName() { + return this.mSUName; + } + /** returns service unit root path where the su artifacts are unzipped by the jbi runtime + * @return path to the service unit root directory. + */ + public String getSURootPath() { + return this.mSURootPath; + } + protected SUDescriptor createSUDescriptor() throws Exception { + File jbiXmlFile = new File(this.getSURootPath(), "META-INF/jbi.xml"); + String jbiXmlPath = jbiXmlFile.getAbsolutePath(); + return SUDescriptor.SUDescriptorFactory.getSUDescriptor(jbiXmlPath); + } + /** return the Service unit descriptor model that was read from the jbi.xml + * @return SUDescriptor + */ + public SUDescriptor getSUDescriptor() throws Exception { + if ( this.mSUDescriptor == null ) { + this.mSUDescriptor = createSUDescriptor(); + } + return this.mSUDescriptor; + } + public ProviderEndpoint getProviderEndpoint(String providerID) { + return this.mProviderEndpointMap.get(providerID); + } + public Collection getProviderEndpoints() { + return Collections.unmodifiableCollection(this.mProviderEndpointMap.values()); + } + public ConsumerEndpoint getConsumerEndpoint(String cosumerID) { + return this.mConsumerEndpointMap.get(cosumerID); + } + + public Collection getConsumerEndpoints() { + return Collections.unmodifiableCollection(this.mConsumerEndpointMap.values()); + } + /** + * @return Logger + */ + protected Logger getLogger() { + return RuntimeHelper.getLogger(); + } + /** + * extended classes implement this method to create the su specific WSDLProcessor. for examples, + * a su supporting binding component may have wsdl extensions that it want to registry for reading + * the configurations from the wsdl file. + * @return WSDLProcessor + * @see com.sun.jbi.sample.component.common.wsdl.WSDLProcessor + * @see com.sun.jbi.sample.component.common.wsdl.AbstractExtensionRegistry + */ + protected WSDLProcessor createWSDLProcessor() { + return new WSDLProcessor(this.getSURootPath()); + } + /** + * return the WSDLProcessor reference by creates if it is not yet created. + * @return WSDLProcessor. + */ + public final WSDLProcessor getWSDLProcessor() { + if ( this.mWSDLProcessor == null ) { + this.mWSDLProcessor = createWSDLProcessor(); + } + return this.mWSDLProcessor; + } + /** + * loads the service unit artifacts into the SU model. AbstractServiceUnitManager implementation + * calls this method during the during deploy and init lifecycle methods when the service unit + * object is newly created. + */ + public void doLoad() throws DeploymentException { + try { + SUDescriptor suDesc = getSUDescriptor(); // load jbi.xml + loadServiceDefinitions(); // check if the wsdls are valid for corresponding services. + loadOtherArtifacts(); // additional validations specific to component deployment features. + loadEndpoints(); // create endpoints + } catch ( DeploymentException jbiEx) { + throw jbiEx; + } catch (Exception ex) { + throw new DeploymentException(ex); + } + } + /** extended classes implement this method to perform the su specific deployment related tasks in + * this method implementation. + * @throws DeploymentException on error. + */ + public void doDeploy() throws DeploymentException { + // NOOP. doLoad has done it all. + this.getLogger().fine("ServiceUnit.doDeploy"); + } + /** extended classes implement this method to perform the su specific undeployment related tasks in + * this method implementation. + * @throws DeploymentException on error. + */ + public void doUndeploy() throws DeploymentException { + //NOOP + this.getLogger().fine("ServiceUnit.doUndeploy"); + } + /** extended classes implement this method to perform the su specific initialization tasks in + * this method implementation. + * @throws DeploymentException on error. + */ + public void doInit() throws DeploymentException { + this.getLogger().fine("ServiceUnit.doInit"); + this.doInitEndpoints(); + } + /** extended classes implement this method to perform the su specific tasks on start in + * this method implementation. + * @throws DeploymentException on error. + */ + public void doStart() throws DeploymentException { + this.getLogger().fine("ServiceUnit.doStart"); + this.doActivateEndpoints(); + } + /** extended classes implement this method to perform the su specific tasks on stop in + * this method implementation. + * @throws DeploymentException on error. + */ + public void doStop() throws DeploymentException { + this.getLogger().fine("ServiceUnit.doStop"); + this.doDeactivateEndpoints(); + } + /** extended classes implement this method to perform the su specific tasks on shutdown in + * this method implementation. + * @throws DeploymentException on error. + */ + public void doShutdown() throws DeploymentException { + this.getLogger().fine("ServiceUnit.doShutdown"); + this.doCleanEndpoints(); + } + /** + * create the ProviderEndpoint that implement the service provider implementation specific to this su. + * @return ProviderEndpoint or null if the SU does not support the service provider access + */ + protected ProviderEndpoint createProviderEndpoint(Provides provides, Definition wsdlDef) { + return null; + } + /** + * create the ProviderEndpoint that implement the service consumer implementation specific to this su. + * @return ConsumerEndpoint or null if the SU does not support the service consumer access + */ + protected ConsumerEndpoint createConsumerEndpoint(Consumes consumes, Definition wsdlDef) { + return null; + } + /** + * generates the key based on the service to store the wsdl definitions . + */ + protected String getServiceKey(Service service) { + StringBuffer strBuff = new StringBuffer(); + strBuff.append(service.getInterface()).append("+"); + strBuff.append(service.getServiceName()).append("+"); + strBuff.append(service.getEndpointName()); + return strBuff.toString(); + } + /** + * looks up the wsdl definition loaded for this service. + */ + protected Definition findWSDLFor(Service service) throws WSDLException { + Definition wsdlDef = null; + String key = this.getServiceKey(service); + wsdlDef = this.mWSDLMap.get(key); + return wsdlDef; + } + + protected Definition findWSDL(List wsdlList, Service service, boolean ignoreEndpointLookup) { + Definition foundDef = null; + for ( Definition def : wsdlList ) { + if ( WSDLProcessor.isWSDLFor(def, service.getInterface(), service.getServiceName(), + ((ignoreEndpointLookup) ? null : service.getEndpointName()) ) ) { + foundDef = def; + break; + } + } + return foundDef; + } + /** + * loads the WSDL definitions corresponds to the service providers and consumers defined in the + * service unit descriptor. + */ + protected void loadServiceDefinitions() throws Exception { + + this.mWSDLMap = new HashMap(); + + WSDLProcessor wsdlProcessor = getWSDLProcessor(); + List wsdlList = wsdlProcessor.readWSDLs(this.getSURootPath()); + this.getLogger().fine("Number of wsdl definitions in service unit " + wsdlList.size()); + + List services = new ArrayList(); + services.addAll(this.getSUDescriptor().getProvidedServices()); + services.addAll(this.getSUDescriptor().getConsumedServices()); + + boolean isForBinding = this.getSUDescriptor().isFor${componentName}(); + this.getLogger().fine("Is this service unit for Binding? " + isForBinding); + + for ( Service service : services ) { + this.getLogger().fine("Looking up WSDL for service " + service); + boolean ignoreEndpointLookup = false; + boolean providerAtEngine = false; + if ( !isForBinding && service instanceof Provides ) { + ignoreEndpointLookup = true; + providerAtEngine = true; + } + Definition def = findWSDL(wsdlList, service, ignoreEndpointLookup); + if ( def == null ) { + throw new Exception("WSDL Definition not found for " + service); + } + this.mWSDLMap.put(getServiceKey(service), def); + if ( providerAtEngine ) { + // provider at engine. so add engine binding and endpoint to the wsdl + wsdlProcessor.createServiceEngineBinding(def, + service.getInterface(), service.getServiceName(), service.getEndpointName()); + } + } + } + /** extended classes implement this method to perform the su specific artifacts validation in + * this method implementation. + * @throws DeploymentException on error. + */ + protected void loadOtherArtifacts() throws DeploymentException { + // nothing to validate further. + this.getLogger().fine("ServiceUnit.loadOtherArtifacts"); + } + /** + * creates ProviderEndpoint and ConsumerEndpoint objects corresponding to the service providers + * and consumers described in the su descriptor ( jbi.xml ) + */ + protected void loadEndpoints() throws Exception { + + this.mProviderEndpointMap = new HashMap(); + this.mConsumerEndpointMap = new HashMap(); + + Collection providesList = this.getSUDescriptor().getProvidedServices(); + for ( Provides provides : providesList ) { + Definition wsdlDef = findWSDLFor(provides); + if ( wsdlDef == null ) { + throw new DeploymentException("WSDL Definitions not found for " + provides); + } + ProviderEndpoint provider = createProviderEndpoint(provides, wsdlDef); + this.mProviderEndpointMap.put(provider.getID(), provider); + } + + Collection consumesList = this.getSUDescriptor().getConsumedServices(); + for ( Consumes consumes : consumesList ) { + Definition wsdlDef = findWSDLFor(consumes); + if ( wsdlDef == null ) { + throw new DeploymentException("WSDL Definitions not found for " + consumes); + } + ConsumerEndpoint consumer = createConsumerEndpoint(consumes, wsdlDef); + this.mConsumerEndpointMap.put(consumer.getID(), consumer); + } + } + /** + * initializes the Endpoint objects created corresponding to the consumer and providers defined + * in the su descriptor + */ + protected void doInitEndpoints() throws DeploymentException { + // init endpoints. if any initialization fails, rollback the already inited endpoints + List initedEndpoints = new ArrayList(); + List allEndpoints = new ArrayList(); + allEndpoints.addAll(this.getProviderEndpoints()); + allEndpoints.addAll(this.getConsumerEndpoints()); + + for ( Endpoint endpoint : allEndpoints ) { + try { + endpoint.init(); + initedEndpoints.add(endpoint); + } catch ( Exception initEx) { + doCleanEndpoints(initedEndpoints); + throw new DeploymentException(initEx); + } + } + + } + /** + * invokes activates method of all provider and consumer endpoint object in this su. if there is + * and error activating any one the endpoints, it deactivates the already activated ones and throws + * the error + */ + protected void doActivateEndpoints() throws DeploymentException { + // activate providers first and then consumers + List activatedEndpoints = new ArrayList(); + List allEndpoints = new ArrayList(); + allEndpoints.addAll(this.getProviderEndpoints()); + allEndpoints.addAll(this.getConsumerEndpoints()); + + for ( Endpoint endpoint : allEndpoints ) { + try { + endpoint.activate(); + activatedEndpoints.add(endpoint); + } catch ( Exception actEx) { + doDeactivateEndpoints(activatedEndpoints); + throw new DeploymentException(actEx); + } + } + } + /** + * invokes deactivate method on the list of Endpoint objects passed to this method + */ + protected void doDeactivateEndpoints(List endpoints) { + for ( Endpoint endpoint : endpoints ) { + try { + endpoint.deactivate(); + } catch(Exception ex) { + // ignore the exception and log it. + this.getLogger().log(Level.FINE, ex.getMessage(), ex); + } + } + } + /** + * invokes deactivate method on the all consumer and provider endpoint objects + */ + protected void doDeactivateEndpoints() { + // deactivate consumers first and then the providers + List allEndpoints = new ArrayList(); + allEndpoints.addAll(this.getConsumerEndpoints()); + allEndpoints.addAll(this.getProviderEndpoints()); + doDeactivateEndpoints(allEndpoints); + } + /** + * invokes clean method on the list of endpoint objects + */ + protected void doCleanEndpoints(List endpoints) { + for ( Endpoint endpoint : endpoints ) { + try { + endpoint.clean(); + } catch(Exception ex) { + // ignore the exception and log it. + this.getLogger().log(Level.FINE, ex.getMessage(), ex); + } + } + } + /** + * invokes clean method on the all consumer and provider endpoint objects in this su. + */ + protected void doCleanEndpoints() { + + List allEndpoints = new ArrayList(); + allEndpoints.addAll(this.getConsumerEndpoints()); + allEndpoints.addAll(this.getProviderEndpoints()); + doCleanEndpoints(allEndpoints); + } + /** + * prints the service unit description + */ + protected final String printDetails() { + + StringWriter writer = new StringWriter(); + PrintWriter out = new PrintWriter(writer); + + out.println("ServiceUnit Name : " + this.getName()); + out.println("ServiceUnit Root : " + this.getSURootPath()); + + SUDescriptor suDesc = null; + try { + suDesc = this.getSUDescriptor(); + for ( SUDescriptor.Consumes consumer : suDesc.getConsumedServices()) { + out.println(consumer); + } + for ( SUDescriptor.Provides provides : suDesc.getProvidedServices()) { + out.println(provides); + } + } catch (Exception ex) { + ex.printStackTrace(out); + } + return writer.getBuffer().toString(); + } + + +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/wsdl/AbstractExtensibilityElement.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/wsdl/AbstractExtensibilityElement.java new file mode 100644 index 000000000..7c4e85e5a --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/wsdl/AbstractExtensibilityElement.java @@ -0,0 +1,44 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * AbstractExtensibilityElement.java + */ + +package net.openesb.component.${componentName}.common.wsdl; + +import javax.wsdl.extensions.ExtensibilityElement; +import javax.xml.namespace.QName; + +/** + * This is an abstract class which can be extended to create jwsdl (wsdl4j's) extension elements model to + * read/write the wsdl extension elements in wsdl 1.1 xml. + * + * @author chikkala + */ +public abstract class AbstractExtensibilityElement implements ExtensibilityElement, java.io.Serializable { + public static final long serialVersionUID = 1; + private QName mElementType; + private Boolean mRequired; + + /** Creates a new instance of AbstractExtensibilityElement */ + protected AbstractExtensibilityElement() { + } + + public void setElementType(QName elementType) { + this.mElementType = elementType; + } + + public QName getElementType() { + return this.mElementType; + } + + public void setRequired(Boolean required) { + this.mRequired = required; + } + + public Boolean getRequired() { + return this.mRequired; + } + +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/wsdl/AbstractExtensionRegistry.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/wsdl/AbstractExtensionRegistry.java new file mode 100644 index 000000000..63d3c39c9 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/wsdl/AbstractExtensionRegistry.java @@ -0,0 +1,45 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * AbstractExtensionRegistry.java + */ + +package net.openesb.component.${componentName}.common.wsdl; + +import java.util.List; +import javax.wsdl.extensions.ExtensionRegistry; + +/** + * This is the abstract class used to add the wsdl extension serializers and deserializers to the + * wsdl extension registry configured to read/write wsdl extensions into a know java model. + * @see AbstractExtensionSerializer + * @see WSDLProcessor + * @author chikkala + */ +public abstract class AbstractExtensionRegistry extends ExtensionRegistry { + + /** Creates a new instance of AbstractSerializer + * it calls the createSerializers method to get the list of + * serializers and then call registerSerializer on each AbstractExtensionSerializer + * to register them with this registry. + * @see AbstractExtensionSerializer${symbol_pound}registerSerializer + */ + protected AbstractExtensionRegistry() { + super(); + List list = createSerializers(); + for (AbstractExtensionSerializer ser : list ) { + ser.registerSerializer(this); + } + // register ServiceEngine Binding serializers + AbstractExtensionSerializer seBindingSer = new SEBindingExt.SEBindingExtSerializer(); + seBindingSer.registerSerializer(this); + } + /** + * create wsdl extension serializers for each extension element to register with the extension + * registry. + * @return List of AbstractExtensionSerializer objects for serializing/deserializing the wsdl extensions. + * @see AbstractExtensionSerializer + */ + protected abstract List createSerializers(); +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/wsdl/AbstractExtensionSerializer.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/wsdl/AbstractExtensionSerializer.java new file mode 100644 index 000000000..2cd2512cd --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/wsdl/AbstractExtensionSerializer.java @@ -0,0 +1,123 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * AbstractExtensionSerializer.java + */ + +package net.openesb.component.${componentName}.common.wsdl; + +import java.io.PrintWriter; +import java.io.Serializable; +import java.util.Set; +import javax.wsdl.Definition; +import javax.wsdl.WSDLException; +import javax.wsdl.extensions.ExtensibilityElement; +import javax.wsdl.extensions.ExtensionDeserializer; +import javax.wsdl.extensions.ExtensionRegistry; +import javax.wsdl.extensions.ExtensionSerializer; +import javax.xml.namespace.QName; +import org.w3c.dom.Attr; +import org.w3c.dom.Element; + +/** + * This class is an abstract class that should be extended to implements extension serializer and + * deserializer. This class implements the code required for registering the serializer and deserializer + * implemented by this class. THe AbstractExtensionRegistry class calls the ${symbol_pound}registerSerializer method + * to register the concrete implementation of this class with extension registry. + * @see AbstractExtensionRegistry + * @author chikkala + */ +public abstract class AbstractExtensionSerializer + implements ExtensionSerializer, ExtensionDeserializer, Serializable { + + public static final long serialVersionUID = 1; + + private Class mParentType; + private Class mExtensionType; + private QName mElementType; + + /** Creates a new instance of AbstractSerializer */ + public AbstractExtensionSerializer(Class parentType, QName elementType, Class extensionType) { + this.mParentType = parentType; + this.mElementType = elementType; + this.mExtensionType = extensionType; + } + + public Class getParentType() { + return this.mParentType; + } + public QName getElementType() { + return this.mElementType; + } + public Class getExtensionType() { + return this.mExtensionType; + } + + public void registerSerializer(ExtensionRegistry extReg) { + extReg.registerSerializer(this.mParentType, this.mElementType, this); + extReg.registerDeserializer(this.mParentType, this.mElementType, this); + extReg.mapExtensionTypes(this.mParentType, this.mElementType, this.mExtensionType); + } + + public void marshall(Class parentType, QName elementType, ExtensibilityElement extension, + PrintWriter pw, Definition def, ExtensionRegistry extReg ) throws WSDLException { + // DO NOTHING. Binding component runtime does not need to serialize the wsdl extensions. + } + + public ExtensibilityElement unmarshall(Class parentType, QName elementType, Element el, + Definition def, ExtensionRegistry extReg) throws WSDLException { + return null; + } + + public static String getAttribute(Element el, String attrName) { + String attrValue = null; + Attr attr = el.getAttributeNode(attrName); + if ( attr != null ) { + attrValue = attr.getValue(); + } + return attrValue; + } + + protected String getNamespacePrefix(Definition def, String namespaceURI, String defPrefix) { + String prefix = null; + prefix = def.getPrefix(namespaceURI); + if ( prefix == null ) { + Set keySet = def.getNamespaces().keySet(); + String newPrefix = "ns"; + if ( defPrefix != null && defPrefix.trim().length() > 0 ){ + newPrefix = defPrefix; + } + prefix = newPrefix; + for ( int i=0; i < Integer.MAX_VALUE; ++i) { + if (!keySet.contains(prefix)) { + break; + } else { + prefix = newPrefix + i; + } + } + } + return prefix; + } + /** + * @return the name with the prefix defined for the namespaceURI in the wsdl definition. + * @throws WSDLException if the prefix not found in the wsdl definition. note that the + * default prefix is an empty string. + */ + protected String getQualifiedName(Definition def, + String namespaceURI, String localName) throws WSDLException { + String prefix = null; + if (namespaceURI != null && !namespaceURI.equals("")) { + prefix = def.getPrefix(namespaceURI); + if ( prefix == null ) { + throw new WSDLException(WSDLException.OTHER_ERROR, + "Can not find prefix in WSDL Definition for " + namespaceURI); + } + } + if ( prefix != null && !prefix.equals("")) { + return prefix + ":" + localName; + } else { + return localName; + } + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/wsdl/AbstractNormalizer.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/wsdl/AbstractNormalizer.java new file mode 100644 index 000000000..1eb2ab533 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/wsdl/AbstractNormalizer.java @@ -0,0 +1,229 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * AbstractNormalizer.java + */ + +package net.openesb.component.${componentName}.common.wsdl; + +import java.util.ArrayList; +import java.util.List; +import javax.jbi.messaging.MessagingException; +import javax.jbi.messaging.NormalizedMessage; +import javax.wsdl.Binding; +import javax.wsdl.Definition; +import javax.wsdl.Message; +import javax.wsdl.Operation; +import javax.wsdl.Part; +import javax.xml.namespace.QName; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.transform.dom.DOMSource; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +/** + * This is an abstract class that implements most of the functionality to normalize the binding protocol + * specific concrete message to jbi wrapper and and denormalize jbi wrapper to the concrete binding + * protocol specific message. + *

+ * The extended classes specific to particular binding protocol will be used when a jbi binding + * component is sending and receiving messages from the external service providers and consumers using + * a particular binding protocol known to this class. Extended implementation of this class should make + * use of the helper methods in this class in normalizing and denormalizing the messages. + * @see JMXBindingNormalizer + * @author chikkala + */ +public abstract class AbstractNormalizer { + + public static final String XMLNS_NS = "http://www.w3.org/2000/xmlns/"; + /** wsdl definition to use when normalizing and denormalizing */ + private Definition mWSDL; + /** Binding definition to use when normalizing and denormalizing */ + private Binding mBinding; + + private AbstractNormalizer() {} + /** Creates a new instance of JMXBCNormalizer */ + public AbstractNormalizer(Definition wsdl, Binding binding) { + this.mWSDL = wsdl; + this.mBinding = binding; + } + /** + * normalize the binding protocol specific concrete message to jbi wrapper. + * @param operation wsdl operation for which a concrete message should be normalized. + * @param normMsg NoramalizedMessage which will be configurate with normalized data from + * the concrete message + * @param msgSource concrete mssage of a particular binding protocol. + */ + public abstract void normalizeInput(Operation operation, NormalizedMessage normMsg, DOMSource msgSource) + throws MessagingException; + /** + * normalize the binding protocol specific concrete message to jbi wrapper. + * @param operation wsdl operation for which a concrete message should be normalized. + * @param normMsg NoramalizedMessage which will be configurate with normalized data from + * the concrete message + * @param msgSource concrete message of a particular binding protocol. + */ + public abstract void normalizeOutput(Operation operation, NormalizedMessage normMsg, DOMSource msgSource) + throws MessagingException; + /** + * normalize the binding protocol specific concrete message to jbi wrapper. + * @param operation wsdl operation for which a concrete message should be normalized. + * @param normMsg NoramalizedMessage which will be configurate with normalized data from + * the concrete message + * @param msgSource concrete message of a particular binding protocol. + */ + public abstract void normalizeFault(Operation operation, String faultName, NormalizedMessage normMsg, DOMSource msgSource) + throws MessagingException; + /** + * denormalize the normalized message into a concrete message for a particular binding protocol + * @param operation wsdl operation for which a concrete message should be de-normalized. + * @param normMsg NormalizedMessage which should be used to create de-normalized message. + */ + public abstract DOMSource denormalizeInput(Operation operation, NormalizedMessage normMsg) + throws MessagingException; + /** + * denormalize the normalized message into a concrete message for a particular binding protocol + * @param operation wsdl operation for which a concrete message should be denormalized. + * @param normMsg NormalizedMessage which should be used to create denormalized message. + */ + public abstract DOMSource denormalizeOutput(Operation operation, NormalizedMessage normMsg) + throws MessagingException; + + /** + * denormalized the normalized fault message into a concrete message for a particular binding protocol + * @param operation wsdl operation for which a concrete message should be denormalized. + * @param normMsg NormalizedMessage which should be used to create denormalized message. + */ + public abstract DOMSource denormalizeFault(Operation operation, String faultName, NormalizedMessage normMsg) + throws MessagingException; + /** + * @return the wsdl definition to use in normalizing and denormalizing the message + */ + protected Definition getWSDL() { + return this.mWSDL; + } + /** + * @return the wsdl binding definition to use in normalizing and denormalizing the message + */ + protected Binding getBinding() { + return this.mBinding; + } + /** + * create and add message parts to the jbiWrapper according to the abstract message model. This + * method assumes that the each element in the msgParts list passed to it is mapped to the part + * of the abstract wsdl message and uses the type or element attribute of the abstract message to + * determine whether the element is actual part element or a wrapped part type. + * Use this method in normalizing the concrete protocol specific message to jbi wrapper message. + * @param jbiWrapper object that holds the jbi wrapper information. + * @param wsdlMsg abstract message from the wsdl definition + * @param msgParts actual message parts from the concrete message + */ + protected void addMessagePartsToJBIWrapper(WSDL11JBIWrapper jbiWrapper, Message wsdlMsg, List msgParts) throws MessagingException { + List wsdlParts = wsdlMsg.getOrderedParts(null); + for ( int i=0; i < wsdlParts.size(); ++i ) { + Part wsdlPart = (Part) wsdlParts.get(i); + if ( i >= msgParts.size() ) { + throw new MessagingException("missing message content for part " + wsdlPart.getName()); + } + Element msgPart = msgParts.get(i); + if ( wsdlPart.getElementName() != null ) { + jbiWrapper.appendPart(msgPart); + } else { + // it is type. + // check the element name is same as part + if ( !wsdlPart.getName().equals(msgPart.getLocalName()) ) { + throw new MessagingException("mismatched message content for part " + wsdlPart.getName()); + } + if ( !wsdlMsg.getQName().getNamespaceURI().equals(msgPart.getNamespaceURI()) ) { + throw new MessagingException("mismatched message content namespace for part " + wsdlPart.getName()); + } + // check the content is text or element. + List partContent = getChildElements(msgPart); + if ( partContent.size() > 0 ) { + // add content as part elements + jbiWrapper.appendPart(partContent); + } else { + // add the content as text + jbiWrapper.appendPart(msgPart.getTextContent()); + } + } + } + } + /** + * extracts the message parts from the jbiWrapper according to the abstract wsdl message + * definition passed to it. Use this method in denormalizing the jbi wrapper message into the + * binding protocol specific concrete message. + * @param jbiWrapper jbi wrapper object that contains message parts and the message type information. + * @param wsdlMsg abstract wsdl message definition to use in constructing the part elements. + */ + protected List getMessagePartsFromJBIWrapper(WSDL11JBIWrapper jbiWrapper, Message wsdlMsg) + throws MessagingException, ParserConfigurationException { + + List msgParts = new ArrayList(); + int jbiPartCount = jbiWrapper.getPartCount(); + List wsdlParts = wsdlMsg.getOrderedParts(null); + QName msgType = jbiWrapper.getType(); + if (!wsdlMsg.getQName().getNamespaceURI().equals(msgType.getNamespaceURI())) { + throw new MessagingException("Namespace mismatch between jbi wrapper message type and wsdl message"); + } + Document newDoc = jbiWrapper.getDocumentBuilder().newDocument(); + for ( int i=0; i < wsdlParts.size(); ++i ) { + Part wsdlPart = (Part) wsdlParts.get(i); + if ( i >= jbiPartCount ) { + throw new MessagingException("missing message content for part " + wsdlPart.getName()); + } + if ( wsdlPart.getElementName() != null ) { + msgParts.add(jbiWrapper.getPartAsElement(i)); + } else { + // it is type. create a new element for a typed part + // check the element name is same as part + String prefix = msgType.getPrefix(); + String nsURI = msgType.getNamespaceURI(); + String localName = wsdlPart.getName(); + Element partEl = newDoc.createElementNS(nsURI, prefix + ":" + localName); + partEl.setAttributeNS(XMLNS_NS, "xmlns:"+prefix, nsURI); + NodeList partContent = jbiWrapper.getPart(i); + appendChildren(partEl, partContent, newDoc, true); + msgParts.add(partEl); + } + } + return msgParts; + } + /** + * utility method that can append the nodeList passed to it to the element children. + * @param el element node to which the nodeList should be appended + * @param doc the document object that should be used to import the nodeList + * @param importNode true if the nodeList should be imported while appending the nodeList to the + * element children. false if no import is necessary. + */ + protected void appendChildren(Element el, NodeList nodeList, Document doc, boolean importNode) { + + for ( int pIdx = 0; pIdx < nodeList.getLength(); ++pIdx) { + Node node = nodeList.item(pIdx); + if ( importNode ) { + node = doc.importNode(node, true); + } + el.appendChild(node); + } + } + /** + * @param el element from which to extract the child elements + * @return List list of child Element nodes. + */ + protected List getChildElements(Element el) { + List list = new ArrayList(); + NodeList nodeList = el.getChildNodes(); + for ( int i=0; i < nodeList.getLength(); ++i) { + Node node = nodeList.item(i); + if (!(node instanceof Element) ){ + continue; + } + list.add((Element)node); + } + return list; + } + +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/wsdl/SEBindingExt.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/wsdl/SEBindingExt.java new file mode 100644 index 000000000..550b3085a --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/wsdl/SEBindingExt.java @@ -0,0 +1,99 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * SEBindingExt.java + */ + +package net.openesb.component.${componentName}.common.wsdl; + +import java.io.PrintWriter; +import javax.wsdl.Binding; +import javax.wsdl.Definition; +import javax.wsdl.WSDLException; +import javax.wsdl.extensions.ExtensibilityElement; +import javax.wsdl.extensions.ExtensionRegistry; +import javax.xml.namespace.QName; +import org.w3c.dom.Element; + +/** + * This interface and its implementation classes implement wsdl 1.1 extension model for the + * jbi service engine binding that is defined in jsr 208(sec. 5.5.6.1). to read/write concrete binding + * element in the wsdl definition for the service endpoint binding provided by the service engine. + * The wsdl definition with this binding information can be used in providing the service provider + * metadata returned by the service engine in Component.getServiceDescription. + *

+ * AbstractExtensionRegistry by default include this extension serializers in the + * registry to read/write this service engine binding type in the wsdl definition. + *

+ * During a service unit deployment/initialization in the service engine, the deployed wsdl definition + * is loaded and modified to provide this binding for the service provided by the engine. + * + * @see WSDLProcessor${symbol_pound}createServiceEngineBinding + * @see AbstractExtensionRegistry + * @see com.sun.jbi.sample.component.common.deployment.ServiceUnit${symbol_pound}loadServiceDefinitions + * @author chikkala + */ +public interface SEBindingExt extends ExtensibilityElement, java.io.Serializable { + + public static final String NS_URI = "http://java.sun.com/xml/ns/jbi/binding/service+engine"; + public static final String NS_DEF_PREFIX = "jbise"; + /** Element names. */ + public static final String EL_BINDING_EXT = "binding"; + /**Qualified element names.*/ + public static final QName QN_BINDING_EXT = new QName(NS_URI, EL_BINDING_EXT); + + public static class SEBindingExtImpl extends AbstractExtensibilityElement implements SEBindingExt { + + public SEBindingExtImpl() { + setElementType(QN_BINDING_EXT); + } + @Override + public String toString() { + StringBuffer buff = new StringBuffer(); + buff.append("<"+NS_DEF_PREFIX+":"+EL_BINDING_EXT); + buff.append("/>"); + return buff.toString(); + } + /** + * creates and adds the jbi service engine binding extensibility element to the wsdl definition + * under specified binding definition. + */ + public static SEBindingExtImpl addExtensibilityElement(Definition wsdlDef, Binding binding) { + SEBindingExtImpl bindingExt = new SEBindingExt.SEBindingExtImpl(); + WSDLProcessor.addExtensibilityElement(wsdlDef, binding, bindingExt, SEBindingExt.NS_DEF_PREFIX); + return bindingExt; + } + } + /** + * serializer and descrializer implementation for the binding extension element. + */ + public static class SEBindingExtSerializer extends AbstractExtensionSerializer { + + public SEBindingExtSerializer() { + super(Binding.class, QN_BINDING_EXT, SEBindingExtImpl.class); + } + + @Override + public ExtensibilityElement unmarshall(Class parentType, QName elementType, Element el, + Definition def, ExtensionRegistry extReg) throws WSDLException { + SEBindingExt extObj = (SEBindingExt)extReg.createExtension(parentType, elementType); + return extObj; + } + + @Override + public void marshall(Class parentType, QName elementType, ExtensibilityElement extension, + PrintWriter pw, Definition def, ExtensionRegistry extReg ) throws WSDLException { + + String elName = getQualifiedName(def, NS_URI, EL_BINDING_EXT); + + SEBindingExt extObj = (SEBindingExt)extension; + + StringBuffer buff = new StringBuffer(); + buff.append("<" + elName ); + buff.append("/>"); + pw.println(buff.toString()); + } + } + +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/wsdl/WSDL11JBIWrapper.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/wsdl/WSDL11JBIWrapper.java new file mode 100644 index 000000000..20a09646b --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/wsdl/WSDL11JBIWrapper.java @@ -0,0 +1,471 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * WSDL11JBIWrapper.java + * + */ + +package net.openesb.component.${componentName}.common.wsdl; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import javax.wsdl.Fault; +import javax.wsdl.Input; +import javax.wsdl.Message; +import javax.wsdl.Operation; +import javax.wsdl.Output; +import javax.xml.namespace.QName; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.transform.dom.DOMSource; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.w3c.dom.Text; + +/** + * This class wraps the wsdl11 messages to the jbi wrapper message suitable for + * processing in the wsdl2.0 model of the normalized message in jbi as defined in jsr208 like + * + * + * + * + * + * + * + * + * + * + * @author chikkala + */ +public class WSDL11JBIWrapper { + + public static final String XMLNS_NS = "http://www.w3.org/2000/xmlns/"; + public static final String WRAPPER_NAMESPACE = "http://java.sun.com/xml/ns/jbi/wsdl-11-wrapper"; + public static final String DEF_NS_PREFIX = "jbiwrp"; + public static final String DEF_MESSAGE_NS_PREFIX = "msgns"; + public static final String JBI_MESSAGE_EL = "message"; + public static final String JBI_PART_EL = "part"; + public static final String VERSION_ATTR = "version"; + public static final String VERSION_ATTR_VALUE = "1.0"; + public static final String TYPE_ATTR = "type"; + public static final String NAME_ATTR = "name"; + + private static DocumentBuilder sDocBuilder = null; + /** qname of message attribute from wsdl:input, wsdl:output or wsdl:fault */ + private QName mType; + /** optional name attribute from wsdl:input, wsdl:output or wsdl:fault */ + private String mName; + /** each parts contents as node list */ + List mPartConentList = new ArrayList(); + + /** Creates a new instance of WSDL11JBIWrapper */ + public WSDL11JBIWrapper() { + } + /** creates the namespace aware document builder. extended classes can override this method + * to return the doc builder created else where. + */ + protected DocumentBuilder createDocumentBuilder() throws ParserConfigurationException { + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + factory.setNamespaceAware(true); + return factory.newDocumentBuilder(); + } + /** return the document builder + * @return DocumentBuilder + */ + public final DocumentBuilder getDocumentBuilder() throws ParserConfigurationException { + if ( WSDL11JBIWrapper.sDocBuilder == null ) { + WSDL11JBIWrapper.sDocBuilder = createDocumentBuilder(); + } + return WSDL11JBIWrapper.sDocBuilder; + } + /** + * @return type qname of message attribute from wsdl:input, wsdl:output or wsdl:fault + */ + public QName getType() { + return this.mType; + } + /** + * @param type qname of message attribute from wsdl:input, wsdl:output or wsdl:fault + */ + public void setType(QName type) { + this.mType = type; + } + /** @return name attribute from wsdl:input, wsdl:output or wsdl:fault. or null if not set. */ + public String getName() { + return this.mName; + } + /** + * @param name optional name attribute from wsdl:input, wsdl:output or wsdl:fault. can be null. + */ + public void setName(String name) { + this.mName = name; + } + /** + * appends part content as node list + */ + public void appendPart(NodeList partContent) { + this.mPartConentList.add(partContent); + } + /** + * append part content from the List of nodes + */ + public void appendPart(List partContent) { + this.mPartConentList.add(new NodeListImpl(partContent)); + } + /** + * append part content as element + */ + public void appendPart(Element partContent) { + this.mPartConentList.add(new NodeListImpl(partContent)); + } + /** + * append part content from DOMSource + */ + public void appendPart(DOMSource partContent) { + Element partConentEl = getElement(partContent.getNode()); + this.mPartConentList.add(new NodeListImpl(partConentEl)); + } + /** + * append part content as text node. + */ + public void appendPart(String partContent) { + Text textContent = null; + try { + textContent = this.getDocumentBuilder().newDocument().createTextNode(partContent); + } catch (ParserConfigurationException ex) { + ex.printStackTrace(); + } + if ( textContent != null ) { + this.mPartConentList.add(new NodeListImpl(textContent)); + } + } + /** + * append list of part contents each is a NodeList to the parts + */ + public void appendParts(List partContentList) { + this.mPartConentList.addAll(partContentList); + } + /** + * returned the ordered list of part contents. + */ + public List getParts() { + return Collections.unmodifiableList(this.mPartConentList); + } + /** + * return the number of parts + */ + public int getPartCount() { + return this.mPartConentList.size(); + } + /** + * return the part content at a particular index as NodeList. + */ + public NodeList getPart(int idx) { + return this.mPartConentList.get(idx); + } + /** + * return part context at a particular index as text + */ + public String getPartAsText(int idx) { + NodeList partNodes = getPart(idx); + Document doc; + try { + doc = this.getDocumentBuilder().newDocument(); + Element el = doc.createElementNS(WRAPPER_NAMESPACE, DEF_NS_PREFIX + ":" + JBI_PART_EL); + for ( int i=0; i < partNodes.getLength(); ++i) { + el.appendChild(partNodes.item(i)); + } + return el.getTextContent(); + } catch (ParserConfigurationException ex) { + return null; + } + } + /** + * return part context at a particular index as Element + */ + public Element getPartAsElement(int idx) { + Element contentEl = null; + NodeList partNodes = getPart(idx); + for ( int i=0; i < partNodes.getLength(); ++i) { + Node node = partNodes.item(i); + if ( node instanceof Element) { + contentEl = (Element)node; + break; + } + } + return contentEl; + } + /** + * creates Document from this wrapper object. Before calling this method, + * the type, name (optional) and parts contents should be set. + * @return Document containing the wsdl 11 wrapper xml + */ + public Document toDocument() throws ParserConfigurationException { + + Document wrapperDoc = getDocumentBuilder().newDocument(); + Element jbiMessage = wrapperDoc.createElementNS(WRAPPER_NAMESPACE, DEF_NS_PREFIX + ":" + JBI_MESSAGE_EL); + jbiMessage.setAttribute(VERSION_ATTR, VERSION_ATTR_VALUE); + wrapperDoc.appendChild(jbiMessage); + + QName type = this.getType(); + if ( type == null ) { + type = new QName("", "", DEF_MESSAGE_NS_PREFIX); + } + // set the jbiMessage attributes + String prefix = type.getPrefix(); + if (prefix == null || prefix.length() == 0) { + prefix = DEF_MESSAGE_NS_PREFIX; + } + jbiMessage.setAttribute(TYPE_ATTR, prefix + ":" + type.getLocalPart()); + jbiMessage.setAttributeNS( XMLNS_NS, "xmlns:" + prefix, type.getNamespaceURI()); + + String name = this.getName(); + if (name != null && name.trim().length() > 0 ) { + jbiMessage.setAttribute(NAME_ATTR, name); + } + + List partContentList = this.getParts(); + for ( NodeList nodeList : partContentList ) { + // set jbi part message + Element jbiPart = wrapperDoc.createElementNS(WRAPPER_NAMESPACE, DEF_NS_PREFIX + ":" + JBI_PART_EL); + jbiMessage.appendChild(jbiPart); + for ( int i =0; i < nodeList.getLength(); ++i ) { + Node importedMsgNode = wrapperDoc.importNode(nodeList.item(i), true); + jbiPart.appendChild(importedMsgNode); + } + } + + return wrapperDoc; + + } + /** + * creates DOMSource from this wrapper object. Before calling this method, + * the type, name (optional) and parts contents should be set. + * @return DOMSource containing the wsdl 11 wrapper xml + */ + public DOMSource toDOMSource() throws ParserConfigurationException { + DOMSource wrappedSource = new DOMSource(); + wrappedSource.setNode(toDocument()); + return wrappedSource; + } + /** + * return Element node from a document node or non document. Use to extract + * the message root element. + * @root node from which the Element node will be extracted. + * @return Element node. + */ + public static Element getElement(Node root) { + Element msgEl = null; + if ( root instanceof Document) { + msgEl = ((Document)root).getDocumentElement(); + } else if (root instanceof Element) { + msgEl = (Element)root; + } else { + NodeList nodeList = root.getChildNodes(); + for ( int i=0; i < nodeList.getLength(); ++i) { + Node node = nodeList.item(i); + if ( node instanceof Element ) { + msgEl = (Element) node; + break; + } + } + } + return msgEl; + } + /** + * creates wrapper object from the DOMSource that has wsdl 11 wrapper xml. + * @param wrappedMsg wsdl 11 wrapper xml as DOMSource + * @return WSDL11JBIWrapper representing the wrapper xml. + */ + public static WSDL11JBIWrapper sourceToWrapper(DOMSource wrappedMsg) { + Element jbiMessage = getElement(wrappedMsg.getNode()); + if ( jbiMessage == null ) { + return null; + } + String nsURI = jbiMessage.getNamespaceURI(); + String tagName = jbiMessage.getLocalName(); + if (!WRAPPER_NAMESPACE.equals(nsURI) || !JBI_MESSAGE_EL.equals(tagName)) { + return null; + } + String name = jbiMessage.getAttribute(NAME_ATTR); + String typeQN = jbiMessage.getAttribute(TYPE_ATTR); + String typePrefix = ""; + String typeName = ""; + if ( typeQN != null && typeQN.trim().length() > 0 ) { + int idx = typeQN.indexOf(':'); + if ( idx >= 0 ) { + typePrefix = typeQN.substring(0, idx); + if ( typeQN.length() > idx ) { + typeName = typeQN.substring(idx+1); + } + } else { + typePrefix = ""; + typeName = typeQN; + } + } + String typeURI = jbiMessage.getAttribute("xmlns:" + typePrefix); + QName typeQName = new QName(typeURI, typeName, typePrefix); + + WSDL11JBIWrapper wrapper = new WSDL11JBIWrapper(); + wrapper.setName(name); + wrapper.setType(typeQName); + NodeList jbiPartList = jbiMessage.getElementsByTagNameNS(WRAPPER_NAMESPACE, JBI_PART_EL); + for ( int i=0; i < jbiPartList.getLength(); ++i) { + Node jbiPart = jbiPartList.item(i); + wrapper.appendPart(jbiPart.getChildNodes()); + } + return wrapper; + } + /** + * creates the WSDL11JBIWrapper object and sets the type and name of the object + * @param type qname of message attribute from wsdl:input, wsdl:output or wsdl:fault + * @param name optional name attribute from wsdl:input, wsdl:output or wsdl:fault + * @return the jbi message wrapper object + */ + public static WSDL11JBIWrapper createWrapper(QName type, String name ) throws ParserConfigurationException { + WSDL11JBIWrapper wrapper = new WSDL11JBIWrapper(); + wrapper.setName(name); + wrapper.setType(type); + return wrapper; + } + /** + * creates the WSDL11JBIWrapper object. useful when the message has one part and the + * part content has multiple child element. + * @param type qname of message attribute from wsdl:input, wsdl:output or wsdl:fault + * @param name optional name attribute from wsdl:input, wsdl:output or wsdl:fault + * @param partContent part content as node list + * @return the jbi message wrapper object + */ + public static WSDL11JBIWrapper createWrapper(QName type, String name, NodeList partContent) throws ParserConfigurationException { + WSDL11JBIWrapper wrapper = createWrapper(type, name); + wrapper.appendPart(partContent); + return wrapper; + } + /** + * creates the WSDL11JBIWrapper object. useful when the message has one part and the + * part content is a single element + * @param type qname of message attribute from wsdl:input, wsdl:output or wsdl:fault + * @param name optional name attribute from wsdl:input, wsdl:output or wsdl:fault + * @param partContent part content as node list + * @return the jbi message wrapper object + */ + public static WSDL11JBIWrapper createWrapper(QName type, String name, Element msgEl) throws ParserConfigurationException { + WSDL11JBIWrapper wrapper = createWrapper(type, name, new WSDL11JBIWrapper.NodeListImpl(msgEl)); + return wrapper; + } + + public static WSDL11JBIWrapper createWrapper(QName type, String name, DOMSource inputSource) throws ParserConfigurationException { + WSDL11JBIWrapper wrapper = createWrapper(type, name); + Node msgNode = getElement(inputSource.getNode()); + NodeList nodeList = new WSDL11JBIWrapper.NodeListImpl(msgNode); + wrapper.appendPart(nodeList); + return wrapper; + } + /** + * creates the wrapped message using the wsdl4j operations input element for type and name. + * @param msg DOMSource for the unwrapped message + * @param operation wsdl4j operation object representing the operation of the PortType + * @return DOMSource wrapped message as DOMSource + */ + public static WSDL11JBIWrapper createInputWrapper(Operation operation) throws ParserConfigurationException { + QName type = null; + String name = null; + + Input input = operation.getInput(); + if ( input == null ) { + return null; + } + name = input.getName(); + Message wsdlMsg = input.getMessage(); + type = wsdlMsg.getQName(); + + WSDL11JBIWrapper wrapper = createWrapper(type, name); + return wrapper; + } + /** + * creates the wrapped message using the wsdl4j operations output element for type and name. + * @param msg DOMSource for the unwrapped message + * @param operation wsdl4j operation object representing the operation of the PortType + * @return DOMSource wrapped message as DOMSource + */ + public static WSDL11JBIWrapper createOutputWrapper(Operation operation) throws ParserConfigurationException { + QName type = null; + String name = null; + + Output output = operation.getOutput(); + if ( output == null) { + return null; + } + name = output.getName(); + Message wsdlMsg = output.getMessage(); + type = wsdlMsg.getQName(); + + WSDL11JBIWrapper wrapper = createWrapper(type, name); + return wrapper; + } + /** + * creates the wrapped message using the wsdl4j operations output element for type and name. + * @param msg DOMSource for the unwrapped message + * @param operation wsdl4j operation object representing the operation of the PortType + * @param faultName fault name, can be null to look for the fault with no name. + * @return DOMSource wrapped message as DOMSource + */ + public static WSDL11JBIWrapper createFaultWrapper(Operation operation, String faultName) throws ParserConfigurationException { + QName type = null; + String name = null; + @SuppressWarnings("unchecked") + Map faultMap = operation.getFaults(); + Fault fault = faultMap.get(faultName); + + if ( fault == null ) { + return null; + } + name = fault.getName(); + Message wsdlMsg = fault.getMessage(); + type = wsdlMsg.getQName(); + + WSDL11JBIWrapper wrapper = createWrapper(type, name); + return wrapper; + } + /** + * NodeList implementation. + */ + public static class NodeListImpl extends ArrayList implements NodeList { + + public NodeListImpl() { + super(); + } + + public NodeListImpl(Node aNode) { + super(); + if (aNode != null) { + this.add(aNode); + } + } + + public NodeListImpl(List nodes) { + if (nodes != null) { + this.addAll(nodes); + } + } + + public int getLength() { + return this.size(); + } + + public Node item(int idx) { + return this.get(idx); + } + + } + +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/wsdl/WSDLProcessor.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/wsdl/WSDLProcessor.java new file mode 100644 index 000000000..1ed9c058f --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/wsdl/WSDLProcessor.java @@ -0,0 +1,419 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * WSDLProcessor.java + */ + +package net.openesb.component.${componentName}.common.wsdl; + +import java.io.File; +import java.io.FileFilter; +import java.io.IOException; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Set; +import javax.wsdl.Binding; +import javax.wsdl.Definition; +import javax.wsdl.Operation; +import javax.wsdl.Port; +import javax.wsdl.PortType; +import javax.wsdl.Service; +import javax.wsdl.WSDLException; +import javax.wsdl.extensions.ElementExtensible; +import javax.wsdl.extensions.ExtensibilityElement; +import javax.wsdl.extensions.ExtensionRegistry; +import javax.wsdl.factory.WSDLFactory; +import javax.wsdl.xml.WSDLReader; +import javax.wsdl.xml.WSDLWriter; +import javax.xml.namespace.QName; + +/** + * This class is used to configure jwsdl(wsdl4j) to read and process wsdl documents with wsdl extensions. + * It provides set of helper methods to read and process the wsdl definitions from files with .wsdl + * extension from a specified directory. + *

+ * A Binding Component that is processing the wsdl extensions for its deployment configuration would + * extend this class and provide the required ExtensionRegistry that will have the extension serializers + * and deserializers configured to read/write the extensions from/to the java model. + *

+ * A Service Engine that is processing the wsdl during deployment can directly use this class + * to process the wsdl as the default implementation returned by this class configures the wsdl extension + * registry to read/write the service engine binding extensions. + * + * @see AbstractExtensionRegistry + * @see SEBindingExt + * @author chikkala + */ +public class WSDLProcessor { + + private String mXmlCatalogPath = "xml-catalog.xml"; + private String mWsdlDirPath = ""; + private WSDLReader mReader; + + /** Creates a new instance of WSDLProcessor + */ + public WSDLProcessor(String wsdlDir) { + this(wsdlDir, null); + } + /** Creates a new instance of WSDLProcessor + */ + public WSDLProcessor(String wsdlDir, String xmlCatPath) { + if ( wsdlDir != null ) { + this.mWsdlDirPath = wsdlDir; + } + if ( xmlCatPath != null ) { + this.mXmlCatalogPath = xmlCatPath; + } + } + /** @return directory path from which this class reads the wsdl files with .wsdl as file extension. */ + public String getWSDLDirectory() { + return this.mWsdlDirPath; + } + /** path to the xml catalog file in the service unit which can be used for Catalog-based entity + * and URI resolution. + */ + public String getXmlCatelogPath() { + return this.mXmlCatalogPath; + } + /** wsdl extension registry required for processing the wsdl extensions in the wsdl definition to + * java model. Binding component that is processing the wsdl extensions for its deployment + * configuration would provide the required ExtensionRegistry that will have the extension serializers + * and deserializers configured to read/write the extensions from/to the java model. + * @return ExtensionSerializer + * @see AbstractExtensionSerializer + */ + protected ExtensionRegistry getExtensionRegistry() { + return new AbstractExtensionRegistry() { + protected List createSerializers() { + return new ArrayList(); + } + }; + } + /** + * @return the WSDLReader configured with extension registry to process the wsdl extensions. + */ + public final WSDLReader getWSDLReader() throws WSDLException { + if ( this.mReader == null ) { + WSDLFactory factory = WSDLFactory.newInstance(); + this.mReader = factory.newWSDLReader(); + // reader.setFeature("javax.wsdl.verbose", true); + // reader.setFeature("javax.wsdl.importDocuments", true); + this.mReader.setExtensionRegistry(getExtensionRegistry()); + } + return this.mReader; + } + /** + * reads the wsdl file and returns the wsdl definition jwsdl model. + * @param wsldFilePath relative path to wsdl file from the the root wsdl directory returns from + * ${symbol_pound}getWSDLDirectory in the service unit or or absolute path . + * @return Definition + */ + public Definition readWSDL(String wsdlFilePath) throws WSDLException { + File wsdlFile = new File(wsdlFilePath); + if ( !wsdlFile.isAbsolute() ) { + wsdlFile = new File(this.mWsdlDirPath, wsdlFilePath); + } + return getWSDLReader().readWSDL(wsdlFile.getAbsolutePath()); + } + /** + * reads the files with .wsdl file extension in a directory. If the directory should + * be searched recursively, it searches this directory, all child directories of this + * directory and then to their child directories recursively. + * @param dir directory file to search for .wsdl files + * @param rec if set to true, it recursively searches the directory. if set to false, only + * this directory is searched. + * @return List of Files with .wsdl extension. + */ + public List listWSDLFiles(File dir, final boolean rec) throws IOException { + if ( dir == null || !dir.isDirectory()) { + throw new IOException(dir + " is not a directory for looking up wsdl files"); + } + List wsdlList = new ArrayList(); + File[] files = dir.listFiles(new FileFilter() { + public boolean accept(File pathname) { + if ( rec && pathname.isDirectory()) { + return true; + } else { + String name = pathname.getName(); + int idx = name.lastIndexOf('.'); + if ( idx < 0 ) { + return false; + } + String ext = name.substring(idx); + return ".wsdl".equalsIgnoreCase(ext); + } + } + }); + for ( File file : files ) { + if ( rec && file.isDirectory()) { + List wsdlFiles = listWSDLFiles(file, rec); + wsdlList.addAll(wsdlFiles); + } else { + wsdlList.add(file); + } + } + return wsdlList; + } + /** + * reads the files with .wsdl file extension in a directory fromDir and return the list of + * wsdl definitions corresponding to them. + * @param fromDir path to the directory relative to the root wsdl directory returns from + * ${symbol_pound}getWSDLDirectory or the absolute path to the directory. + */ + public List readWSDLs(String fromDir) throws WSDLException { + if ( fromDir == null ) { fromDir = ""; } + File wsdlDir = new File(fromDir); + if (!wsdlDir.isAbsolute()) { + wsdlDir = new File(this.mWsdlDirPath, fromDir); + } + + List wsdlFiles = new ArrayList(); + try { + wsdlFiles = listWSDLFiles(wsdlDir, true); + } catch (IOException ioEx) { + throw new WSDLException("WSDLFileReadError", ioEx.getMessage(),ioEx); + } + + List wsdlPaths = new ArrayList(); + for ( File wsdlFile : wsdlFiles) { + wsdlPaths.add(wsdlFile.getAbsolutePath()); + } + Collections.sort(wsdlPaths); + + List wsdlList = new ArrayList(); + for ( String wsdlPath : wsdlPaths ) { + Definition wsdlDef = readWSDL(wsdlPath); + wsdlList.add(wsdlDef); + } + return wsdlList; + } + /** + * finds PortType using port type ( interface ) qname. + */ + public static PortType findInterface(Definition wsdlDef, QName interfaceName) { + return wsdlDef.getPortType(interfaceName); + } + /** finds the Service using service qname */ + public static Service findService(Definition wsdlDef, QName serviceName) { + return wsdlDef.getService(serviceName); + } + /** finds the wsdl port using service qname and endpoint name */ + public static Port findServiceEndpoint(Definition wsdlDef, QName serviceName, String endpointName) { + Service service = null; + Port port = null; + service = findService(wsdlDef, serviceName); + if ( service != null ) { + port = service.getPort(endpointName); + } + return port; + } + /** + * finds the binding definition to which the service with serviceName and endpointName was bound. + */ + public static Binding findServiceBinding(Definition wsdlDef, QName serviceName, String endpointName) { + Binding binding = null; + Port port = findServiceEndpoint(wsdlDef, serviceName, endpointName); + if ( port != null ) { + binding = port.getBinding(); + } + return binding; + } + /** + * finds the binding definition using the interface(portType) qname with a + */ + public static Binding findInterfaceBinding(Definition wsdlDef, + QName interfaceQName, QName extQName) { + Map bindingMap = wsdlDef.getBindings(); + @SuppressWarnings("unchecked") + Collection bindings = bindingMap.values(); + for ( Binding binding : bindings ) { + if ( binding.getPortType().getQName().equals(interfaceQName)) { + return binding; + } + } + return null; + } + + /** + * find the wsdl4j operation corresponds to the interface+operation. + * @param wsdlDef wsdl definition + * @param portTypeQName portType QName + * @param opName operation name. if null, first operation in the portType + * is returned. + * @return Operation corresponding to the portType+opName + */ + public static Operation findOperation(Definition wsdlDef, + QName portTypeQName, String opName) { + Operation operation = null; + PortType portType = wsdlDef.getPortType(portTypeQName); + if ( portType != null ) { + if ( opName != null ) { + operation = portType.getOperation(opName, null, null); + } else { + @SuppressWarnings("unchecked") + List list = portType.getOperations(); + if ( list != null && list.size() > 0 ) { + operation = list.get(0); + } + } + } + return operation; + } + /** + * verifies whether the wsdl definition contains the specified service descriptions or not. Used + * to locate the wsdl definition for the services describes in service unit deployment + * descriptor(jbi.xm). + * @param interfaceName portType qname to find in the definition. can be null if you are trying to + * find only service endpoint description. + * @param serviceName qname for the service to find in this wsdl. can be null if + * you are trying to find only portType (abstract service) description. + * @param endpointName port name to find in the service definition. null if only + * service with any port should be looked up. + * + * @return true if the wsdl definition contains the specified service description. + */ + public static boolean isWSDLFor(Definition wsdlDef, + QName interfaceName, QName serviceName, String endpointName) { + PortType portType = null; + Service service = null; + Port port = null; + if ( interfaceName != null ) { + portType = findInterface(wsdlDef, interfaceName); + } + + if ( serviceName != null ) { + service = findService(wsdlDef, serviceName); + } + + if ( endpointName != null && service != null ) { + port = service.getPort(endpointName); + } + + boolean isWSDL = true; + + if ( (interfaceName != null && portType == null) || + ( serviceName != null && service == null ) || + ( endpointName != null && (service == null || port == null)) ) { + isWSDL = false; + } + + return isWSDL; + } + /** + * creates a binding definition that contains a service engine binding elements in the specified + * wsdl definition for a portType. It will try to find/create the binding element with interface + * local name with a "_JBISEBinding" suffix and add service engine binding element to it if it + * is not present. + * @param wsdl wsdl definition + * @param interfaceName portType qname to which the binding is created. + * @return a Binding contains service engine binding that is created for the portType. + */ + public Binding createServiceEngineBinding(Definition wsdl, QName interfaceName) { + QName bindingQName = new QName(wsdl.getQName().getNamespaceURI(), + interfaceName.getLocalPart() + "_JBISEBinding"); + Binding binding = wsdl.getBinding(bindingQName); + if ( binding == null ) { + binding = wsdl.createBinding(); + binding.setQName(bindingQName); + binding.setPortType(wsdl.getPortType(interfaceName)); + binding.setUndefined(false); + + ExtensibilityElement bindingExt = + SEBindingExt.SEBindingExtImpl.addExtensibilityElement(wsdl, binding); + + wsdl.addBinding(binding); + } + return binding; + } + /** + * creates port and binding elements that provide the the service engine binding for a service. + * @param wsdl wsdl definition + * @param interfaceName portType qname to which the binding is created. + * @param serviceName service under which the port definition bound to the service engine binding + * should be created. + * @param endpointName port name. + * @return a Binding contains service engine binding that is created for the portType. + */ + public Binding createServiceEngineBinding(Definition wsdl, QName interfaceName, QName serviceName, String endpointName ) { + Binding binding = null; + Service service = findService(wsdl, serviceName); + if ( service == null ) { + return null; + } + Port port = service.getPort(endpointName); + if ( port != null ) { + binding = port.getBinding(); + } else { + // create port + port = wsdl.createPort(); + port.setName(endpointName); + binding = createServiceEngineBinding(wsdl, interfaceName); + port.setBinding(binding); + service.addPort(port); + } + return binding; + } + /** prints the wsdl to text from the wsdl definition */ + public static void printWSDL(PrintWriter out, Definition def) { + try { + WSDLFactory factory = WSDLFactory.newInstance(); + WSDLWriter wsdlWriter = factory.newWSDLWriter(); + wsdlWriter.writeWSDL(def, out); + } catch (WSDLException ex) { + ex.printStackTrace(out); + } + } + /** prints the wsdl to text from the wsdl definition */ + public static String printWSDLToString(Definition def) { + StringWriter writer = new StringWriter(); + PrintWriter out = new PrintWriter(writer); + printWSDL(out, def); + out.close(); + return writer.getBuffer().toString(); + } + /** returns an existing namespace prefix or create one if not exists for the corresponding namespaceURI */ + public static String getNamespacePrefix(Definition def, String namespaceURI, String defPrefix) { + String prefix = null; + prefix = def.getPrefix(namespaceURI); + if ( prefix == null ) { + Set keySet = def.getNamespaces().keySet(); + String newPrefix = "ns"; + if ( defPrefix != null && defPrefix.trim().length() > 0 ){ + newPrefix = defPrefix; + } + prefix = newPrefix; + for ( int i=0; i < Integer.MAX_VALUE; ++i) { + if (!keySet.contains(prefix)) { + break; + } else { + prefix = newPrefix + i; + } + } + } + return prefix; + } + + /** + * creates and adds the jbi service engine binding extensibility element to the wsdl definition + * under specified binding definition. + */ + public static void addExtensibilityElement(Definition wsdlDef, + ElementExtensible extensibleEl, ExtensibilityElement extEl, String defPrefix) { + QName elementType = extEl.getElementType(); + String namespaceURI = elementType.getNamespaceURI(); + String prefix = wsdlDef.getPrefix(namespaceURI); + if ( prefix == null ) { + // no namespace prefix defined. create one. + prefix = WSDLProcessor.getNamespacePrefix(wsdlDef, namespaceURI, defPrefix); + wsdlDef.addNamespace(prefix, namespaceURI); + } + extensibleEl.addExtensibilityElement(extEl); + } + +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/wsdlext/BindingExt.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/wsdlext/BindingExt.java new file mode 100644 index 000000000..159238350 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/wsdlext/BindingExt.java @@ -0,0 +1,101 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * BindingExt.java + */ +package net.openesb.component.${componentName}.wsdlext; + +import net.openesb.component.${componentName}.common.wsdl.AbstractExtensibilityElement; +import net.openesb.component.${componentName}.common.wsdl.AbstractExtensionSerializer; +import net.openesb.component.${componentName}.common.wsdl.WSDLProcessor; +import java.io.PrintWriter; +import javax.wsdl.Binding; +import javax.wsdl.Definition; +import javax.wsdl.WSDLException; +import javax.wsdl.extensions.ExtensibilityElement; +import javax.wsdl.extensions.ExtensionRegistry; +import javax.xml.namespace.QName; +import org.w3c.dom.Element; + +/** + * This interface and its implementation represents the java model for binding + * extension element. The inner classes BindingExtImpl implements the interface + * and the BindingExtSerializer provides the serializer and deserializer + * implementation. The implementation and serializer classes will be registered + * with the ExtensionRegistry to process the binding extension element in the + * wsdl definition. + * + * @see com.sun.jbi.sample.component.common.wsdl.AbstractExtensibilityElement + * @see com.sun.jbi.sample.component.common.wsdl.AbstractExtensionSerializer + * @see com.sun.jbi.sample.component.common.wsdl.AbstractExtensionRegistry + * @author chikkala + */ +public interface BindingExt extends ExtConstants, ExtensibilityElement, java.io.Serializable { + //TODO: define get/set methods for properties for BindingExt if the extension element has attributes. + + /** + * This class is an implementation of BindingExt interface that provides + * java model for binding extensibility element. + */ + public static class BindingExtImpl extends AbstractExtensibilityElement implements BindingExt { + + public BindingExtImpl() { + setElementType(QN_BINDING_EXT); + } + + /** + * creates and adds the binding extensibility element to the wsdl + * definition + */ + public static BindingExtImpl addExtensibilityElement(Definition wsdlDef, Binding binding) { + BindingExtImpl bindingExt = new BindingExt.BindingExtImpl(); + WSDLProcessor.addExtensibilityElement(wsdlDef, binding, bindingExt, NS_DEF_PREFIX); + return bindingExt; + } + } + + /** + * This class provides the serializer and deserializer implementation for + * binding extensibility element. + */ + public static class BindingExtSerializer extends AbstractExtensionSerializer implements ExtConstants { + + public BindingExtSerializer() { + super(Binding.class, QN_BINDING_EXT, BindingExtImpl.class); + } + + @Override + public ExtensibilityElement unmarshall(Class parentType, QName elementType, Element el, + Definition def, ExtensionRegistry extReg) throws WSDLException { + + BindingExt extObj = (BindingExt) extReg.createExtension(parentType, elementType); + //TODO: set any attributes from the el to extension object + // String myAttr = el.getAttribute(ATTR_MY_ATTR); + // extObj.setMyAttr(myAttr); + return extObj; + } + + @Override + public void marshall(Class parentType, QName elementType, ExtensibilityElement extension, + PrintWriter pw, Definition def, ExtensionRegistry extReg) throws WSDLException { + + BindingExt extObj = (BindingExt) extension; + StringBuffer buff = new StringBuffer(); + + String elName = getQualifiedName(def, NS_URI, EL_BINDING_EXT); + buff.append("<" + elName); + + //TODO: append any attributes from extension obj to the element + // String myAttr = extObj.getMyAttr(); + // if ( myAttr != null && myAttr.trim().length() > 0 ) { + // buff.append(" myAttr=${symbol_escape}"" + myAttr + "${symbol_escape}""); + // } + // + + buff.append("/>"); + pw.println(buff.toString()); + + } + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/wsdlext/ExtConstants.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/wsdlext/ExtConstants.java new file mode 100644 index 000000000..c52cc7f2b --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/wsdlext/ExtConstants.java @@ -0,0 +1,52 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * ExtConstants.java + * + */ +package net.openesb.component.${componentName}.wsdlext; + +import javax.xml.namespace.QName; + +/** + * This interface defines the constants for the namespace, elements, attributes + * and qnames corresponding to the wsdl extensions that this component + * processes. These constants will be used in the wsdl extension model used to + * process a particular wsdl extensions. + * + * @see WSDLExtensionRegistry + * @see PortExt + * @see BindingExt + * @author chikkala + */ +public interface ExtConstants { + + public static final String NS_URI_WSDL = "http://schemas.xmlsoap.org/wsdl/"; + public static final String NS_URI_XMLNS = "http://www.w3.org/2000/xmlns/"; + /** + * wsdl extension namespace processed by this wsdl extension model + */ + public static final String NS_URI = "http://java.sun.com/jbi/wsdl-extensions/sample/jmx-bc/"; + public static final String NS_DEF_PREFIX = "jmxbc"; + // wsdl extension element names. + public static final String EL_BINDING_EXT = "binding"; + public static final String EL_OPERATION_EXT = "operation"; + public static final String EL_INPUT_EXT = "input"; + public static final String EL_OUTPUT_EXT = "output"; + public static final String EL_FAULT_EXT = "fault"; + public static final String EL_PORT_EXT = "address"; + // Qualified wsdl extension element names. + public static final QName QN_BINDING_EXT = new QName(NS_URI, EL_BINDING_EXT); + public static final QName QN_OPERATION_EXT = new QName(NS_URI, EL_OPERATION_EXT); + public static final QName QN_INPUT_EXT = new QName(NS_URI, EL_INPUT_EXT); + public static final QName QN_OUTPUT_EXT = new QName(NS_URI, EL_OUTPUT_EXT); + public static final QName QN_FAULT_EXT = new QName(NS_URI, EL_FAULT_EXT); + public static final QName QN_PORT_EXT = new QName(NS_URI, EL_PORT_EXT); + // wsdl extension elements attribute names. + public static final String ATTR_ACTION = "action"; + public static final String ATTR_SERVICE_URL = "serviceURL"; + public static final String ATTR_USERNAME = "username"; + public static final String ATTR_PASSWORD = "password"; + public static final String ATTR_MBEAN = "mbean"; +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/wsdlext/FaultExt.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/wsdlext/FaultExt.java new file mode 100644 index 000000000..15b6f199c --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/wsdlext/FaultExt.java @@ -0,0 +1,101 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * FaultExt.java + */ +package net.openesb.component.${componentName}.wsdlext; + +import net.openesb.component.${componentName}.common.wsdl.AbstractExtensibilityElement; +import net.openesb.component.${componentName}.common.wsdl.AbstractExtensionSerializer; +import net.openesb.component.${componentName}.common.wsdl.WSDLProcessor; +import java.io.PrintWriter; +import javax.wsdl.BindingFault; +import javax.wsdl.Definition; +import javax.wsdl.WSDLException; +import javax.wsdl.extensions.ExtensibilityElement; +import javax.wsdl.extensions.ExtensionRegistry; +import javax.xml.namespace.QName; +import org.w3c.dom.Element; + +/** + * This interface and its implementation represents the java model for binding + * operation fault extension element. The inner classes FaultExtImpl implements + * the interface and the FaultExtSerializer provides the serializer and + * deserializer implementation. The implemenation and serializer classes will be + * registered with the ExtensionRegistry to process the binding operation fault + * extension element in the wsdl definition. + * + * @see com.sun.jbi.sample.component.common.wsdl.AbstractExtensibilityElement + * @see com.sun.jbi.sample.component.common.wsdl.AbstractExtensionSerializer + * @see com.sun.jbi.sample.component.common.wsdl.AbstractExtensionRegistry + * @author chikkala + */ +public interface FaultExt extends ExtConstants, ExtensibilityElement, java.io.Serializable { + + //TODO: define getter methods for properties for FaultExt if the extension element has attributes. + /** + * This class is an implementation of FaultExt interface that provides java + * model for binding operation fault extensibility element. + */ + public static class FaultExtImpl extends AbstractExtensibilityElement implements FaultExt { + + public FaultExtImpl() { + setElementType(QN_FAULT_EXT); + } + + /** + * creates and adds the binding operation fault extensibility element to + * the wsdl definition + */ + public static FaultExtImpl addExtensibilityElement(Definition wsdlDef, BindingFault fault) { + FaultExtImpl faultExt = new FaultExt.FaultExtImpl(); + WSDLProcessor.addExtensibilityElement(wsdlDef, fault, faultExt, NS_DEF_PREFIX); + return faultExt; + } + } + + /** + * This class provides the serializer and deserializer implementation for + * binding operation fault extensibility element. + */ + public static class FaultExtSerializer extends AbstractExtensionSerializer implements ExtConstants { + + public FaultExtSerializer() { + super(BindingFault.class, QN_FAULT_EXT, FaultExtImpl.class); + } + + @Override + public ExtensibilityElement unmarshall(Class parentType, QName elementType, Element el, + Definition def, ExtensionRegistry extReg) throws WSDLException { + + FaultExt extObj = (FaultExt) extReg.createExtension(parentType, elementType); + //TODO: set any attributes from the el to extension object + // String myAttr = el.getAttribute(ATTR_MY_ATTR); + // extObj.setMyAttr(myAttr); + return extObj; + } + + @Override + public void marshall(Class parentType, QName elementType, ExtensibilityElement extension, + PrintWriter pw, Definition def, ExtensionRegistry extReg) throws WSDLException { + + FaultExt extObj = (FaultExt) extension; + StringBuffer buff = new StringBuffer(); + + String elName = getQualifiedName(def, NS_URI, EL_FAULT_EXT); + buff.append("<" + elName); + + //TODO: append any attributes from extension obj to the element + // String myAttr = extObj.getMyAttr(); + // if ( myAttr != null && myAttr.trim().length() > 0 ) { + // buff.append(" myAttr=${symbol_escape}"" + myAttr + "${symbol_escape}""); + // } + // + + buff.append("/>"); + pw.println(buff.toString()); + + } + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/wsdlext/InputExt.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/wsdlext/InputExt.java new file mode 100644 index 000000000..e73d45fb2 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/wsdlext/InputExt.java @@ -0,0 +1,101 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * InputExt.java + */ +package net.openesb.component.${componentName}.wsdlext; + +import net.openesb.component.${componentName}.common.wsdl.AbstractExtensibilityElement; +import net.openesb.component.${componentName}.common.wsdl.AbstractExtensionSerializer; +import net.openesb.component.${componentName}.common.wsdl.WSDLProcessor; +import java.io.PrintWriter; +import javax.wsdl.BindingInput; +import javax.wsdl.Definition; +import javax.wsdl.WSDLException; +import javax.wsdl.extensions.ExtensibilityElement; +import javax.wsdl.extensions.ExtensionRegistry; +import javax.xml.namespace.QName; +import org.w3c.dom.Element; + +/** + * This interface and its implementation represents the java model for binding + * operation input extension element. The inner classes InputExtImpl implements + * the interface and the InputExtSerializer provides the serislizer and + * deserializer implementation. The implementation and serializer classes will + * be registered with the ExtensionRegistry to process the binding operation + * input extension element in the wsdl definition. + * + * @see com.sun.jbi.sample.component.common.wsdl.AbstractExtensibilityElement + * @see com.sun.jbi.sample.component.common.wsdl.AbstractExtensionSerializer + * @see com.sun.jbi.sample.component.common.wsdl.AbstractExtensionRegistry + * @author chikkala + */ +public interface InputExt extends ExtConstants, ExtensibilityElement, java.io.Serializable { + + //TODO: define get/set methods for properties for InputExt if the extension element has attributes. + /** + * This class is an implementation of InputExt interface that provides java + * model for binding operation input extensibility element. + */ + public static class InputExtImpl extends AbstractExtensibilityElement implements InputExt { + + public InputExtImpl() { + setElementType(QN_INPUT_EXT); + } + + /** + * creates and adds the binding operation fault extensibility element to + * the wsdl definition + */ + public static InputExtImpl addExtensibilityElement(Definition wsdlDef, BindingInput input) { + InputExtImpl inputExt = new InputExt.InputExtImpl(); + WSDLProcessor.addExtensibilityElement(wsdlDef, input, inputExt, NS_DEF_PREFIX); + return inputExt; + } + } + + /** + * This class provides the serializer and deserializer implementation for + * binding operation input extensibility element. + */ + public static class InputExtSerializer extends AbstractExtensionSerializer implements ExtConstants { + + public InputExtSerializer() { + super(BindingInput.class, QN_INPUT_EXT, InputExtImpl.class); + } + + @Override + public ExtensibilityElement unmarshall(Class parentType, QName elementType, Element el, + Definition def, ExtensionRegistry extReg) throws WSDLException { + + InputExt extObj = (InputExt) extReg.createExtension(parentType, elementType); + //TODO: set any attributes from the el to extension object + // String myAttr = el.getAttribute(ATTR_MY_ATTR); + // extObj.setMyAttr(myAttr); + return extObj; + } + + @Override + public void marshall(Class parentType, QName elementType, ExtensibilityElement extension, + PrintWriter pw, Definition def, ExtensionRegistry extReg) throws WSDLException { + + InputExt extObj = (InputExt) extension; + StringBuffer buff = new StringBuffer(); + + String elName = getQualifiedName(def, NS_URI, EL_INPUT_EXT); + buff.append("<" + elName); + + //TODO: append any attributes from extension obj to the element + // String myAttr = extObj.getMyAttr(); + // if ( myAttr != null && myAttr.trim().length() > 0 ) { + // buff.append(" myAttr=${symbol_escape}"" + myAttr + "${symbol_escape}""); + // } + // + + buff.append("/>"); + pw.println(buff.toString()); + + } + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/wsdlext/OperationExt.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/wsdlext/OperationExt.java new file mode 100644 index 000000000..003922f3c --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/wsdlext/OperationExt.java @@ -0,0 +1,121 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * OperationExt.java + */ +package net.openesb.component.${componentName}.wsdlext; + +import net.openesb.component.${componentName}.common.wsdl.AbstractExtensibilityElement; +import net.openesb.component.${componentName}.common.wsdl.AbstractExtensionSerializer; +import net.openesb.component.${componentName}.common.wsdl.WSDLProcessor; +import java.io.PrintWriter; +import javax.wsdl.BindingOperation; +import javax.wsdl.Definition; +import javax.wsdl.WSDLException; +import javax.wsdl.extensions.ExtensibilityElement; +import javax.wsdl.extensions.ExtensionRegistry; +import javax.xml.namespace.QName; +import org.w3c.dom.Element; + +/** + * This interface and its implementation represents the java model for binding + * operation extension element. The inner classes OperationImpl implements the + * interface and the OperationExtSerializer provides the serilizer and + * deserializer implementation. The implementation and serializer classes will + * be registered with the ExtensionRegistry to process the binding operation + * extension element in the wsdl definition. + * + * @see com.sun.jbi.sample.component.common.wsdl.AbstractExtensibilityElement + * @see com.sun.jbi.sample.component.common.wsdl.AbstractExtensionSerializer + * @see com.sun.jbi.sample.component.common.wsdl.AbstractExtensionRegistry + * @author chikkala + */ +public interface OperationExt extends ExtConstants, ExtensibilityElement, java.io.Serializable { + + /** + * Getter for property action. + * + * @return Value of property action. + */ + public String getAction(); + + /** + * Setter for property action. + * + * @param action New value of property action. + */ + public void setAction(String action); + + /** + * This class is an implementation of OperationExt interface that provides + * java model for binding operation extensibility element. + */ + public static class OperationExtImpl extends AbstractExtensibilityElement implements OperationExt { + + private String mAction; + + public OperationExtImpl() { + setElementType(QN_OPERATION_EXT); + } + + public String getAction() { + return this.mAction; + } + + public void setAction(String action) { + this.mAction = action; + } + + /** + * creates and adds the binding operation fault extensibility element to + * the wsdl definition + */ + public static OperationExtImpl addExtensibilityElement(Definition wsdlDef, BindingOperation operation) { + OperationExtImpl operationExt = new OperationExt.OperationExtImpl(); + WSDLProcessor.addExtensibilityElement(wsdlDef, operation, operationExt, NS_DEF_PREFIX); + return operationExt; + } + } + + /** + * This class provides the serializer and deserializer implementation for + * binding operation extensibility element. + */ + public static class OperationExtSerializer extends AbstractExtensionSerializer implements ExtConstants { + + public OperationExtSerializer() { + super(BindingOperation.class, QN_OPERATION_EXT, OperationExtImpl.class); + } + + @Override + public ExtensibilityElement unmarshall(Class parentType, QName elementType, Element el, + Definition def, ExtensionRegistry extReg) throws WSDLException { + + OperationExt extObj = (OperationExt) extReg.createExtension(parentType, elementType); + String action = el.getAttribute(ATTR_ACTION); + extObj.setAction(action); + return extObj; + } + + @Override + public void marshall(Class parentType, QName elementType, ExtensibilityElement extension, + PrintWriter pw, Definition def, ExtensionRegistry extReg) throws WSDLException { + + OperationExt extObj = (OperationExt) extension; + StringBuffer buff = new StringBuffer(); + + String elName = getQualifiedName(def, NS_URI, EL_OPERATION_EXT); + buff.append("<" + elName); + + String action = extObj.getAction(); + if (action != null && action.trim().length() > 0) { + buff.append(" " + ATTR_ACTION + "=${symbol_escape}"" + action + "${symbol_escape}""); + } + + buff.append("/>"); + pw.println(buff.toString()); + + } + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/wsdlext/OutputExt.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/wsdlext/OutputExt.java new file mode 100644 index 000000000..9e1bed459 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/wsdlext/OutputExt.java @@ -0,0 +1,101 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * OutputExt.java + */ +package net.openesb.component.${componentName}.wsdlext; + +import net.openesb.component.${componentName}.common.wsdl.AbstractExtensibilityElement; +import net.openesb.component.${componentName}.common.wsdl.AbstractExtensionSerializer; +import net.openesb.component.${componentName}.common.wsdl.WSDLProcessor; +import java.io.PrintWriter; +import javax.wsdl.BindingOutput; +import javax.wsdl.Definition; +import javax.wsdl.WSDLException; +import javax.wsdl.extensions.ExtensibilityElement; +import javax.wsdl.extensions.ExtensionRegistry; +import javax.xml.namespace.QName; +import org.w3c.dom.Element; + +/** + * This interface and its implementation represents the java model for binding + * operation output extension element. The inner classes OutputExtImpl + * implements the interface and the OutputExtSerializer provides the serilizer + * and deserializer implementation. The implementation and serializer classes + * will be registered with the ExtensionRegistry to process the binding + * operation output extension element in the wsdl definition. + * + * @see com.sun.jbi.sample.component.common.wsdl.AbstractExtensibilityElement + * @see com.sun.jbi.sample.component.common.wsdl.AbstractExtensionSerializer + * @see com.sun.jbi.sample.component.common.wsdl.AbstractExtensionRegistry + * @author chikkala + */ +public interface OutputExt extends ExtConstants, ExtensibilityElement, java.io.Serializable { + + //TODO: define get/set methods for properties for OutputExt if the extension element has attributes. + /** + * This class is an implementation of OutputExt interface that provides java + * model for binding operation output extensibility element. + */ + public static class OutputExtImpl extends AbstractExtensibilityElement implements OutputExt { + + public OutputExtImpl() { + setElementType(QN_OUTPUT_EXT); + } + + /** + * creates and adds the binding operation fault extensibility element to + * the wsdl definition + */ + public static OutputExtImpl addExtensibilityElement(Definition wsdlDef, BindingOutput output) { + OutputExtImpl OutputExt = new OutputExt.OutputExtImpl(); + WSDLProcessor.addExtensibilityElement(wsdlDef, output, OutputExt, NS_DEF_PREFIX); + return OutputExt; + } + } + + /** + * This class provides the serializer and deserializer implementation for + * binding operation output extensibility element. + */ + public static class OutputExtSerializer extends AbstractExtensionSerializer implements ExtConstants { + + public OutputExtSerializer() { + super(BindingOutput.class, QN_OUTPUT_EXT, OutputExtImpl.class); + } + + @Override + public ExtensibilityElement unmarshall(Class parentType, QName elementType, Element el, + Definition def, ExtensionRegistry extReg) throws WSDLException { + + OutputExt extObj = (OutputExt) extReg.createExtension(parentType, elementType); + //TODO: set any attributes from the el to extension object + // String myAttr = el.getAttribute(ATTR_MY_ATTR); + // extObj.setMyAttr(myAttr); + return extObj; + } + + @Override + public void marshall(Class parentType, QName elementType, ExtensibilityElement extension, + PrintWriter pw, Definition def, ExtensionRegistry extReg) throws WSDLException { + + OutputExt extObj = (OutputExt) extension; + StringBuffer buff = new StringBuffer(); + + String elName = getQualifiedName(def, NS_URI, EL_OUTPUT_EXT); + buff.append("<" + elName); + + //TODO: append any attributes from extension obj to the element + // String myAttr = extObj.getMyAttr(); + // if ( myAttr != null && myAttr.trim().length() > 0 ) { + // buff.append(" myAttr=${symbol_escape}"" + myAttr + "${symbol_escape}""); + // } + // + + buff.append("/>"); + pw.println(buff.toString()); + + } + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/wsdlext/PortExt.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/wsdlext/PortExt.java new file mode 100644 index 000000000..dafa40b4e --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/wsdlext/PortExt.java @@ -0,0 +1,217 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * PortExt.java + */ +package net.openesb.component.${componentName}.wsdlext; + +import net.openesb.component.${componentName}.common.wsdl.AbstractExtensibilityElement; +import net.openesb.component.${componentName}.common.wsdl.AbstractExtensionSerializer; +import net.openesb.component.${componentName}.common.wsdl.WSDLProcessor; +import java.io.PrintWriter; +import javax.wsdl.Definition; +import javax.wsdl.Port; +import javax.wsdl.WSDLException; +import javax.wsdl.extensions.ExtensibilityElement; +import javax.wsdl.extensions.ExtensionRegistry; +import javax.xml.namespace.QName; +import org.w3c.dom.Element; + +/** + * This interface and its implementation represents the java model for port + * extension element. The inner classes PortExtImpl implements the interface and + * the PortExtSerializer provides the serializer and deserializer implemenation. + * The implementation and serializer classes will be registered with the + * ExtensionRegistry to process the port extension element in the wsdl + * definition. + * + * @see com.sun.jbi.sample.component.common.wsdl.AbstractExtensibilityElement + * @see com.sun.jbi.sample.component.common.wsdl.AbstractExtensionSerializer + * @see com.sun.jbi.sample.component.common.wsdl.AbstractExtensionRegistry + * @author chikkala + */ +public interface PortExt extends ExtConstants, ExtensibilityElement, java.io.Serializable { + + /** + * Getter for property serviceURL. + * + * @return Value of property serviceURL. + */ + public String getServiceURL(); + + /** + * Setter for property serviceURL. + * + * @param serviceURL New value of property serviceURL. + */ + public void setServiceURL(String serviceURL); + + /** + * Getter for property username. + * + * @return Value of property username. + */ + public String getUsername(); + + /** + * Setter for property username. + * + * @param username New value of property username. + */ + public void setUsername(String username); + + /** + * Getter for property password. + * + * @return Value of property password. + */ + public String getPassword(); + + /** + * Setter for property password. + * + * @param password New value of property password. + */ + public void setPassword(String password); + + /** + * Getter for property name. + * + * @return Value of property name. + */ + public String getMBean(); + + /** + * Setter for property mbean. + * + * @param name New value of property mbean. + */ + public void setMBean(String mbean); + + /** + * This class is an implementation of PortExt interface that provides java + * model for port extensibility element. + */ + public static class PortExtImpl + extends AbstractExtensibilityElement implements PortExt { + + private String mServiceURL; + private String mUsername; + private String mPassword; + private String mMBean; + + public PortExtImpl() { + setElementType(QN_PORT_EXT); + } + + public String getServiceURL() { + return this.mServiceURL; + } + + public void setServiceURL(String serviceURL) { + this.mServiceURL = serviceURL; + } + + public String getUsername() { + return this.mUsername; + } + + public void setUsername(String username) { + this.mUsername = username; + } + + public String getPassword() { + return this.mPassword; + } + + public void setPassword(String password) { + this.mPassword = password; + } + + public String getMBean() { + return this.mMBean; + } + + public void setMBean(String mbean) { + this.mMBean = mbean; + } + + /** + * creates and adds the port extensibility element to the wsdl + * definition + */ + public static PortExtImpl addExtensibilityElement(Definition wsdlDef, Port port) { + PortExtImpl portExt = new PortExt.PortExtImpl(); + WSDLProcessor.addExtensibilityElement(wsdlDef, port, portExt, NS_DEF_PREFIX); + return portExt; + } + } + + /** + * This class provides the serializer and deserializer implementation for + * port extensibility element. + */ + public static class PortExtSerializer extends AbstractExtensionSerializer implements ExtConstants { + + public PortExtSerializer() { + super(Port.class, QN_PORT_EXT, PortExtImpl.class); + } + + @Override + public ExtensibilityElement unmarshall(Class parentType, QName elementType, Element el, + Definition def, ExtensionRegistry extReg) throws WSDLException { + + PortExt extObj = (PortExt) extReg.createExtension(parentType, elementType); + + String serviceURL = el.getAttribute(ATTR_SERVICE_URL); + extObj.setServiceURL(serviceURL); + + String mbean = el.getAttribute(ATTR_MBEAN); + extObj.setMBean(mbean); + + String username = el.getAttribute(ATTR_USERNAME); + extObj.setUsername(username); + + String password = el.getAttribute(ATTR_PASSWORD); + extObj.setPassword(password); + + return extObj; + } + + @Override + public void marshall(Class parentType, QName elementType, ExtensibilityElement extension, + PrintWriter pw, Definition def, ExtensionRegistry extReg) throws WSDLException { + + PortExt extObj = (PortExt) extension; + StringBuffer buff = new StringBuffer(); + + String elName = getQualifiedName(def, NS_URI, EL_PORT_EXT); + buff.append("<" + elName); + + String serviceURL = extObj.getServiceURL(); + if (serviceURL != null && serviceURL.trim().length() > 0) { + buff.append(" " + ATTR_SERVICE_URL + "=${symbol_escape}"" + serviceURL + "${symbol_escape}""); + } + + String mbean = extObj.getMBean(); + if (mbean != null && mbean.trim().length() > 0) { + buff.append(" " + ATTR_MBEAN + "=${symbol_escape}"" + mbean + "${symbol_escape}""); + } + + String username = extObj.getUsername(); + if (username != null && username.trim().length() > 0) { + buff.append(" " + ATTR_USERNAME + "=${symbol_escape}"" + username + "${symbol_escape}""); + } + + String password = extObj.getUsername(); + if (password != null && password.trim().length() > 0) { + buff.append(" " + ATTR_PASSWORD + "=${symbol_escape}"" + password + "${symbol_escape}""); + } + + buff.append("/>"); + pw.println(buff.toString()); + + } + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/wsdlext/WSDLExtHelper.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/wsdlext/WSDLExtHelper.java new file mode 100644 index 000000000..1e1aed0c8 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/wsdlext/WSDLExtHelper.java @@ -0,0 +1,223 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * WSDLExtHelper.java + */ +package net.openesb.component.${componentName}.wsdlext; + +import java.util.List; +import javax.wsdl.Binding; +import javax.wsdl.BindingFault; +import javax.wsdl.BindingInput; +import javax.wsdl.BindingOperation; +import javax.wsdl.BindingOutput; +import javax.wsdl.Definition; +import javax.wsdl.Port; +import javax.wsdl.Service; +import javax.wsdl.extensions.ExtensibilityElement; +import javax.xml.namespace.QName; + +/** + * This class is a helper class for processing the wsdl extensions. It has + * methods that help locate the extension elements and return the java models + * corresponds to the extension elements. + * + * @author chikkala + */ +public final class WSDLExtHelper { + + /** + * creates the java object for the port extension element. + * + * @param def wsdl definition + * @param serviceName QName of the service + * @param endpointName name of the port under which to lookup for the port + * extension. + * @return java object for the port extension element + */ + public static PortExt getPortExt(Definition def, QName serviceName, String endpointName) { + PortExt portExt = null; + Service wsdlService = def.getService(serviceName); + Port port = wsdlService.getPort(endpointName); + @SuppressWarnings("unchecked") + List extElList = port.getExtensibilityElements(); + for (ExtensibilityElement extEl : extElList) { + if (extEl instanceof PortExt) { + portExt = (PortExt) extEl; + break; + } + } + return portExt; + } + + /** + * creates the java object for the binding extension element. + * + * @param def wsdl definition + * @param binding binding under which to lookup for the binding extension. + * @return java object for the port extension element + */ + public static BindingExt getBindingExt(Definition def, Binding binding) { + BindingExt bindingExt = null; + @SuppressWarnings("unchecked") + List extElList = binding.getExtensibilityElements(); + for (ExtensibilityElement extEl : extElList) { + if (extEl instanceof BindingExt) { + bindingExt = (BindingExt) extEl; + break; + } + } + return bindingExt; + } + + /** + * creates the java object for the binding extension element. + * + * @param def wsdl definition + * @param serviceName QName of the service + * @param endpointName name of the port that references the binding. + * @return java object for the port extension element + */ + public static BindingExt getBindingExt(Definition def, QName serviceName, String endpointName) { + Service wsdlService = def.getService(serviceName); + Port port = wsdlService.getPort(endpointName); + Binding binding = port.getBinding(); + return getBindingExt(def, binding); + } + + /** + * @return OperationExt java object corresponding to the operation extension + * element under binding + */ + public static OperationExt getOperationExt(Definition def, Binding binding, String operation) { + OperationExt operationExt = null; + BindingOperation bindingOp = binding.getBindingOperation(operation, null, null); + if (bindingOp != null) { + @SuppressWarnings("unchecked") + List extElList = bindingOp.getExtensibilityElements(); + for (ExtensibilityElement extEl : extElList) { + if (extEl instanceof OperationExt) { + operationExt = (OperationExt) extEl; + break; + } + } + } + return operationExt; + } + + /** + * @return OperationExt java object corresponding to the operation extension + * element under binding + */ + public static OperationExt getOperationExt(Definition def, QName serviceName, String endpointName, String operation) { + Service wsdlService = def.getService(serviceName); + Port port = wsdlService.getPort(endpointName); + Binding binding = port.getBinding(); + return getOperationExt(def, binding, operation); + } + + /** + * @return InputExt java object corresponding to input extension element of + * the the binding operation under binding + */ + public static InputExt getInputExt(Definition def, Binding binding, + String operation, String input) { + InputExt inputExt = null; + BindingOperation bindingOp = binding.getBindingOperation(operation, input, null); + if (bindingOp != null) { + BindingInput bindingInput = bindingOp.getBindingInput(); + @SuppressWarnings("unchecked") + List extElList = bindingInput.getExtensibilityElements(); + for (ExtensibilityElement extEl : extElList) { + if (extEl instanceof InputExt) { + inputExt = (InputExt) extEl; + break; + } + } + } + return inputExt; + } + + /** + * @return InputExt java object corresponding to input extension element of + * the the binding operation under binding + */ + public static InputExt getInputExt(Definition def, + QName serviceName, String endpointName, String operation, String input) { + Service wsdlService = def.getService(serviceName); + Port port = wsdlService.getPort(endpointName); + Binding binding = port.getBinding(); + return getInputExt(def, binding, operation, input); + } + + /** + * @return OutputExt java object corresponding to output extension element + * of the the binding operation under binding + */ + public static OutputExt getOutputExt(Definition def, Binding binding, + String operation, String output) { + OutputExt outputExt = null; + BindingOperation bindingOp = binding.getBindingOperation(operation, null, output); + if (bindingOp != null) { + BindingOutput bindingOutput = bindingOp.getBindingOutput(); + @SuppressWarnings("unchecked") + List extElList = bindingOutput.getExtensibilityElements(); + for (ExtensibilityElement extEl : extElList) { + if (extEl instanceof OutputExt) { + outputExt = (OutputExt) extEl; + break; + } + } + } + return outputExt; + } + + /** + * @return OutputExt java object corresponding to output extension element + * of the the binding operation under binding + */ + public static OutputExt getOutputExt(Definition def, + QName serviceName, String endpointName, String operation, String output) { + Service wsdlService = def.getService(serviceName); + Port port = wsdlService.getPort(endpointName); + Binding binding = port.getBinding(); + return getOutputExt(def, binding, operation, output); + } + + /** + * @return FaultExt java object corresponding to fault extension element of + * the the binding operation under binding + */ + public static FaultExt getFaultExt(Definition def, Binding binding, + String operation, String faultName) { + FaultExt faultExt = null; + BindingOperation bindingOp = binding.getBindingOperation(operation, null, null); + if (bindingOp != null) { + BindingFault bindingFault = bindingOp.getBindingFault(faultName); + if (bindingFault != null) { + @SuppressWarnings("unchecked") + List extElList = bindingFault.getExtensibilityElements(); + for (ExtensibilityElement extEl : extElList) { + if (extEl instanceof FaultExt) { + faultExt = (FaultExt) extEl; + break; + } + } + } + } + return faultExt; + } + + /** + * @return FaultExt java object corresponding to fault extension element of + * the the binding operation under binding + */ + public static FaultExt getFaultExt(Definition def, + QName serviceName, String endpointName, String operation, String faultName) { + Service wsdlService = def.getService(serviceName); + Port port = wsdlService.getPort(endpointName); + Binding binding = port.getBinding(); + return getFaultExt(def, binding, operation, faultName); + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/wsdlext/WSDLExtension.xsd b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/wsdlext/WSDLExtension.xsd new file mode 100644 index 000000000..1311a03c9 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/wsdlext/WSDLExtension.xsd @@ -0,0 +1,98 @@ + + + + + + + + + "binding" defines a protocol based binding details. + + + + + + + + + + + + + + "operation" defines the protocol based binding operation details. + + + + + + + + + + + + + + + "input" defines the protocol based binding input details. + + + + + + + + + + + + + + "output" defines the protocol based binding output details. + + + + + + + + + + + + + + "fault" defines the protocol based binding fault details. + + + + + + + + + + + + + + "address" indicates protocol based binding port details. + + + + + + + + + + + + + + + diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/wsdlext/WSDLExtensionRegistry.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/wsdlext/WSDLExtensionRegistry.java new file mode 100644 index 000000000..71c9c6c7f --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/wsdlext/WSDLExtensionRegistry.java @@ -0,0 +1,46 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * WSDLExtensionRegistry.java + */ +package net.openesb.component.${componentName}.wsdlext; + +import net.openesb.component.${componentName}.common.wsdl.AbstractExtensionRegistry; +import net.openesb.component.${componentName}.common.wsdl.AbstractExtensionSerializer; +import java.util.ArrayList; +import java.util.List; + +/** + * This class extends + * AbstractExtensionRegistry to create the serializers and deserializers + * for processing wsdl extensions. + * + * @see AbstractExtensionRegistry + * @author chikkala + */ +public class WSDLExtensionRegistry extends AbstractExtensionRegistry { + + /** + * Creates a new instance of JMXBindingExtensionRegistry + */ + public WSDLExtensionRegistry() { + super(); + } + + /** + * creates serializers and deserializers for all the extension elements + */ + protected List createSerializers() { + List list = new ArrayList(); + + list.add(new BindingExt.BindingExtSerializer()); + list.add(new OperationExt.OperationExtSerializer()); + list.add(new InputExt.InputExtSerializer()); + list.add(new OutputExt.OutputExtSerializer()); + list.add(new FaultExt.FaultExtSerializer()); + list.add(new PortExt.PortExtSerializer()); + + return list; + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/EndpointImplTest.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/EndpointImplTest.java new file mode 100644 index 000000000..6d26eb0c7 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/EndpointImplTest.java @@ -0,0 +1,246 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * BEGIN_HEADER - DO NOT EDIT + * + * The contents of this file are subject to the terms + * of the Common Development and Distribution License + * (the "License"). You may not use this file except + * in compliance with the License. + * + * You can obtain a copy of the license at + * https://${package}.dev.java.net/public/CDDLv1.0.html. + * See the License for the specific language governing + * permissions and limitations under the License. + * + * When distributing Covered Code, include this CDDL + * HEADER in each file and include the License file at + * https://${package}.dev.java.net/public/CDDLv1.0.html. + * If applicable add the following below this CDDL HEADER, + * with the fields enclosed by brackets "[]" replaced with + * your own identifying information: Portions Copyright + * [year] [name of copyright owner] + */ + +/* + * @(${symbol_pound})EndpointImplTest.java + * + * Copyright 2004-2007 Sun Microsystems, Inc. All Rights Reserved. + * + * END_HEADER - DO NOT EDIT + */ +package com.sun.jbi.filebc; + +import junit.framework.*; +import com.sun.jbi.eManager.provider.EndpointStatus; +import com.sun.jbi.filebc.extensions.FileAddress; +import com.sun.jbi.filebc.extensions.FileBinding; +import com.sun.jbi.filebc.extensions.FileOperation; +import java.util.HashMap; +import java.util.Map; +import javax.jbi.servicedesc.ServiceEndpoint; +import javax.wsdl.Definition; +import javax.xml.namespace.QName; +import com.ibm.wsdl.DefinitionImpl; +import org.w3c.dom.Document; +import org.jmock.*; + +/** + * + * @author sweng + */ +public class EndpointImplTest extends MockObjectTestCase { + + EndpointImpl instance = null; + + public EndpointImplTest(String testName) { + super(testName); + } + + protected void setUp() throws Exception { + instance = new EndpointImpl(); + } + + protected void tearDown() throws Exception { + } + + public static Test suite() { + TestSuite suite = new TestSuite(EndpointImplTest.class); + + return suite; + } + + /** + * Test of setServiceName and getServiceName method, of class com.sun.jbi.filebc.EndpointImpl. + */ + public void testSetGetServiceName() { + System.out.println("Testing setServiceName and getServiceName"); + + QName expResult = new QName("http://my-filebc-test/mynamespace", "myFileService"); + instance.setServiceName(new QName("http://my-filebc-test/mynamespace", "myFileService")); + QName result = instance.getServiceName(); + assertEquals(expResult, result); + + System.out.println("Successfully tested setServiceName and getServiceName"); + } + + /** + * Test of setEndpointName and getEndpointName method, of class com.sun.jbi.filebc.EndpointImpl. + */ + public void testSetGetEndpointName() { + System.out.println("Testing setEndpointName and getEndpointName"); + + String expResult = "myFileTestPort"; + instance.setEndpointName("myFileTestPort"); + String result = instance.getEndpointName(); + assertEquals(expResult, result); + + System.out.println("Successfully tested setEndpointName and getEndpointName"); + } + + /** + * Test of setDefinition and getDefinition method, of class com.sun.jbi.filebc.EndpointImpl. + */ + public void testSetGetDefinition() { + System.out.println("Testing setDefinition and getDefinition"); + + Definition val = new DefinitionImpl(); + instance.setDefinition(val); + Definition result = instance.getDefinition(); + assertTrue(result instanceof Definition); + + System.out.println("Successfully tested setDefinition and getDefinition"); + } + + /** + * Test of setState and getState method, of class com.sun.jbi.filebc.EndpointImpl. + */ + public void testSetGetState() { + System.out.println("Testing setState and getState"); + + int expResult = 0; + instance.setState(0); + int result = instance.getState(); + assertEquals(expResult, result); + + System.out.println("Successfully tested setState and getState"); + } + + /** + * Test of setEndpointStatus and getEndpointStatus method, of class com.sun.jbi.filebc.EndpointImpl. + */ + public void testSetGetEndpointStatus() { + System.out.println("Testing setEndpointStatus and getEndpointStatus"); + + Mock endpointStatus = mock(EndpointStatus.class); + instance.setEndpointStatus((EndpointStatus) endpointStatus.proxy()); + EndpointStatus result = instance.getEndpointStatus(); + assertTrue(result instanceof EndpointStatus); + + System.out.println("Successfully tested setEndpointStatus and getEndpointStatus"); + } + + /** + * Test of setEndpointType and getEndpointType method, of class com.sun.jbi.filebc.EndpointImpl. + */ + public void testSetGetEndpointType() { + System.out.println("Testing setEndpointType and getEndpointType"); + + int expResult = 1; + instance.setEndpointType(1); + int result = instance.getEndpointType(); + assertEquals(expResult, result); + + System.out.println("Successfully tested setEndpointType and getEndpointType"); + } + + /** + * Test of setServiceEndpoint and getServiceEndpoint method, of class com.sun.jbi.filebc.EndpointImpl. + */ + public void testSetGetServiceEndpoint() { + System.out.println("Testing setServiceEndpoint and getServiceEndpoint"); + + Mock serviceEndpoint = mock(ServiceEndpoint.class); + instance.setServiceEndpoint((ServiceEndpoint) serviceEndpoint.proxy()); + ServiceEndpoint result = instance.getServiceEndpoint(); + assertTrue(result instanceof ServiceEndpoint); + + System.out.println("Successfully tested setServiceEndpoint and getServiceEndpoint"); + } + + /** + * Test of setServiceDescription and getServiceDescription method, of class com.sun.jbi.filebc.EndpointImpl. + */ + public void testSetServiceDescription() { + System.out.println("Testing setServiceDescription and getServiceDescription"); + + Mock document = mock(Document.class); + instance.setServiceDescription((Document) document.proxy()); + Document result = instance.getServiceDescription(); + assertTrue(result instanceof Document); + + System.out.println("Successfully tested setServiceDescription and getServiceDescription"); + } + + /** + * Test of setFileAddress and getFileAddress method, of class com.sun.jbi.filebc.EndpointImpl. + */ + public void testSetGetFileAddress() { + System.out.println("Testing setFileAddress and getFileAddress"); + + instance.setFileAddress(new FileAddress()); + FileAddress result = instance.getFileAddress(); + assertTrue(result instanceof FileAddress); + + System.out.println("Successfully tested setFileAddress and getFileAddress"); + } + + /** + * Test of setFileBinding and getFileBinding method, of class com.sun.jbi.filebc.EndpointImpl. + */ + public void testSetGetFileBinding() { + System.out.println("Testing setFileBinding and getFileBinding"); + + instance.setFileBinding(new FileBinding()); + FileBinding result = instance.getFileBinding(); + assertTrue(result instanceof FileBinding); + + System.out.println("Successfully tested setFileBinding and getFileBinding"); + } + + /** + * Test of setFileOperations and getFileOperations method, of class com.sun.jbi.filebc.EndpointImpl. + */ + public void testSetGetFileOperations() { + System.out.println("Testing setFileOperations and getFileOperations"); + + Map val = new HashMap(); + val.put(new QName("http://some-url", "operation1"), new FileOperation()); + val.put(new QName("http://some-url", "operation2"), new FileOperation()); + instance.setFileOperations(val); + Map result = instance.getFileOperations(); + assertTrue(result instanceof Map); + assertEquals(val, result); + + System.out.println("Successfully tested setFileOperations and getFileOperations"); + } + + /** + * Test of setOperationMsgExchangePattern and getOperationMsgExchangePattern method, of class com.sun.jbi.filebc.EndpointImpl. + */ + public void testSetGetOperationMsgExchangePattern() { + System.out.println("Testing setOperationMsgExchangePattern and getOperationMsgExchangePattern"); + + Map val = new HashMap(); + val.put(QName.valueOf("operation1"), "inonly"); + val.put(QName.valueOf("operation2"), "inout"); + + instance.setOperationMsgExchangePattern(val); + Map result = instance.getOperationMsgExchangePattern(); + assertTrue(result instanceof Map); + assertEquals(val, result); + + System.out.println("Successfully tested setOperationMsgExchangePattern and getOperationMsgExchangePattern"); + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/FaultExceptionTest.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/FaultExceptionTest.java new file mode 100644 index 000000000..de7ba5cec --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/FaultExceptionTest.java @@ -0,0 +1,83 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * BEGIN_HEADER - DO NOT EDIT + * + * The contents of this file are subject to the terms + * of the Common Development and Distribution License + * (the "License"). You may not use this file except + * in compliance with the License. + * + * You can obtain a copy of the license at + * https://${package}.dev.java.net/public/CDDLv1.0.html. + * See the License for the specific language governing + * permissions and limitations under the License. + * + * When distributing Covered Code, include this CDDL + * HEADER in each file and include the License file at + * https://${package}.dev.java.net/public/CDDLv1.0.html. + * If applicable add the following below this CDDL HEADER, + * with the fields enclosed by brackets "[]" replaced with + * your own identifying information: Portions Copyright + * [year] [name of copyright owner] + */ + +/* + * @(${symbol_pound})FaultExceptionTest.java + * + * Copyright 2004-2007 Sun Microsystems, Inc. All Rights Reserved. + * + * END_HEADER - DO NOT EDIT + */ +package com.sun.jbi.filebc; + +import junit.framework.*; +import javax.jbi.messaging.MessagingException; + +/** + * + * @author sweng + */ +public class FaultExceptionTest extends TestCase { + + FaultException instance = new FaultException(new MessagingException("Testing exception message")); + + public FaultExceptionTest(String testName) { + super(testName); + } + + protected void setUp() throws Exception { + } + + protected void tearDown() throws Exception { + } + + public static Test suite() { + TestSuite suite = new TestSuite(FaultExceptionTest.class); + + return suite; + } + + /** + * Test of getFaultCode method, of class com.sun.jbi.filebc.FaultException. + */ + public void testSetGetFaultCode() { + System.out.println("Testing getFaultCode"); + + String expResult = "Server"; + String result = instance.getFaultCode(); + assertEquals(expResult, result); + } + + /** + * Test of getDetail method, of class com.sun.jbi.filebc.FaultException. + */ + public void testGetDetail() { + System.out.println("Testing getDetail"); + + String expResult = "Testing exception message"; + String result = instance.getDetail(); + assertEquals(expResult, result); + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/FileBindingDeployerTest.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/FileBindingDeployerTest.java new file mode 100644 index 000000000..43aafeb73 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/FileBindingDeployerTest.java @@ -0,0 +1,246 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * BEGIN_HEADER - DO NOT EDIT + * + * The contents of this file are subject to the terms + * of the Common Development and Distribution License + * (the "License"). You may not use this file except + * in compliance with the License. + * + * You can obtain a copy of the license at + * https://${package}.dev.java.net/public/CDDLv1.0.html. + * See the License for the specific language governing + * permissions and limitations under the License. + * + * When distributing Covered Code, include this CDDL + * HEADER in each file and include the License file at + * https://${package}.dev.java.net/public/CDDLv1.0.html. + * If applicable add the following below this CDDL HEADER, + * with the fields enclosed by brackets "[]" replaced with + * your own identifying information: Portions Copyright + * [year] [name of copyright owner] + */ + +/* + * @(${symbol_pound})FileBindingDeployerTest.java + * + * Copyright 2004-2007 Sun Microsystems, Inc. All Rights Reserved. + * + * END_HEADER - DO NOT EDIT + */ + +package com.sun.jbi.filebc; + +import junit.framework.*; +import com.sun.jbi.eManager.provider.StatusProviderHelper; +import javax.jbi.component.ComponentContext; +import javax.jbi.messaging.DeliveryChannel; +import javax.management.MBeanServer; +import java.util.HashMap; +import org.jmock.*; + +/** + * + * @author sweng + */ +public class FileBindingDeployerTest extends org.jmock.cglib.MockObjectTestCase { + FileBindingDeployer instance = null; + + Mock componentContext = mock(ComponentContext.class); + Mock lifeCycle = mock(FileBindingLifeCycle.class); + Mock mbServer = mock(MBeanServer.class); + + public FileBindingDeployerTest(String testName) { + super(testName); + } + + protected void setUp() throws Exception { + instance = new FileBindingDeployer((ComponentContext) componentContext.proxy(), + (FileBindingLifeCycle) lifeCycle.proxy()); + } + + protected void tearDown() throws Exception { + } + + public static Test suite() { + TestSuite suite = new TestSuite(FileBindingDeployerTest.class); + + return suite; + } + + /** + * Test of deploy method, of class com.sun.jbi.filebc.FileBindingDeployer. + */ + public void testDeploy() throws Exception { + System.out.println("Testing deploy"); + + RuntimeConfiguration runtimeConfig = new RuntimeConfiguration("test/com/sun/jbi/filebc/testDir", null); + StatusProviderHelper statusHelper = + new StatusProviderHelper("shortName", "componentType", "componentName", (MBeanServer)mock(MBeanServer.class).proxy()); + InboundReceiver inboundReceiver = new InboundReceiver((ComponentContext) componentContext.proxy(), + (DeliveryChannel) mock(DeliveryChannel.class).proxy(), + runtimeConfig); + //HashMap serviceUnits = new HashMap(); + componentContext.expects(once()).method("getComponentName").will(returnValue("someComponentName")); + lifeCycle.expects(atLeastOnce()).method("getStatusProviderHelper").will(returnValue(statusHelper)); + lifeCycle.expects(once()).method("getInboundReceiver").will(returnValue(inboundReceiver)); + lifeCycle.expects(once()).method("getRuntimeConfigurationMBean").will(returnValue(runtimeConfig)); + String result = instance.deploy("testSUId", "test/com/sun/jbi/filebc/packaging/descriptors"); + assertNotNull(result); + } + + /** + * Test of init method, of class com.sun.jbi.filebc.FileBindingDeployer. + */ + public void testInit() throws Exception { + System.out.println("Testing init"); + + // 1. testing the scenario when a new service unit is to be initialized. + RuntimeConfiguration runtimeConfig = new RuntimeConfiguration("test/com/sun/jbi/filebc/testDir", null); + StatusProviderHelper statusHelper = + new StatusProviderHelper("shortName", "componentType", "componentName", (MBeanServer)mock(MBeanServer.class).proxy()); + InboundReceiver inboundReceiver = new InboundReceiver((ComponentContext) componentContext.proxy(), + (DeliveryChannel) mock(DeliveryChannel.class).proxy(), + runtimeConfig); + + HashMap serviceUnits = new HashMap(); + lifeCycle.expects(atLeastOnce()).method("getStatusProviderHelper").will(returnValue(statusHelper)); + lifeCycle.expects(once()).method("getInboundReceiver").will(returnValue(inboundReceiver)); + lifeCycle.expects(once()).method("getRuntimeConfigurationMBean").will(returnValue(runtimeConfig)); + + //componentContext.expects(atLeastOnce()).method("getLogger").with(eq(DeploymentLookup.class.getName()), eq(null)).will(returnValue(Logger.getLogger(DeploymentLookup.class.getName(), null))); + //componentContext.expects(atLeastOnce()).method("getMBeanServer").will(returnValue(mbServer.proxy())); + //mbServer.expects(atLeastOnce()).method("queryNames").with(isA(ObjectName.class), NULL); + + //componentContext.expects(atLeastOnce()).method("getComponentName").will(returnValue("someComponentName")); + try { + instance.init("testSUId", "test/com/sun/jbi/filebc/packaging/descriptors"); + System.out.println("Successfully tested init for a new service unit"); + } catch (Exception e) { + e.printStackTrace(); + fail("Failed to test init for a new service unit"); + } + + // 2. testing the scenario when the service unit is already initialized + serviceUnits.put("testSUId", mock(ServiceUnit.class).proxy()); + try { + instance.init("testSUId", "testSURoot"); + System.out.println("Successfully tested init for an existing service unit"); + } catch (Exception e) { + fail("Failed to test init for an existing service unit"); + } + } + + /** + * Test of start method, of class com.sun.jbi.filebc.FileBindingDeployer. + */ + public void testStart() throws Exception { + System.out.println("Testing start"); + + // setting up service units + Mock aServiceUnit = mock(ServiceUnit.class); + HashMap serviceUnits = instance.getServiceUnits(); + serviceUnits.put("testSUId", (ServiceUnit)aServiceUnit.proxy()); + aServiceUnit.expects(once()).method("start"); + aServiceUnit.expects(atLeastOnce()).method("getEndpoints"); + + // 1. testing the scenario when the service unit is initialized + try { + instance.start("testSUId"); + System.out.println("Successfully tested start when the service unit is initialized"); + aServiceUnit.verify(); + } catch (Exception e) { + fail("Failed to test start when the service unit is initialized due to: " + e.getMessage()); + } + + // 2. testing the scenario when the service unit is not initialized + try { + instance.start("noMatchSUId"); + System.out.println("Successfully tested start when the service unit is not initialized"); + } catch (Exception e) { + fail("Failed to test start when the service unit is not initialized due to: " + e.getMessage()); + } + } + + /** + * Test of stop method, of class com.sun.jbi.filebc.FileBindingDeployer. + */ + public void testStop() throws Exception { + System.out.println("Testing stop"); + + // setting up service units + Mock aServiceUnit = mock(ServiceUnit.class); + HashMap serviceUnits = instance.getServiceUnits(); + serviceUnits.put("testSUId", (ServiceUnit)aServiceUnit.proxy()); + aServiceUnit.expects(once()).method("stop"); + aServiceUnit.expects(atLeastOnce()).method("getEndpoints"); + + // 1. testing the scenario when the service unit is initialized + try { + instance.stop("testSUId"); + System.out.println("Successfully tested stop when the service unit is initialized"); + aServiceUnit.verify(); + } catch (Exception e) { + fail("Failed to test stop when the service unit is initialized due to: " + e.getMessage()); + } + + // 2. testing the scenario when the service unit is not initialized + try { + instance.stop("noMatchSUId"); + System.out.println("Successfully tested stop when the service unit is not initialized"); + } catch (Exception e) { + fail("Failed to test stop when the service unit is not initialized due to: " + e.getMessage()); + } + } + + /** + * Test of shutDown method, of class com.sun.jbi.filebc.FileBindingDeployer. + */ + public void testShutDown() throws Exception { + System.out.println("Testing shutDown"); + + // setting up service units + Mock aServiceUnit = mock(ServiceUnit.class); + HashMap serviceUnits = instance.getServiceUnits(); + serviceUnits.put("testSUId", (ServiceUnit)aServiceUnit.proxy()); + aServiceUnit.expects(once()).method("shutdown"); + aServiceUnit.expects(atLeastOnce()).method("getEndpoints"); + + // 1. testing the scenario when the service unit is initialized + try { + instance.shutDown("testSUId"); + System.out.println("Successfully tested shutDown when the service unit is initialized"); + aServiceUnit.verify(); + } catch (Exception e) { + fail("Failed to test shutDown when the service unit is initialized due to: " + e.getMessage()); + } + + // 2. testing the scenario when the service unit is not initialized + try { + instance.shutDown("noMatchSUId"); + System.out.println("Successfully tested shutDown when the service unit is not initialized"); + } catch (Exception e) { + fail("Failed to test shutDown when the service unit is not initialized due to: " + e.getMessage()); + } + } + + /** + * Test of undeploy method, of class com.sun.jbi.filebc.FileBindingDeployer. + */ + public void testUndeploy() throws Exception { + System.out.println("Testing undeploy"); + + Mock aServiceUnit = mock(ServiceUnit.class); + componentContext.expects(once()).method("getComponentName").will(returnValue("someComponentName")); + aServiceUnit.expects(atLeastOnce()).method("getEndpoints"); + //aServiceUnit.expects(once()).method("shutdown"); + + HashMap serviceUnits = instance.getServiceUnits(); + serviceUnits.put("testSUId", (ServiceUnit)aServiceUnit.proxy()); + + instance.undeploy("testSUId", "testRoot"); + assertNull(instance.getServiceUnits().get("testSUId")); + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/FileBindingLifeCycleTest.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/FileBindingLifeCycleTest.java new file mode 100644 index 000000000..4b2e1d449 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/FileBindingLifeCycleTest.java @@ -0,0 +1,217 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * BEGIN_HEADER - DO NOT EDIT + * + * The contents of this file are subject to the terms + * of the Common Development and Distribution License + * (the "License"). You may not use this file except + * in compliance with the License. + * + * You can obtain a copy of the license at + * https://${package}.dev.java.net/public/CDDLv1.0.html. + * See the License for the specific language governing + * p]ermissions and limitations under the License. + * + * When distributing Covered Code, include this CDDL + * HEADER in each file and include the License file at + * https://${package}.dev.java.net/public/CDDLv1.0.html. + * If applicable add the following below this CDDL HEADER, + * with the fields enclosed by brackets "[]" replaced with + * your own identifying information: Portions Copyright + * [year] [name of copyright owner] + */ + +/* + * @(${symbol_pound})FileBindingLifeCycleTest.java + * + * Copyright 2004-2007 Sun Microsystems, Inc. All Rights Reserved. + * + * END_HEADER - DO NOT EDIT + */ +package com.sun.jbi.filebc; + +import junit.framework.*; + + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import javax.jbi.component.ComponentContext; +import javax.jbi.component.ComponentLifeCycle; +import javax.jbi.messaging.DeliveryChannel; +import javax.jbi.servicedesc.ServiceEndpoint; +import javax.xml.namespace.QName; +import org.w3c.dom.Document; +import org.jmock.*; + +/** + * + * @author sweng + */ +public class FileBindingLifeCycleTest extends org.jmock.cglib.MockObjectTestCase { + + FileBindingLifeCycle instance = null; + Mock jbiContext = mock(ComponentContext.class); + Mock deliveryChannel = mock(DeliveryChannel.class); + + public FileBindingLifeCycleTest(String testName) { + super(testName); + } + + protected void setUp() throws Exception { + instance = new FileBindingLifeCycle(); + } + + protected void tearDown() throws Exception { + } + + public static Test suite() { + TestSuite suite = new TestSuite(FileBindingLifeCycleTest.class); + + return suite; + } + + /** + * Test of getLifeCycle method, of class com.sun.jbi.filebc.FileBindingLifeCycle. + */ + public void testGetLifeCycle() { + System.out.println("Testing getLifeCycle"); + + ComponentLifeCycle result = instance.getLifeCycle(); + assertEquals(instance, result); + } + + /** + * Test of init method, of class com.sun.jbi.filebc.FileBindingLifeCycle. + */ + /* public void testInit() throws Exception { + System.out.println("Testing init"); + + + // 1. testing the success scenario + Mock mbServer = mock(MBeanServer.class); + Mock mBeanNames = mock(MBeanNames.class); + Mock on = mock(ObjectName.class, new Class[]{String.class}, + new Object[] + {"com.sun.jbi:ComponentName=sun-file-binding,ComponentType=Installed,ControlType=Custom,CustomControlName=Statistics,InstalledType=Binding,JbiName=server"}); + + Mock mStatusProviderHelper = mock(StatusProviderHelper.class, + new Class[] {String.class, ObjectName.class, MBeanServer.class}, + new Object[] {"A", on.proxy(), mbServer.proxy()}); + + + + jbiContext.expects(atLeastOnce()).method("getLogger").with(eq(FileBindingLifeCycle.class.getName()),eq("com.sun.jbi.filebc.messages.Bundle")).will(returnValue(Logger.getLogger(FileBindingLifeCycle.class.getName(), "com.sun.jbi.filebc.messages.Bundle"))); + jbiContext.expects(atLeastOnce()).method("getLogger").with(eq("com.sun.jbi.filebc.FileBindingDeployer"), eq("com.sun.jbi.filebc.messages.Bundle")).will(returnValue(Logger.getLogger("com.sun.jbi.filebc.FileBindingDeployer", "com.sun.jbi.filebc.messages.Bundle"))); + jbiContext.expects(atLeastOnce()).method("getLogger").with(eq("com.sun.jbi.filebc.RuntimeConfiguration"), eq("com.sun.jbi.filebc.messages.Bundle")).will(returnValue(Logger.getLogger("com.sun.jbi.filebc.RuntimeConfiguration", "com.sun.jbi.filebc.messages.Bundle"))); + //jbiContext.expects(atLeastOnce()).method("getLogger").with(eq("com.sun.jbi.filebc.InboundMessageProcessor"), eq("com.sun.jbi.filebc.messages.Bundle")).will(returnValue(Logger.getLogger("com.sun.jbi.filebc.InboundMessageProcessor", "com.sun.jbi.filebc.messages.Bundle"))); + //jbiContext.expects(atLeastOnce()).method("getLogger").with(eq("com.sun.jbi.filebc.OutboundMessageProcessor"), eq("com.sun.jbi.filebc.messages.Bundle")).will(returnValue(Logger.getLogger("com.sun.jbi.filebc.OutboundMessageProcessor", "com.sun.jbi.filebc.messages.Bundle"))); + jbiContext.expects(atLeastOnce()).method("getMBeanServer").will(returnValue(mbServer.proxy())); + jbiContext.expects(atLeastOnce()).method("getMBeanNames").will(returnValue(mBeanNames.proxy())); + mbServer.expects(atLeastOnce()).method("isRegistered").will(returnValue(true)); + jbiContext.expects(atLeastOnce()).method("getComponentName").will(returnValue("someComponentName")); + jbiContext.expects(atLeastOnce()).method("getWorkspaceRoot").will(returnValue("test/com/sun/jbi/filebc/testDir")); + jbiContext.expects(atLeastOnce()).method("getDeliveryChannel").will(returnValue(deliveryChannel.proxy())); + //deliveryChannel.expects(atLeastOnce()).method("accept").will(returnValue((MessageExchange) mock(MessageExchange.class).proxy())); + jbiContext.expects(atLeastOnce()).method("getInstallRoot").will(returnValue("test/com/sun/jbi/filebc/testDir")); + + jbiContext.expects(atLeastOnce()).method("getLogger").with(eq(MessagingChannel.class.getName()), eq(null)).will(returnValue(Logger.getLogger(MessagingChannel.class.getName(), null))); + jbiContext.expects(atLeastOnce()).method("activateEndpoint"); + //mBeanNames.expects(atLeastOnce()).method("createCustomComponentMBeanName").with(eq("Statistics")).will(returnValue(new ObjectName("com.sun.jbi:ComponentName=sun-file-binding,ComponentType=Installed,ControlType=Custom,CustomControlName=Statistics,InstalledType=Binding,JbiName=server"))); + mBeanNames.expects(atLeastOnce()).method("createCustomComponentMBeanName").will(returnValue(on.proxy())); + mStatusProviderHelper.expects(atLeastOnce()).method("registerMBean"); + + + try { + + // instance.init((ComponentContext)jbiContext.proxy()); + System.out.println("Successfully tested init for the scenario where no exception is expected."); + } catch (Exception e) { + fail("Failed to test init due to: " + e.getMessage()); + } + jbiContext.verify(); + + // 2. testing the failure scenario + jbiContext.expects(once()).method("getDeliveryChannel").will(throwException(new MessagingException("someException"))); + + try { + instance.init((ComponentContext)jbiContext.proxy()); + fail("Failed to test init when an exception should be caught - a MessagingException is raised for failure to get Delivery Channel."); + } catch (Exception e) { + System.out.println("Successfully tested init when an exception is raised."); + } + jbiContext.verify(); + }*/ + /** + * Test of shutDown method, of class com.sun.jbi.filebc.FileBindingLifeCycle. + */ +// public void testShutDown() throws Exception { +// System.out.println("Testing shutDown"); +// +// // 1. testing the success scenario +// deliveryChannel.expects(once()).method("close"); +// try { +// instance.shutDown(); +// System.out.println("Successfully tested shutDown"); +// } catch (Exception e) { +// fail("Failed to test shutDown due to: " + e.getMessage()); +// } +// +// // 2. testing the failure scenario +// deliveryChannel.expects(once()).method("close").will(throwException (new MessagingException("someException"))); +// try { +// instance.shutDown(); +// fail("Failed to test shutDown when an exception should be caught - a MessagingException should be raised for failure to close Delivery Channel."); +// } catch (Exception e) { +// System.out.println("Successfully tested shutDown when an exception is raised."); +// } +// } + /** + * Test of getServiceDescription method, of class com.sun.jbi.filebc.FileBindingLifeCycle. + */ + public void testgetServiceDescription() throws Exception { + System.out.println("Testing getServiceDescription"); + + QName serviceName = new QName("testServiceName"); + String endpointName = "testEndpointName"; + HashMap serviceUnits = new HashMap(); + List endpoints = new ArrayList(); + Endpoint endpoint = new EndpointImpl(); + Document theDoc; + + Mock serviceUnit = mock(ServiceUnit.class); + Mock serviceEndpoint = mock(ServiceEndpoint.class); + Mock document = mock(Document.class); + Mock deployer = mock(FileBindingDeployer.class, + new Class[]{ComponentContext.class, FileBindingLifeCycle.class}, + new Object[]{(ComponentContext) jbiContext.proxy(), instance}); + + theDoc = (Document) document.proxy(); + serviceEndpoint.expects(atLeastOnce()).method("getServiceName").will(returnValue(serviceName)); + serviceEndpoint.expects(atLeastOnce()).method("getEndpointName").will(returnValue(endpointName)); + + // 1. testing the scenario where there is a match + endpoint.setServiceName(serviceName); + endpoint.setEndpointName(endpointName); + endpoint.setServiceDescription(theDoc); + endpoint.setEndpointType(Endpoint.EndpointType.OUTBOUND); + endpoints.add(endpoint); + serviceUnit.expects(atLeastOnce()).method("getEndpoints").will(returnValue(endpoints)); + serviceUnits.put("someKey", (ServiceUnit) serviceUnit.proxy()); + + deployer.expects(atLeastOnce()).method("getServiceUnits").will(returnValue(serviceUnits)); + instance.setServiceUnitManager((FileBindingDeployer) deployer.proxy()); + + Document result = instance.getServiceDescription((ServiceEndpoint) serviceEndpoint.proxy()); + assertEquals(theDoc, result); + + // 2. testing the scenario where there is no match + serviceEndpoint.expects(atLeastOnce()).method("getServiceName").will(returnValue(serviceName)); + serviceEndpoint.expects(atLeastOnce()).method("getEndpointName").will(returnValue("noMatchingEndpoint")); + result = instance.getServiceDescription((ServiceEndpoint) serviceEndpoint.proxy()); + assertNull(result); + + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/FileDenormalizerTest.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/FileDenormalizerTest.java new file mode 100644 index 000000000..d5434e16f --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/FileDenormalizerTest.java @@ -0,0 +1,226 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * BEGIN_HEADER - DO NOT EDIT + * + * The contents of this file are subject to the terms + * of the Common Development and Distribution License + * (the "License"). You may not use this file except + * in compliance with the License. + * + * You can obtain a copy of the license at + * https://${package}.dev.java.net/public/CDDLv1.0.html. + * See the License for the specific language governing + * permissions and limitations under the License. + * + * When distributing Covered Code, include this CDDL + * HEADER in each file and include the License file at + * https://${package}.dev.java.net/public/CDDLv1.0.html. + * If applicable add the following below this CDDL HEADER, + * with the fields enclosed by brackets "[]" replaced with + * your own identifying information: Portions Copyright + * [year] [name of copyright owner] + */ + +/* + * @(${symbol_pound})FileDenormalizerTest.java + * + * Copyright 2004-2007 Sun Microsystems, Inc. All Rights Reserved. + * + * END_HEADER - DO NOT EDIT + */ +package com.sun.jbi.filebc; + +import com.sun.jbi.filebc.extensions.FileMessage; +import com.sun.jbi.filebc.extensions.FileOperation; +import java.io.StringReader; +import java.util.ArrayList; +import java.util.HashMap; +import javax.jbi.messaging.NormalizedMessage; +import javax.wsdl.Definition; +import javax.wsdl.Binding; +import javax.wsdl.Input; +import javax.wsdl.Output; +import javax.wsdl.Message; +import javax.wsdl.Operation; +import javax.wsdl.Part; +import javax.wsdl.Port; +import javax.wsdl.PortType; +import javax.wsdl.Service; +import javax.xml.namespace.QName; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.transform.dom.DOMSource; +import org.w3c.dom.Document; +import org.w3c.dom.Node; +import org.xml.sax.InputSource; +import org.jmock.*; + +/** + * + * @author sweng + */ +public class FileDenormalizerTest extends org.jmock.cglib.MockObjectTestCase { + + FileDenormalizer instance = new FileDenormalizer(); + Mock normalizedMsg = mock(NormalizedMessage.class); + Mock endpoint = mock(Endpoint.class); + Mock definition = mock(Definition.class); + Mock service = mock(Service.class); + Mock port = mock(Port.class); + Mock portType = mock(PortType.class); + Mock binding = mock(Binding.class); + Mock operation = mock(Operation.class); + Mock input = mock(Input.class); + Mock output = mock(Output.class); + Mock message = mock(Message.class); + Mock part = mock(Part.class); + QName operationName = QName.valueOf("test"); + String partname = ""; + byte[] data = null; + HashMap endpointOps = new HashMap(); + ArrayList operations = new ArrayList(); + ArrayList parts = new ArrayList(); + HashMap partmap = new HashMap(); + HashMap operationMeps = new HashMap(); + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + DocumentBuilder builder; + Document document; + Node node; + DOMSource source; + + public FileDenormalizerTest(String testName) { + super(testName); + } + + protected void setUp() throws Exception { + endpoint.expects(atLeastOnce()).method("getDefinition").will(returnValue(definition.proxy())); + endpoint.expects(atLeastOnce()).method("getServiceName").will(returnValue(QName.valueOf("service1"))); + endpoint.expects(atLeastOnce()).method("getEndpointName").will(returnValue("endpoint1")); + endpoint.expects(atLeastOnce()).method("getFileOperations").will(returnValue(endpointOps)); + endpoint.expects(atLeastOnce()).method("getOperationMsgExchangePattern").will(returnValue(operationMeps)); + endpoint.expects(atLeastOnce()).method("getMessagePartEncoderMapping").will(returnValue(new HashMap())); + definition.expects(atLeastOnce()).method("getService").will(returnValue((Service) service.proxy())); + service.expects(atLeastOnce()).method("getPort").will(returnValue((Port) port.proxy())); + port.expects(atLeastOnce()).method("getBinding").will(returnValue((Binding) binding.proxy())); + binding.expects(atLeastOnce()).method("getPortType").will(returnValue((PortType) portType.proxy())); + portType.expects(atLeastOnce()).method("getOperations").will(returnValue(operations)); + portType.expects(atLeastOnce()).method("getQName").will(returnValue(QName.valueOf("service1"))); + + partmap.put("part1", (Part) part.proxy()); + parts.add((Part) part.proxy()); + builder = factory.newDocumentBuilder(); + } + + protected void tearDown() throws Exception { + } + + /** + * Test of denormalize method, of class com.sun.jbi.filebc.FileDenormalizer. + */ + public void testDenormalizeCase1() throws Exception { + System.out.println("Testing denormalize case 1."); + + byte[] expResult = null; + + FileMessage fileMessage = new FileMessage(); + + // testing the following case + // operation not found + document = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument(); + node = document.createTextNode("HelloWorld"); + normalizedMsg.expects(atLeastOnce()).method("getContent").will(returnValue(new DOMSource(node))); + try { + instance.denormalize((NormalizedMessage) normalizedMsg.proxy(), + operationName, + (Endpoint) endpoint.proxy(), + fileMessage); + fail("Failed to test denormalize - an exception should've been raised by FileDenormalizer due to unmatched operation name."); + } catch (Exception e) { + } + + // testing the following case + // invalid mep + endpointOps.put(QName.valueOf("test"), (Operation) operation.proxy()); + operationMeps.put(QName.valueOf("test"), "outin"); + try { + instance.denormalize((NormalizedMessage) normalizedMsg.proxy(), + operationName, + (Endpoint) endpoint.proxy(), + fileMessage); + fail("Failed to test denormalize - an exception should've been raised by FileDenormalizer due to unmatched operation name."); + } catch (Exception e) { + } + + System.out.println("Testing denormalize case 1."); + } + + /** + * Test of denormalize method, of class com.sun.jbi.filebc.FileDenormalizer. + */ + public void testDenormalizeCase2() throws Exception { + System.out.println("Testing denormalize case 2."); + + FileMessage fileMessage = new FileMessage(); + + // testing the following case + // mep type is "inonly" + // part element is defined + // valid data + String nmsg = "" + + " " + + " " + + " HelloWorld" + + " " + + " " + + ""; + document = builder.parse(new InputSource(new StringReader(nmsg))); + node = document.getDocumentElement(); + source = new DOMSource(node); + endpointOps.put(QName.valueOf("test"), new FileOperation()); + operationMeps.put(QName.valueOf("test"), "inonly"); + operations.add((Operation) operation.proxy()); + operation.expects(atLeastOnce()).method("getName").will(returnValue("test")); + normalizedMsg.expects(atLeastOnce()).method("getContent").will(returnValue(source)); + part.expects(atLeastOnce()).method("getName").will(returnValue("part1")); + part.expects(atLeastOnce()).method("getElementName").will(returnValue(QName.valueOf("foo"))); + part.expects(atLeastOnce()).method("getTypeName").will(returnValue(QName.valueOf("foo"))); + definition.expects(atLeastOnce()).method("getMessage").will(returnValue((Message) message.proxy())); + message.expects(atLeastOnce()).method("getQName").will(returnValue(QName.valueOf("message1"))); + message.expects(atLeastOnce()).method("getOrderedParts").will(returnValue(parts)); + message.expects(once()).method("getParts").will(returnValue(partmap)); + operation.expects(once()).method("getInput").will(returnValue((Input) input.proxy())); + input.expects(once()).method("getMessage").will(returnValue((Message) message.proxy())); + try { + instance.denormalize((NormalizedMessage) normalizedMsg.proxy(), + operationName, + (Endpoint) endpoint.proxy(), + fileMessage); + } catch (Exception e) { + fail("Failed to test denormalize due to: " + e.getMessage()); + } + + // testing the following case + // mep type is "inout" + // part is defined + fileMessage.setPart("part1"); + operationMeps.put(QName.valueOf("test"), "inout"); + operation.expects(once()).method("getOutput").will(returnValue((Output) output.proxy())); + message.expects(once()).method("getPart").will(returnValue((Part) part.proxy())); + output.expects(once()).method("getMessage").will(returnValue((Message) message.proxy())); + try { + instance.denormalize((NormalizedMessage) normalizedMsg.proxy(), + operationName, + (Endpoint) endpoint.proxy(), + fileMessage); + } catch (Exception e) { + fail("Failed to test denormalize due to: " + e.getMessage()); + } + + System.out.println("Successfully tested denormalize case 2."); + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/FileNormalizerTest.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/FileNormalizerTest.java new file mode 100644 index 000000000..962165fb1 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/FileNormalizerTest.java @@ -0,0 +1,305 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * BEGIN_HEADER - DO NOT EDIT + * + * The contents of this file are subject to the terms + * of the Common Development and Distribution License + * (the "License"). You may not use this file except + * in compliance with the License. + * + * You can obtain a copy of the license at + * https://${package}.dev.java.net/public/CDDLv1.0.html. + * See the License for the specific language governing + * permissions and limitations under the License. + * + * When distributing Covered Code, include this CDDL + * HEADER in each file and include the License file at + * https://${package}.dev.java.net/public/CDDLv1.0.html. + * If applicable add the following below this CDDL HEADER, + * with the fields enclosed by brackets "[]" replaced with + * your own identifying information: Portions Copyright + * [year] [name of copyright owner] + */ + +/* + * @(${symbol_pound})FileNormalizerTest.java + * + * Copyright 2004-2007 Sun Microsystems, Inc. All Rights Reserved. + * + * END_HEADER - DO NOT EDIT + */ +package com.sun.jbi.filebc; + +import com.sun.jbi.filebc.extensions.FileMessage; +import com.sun.jbi.filebc.extensions.FileOperation; +import com.sun.jbi.filebc.util.FileStreamHandler; + +import java.io.ByteArrayInputStream; +import java.util.ArrayList; +import java.util.Map; +import java.util.HashMap; +import javax.jbi.messaging.MessageExchange; +import javax.jbi.messaging.NormalizedMessage; +import javax.xml.namespace.QName; +import javax.wsdl.Binding; +import javax.wsdl.Definition; +import javax.wsdl.Input; +import javax.wsdl.Message; +import javax.wsdl.Operation; +import javax.wsdl.Part; +import javax.wsdl.Port; +import javax.wsdl.PortType; +import javax.wsdl.Service; +import javax.xml.transform.dom.DOMSource; +import org.jmock.*; + +/** + * + * @author sweng + */ +public class FileNormalizerTest extends org.jmock.cglib.MockObjectTestCase { + + FileNormalizer instance = null; + Mock exchange = mock(MessageExchange.class); + Mock endpoint = mock(Endpoint.class); + Mock definition = mock(Definition.class); + Mock service = mock(Service.class); + Mock port = mock(Port.class); + Mock portType = mock(PortType.class); + Mock binding = mock(Binding.class); + Mock operation = mock(Operation.class); + Mock input = mock(Input.class); + Mock message = mock(Message.class); + Mock part = mock(Part.class); + Mock normalizedMsg = mock(NormalizedMessage.class); + QName operationName = QName.valueOf("test"); + String partname = ""; + byte[] data = null; + ArrayList operations = new ArrayList(); + ArrayList parts = new ArrayList(); + HashMap partmap = new HashMap(); + Map fileOps = new HashMap(); + FileOperation fileOp = new FileOperation(); + + public FileNormalizerTest(String testName) { + super(testName); + try { + instance = new FileNormalizer(); + } catch (Exception ex) { + // let later test detect and fail + } + + } + + protected void setUp() throws Exception { + normalizedMsg.expects(atLeastOnce()).method("setContent").with(isA(DOMSource.class)); + endpoint.expects(atLeastOnce()).method("getDefinition").will(returnValue(definition.proxy())); + endpoint.expects(atLeastOnce()).method("getServiceName").will(returnValue(QName.valueOf("service1"))); + endpoint.expects(atLeastOnce()).method("getEndpointName").will(returnValue("endpoint1")); + endpoint.expects(atLeastOnce()).method("getMessagePartEncoderMapping").will(returnValue(new HashMap())); + definition.expects(atLeastOnce()).method("getService").will(returnValue((Service) service.proxy())); + service.expects(atLeastOnce()).method("getPort").will(returnValue((Port) port.proxy())); + port.expects(atLeastOnce()).method("getBinding").will(returnValue((Binding) binding.proxy())); + binding.expects(atLeastOnce()).method("getPortType").will(returnValue((PortType) portType.proxy())); + portType.expects(atLeastOnce()).method("getOperations").will(returnValue(operations)); + operation.expects(atLeastOnce()).method("getInput").will(returnValue((Input) input.proxy())); + input.expects(atLeastOnce()).method("getMessage").will(returnValue((Message) message.proxy())); + message.expects(atLeastOnce()).method("getQName").will(returnValue(QName.valueOf("message1"))); + message.expects(atLeastOnce()).method("getOrderedParts").will(returnValue(parts)); + + QName portTypeQName = new QName(""); + fileOps.put(operationName, fileOp); + portType.expects(atLeastOnce()).method("getQName").will(returnValue(portTypeQName)); + endpoint.expects(atLeastOnce()).method("getFileOperations").will(returnValue(fileOps)); + + partmap.put("part1", (Part) part.proxy()); + parts.add((Part) part.proxy()); + } + + protected void tearDown() throws Exception { + } + + /** + * Test of normalize method, of class com.sun.jbi.filebc.FileNormalizer. + */ + public void testNormalizeCase1() throws Exception { + System.out.println("Testing normalize case 1."); + + NormalizedMessage result = null; + + //setting up + FileMessage fileMessage = new FileMessage(); + exchange.expects(atLeastOnce()).method("createMessage").will(returnValue((NormalizedMessage) normalizedMsg.proxy())); + message.expects(atLeastOnce()).method("getParts").will(returnValue(partmap)); + operations.add((Operation) operation.proxy()); + + // testing the following case + // 1. no matching operation + operation.expects(atLeastOnce()).method("getName").will(returnValue("blah")); + + if (instance == null) { + fail("Failed to test normalize - normalizer instance not available."); + } + + try { + result = instance.normalize((MessageExchange) exchange.proxy(), + operationName, + (Endpoint) endpoint.proxy(), + fileMessage, + null, + false); + fail("Failed to test normalize - an exception should've been raised by FileNormalizer because no operation name match can be found."); + } catch (Exception e) { + } + + + // testing the following case + // 1. no part name defined + // 2. part element is defined + + operation.expects(atLeastOnce()).method("getName").will(returnValue("test")); + part.expects(atLeastOnce()).method("getName").will(returnValue("part1")); + part.expects(atLeastOnce()).method("getElementName").will(returnValue(QName.valueOf("foo"))); + part.expects(atLeastOnce()).method("getTypeName").will(returnValue(QName.valueOf("foo"))); + data = "helloWorld".getBytes(); + + try { + FileStreamHandler streamHandler = new FileStreamHandler( + new ByteArrayInputStream(data), false, new byte[0], -1, + data.length); + + result = instance.normalize((MessageExchange) exchange.proxy(), + operationName, + (Endpoint) endpoint.proxy(), + fileMessage, + streamHandler, false); + assertTrue(result instanceof NormalizedMessage); + } catch (Exception e) { + e.printStackTrace(); + fail("Failed to test normalize due to: " + e.getMessage()); + } + + // testing the following case + // 1. no part name defined + // 2. part element defined + // 3. malformed data + data = "helloWorld".getBytes(); + try { + FileStreamHandler streamHandler = new FileStreamHandler( + new ByteArrayInputStream(data), false, null, -1, + data.length); + result = instance.normalize((MessageExchange) exchange.proxy(), + operationName, + (Endpoint) endpoint.proxy(), + fileMessage, + streamHandler, false); + fail("Failed to test normalize - an exception should've been raised by FileNormalizer due to malformed xml data"); + } catch (Exception e) { + } + + // testing the following case + // 1. no part name defined + // 2. part element defined + // 3. invalid data + data = "HelloWorld".getBytes(); + try { + FileStreamHandler streamHandler = new FileStreamHandler( + new ByteArrayInputStream(data), false, null, -1, + data.length); + result = instance.normalize((MessageExchange) exchange.proxy(), + operationName, + (Endpoint) endpoint.proxy(), + fileMessage, + streamHandler, false); + fail("Failed to test normalize - an exception should've been raised by FileNormalizer due to data type mismatch"); + } catch (Exception e) { + } + + System.out.print("Successfully tested normalize case 1."); + } + + /** + * Test of normalize method, of class com.sun.jbi.filebc.FileNormalizer. + */ + public void testNormalizeCase2() throws Exception { + System.out.println("Testing normalize case 2."); + + NormalizedMessage result = null; + + //setting up + FileMessage fileMessage = new FileMessage(); + fileMessage.setPart("part1"); + exchange.expects(atLeastOnce()).method("createMessage").will(returnValue((NormalizedMessage) normalizedMsg.proxy())); + message.expects(atLeastOnce()).method("getPart").with(eq("part1")).will(returnValue((Part) part.proxy())); + part.expects(atLeastOnce()).method("getElementName").will(returnValue(null)); + operation.expects(atLeastOnce()).method("getName").will(returnValue("test")); + operations.add((Operation) operation.proxy()); + + // testing the following case + // 1. part name is defined + // 2. part type is a complex type + + part.expects(atLeastOnce()).method("getName").will(returnValue("part1")); + part.expects(atLeastOnce()).method("getTypeName").will(returnValue(QName.valueOf("testType"))); + data = "helloWorld".getBytes(); + + if (instance == null) { + fail("Failed to test normalize - normalizer instance not available."); + } + + try { + FileStreamHandler streamHandler = new FileStreamHandler( + new ByteArrayInputStream(data), false, new byte[0], -1, + data.length); + result = instance.normalize((MessageExchange) exchange.proxy(), + operationName, + (Endpoint) endpoint.proxy(), + fileMessage, + streamHandler, false); + assertTrue(result instanceof NormalizedMessage); + } catch (Exception e) { + e.printStackTrace(); + fail("Failed to test normalize due to: " + e.getMessage()); + } + + // testing the following case + // 1. part name + // 2. malformed data + data = "helloWorld".getBytes(); + try { + FileStreamHandler streamHandler = new FileStreamHandler( + new ByteArrayInputStream(data), false, new byte[0], -1, + data.length); + result = instance.normalize((MessageExchange) exchange.proxy(), + operationName, + (Endpoint) endpoint.proxy(), + fileMessage, + streamHandler, false); + fail("Failed to test normalize - an exception should've been raised by FileNormalizer due to malformed xml data"); + } catch (Exception e) { + } + + // testing the following case + // 1. part name defined + // 2. simple type + part.expects(atLeastOnce()).method("getTypeName").will(returnValue(new QName("http://www.w3.org/2001/XMLSchema", "string"))); + data = "HelloWorld".getBytes(); + try { + FileStreamHandler streamHandler = new FileStreamHandler( + new ByteArrayInputStream(data), false, new byte[0], -1, + data.length); + result = instance.normalize((MessageExchange) exchange.proxy(), + operationName, + (Endpoint) endpoint.proxy(), + fileMessage, + streamHandler, false); + + } catch (Exception e) { + fail("Failed to test normalize due to: " + e.getMessage()); + } + + System.out.print("Successfully tested normalize case 2."); + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/InboundMessageProcessorTest.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/InboundMessageProcessorTest.java new file mode 100644 index 000000000..4bbef468c --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/InboundMessageProcessorTest.java @@ -0,0 +1,1565 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * BEGIN_HEADER - DO NOT EDIT + * + * The contents of this file are subject to the terms + * of the Common Development and Distribution License + * (the "License"). You may not use this file except + * in compliance with the License. + * + * You can obtain a copy of the license at + * https://${package}.dev.java.net/public/CDDLv1.0.html. + * See the License for the specific language governing + * permissions and limitations under the License. + * + * When distributing Covered Code, include this CDDL + * HEADER in each file and include the License file at + * https://${package}.dev.java.net/public/CDDLv1.0.html. + * If applicable add the following below this CDDL HEADER, + * with the fields enclosed by brackets "[]" replaced with + * your own identifying information: Portions Copyright + * [year] [name of copyright owner] + */ + +/* + * @(${symbol_pound})InboundMessageProcessorTest.java + * + * Copyright 2004-2007 Sun Microsystems, Inc. All Rights Reserved. + * + * END_HEADER - DO NOT EDIT + */ +package com.sun.jbi.filebc; + +import junit.framework.*; +import com.sun.jbi.eManager.provider.EndpointStatus; +import com.sun.jbi.filebc.extensions.FileOperation; +import com.sun.jbi.filebc.extensions.FileAddress; +import com.sun.jbi.filebc.extensions.FileInput; +import com.sun.jbi.filebc.extensions.FileOutput; +import com.sun.jbi.filebc.extensions.FileMessage; +import com.sun.jbi.common.qos.messaging.MessagingChannel; + +import com.sun.jbi.filebc.util.FileUtil; +import com.sun.jbi.filebc.util.InputFilenameFilter; +import com.sun.jbi.filebc.util.InputDirFilter; + +import java.io.File; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.locks.ReentrantLock; +import javax.jbi.component.ComponentContext; +import javax.jbi.messaging.DeliveryChannel; +import javax.jbi.messaging.InOnly; +import javax.jbi.messaging.InOut; +import javax.jbi.messaging.ExchangeStatus; +import javax.jbi.messaging.MessageExchange; +import javax.jbi.messaging.MessageExchangeFactory; +import javax.jbi.messaging.NormalizedMessage; +import javax.jbi.servicedesc.ServiceEndpoint; +import javax.xml.namespace.QName; +import java.io.FileOutputStream; +import java.io.FilenameFilter; +import java.util.UUID; +import java.util.concurrent.LinkedBlockingQueue; +import javax.wsdl.Binding; +import javax.wsdl.Definition; +import javax.wsdl.Port; +import javax.wsdl.PortType; +import javax.wsdl.Service; +import org.jmock.*; + +/** + * + * @author sweng + */ +public class InboundMessageProcessorTest extends org.jmock.cglib.MockObjectTestCase { + + static final QName THE_OPERATION = new QName("myoperation"); + private static final String strEPName = "myEndpointName"; + private static final String strServiceName = "myServiceName"; + static final QName THE_SERVICE = new QName(strServiceName); + static final String THE_ENDPOINT = strEPName; + static final int THE_TYPE = 0; + InboundMessageProcessor instance = null; + IBFileWorker worker = null; + Map services = null; + Mock deliveryChannel = null; + Mock componentContext = null; + Mock endpoint = null; + Mock endpointStatus = null; + Mock serviceEndpoint = null; + Mock msgExchange = null; + Mock msgExchangeFactory = null; + Mock normalizer = null; + Mock normalizedMsg = null; + Mock wsdlDefinition = null; + Mock service = null; + Mock port = null; + Mock portType = null; + Mock binding = null; + Map operations = new HashMap(); + Map operationMeps = new HashMap(); + File mWorkAreaBaseDir; + int maxCC = 5; + + public InboundMessageProcessorTest(String testName) { + super(testName); + } + + protected void setUp() throws Exception { + componentContext = mock(ComponentContext.class); + deliveryChannel = mock(MessagingChannel.class); + endpoint = mock(Endpoint.class); + endpointStatus = mock(EndpointStatus.class); + serviceEndpoint = mock(ServiceEndpoint.class); + msgExchangeFactory = mock(MessageExchangeFactory.class); + msgExchange = mock(MessageExchange.class); + normalizer = mock(FileNormalizer.class); + normalizedMsg = mock(NormalizedMessage.class); + wsdlDefinition = mock(Definition.class); + service = mock(Service.class); + port = mock(Port.class); + portType = mock(PortType.class); + binding = mock(Binding.class); + + services = new HashMap(); + services.put(THE_SERVICE, (Service) service.proxy()); + + String epUUID = "IB".concat(UUID.nameUUIDFromBytes(strServiceName.concat(strEPName).getBytes()).toString()); + endpoint.expects(atLeastOnce()).method("getEPUUID").will(returnValue(epUUID)); + endpoint.expects(atLeastOnce()).method("getServiceName").will(returnValue(THE_SERVICE)); + endpoint.expects(atLeastOnce()).method("getEndpointName").will(returnValue(THE_ENDPOINT)); + endpoint.expects(atLeastOnce()).method("getDefinition").will(returnValue(wsdlDefinition.proxy())); + wsdlDefinition.expects(atLeastOnce()).method("getServices").will(returnValue((Map) services)); + service.expects(atLeastOnce()).method("getPort").will(returnValue((Port) port.proxy())); + port.expects(atLeastOnce()).method("getBinding").will(returnValue((Binding) binding.proxy())); + binding.expects(atLeastOnce()).method("getPortType").will(returnValue((PortType) portType.proxy())); + portType.expects(atLeastOnce()).method("getQName").will(returnValue(QName.valueOf("portType1"))); + + deliveryChannel.expects(atLeastOnce()).method("createExchangeFactory").will(returnValue(msgExchangeFactory.proxy())); + + FileComponentContext.getInstance().setBindingChannel((MessagingChannel) deliveryChannel.proxy()); + + //String key = strServiceName + strEPName; + String baseWorkDir = "test/com/sun/jbi/filebc/input/" + strServiceName + "/" + strEPName; + mWorkAreaBaseDir = new File(baseWorkDir); + mWorkAreaBaseDir.mkdirs(); + String lockFilePath = baseWorkDir + File.separator + "filebc.lck"; + + File lockFile = new File(lockFilePath); + lockFile.createNewFile(); + FileOutputStream fos = new FileOutputStream(lockFile); + LockRegistry.register(epUUID, new Lock((fos != null ? fos.getChannel() : null), new ReentrantLock(), lockFilePath)); + + instance = new InboundMessageProcessor((ComponentContext) componentContext.proxy(), + (DeliveryChannel) deliveryChannel.proxy(), + (Endpoint) endpoint.proxy(), + THE_OPERATION,5); + } + + protected void tearDown() throws Exception { + } + + public static Test suite() { + TestSuite suite = new TestSuite(InboundMessageProcessorTest.class); + + return suite; + } + + /** + * Test of run method, of class com.sun.jbi.filebc.InboundMessageProcessor + * for the scenario where the message exchange pattern is not valid + */ + public void testRunInvalidMEP() { + System.out.println("Testing run() for the scenario where the message exchange pattern is not valid"); + + FileOperation fileoperation = new FileOperation(); + operations.put(THE_OPERATION, fileoperation); + + FileInput fileInput = new FileInput(); + fileInput.setFileMessage(new FileMessage()); + fileoperation.setFileOperationInput(fileInput); + + FileAddress addr = new FileAddress(); + addr.setFileDirectory("test/com/sun/jbi/filebc/input"); + endpoint.expects(atMostOnce()).method("getEndpointName").will(returnValue(THE_ENDPOINT)); + endpoint.expects(atLeastOnce()).method("getFileOperations").will(returnValue(operations)); + endpoint.expects(atLeastOnce()).method("getOperationMsgExchangePattern").will(returnValue(operationMeps)); + + // 1. testing the case where message exchange pattern is not found (null) + operationMeps.remove(THE_OPERATION); + operationMeps.put("dummyOperation", "inonly"); + + instance.stopReceiving(); + // for junit testing - avoid multiple inbound worker threads + instance.run(); + + // 2. testing the case where message exchange status is invalid (not inonly or inout) + operationMeps.put(THE_OPERATION, "outin"); + instance.run(); + } + + /** + * Test of execute method, of class com.sun.jbi.filebc.InboundMessageProcessor + * for the scenario where basic file extensibility element attribute validation fails. + */ + public void testValidateInboundMessageProperties() { + System.out.println("Testing basic runtime wsdl validation"); + + String mep = "outin"; + FileOperation operation = new FileOperation(); + FileInput fileInput = new FileInput(); + FileOutput fileOutput = new FileOutput(); + FileMessage fileMessage = new FileMessage(); + + // testing an invalid mep + try { + instance.validateInboundMessageExchangeProperties(operation, mep); + fail("Failed to test validateInboundMessageProperties - an exception should be raised due to invalid message exchange pattern: " + mep); + } catch (Exception e) { + System.out.println("Successfully tested validateInboundMessageProperties with an invalid message exchange pattern: " + mep); + } + + // testing another invalid mep + mep = "unsupported"; + try { + instance.validateInboundMessageExchangeProperties(operation, mep); + fail("Failed to test validateInboundMessageProperties - an exception should be raised due to invalid message exchange pattern: " + mep); + } catch (Exception e) { + System.out.println("Successfully tested validateInboundMessageProperties with an invalid message exchange pattern: " + mep); + } + + mep = "inonly"; + // testing null input properties + try { + instance.validateInboundMessageExchangeProperties(operation, mep); + fail("Failed to test validateInboundMessageProperties - an exception should be raised due to null File Input properties."); + } catch (Exception e) { + System.out.println("Successfully tested validateInboundMessageProperties with null File Input properties."); + } + + // testing null File read properties + operation.setFileOperationInput(fileInput); + try { + instance.validateInboundMessageExchangeProperties(operation, mep); + fail("Failed to test validateInboundMessageProperties - an exception should be raised due to null File Read properties."); + } catch (Exception e) { + System.out.println("Successfully tested validateInboundMessageProperties with null File Read properties."); + } + + // testing missing required File Read attributes + operation.setFileOperationInput(fileInput); + fileInput.setFileMessage(fileMessage); + try { + instance.validateInboundMessageExchangeProperties(operation, mep); + fail("Failed to test validateInboundMessageProperties - an exception should be raised due to missing required File Read attribute: pollingMillis."); + } catch (Exception e) { + System.out.println("Successfully tested validateInboundMessageProperties: missing required File Read attribute: pollingMillis."); + } + + operation.setFileOperationInput(fileInput); + fileInput.setFileMessage(fileMessage); + fileMessage.setPollingInterval(new Long(5000)); + try { + instance.validateInboundMessageExchangeProperties(operation, mep); + fail("Failed to test validateInboundMessageProperties - an exception should be raised due to missing required File Read attribute: fileName."); + } catch (Exception e) { + System.out.println("Successfully tested validateInboundMessageProperties: missing required File Read attribute: fileName."); + } + + // testing invalid File Read attribute value + fileMessage.setFileType("stream"); + try { + instance.validateInboundMessageExchangeProperties(operation, mep); + fail("Failed to test validateInboundMessageProperties - an exception should be raised due to invalid File Read attribute value: fileType is stream."); + } catch (Exception e) { + System.out.println("Successfully tested validateInboundMessageProperties: invalid File Read attribute value: fileType is stream."); + } + + // testing with in-out mep + // testing with null File output properties + mep = "inout"; + operation.setFileOperationOutput(fileOutput); + try { + instance.validateInboundMessageExchangeProperties(operation, mep); + fail("Failed to test validateInboundMessageProperties - an exception should be raised due to null File Output properties."); + } catch (Exception e) { + System.out.println("Successfully tested validateInboundMessageProperties with null File Output properties."); + } + + // testing missing required File write attributes + try { + instance.validateInboundMessageExchangeProperties(operation, mep); + fail("Failed to test validateInboundMessageProperties - an exception should be raised due to undefined fileName attribute when fileNameIsPattern is false."); + } catch (Exception e) { + System.out.println("Successfully tested validateInboundMessageProperties when fileName is not defined and fileNameIsPattern is false."); + } + + fileMessage.setFileNameIsPattern(Boolean.TRUE); + try { + instance.validateInboundMessageExchangeProperties(operation, mep); + fail("Failed to test validateInboundMessageProperties - an exception should be raised due to undefined filePrefix and fileExtension attributes when fileNameIsPattern is true."); + } catch (Exception e) { + System.out.println("Successfully tested validateInboundMessageProperties when both filePrefix and fileExtension are not defined and fileNameIsPattern is true."); + } + + // testing invalid File Write attribute value + fileMessage.setFileType("undefined"); + try { + instance.validateInboundMessageExchangeProperties(operation, mep); + fail("Failed to test validateInboundMessageProperties - an exception should be raised due to invalid File Write attribute value: fileType is undefined."); + } catch (Exception e) { + System.out.println("Successfully tested validateInboundMessageProperties: invalid File Write attribute value: fileType is undefined."); + } + + System.out.println("Successfully tested basic runtime wsdl validation"); + } + + /** + * Test of execute method, of class com.sun.jbi.filebc.InboundMessageProcessor + * for the scenario where the message exchange type is inonly. + */ + public void testExecuteInOnlyExchangeCase1() { + System.out.println("Testing in-only message exchange case 1..."); + + FileInput fileInput = new FileInput(); + FileMessage fileMessage = new FileMessage(); + FileAddress fileAddress = new FileAddress(); + msgExchange = mock(InOnly.class); + + fileAddress.setFileDirectory("test/com/sun/jbi/filebc/input"); + + fileAddress.setLockName(Lock.DEFAULT_INBOUND_LOCKFILE_NAME); + fileAddress.setWorkArea(Lock.DEFAULT_INBOUND_TMPDIR_NAME); + fileAddress.setSeqName(Lock.DEFAULT_SEQFILE_NAME); + + // after cluster support changes + // processed files are no longer marked just as _processed and still stay at the same directory + // instead, it is either deleted (if archive = false) or UUID tagged and _processed suffixed as _processed and + // moved to archive directory (if archive = true) + // keep it here - in case in some test context inheritated from past - this file can be removed + // before test starts + String inputFile = fileAddress.getFileDirectory().concat("/InputInOnly.txt"); + String testFile = fileAddress.getFileDirectory().concat("/TestInputInOnly.txt"); + + // endpoint specific archive, tmp and errDir + String archiveDir = mWorkAreaBaseDir.getAbsolutePath().concat("/" + FileMessage.FILE_ARCHIVE_DIR_DEFAULT); + String tmpDir = mWorkAreaBaseDir.getAbsolutePath().concat("/" + Lock.DEFAULT_INBOUND_TMPDIR_NAME); + String errDir = mWorkAreaBaseDir.getAbsolutePath() + File.separator + FileUtil.DEFAULT_ERRORS_DIR_NAME; + + // after cluster support changes, the error marked files are kept in working area - default location is /filebc-in-processing + // the file name looks like: _error + // create the lock for inbound + cleanup(new String[]{archiveDir, tmpDir, errDir}, "Failed to create input file to test execute for InOnly message exchanges: "); + validateAndPrepareTestFiles(inputFile, testFile, "Failed to create input file to test execute for InOnly message exchanges: "); + + // Testing the following scenario + // 1. no file name match pattern + // 2. successful "normalization" + // 3. successful msgexchange.send + + fileMessage.setFileName("TestInputInOnly.txt"); + fileMessage.setPollingInterval(new Long(5000)); + fileMessage.setFileNameIsRegex(Boolean.FALSE); + fileInput.setFileMessage(fileMessage); + + deliveryChannel.expects(atLeastOnce()).method("createExchangeFactory").will(returnValue(msgExchangeFactory.proxy())); + msgExchangeFactory.expects(atLeastOnce()).method("createInOnlyExchange").will(returnValue((InOnly) msgExchange.proxy())); + componentContext.expects(atLeastOnce()).method("getEndpoint").with(eq(THE_SERVICE), eq(THE_ENDPOINT)).will(returnValue((ServiceEndpoint) serviceEndpoint.proxy())); + msgExchange.expects(atLeastOnce()).method("getExchangeId"); + normalizer.expects(atLeastOnce()).method("normalize").withAnyArguments().will(returnValue((NormalizedMessage) normalizedMsg.proxy())); + msgExchange.expects(once()).method("setEndpoint").with(isA(ServiceEndpoint.class)); + msgExchange.expects(once()).method("setOperation").with(eq(THE_OPERATION)); + msgExchange.expects(once()).method("setMessage").with(eq(normalizedMsg.proxy()), eq("in")); + + deliveryChannel.expects(once()).method("send").with(eq(msgExchange.proxy())); + endpoint.expects(atLeastOnce()).method("getServiceName").will(returnValue(THE_SERVICE)); + endpoint.expects(atLeastOnce()).method("getEndpointName").will(returnValue(THE_ENDPOINT)); + endpoint.expects(atLeastOnce()).method("getEndpointType").will(returnValue(THE_TYPE)); + endpoint.expects(once()).method("getEndpointStatus").will(returnValue(endpointStatus.proxy())); + endpointStatus.expects(once()).method("incrementSentRequests"); + + // QOS: Re-delivery + msgExchange.expects(atLeastOnce()).method("getProperty").with(eq(FileComponentContext.CRMP_GROUP_ID)).will(returnValue(ANYTHING)); + msgExchange.expects(atLeastOnce()).method("getProperty").with(eq(FileComponentContext.CRMP_MESSAGE_ID)).will(returnValue(ANYTHING)); + deliveryChannel.expects(once()).method("getServiceQuality"); + + // NM Properties related expectations + normalizedMsg.expects(atLeastOnce()).method("getProperty"); + normalizedMsg.expects(atLeastOnce()).method("setProperty"); + + // set no throttling + endpoint.expects(atLeastOnce()).method("getMaxConcurrencyLimit").will(returnValue(-1)); + + endpoint.expects(atLeastOnce()).method("getServiceUnitID"); + + try { + AtomicInteger maxFilesPerPoll = new AtomicInteger(20); + InputDirFilter dirFilter = /*new InputDirFilter("")*/ null; + InputFilenameFilter fileFilter = /*new InputFilenameFilter(fileInput.getFileMessage().getFileName(), "", maxFilesPerPoll, false)*/ null; + + instance.addWorker(worker = new IBFileWorker(instance, "inonly", fileMessage, + new File(fileAddress.getFileDirectory()), mWorkAreaBaseDir)); + worker.setNormalizer((FileNormalizer) normalizer.proxy()); + instance.setLock(createLock(fileAddress.getFileDirectory(), fileAddress.getLockName())); + instance.setStopped(true); // let the worker loop once and quit + instance.setFiles(new LinkedBlockingQueue()); + instance.execute("inonly", + fileAddress.getFileDirectory(), + "TestInputInOnly.txt", + Boolean.FALSE, + fileInput, + fileAddress, + maxFilesPerPoll, + fileFilter, + dirFilter,maxCC); + + Thread.sleep(5000); + // since it is a mocked framework - there is no Outbound processor to invoke the replyMessage(...) + // which actually do the _processed suffixing and moving the input from work area to archive area + // so it is good enough to assert that the UUID tagged input file is in work area + assertTrue("Failed to find the input file in tmp dir...", hasFilesWithSuffix(tmpDir, "")); + } catch (Exception e) { + e.printStackTrace(); + fail("Failed to test InOnly exchanges due to: " + e.getMessage()); + } + + verifyContract(); + cleanup(new String[]{archiveDir, tmpDir, errDir}, "Failed to create input file to test execute for InOnly message exchanges: "); + + // Testing the following scenario + // 1. no file name match pattern + // 2. Unsuccessful "normalization" + validateAndPrepareTestFiles(inputFile, testFile, "Failed to create input file to test execute for InOnly message exchanges: "); + + normalizer.expects(atLeastOnce()).method("normalize").withAnyArguments().will(throwException(new Exception("Failed to normalize"))); + + try { + AtomicInteger maxFilesPerPoll = new AtomicInteger(20); + InputDirFilter dirFilter = /*new InputDirFilter("")*/ null; + InputFilenameFilter fileFilter = /*new InputFilenameFilter(fileInput.getFileMessage().getFileName(), "", maxFilesPerPoll, false)*/ null; + + instance.setWorkers(null); + instance.addWorker(worker = new IBFileWorker(instance, "inonly", fileMessage, + new File(fileAddress.getFileDirectory()), mWorkAreaBaseDir)); + worker.setNormalizer((FileNormalizer) normalizer.proxy()); + instance.setLock(createLock(fileAddress.getFileDirectory(), fileAddress.getLockName())); + instance.setStopped(true); // let the worker loop once and quit + instance.execute("inonly", + fileAddress.getFileDirectory(), + "TestInputInOnly.txt", + Boolean.FALSE, + fileInput, + fileAddress, + maxFilesPerPoll, + fileFilter, + dirFilter,maxCC); + Thread.sleep(5000); + // now there are worker threads spin off by execute(), the exception "Failed to normalize" is thrown + // in the run method of IBFileWorker and is captured and logged and + // the offending message is marked as _error and will stay in the + // work area - tmp dir + // the next best assertion for this scenario is to assert that the _error file is there + assertTrue("Failed to find the _error suffixed input file in error dir...", hasFilesWithSuffix(errDir, FileUtil.getErrorFileSuffix())); + //fail("Failed to test in-only message exchange when an expected exception should be caught"); + } catch (Exception e) { +// System.out.println("Caught the expected exception!!"); + fail("Failed to test execute for InOnly message exchanges with Exception 'Failed to normalize': " + e.getMessage()); + } + verifyContract(); + System.out.println("Successfully tested in-only message exchange case 1"); + } + + /** + * Test of execute method, of class com.sun.jbi.filebc.InboundMessageProcessor + * for the scenario where the message exchange type is inonly. + */ + public void testExecuteInOnlyExchangeCase2() { + System.out.println("Testing in-only message exchange case 2..."); + + FileInput fileInput = new FileInput(); + FileMessage fileMessage = new FileMessage(); + FileAddress fileAddress = new FileAddress(); + msgExchange = mock(InOnly.class); + + fileAddress.setFileDirectory("test/com/sun/jbi/filebc/input"); + + fileAddress.setLockName(Lock.DEFAULT_INBOUND_LOCKFILE_NAME); + fileAddress.setWorkArea(Lock.DEFAULT_INBOUND_TMPDIR_NAME); + fileAddress.setSeqName(Lock.DEFAULT_SEQFILE_NAME); + + // after cluster support changes + // processed files are no longer marked just as _processed and still stay at the same directory + // instead, it is either deleted (if archive = false) or UUID tagged and _processed suffixed as _processed and + // moved to archive directory (if archive = true) + String inputFile = fileAddress.getFileDirectory().concat("/InputInOnly.txt"); + String testFile = fileAddress.getFileDirectory().concat("/I8n.dat"); + + String archiveDir = mWorkAreaBaseDir.getAbsolutePath().concat("/" + FileMessage.FILE_ARCHIVE_DIR_DEFAULT); + String tmpDir = mWorkAreaBaseDir.getAbsolutePath().concat("/" + Lock.DEFAULT_INBOUND_TMPDIR_NAME); + String errDir = mWorkAreaBaseDir.getAbsolutePath() + File.separator + FileUtil.DEFAULT_ERRORS_DIR_NAME; + + cleanup(new String[]{archiveDir, tmpDir, errDir}, "Failed to clean up archive directory and filebc-in-processing directory to test execute for InOnly message exchanges: "); + validateAndPrepareTestFiles(inputFile, testFile, "Failed to create input file to test execute for InOnly message exchanges: "); + + // Testing the following scenario + // 1. file name is pattern + // 2. successful "normalization" + // 3. successful msgexchange.send + fileMessage.setFileName("Input%u.txt"); + fileMessage.setPollingInterval(new Long(5000)); + fileInput.setFileMessage(fileMessage); + + deliveryChannel.expects(atLeastOnce()).method("createExchangeFactory").will(returnValue(msgExchangeFactory.proxy())); + msgExchangeFactory.expects(atLeastOnce()).method("createInOnlyExchange").will(returnValue((InOnly) msgExchange.proxy())); + componentContext.expects(atLeastOnce()).method("getEndpoint").with(eq(THE_SERVICE), eq(THE_ENDPOINT)).will(returnValue((ServiceEndpoint) serviceEndpoint.proxy())); + msgExchange.expects(atLeastOnce()).method("getExchangeId"); + normalizer.expects(atLeastOnce()).method("normalize").withAnyArguments().will(returnValue((NormalizedMessage) normalizedMsg.proxy())); + msgExchange.expects(once()).method("setEndpoint").with(isA(ServiceEndpoint.class)); + msgExchange.expects(once()).method("setOperation").with(eq(THE_OPERATION)); + msgExchange.expects(once()).method("setMessage").with(eq(normalizedMsg.proxy()), eq("in")); + + deliveryChannel.expects(once()).method("send").with(eq(msgExchange.proxy())); + //endpoint.expects(atLeastOnce()).method("getServiceName").will(returnValue(THE_SERVICE)); + endpoint.expects(atLeastOnce()).method("getEndpointName").will(returnValue(THE_ENDPOINT)); + endpoint.expects(once()).method("getEndpointStatus").will(returnValue(endpointStatus.proxy())); + endpoint.expects(atLeastOnce()).method("getEndpointType").will(returnValue(THE_TYPE)); + endpointStatus.expects(once()).method("incrementSentRequests"); + + // QOS: Re-delivery + msgExchange.expects(atLeastOnce()).method("getProperty").with(eq(FileComponentContext.CRMP_GROUP_ID)).will(returnValue(ANYTHING)); + msgExchange.expects(atLeastOnce()).method("getProperty").with(eq(FileComponentContext.CRMP_MESSAGE_ID)).will(returnValue(ANYTHING)); + deliveryChannel.expects(once()).method("getServiceQuality"); + + // NM Properties related expectations + normalizedMsg.expects(atLeastOnce()).method("getProperty"); + normalizedMsg.expects(atLeastOnce()).method("setProperty"); + + // set no throttling + endpoint.expects(atLeastOnce()).method("getMaxConcurrencyLimit").will(returnValue(-1)); + + endpoint.expects(atLeastOnce()).method("getServiceUnitID"); + + try { + AtomicInteger maxFilesPerPoll = new AtomicInteger(20); + InputDirFilter dirFilter = /*new InputDirFilter("")*/ null; + InputFilenameFilter fileFilter = new InputFilenameFilter(fileInput.getFileMessage().getFileName(), "", maxFilesPerPoll, false); + + instance.addWorker(worker = new IBFileWorker(instance, "inonly", fileMessage, + new File(fileAddress.getFileDirectory()), mWorkAreaBaseDir)); + worker.setNormalizer((FileNormalizer) normalizer.proxy()); + instance.setLock(createLock(fileAddress.getFileDirectory(), fileAddress.getLockName())); + instance.setStopped(true); // let the worker loop once and quit + instance.setFiles(new LinkedBlockingQueue()); + fileFilter.setFilterExpression("I%dn.dat"); + instance.execute("inonly", + fileAddress.getFileDirectory(), + "I%dn.dat", + Boolean.TRUE, + fileInput, + fileAddress, + maxFilesPerPoll, + fileFilter, + dirFilter,maxCC); + Thread.sleep(5000); + assertTrue("Failed to find the input file in tmp dir...", hasFilesWithSuffix(tmpDir, "")); + } catch (Exception e) { + fail("Failed to test InOnly exchanges due to: " + e.getMessage()); + } + + verifyContract(); + + // Testing the following scenario + // 1. file name is pattern + // 2. Unsuccessful "normalization" + cleanup(new String[]{archiveDir, tmpDir, errDir}, "Failed to clean up archive directory and filebc-in-processing directory to test execute for InOnly message exchanges: "); + validateAndPrepareTestFiles(inputFile, testFile, "Failed to create input file to test execute for InOnly message exchanges: "); + + normalizer.expects(atLeastOnce()).method("normalize").withAnyArguments().will(throwException(new Exception("Failed to normalize"))); + + try { + AtomicInteger maxFilesPerPoll = new AtomicInteger(20); + InputDirFilter dirFilter = new InputDirFilter(""); + InputFilenameFilter fileFilter = new InputFilenameFilter(fileInput.getFileMessage().getFileName(), "", maxFilesPerPoll, false); + + instance.setWorkers(null); + instance.addWorker(worker = new IBFileWorker(instance, "inonly", fileMessage, + new File(fileAddress.getFileDirectory()), mWorkAreaBaseDir)); + worker.setNormalizer((FileNormalizer) normalizer.proxy()); + instance.setLock(createLock(fileAddress.getFileDirectory(), fileAddress.getLockName())); + instance.setStopped(true); // let the worker loop once and quit + fileFilter.setFilterExpression("I%dn.dat"); + instance.execute("inonly", + fileAddress.getFileDirectory(), + "I%dn.dat", + Boolean.TRUE, + fileInput, + fileAddress, + maxFilesPerPoll, + fileFilter, + dirFilter,maxCC); + Thread.sleep(5000); + // now there are worker threads spin off by execute(), the exception "Failed to normalize" is thrown + // in the run method of IBFileWorker and is captured and logged and + // the offending message is marked as _error and will stay in the + // work area - tmp dir + // the next best assertion for this scenario is to assert that the _error file is there + assertTrue("Failed to find the _error suffixed input file in error dir...", hasFilesWithSuffix(errDir, FileUtil.getErrorFileSuffix())); + //fail("Failed to test in-only message exchange when an expected exception should be caught"); + } catch (Exception e) { + fail("Failed to test execute for InOnly message exchanges with Exception 'Failed to normalize': " + e.getMessage()); + //System.out.println("Caught the expected exception!!"); + } + verifyContract(); + System.out.println("Successfully tested in-only message exchange case 2"); + } + + /** + * Test of execute method, of class com.sun.jbi.filebc.InboundMessageProcessor + * for the scenario where the message exchange type is inonly. + */ + public void testExecuteInOnlyExchangeCase3() { + System.out.println("Testing in-only message exchange case 3..."); + + FileInput fileInput = new FileInput(); + FileMessage fileMessage = new FileMessage(); + FileAddress fileAddress = new FileAddress(); + msgExchange = mock(InOnly.class); + + fileAddress.setFileDirectory("test/com/sun/jbi/filebc/input/test_recursive_root_inonly_1"); + + fileAddress.setLockName(Lock.DEFAULT_INBOUND_LOCKFILE_NAME); + fileAddress.setWorkArea(Lock.DEFAULT_INBOUND_TMPDIR_NAME); + fileAddress.setSeqName(Lock.DEFAULT_SEQFILE_NAME); + + String archiveDir = mWorkAreaBaseDir.getAbsolutePath().concat("/" + FileMessage.FILE_ARCHIVE_DIR_DEFAULT); + String tmpDir = mWorkAreaBaseDir.getAbsolutePath().concat("/" + Lock.DEFAULT_INBOUND_TMPDIR_NAME); + String errDir = mWorkAreaBaseDir.getAbsolutePath() + File.separator + FileUtil.DEFAULT_ERRORS_DIR_NAME; + + cleanup(new String[]{archiveDir, tmpDir, errDir}, "Failed to clean up archive directory and filebc-in-processing directory to test execute for InOnly message exchanges: "); + + copy(new File("test/com/sun/jbi/filebc/input/recursive_root_inonly"), new File(fileAddress.getFileDirectory())); + + // Testing the following scenario + // 1. file name is pattern and the poll is recursive + // 2. successful "normalization" + // 3. successful msgexchange.send + fileAddress.setRecursive(Boolean.TRUE); + fileAddress.setExcludeRegex(".*_skip_.*"); + fileMessage.setFileName("InputInOnly[0-9]+[a-zA-Z_]*${symbol_escape}${symbol_escape}.txt"); + fileMessage.setPollingInterval(new Long(5000)); + fileMessage.setFileNameIsRegex(Boolean.TRUE); + fileInput.setFileMessage(fileMessage); + + deliveryChannel.expects(atLeastOnce()).method("createExchangeFactory").will(returnValue(msgExchangeFactory.proxy())); + msgExchangeFactory.expects(atLeastOnce()).method("createInOnlyExchange").will(returnValue((InOnly) msgExchange.proxy())); + componentContext.expects(atLeastOnce()).method("getEndpoint").with(eq(THE_SERVICE), eq(THE_ENDPOINT)).will(returnValue((ServiceEndpoint) serviceEndpoint.proxy())); + msgExchange.expects(atLeastOnce()).method("getExchangeId"); + normalizer.expects(atLeastOnce()).method("normalize").withAnyArguments().will(returnValue((NormalizedMessage) normalizedMsg.proxy())); + msgExchange.expects(atLeastOnce()).method("setEndpoint").with(isA(ServiceEndpoint.class)); + msgExchange.expects(atLeastOnce()).method("setOperation").with(eq(THE_OPERATION)); + msgExchange.expects(atLeastOnce()).method("setMessage").with(eq(normalizedMsg.proxy()), eq("in")); + + deliveryChannel.expects(atLeastOnce()).method("send").with(eq(msgExchange.proxy())); + //endpoint.expects(atLeastOnce()).method("getServiceName").will(returnValue(THE_SERVICE)); + endpoint.expects(atLeastOnce()).method("getEndpointName").will(returnValue(THE_ENDPOINT)); + endpoint.expects(atLeastOnce()).method("getEndpointStatus").will(returnValue(endpointStatus.proxy())); + endpoint.expects(atLeastOnce()).method("getEndpointType").will(returnValue(THE_TYPE)); + endpointStatus.expects(atLeastOnce()).method("incrementSentRequests"); + + // QOS: Re-delivery + msgExchange.expects(atLeastOnce()).method("getProperty").with(eq(FileComponentContext.CRMP_GROUP_ID)).will(returnValue(ANYTHING)); + msgExchange.expects(atLeastOnce()).method("getProperty").with(eq(FileComponentContext.CRMP_MESSAGE_ID)).will(returnValue(ANYTHING)); + deliveryChannel.expects(atLeastOnce()).method("getServiceQuality"); + + // NM Properties related expectations + normalizedMsg.expects(atLeastOnce()).method("getProperty"); + normalizedMsg.expects(atLeastOnce()).method("setProperty"); + + // set no throttling + endpoint.expects(atLeastOnce()).method("getMaxConcurrencyLimit").will(returnValue(-1)); + + endpoint.expects(atLeastOnce()).method("getServiceUnitID"); + + try { + AtomicInteger maxFilesPerPoll = new AtomicInteger(0); + InputDirFilter dirFilter = new InputDirFilter(fileAddress.getExcludeRegex()); + InputFilenameFilter fileFilter = new InputFilenameFilter(fileMessage.getFileName(), + fileAddress.getExcludeRegex(), + maxFilesPerPoll, + fileMessage.getFileNameIsRegex()); + + instance.addWorker(worker = new IBFileWorker(instance, "inonly", fileMessage, + new File(fileAddress.getFileDirectory()), mWorkAreaBaseDir)); + worker.setNormalizer((FileNormalizer) normalizer.proxy()); + instance.setLock(createLock(fileAddress.getFileDirectory(), fileAddress.getLockName())); + instance.setStopped(true); // let the worker loop once and quit + instance.setFiles(new LinkedBlockingQueue()); + while (true) { + boolean yield = instance.execute("inonly", + fileAddress.getFileDirectory(), + "when file filter is not null put anything here is OK - it is not used", + Boolean.TRUE, + fileInput, + fileAddress, + maxFilesPerPoll, + fileFilter, + dirFilter,maxCC); + if (yield) { + Thread.sleep(50); + } else { + break; + } + } + Thread.sleep(30000); + instance.setStopped(true); // signal the workers to shutdown + // may want to check the total files staged - should equal the + // matched input files from base dir and all sub dirs that are not excluded + int cnt = count(tmpDir); + assertTrue("Failed to find the expected number of input file in tmp dir [25 expected]...count=" + cnt, cnt == 25); + } catch (Exception e) { + e.printStackTrace(); + fail("Failed to test InOnly exchanges due to: " + e.getMessage()); + } + instance.setWorkers(null); + verifyContract(); + + System.out.println("Successfully tested in-only message exchange case 3"); + } + + /** + * Test of execute method, of class com.sun.jbi.filebc.InboundMessageProcessor + * for the scenario where the message exchange type is inout. + */ + public void testExecuteInOutExchangeCase1() { + System.out.println("Testing in-out message exchange case 1..."); + + FileInput fileInput = new FileInput(); + FileMessage fileMessage = new FileMessage(); + FileAddress fileAddress = new FileAddress(); + msgExchange = mock(InOut.class); + + fileAddress.setFileDirectory("test/com/sun/jbi/filebc/input"); + + fileAddress.setLockName(Lock.DEFAULT_INBOUND_LOCKFILE_NAME); + fileAddress.setWorkArea(Lock.DEFAULT_INBOUND_TMPDIR_NAME); + fileAddress.setSeqName(Lock.DEFAULT_SEQFILE_NAME); + + // after cluster support changes + // processed files are no longer marked just as _processed and still stay at the same directory + // instead, it is either deleted (if archive = false) or UUID tagged and _processed suffixed as _processed and + // moved to archive directory (if archive = true) + String inputFile = fileAddress.getFileDirectory().concat("/InputInOut.txt"); + String testFile = fileAddress.getFileDirectory().concat("/TestInputInOut.txt"); + + String archiveDir = mWorkAreaBaseDir.getAbsolutePath().concat("/" + FileMessage.FILE_ARCHIVE_DIR_DEFAULT); + String tmpDir = mWorkAreaBaseDir.getAbsolutePath().concat("/" + Lock.DEFAULT_INBOUND_TMPDIR_NAME); + String errDir = mWorkAreaBaseDir.getAbsolutePath() + File.separator + FileUtil.DEFAULT_ERRORS_DIR_NAME; + + cleanup(new String[]{archiveDir, tmpDir, errDir}, "Failed to clean up archive directory and filebc-in-processing directory to test execute for InOut message exchanges: "); + + validateAndPrepareTestFiles(inputFile, testFile, "Failed to create input file to test execute for InOut message exchanges: "); + + // Testing the following scenario + // 1. no file name match pattern + // 2. successful "normalization" + // 3. successful msgexchange.send + + fileMessage.setFileName("TestInputInOut.txt"); + fileMessage.setPollingInterval(new Long(5000)); + fileInput.setFileMessage(fileMessage); + + deliveryChannel.expects(atLeastOnce()).method("createExchangeFactory").will(returnValue(msgExchangeFactory.proxy())); + msgExchangeFactory.expects(atLeastOnce()).method("createInOutExchange").will(returnValue((InOut) msgExchange.proxy())); + componentContext.expects(atLeastOnce()).method("getEndpoint").with(eq(THE_SERVICE), eq(THE_ENDPOINT)).will(returnValue((ServiceEndpoint) serviceEndpoint.proxy())); + msgExchange.expects(atLeastOnce()).method("getExchangeId"); + normalizer.expects(atLeastOnce()).method("normalize").withAnyArguments().will(returnValue((NormalizedMessage) normalizedMsg.proxy())); + msgExchange.expects(once()).method("setEndpoint").with(isA(ServiceEndpoint.class)); + msgExchange.expects(once()).method("setOperation").with(eq(THE_OPERATION)); + msgExchange.expects(once()).method("setMessage").with(eq(normalizedMsg.proxy()), eq("in")); + + deliveryChannel.expects(once()).method("send").with(eq(msgExchange.proxy())); + endpoint.expects(atLeastOnce()).method("getEndpointName").will(returnValue(THE_ENDPOINT)); + endpoint.expects(once()).method("getEndpointStatus").will(returnValue(endpointStatus.proxy())); + endpoint.expects(atLeastOnce()).method("getServiceName").will(returnValue(THE_SERVICE)); + endpoint.expects(atLeastOnce()).method("getEndpointType").will(returnValue(THE_TYPE)); + endpointStatus.expects(once()).method("incrementSentRequests"); + + // QOS: Re-delivery + msgExchange.expects(atLeastOnce()).method("getProperty").with(eq(FileComponentContext.CRMP_GROUP_ID)).will(returnValue(ANYTHING)); + msgExchange.expects(atLeastOnce()).method("getProperty").with(eq(FileComponentContext.CRMP_MESSAGE_ID)).will(returnValue(ANYTHING)); + deliveryChannel.expects(once()).method("getServiceQuality"); + + // NM Properties related expectations + normalizedMsg.expects(atLeastOnce()).method("getProperty"); + normalizedMsg.expects(atLeastOnce()).method("setProperty"); + + // set no throttling + endpoint.expects(atLeastOnce()).method("getMaxConcurrencyLimit").will(returnValue(-1)); + + endpoint.expects(atLeastOnce()).method("getServiceUnitID"); + + try { + AtomicInteger maxFilesPerPoll = new AtomicInteger(20); + InputDirFilter dirFilter = /*new InputDirFilter("")*/ null; + InputFilenameFilter fileFilter = /*new InputFilenameFilter(fileInput.getFileMessage().getFileName(), "", maxFilesPerPoll, false)*/ null; + + instance.addWorker(worker = new IBFileWorker(instance, "inout", fileMessage, + new File(fileAddress.getFileDirectory()), mWorkAreaBaseDir)); + worker.setNormalizer((FileNormalizer) normalizer.proxy()); + instance.setLock(createLock(fileAddress.getFileDirectory(), fileAddress.getLockName())); + instance.setStopped(true); // let the worker loop once and quit + instance.setFiles(new LinkedBlockingQueue()); + instance.execute("inout", + fileAddress.getFileDirectory(), + "TestInputInOut.txt", + Boolean.FALSE, + fileInput, + fileAddress, + maxFilesPerPoll, + fileFilter, + dirFilter,maxCC); + Thread.sleep(5000); + assertTrue("Failed to find the input file in tmp dir...", hasFilesWithSuffix(tmpDir, "")); + } catch (Exception e) { + fail("Failed to test InOnly exchanges due to: " + e.getMessage()); + } + verifyContract(); + + // Testing the following scenario + // 1. no file name match pattern + // 2. Unsuccessful "normalization" + cleanup(new String[]{archiveDir, tmpDir, errDir}, "Failed to clean up archive directory and filebc-in-processing directory to test execute for InOut message exchanges: "); + validateAndPrepareTestFiles(inputFile, testFile, "Failed to create input file to test execute for InOut message exchanges: "); + + normalizer.expects(atLeastOnce()).method("normalize").withAnyArguments().will(throwException(new Exception("Failed to normalize"))); + + try { + AtomicInteger maxFilesPerPoll = new AtomicInteger(20); + InputDirFilter dirFilter = /*new InputDirFilter("")*/ null; + InputFilenameFilter fileFilter = /*new InputFilenameFilter(fileInput.getFileMessage().getFileName(), "", maxFilesPerPoll, false)*/ null; + + instance.setWorkers(null); + instance.addWorker(worker = new IBFileWorker(instance, "inout", fileMessage, + new File(fileAddress.getFileDirectory()), mWorkAreaBaseDir)); + worker.setNormalizer((FileNormalizer) normalizer.proxy()); + instance.setLock(createLock(fileAddress.getFileDirectory(), fileAddress.getLockName())); + instance.setStopped(true); // let the worker loop once and quit + instance.execute("inout", + fileAddress.getFileDirectory(), + "TestInputInOut.txt", + Boolean.FALSE, + fileInput, + fileAddress, + maxFilesPerPoll, + fileFilter, + dirFilter,maxCC); + + Thread.sleep(5000); + // now there are worker threads spin off by execute(), the exception "Failed to normalize" is thrown + // in the run method of IBFileWorker and is captured and logged and + // the offending message is marked as _error and will stay in the + // work area - tmp dir + // the next best assertion for this scenario is to assert that the _error file is there + assertTrue("Failed to find the _error suffixed input file in error dir...", hasFilesWithSuffix(errDir, FileUtil.getErrorFileSuffix())); + //fail("Failed to test in-out message exchange when an expected exception should be caught"); + } catch (Exception e) { + fail("Failed to test execute for In-Out message exchanges with Exception 'Failed to normalize': " + e.getMessage()); + //System.out.println("Caught the expected exception!!"); + } + verifyContract(); + System.out.println("Successfully tested in-out message exchange case 1"); + } + + /** + * Test of execute method, of class com.sun.jbi.filebc.InboundMessageProcessor + * for the scenario where the message exchange type is inout. + */ + public void testExecuteInOutExchangeCase3() { + System.out.println("Testing in-out message exchange case 3..."); + + FileInput fileInput = new FileInput(); + FileMessage fileMessage = new FileMessage(); + FileAddress fileAddress = new FileAddress(); + msgExchange = mock(InOut.class); + + fileAddress.setFileDirectory("test/com/sun/jbi/filebc/input/test_recursive_root_inout_1"); + + fileAddress.setLockName(Lock.DEFAULT_INBOUND_LOCKFILE_NAME); + fileAddress.setWorkArea(Lock.DEFAULT_INBOUND_TMPDIR_NAME); + fileAddress.setSeqName(Lock.DEFAULT_SEQFILE_NAME); + + String archiveDir = mWorkAreaBaseDir.getAbsolutePath().concat("/" + FileMessage.FILE_ARCHIVE_DIR_DEFAULT); + String tmpDir = mWorkAreaBaseDir.getAbsolutePath().concat("/" + Lock.DEFAULT_INBOUND_TMPDIR_NAME); + String errDir = mWorkAreaBaseDir.getAbsolutePath() + File.separator + FileUtil.DEFAULT_ERRORS_DIR_NAME; + + cleanup(new String[]{archiveDir, tmpDir, errDir}, "Failed to clean up archive directory and filebc-in-processing directory to test execute for InOut message exchanges: "); + + copy(new File("test/com/sun/jbi/filebc/input/recursive_root_inout"), new File(fileAddress.getFileDirectory())); + + // Testing the following scenario + // 1. file name is regular expression and the poll is recursive with exclude regex + // 2. successful "normalization" + // 3. successful msgexchange.send + + fileAddress.setRecursive(Boolean.TRUE); + fileAddress.setExcludeRegex(".*_skip_.*"); + fileMessage.setFileName("InputInOut[0-9]+[a-zA-Z_]*${symbol_escape}${symbol_escape}.dat"); + fileMessage.setFileNameIsRegex(Boolean.TRUE); + fileMessage.setPollingInterval(new Long(5000)); + fileInput.setFileMessage(fileMessage); + + deliveryChannel.expects(atLeastOnce()).method("createExchangeFactory").will(returnValue(msgExchangeFactory.proxy())); + msgExchangeFactory.expects(atLeastOnce()).method("createInOutExchange").will(returnValue((InOut) msgExchange.proxy())); + componentContext.expects(atLeastOnce()).method("getEndpoint").with(eq(THE_SERVICE), eq(THE_ENDPOINT)).will(returnValue((ServiceEndpoint) serviceEndpoint.proxy())); + msgExchange.expects(atLeastOnce()).method("getExchangeId"); + normalizer.expects(atLeastOnce()).method("normalize").withAnyArguments().will(returnValue((NormalizedMessage) normalizedMsg.proxy())); + msgExchange.expects(atLeastOnce()).method("setEndpoint").with(isA(ServiceEndpoint.class)); + msgExchange.expects(atLeastOnce()).method("setOperation").with(eq(THE_OPERATION)); + msgExchange.expects(atLeastOnce()).method("setMessage").with(eq(normalizedMsg.proxy()), eq("in")); + + deliveryChannel.expects(atLeastOnce()).method("send").with(eq(msgExchange.proxy())); + endpoint.expects(atLeastOnce()).method("getEndpointName").will(returnValue(THE_ENDPOINT)); + endpoint.expects(atLeastOnce()).method("getEndpointStatus").will(returnValue(endpointStatus.proxy())); + endpoint.expects(atLeastOnce()).method("getServiceName").will(returnValue(THE_SERVICE)); + endpoint.expects(atLeastOnce()).method("getEndpointType").will(returnValue(THE_TYPE)); + endpointStatus.expects(atLeastOnce()).method("incrementSentRequests"); + + // QOS: Re-delivery + msgExchange.expects(atLeastOnce()).method("getProperty").with(eq(FileComponentContext.CRMP_GROUP_ID)).will(returnValue(ANYTHING)); + msgExchange.expects(atLeastOnce()).method("getProperty").with(eq(FileComponentContext.CRMP_MESSAGE_ID)).will(returnValue(ANYTHING)); + deliveryChannel.expects(atLeastOnce()).method("getServiceQuality"); + + // NM Properties related expectations + normalizedMsg.expects(atLeastOnce()).method("getProperty"); + normalizedMsg.expects(atLeastOnce()).method("setProperty"); + + // set no throttling + endpoint.expects(atLeastOnce()).method("getMaxConcurrencyLimit").will(returnValue(-1)); + + endpoint.expects(atLeastOnce()).method("getServiceUnitID"); + + try { + AtomicInteger maxFilesPerPoll = new AtomicInteger(0); + InputDirFilter dirFilter = new InputDirFilter(fileAddress.getExcludeRegex()); + InputFilenameFilter fileFilter = new InputFilenameFilter(fileMessage.getFileName(), + fileAddress.getExcludeRegex(), + maxFilesPerPoll, + fileMessage.getFileNameIsRegex()); + instance.addWorker(worker = new IBFileWorker(instance, "inout", fileMessage, + new File(fileAddress.getFileDirectory()), mWorkAreaBaseDir)); + worker.setNormalizer((FileNormalizer) normalizer.proxy()); + instance.setLock(createLock(fileAddress.getFileDirectory(), fileAddress.getLockName())); + instance.setFiles(new LinkedBlockingQueue()); + while (true) { + boolean yield = instance.execute("inout", + fileAddress.getFileDirectory(), // the base dir to be polled (recursively) + "when file filter is not null put anything here is OK - it is not used", + Boolean.FALSE, + fileInput, + fileAddress, + maxFilesPerPoll, + fileFilter, + dirFilter,maxCC); + if (yield) { + Thread.sleep(50); + } else { + break; + } + } + Thread.sleep(30000); + instance.setStopped(true); // signal the workers to shutdown + // may want to check the total files staged - should equal the + // matched input files from base dir and all sub dirs that are not excluded + int cnt = count(tmpDir); + assertTrue("Failed to find the expected number of input file in tmp dir [25 expected]...count=" + cnt, cnt == 25); + } catch (Exception e) { + fail("Failed to test InOnly exchanges due to: " + e.getMessage()); + } + + verifyContract(); + + // Testing the following scenario + // 1. file name is pattern, poll is recursive + // 2. successful "normalization" + // 3. successful msgexchange.send + cleanup(new String[]{archiveDir, tmpDir, errDir}, "Failed to clean up archive directory and filebc-in-processing directory to test execute for InOut message exchanges: "); + instance.setWorkers(null); + + fileAddress.setFileDirectory("test/com/sun/jbi/filebc/input/test_recursive_root_inout_2"); + + fileMessage.setFileName("InputInOut%d.dat"); + fileMessage.setFileNameIsRegex(Boolean.FALSE); + fileMessage.setFileNameIsPattern(Boolean.TRUE); + + copy(new File("test/com/sun/jbi/filebc/input/recursive_root_inout"), new File(fileAddress.getFileDirectory())); + + try { + AtomicInteger maxFilesPerPoll = new AtomicInteger(0); + InputDirFilter dirFilter = new InputDirFilter(fileAddress.getExcludeRegex()); + InputFilenameFilter fileFilter = new InputFilenameFilter(fileMessage.getFileName(), + fileAddress.getExcludeRegex(), + maxFilesPerPoll, + fileMessage.getFileNameIsRegex().booleanValue()); + instance.addWorker(worker = new IBFileWorker(instance, "inout", fileMessage, + new File(fileAddress.getFileDirectory()), mWorkAreaBaseDir)); + worker.setNormalizer((FileNormalizer) normalizer.proxy()); + instance.setLock(createLock(fileAddress.getFileDirectory(), fileAddress.getLockName())); + instance.setFiles(new LinkedBlockingQueue()); + while (true) { + boolean yield = instance.execute("inout", + fileAddress.getFileDirectory(), // the base dir to be polled (recursively) + "when file filter is not null put anything here is OK - it is not used", + Boolean.FALSE, + fileInput, + fileAddress, + maxFilesPerPoll, + fileFilter, + dirFilter,maxCC); + if (yield) { + Thread.sleep(50); + } else { + break; + } + } + Thread.sleep(30000); + instance.setStopped(true); // signal the workers to shutdown + int cnt = count(tmpDir); + assertTrue("Failed to find the expected number of input file in tmp dir [25 expected]...count=" + cnt, cnt == 25); + } catch (Exception e) { + e.printStackTrace(); + fail("Failed to test InOnly exchanges due to: " + e.getMessage()); + } + + verifyContract(); + System.out.println("Successfully tested in-out message exchange case 3"); + } + + /** + * Test of execute method, of class com.sun.jbi.filebc.InboundMessageProcessor + * for the scenario where the message exchange type is inout. + */ + public void testExecuteInOutExchangeCase2() { + System.out.println("Testing in-out message exchange case 2..."); + + FileInput fileInput = new FileInput(); + FileMessage fileMessage = new FileMessage(); + FileAddress fileAddress = new FileAddress(); + msgExchange = mock(InOut.class); + + fileAddress.setFileDirectory("test/com/sun/jbi/filebc/input"); + + fileAddress.setLockName(Lock.DEFAULT_INBOUND_LOCKFILE_NAME); + fileAddress.setWorkArea(Lock.DEFAULT_INBOUND_TMPDIR_NAME); + fileAddress.setSeqName(Lock.DEFAULT_SEQFILE_NAME); + + // after cluster support changes + // processed files are no longer marked just as _processed and still stay at the same directory + // instead, it is either deleted (if archive = false) or UUID tagged and _processed suffixed as _processed and + // moved to archive directory (if archive = true) + String inputFile = fileAddress.getFileDirectory().concat("/InputInOut.txt"); + String testFile = fileAddress.getFileDirectory().concat("/I8n.dat"); + + String archiveDir = mWorkAreaBaseDir.getAbsolutePath().concat("/" + FileMessage.FILE_ARCHIVE_DIR_DEFAULT); + String tmpDir = mWorkAreaBaseDir.getAbsolutePath().concat("/" + Lock.DEFAULT_INBOUND_TMPDIR_NAME); + String errDir = mWorkAreaBaseDir.getAbsolutePath() + File.separator + FileUtil.DEFAULT_ERRORS_DIR_NAME; + + cleanup(new String[]{archiveDir, tmpDir, errDir}, "Failed to clean up archive directory and filebc-in-processing directory to test execute for InOut message exchanges: "); + validateAndPrepareTestFiles(inputFile, testFile, "Failed to create input file to test execute for InOut message exchanges: "); + + // Testing the following scenario + // 1. no file name match pattern + // 2. successful "normalization" + // 3. successful msgexchange.send + + fileMessage.setFileName("[A-Z][0-9]n.[a-e]a[t-z]"); + fileMessage.setPollingInterval(new Long(5000)); + fileInput.setFileMessage(fileMessage); + + deliveryChannel.expects(atLeastOnce()).method("createExchangeFactory").will(returnValue(msgExchangeFactory.proxy())); + msgExchangeFactory.expects(atLeastOnce()).method("createInOutExchange").will(returnValue((InOut) msgExchange.proxy())); + componentContext.expects(atLeastOnce()).method("getEndpoint").with(eq(THE_SERVICE), eq(THE_ENDPOINT)).will(returnValue((ServiceEndpoint) serviceEndpoint.proxy())); + msgExchange.expects(atLeastOnce()).method("getExchangeId"); + normalizer.expects(atLeastOnce()).method("normalize").withAnyArguments().will(returnValue((NormalizedMessage) normalizedMsg.proxy())); + msgExchange.expects(once()).method("setEndpoint").with(isA(ServiceEndpoint.class)); + msgExchange.expects(once()).method("setOperation").with(eq(THE_OPERATION)); + msgExchange.expects(once()).method("setMessage").with(eq(normalizedMsg.proxy()), eq("in")); + + deliveryChannel.expects(once()).method("send").with(eq(msgExchange.proxy())); + //endpoint.expects(atLeastOnce()).method("getServiceName").will(returnValue(THE_SERVICE)); + endpoint.expects(atLeastOnce()).method("getEndpointName").will(returnValue(THE_ENDPOINT)); + endpoint.expects(once()).method("getEndpointStatus").will(returnValue(endpointStatus.proxy())); + endpoint.expects(atLeastOnce()).method("getEndpointType").will(returnValue(THE_TYPE)); + endpointStatus.expects(once()).method("incrementSentRequests"); + + // QOS: Re-delivery + msgExchange.expects(atLeastOnce()).method("getProperty").with(eq(FileComponentContext.CRMP_GROUP_ID)).will(returnValue(ANYTHING)); + msgExchange.expects(atLeastOnce()).method("getProperty").with(eq(FileComponentContext.CRMP_MESSAGE_ID)).will(returnValue(ANYTHING)); + deliveryChannel.expects(once()).method("getServiceQuality"); + + // NM Properties related expectations + normalizedMsg.expects(atLeastOnce()).method("getProperty"); + normalizedMsg.expects(atLeastOnce()).method("setProperty"); + + // set no throttling + endpoint.expects(atLeastOnce()).method("getMaxConcurrencyLimit").will(returnValue(-1)); + + endpoint.expects(atLeastOnce()).method("getServiceUnitID"); + + try { + AtomicInteger maxFilesPerPoll = new AtomicInteger(20); + InputDirFilter dirFilter = /*new InputDirFilter("")*/ null; + InputFilenameFilter fileFilter = new InputFilenameFilter(fileInput.getFileMessage().getFileName(), "", maxFilesPerPoll, true); + + instance.addWorker(worker = new IBFileWorker(instance, "inout", fileMessage, + new File(fileAddress.getFileDirectory()), mWorkAreaBaseDir)); + worker.setNormalizer((FileNormalizer) normalizer.proxy()); + instance.setLock(createLock(fileAddress.getFileDirectory(), fileAddress.getLockName())); + instance.setStopped(true); // let the worker loop once and quit + instance.setFiles(new LinkedBlockingQueue()); + fileFilter.setFilterExpression("I%dn.dat"); + instance.execute("inout", + fileAddress.getFileDirectory(), + "I%dn.dat", + Boolean.TRUE, + fileInput, + fileAddress, + maxFilesPerPoll, + fileFilter, + dirFilter,maxCC); + + Thread.sleep(5000); + assertTrue("Failed to find the input file in tmp dir...", hasFilesWithSuffix(tmpDir, "")); + } catch (Exception e) { + fail("Failed to test InOnly exchanges due to: " + e.getMessage()); + } + verifyContract(); + + // Testing the following scenario + // 1. no file name match pattern + // 2. Unsuccessful "normalization" + cleanup(new String[]{archiveDir, tmpDir, errDir}, "Failed to clean up archive directory and filebc-in-processing directory to test execute for InOut message exchanges: "); + validateAndPrepareTestFiles(inputFile, testFile, "Failed to create input file to test execute for InOut message exchanges: "); + + normalizer.expects(atLeastOnce()).method("normalize").withAnyArguments().will(throwException(new Exception("Failed to normalize"))); + + try { + AtomicInteger maxFilesPerPoll = new AtomicInteger(20); + InputDirFilter dirFilter = /*new InputDirFilter("")*/ null; + InputFilenameFilter fileFilter = new InputFilenameFilter(fileInput.getFileMessage().getFileName(), "", maxFilesPerPoll, true); + + instance.setWorkers(null); + instance.addWorker(worker = new IBFileWorker(instance, "inout", fileMessage, + new File(fileAddress.getFileDirectory()), mWorkAreaBaseDir)); + worker.setNormalizer((FileNormalizer) normalizer.proxy()); + instance.setLock(createLock(fileAddress.getFileDirectory(), fileAddress.getLockName())); + instance.setStopped(true); // let the worker loop once and quit + fileFilter.setFilterExpression("I%dn.dat"); + instance.execute("inout", + fileAddress.getFileDirectory(), + "I%dn.dat", + Boolean.TRUE, + fileInput, + fileAddress, + maxFilesPerPoll, + fileFilter, + dirFilter,maxCC); + Thread.sleep(5000); + // now there are worker threads spin off by execute(), the exception "Failed to normalize" is thrown + // in the run method of IBFileWorker and is captured and logged and + // the offending message is marked as _error and will stay in the + // work area - tmp dir + // the next best assertion for this scenario is to assert that the _error file is there + assertTrue("Failed to find the _error suffixed input file in error dir...", hasFilesWithSuffix(errDir, FileUtil.getErrorFileSuffix())); + //fail("Failed to test in-out message exchange when an expected exception should be caught"); + } catch (Exception e) { + fail("Failed to test execute for In-Out message exchanges with Exception 'Failed to normalize': " + e.getMessage()); + //System.out.println("Caught the expected exception!!"); + } + verifyContract(); + + System.out.println("Successfully tested in-out message exchange case 2"); + } + + /** + * Test of processReplyMessage method, of class com.sun.jbi.filebc.InboundMessageProcessor. + */ + public void testProcessReplyMessage() { + System.out.println("Testing processReplyMessage"); + + FileInput fileInput = new FileInput(); + FileMessage fileMessage = new FileMessage(); + + fileMessage.setFileName("TestInputInOut.txt"); + fileMessage.setPollingInterval(new Long(5000)); + fileInput.setFileMessage(fileMessage); + + FileAddress fileAddress = new FileAddress(); + fileAddress.setFileDirectory("test/com/sun/jbi/filebc/input"); + fileAddress.setLockName(Lock.DEFAULT_INBOUND_LOCKFILE_NAME); + fileAddress.setWorkArea(Lock.DEFAULT_INBOUND_TMPDIR_NAME); + fileAddress.setSeqName(Lock.DEFAULT_SEQFILE_NAME); + + Map inboundReplys = new HashMap(); + Map Ids = new HashMap(); + + msgExchange = mock(MessageExchange.class); + msgExchange.stubs().method("getPattern"); + + // testing invalid message exchange + try { + instance.processReplyMessage((MessageExchange) msgExchange.proxy()); + fail("Failed to test processReplyMessage when an validation exception should be caught."); + } catch (Exception e) { + System.out.println("Successfully tested processReply when the MessageExchange is neither in-out nor in-only"); + } + + // testing no exchangeId found + msgExchange = mock(InOut.class); + msgExchange.expects(once()).method("getExchangeId").will(returnValue("789")); + Ids.put("123", ""); + instance.setInboundExchangeIds(Ids); + + try { + instance.processReplyMessage((InOut) msgExchange.proxy()); + System.out.println("Successfully tested processReply when message exchange ID is not found"); + } catch (Exception e) { + fail("Failed to test processReplyMessage when message exchange ID is not found."); + } + + // testing exchang Id is found but status is not DONE + String origFile = fileAddress.getFileDirectory().concat("/InputInOut.txt"); + String inputFile = fileAddress.getFileDirectory().concat("/TestInputInOut.txt"); + + String archiveDir = mWorkAreaBaseDir.getAbsolutePath().concat("/" + FileMessage.FILE_ARCHIVE_DIR_DEFAULT); + String tmpDir = mWorkAreaBaseDir.getAbsolutePath().concat("/" + Lock.DEFAULT_INBOUND_TMPDIR_NAME); + String errDir = mWorkAreaBaseDir.getAbsolutePath() + File.separator + FileUtil.DEFAULT_ERRORS_DIR_NAME; + + // after cluster support changes + // processed files are no longer marked just as _processed and still stay at the same directory + // instead, it is either deleted (if archive = false) or UUID tagged and _processed suffixed as _processed and + // moved to archive directory (if archive = true) + // now the error marked file stays in tmp directory + + cleanup(new String[]{archiveDir, tmpDir, errDir}, "Failed to clean up archive directory and filebc-in-processing directory to test processReplyMessage: "); + validateAndPrepareTestFiles(origFile, inputFile, "Failed to create a input file to properly test processReplyMessage method - ID found and status = DONE: "); + + deliveryChannel.expects(atLeastOnce()).method("createExchangeFactory").will(returnValue(msgExchangeFactory.proxy())); + msgExchangeFactory.expects(atLeastOnce()).method("createInOutExchange").will(returnValue((InOut) msgExchange.proxy())); + componentContext.expects(atLeastOnce()).method("getEndpoint").with(eq(THE_SERVICE), eq(THE_ENDPOINT)).will(returnValue((ServiceEndpoint) serviceEndpoint.proxy())); + msgExchange.expects(atLeastOnce()).method("getExchangeId"); + normalizer.expects(atLeastOnce()).method("normalize").withAnyArguments().will(returnValue((NormalizedMessage) normalizedMsg.proxy())); + msgExchange.expects(once()).method("setEndpoint").with(isA(ServiceEndpoint.class)); + msgExchange.expects(once()).method("setOperation").with(eq(THE_OPERATION)); + msgExchange.expects(once()).method("setMessage").with(eq(normalizedMsg.proxy()), eq("in")); + + deliveryChannel.expects(once()).method("send").with(eq(msgExchange.proxy())); + //endpoint.expects(atLeastOnce()).method("getServiceName").will(returnValue(THE_SERVICE)); + endpoint.expects(atLeastOnce()).method("getEndpointName").will(returnValue(THE_ENDPOINT)); + endpoint.expects(atLeastOnce()).method("getEndpointType").will(returnValue(THE_TYPE)); + endpoint.expects(once()).method("getEndpointStatus").will(returnValue(endpointStatus.proxy())); + endpointStatus.expects(once()).method("incrementSentRequests"); + + // QOS: Re-delivery + msgExchange.expects(atLeastOnce()).method("getProperty").with(eq(FileComponentContext.CRMP_GROUP_ID)).will(returnValue(ANYTHING)); + msgExchange.expects(atLeastOnce()).method("getProperty").with(eq(FileComponentContext.CRMP_MESSAGE_ID)).will(returnValue(ANYTHING)); + deliveryChannel.expects(atLeastOnce()).method("getServiceQuality"); + + normalizedMsg.expects(atLeastOnce()).method("getProperty"); + normalizedMsg.expects(atLeastOnce()).method("setProperty"); + + // set no throttling + endpoint.expects(atLeastOnce()).method("getMaxConcurrencyLimit").will(returnValue(-1)); + + endpoint.expects(atLeastOnce()).method("getServiceUnitID"); + + try { + AtomicInteger maxFilesPerPoll = new AtomicInteger(20); + InputDirFilter dirFilter = /*new InputDirFilter("")*/ null; + InputFilenameFilter fileFilter = /*new InputFilenameFilter(fileInput.getFileMessage().getFileName(), "", maxFilesPerPoll, false)*/ null; + + instance.setWorkers(null); + instance.addWorker(worker = new IBFileWorker(instance, "inout", fileMessage, + new File(fileAddress.getFileDirectory()), mWorkAreaBaseDir)); + worker.setNormalizer((FileNormalizer) normalizer.proxy()); + instance.setFileMessage(fileMessage); + instance.setTargetDirectory(fileAddress.getFileDirectory()); + instance.setLock(createLock(fileAddress.getFileDirectory(), fileAddress.getLockName())); + instance.setStopped(true); // let the worker loop once and quit + instance.setFiles(new LinkedBlockingQueue()); + instance.execute("inout", + fileAddress.getFileDirectory(), + "TestInputInOut.txt", + Boolean.FALSE, + fileInput, + fileAddress, + maxFilesPerPoll, + fileFilter, + dirFilter,maxCC); + Thread.sleep(5000); + assertTrue("Failed to detect a UUID tagged input file in work area - tmp dir when preparing for replyMessage() test [ID found status = DONE]", hasFilesWithSuffix(tmpDir, "")); + } catch (Exception e) { + fail("Failed to test replyMessage when call InOnly exchanges to prepare some expected files due to: " + e.getMessage()); + } + + File tmpDirObj = new File(tmpDir); + MyFilter myFilter = new MyFilter(fileMessage.getFileName()); + File[] tmpFiles = tmpDirObj.listFiles(myFilter); + + if (tmpFiles == null || tmpFiles.length == 0) { + fail("Failed to test replyMessage due to the UUID tagged input file does not shown up in work area - tmp dir - for [ID found status = DONE]"); + } + + // testing exchange Id is found and status is DONE + FileMeta fileMeta = new FileMeta(tmpFiles[0]); + fileMeta.setNMProperty(FileMeta.NMPROP_INBOUND_FILEDIR, tmpDirObj.getAbsolutePath()); + fileMeta.setNMProperty(FileMeta.NMPROP_INBOUND_FILENAME, tmpFiles[0].getName()); + inboundReplys.put("123", fileMeta); + instance.setInboundReplyIds(inboundReplys); + Ids.put("123", ""); + instance.setInboundExchangeIds(Ids); + msgExchange.expects(once()).method("getExchangeId").will(returnValue("123")); + msgExchange.expects(once()).method("getStatus").will(returnValue(ExchangeStatus.DONE)); + try { + instance.processReplyMessage((InOut) msgExchange.proxy()); + Map inboundIds = instance.getInboundExchanges(); + // the id will be removed after the reply is processed + assertTrue("'123' should be removed by now - but it is not", !inboundIds.containsKey("123")); + // the processed input file should be moved to archive area with suffix _processed + assertTrue("Failed to assert that there is an _processed suffixed file in working area - tmp dir", hasFilesWithSuffix(archiveDir, "_processed")); + } catch (Exception e) { + e.printStackTrace(); + fail("Failed to test processReplyMessage when message exchange status is DONE."); + } + + cleanup(new String[]{archiveDir, tmpDir, errDir}, "Failed to clean up archive directory and filebc-in-processing directory to test processReplyMessage: "); + validateAndPrepareTestFiles(origFile, inputFile, "Failed to create a input file to properly test processReplyMessage method: "); + + // provide the UUID tagged file for replyMessage() to do post processing - archive or delete or mark as error + //deliveryChannel.expects(atLeastOnce()).method("createExchangeFactory").will(returnValue(msgExchangeFactory.proxy())); + msgExchangeFactory.expects(atLeastOnce()).method("createInOutExchange").will(returnValue((InOut) msgExchange.proxy())); + //componentContext.expects(atLeastOnce()).method("getEndpoint").with(eq(THE_SERVICE), eq(THE_ENDPOINT)).will(returnValue((ServiceEndpoint)serviceEndpoint.proxy())); + msgExchange.expects(atLeastOnce()).method("getExchangeId"); + normalizer.expects(atLeastOnce()).method("normalize").withAnyArguments().will(returnValue((NormalizedMessage) normalizedMsg.proxy())); + msgExchange.expects(once()).method("setEndpoint").with(isA(ServiceEndpoint.class)); + msgExchange.expects(once()).method("setOperation").with(eq(THE_OPERATION)); + msgExchange.expects(once()).method("setMessage").with(eq(normalizedMsg.proxy()), eq("in")); + + deliveryChannel.expects(once()).method("send").with(eq(msgExchange.proxy())); + //endpoint.expects(atLeastOnce()).method("getServiceName").will(returnValue(THE_SERVICE)); + //endpoint.expects(atLeastOnce()).method("getEndpointName").will(returnValue(THE_ENDPOINT)); + endpoint.expects(once()).method("getEndpointStatus").will(returnValue(endpointStatus.proxy())); + endpointStatus.expects(once()).method("incrementSentRequests"); + + try { + AtomicInteger maxFilesPerPoll = new AtomicInteger(20); + InputDirFilter dirFilter = /*new InputDirFilter("")*/ null; + InputFilenameFilter fileFilter = /*new InputFilenameFilter(fileInput.getFileMessage().getFileName(), "", maxFilesPerPoll, false)*/ null; + + instance.setWorkers(null); + instance.addWorker(worker = new IBFileWorker(instance, "inout", fileMessage, + new File(fileAddress.getFileDirectory()), mWorkAreaBaseDir)); + worker.setNormalizer((FileNormalizer) normalizer.proxy()); + instance.setFileMessage(fileMessage); + instance.setTargetDirectory(fileAddress.getFileDirectory()); + instance.setLock(createLock(fileAddress.getFileDirectory(), fileAddress.getLockName())); + instance.setStopped(true); // let the worker loop once and quit + instance.execute("inout", + fileAddress.getFileDirectory(), + "TestInputInOut.txt", + Boolean.FALSE, + fileInput, + fileAddress, + maxFilesPerPoll, + fileFilter, + dirFilter,maxCC); + Thread.sleep(5000); + assertTrue("Failed to detect a UUID tagged input file in work area - tmp dir when preparing for replyMessage() test [ID found status != DONE]", hasFilesWithSuffix(tmpDir, "")); + } catch (Exception e) { + fail("Failed to test replyMessage when call InOnly exchanges to prepare some expected files due to: " + e.getMessage()); + } + + tmpFiles = tmpDirObj.listFiles(myFilter); + if (tmpFiles == null || tmpFiles.length == 0) { + fail("Failed to test replyMessage due to the UUID tagged input file does not shown up in work area - tmp dir - for [ID found status != DONE]"); + } + + fileMeta = new FileMeta(tmpFiles[0]); + fileMeta.setNMProperty(FileMeta.NMPROP_INBOUND_FILEDIR, tmpDirObj.getAbsolutePath()); + fileMeta.setNMProperty(FileMeta.NMPROP_INBOUND_FILENAME, tmpFiles[0].getName()); + inboundReplys.put("123", fileMeta); + instance.setInboundReplyIds(inboundReplys); + Ids.put("123", ""); + instance.setInboundExchangeIds(Ids); + msgExchange.expects(once()).method("getExchangeId").will(returnValue("123")); + msgExchange.expects(once()).method("getStatus").will(returnValue(ExchangeStatus.ERROR)); + Mock serviceEndpoint = mock(ServiceEndpoint.class); + msgExchange.expects(atLeastOnce()).method("getEndpoint").will(returnValue(serviceEndpoint.proxy())); + serviceEndpoint.expects(atLeastOnce()).method("getServiceName"); + serviceEndpoint.expects(atLeastOnce()).method("getEndpointName"); + msgExchange.expects(once()).method("getOperation"); + msgExchange.expects(atLeastOnce()).method("getProperty"); + msgExchange.expects(once()).method("getError"); + + try { + instance.processReplyMessage((InOut) msgExchange.proxy()); + Map inboundIds = instance.getInboundExchanges(); + assertTrue("Failed to assert that Inbound Exchange ID 123 are removed", !inboundIds.containsKey("123")); + // in the tmp directory, there should be the UUID tagged input file with _error suffix + assertTrue("Failed to assert that there is an _error suffixed file in error dir", hasFilesWithSuffix(errDir, FileUtil.getErrorFileSuffix())); + // processReplyMessage(...) encountered an error and marked input file with _error + // accordingly + System.out.println("Successfully tested processReply when message exchange status is not DONE."); + } catch (Exception e) { + e.printStackTrace(); + fail("Failed to test processReplyMessage when message exchange status is not DONE."); + } + + System.out.println("Successfully tested processReplyMessage"); + } + + private void copy(File srcRoot, File destRoot) { + if (!srcRoot.exists()) { + fail("Original directory does not exist when preparing test data..., src=" + srcRoot + " dest=" + destRoot); + } + destRoot.mkdirs(); + File[] entries = srcRoot.listFiles(); + File entry = null; + for (int i = 0; i < entries.length; i++) { + entry = entries[i]; + if (entry.isDirectory()) { + copy(entry, new File(destRoot, entry.getName())); + } else { + copyFile(entry, new File(destRoot, entry.getName())); + } + } + } + + private int count(String dir) { + int result = 0; + File dirObj = new File(dir); + File[] entries = dirObj.listFiles(); + if (entries != null) { + for (int i = 0; i < entries.length; i++) { + if (entries[i].isFile()) { + result++; + } + } + } + return result; + } + + private void copyFile(String fromFile, String toFile) { + copyFile(new File(fromFile), new File(toFile)); + } + + private void copyFile(File fromFile, File toFile) { + StringBuffer output = new StringBuffer(); + try { + java.io.FileReader reader = new java.io.FileReader(fromFile); + char[] buff = new char[512]; + int len = reader.read(buff); + int length = len; + while (len > 0) { + output.append(buff, 0, len); + len = reader.read(buff); + } + java.io.FileWriter writer = new java.io.FileWriter(toFile); + writer.write(buff, 0, length); + writer.flush(); + writer.close(); + } catch (Exception e) { + System.err.println("Failed to copy " + fromFile + " to " + toFile); + } + } + + private Lock createLock(String dir, String lck) throws Exception { + File lf = new File(dir, lck); + if (!lf.exists()) { + lf.createNewFile(); + } + FileOutputStream fos = new FileOutputStream(lf); + + return new Lock(fos.getChannel(), new ReentrantLock(), lf.getCanonicalPath()); + } + + private void cleanUpDir(String dir) { + // remove all the files under the given directory + File d = new File(dir); + if (d.exists()) { + File[] files = d.listFiles(); + for (int i = 0; i < files.length; i++) { + files[i].delete(); + } + } + } + + private boolean hasFilesWithSuffix(String dir, String suffix) { + File d = new File(dir); + boolean result = false; + if (d.exists()) { + File[] files = d.listFiles(); + for (int i = 0; i < files.length; i++) { + if (suffix == null && suffix.trim().length() == 0) { + result = true; + break; + } + if (files[i].getName().endsWith(suffix)) { + result = true; + break; + } + } + } + return result; + } + + private void verifyContract() { + msgExchange.verify(); + msgExchangeFactory.verify(); + componentContext.verify(); + endpointStatus.verify(); + } + + private void cleanup(String[] dirs, String msg) { + try { + for (int i = 0; i < dirs.length; i++) { + cleanUpDir(dirs[i]); + } + } catch (Exception e) { + fail(msg.concat(e.getMessage())); + } + } + + private void validateAndPrepareTestFiles(String inputFile, String testFile, String msg) { + if (!new File(inputFile).exists()) { + fail("input file:" + inputFile + " does not exist."); + } + try { + if (!new File(testFile).exists()) { + copyFile(inputFile, testFile); + } + } catch (Exception e) { + fail(msg.concat(e.getMessage())); + } + } + + class MyFilter implements FilenameFilter { + + private String mPrefix; + + public MyFilter(String prefix) { + mPrefix = prefix; + } + + public boolean accept(File f, String n) { + if (n != null && n.startsWith(mPrefix)) { + return true; + } else { + return false; + } + } + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/InboundReceiverTest.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/InboundReceiverTest.java new file mode 100644 index 000000000..85cd64861 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/InboundReceiverTest.java @@ -0,0 +1,315 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * BEGIN_HEADER - DO NOT EDIT + * + * The contents of this file are subject to the terms + * of the Common Development and Distribution License + * (the "License"). You may not use this file except + * in compliance with the License. + * + * You can obtain a copy of the license at + * https://${package}.dev.java.net/public/CDDLv1.0.html. + * See the License for the specific language governing + * permissions and limitations under the License. + * + * When distributing Covered Code, include this CDDL + * HEADER in each file and include the License file at + * https://${package}.dev.java.net/public/CDDLv1.0.html. + * If applicable add the following below this CDDL HEADER, + * with the fields enclosed by brackets "[]" replaced with + * your own identifying information: Portions Copyright + * [year] [name of copyright owner] + */ + +/* + * @(${symbol_pound})InboundReceiverTest.java + * + * Copyright 2004-2007 Sun Microsystems, Inc. All Rights Reserved. + * + * END_HEADER - DO NOT EDIT + */ +package com.sun.jbi.filebc; + +import com.sun.jbi.component.jbiext.KeyStoreUtilClient; +import junit.framework.*; +import com.sun.jbi.filebc.extensions.FileOperation; +import com.sun.jbi.filebc.util.EPUtil; + +import java.io.File; +import java.io.FileOutputStream; +import java.util.Iterator; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.locks.ReentrantLock; +import javax.jbi.component.ComponentContext; +import javax.jbi.messaging.DeliveryChannel; +import javax.xml.namespace.QName; +import org.jmock.*; + +/** + * + * @author sweng + */ +public class InboundReceiverTest extends org.jmock.cglib.MockObjectTestCase { + + InboundReceiver instance = null; + Mock runtimeConfig = null; + Mock deliveryChannel = null; + Mock componentContext = null; + Map operations = new HashMap(); + Endpoint endpoint = new EndpointImpl(); + + public InboundReceiverTest(String testName) { + super(testName); + endpoint.setServiceUnitID("Test-SU"); + } + + protected void setUp() throws Exception { + componentContext = mock(ComponentContext.class); + KeyStoreUtilClient keystoreUtil = new KeyStoreUtilClient((ComponentContext) componentContext.proxy()); + runtimeConfig = mock(RuntimeConfiguration.class, + new Class[]{String.class, KeyStoreUtilClient.class}, + new Object[]{"test/com/sun/jbi/filebc/testDir", keystoreUtil}); + deliveryChannel = mock(DeliveryChannel.class); + runtimeConfig.expects(once()).method("getThreads").will(returnValue(new Integer(10))); + runtimeConfig.expects(once()).method("addNotificationListener").withAnyArguments(); + + deliveryChannel.expects(atLeastOnce()).method("createExchangeFactory"); + + // getIBWorkerThreads is called while initializing InboundMessageProcessor + runtimeConfig.expects(atLeastOnce()).method("getIBWorkerThreads").will(returnValue(5)); + + instance = new InboundReceiver((ComponentContext) componentContext.proxy(), + (DeliveryChannel) deliveryChannel.proxy(), + (RuntimeConfiguration) runtimeConfig.proxy()); + } + + protected void tearDown() throws Exception { + } + + public static Test suite() { + TestSuite suite = new TestSuite(InboundReceiverTest.class); + + return suite; + } + + /** + * Test of addInboundMessageProcessor method, of class com.sun.jbi.filebc.InboundReceiver. + */ + public void testAddInboundMessageProcessor() throws Exception { + System.out.println("Testing addInboundMessageProcessor"); + QName serviceName = new QName("somenamespace", "someServiceName"); + String endpointName = "someEndpointName"; + + // 1. testing for inbound endpoint + endpoint.setEndpointType(0); + endpoint.setServiceName(serviceName); + endpoint.setEndpointName(endpointName); + operations.put(new QName("somenamespace", "someOp1"), new FileOperation()); + operations.put(new QName("somenamespace", "someOp2"), new FileOperation()); + operations.put(new QName("somenamespace", "someOp3"), new FileOperation()); + operations.put(new QName("somenamespace", "someOp4"), new FileOperation()); + operations.put(new QName("somenamespace", "someOp5"), new FileOperation()); + operations.put(new QName("somenamespace", "someOp6"), new FileOperation()); + operations.put(new QName("somenamespace", "someOp7"), new FileOperation()); + operations.put(new QName("somenamespace", "someOp8"), new FileOperation()); + endpoint.setFileOperations(operations); + { + com.ibm.wsdl.DefinitionImpl definition = new com.ibm.wsdl.DefinitionImpl(); + + javax.wsdl.PortType portType = definition.createPortType(); + portType.setQName(new QName("somenamespace", "somePortTypeName")); + + javax.wsdl.Binding binding = definition.createBinding(); + binding.setPortType(portType); + + javax.wsdl.Port port = definition.createPort(); + port.setBinding(binding); + port.setName(endpointName); + + javax.wsdl.Service service = definition.createService(); + service.addPort(port); + service.setQName(serviceName); + + definition.addService(service); + endpoint.setDefinition(definition); + } + + try { + registerLock(endpoint); + } catch (Exception e) { + e.printStackTrace(); + fail("Failed to register lock for the endpoint, due to: " + e.getMessage()); + } + + try { + // getIBWorkerThreads is called while initializing InboundMessageProcessor + runtimeConfig.expects(once()).method("getIBWorkerThreads").will(returnValue(new Integer(5))); + + instance.addInboundMessageProcessor(endpoint); + runtimeConfig.verify(); + } catch (Exception e) { + e.printStackTrace(); + fail("Failed to test addInboundMessageProcessor due to: " + e.getMessage()); + } + + Map procs = instance.getActivatedInboundMsgProcs(); + assertEquals(8, procs.size()); + for (Iterator it = procs.keySet().iterator(); it.hasNext();) { + String key = (String) it.next(); + assertTrue(key.startsWith(endpoint.getUniqueName())); + } + + // 2. testing for outbound endpoint + endpoint.setEndpointType(1); + try { + instance.addInboundMessageProcessor(endpoint); + } catch (Exception e) { + fail("Failed to test addInboundMessageProcessor due to: " + e.getMessage()); + } + + procs = instance.getActivatedInboundMsgProcs(); + assertEquals(8, procs.size()); + } + + /** + * Test of removeInboundMessageProcessor method, of class com.sun.jbi.filebc.InboundReceiver. + */ + public void atestRemoveInboundMessageProcessor() { + System.out.println("Testing removeInboundMessageProcessor"); + Map dummyProcs = new HashMap(); + QName serviceName = new QName("somenamespace", "someServiceName"); + String endpointName = "someEndpointName"; + int numIBWorkers = 5; + + endpoint.setEndpointName(endpointName); + endpoint.setServiceName(new QName("somenamespace", "someServiceName")); + { + com.ibm.wsdl.DefinitionImpl definition = new com.ibm.wsdl.DefinitionImpl(); + + javax.wsdl.PortType portType = definition.createPortType(); + portType.setQName(new QName("somenamespace", "somePortTypeName")); + + javax.wsdl.Binding binding = definition.createBinding(); + binding.setPortType(portType); + + javax.wsdl.Port port = definition.createPort(); + port.setBinding(binding); + port.setName(endpointName); + + javax.wsdl.Service service = definition.createService(); + service.addPort(port); + service.setQName(serviceName); + + definition.addService(service); + endpoint.setDefinition(definition); + } + + try { + registerLock(endpoint); + } catch (Exception e) { + e.printStackTrace(); + fail("Failed to register lock for the endpoint, due to: " + e.getMessage()); + } + + try { + String endpointUniqueName = endpoint.getUniqueName(); + dummyProcs.put(endpointUniqueName + ":" + "{somenamespace}someOp1", new InboundMessageProcessor((ComponentContext) componentContext.proxy(), + (DeliveryChannel) deliveryChannel.proxy(), + endpoint, + new QName("somenamespace", "someOp1"),numIBWorkers)); + dummyProcs.put(endpointUniqueName + ":" + "{somenamespace}someOp2", new InboundMessageProcessor((ComponentContext) componentContext.proxy(), + (DeliveryChannel) deliveryChannel.proxy(), + endpoint, + new QName("somenamespace", "someOp2"),numIBWorkers)); + dummyProcs.put(endpointUniqueName + ":" + "{somenamespace}someOp3", new InboundMessageProcessor((ComponentContext) componentContext.proxy(), + (DeliveryChannel) deliveryChannel.proxy(), + endpoint, + new QName("somenamespace", "someOp3"),numIBWorkers)); + dummyProcs.put(endpointUniqueName + ":" + "{somenamespace}someOp4", new InboundMessageProcessor((ComponentContext) componentContext.proxy(), + (DeliveryChannel) deliveryChannel.proxy(), + endpoint, + new QName("somenamespace", "someOp4"),numIBWorkers)); + dummyProcs.put(endpointUniqueName + ":" + "{somenamespace}someOp5", new InboundMessageProcessor((ComponentContext) componentContext.proxy(), + (DeliveryChannel) deliveryChannel.proxy(), + endpoint, + new QName("somenamespace", "someOp5"),numIBWorkers)); + dummyProcs.put(endpointUniqueName + ":" + "{somenamespace}someOp6", new InboundMessageProcessor((ComponentContext) componentContext.proxy(), + (DeliveryChannel) deliveryChannel.proxy(), + endpoint, + new QName("somenamespace", "someOp6"),numIBWorkers)); + dummyProcs.put(endpointUniqueName + ":" + "{somenamespace}someOp7", new InboundMessageProcessor((ComponentContext) componentContext.proxy(), + (DeliveryChannel) deliveryChannel.proxy(), + endpoint, + new QName("somenamespace", "someOp7"),numIBWorkers)); + dummyProcs.put(endpointUniqueName + ":" + "{somenamespace}someOp8", new InboundMessageProcessor((ComponentContext) componentContext.proxy(), + (DeliveryChannel) deliveryChannel.proxy(), + endpoint, + new QName("somenamespace", "someOp8"),numIBWorkers)); + } catch (Exception e) { + e.printStackTrace(); + fail("Failed to set up successfully to test removeInboundMessageProcessor"); + } + + // 1. testing removing some of the activated processors + endpoint.setEndpointType(0); + endpoint.setEndpointName("someEndpointName"); + operations.clear(); + operations.put(new QName("somenamespace", "someOp4"), new FileOperation()); + operations.put(new QName("somenamespace", "someOp5"), new FileOperation()); + + endpoint.setFileOperations(operations); + instance.setActivatedInboundMsgProcs(dummyProcs); + try { + instance.removeInboundMessageProcessor(endpoint); + } catch (Exception e) { + fail("Failed to test removeInboundMessageProcessor due to: " + e.getMessage()); + } + instance.removeInboundMessageProcessor(endpoint); + Map procs = instance.getActivatedInboundMsgProcs(); + assertEquals(6, procs.size()); + + // 2. testing for outbound endpoint + operations.put(new QName("somenamespace", "someOp1"), new FileOperation()); + operations.put(new QName("somenamespace", "someOp2"), new FileOperation()); + operations.put(new QName("somenamespace", "someOp3"), new FileOperation()); + operations.put(new QName("somenamespace", "someOp4"), new FileOperation()); + operations.put(new QName("somenamespace", "someOp5"), new FileOperation()); + operations.put(new QName("somenamespace", "someOp6"), new FileOperation()); + operations.put(new QName("somenamespace", "someOp7"), new FileOperation()); + operations.put(new QName("somenamespace", "someOp8"), new FileOperation()); + endpoint.setFileOperations(operations); + + endpoint.setEndpointType(1); + procs = instance.getActivatedInboundMsgProcs(); + assertEquals(6, procs.size()); + + // 3. testing removing all activated processors + endpoint.setEndpointType(0); + try { + instance.removeInboundMessageProcessor(endpoint); + } catch (Exception e) { + fail("Failed to test removeInboundMessageProcessor due to: " + e.getMessage()); + } + instance.removeInboundMessageProcessor(endpoint); + procs = instance.getActivatedInboundMsgProcs(); + assertEquals(0, procs.size()); + } + + private void registerLock(Endpoint endpoint) throws Exception { + //String key = endpoint.getServiceName().toString() + endpoint.getEndpointName(); + String key = endpoint.getEPUUID(); + String baseWorkDir = "test/com/sun/jbi/filebc/input/" + EPUtil.getWorkAreaBaseDir(endpoint); + File fWorkAreaBaseDir = new File(baseWorkDir); + fWorkAreaBaseDir.mkdirs(); + String lockFilePath = baseWorkDir + File.separator + "filebc.lck"; + + File lockFile = new File(lockFilePath); + lockFile.createNewFile(); + FileOutputStream fos = new FileOutputStream(lockFile); + LockRegistry.register(key, new Lock((fos != null ? fos.getChannel() : null), new ReentrantLock(), lockFilePath)); + + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/ListenerMetaTest.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/ListenerMetaTest.java new file mode 100644 index 000000000..3a2cced72 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/ListenerMetaTest.java @@ -0,0 +1,78 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * BEGIN_HEADER - DO NOT EDIT + * + * The contents of this file are subject to the terms + * of the Common Development and Distribution License + * (the "License"). You may not use this file except + * in compliance with the License. + * + * You can obtain a copy of the license at + * https://${package}.dev.java.net/public/CDDLv1.0.html. + * See the License for the specific language governing + * permissions and limitations under the License. + * + * When distributing Covered Code, include this CDDL + * HEADER in each file and include the License file at + * https://${package}.dev.java.net/public/CDDLv1.0.html. + * If applicable add the following below this CDDL HEADER, + * with the fields enclosed by brackets "[]" replaced with + * your own identifying information: Portions Copyright + * [year] [name of copyright owner] + */ + +/* + * @(${symbol_pound})ListenerMetaTest.java + * + * Copyright 2004-2007 Sun Microsystems, Inc. All Rights Reserved. + * + * END_HEADER - DO NOT EDIT + */ +package com.sun.jbi.filebc; + +import org.jmock.*; + +/** + * + * @author sweng + */ +public class ListenerMetaTest extends MockObjectTestCase { + + Mock replyListener = mock(MessageExchangeReplyListener.class); + ListenerMeta instance = new ListenerMeta(1000, (MessageExchangeReplyListener) replyListener.proxy()); + + public ListenerMetaTest(String testName) { + super(testName); + } + + protected void setUp() throws Exception { + } + + protected void tearDown() throws Exception { + } + + /** + * Test of getRequestInvocationTime method, of class com.sun.jbi.filebc.ListenerMeta. + */ + public void testGetRequestInvocationTime() { + System.out.println("Testing getRequestInvocationTime"); + long expResult = 1000; + long result = instance.getRequestInvocationTime(); + assertEquals(expResult, result); + + System.out.println("Successfully tested getRequestInvocationTime"); + } + + /** + * Test of getMessageExchangeReplyListener method, of class com.sun.jbi.filebc.ListenerMeta. + */ + public void testGetMessageExchangeReplyListener() { + System.out.println("Testing getMessageExchangeReplyListener"); + MessageExchangeReplyListener result = instance.getMessageExchangeReplyListener(); + assertTrue(result instanceof MessageExchangeReplyListener); + + System.out.println("Successfully tested getMessageExchangeReplyListener"); + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/OutboundMessageProcessorTest.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/OutboundMessageProcessorTest.java new file mode 100644 index 000000000..c05b70fb3 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/OutboundMessageProcessorTest.java @@ -0,0 +1,704 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * BEGIN_HEADER - DO NOT EDIT + * + * The contents of this file are subject to the terms + * of the Common Development and Distribution License + * (the "License"). You may not use this file except + * in compliance with the License. + * + * You can obtain a copy of the license at + * https://${package}.dev.java.net/public/CDDLv1.0.html. + * See the License for the specific language governing + * permissions and limitations under the License. + * + * When distributing Covered Code, include this CDDL + * HEADER in each file and include the License file at + * https://${package}.dev.java.net/public/CDDLv1.0.html. + * If applicable add the following below this CDDL HEADER, + * with the fields enclosed by brackets "[]" replaced with + * your own identifying information: Portions Copyright + * [year] [name of copyright owner] + */ + +/* + * @(${symbol_pound})OutboundMessageProcessorTest.java + * + * Copyright 2004-2007 Sun Microsystems, Inc. All Rights Reserved. + * + * END_HEADER - DO NOT EDIT + */ +package com.sun.jbi.filebc; + +import junit.framework.*; +import com.sun.jbi.eManager.provider.EndpointStatus; +import com.sun.jbi.filebc.extensions.FileAddress; +import com.sun.jbi.filebc.extensions.FileInput; +import com.sun.jbi.filebc.extensions.FileOperation; +import com.sun.jbi.filebc.extensions.FileOutput; +import com.sun.jbi.filebc.extensions.FileMessage; +import com.sun.jbi.common.qos.messaging.MessagingChannel; + +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.RandomAccessFile; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.locks.ReentrantLock; +import javax.jbi.messaging.*; +import javax.jbi.servicedesc.ServiceEndpoint; +import javax.wsdl.Binding; +import javax.wsdl.Definition; +import javax.wsdl.Port; +import javax.wsdl.PortType; +import javax.wsdl.Service; +import javax.xml.namespace.QName; +import javax.xml.parsers.DocumentBuilderFactory; +import org.w3c.dom.Document; +import org.jmock.*; + +/** + * + * @author sweng + * @author jfu + */ +public class OutboundMessageProcessorTest extends org.jmock.cglib.MockObjectTestCase { + + static final QName THE_PORTTYPE = new QName("http://myfile-test", "portType1"); + static final QName THE_OPERATION = new QName("http://myfile-test", "operation1"); + static final QName THE_SERVICE = new QName("http://myfile-test", "MyFileService"); + static final String THE_ENDPOINT = "MyFilePort"; + static final int THE_TYPE = 0; + byte[] data = null; + private static final String REDELIVERY_LAST_RETRY_TIME = "com.sun.jbi.common.qos.redelivery.lastRetryTime"; + private static final String REDELIVERY_TOTAL_RETRIES = "com.sun.jbi.common.qos.redelivery.totalRetries"; + private static final String REDELIVERY_REMAINING_RETRIES = "com.sun.jbi.common.qos.redelivery.remainingRetries"; + private static final String REDELIVERY_ERROR_DETAILS = "com.sun.jbi.common.qos.redelivery.errorDetails"; + private static final String REDELIVERY_FAILURE = "com.sun.jbi.common.qos.redelivery.failure"; + OutboundMessageProcessor instance = null; + Endpoint endpoint = null; + QName operation = null; + Map services = null; + Mock deliveryChannel = null; + Mock endpointProxy = null; + Mock endpointStatus = null; + Mock serviceUnit = null; + Mock service = null; + Mock port = null; + Mock portType = null; + Mock binding = null; + Mock wsdlDefinition = null; + List endpoints = new ArrayList(); + Map serviceUnits = new HashMap(); + Map operations = new HashMap(); + Document doc = null; + + public OutboundMessageProcessorTest(String testName) { + super(testName); + } + + protected void setUp() throws Exception { + data = "Hello World!!!".getBytes(); + wsdlDefinition = mock(Definition.class); + operation = THE_OPERATION; + //deliveryChannel = mock(DeliveryChannel.class); + deliveryChannel = mock(MessagingChannel.class); + endpointProxy = mock(Endpoint.class); + endpointStatus = mock(EndpointStatus.class); + endpoint = (Endpoint) endpointProxy.proxy(); + service = mock(Service.class); + port = mock(Port.class); + portType = mock(PortType.class); + binding = mock(Binding.class); + serviceUnit = mock(ServiceUnit.class); + endpoints.add(endpointProxy.proxy()); + serviceUnits.put("1", serviceUnit.proxy()); + + services = new HashMap(); + services.put(THE_SERVICE, (Service) service.proxy()); + File lockFile = new File("test/com/sun/jbi/filebc/input/filebc.lck"); + RandomAccessFile raf = new RandomAccessFile(lockFile, "rw"); + LockRegistry.register("fakedUUID", new Lock(raf.getChannel(), new ReentrantLock(), lockFile.getCanonicalPath())); + + try { + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + synchronized (dbf) { + dbf.setNamespaceAware(true); + doc = dbf.newDocumentBuilder().newDocument(); + } + } catch (Exception e) { + System.out.println("Cannot create a document"); + } + + if (doc != null) { + org.w3c.dom.Element root = doc.createElement("Simple-file-write-test"); + doc.appendChild(root); + } + + instance = new OutboundMessageProcessor((MessagingChannel) deliveryChannel.proxy(), + serviceUnits, + new HashMap()); + } + + protected void tearDown() throws Exception { + } + + public static Test suite() { + TestSuite suite = new TestSuite(OutboundMessageProcessorTest.class); + + return suite; + } + + /** + * Test of processRequestReplyOutbound method, of class com.sun.jbi.filebc.OutboundMessageProcessor. + */ + public void testProcessRequestReplyOutbound() { + System.out.println("Testing processRequestReplyOutbound"); + + Mock inout = mock(InOut.class); + Mock inMessage = mock(NormalizedMessage.class); + Mock outMessage = mock(NormalizedMessage.class); + Mock denormalizer = mock(FileDenormalizer.class); + + FileOperation fileoperation = new FileOperation(); + FileInput fileInput = new FileInput(); + FileMessage fileMessage = new FileMessage(); + FileAddress addr = new FileAddress(); + + fileInput.setFileMessage(fileMessage); + fileoperation.setFileOperationInput(fileInput); + fileMessage.setFileName("TestRequestResponseOutbound.txt"); + operations.put(THE_OPERATION, fileoperation); + addr.setFileDirectory("test/com/sun/jbi/filebc/output"); + + endpointProxy.expects(atLeastOnce()).method("getEndpointStatus").will(returnValue(endpointStatus.proxy())); +// endpointProxy.expects(atLeastOnce()).method("getFileOperations").will(returnValue(operations)); +// endpointProxy.expects(atLeastOnce()).method("getFileAddress").will(returnValue(addr)); +// endpointProxy.expects(atLeastOnce()).method("getServiceName").will(returnValue(THE_SERVICE)); +// endpointProxy.expects(atLeastOnce()).method("getEndpointName").will(returnValue(THE_ENDPOINT)); +// endpointProxy.expects(atLeastOnce()).method("getEndpointType").will(returnValue(THE_TYPE)); +// deliveryChannel.expects(atLeastOnce()).method("send").with(isA(InOut.class)); +// endpointProxy.expects(atLeastOnce()).method("getDefinition").will(returnValue(wsdlDefinition.proxy())); +// wsdlDefinition.expects(atLeastOnce()).method("getServices").will(returnValue((Map)services)); +// service.expects(atLeastOnce()).method("getPort").will(returnValue((Port) port.proxy())); +// port.expects(atLeastOnce()).method("getBinding").will(returnValue((Binding) binding.proxy())); +// binding.expects(atLeastOnce()).method("getPortType").will(returnValue((PortType) portType.proxy())); +// portType.expects(atLeastOnce()).method("getQName").will(returnValue(THE_PORTTYPE)); + + // 1. testing the case when exchange status is done + inout.expects(atLeastOnce()).method("getStatus").will(returnValue(ExchangeStatus.DONE)); + endpointStatus.expects(atLeastOnce()).method("incrementReceivedDones"); + instance.processRequestReplyOutbound((InOut) inout.proxy(), endpoint, operation); + endpointStatus.verify(); + + // 2. testing the case when exchange status is error + inout.expects(atLeastOnce()).method("getStatus").will(returnValue(ExchangeStatus.ERROR)); + endpointStatus.expects(once()).method("incrementReceivedErrors"); + instance.processRequestReplyOutbound((InOut) inout.proxy(), endpoint, operation); + endpointStatus.verify(); + + // Outbound Req Reply is used for Sync (Solicited) Read now. +// // 3. testing the case when status is active and file write is successful +// endpointStatus.expects(atLeastOnce()).method("incrementReceivedRequests"); +// endpointStatus.expects(atLeastOnce()).method("incrementSentReplies"); +// denormalizer.expects(atLeastOnce()).method("denormalize").withAnyArguments().will(returnValue(data)); +// instance.setFileDenormalizer((FileDenormalizer)denormalizer.proxy()); +// inout.expects(atLeastOnce()).method("getStatus").will(returnValue(ExchangeStatus.ACTIVE)); +// inout.expects(atLeastOnce()).method("getInMessage").will(returnValue(inMessage.proxy())); +// inout.expects(atLeastOnce()).method("createMessage").will(returnValue(outMessage.proxy())); +// inout.expects(atLeastOnce()).method("setOutMessage").withAnyArguments(); +// outMessage.expects(atLeastOnce()).method("setContent").withAnyArguments(); +// outMessage.expects(atLeastOnce()).method("setProperty").withAnyArguments(); +// instance.processRequestReplyOutbound((InOut)inout.proxy(), endpoint, operation); +// inMessage.verify(); +// outMessage.verify(); +// +// // 4. testing the case when status is active but file write fails +// denormalizer.expects(once()).method("denormalize").will(throwException(new Exception("Some error occurred."))); +// inout.expects(once()).method("setError").with(isA(Exception.class)); +// instance.processRequestReplyOutbound((InOut)inout.proxy(), endpoint, operation); +// inMessage.verify(); +// outMessage.verify(); + } + + /** + * Test of processRequestReplyInbound method, of class com.sun.jbi.filebc.OutboundMessageProcessor. + */ + public void testProcessRequestReplyInbound() { + System.out.println("Testing processRequestReplyInbound"); + + Mock inout = mock(InOut.class); + Mock inMessage = mock(NormalizedMessage.class); + Mock denormalizer = mock(FileDenormalizer.class); + Mock listener = mock(MessageExchangeReplyListener.class); + + FileOperation fileoperation = new FileOperation(); + FileOutput fileOutput = new FileOutput(); + FileMessage fileMessage = new FileMessage(); + FileAddress addr = new FileAddress(); + + fileOutput.setFileMessage(fileMessage); + fileMessage.setFileName("TestRequestResponseInbound.txt"); + fileoperation.setFileOperationOutput(fileOutput); + operations.put(THE_OPERATION, fileoperation); + addr.setFileDirectory("test/com/sun/jbi/filebc/output"); + + String epUUID = "fakedUUID"; + endpointProxy.expects(atLeastOnce()).method("getEPUUID").will(returnValue(epUUID)); + endpointProxy.expects(atLeastOnce()).method("getEndpointStatus").will(returnValue(endpointStatus.proxy())); + endpointProxy.expects(atLeastOnce()).method("getFileOperations").will(returnValue(operations)); + endpointProxy.expects(atLeastOnce()).method("getFileAddress").will(returnValue(addr)); + endpointProxy.expects(atLeastOnce()).method("getServiceName").will(returnValue(THE_SERVICE)); + endpointProxy.expects(atLeastOnce()).method("getEndpointName").will(returnValue(THE_ENDPOINT)); + endpointProxy.expects(atLeastOnce()).method("getEndpointType").will(returnValue(THE_TYPE)); + endpointProxy.expects(atLeastOnce()).method("getWorkAreaDir"); + deliveryChannel.expects(atLeastOnce()).method("send").with(isA(InOut.class)); + endpointProxy.expects(atLeastOnce()).method("getDefinition").will(returnValue(wsdlDefinition.proxy())); + wsdlDefinition.expects(atLeastOnce()).method("getServices").will(returnValue((Map) services)); + service.expects(atLeastOnce()).method("getPort").will(returnValue((Port) port.proxy())); + port.expects(atLeastOnce()).method("getBinding").will(returnValue((Binding) binding.proxy())); + binding.expects(atLeastOnce()).method("getPortType").will(returnValue((PortType) portType.proxy())); + portType.expects(atLeastOnce()).method("getQName").will(returnValue(THE_PORTTYPE)); + + // QOS: Re-delivery + String groupid = java.util.UUID.randomUUID().toString(); + String messageid = "1"; + inout.expects(atLeastOnce()).method("getProperty").with(eq(FileComponentContext.CRMP_GROUP_ID)).will(returnValue(groupid)); + inout.expects(atLeastOnce()).method("getProperty").with(eq(FileComponentContext.CRMP_MESSAGE_ID)).will(returnValue(messageid)); + String lastRetryTime = "50000"; + String totalRetries = "3"; + String remainingRetries = "1"; + Exception errorDetails = new Exception(); + String redeliveryFailure = "false"; + inout.expects(atLeastOnce()).method("getProperty").with(eq(REDELIVERY_LAST_RETRY_TIME)).will(returnValue(lastRetryTime)); + inout.expects(atLeastOnce()).method("getProperty").with(eq(REDELIVERY_TOTAL_RETRIES)).will(returnValue(totalRetries)); + inout.expects(atLeastOnce()).method("getProperty").with(eq(REDELIVERY_REMAINING_RETRIES)).will(returnValue(remainingRetries)); + //inout.expects(once()).method("getProperty").with(eq(REDELIVERY_ERROR_DETAILS)).will(returnValue(errorDetails)); + inout.expects(atLeastOnce()).method("getProperty").with(eq(REDELIVERY_FAILURE)).will(returnValue(redeliveryFailure)); + inout.expects(atLeastOnce()).method("getExchangeId"); + + listener.expects(atLeastOnce()).method("processReplyMessage"); + + // 1. testing the case when exchange status is done + inout.expects(atLeastOnce()).method("getStatus").will(returnValue(ExchangeStatus.DONE)); + inout.expects(atLeastOnce()).method("getError"); + endpointStatus.expects(once()).method("incrementReceivedDones"); + instance.processRequestReplyInbound((InOut) inout.proxy(), endpoint, operation, (MessageExchangeReplyListener) listener.proxy()); + endpointStatus.verify(); + + // 2. testing the case when exchange status is error + Mock serviceEndpoint = mock(ServiceEndpoint.class); + inout.expects(atLeastOnce()).method("getStatus").will(returnValue(ExchangeStatus.ERROR)); + inout.expects(atLeastOnce()).method("getEndpoint").will(returnValue(serviceEndpoint.proxy())); + inout.expects(atLeastOnce()).method("getOperation"); + serviceEndpoint.expects(atLeastOnce()).method("getServiceName"); + serviceEndpoint.expects(atLeastOnce()).method("getEndpointName"); + endpointStatus.expects(once()).method("incrementReceivedErrors"); + inout.expects(atLeastOnce()).method("getError"); + endpointProxy.expects(atLeastOnce()).method("getServiceUnitID"); + endpointProxy.expects(atLeastOnce()).method("getRedeliveryConfiguration"); + instance.processRequestReplyInbound((InOut) inout.proxy(), endpoint, operation, (MessageExchangeReplyListener) listener.proxy()); + endpointStatus.verify(); + + // 3. testing the case when status is active and file write is successful + endpointStatus.expects(atLeastOnce()).method("incrementReceivedReplies"); + endpointStatus.expects(atLeastOnce()).method("incrementSentDones"); + //denormalizer.expects(atLeastOnce()).method("denormalize").withAnyArguments().will(returnValue(data)); + denormalizer.expects(atLeastOnce()).method("denormalize").withAnyArguments().will(returnValue(new ByteArrayInputStream(data))); + instance.setFileDenormalizer((FileDenormalizer) denormalizer.proxy()); + inout.expects(atLeastOnce()).method("getStatus").will(returnValue(ExchangeStatus.ACTIVE)); + inout.expects(atLeastOnce()).method("getOutMessage").will(returnValue(inMessage.proxy())); + inMessage.expects(atLeastOnce()).method("getProperty"); + inMessage.expects(atLeastOnce()).method("setProperty").withAnyArguments(); + inout.expects(atLeastOnce()).method("setStatus").with(eq(ExchangeStatus.DONE)); + listener.expects(once()).method("processReplyMessage").with(isA(InOut.class)); + inout.expects(atLeastOnce()).method("getExchangeId"); + instance.processRequestReplyInbound((InOut) inout.proxy(), endpoint, operation, (MessageExchangeReplyListener) listener.proxy()); + inMessage.verify(); + + // 4. testing the case when status is active but file write fails + denormalizer.expects(once()).method("denormalize").will(throwException(new Exception("Some error occurred."))); + endpointStatus.expects(atLeastOnce()).method("incrementSentErrors"); + inout.expects(once()).method("setError").with(isA(Exception.class)); + inout.expects(atLeastOnce()).method("setStatus").with(eq(ExchangeStatus.ERROR)); + inout.expects(atLeastOnce()).method("setProperty").withAnyArguments(); + listener.expects(once()).method("processReplyMessage").with(isA(InOut.class)); + instance.processRequestReplyInbound((InOut) inout.proxy(), endpoint, operation, (MessageExchangeReplyListener) listener.proxy()); + inMessage.verify(); + } + + /** + * Test of processOneWayOutbound method, of class com.sun.jbi.filebc.OutboundMessageProcessor. + */ + public void testProcessOneWayOutbound() { + System.out.println("Testing processOneWayOutbound"); + + Mock inonly = mock(InOnly.class); + Mock inMessage = mock(NormalizedMessage.class); + Mock denormalizer = mock(FileDenormalizer.class); + + FileOperation fileoperation = new FileOperation(); + FileInput fileInput = new FileInput(); + FileMessage fileMessage = new FileMessage(); + FileAddress addr = new FileAddress(); + + fileoperation.setFileOperationInput(fileInput); + fileInput.setFileMessage(fileMessage); + fileMessage.setFileName("TestOneWayOutbound.txt"); + fileMessage.setMultipleRecordsPerFile(Boolean.FALSE); + operations.put(THE_OPERATION, fileoperation); + + addr.setFileDirectory("test/com/sun/jbi/filebc/output"); + String epUUID = "fakedUUID"; + endpointProxy.expects(atLeastOnce()).method("getEPUUID").will(returnValue(epUUID)); + endpointProxy.expects(atLeastOnce()).method("getEndpointStatus").will(returnValue(endpointStatus.proxy())); + endpointProxy.expects(atLeastOnce()).method("getFileOperations").will(returnValue(operations)); + endpointProxy.expects(atLeastOnce()).method("getFileAddress").will(returnValue(addr)); + endpointProxy.expects(atLeastOnce()).method("getServiceName").will(returnValue(THE_SERVICE)); + endpointProxy.expects(atLeastOnce()).method("getEndpointName").will(returnValue(THE_ENDPOINT)); + endpointProxy.expects(atLeastOnce()).method("getEndpointType").will(returnValue(THE_TYPE)); + endpointProxy.expects(atLeastOnce()).method("getServiceUnitID").will(returnValue("theID")); + endpointProxy.expects(atLeastOnce()).method("getWorkAreaDir"); + endpointStatus.expects(atLeastOnce()).method("incrementReceivedRequests"); + deliveryChannel.expects(atLeastOnce()).method("send").with(isA(InOnly.class)); + endpointProxy.expects(atLeastOnce()).method("getDefinition").will(returnValue(wsdlDefinition.proxy())); + wsdlDefinition.expects(atLeastOnce()).method("getServices").will(returnValue((Map) services)); + service.expects(atLeastOnce()).method("getPort").will(returnValue((Port) port.proxy())); + port.expects(atLeastOnce()).method("getBinding").will(returnValue((Binding) binding.proxy())); + binding.expects(atLeastOnce()).method("getPortType").will(returnValue((PortType) portType.proxy())); + portType.expects(atLeastOnce()).method("getQName").will(returnValue(THE_PORTTYPE)); + + // 1. testing success scenario + inonly.expects(atLeastOnce()).method("getInMessage").will(returnValue(inMessage.proxy())); + inonly.expects(atLeastOnce()).method("setStatus").with(eq(ExchangeStatus.DONE)); + endpointStatus.expects(once()).method("incrementSentDones"); + denormalizer.expects(atLeastOnce()).method("denormalize").withAnyArguments().will(returnValue(new ByteArrayInputStream(data))); + inMessage.expects(atLeastOnce()).method("getProperty"); + inMessage.expects(atLeastOnce()).method("setProperty").withAnyArguments(); + instance.setFileDenormalizer((FileDenormalizer) denormalizer.proxy()); + instance.processOneWayOutbound((InOnly) inonly.proxy(), endpoint, operation); + inMessage.verify(); + inonly.verify(); + + // 2. testing failure scenario + inonly.expects(atLeastOnce()).method("setStatus").with(eq(ExchangeStatus.ERROR)); + inonly.expects(once()).method("setError").withAnyArguments(); + inonly.expects(atLeastOnce()).method("setProperty"); + endpointStatus.expects(once()).method("incrementSentErrors"); + denormalizer.expects(once()).method("denormalize").will(throwException(new Exception("Some error occurred."))); + instance.processOneWayOutbound((InOnly) inonly.proxy(), endpoint, operation); + inMessage.verify(); + inonly.verify(); + } + + /** + * Test of processOneWayInbound method, of class com.sun.jbi.filebc.OutboundMessageProcessor. + */ + public void testProcessOneWayInbound() { + System.out.println("Testing processOneWayInbound"); + + Mock inonly = mock(InOnly.class); + Mock listener = mock(MessageExchangeReplyListener.class); + listener.expects(atLeastOnce()).method("processReplyMessage").with(isA(InOnly.class)); + Mock normalizedMessage = mock(NormalizedMessage.class); + + // 1. testing the case when exchange status is done + endpointProxy.expects(atLeastOnce()).method("getEndpointStatus").will(returnValue(endpointStatus.proxy())); + inonly.expects(atLeastOnce()).method("getStatus").will(returnValue(ExchangeStatus.DONE)); + + String groupid = java.util.UUID.randomUUID().toString(); + String messageid = "1"; + inonly.expects(atLeastOnce()).method("getProperty").with(eq(FileComponentContext.CRMP_GROUP_ID)).will(returnValue(groupid)); + inonly.expects(atLeastOnce()).method("getProperty").with(eq(FileComponentContext.CRMP_MESSAGE_ID)).will(returnValue(messageid)); + String lastRetryTime = "50000"; + String totalRetries = "3"; + String remainingRetries = "1"; + Exception errorDetails = new Exception(); + String redeliveryFailure = "false"; + inonly.expects(atLeastOnce()).method("getProperty").with(eq(REDELIVERY_LAST_RETRY_TIME)).will(returnValue(lastRetryTime)); + inonly.expects(atLeastOnce()).method("getProperty").with(eq(REDELIVERY_TOTAL_RETRIES)).will(returnValue(totalRetries)); + inonly.expects(atLeastOnce()).method("getProperty").with(eq(REDELIVERY_REMAINING_RETRIES)).will(returnValue(remainingRetries)); + //inonly.expects(once()).method("getProperty").with(eq(REDELIVERY_ERROR_DETAILS)).will(returnValue(errorDetails)); + inonly.expects(atLeastOnce()).method("getProperty").with(eq(REDELIVERY_FAILURE)).will(returnValue(redeliveryFailure)); + inonly.expects(atLeastOnce()).method("getExchangeId"); + inonly.expects(atLeastOnce()).method("getError"); + endpointStatus.expects(once()).method("incrementReceivedDones"); + instance.processOneWayInbound((InOnly) inonly.proxy(), endpoint, (MessageExchangeReplyListener) listener.proxy()); + inonly.verify(); + endpointStatus.verify(); + + // 2. testing the case when exchange status is error + Mock serviceEndpoint = mock(ServiceEndpoint.class); +// inonly.expects(atLeastOnce()).method("getStatus").will(returnValue(ExchangeStatus.ERROR)); + inonly.expects(atLeastOnce()).method("getEndpoint").will(returnValue(serviceEndpoint.proxy())); + inonly.expects(atLeastOnce()).method("getOperation"); + serviceEndpoint.expects(atLeastOnce()).method("getServiceName"); + serviceEndpoint.expects(atLeastOnce()).method("getEndpointName"); + inonly.expects(atLeastOnce()).method("getStatus").will(returnValue(ExchangeStatus.ERROR)); + endpointStatus.expects(once()).method("incrementReceivedErrors"); + inonly.expects(atLeastOnce()).method("getError"); + endpointProxy.expects(atLeastOnce()).method("getServiceName").will(returnValue(THE_SERVICE)); + endpointProxy.expects(atLeastOnce()).method("getEndpointName").will(returnValue(THE_ENDPOINT)); + endpointProxy.expects(atLeastOnce()).method("getServiceUnitID"); + endpointProxy.expects(atLeastOnce()).method("getRedeliveryConfiguration"); + instance.processOneWayInbound((InOnly) inonly.proxy(), endpoint, (MessageExchangeReplyListener) listener.proxy()); + inonly.verify(); + endpointStatus.verify(); + } + + /** + * Test of findEndpoint method, of class com.sun.jbi.filebc.OutboundMessageProcessor + * for the scenario where a match is found + */ + public void testFindEndpointMatchFound() { + System.out.println("Testing findEndpoint"); + + endpointProxy.expects(atLeastOnce()).method("getServiceName").will(returnValue(THE_SERVICE)); + endpointProxy.expects(atLeastOnce()).method("getEndpointName").will(returnValue(THE_ENDPOINT)); + serviceUnit.expects(atLeastOnce()).method("getEndpoints").will(returnValue(endpoints)); + String suId = "abc"; + serviceUnit.expects(atLeastOnce()).method("getServiceUnitId").will(returnValue(suId)); + endpointProxy.expects(atLeastOnce()).method("setServiceUnitID").with(eq(suId)); + + Mock msgExchange = mock(MessageExchange.class); + Mock serviceEndpoint = mock(ServiceEndpoint.class); + msgExchange.expects(atLeastOnce()).method("getEndpoint").will(returnValue(serviceEndpoint.proxy())); + serviceEndpoint.expects(atLeastOnce()).method("getServiceName").will(returnValue(THE_SERVICE)); + serviceEndpoint.expects(atLeastOnce()).method("getEndpointName").will(returnValue(THE_ENDPOINT)); + + + Endpoint result = instance.findEndpoint((MessageExchange) msgExchange.proxy()); + assertNotNull(result); + assertEquals(THE_SERVICE, result.getServiceName()); + assertEquals(THE_ENDPOINT, result.getEndpointName()); + } + + /** + * Test of findEndpoint method, of class com.sun.jbi.filebc.OutboundMessageProcessor + * for the scenario where no match is found + */ + public void testFindEndpoinNoMatchFound() { + System.out.println("Testing findEndpoint"); + + endpointProxy.expects(atLeastOnce()).method("getServiceName").will(returnValue(THE_SERVICE)); + serviceUnit.expects(atLeastOnce()).method("getEndpoints").will(returnValue(endpoints)); + + Mock msgExchange = mock(MessageExchange.class); + Mock serviceEndpoint = mock(ServiceEndpoint.class); + msgExchange.expects(atLeastOnce()).method("getEndpoint").will(returnValue(serviceEndpoint.proxy())); + serviceEndpoint.expects(atLeastOnce()).method("getServiceName").will(returnValue(new QName("notMatchingService"))); + serviceEndpoint.expects(atLeastOnce()).method("getEndpointName").will(returnValue("notMatchingEndpoint")); + Endpoint result = instance.findEndpoint((MessageExchange) msgExchange.proxy()); + assertNull(result); + } + + /** + * Test of writeMessage method, of class com.sun.jbi.filebc.OutboundMessageProcessor + */ + public void testWriteMessage() { + Mock normalizedMsg = mock(NormalizedMessage.class); + Mock denormalizer = mock(FileDenormalizer.class); + + FileAddress addr = new FileAddress(); + FileMessage fileMessage = new FileMessage(); + QName opname = QName.valueOf("operation1"); + + addr.setFileDirectory("test/com/sun/jbi/filebc/output"); + String epUUID = "fakedUUID"; + endpointProxy.expects(atLeastOnce()).method("getEPUUID").will(returnValue(epUUID)); + endpointProxy.expects(atLeastOnce()).method("getFileAddress").will(returnValue(addr)); + endpointProxy.expects(atLeastOnce()).method("getServiceName").will(returnValue(THE_SERVICE)); + endpointProxy.expects(atLeastOnce()).method("getEndpointName").will(returnValue(THE_ENDPOINT)); + endpointProxy.expects(atLeastOnce()).method("getEndpointType").will(returnValue(THE_TYPE)); + endpointProxy.expects(atLeastOnce()).method("getServiceUnitID"); + endpointProxy.expects(atLeastOnce()).method("getWorkAreaDir"); + instance.setFileDenormalizer((FileDenormalizer) denormalizer.proxy()); + normalizedMsg.expects(atLeastOnce()).method("getProperty"); + normalizedMsg.expects(atLeastOnce()).method("setProperty"); + + // testing simple file write with real file name + fileMessage.setFileName("TestFileWrite.txt"); + denormalizer.expects(atLeastOnce()).method("denormalize").withAnyArguments().will(returnValue(new ByteArrayInputStream(data))); + try { + instance.writeMessage((NormalizedMessage) normalizedMsg.proxy(), (Endpoint) endpointProxy.proxy(), opname, fileMessage); + assertEquals("Hello World!!!", getFileContents(new File("test/com/sun/jbi/filebc/output/TestFileWrite.txt").getAbsolutePath())); + } catch (Exception e) { + fail("Failed to test writeMessage due to: " + e.getMessage()); + } + + // testing writing EOL with real file name + fileMessage.setAddEOL(Boolean.TRUE); + denormalizer.expects(atLeastOnce()).method("denormalize").withAnyArguments().will(returnValue(new ByteArrayInputStream(data))); + try { + instance.writeMessage((NormalizedMessage) normalizedMsg.proxy(), (Endpoint) endpointProxy.proxy(), opname, fileMessage); + assertEquals("Hello World!!!", getFileContents(new File("test/com/sun/jbi/filebc/output/TestFileWrite.txt").getAbsolutePath()).trim()); + } catch (Exception e) { + fail("Failed to test writeMessage due to: " + e.getMessage()); + } + + // testing writing multiple records with real file name + File[] files = new File("test/com/sun/jbi/filebc/output").listFiles(); + for (int ii = 0; ii < files.length; ii++) { + File afile = (File) files[ii]; + afile.delete(); + } + fileMessage.setAddEOL(Boolean.FALSE); + fileMessage.setMultipleRecordsPerFile(Boolean.TRUE); + fileMessage.setRecordDelimiter("${symbol_escape}r${symbol_escape}n"); + try { + denormalizer.expects(atLeastOnce()).method("denormalize").withAnyArguments().will(returnValue(new ByteArrayInputStream(data))); + instance.writeMessage((NormalizedMessage) normalizedMsg.proxy(), (Endpoint) endpointProxy.proxy(), opname, fileMessage); + denormalizer.expects(atLeastOnce()).method("denormalize").withAnyArguments().will(returnValue(new ByteArrayInputStream(data))); + instance.writeMessage((NormalizedMessage) normalizedMsg.proxy(), (Endpoint) endpointProxy.proxy(), opname, fileMessage); + denormalizer.expects(atLeastOnce()).method("denormalize").withAnyArguments().will(returnValue(new ByteArrayInputStream(data))); + instance.writeMessage((NormalizedMessage) normalizedMsg.proxy(), (Endpoint) endpointProxy.proxy(), opname, fileMessage); + assertEquals("Hello World!!!${symbol_escape}r${symbol_escape}nHello World!!!${symbol_escape}r${symbol_escape}nHello World!!!", getFileContents(new File("test/com/sun/jbi/filebc/output/TestFileWrite.txt").getAbsolutePath()).trim()); + } catch (Exception e) { + fail("Failed to test writeMessage due to: " + e.getMessage()); + } + + // testing writing single record with file name pattern + /** + fileMessage.setFileNameIsPattern(Boolean.TRUE); + try { + instance.writeMessage((NormalizedMessage) normalizedMsg.proxy(), (Endpoint)endpointProxy.proxy(), opname, fileMessage); + assertTrue(new File("test/com/sun/jbi/filebc/output/blah0.dat").exists()); + assertEquals("Hello World!!!", getFileContents(new File("test/com/sun/jbi/filebc/output/blah0.dat").getAbsolutePath()).trim()); + } catch (Exception e) { + fail("Failed to test writeMessage due to: " + e.getMessage()); + } + **/ + } + + /** + * Test of validateRequestReplyInboundMessageExchangeProperties method, + * of class com.sun.jbi.filebc.OutboundMessageProcessor + */ + public void testValidateRequestReplyInboundMessageExchangeProperties() { + FileOperation operation = new FileOperation(); + FileOutput fileOutput = new FileOutput(); + FileMessage fileMessage = new FileMessage(); + QName opname = QName.valueOf("operation1"); + + // testing null input properties + try { + instance.validateRequestReplyInboundMessageExchangeProperties(operation, opname); + fail("Failed to test validateRequestReplyInboundMessageExchangeProperties - an exception should be raised due to null File Input properties."); + } catch (Exception e) { + System.out.println("Successfully tested validateRequestReplyInboundMessageExchangeProperties with null File Input properties."); + } + + // testing null File write properties + operation.setFileOperationOutput(fileOutput); + try { + instance.validateRequestReplyInboundMessageExchangeProperties(operation, opname); + fail("Failed to test validateRequestReplyInboundMessageExchangeProperties - an exception should be raised due to null File Write properties."); + } catch (Exception e) { + System.out.println("Successfully tested validateRequestReplyInboundMessageExchangeProperties with null File Write properties."); + } + + // testing missing required File write attributes + fileOutput.setFileMessage(fileMessage); + try { + instance.validateRequestReplyInboundMessageExchangeProperties(operation, opname); + fail("Failed to test validateRequestReplyInboundMessageExchangeProperties - an exception should be raised due to undefined fileName attribute when fileNameIsPattern is false."); + } catch (Exception e) { + System.out.println("Successfully tested validateRequestReplyInboundMessageExchangeProperties when fileName is not defined and fileNameIsPattern is false."); + } + + fileMessage.setFileNameIsPattern(Boolean.TRUE); + try { + instance.validateRequestReplyInboundMessageExchangeProperties(operation, opname); + fail("Failed to test validateRequestReplyInboundMessageExchangeProperties - an exception should be raised due to undefined filePrefix and fileExtension attributes when fileNameIsPattern is true."); + } catch (Exception e) { + System.out.println("Successfully tested validateRequestReplyInboundMessageExchangeProperties when both filePrefix and fileExtension are not defined and fileNameIsPattern is true."); + } + + // testing invalid File Write attribute value + fileMessage.setFileType("undefined"); + try { + instance.validateRequestReplyInboundMessageExchangeProperties(operation, opname); + fail("Failed to test validateRequestReplyInboundMessageExchangeProperties - an exception should be raised due to invalid File Write attribute value: fileType is undefined."); + } catch (Exception e) { + System.out.println("Successfully tested validateRequestReplyInboundMessageExchangeProperties: invalid File Write attribute value: fileType is undefined."); + } + } + + /** + * Test of validateOutboundMessageExchangeProperties method, + * of class com.sun.jbi.filebc.OutboundMessageProcessor + */ + public void testValidateOutboundMessageExchangeProperties() { + FileOperation operation = new FileOperation(); + FileInput fileInput = new FileInput(); + FileMessage fileMessage = new FileMessage(); + QName opname = QName.valueOf("operation1"); + + // testing null input properties + try { + instance.validateOutboundMessageExchangeProperties(operation, opname); + fail("Failed to test validateOutboundMessageExchangeProperties - an exception should be raised due to null File Input properties."); + } catch (Exception e) { + System.out.println("Successfully tested validateOutboundMessageExchangeProperties with null File Input properties."); + } + + // testing null File write properties + operation.setFileOperationInput(fileInput); + try { + instance.validateOutboundMessageExchangeProperties(operation, opname); + fail("Failed to test validateOutboundMessageExchangeProperties - an exception should be raised due to null File Write properties."); + } catch (Exception e) { + System.out.println("Successfully tested validateOutboundMessageExchangeProperties with null File Write properties."); + } + + // testing missing required File write attributes + fileInput.setFileMessage(fileMessage); + try { + instance.validateOutboundMessageExchangeProperties(operation, opname); + fail("Failed to test validateOutboundMessageExchangeProperties - an exception should be raised due to undefined fileName attribute when fileNameIsPattern is false."); + } catch (Exception e) { + System.out.println("Successfully tested validateOutboundMessageExchangeProperties when fileName is not defined and fileNameIsPattern is false."); + } + + fileMessage.setFileNameIsPattern(Boolean.TRUE); + try { + instance.validateOutboundMessageExchangeProperties(operation, opname); + fail("Failed to test validateOutboundMessageExchangeProperties - an exception should be raised due to undefined filePrefix and fileExtension attributes when fileNameIsPattern is true."); + } catch (Exception e) { + System.out.println("Successfully tested validateOutboundMessageExchangeProperties when both filePrefix and fileExtension are not defined and fileNameIsPattern is true."); + } + + // testing invalid File Write attribute value + fileMessage.setFileType("undefined"); + try { + instance.validateOutboundMessageExchangeProperties(operation, opname); + fail("Failed to test validateOutboundMessageExchangeProperties - an exception should be raised due to invalid File Write attribute value: fileType is undefined."); + } catch (Exception e) { + System.out.println("Successfully tested validateOutboundMessageExchangeProperties: invalid File Write attribute value: fileType is undefined."); + } + } + + private String getFileContents(String fileName) { + StringBuffer output = new StringBuffer(); + java.io.FileReader reader = null; + + try { + reader = new java.io.FileReader(fileName); + char[] buff = new char[512]; + int len = reader.read(buff); + while (len > 0) { + output.append(buff, 0, len); + len = reader.read(buff); + } + reader.close(); + } catch (Exception e) { + fail("Failed to retrieve content from " + fileName + "."); + } + + return output.toString(); + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/ReceiverTest.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/ReceiverTest.java new file mode 100644 index 000000000..37b8f5463 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/ReceiverTest.java @@ -0,0 +1,103 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * BEGIN_HEADER - DO NOT EDIT + * + * The contents of this file are subject to the terms + * of the Common Development and Distribution License + * (the "License"). You may not use this file except + * in compliance with the License. + * + * You can obtain a copy of the license at + * https://${package}.dev.java.net/public/CDDLv1.0.html. + * See the License for the specific language governing + * permissions and limitations under the License. + * + * When distributing Covered Code, include this CDDL + * HEADER in each file and include the License file at + * https://${package}.dev.java.net/public/CDDLv1.0.html. + * If applicable add the following below this CDDL HEADER, + * with the fields enclosed by brackets "[]" replaced with + * your own identifying information: Portions Copyright + * [year] [name of copyright owner] + */ + +/* + * @(${symbol_pound})ReceiverTest.java + * + * Copyright 2004-2007 Sun Microsystems, Inc. All Rights Reserved. + * + * END_HEADER - DO NOT EDIT + */ +package com.sun.jbi.filebc; + +import junit.framework.*; +import java.util.List; +import java.util.HashMap; +import org.jmock.*; + +import com.sun.jbi.common.qos.messaging.MessagingChannel; +import com.sun.jbi.component.jbiext.KeyStoreUtilClient; +import javax.jbi.component.ComponentContext; + +/** + * + * @author sweng + */ +public class ReceiverTest extends org.jmock.cglib.MockObjectTestCase { + + Receiver instance = null; + Mock runtimeConfig = null; + Mock deliveryChannel = null; + private Mock componentContext = null; + + public ReceiverTest(String testName) { + super(testName); + } + + protected void setUp() throws Exception { + componentContext = mock(ComponentContext.class); + KeyStoreUtilClient keystoreUtil = new KeyStoreUtilClient((ComponentContext) componentContext.proxy()); + runtimeConfig = mock(RuntimeConfiguration.class, + new Class[]{String.class, KeyStoreUtilClient.class}, + new Object[]{"test/com/sun/jbi/filebc/testDir", keystoreUtil}); + deliveryChannel = mock(MessagingChannel.class); + runtimeConfig.expects(once()).method("getThreads").will(returnValue(new Integer(10))); + runtimeConfig.expects(once()).method("addNotificationListener").withAnyArguments(); + instance = new Receiver((MessagingChannel) deliveryChannel.proxy(), + new HashMap(), + (RuntimeConfiguration) runtimeConfig.proxy()); + } + + protected void tearDown() throws Exception { + } + + public static Test suite() { + TestSuite suite = new TestSuite(ReceiverTest.class); + + return suite; + } + + /** + * Test of setThreads method, of class com.sun.jbi.filebc.Receiver. + */ + public void testSetThreads() { + System.out.println("Testing setThreads"); + + instance.setThreads(8); + List workers = instance.getWorkers(); + assertEquals(8, workers.size()); + } + + /** + * Test of stopReceiving method, of class com.sun.jbi.filebc.Receiver. + */ + public void testStopReceiving() { + System.out.println("Testing stopReceiving"); + instance.stopReceiving(); + + List workers = instance.getWorkers(); + assertEquals(0, workers.size()); + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/ServiceUnitImplTest.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/ServiceUnitImplTest.java new file mode 100644 index 000000000..25a07a26d --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/ServiceUnitImplTest.java @@ -0,0 +1,211 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * BEGIN_HEADER - DO NOT EDIT + * + * The contents of this file are subject to the terms + * of the Common Development and Distribution License + * (the "License"). You may not use this file except + * in compliance with the License. + * + * You can obtain a copy of the license at + * https://${package}.dev.java.net/public/CDDLv1.0.html. + * See the License for the specific language governing + * permissions and limitations under the License. + * + * When distributing Covered Code, include this CDDL + * HEADER in each file and include the License file at + * https://${package}.dev.java.net/public/CDDLv1.0.html. + * If applicable add the following below this CDDL HEADER, + * with the fields enclosed by brackets "[]" replaced with + * your own identifying information: Portions Copyright + * [year] [name of copyright owner] + */ + +/* + * @(${symbol_pound})ServiceUnitImplTest.java + * + * Copyright 2004-2007 Sun Microsystems, Inc. All Rights Reserved. + * + * END_HEADER - DO NOT EDIT + */ +package com.sun.jbi.filebc; + +import junit.framework.*; + +import com.sun.jbi.eManager.provider.StatusProviderHelper; +import javax.jbi.messaging.DeliveryChannel; +import java.util.ArrayList; +import java.util.List; +import javax.jbi.component.ComponentContext; +import javax.management.MBeanServer; +import javax.xml.namespace.QName; +import org.jmock.*; + +/** + * + * @author sweng + */ +public class ServiceUnitImplTest extends MockObjectTestCase { + + ServiceUnitImpl instance = null; + Mock componentContext = mock(ComponentContext.class); + Mock deliveryChannel = mock(DeliveryChannel.class); + Mock mbServer = mock(MBeanServer.class); + StatusProviderHelper statusHelper = null; + InboundReceiver inboundReceiver = null; + Endpoint endpoint = null; + List endpoints = new ArrayList(); + + public ServiceUnitImplTest(String testName) { + super(testName); + } + + protected void setUp() throws Exception { + statusHelper = new StatusProviderHelper("shortName", "componentType", "componentName", (MBeanServer) mock(MBeanServer.class).proxy()); + endpoint = new EndpointImpl(); + endpoint.setServiceName(new QName("MySerivceName")); + endpoint.setEndpointName("MyEndpointName"); + endpoints.add(endpoint); + + inboundReceiver = new InboundReceiver((ComponentContext) componentContext.proxy(), + (DeliveryChannel) deliveryChannel.proxy(), + new RuntimeConfiguration("test/com/sun/jbi/filebc/testDir", null)); + instance = new ServiceUnitImpl("TestId", + "test/com/sun/jbi/filebc/packaging/descriptors", + (ComponentContext) componentContext.proxy(), + new RuntimeConfiguration("test/com/sun/jbi/filebc/testDir", null), + statusHelper, + inboundReceiver); + } + + protected void tearDown() throws Exception { + } + + public static Test suite() { + TestSuite suite = new TestSuite(ServiceUnitImplTest.class); + + return suite; + } + + /** + * Test of getServiceUnitId method, of class com.sun.jbi.filebc.ServiceUnitImpl. + */ + public void testGetServiceUnitId() { + System.out.println("Testing getServiceUnitId"); + + String result = instance.getServiceUnitId(); + assertEquals("TestId", result); + } + + /** + * Test of init method, of class com.sun.jbi.filebc.ServiceUnitImpl. + */ + public void testInit() throws Exception { + System.out.println("Testing init"); + + instance.setEndpoints(endpoints); + //componentContext.expects(atLeastOnce()).method("getComponentName").will(returnValue("someComponentName")); + //componentContext.expects(atLeastOnce()).method("getLogger").with(eq(DeploymentLookup.class.getName()), eq(null)).will(returnValue(Logger.getLogger(DeploymentLookup.class.getName(), null))); + //componentContext.expects(atLeastOnce()).method("getMBeanServer").will(returnValue(mbServer.proxy())); + //mbServer.expects(atLeastOnce()).method("queryNames").with(isA(ObjectName.class), NULL); + + try { + instance.init(); + System.out.println("Successfully tested init"); + } catch (Exception e) { + fail("Failed to test init method due to: " + e.getMessage()); + } + } + + /** + * Test of start method, of class com.sun.jbi.filebc.ServiceUnitImpl. + */ + public void testStart() throws Exception { + System.out.println("Testing start"); + try { + instance.start(); + System.out.println("Successfully tested start"); + } catch (Exception e) { + fail("Failed to test start method due to: " + e.getMessage()); + } + } + + /** + * Test of stop method, of class com.sun.jbi.filebc.ServiceUnitImpl. + */ + public void testStop() throws Exception { + System.out.println("Testing stop"); + + try { + instance.stop(); + System.out.println("Successfully tested stop"); + } catch (Exception e) { + fail("Failed to test stop method due to: " + e.getMessage()); + } + } + + /** + * Test of shutdown method, of class com.sun.jbi.filebc.ServiceUnitImpl. + */ + public void testShutdown() throws Exception { + System.out.println("Testing shutdown"); + + try { + instance.shutdown(); + System.out.println("Successfully tested shutdown"); + } catch (Exception e) { + fail("Failed to test shutdown method due to: " + e.getMessage()); + } + } + /** + * Test of activateEndpoint method, of class com.sun.jbi.filebc.ServiceUnitImpl. + */ +// public void testActivateEndpoint() throws Exception { +// System.out.println("Testing activateEndpoint"); +// +// // 1. testing the scenario where endpoint type is outbound +// endpoint.setEndpointType(1); +// Mock serviceEndpoint = mock(ServiceEndpoint.class); +// componentContext.expects(atLeastOnce()).method("activateEndpoint").with(eq(new QName("MySerivceName")), eq("MyEndpointName")). +// will(returnValue((ServiceEndpoint)serviceEndpoint.proxy())); +// +// instance.activateEndpoint(endpoint); +// componentContext.verify(); +// System.out.println("Successfully tested activateEndpoint for an outbound endpoint"); +// +// // 2. testing the scenario where endpoint type is inbound +// endpoint.setEndpointType(0); +// try { +// instance.activateEndpoint(endpoint); +// System.out.println("Successfully tested activateEndpoint for an inbound endpoint"); +// } catch (Exception e) { +// fail("Failed to test activateEndpoint for an inbound endpoint"); +// } +// } + /** + * Test of deactivateEndpoint method, of class com.sun.jbi.filebc.ServiceUnitImpl. + */ +// public void testDeactivateEndpoint() throws Exception { +// System.out.println("Testing deactivateEndpoint"); +// +// // 1. testing the scenario where endpoint type is outbound +// endpoint.setEndpointType(1); +// Mock serviceEndpoint = mock(ServiceEndpoint.class); +// endpoint.setServiceEndpoint((ServiceEndpoint) serviceEndpoint.proxy()); +// componentContext.expects(atLeastOnce()).method("deactivateEndpoint").with(eq(serviceEndpoint.proxy())); +// instance.deactivateEndpoint(endpoint); +// componentContext.verify(); +// System.out.println("Successfully tested deactivateEndpoint for an outbound endpoint"); +// +// // 2. testing the scenario where endpoint type is inbound +// endpoint.setEndpointType(0); +// try { +// instance.deactivateEndpoint(endpoint); +// System.out.println("Successfully tested deactivateEndpoint for an inbound endpoint"); +// } catch (Exception e) { +// fail("Failed to test deactivateEndpoint for an inbound endpoint"); +// } +// } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/bootstrap/FileBindingBootstrapTest.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/bootstrap/FileBindingBootstrapTest.java new file mode 100644 index 000000000..7a8151dc9 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/bootstrap/FileBindingBootstrapTest.java @@ -0,0 +1,176 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * BEGIN_HEADER - DO NOT EDIT + * + * The contents of this file are subject to the terms + * of the Common Development and Distribution License + * (the "License"). You may not use this file except + * in compliance with the License. + * + * You can obtain a copy of the license at + * https://${package}.dev.java.net/public/CDDLv1.0.html. + * See the License for the specific language governing + * permissions and limitations under the License. + * + * When distributing Covered Code, include this CDDL + * HEADER in each file and include the License file at + * https://${package}.dev.java.net/public/CDDLv1.0.html. + * If applicable add the following below this CDDL HEADER, + * with the fields enclosed by brackets "[]" replaced with + * your own identifying information: Portions Copyright + * [year] [name of copyright owner] + */ + +/* + * @(${symbol_pound})FileBindingBootstrapTest.java + * + * Copyright 2004-2007 Sun Microsystems, Inc. All Rights Reserved. + * + * END_HEADER - DO NOT EDIT + */ +package com.sun.jbi.filebc.bootstrap; + +import junit.framework.*; +import java.util.Hashtable; +import java.util.logging.Logger; +import javax.jbi.component.ComponentContext; +import javax.jbi.component.InstallationContext; +import javax.jbi.management.MBeanNames; +import javax.management.MBeanRegistrationException; +import javax.management.MBeanServer; +import javax.management.ObjectName; +import javax.management.StandardMBean; +import org.jmock.*; + +/** + * + * @author sweng + */ +public class FileBindingBootstrapTest extends org.jmock.cglib.MockObjectTestCase { + + FileBindingBootstrap instance = null; + ObjectName objectName = null; + Mock context = mock(InstallationContext.class); + Mock componentContext = mock(ComponentContext.class); + Mock mbServer = mock(MBeanServer.class); + Mock mbNames = mock(MBeanNames.class); + Mock installerExtMbean = mock(InstallerExtMBean.class); + + public FileBindingBootstrapTest(String testName) { + super(testName); + } + + protected void setUp() throws Exception { + instance = new FileBindingBootstrap(); + Hashtable table = new Hashtable(); + table.put("someKey", "someValue"); + objectName = new ObjectName("someObjectName", table); + } + + protected void tearDown() throws Exception { + } + + public static Test suite() { + TestSuite suite = new TestSuite(FileBindingBootstrapTest.class); + + return suite; + } + + /** + * Test of init method, of class com.sun.jbi.filebc.bootstrap.FileBindingBootstrap. + */ + public void testInit() throws Exception { + System.out.println("Testing init"); + +// Mock componentConfig = mock(ComponentConfig.class); +// Mock defaultProperties = mock(ComponentConfig.class); + + String installRoot = "test/com/sun/jbi/filebc/bootstrap"; + + // 1. testing the success scenario + context.expects(atLeastOnce()).method("getContext").will(returnValue(componentContext.proxy())); +// installerExtMbean.expects(atLeastOnce()).method("setInitialConfigurations").with(isA(ComponentConfig.class)); + + componentContext.expects(atLeastOnce()).method("getLogger").with(eq(FileBindingBootstrap.class.getName()), eq("com.sun.jbi.filebc.bootstrap.messages.Bundle")).will(returnValue(Logger.getLogger(FileBindingBootstrap.class.getName(), "com.sun.jbi.filebc.bootstrap.messages.Bundle"))); + componentContext.expects(atLeastOnce()).method("getLogger").with(eq("com.sun.jbi.filebc.bootstrap.InstallerExt"), eq("com.sun.jbi.filebc.bootstrap.messages.Bundle")).will(returnValue(Logger.getLogger("com.sun.jbi.filebc.bootstrap.InstallerExt", "com.sun.jbi.filebc.bootstrap.messages.Bundle"))); + componentContext.expects(atLeastOnce()).method("getMBeanServer").will(returnValue(mbServer.proxy())); + componentContext.expects(atLeastOnce()).method("getMBeanNames").will(returnValue(mbNames.proxy())); + mbNames.expects(atLeastOnce()).method("createCustomComponentMBeanName").with(eq(MBeanNames.BOOTSTRAP_EXTENSION)).will(returnValue(objectName)); + mbServer.expects(atLeastOnce()).method("isRegistered").with(eq(objectName)).will(returnValue(false)); + mbServer.expects(atLeastOnce()).method("registerMBean").with(isA(StandardMBean.class), eq(objectName)); + context.expects(atLeastOnce()).method("getInstallRoot").will(returnValue(installRoot)); +// componentConfig.expects(atLeastOnce()).method("parse").with(eq(installRoot)).will(returnValue(defaultProperties.proxy())); + try { + instance.init((InstallationContext) context.proxy()); + System.out.println("Successfully tested init for the scenario where no exception is expected."); + } catch (Exception e) { + fail("Failed to test init for the scenario where no exception is expected due to: " + e.getMessage()); + } +// componentConfig.verify(); + mbServer.verify(); + mbNames.verify(); + context.verify(); + + // 2. testing the failure scenario + mbServer.expects(once()).method("registerMBean").with(isA(StandardMBean.class), eq(objectName)).will(throwException(new MBeanRegistrationException(new Exception(), "someException"))); + try { + instance.init((InstallationContext) context.proxy()); + fail("Failed to test init when an exception should be caught - a MBeanRegistrationException is raised."); + } catch (Exception e) { + System.out.println("Successfully tested init when an exception is raised."); + } + mbServer.verify(); + mbNames.verify(); + context.verify(); + } + + /** + * Test of onInstall method, of class com.sun.jbi.filebc.bootstrap.FileBindingBootstrap. + */ +// public void testOnInstall() throws Exception { +// System.out.println("Testing onInstall"); +// +// Mock documentFragment = mock(DocumentFragment.class); +// Mock nodelist = mock(NodeList.class); +// nodelist.expects(atLeastOnce()).method("getLength").will(returnValue(0)); +// documentFragment.expects(atLeastOnce()).method("getChildNodes").will(returnValue(nodelist.proxy())); +// context.expects(once()).method("getContext").will(returnValue(componentContext.proxy())); +// context.expects(once()).method("getInstallationDescriptorExtension").will(returnValue(documentFragment.proxy())); +// componentContext.expects(atLeastOnce()).method("getMBeanServer").will(returnValue(mbServer.proxy())); +// componentContext.expects(once()).method("getWorkspaceRoot").will(returnValue("test/com/sun/jbi/filebc/testDir")); +// mbServer.expects(once()).method("getMBeanInfo").will(returnValue(null)); +// instance.setInstallationContext((InstallationContext)context.proxy()); +// try { +// instance.onInstall(); +// System.out.println("Successfully tested onInstall."); +// } catch (Exception e) { +// fail("Failed to test onInstall due to: " + e.getMessage()); +// } +// context.verify(); +// componentContext.verify(); +// } + /** + * Test of cleanUp method, of class com.sun.jbi.filebc.bootstrap.FileBindingBootstrap. + */ + public void testCleanUp() throws Exception { + System.out.println("Testing cleanUp"); + + context.expects(once()).method("getContext").will(returnValue(componentContext.proxy())); + componentContext.expects(atLeastOnce()).method("getMBeanServer").will(returnValue(mbServer.proxy())); + mbServer.expects(atLeastOnce()).method("isRegistered").with(eq(objectName)).will(returnValue(true)); + mbServer.expects(atLeastOnce()).method("unregisterMBean").with(eq(objectName)); + instance.setInstallationContext((InstallationContext) context.proxy()); + instance.setMBeanObjectName(objectName); + + try { + instance.cleanUp(); + System.out.println("Successfully tested cleanUp."); + } catch (Exception e) { + fail("Failed to test cleanUp due to: " + e.getMessage()); + } + context.verify(); + componentContext.verify(); + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/bootstrap/InstallerExtTest.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/bootstrap/InstallerExtTest.java new file mode 100644 index 000000000..02a7d1e15 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/bootstrap/InstallerExtTest.java @@ -0,0 +1,74 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * BEGIN_HEADER - DO NOT EDIT + * + * The contents of this file are subject to the terms + * of the Common Development and Distribution License + * (the "License"). You may not use this file except + * in compliance with the License. + * + * You can obtain a copy of the license at + * https://${package}.dev.java.net/public/CDDLv1.0.html. + * See the License for the specific language governing + * permissions and limitations under the License. + * + * When distributing Covered Code, include this CDDL + * HEADER in each file and include the License file at + * https://${package}.dev.java.net/public/CDDLv1.0.html. + * If applicable add the following below this CDDL HEADER, + * with the fields enclosed by brackets "[]" replaced with + * your own identifying information: Portions Copyright + * [year] [name of copyright owner] + */ + +/* + * @(${symbol_pound})InstallerExtTest.java + * + * Copyright 2004-2007 Sun Microsystems, Inc. All Rights Reserved. + * + * END_HEADER - DO NOT EDIT + */ +package com.sun.jbi.filebc.bootstrap; + +import junit.framework.*; + +/** + * + * @author sweng + */ +public class InstallerExtTest extends TestCase { + + InstallerExt instance = new InstallerExt(); + + public InstallerExtTest(String testName) { + super(testName); + } + + protected void setUp() throws Exception { + } + + protected void tearDown() throws Exception { + } + + public static Test suite() { + TestSuite suite = new TestSuite(InstallerExtTest.class); + + return suite; + } + + /** + * Test of setThreads and getThreads method, of class com.sun.jbi.filebc.bootstrap.InstallerExt. + */ + public void testSetGetThreads() { + System.out.println("Testing setThreads and getThreads"); + +// String threads = "someNumberOfThreads"; + Integer threads = new Integer(10); + instance.setThreads(threads); +// String result = instance.getThreads(); + Integer result = instance.getThreads(); + assertEquals(threads, result); + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/bootstrap/META-INF/jbi.xml b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/bootstrap/META-INF/jbi.xml new file mode 100644 index 000000000..dfa657ac3 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/bootstrap/META-INF/jbi.xml @@ -0,0 +1,120 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + + + + + + + + sun-file-binding + File binding + + + com.sun.jbi.filebc.FileBindingLifeCycle + + lib/wsdl4j.jar + lib/${artifactId}.jar + lib/resolver.jar + lib/componentsl.jar + lib/xsdmodel.jar + lib/common-util.jar + lib/qos.jar + + com.sun.jbi.filebc.bootstrap.FileBindingBootstrap + + lib/${artifactId}.jar + lib/componentsl.jar + lib/common-util.jar + lib/qos.jar + + sun-encoder-library + + com.sun.jbi.filebc.FileBindingDeployer + com.sun.jbi.filebc.FileBindingLifeCycle + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/extensions/FileAddressTest.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/extensions/FileAddressTest.java new file mode 100644 index 000000000..da98dd9b4 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/extensions/FileAddressTest.java @@ -0,0 +1,114 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * BEGIN_HEADER - DO NOT EDIT + * + * The contents of this file are subject to the terms + * of the Common Development and Distribution License + * (the "License"). You may not use this file except + * in compliance with the License. + * + * You can obtain a copy of the license at + * https://${package}.dev.java.net/public/CDDLv1.0.html. + * See the License for the specific language governing + * permissions and limitations under the License. + * + * When distributing Covered Code, include this CDDL + * HEADER in each file and include the License file at + * https://${package}.dev.java.net/public/CDDLv1.0.html. + * If applicable add the following below this CDDL HEADER, + * with the fields enclosed by brackets "[]" replaced with + * your own identifying information: Portions Copyright + * [year] [name of copyright owner] + */ + +/* + * @(${symbol_pound})FileAddressTest.java + * + * Copyright 2004-2007 Sun Microsystems, Inc. All Rights Reserved. + * + * END_HEADER - DO NOT EDIT + */ +package com.sun.jbi.filebc.extensions; + +import junit.framework.*; +import javax.xml.namespace.QName; + +/** + * + * @author sweng + */ +public class FileAddressTest extends TestCase { + + FileAddress instance = null; + + public FileAddressTest(String testName) { + super(testName); + } + + protected void setUp() throws Exception { + instance = new FileAddress(); + } + + protected void tearDown() throws Exception { + } + + public static Test suite() { + TestSuite suite = new TestSuite(FileAddressTest.class); + + return suite; + } + + /** + * Test of setElementType and getElementType method, of class com.sun.jbi.filebc.extensions.FileAddress. + */ + public void testSetGetElementType() { + System.out.println("Testing setElementType and getElementType"); + + // 1. testing the default value of element type + QName expResult = new QName("http://schemas.sun.com/jbi/wsdl-extensions/file/", "address"); + QName result = instance.getElementType(); + assertEquals(expResult, result); + + // 2. testing setElementType + QName val = new QName("http://my-file-address-test", "address"); + expResult = new QName("http://my-file-address-test", "address"); + instance.setElementType(val); + result = instance.getElementType(); + assertEquals(expResult, result); + + System.out.println("Successfully tested setElementType and getElementType"); + } + + /** + * Test of setRequired and getRequired method, of class com.sun.jbi.filebc.extensions.FileAddress. + */ + public void testSetGetRequired() { + System.out.println("Testing setRequired and getRequired"); + + Boolean val = Boolean.TRUE; + Boolean expResult = Boolean.TRUE; + instance.setRequired(val); + Boolean result = instance.getRequired(); + assertEquals(expResult, result); + + System.out.println("Successfully tested setRequired and getRequired"); + } + + /** + * Test of setFileDirectory and getFileDirectory method, of class com.sun.jbi.filebc.extensions.FileAddress. + */ + public void testSetGetFileDirectory() { + System.out.println("Testing setInputDir and getInputDir"); + + String val = "c:/myfiletest/myDir"; + ; + String expResult = "c:/myfiletest/myDir"; + instance.setFileDirectory(val); + String result = instance.getFileDirectory(); + assertEquals(expResult, result); + + System.out.println("Successfully tested setInputDir and getInputDir"); + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/extensions/FileBindingTest.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/extensions/FileBindingTest.java new file mode 100644 index 000000000..4d8c8a1b8 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/extensions/FileBindingTest.java @@ -0,0 +1,115 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * BEGIN_HEADER - DO NOT EDIT + * + * The contents of this file are subject to the terms + * of the Common Development and Distribution License + * (the "License"). You may not use this file except + * in compliance with the License. + * + * You can obtain a copy of the license at + * https://${package}.dev.java.net/public/CDDLv1.0.html. + * See the License for the specific language governing + * permissions and limitations under the License. + * + * When distributing Covered Code, include this CDDL + * HEADER in each file and include the License file at + * https://${package}.dev.java.net/public/CDDLv1.0.html. + * If applicable add the following below this CDDL HEADER, + * with the fields enclosed by brackets "[]" replaced with + * your own identifying information: Portions Copyright + * [year] [name of copyright owner] + */ + +/* + * @(${symbol_pound})FileBindingTest.java + * + * Copyright 2004-2007 Sun Microsystems, Inc. All Rights Reserved. + * + * END_HEADER - DO NOT EDIT + */ +package com.sun.jbi.filebc.extensions; + +import junit.framework.*; +import javax.xml.namespace.QName; + +import com.ibm.wsdl.Constants; + +/** + * + * @author sweng + */ +public class FileBindingTest extends TestCase { + + FileBinding instance = null; + + public FileBindingTest(String testName) { + super(testName); + } + + protected void setUp() throws Exception { + instance = new FileBinding(); + } + + protected void tearDown() throws Exception { + } + + public static Test suite() { + TestSuite suite = new TestSuite(FileBindingTest.class); + + return suite; + } + + /** + * Test of setElementType and getElementType method, of class com.sun.jbi.filebc.extensions.FileBinding. + */ + public void testSetGetElementType() { + System.out.println("Testing setElementType and getElementType"); + + // 1. testing default element type value + QName expResult = new QName("http://schemas.sun.com/jbi/wsdl-extensions/file/", Constants.ELEM_BINDING); + QName result = instance.getElementType(); + assertEquals(expResult, result); + + // 2. testing setElementType + QName val = new QName("http://my-file-binding/test", Constants.ELEM_BINDING); + expResult = new QName("http://my-file-binding/test", Constants.ELEM_BINDING); + instance.setElementType(val); + result = instance.getElementType(); + assertEquals(expResult, result); + + System.out.println("Successfully tested setElementType and getElementType"); + } + + /** + * Test of setRequired and getRequired method, of class com.sun.jbi.filebc.extensions.FileBinding. + */ + public void testSetGetRequired() { + System.out.println("Testing setRequired and getRequired"); + + Boolean expResult = Boolean.FALSE; + instance.setRequired(Boolean.FALSE); + Boolean result = instance.getRequired(); + assertEquals(expResult, result); + + System.out.println("Successfully tested setRequired and getRequired"); + } + + /** + * Test of toString method, of class com.sun.jbi.filebc.extensions.FileBinding. + */ + public void testToString() { + System.out.println("Testing toString"); + + String expResult = "FileBinding {http://my-file-binding/test}binding:" + + "${symbol_escape}nRequired=false"; + instance.setElementType(new QName("http://my-file-binding/test", Constants.ELEM_BINDING)); + instance.setRequired(Boolean.FALSE); + String result = instance.toString(); + assertTrue(result.indexOf(expResult) > 0); + + System.out.println("Successfully tested toString"); + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/extensions/FileExtSerializerTest.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/extensions/FileExtSerializerTest.java new file mode 100644 index 000000000..68ba9d8be --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/extensions/FileExtSerializerTest.java @@ -0,0 +1,298 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * BEGIN_HEADER - DO NOT EDIT + * + * The contents of this file are subject to the terms + * of the Common Development and Distribution License + * (the "License"). You may not use this file except + * in compliance with the License. + * + * You can obtain a copy of the license at + * https://${package}.dev.java.net/public/CDDLv1.0.html. + * See the License for the specific language governing + * permissions and limitations under the License. + * + * When distributing Covered Code, include this CDDL + * HEADER in each file and include the License file at + * https://${package}.dev.java.net/public/CDDLv1.0.html. + * If applicable add the following below this CDDL HEADER, + * with the fields enclosed by brackets "[]" replaced with + * your own identifying information: Portions Copyright + * [year] [name of copyright owner] + */ + +/* + * @(${symbol_pound})FileExtSerializerTest.java + * + * Copyright 2004-2007 Sun Microsystems, Inc. All Rights Reserved. + * + * END_HEADER - DO NOT EDIT + */ +package com.sun.jbi.filebc.extensions; + +import junit.framework.*; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.FileReader; +import java.io.InputStreamReader; +import java.io.PrintWriter; +import javax.wsdl.extensions.ExtensibilityElement; +import javax.wsdl.extensions.ExtensionRegistry; +import javax.wsdl.Definition; +import javax.wsdl.factory.WSDLFactory; +import javax.wsdl.xml.WSDLReader; +import javax.xml.namespace.QName; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; + +import com.ibm.wsdl.Constants; +import com.ibm.wsdl.factory.WSDLFactoryImpl; + +import org.apache.xml.resolver.CatalogManager; +import org.apache.xml.resolver.tools.CatalogResolver; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.InputSource; + +/** + * + * @author sweng + */ +public class FileExtSerializerTest extends TestCase { + + Class parentType = null; + Definition def = null; + ExtensionRegistry extReg = null; + FileExtSerializer instance = null; + QName bindingElementType = null; + QName bindingOperationElementType = null; + QName addressElementType = null; + QName messageElementType = null; + Document doc = null; + WSDLFactory wsdlFactory = null; + WSDLReader reader = null; + String outputFolder = null; + String expectedFolder = null; + + public FileExtSerializerTest(String testName) { + super(testName); + } + + protected void setUp() throws Exception { + instance = new FileExtSerializer(); + extReg = new ExtensionRegistry(); + bindingElementType = new QName("http://schemas.sun.com/jbi/wsdl-extensions/file/", Constants.ELEM_BINDING); + bindingOperationElementType = new QName("http://schemas.sun.com/jbi/wsdl-extensions/file/", Constants.ELEM_OPERATION); + addressElementType = new QName("http://schemas.sun.com/jbi/wsdl-extensions/file/", "address"); + messageElementType = new QName("http://schemas.sun.com/jbi/wsdl-extensions/file/", "message"); + outputFolder = "test/com/sun/jbi/filebc/extensions/output/"; + expectedFolder = "test/com/sun/jbi/filebc/extensions/expected/"; + BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(new File("test/com/sun/jbi/filebc/packaging/wsdls/TestFile.wsdl")), "UTF-8")); + wsdlFactory = WSDLFactory.newInstance(); + reader = ((WSDLFactoryImpl) wsdlFactory).newWSDLReader(new CatalogResolver(new CatalogManager())); + def = reader.readWSDL(new File("test/com/sun/jbi/filebc/packaging/wsdls/TestFile.wsdl").getAbsolutePath()); + try { + InputSource is = new InputSource(br); + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + DocumentBuilder db; + synchronized (dbf) { + dbf.setNamespaceAware(true); + db = dbf.newDocumentBuilder(); + } + doc = db.parse(is); + + } catch (Exception e) { + fail("Something went wrong during parsing TestFile.wsdl, cannot proceed"); + } + + if (doc == null) { + fail("Something went wrong during parsing TestFile.wsdl, cannot proceed"); + } + } + + protected void tearDown() throws Exception { + } + + public static Test suite() { + TestSuite suite = new TestSuite(FileExtSerializerTest.class); + + return suite; + } + + /** + * Test of marshall method, of class com.sun.jbi.filebc.extensions.FileExtSerializer. + */ + public void testMarshall() throws Exception { + System.out.println("Testing marshall"); + ExtensibilityElement elem = null; + String outputFileName = null; + String expectedOutputFileName = null; + PrintWriter pw = null; + + // 1. testing file:binding extensibility element + elem = new FileBinding(); + outputFileName = outputFolder + "TestFileBindingElement.xml"; + expectedOutputFileName = expectedFolder + "FileBindingElement.xml"; + pw = new PrintWriter(new FileOutputStream(new File(outputFileName))); + instance.marshall(null, null, elem, pw, def, extReg); + pw.flush(); + + System.out.println("======== expected output is [" + getFileContents(expectedOutputFileName) + "] and actual output is [" + getFileContents(outputFileName) + "]"); + assertEquals(getFileContents(expectedOutputFileName).trim(), getFileContents(outputFileName).trim()); + + // 2. testing file:operation extensibility element + elem = new FileOperation(); + outputFileName = outputFolder + "TestFileOperationElement.xml"; + expectedOutputFileName = expectedFolder + "FileOperationElement.xml"; + + elem.setRequired(Boolean.TRUE); + + pw = new PrintWriter(new FileOutputStream(new File(outputFileName))); + instance.marshall(null, null, elem, pw, def, extReg); + pw.flush(); + + assertEquals(getFileContents(expectedOutputFileName).trim(), getFileContents(outputFileName).trim()); + + // 3. testing file:messag extensibility element + outputFileName = outputFolder + "TestFileMessageElement.xml"; + expectedOutputFileName = expectedFolder + "FileMessageElement.xml"; + + elem = new FileMessage(); + ((FileMessage) elem).setFileName("FileBCInput.txt"); + ((FileMessage) elem).setFileNameIsPattern(Boolean.TRUE); + ((FileMessage) elem).setPollingInterval(new Long(9999)); + ((FileMessage) elem).setMultipleRecordsPerFile(Boolean.TRUE); + ((FileMessage) elem).setProtectDirectory("protect"); + + pw = new PrintWriter(new FileOutputStream(new File(outputFileName))); + instance.marshall(null, null, elem, pw, def, extReg); + pw.flush(); + + assertEquals(getFileContents(expectedOutputFileName).trim(), getFileContents(outputFileName).trim()); + + // 5. testing file:address extensibility element + elem = new FileAddress(); + outputFileName = outputFolder + "TestFileAddressElement.xml"; + expectedOutputFileName = expectedFolder + "FileAddressElement.xml"; + elem.setRequired(Boolean.TRUE); + ((FileAddress) elem).setFileDirectory("/tmp/testing"); + + pw = new PrintWriter(new FileOutputStream(new File(outputFileName))); + instance.marshall(null, null, elem, pw, def, extReg); + pw.flush(); + + String tmp = getFileContents(expectedOutputFileName).trim(); + System.out.println("=====>" + tmp); + String tmp2 = getFileContents(outputFileName).trim(); + System.out.println("=====>" + tmp2); + assertEquals(tmp, tmp2); + + System.out.println("Successfully tested marshal"); + } + + /** + * Test of unmarshall method, of class com.sun.jbi.filebc.extensions.FileExtSerializer. + */ + public void testUnmarshall() throws Exception { + System.out.println("Testing unmarshall"); + + Element xelem = null; + ExtensibilityElement expResult = null; + ExtensibilityElement result = null; + + // 1. testing file:binding element + xelem = getElement(doc, "file:binding"); + result = instance.unmarshall(null, bindingElementType, xelem, null, extReg); + assertTrue(result instanceof FileBinding); + + // 2. testing file:operation element + xelem = getElement(doc, "file:operation"); + if (xelem != null) { + result = instance.unmarshall(null, bindingOperationElementType, xelem, null, extReg); + assertTrue(result instanceof FileOperation); + FileOperation oper = (FileOperation) result; + } else { + fail("Something went wrong during parsing TestFile.wsdl, cannot proceed"); + } + + // 3. testing file:message element + xelem = getElement(doc, "file:message"); + + if (xelem != null) { + result = instance.unmarshall(null, messageElementType, xelem, null, extReg); + assertTrue(result instanceof FileMessage); + FileMessage fileMessage = (FileMessage) result; + assertEquals("FileBCInput.txt", fileMessage.getFileName()); + assertTrue(fileMessage.getFileNameIsPattern()); + assertEquals(9999, fileMessage.getPollingInterval().longValue()); + assertTrue(fileMessage.getMultipleRecordsPerFile()); + } else { + fail("Something went wrong during parsing TestFile.wsdl, cannot proceed"); + } + + // 5. testing file:address element + xelem = getElement(doc, "file:address"); + if (xelem != null) { + result = instance.unmarshall(null, addressElementType, xelem, null, extReg); + assertTrue(result instanceof FileAddress); + FileAddress address = (FileAddress) result; + assertEquals("/tmp/testing", address.getFileDirectory()); + } else { + fail("Something went wrong during parsing TestFile.wsdl, cannot proceed"); + } + System.out.println("Successfully tested unmarshal"); + } + + private Element getElement(Node aNode, String elementName) { + Element theOne = null; + if (aNode.getNodeName().equalsIgnoreCase(elementName)) { + return (Element) aNode; + } + + NodeList children = aNode.getChildNodes(); + for (int ii = 0; ii < children.getLength(); ii++) { + Node child = children.item(ii); + if (child.getNodeName().equalsIgnoreCase(elementName)) { + theOne = (Element) child; + break; + } else { + theOne = getElement(child, elementName); + if (theOne != null) { + break; + } + } + } + return theOne; + } + + private String getFileContents(String fileName) { + StringBuffer output = new StringBuffer(); + try { + FileReader reader = new FileReader(fileName); + char[] buff = new char[512]; + int len = reader.read(buff); + while (len > 0) { + output.append(buff, 0, len); + len = reader.read(buff); + } + } catch (Exception e) { + fail("Failed to retrieve content from " + fileName + "."); + } + + return output.toString(); + } + + public void testRemove() throws Exception { + String result = instance.removeExtraEscapeCharacter("${symbol_escape}${symbol_escape}${symbol_escape}${symbol_escape}${symbol_escape}${symbol_escape}"); + assertEquals("${symbol_escape}${symbol_escape}${symbol_escape}${symbol_escape}${symbol_escape}${symbol_escape}", result); + + result = instance.removeExtraEscapeCharacter("${symbol_escape}${symbol_escape}r${symbol_escape}${symbol_escape}n${symbol_escape}${symbol_escape}t${symbol_escape}${symbol_escape}f${symbol_escape}${symbol_escape}b"); + assertEquals("${symbol_escape}r${symbol_escape}n${symbol_escape}t${symbol_escape}f${symbol_escape}b", result); + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/extensions/FileInputTest.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/extensions/FileInputTest.java new file mode 100644 index 000000000..95f2250c9 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/extensions/FileInputTest.java @@ -0,0 +1,74 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * BEGIN_HEADER - DO NOT EDIT + * + * The contents of this file are subject to the terms + * of the Common Development and Distribution License + * (the "License"). You may not use this file except + * in compliance with the License. + * + * You can obtain a copy of the license at + * https://${package}.dev.java.net/public/CDDLv1.0.html. + * See the License for the specific language governing + * permissions and limitations under the License. + * + * When distributing Covered Code, include this CDDL + * HEADER in each file and include the License file at + * https://${package}.dev.java.net/public/CDDLv1.0.html. + * If applicable add the following below this CDDL HEADER, + * with the fields enclosed by brackets "[]" replaced with + * your own identifying information: Portions Copyright + * [year] [name of copyright owner] + */ + +/* + * @(${symbol_pound})FileInputTest.java + * + * Copyright 2004-2007 Sun Microsystems, Inc. All Rights Reserved. + * + * END_HEADER - DO NOT EDIT + */ +package com.sun.jbi.filebc.extensions; + +import junit.framework.*; + +/** + * + * @author sweng + */ +public class FileInputTest extends TestCase { + + FileInput instance = new FileInput(); + + public FileInputTest(String testName) { + super(testName); + } + + protected void setUp() throws Exception { + } + + protected void tearDown() throws Exception { + } + + public static Test suite() { + TestSuite suite = new TestSuite(FileInputTest.class); + + return suite; + } + + /** + * Test of setFileMessage and getFileMessage method, of class com.sun.jbi.filebc.extensions.FileInput. + */ + public void testSetGetFileMessage() { + System.out.println("Testing setFileRead and getFileRead"); + + FileMessage fileMessage = new FileMessage(); + instance.setFileMessage(fileMessage); + FileMessage result = instance.getFileMessage(); + assertEquals(fileMessage, result); + + System.out.println("Successfully tested setFileRead and getFileRead"); + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/extensions/FileOperationTest.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/extensions/FileOperationTest.java new file mode 100644 index 000000000..7a8b5b8e5 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/extensions/FileOperationTest.java @@ -0,0 +1,116 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * BEGIN_HEADER - DO NOT EDIT + * + * The contents of this file are subject to the terms + * of the Common Development and Distribution License + * (the "License"). You may not use this file except + * in compliance with the License. + * + * You can obtain a copy of the license at + * https://${package}.dev.java.net/public/CDDLv1.0.html. + * See the License for the specific language governing + * permissions and limitations under the License. + * + * When distributing Covered Code, include this CDDL + * HEADER in each file and include the License file at + * https://${package}.dev.java.net/public/CDDLv1.0.html. + * If applicable add the following below this CDDL HEADER, + * with the fields enclosed by brackets "[]" replaced with + * your own identifying information: Portions Copyright + * [year] [name of copyright owner] + */ + +/* + * @(${symbol_pound})FileOperationTest.java + * + * Copyright 2004-2007 Sun Microsystems, Inc. All Rights Reserved. + * + * END_HEADER - DO NOT EDIT + */ +package com.sun.jbi.filebc.extensions; + +import junit.framework.*; +import javax.xml.namespace.QName; + +import com.ibm.wsdl.Constants; + +/** + * + * @author sweng + */ +public class FileOperationTest extends TestCase { + + FileOperation instance = null; + + public FileOperationTest(String testName) { + super(testName); + } + + protected void setUp() throws Exception { + instance = new FileOperation(); + } + + protected void tearDown() throws Exception { + } + + public static Test suite() { + TestSuite suite = new TestSuite(FileOperationTest.class); + return suite; + } + + /** + * Test of setElementType and getElementType method, of class com.sun.jbi.filebc.extensions.FileOperation. + */ + public void testSetGetElementType() { + System.out.println("Testing setElementType and getElementType"); + + // 1. testing default element type value + QName expResult = new QName("http://schemas.sun.com/jbi/wsdl-extensions/file/", Constants.ELEM_OPERATION); + QName result = instance.getElementType(); + assertEquals(expResult, result); + + // 2. testing setElementType + QName val = new QName("http://file-operation-test/", Constants.ELEM_OPERATION); + expResult = new QName("http://file-operation-test/", Constants.ELEM_OPERATION); + instance.setElementType(val); + result = instance.getElementType(); + assertEquals(expResult, result); + + System.out.println("Successfully tested setElementType and getElementType"); + } + + /** + * Test of setRequired and setgetRequired method, of class com.sun.jbi.filebc.extensions.FileOperation. + */ + public void testSetGetRequired() { + System.out.println("Testing setRequired and getRequired"); + + Boolean expResult = Boolean.TRUE; + instance.setRequired(Boolean.TRUE); + Boolean result = instance.getRequired(); + assertEquals(expResult, result); + + System.out.println("Successfully tested setRequired and getRequired"); + } + + /** + * Test of toString method, of class com.sun.jbi.filebc.extensions.FileOperation. + */ + public void testToString() { + System.out.println("Testing toString"); + + + String expResult = "File operation ({http://file-operation-test/}operation):" + + "${symbol_escape}nRequired=true"; + instance.setElementType(new QName("http://file-operation-test/", Constants.ELEM_OPERATION)); + instance.setRequired(Boolean.TRUE); + String result = instance.toString(); + System.out.println("-------------- result is [" + result + "]"); + assertTrue(result.indexOf(expResult) > 0); + + System.out.println("Successfully tested toString"); + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/extensions/FileOutputTest.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/extensions/FileOutputTest.java new file mode 100644 index 000000000..a7ea5c435 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/extensions/FileOutputTest.java @@ -0,0 +1,74 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * BEGIN_HEADER - DO NOT EDIT + * + * The contents of this file are subject to the terms + * of the Common Development and Distribution License + * (the "License"). You may not use this file except + * in compliance with the License. + * + * You can obtain a copy of the license at + * https://${package}.dev.java.net/public/CDDLv1.0.html. + * See the License for the specific language governing + * permissions and limitations under the License. + * + * When distributing Covered Code, include this CDDL + * HEADER in each file and include the License file at + * https://${package}.dev.java.net/public/CDDLv1.0.html. + * If applicable add the following below this CDDL HEADER, + * with the fields enclosed by brackets "[]" replaced with + * your own identifying information: Portions Copyright + * [year] [name of copyright owner] + */ + +/* + * @(${symbol_pound})FileOutputTest.java + * + * Copyright 2004-2007 Sun Microsystems, Inc. All Rights Reserved. + * + * END_HEADER - DO NOT EDIT + */ +package com.sun.jbi.filebc.extensions; + +import junit.framework.*; + +/** + * + * @author sweng + */ +public class FileOutputTest extends TestCase { + + FileOutput instance = new FileOutput(); + + public FileOutputTest(String testName) { + super(testName); + } + + protected void setUp() throws Exception { + } + + protected void tearDown() throws Exception { + } + + public static Test suite() { + TestSuite suite = new TestSuite(FileOutputTest.class); + + return suite; + } + + /** + * Test of setFileMessage and getFileMessage method, of class com.sun.jbi.filebc.extensions.FileInput. + */ + public void testSetGetFileMessage() { + System.out.println("Testing setFileRead and getFileRead"); + + FileMessage fileMessage = new FileMessage(); + instance.setFileMessage(fileMessage); + FileMessage result = instance.getFileMessage(); + assertEquals(fileMessage, result); + + System.out.println("Successfully tested setFileRead and getFileRead"); + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/extensions/expected/FileAddressElement.xml b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/extensions/expected/FileAddressElement.xml new file mode 100644 index 000000000..865897ad5 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/extensions/expected/FileAddressElement.xml @@ -0,0 +1,4 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/extensions/expected/FileBindingElement.xml b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/extensions/expected/FileBindingElement.xml new file mode 100644 index 000000000..fa3048383 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/extensions/expected/FileBindingElement.xml @@ -0,0 +1,4 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/extensions/expected/FileMessageElement.xml b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/extensions/expected/FileMessageElement.xml new file mode 100644 index 000000000..2a78d1dcf --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/extensions/expected/FileMessageElement.xml @@ -0,0 +1,4 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/extensions/expected/FileOperationElement.xml b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/extensions/expected/FileOperationElement.xml new file mode 100644 index 000000000..17547b448 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/extensions/expected/FileOperationElement.xml @@ -0,0 +1,4 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/extensions/output/TestFileAddressElement.xml b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/extensions/output/TestFileAddressElement.xml new file mode 100644 index 000000000..4921dc099 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/extensions/output/TestFileAddressElement.xml @@ -0,0 +1,4 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/extensions/output/TestFileBindingElement.xml b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/extensions/output/TestFileBindingElement.xml new file mode 100644 index 000000000..fa3048383 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/extensions/output/TestFileBindingElement.xml @@ -0,0 +1,4 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/extensions/output/TestFileMessageElement.xml b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/extensions/output/TestFileMessageElement.xml new file mode 100644 index 000000000..b9064707a --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/extensions/output/TestFileMessageElement.xml @@ -0,0 +1,4 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/extensions/output/TestFileOperationElement.xml b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/extensions/output/TestFileOperationElement.xml new file mode 100644 index 000000000..17547b448 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/extensions/output/TestFileOperationElement.xml @@ -0,0 +1,4 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/BadInput.txt b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/BadInput.txt new file mode 100644 index 000000000..90b2bc0e7 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/BadInput.txt @@ -0,0 +1,4 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +Hello, bad message here! \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/InputInOnly.txt b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/InputInOnly.txt new file mode 100644 index 000000000..058520bd1 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/InputInOnly.txt @@ -0,0 +1,6 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/InputInOut.txt b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/InputInOut.txt new file mode 100644 index 000000000..058520bd1 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/InputInOut.txt @@ -0,0 +1,6 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/filebc.lck b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/filebc.lck new file mode 100644 index 000000000..75df4a225 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/filebc.lck @@ -0,0 +1 @@ +lock file for testing \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/InputInOnly01.txt b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/InputInOnly01.txt new file mode 100644 index 000000000..058520bd1 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/InputInOnly01.txt @@ -0,0 +1,6 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/InputInOnly02.txt b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/InputInOnly02.txt new file mode 100644 index 000000000..058520bd1 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/InputInOnly02.txt @@ -0,0 +1,6 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/InputInOnly03.txt b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/InputInOnly03.txt new file mode 100644 index 000000000..058520bd1 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/InputInOnly03.txt @@ -0,0 +1,6 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/InputInOnly04.txt b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/InputInOnly04.txt new file mode 100644 index 000000000..058520bd1 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/InputInOnly04.txt @@ -0,0 +1,6 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/InputInOnly05.txt b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/InputInOnly05.txt new file mode 100644 index 000000000..058520bd1 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/InputInOnly05.txt @@ -0,0 +1,6 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/InputInOnly06_skip_me.txt b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/InputInOnly06_skip_me.txt new file mode 100644 index 000000000..058520bd1 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/InputInOnly06_skip_me.txt @@ -0,0 +1,6 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_skip_dir_01/InputInOnly01.txt b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_skip_dir_01/InputInOnly01.txt new file mode 100644 index 000000000..058520bd1 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_skip_dir_01/InputInOnly01.txt @@ -0,0 +1,6 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_skip_dir_01/InputInOnly02.txt b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_skip_dir_01/InputInOnly02.txt new file mode 100644 index 000000000..058520bd1 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_skip_dir_01/InputInOnly02.txt @@ -0,0 +1,6 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_skip_dir_01/InputInOnly03.txt b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_skip_dir_01/InputInOnly03.txt new file mode 100644 index 000000000..058520bd1 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_skip_dir_01/InputInOnly03.txt @@ -0,0 +1,6 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_skip_dir_01/InputInOnly04.txt b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_skip_dir_01/InputInOnly04.txt new file mode 100644 index 000000000..058520bd1 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_skip_dir_01/InputInOnly04.txt @@ -0,0 +1,6 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_skip_dir_01/InputInOnly05.txt b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_skip_dir_01/InputInOnly05.txt new file mode 100644 index 000000000..058520bd1 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_skip_dir_01/InputInOnly05.txt @@ -0,0 +1,6 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_skip_dir_02/InputInOnly01.txt b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_skip_dir_02/InputInOnly01.txt new file mode 100644 index 000000000..058520bd1 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_skip_dir_02/InputInOnly01.txt @@ -0,0 +1,6 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_skip_dir_02/InputInOnly02.txt b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_skip_dir_02/InputInOnly02.txt new file mode 100644 index 000000000..058520bd1 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_skip_dir_02/InputInOnly02.txt @@ -0,0 +1,6 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_skip_dir_02/InputInOnly03.txt b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_skip_dir_02/InputInOnly03.txt new file mode 100644 index 000000000..058520bd1 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_skip_dir_02/InputInOnly03.txt @@ -0,0 +1,6 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_skip_dir_02/InputInOnly04.txt b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_skip_dir_02/InputInOnly04.txt new file mode 100644 index 000000000..058520bd1 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_skip_dir_02/InputInOnly04.txt @@ -0,0 +1,6 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_skip_dir_02/InputInOnly05.txt b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_skip_dir_02/InputInOnly05.txt new file mode 100644 index 000000000..058520bd1 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_skip_dir_02/InputInOnly05.txt @@ -0,0 +1,6 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_skip_dir_02/test_recrusive_skip_sub_dir_021/InputInOnly01.txt b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_skip_dir_02/test_recrusive_skip_sub_dir_021/InputInOnly01.txt new file mode 100644 index 000000000..058520bd1 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_skip_dir_02/test_recrusive_skip_sub_dir_021/InputInOnly01.txt @@ -0,0 +1,6 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_skip_dir_02/test_recrusive_skip_sub_dir_021/InputInOnly02.txt b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_skip_dir_02/test_recrusive_skip_sub_dir_021/InputInOnly02.txt new file mode 100644 index 000000000..058520bd1 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_skip_dir_02/test_recrusive_skip_sub_dir_021/InputInOnly02.txt @@ -0,0 +1,6 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_skip_dir_02/test_recrusive_skip_sub_dir_021/InputInOnly03.txt b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_skip_dir_02/test_recrusive_skip_sub_dir_021/InputInOnly03.txt new file mode 100644 index 000000000..058520bd1 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_skip_dir_02/test_recrusive_skip_sub_dir_021/InputInOnly03.txt @@ -0,0 +1,6 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_skip_dir_02/test_recrusive_skip_sub_dir_021/InputInOnly04.txt b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_skip_dir_02/test_recrusive_skip_sub_dir_021/InputInOnly04.txt new file mode 100644 index 000000000..058520bd1 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_skip_dir_02/test_recrusive_skip_sub_dir_021/InputInOnly04.txt @@ -0,0 +1,6 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_skip_dir_02/test_recrusive_skip_sub_dir_021/InputInOnly05.txt b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_skip_dir_02/test_recrusive_skip_sub_dir_021/InputInOnly05.txt new file mode 100644 index 000000000..058520bd1 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_skip_dir_02/test_recrusive_skip_sub_dir_021/InputInOnly05.txt @@ -0,0 +1,6 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_skip_dir_02/test_recursive_sub_022/InputInOnly01.txt b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_skip_dir_02/test_recursive_sub_022/InputInOnly01.txt new file mode 100644 index 000000000..058520bd1 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_skip_dir_02/test_recursive_sub_022/InputInOnly01.txt @@ -0,0 +1,6 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_skip_dir_02/test_recursive_sub_022/InputInOnly02.txt b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_skip_dir_02/test_recursive_sub_022/InputInOnly02.txt new file mode 100644 index 000000000..058520bd1 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_skip_dir_02/test_recursive_sub_022/InputInOnly02.txt @@ -0,0 +1,6 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_skip_dir_02/test_recursive_sub_022/InputInOnly03.txt b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_skip_dir_02/test_recursive_sub_022/InputInOnly03.txt new file mode 100644 index 000000000..058520bd1 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_skip_dir_02/test_recursive_sub_022/InputInOnly03.txt @@ -0,0 +1,6 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_skip_dir_02/test_recursive_sub_022/InputInOnly04.txt b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_skip_dir_02/test_recursive_sub_022/InputInOnly04.txt new file mode 100644 index 000000000..058520bd1 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_skip_dir_02/test_recursive_sub_022/InputInOnly04.txt @@ -0,0 +1,6 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_skip_dir_02/test_recursive_sub_022/InputInOnly05.txt b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_skip_dir_02/test_recursive_sub_022/InputInOnly05.txt new file mode 100644 index 000000000..058520bd1 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_skip_dir_02/test_recursive_sub_022/InputInOnly05.txt @@ -0,0 +1,6 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_01/InputInOnly01.txt b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_01/InputInOnly01.txt new file mode 100644 index 000000000..058520bd1 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_01/InputInOnly01.txt @@ -0,0 +1,6 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_01/InputInOnly02.txt b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_01/InputInOnly02.txt new file mode 100644 index 000000000..058520bd1 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_01/InputInOnly02.txt @@ -0,0 +1,6 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_01/InputInOnly03.txt b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_01/InputInOnly03.txt new file mode 100644 index 000000000..058520bd1 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_01/InputInOnly03.txt @@ -0,0 +1,6 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_01/InputInOnly04.txt b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_01/InputInOnly04.txt new file mode 100644 index 000000000..058520bd1 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_01/InputInOnly04.txt @@ -0,0 +1,6 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_01/InputInOnly05.txt b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_01/InputInOnly05.txt new file mode 100644 index 000000000..058520bd1 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_01/InputInOnly05.txt @@ -0,0 +1,6 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_01/test_recursive_skip_sub_dir_011_extra/InputInOnly01.txt b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_01/test_recursive_skip_sub_dir_011_extra/InputInOnly01.txt new file mode 100644 index 000000000..058520bd1 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_01/test_recursive_skip_sub_dir_011_extra/InputInOnly01.txt @@ -0,0 +1,6 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_01/test_recursive_skip_sub_dir_011_extra/InputInOnly02.txt b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_01/test_recursive_skip_sub_dir_011_extra/InputInOnly02.txt new file mode 100644 index 000000000..058520bd1 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_01/test_recursive_skip_sub_dir_011_extra/InputInOnly02.txt @@ -0,0 +1,6 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_01/test_recursive_skip_sub_dir_011_extra/InputInOnly03.txt b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_01/test_recursive_skip_sub_dir_011_extra/InputInOnly03.txt new file mode 100644 index 000000000..058520bd1 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_01/test_recursive_skip_sub_dir_011_extra/InputInOnly03.txt @@ -0,0 +1,6 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_01/test_recursive_skip_sub_dir_011_extra/InputInOnly04.txt b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_01/test_recursive_skip_sub_dir_011_extra/InputInOnly04.txt new file mode 100644 index 000000000..058520bd1 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_01/test_recursive_skip_sub_dir_011_extra/InputInOnly04.txt @@ -0,0 +1,6 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_01/test_recursive_skip_sub_dir_011_extra/InputInOnly05.txt b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_01/test_recursive_skip_sub_dir_011_extra/InputInOnly05.txt new file mode 100644 index 000000000..058520bd1 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_01/test_recursive_skip_sub_dir_011_extra/InputInOnly05.txt @@ -0,0 +1,6 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_01/test_recursive_sub_011/InputInOnly01.txt b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_01/test_recursive_sub_011/InputInOnly01.txt new file mode 100644 index 000000000..058520bd1 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_01/test_recursive_sub_011/InputInOnly01.txt @@ -0,0 +1,6 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_01/test_recursive_sub_011/InputInOnly02.txt b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_01/test_recursive_sub_011/InputInOnly02.txt new file mode 100644 index 000000000..058520bd1 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_01/test_recursive_sub_011/InputInOnly02.txt @@ -0,0 +1,6 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_01/test_recursive_sub_011/InputInOnly03.txt b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_01/test_recursive_sub_011/InputInOnly03.txt new file mode 100644 index 000000000..058520bd1 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_01/test_recursive_sub_011/InputInOnly03.txt @@ -0,0 +1,6 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_01/test_recursive_sub_011/InputInOnly04.txt b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_01/test_recursive_sub_011/InputInOnly04.txt new file mode 100644 index 000000000..058520bd1 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_01/test_recursive_sub_011/InputInOnly04.txt @@ -0,0 +1,6 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_01/test_recursive_sub_011/InputInOnly05.txt b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_01/test_recursive_sub_011/InputInOnly05.txt new file mode 100644 index 000000000..058520bd1 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_01/test_recursive_sub_011/InputInOnly05.txt @@ -0,0 +1,6 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_01/test_recursive_sub_011/InputInOnly06_skip_me.txt b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_01/test_recursive_sub_011/InputInOnly06_skip_me.txt new file mode 100644 index 000000000..058520bd1 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_01/test_recursive_sub_011/InputInOnly06_skip_me.txt @@ -0,0 +1,6 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_01/test_recursive_sub_012/InputInOnly01.txt b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_01/test_recursive_sub_012/InputInOnly01.txt new file mode 100644 index 000000000..058520bd1 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_01/test_recursive_sub_012/InputInOnly01.txt @@ -0,0 +1,6 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_01/test_recursive_sub_012/InputInOnly02.txt b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_01/test_recursive_sub_012/InputInOnly02.txt new file mode 100644 index 000000000..058520bd1 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_01/test_recursive_sub_012/InputInOnly02.txt @@ -0,0 +1,6 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_01/test_recursive_sub_012/InputInOnly03.txt b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_01/test_recursive_sub_012/InputInOnly03.txt new file mode 100644 index 000000000..058520bd1 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_01/test_recursive_sub_012/InputInOnly03.txt @@ -0,0 +1,6 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_01/test_recursive_sub_012/InputInOnly04.txt b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_01/test_recursive_sub_012/InputInOnly04.txt new file mode 100644 index 000000000..058520bd1 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_01/test_recursive_sub_012/InputInOnly04.txt @@ -0,0 +1,6 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_01/test_recursive_sub_012/InputInOnly05.txt b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_01/test_recursive_sub_012/InputInOnly05.txt new file mode 100644 index 000000000..058520bd1 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_01/test_recursive_sub_012/InputInOnly05.txt @@ -0,0 +1,6 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_01/test_recursive_sub_012/InputInOnly06_skip_me.txt b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_01/test_recursive_sub_012/InputInOnly06_skip_me.txt new file mode 100644 index 000000000..058520bd1 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_01/test_recursive_sub_012/InputInOnly06_skip_me.txt @@ -0,0 +1,6 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_02/InputInOnly01.txt b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_02/InputInOnly01.txt new file mode 100644 index 000000000..058520bd1 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_02/InputInOnly01.txt @@ -0,0 +1,6 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_02/InputInOnly02.txt b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_02/InputInOnly02.txt new file mode 100644 index 000000000..058520bd1 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_02/InputInOnly02.txt @@ -0,0 +1,6 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_02/InputInOnly03.txt b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_02/InputInOnly03.txt new file mode 100644 index 000000000..058520bd1 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_02/InputInOnly03.txt @@ -0,0 +1,6 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_02/InputInOnly04.txt b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_02/InputInOnly04.txt new file mode 100644 index 000000000..058520bd1 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_02/InputInOnly04.txt @@ -0,0 +1,6 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_02/InputInOnly05.txt b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_02/InputInOnly05.txt new file mode 100644 index 000000000..058520bd1 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_02/InputInOnly05.txt @@ -0,0 +1,6 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_02/InputInOnly06_skip_me.txt b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_02/InputInOnly06_skip_me.txt new file mode 100644 index 000000000..058520bd1 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inonly/test_recursive_sub_02/InputInOnly06_skip_me.txt @@ -0,0 +1,6 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/InputInOut01.dat b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/InputInOut01.dat new file mode 100644 index 000000000..b03092b1b --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/InputInOut01.dat @@ -0,0 +1,3 @@ + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/InputInOut02.dat b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/InputInOut02.dat new file mode 100644 index 000000000..b03092b1b --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/InputInOut02.dat @@ -0,0 +1,3 @@ + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/InputInOut03.dat b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/InputInOut03.dat new file mode 100644 index 000000000..b03092b1b --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/InputInOut03.dat @@ -0,0 +1,3 @@ + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/InputInOut04.dat b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/InputInOut04.dat new file mode 100644 index 000000000..b03092b1b --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/InputInOut04.dat @@ -0,0 +1,3 @@ + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/InputInOut05.dat b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/InputInOut05.dat new file mode 100644 index 000000000..b03092b1b --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/InputInOut05.dat @@ -0,0 +1,3 @@ + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/InputInOut06_skip_me.txt b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/InputInOut06_skip_me.txt new file mode 100644 index 000000000..058520bd1 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/InputInOut06_skip_me.txt @@ -0,0 +1,6 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_skip_dir_01/InputInOut01.dat b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_skip_dir_01/InputInOut01.dat new file mode 100644 index 000000000..b03092b1b --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_skip_dir_01/InputInOut01.dat @@ -0,0 +1,3 @@ + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_skip_dir_01/InputInOut02.dat b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_skip_dir_01/InputInOut02.dat new file mode 100644 index 000000000..b03092b1b --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_skip_dir_01/InputInOut02.dat @@ -0,0 +1,3 @@ + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_skip_dir_01/InputInOut03.dat b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_skip_dir_01/InputInOut03.dat new file mode 100644 index 000000000..b03092b1b --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_skip_dir_01/InputInOut03.dat @@ -0,0 +1,3 @@ + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_skip_dir_01/InputInOut04.dat b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_skip_dir_01/InputInOut04.dat new file mode 100644 index 000000000..b03092b1b --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_skip_dir_01/InputInOut04.dat @@ -0,0 +1,3 @@ + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_skip_dir_01/InputInOut05.dat b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_skip_dir_01/InputInOut05.dat new file mode 100644 index 000000000..b03092b1b --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_skip_dir_01/InputInOut05.dat @@ -0,0 +1,3 @@ + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_skip_dir_02/InputInOut01.dat b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_skip_dir_02/InputInOut01.dat new file mode 100644 index 000000000..b03092b1b --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_skip_dir_02/InputInOut01.dat @@ -0,0 +1,3 @@ + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_skip_dir_02/InputInOut02.dat b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_skip_dir_02/InputInOut02.dat new file mode 100644 index 000000000..b03092b1b --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_skip_dir_02/InputInOut02.dat @@ -0,0 +1,3 @@ + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_skip_dir_02/InputInOut03.dat b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_skip_dir_02/InputInOut03.dat new file mode 100644 index 000000000..b03092b1b --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_skip_dir_02/InputInOut03.dat @@ -0,0 +1,3 @@ + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_skip_dir_02/InputInOut04.dat b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_skip_dir_02/InputInOut04.dat new file mode 100644 index 000000000..b03092b1b --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_skip_dir_02/InputInOut04.dat @@ -0,0 +1,3 @@ + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_skip_dir_02/InputInOut05.dat b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_skip_dir_02/InputInOut05.dat new file mode 100644 index 000000000..b03092b1b --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_skip_dir_02/InputInOut05.dat @@ -0,0 +1,3 @@ + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_skip_dir_02/test_recrusive_skip_sub_dir_021/InputInOut01.dat b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_skip_dir_02/test_recrusive_skip_sub_dir_021/InputInOut01.dat new file mode 100644 index 000000000..b03092b1b --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_skip_dir_02/test_recrusive_skip_sub_dir_021/InputInOut01.dat @@ -0,0 +1,3 @@ + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_skip_dir_02/test_recrusive_skip_sub_dir_021/InputInOut02.dat b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_skip_dir_02/test_recrusive_skip_sub_dir_021/InputInOut02.dat new file mode 100644 index 000000000..b03092b1b --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_skip_dir_02/test_recrusive_skip_sub_dir_021/InputInOut02.dat @@ -0,0 +1,3 @@ + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_skip_dir_02/test_recrusive_skip_sub_dir_021/InputInOut03.dat b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_skip_dir_02/test_recrusive_skip_sub_dir_021/InputInOut03.dat new file mode 100644 index 000000000..b03092b1b --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_skip_dir_02/test_recrusive_skip_sub_dir_021/InputInOut03.dat @@ -0,0 +1,3 @@ + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_skip_dir_02/test_recrusive_skip_sub_dir_021/InputInOut04.dat b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_skip_dir_02/test_recrusive_skip_sub_dir_021/InputInOut04.dat new file mode 100644 index 000000000..b03092b1b --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_skip_dir_02/test_recrusive_skip_sub_dir_021/InputInOut04.dat @@ -0,0 +1,3 @@ + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_skip_dir_02/test_recrusive_skip_sub_dir_021/InputInOut05.dat b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_skip_dir_02/test_recrusive_skip_sub_dir_021/InputInOut05.dat new file mode 100644 index 000000000..b03092b1b --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_skip_dir_02/test_recrusive_skip_sub_dir_021/InputInOut05.dat @@ -0,0 +1,3 @@ + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_skip_dir_02/test_recursive_sub_022/InputInOut01.dat b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_skip_dir_02/test_recursive_sub_022/InputInOut01.dat new file mode 100644 index 000000000..b03092b1b --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_skip_dir_02/test_recursive_sub_022/InputInOut01.dat @@ -0,0 +1,3 @@ + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_skip_dir_02/test_recursive_sub_022/InputInOut02.dat b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_skip_dir_02/test_recursive_sub_022/InputInOut02.dat new file mode 100644 index 000000000..b03092b1b --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_skip_dir_02/test_recursive_sub_022/InputInOut02.dat @@ -0,0 +1,3 @@ + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_skip_dir_02/test_recursive_sub_022/InputInOut03.dat b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_skip_dir_02/test_recursive_sub_022/InputInOut03.dat new file mode 100644 index 000000000..b03092b1b --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_skip_dir_02/test_recursive_sub_022/InputInOut03.dat @@ -0,0 +1,3 @@ + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_skip_dir_02/test_recursive_sub_022/InputInOut04.dat b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_skip_dir_02/test_recursive_sub_022/InputInOut04.dat new file mode 100644 index 000000000..b03092b1b --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_skip_dir_02/test_recursive_sub_022/InputInOut04.dat @@ -0,0 +1,3 @@ + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_skip_dir_02/test_recursive_sub_022/InputInOut05.dat b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_skip_dir_02/test_recursive_sub_022/InputInOut05.dat new file mode 100644 index 000000000..b03092b1b --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_skip_dir_02/test_recursive_sub_022/InputInOut05.dat @@ -0,0 +1,3 @@ + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_01/InputInOut01.dat b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_01/InputInOut01.dat new file mode 100644 index 000000000..b03092b1b --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_01/InputInOut01.dat @@ -0,0 +1,3 @@ + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_01/InputInOut02.dat b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_01/InputInOut02.dat new file mode 100644 index 000000000..b03092b1b --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_01/InputInOut02.dat @@ -0,0 +1,3 @@ + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_01/InputInOut03.dat b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_01/InputInOut03.dat new file mode 100644 index 000000000..b03092b1b --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_01/InputInOut03.dat @@ -0,0 +1,3 @@ + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_01/InputInOut04.dat b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_01/InputInOut04.dat new file mode 100644 index 000000000..b03092b1b --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_01/InputInOut04.dat @@ -0,0 +1,3 @@ + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_01/InputInOut05.dat b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_01/InputInOut05.dat new file mode 100644 index 000000000..b03092b1b --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_01/InputInOut05.dat @@ -0,0 +1,3 @@ + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_01/test_recursive_skip_sub_dir_011_extra/InputInOut01.dat b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_01/test_recursive_skip_sub_dir_011_extra/InputInOut01.dat new file mode 100644 index 000000000..b03092b1b --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_01/test_recursive_skip_sub_dir_011_extra/InputInOut01.dat @@ -0,0 +1,3 @@ + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_01/test_recursive_skip_sub_dir_011_extra/InputInOut02.dat b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_01/test_recursive_skip_sub_dir_011_extra/InputInOut02.dat new file mode 100644 index 000000000..b03092b1b --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_01/test_recursive_skip_sub_dir_011_extra/InputInOut02.dat @@ -0,0 +1,3 @@ + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_01/test_recursive_skip_sub_dir_011_extra/InputInOut03.dat b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_01/test_recursive_skip_sub_dir_011_extra/InputInOut03.dat new file mode 100644 index 000000000..b03092b1b --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_01/test_recursive_skip_sub_dir_011_extra/InputInOut03.dat @@ -0,0 +1,3 @@ + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_01/test_recursive_skip_sub_dir_011_extra/InputInOut04.dat b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_01/test_recursive_skip_sub_dir_011_extra/InputInOut04.dat new file mode 100644 index 000000000..b03092b1b --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_01/test_recursive_skip_sub_dir_011_extra/InputInOut04.dat @@ -0,0 +1,3 @@ + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_01/test_recursive_skip_sub_dir_011_extra/InputInOut05.dat b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_01/test_recursive_skip_sub_dir_011_extra/InputInOut05.dat new file mode 100644 index 000000000..b03092b1b --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_01/test_recursive_skip_sub_dir_011_extra/InputInOut05.dat @@ -0,0 +1,3 @@ + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_01/test_recursive_sub_011/InputInOut01.dat b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_01/test_recursive_sub_011/InputInOut01.dat new file mode 100644 index 000000000..b03092b1b --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_01/test_recursive_sub_011/InputInOut01.dat @@ -0,0 +1,3 @@ + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_01/test_recursive_sub_011/InputInOut02.dat b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_01/test_recursive_sub_011/InputInOut02.dat new file mode 100644 index 000000000..b03092b1b --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_01/test_recursive_sub_011/InputInOut02.dat @@ -0,0 +1,3 @@ + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_01/test_recursive_sub_011/InputInOut03.dat b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_01/test_recursive_sub_011/InputInOut03.dat new file mode 100644 index 000000000..b03092b1b --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_01/test_recursive_sub_011/InputInOut03.dat @@ -0,0 +1,3 @@ + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_01/test_recursive_sub_011/InputInOut04.dat b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_01/test_recursive_sub_011/InputInOut04.dat new file mode 100644 index 000000000..b03092b1b --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_01/test_recursive_sub_011/InputInOut04.dat @@ -0,0 +1,3 @@ + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_01/test_recursive_sub_011/InputInOut05.dat b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_01/test_recursive_sub_011/InputInOut05.dat new file mode 100644 index 000000000..b03092b1b --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_01/test_recursive_sub_011/InputInOut05.dat @@ -0,0 +1,3 @@ + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_01/test_recursive_sub_011/InputInOut06_skip_me.txt b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_01/test_recursive_sub_011/InputInOut06_skip_me.txt new file mode 100644 index 000000000..058520bd1 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_01/test_recursive_sub_011/InputInOut06_skip_me.txt @@ -0,0 +1,6 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_01/test_recursive_sub_012/InputInOut01.dat b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_01/test_recursive_sub_012/InputInOut01.dat new file mode 100644 index 000000000..b03092b1b --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_01/test_recursive_sub_012/InputInOut01.dat @@ -0,0 +1,3 @@ + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_01/test_recursive_sub_012/InputInOut02.dat b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_01/test_recursive_sub_012/InputInOut02.dat new file mode 100644 index 000000000..b03092b1b --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_01/test_recursive_sub_012/InputInOut02.dat @@ -0,0 +1,3 @@ + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_01/test_recursive_sub_012/InputInOut03.dat b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_01/test_recursive_sub_012/InputInOut03.dat new file mode 100644 index 000000000..b03092b1b --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_01/test_recursive_sub_012/InputInOut03.dat @@ -0,0 +1,3 @@ + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_01/test_recursive_sub_012/InputInOut04.dat b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_01/test_recursive_sub_012/InputInOut04.dat new file mode 100644 index 000000000..b03092b1b --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_01/test_recursive_sub_012/InputInOut04.dat @@ -0,0 +1,3 @@ + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_01/test_recursive_sub_012/InputInOut05.dat b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_01/test_recursive_sub_012/InputInOut05.dat new file mode 100644 index 000000000..b03092b1b --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_01/test_recursive_sub_012/InputInOut05.dat @@ -0,0 +1,3 @@ + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_01/test_recursive_sub_012/InputInOut06_skip_me.txt b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_01/test_recursive_sub_012/InputInOut06_skip_me.txt new file mode 100644 index 000000000..058520bd1 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_01/test_recursive_sub_012/InputInOut06_skip_me.txt @@ -0,0 +1,6 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_02/InputInOut01.dat b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_02/InputInOut01.dat new file mode 100644 index 000000000..b03092b1b --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_02/InputInOut01.dat @@ -0,0 +1,3 @@ + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_02/InputInOut02.dat b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_02/InputInOut02.dat new file mode 100644 index 000000000..b03092b1b --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_02/InputInOut02.dat @@ -0,0 +1,3 @@ + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_02/InputInOut03.dat b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_02/InputInOut03.dat new file mode 100644 index 000000000..b03092b1b --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_02/InputInOut03.dat @@ -0,0 +1,3 @@ + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_02/InputInOut04.dat b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_02/InputInOut04.dat new file mode 100644 index 000000000..b03092b1b --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_02/InputInOut04.dat @@ -0,0 +1,3 @@ + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_02/InputInOut05.dat b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_02/InputInOut05.dat new file mode 100644 index 000000000..b03092b1b --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_02/InputInOut05.dat @@ -0,0 +1,3 @@ + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_02/InputInOut06_skip_me.txt b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_02/InputInOut06_skip_me.txt new file mode 100644 index 000000000..058520bd1 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/input/recursive_root_inout/test_recursive_sub_02/InputInOut06_skip_me.txt @@ -0,0 +1,6 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + hello, testing InOnly + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/output/sample.txt b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/output/sample.txt new file mode 100644 index 000000000..712a6a3ac --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/output/sample.txt @@ -0,0 +1,3 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/packaging/EndpointConfigurationFactoryTest.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/packaging/EndpointConfigurationFactoryTest.java new file mode 100644 index 000000000..ff65afda8 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/packaging/EndpointConfigurationFactoryTest.java @@ -0,0 +1,72 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * BEGIN_HEADER - DO NOT EDIT + * + * The contents of this file are subject to the terms + * of the Common Development and Distribution License + * (the "License"). You may not use this file except + * in compliance with the License. + * + * You can obtain a copy of the license at + * https://${package}.dev.java.net/public/CDDLv1.0.html. + * See the License for the specific language governing + * permissions and limitations under the License. + * + * When distributing Covered Code, include this CDDL + * HEADER in each file and include the License file at + * https://${package}.dev.java.net/public/CDDLv1.0.html. + * If applicable add the following below this CDDL HEADER, + * with the fields enclosed by brackets "[]" replaced with + * your own identifying information: Portions Copyright + * [year] [name of copyright owner] + */ + +/* + * @(${symbol_pound})EndpointConfigurationFactoryTest.java + * + * Copyright 2004-2007 Sun Microsystems, Inc. All Rights Reserved. + * + * END_HEADER - DO NOT EDIT + */ +package com.sun.jbi.filebc.packaging; + +import junit.framework.*; +import java.io.File; + +/** + * + * @author sweng + */ +public class EndpointConfigurationFactoryTest extends TestCase { + + public EndpointConfigurationFactoryTest(String testName) { + super(testName); + } + + protected void setUp() throws Exception { + } + + protected void tearDown() throws Exception { + } + + public static Test suite() { + TestSuite suite = new TestSuite(EndpointConfigurationFactoryTest.class); + + return suite; + } + + /** + * Test of getEndpointConfiguration method, of class com.sun.jbi.filebc.packaging.EndpointConfigurationFactory. + */ + public void testGetEndpointConfiguration() throws Exception { + System.out.println("Testing getEndpointConfiguration"); + + String suRootDir = new File("test/com/sun/jbi/filebc/packaging/descriptors").getAbsolutePath(); + EndpointConfiguration result = EndpointConfigurationFactory.getEndpointConfiguration(suRootDir); + assertTrue(result instanceof EndpointConfigurationSUDescriptor); + + System.out.println("Successfully tested getEndpointConfiguration"); + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/packaging/EndpointConfigurationSUDescriptorTest.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/packaging/EndpointConfigurationSUDescriptorTest.java new file mode 100644 index 000000000..063f1c5ec --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/packaging/EndpointConfigurationSUDescriptorTest.java @@ -0,0 +1,97 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * BEGIN_HEADER - DO NOT EDIT + * + * The contents of this file are subject to the terms + * of the Common Development and Distribution License + * (the "License"). You may not use this file except + * in compliance with the License. + * + * You can obtain a copy of the license at + * https://${package}.dev.java.net/public/CDDLv1.0.html. + * See the License for the specific language governing + * permissions and limitations under the License. + * + * When distributing Covered Code, include this CDDL + * HEADER in each file and include the License file at + * https://${package}.dev.java.net/public/CDDLv1.0.html. + * If applicable add the following below this CDDL HEADER, + * with the fields enclosed by brackets "[]" replaced with + * your own identifying information: Portions Copyright + * [year] [name of copyright owner] + */ + +/* + * @(${symbol_pound})EndpointConfigurationSUDescriptorTest.java + * + * Copyright 2004-2007 Sun Microsystems, Inc. All Rights Reserved. + * + * END_HEADER - DO NOT EDIT + */ +package com.sun.jbi.filebc.packaging; + +import junit.framework.*; +import java.util.List; + +/** + * + * @author sweng + */ +public class EndpointConfigurationSUDescriptorTest extends TestCase { + + EndpointConfigurationSUDescriptor instance = null; + + public EndpointConfigurationSUDescriptorTest(String testName) { + super(testName); + } + + protected void setUp() throws Exception { + instance = new EndpointConfigurationSUDescriptor("test/com/sun/jbi/filebc/packaging/descriptors"); + } + + protected void tearDown() throws Exception { + } + + public static Test suite() { + TestSuite suite = new TestSuite(EndpointConfigurationSUDescriptorTest.class); + + return suite; + } + + /** + * Test of addEndpoint method, of class com.sun.jbi.filebc.packaging.EndpointConfigurationSUDescriptor. + */ + public void testAddEndpoint() { + System.out.println("Testing addEndpoint"); + + EndpointData p = new EndpointDataImpl("{http://localhost/filebctest/FileOut}portTypeFileOut", + "{http://localhost/filebctest/FileOut}serviceFileOut", + "portFileOut", + 1); + instance.addEndpoint(p); + p = new EndpointDataImpl("{http://localhost/filebctest/FileIn}portTypeFileIn", + "{http://localhost/filebctest/FileIn}portTypeFileIn", + "portFileIn", + 0); + instance.addEndpoint(p); + assertEquals(4, instance.endpoints().size()); + + System.out.println("Successfully tested addEndpooint"); + } + + /** + * Test of endpoints method, of class com.sun.jbi.filebc.packaging.EndpointConfigurationSUDescriptor. + */ + public void testEndpoints() { + System.out.println("Testing endpoints"); + + List result = instance.endpoints(); + assertEquals(2, result.size()); + assertTrue(result.get(0) instanceof EndpointData); + assertTrue(result.get(1) instanceof EndpointData); + + System.out.println("Successfully tested endpoints"); + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/packaging/EndpointDataImplTest.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/packaging/EndpointDataImplTest.java new file mode 100644 index 000000000..2c6aa6898 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/packaging/EndpointDataImplTest.java @@ -0,0 +1,117 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * BEGIN_HEADER - DO NOT EDIT + * + * The contents of this file are subject to the terms + * of the Common Development and Distribution License + * (the "License"). You may not use this file except + * in compliance with the License. + * + * You can obtain a copy of the license at + * https://${package}.dev.java.net/public/CDDLv1.0.html. + * See the License for the specific language governing + * permissions and limitations under the License. + * + * When distributing Covered Code, include this CDDL + * HEADER in each file and include the License file at + * https://${package}.dev.java.net/public/CDDLv1.0.html. + * If applicable add the following below this CDDL HEADER, + * with the fields enclosed by brackets "[]" replaced with + * your own identifying information: Portions Copyright + * [year] [name of copyright owner] + */ + +/* + * @(${symbol_pound})EndpointDataImplTest.java + * + * Copyright 2004-2007 Sun Microsystems, Inc. All Rights Reserved. + * + * END_HEADER - DO NOT EDIT + */ +package com.sun.jbi.filebc.packaging; + +import junit.framework.*; + +/** + * + * @author sweng + */ +public class EndpointDataImplTest extends TestCase { + + EndpointDataImpl instance = null; + + public EndpointDataImplTest(String testName) { + super(testName); + } + + protected void setUp() throws Exception { + instance = new EndpointDataImpl("{http://localhost/filebctest/FileOut}portTypeFileOut", + "{http://localhost/filebctest/FileOut}serviceFileOut", + "portFileOut", + 0); + } + + protected void tearDown() throws Exception { + } + + public static Test suite() { + TestSuite suite = new TestSuite(EndpointDataImplTest.class); + + return suite; + } + + /** + * Test of getInterface method, of class com.sun.jbi.filebc.packaging.EndpointDataImpl. + */ + public void testGetInterface() { + System.out.println("Testing getInterface"); + + String expResult = "{http://localhost/filebctest/FileOut}portTypeFileOut"; + String result = instance.getInterface(); + assertEquals(expResult, result); + + System.out.println("Successfully tested getInterface"); + + } + + /** + * Test of getService method, of class com.sun.jbi.filebc.packaging.EndpointDataImpl. + */ + public void testGetService() { + System.out.println("Testing getService"); + + String expResult = "{http://localhost/filebctest/FileOut}serviceFileOut"; + String result = instance.getService(); + assertEquals(expResult, result); + + System.out.println("Successfully tested getService"); + } + + /** + * Test of getEndpoint method, of class com.sun.jbi.filebc.packaging.EndpointDataImpl. + */ + public void testGetEndpoint() { + System.out.println("Testing getEndpoint"); + + String expResult = "portFileOut"; + String result = instance.getEndpoint(); + assertEquals(expResult, result); + + System.out.println("Successfully tested getEndpoint"); + } + + /** + * Test of getDirection method, of class com.sun.jbi.filebc.packaging.EndpointDataImpl. + */ + public void testGetDirection() { + System.out.println("Testing getDirection"); + + int expResult = 0; + int result = instance.getDirection(); + assertEquals(expResult, result); + + System.out.println("Successfully tested getDirection"); + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/packaging/WSDLConfigurationsTest.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/packaging/WSDLConfigurationsTest.java new file mode 100644 index 000000000..e59215965 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/packaging/WSDLConfigurationsTest.java @@ -0,0 +1,234 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * BEGIN_HEADER - DO NOT EDIT + * + * The contents of this file are subject to the terms + * of the Common Development and Distribution License + * (the "License"). You may not use this file except + * in compliance with the License. + * + * You can obtain a copy of the license at + * https://${package}.dev.java.net/public/CDDLv1.0.html. + * See the License for the specific language governing + * permissions and limitations under the License. + * + * When distributing Covered Code, include this CDDL + * HEADER in each file and include the License file at + * https://${package}.dev.java.net/public/CDDLv1.0.html. + * If applicable add the following below this CDDL HEADER, + * with the fields enclosed by brackets "[]" replaced with + * your own identifying information: Portions Copyright + * [year] [name of copyright owner] + */ + +/* + * @(${symbol_pound})WSDLConfigurationsTest.java + * + * Copyright 2004-2007 Sun Microsystems, Inc. All Rights Reserved. + * + * END_HEADER - DO NOT EDIT + */ +package com.sun.jbi.filebc.packaging; + +import junit.framework.*; +import com.ibm.wsdl.factory.WSDLFactoryImpl; +import com.ibm.wsdl.BindingOperationImpl; +import com.ibm.wsdl.OperationImpl; +import com.sun.jbi.filebc.Endpoint; +import com.sun.jbi.filebc.extensions.FileAddress; +import com.sun.jbi.filebc.extensions.FileBinding; +import com.sun.jbi.filebc.extensions.FileInput; +import com.sun.jbi.filebc.extensions.FileOperation; +import com.sun.jbi.filebc.extensions.FileOutput; +import com.sun.jbi.filebc.extensions.FileMessage; +import java.io.File; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Vector; +import javax.wsdl.Binding; +import javax.wsdl.BindingOperation; +import javax.wsdl.Definition; +import javax.wsdl.factory.WSDLFactory; +import javax.wsdl.Operation; +import javax.wsdl.xml.WSDLReader; +import javax.xml.namespace.QName; +import org.xml.sax.EntityResolver; +import org.apache.xml.resolver.CatalogManager; +import org.apache.xml.resolver.tools.CatalogResolver; + +/** + * * * + * @author sweng + */ +public class WSDLConfigurationsTest extends TestCase { + + static final int INBOUND = 0; + static final int OUTBOUND = 1; + WSDLConfigurations instance; + BindingOperation bo; + Operation operation; + EntityResolver resolver; + Definition definition; + WSDLReader reader; + WSDLFactory wsdlFactory; + List endpoints = new ArrayList(); + + public WSDLConfigurationsTest(String testName) { + super(testName); + } + + protected void setUp() + throws Exception { + instance = new WSDLConfigurations("testDir"); + bo = new BindingOperationImpl(); + operation = new OperationImpl(); + resolver = new CatalogResolver(new CatalogManager()); + wsdlFactory = WSDLFactory.newInstance(); + reader = ((WSDLFactoryImpl) wsdlFactory).newWSDLReader(resolver); + definition = reader.readWSDL((new File("test/com/sun/jbi/filebc/packaging/wsdls/TestFile.wsdl")).getAbsolutePath()); + } + + protected void tearDown() + throws Exception { + } + + public static Test suite() { + TestSuite suite = new TestSuite(WSDLConfigurationsTest.class); + return suite; + } + + /** + * Test of parseWSDL method, of class com.sun.jbi.filebc.packaging.WSDLConfigurations + */ + public void testParseWSDL() { + System.out.println("Testing parseWSDL"); + Iterator it = null; + File aWSDL = new File("test/com/sun/jbi/filebc/packaging/wsdls/TestFile.wsdl"); + List interfaces = new ArrayList(); + interfaces.add(new EndpointDataImpl("{urn:FileTest}HelloIF", "{urn:FileTest}MyHelloService", "{urn:FileTest}HelloIFPort", 0)); + try { + List endpoints = instance.parseWSDL(aWSDL, resolver, interfaces, new Vector(), new HashMap()); + assertEquals(endpoints.size(), 1); + assertTrue(endpoints.get(0) instanceof Endpoint); + Endpoint ep = (Endpoint) endpoints.get(0); + assertEquals("{urn:FileTest}HelloIFPort", ep.getEndpointName()); + assertEquals("{urn:FileTest}MyHelloService", ep.getServiceName().toString()); + assertEquals(0, ep.getEndpointType()); + assertTrue(ep.getFileAddress() instanceof FileAddress); + FileAddress address = ep.getFileAddress(); + assertEquals("/tmp/testing", address.getFileDirectory()); + assertTrue(ep.getFileBinding() instanceof FileBinding); + Map operations = ep.getFileOperations(); + assertEquals(operations.size(), 1); + it = operations.values().iterator(); + FileOperation operation = (FileOperation) it.next(); + FileInput fileInput = operation.getFileOperationInput(); + FileOutput fileOutput = operation.getFileOperationOutput(); + FileMessage inMessage = fileInput.getFileMessage(); + FileMessage outMessage = fileOutput.getFileMessage(); + assertEquals("FileBCInput.txt", inMessage.getFileName()); + assertEquals(9999, inMessage.getPollingInterval().longValue()); + assertTrue(inMessage.getMultipleRecordsPerFile()); + assertTrue(inMessage.getFileNameIsPattern()); + assertEquals("FileBCOutput.txt", outMessage.getFileName()); + assertFalse(outMessage.getFileNameIsPattern()); + assertFalse(outMessage.getMultipleRecordsPerFile()); + Map meps = ep.getOperationMsgExchangePattern(); + assertEquals(meps.size(), 1); + assertEquals("inout", (String) meps.get(new QName("urn:FileTest", "sayHello"))); + } catch (Exception e) { + e.printStackTrace(); + fail("Failed testing parseWSDL due to exception: " + e.getMessage()); + } + System.out.println("Successfully tested parseWSDL"); + } + + /** + * Test of listWSDLFiles method, of class com.sun.jbi.filebc.packaging.WSDLConfigurations. + */ + public void testListWSDLFiles() { + System.out.println("Testing listWSDLFiles"); + File currentDir = new File("test/com/sun/jbi/filebc/packaging/wsdls"); + List expResult = new ArrayList(); + expResult.add(new File("test/com/sun/jbi/filebc/packaging/wsdls/TestTrigger.wsdl")); + expResult.add(new File("test/com/sun/jbi/filebc/packaging/wsdls/FileInTest/TestFileIn.wsdl")); + expResult.add(new File("test/com/sun/jbi/filebc/packaging/wsdls/TestFile.wsdl")); + List result = instance.listResourceFiles(currentDir, ".wsdl"); + assertEquals(expResult.size(), result.size()); + for (int ii = 0; ii < result.size(); ii++) { + File aWSDL = (File) result.get(ii); + assertTrue(aWSDL.getPath().endsWith(".wsdl")); + } + System.out.println("Successfully tested listWSDLFiles"); + } + + /** + * Test of getBinding method, of class com.sun.jbi.filebc.packaging.WSDLConfigurations. + */ + public void testGetBinding() { + System.out.println("Testing getBinding"); + String serviceName = "{urn:FileTest}MyHelloService"; + String endpointName = "{urn:FileTest}HelloIFPort"; + Binding result = instance.getBinding(definition, serviceName, endpointName); + assertNotNull(result); + assertTrue(result.getQName().toString().equals("{urn:FileTest}HelloIFBinding")); + assertTrue(result.getPortType().getQName().toString().equals("{urn:FileTest}HelloIF")); + System.out.println("Successfully tested getBinding"); + } + + /** + * Test of determineMEP method, of class com.sun.jbi.filebc.packaging.WSDLConfigurations. + */ + public void testDetermineMEP() { +// System.out.println( "Testing determineMEP" ); +// String expResult = ""; +// String result = ""; +// // testing inbound operations +// int direction = INBOUND; +// // 1. test inbound request response type operations +// operation.setStyle( OperationType.REQUEST_RESPONSE ); +// bo.setOperation( operation ); +// expResult = "inout"; +// result = instance.determineMEP( direction, bo ); +// assertEquals( expResult, result ); +// // 2. test inbound solicit response type operations +// operation.setStyle( OperationType.SOLICIT_RESPONSE ); +// result = instance.determineMEP( direction, bo ); +// assertEquals( "unsupported", result ); +// // 3. test inbound one way type operations +// expResult = "inonly"; +// operation.setStyle( OperationType.ONE_WAY ); +// result = instance.determineMEP( direction, bo ); +// assertEquals( expResult, result ); +// // 4. test inbound notification type operations +// operation.setStyle( OperationType.NOTIFICATION ); +// result = instance.determineMEP( direction, bo ); +// assertEquals( "unsupported", result ); +// // testing outbound operations +// direction = OUTBOUND; +// // 5. test outbound request-response type operations +// operation.setStyle( OperationType.REQUEST_RESPONSE ); +// expResult = "outin"; +// result = instance.determineMEP( direction, bo ); +// assertEquals( expResult, result ); +// // 6. test outbound solicit response type operations +// operation.setStyle( OperationType.SOLICIT_RESPONSE ); +// result = instance.determineMEP( direction, bo ); +// assertEquals( expResult, result ); +// // 7. test outbound one way type operations +// operation.setStyle( OperationType.ONE_WAY ); +// expResult = "outonly"; +// result = instance.determineMEP( direction, bo ); +// assertEquals( expResult, result ); +// // 8. test outbound notification type operations +// operation.setStyle( OperationType.NOTIFICATION ); +// result = instance.determineMEP( direction, bo ); +// assertEquals( expResult, result ); +// System.out.println( "Successfully tested determineMEP" ); + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/packaging/descriptors/META-INF/jbi.xml b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/packaging/descriptors/META-INF/jbi.xml new file mode 100644 index 000000000..2b099c030 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/packaging/descriptors/META-INF/jbi.xml @@ -0,0 +1,10 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + + + + + + diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/packaging/wsdls/FileInTest/FileInTest.bpel b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/packaging/wsdls/FileInTest/FileInTest.bpel new file mode 100644 index 000000000..f93255ebf --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/packaging/wsdls/FileInTest/FileInTest.bpel @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + 'Modified string' + $sayHello_Input.result/string + + + $sayHello_Output.body/byte + $sayHello_Input.result/byte + + + $sayHello_Output.body/short + $sayHello_Input.result/short + + + $sayHello_Output.body/int + $sayHello_Input.result/int + + + $sayHello_Output.body/long + $sayHello_Input.result/long + + + $sayHello_Output.body/negativeInteger + $sayHello_Input.result/negativeInteger + + + $sayHello_Output.body/dateTime + $sayHello_Input.result/dateTime + + + $sayHello_Output.body/nonPositiveInteger + $sayHello_Input.result/nonPositiveInteger + + + $sayHello_Output.body/duration + $sayHello_Input.result/duration + + + $sayHello_Output.body/ENTITIES + $sayHello_Input.result/ENTITIES + + + $sayHello_Output.body/double + $sayHello_Input.result/double + + + $sayHello_Output.body/ENTITY + $sayHello_Input.result/ENTITY + + + $sayHello_Output.body/nonNegativeInteger + $sayHello_Input.result/nonNegativeInteger + + + 2.22 + $sayHello_Input.result/float + + + + + diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/packaging/wsdls/FileInTest/TestFileIn.wsdl b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/packaging/wsdls/FileInTest/TestFileIn.wsdl new file mode 100644 index 000000000..888b5eb84 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/packaging/wsdls/FileInTest/TestFileIn.wsdl @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/packaging/wsdls/TestFile.wsdl b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/packaging/wsdls/TestFile.wsdl new file mode 100644 index 000000000..7d1e11a4d --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/packaging/wsdls/TestFile.wsdl @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/packaging/wsdls/TestTrigger.wsdl b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/packaging/wsdls/TestTrigger.wsdl new file mode 100644 index 000000000..ffa61a3c4 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/packaging/wsdls/TestTrigger.wsdl @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/testDir/componentConfiguration.xml b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/testDir/componentConfiguration.xml new file mode 100644 index 000000000..d357e4ad7 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/testDir/componentConfiguration.xml @@ -0,0 +1,14 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + + + 10 + + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/testDir/componentConfiguration.xsd b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/testDir/componentConfiguration.xsd new file mode 100644 index 000000000..921463df8 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/testDir/componentConfiguration.xsd @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/testDir/config.properties b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/testDir/config.properties new file mode 100644 index 000000000..712a6a3ac --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/testDir/config.properties @@ -0,0 +1,3 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/util/FileStreamHandlerTest.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/util/FileStreamHandlerTest.java new file mode 100644 index 000000000..9d67c848b --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/util/FileStreamHandlerTest.java @@ -0,0 +1,680 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * BEGIN_HEADER - DO NOT EDIT + * + * The contents of this file are subject to the terms + * of the Common Development and Distribution License + * (the "License"). You may not use this file except + * in compliance with the License. + * + * You can obtain a copy of the license at + * https://${package}.dev.java.net/public/CDDLv1.0.html. + * See the License for the specific language governing + * permissions and limitations under the License. + * + * When distributing Covered Code, include this CDDL + * HEADER in each file and include the License file at + * https://${package}.dev.java.net/public/CDDLv1.0.html. + * If applicable add the following below this CDDL HEADER, + * with the fields enclosed by brackets "[]" replaced with + * your own identifying information: Portions Copyright + * [year] [name of copyright owner] + */ + +/* + * @(${symbol_pound})FileStreamHandlerTest.java + * + * Copyright 2004-2007 Sun Microsystems, Inc. All Rights Reserved. + * + * END_HEADER - DO NOT EDIT + */ +package com.sun.jbi.filebc.util; + +import junit.framework.*; +import java.io.File; +import java.io.FileInputStream; +import java.io.InputStream; +import java.io.PushbackInputStream; + +/** + * + * @author sweng + */ +public class FileStreamHandlerTest extends TestCase { + + FileStreamHandler instance; + + public FileStreamHandlerTest(String testName) { + super(testName); + } + + protected void setUp() throws Exception { + } + + protected void tearDown() throws Exception { + } + + /** + * Test of getAllContentsAsBytes method, of class com.sun.jbi.filebc.util.FileStreamHandler. + */ + public void testGetAllContentsAsBytesCase1() throws Exception { + System.out.println("Testing getAllContentsAsBytes case 1"); + + File inputFile = new File("test/com/sun/jbi/filebc/util/testInput", "SingleRecord.dat"); + FileInputStream aStream = new FileInputStream(inputFile); + + // tests the scenario where: + // 1. single record per file + // 2. maxRecordSize not defined + // 3. dropEOL option not defined + instance = new FileStreamHandler(false, + new byte[]{}, + -1, + inputFile.length()); + + byte[] result = instance.getAllContentsAsBytes(aStream); + assertTrue("This is a test of Single_Record_Per_File scenario${symbol_escape}r${symbol_escape}n".equals(new String(result)) || + "This is a test of Single_Record_Per_File scenario${symbol_escape}n".equals(new String(result))); + + System.out.println("Successfully tested getAllContentsByBytes case 1"); + } + + public void testGetAllContentsAsBytesCase2() throws Exception { + System.out.println("Testing getAllContentsAsBytes case 2"); + + File inputFile = new File("test/com/sun/jbi/filebc/util/testInput", "SingleRecord.dat"); + InputStream aStream = new FileInputStream(inputFile); + + // test the scenario where: + // 1. single record per file + // 2. maxRecord defined and less than file size + // 3. dropEOL option defined but no EOR should be found + instance = new FileStreamHandler(true, + new byte[]{}, + 18, + inputFile.length()); + byte[] result = instance.getAllContentsAsBytes(aStream); + String expResult = "This is a test of "; + System.out.println("Result is [" + result + "]"); + assertTrue(expResult.equals(new String(result))); + + + System.out.println("Successfully tested getAllContentsByBytes case 2"); + } + + public void testGetAllContentsAsBytesCase3() throws Exception { + System.out.println("Testing getAllContentsAsBytes case 3"); + + File inputFile = new File("test/com/sun/jbi/filebc/util/testInput", "SingleRecord.dat"); + InputStream aStream = new FileInputStream(inputFile); + + // test the scenario where: + // 1. single record per file + // 2. maxRecord not defined + // 3. dropEOL option defined + instance = new FileStreamHandler(true, + new byte[]{}, + -1, + inputFile.length()); + byte[] result = instance.getAllContentsAsBytes(aStream); + String expResult = "This is a test of Single_Record_Per_File scenario"; + System.out.println("Result is [" + result + "]"); + assertTrue(expResult.equals(new String(result))); + + + System.out.println("Successfully tested getAllContentsByBytes case 3"); + } + + /** + * Test of readNextRecord method, of class com.sun.jbi.filebc.util.FileStreamHandler. + */ + public void testReadNextRecordCase1() throws Exception { + System.out.println("Testing readNextRecord case 1"); + + File inputFile = new File("test/com/sun/jbi/filebc/util/testInput", "FixedLengthRecords.dat"); + FileInputStream aStream = new FileInputStream(inputFile); + String expResult; + byte[] result; + + // test the scenario where: + // 1. multiple records per file + // 2. maxRecord defined with fixed record read size + // 3. dropEOL option not defined + // 4. record delimiter not defined + + // this case test reading fixed-length multiple records + instance = new FileStreamHandler(aStream, + false, + new byte[]{}, + (long) 8, + inputFile.length()); + expResult = "aaaaaaaa"; + result = instance.readNextRecord(); + + if (result == null) { + fail("Unexpected IO error has occurred"); + } + assertTrue(expResult.equals(new String(result))); + + // read the second record + expResult = "bbbbbbbb"; + result = instance.readNextRecord(); + if (result == null) { + fail("Unexpected IO error has occurred"); + } + assertTrue(expResult.equals(new String(result))); + + // read the last record + expResult = "cccccccc"; + result = instance.readNextRecord(); + if (result == null) { + fail("Unexpected IO error has occurred"); + } + assertTrue(expResult.equals(new String(result))); + + + // test using instance.hasMoreRecords() method for remaining data + int remainingDataCount = 0; + while (instance.hasMoreRecords()) { + result = instance.readNextRecord(); + if (result != null) { + remainingDataCount++; + } + } + if ("cccccccc".equals(new String(result))) { + fail("Failed to retrieve remaining data records..."); + } + //assertTrue(result.length < 6); // last record has only 6 bytes + //assertTrue(remainingDataCount > 3); + + System.out.println("Successfully tested readNextRecord case 1"); + } + + /** + * Test of readNextRecord method, of class com.sun.jbi.filebc.util.FileStreamHandler. + */ + public void testReadNextRecordCase2() throws Exception { + System.out.println("Testing readNextRecord case 2"); + + File inputFile = new File("test/com/sun/jbi/filebc/util/testInput", "FixedLengthRecords.dat"); + PushbackInputStream aStream = new PushbackInputStream(new FileInputStream(inputFile)); + String expResult; + byte[] result; + + // test the scenario where: + // 1. multiple records per file + // 2. maxRecord defined with fixed record read size + // 3. dropEOL option defined as true + // 4. record delimiter not defined (not needed) + // 5. use the alternative constructor and methods + instance = new FileStreamHandler(true, + new byte[]{}, + (long) 8, + inputFile.length()); + + + expResult = "aaaaaaaa"; + result = instance.readNextRecord(aStream); + + if (result == null) { + fail("Unexpected IO error has occurred"); + } + assertTrue(expResult.equals(new String(result))); + + // read the second record + expResult = "bbbbbbbb"; + result = instance.readNextRecord(aStream); + if (result == null) { + fail("Unexpected IO error has occurred"); + } + assertTrue(expResult.equals(new String(result))); + + // read the last record + expResult = "cccccccc"; + result = instance.readNextRecord(aStream); + if (result == null) { + fail("Unexpected IO error has occurred"); + } + assertTrue(expResult.equals(new String(result))); + + + // test using instance.hasMoreRecords() method for remaining data + int remainingDataCount = 0; + while (instance.hasMoreRecords(aStream)) { + result = instance.readNextRecord(aStream); + if (result != null) { + remainingDataCount++; + } + } + if ("cccccccc".equals(new String(result))) { + fail("Failed to retrieve remaining data records..."); + } + + //assertTrue(result.length == 0); + //assertTrue(remainingDataCount == 3); + + System.out.println("Successfully tested readNextRecord case 2"); + } + + /** + * Test of readNextRecord method, of class com.sun.jbi.filebc.util.FileStreamHandler. + */ + public void testReadNextRecordCase3() throws Exception { + System.out.println("Testing readNextRecord case 3"); + + File inputFile = new File("test/com/sun/jbi/filebc/util/testInput", "MultipleRecords.dat"); + FileInputStream aStream = new FileInputStream(inputFile); + byte[] result; + + // test the scenario where: + // 1. multiple records per file + // 2. maxRecord not defined + // 3. dropEOL option not defined + // 4. record delimiter defined + + + // read the first record + instance = new FileStreamHandler(aStream, + false, + new byte[]{'|', '|', '|'}, + -1, + inputFile.length()); + result = instance.readNextRecord(); + if (result == null) { + fail("Unexpected IO error has occurred"); + } + assertTrue("This is record number1${symbol_escape}r${symbol_escape}n${symbol_escape}r${symbol_escape}n".equals(new String(result)) || + "This is record number1${symbol_escape}n${symbol_escape}n".equals(new String(result))); + + // read the second record + result = instance.readNextRecord(); + if (result == null) { + fail("Unexpected IO error has occurred"); + } + assertTrue("${symbol_escape}r${symbol_escape}nThis is record number 2".equals(new String(result)) || + "${symbol_escape}nThis is record number 2".equals(new String(result))); + + // read the last record + result = instance.readNextRecord(); + if (result == null) { + fail("Unexpected IO error has occurred"); + } + assertTrue("This is record number3${symbol_escape}r${symbol_escape}n${symbol_escape}r${symbol_escape}n".equals(new String(result)) || + "This is record number3${symbol_escape}n${symbol_escape}n".equals(new String(result))); + + System.out.println("Successfully tested readNextRecord case 3"); + } + + /** + * Test of readNextRecord method, of class com.sun.jbi.filebc.util.FileStreamHandler. + */ + public void testReadNextRecordCase4() throws Exception { + System.out.println("Testing readNextRecord case 4"); + + File inputFile = new File("test/com/sun/jbi/filebc/util/testInput", "MultipleRecords.dat"); + FileInputStream aStream = new FileInputStream(inputFile); + //String expResult; + byte[] result; + + // test the scenario where: + // 1. multiple records per file + // 2. maxRecord defined + // 3. dropEOL option not defined + // 4. record delimiter defined + + // tests the scenario where maxRecordSize + // is less than the actual data size + // read the first record + instance = new FileStreamHandler(aStream, + false, + new byte[]{'|', '|', '|'}, + 22, + inputFile.length()); + //expResult = "This is record number1"; + result = instance.readNextRecord(); + if (result == null) { + fail("Unexpected IO error has occurred"); + } + assertTrue("This is record number1".equals(new String(result))); + + // read the second record + //expResult = "${symbol_escape}r${symbol_escape}n${symbol_escape}r${symbol_escape}n"; + result = instance.readNextRecord(); + if (result == null) { + fail("Unexpected IO error has occurred"); + } + assertTrue("${symbol_escape}r${symbol_escape}n${symbol_escape}r${symbol_escape}n".equals(new String(result)) || + "${symbol_escape}n${symbol_escape}n".equals(new String(result))); + + + // read the last record + //expResult = "${symbol_escape}r${symbol_escape}nThis is record numbe"; + result = instance.readNextRecord(); + if (result == null) { + fail("Unexpected IO error has occurred"); + } + assertTrue("${symbol_escape}r${symbol_escape}nThis is record numbe".equals(new String(result)) || + "${symbol_escape}nThis is record number".equals(new String(result))); + + // test the scenario where: + // 1. multiple records per file + // 2. maxRecord defined + // 3. dropEOL option defined to be true + // 4. record delimiter defined + // 5. tests the scenario where maxRecordSize + // is larger than the actual data size + aStream = new FileInputStream(inputFile); + instance = new FileStreamHandler(aStream, + true, + new byte[]{'|', '|', '|'}, + 50, + inputFile.length()); + + // read the first record + //expResult = "This is record number1${symbol_escape}r${symbol_escape}n${symbol_escape}r${symbol_escape}n"; + result = instance.readNextRecord(); + if (result == null) { + fail("Unexpected IO error has occurred"); + } + assertTrue("This is record number1${symbol_escape}r${symbol_escape}n${symbol_escape}r${symbol_escape}n".equals(new String(result)) || + "This is record number1${symbol_escape}n${symbol_escape}n".equals(new String(result))); + + // read the second record + //expResult = "${symbol_escape}r${symbol_escape}nThis is record number 2"; + result = instance.readNextRecord(); + if (result == null) { + fail("Unexpected IO error has occurred"); + } + assertTrue("${symbol_escape}r${symbol_escape}nThis is record number 2".equals(new String(result)) || + "${symbol_escape}nThis is record number 2".equals(new String(result))); + + // read the last record + //expResult = "This is record number3${symbol_escape}r${symbol_escape}n${symbol_escape}r${symbol_escape}n"; + result = instance.readNextRecord(); + if (result == null) { + fail("Unexpected IO error has occurred"); + } + assertTrue("This is record number3${symbol_escape}r${symbol_escape}n${symbol_escape}r${symbol_escape}n".equals(new String(result)) || + "This is record number3${symbol_escape}n${symbol_escape}n".equals(new String(result))); + + System.out.println("Successfully tested readNextRecord case 4"); + } + + /** + * Test of readNextRecord method, of class com.sun.jbi.filebc.util.FileStreamHandler. + */ + public void testReadNextRecordCase5() throws Exception { + System.out.println("Testing readNextRecord case 5"); + + File inputFile = new File("test/com/sun/jbi/filebc/util/testInput", "MultipleRecords2.dat"); + FileInputStream aStream = new FileInputStream(inputFile); + String expResult; + byte[] result; + + // test the scenario where: + // 1. multiple records per file + // 2. maxRecord defined + // 3. dropEOL option not defined + // 4. record delimiter defined + + // tests the scenario where partial EOR + // bytes are present in the data records + + // read the first record + instance = new FileStreamHandler(aStream, + false, + new byte[]{'|', '|', '|'}, + 22, + inputFile.length()); + expResult = "This |is record number"; + result = instance.readNextRecord(); + if (result == null) { + fail("Unexpected IO error has occurred"); + } + assertTrue(expResult.equals(new String(result))); + + // read the second record + expResult = "1"; + result = instance.readNextRecord(); + if (result == null) { + fail("Unexpected IO error has occurred"); + } + assertTrue(expResult.equals(new String(result))); + + + //expResult = "${symbol_escape}r${symbol_escape}nThis is re||cord num"; + result = instance.readNextRecord(); + if (result == null) { + fail("Unexpected IO error has occurred"); + } + assertTrue("${symbol_escape}r${symbol_escape}nThis is re||cord num".equals(new String(result)) || + "${symbol_escape}nThis is re||cord numb".equals(new String(result))); + +// expResult = "ber 2"; +// result = instance.readNextRecord(); +// if (result == null) { +// fail("Unexpected IO error has occurred"); +// } +// assertTrue(expResult.equals(new String(result))); + + System.out.println("Successfully tested readNextRecord case 5"); + } + + /** + * Test of readNextRecord method, of class com.sun.jbi.filebc.util.FileStreamHandler. + */ + public void testReadNextRecordCase6() throws Exception { + System.out.println("Testing readNextRecord case 6"); + + File inputFile = new File("test/com/sun/jbi/filebc/util/testInput", "MultipleRecords3.dat"); + FileInputStream aStream = new FileInputStream(inputFile); + String expResult; + byte[] result; + + // test the scenario where: + // 1. multiple records per file + // 2. maxRecord defined + // 3. dropEOL defined + // 4. record delimiter defined + + // tests the scenario where maxRecordSize + // is less than the actual data size + // read the first record + instance = new FileStreamHandler(aStream, + false, + new byte[]{'&', '&'}, + 10, + inputFile.length()); + expResult = "This is re"; + result = instance.readNextRecord(); + if (result == null) { + fail("Unexpected IO error has occurred"); + } + assertTrue(expResult.equals(new String(result))); + + // read the second record + expResult = "cord numbe"; + result = instance.readNextRecord(); + if (result == null) { + fail("Unexpected IO error has occurred"); + } + assertTrue(expResult.equals(new String(result))); + + + expResult = "r 1"; + result = instance.readNextRecord(); + if (result == null) { + fail("Unexpected IO error has occurred"); + } + assertTrue(expResult.equals(new String(result))); + + //expResult = "2ndRecord${symbol_escape}r"; + result = instance.readNextRecord(); + if (result == null) { + fail("Unexpected IO error has occurred"); + } + assertTrue((new String(result).indexOf("2ndRecord") == 0)); + + System.out.println("Successfully tested readNextRecord case 6"); + } + + /** + * Test of readNextRecord method, of class com.sun.jbi.filebc.util.FileStreamHandler. + */ + public void testReadNextRecordCase7() throws Exception { + System.out.println("Testing readNextRecord case 7"); + + File inputFile = new File("test/com/sun/jbi/filebc/util/testInput", "MultipleRecords4.dat"); + FileInputStream aStream = new FileInputStream(inputFile); + String expResult; + byte[] result; + + // test the scenario where: + // 1. multiple records per file + // 2. maxRecord defined + // 3. dropEOL defined + // 4. record delimiter defined + + // tests the scenario max record size is + // less than actual data size and partial + // EOR sequence is found at the boundary of + // read buffers + + // test the scenario when EOR is found + instance = new FileStreamHandler(aStream, + false, + new byte[]{'|', '|', '|'}, + 10, + inputFile.length()); + expResult = "aaaaaaa"; + result = instance.readNextRecord(); + if (result == null) { + fail("Unexpected IO error has occurred"); + } + assertTrue(expResult.equals(new String(result))); + + // read the second record + expResult = "bbbbbb"; + result = instance.readNextRecord(); + if (result == null) { + fail("Unexpected IO error has occurred"); + } + assertTrue(expResult.equals(new String(result))); + + + expResult = "cccccccccc"; + result = instance.readNextRecord(); + if (result == null) { + fail("Unexpected IO error has occurred"); + } + assertTrue(expResult.equals(new String(result))); + + + + // test the scenario where EOR is not found + inputFile = new File("test/com/sun/jbi/filebc/util/testInput", "MultipleRecords5.dat"); + aStream = new FileInputStream(inputFile); + instance = new FileStreamHandler(aStream, + false, + new byte[]{'|', '|', '|'}, + 10, + inputFile.length()); + expResult = "aaaaaaa||a"; + result = instance.readNextRecord(); + if (result == null) { + fail("Unexpected IO error has occurred"); + } + assertTrue(expResult.equals(new String(result))); + + expResult = "bbbbbb"; + result = instance.readNextRecord(); + if (result == null) { + fail("Unexpected IO error has occurred"); + } + assertTrue(expResult.equals(new String(result))); + + expResult = "cccccccccc"; + result = instance.readNextRecord(); + if (result == null) { + fail("Unexpected IO error has occurred"); + } + assertTrue(expResult.equals(new String(result))); + + expResult = "ccccccccc"; + result = instance.readNextRecord(); + if (result == null) { + fail("Unexpected IO error has occurred"); + } + assertTrue(expResult.equals(new String(result))); + + // test the scenario where EOR is not found + // but partial EOR sequence at max record size limit + inputFile = new File("test/com/sun/jbi/filebc/util/testInput", "MultipleRecords6.dat"); + aStream = new FileInputStream(inputFile); + instance = new FileStreamHandler(aStream, + false, + new byte[]{'|', '|', '|'}, + 10, + inputFile.length()); + expResult = "aaaaaaaaa|"; + result = instance.readNextRecord(); + if (result == null) { + fail("Unexpected IO error has occurred"); + } + assertTrue(expResult.equals(new String(result))); + + expResult = "aabbbbbb"; + result = instance.readNextRecord(); + if (result == null) { + fail("Unexpected IO error has occurred"); + } + assertTrue(expResult.equals(new String(result))); + + expResult = "cccccccccc"; + result = instance.readNextRecord(); + if (result == null) { + fail("Unexpected IO error has occurred"); + } + assertTrue(expResult.equals(new String(result))); + + // test the scenario partial EOR is embedded in data + inputFile = new File("test/com/sun/jbi/filebc/util/testInput", "MultipleRecords7.dat"); + aStream = new FileInputStream(inputFile); + instance = new FileStreamHandler(aStream, + false, + new byte[]{'|', '&', '^', '${symbol_dollar}'}, + 100, + inputFile.length()); + expResult = "This |&is record |&^number 1"; + result = instance.readNextRecord(); + if (result == null) { + fail("Unexpected IO error has occurred"); + } + assertTrue(expResult.equals(new String(result))); + + expResult = "This is record number2"; + result = instance.readNextRecord(); + if (result == null) { + fail("Unexpected IO error has occurred"); + } + assertTrue(expResult.equals(new String(result))); + + expResult = "This is rec&&ord number3333333333333333333333333333333333333333333333"; + result = instance.readNextRecord(); + if (result == null) { + fail("Unexpected IO error has occurred"); + } + assertTrue(expResult.equals(new String(result))); + + expResult = "This is the last record"; + result = instance.readNextRecord(); + if (result == null) { + fail("Unexpected IO error has occurred"); + } + assertTrue(expResult.equals(new String(result))); + + System.out.println("Successfully tested readNextRecord case 7"); + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/util/InputFilenameFilterTest.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/util/InputFilenameFilterTest.java new file mode 100644 index 000000000..261fa9490 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/util/InputFilenameFilterTest.java @@ -0,0 +1,204 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * BEGIN_HEADER - DO NOT EDIT + * + * The contents of this file are subject to the terms + * of the Common Development and Distribution License + * (the "License"). You may not use this file except + * in compliance with the License. + * + * You can obtain a copy of the license at + * https://${package}.dev.java.net/public/CDDLv1.0.html. + * See the License for the specific language governing + * permissions and limitations under the License. + * + * When distributing Covered Code, include this CDDL + * HEADER in each file and include the License file at + * https://${package}.dev.java.net/public/CDDLv1.0.html. + * If applicable add the following below this CDDL HEADER, + * with the fields enclosed by brackets "[]" replaced with + * your own identifying information: Portions Copyright + * [year] [name of copyright owner] + */ + +/* + * @(${symbol_pound})InputFilenameFilterTest.java + * + * Copyright 2004-2007 Sun Microsystems, Inc. All Rights Reserved. + * + * END_HEADER - DO NOT EDIT + */ +package com.sun.jbi.filebc.util; + +import junit.framework.*; +import java.io.File; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * + * @author sweng + */ +public class InputFilenameFilterTest extends TestCase { + + InputFilenameFilter instance; + InputFilenameFilter instance2; + + public InputFilenameFilterTest(String testName) { + super(testName); + } + + protected void setUp() throws Exception { + instance = new InputFilenameFilter(); + AtomicInteger maxFiles = new AtomicInteger(20); + instance2 = new InputFilenameFilter("file%d.txt", "", maxFiles, false); + } + + protected void tearDown() throws Exception { + } + + /** + * Test of setFilterExpression and getFilterExpression method, of class com.sun.jbi.filebc.util.InputFilenameFilter. + */ + public void testSetGetFilterExpression() throws Exception { + System.out.println("Testing setFilterExpression"); + String filename; + String expResult; + String result = ""; + + // test %t + filename = "Input%tABC.txt"; + expResult = "Input[0-9]{4,4}(0[1-9]|1[0-2])([0-2][0-9]|3[0-1])(${symbol_escape}${symbol_escape}-(0[0-9]|1[0-9]|2[0-3])${symbol_escape}${symbol_escape}-[0-5][0-9]${symbol_escape}${symbol_escape}-[0-5][0-9]${symbol_escape}${symbol_escape}-[0-9]{0,3})?ABC${symbol_escape}${symbol_escape}.txt"; + try { + instance.setFilterExpression(filename); + result = instance.getFilterExpression(); + } catch (Exception e) { + fail("Failed to test setFilterExpression"); + } + assertEquals(expResult, result); + + // test %d + filename = "Input%d.dat"; + expResult = "Input[0-9]+${symbol_escape}${symbol_escape}.dat"; + try { + instance.setFilterExpression(filename); + result = instance.getFilterExpression(); + } catch (Exception e) { + fail("Failed to test setFilterExpression"); + } + assertEquals(expResult, result); + + // test %u + filename = "Input%uSomething.dat"; + expResult = "Input" + FileNamePatternUtil.IB_UUID_REGEX + "Something${symbol_escape}${symbol_escape}.dat"; + try { + instance.setFilterExpression(filename); + result = instance.getFilterExpression(); + } catch (Exception e) { + fail("Failed to test setFilterExpression"); + } + assertEquals(expResult, result); + System.out.println("Successfully testing setFilterExpression"); + } + + /** + * Test of accept method, of class com.sun.jbi.filebc.util.InputFilenameFilter. + */ + public void testAccept() { + System.out.println("Testing accept"); + + boolean result = false; + + try { + instance2.setFilterExpression("Input%d.dat"); + result = instance2.accept(new File("."), "Input12394828738.dat"); + } catch (Exception e) { + e.printStackTrace(); + fail("Faile to test accept method"); + } + assertTrue(result); + + try { + result = instance2.accept(new File("."), "Input12394828738something.dat"); + } catch (Exception e) { + fail("Faile to test accept method"); + } + assertFalse(result); + + try { + instance2.setFilterExpression("Input%u.dat"); + result = instance2.accept(new File("."), "Input67e9e747-ee91-4669-9ae1-1048785f6f9e.dat"); + } catch (Exception e) { + fail("Faile to test accept method"); + } + + assertTrue(result); + + try { + instance2.setFilterExpression("Input%t.dat"); + result = instance2.accept(new File("."), "Input19680528-12-36-36-001.dat"); + } catch (Exception e) { + e.printStackTrace(); + fail("Faile to test accept method"); + } + + assertTrue(result); + + try { + instance2.setFilterExpression("Input%tsomething.dat"); + result = instance2.accept(new File("."), "Input19680528-12-36-36-001something.dat"); + } catch (Exception e) { + fail("Faile to test accept method"); + } + + assertTrue(result); + + try { + instance2.setFilterExpression("Input%t.dat"); + result = instance2.accept(new File("."), "Input19681528-12-36-36-001.dat"); + } catch (Exception e) { + fail("Faile to test accept method"); + } + + assertFalse(result); + + try { + instance2.setFilterExpression("Input%t.dat"); + result = instance2.accept(new File("."), "Input19680528-24-36-36-001.dat"); + } catch (Exception e) { + fail("Faile to test accept method"); + } + + assertFalse(result); + + try { + instance2.setFilterExpression("Input%t.dat"); + result = instance2.accept(new File("."), "Input19680528-12-60-36-001.dat"); + } catch (Exception e) { + fail("Faile to test accept method"); + } + + assertFalse(result); + + try { + instance2.setFilterExpression("Input%t.dat"); + result = instance2.accept(new File("."), "Input19680528-12-36-36-001.dat"); + } catch (Exception e) { + fail("Faile to test accept method"); + } + + assertTrue(result); + + try { + instance2.setFilterExpression("Input%t.dat"); + result = instance2.accept(new File("."), "Input19680528.dat"); + } catch (Exception e) { + fail("Faile to test accept method"); + } + + assertTrue(result); + + System.out.println("Successfully tested accept"); + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/util/OutputFilenameFormatterTest.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/util/OutputFilenameFormatterTest.java new file mode 100644 index 000000000..fe86eb392 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/util/OutputFilenameFormatterTest.java @@ -0,0 +1,121 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * BEGIN_HEADER - DO NOT EDIT + * + * The contents of this file are subject to the terms + * of the Common Development and Distribution License + * (the "License"). You may not use this file except + * in compliance with the License. + * + * You can obtain a copy of the license at + * https://${package}.dev.java.net/public/CDDLv1.0.html. + * See the License for the specific language governing + * permissions and limitations under the License. + * + * When distributing Covered Code, include this CDDL + * HEADER in each file and include the License file at + * https://${package}.dev.java.net/public/CDDLv1.0.html. + * If applicable add the following below this CDDL HEADER, + * with the fields enclosed by brackets "[]" replaced with + * your own identifying information: Portions Copyright + * [year] [name of copyright owner] + */ + +/* + * @(${symbol_pound})OutputFilenameFormatterTest.java + * + * Copyright 2004-2007 Sun Microsystems, Inc. All Rights Reserved. + * + * END_HEADER - DO NOT EDIT + */ +package com.sun.jbi.filebc.util; + +import junit.framework.*; + +/** + * + * @author sweng + */ +public class OutputFilenameFormatterTest extends TestCase { + + public OutputFilenameFormatterTest(String testName) { + super(testName); + } + + protected void setUp() throws Exception { + } + + protected void tearDown() throws Exception { + } + + /** + * Test of getNextOutputFileName method, of class com.sun.jbi.filebc.util.OutputFilenameFormatter. + */ + public void testGetNextOutputFileName() { + System.out.println("Testing getNextOutputFileName"); + + String expResult = "test0.dat"; + String result = ""; + + try { + result = OutputFilenameFormatter.getNextOutputFileName("test%d.dat"); + } catch (Exception e) { + fail("Failed to test getNextOutputFileName."); + } + assertEquals(expResult, result); + + expResult = "test1.dat"; + try { + result = OutputFilenameFormatter.getNextOutputFileName("test%d.dat"); + } catch (Exception e) { + fail("Failed to test getNextOutputFileName."); + } + assertEquals(expResult, result); + + expResult = "test2.dat"; + try { + result = OutputFilenameFormatter.getNextOutputFileName("test%d.dat"); + } catch (Exception e) { + fail("Failed to test getNextOutputFileName."); + } + assertEquals(expResult, result); + + System.out.println("Successfully tested getNextOutputFileName"); + } + + /** + * Test of getOutputFileName method, of class com.sun.jbi.filebc.util.OutputFilenameFormatter. + */ + public void testGetOutputFileName() { + System.out.println("Testing getOutputFileName"); + + String expResult = "Test0.txt"; + String result = ""; + try { + result = OutputFilenameFormatter.getOutputFileName("Test%d.txt"); + } catch (Exception e) { + fail("Failed to test GetOutputFileName."); + } + assertEquals(expResult, result); + + expResult = "dummy0.dat"; + try { + result = OutputFilenameFormatter.getOutputFileName("dummy%d.dat"); + } catch (Exception e) { + fail("Failed to test GetOutputFileName."); + } + assertEquals(expResult, result); + + expResult = "Test0.txt"; + try { + result = OutputFilenameFormatter.getOutputFileName("Test%d.txt"); + } catch (Exception e) { + fail("Failed to test GetOutputFileName."); + } + assertEquals(expResult, result); + + System.out.println("Successfully tested getOutputFileName"); + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/util/WSDLUtilitiesTest.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/util/WSDLUtilitiesTest.java new file mode 100644 index 000000000..61e76583d --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/util/WSDLUtilitiesTest.java @@ -0,0 +1,76 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * BEGIN_HEADER - DO NOT EDIT + * + * The contents of this file are subject to the terms + * of the Common Development and Distribution License + * (the "License"). You may not use this file except + * in compliance with the License. + * + * You can obtain a copy of the license at + * https://${package}.dev.java.net/public/CDDLv1.0.html. + * See the License for the specific language governing + * permissions and limitations under the License. + * + * When distributing Covered Code, include this CDDL + * HEADER in each file and include the License file at + * https://${package}.dev.java.net/public/CDDLv1.0.html. + * If applicable add the following below this CDDL HEADER, + * with the fields enclosed by brackets "[]" replaced with + * your own identifying information: Portions Copyright + * [year] [name of copyright owner] + */ + +/* + * @(${symbol_pound})WSDLUtilitiesTest.java + * + * Copyright 2004-2007 Sun Microsystems, Inc. All Rights Reserved. + * + * END_HEADER - DO NOT EDIT + */ +package com.sun.jbi.filebc.util; + +import junit.framework.*; +import javax.xml.namespace.QName; + +/** + * + * @author sweng + */ +public class WSDLUtilitiesTest extends TestCase { + + public WSDLUtilitiesTest(String testName) { + super(testName); + } + + protected void setUp() throws Exception { + } + + protected void tearDown() throws Exception { + } + + /** + * Test of isBuiltInType method, of class com.sun.jbi.filebc.util.WSDLUtilities. + */ + public void testIsBuiltInType() { + System.out.println("Testing isBuiltInType"); + + QName typename = QName.valueOf("{http://www.w3.org/2001/XMLSchema}double"); + + boolean expResult = true; + boolean result = WSDLUtilities.isBuiltInType(typename); + assertEquals(expResult, result); + + typename = QName.valueOf("{http://www.w3.org/2001/XMLSchema}string"); + result = WSDLUtilities.isBuiltInType(typename); + assertEquals(expResult, result); + + typename = QName.valueOf("{http://www.w3.org/2001/XMLSchema}ENTITIES"); + result = WSDLUtilities.isBuiltInType(typename); + assertEquals(expResult, result); + + System.out.println("Successfully tested isBuiltInType"); + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/util/XmlUtilTest.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/util/XmlUtilTest.java new file mode 100644 index 000000000..7c3b4c67d --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/util/XmlUtilTest.java @@ -0,0 +1,230 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * BEGIN_HEADER - DO NOT EDIT + * + * The contents of this file are subject to the terms + * of the Common Development and Distribution License + * (the "License"). You may not use this file except + * in compliance with the License. + * + * You can obtain a copy of the license at + * https://${package}.dev.java.net/public/CDDLv1.0.html. + * See the License for the specific language governing + * permissions and limitations under the License. + * + * When distributing Covered Code, include this CDDL + * HEADER in each file and include the License file at + * https://${package}.dev.java.net/public/CDDLv1.0.html. + * If applicable add the following below this CDDL HEADER, + * with the fields enclosed by brackets "[]" replaced with + * your own identifying information: Portions Copyright + * [year] [name of copyright owner] + */ + +/* + * @(${symbol_pound})XmlUtilTest.java + * + * Copyright 2004-2007 Sun Microsystems, Inc. All Rights Reserved. + * + * END_HEADER - DO NOT EDIT + */ + +package com.sun.jbi.filebc.util; + +import java.io.File; +import java.io.FileInputStream; +import java.io.InputStream; +import junit.framework.*; +import java.io.StringReader; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.Text; +import org.xml.sax.InputSource; + +/** + * + * @author sweng + */ +public class XmlUtilTest extends TestCase { + public XmlUtilTest(String testName) { + super(testName); + } + + protected void setUp() throws Exception { + } + + protected void tearDown() throws Exception { + } + + /** + * Test of createDocument method, of class com.sun.jbi.filebc.util.XmlUtil. + */ + public void testCreateDocument() throws Exception { + System.out.println("Testing createDocument"); + + Document result = XmlUtil.createDocument(true); + assertTrue(result instanceof Document); + + result = XmlUtil.createDocument(true, new InputSource(new StringReader("something"))); + assertTrue(result instanceof Document); + System.out.println("Successfully tested createDocument"); + } + + /** + * Test of createDocumentFromXML method, of class com.sun.jbi.filebc.util.XmlUtil. + */ + public void testCreateDocumentFromXML() throws Exception { + System.out.println("Testing createDocumentFromXML"); + + boolean namespaceAware = true; + String xml = " my test "; + + Document expResult = null; + Document result = XmlUtil.createDocumentFromXML(namespaceAware, xml); + Element node = result.getDocumentElement(); + assertEquals("Foo", node.getNodeName()); + Node child = node.getFirstChild(); + assertTrue(child instanceof Text); + assertEquals(" my test ", ((Text)child).getNodeValue()); + assertTrue(result instanceof Document); + + System.out.println("Successfully tested createDocumentFromXML"); + } + + /** + * Test of getText method, of class com.sun.jbi.filebc.util.XmlUtil. + */ + public void testGetText() { + System.out.println("Testing getText"); + + try { + InputStream is = new FileInputStream(new File("test/com/sun/jbi/filebc/util/testInput/TestGetText.xml")); + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + factory.setNamespaceAware(true); + DocumentBuilder builder = factory.newDocumentBuilder(); + Document document = builder.parse(is); + Node node = document.getDocumentElement(); + + String result = XmlUtil.getText((Node)node); + assertEquals(" Hello World!!!${symbol_escape}n ${symbol_escape}n ${symbol_escape}n ${symbol_escape}n ${symbol_escape}n ${symbol_escape}n ${symbol_escape}n", result); + } catch (Exception e) { + fail("Failed to test getText"); + } + + System.out.println("Successfull tested getText"); + } + + /** + * Test of transformToBytes method, of class com.sun.jbi.filebc.util.XmlUtil. + */ + public void testTransformToBytes() throws Exception { + System.out.println("Testing transformToBytes"); + + InputStream is = new FileInputStream(new File("test/com/sun/jbi/filebc/util/testInput/TestGetText.xml")); + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + factory.setNamespaceAware(true); + DocumentBuilder builder = factory.newDocumentBuilder(); + Document document = builder.parse(is); + Node node = document.getDocumentElement(); + + // test with omit xml declaration flag true + byte[] expResult = (" Hello World!!!${symbol_escape}r${symbol_escape}n" + + " input0${symbol_escape}r${symbol_escape}n" + + " a${symbol_escape}r${symbol_escape}n" + + " 5${symbol_escape}r${symbol_escape}n" + + " 12345${symbol_escape}r${symbol_escape}n" + + " 12345${symbol_escape}r${symbol_escape}n" + + " 2.22${symbol_escape}r${symbol_escape}n" + + "${symbol_escape}r${symbol_escape}n").getBytes(); + byte[] result = XmlUtil.transformToBytes(node, "utf-8", true); + for (int ii = 0; ii < expResult.length; ii++) { + assertTrue(expResult[ii] == result[ii]); + } + + expResult = ("${symbol_escape}r${symbol_escape}n" + + " Hello World!!!${symbol_escape}r${symbol_escape}n" + + " input0${symbol_escape}r${symbol_escape}n" + + " a${symbol_escape}r${symbol_escape}n" + + " 5${symbol_escape}r${symbol_escape}n" + + " 12345${symbol_escape}r${symbol_escape}n" + + " 12345${symbol_escape}r${symbol_escape}n" + + " 2.22${symbol_escape}r${symbol_escape}n" + + "${symbol_escape}r${symbol_escape}n").getBytes(); + result = XmlUtil.transformToBytes(node, "utf-8", false); + for (int ii = 0; ii < expResult.length; ii++) { + assertTrue(expResult[ii] == result[ii]); + } + + result = XmlUtil.transformToBytes(node, "utf-8", false, "xml"); + for (int ii = 0; ii < expResult.length; ii++) { + assertTrue(expResult[ii] == result[ii]); + } + + expResult = ("Hello World!!!").getBytes(); + node = document.createTextNode("Hello World!!!"); + + result = XmlUtil.transformToBytes(node, "utf-8", false, "text"); + for (int ii = 0; ii < expResult.length; ii++) { + assertTrue(expResult[ii] == result[ii]); + } + + System.out.println("Successfully tested transformToBytes"); + } + + /** + * Test of transformToString method, of class com.sun.jbi.filebc.util.XmlUtil. + */ + public void testTransformToString() throws Exception { + System.out.println("Testing transformToString"); + + InputStream is = new FileInputStream(new File("test/com/sun/jbi/filebc/util/testInput/TestGetText.xml")); + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + factory.setNamespaceAware(true); + DocumentBuilder builder = factory.newDocumentBuilder(); + Document document = builder.parse(is); + Node node = document.getDocumentElement(); + + // test with omit xml declaration flag true + String expResult = " Hello World!!!${symbol_escape}r${symbol_escape}n" + + " input0${symbol_escape}r${symbol_escape}n" + + " a${symbol_escape}r${symbol_escape}n" + + " 5${symbol_escape}r${symbol_escape}n" + + " 12345${symbol_escape}r${symbol_escape}n" + + " 12345${symbol_escape}r${symbol_escape}n" + + " 2.22${symbol_escape}r${symbol_escape}n" + + "${symbol_escape}r${symbol_escape}n"; + String result = XmlUtil.transformToString(node, "utf-8", true); + System.out.println("expResult is [" + expResult + "]"); + System.out.println("result is [" + result + "]"); + assertEquals(expResult, result); + + expResult = "${symbol_escape}r${symbol_escape}n" + + " Hello World!!!${symbol_escape}r${symbol_escape}n" + + " input0${symbol_escape}r${symbol_escape}n" + + " a${symbol_escape}r${symbol_escape}n" + + " 5${symbol_escape}r${symbol_escape}n" + + " 12345${symbol_escape}r${symbol_escape}n" + + " 12345${symbol_escape}r${symbol_escape}n" + + " 2.22${symbol_escape}r${symbol_escape}n" + + "${symbol_escape}r${symbol_escape}n"; + result = XmlUtil.transformToString(node, "utf-8", false); + assertEquals(expResult, result); + + result = XmlUtil.transformToString(node, "utf-8", false, "xml"); + assertEquals(expResult, result); + + expResult = "Hello World!!!"; + node = document.createTextNode("Hello World!!!"); + + result = XmlUtil.transformToString(node, "utf-8", false, "text"); + assertEquals(expResult, result); + + System.out.println("Successfully tested transformToString"); + } + +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/util/testInput/FixedLengthRecords.dat b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/util/testInput/FixedLengthRecords.dat new file mode 100644 index 000000000..b1954fdde --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/util/testInput/FixedLengthRecords.dat @@ -0,0 +1 @@ +aaaaaaaabbbbbbbbccccccccddddddddeeeeeeeefffffff diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/util/testInput/MultipleRecords.dat b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/util/testInput/MultipleRecords.dat new file mode 100644 index 000000000..a98ca585f --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/util/testInput/MultipleRecords.dat @@ -0,0 +1,6 @@ +This is record number1 + +||| +This is record number 2|||This is record number3 + +||| diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/util/testInput/MultipleRecords2.dat b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/util/testInput/MultipleRecords2.dat new file mode 100644 index 000000000..e7e8849c4 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/util/testInput/MultipleRecords2.dat @@ -0,0 +1,2 @@ +This |is record number1||| +This is re||cord number 2||| diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/util/testInput/MultipleRecords3.dat b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/util/testInput/MultipleRecords3.dat new file mode 100644 index 000000000..f56920290 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/util/testInput/MultipleRecords3.dat @@ -0,0 +1 @@ +This is record number 1&&2ndRecord diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/util/testInput/MultipleRecords4.dat b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/util/testInput/MultipleRecords4.dat new file mode 100644 index 000000000..791ca15a1 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/util/testInput/MultipleRecords4.dat @@ -0,0 +1 @@ +aaaaaaa|||bbbbbb|||cccccccccc diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/util/testInput/MultipleRecords5.dat b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/util/testInput/MultipleRecords5.dat new file mode 100644 index 000000000..1cbc50cdc --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/util/testInput/MultipleRecords5.dat @@ -0,0 +1 @@ +aaaaaaa||abbbbbb|||ccccccccccccccccccc \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/util/testInput/MultipleRecords6.dat b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/util/testInput/MultipleRecords6.dat new file mode 100644 index 000000000..75cab6874 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/util/testInput/MultipleRecords6.dat @@ -0,0 +1 @@ +aaaaaaaaa|aabbbbbb|||ccccccccccccccccccc \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/util/testInput/MultipleRecords7.dat b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/util/testInput/MultipleRecords7.dat new file mode 100644 index 000000000..baab83f44 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/util/testInput/MultipleRecords7.dat @@ -0,0 +1 @@ +This |&is record |&^number 1|&^$This is record number2|&^$This is rec&&ord number3333333333333333333333333333333333333333333333|&^$This is the last record \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/util/testInput/SingleRecord.dat b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/util/testInput/SingleRecord.dat new file mode 100644 index 000000000..5ead8734c --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/util/testInput/SingleRecord.dat @@ -0,0 +1 @@ +This is a test of Single_Record_Per_File scenario diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/util/testInput/TestGetText.xml b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/util/testInput/TestGetText.xml new file mode 100644 index 000000000..ad7d6b8c3 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/com/sun/jbi/filebc/util/testInput/TestGetText.xml @@ -0,0 +1,11 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + Hello World!!! + input0 + a + 5 + 12345 + 12345 + 2.22 + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/test/framework/Configuration.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/test/framework/Configuration.java new file mode 100644 index 000000000..d80dfdda7 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/test/framework/Configuration.java @@ -0,0 +1,89 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +package test.jbi.integration.test.framework; + +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.util.Properties; + +final public class Configuration { + + private static final String sWorkingDir; + private static final String sJbiHost; + private static final int sJbiPort; + private static final String sJbiUsername; + private static final String sJbiPassword; + private static final String sJbiTarget; + private static final String sJMXServiceURL; + + static { + + InputStream in = Configuration.class.getResourceAsStream("config.properties"); + Properties prop = new Properties(); + if (in != null) { + try { + prop.load(in); + } catch (IOException e) { + e.printStackTrace(); + } + } + sWorkingDir = prop.getProperty("WorkingDir", System.getProperty("java.io.tmpdir")); + sJbiHost = prop.getProperty("JbiHost", "localhost"); + + int port = 8686; + try { + port = Integer.parseInt(prop.getProperty("JbiPort", "8686")); + } catch (Throwable t) { + } + sJbiPort = port; + + sJbiUsername = prop.getProperty("JbiUsername", "admin"); + sJbiPassword = prop.getProperty("JbiPassword", "adminadmin"); + sJbiTarget = prop.getProperty("JbiTarget", "server"); + sJMXServiceURL = prop.getProperty("JMXServiceURL", "service:jmx:rmi:///jndi/rmi://:8686/jmxrmi"); + + } + + public static String getWorkingDir() { + return sWorkingDir; + } + + public static String getJbiHost() { + return sJbiHost; + } + + public static int getJbiPort() { + return sJbiPort; + } + + public static String getJbiUsername() { + return sJbiUsername; + } + + public static String getJbiPassword() { + return sJbiPassword; + } + + public static String getJbiTarget() { + return sJbiTarget; + } + + public static String getJMXServiceURL() { + return sJMXServiceURL; + } + + public static String getPath(Class cls, String fileName) { + //Latter we can change this code to test run integration tests with other JMS providers. + //Right now the JMS providers are mentioned in the WSDL. In future we can check some system property + //to see which JMS provider we want to test and return the corresponding WSDLS files. May be we can + //append the file name with the JMS provider name. + URL url = cls.getResource(fileName); + if (url == null) { + return null; + } + + return url.getPath(); + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/test/framework/IntegrationTestCase.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/test/framework/IntegrationTestCase.java new file mode 100644 index 000000000..ac34e689a --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/test/framework/IntegrationTestCase.java @@ -0,0 +1,55 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +package test.jbi.integration.test.framework; + +import java.io.Serializable; + +import junit.framework.TestCase; +import test.jbi.integration.testbc.core.Connection; +import test.jbi.integration.testbc.installer.TestSEInstaller; + +import com.sun.jbi.ui.common.JBIRemoteException; + +abstract public class IntegrationTestCase extends TestCase implements Serializable { + + transient private String mTestBC; + transient private OpenESBInstaller mJbiInstaller; + transient private Connection mCon; + + @Override + protected void setUp() throws Exception { + super.setUp(); + mJbiInstaller = new OpenESBInstaller(Configuration.getJbiHost(), Configuration.getJbiPort(), Configuration.getJbiUsername(), Configuration.getJbiPassword(), + Configuration.getJbiTarget()); + + try { + //make sure it is uninstalled + mJbiInstaller.uninstallComponent("sun-test-engine"); + } catch (JBIRemoteException ex) { + } + + String testBCDir = TestSEInstaller.generateInstaller(Configuration.getWorkingDir()); + + mTestBC = mJbiInstaller.installComponent(testBCDir); + mTestBC = mJbiInstaller.startComponent(mTestBC); + + mCon = new Connection("localhost", 9888); + mCon.start(); + } + + @Override + protected void tearDown() throws Exception { + mCon.close(); + mJbiInstaller.uninstallComponent(mTestBC); + super.tearDown(); + } + + protected OpenESBInstaller getInstaller() { + return mJbiInstaller; + } + + protected Connection getConnection() { + return mCon; + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/test/framework/OpenESBInstaller.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/test/framework/OpenESBInstaller.java new file mode 100644 index 000000000..fafc87438 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/test/framework/OpenESBInstaller.java @@ -0,0 +1,106 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * BEGIN_HEADER - DO NOT EDIT + * + * The contents of this file are subject to the terms + * of the Common Development and Distribution License + * (the "License"). You may not use this file except + * in compliance with the License. + * + * You can obtain a copy of the license at + * https://${package}.dev.java.net/public/CDDLv1.0.html. + * See the License for the specific language governing + * permissions and limitations under the License. + * + * When distributing Covered Code, include this CDDL + * HEADER in each file and include the License file at + * https://${package}.dev.java.net/public/CDDLv1.0.html. + * If applicable add the following below this CDDL HEADER, + * with the fields enclosed by brackets "[]" replaced with + * your own identifying information: Portions Copyright + * [year] [name of copyright owner] + */ + +/* + * @(${symbol_pound})OpenESBAdministrationService.java + * + * Copyright 2004-2007 Sun Microsystems, Inc. All Rights Reserved. + * + * END_HEADER - DO NOT EDIT + */ +package test.jbi.integration.test.framework; + +import com.sun.jbi.ui.client.JBIAdminCommandsClientFactory; +import com.sun.jbi.ui.common.JBIAdminCommands; +import com.sun.jbi.ui.common.JBIArchive; +import com.sun.jbi.ui.common.JBIRemoteException; +import com.sun.jbi.ui.common.ServiceAssemblyDD; + +/** + * + * OpenESB administration service + */ +public class OpenESBInstaller { + + private JBIAdminCommands jbiCommands; + private String targetName; + + public OpenESBInstaller(String host, int port, String username, + String password, String targetName) throws JBIRemoteException { + try { + jbiCommands = JBIAdminCommandsClientFactory.getInstance(host, port, + username, password); + this.targetName = targetName; + } catch (Throwable t) { + throw new JBIRemoteException(t); + } + } + + public String deployServiceAssembly(String zipFileName) throws Exception { + jbiCommands.deployServiceAssembly(zipFileName, targetName); + JBIArchive sa = new JBIArchive(zipFileName); + return ((ServiceAssemblyDD) sa.getJbiDescriptor()).getName(); + } + + public void stopServiceAssembly(String saName) throws JBIRemoteException { + jbiCommands.stopServiceAssembly(saName, targetName); + } + + public void startServiceAssembly(String saName) throws JBIRemoteException { + jbiCommands.startServiceAssembly(saName, targetName); + } + + public void undeployServiceAssembly(String saName) + throws JBIRemoteException { + shutdownServiceAssembly(saName); + jbiCommands.undeployServiceAssembly(saName, targetName); + } + + public void shutdownServiceAssembly(String saName) + throws JBIRemoteException { + jbiCommands.shutdownServiceAssembly(saName, targetName); + } + + public boolean isJBIRuntimeEnabled() throws JBIRemoteException { + return jbiCommands.isJBIRuntimeEnabled(); + } + + public String installComponent(String componentZipFile) + throws JBIRemoteException { + return jbiCommands.installComponent(componentZipFile, targetName); + } + + public String uninstallComponent(String componentName) + throws JBIRemoteException { + String list = jbiCommands.listBindingComponents(targetName); + jbiCommands.shutdownComponent(componentName, targetName); + return jbiCommands.uninstallComponent(componentName, targetName); + } + + public String startComponent(String componentName) + throws JBIRemoteException { + return jbiCommands.startComponent(componentName, targetName); + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/test/framework/SAAssembler.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/test/framework/SAAssembler.java new file mode 100644 index 000000000..eb7066f5b --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/test/framework/SAAssembler.java @@ -0,0 +1,216 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +package test.jbi.integration.test.framework; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Iterator; + +import javax.xml.namespace.QName; + + +import test.jbi.integration.test.framework.SAAssembler.Redelivery.OnFailure; +import test.jbi.integration.testbc.installer.TestHelper; + +public class SAAssembler { + + private static final String DESCRIPTION_END = "${symbol_escape}n"; + private static final String DESCRIPTION_BEGIN = ""; + private static final String NAME_END = "${symbol_escape}n"; + private static final String NAME_BEGIN = ""; + private static final String XML = "${symbol_escape}n"; + private static final String BEGIN_JBI = "${symbol_escape}n"; + private static final String END_JBI = "${symbol_escape}n"; + private static final String BEGIN_SA = "${symbol_escape}t${symbol_escape}n"; + private static final String END_SA = "${symbol_escape}t${symbol_escape}n"; + private static final String BEGIN_ID = "${symbol_escape}t${symbol_escape}t${symbol_escape}n"; + private static final String END_ID = "${symbol_escape}t${symbol_escape}t${symbol_escape}n"; + private static final String SERVICE_UNIT_END = "${symbol_escape}t${symbol_escape}t${symbol_escape}n"; + private static final String SERVICE_UNIT_BEGIN = "${symbol_escape}t${symbol_escape}t${symbol_escape}n"; + private ArrayList mSus = new ArrayList(); + private String name; + private String description; + private ArrayList connections = new ArrayList(); + + public SAAssembler(String name, String desc) { + this.name = name.replace(' ', '_'); + this.description = desc; + + } + + public void addSUAssembler(SUAssembler su) { + mSus.add(su); + } + + public boolean removeSUAssembler(SUAssembler su) { + return mSus.remove(su); + } + + public String assemble(String workingDir) throws IOException { + String base = workingDir + File.separator + name; + //Create base directory + File baseDir = new File(base); + if (baseDir.exists()) { + TestHelper.deleteDirectory(baseDir); + } + baseDir.mkdirs(); + + String meta = base + File.separator + "META-INF"; + File metaDir = new File(meta); + metaDir.mkdir(); + + StringBuffer buf = new StringBuffer(); + buf.append(XML); + buf.append(BEGIN_JBI); + buf.append(BEGIN_SA); + + buf.append(BEGIN_ID); + buf.append("${symbol_escape}t${symbol_escape}t${symbol_escape}t"); + buf.append(NAME_BEGIN); + buf.append(name); + buf.append(NAME_END); + buf.append("${symbol_escape}t${symbol_escape}t${symbol_escape}t"); + buf.append(DESCRIPTION_BEGIN); + buf.append(description); + buf.append(DESCRIPTION_END); + + buf.append(END_ID); + for (Iterator iter = mSus.iterator(); iter.hasNext();) { + SUAssembler su = iter.next(); + buf.append(SERVICE_UNIT_BEGIN); + + buf.append("${symbol_escape}t"); + buf.append(BEGIN_ID); + + buf.append("${symbol_escape}t${symbol_escape}t${symbol_escape}t${symbol_escape}t"); + buf.append(NAME_BEGIN); + buf.append(su.getName()); + buf.append(NAME_END); + + buf.append("${symbol_escape}t${symbol_escape}t${symbol_escape}t${symbol_escape}t"); + buf.append(DESCRIPTION_BEGIN); + buf.append(su.getDescription()); + buf.append(DESCRIPTION_END); + + buf.append("${symbol_escape}t"); + buf.append(END_ID); + + buf.append("${symbol_escape}t${symbol_escape}t${symbol_escape}t${symbol_escape}t"); + buf.append("${symbol_escape}n"); + + buf.append("${symbol_escape}t${symbol_escape}t${symbol_escape}t${symbol_escape}t${symbol_escape}t"); + buf.append(""); + buf.append(su.assemble(workingDir, base)); + buf.append("${symbol_escape}n"); + + buf.append("${symbol_escape}t${symbol_escape}t${symbol_escape}t${symbol_escape}t${symbol_escape}t"); + buf.append(""); + buf.append(su.getComponentName()); + buf.append("${symbol_escape}n"); + + buf.append("${symbol_escape}t${symbol_escape}t${symbol_escape}t${symbol_escape}t"); + buf.append("${symbol_escape}n"); + + buf.append(SERVICE_UNIT_END); + + } + + //add all the connections + buf.append("${symbol_escape}t${symbol_escape}t${symbol_escape}n"); + for (Iterator iter = connections.iterator(); iter.hasNext();) { + Object[] objs = iter.next(); + buf.append("${symbol_escape}t${symbol_escape}t${symbol_escape}t${symbol_escape}n"); + + buf.append("${symbol_escape}t${symbol_escape}t${symbol_escape}t${symbol_escape}t${symbol_escape}n"); + buf.append("${symbol_escape}t${symbol_escape}t${symbol_escape}t${symbol_escape}t${symbol_escape}n"); + + if (objs[4] != null) { + Redelivery redelivery = (Redelivery) objs[4]; + buf.append("${symbol_escape}t${symbol_escape}t${symbol_escape}t${symbol_escape}t${symbol_escape}n"); + buf.append("${symbol_escape}t${symbol_escape}t${symbol_escape}t${symbol_escape}t${symbol_escape}n"); + if (redelivery.action == OnFailure.redirect) { + buf.append("${symbol_escape}t${symbol_escape}t${symbol_escape}t${symbol_escape}t${symbol_escape}t${symbol_escape}n"); + } else { + buf.append("${symbol_escape}t${symbol_escape}t${symbol_escape}t${symbol_escape}t${symbol_escape}t<").append(redelivery.action).append("/>${symbol_escape}n"); + } + buf.append("${symbol_escape}t${symbol_escape}t${symbol_escape}t${symbol_escape}t${symbol_escape}n"); + buf.append("${symbol_escape}t${symbol_escape}t${symbol_escape}t${symbol_escape}t${symbol_escape}n"); + } + if (objs[5] != null) { + buf.append(""); + } + buf.append("${symbol_escape}t${symbol_escape}t${symbol_escape}t${symbol_escape}n"); + } + + buf.append("${symbol_escape}t${symbol_escape}t${symbol_escape}n"); + + + buf.append(END_SA); + buf.append(END_JBI); + + FileOutputStream out = new FileOutputStream(meta + File.separator + "jbi.xml"); + out.write(buf.toString().getBytes()); + out.close(); + String destJar = base + File.separator + name + ".jar"; + TestHelper.jarAllFiles(base, destJar); + return destJar; + } + + public void addConnection(QName consumerServiceName, String consumerEndpointName, QName providerServiceName, String providerEndpointName) { + addConnection(consumerServiceName, consumerEndpointName, providerServiceName, providerEndpointName, null, null); + } + + public void addConnection(QName consumerServiceName, String consumerEndpointName, QName providerServiceName, String providerEndpointName, Redelivery redelivery) { + addConnection(consumerServiceName, consumerEndpointName, providerServiceName, providerEndpointName, redelivery, null); + } + + public void addConnection(QName consumerServiceName, String consumerEndpointName, QName providerServiceName, String providerEndpointName, Redelivery redelivery, Throttling throttling) { + connections.add(new Object[]{consumerServiceName, consumerEndpointName, providerServiceName, providerEndpointName, redelivery, throttling}); + } + + static public class Redelivery { + + public static enum OnFailure { + + redirect, error, suspend, delete + }; + private int maxAttempts; + private long waitTime; + private OnFailure action; + private String redirectEndpointName; + private String redirectOperationName; + private QName redirectServiceName; + + public Redelivery(int maxAttempts, long waitTime, OnFailure action) { + this.waitTime = waitTime; + this.maxAttempts = maxAttempts; + this.action = action; + } + + public void setRedirectEndPoint(String endPointName, String operationName, QName serviceName) { + this.redirectEndpointName = endPointName; + this.redirectOperationName = operationName; + this.redirectServiceName = serviceName; + } + } + + static public class Throttling { + + private int maximumConcurrencyLimit; + + public Throttling(int maxCC) { + this.maximumConcurrencyLimit = maxCC; + } + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/test/framework/SUAssembler.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/test/framework/SUAssembler.java new file mode 100644 index 000000000..2032f684d --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/test/framework/SUAssembler.java @@ -0,0 +1,17 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +package test.jbi.integration.test.framework; + +import java.io.IOException; + +public interface SUAssembler { + + String getName(); + + String getDescription(); + + String assemble(String workingDir, String base) throws IOException; + + String getComponentName(); +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/test/framework/config.properties b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/test/framework/config.properties new file mode 100644 index 000000000..9d5fc5f99 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/test/framework/config.properties @@ -0,0 +1,9 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +JbiHost=localhost +JbiPort=8686 +JbiUsername=admin +JbiPassword=adminadmin +JbiTarget=server +JMXServiceURL=service:jmx:rmi:///jndi/rmi://:8686/jmxrmi \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/test/framework/impl/FileBCSUAssembler.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/test/framework/impl/FileBCSUAssembler.java new file mode 100644 index 000000000..c36ceb86b --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/test/framework/impl/FileBCSUAssembler.java @@ -0,0 +1,83 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +package test.jbi.integration.test.framework.impl; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import test.jbi.integration.test.framework.SUAssembler; +import test.jbi.integration.testbc.installer.TestHelper; + +public class FileBCSUAssembler implements SUAssembler { + + private String name; + private String desc; + private List wsdls; + private String jbiFile; + private static final String XML = "${symbol_escape}n"; + + public FileBCSUAssembler(String name, String desc) { + this.name = name.replace(' ', '_'); + this.desc = desc; + wsdls = new ArrayList(); + } + + public void addWsdl(String wsdl) { + wsdls.add(wsdl); + } + + public boolean removeWsdl(String wsdl) { + return wsdls.remove(wsdl); + } + + public String getJbiFile() { + return jbiFile; + } + + public void setJbiFile(String jbiFile) { + this.jbiFile = jbiFile; + } + + public String assemble(String workingDir, String destDir) throws IOException { + String base = workingDir + File.separator + name; + //Create base directory + File baseDir = new File(base); + if (baseDir.exists()) { + TestHelper.deleteDirectory(baseDir); + } + baseDir.mkdirs(); + + String meta = base + File.separator + "META-INF"; + File metaDir = new File(meta); + metaDir.mkdir(); + + //Copy all WSDL files to meta-inf folder + for (Iterator iter = wsdls.iterator(); iter.hasNext();) { + TestHelper.copyFile(meta, iter.next()); + } + + //copy jbi.xml into META-INF + TestHelper.copyFile(meta, getJbiFile(), "jbi.xml"); + + String jarFileName = name + ".jar"; + String destJar = destDir + File.separator + jarFileName; + TestHelper.jarAllFiles(base, destJar); + return jarFileName; + } + + public String getComponentName() { + return "sun-file-binding"; + } + + public String getDescription() { + return desc; + } + + public String getName() { + return name; + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testbc/core/Command.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testbc/core/Command.java new file mode 100644 index 000000000..d0b9b18ff --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testbc/core/Command.java @@ -0,0 +1,14 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +package test.jbi.integration.testbc.core; + +import java.io.Serializable; + +import javax.jbi.component.ComponentContext; + + +public interface Command extends Serializable{ + + Serializable execute(ComponentContext context) throws Exception; +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testbc/core/Connection.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testbc/core/Connection.java new file mode 100644 index 000000000..1e42da246 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testbc/core/Connection.java @@ -0,0 +1,69 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +package test.jbi.integration.testbc.core; + +import java.io.IOException; +import java.net.Socket; +import java.util.logging.Level; +import java.util.logging.Logger; + + +public class Connection { + + private static final Logger mLog = Logger.getLogger(Connection.class.getName()); + + private int serverPort; + private Proxy proxy; + private Sandbox sandbox; + private Socket s; + private String hostname; + private boolean isClosed; + + public Connection(String hostname, int port){ + this.serverPort = port; + this.hostname = hostname; + isClosed = false; + } + + public void start() throws IOException{ + s = new Socket(hostname, serverPort); + sandbox = new SandboxImpl(); + proxy = new Proxy(s, sandbox, null); + proxy.addCloseEventListener(new Proxy.CloseEventListener() { + public void socketClosed(Socket s) { + isClosed = true; + try{ + s.close(); + }catch(Throwable t){} + } + }); + proxy.start(); + } + + public Object execute(Command cmd) throws Throwable{ + byte[] data = Util.serializeObject(cmd); + byte[] reply = proxy.sendRequestReply(data); + Object obj = Util.deserializeObject(reply); + if(obj instanceof Throwable) + throw (Throwable)obj; + return obj; + } + + public boolean isClosed(){ + return isClosed; + } + + public void close(){ + if(isClosed) + return; + + try{ + proxy.sendClose(); + }catch(Throwable t){ + mLog.log(Level.WARNING, "Could not close connection properly.", t); + } + } + + +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testbc/core/ConnectionListener.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testbc/core/ConnectionListener.java new file mode 100644 index 000000000..bf66f7cfc --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testbc/core/ConnectionListener.java @@ -0,0 +1,105 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +package test.jbi.integration.testbc.core; + +import java.io.IOException; +import java.net.ServerSocket; +import java.net.Socket; +import java.util.Iterator; +import java.util.List; +import java.util.Vector; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; +import java.util.logging.Level; +import java.util.logging.Logger; + + +public class ConnectionListener { + + private static final Logger mLog = Logger.getLogger(ConnectionListener.class.getName()); + + private int listenerPort; + private ServerSocket ss; + private ThreadPoolExecutor pool; + private Object mHandlerObject; + private List clientSockets = new Vector(); + + public ConnectionListener(int port, Object handler) throws IOException{ + this.listenerPort = port; + this.mHandlerObject = handler; + pool = new ThreadPoolExecutor(10, 10, 10, TimeUnit.SECONDS, new LinkedBlockingQueue()); + ss = new ServerSocket(this.listenerPort); + } + + public void start(){ + new Thread(new ListenerThread()).start(); + } + + public void close(){ + try { + ss.close(); + } catch (Throwable e) {} + //also close any open sockets + for(Iterator iter=clientSockets.iterator(); iter.hasNext();){ + try{ + iter.next().close(); + }catch(Throwable t){} + } + pool.shutdown(); + } + + public class ListenerThread implements Runnable{ + public void run(){ + for(;;){ + Socket s = null; + try { + s = ss.accept(); + } catch (IOException e) { + if(ss.isClosed()){ + mLog.log(Level.INFO, "Listener is closed at port " + listenerPort); + break; + } + mLog.log(Level.SEVERE, "Error accepting at port " + listenerPort, e); + } + + if(s == null) + continue; + + final Socket cs = s; + clientSockets.add(cs); + pool.execute(new Runnable() { + public void run() { + //Create new Customclassloader + SandboxClassLoader clsLoader = new SandboxClassLoader(); + Sandbox sandbox = null; + try { + sandbox = (Sandbox) (clsLoader + .loadClass(SandboxClassLoader.EXECUTOR_CLASS) + .newInstance()); + } catch (Exception e) { + mLog.log(Level.SEVERE, "Could not instanciate sandbox " + cs.getPort()); + } + try { + final Proxy proxy = new Proxy(cs, sandbox, mHandlerObject); + proxy.addCloseEventListener(new Proxy.CloseEventListener() { + public void socketClosed(Socket s) { + clientSockets.remove(s); + } + }); + clsLoader.setProxy(proxy); + proxy.start(); + } catch (IOException e) { + mLog.log(Level.SEVERE, "Could not open connection at port " + cs.getPort(), e); + return; + } + + } + }); + + } + } + } + +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testbc/core/GetClassCommand.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testbc/core/GetClassCommand.java new file mode 100644 index 000000000..aa73062eb --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testbc/core/GetClassCommand.java @@ -0,0 +1,42 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +package test.jbi.integration.testbc.core; + +import java.io.IOException; +import java.io.InputStream; +import java.io.Serializable; + +import javax.jbi.component.ComponentContext; + +public class GetClassCommand implements Command { + + private static final ClassLoader CLASSLOADER = GetClassCommand.class + .getClassLoader(); + private String className; + + public Serializable execute(ComponentContext context) throws Exception{ + InputStream in = null; + Serializable result = null; + try{ + in = CLASSLOADER.getResourceAsStream(className.replace('.', '/') + ".class"); + result = Util.readBytes(in); + } catch (IOException e) { + result = e; + }finally{ + Util.closeStream(in); + } + + return result; + } + + public String getClassName() { + return className; + } + + public void setClassName(String className) { + this.className = className; + } + + +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testbc/core/Proxy.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testbc/core/Proxy.java new file mode 100644 index 000000000..3a8a2a5cd --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testbc/core/Proxy.java @@ -0,0 +1,256 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +package test.jbi.integration.testbc.core; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.net.Socket; +import java.util.ArrayList; +import java.util.Hashtable; +import java.util.Iterator; +import java.util.List; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; +import java.util.logging.Level; +import java.util.logging.Logger; + +public class Proxy { + + private static final Logger mLog = Logger.getLogger(Proxy.class.getName()); + + private Socket s; + private DataOutputStream out; + private DataInputStream in; + private Hashtable conversations = new Hashtable(); + private ThreadPoolExecutor pool; + private static final byte RUN_COMMAND = 11; + private static final byte GOT_REPLY = 22; + private static final byte CLOSE = 33; + private Sandbox sandbox; + private int conversationCounter = 1; + private List closeEventListeners = new ArrayList(); + private boolean isClosed = false; + private Object mHandler; + + public Proxy(Socket s, Sandbox sb, Object handler) throws IOException{ + this.s = s; + sandbox = sb; + this.mHandler = handler; + out = new DataOutputStream(s.getOutputStream()); + in = new DataInputStream(s.getInputStream()); + pool = new ThreadPoolExecutor(10, 10, 10, TimeUnit.SECONDS, new LinkedBlockingQueue()); + } + + public void start(){ + new Thread(new ReaderThread()).start(); + } + + synchronized public byte[] sendRequestReply(byte[] data) throws IOException{ + if(isClosed) + throw new IOException("Connection is closed."); + + Message msg = new Message(conversationCounter++, data, RUN_COMMAND); + final Object[] result = new Object[1]; + result[0] = null; + conversations.put(new Integer(msg.getConversationId()), new MessageListener() { + public void gotReply(byte[] msg) { + synchronized (result) { + result[0] = msg; + result.notify(); + } + } + }); + write(msg); + synchronized (result) { + if(result[0]==null){ + try { + result.wait(); + } catch (InterruptedException e) { + } + } + } + return (byte[])result[0]; + } + + public void sendClose() throws IOException{ + synchronized (out) { + out.writeByte(CLOSE); + } + } + + synchronized public void close(){ + if(isClosed) + return; + + isClosed = true; + //Close the socket + try{ + s.shutdownOutput(); + }catch(Throwable t){} + try{ + s.shutdownInput(); + }catch(Throwable t){} + try{ + s.close(); + }catch(Throwable t){} + notifyCloseEventListeners(); + pool.shutdown(); + } + + public boolean isClosed(){ + return isClosed; + } + + private void write(Message msg) throws IOException { + synchronized (out) { + out.writeByte(msg.getTaskId()); + out.writeInt(msg.getConversationId()); + out.writeInt(msg.getData().length); + out.write(msg.getData()); + } + } + + synchronized public void addCloseEventListener(CloseEventListener l){ + closeEventListeners.add(l); + } + + synchronized private void notifyCloseEventListeners(){ + for(Iterator iter=closeEventListeners.iterator(); iter.hasNext();){ + CloseEventListener l = iter.next(); + l.socketClosed(s); + iter.remove(); + } + } + + private class ReaderThread implements Runnable{ + + public void run(){ + + for(;;){ + + //read the task first + try { + byte taskId = in.readByte(); + if(taskId == CLOSE){ + //Send close in return if possible + //and then close socket + sendClose(); + //Close the socket + close(); + break; + } + if(taskId == -1){ + mLog.info("Socket is closed ." ); + break; + } + int conversationId = in.readInt(); + int len = in.readInt(); + byte[] data = new byte[len]; + int i = in.read(data); + int offset = 0; + while(i < len){ + if(i == -1){ + break; + } + //make sure to read all data. this is important + len -= i; + offset += i; + i = in.read(data, offset, len); + } + + if(i == -1){ + mLog.info("Socket is closed while still reading data." ); + data = null; + break; + } + + final Message msg = new Message(conversationId, data, taskId); + if(taskId == RUN_COMMAND){ + pool.execute(new Runnable() { + public void run() { + byte[] output = sandbox.execute(msg.getData(), mHandler); + msg.setData(output); + msg.setTaskId(GOT_REPLY); + //send the reply back + try { + write(msg); + } catch (IOException e) { + mLog.log(Level.WARNING, "Could not sent the reply back for Message = " + msg, e); + } + } + }); + }else if(taskId == GOT_REPLY){ + pool.execute(new Runnable() { + public void run() { + MessageListener l = conversations.remove(new Integer(msg.getConversationId())); + if(l == null){ + mLog.warning("No one was waiting for this reply. = " + msg); //ignore + }else{ + l.gotReply(msg.getData()); + } + } + }); + }else{ + mLog.warning("Invalid task ID received. Message = " + msg); + } + } catch (IOException e) { + mLog.warning("Socket is closed abruptly. " + e.getMessage()); + close(); + break; + } + + + } + } + } + + public interface CloseEventListener{ + public void socketClosed(Socket s); + } + + private interface MessageListener { + void gotReply(byte[] msg); + } + + private class Message { + + private int conversationId; + private byte[] data; + private byte taskId; + + public Message(int conversationId, byte[] data, byte taskId){ + this.conversationId = conversationId; + this.data = data; + this.taskId = taskId; + } + + public byte[] getData() { + return data; + } + + public void setData(byte[] data) { + this.data = data; + } + + public byte getTaskId() { + return taskId; + } + + public void setTaskId(byte taskId) { + this.taskId = taskId; + } + + public int getConversationId() { + return conversationId; + } + + @Override + public String toString() { + return ("ConversationId=" + conversationId + ", TaskId=" + taskId); + } + + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testbc/core/Sandbox.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testbc/core/Sandbox.java new file mode 100644 index 000000000..d1a3e9ce2 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testbc/core/Sandbox.java @@ -0,0 +1,9 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +package test.jbi.integration.testbc.core; + +public interface Sandbox { + + public byte[] execute(byte[] data, Object handler); +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testbc/core/SandboxClassLoader.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testbc/core/SandboxClassLoader.java new file mode 100644 index 000000000..1a892c509 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testbc/core/SandboxClassLoader.java @@ -0,0 +1,70 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +package test.jbi.integration.testbc.core; + +import java.io.InputStream; + +public class SandboxClassLoader extends ClassLoader { + + static public final String EXECUTOR_CLASS; + static private boolean isExecutorLoaded = false; + static private byte[] executorBytes; + static private final ClassLoader PARENT_CLASSLOADER = SandboxClassLoader.class.getClassLoader(); + static{ + String name = SandboxClassLoader.class.getName(); + EXECUTOR_CLASS = name.substring(0, name.lastIndexOf('.')) + ".SandboxImpl"; + InputStream in = null; + try{ + in = PARENT_CLASSLOADER.getResourceAsStream(EXECUTOR_CLASS.replace('.', '/') + ".class"); + if(in != null){ + executorBytes = Util.readBytes(in); + isExecutorLoaded = true; + } + } catch (Throwable e) { + }finally{ + Util.closeStream(in); + } + } + private Proxy mProxy; + + public SandboxClassLoader(){ + super(PARENT_CLASSLOADER); + if(!isExecutorLoaded) + throw new RuntimeException("Could not instantiate CustomClassLoader"); + } + + public void setProxy(Proxy p){ + mProxy = p; + } + + @Override + protected synchronized Class loadClass(String name, boolean resolve) + throws ClassNotFoundException { + if(name.equals(EXECUTOR_CLASS)){ + return findClass(name); + }else{ + return super.loadClass(name, resolve); + } + } + + @Override + protected Class findClass(String name) throws ClassNotFoundException { + byte[] clsBytes; + if(name.equals(EXECUTOR_CLASS)){ + clsBytes = executorBytes; + }else{ + GetClassCommand c = new GetClassCommand(); + c.setClassName(name); + try { + byte[] request = Util.serializeObject(c); + byte[] reply = mProxy.sendRequestReply(request); + clsBytes = (byte[])Util.deserializeObject(reply); + } catch (Throwable e) { + throw new ClassNotFoundException("Could not load class " + name, e); + } + } + return defineClass(name, clsBytes, 0, clsBytes.length); + } + +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testbc/core/SandboxImpl.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testbc/core/SandboxImpl.java new file mode 100644 index 000000000..4485f1ad8 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testbc/core/SandboxImpl.java @@ -0,0 +1,50 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +package test.jbi.integration.testbc.core; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.ObjectInputStream; + +import javax.jbi.component.ComponentContext; + + +public class SandboxImpl implements Sandbox{ + private static final byte[] BAD_REPLY; + + static{ + BAD_REPLY = new byte[2]; + BAD_REPLY[0] = 0; + BAD_REPLY[0] = 0; + } + + public byte[] execute(byte[] data, Object handler) { + byte[] reply = null; + try{ + Command c = deserializeObject(data); + reply = Util.serializeObject(c.execute((ComponentContext)handler)); + } catch (Throwable e) { + try { + reply = Util.serializeObject(e); + } catch (IOException e1) {} + } + if(reply == null) + reply = BAD_REPLY; + return reply; + + } + + private static Command deserializeObject(byte[] data) throws IOException, ClassNotFoundException{ + ObjectInputStream oin = null; + Command c; + try{ + oin = new ObjectInputStream(new ByteArrayInputStream(data)); + c = (Command)oin.readObject(); + }finally{ + Util.closeStream(oin); + } + return c; + } + +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testbc/core/Util.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testbc/core/Util.java new file mode 100644 index 000000000..cc8f25403 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testbc/core/Util.java @@ -0,0 +1,61 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +package test.jbi.integration.testbc.core; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.Closeable; +import java.io.IOException; +import java.io.InputStream; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; + +final public class Util { + + public static void closeStream(Closeable s){ + if(s == null) + return; + try{ + s.close(); + }catch(Throwable t){} + } + + public static byte[] readBytes(InputStream fin) throws IOException { + ByteArrayOutputStream bout = new ByteArrayOutputStream(1028); + try { + byte[] buf = new byte[1028]; + int len; + while ((len = fin.read(buf)) != -1) { + bout.write(buf, 0, len); + } + byte[] clsBytes = bout.toByteArray(); + return clsBytes; + } finally { + closeStream(bout); + } + } + public static Object deserializeObject(byte[] data) throws IOException, ClassNotFoundException{ + ObjectInputStream oin = null; + Object c; + try{ + oin = new ObjectInputStream(new ByteArrayInputStream(data)); + c = oin.readObject(); + }finally{ + closeStream(oin); + } + return c; + } + + public static byte[] serializeObject(Object obj) throws IOException{ + ObjectOutputStream oout = null; + ByteArrayOutputStream bout = new ByteArrayOutputStream(1028); + try{ + oout = new ObjectOutputStream(bout); + oout.writeObject(obj); + return bout.toByteArray(); + }finally{ + closeStream(oout); + } + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testbc/impl/JbiHelper.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testbc/impl/JbiHelper.java new file mode 100644 index 000000000..09c12febe --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testbc/impl/JbiHelper.java @@ -0,0 +1,223 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +package test.jbi.integration.testbc.impl; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.StringReader; +import java.util.ArrayList; +import java.util.Hashtable; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +import javax.jbi.JBIException; +import javax.jbi.component.ComponentContext; +import javax.jbi.messaging.MessageExchange; +import javax.jbi.messaging.MessagingException; +import javax.jbi.servicedesc.ServiceEndpoint; +import javax.transaction.Status; +import javax.transaction.Transaction; +import javax.transaction.TransactionManager; +import javax.xml.namespace.QName; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.transform.OutputKeys; +import javax.xml.transform.Source; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMResult; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; + +import org.w3c.dom.Document; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; + +final public class JbiHelper { + + private static TransformerFactory sTransformerFactory = TransformerFactory + .newInstance(); + private static DocumentBuilder sBuilder; + private static String JBI_WSDL_11_WRAPPER_BEGIN1 = " mCache = new Hashtable(); + private static ThreadPoolExecutor sThreadPool; + + private static MessageProcessor sMessageProcessor; + + static void start(ComponentContext componentContext) throws MessagingException{ + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + factory.setNamespaceAware(true); + try { + sBuilder = factory.newDocumentBuilder(); + } catch (ParserConfigurationException e) { + throw new RuntimeException( + "Could not instantiate document builder."); + } + sThreadPool = new ThreadPoolExecutor(10, 10, 30, TimeUnit.SECONDS, new LinkedBlockingQueue()); + + sMessageProcessor = new MessageProcessor(componentContext); + sMessageProcessor.start(); + } + + static void stop(){ + if(sMessageProcessor != null){ + sMessageProcessor.stop(); + sMessageProcessor = null; + } + + if(sThreadPool != null){ + sThreadPool.shutdownNow(); + sThreadPool = null; + } + sBuilder = null; + } + + public static Object getSavedObject(String key){ + return mCache.get(key); + } + + public static Object saveObject(String key, Object obj){ + return mCache.put(key, obj); + } + + public static Transaction startTransaction(ComponentContext context) + throws Exception { + Transaction tx = null; + + TransactionManager txManager = (TransactionManager) context + .getTransactionManager(); + txManager.begin(); + tx = txManager.getTransaction(); + if (tx == null) { + throw new Exception("Could not start strasaction"); + } + return tx; + } + + public static Transaction suspendThreadTx(ComponentContext context) + throws Exception { + return ((TransactionManager) context.getTransactionManager()).suspend(); + } + + public static void resumeTransaction(ComponentContext context, + Transaction currentTx) throws Exception { + if (currentTx != null) { + if (currentTx.getStatus() == Status.STATUS_NO_TRANSACTION) { + ((TransactionManager) context.getTransactionManager()) + .resume(currentTx); + } else { + //Transaction is already associated with the current thread + } + } + } + + public static DOMSource fromXMLToDOMSource(String xml) throws SAXException, + IOException { + Document doc = sBuilder.parse(new InputSource(new StringReader(xml))); + return new DOMSource(doc); + } + + public static String transformToString(Source src, String encoding) + throws Exception { + Transformer trans = sTransformerFactory.newTransformer(); + String xmlData = null; + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + trans.setOutputProperties(null); // reset anything previously set + trans.setOutputProperty(OutputKeys.ENCODING, encoding); + trans.setOutputProperty(OutputKeys.INDENT, "yes"); + trans.setOutputProperty(OutputKeys.METHOD, "xml"); + trans.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); + trans.transform(src, new StreamResult(baos)); + xmlData = baos.toString(encoding); + return xmlData; + } + + public static String wrapIntoJBIMessage(QName message, String[] parts) { + StringBuffer buf = new StringBuffer(); + buf.append(JBI_WSDL_11_WRAPPER_BEGIN1.replaceFirst("NS", message + .getNamespaceURI())); + buf.append(JBI_WSDL_11_WRAPPER_BEGIN2.replaceFirst("MSG", message + .getLocalPart())); + for (int i = 0; i < parts.length; ++i) { + buf + .append(JBI_WSDL_11_WRAPPER_PART.replaceFirst("VALUE", + parts[i])); + } + buf.append(JBI_WSDL_11_WRAPPER_END); + return buf.toString(); + } + + public static Object[] unwrapFromJBIMessage(Node root) { + ArrayList result = new ArrayList(); + NodeList nodeList = root.getChildNodes(); + for (int i = 0; i < nodeList.getLength(); ++i) { + Node node = nodeList.item(i); + result.add(node.getFirstChild()); + } + return result.toArray(); + } + + public static Object[] unwrapFromJBISource(Source source) throws Exception { + DOMResult result = new DOMResult(); + Transformer trans = sTransformerFactory.newTransformer(); + trans.setOutputProperties(null); // reset anything previously set + trans.setOutputProperty(OutputKeys.METHOD, "xml"); + trans.transform(source, result); + Node root = result.getNode(); + if (root instanceof Document) { + root = root.getFirstChild(); + } + return unwrapFromJBIMessage(root); + } + + public static DOMResult transformToDOMResult(Source source) + throws Exception { + DOMResult result = new DOMResult(); + Transformer trans = sTransformerFactory.newTransformer(); + trans.setOutputProperties(null); // reset anything previously set + trans.setOutputProperty(OutputKeys.METHOD, "xml"); + trans.transform(source, result); + return result; + } + + public static void execute(Runnable cmd){ + sThreadPool.execute(cmd); + } + + public static void registerEndPoint(QName serviceName, String endpointName){ + sMessageProcessor.registerEndPoint(serviceName, endpointName); + } + + public static void registerEndPoint(QName serviceName, String endpointName, MessageConsumer c){ + sMessageProcessor.registerEndPoint(serviceName, endpointName, c); + } + + public static Object unregisterEndPoint(QName serviceName, String endpointName){ + return sMessageProcessor.unregisterEndPoint(serviceName, endpointName); + } + + public static MessageExchange getNextMessage(QName serviceName, String endpointName){ + return sMessageProcessor.getNextMessage(serviceName, endpointName); + } + + public static void activateEndpoint(ComponentContext context, QName serviceName, String endpointName) throws JBIException{ + sMessageProcessor.registerEndPoint(serviceName, endpointName); + context.activateEndpoint(serviceName, endpointName); + } + + public static void deactivateEndpoint(ComponentContext context, QName serviceName, String endpointName) throws JBIException{ + ServiceEndpoint ep = context.getEndpoint(serviceName, endpointName); + sMessageProcessor.unregisterEndPoint(serviceName, endpointName); + context.deactivateEndpoint(ep); + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testbc/impl/MessageConsumer.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testbc/impl/MessageConsumer.java new file mode 100644 index 000000000..c8ae2b950 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testbc/impl/MessageConsumer.java @@ -0,0 +1,12 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +package test.jbi.integration.testbc.impl; + +import javax.jbi.messaging.MessageExchange; + +public interface MessageConsumer { + + public void onMessage(MessageExchange ex) throws Exception; + +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testbc/impl/MessageProcessor.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testbc/impl/MessageProcessor.java new file mode 100644 index 000000000..2a614e8e7 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testbc/impl/MessageProcessor.java @@ -0,0 +1,130 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +package test.jbi.integration.testbc.impl; + +import java.util.Hashtable; +import java.util.LinkedList; +import java.util.List; +import java.util.Vector; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; +import java.util.logging.Level; +import java.util.logging.Logger; + +import javax.jbi.component.ComponentContext; +import javax.jbi.messaging.DeliveryChannel; +import javax.jbi.messaging.MessageExchange; +import javax.jbi.messaging.MessagingException; +import javax.jbi.servicedesc.ServiceEndpoint; +import javax.xml.namespace.QName; + +public class MessageProcessor implements Runnable { + private static final Logger mLog = Logger.getLogger(MessageProcessor.class.getName()); + private ComponentContext mComponentContext; + private DeliveryChannel mDeliveryChannel; + private boolean stop; + private Hashtable mConsumers = new Hashtable(); + + + MessageProcessor(ComponentContext ctx) throws MessagingException{ + mComponentContext = ctx; + mDeliveryChannel = mComponentContext.getDeliveryChannel(); + } + + public void run() { + + while(!stop){ + try { + final MessageExchange ex = mDeliveryChannel.accept(1000 * 60); + if(ex == null) + continue; + + JbiHelper.execute(new Runnable() { + public void run() { + try{ + processMessage(ex); + }catch(Throwable t){ + mLog.log(Level.INFO, "Error processing message.", t); + } + } + }); + + } catch (MessagingException e) { + mLog.log(Level.INFO, "Error accepting message exchanges from delivery channel.", e); + } + } + + } + + private void processMessage(MessageExchange ex) throws Exception{ + ServiceEndpoint ep = ex.getEndpoint(); + String key = getKey(ep.getServiceName(), ep.getEndpointName()); + Object obj = mConsumers.get(key); + if(obj == null){ + mLog.log(Level.INFO, + "Message Exchange available for the end point " + key + + " not active anymore. Drop the message exchange"); + return; + } + + if(obj instanceof LinkedList){ + synchronized (obj) { + ((LinkedList)obj).addLast(ex); + } + }else{ + ((MessageConsumer)obj).onMessage(ex); + } + } + + synchronized public void stop(){ + stop = true; + } + + public void start(){ + stop = false; + JbiHelper.execute(this); + } + + public void registerEndPoint(QName serviceName, String endpointName){ + registerEndPoint(serviceName, endpointName, new LinkedList()); + } + + public void registerEndPoint(QName serviceName, String endpointName, MessageConsumer c){ + registerEndPoint(serviceName, endpointName, c); + } + + private void registerEndPoint(QName serviceName, String endpointName, Object obj){ + mConsumers.put(getKey(serviceName, endpointName), obj); + } + + private String getKey(QName serviceName, String endpointName) { + return serviceName.toString() + "-" + endpointName; + } + + public Object unregisterEndPoint(QName serviceName, String endpointName){ + Object result = mConsumers.remove(getKey(serviceName, endpointName)); + if(result instanceof LinkedList){ + synchronized (result) { + ((LinkedList)result).clear(); + } + } + return result; + } + + public MessageExchange getNextMessage(QName serviceName, String endpointName){ + Object obj = mConsumers.get(getKey(serviceName, endpointName)); + if(obj instanceof LinkedList){ + synchronized (obj) { + LinkedList l = (LinkedList)obj; + if(l.size() != 0){ + return l.removeFirst(); + } + } + } + + return null; + } + +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testbc/impl/TestSEBootstrap.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testbc/impl/TestSEBootstrap.java new file mode 100644 index 000000000..a3ea29c31 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testbc/impl/TestSEBootstrap.java @@ -0,0 +1,33 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +package test.jbi.integration.testbc.impl; + +import javax.jbi.JBIException; +import javax.jbi.component.Bootstrap; +import javax.jbi.component.InstallationContext; +import javax.management.ObjectName; + +public class TestSEBootstrap implements Bootstrap { + + public void cleanUp() throws JBIException { + //do nothing + } + + public ObjectName getExtensionMBeanName() { + return null; + } + + public void init(InstallationContext arg0) throws JBIException { + //do nothing + } + + public void onInstall() throws JBIException { + //do nothing + } + + public void onUninstall() throws JBIException { + //do nothing + } + +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testbc/impl/TestSEComponent.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testbc/impl/TestSEComponent.java new file mode 100644 index 000000000..a56ab2c71 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testbc/impl/TestSEComponent.java @@ -0,0 +1,80 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +package test.jbi.integration.testbc.impl; + +import javax.jbi.component.Component; +import javax.jbi.component.ComponentLifeCycle; +import javax.jbi.component.ServiceUnitManager; +import javax.jbi.management.DeploymentException; +import javax.jbi.messaging.MessageExchange; +import javax.jbi.servicedesc.ServiceEndpoint; + +import org.w3c.dom.Document; +import org.w3c.dom.DocumentFragment; + +public class TestSEComponent implements Component { + + public ComponentLifeCycle getLifeCycle() { + return new TestSEComponentLifeCycle(); + } + + public Document getServiceDescription(ServiceEndpoint arg0) { + // TODO Auto-generated method stub + return null; + } + + public ServiceUnitManager getServiceUnitManager() { + return new MyServiceUnitManager(); + } + + public boolean isExchangeWithConsumerOkay(ServiceEndpoint arg0, + MessageExchange arg1) { + return true; + } + + public boolean isExchangeWithProviderOkay(ServiceEndpoint arg0, + MessageExchange arg1) { + return true; + } + + public ServiceEndpoint resolveEndpointReference(DocumentFragment arg0) { + return null; + } + + private class MyServiceUnitManager implements ServiceUnitManager{ + + public String deploy(String arg0, String arg1) + throws DeploymentException { + // TODO Auto-generated method stub + return null; + } + + public void init(String arg0, String arg1) throws DeploymentException { + // TODO Auto-generated method stub + + } + + public void shutDown(String arg0) throws DeploymentException { + // TODO Auto-generated method stub + + } + + public void start(String arg0) throws DeploymentException { + // TODO Auto-generated method stub + + } + + public void stop(String arg0) throws DeploymentException { + // TODO Auto-generated method stub + + } + + public String undeploy(String arg0, String arg1) + throws DeploymentException { + // TODO Auto-generated method stub + return null; + } + + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testbc/impl/TestSEComponentLifeCycle.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testbc/impl/TestSEComponentLifeCycle.java new file mode 100644 index 000000000..fb580ed00 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testbc/impl/TestSEComponentLifeCycle.java @@ -0,0 +1,52 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +package test.jbi.integration.testbc.impl; + +import java.io.IOException; + +import javax.jbi.JBIException; +import javax.jbi.component.ComponentContext; +import javax.jbi.component.ComponentLifeCycle; +import javax.management.ObjectName; + +import test.jbi.integration.testbc.core.ConnectionListener; + +public class TestSEComponentLifeCycle implements ComponentLifeCycle { + + private ComponentContext mComponentContext; + private ConnectionListener mConnectionListener; + public ObjectName getExtensionMBeanName() { + return null; + } + + public void init(ComponentContext arg0) throws JBIException { + mComponentContext = arg0; + } + + public void shutDown() throws JBIException { + if(mConnectionListener != null){ + mConnectionListener.close(); + mConnectionListener = null; + } + + JbiHelper.stop(); + } + + public void start() throws JBIException { + shutDown(); //Stop the existing processor first + JbiHelper.start(mComponentContext); + + try{ + mConnectionListener = new ConnectionListener(9888, mComponentContext); + }catch(IOException e){ + throw new JBIException("Could not start TestBC.", e); + } + mConnectionListener.start(); + } + + public void stop() throws JBIException { + shutDown(); + } + +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testbc/impl/jbi.xml b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testbc/impl/jbi.xml new file mode 100644 index 000000000..43b92a285 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testbc/impl/jbi.xml @@ -0,0 +1,29 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + + + + + + sun-test-engine + BC for testing + + + test.jbi.integration.testbc.impl.TestSEComponent + + classes + + test.jbi.integration.testbc.impl.TestSEBootstrap + + classes + + + diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testbc/installer/TestHelper.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testbc/installer/TestHelper.java new file mode 100644 index 000000000..016b5b2fb --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testbc/installer/TestHelper.java @@ -0,0 +1,123 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +package test.jbi.integration.testbc.installer; + +import java.io.BufferedInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.zip.CRC32; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +final public class TestHelper { + + public static void jarAllFiles(String base, String destJarFile) + throws IOException { + File baseDir = new File(base); + if (!baseDir.exists() || !baseDir.isDirectory()) { + throw new RuntimeException("Invalid base directory"); + } + // First get all the files under base directory + List list = new ArrayList(); + recursiveTraverse(baseDir, list, ""); + + jarFiles(destJarFile, list); + + } + + public static void jarFiles(String destJarFile, List list) + throws IOException { + FileOutputStream fos = new FileOutputStream(destJarFile); + ZipOutputStream zos = new ZipOutputStream(fos); + int bytesRead; + byte[] buffer = new byte[1024]; + CRC32 crc = new CRC32(); + for (Iterator iter = list.iterator(); iter.hasNext();) { + String[] fileDetails = iter.next(); + File file = new File(fileDetails[0]); + BufferedInputStream bis = new BufferedInputStream( + new FileInputStream(file)); + crc.reset(); + while ((bytesRead = bis.read(buffer)) != -1) { + crc.update(buffer, 0, bytesRead); + } + bis.close(); + // Reset to beginning of input stream + bis = new BufferedInputStream(new FileInputStream(file)); + ZipEntry entry = new ZipEntry((fileDetails[1].equals("") ? "" + : fileDetails[1]) + + file.getName()); + entry.setMethod(ZipEntry.STORED); + entry.setCompressedSize(file.length()); + entry.setSize(file.length()); + entry.setCrc(crc.getValue()); + zos.putNextEntry(entry); + while ((bytesRead = bis.read(buffer)) != -1) { + zos.write(buffer, 0, bytesRead); + } + bis.close(); + } + zos.close(); + } + + public static void recursiveTraverse(File base, List l, + String relativePath) { + File[] files = base.listFiles(); + for (int i = 0; i < files.length; ++i) { + if (files[i].isDirectory()) { + recursiveTraverse(files[i], l, relativePath + + files[i].getName() + "/"); + } else { + l + .add(new String[] { files[i].getAbsolutePath(), + relativePath }); + } + } + } + + public static boolean deleteDirectory(File path) { + if (path.exists()) { + File[] files = path.listFiles(); + for (int i = 0; i < files.length; i++) { + if (files[i].isDirectory()) { + deleteDirectory(files[i]); + } else { + files[i].delete(); + } + } + } + return (path.delete()); + } + + static public void copyFile(String meta, String fileName, + String destinationName) throws IOException { + FileOutputStream fout = new FileOutputStream(meta + File.separator + + destinationName); + BufferedInputStream bis = new BufferedInputStream( + new FileInputStream(fileName)); + int bytesRead; + byte[] buffer = new byte[1024]; + while ((bytesRead = bis.read(buffer)) != -1) { + fout.write(buffer, 0, bytesRead); + } + bis.close(); + fout.close(); + } + + static public void copyFile(String meta, String fileName) throws IOException { + File f = new File(fileName); + if (!f.exists()) { + System.out.println("WARN: Could not add WSDL " + f.getName() + + " to SU"); + return; + } + copyFile(meta, fileName, f.getName()); + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testbc/installer/TestSEInstaller.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testbc/installer/TestSEInstaller.java new file mode 100644 index 000000000..e23bd07ab --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testbc/installer/TestSEInstaller.java @@ -0,0 +1,56 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +package test.jbi.integration.testbc.installer; + +import java.io.File; +import java.io.IOException; +import java.net.URL; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +public class TestSEInstaller { + + private static String sInstaller; + + synchronized public static String generateInstaller(String destDir) throws IOException{ + + if(sInstaller != null) + return sInstaller; + + //Clear the directory + File f = new File(destDir); + if(f.exists()){ + TestHelper.deleteDirectory(f); + } + f.mkdirs(); + + String beginsWith = TestSEInstaller.class.getName(); + beginsWith = beginsWith.substring(0, beginsWith.lastIndexOf('.')); + beginsWith = beginsWith.substring(0, beginsWith.lastIndexOf('.')).replace('.', '/'); + beginsWith = "classes/" + beginsWith + "/"; + + URL url = TestSEInstaller.class.getResource("TestSEInstaller.class"); + String path = url.getPath(); + path = path.substring(0, path.lastIndexOf('/')); + path = path.substring(0, path.lastIndexOf('/')); + + List list = new ArrayList(); + TestHelper.recursiveTraverse(new File(path), list, beginsWith); + for(Iterator iter=list.iterator(); iter.hasNext();){ + String[] arr = iter.next(); + if(arr[0].endsWith("jbi.xml")){ + arr[1] = "META-INF/"; + break; + } + } + + String jarName = destDir + "/TestSE.jar"; + TestHelper.jarFiles(jarName, list); + sInstaller = jarName; + return jarName; + + } + +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testcases/Helper.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testcases/Helper.java new file mode 100644 index 000000000..58628666e --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testcases/Helper.java @@ -0,0 +1,111 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +package test.jbi.integration.testcases; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileWriter; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; + +import javax.xml.namespace.QName; + +import test.jbi.integration.test.framework.Configuration; +import test.jbi.integration.test.framework.SAAssembler; +import test.jbi.integration.test.framework.SAAssembler.Redelivery; +import test.jbi.integration.test.framework.SAAssembler.Throttling; +import test.jbi.integration.test.framework.impl.FileBCSUAssembler; + +public class Helper { + + public static FileBCSUAssembler createTestSU(String name, String desc, + String wsdlFileName, String inputDir, Class cls) throws IOException { + FileBCSUAssembler su = new FileBCSUAssembler(name, desc); + + String wsdlPath = Configuration.getPath(cls, wsdlFileName); + modifyWsdl(wsdlPath, inputDir); + + su.addWsdl(wsdlPath); + su.setJbiFile(Configuration.getPath(cls, "jbi.xml")); + + return su; + } + + public static String createTestSA(FileBCSUAssembler su, String saName, + QName consumerService, String consumerEndpoint, + QName providerService, String provideEndpoint, Redelivery rd, + Throttling throt) throws IOException { + + SAAssembler sa = new SAAssembler(saName, saName); + sa.addSUAssembler(su); + // Now add connection + sa.addConnection(consumerService, consumerEndpoint, providerService, + provideEndpoint, rd, throt); + + return sa.assemble(Configuration.getWorkingDir()); + } + + public static void modifyWsdl(String wsdlPath, String inputDir) throws IOException { + StringBuilder sb = getResourceContents(wsdlPath); + + String s = sb.toString().replace("FILE_WORKING_DIR", + inputDir); + + s.toString(); + + FileWriter writer = new FileWriter(wsdlPath); + + writer.write(s); + + writer.close(); + + } + + public static StringBuilder getResourceContents(String fileResource) { + + StringBuilder sb = new StringBuilder(); + + try { + + InputStream ins = new FileInputStream(fileResource); + + BufferedReader br = new BufferedReader(new InputStreamReader(ins)); + + while (true) { + String line = br.readLine(); + if (line == null) + break; + sb.append(line + "${symbol_escape}n"); + + } + + br.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return sb; + } + + public static void writeInputFiles(String dir, int numFiles) throws IOException { + + for (int i = 0; i < numFiles; i++) { + String fileName = "test.xml" + i; + writeFile(dir,fileName, "hello world"); + } + + } + + public static void writeFile(String dir, String fileName, String content) throws IOException { + + File f = new File(dir); + f.mkdirs(); + FileWriter w = new FileWriter(dir + File.separator + fileName); + w.write(content); + w.close(); + + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testcases/filebcprotocol/TestFileProtocol.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testcases/filebcprotocol/TestFileProtocol.java new file mode 100644 index 000000000..5cb4a31d9 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testcases/filebcprotocol/TestFileProtocol.java @@ -0,0 +1,284 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/** + * + */ +package test.jbi.integration.testcases.filebcprotocol; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileWriter; +import java.io.FilenameFilter; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Serializable; + +import javax.jbi.component.ComponentContext; +import javax.jbi.messaging.ExchangeStatus; +import javax.jbi.messaging.InOut; +import javax.xml.namespace.QName; +import javax.jbi.messaging.NormalizedMessage; + +import org.w3c.dom.Text; + +import test.jbi.integration.test.framework.Configuration; +import test.jbi.integration.test.framework.IntegrationTestCase; +import test.jbi.integration.test.framework.SAAssembler; +import test.jbi.integration.test.framework.impl.FileBCSUAssembler; +import test.jbi.integration.testbc.core.Command; +import test.jbi.integration.testbc.impl.JbiHelper; +import test.jbi.integration.testcases.Helper; +import test.jbi.integration.test.framework.SAAssembler.Redelivery; +import test.jbi.integration.test.framework.SAAssembler.Throttling; + +/** + * @author Nitin Nahata + * + */ +public class TestFileProtocol extends IntegrationTestCase { + + /** + * + */ + private static final long serialVersionUID = 1L; + + /** + * service assembly name + */ + private static final String SA_NAME = "FILEBC-TEST_PROTOCOL-SA"; + /** + * consuming end-point + */ + private static final String CONSUMER_EP = "filePort"; + /** + * consuming end-point service name + */ + private static final QName FILE_SERVICE = new QName( + "http://j2ee.netbeans.org/wsdl/file", "fileService"); + + /** + * provider end-point service name + */ + private static final QName PROVIDER_SERVICE = new QName( + "urn:FILEBC-TEST_RECOVERY-SA", "testService"); + + /** + * provider end-point + */ + private static final String PROVIDER_EP = "providerEP"; + + + /** + * A file with the same name as the output file already exists. + * WSDL has protect=true on file:message but protectDirectory is not specified + * Existing output file should be renamed to: + + ".protected", in + * the existing location. + */ + public void testOutProtectNoProtectDir() throws Throwable { + + String inputDir = Configuration.getWorkingDir() + File.separator + "file-bc-protocol"; + + // Create TestSU + FileBCSUAssembler su = Helper.createTestSU( + "FILE-BC-SU-ProtocolTest", "FILE-BC-SU-ProtocolTest", + "outProtect-No-ProtectDir.wsdl", inputDir, this.getClass()); + String testSAPath = Helper.createTestSA(su, SA_NAME, + FILE_SERVICE, CONSUMER_EP, PROVIDER_SERVICE, PROVIDER_EP, null, + null); + String saName = null; + try { + + // activate endpoint + ActivateDeactivateEP activateDeactivateEPCmd = new ActivateDeactivateEP(); + activateDeactivateEPCmd.activate = true; + getConnection().execute(activateDeactivateEPCmd); + + Helper.writeInputFiles(inputDir, 1); + + // create pre-existing output file which should be protected + Helper.writeFile(inputDir, "output.xml", "dummy"); + + // Now deploy and start SA + saName = getInstaller().deployServiceAssembly(testSAPath); + getInstaller().startServiceAssembly(saName); + Thread.sleep(2000); // wait some time before SU start sending + // messages + + ReceiveMsgCommand receviceMsgCommand = new ReceiveMsgCommand(); + String str; + int i = 0; + while (!(str = (String) getConnection().execute(receviceMsgCommand)) + .equals("FAIL")) { + i++; + } + + System.out.println("No of messages received by Test BC: " + i); + + // wait for the output file to be written + Thread.sleep(1000); + + // check in-the-way file has been renamed in the existing location. + File fInDir = new File(inputDir); + File[] protectedfiles = fInDir.listFiles(new FilenameFilter(){ + public boolean accept(File dir, String name) { + if(name.startsWith("output.xml") && name.endsWith(".protected")){ + return true; + } + return false; + } + }); + + assertEquals(1, protectedfiles.length); + + } finally { + // Un-deploy SA + getInstaller().undeployServiceAssembly(SA_NAME); + } + } + + + /** + * A file with the same name as the output file already exists. + * WSDL has protect=true on file:message and protectDirectory="protect" + * Existing output file should be tagged and moved to protectDirectory ie. to + * /protect/ + */ + public void testOutProtectWithProtectDir() throws Throwable { + + String inputDir = Configuration.getWorkingDir() + File.separator + "file-bc-protocol"; + + // Create TestSU + FileBCSUAssembler su = Helper.createTestSU( + "FILE-BC-SU-ProtocolTest", "FILE-BC-SU-ProtocolTest", + "outProtect-With-ProtectDir.wsdl", inputDir, this.getClass()); + String testSAPath = Helper.createTestSA(su, SA_NAME, + FILE_SERVICE, CONSUMER_EP, PROVIDER_SERVICE, PROVIDER_EP, null, + null); + String saName = null; + try { + + // activate endpoint + ActivateDeactivateEP activateDeactivateEPCmd = new ActivateDeactivateEP(); + activateDeactivateEPCmd.activate = true; + getConnection().execute(activateDeactivateEPCmd); + + Helper.writeInputFiles(inputDir, 1); + + // create pre-existing output file which should be protected + Helper.writeFile(inputDir, "output.xml", "dummy"); + + // Now deploy and start SA + saName = getInstaller().deployServiceAssembly(testSAPath); + getInstaller().startServiceAssembly(saName); + Thread.sleep(2000); // wait some time before SU start sending + // messages + + // Drain all the messages meant for this EP + ReceiveMsgCommand receviceMsgCommand = new ReceiveMsgCommand(); + String str; + int i = 0; + while (!(str = (String) getConnection().execute(receviceMsgCommand)) + .equals("FAIL")) { + i++; + } + + System.out.println("No of messages received by Test BC: " + i); + + // wait for the output file to be written + Thread.sleep(5000); + + // this is the protectDir name in the WSDL. + String protectDirName = "protect"; + + // check in-the-way file has been moved to protect dir. + File fInDir = new File(inputDir + File.separator + protectDirName); + File[] protectedfiles = fInDir.listFiles(new FilenameFilter(){ + public boolean accept(File dir, String name) { + if(name.startsWith("output.xml") && name.endsWith(".protected")){ + return true; + } + return false; + } + }); + + assertEquals(1, protectedfiles.length); + + } finally { + // Un-deploy SA + getInstaller().undeployServiceAssembly(SA_NAME); + } + } + + @Override + protected void setUp() throws Exception { + super.setUp(); + // Make sure that SA is undeployed + try { + getInstaller().undeployServiceAssembly(SA_NAME); + } catch (Throwable t) { + } + + } + + @Override + protected void tearDown() throws Exception { + super.tearDown(); + } + + public static class ActivateDeactivateEP implements Command { + private static final long serialVersionUID = 1L; + public boolean activate; + + public Serializable execute(ComponentContext context) throws Exception { + if (activate) { + JbiHelper.activateEndpoint(context, PROVIDER_SERVICE, + PROVIDER_EP); + } else { + JbiHelper.deactivateEndpoint(context, PROVIDER_SERVICE, + PROVIDER_EP); + } + return "SUCCESS"; + } + } + + public static class ReceiveMsgCommand implements Command { + private static final long serialVersionUID = 1L; + + public Serializable execute(ComponentContext context) throws Exception { + InOut ex = (InOut) JbiHelper.getNextMessage(PROVIDER_SERVICE, + PROVIDER_EP); + Object[] results = null; + if (ex != null && ex.getStatus() != ExchangeStatus.ERROR) { + NormalizedMessage nm = ex.createMessage(); + + if (ex.getStatus() != ExchangeStatus.DONE) { + + ex.setService(FILE_SERVICE); + results = JbiHelper.unwrapFromJBISource(ex.getInMessage() + .getContent()); + nm.setContent(ex.getInMessage().getContent()); + ex.setOutMessage(nm); + context.getDeliveryChannel().sendSync(ex); + + } + + if(ex.getStatus() == ExchangeStatus.DONE){ + return "PASS"; + } else { + Object[] errorDetails = new Object[]{ex.getError(), ex.getProperty("com.sun.jbi.crl.faultcode")}; + return errorDetails; + } + + } + if (results != null && results.length > 0) { + return ((Text) results[0]).getTextContent(); + } + return "FAIL"; + } + + } + +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testcases/filebcprotocol/jbi.xml b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testcases/filebcprotocol/jbi.xml new file mode 100644 index 000000000..080b46a24 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testcases/filebcprotocol/jbi.xml @@ -0,0 +1,9 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + + + + + diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testcases/filebcprotocol/outProtect-No-ProtectDir.wsdl b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testcases/filebcprotocol/outProtect-No-ProtectDir.wsdl new file mode 100644 index 000000000..78d7a8a1d --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testcases/filebcprotocol/outProtect-No-ProtectDir.wsdl @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testcases/filebcprotocol/outProtect-With-ProtectDir.wsdl b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testcases/filebcprotocol/outProtect-With-ProtectDir.wsdl new file mode 100644 index 000000000..febc1a54e --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testcases/filebcprotocol/outProtect-With-ProtectDir.wsdl @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testcases/nmprops/TestNMProperties.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testcases/nmprops/TestNMProperties.java new file mode 100644 index 000000000..6500c06de --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testcases/nmprops/TestNMProperties.java @@ -0,0 +1,309 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/** + * + */ +package test.jbi.integration.testcases.nmprops; + +import java.io.File; +import java.io.Serializable; + +import javax.jbi.component.ComponentContext; +import javax.jbi.messaging.ExchangeStatus; +import javax.jbi.messaging.InOut; +import javax.xml.namespace.QName; +import javax.xml.transform.Source; +import javax.jbi.messaging.NormalizedMessage; + +import org.w3c.dom.Text; + +import com.sun.jbi.filebc.FileMeta; + +import test.jbi.integration.test.framework.Configuration; +import test.jbi.integration.test.framework.IntegrationTestCase; +import test.jbi.integration.test.framework.impl.FileBCSUAssembler; +import test.jbi.integration.testbc.core.Command; +import test.jbi.integration.testbc.impl.JbiHelper; +import test.jbi.integration.testcases.Helper; + +/** + * @author Nitin Nahata + * + */ +public class TestNMProperties extends IntegrationTestCase { + + /** + * + */ + private static final long serialVersionUID = 1L; + + /** + * service assembly name + */ + private static final String SA_NAME = "FILEBC-TEST_PROTOCOL-SA"; + /** + * consuming end-point + */ + private static final String CONSUMER_EP = "filePort"; + /** + * consuming end-point service name + */ + private static final QName FILE_SERVICE = new QName( + "http://j2ee.netbeans.org/wsdl/file", "fileService"); + + /** + * provider end-point service name + */ + private static final QName PROVIDER_SERVICE = new QName( + "urn:FILEBC-TEST_RECOVERY-SA", "testService"); + + /** + * provider end-point + */ + private static final String PROVIDER_EP = "providerEP"; + + private static final String NMPROP_OUT_FILENAME = "nm_prop_output.xml"; + private static final String WSDL_OUT_FILENAME = "output.xml"; + + /** + * Test Dynamic Normalized Message Properties + * Test BC provider response message has NM (Normalized Message) properties set. + * Values of the properties from the NM should override values configured in WSDL + */ + public void testNMProperties() throws Throwable { + + String inputDir = Configuration.getWorkingDir() + File.separator + "nm-properties"; + + // Create TestSU + FileBCSUAssembler su = Helper.createTestSU( + "FILE-BC-SU-ProtocolTest", "FILE-BC-SU-ProtocolTest", + "in-out.wsdl", inputDir, this.getClass()); + String testSAPath = Helper.createTestSA(su, SA_NAME, + FILE_SERVICE, CONSUMER_EP, PROVIDER_SERVICE, PROVIDER_EP, null, + null); + String saName = null; + try { + + // activate endpoint + ActivateDeactivateEP activateDeactivateEPCmd = new ActivateDeactivateEP(); + activateDeactivateEPCmd.activate = true; + getConnection().execute(activateDeactivateEPCmd); + + Helper.writeInputFiles(inputDir, 1); + + // Now deploy and start SA + saName = getInstaller().deployServiceAssembly(testSAPath); + getInstaller().startServiceAssembly(saName); + Thread.sleep(2000); // wait some time before SU start sending + // messages + + + // Dynamic dir and filename that will be set by Test BC provider. + String dyDir = Configuration.getWorkingDir() + File.separator + "nm-properties" + + File.separator + "dynamic-out"; + String dyFileName = "nm_prop_output.xml"; + + //Make Test BC receive and respond to the message + ResponseWithNMPropertyCommand receviceMsgCommand = + new ResponseWithNMPropertyCommand( dyDir, dyFileName); + String str; + int i = 0; + while (!(str = (String) getConnection().execute(receviceMsgCommand)) + .equals("FAIL")) { + i++; + } + + // wait for the output file to be written + Thread.sleep(1000); + + // Check output file was written to dynamic dir and filename instead of + // whats configured in the WSDL. + File outFile = new File(dyDir + File.separator + dyFileName); + System.out.println("Checking output file: " + outFile.getAbsolutePath()); + assertEquals(true, outFile.exists()); + + } finally { + // Un-deploy SA + getInstaller().undeployServiceAssembly(SA_NAME); + } + } + + /** + * Negative Test - Dynamic Normalized Message Properties + * Test BC provider response message has NO NM (Normalized Message) properties set. + * Configurations from the WSDL would apply in this case. + */ + public void testNoNMProperties() throws Throwable { + + String inputDir = Configuration.getWorkingDir() + File.separator + "nm-properties"; + + // Create TestSU + FileBCSUAssembler su = Helper.createTestSU( + "FILE-BC-SU-ProtocolTest", "FILE-BC-SU-ProtocolTest", + "in-out.wsdl", inputDir, this.getClass()); + String testSAPath = Helper.createTestSA(su, SA_NAME, + FILE_SERVICE, CONSUMER_EP, PROVIDER_SERVICE, PROVIDER_EP, null, + null); + String saName = null; + try { + + // activate endpoint + ActivateDeactivateEP activateDeactivateEPCmd = new ActivateDeactivateEP(); + activateDeactivateEPCmd.activate = true; + getConnection().execute(activateDeactivateEPCmd); + + Helper.writeInputFiles(inputDir, 1); + + // Now deploy and start SA + saName = getInstaller().deployServiceAssembly(testSAPath); + getInstaller().startServiceAssembly(saName); + Thread.sleep(2000); // wait some time before SU start sending + // messages + + //Make Test BC receive and respond to the message + ResponseWithOutNMPropertyCommand receviceMsgCommand = new ResponseWithOutNMPropertyCommand(); + String str; + int i = 0; + while (!(str = (String) getConnection().execute(receviceMsgCommand)) + .equals("FAIL")) { + i++; + } + + // wait for the output file to be written + Thread.sleep(1000); + + // Output file should be written at the filename and dir specified in the WSDL. + File outFile = new File(inputDir + File.separator + WSDL_OUT_FILENAME); + System.out.println("Checking output file: " + outFile.getAbsolutePath()); + assertEquals(true, outFile.exists()); + + } finally { + // Un-deploy SA + getInstaller().undeployServiceAssembly(SA_NAME); + } + } + + @Override + protected void setUp() throws Exception { + super.setUp(); + // Make sure that SA is undeployed + try { + getInstaller().undeployServiceAssembly(SA_NAME); + } catch (Throwable t) { + } + + } + + @Override + protected void tearDown() throws Exception { + super.tearDown(); + } + + public static class ActivateDeactivateEP implements Command { + private static final long serialVersionUID = 1L; + public boolean activate; + + public Serializable execute(ComponentContext context) throws Exception { + if (activate) { + JbiHelper.activateEndpoint(context, PROVIDER_SERVICE, + PROVIDER_EP); + } else { + JbiHelper.deactivateEndpoint(context, PROVIDER_SERVICE, + PROVIDER_EP); + } + return "SUCCESS"; + } + } + + public static class ResponseWithNMPropertyCommand implements Command { + private static final long serialVersionUID = 1L; + + //dynamic dir and filename + String dyDir; + String dyFileName; + + ResponseWithNMPropertyCommand(String dir, String fileName){ + dyDir = dir; + dyFileName = fileName; + } + + public Serializable execute(ComponentContext context) throws Exception { + InOut ex = (InOut) JbiHelper.getNextMessage(PROVIDER_SERVICE, + PROVIDER_EP); + Object[] results = null; + if (ex != null && ex.getStatus() != ExchangeStatus.ERROR) { + NormalizedMessage nm = ex.createMessage(); + + if (ex.getStatus() != ExchangeStatus.DONE) { + ex.setService(FILE_SERVICE); + results = JbiHelper.unwrapFromJBISource(ex.getInMessage() + .getContent()); + + // send response with NM Properties + + nm.setProperty(FileMeta.NMPROP_INBOUND_FILEDIR, dyDir); + nm.setProperty(FileMeta.NMPROP_INBOUND_FILENAME, dyFileName); + nm.setContent(ex.getInMessage().getContent()); + ex.setOutMessage(nm); + context.getDeliveryChannel().sendSync(ex); + } + + if(ex.getStatus() == ExchangeStatus.DONE){ + return "PASS"; + } else{ + Object[] errorDetails = new Object[]{ex.getError(), ex.getProperty("com.sun.jbi.crl.faultcode")}; + return errorDetails; + } + + } + + if (results != null && results.length > 0) { + return ((Text) results[0]).getTextContent(); + } + + return "FAIL"; + } + } + + public static class ResponseWithOutNMPropertyCommand implements Command { + private static final long serialVersionUID = 1L; + + public Serializable execute(ComponentContext context) throws Exception { + InOut ex = (InOut) JbiHelper.getNextMessage(PROVIDER_SERVICE, + PROVIDER_EP); + Object[] results = null; + if (ex != null && ex.getStatus() != ExchangeStatus.ERROR) { + NormalizedMessage nm = ex.createMessage(); + + if (ex.getStatus() != ExchangeStatus.DONE) { + ex.setService(FILE_SERVICE); + results = JbiHelper.unwrapFromJBISource(ex.getInMessage() + .getContent()); + + // send response with no NM Properties. + Source content = ex.getInMessage().getContent(); + nm.setContent(content); + ex.setOutMessage(nm); + context.getDeliveryChannel().sendSync(ex); + } + + if(ex.getStatus() == ExchangeStatus.DONE){ + return "PASS"; + } else{ + Object[] errorDetails = new Object[]{ex.getError(), ex.getProperty("com.sun.jbi.crl.faultcode")}; + return errorDetails; + } + + } + + if (results != null && results.length > 0) { + return ((Text) results[0]).getTextContent(); + } + + return "FAIL"; + } + + } + +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testcases/nmprops/in-out.wsdl b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testcases/nmprops/in-out.wsdl new file mode 100644 index 000000000..78d7a8a1d --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testcases/nmprops/in-out.wsdl @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testcases/nmprops/jbi.xml b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testcases/nmprops/jbi.xml new file mode 100644 index 000000000..080b46a24 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testcases/nmprops/jbi.xml @@ -0,0 +1,9 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + + + + + diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testcases/recovery/TestRecovery.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testcases/recovery/TestRecovery.java new file mode 100644 index 000000000..b800dd849 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testcases/recovery/TestRecovery.java @@ -0,0 +1,191 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/** + * + */ +package test.jbi.integration.testcases.recovery; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileWriter; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Serializable; + +import javax.jbi.component.ComponentContext; +import javax.jbi.messaging.ExchangeStatus; +import javax.jbi.messaging.InOut; +import javax.xml.namespace.QName; + +import org.w3c.dom.Text; + +import test.jbi.integration.test.framework.Configuration; +import test.jbi.integration.test.framework.IntegrationTestCase; +import test.jbi.integration.test.framework.SAAssembler; +import test.jbi.integration.test.framework.impl.FileBCSUAssembler; +import test.jbi.integration.testbc.core.Command; +import test.jbi.integration.testbc.impl.JbiHelper; +import test.jbi.integration.testcases.Helper; +import test.jbi.integration.test.framework.SAAssembler.Redelivery; +import test.jbi.integration.test.framework.SAAssembler.Throttling; + +import com.sun.jbi.filebc.util.EPUtil; + +/** + * @author Sujit Biswas + * + */ +public class TestRecovery extends IntegrationTestCase { + + /** + * + */ + private static final long serialVersionUID = 1L; + + /** + * service assembly name + */ + private static final String SA_NAME = "FILEBC-TEST_RECOVERY-SA"; + /** + * consuming end-point + */ + private static final String CONSUMER_EP = "filePort"; + /** + * consuming end-point service name + */ + private static final QName FILE_SERVICE = new QName( + "http://j2ee.netbeans.org/wsdl/file", "fileService"); + + /** + * provider end-point service name + */ + private static final QName PROVIDER_SERVICE = new QName( + "urn:FILEBC-TEST_RECOVERY-SA", "testService"); + + /** + * provider end-point + */ + private static final String PROVIDER_EP = "providerEP"; + + /** + * test recovery in file-bc + * + * @throws Throwable + */ + public void testRecovery() throws Throwable { + + String inputDir = Configuration.getWorkingDir() + File.separator + "recovery"; + + // Create TestSU + FileBCSUAssembler su = Helper.createTestSU( + "FILE-BC-SU-RecoveryTest", "FILE-BC-SU-RecoveryTest", + "file.wsdl", inputDir, this.getClass()); + String testSAPath = Helper.createTestSA(su, SA_NAME, + FILE_SERVICE, CONSUMER_EP, PROVIDER_SERVICE, PROVIDER_EP, null, + null); + String saName = null; + try { + // activate endpoint + ActivateDeactivateEP activateDeactivateEPCmd = new ActivateDeactivateEP(); + activateDeactivateEPCmd.activate = true; + getConnection().execute(activateDeactivateEPCmd); + + // number of files to recover + String epWorkAreaBase = inputDir + File.separator + EPUtil.getWorkAreaBaseDir(FILE_SERVICE, CONSUMER_EP); + + String workArea = epWorkAreaBase + File.separator + "filebc-in-processing"; + int rCount = 5; + Helper.writeInputFiles(workArea, rCount); + + // Now deploy and start SA + saName = getInstaller().deployServiceAssembly(testSAPath); + getInstaller().startServiceAssembly(saName); + Thread.sleep(2000); // wait some time before SU start sending + // messages + + // Drain all the messages meant for this EP + ReceiveMsgCommand receviceMsgCommand = new ReceiveMsgCommand(); + String str; + int i = 0; + while (!(str = (String) getConnection().execute(receviceMsgCommand)) + .equals("FAIL")) { + + System.out.println(str); + i++; + + } + + assertEquals(rCount, i); + + } finally { + // Un-deploy SA + getInstaller().undeployServiceAssembly(SA_NAME); + } + } + + @Override + protected void setUp() throws Exception { + super.setUp(); + // Make sure that SA is undeployed + try { + getInstaller().undeployServiceAssembly(SA_NAME); + } catch (Throwable t) { + } + + } + + @Override + protected void tearDown() throws Exception { + super.tearDown(); + } + + public static class ActivateDeactivateEP implements Command { + /** + * + */ + private static final long serialVersionUID = 1L; + public boolean activate; + + public Serializable execute(ComponentContext context) throws Exception { + if (activate) { + JbiHelper.activateEndpoint(context, PROVIDER_SERVICE, + PROVIDER_EP); + } else { + JbiHelper.deactivateEndpoint(context, PROVIDER_SERVICE, + PROVIDER_EP); + } + return "SUCCESS"; + } + } + + public static class ReceiveMsgCommand implements Command { + /** + * + */ + private static final long serialVersionUID = 1L; + + public Serializable execute(ComponentContext context) throws Exception { + InOut ex = (InOut) JbiHelper.getNextMessage(PROVIDER_SERVICE, + PROVIDER_EP); + Object[] results = null; + if (ex != null && ex.getStatus() != ExchangeStatus.ERROR) { + // ex.setStatus(ExchangeStatus.DONE); + if (ex.getStatus() != ExchangeStatus.DONE) { + results = JbiHelper.unwrapFromJBISource(ex.getInMessage() + .getContent()); + ex.setOutMessage(ex.getInMessage()); + context.getDeliveryChannel().send(ex); + } + } + if (results != null && results.length > 0) { + return ((Text) results[0]).getTextContent(); + } + return "FAIL"; + } + + } + +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testcases/recovery/file.wsdl b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testcases/recovery/file.wsdl new file mode 100644 index 000000000..7c4aeb189 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testcases/recovery/file.wsdl @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testcases/recovery/jbi.xml b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testcases/recovery/jbi.xml new file mode 100644 index 000000000..080b46a24 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testcases/recovery/jbi.xml @@ -0,0 +1,9 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + + + + + diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testcases/throttling/TestThrottling.java b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testcases/throttling/TestThrottling.java new file mode 100644 index 000000000..165f131d5 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testcases/throttling/TestThrottling.java @@ -0,0 +1,343 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/** + * + */ +package test.jbi.integration.testcases.throttling; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileWriter; +import java.io.FilenameFilter; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Serializable; + +import javax.jbi.component.ComponentContext; +import javax.jbi.messaging.ExchangeStatus; +import javax.jbi.messaging.InOnly; +import javax.xml.namespace.QName; + +import org.w3c.dom.Text; + +import test.jbi.integration.test.framework.Configuration; +import test.jbi.integration.test.framework.IntegrationTestCase; +import test.jbi.integration.test.framework.SAAssembler; +import test.jbi.integration.test.framework.SAAssembler.Throttling; +import test.jbi.integration.test.framework.impl.FileBCSUAssembler; +import test.jbi.integration.testbc.core.Command; +import test.jbi.integration.testbc.impl.JbiHelper; +import test.jbi.integration.testcases.Helper; + +/** + * @author Sun Microsystems + * + */ +public class TestThrottling extends IntegrationTestCase { + + /** + * + */ + private static final long serialVersionUID = 1L; + + /** + * service assembly name + */ + private static final String SA_NAME = "FILEBC-TEST_THROTTLING-SA"; + /** + * consuming end-point + */ + private static final String CONSUMER_EP = "filePort"; + /** + * consuming end-point service name + */ + private static final QName FILE_SERVICE = new QName( + "http://j2ee.netbeans.org/wsdl/file", "fileService"); + + /** + * provider end-point service name + */ + private static final QName PROVIDER_SERVICE = new QName( + "urn:FILEBC-TEST_THROTTLING-SA", "testService"); + + /** + * provider end-point + */ + private static final String PROVIDER_EP = "providerEP"; + + private File mInputDir; + + + + + /** + * Test Serial Processing i.e Concurrency = 1. + * + * @throws Throwable + */ + public void testSerialProcessing() throws Throwable { + + // drain all messages that might have remained from previous tests. + drainTestSEDeliveryChannel(); + + String workArea = Configuration.getWorkingDir() + File.separator + "testSeq"; + mInputDir = new File(workArea); + + // Create TestSU + // Create TestSU + FileBCSUAssembler su = Helper.createTestSU("FILE-BC-SU-SerialProcessingTest", + "FILE-BC-SU-SerialProcessingTest", "file1.wsdl", workArea, this.getClass()); + String testSAPath = Helper.createTestSA(su, SA_NAME, FILE_SERVICE, CONSUMER_EP, + PROVIDER_SERVICE, PROVIDER_EP, null, new Throttling(1)); +// String zipTestSU = createTestSU("file1.wsdl", new Throttling(1)); + String saName = null; + try { + + // activate endpoint + ActivateDeactivateEP activateDeactivateEPCmd = new ActivateDeactivateEP(); + activateDeactivateEPCmd.activate = true; + getConnection().execute(activateDeactivateEPCmd); + + // write 2 input files + Helper.writeInputFiles(workArea, 2); + + File[] inputfiles = mInputDir.listFiles(new FilenameFilter(){ + public boolean accept(File dir, String name) { + if(name.startsWith("test.xml")){ + return true; + } + return false; + } + }); + + assertEquals(2, inputfiles.length); + + // Now deploy and start SA + saName = getInstaller().deployServiceAssembly(testSAPath); + getInstaller().startServiceAssembly(saName); + Thread.sleep(3000); // wait some time before SU start sending + // messages + + // Get the messages waiting in TEST SE delivery channel so far + ReceiveMsgCommand receviceMsgCommand = new ReceiveMsgCommand(); + int i = 0; + String str = (String) getConnection().execute(receviceMsgCommand); + while ( !"FAIL".equals(str) ) { + System.out.println(str); + str = (String) getConnection().execute(receviceMsgCommand); + i++; + } + + // we should not have looped more than once, since messages should have been + // sent serially i.e. next message is sent only after getting reply for the + // first one. + assertEquals(1, i); + + // After getting first reply, file bc should have sent another message + // So TEST SE should have one more message waiting it its delivery channel + i = 0; + str = (String) getConnection().execute(receviceMsgCommand); + if( "FAIL".equals(str) ){ + // if there are no more messages yet in Test SE, + // let the file bc thread run to send the next message + try{ + Thread.sleep(3000); + } catch(InterruptedException ie){ + + } + // now check for message again + str = (String) getConnection().execute(receviceMsgCommand); + } + + while ( !"FAIL".equals(str) ) { + System.out.println(str); + str = (String) getConnection().execute(receviceMsgCommand); + i++; + } + assertEquals(1, i); + + } finally { + // Un-deploy SA + getInstaller().undeployServiceAssembly(SA_NAME); + } + } + + /** + * Test throttling in file-bc + * + * @throws Throwable + */ + public void testConcurrencyGreaterThanOne() throws Throwable { + + // drain all messages that might have remained from previous tests. + drainTestSEDeliveryChannel(); + + String workArea = Configuration.getWorkingDir() + File.separator + "testConc"; + mInputDir = new File(workArea); + + // Create TestSU + FileBCSUAssembler su = Helper.createTestSU("FILE-BC-SU-ThrottlingTest", + "FILE-BC-SU-ThrottlingTest", "file2.wsdl", workArea, this.getClass()); + String testSAPath = Helper.createTestSA(su, SA_NAME, FILE_SERVICE, CONSUMER_EP, + PROVIDER_SERVICE, PROVIDER_EP, null, new Throttling(6)); +// String zipTestSU = createTestSU("file2.wsdl", new Throttling(6)); + String saName = null; + try { + + // activate endpoint + ActivateDeactivateEP activateDeactivateEPCmd = new ActivateDeactivateEP(); + activateDeactivateEPCmd.activate = true; + getConnection().execute(activateDeactivateEPCmd); + + // write input files + Helper.writeInputFiles(workArea, 4); + + File[] inputfiles = mInputDir.listFiles(new FilenameFilter(){ + public boolean accept(File dir, String name) { + if(name.startsWith("test.xml")){ + return true; + } + return false; + } + }); + + assertEquals(4, inputfiles.length); + + // Now deploy and start SA + saName = getInstaller().deployServiceAssembly(testSAPath); + getInstaller().startServiceAssembly(saName); + Thread.sleep(3000); // wait some time before SU start sending + // messages + + // Get the messages waiting in TEST SE delivery channel so far + ReceiveMsgCommand receviceMsgCommand = new ReceiveMsgCommand(); + int i = 0; + String str = (String) getConnection().execute(receviceMsgCommand); + while ( !"FAIL".equals(str) ) { + System.out.println(str); + str = (String) getConnection().execute(receviceMsgCommand); + i++; + } + + // We should have more than one message since concurrency is > 1 + boolean success = false; + if( i > 1 ){ + success = true; + } + + assertTrue(" i= " + i, success); + + } catch(Exception e){ + e.printStackTrace(); + } + finally { + + // Un-deploy SA + getInstaller().undeployServiceAssembly(SA_NAME); + } + } + + private void drainTestSEDeliveryChannel() throws Throwable{ + // Get the messages waiting in TEST SE delivery channel so far + ReceiveMsgCommand receviceMsgCommand = new ReceiveMsgCommand(); + String str = (String) getConnection().execute(receviceMsgCommand); + while ( !"FAIL".equals(str) ) { + str = (String) getConnection().execute(receviceMsgCommand); + } + } + + @Override + protected void setUp() throws Exception { + super.setUp(); + // Make sure that SA is undeployed + try { + System.out.println("setup: undeploy service assembly"); + getInstaller().undeployServiceAssembly(SA_NAME); + System.out.println("setup: undeploy service assembly - DONE"); + } catch (Throwable t) { + } + + + } + + @Override + protected void tearDown() throws Exception { + super.tearDown(); + } + + /** + * @param fileResource + * @return + */ + private StringBuilder getResourceContents(String fileResource) { + + StringBuilder sb = new StringBuilder(); + + try { + + InputStream ins = new FileInputStream(fileResource); + + BufferedReader br = new BufferedReader(new InputStreamReader(ins)); + + while (true) { + String line = br.readLine(); + if (line == null) + break; + sb.append(line + "${symbol_escape}n"); + + } + + br.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return sb; + } + + public static class ActivateDeactivateEP implements Command { + private static final long serialVersionUID = 1L; + public boolean activate; + + public Serializable execute(ComponentContext context) throws Exception { + if (activate) { + JbiHelper.activateEndpoint(context, PROVIDER_SERVICE, + PROVIDER_EP); + } else { + JbiHelper.deactivateEndpoint(context, PROVIDER_SERVICE, + PROVIDER_EP); + } + return "SUCCESS"; + } + } + + public static class ReceiveMsgCommand implements Command { + + private static final long serialVersionUID = 1L; + + public Serializable execute(ComponentContext context) throws Exception { + InOnly ex = (InOnly) JbiHelper.getNextMessage(PROVIDER_SERVICE, + PROVIDER_EP); + Object[] results = null; + if (ex != null && ex.getStatus() != ExchangeStatus.ERROR) { + // ex.setStatus(ExchangeStatus.DONE); + if (ex.getStatus() != ExchangeStatus.DONE) { + results = JbiHelper.unwrapFromJBISource(ex.getInMessage() + .getContent()); +// ex.setOutMessage(ex.getInMessage()); + ex.setStatus(ExchangeStatus.DONE); + context.getDeliveryChannel().send(ex); + } + } + if (results != null && results.length > 0) { + return ((Text) results[0]).getTextContent(); + } + return "FAIL"; + } + + } + +} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testcases/throttling/file1.wsdl b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testcases/throttling/file1.wsdl new file mode 100644 index 000000000..4266fc4f6 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testcases/throttling/file1.wsdl @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testcases/throttling/file2.wsdl b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testcases/throttling/file2.wsdl new file mode 100644 index 000000000..4266fc4f6 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testcases/throttling/file2.wsdl @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testcases/throttling/jbi.xml b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testcases/throttling/jbi.xml new file mode 100644 index 000000000..080b46a24 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/jbiadapter/test/test/jbi/integration/testcases/throttling/jbi.xml @@ -0,0 +1,9 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + + + + + diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/nbactions.xml b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/nbactions.xml new file mode 100644 index 000000000..b4b786307 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/nbactions.xml @@ -0,0 +1,75 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + + + clean + + * + + + clean + + + true + + + + build + + * + + + install + + + true + + + + test + + * + + + package + + + false + + + + rebuild + + * + + + clean + install + + + true + + + + CUSTOM-testreport + testreport + + surefire-report:report-only + + + true + + + + CUSTOM-allreports + allreports + + site + + + true + + + diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/packaging/nbactions.xml b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/packaging/nbactions.xml new file mode 100644 index 000000000..b4b786307 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/packaging/nbactions.xml @@ -0,0 +1,75 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + + + clean + + * + + + clean + + + true + + + + build + + * + + + install + + + true + + + + test + + * + + + package + + + false + + + + rebuild + + * + + + clean + install + + + true + + + + CUSTOM-testreport + testreport + + surefire-report:report-only + + + true + + + + CUSTOM-allreports + allreports + + site + + + true + + + diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/packaging/pom.xml b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/packaging/pom.xml new file mode 100644 index 000000000..13e3dfa5c --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/packaging/pom.xml @@ -0,0 +1,166 @@ + + + + package-common + open-jbi-components + 1.1 + ../../build-common/package-common + + 4.0.0 + open-jbi-components + ${componentName}-installer + sun-file-binding + ${version} + file packaging description + + + + META-INF + src + true + + *.xml + *.xsd + + + + + + maven-dependency-plugin + + + ${project.artifactId}-fetch-deps + generate-sources + + copy-dependencies + + + ${project.build.outputDirectory}/lib + true + true + + + + + + maven-surefire-plugin + + true + + + + maven-jar-plugin + + + ${project.build.outputDirectory}/META-INF/MANIFEST.MF + + + + + org.apache.felix + maven-bundle-plugin + + + bundle-manifest + process-classes + + manifest + + + + + + sun-${componentName}-binding + ${componentName} Component + ${componentName} Component + ${OSGI_VERSION} + <_removeheaders>${OSGI_MANIFEST_REMOVE_HEADERS}, Export-Package + *;-noimport:=true + lib/wsdl4j.jar, + lib/${componentName}-jbiadapter.jar, + lib/resolver.jar, + lib/componentsl.jar, + lib/common-util.jar, + lib/qos.jar + javax.xml.namespace, + !xmlbean, + !javax.servlet.*, + *;-nouses:=true + + + + + + + + open-jbi-components + componentsl + true + + + open-jbi-components + ${componentName}-jbiadapter + ${version} + true + + + open-jbi-components + resolver + true + + + open-jbi-components + wsdl4j + true + + + open-jbi-components + qos + true + + + open-jbi-components + common-util + true + + + + + + diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/packaging/src/componentConfiguration.xml b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/packaging/src/componentConfiguration.xml new file mode 100644 index 000000000..67fba5d0b --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/packaging/src/componentConfiguration.xml @@ -0,0 +1,17 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + + + 10 + 5 + + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/packaging/src/componentConfiguration.xsd b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/packaging/src/componentConfiguration.xsd new file mode 100644 index 000000000..88976e319 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/packaging/src/componentConfiguration.xsd @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/packaging/src/jbi.xml b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/packaging/src/jbi.xml new file mode 100644 index 000000000..2ef30eb74 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/packaging/src/jbi.xml @@ -0,0 +1,45 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + + + + + + ${componentName} + Description of binding component : ${componentName} + + + net.openesb.component.${componentName}.JMXBindingRuntime + + + lib/${componentName}-jbiadapter.jar + + lib/wsdl4j-1.6.2.jar + + + net.openesb.component.${componentName}.JMXBindingInstaller + + + lib/${componentName}-jbiadapter.jar + + lib/wsdl4j-1.6.2.jar + + + + + diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/pom.xml b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/pom.xml new file mode 100644 index 000000000..2cf1da1ce --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/pom.xml @@ -0,0 +1,49 @@ + + + + ojc-common + open-jbi-components + 1.1 + ../build-common/ojc-common + + 4.0.0 + ${groupId} + ${artifactId} + pom + ${artifactId}-top + ${version} + Top-level Build for ${artifactId}-top + + install + + + + jbiadapter + packaging + + diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/smvn.bat b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/smvn.bat new file mode 100644 index 000000000..054886d8e --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/main/resources/archetype-resources/smvn.bat @@ -0,0 +1,6 @@ +@echo off +set JAVA_HOME=C:\Program Files (x86)\Java\jdk1.6.0_38 +set path=%path%;C:\Program Files (x86)\Java\jdk1.6.0_38\bin +set JV_SRCROOT=D:\codes\logicoyOpenESB\openesb-components +set JV_GFBASE=D:\softwares\openesb_logicoy_last_working57\glassfish +mvn -Dmaven.test.skip=true -Dmaven.repo.local=C:\Users\logicoyparam\m2\repository %* \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/test/resources/projects/basic/archetype.properties b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/test/resources/projects/basic/archetype.properties new file mode 100644 index 000000000..e426b26f5 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/test/resources/projects/basic/archetype.properties @@ -0,0 +1,6 @@ +#Mon Aug 05 12:10:08 IST 2013 +package=it.pkg +version=0.1-SNAPSHOT +groupId=archetype.it +artifactId=bindingComponentArchtype +componentName=${artifactId} diff --git a/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/test/resources/projects/basic/goal.txt b/maven-ojc-archeType-v2/maven-archetype-binding-component-v2/src/test/resources/projects/basic/goal.txt new file mode 100644 index 000000000..e69de29bb diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/pom.xml b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/pom.xml new file mode 100644 index 000000000..01bf37d75 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/pom.xml @@ -0,0 +1,43 @@ + + + + + + 4.0.0 + + open-jbi-components + ServiceEngine-Plugin-archetype + 2.3.0 + jar + + ServiceEngine-Plugin-archetype + + + + + org.apache.maven.archetype + archetype-packaging + 2.2 + + + + + + + maven-archetype-plugin + 2.2 + + + + + + Maven project Archtype for OpenESB Service Engine Netbeans Plugin + + http://open-esb.org + diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/META-INF/maven/archetype-metadata.xml b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/META-INF/maven/archetype-metadata.xml new file mode 100644 index 000000000..6cc5f030d --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/META-INF/maven/archetype-metadata.xml @@ -0,0 +1,62 @@ + + + + + + + + + nbproject + + **/*.xml + **/*.properties + + + + src + + **/*.html + **/*.java + **/*.xml + **/*.properties + + + + test + + **/*.html + **/*.java + **/*.xml + **/*.properties + + + + src + + **/*.xsl + **/*.form + **/*.wsdl + **/*.png + **/*.AntBasedProjectType + **/*.CollocationQueryImplementation + **/*.* + + + + + + build.xml + **/*.mf + + + + diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build.xml b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build.xml new file mode 100644 index 000000000..16590a783 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build.xml @@ -0,0 +1,8 @@ + + + + + + Builds, tests, and runs the project ${artifactId}. + + diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/META-INF/services/org.netbeans.spi.project.support.ant.AntBasedProjectType b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/META-INF/services/org.netbeans.spi.project.support.ant.AntBasedProjectType new file mode 100644 index 000000000..b05c8de7e --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/META-INF/services/org.netbeans.spi.project.support.ant.AntBasedProjectType @@ -0,0 +1 @@ +sedeployplugin.project.SEPluginProjectType diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/META-INF/services/org.netbeans.spi.queries.CollocationQueryImplementation b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/META-INF/services/org.netbeans.spi.queries.CollocationQueryImplementation new file mode 100644 index 000000000..9be0d09e9 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/META-INF/services/org.netbeans.spi.queries.CollocationQueryImplementation @@ -0,0 +1 @@ +org.netbeans.modules.compapp.projects.base.queries.SameDriveCollocationQuery diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/Bundle.properties b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/Bundle.properties new file mode 100644 index 000000000..f4399b22c --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/Bundle.properties @@ -0,0 +1,15 @@ +# binding component deployment plugin resource bundle +# binding deploy plugin +OpenIDE-Module-Name=SEDeployPlugin +# deployment plugin +OpenIDE-Module-Short-Description=Service engine deployment plugin for ServiceEngine +# deployment plugin for adding wsdl extensions related to the binding component to the wsdl editor +OpenIDE-Module-Long-Description=Deployment plugin for creating service units related to this service engine in composite application +# category +OpenIDE-Module-Display-Category=CAPS + +# plugin project template +Templates/Project/SOA/ServiceEngineJBIModule.xml=ServiceEngine JBI Module + + + diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/layer.xml b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/layer.xml new file mode 100644 index 000000000..758a0eba4 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/layer.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/Bundle.properties b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/Bundle.properties new file mode 100644 index 000000000..7b3c45fe3 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/Bundle.properties @@ -0,0 +1,4 @@ +LBL_Node_Sources=Sources + + + diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/SEPluginProject$1.class b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/SEPluginProject$1.class new file mode 100644 index 000000000..5b56f7a17 Binary files /dev/null and b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/SEPluginProject$1.class differ diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/SEPluginProject$2.class b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/SEPluginProject$2.class new file mode 100644 index 000000000..d09a3e4bf Binary files /dev/null and b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/SEPluginProject$2.class differ diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/SEPluginProject$3.class b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/SEPluginProject$3.class new file mode 100644 index 000000000..62d1f844c Binary files /dev/null and b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/SEPluginProject$3.class differ diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/SEPluginProject$AntArtifactProviderImpl.class b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/SEPluginProject$AntArtifactProviderImpl.class new file mode 100644 index 000000000..8591c3f34 Binary files /dev/null and b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/SEPluginProject$AntArtifactProviderImpl.class differ diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/SEPluginProject$Info.class b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/SEPluginProject$Info.class new file mode 100644 index 000000000..a40593d30 Binary files /dev/null and b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/SEPluginProject$Info.class differ diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/SEPluginProject$ProjectOpenedHookImpl$1.class b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/SEPluginProject$ProjectOpenedHookImpl$1.class new file mode 100644 index 000000000..afb72c3fe Binary files /dev/null and b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/SEPluginProject$ProjectOpenedHookImpl$1.class differ diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/SEPluginProject$ProjectOpenedHookImpl.class b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/SEPluginProject$ProjectOpenedHookImpl.class new file mode 100644 index 000000000..0ccd4db4b Binary files /dev/null and b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/SEPluginProject$ProjectOpenedHookImpl.class differ diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/SEPluginProject$ProjectXmlSavedHookImpl.class b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/SEPluginProject$ProjectXmlSavedHookImpl.class new file mode 100644 index 000000000..a7914dddf Binary files /dev/null and b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/SEPluginProject$ProjectXmlSavedHookImpl.class differ diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/SEPluginProject$RecommendedTemplatesImpl.class b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/SEPluginProject$RecommendedTemplatesImpl.class new file mode 100644 index 000000000..3144fd416 Binary files /dev/null and b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/SEPluginProject$RecommendedTemplatesImpl.class differ diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/SEPluginProject.class b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/SEPluginProject.class new file mode 100644 index 000000000..b15addf38 Binary files /dev/null and b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/SEPluginProject.class differ diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/SEPluginProjectActionProvider$1.class b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/SEPluginProjectActionProvider$1.class new file mode 100644 index 000000000..29d2122f2 Binary files /dev/null and b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/SEPluginProjectActionProvider$1.class differ diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/SEPluginProjectActionProvider.class b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/SEPluginProjectActionProvider.class new file mode 100644 index 000000000..ec9f0fa1d Binary files /dev/null and b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/SEPluginProjectActionProvider.class differ diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/SEPluginProjectGenerator.class b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/SEPluginProjectGenerator.class new file mode 100644 index 000000000..945112944 Binary files /dev/null and b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/SEPluginProjectGenerator.class differ diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/SEPluginProjectLogicalViewProvider.class b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/SEPluginProjectLogicalViewProvider.class new file mode 100644 index 000000000..f71db4be8 Binary files /dev/null and b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/SEPluginProjectLogicalViewProvider.class differ diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/SEPluginProjectOperations.class b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/SEPluginProjectOperations.class new file mode 100644 index 000000000..89c19bc3a Binary files /dev/null and b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/SEPluginProjectOperations.class differ diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/SEPluginProjectProperties.class b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/SEPluginProjectProperties.class new file mode 100644 index 000000000..ec0cf697d Binary files /dev/null and b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/SEPluginProjectProperties.class differ diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/SEPluginProjectType.class b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/SEPluginProjectType.class new file mode 100644 index 000000000..3397bd3ea Binary files /dev/null and b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/SEPluginProjectType.class differ diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/customizer/Bundle.properties b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/customizer/Bundle.properties new file mode 100644 index 000000000..05c5ab3d5 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/customizer/Bundle.properties @@ -0,0 +1,19 @@ +# CustomizerDialog +LBL_Customizer_Title=Project Properties - {0} +# cutomizer node labels +LBL_Config_General=General +LBL_Config_BuildCategories=Build +LBL_Config_Compile=Compile +LBL_Config_Package=Package + +# Cutomizer node panel strings +# sample cutomizer panel +# General cutomizer panel +LBL_config.general.su.name=Name: +LBL_config.general.su.desc=Description: +LBL_config.general.su.target=Target JBI Component\: +LBL_config.general.su.target.value.unknown=Unknown +LBL_config.package.su.zip=&Service Unit Archive File\: +LBL_config.package.build.files.exludes=&Exclude from archive file\: +LBL_config.package.build.files.exludes.message=(can not exclude jbi.xml) +CHKB_config.package.jar.compress=&Compress Archive File diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/customizer/CustomizerGeneral.class b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/customizer/CustomizerGeneral.class new file mode 100644 index 000000000..003fdad43 Binary files /dev/null and b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/customizer/CustomizerGeneral.class differ diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/customizer/CustomizerPackage.class b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/customizer/CustomizerPackage.class new file mode 100644 index 000000000..f694af425 Binary files /dev/null and b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/customizer/CustomizerPackage.class differ diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/customizer/SEPluginProjectCustomizerModel$1.class b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/customizer/SEPluginProjectCustomizerModel$1.class new file mode 100644 index 000000000..7f2311e6c Binary files /dev/null and b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/customizer/SEPluginProjectCustomizerModel$1.class differ diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/customizer/SEPluginProjectCustomizerModel.class b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/customizer/SEPluginProjectCustomizerModel.class new file mode 100644 index 000000000..6715bd801 Binary files /dev/null and b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/customizer/SEPluginProjectCustomizerModel.class differ diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/customizer/SEPluginProjectCustomizerProvider$OptionListener.class b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/customizer/SEPluginProjectCustomizerProvider$OptionListener.class new file mode 100644 index 000000000..ea50884da Binary files /dev/null and b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/customizer/SEPluginProjectCustomizerProvider$OptionListener.class differ diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/customizer/SEPluginProjectCustomizerProvider$PanelProvider.class b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/customizer/SEPluginProjectCustomizerProvider$PanelProvider.class new file mode 100644 index 000000000..cf7e08721 Binary files /dev/null and b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/customizer/SEPluginProjectCustomizerProvider$PanelProvider.class differ diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/customizer/SEPluginProjectCustomizerProvider$SubCategoryProvider.class b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/customizer/SEPluginProjectCustomizerProvider$SubCategoryProvider.class new file mode 100644 index 000000000..1ff1bd13a Binary files /dev/null and b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/customizer/SEPluginProjectCustomizerProvider$SubCategoryProvider.class differ diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/customizer/SEPluginProjectCustomizerProvider.class b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/customizer/SEPluginProjectCustomizerProvider.class new file mode 100644 index 000000000..39501523f Binary files /dev/null and b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/customizer/SEPluginProjectCustomizerProvider.class differ diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/node/Bundle.properties b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/node/Bundle.properties new file mode 100644 index 000000000..aacefb0e0 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/node/Bundle.properties @@ -0,0 +1,16 @@ +LBL_Fix_Broken_Links_Action=Resolve Reference Problems... + +#Actions +LBL_CleanAction_Name=Clean Project +LBL_BuildAction_Name=Build Project +LBL_RebuildAction_Name=Clean and Build Project +LBL_RunAction_Name=Run Project +LBL_DebugAction_Name=Debug Project +LBL_JavadocAction_Name=Generate Javadoc for Project +LBL_TestAction_Name=Test Component +LBL_Properties_Action=Properties +LBL_AddProject_Action=Add Project... +LBL_AddLibrary_Action=Add Library... +LBL_AddFolder_Action=Add JAR/Folder... + + diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/node/SEPluginProjectNode$BrokenLinksAction.class b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/node/SEPluginProjectNode$BrokenLinksAction.class new file mode 100644 index 000000000..9f677e8b0 Binary files /dev/null and b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/node/SEPluginProjectNode$BrokenLinksAction.class differ diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/node/SEPluginProjectNode$SEPluginProjectNodeChildren.class b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/node/SEPluginProjectNode$SEPluginProjectNodeChildren.class new file mode 100644 index 000000000..2b01c7559 Binary files /dev/null and b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/node/SEPluginProjectNode$SEPluginProjectNodeChildren.class differ diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/node/SEPluginProjectNode.class b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/node/SEPluginProjectNode.class new file mode 100644 index 000000000..1e9bdd852 Binary files /dev/null and b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/node/SEPluginProjectNode.class differ diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/resources/build-impl.xsl b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/resources/build-impl.xsl new file mode 100644 index 000000000..9adad65fd --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/resources/build-impl.xsl @@ -0,0 +1,208 @@ + + + + + + + + + + + + + + + default + .. + + + jar + Build whole project. + + + + ====================== + INITIALIZATION SECTION + ====================== + + + + Empty placeholder for easier customization. + You can override this target in the ../build.xml file. + + + + -pre-init + + + + + -pre-init,-init-private + + + + + -pre-init,-init-private,-init-user + + + + + -pre-init,-init-private,-init-user,-init-project + + + + + Empty placeholder for easier customization. + You can override this target in the ../build.xml file. + + + + -pre-init,-init-private,-init-user,-init-project,-do-init + Must set src.dir + Must set build.dir + Must set jbi.su.name + Must set jbi.su.zip + + + + -pre-init,-init-private,-init-user,-init-project,-do-init,-post-init,-init-check + + + + =================== + COMPILATION SECTION + =================== + + + + init + + + + + Empty placeholder for easier customization. + You can override this target in the ../build.xml file. + + + + init,-pre-pre-compile,-pre-compile + + + + + + + + + + Empty placeholder for easier customization. + You can override this target in the ../build.xml file. + + + + init,-pre-pre-compile,-pre-compile,-do-compile,-post-compile + Compile project. + + + + ==================== + JAR BUILDING SECTION + ==================== + + + + init + + + + + Empty placeholder for easier customization. + You can override this target in the ../build.xml file. + + + + init,compile,-pre-pre-jar,-pre-jar + + + + + Empty placeholder for easier customization. + You can override this target in the ../build.xml file. + + + + init,compile,-pre-jar,-do-jar,-post-jar + Build JAR. + + + + init,jar + + + + init,jar + + + + =============== + CLEANUP SECTION + =============== + + + + init + + + + + + Empty placeholder for easier customization. + You can override this target in the ../build.xml file. + + + + init,-do-clean,-post-clean + Clean build products. + + + + + + + diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/resources/build.xsl b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/resources/build.xsl new file mode 100644 index 000000000..288568af6 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/resources/build.xsl @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + You may freely edit this file. See commented blocks below for + some examples of how to customize the build. + (If you delete it and reopen the project it will be recreated.) + + + + + + + default + . + Builds, tests, and runs the project + . + + + + + + + + + + For list of available properties check the imported + nbproject/build-impl.xml file. + + + Another way to customize the build is by overriding existing main targets. + The targets of interest are: + + -init-macrodef-javac: defines macro for javac compilation + -init-macrodef-junit: defines macro for junit execution + -init-macrodef-debug: defines macro for class debugging + -init-macrodef-java: defines macro for class execution + -do-jar-with-manifest: JAR building (if you are using a manifest) + -do-jar-without-manifest: JAR building (if you are not using a manifest) + run: execution of project + -javadoc-build: Javadoc generation + test-report: JUnit report generation + + An example of overriding the target for project execution could look like this: + + + + + + + + Notice that the overridden target depends on the jar target and not only on + the compile target as the regular run target does. Again, for a list of available + properties which you can use, check the target you are overriding in the + nbproject/build-impl.xml file. + + ]]> + + + + + + + diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/resources/projectIcon.png b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/resources/projectIcon.png new file mode 100644 index 000000000..efb923b40 Binary files /dev/null and b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/resources/projectIcon.png differ diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/resources/se-jbi-module.xml b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/resources/se-jbi-module.xml new file mode 100644 index 000000000..01e9ab043 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/resources/se-jbi-module.xml @@ -0,0 +1,3 @@ + + + diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/wizard/Bundle.properties b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/wizard/Bundle.properties new file mode 100644 index 000000000..56d0f658f --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/wizard/Bundle.properties @@ -0,0 +1,9 @@ +LBL_CreateProjectStep=Name and Location + +LBL_ProjectName=Project &Name: + +LBL_ProjectLocation=Project &Location: + +LBL_ProjectFolder=Project &Folder: + +LBL_Browse=Br&owse... diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/wizard/SEPluginProjectDescription.html b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/wizard/SEPluginProjectDescription.html new file mode 100644 index 000000000..21e9e6bdc --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/wizard/SEPluginProjectDescription.html @@ -0,0 +1,8 @@ + + + + + + Service Engine deploment plugin project + + diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/wizard/SEPluginProjectWizardIterator.class b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/wizard/SEPluginProjectWizardIterator.class new file mode 100644 index 000000000..726a80b4b Binary files /dev/null and b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/wizard/SEPluginProjectWizardIterator.class differ diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/wizard/SEPluginProjectWizardPanel.class b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/wizard/SEPluginProjectWizardPanel.class new file mode 100644 index 000000000..ed551f217 Binary files /dev/null and b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/wizard/SEPluginProjectWizardPanel.class differ diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/wizard/SEPluginProjectWizardPanelVisual$1.class b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/wizard/SEPluginProjectWizardPanelVisual$1.class new file mode 100644 index 000000000..35f510a58 Binary files /dev/null and b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/wizard/SEPluginProjectWizardPanelVisual$1.class differ diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/wizard/SEPluginProjectWizardPanelVisual.class b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/wizard/SEPluginProjectWizardPanelVisual.class new file mode 100644 index 000000000..7f86e59ad Binary files /dev/null and b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/wizard/SEPluginProjectWizardPanelVisual.class differ diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/wizard/resources/SampleWSDL.wsdl b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/wizard/resources/SampleWSDL.wsdl new file mode 100644 index 000000000..c2309ecfe --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/wizard/resources/SampleWSDL.wsdl @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/wizard/resources/jbi.xml b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/wizard/resources/jbi.xml new file mode 100644 index 000000000..f664e1783 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/classes/sedeployplugin/project/wizard/resources/jbi.xml @@ -0,0 +1,14 @@ + + + + + + + + diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/no-license.txt b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/no-license.txt new file mode 100644 index 000000000..201dea1e1 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/build/no-license.txt @@ -0,0 +1 @@ +[NO LICENSE SPECIFIED] \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/manifest.mf b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/manifest.mf new file mode 100644 index 000000000..15a68b890 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/manifest.mf @@ -0,0 +1,6 @@ +Manifest-Version: 1.0 +OpenIDE-Module: sedeployplugin +OpenIDE-Module-Layer: sedeployplugin/layer.xml +OpenIDE-Module-Localizing-Bundle: sedeployplugin/Bundle.properties +OpenIDE-Module-Specification-Version: 1.0 + diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/nbproject/build-impl.xml b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/nbproject/build-impl.xml new file mode 100644 index 000000000..394249e58 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/nbproject/build-impl.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + You must set 'suite.dir' to point to your containing module suite + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/nbproject/genfiles.properties b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/nbproject/genfiles.properties new file mode 100644 index 000000000..4f22f84ae --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/nbproject/genfiles.properties @@ -0,0 +1,8 @@ +build.xml.data.CRC32=71a0da0d +build.xml.script.CRC32=12e4fb2a +build.xml.stylesheet.CRC32=a56c6a5b@2.50.1 +# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. +# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. +nbproject/build-impl.xml.data.CRC32=71a0da0d +nbproject/build-impl.xml.script.CRC32=c30eb3e6 +nbproject/build-impl.xml.stylesheet.CRC32=68e521fc@2.50.1 diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/nbproject/platform.properties b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/nbproject/platform.properties new file mode 100644 index 000000000..9dcb6d53c --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/nbproject/platform.properties @@ -0,0 +1,27 @@ +branding.token=soa +cluster.path=\ + ${nbplatform.active.dir}/apisupport:\ + ${nbplatform.active.dir}/cnd:\ + ${nbplatform.active.dir}/dlight:\ + ${nbplatform.active.dir}/enterprise:\ + ${nbplatform.active.dir}/ergonomics:\ + ${nbplatform.active.dir}/groovy:\ + ${nbplatform.active.dir}/harness:\ + ${nbplatform.active.dir}/ide:\ + ${nbplatform.active.dir}/java:\ + ${nbplatform.active.dir}/javacard:\ + ${nbplatform.active.dir}/javafx:\ + ${nbplatform.active.dir}/mobility:\ + ${nbplatform.active.dir}/nb:\ + ${nbplatform.active.dir}/php:\ + ${nbplatform.active.dir}/platform:\ + ${nbplatform.active.dir}/profiler:\ + ${nbplatform.active.dir}/webcommon:\ + ${nbplatform.active.dir}/websvccommon +suite.dir=../${basedir} +dest.dir=${suite.dir}/soabuild +nb.dest.dir=${dest.dir}/netbeans + +nbplatform.active=nb721 +nbplatform.nb721.netbeans.dest.dir=${dest.dir}/netbeans +nbplatform.nb721.harness.dir=${nbplatform.nb721.netbeans.dest.dir}/harness diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/nbproject/project.properties b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/nbproject/project.properties new file mode 100644 index 000000000..4b781ec33 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/nbproject/project.properties @@ -0,0 +1,2 @@ +javac.source=1.6 +javac.compilerargs=-Xlint -Xlint:-serial diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/nbproject/project.xml b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/nbproject/project.xml new file mode 100644 index 000000000..e7e5e11e6 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/nbproject/project.xml @@ -0,0 +1,148 @@ + + + org.netbeans.modules.apisupport.project + + + sedeployplugin + + + + org.apache.tools.ant.module + + + + 3 + 3.27.0.2 + + + + org.jdesktop.layout + + + + 1 + 1.4 + + + + org.netbeans.modules.java.project + + + + 1 + 1.12 + + + + org.netbeans.modules.project.ant + + + + 1 + 1.16 + + + + org.netbeans.modules.projectapi + + + + 1 + 1.13 + + + + org.netbeans.modules.projectuiapi + + + + 1 + 1.24.0.6 + + + + org.netbeans.modules.queries + + + + 1 + 1.10 + + + + org.openide.actions + + + + 6.6.0.1 + + + + org.openide.awt + + + + 6.11.0.1 + + + + org.openide.dialogs + + + + 7.5 + + + + org.openide.execution + + + + 1.10 + + + + org.openide.filesystems + + + + 7.3 + + + + org.openide.loaders + + + + 6.5 + + + + org.openide.nodes + + + + 7.2.0.1 + + + + org.openide.util + + + + 7.9.0.1 + + + + org.openide.util.lookup + + + + 8.15.2 + + + + + + + diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/nbproject/suite.properties b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/nbproject/suite.properties new file mode 100644 index 000000000..364e160e1 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/nbproject/suite.properties @@ -0,0 +1 @@ +suite.dir=${basedir}/.. diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/pom.xml b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/pom.xml new file mode 100644 index 000000000..1d99a3340 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/pom.xml @@ -0,0 +1,101 @@ + + + + 4.0.0 + ${groupId} + ${artifactId} + jar + ${version} + JBI Component[ServiceEngine] + Maven project for JBI Component that contains the + maven and netbeans build setup and component code to build and test the JBI Component. + http://open-esb.org + + build + src/java + test/java + build/classes + build/test/classes + package + + + + maven-antrun-plugin + 1.2 + + + + default-cli + + run + + + + !!!!!!!!!!!!!!!!!!!!!! Moving Files and organizing package !!!!!!!!!!!!!!!!!!!!!!!! + + !!!!!!!!!!!!!!!!!!!!!! Moving Files and organizing package completed successfully!!!!!!!!!!!!!!!!!!!!!!!! + + + + + + + + ant + ant-nodeps + 1.6.5 + + + ant + ant-junit + 1.6.5 + test + + + junit + junit + 3.8.2 + test + + + + + + + + ant + ant-nodeps + 1.6.5 + + + ant + ant-junit + 1.6.5 + test + + + junit + junit + 3.8.2 + test + + + org.apache.maven + maven-ant-tasks + 2.0.7 + + + + + + diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/META-INF/services/org.netbeans.spi.project.support.ant.AntBasedProjectType b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/META-INF/services/org.netbeans.spi.project.support.ant.AntBasedProjectType new file mode 100644 index 000000000..b05c8de7e --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/META-INF/services/org.netbeans.spi.project.support.ant.AntBasedProjectType @@ -0,0 +1 @@ +sedeployplugin.project.SEPluginProjectType diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/META-INF/services/org.netbeans.spi.queries.CollocationQueryImplementation b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/META-INF/services/org.netbeans.spi.queries.CollocationQueryImplementation new file mode 100644 index 000000000..9be0d09e9 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/META-INF/services/org.netbeans.spi.queries.CollocationQueryImplementation @@ -0,0 +1 @@ +org.netbeans.modules.compapp.projects.base.queries.SameDriveCollocationQuery diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/Bundle.properties b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/Bundle.properties new file mode 100644 index 000000000..f4399b22c --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/Bundle.properties @@ -0,0 +1,15 @@ +# binding component deployment plugin resource bundle +# binding deploy plugin +OpenIDE-Module-Name=SEDeployPlugin +# deployment plugin +OpenIDE-Module-Short-Description=Service engine deployment plugin for ServiceEngine +# deployment plugin for adding wsdl extensions related to the binding component to the wsdl editor +OpenIDE-Module-Long-Description=Deployment plugin for creating service units related to this service engine in composite application +# category +OpenIDE-Module-Display-Category=CAPS + +# plugin project template +Templates/Project/SOA/ServiceEngineJBIModule.xml=ServiceEngine JBI Module + + + diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/layer.xml b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/layer.xml new file mode 100644 index 000000000..758a0eba4 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/layer.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/Bundle.properties b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/Bundle.properties new file mode 100644 index 000000000..7b3c45fe3 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/Bundle.properties @@ -0,0 +1,4 @@ +LBL_Node_Sources=Sources + + + diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/SEPluginProject.java b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/SEPluginProject.java new file mode 100644 index 000000000..9f6059eee --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/SEPluginProject.java @@ -0,0 +1,408 @@ +/* + * SEPluginProject.java + * + */ +package net.openesb.component.${artifactId}.project; + +import java.beans.PropertyChangeListener; +import java.beans.PropertyChangeSupport; +import java.io.File; +import java.io.IOException; +import javax.swing.Icon; +import javax.swing.ImageIcon; +import org.netbeans.api.project.FileOwnerQuery; +import org.netbeans.api.project.Project; +import org.netbeans.api.project.ProjectInformation; +import org.netbeans.api.project.ProjectManager; +import org.netbeans.api.project.Sources; +import org.netbeans.api.project.ant.AntArtifact; +import net.openesb.component.${artifactId}.project.customizer.SEPluginProjectCustomizerProvider; +import org.netbeans.spi.java.project.support.ui.BrokenReferencesSupport; +import org.netbeans.spi.project.AuxiliaryConfiguration; +import org.netbeans.spi.project.SubprojectProvider; +import org.netbeans.spi.project.ant.AntArtifactProvider; +import org.netbeans.spi.project.support.ant.AntProjectEvent; +import org.netbeans.spi.project.support.ant.AntProjectHelper; +import org.netbeans.spi.project.support.ant.AntProjectListener; +import org.netbeans.spi.project.support.ant.EditableProperties; +import org.netbeans.spi.project.support.ant.GeneratedFilesHelper; +import org.netbeans.spi.project.support.ant.ProjectXmlSavedHook; +import org.netbeans.spi.project.support.ant.PropertyEvaluator; +import org.netbeans.spi.project.support.ant.ReferenceHelper; +import org.netbeans.spi.project.support.ant.SourcesHelper; +import org.netbeans.spi.project.ui.PrivilegedTemplates; +import org.netbeans.spi.project.ui.ProjectOpenedHook; +import org.netbeans.spi.project.ui.RecommendedTemplates; +import org.netbeans.spi.queries.FileBuiltQueryImplementation; +import org.netbeans.spi.queries.SharabilityQueryImplementation; +import org.openide.ErrorManager; +import org.openide.filesystems.FileObject; +import org.openide.util.Lookup; +import org.openide.util.Mutex; +import org.openide.util.NbBundle; +import org.openide.util.Utilities; +import org.openide.util.lookup.Lookups; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.w3c.dom.Text; + +/** + * + * @author chikkala + */ +public final class SEPluginProject implements Project, AntProjectListener { + + private static final Icon PROJECT_ICON = new ImageIcon(Utilities.loadImage(SEPluginProjectProperties.SE_PLUGIN_PROJECT_ICON_PATH)); // NOI18N + private AntProjectHelper helper; + private PropertyEvaluator evaluator; + private ReferenceHelper refHelper; + private GeneratedFilesHelper genFilesHelper; + private Lookup lookup; + + public SEPluginProject(AntProjectHelper helper) throws IOException { + this.helper = helper; + this.evaluator = createEvaluator(); + AuxiliaryConfiguration aux = helper.createAuxiliaryConfiguration(); + this.refHelper = new ReferenceHelper(helper, aux, helper.getStandardPropertyEvaluator()); + this.genFilesHelper = new GeneratedFilesHelper(helper); + this.lookup = createLookup(aux); + helper.addAntProjectListener(this); + } + + @Override + public String toString() { + return "SEPluginProject[" + getProjectDirectory() + "]"; // NOI18N + } + + public FileObject getProjectDirectory() { + return helper.getProjectDirectory(); + } + + public Lookup getLookup() { + return lookup; + } + + public void configurationXmlChanged(AntProjectEvent event) { + if (event.getPath().equals(AntProjectHelper.PROJECT_XML_PATH)) { + // Could be various kinds of changes, but name & displayName might have changed. + Info info = (Info) getLookup().lookup(ProjectInformation.class); + info.firePropertyChange(ProjectInformation.PROP_NAME); + info.firePropertyChange(ProjectInformation.PROP_DISPLAY_NAME); + } + //TODO: add other configuration xml change event handling code. + } + + public void propertiesChanged(AntProjectEvent event) { + //TODO: add property change event processing. + } + + public AntProjectHelper getAntProjectHelper() { + return helper; + } + + public ReferenceHelper getReferenceHelper() { + return this.refHelper; + } + + public PropertyEvaluator getEvaluator() { + return this.evaluator; + } + + /** + * Return configured project name. + */ + @SuppressWarnings(value = "unchecked") + public String getName() { + return (String) ProjectManager.mutex().readAccess(new Mutex.Action() { + public Object run() { + Element data = helper.getPrimaryConfigurationData(true); + + NodeList nl = data.getElementsByTagNameNS(SEPluginProjectType.PROJECT_CONFIGURATION_NAMESPACE, "name"); + if (nl.getLength() == 1) { + nl = nl.item(0).getChildNodes(); + if (nl.getLength() == 1 && nl.item(0).getNodeType() == Node.TEXT_NODE) { + return ((Text) nl.item(0)).getNodeValue(); + } + } + return "???"; // NOI18N + } + }); + } + + /** + * Store configured project name. + */ + @SuppressWarnings(value = "unchecked") + public void setName(final String name) { + ProjectManager.mutex().writeAccess(new Mutex.Action() { + public Object run() { + Element data = helper.getPrimaryConfigurationData(true); + + NodeList nl = data.getElementsByTagNameNS(SEPluginProjectType.PROJECT_CONFIGURATION_NAMESPACE, "name"); + Element nameEl; + if (nl.getLength() == 1) { + nameEl = (Element) nl.item(0); + NodeList deadKids = nameEl.getChildNodes(); + while (deadKids.getLength() > 0) { + nameEl.removeChild(deadKids.item(0)); + } + } else { + nameEl = data.getOwnerDocument().createElementNS(SEPluginProjectType.PROJECT_CONFIGURATION_NAMESPACE, "name"); + data.insertBefore(nameEl, data.getChildNodes().item(0)); + } + nameEl.appendChild(data.getOwnerDocument().createTextNode(name)); + helper.putPrimaryConfigurationData(data, true); + return null; + } + }); + } + + private PropertyEvaluator createEvaluator() { + //TODO: might need to use a custom evaluator to handle active platform substitutions... + return helper.getStandardPropertyEvaluator(); + } + + private FileBuiltQueryImplementation createFileBuiltQuery() { + return helper.createGlobFileBuiltQuery(getEvaluator(), + new String[]{"${src.dir}/*.java"}, // NOI18N + new String[]{"${build.classes.dir}/*.class"} // NOI18N + ); + } + + private SharabilityQueryImplementation createSharabilityQuery() { + return helper.createSharabilityQuery(getEvaluator(), + new String[]{"${src.dir}"}, // NOI18N + new String[]{"${build.dir}"} // NOI18N + ); + } + + private Sources getSources() { + final SourcesHelper sourcesHelper = new SourcesHelper(helper, getEvaluator()); + //TODO: add pricipal and typed source roots if required. + String srcLabel = NbBundle.getMessage(SEPluginProject.class, "LBL_Node_Sources"); //NOI18N + + String srcLoc = "${" + SEPluginProjectProperties.SRC_DIR + "}"; + sourcesHelper.addPrincipalSourceRoot(srcLoc, srcLabel, null, null); + sourcesHelper.addTypedSourceRoot(srcLoc, SEPluginProjectProperties.SOURCES_TYPE_XML, + srcLabel, null, null); + ProjectManager.mutex().postWriteRequest(new Runnable() { + public void run() { + sourcesHelper.registerExternalRoots(FileOwnerQuery.EXTERNAL_ALGORITHM_TRANSIENT); + } + }); + return sourcesHelper.createSources(); + } + + private Lookup createLookup(AuxiliaryConfiguration aux) { + + SubprojectProvider spp = refHelper.createSubprojectProvider(); + return Lookups.fixed(new Object[]{ + this, // to lookup this project from externally obtained Project + aux, + helper.createCacheDirectoryProvider(), + spp, + new Info(), + new SEPluginProjectActionProvider(this, helper, refHelper), + new SEPluginProjectLogicalViewProvider(this, helper, getEvaluator(), spp, refHelper), + new SEPluginProjectCustomizerProvider(this, helper, refHelper), + new AntArtifactProviderImpl(), + new ProjectXmlSavedHookImpl(), + new ProjectOpenedHookImpl(), + new RecommendedTemplatesImpl(), + new SEPluginProjectOperations(this), + getSources(), + createSharabilityQuery(), + createFileBuiltQuery() + }); + } +// Private inner classes ------------------------------------------------------- + + /** + * @see org.netbeans.api.project.ProjectInformation + */ + private final class Info implements ProjectInformation { + + private final PropertyChangeSupport pcs = new PropertyChangeSupport(this); + + Info() { + } + + void firePropertyChange(String prop) { + pcs.firePropertyChange(prop, null, null); + } + + public String getName() { + return SEPluginProject.this.getName(); + } + + public String getDisplayName() { + return SEPluginProject.this.getName(); + } + + public Icon getIcon() { + return PROJECT_ICON; + } + + public Project getProject() { + return SEPluginProject.this; + } + + public void addPropertyChangeListener(PropertyChangeListener listener) { + pcs.addPropertyChangeListener(listener); + } + + public void removePropertyChangeListener(PropertyChangeListener listener) { + pcs.removePropertyChangeListener(listener); + } + } + + /** + * @see org.netbeans.spi.project.support.ant.ProjectXmlSavedHook + */ + private final class ProjectXmlSavedHookImpl extends ProjectXmlSavedHook { + + ProjectXmlSavedHookImpl() { + } + + protected void projectXmlSaved() throws IOException { + genFilesHelper.refreshBuildScript( + GeneratedFilesHelper.BUILD_IMPL_XML_PATH, + SEPluginProject.class.getResource("resources/build-impl.xsl"), + false); + genFilesHelper.refreshBuildScript( + GeneratedFilesHelper.BUILD_XML_PATH, + SEPluginProject.class.getResource("resources/build.xsl"), + false); + } + } + + /** + * @see org.netbeans.spi.project.ui.ProjectOpenedHook + */ + private final class ProjectOpenedHookImpl extends ProjectOpenedHook { + + // TODO m + ProjectOpenedHookImpl() { + } + + @SuppressWarnings("unchecked") + protected void projectOpened() { + + try { + // Check up on build scripts. + genFilesHelper.refreshBuildScript( + GeneratedFilesHelper.BUILD_IMPL_XML_PATH, + SEPluginProject.class.getResource("resources/build-impl.xsl"), + true); + genFilesHelper.refreshBuildScript( + GeneratedFilesHelper.BUILD_XML_PATH, + SEPluginProject.class.getResource("resources/build.xsl"), + true); + } catch (IOException e) { + ErrorManager.getDefault().notify(ErrorManager.INFORMATIONAL, e); + } + + // Make it easier to run headless builds on the same machine at least. + ProjectManager.mutex().writeAccess(new Mutex.Action() { + public Object run() { + EditableProperties ep = helper.getProperties(AntProjectHelper.PRIVATE_PROPERTIES_PATH); + File buildProperties = new File(System.getProperty("netbeans.user"), "build.properties"); // NOI18N + ep.setProperty("user.properties.file", buildProperties.getAbsolutePath()); //NOI18N + helper.putProperties(AntProjectHelper.PRIVATE_PROPERTIES_PATH, ep); + //TODO: add any other resolved private properties. for example, the project paths and lib paths + try { + ProjectManager.getDefault().saveProject(SEPluginProject.this); + } catch (IOException e) { + ErrorManager.getDefault().notify(e); + } + return null; + } + }); + + SEPluginProjectLogicalViewProvider logicalViewProvider = + SEPluginProject.this.getLookup().lookup(SEPluginProjectLogicalViewProvider.class); + if (logicalViewProvider != null && logicalViewProvider.hasBrokenLinks()) { + BrokenReferencesSupport.showAlert(); + } + } + + protected void projectClosed() { + // Probably unnecessary, but just in case: + try { + ProjectManager.getDefault().saveProject(SEPluginProject.this); + } catch (IOException e) { + ErrorManager.getDefault().notify(e); + } + } + } + + /** + * @see org.netbeans.spi.project.ui.RecommendedTemplates + * @see org.netbeans.spi.project.ui.PrivilegedTemplates + */ + private static final class RecommendedTemplatesImpl implements RecommendedTemplates, PrivilegedTemplates { + + // List of primarily supported templates + private static final String[] TYPES = new String[]{ + /* TODO: add any other recommended templates + "java-classes", // NOI18N + "ejb-types", // NOI18N + "java-beans", // NOI18N + "oasis-XML-catalogs", // NOI18N + "XML", // NOI18N + "ant-script", // NOI18N + "ant-task", // NOI18N + "simple-files" // NOI18N + */ + "SOA", + "XML", // NOI18N + "simple-files" // NOI18N + }; + private static final String[] PRIVILEGED_NAMES = new String[]{ + /* TODO: add any other privileged names + "Templates/Classes/Class.java", // NOI18N + "Templates/Classes/Package", // NOI18N + "Templates/Classes/Interface.java" // NOI18N + */ + "Templates/XML/XmlDocument.xml", // NOI18N + "Templates/XML/XmlSchema.xsd", // NOI18N + "Templates/XML/WSDL.wsdl", // NOI18N + "Templates/Other/properties.properties" // NOI18N + }; + + public String[] getRecommendedTypes() { + return TYPES; + } + + public String[] getPrivilegedTemplates() { + return PRIVILEGED_NAMES; + } + } + + /** + * Exports the main JAR as an official build product for use from other + * scripts. The type of the artifact will be {@link AntArtifact#TYPE_JAR}. + * + * @see org.netbeans.spi.project.ant.AntArtifactProvider + */ + private final class AntArtifactProviderImpl implements AntArtifactProvider { + + public AntArtifact[] getBuildArtifacts() { + return new AntArtifact[]{ + helper.createSimpleAntArtifact( + SEPluginProjectProperties.ARTIFACT_TYPE_JBI_SU_PREFIX + + helper.getStandardPropertyEvaluator().getProperty(SEPluginProjectProperties.JBI_SU_TARGET_NAME), + SEPluginProjectProperties.JBI_SU_ZIP, + helper.getStandardPropertyEvaluator(), + SEPluginProjectProperties.BUILD_TARGET_DIST, + SEPluginProjectProperties.BUILD_TARGET_CLEAN), + helper.createSimpleAntArtifact(SEPluginProjectProperties.ARTIFACT_TYPE_JAR, + SEPluginProjectProperties.JBI_SU_ZIP, + helper.getStandardPropertyEvaluator(), + SEPluginProjectProperties.BUILD_TARGET_DIST, + SEPluginProjectProperties.BUILD_TARGET_CLEAN) + }; + } + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/SEPluginProjectActionProvider.java b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/SEPluginProjectActionProvider.java new file mode 100644 index 000000000..f24d31835 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/SEPluginProjectActionProvider.java @@ -0,0 +1,136 @@ +/* + * SEPluginProjectActionProvider.java + * + */ +package net.openesb.component.${artifactId}.project; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; +import org.apache.tools.ant.module.api.support.ActionUtils; +import org.netbeans.spi.project.ActionProvider; +import org.netbeans.spi.project.support.ant.AntProjectHelper; +import org.netbeans.spi.project.support.ant.GeneratedFilesHelper; +import org.netbeans.spi.project.support.ant.ReferenceHelper; +import org.netbeans.spi.project.ui.support.DefaultProjectOperations; +import org.openide.DialogDisplayer; +import org.openide.ErrorManager; +import org.openide.NotifyDescriptor; +import org.openide.filesystems.FileObject; +import org.openide.util.Lookup; +import org.openide.util.NbBundle; + +/** + * Action provider of the SE Plugin projects. + * + * @author chikkala + */ +public class SEPluginProjectActionProvider implements ActionProvider { + + // Commands available from SE Plugin Project + private static final String[] supportedActions = {COMMAND_BUILD, COMMAND_CLEAN, COMMAND_REBUILD, COMMAND_DELETE, COMMAND_COPY, COMMAND_MOVE, COMMAND_RENAME}; + private SEPluginProject project; + // Ant project helper of the project + private AntProjectHelper antProjectHelper; + private ReferenceHelper refHelper; + /** + * Map from commands to ant targets + */ + private Map commands; + + public SEPluginProjectActionProvider(SEPluginProject project, AntProjectHelper antProjectHelper, ReferenceHelper refHelper) { + commands = new HashMap(); + commands.put(COMMAND_BUILD, new String[]{"dist"}); // NOI18N + commands.put(COMMAND_CLEAN, new String[]{"clean"}); // NOI18N + commands.put(COMMAND_REBUILD, new String[]{"clean", "dist"}); // NOI18N + //TODO: Add any other ant targets to commands map. + //commands.put(COMMAND_DEPLOY, new String[] {"run"}); // NOI18N + this.antProjectHelper = antProjectHelper; + this.project = project; + this.refHelper = refHelper; + } + + public String[] getSupportedActions() { + return supportedActions; + } + + public void invokeAction(final String command, final Lookup context) throws IllegalArgumentException { + + if (COMMAND_COPY.equals(command)) { + DefaultProjectOperations.performDefaultCopyOperation(project); + return; + } + + if (COMMAND_MOVE.equals(command)) { + DefaultProjectOperations.performDefaultMoveOperation(project); + return; + } + + if (COMMAND_RENAME.equals(command)) { + DefaultProjectOperations.performDefaultRenameOperation(project, null); + return; + } + if (COMMAND_DELETE.equals(command)) { + DefaultProjectOperations.performDefaultDeleteOperation(project); + return; + } + + Runnable action = new Runnable() { + public void run() { + Properties p = new Properties(); + String[] targetNames; + + targetNames = getTargetNames(command, context, p); + if (targetNames == null) { + return; + } + if (targetNames.length == 0) { + targetNames = null; + } + if (p.keySet().size() == 0) { + p = null; + } + try { + FileObject buildFo = findBuildXml(); + if (buildFo == null || !buildFo.isValid()) { + //The build.xml was deleted after the isActionEnabled was called + NotifyDescriptor nd = new NotifyDescriptor.Message(NbBundle.getMessage(SEPluginProjectActionProvider.class, + "LBL_No_Build_XML_Found"), NotifyDescriptor.WARNING_MESSAGE); + DialogDisplayer.getDefault().notify(nd); + } else { + ActionUtils.runTarget(buildFo, targetNames, p); + } + } catch (IOException e) { + ErrorManager.getDefault().notify(e); + } + } + }; + //TODO: add code if needed that requires the execution to wait for some other task to complete. + action.run(); // execute the task to invoke the ant target for the command + + } + + public boolean isActionEnabled(String command, Lookup context) throws IllegalArgumentException { + if (findBuildXml() == null) { + return false; + } + //TODO: Add any commands enabling check logic if required. + return true; + } + + public FileObject findBuildXml() { + return project.getProjectDirectory().getFileObject(GeneratedFilesHelper.BUILD_XML_PATH); + } + + /** + * @return array of targets or null to stop execution; can return empty + * array + */ + public String[] getTargetNames(String command, Lookup context, Properties p) throws IllegalArgumentException { + String[] targetNames = commands.get(command); + //TODO: add any special code that requires adding new target names or setting the + // external properties p passed during the ant exection if required. + return targetNames; + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/SEPluginProjectGenerator.java b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/SEPluginProjectGenerator.java new file mode 100644 index 000000000..0cc2e39e1 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/SEPluginProjectGenerator.java @@ -0,0 +1,182 @@ +/* + * SEPluginProjectGenerator.java + * + */ +package net.openesb.component.${artifactId}.project; + +import java.io.File; +import java.io.File; +import java.io.IOException; +import org.netbeans.api.project.Project; +import org.netbeans.api.project.ProjectManager; +import org.netbeans.spi.project.support.ant.AntProjectHelper; +import org.netbeans.spi.project.support.ant.EditableProperties; +import org.netbeans.spi.project.support.ant.ProjectGenerator; +import org.netbeans.spi.project.support.ant.PropertyUtils; +import org.openide.filesystems.FileObject; +import org.openide.filesystems.FileStateInvalidException; +import org.openide.filesystems.FileUtil; +import org.w3c.dom.Document; +import org.w3c.dom.Element; + +/** + * Creates a Deployment Plugin Project for Service Engine. + * + * @author chikkala + */ +public class SEPluginProjectGenerator { + + private File mPrjDir; + private String mPrjName; + private String mSUName; + private String mSUDesc; + private String mSUTarget; + + public SEPluginProjectGenerator() { + this.mSUName = SEPluginProjectProperties.JBI_SU_NAME_VALUE; + this.mSUDesc = SEPluginProjectProperties.JBI_SU_DESCRIPTION_VALUE; + this.mSUTarget = SEPluginProjectProperties.JBI_SU_TARGET_NAME_VALUE; + } + + public File getProjectDirectory() { + return this.mPrjDir; + } + + public String getProjectName() { + return this.mPrjName; + } + + public String getSUName() { + return this.mSUName; + } + + public void setSUName(String suName) { + this.mSUName = suName; + } + + public String getSUDescription() { + return this.mSUDesc; + } + + public void setSUDescription(String suDesc) { + this.mSUDesc = suDesc; + } + + public String getSUTarget() { + return this.mSUTarget; + } + + public void setSUTarget(String suTarget) { + this.mSUTarget = suTarget; + } + + private void createPrimaryConfigurationData(AntProjectHelper prjHelper) { + + Element data = prjHelper.getPrimaryConfigurationData(true); + Document doc = data.getOwnerDocument(); + + Element nameEl = doc.createElementNS(SEPluginProjectType.PROJECT_CONFIGURATION_NAMESPACE, "name"); // NOI18N + nameEl.appendChild(doc.createTextNode(this.getProjectName())); + data.appendChild(nameEl); + + prjHelper.putPrimaryConfigurationData(data, true); + } + + private void createProjectPrivateProperties(AntProjectHelper prjHelper) { + + EditableProperties ep = prjHelper.getProperties(AntProjectHelper.PRIVATE_PROPERTIES_PATH); + + //TODO: add any project private properties here. + // ep.setProperty("application.args", ""); // NOI18N + prjHelper.putProperties(AntProjectHelper.PRIVATE_PROPERTIES_PATH, ep); + } + + private void createProjectProperties(AntProjectHelper prjHelper) { + + EditableProperties ep = prjHelper.getProperties(AntProjectHelper.PROJECT_PROPERTIES_PATH); + + ep.setProperty(SEPluginProjectProperties.SRC_DIR, SEPluginProjectProperties.SRC_DIR_VALUE); + ep.setComment(SEPluginProjectProperties.SRC_DIR, new String[]{"# service unit source directory "}, false); // NOI18N + ep.setProperty(SEPluginProjectProperties.BUILD_DIR, SEPluginProjectProperties.BUILD_DIR_VALUE); + + ep.setProperty(SEPluginProjectProperties.BUILD_DIR, SEPluginProjectProperties.BUILD_DIR_VALUE); + + ep.setProperty(SEPluginProjectProperties.JBI_SU_ZIP, SEPluginProjectProperties.JBI_SU_ZIP_VALUE); + + ep.setProperty(SEPluginProjectProperties.JBI_SU_NAME, getSUName()); + ep.setProperty(SEPluginProjectProperties.JBI_SU_DESCRIPTION, getSUDescription()); + ep.setProperty(SEPluginProjectProperties.JBI_SU_TARGET_NAME, getSUTarget()); + + // save properties to file. + prjHelper.putProperties(AntProjectHelper.PROJECT_PROPERTIES_PATH, ep); + } + + public AntProjectHelper createProject(File prjDir, String prjName) throws IOException { + AntProjectHelper prjHelper = null; + + this.mPrjDir = prjDir; + this.mPrjName = prjName; + if (SEPluginProjectProperties.JBI_SU_NAME_VALUE.equals(this.getSUName())) { + // default value. so set the su name to project name. + String suName = PropertyUtils.getUsablePropertyName(this.getProjectName()); + this.setSUName(suName); + } + + FileObject prjDirFO = createProjectDir(this.getProjectDirectory()); + + prjHelper = ProjectGenerator.createProject(prjDirFO, SEPluginProjectType.TYPE); + + createPrimaryConfigurationData(prjHelper); + createProjectProperties(prjHelper); + createProjectPrivateProperties(prjHelper); + + FileObject srcFolder = FileUtil.createFolder(prjDirFO, SEPluginProjectProperties.SRC_DIR_VALUE); // NOI18N + + // create su jbi.xml + SEPluginProjectProperties.createDefaultSUDescriptor(srcFolder); + + //TODO: create any service unit specifc default artifacts here. + + Project p = ProjectManager.getDefault().findProject(prjDirFO); + ProjectManager.getDefault().saveProject(p); + + return prjHelper; + } + + private static FileObject createProjectDir(File dir) throws IOException { + FileObject dirFO; + if (!dir.exists()) { + //Refresh before mkdir not to depend on window focus, refreshFileSystem does not work correctly + refreshFolder(dir); + if (!dir.mkdirs()) { + throw new IOException("Can not create project folder."); //NOI18N + } + refreshFileSystem(dir); + } + dirFO = FileUtil.toFileObject(dir); + assert dirFO != null : "No such dir on disk: " + dir; // NOI18N + assert dirFO.isFolder() : "Not really a dir: " + dir; // NOI18N + return dirFO; + } + + private static void refreshFileSystem(final File dir) throws FileStateInvalidException { + File rootF = dir; + while (rootF.getParentFile() != null) { + rootF = rootF.getParentFile(); + } + FileObject dirFO = FileUtil.toFileObject(rootF); + assert dirFO != null : "At least disk roots must be mounted! " + rootF; // NOI18N + dirFO.getFileSystem().refresh(false); + } + + private static void refreshFolder(File dir) { + while (!dir.exists()) { + dir = dir.getParentFile(); + } + FileObject fo = FileUtil.toFileObject(dir); + if (fo != null) { + fo.getChildren(); + fo.refresh(); + } + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/SEPluginProjectLogicalViewProvider.java b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/SEPluginProjectLogicalViewProvider.java new file mode 100644 index 000000000..79f1cae06 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/SEPluginProjectLogicalViewProvider.java @@ -0,0 +1,81 @@ +/* + * SEPluginProjectLogicalViewProvider.java + * + */ +package net.openesb.component.${artifactId}.project; + +import org.netbeans.api.project.FileOwnerQuery; +import org.netbeans.api.project.Project; +import net.openesb.component.${artifactId}.project.node.SEPluginProjectNode; +import org.netbeans.spi.java.project.support.ui.BrokenReferencesSupport; +import org.netbeans.spi.java.project.support.ui.PackageView; +import org.netbeans.spi.project.SubprojectProvider; +import org.netbeans.spi.project.support.ant.AntProjectHelper; +import org.netbeans.spi.project.support.ant.PropertyEvaluator; +import org.netbeans.spi.project.support.ant.ReferenceHelper; +import org.netbeans.spi.project.ui.LogicalViewProvider; +import org.openide.filesystems.FileObject; +import org.openide.nodes.Node; + +/** + * + * @author chikkala + */ +public class SEPluginProjectLogicalViewProvider implements LogicalViewProvider { + + private final Project mProject; + private final AntProjectHelper mHelper; + private final PropertyEvaluator mEvaluator; + private final SubprojectProvider mSpp; + private final ReferenceHelper mResolver; + + public SEPluginProjectLogicalViewProvider(Project project, AntProjectHelper helper, PropertyEvaluator evaluator, SubprojectProvider spp, ReferenceHelper resolver) { + this.mProject = project; + assert project != null; + this.mHelper = helper; + assert helper != null; + this.mEvaluator = evaluator; + assert evaluator != null; + this.mSpp = spp; + assert spp != null; + this.mResolver = resolver; + } + + public Node createLogicalView() { + return new SEPluginProjectNode(this.mProject, this.mHelper, this.mEvaluator, this.mSpp, this.mResolver); + } + + public Node findPath(Node root, Object target) { + Project project = root.getLookup().lookup(Project.class); + if (project == null) { + return null; + } + + if (target instanceof FileObject) { + FileObject fo = (FileObject) target; + Project owner = FileOwnerQuery.getOwner(fo); + if (!project.equals(owner)) { + return null; // Don't waste time if project does not own the fo + } + + Node[] nodes = root.getChildren().getNodes(true); + for (int i = 0; i < nodes.length; i++) { + Node result = PackageView.findPath(nodes[i], target); + if (result != null) { + return result; + } + } + } + + return null; + } + + private String[] getBreakableProperties() { + String[] breakableProps = new String[0]; + return breakableProps; + } + + public boolean hasBrokenLinks() { + return BrokenReferencesSupport.isBroken(mHelper, mResolver, getBreakableProperties(), new String[]{SEPluginProjectProperties.DEFAULT_PLATFORM}); + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/SEPluginProjectOperations.java b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/SEPluginProjectOperations.java new file mode 100644 index 000000000..5c7dd9486 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/SEPluginProjectOperations.java @@ -0,0 +1,114 @@ +/* + * SEPluginProjectOperations.java + * + */ +package net.openesb.component.${artifactId}.project; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Properties; +import org.apache.tools.ant.module.api.support.ActionUtils; +import org.netbeans.api.project.Project; +import org.netbeans.spi.project.ActionProvider; +import org.netbeans.spi.project.CopyOperationImplementation; +import org.netbeans.spi.project.DeleteOperationImplementation; +import org.netbeans.spi.project.MoveOperationImplementation; +import org.netbeans.spi.project.support.ant.GeneratedFilesHelper; +import org.openide.filesystems.FileObject; +import org.openide.util.Lookup; +import org.openide.util.lookup.Lookups; + +/** + * + * @author chikkala + */ +public class SEPluginProjectOperations implements DeleteOperationImplementation, CopyOperationImplementation, MoveOperationImplementation { + + private SEPluginProject project; + + public SEPluginProjectOperations(SEPluginProject project) { + this.project = project; + } + + public void notifyDeleting() throws IOException { + SEPluginProjectActionProvider ap = project.getLookup().lookup(SEPluginProjectActionProvider.class); + + assert ap != null; + + Lookup context = Lookups.fixed(new Object[0]); + Properties p = new Properties(); + String[] targetNames = ap.getTargetNames(ActionProvider.COMMAND_CLEAN, context, p); + FileObject buildXML = project.getProjectDirectory().getFileObject(GeneratedFilesHelper.BUILD_XML_PATH); + + assert targetNames != null; + assert targetNames.length > 0; + + ActionUtils.runTarget(buildXML, targetNames, p).waitFinished(); + } + + public void notifyDeleted() throws IOException { + project.getAntProjectHelper().notifyDeleted(); + } + + public List getMetadataFiles() { + FileObject projectDirectory = project.getProjectDirectory(); + List files = new ArrayList(); + + addFile(projectDirectory, "nbproject", files); // NOI18N + addFile(projectDirectory, "build.xml", files); // NOI18N + addFile(projectDirectory, "manifest.mf", files); // NOI18N + addFile(projectDirectory, projectDirectory.getName(), files); //NOI18N + + return files; + } + + public List getDataFiles() { + List files = new ArrayList(); + FileObject projectDirectory = project.getProjectDirectory(); + FileObject srcDirFO = SEPluginProjectProperties.getSourceDirectory(project); + files.add(srcDirFO); + return files; + } + + public void notifyCopying() throws IOException { + // do nothing. + // This does copy the old distribution file over though, which is + // probably OK because "ant clean" will clean it up. + } + + public void notifyCopied(Project original, File originalPath, String newName) throws IOException { + if (original == null) { + // do nothing for the original project. + return; + } + + project.getReferenceHelper().fixReferences(originalPath); + + String oldName = project.getName(); + project.setName(newName); + } + + public void notifyMoving() throws IOException { + notifyDeleting(); + } + + public void notifyMoved(Project original, File originalPath, String newName) throws IOException { + if (original == null) { + project.getAntProjectHelper().notifyDeleted(); + return; + } + String oldName = project.getName(); + project.setName(newName); + project.getReferenceHelper().fixReferences(originalPath); + } + + private static void addFile(FileObject projectDirectory, String fileName, List result) { + FileObject file = projectDirectory.getFileObject(fileName); + + if (file != null) { + result.add(file); + } + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/SEPluginProjectProperties.java b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/SEPluginProjectProperties.java new file mode 100644 index 000000000..22166d15e --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/SEPluginProjectProperties.java @@ -0,0 +1,149 @@ +/* + * SEPluginProjectProperties.java + * + */ +package net.openesb.component.${artifactId}.project; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.PrintWriter; +import java.io.StringWriter; +import org.netbeans.spi.project.support.ant.AntProjectHelper; +import org.openide.filesystems.FileLock; +import org.openide.filesystems.FileObject; +import org.openide.filesystems.FileObject; +import org.openide.filesystems.FileUtil; + +/** + * + * @author chikkala + */ +public class SEPluginProjectProperties { + + public static final String DEFAULT_PLATFORM = "default_platform"; // NOI18N + public static final String SOURCES_TYPE_XML = "xml"; + public static final String SOURCES_TYPE_JAVA = "java"; + public static final String SE_PLUGIN_PROJECT_ICON_PATH = "serviceengine/project/resources/projectIcon.png"; // NOI18N" + /** + * comp app callable ant build targets see + * SEPluginProject.AntArtifactProviderImpl for more info. When a composite + * application project builds the service assembly it calls these targets to + * build a service unit added by this project. + */ + public static final String BUILD_TARGET_DIST = "dist_se"; // NOI18N + public static final String BUILD_TARGET_CLEAN = "clean"; // NOI18N + /** + * Ant artifact type value required for plugin to compapp project see + * SEPluginProject.AntArtifactProviderImpl for more info. The value used is + * "CAPS.asa: where is the name + * of the service engine to which the service unit created by this project + * will be deployed. + */ + public static final String ARTIFACT_TYPE_JBI_SU_PREFIX = "CAPS.asa:"; // NOI18N + /** + * service unit target property. The value is the component name of the + * service engine to which the service unit created by this project will be + * deployed. + */ + public static final String JBI_SU_TARGET_NAME = "jbi.su.target.name"; // NOI18N + /** + * Name of the service engine + */ + public static final String JBI_SU_TARGET_NAME_VALUE = "paramv4seplugin"; // NOI18N + public static final String ARTIFACT_TYPE_JAR = "jar"; // NOI18N + public static final String JBI_SU_NAME = "jbi.su.name"; // NOI18N + public static final String JBI_SU_NAME_VALUE = "ServiceUnit"; // NOI18N + public static final String JBI_SU_DESCRIPTION = "jbi.su.description"; // NOI18N + public static final String JBI_SU_DESCRIPTION_VALUE = "Service unit description"; // NOI18N + public static final String JBI_SU_ZIP = "jbi.su.zip"; + /** + * bug in the comp app project build system prevents us to define the + * service unit archive file name and location to be any thing. You must + * define a hardcoded name for the su archive. TODO: will use the + * ${build.dir}/${jbi.su.name}.zip when compapp bug is fixed. + */ + public static final String JBI_SU_ZIP_VALUE = "${build.dir}/SEDeployment.jar"; + // public static final String JBI_SU_ZIP_VALUE = "${build.dir}/${jbi.su.name}.zip"; + /** + * these properties can be used in the build script that produces the + * service unit archive file. + */ + public static final String JAR_COMPRESS = "jar.compress"; // NOI18N + public static final String BUILD_FILES_EXCLUDES = "build.files.excludes"; // NOI18N + public static final String BUILD_DIR = "build.dir"; // NOI18N + public static final String BUILD_DIR_VALUE = "build"; // NOI18N + public static final String JBI_SU_BUILD_DIR_VALUE = "${build.dir}/${jbi.su.name}"; // NOI18N + public static final String SRC_DIR = "src.dir"; // NOI18N + public static final String SRC_DIR_VALUE = "src"; // NOI18N + public static final String SU_JBI_XML_PATH = "META-INF/jbi.xml"; // NOI18N + + public static FileObject getSourceDirectory(SEPluginProject project) { + AntProjectHelper helper = project.getAntProjectHelper(); + String srcDir = helper.getStandardPropertyEvaluator().getProperty(SRC_DIR); // NOI18N + return helper.resolveFileObject(srcDir); + } + + public static FileObject createDefaultSUDescriptor(FileObject srcFolder) throws IOException { + FileObject jbiXmlFO = null; + + StringWriter writer = new StringWriter(); + PrintWriter out = new PrintWriter(writer); + out.println(""); + out.println(""); + out.println(" "); + out.println(" "); + out.println(" "); + out.println(" "); + out.println(""); + out.close(); + writer.close(); + + jbiXmlFO = FileUtil.createData(srcFolder, SU_JBI_XML_PATH); + saveToFileObject(jbiXmlFO, writer.getBuffer()); + + return jbiXmlFO; + } + + public static void saveToFileObject(FileObject outFO, StringBuffer srcBuff) { + FileLock outLock = null; + OutputStream outS = null; + InputStream inS = null; + + try { + inS = new ByteArrayInputStream(srcBuff.toString().getBytes()); + outLock = outFO.lock(); + outS = outFO.getOutputStream(outLock); + FileUtil.copy(inS, outS); + } catch (Exception ex) { + ex.printStackTrace(); + } finally { + if (inS != null) { + try { + inS.close(); + } catch (Exception ex) { + //ingore + } + } + if (outS != null) { + try { + outS.close(); + } catch (Exception ex) { + //ingore + } + } + if (outLock != null) { + outLock.releaseLock(); + } + } + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/SEPluginProjectType.java b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/SEPluginProjectType.java new file mode 100644 index 000000000..1378bd99c --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/SEPluginProjectType.java @@ -0,0 +1,55 @@ +/* + * SEPluginProjectProperties.java + */ +package net.openesb.component.${artifactId}.project; + +import java.io.IOException; +import org.netbeans.api.project.Project; +import org.netbeans.spi.project.support.ant.AntBasedProjectType; +import org.netbeans.spi.project.support.ant.AntProjectHelper; + +/** + * Factory for simple service engine deployment plugin project projects. + * + * @author chikkala + */ +public final class SEPluginProjectType implements AntBasedProjectType { + + /** + */ + public static final String TYPE = "serviceengine.project.type"; // NOI18N + /** + */ + public static final String PROJECT_CONFIGURATION_NAMESPACE = "http://www.netbeans.org/ns/jbimodules/paramv4seplugin/1"; // NOI18N + /** + */ + public static final String PROJECT_CONFIGURATION_NAME = "data"; // NOI18N + /** + */ + public static final String PRIVATE_CONFIGURATION_NAME = "data"; // NOI18N + /** + */ + public static final String PRIVATE_CONFIGURATION_NAMESPACE = "http://www.netbeans.org/ns/jbimodules/paramv4seplugin/private/1"; // NOI18N + + /** + * Do nothing, just a service. + */ + public SEPluginProjectType() { + } + + public String getType() { + return TYPE; + } + + public Project createProject(AntProjectHelper helper) throws IOException { + return new SEPluginProject(helper); + } + + public String getPrimaryConfigurationDataElementName(boolean shared) { + return shared ? PROJECT_CONFIGURATION_NAME : PRIVATE_CONFIGURATION_NAME; + } + + public String getPrimaryConfigurationDataElementNamespace(boolean shared) { + return shared ? PROJECT_CONFIGURATION_NAMESPACE : PRIVATE_CONFIGURATION_NAMESPACE; + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/customizer/Bundle.properties b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/customizer/Bundle.properties new file mode 100644 index 000000000..05c5ab3d5 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/customizer/Bundle.properties @@ -0,0 +1,19 @@ +# CustomizerDialog +LBL_Customizer_Title=Project Properties - {0} +# cutomizer node labels +LBL_Config_General=General +LBL_Config_BuildCategories=Build +LBL_Config_Compile=Compile +LBL_Config_Package=Package + +# Cutomizer node panel strings +# sample cutomizer panel +# General cutomizer panel +LBL_config.general.su.name=Name: +LBL_config.general.su.desc=Description: +LBL_config.general.su.target=Target JBI Component\: +LBL_config.general.su.target.value.unknown=Unknown +LBL_config.package.su.zip=&Service Unit Archive File\: +LBL_config.package.build.files.exludes=&Exclude from archive file\: +LBL_config.package.build.files.exludes.message=(can not exclude jbi.xml) +CHKB_config.package.jar.compress=&Compress Archive File diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/customizer/CustomizerGeneral.form b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/customizer/CustomizerGeneral.form new file mode 100644 index 000000000..b54857007 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/customizer/CustomizerGeneral.form @@ -0,0 +1,128 @@ + + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/customizer/CustomizerGeneral.java b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/customizer/CustomizerGeneral.java new file mode 100644 index 000000000..7943fd97c --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/customizer/CustomizerGeneral.java @@ -0,0 +1,178 @@ +/* + * CustomizerGeneral.java + */ +package net.openesb.component.${artifactId}.project.customizer; + +import javax.swing.JPanel; +import javax.swing.text.BadLocationException; +import javax.swing.text.Document; +import org.openide.util.HelpCtx; + +/** + * + * @author chikkala + */ +public class CustomizerGeneral extends JPanel implements HelpCtx.Provider { + + private SEPluginProjectCustomizerModel uiModel; + + public CustomizerGeneral(SEPluginProjectCustomizerModel uiModel) { + + this.uiModel = uiModel; + + initComponents(); + + initTargetComponent(uiModel.getSUTargetModel()); + + this.mSUNameTF.setDocument(uiModel.getSUNameModel()); + this.mSUDescriptionTA.setDocument(uiModel.getSUDescriptionModel()); + + } + + public HelpCtx getHelpCtx() { + return new HelpCtx(CustomizerGeneral.class); + } + + /** + * This method is called from within the constructor to initialize the form. + * WARNING: Do NOT modify this code. The content of this method is always + * regenerated by the Form Editor. + */ + // //GEN-BEGIN:initComponents + private void initComponents() { + java.awt.GridBagConstraints gridBagConstraints; + + mSUTargetLBL = new javax.swing.JLabel(); + mSUTargetValueLBL = new javax.swing.JLabel(); + mSUNameLBL = new javax.swing.JLabel(); + mSUNameTF = new javax.swing.JTextField(); + mSUDescriptionLBL = new javax.swing.JLabel(); + mSUDescriptionScrollPane = new javax.swing.JScrollPane(); + mSUDescriptionTA = new javax.swing.JTextArea(); + mFillLBL = new javax.swing.JLabel(); + + setLayout(new java.awt.GridBagLayout()); + + mSUTargetLBL.setLabelFor(mSUTargetValueLBL); + mSUTargetLBL.setText(org.openide.util.NbBundle.getMessage(CustomizerGeneral.class, "LBL_config.general.su.target")); // NOI18N + mSUTargetLBL.setToolTipText(""); + gridBagConstraints = new java.awt.GridBagConstraints(); + gridBagConstraints.gridx = 0; + gridBagConstraints.gridy = 0; + gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; + gridBagConstraints.ipadx = 5; + gridBagConstraints.ipady = 5; + gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; + gridBagConstraints.insets = new java.awt.Insets(12, 2, 2, 4); + add(mSUTargetLBL, gridBagConstraints); + mSUTargetLBL.getAccessibleContext().setAccessibleName(org.openide.util.NbBundle.getMessage(CustomizerGeneral.class, "LBL_config.general.su.target")); // NOI18N + + mSUTargetValueLBL.setText(org.openide.util.NbBundle.getMessage(CustomizerGeneral.class, "LBL_config.general.su.target.value.unknown")); // NOI18N + gridBagConstraints = new java.awt.GridBagConstraints(); + gridBagConstraints.gridx = 1; + gridBagConstraints.gridy = 0; + gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; + gridBagConstraints.ipadx = 5; + gridBagConstraints.ipady = 5; + gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; + gridBagConstraints.weightx = 1.0; + gridBagConstraints.insets = new java.awt.Insets(12, 2, 2, 4); + add(mSUTargetValueLBL, gridBagConstraints); + mSUTargetValueLBL.getAccessibleContext().setAccessibleName(""); + + mSUNameLBL.setHorizontalAlignment(javax.swing.SwingConstants.LEFT); + mSUNameLBL.setLabelFor(mSUNameTF); + mSUNameLBL.setText(org.openide.util.NbBundle.getMessage(CustomizerGeneral.class, "LBL_config.general.su.name")); // NOI18N + mSUNameLBL.setToolTipText(""); + mSUNameLBL.setHorizontalTextPosition(javax.swing.SwingConstants.LEFT); + gridBagConstraints = new java.awt.GridBagConstraints(); + gridBagConstraints.gridx = 0; + gridBagConstraints.gridy = 1; + gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; + gridBagConstraints.ipadx = 5; + gridBagConstraints.ipady = 5; + gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; + gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 4); + add(mSUNameLBL, gridBagConstraints); + gridBagConstraints = new java.awt.GridBagConstraints(); + gridBagConstraints.gridx = 1; + gridBagConstraints.gridy = 1; + gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; + gridBagConstraints.ipadx = 5; + gridBagConstraints.ipady = 5; + gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; + gridBagConstraints.weightx = 1.0; + gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 4); + add(mSUNameTF, gridBagConstraints); + + mSUDescriptionLBL.setHorizontalAlignment(javax.swing.SwingConstants.LEFT); + mSUDescriptionLBL.setText(org.openide.util.NbBundle.getMessage(CustomizerGeneral.class, "LBL_config.general.su.desc")); // NOI18N + mSUDescriptionLBL.setToolTipText(""); + gridBagConstraints = new java.awt.GridBagConstraints(); + gridBagConstraints.gridx = 0; + gridBagConstraints.gridy = 2; + gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; + gridBagConstraints.ipadx = 5; + gridBagConstraints.ipady = 5; + gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; + gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 4); + add(mSUDescriptionLBL, gridBagConstraints); + + mSUDescriptionScrollPane.setPreferredSize(new java.awt.Dimension(4, 40)); + + mSUDescriptionTA.setFont(new java.awt.Font("SansSerif", 0, 12)); // NOI18N + mSUDescriptionTA.setMargin(new java.awt.Insets(1, 1, 1, 1)); + mSUDescriptionScrollPane.setViewportView(mSUDescriptionTA); + + gridBagConstraints = new java.awt.GridBagConstraints(); + gridBagConstraints.gridx = 1; + gridBagConstraints.gridy = 2; + gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; + gridBagConstraints.ipadx = 5; + gridBagConstraints.ipady = 5; + gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; + gridBagConstraints.weightx = 1.0; + gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 4); + add(mSUDescriptionScrollPane, gridBagConstraints); + gridBagConstraints = new java.awt.GridBagConstraints(); + gridBagConstraints.gridx = 0; + gridBagConstraints.gridy = 5; + gridBagConstraints.fill = java.awt.GridBagConstraints.VERTICAL; + gridBagConstraints.weighty = 1.0; + add(mFillLBL, gridBagConstraints); + }// //GEN-END:initComponents + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JLabel mFillLBL; + private javax.swing.JLabel mSUDescriptionLBL; + private javax.swing.JScrollPane mSUDescriptionScrollPane; + private javax.swing.JTextArea mSUDescriptionTA; + private javax.swing.JLabel mSUNameLBL; + private javax.swing.JTextField mSUNameTF; + private javax.swing.JLabel mSUTargetLBL; + private javax.swing.JLabel mSUTargetValueLBL; + // End of variables declaration//GEN-END:variables + + private void setDocumentText(Document doc, String text) { + try { + doc.remove(0, doc.getLength()); + doc.insertString(0, text, null); + } catch (BadLocationException ex) { + ex.printStackTrace(); + // ingore + } + } + + private String getDocumentText(Document doc) { + try { + return doc.getText(0, doc.getLength()); + } catch (BadLocationException ex) { + ex.printStackTrace(); + return ""; + } + } + + private void initTargetComponent(Document doc) { + String targetComp = getDocumentText(doc); + this.mSUTargetValueLBL.setText(targetComp); + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/customizer/CustomizerPackage.form b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/customizer/CustomizerPackage.form new file mode 100644 index 000000000..7d688a980 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/customizer/CustomizerPackage.form @@ -0,0 +1,117 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/customizer/CustomizerPackage.java b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/customizer/CustomizerPackage.java new file mode 100644 index 000000000..a99cca3f3 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/customizer/CustomizerPackage.java @@ -0,0 +1,114 @@ +/* + * CustomizerPackage + */ +package net.openesb.component.${artifactId}.project.customizer; + +import javax.swing.JPanel; +import org.openide.util.HelpCtx; + +/** + * Customizer for general project attributes. + * + * @author chikkala + */ +public class CustomizerPackage extends JPanel implements HelpCtx.Provider { + + private SEPluginProjectCustomizerModel uiModel; + + public CustomizerPackage(SEPluginProjectCustomizerModel uiModel) { + this.uiModel = uiModel; + initComponents(); + + mZipFileTF.setDocument(uiModel.getSUZipModel()); + mExcludesTF.setDocument(uiModel.getBuildFilesExcludesModel()); + + uiModel.getJarCompressModel().setMnemonic(mCompressChkBox.getMnemonic()); + mCompressChkBox.setModel(uiModel.getJarCompressModel()); + } + + public HelpCtx getHelpCtx() { + return new HelpCtx(CustomizerPackage.class); + } + + /** + * This method is called from within the constructor to initialize the form. + * WARNING: Do NOT modify this code. The content of this method is always + * regenerated by the Form Editor. + */ + // //GEN-BEGIN:initComponents + private void initComponents() { + java.awt.GridBagConstraints gridBagConstraints; + + mZipFileLBL = new javax.swing.JLabel(); + mZipFileTF = new javax.swing.JTextField(); + mExcludesLBL = new javax.swing.JLabel(); + mExcludesTF = new javax.swing.JTextField(); + mCompressChkBox = new javax.swing.JCheckBox(); + mExcludeMessageLBL = new javax.swing.JLabel(); + + setLayout(new java.awt.GridBagLayout()); + + mZipFileLBL.setLabelFor(mZipFileTF); + org.openide.awt.Mnemonics.setLocalizedText(mZipFileLBL, org.openide.util.NbBundle.getMessage(CustomizerPackage.class, "LBL_config.package.su.zip")); // NOI18N + gridBagConstraints = new java.awt.GridBagConstraints(); + gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; + gridBagConstraints.insets = new java.awt.Insets(0, 0, 12, 12); + add(mZipFileLBL, gridBagConstraints); + + mZipFileTF.setEditable(false); + gridBagConstraints = new java.awt.GridBagConstraints(); + gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; + gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; + gridBagConstraints.weightx = 1.0; + gridBagConstraints.insets = new java.awt.Insets(0, 0, 12, 0); + add(mZipFileTF, gridBagConstraints); + mZipFileTF.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getBundle(CustomizerPackage.class).getString("AD_jTextFieldDistDir")); // NOI18N + + mExcludesLBL.setLabelFor(mExcludesTF); + org.openide.awt.Mnemonics.setLocalizedText(mExcludesLBL, org.openide.util.NbBundle.getMessage(CustomizerPackage.class, "LBL_config.package.build.files.exludes")); // NOI18N + gridBagConstraints = new java.awt.GridBagConstraints(); + gridBagConstraints.gridx = 0; + gridBagConstraints.gridy = 1; + gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; + gridBagConstraints.insets = new java.awt.Insets(0, 0, 0, 12); + add(mExcludesLBL, gridBagConstraints); + gridBagConstraints = new java.awt.GridBagConstraints(); + gridBagConstraints.gridx = 1; + gridBagConstraints.gridy = 1; + gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; + gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; + gridBagConstraints.weightx = 1.0; + add(mExcludesTF, gridBagConstraints); + mExcludesTF.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getBundle(CustomizerPackage.class).getString("AD_jTextFieldExcludes")); // NOI18N + + org.openide.awt.Mnemonics.setLocalizedText(mCompressChkBox, org.openide.util.NbBundle.getMessage(CustomizerPackage.class, "CHKB_config.package.jar.compress")); // NOI18N + gridBagConstraints = new java.awt.GridBagConstraints(); + gridBagConstraints.gridx = 0; + gridBagConstraints.gridy = 3; + gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; + gridBagConstraints.gridheight = java.awt.GridBagConstraints.REMAINDER; + gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; + gridBagConstraints.weighty = 1.0; + add(mCompressChkBox, gridBagConstraints); + mCompressChkBox.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getBundle(CustomizerPackage.class).getString("AD_jCheckBoxCompress")); // NOI18N + + mExcludeMessageLBL.setLabelFor(mExcludesTF); + org.openide.awt.Mnemonics.setLocalizedText(mExcludeMessageLBL, org.openide.util.NbBundle.getBundle(CustomizerPackage.class).getString("LBL_config.package.build.files.exludes.message")); // NOI18N + gridBagConstraints = new java.awt.GridBagConstraints(); + gridBagConstraints.gridx = 1; + gridBagConstraints.gridy = 2; + gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; + gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; + gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; + gridBagConstraints.insets = new java.awt.Insets(0, 0, 6, 0); + add(mExcludeMessageLBL, gridBagConstraints); + }// //GEN-END:initComponents + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JCheckBox mCompressChkBox; + private javax.swing.JLabel mExcludeMessageLBL; + private javax.swing.JLabel mExcludesLBL; + private javax.swing.JTextField mExcludesTF; + private javax.swing.JLabel mZipFileLBL; + private javax.swing.JTextField mZipFileTF; + // End of variables declaration//GEN-END:variables +} diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/customizer/SEPluginProjectCustomizerModel.java b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/customizer/SEPluginProjectCustomizerModel.java new file mode 100644 index 000000000..0da2f2a5a --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/customizer/SEPluginProjectCustomizerModel.java @@ -0,0 +1,125 @@ +/* + * SEPluginProjectCustomizerModel.java + * + */ +package net.openesb.component.${artifactId}.project.customizer; + +import java.io.IOException; +import javax.swing.ButtonModel; +import javax.swing.text.Document; +import org.netbeans.api.project.Project; +import org.netbeans.api.project.ProjectManager; +import net.openesb.component.${artifactId}.project.SEPluginProjectProperties; +import org.netbeans.spi.project.support.ant.AntProjectHelper; +import org.netbeans.spi.project.support.ant.EditableProperties; +import org.netbeans.spi.project.support.ant.PropertyEvaluator; +import org.netbeans.spi.project.support.ant.ReferenceHelper; +import org.netbeans.spi.project.support.ant.ui.StoreGroup; +import org.openide.ErrorManager; +import org.openide.filesystems.FileObject; +import org.openide.util.Mutex; +import org.openide.util.MutexException; + +/** + * + * @author chikkala + */ +public class SEPluginProjectCustomizerModel { + + private Project mProject; + private AntProjectHelper mAntPrjHelper; + private ReferenceHelper mRefHelper; + private StoreGroup mPrjPropsStore; + private Document mSUTargetModel; + private Document mSUNameModel; + private Document mSUDescModel; + private Document mSUZipModel; + private ButtonModel mSUZipCompressModel; + private Document mBuildFilesExcludesModel; + + /** + * Creates a new instance of Customizer UI Model and initializes it + */ + public SEPluginProjectCustomizerModel(Project project, AntProjectHelper antProjectHelper, ReferenceHelper refHelper) { + this.mProject = project; + this.mAntPrjHelper = antProjectHelper; + this.mRefHelper = refHelper; + this.mPrjPropsStore = new StoreGroup(); + init(); + } + + public Document getSUTargetModel() { + return this.mSUTargetModel; + } + + public Document getSUNameModel() { + return this.mSUNameModel; + } + + public Document getSUDescriptionModel() { + return this.mSUDescModel; + } + + public Document getSUZipModel() { + return this.mSUZipModel; + } + + public ButtonModel getJarCompressModel() { + return this.mSUZipCompressModel; + } + + public Document getBuildFilesExcludesModel() { + return this.mBuildFilesExcludesModel; + } + + /** + * Initializes the visual models + */ + private void init() { + // initialize visual models from project properties + PropertyEvaluator evaluator = this.mAntPrjHelper.getStandardPropertyEvaluator(); + // cutomizer-general + this.mSUTargetModel = this.mPrjPropsStore.createStringDocument(evaluator, SEPluginProjectProperties.JBI_SU_TARGET_NAME); + this.mSUNameModel = this.mPrjPropsStore.createStringDocument(evaluator, SEPluginProjectProperties.JBI_SU_NAME); + this.mSUDescModel = this.mPrjPropsStore.createStringDocument(evaluator, SEPluginProjectProperties.JBI_SU_DESCRIPTION); + // customizer-package + this.mSUZipModel = this.mPrjPropsStore.createStringDocument(evaluator, SEPluginProjectProperties.JBI_SU_ZIP); + this.mSUZipCompressModel = this.mPrjPropsStore.createToggleButtonModel(evaluator, SEPluginProjectProperties.JAR_COMPRESS); + this.mBuildFilesExcludesModel = this.mPrjPropsStore.createStringDocument(evaluator, SEPluginProjectProperties.BUILD_FILES_EXCLUDES); + } + + /** + * Save visual models to project properties and other metadata + */ + public void save() { + + try { + // Store properties + @SuppressWarnings("unchecked") + Boolean result = (Boolean) ProjectManager.mutex().writeAccess(new Mutex.ExceptionAction() { + final FileObject projectDir = mAntPrjHelper.getProjectDirectory(); + + public Object run() throws IOException { + //TODO: regenreate any project build script and project metadata if required. + // store project properties. + storeProperties(); + return Boolean.TRUE; + } + }); + // and save project if required. + if (result == Boolean.TRUE) { + ProjectManager.getDefault().saveProject(mProject); + } + } catch (MutexException e) { + ErrorManager.getDefault().notify((IOException) e.getException()); + } catch (IOException ex) { + ErrorManager.getDefault().notify(ex); + } + + } + + private void storeProperties() throws IOException { + EditableProperties projectProperties = mAntPrjHelper.getProperties(AntProjectHelper.PROJECT_PROPERTIES_PATH); + this.mPrjPropsStore.store(projectProperties); + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/customizer/SEPluginProjectCustomizerProvider.java b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/customizer/SEPluginProjectCustomizerProvider.java new file mode 100644 index 000000000..124e39f28 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/customizer/SEPluginProjectCustomizerProvider.java @@ -0,0 +1,230 @@ +/* + * SEPluginProjectCustomizerProvider.java + * + */ +package net.openesb.component.${artifactId}.project.customizer; + +import java.awt.Dialog; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.text.MessageFormat; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.ResourceBundle; +import javax.swing.JComponent; +import javax.swing.JPanel; +import org.netbeans.api.project.Project; +import org.netbeans.api.project.ProjectUtils; +import org.netbeans.spi.project.support.ant.AntProjectHelper; +import org.netbeans.spi.project.support.ant.ReferenceHelper; +import org.netbeans.spi.project.ui.CustomizerProvider; +import org.netbeans.spi.project.ui.support.ProjectCustomizer; +import org.openide.util.NbBundle; + +/** + * + * @author chikkala + */ +public class SEPluginProjectCustomizerProvider implements CustomizerProvider { + + // Option indexes + private static final int OPTION_OK = 0; + private static final int OPTION_CANCEL = OPTION_OK + 1; + // Option command names + private static final String COMMAND_OK = "OK"; // NOI18N + private static final String COMMAND_CANCEL = "CANCEL"; // NOI18N + // Categories + private static final String GENERAL = "General"; // NOI18N + private static final String BUILD_CATEGORIES = "Build"; // NOI18N + private static final String COMPILE = "Compile"; // NOI18N + private static final String PACKAGE = "Package"; // NOI18N + private Project project; + private AntProjectHelper antProjectHelper; + private ReferenceHelper refHelper; + private SEPluginProjectCustomizerModel uiModel; + private List categories; + private ProjectCustomizer.CategoryComponentProvider panelProvider; + private static Map project2Dialog = new HashMap(); + + public SEPluginProjectCustomizerProvider(Project project, AntProjectHelper antProjectHelper, ReferenceHelper refHelper) { + this.project = project; + this.refHelper = refHelper; + this.antProjectHelper = antProjectHelper; + } + + public void showCustomizer() { + showCustomizer(null); + } + + public void showCustomizer(String preselectedCategory) { + showCustomizer(preselectedCategory, null); + } + + public void showCustomizer(String preselectedCategory, String preselectedSubCategory) { + + Dialog dialog = project2Dialog.get(project); + if (dialog != null) { + dialog.setVisible(true); + return; + } else { + SEPluginProjectCustomizerModel model = new SEPluginProjectCustomizerModel(project, antProjectHelper, refHelper); + init(model); + + OptionListener listener = new OptionListener(project, uiModel); + + if (preselectedCategory != null && preselectedSubCategory != null) { + for (ProjectCustomizer.Category category : categories) { + if (preselectedCategory.equals(category.getName())) { + JComponent component = panelProvider.create(category); + if (component instanceof SubCategoryProvider) { + ((SubCategoryProvider) component).showSubCategory(preselectedSubCategory); + } + break; + } + } + } + dialog = ProjectCustomizer.createCustomizerDialog( + categories.toArray(new ProjectCustomizer.Category[categories.size()]), + panelProvider, preselectedCategory, listener, null); + dialog.addWindowListener(listener); + dialog.setTitle(MessageFormat.format(NbBundle.getMessage(SEPluginProjectCustomizerProvider.class, "LBL_Customizer_Title"), new Object[]{ProjectUtils.getInformation(project).getDisplayName()})); + + project2Dialog.put(project, dialog); + dialog.setVisible(true); + } + } + + private void init(SEPluginProjectCustomizerModel uiModel) { + + this.uiModel = uiModel; + categories = new ArrayList(); + panelProvider = new PanelProvider(createCategoriesMap()); + } + + /** + * Getter for categories + */ + protected List getCategories() { + return categories; + } + + /** + * This api is called when showCustomizer is invoked and if customizer + * provider is not fully initialized. The default implementation creates + * Project Reference and XML Catalog Categories. Subclasses can override + * this and may or may not call super depending upon, the categories are + * desired in project customizer. + */ + protected Map createCategoriesMap() { + + ResourceBundle bundle = NbBundle.getBundle(SEPluginProjectCustomizerProvider.class); + + ProjectCustomizer.Category generalNode = ProjectCustomizer.Category.create( + GENERAL, + bundle.getString("LBL_Config_General"), // NOI18N + null, + (ProjectCustomizer.Category[]) null); + ProjectCustomizer.Category packageNode = ProjectCustomizer.Category.create( + PACKAGE, + bundle.getString("LBL_Config_Package"), // NOI18N + null, + (ProjectCustomizer.Category[]) null); + /* //TODO: add new category if required + ProjectCustomizer.Category compileNode = ProjectCustomizer.Category.create( + COMPILE, + bundle.getString( "LBL_Config_Compile" ), // NOI18N + null, + (ProjectCustomizer.Category[])null); + */ + ProjectCustomizer.Category[] buildCategories = new ProjectCustomizer.Category[]{packageNode}; + // TODO: add other categories to build if required. + // buildCategories = new ProjectCustomizer.Category[] {compileNode, packageNode }; + ProjectCustomizer.Category buildCategoriesNode = ProjectCustomizer.Category.create( + BUILD_CATEGORIES, + bundle.getString("LBL_Config_BuildCategories"), // NOI18N + null, + buildCategories); + + getCategories().add(generalNode); + getCategories().add(buildCategoriesNode); + + Map panels = + new HashMap(); + + panels.put(generalNode, new CustomizerGeneral(uiModel)); + panels.put(packageNode, new CustomizerPackage(uiModel)); + // panels.put(compileNode, new CustomizerCompile(uiModel)); + + return panels; + } + + /** + * CategoryComponentProvider provider class. It stores categories and there + * corresponding UI in a map. An instance of PanelProvider is stored in + * CustomizerProviderImpl instance + */ + private static class PanelProvider implements ProjectCustomizer.CategoryComponentProvider { + + private JPanel EMPTY_PANEL = new JPanel(); + private Map panels; + + PanelProvider(Map panels) { + this.panels = panels; + } + + public JComponent create(ProjectCustomizer.Category category) { + JComponent panel = panels.get(category); + return panel == null ? EMPTY_PANEL : panel; + } + } + + /** + * Listens to the actions on the Customizer's option buttons + */ + private class OptionListener extends WindowAdapter implements ActionListener { + + private Project project; + private SEPluginProjectCustomizerModel uiModel; + + OptionListener(Project project, SEPluginProjectCustomizerModel uiModel) { + this.project = project; + this.uiModel = uiModel; + } + + // Listening to OK button ---------------------------------------------- + public void actionPerformed(ActionEvent e) { + // Store the properties into project + this.uiModel.save(); + // Close & dispose the the dialog + Dialog dialog = project2Dialog.get(project); + if (dialog != null) { + dialog.setVisible(false); + dialog.dispose(); + } + } + + // Listening to window events ------------------------------------------ + public void windowClosed(WindowEvent e) { + project2Dialog.remove(project); + } + + public void windowClosing(WindowEvent e) { + //Dispose the dialog otherwsie the {@link WindowAdapter#windowClosed} + //may not be called + Dialog dialog = project2Dialog.get(project); + if (dialog != null) { + dialog.setVisible(false); + dialog.dispose(); + } + } + } + + public static interface SubCategoryProvider { + + public void showSubCategory(String name); + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/node/Bundle.properties b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/node/Bundle.properties new file mode 100644 index 000000000..aacefb0e0 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/node/Bundle.properties @@ -0,0 +1,16 @@ +LBL_Fix_Broken_Links_Action=Resolve Reference Problems... + +#Actions +LBL_CleanAction_Name=Clean Project +LBL_BuildAction_Name=Build Project +LBL_RebuildAction_Name=Clean and Build Project +LBL_RunAction_Name=Run Project +LBL_DebugAction_Name=Debug Project +LBL_JavadocAction_Name=Generate Javadoc for Project +LBL_TestAction_Name=Test Component +LBL_Properties_Action=Properties +LBL_AddProject_Action=Add Project... +LBL_AddLibrary_Action=Add Library... +LBL_AddFolder_Action=Add JAR/Folder... + + diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/node/SEPluginProjectNode.java b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/node/SEPluginProjectNode.java new file mode 100644 index 000000000..f756d9081 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/node/SEPluginProjectNode.java @@ -0,0 +1,350 @@ +/* + * SEPluginProjectNode.java + * + */ +package net.openesb.component.${artifactId}.project.node; + +import java.awt.event.ActionEvent; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.ResourceBundle; +import javax.swing.AbstractAction; +import javax.swing.Action; +import javax.swing.JSeparator; +import org.netbeans.api.project.Project; +import org.netbeans.api.project.ProjectUtils; +import net.openesb.component.${artifactId}.project.SEPluginProjectProperties; +import org.netbeans.spi.java.project.support.ui.BrokenReferencesSupport; +import org.netbeans.spi.project.ActionProvider; +import org.netbeans.spi.project.SubprojectProvider; +import org.netbeans.spi.project.support.ant.AntProjectHelper; +import org.netbeans.spi.project.support.ant.PropertyEvaluator; +import org.netbeans.spi.project.support.ant.ReferenceHelper; +import org.netbeans.spi.project.ui.support.CommonProjectActions; +import org.netbeans.spi.project.ui.support.DefaultProjectOperations; +import org.netbeans.spi.project.ui.support.ProjectSensitiveActions; +import org.openide.actions.FindAction; +import org.openide.filesystems.FileAttributeEvent; +import org.openide.filesystems.FileChangeListener; +import org.openide.filesystems.FileEvent; +import org.openide.filesystems.FileObject; +import org.openide.filesystems.FileRenameEvent; +import org.openide.loaders.DataObject; +import org.openide.nodes.AbstractNode; +import org.openide.nodes.Children; +import org.openide.nodes.FilterNode; +import org.openide.nodes.Node; +import org.openide.util.HelpCtx; +import org.openide.util.Lookup; +import org.openide.util.NbBundle; +import org.openide.util.actions.SystemAction; +import org.openide.util.lookup.Lookups; + +/** + * + * @author chikkala + */ +public class SEPluginProjectNode extends AbstractNode { + + private Project project; + private AntProjectHelper helper; + private PropertyEvaluator evaluator; + private SubprojectProvider spp; + private ReferenceHelper resolver; + private Action brokenLinksAction; + private boolean broken; + + public SEPluginProjectNode(Project project, AntProjectHelper helper, PropertyEvaluator evaluator, SubprojectProvider spp, ReferenceHelper resolver) { + super(new SEPluginProjectNodeChildren(project, helper, evaluator), Lookups.singleton(project)); + setIconBaseWithExtension(SEPluginProjectProperties.SE_PLUGIN_PROJECT_ICON_PATH); + super.setName(ProjectUtils.getInformation(project).getDisplayName()); + + this.project = project; + assert project != null; + this.helper = helper; + assert helper != null; + this.evaluator = evaluator; + assert evaluator != null; + this.spp = spp; + assert spp != null; + this.resolver = resolver; + + if (hasBrokenLinks(helper, resolver)) { + broken = true; + brokenLinksAction = new BrokenLinksAction(); + } + } + + @Override + public HelpCtx getHelpCtx() { + return HelpCtx.DEFAULT_HELP; + // TODO: new HelpCtx("se_deploy_plugin_project_about"); // NOI18N + } + + @Override + public Action[] getActions(boolean context) { + if (context) { + return super.getActions(true); + } else { + return getAdditionalActions(); + } + } + + @Override + public boolean canRename() { + return true; + } + + @Override + public void setName(String s) { + DefaultProjectOperations.performDefaultRenameOperation(project, s); + } + + private String[] getBreakableProperties() { + String[] breakableProps = new String[0]; + return breakableProps; + } + + public boolean hasBrokenLinks(AntProjectHelper helper, ReferenceHelper resolver) { + return BrokenReferencesSupport.isBroken(helper, resolver, getBreakableProperties(), new String[]{SEPluginProjectProperties.DEFAULT_PLATFORM}); + } + + private Action[] getAdditionalActions() { + + ResourceBundle bundle = NbBundle.getBundle(SEPluginProjectNode.class); + + List actions = new ArrayList(); + + actions.add(CommonProjectActions.newFileAction()); + actions.add(null); + actions.add(ProjectSensitiveActions.projectCommandAction(ActionProvider.COMMAND_BUILD, bundle.getString("LBL_BuildAction_Name"), null)); // NOI18N + actions.add(ProjectSensitiveActions.projectCommandAction(ActionProvider.COMMAND_REBUILD, bundle.getString("LBL_RebuildAction_Name"), null)); // NOI18N + actions.add(ProjectSensitiveActions.projectCommandAction(ActionProvider.COMMAND_CLEAN, bundle.getString("LBL_CleanAction_Name"), null)); // NOI18N + //TODO: add additional plugin specific actions + actions.add(null); + actions.add(CommonProjectActions.setAsMainProjectAction()); + actions.add(CommonProjectActions.openSubprojectsAction()); + actions.add(CommonProjectActions.closeProjectAction()); + actions.add(null); + actions.add(CommonProjectActions.renameProjectAction()); + actions.add(CommonProjectActions.moveProjectAction()); + actions.add(CommonProjectActions.copyProjectAction()); + actions.add(CommonProjectActions.deleteProjectAction()); + actions.add(null); + actions.add(SystemAction.get(FindAction.class)); + // add actions from layer filesystem configuration + addFromLayers(actions, "Projects/Actions"); //NOI18N + actions.add(null); + actions.add(brokenLinksAction); + actions.add(CommonProjectActions.customizeProjectAction()); + + return actions.toArray(new Action[actions.size()]); + } + + private void addFromLayers(List actions, String path) { + Lookup look = Lookups.forPath(path); + for (Object next : look.lookupAll(Object.class)) { + if (next instanceof Action) { + actions.add((Action) next); + } else if (next instanceof JSeparator) { + actions.add(null); + } + } + } + + /** + * This action is created only when project has broken references. Once + * these are resolved the action is disabled. + */ + private class BrokenLinksAction extends AbstractAction implements PropertyChangeListener { + + public BrokenLinksAction() { + evaluator.addPropertyChangeListener(this); + putValue(Action.NAME, NbBundle.getMessage(SEPluginProjectNode.class, "LBL_Fix_Broken_Links_Action")); + } + + public void actionPerformed(ActionEvent e) { + /* + BrokenReferencesSupport.showCustomizer(helper, resolver, BREAKABLE_PROPERTIES, new String[]{SEPluginProjectProperties.DEFAULT_PLATFORM}); + if (!hasBrokenLinks(helper, resolver)) { + disable(); + } + */ + // do nothing... + } + + public void propertyChange(PropertyChangeEvent evt) { + if (!broken) { + disable(); + return; + } + broken = hasBrokenLinks(helper, resolver); + if (!broken) { + disable(); + } + } + + private void disable() { + broken = false; + setEnabled(false); + evaluator.removePropertyChangeListener(this); + fireIconChange(); + fireOpenedIconChange(); + } + } + + private static final class SEPluginProjectNodeChildren extends Children.Keys implements FileChangeListener { + + private static final String KEY_SU_JBI_XML = "SU_JBI_XML_Key"; // NOI18N + private static final String KEY_SOURCE_DIR = "SourceDirKey"; // NOI18N + private Project project; + private AntProjectHelper helper; + private PropertyEvaluator evaluator; + + public SEPluginProjectNodeChildren(Project project, AntProjectHelper helper, PropertyEvaluator evaluator) { + this.project = project; + assert project != null; + this.helper = helper; + assert helper != null; + this.evaluator = evaluator; + assert evaluator != null; + } + + private FileObject getSourceFolder() { + String srcDir = helper.getStandardPropertyEvaluator().getProperty(SEPluginProjectProperties.SRC_DIR); // NOI18N + return helper.resolveFileObject(srcDir); + } + + private FileObject getJbiXml(FileObject srcDirFO) { + FileObject jbiXmlFO = null; + if (srcDirFO == null) { + return null; + } + jbiXmlFO = srcDirFO.getFileObject(SEPluginProjectProperties.SU_JBI_XML_PATH); + if (jbiXmlFO == null) { + // create default jbi.xml + try { + jbiXmlFO = SEPluginProjectProperties.createDefaultSUDescriptor(srcDirFO); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + return jbiXmlFO; + } + + @Override + @SuppressWarnings("unchecked") + protected void addNotify() { + super.addNotify(); + FileObject projectDirFO = project.getProjectDirectory(); + if (projectDirFO != null) { + projectDirFO.addFileChangeListener(this); + } + FileObject srcDirFO = getSourceFolder(); + if (srcDirFO != null) { + srcDirFO.addFileChangeListener(this); + } + setKeys(getKeys()); + } + + @Override + @SuppressWarnings("unchecked") + protected void removeNotify() { + + setKeys(Collections.emptySet()); + + FileObject projectDirFO = project.getProjectDirectory(); + if (projectDirFO != null) { + projectDirFO.removeFileChangeListener(this); + } + FileObject srcDirFO = getSourceFolder(); + if (srcDirFO != null) { + srcDirFO.removeFileChangeListener(this); + } + + super.removeNotify(); + } + + private Collection getKeys() { + //when the project is deleted externally do not try to create children, the source groups + //are not valid + if (project.getProjectDirectory() == null || !project.getProjectDirectory().isValid()) { + return Collections.emptyList(); + } + + List result = new ArrayList(); + + FileObject srcDirFO = null; + FileObject jbiXmlFO = null; + + srcDirFO = getSourceFolder(); + if (srcDirFO != null) { + jbiXmlFO = getJbiXml(srcDirFO); + } + if (jbiXmlFO != null) { + result.add(KEY_SU_JBI_XML); + } + + if (srcDirFO != null) { + result.add(KEY_SOURCE_DIR); + } + + //TODO: add any other top level node keys here. + return result; + } + + protected Node createNode(FileObject fo) { + try { + DataObject dataObj = DataObject.find(fo); + return new FilterNode(dataObj.getNodeDelegate()); + } catch (Exception ex) { + return null; + } + } + + protected Node[] createNodes(Object key) { + List newNodes = new ArrayList(); + if (KEY_SU_JBI_XML.equals(key)) { + FileObject srcDirFO = getSourceFolder(); + FileObject jbiXmlFO = getJbiXml(srcDirFO); + newNodes.add(createNode(jbiXmlFO)); + } else if (KEY_SOURCE_DIR.equals(key)) { + FileObject srcDirFO = getSourceFolder(); + newNodes.add(createNode(srcDirFO)); + } + return newNodes.toArray(new Node[newNodes.size()]); + } + + @SuppressWarnings("unchecked") + public void fileFolderCreated(FileEvent evt) { + setKeys(getKeys()); + } + + @SuppressWarnings("unchecked") + public void fileDataCreated(FileEvent evt) { + setKeys(getKeys()); + } + + public void fileChanged(FileEvent evt) { + + } + + @SuppressWarnings("unchecked") + public void fileDeleted(FileEvent evt) { + setKeys(getKeys()); + } + + @SuppressWarnings("unchecked") + public void fileRenamed(FileRenameEvent evt) { + setKeys(getKeys()); + } + + public void fileAttributeChanged(FileAttributeEvent evt) { + + } + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/resources/build-impl.xsl b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/resources/build-impl.xsl new file mode 100644 index 000000000..9adad65fd --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/resources/build-impl.xsl @@ -0,0 +1,208 @@ + + + + + + + + + + + + + + + default + .. + + + jar + Build whole project. + + + + ====================== + INITIALIZATION SECTION + ====================== + + + + Empty placeholder for easier customization. + You can override this target in the ../build.xml file. + + + + -pre-init + + + + + -pre-init,-init-private + + + + + -pre-init,-init-private,-init-user + + + + + -pre-init,-init-private,-init-user,-init-project + + + + + Empty placeholder for easier customization. + You can override this target in the ../build.xml file. + + + + -pre-init,-init-private,-init-user,-init-project,-do-init + Must set src.dir + Must set build.dir + Must set jbi.su.name + Must set jbi.su.zip + + + + -pre-init,-init-private,-init-user,-init-project,-do-init,-post-init,-init-check + + + + =================== + COMPILATION SECTION + =================== + + + + init + + + + + Empty placeholder for easier customization. + You can override this target in the ../build.xml file. + + + + init,-pre-pre-compile,-pre-compile + + + + + + + + + + Empty placeholder for easier customization. + You can override this target in the ../build.xml file. + + + + init,-pre-pre-compile,-pre-compile,-do-compile,-post-compile + Compile project. + + + + ==================== + JAR BUILDING SECTION + ==================== + + + + init + + + + + Empty placeholder for easier customization. + You can override this target in the ../build.xml file. + + + + init,compile,-pre-pre-jar,-pre-jar + + + + + Empty placeholder for easier customization. + You can override this target in the ../build.xml file. + + + + init,compile,-pre-jar,-do-jar,-post-jar + Build JAR. + + + + init,jar + + + + init,jar + + + + =============== + CLEANUP SECTION + =============== + + + + init + + + + + + Empty placeholder for easier customization. + You can override this target in the ../build.xml file. + + + + init,-do-clean,-post-clean + Clean build products. + + + + + + + diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/resources/build.xsl b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/resources/build.xsl new file mode 100644 index 000000000..288568af6 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/resources/build.xsl @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + You may freely edit this file. See commented blocks below for + some examples of how to customize the build. + (If you delete it and reopen the project it will be recreated.) + + + + + + + default + . + Builds, tests, and runs the project + . + + + + + + + + + + For list of available properties check the imported + nbproject/build-impl.xml file. + + + Another way to customize the build is by overriding existing main targets. + The targets of interest are: + + -init-macrodef-javac: defines macro for javac compilation + -init-macrodef-junit: defines macro for junit execution + -init-macrodef-debug: defines macro for class debugging + -init-macrodef-java: defines macro for class execution + -do-jar-with-manifest: JAR building (if you are using a manifest) + -do-jar-without-manifest: JAR building (if you are not using a manifest) + run: execution of project + -javadoc-build: Javadoc generation + test-report: JUnit report generation + + An example of overriding the target for project execution could look like this: + + + + + + + + Notice that the overridden target depends on the jar target and not only on + the compile target as the regular run target does. Again, for a list of available + properties which you can use, check the target you are overriding in the + nbproject/build-impl.xml file. + + ]]> + + + + + + + diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/resources/projectIcon.png b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/resources/projectIcon.png new file mode 100644 index 000000000..efb923b40 Binary files /dev/null and b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/resources/projectIcon.png differ diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/resources/se-jbi-module.xml b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/resources/se-jbi-module.xml new file mode 100644 index 000000000..01e9ab043 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/resources/se-jbi-module.xml @@ -0,0 +1,3 @@ + + + diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/wizard/Bundle.properties b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/wizard/Bundle.properties new file mode 100644 index 000000000..56d0f658f --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/wizard/Bundle.properties @@ -0,0 +1,9 @@ +LBL_CreateProjectStep=Name and Location + +LBL_ProjectName=Project &Name: + +LBL_ProjectLocation=Project &Location: + +LBL_ProjectFolder=Project &Folder: + +LBL_Browse=Br&owse... diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/wizard/SEPluginProjectDescription.html b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/wizard/SEPluginProjectDescription.html new file mode 100644 index 000000000..21e9e6bdc --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/wizard/SEPluginProjectDescription.html @@ -0,0 +1,8 @@ + + + + + + Service Engine deploment plugin project + + diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/wizard/SEPluginProjectWizardIterator.java b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/wizard/SEPluginProjectWizardIterator.java new file mode 100644 index 000000000..5da0b6429 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/wizard/SEPluginProjectWizardIterator.java @@ -0,0 +1,238 @@ +/* + * SEPluginProjectWizardIterator.java + */ +package net.openesb.component.${artifactId}.project.wizard; + +import java.awt.Component; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.text.MessageFormat; +import java.util.HashMap; +import java.util.LinkedHashSet; +import java.util.Map; +import java.util.NoSuchElementException; +import java.util.Set; +import javax.swing.JComponent; +import javax.swing.event.ChangeListener; +import net.openesb.component.${artifactId}.project.SEPluginProjectGenerator; +import net.openesb.component.${artifactId}.project.SEPluginProjectProperties; +import org.netbeans.spi.project.support.ant.AntProjectHelper; +import org.netbeans.spi.project.ui.support.ProjectChooser; +import org.netbeans.spi.project.ui.templates.support.Templates; +import org.openide.WizardDescriptor; +import org.openide.filesystems.FileLock; +import org.openide.filesystems.FileObject; +import org.openide.filesystems.FileUtil; +import org.openide.filesystems.Repository; +import org.openide.loaders.DataFolder; +import org.openide.loaders.DataObject; +import org.openide.util.NbBundle; + +public class SEPluginProjectWizardIterator implements WizardDescriptor.InstantiatingIterator { + + public final static String PROJECT_DIR = "projdir"; + public final static String PROJECT_NAME = "name"; + public final static String DEF_PROJECT_NAME_VALUE = "JBIModule"; + private int index; + private WizardDescriptor.Panel[] panels; + private WizardDescriptor wiz; + + public SEPluginProjectWizardIterator() { + } + + public static SEPluginProjectWizardIterator createIterator() { + return new SEPluginProjectWizardIterator(); + } + + private WizardDescriptor.Panel[] createPanels() { + return new WizardDescriptor.Panel[]{ + new SEPluginProjectWizardPanel() + }; + } + + private String[] createSteps() { + return new String[]{ + NbBundle.getMessage(SEPluginProjectWizardIterator.class, "LBL_CreateProjectStep") + }; + } + + public Set instantiate(/*ProgressHandle handle*/) throws IOException { + + Set resultSet = createSEDeployPluginProject(); + // save the current projects folder + File dirF = FileUtil.normalizeFile((File) wiz.getProperty(PROJECT_DIR)); + File parent = dirF.getParentFile(); + if (parent != null && parent.exists()) { + ProjectChooser.setProjectsFolder(parent); + } + return resultSet; + } + + public void initialize(WizardDescriptor wiz) { + this.wiz = wiz; + + try { + FileObject templateFO = Templates.getTemplate(wiz); + DataObject templateDO = DataObject.find(templateFO); + this.wiz.putProperty(PROJECT_NAME, templateDO.getName()); + } catch (Exception ex) { + this.wiz.putProperty(PROJECT_NAME, DEF_PROJECT_NAME_VALUE); + } + + index = 0; + panels = createPanels(); + // Make sure list of steps is accurate. + String[] steps = createSteps(); + for (int i = 0; i < panels.length; i++) { + Component c = panels[i].getComponent(); + if (steps[i] == null) { + // Default step name to component name of panel. + // Mainly useful for getting the name of the target + // chooser to appear in the list of steps. + steps[i] = c.getName(); + } + if (c instanceof JComponent) { // assume Swing components + JComponent jc = (JComponent) c; + // Step #. + jc.putClientProperty("WizardPanel_contentSelectedIndex", new Integer(i)); + // Step name (actually the whole list for reference). + jc.putClientProperty("WizardPanel_contentData", steps); + } + } + } + + public void uninitialize(WizardDescriptor wiz) { + this.wiz.putProperty(PROJECT_DIR, null); + this.wiz.putProperty(PROJECT_NAME, null); + this.wiz = null; + panels = null; + } + + public String name() { + return MessageFormat.format("{0} of {1}", + new Object[]{new Integer(index + 1), new Integer(panels.length)}); + } + + public boolean hasNext() { + return index < panels.length - 1; + } + + public boolean hasPrevious() { + return index > 0; + } + + public void nextPanel() { + if (!hasNext()) { + throw new NoSuchElementException(); + } + index++; + } + + public void previousPanel() { + if (!hasPrevious()) { + throw new NoSuchElementException(); + } + index--; + } + + public WizardDescriptor.Panel current() { + return panels[index]; + } + + // If nothing unusual changes in the middle of the wizard, simply: + public final void addChangeListener(ChangeListener l) { + } + + public final void removeChangeListener(ChangeListener l) { + } + + protected Set createSEDeployPluginProject() throws IOException { + + Set resultSet = new LinkedHashSet(); + + File prjDirFile = FileUtil.normalizeFile((File) wiz.getProperty(PROJECT_DIR)); + String prjName = (String) wiz.getProperty(PROJECT_NAME); + + SEPluginProjectGenerator prjGenerator = new SEPluginProjectGenerator(); + AntProjectHelper h = prjGenerator.createProject(prjDirFile, prjName); + + FileObject projectDirFO = h.getProjectDirectory(); + resultSet.add(projectDirFO); + + Set defArtifacts = createProjectSpecificArtifacts(projectDirFO); + resultSet.addAll(defArtifacts); + + return resultSet; + } + + private FileObject copyResource(FileObject dirFO, String name, String resourcePath) throws IOException { + FileObject dataFO = null; + FileLock outLock = null; + OutputStream outS = null; + InputStream inS = null; + + try { + inS = this.getClass().getResourceAsStream(resourcePath); + dataFO = FileUtil.createData(dirFO, name); + outLock = dataFO.lock(); + outS = dataFO.getOutputStream(outLock); + FileUtil.copy(inS, outS); + } catch (Exception ex) { + ex.printStackTrace(); + } finally { + if (inS != null) { + try { + inS.close(); + } catch (Exception ex) { + //ingore + } + } + if (outS != null) { + try { + outS.close(); + } catch (Exception ex) { + //ingore + } + } + if (outLock != null) { + outLock.releaseLock(); + } + } + return dataFO; + } + + protected Set createProjectSpecificArtifacts(FileObject projectDirFO) throws IOException { + Set resultSet = new LinkedHashSet(); + //TODO: create any default service unit artifacts needed. + try { + + FileObject srcDirFO = projectDirFO.getFileObject(SEPluginProjectProperties.SRC_DIR_VALUE); + resultSet.add(srcDirFO); + + // create service unit jbi descriptor + FileObject metaInfDirFO = FileUtil.createFolder(srcDirFO, "META-INF"); + FileObject jbiXmlFO = copyResource(metaInfDirFO, "jbi.xml", "resources/jbi.xml"); + resultSet.add(jbiXmlFO); + + // create any service unit artifacts such as wsdl files and configuration files + + // list of su artifacts to be created from the resources directory + String[] suArtifacts = {"xsltmap.properties","goodbye.xsl","hello.xsl","Greetings.wsdl"}; + + for (String suArtifact : suArtifacts) { + FileObject suArtifactFO = copyResource(srcDirFO, suArtifact, "resources/" + suArtifact); + resultSet.add(suArtifactFO); + } + + //TODO: add any addtional default service unit artifacts here. + // FileObject suArtifactFO = copyResource(srcDirFO, "su-artifact.xml", "resources/su-artifact.xml"); + // resultSet.add(suArtifactFO); + + } catch (Exception ex) { + ex.printStackTrace(); + } + return resultSet; + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/wizard/SEPluginProjectWizardPanel.java b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/wizard/SEPluginProjectWizardPanel.java new file mode 100644 index 000000000..b742f7e67 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/wizard/SEPluginProjectWizardPanel.java @@ -0,0 +1,93 @@ +/* + * SEPluginProjectWizardPanel.java + */ +package net.openesb.component.${artifactId}.project.wizard; + +import java.awt.Component; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Set; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import org.openide.WizardDescriptor; +import org.openide.WizardValidationException; +import org.openide.util.HelpCtx; +import org.openide.util.NbBundle; + +/** + * Panel just asking for basic info. + */ +public class SEPluginProjectWizardPanel implements WizardDescriptor.Panel, + WizardDescriptor.ValidatingPanel, WizardDescriptor.FinishablePanel { + + private WizardDescriptor wizardDescriptor; + private SEPluginProjectWizardPanelVisual component; + + /** + * Creates a new instance of templateWizardPanel + */ + public SEPluginProjectWizardPanel() { + } + + public Component getComponent() { + if (component == null) { + component = new SEPluginProjectWizardPanelVisual(this); + component.setName(NbBundle.getMessage(SEPluginProjectWizardPanel.class, "LBL_CreateProjectStep")); + } + return component; + } + + public HelpCtx getHelp() { + return new HelpCtx(SEPluginProjectWizardPanel.class); + } + + public boolean isValid() { + getComponent(); + return component.valid(wizardDescriptor); + } + private final Set/**/ listeners = new HashSet(1); // or can use ChangeSupport in NB 6.0 + + @SuppressWarnings("unchecked") + public final void addChangeListener(ChangeListener l) { + synchronized (listeners) { + listeners.add(l); + } + } + + public final void removeChangeListener(ChangeListener l) { + synchronized (listeners) { + listeners.remove(l); + } + } + + @SuppressWarnings("unchecked") + protected final void fireChangeEvent() { + Iterator it; + synchronized (listeners) { + it = new HashSet(listeners).iterator(); + } + ChangeEvent ev = new ChangeEvent(this); + while (it.hasNext()) { + ((ChangeListener) it.next()).stateChanged(ev); + } + } + + public void readSettings(Object settings) { + wizardDescriptor = (WizardDescriptor) settings; + component.read(wizardDescriptor); + } + + public void storeSettings(Object settings) { + WizardDescriptor d = (WizardDescriptor) settings; + component.store(d); + } + + public boolean isFinishPanel() { + return true; + } + + public void validate() throws WizardValidationException { + getComponent(); + component.validate(wizardDescriptor); + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/wizard/SEPluginProjectWizardPanelVisual.form b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/wizard/SEPluginProjectWizardPanelVisual.form new file mode 100644 index 000000000..b3238405d --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/wizard/SEPluginProjectWizardPanelVisual.form @@ -0,0 +1,120 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/wizard/SEPluginProjectWizardPanelVisual.java b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/wizard/SEPluginProjectWizardPanelVisual.java new file mode 100644 index 000000000..d16d84ddb --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/wizard/SEPluginProjectWizardPanelVisual.java @@ -0,0 +1,259 @@ +/* + * SEPluginProjectWizardPanelVisual.java + */ +package net.openesb.component.${artifactId}.project.wizard; + +import java.io.File; +import javax.swing.JFileChooser; +import javax.swing.JPanel; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; +import javax.swing.text.Document; +import org.netbeans.spi.project.ui.support.ProjectChooser; +import org.openide.WizardDescriptor; +import org.openide.WizardValidationException; +import org.openide.filesystems.FileUtil; + +public class SEPluginProjectWizardPanelVisual extends JPanel implements DocumentListener { + + public static final String PROP_PROJECT_NAME = "projectName"; + private SEPluginProjectWizardPanel panel; + + public SEPluginProjectWizardPanelVisual(SEPluginProjectWizardPanel panel) { + initComponents(); + this.panel = panel; + // Register listener on the textFields to make the automatic updates + projectNameTextField.getDocument().addDocumentListener(this); + projectLocationTextField.getDocument().addDocumentListener(this); + } + + public String getProjectName() { + return this.projectNameTextField.getText(); + } + + /** + * This method is called from within the constructor to initialize the form. + * WARNING: Do NOT modify this code. The content of this method is always + * regenerated by the Form Editor. + */ + // //GEN-BEGIN:initComponents + private void initComponents() { + + projectNameLabel = new javax.swing.JLabel(); + projectNameTextField = new javax.swing.JTextField(); + projectLocationLabel = new javax.swing.JLabel(); + projectLocationTextField = new javax.swing.JTextField(); + browseButton = new javax.swing.JButton(); + createdFolderLabel = new javax.swing.JLabel(); + createdFolderTextField = new javax.swing.JTextField(); + + projectNameLabel.setLabelFor(projectNameTextField); + org.openide.awt.Mnemonics.setLocalizedText(projectNameLabel, org.openide.util.NbBundle.getMessage(SEPluginProjectWizardPanelVisual.class, "LBL_ProjectName")); // NOI18N + + projectLocationLabel.setLabelFor(projectLocationTextField); + org.openide.awt.Mnemonics.setLocalizedText(projectLocationLabel, org.openide.util.NbBundle.getMessage(SEPluginProjectWizardPanelVisual.class, "LBL_ProjectLocation")); // NOI18N + + org.openide.awt.Mnemonics.setLocalizedText(browseButton, org.openide.util.NbBundle.getMessage(SEPluginProjectWizardPanelVisual.class, "LBL_Browse")); // NOI18N + browseButton.setActionCommand("BROWSE"); + browseButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + browseButtonActionPerformed(evt); + } + }); + + createdFolderLabel.setLabelFor(createdFolderTextField); + org.openide.awt.Mnemonics.setLocalizedText(createdFolderLabel, org.openide.util.NbBundle.getMessage(SEPluginProjectWizardPanelVisual.class, "LBL_ProjectFolder")); // NOI18N + + createdFolderTextField.setEditable(false); + + org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(this); + this.setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) + .add(layout.createSequentialGroup() + .addContainerGap() + .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) + .add(projectNameLabel) + .add(projectLocationLabel) + .add(createdFolderLabel)) + .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) + .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) + .add(org.jdesktop.layout.GroupLayout.TRAILING, projectNameTextField, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 191, Short.MAX_VALUE) + .add(org.jdesktop.layout.GroupLayout.TRAILING, projectLocationTextField, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 191, Short.MAX_VALUE) + .add(org.jdesktop.layout.GroupLayout.TRAILING, createdFolderTextField, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 191, Short.MAX_VALUE)) + .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) + .add(browseButton) + .addContainerGap()) + ); + layout.setVerticalGroup( + layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) + .add(layout.createSequentialGroup() + .addContainerGap() + .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) + .add(projectNameLabel) + .add(projectNameTextField, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) + .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) + .add(projectLocationLabel) + .add(projectLocationTextField, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) + .add(browseButton)) + .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) + .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) + .add(createdFolderLabel) + .add(createdFolderTextField, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)) + .addContainerGap(213, Short.MAX_VALUE)) + ); + }// //GEN-END:initComponents + + private void browseButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_browseButtonActionPerformed + String command = evt.getActionCommand(); + if ("BROWSE".equals(command)) { + JFileChooser chooser = new JFileChooser(); + FileUtil.preventFileChooserSymlinkTraversal(chooser, null); + chooser.setDialogTitle("Select Project Location"); + chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); + String path = this.projectLocationTextField.getText(); + if (path.length() > 0) { + File f = new File(path); + if (f.exists()) { + chooser.setSelectedFile(f); + } + } + if (JFileChooser.APPROVE_OPTION == chooser.showOpenDialog(this)) { + File projectDir = chooser.getSelectedFile(); + projectLocationTextField.setText(FileUtil.normalizeFile(projectDir).getAbsolutePath()); + } + panel.fireChangeEvent(); + } + + }//GEN-LAST:event_browseButtonActionPerformed + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JButton browseButton; + private javax.swing.JLabel createdFolderLabel; + private javax.swing.JTextField createdFolderTextField; + private javax.swing.JLabel projectLocationLabel; + private javax.swing.JTextField projectLocationTextField; + private javax.swing.JLabel projectNameLabel; + private javax.swing.JTextField projectNameTextField; + // End of variables declaration//GEN-END:variables + + public void addNotify() { + super.addNotify(); + //same problem as in 31086, initial focus on Cancel button + projectNameTextField.requestFocus(); + } + + boolean valid(WizardDescriptor wizardDescriptor) { + + if (projectNameTextField.getText().length() == 0) { + wizardDescriptor.putProperty("WizardPanel_errorMessage", + "Project Name is not a valid folder name."); + return false; // Display name not specified + } + File f = FileUtil.normalizeFile(new File(projectLocationTextField.getText()).getAbsoluteFile()); + if (!f.isDirectory()) { + String message = "Project Folder is not a valid path."; + wizardDescriptor.putProperty("WizardPanel_errorMessage", message); + return false; + } + final File destFolder = FileUtil.normalizeFile(new File(createdFolderTextField.getText()).getAbsoluteFile()); + + File projLoc = destFolder; + while (projLoc != null && !projLoc.exists()) { + projLoc = projLoc.getParentFile(); + } + if (projLoc == null || !projLoc.canWrite()) { + wizardDescriptor.putProperty("WizardPanel_errorMessage", + "Project Folder cannot be created."); + return false; + } + + if (FileUtil.toFileObject(projLoc) == null) { + String message = "Project Folder is not a valid path."; + wizardDescriptor.putProperty("WizardPanel_errorMessage", message); + return false; + } + + File[] kids = destFolder.listFiles(); + if (destFolder.exists() && kids != null && kids.length > 0) { + // Folder exists and is not empty + wizardDescriptor.putProperty("WizardPanel_errorMessage", + "Project Folder already exists and is not empty."); + return false; + } + wizardDescriptor.putProperty("WizardPanel_errorMessage", ""); + return true; + } + + void store(WizardDescriptor d) { + String name = projectNameTextField.getText().trim(); + String folder = createdFolderTextField.getText().trim(); + + d.putProperty("projdir", new File(folder)); + d.putProperty("name", name); + } + + void read(WizardDescriptor settings) { + File projectLocation = (File) settings.getProperty(SEPluginProjectWizardIterator.PROJECT_DIR); + if (projectLocation == null || projectLocation.getParentFile() == null || !projectLocation.getParentFile().isDirectory()) { + projectLocation = ProjectChooser.getProjectsFolder(); + } else { + projectLocation = projectLocation.getParentFile(); + } + this.projectLocationTextField.setText(projectLocation.getAbsolutePath()); + + String projectName = (String) settings.getProperty(SEPluginProjectWizardIterator.PROJECT_NAME); + if (projectName == null) { + projectName = SEPluginProjectWizardIterator.DEF_PROJECT_NAME_VALUE; + } + this.projectNameTextField.setText(projectName); + this.projectNameTextField.selectAll(); + } + + void validate(WizardDescriptor d) throws WizardValidationException { + // nothing to validate + } + + // Implementation of DocumentListener -------------------------------------- + public void changedUpdate(DocumentEvent e) { + updateTexts(e); + if (this.projectNameTextField.getDocument() == e.getDocument()) { + firePropertyChange(PROP_PROJECT_NAME, null, this.projectNameTextField.getText()); + } + } + + public void insertUpdate(DocumentEvent e) { + updateTexts(e); + if (this.projectNameTextField.getDocument() == e.getDocument()) { + firePropertyChange(PROP_PROJECT_NAME, null, this.projectNameTextField.getText()); + } + } + + public void removeUpdate(DocumentEvent e) { + updateTexts(e); + if (this.projectNameTextField.getDocument() == e.getDocument()) { + firePropertyChange(PROP_PROJECT_NAME, null, this.projectNameTextField.getText()); + } + } + + /** + * Handles changes in the Project name and project directory, + */ + private void updateTexts(DocumentEvent e) { + + Document doc = e.getDocument(); + + if (doc == projectNameTextField.getDocument() || doc == projectLocationTextField.getDocument()) { + // Change in the project name + + String projectName = projectNameTextField.getText(); + String projectFolder = projectLocationTextField.getText(); + + //if (projectFolder.trim().length() == 0 || projectFolder.equals(oldName)) { + createdFolderTextField.setText(projectFolder + File.separatorChar + projectName); + //} + + } + panel.fireChangeEvent(); // Notify that the panel changed + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/wizard/resources/Greetings.wsdl b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/wizard/resources/Greetings.wsdl new file mode 100644 index 000000000..756417abf --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/wizard/resources/Greetings.wsdl @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/wizard/resources/goodbye.xsl b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/wizard/resources/goodbye.xsl new file mode 100644 index 000000000..3259f2f3a --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/wizard/resources/goodbye.xsl @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + Goodbye + ! Have a great time. + + + + + + diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/wizard/resources/hello.xsl b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/wizard/resources/hello.xsl new file mode 100644 index 000000000..d6794cbf8 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/wizard/resources/hello.xsl @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + Hello + ! + + + + + + diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/wizard/resources/jbi.xml b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/wizard/resources/jbi.xml new file mode 100644 index 000000000..6c6757d3d --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/wizard/resources/jbi.xml @@ -0,0 +1,14 @@ + + + + + + + + diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/wizard/resources/xsltmap.properties b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/wizard/resources/xsltmap.properties new file mode 100644 index 000000000..06e4b6631 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/main/resources/archetype-resources/src/net/openesb/component/__artifactId__/project/wizard/resources/xsltmap.properties @@ -0,0 +1,28 @@ +# properties will be used to find the xslt file that will be used for invoking a +# service operation. +# The "xsltmap.properties" file should contain two types of properties +# 1. for namespace prefix to namespaceURI map that starts with "xmlns." prefix like +# "xmlns.tns-prefix=http://www.sun.com/jbi/examples/sample-service/echo" +# 2. a service description to xslt file properties with syntax like +# "{tns-prefix}service-name=xslt_file_name" and +# "{tns-prefix}service-name.{tns-prefix}operation-name=xslt_file_name" and +# "{tns-prefix}service-name.{tns-prefix}interface-name.operation-name=xslt_file_name" . +# the service description property is a "." delimited tokens that represents +# a serive or interface qname and a operation name. To locate xslt file either with +# service qname or service qname and operaton or serivice qname and interface qname +# and operation, all the three properties specified above should be there for each xslt file. +# + +xmlns.greet1=http://www.sun.com/jbi/examples/sample-service/greetings/ +xmlns.greet2=http://www.sun.com/jbi/examples/sample-service/greetings/ +xmlns.greettypes=http://www.sun.com/jbi/examples/sample-service/greetings/types +# just service level default settings +{greet2}greetService=hello.xsl +# service and operation +{greet2}greetService.{greet1}sayHello=hello.xsl +# service, interface, operation +{greet2}greetService.{greet1}greetings.sayHello=hello.xsl +# service and operation +{greet2}greetService.{greet1}sayGoodbye=goodbye.xsl +# service, interface, operation +{greet2}greetService.{greet1}greetings.sayGoodbye=goodbye.xsl diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/test/resources/projects/basic/archetype.properties b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/test/resources/projects/basic/archetype.properties new file mode 100644 index 000000000..84ab644c4 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/test/resources/projects/basic/archetype.properties @@ -0,0 +1,5 @@ +#Tue Jul 23 17:03:00 IST 2013 +package=it.pkg +version=0.1-SNAPSHOT +groupId=archetype.it +artifactId=basic diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/test/resources/projects/basic/goal.txt b/maven-ojc-archeType-v2/maven-archetype-service-engine-plugin-v2/src/test/resources/projects/basic/goal.txt new file mode 100644 index 000000000..e69de29bb diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/pom.xml b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/pom.xml new file mode 100644 index 000000000..8c4ab285d --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/pom.xml @@ -0,0 +1,58 @@ + + + + + + + 4.0.0 + + open-jbi-components + service-engine-ojc-archetype + 2.3.0 + jar + + service-engine-ojc-archetype + + + + + org.apache.maven.archetype + archetype-packaging + 2.2 + + + + + + + maven-archetype-plugin + 2.2 + + + + + + Top-level Build for newse-top + + https://open-jbi-components.dev.java.net/newse-top + + + + openesb-release + OpenESB repo release + http://openesb-dev.org:8081/nexus/content/repositories/openesb-release/ + + + openesb-snapshot + OpenESB repo release + http://nexus.openesb-dev.org:8081/nexus/content/repositories/openesb-snapshot/ + + + diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/META-INF/maven/archetype-metadata.xml b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/META-INF/maven/archetype-metadata.xml new file mode 100644 index 000000000..594c2ab6d --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/META-INF/maven/archetype-metadata.xml @@ -0,0 +1,80 @@ + + + + + + + ${artifactId} + + + + + bld/generated-sources + + **/*.xml + + + + + + nbactions.xml + + + + + + smvn.bat + + + + + + + + src/net + + **/*.java + + + + + + nbactions.xml + + + + + + + + src + + **/*.xml + **/*.properties + + + + bld/classes + + **/*.jar + + + + + + nbactions.xml + + + + + + \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/nbactions.xml b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/nbactions.xml new file mode 100644 index 000000000..45118cf65 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/nbactions.xml @@ -0,0 +1,51 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + + + clean + + clean + + + + build + + install + + + + test + + package + + + + rebuild + + clean + install + + + + CUSTOM-testreport + testreport + + surefire-report:report-only + + + true + + + + CUSTOM-allreports + allreports + + site + + + true + + + diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/pom.xml b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/pom.xml new file mode 100644 index 000000000..896598282 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/pom.xml @@ -0,0 +1,78 @@ + + + + build-common + open-jbi-components + 1.1 + ../../build-common + + 4.0.0 + open-jbi-components + ${componentName}-jbiadapter + ${componentName}-jbiadapter + ${version} + ${componentName}-jbiadapter description + + + + maven-antrun-plugin + + + ${artifactId}-extract-globalized-messages + process-classes + run + + + + + + + + + open-jbi-components + componentsl + + + + junit + junit + test + + + ant + ant-junit + test + + + wsdl4j + wsdl4j + 1.6.2 + + + + diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/ProviderSEComponentLifeCycle.java b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/ProviderSEComponentLifeCycle.java new file mode 100644 index 000000000..9b92b6f84 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/ProviderSEComponentLifeCycle.java @@ -0,0 +1,52 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * ProviderSEComponentLifeCycle.java + */ +package net.openesb.component.${componentName}; + +import net.openesb.component.${componentName}.common.BasicComponentLifeCycle; +import net.openesb.component.${componentName}.common.DefaultMessageExchangeReceiver; +import net.openesb.component.${componentName}.common.MessageExchangeReceiver; +import net.openesb.component.${componentName}.common.RuntimeContext; +import javax.jbi.JBIException; +import javax.jbi.component.Component; + +/** + * This class extends the basic ComponentLifeCycle implementation to provide + * component specific implementation of the ComponentLifeCycle. + * + * @see javax.jbi.ComponentLifeCycle + * @see com.sun.jbi.sample.component.common.BasicComponentLifeCycle + * @author chikkala + */ +public class ProviderSEComponentLifeCycle extends BasicComponentLifeCycle { + + /** + * constructor + */ + public ProviderSEComponentLifeCycle(Component compRuntime) { + super(compRuntime); + } + + /** + * creates DefaultMessageExchangeReceiver to handles receiving and + * processing the message exchanges from the delivery channel. + */ + @Override + protected MessageExchangeReceiver createMessageExchangeReceiver() { + return new DefaultMessageExchangeReceiver(); + } + + /** + * chance to extended classes to do the component specific init + * + * @throws javax.jbi.JBIException + */ + @Override + protected void doInit() throws JBIException { + // NOOP + RuntimeContext.getInstance().setLogger(this.getClass().getName(), null); + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/ProviderSEEndpoint.java b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/ProviderSEEndpoint.java new file mode 100644 index 000000000..c77ba006b --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/ProviderSEEndpoint.java @@ -0,0 +1,101 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * ProviderSEEndpoint.java + */ +package net.openesb.component.${componentName}; + +import net.openesb.component.${componentName}.common.MessageExchangeHandler; +import net.openesb.component.${componentName}.common.RuntimeHelper; +import net.openesb.component.${componentName}.common.MessageExchangeListener; +import net.openesb.component.${componentName}.common.deployment.ProviderEndpoint; +import net.openesb.component.${componentName}.common.deployment.SUDescriptor; +import javax.jbi.JBIException; +import javax.jbi.messaging.ExchangeStatus; +import javax.jbi.messaging.MessageExchange; +import javax.wsdl.Definition; + +/** + * This class extends the ProviderEndpoint to implement component specific + * endpoint configuration. It implements the MessageExchangeListener to receive + * message exchange notifications from the MessageExchangeSupport fired by + * MessageExchangeReceiver and process it using a message exchange handler. + * + * This endpoint is configured for a service provided by this component which + * can receive a xml document and apply xslt transformation and send the results + * back in a InOut message exchange to complete a service invocation on this + * endpoint. + * + * @author chikkala + */ +public class ProviderSEEndpoint extends ProviderEndpoint implements MessageExchangeListener { + + private XSLTFileLocator mXsltFileLocator; + private XSLTService mXsltService; + + /** + * Creates a new instance of XSLTProviderEndpoint + */ + public ProviderSEEndpoint(SUDescriptor.Provides provides, Definition wsdlDef, ProviderSEServiceUnit su) { + super(provides, wsdlDef, su); + } + + /** + * XSLT transformation service used in transformation of the xml documents + * received on this endpoint. + */ + public XSLTService getXSLTService() { + return this.mXsltService; + } + + /** + * returns the XSLTFileLocator object that is created to find the xslt file + * to be used for a particular service operation invocation by looking at + * the mapping file specified in the service unit that deploys this + * endpoint. + */ + public XSLTFileLocator getXSLTFileLocator() { + return this.mXsltFileLocator; + } + + @Override + public void doInit() throws JBIException { + RuntimeHelper.getLogger().info("ProviderSEEndpoint:doInit called"); + ProviderSEServiceUnit su = (ProviderSEServiceUnit) this.getServiceUnit(); + this.mXsltFileLocator = su.getXsltFileLocator(); + this.mXsltService = XSLTService.XSLTServiceImpl.getInstance(); + } + + /** + * creates the message exchange handler that will be used to process the + * message exchange received for this endpoint. + */ + @Override + public MessageExchangeHandler createMessageExchangeHandler() { + return new ProviderSEMessageExchangeHandler(this); + } + + /** + * returns the implementation of the message exchange listener which the + * MessageExchangeSupport invokes when a message exchange is received from + * delivery channel by MessageExchangeReceiver. + */ + @Override + protected MessageExchangeListener createMessageExchangeListener() { + return this; + } + + /** + * implementation of the message exchange received method of the listener. + */ + public void messageExchangeReceived(ExchangeStatus status, MessageExchange me) { + try { + RuntimeHelper.getLogger().fine("MXListener.MessageExchangeReceived: with Status: " + status); + processMessageExchangeWithHandler(status, me); + // processMessageExchange(me); + } catch (Exception ex) { + ex.printStackTrace(); + } + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/ProviderSEInstaller.java b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/ProviderSEInstaller.java new file mode 100644 index 000000000..d49dac792 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/ProviderSEInstaller.java @@ -0,0 +1,34 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + /* + * ProviderSEInstaller.java + */ +package net.openesb.component.${componentName}; + +import net.openesb.component.${componentName}.common.ComponentInstaller; + +/** + * This class extends the ComponentInstaller that implements the + * javax.jbi.component.Bootstrap for a component installation contract. + * + * If the default implemenation of the javax.jbi.component.Bootstrap in + * com.sun.jbi.sample.component.common.ComponentInstaller is not sufficient for + * this components install, uninstall and upgrade requirements, override the + * default implementation here to add component specific installation and + * upgrade tasks such as initializing configuration mbean and creating resources + * specific to component or upgrade workspace and service units during upgrading + * the component. + * + * @see javax.jbi.Bootstrap + * @see com.sun.jbi.sample.component.common.ComponentInstaller + * @author chikkala + */ +public class ProviderSEInstaller extends ComponentInstaller { + + /** + * Constructor to create the MyEngineInstaller. + */ + public ProviderSEInstaller() { + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/ProviderSEMessageExchangeHandler.java b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/ProviderSEMessageExchangeHandler.java new file mode 100644 index 000000000..fb14efbd0 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/ProviderSEMessageExchangeHandler.java @@ -0,0 +1,171 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * ProviderSEMessageExchangeHandler.java + * + */ +package net.openesb.component.${componentName}; + +import net.openesb.component.${componentName}.common.AbstractMessageExchangeHandler; +import net.openesb.component.${componentName}.common.RuntimeHelper; +import net.openesb.component.${componentName}.common.wsdl.WSDL11JBIWrapper; +import java.io.StringReader; +import java.util.logging.Logger; +import javax.jbi.JBIException; +import javax.jbi.messaging.DeliveryChannel; +import javax.jbi.messaging.Fault; +import javax.jbi.messaging.InOut; +import javax.jbi.messaging.MessageExchange; +import javax.jbi.messaging.MessagingException; +import javax.jbi.messaging.NormalizedMessage; +import javax.xml.namespace.QName; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.transform.Source; + +/** + * This class extends the AbstractMessageExchangeHandler to implement the + * component specific message exchange processing on the provider side in a + * service engine. + * + * @author chikkala + */ +public class ProviderSEMessageExchangeHandler extends AbstractMessageExchangeHandler { + + private ProviderSEEndpoint mEndpoint; + + /** + * Creates a new instance of ProviderSEMXHandler + */ + public ProviderSEMessageExchangeHandler(ProviderSEEndpoint endpoint) { + this.mEndpoint = endpoint; + } + + protected Logger getLogger() { + return this.mEndpoint.getLogger(); + } + + protected DeliveryChannel getDeliveryChannel() { + return this.mEndpoint.getDeliveryChannel(); + } + + protected void validateMessageExchange() throws MessagingException { + MessageExchange msgExchange = this.getMessageExchange(); + + if (this.getMessageExchange() == null) { + throw new MessagingException("MessageExchange Object is null in MessageExchageHandler"); + } + + if (MessageExchange.Role.CONSUMER.equals(msgExchange.getRole())) { + throw new MessagingException("Provider Message Exchange Handler can not have MessageExchange with CONSUMER Role"); + } + + if (!(msgExchange instanceof InOut)) { + throw new MessagingException("InOut Message Exchange Handler MessageExchange object should be instanceof javax.jbi.messaging.InOut "); + } + } + + protected void processError(Exception ex) { + MessageExchange msgExchange = this.getMessageExchange(); + Exception errEx = msgExchange.getError(); // get the error and print + RuntimeHelper.getLogger().info( + "InOut Message Exchange Provider received Error: " + errEx.getMessage()); + msgExchange.getError().printStackTrace(); + } + + protected void processDone() { + MessageExchange msgExchange = this.getMessageExchange(); + RuntimeHelper.getLogger().info("InOut Message Exchange Provider received DONE :" + + " END of service invocation"); + } + + protected void processFault(Fault fault) { + MessageExchange msgExchange = this.getMessageExchange(); + RuntimeHelper.logError("InOut Message Exchange Provider Handler can not receive Fault on Provider side"); + } + + protected void processMessage() { + try { + processInMessageOnProvider((InOut) this.getMessageExchange()); + } catch (JBIException ex) { + ex.printStackTrace(); + } + } + + protected void processInMessageOnProvider(InOut inOutExchange) throws JBIException { + RuntimeHelper.getLogger().fine("Processing In Message on Provider side " + inOutExchange); + // receive IN message. + NormalizedMessage inMsg = inOutExchange.getInMessage(); + NormalizedMessage outMsg = null; + Fault fault = null; + Source inContent = null; + Source outContent = null; + Source faultContent = null; + String faultAsText = null; + // process in message + inContent = inMsg.getContent(); + // invoke the service operation + try { + QName opName = inOutExchange.getOperation(); + QName svcName = inOutExchange.getEndpoint().getServiceName(); + RuntimeHelper.getLogger().fine("xslt service info " + svcName + opName); + + XSLTFileLocator xsltFileLocator = this.mEndpoint.getXSLTFileLocator(); + XSLTService xsltService = this.mEndpoint.getXSLTService(); + + String xsltPath = xsltFileLocator.findXsltFile(svcName, opName); + RuntimeHelper.getLogger().fine("XsltPath " + xsltPath); + if (xsltPath == null) { + RuntimeHelper.getLogger().fine(" No XSLT File found in MAP " + + xsltFileLocator.printMap()); + } + outContent = xsltService.transform(inContent, xsltPath); + + } catch (Exception ex) { + // exception invoking the operation. so, set exception text as fault content. + ex.printStackTrace(); + faultAsText = RuntimeHelper.getExceptionAsText(ex); + String faultText = RuntimeHelper.getExceptionAsXmlText(ex); + faultContent = RuntimeHelper.createDOMSource(new StringReader(faultText)); + } + // set out or fault message + if (outContent != null) { + // set the out message content. + outMsg = inOutExchange.createMessage(); + inOutExchange.setOutMessage(outMsg); + normalizeOutMessage(inOutExchange, outMsg, outContent); + // outMsg.setContent(outContent); + } else if (faultContent != null) { + fault = inOutExchange.createFault(); + inOutExchange.setFault(fault); + fault.setContent(faultContent); // may need to normalize the content. + } + // send out or fault message. + // this.getDeliveryChannel().sendSync(inOutExchange, SEND_SYNC_TIMEOUT); + this.send(); + } + + private void normalizeOutMessage(MessageExchange me, NormalizedMessage normMsg, Source msgSrc) throws MessagingException { + try { + // DOMSource wrappedSource = wrapOutputMessage(me, msgSrc); + WSDL11JBIWrapper outWrapper = WSDL11JBIWrapper.createOutputWrapper( + this.mEndpoint.getWSDLOperation(me.getOperation())); + + // check if the output from the transformer is in a wrapped form + WSDL11JBIWrapper wrapper = WSDL11JBIWrapper.sourceToWrapper( + RuntimeHelper.sourceToDOMSource(msgSrc)); + if (wrapper != null) { + outWrapper.appendParts(wrapper.getParts()); + } else { + outWrapper.appendPart(RuntimeHelper.sourceToDOMSource(msgSrc)); + } + + normMsg.setContent(outWrapper.toDOMSource()); + + } catch (MessagingException ex) { + throw ex; + } catch (ParserConfigurationException ex) { + throw new MessagingException(ex); + } + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/ProviderSERuntime.java b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/ProviderSERuntime.java new file mode 100644 index 000000000..c13d0a78e --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/ProviderSERuntime.java @@ -0,0 +1,56 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * ProviderSERuntime.java + */ +package net.openesb.component.${componentName}; + +import net.openesb.component.${componentName}.common.ComponentRuntime; +import javax.jbi.component.ComponentLifeCycle; +import javax.jbi.component.ServiceUnitManager; + +/** + * This class extends the ComponentRuntime that implements + * javax.jbi.component.Component interface required for the component contract + * at runtime. + * + * This class provides the component specific ComponentLifeCycle implementation + * as well as the component specific ServiceUnitManager implementation. + * + * Add any additional component runtime specific functionality here. + * + * @see javax.jbi.component.Component + * @see com.sun.jbi.sample.component.common.ComponentRuntime + * @see com.sun.jbi.sample.component.common.BasicComponentLifecycle + * @see + * com.sun.jbi.sample.component.common.deployment.AbstractServiceUnitManager + * @author chikkala + */ +public class ProviderSERuntime extends ComponentRuntime { + + /** + * Creates a new instance of MyEngineRuntime + */ + public ProviderSERuntime() { + super(); + } + + /** + * overriding the parent's createComponentLifeCycle to create component + * specific component lifecycle implementation. + */ + @Override + protected ComponentLifeCycle createComponentLifeCycle() { + return new ProviderSEComponentLifeCycle(this); + } + + /** + * overrides the parent's createServiceUnitManager to create component + * specific service unit manager + */ + @Override + protected ServiceUnitManager createServiceUnitManager() { + return new ProviderSESUManager(this); + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/ProviderSESUManager.java b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/ProviderSESUManager.java new file mode 100644 index 000000000..ec274e2b5 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/ProviderSESUManager.java @@ -0,0 +1,49 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * ProviderSESUManager.java + */ +package net.openesb.component.${componentName}; + +import net.openesb.component.${componentName}.common.RuntimeHelper; +import net.openesb.component.${componentName}.common.deployment.AbstractServiceUnitManager; +import net.openesb.component.${componentName}.common.deployment.ServiceUnit; +import java.util.logging.Logger; +import javax.jbi.management.DeploymentException; + +/** + * This class extends the AbstractServiceUnitManager to implement component + * specific service unit manager by creating the component specific ServiceUnit + * implementation. + * + * @see + * com.sun.jbi.sample.component.common.deployment.AbstractServiceUnitManager + * @see com.sun.jbi.sample.component.common.deployment.ServiceUnit + * @author chikkala + */ +public class ProviderSESUManager extends AbstractServiceUnitManager { + + private ProviderSERuntime mRuntime; + + /** + * Creates a new instance of ProviderSESUManager + */ + public ProviderSESUManager(ProviderSERuntime compRuntime) { + super(); + this.mRuntime = compRuntime; + } + + protected Logger getLogger() { + return RuntimeHelper.getLogger(); + } + + protected String getComponentName() { + return RuntimeHelper.getComponentName(); + } + //TODO implement ProviderSEServiceUnit + + protected ServiceUnit createServiceUnit(String suName, String suRootPath) throws DeploymentException { + return new ProviderSEServiceUnit(suName, suRootPath); + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/ProviderSEServiceUnit.java b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/ProviderSEServiceUnit.java new file mode 100644 index 000000000..335d9bbd6 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/ProviderSEServiceUnit.java @@ -0,0 +1,63 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * ProviderSEServiceUnit.java + * + */ +package net.openesb.component.${componentName}; + +import net.openesb.component.${componentName}.common.deployment.ServiceUnit; +import net.openesb.component.${componentName}.common.deployment.ProviderEndpoint; +import net.openesb.component.${componentName}.common.deployment.SUDescriptor.Provides; +import javax.jbi.management.DeploymentException; +import javax.wsdl.Definition; + +/** + * This class extends the ServiceUnit to implement the component specific + * service unit processing. It creates the component specific ProviderEndpoint + * implementation to configure the service provider endpoint on this component + * deployed in the service unit. It also processes the deployment artifacts that + * are specific to the service provided by the component. + * + * @author chikkala + */ +public class ProviderSEServiceUnit extends ServiceUnit { + + private XSLTFileLocator mXsltFileLocator; + + /** + * Creates a new instance of ProviderSEServiceUnit + */ + public ProviderSEServiceUnit(String suName, String suRootPath) { + super(suName, suRootPath); + } + + protected XSLTFileLocator getXsltFileLocator() { + return this.mXsltFileLocator; + } + + @Override + protected ProviderEndpoint createProviderEndpoint(Provides provides, Definition wsdlDef) { + return new ProviderSEEndpoint(provides, wsdlDef, this); + } + + /** + * load and validates the component specific deployment artifacts. It loads + * the xsltmap properties into XSLTFileLocator which will be used to find + * the xslt file corresponding to a service operation. + */ + @Override + protected void loadOtherArtifacts() throws DeploymentException { + super.loadOtherArtifacts(); + // load any component specific service unit artifacts + if (this.mXsltFileLocator == null) { + try { + this.mXsltFileLocator = + new XSLTFileLocator(this.getSURootPath(), "xsltmap.properties"); + } catch (Exception ex) { + throw new DeploymentException(ex); + } + } + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/XSLTFileLocator.java b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/XSLTFileLocator.java new file mode 100644 index 000000000..3349d0027 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/XSLTFileLocator.java @@ -0,0 +1,210 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * XSLTFileLocator.java + */ +package net.openesb.component.${componentName}; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; +import javax.xml.namespace.QName; + +/** + * This class represents the component specific deployment artifact which reads + * the deployed "xsltmap.properties" file in the service unit and processes it + * to find the xslt file to be used for a particular operation on a service + * provided by the deployment. + *
+ * The "xsltmap.properties" file should contain two types of properties
+ * 1.for namespace prefix to namespaceURI map that starts with "xmlns." prefix like
+ *   "xmlns.tns-prefix=http://www.sun.com/jbi/examples/sample-service/echo"
+ * 2. a service description to xslt file properties with syntax like
+ *   "{tns-prefix}service-name=xslt_file_name"  and
+ *   "{tns-prefix}service-name.{tns-prefix}operation-name=xslt_file_name" and
+ *   "{tns-prefix}service-name.{tns-prefix}interface-name.operation-name=xslt_file_name" .
+ * the service description property is a "." delimited tokens that represents a serive
+ * or interface qname and a operation name. To locate xslt file either with service qname
+ * or service qname and operaton or serivice qname and interface qname and operation,
+ * all the three properties specified above should be there for each xslt file. for example,
+ *  xmlns.echo1=http://www.sun.com/jbi/examples/sample-service/echo
+ *  xmlns.echo2=http://www.sun.com/jbi/examples/sample-service/echo
+ *  {echo2}echoService=echo.xsl
+ *  {echo2}echoService.{echo1}echo=echo.xsl
+ *  {echo2}echoService.{echo1}echo.echo=echo.xsl
+ * 
+ * + * @author chikkala + */ +public class XSLTFileLocator { + + private Map mXsltFileMap; + + /** + * Creates a new instance of XsltLocator + */ + public XSLTFileLocator(String rootPath, String mapFile) throws Exception { + this.mXsltFileMap = new HashMap(); + initXsltLocator(rootPath, mapFile); + } + + private void initXsltLocator(String rootPath, String mapFilePath) throws Exception { + @SuppressWarnings("unchecked") + Map mapProps = loadMappingProperties(rootPath, mapFilePath); + + Map nsMap = new HashMap(); + Map xsltMap = new HashMap(); + + for (String name : mapProps.keySet()) { + String value = mapProps.get(name); + if (name.startsWith("{")) { + xsltMap.put(name, value); + } else if (name.startsWith("xmlns.")) { + String xmlns = name.substring(6); + nsMap.put(xmlns, value); + } + } + + for (String name : xsltMap.keySet()) { + String value = xsltMap.get(name); + String[] tokens = name.split("${symbol_escape}${symbol_escape}."); + String svcName = null; + String intrName = null; + String opName = null; + + if (tokens.length == 1) { + svcName = expandQName(tokens[0], nsMap); + } else if (tokens.length == 2) { + svcName = expandQName(tokens[0], nsMap); + opName = expandQName(tokens[1], nsMap); + } else if (tokens.length == 3) { + svcName = expandQName(tokens[0], nsMap); + intrName = expandQName(tokens[1], nsMap); + opName = tokens[2]; + } else { + System.out.println("invalid property name in xslt map property" + name); + } + + StringBuffer buff = new StringBuffer(); + buff.append(svcName); + if (intrName != null) { + buff.append("."); + buff.append(intrName); + } + if (opName != null) { + buff.append("."); + buff.append(opName); + } + File file = new File(rootPath, value); + String xsltFile = file.getAbsolutePath(); + this.mXsltFileMap.put(buff.toString(), xsltFile); + } + } + + private String expandQName(String qname, Map xmlnsMap) { + + // qname passed is "{prefix}localname" + QName temp = QName.valueOf(qname); + String prefix = temp.getNamespaceURI(); + String nsURI = xmlnsMap.get(prefix); + if (nsURI == null) { + nsURI = prefix; // just use the prefix as it is. + } + QName realQName = new QName(nsURI, temp.getLocalPart()); + return realQName.toString(); + } + + private Map loadMappingProperties(String rootPath, String mapFilePath) throws Exception { + File mapFile = new File(rootPath, mapFilePath); + Properties mapProps = new Properties(); + if (!mapFile.exists()) { + throw new Exception("Mapping file not found " + mapFilePath); + } + FileInputStream inStream = null; + try { + inStream = new FileInputStream(mapFile); + mapProps.load(inStream); + } catch (FileNotFoundException ex) { + ex.printStackTrace(); + } catch (IOException ex) { + ex.printStackTrace(); + } finally { + if (inStream != null) { + try { + inStream.close(); + } catch (IOException ex) { + ex.printStackTrace(); + } + } + } + return mapProps; + } + + /** + * return the xslt file mapped to either service name or service qname + + * operation qname + * + * @param serviceQName must be non null qname + * @param opQName can be null the xslt file can be located at service level. + */ + public String findXsltFile(QName serviceQName, QName opQName) { + StringBuffer buff = new StringBuffer(); + buff.append(serviceQName.toString()); + if (opQName != null) { + buff.append("."); + // workaround for the http soap bc bug which does not set the namespace + // uri on the op name. for time being use the serviceQName's namespace + String namespaceURI = opQName.getNamespaceURI(); + if (namespaceURI == null || namespaceURI.length() == 0) { + QName tempOp = + new QName(serviceQName.getNamespaceURI(), opQName.getLocalPart()); + buff.append(tempOp.toString()); + } else { + buff.append(opQName.toString()); + } + } + String xsltFile = this.mXsltFileMap.get(buff.toString()); + return xsltFile; + } + + /** + * return the xslt file mapped to either service name or service qname + + * interface qname + operation + * + * @param serviceQName must be non null service qname + * @param intrQName interface qname + * @param opName operation name ( not a qname) + */ + public String findXsltFile(QName serviceQName, QName intrQName, String opName) { + StringBuffer buff = new StringBuffer(); + buff.append(serviceQName.toString()); + if (intrQName != null) { + buff.append("."); + buff.append(intrQName.toString()); + } + if (opName != null) { + buff.append("."); + buff.append(opName); + } + String xsltFile = this.mXsltFileMap.get(buff.toString()); + return xsltFile; + } + + public String printMap() { + StringWriter buff = new StringWriter(); + PrintWriter out = new PrintWriter(buff); + for (String key : this.mXsltFileMap.keySet()) { + out.println("Key= " + key); + out.println("XsltFile= " + this.mXsltFileMap.get(key)); + } + out.close(); + return buff.getBuffer().toString(); + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/XSLTService.java b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/XSLTService.java new file mode 100644 index 000000000..cdc803ce6 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/XSLTService.java @@ -0,0 +1,108 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * XSLTService.java + */ +package net.openesb.component.${componentName}; + +import net.openesb.component.${componentName}.common.RuntimeHelper; +import java.io.File; +import java.io.StringReader; +import java.io.StringWriter; +import java.util.Properties; +import java.util.logging.Logger; +import javax.xml.transform.Source; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; +import javax.xml.transform.stream.StreamSource; +import org.w3c.dom.Document; + +/** + * This is a sample service implementation that takes the input as xml document + * and the xslt file to apply the xslt transformation on the input xml and + * return the transformed output xml. This implementation of the service is + * invoked when a InOut message exchange is processed to invoke a service + * provided by the engine. + * + * @author chikkala + */ +public interface XSLTService { + + /** + * this operation takes the input xml document and constructs the output xml + * document by applying the xslt in the file specified in xsltPath + * + * @param inputDoc input xml document + * @param xsltPath absolute file path of xslt file. + * @return transformed output xml document + */ + Source transform(Source inputDoc, String xsltPath) throws Exception; + + /** + * This class implements the echo service operations which the service + * engine will invoke when a InOut message exchange is processed to invoke a + * service provided by the engine. + */ + public static class XSLTServiceImpl implements XSLTService { + + private XSLTServiceImpl() { + } + + /** + * accessor to create/locate the service implementation + * + * @return echo service implementation + */ + public static XSLTService getInstance() { + return new XSLTServiceImpl(); + } + + protected Logger getLogger() { + return RuntimeHelper.getLogger(); + } + + /** + * this operation takes the input xml document and constructs the output + * xml document with the same data to implement the echo. + * + * @param inputDoc input document + * @return output document + */ + public Source transform(Source inputDoc, String xsltPath) throws Exception { + Document outDoc = null; + StringBuffer inBuff = RuntimeHelper.readFromSource(inputDoc); + + getLogger().fine("${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound} TRANSFORMER INPUT MESSAGE BEGIN ${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}"); + getLogger().fine(inBuff.toString()); + getLogger().fine("${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound} TRANSFORMER INPUT MESSAGE END ${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}"); + + TransformerFactory tf = null; + tf = TransformerFactory.newInstance(); + StreamSource xsltSource = new StreamSource(new File(xsltPath)); + Transformer xformer = tf.newTransformer(xsltSource); + + Properties params = new Properties(); //TODO get the pramas from the user file + for (Object name : params.keySet()) { + xformer.setParameter((String) name, params.get(name)); + } + StringWriter writer = new StringWriter(); + StreamResult result = new StreamResult(writer); + + DOMSource xmlSource = new DOMSource(RuntimeHelper.buildDOMDocument(new StringReader(inBuff.toString()))); + + xformer.transform(xmlSource, result); + + getLogger().fine("${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound} TRANSFORMER OUTPUT MESSAGE BEGIN ${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}"); + getLogger().fine(writer.getBuffer().toString()); + getLogger().fine("${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound} TRANSFORMER OUTPUT MESSAGE END ${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}${symbol_pound}"); + + outDoc = RuntimeHelper.buildDOMDocument(new StringReader(writer.getBuffer().toString())); + DOMSource outSource = new DOMSource(outDoc); + + return outSource; + } + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/AbstractMessageExchangeHandler.java b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/AbstractMessageExchangeHandler.java new file mode 100644 index 000000000..d589dbc1b --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/AbstractMessageExchangeHandler.java @@ -0,0 +1,141 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * AbstractMessageExchangeHandler.java + * + */ + +package net.openesb.component.${componentName}.common; + +import java.io.StringReader; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.jbi.messaging.DeliveryChannel; +import javax.jbi.messaging.ExchangeStatus; +import javax.jbi.messaging.Fault; +import javax.jbi.messaging.MessageExchange; +import javax.jbi.messaging.MessagingException; +import javax.xml.namespace.QName; + +/** + * This class is an abstract implementation of the MessageExchangeHandler which + * provides the base implementation of the ME processing and provides hooks to + * extended classes to implement component specific processing. + * + * @author chikkala + */ +public abstract class AbstractMessageExchangeHandler implements MessageExchangeHandler { + + public static String IN_MESSAGE = "in"; + public static String OUT_MESSAGE = "out"; + + private MessageExchange mMessageExchange; + private ExchangeStatus mStatus; + /** Creates a new instance of AbstractMessageExchangeHandler */ + protected AbstractMessageExchangeHandler() { + this.mMessageExchange = null; + } + + protected abstract Logger getLogger(); + protected abstract DeliveryChannel getDeliveryChannel(); + protected abstract void validateMessageExchange() throws MessagingException; + protected abstract void processError(Exception ex); + protected abstract void processDone(); + protected abstract void processMessage(); + protected abstract void processFault(Fault fault); + + public final MessageExchange getMessageExchange() { + return this.mMessageExchange; + } + + public final void setMessageExchange(MessageExchange msgExchange) { + this.mMessageExchange = msgExchange; + } + + public final ExchangeStatus getMessageExchangeStatus() { + if ( this.mStatus != null ) { + return this.mStatus; + } else if ( this.mMessageExchange != null ) { + return this.mMessageExchange.getStatus(); + } else { + return null; + } + } + + public final void setMessageExchangeStatus(ExchangeStatus status) { + this.mStatus = status; + } + + protected void send() throws MessagingException { + this.getDeliveryChannel().send(this.mMessageExchange); + } + + protected boolean sendSync(long timeout) throws MessagingException { + return this.getDeliveryChannel().sendSync(this.mMessageExchange, timeout); + } + + protected void sendDone() throws MessagingException { + this.mMessageExchange.setStatus(ExchangeStatus.DONE); + this.getDeliveryChannel().send(this.mMessageExchange); + } + + protected void sendError(Exception ex) throws MessagingException { + this.mMessageExchange.setError(ex); + this.getDeliveryChannel().send(this.mMessageExchange); + } + + protected void sendFault(Exception ex, QName type, String name) throws MessagingException { + Fault fault = this.mMessageExchange.createFault(); + if ( ex != null ) { + String xmlText = RuntimeHelper.getExceptionAsXmlText(ex); + fault.setContent(RuntimeHelper.createDOMSource(new StringReader(xmlText))); + } + this.mMessageExchange.setFault(fault); + this.getDeliveryChannel().send(this.mMessageExchange); + } + + protected void processActive() { + Fault fault = this.getMessageExchange().getFault(); + if ( fault != null ) { + processFault(fault); + } else { + processMessage(); + } + } + /** + * implementation of the MessageExchangeHandler${symbol_pound}processMessageExchange method. + */ + public void processMessageExchange(ExchangeStatus status, MessageExchange msgEx) { + + getLogger().fine("MessageExchangeHandler.processMessageExchange:status: " + status ); + + this.setMessageExchangeStatus(status); + this.setMessageExchange(msgEx); + + try { + validateMessageExchange(); + } catch (MessagingException ex) { + getLogger().log(Level.FINE, "Invalid message exchange for processing ", ex); + if ( this.getMessageExchange() != null ) { + try { + sendError(ex); + } catch (MessagingException errEx) { + getLogger().log(Level.FINE, "Can not send invalid message exchange error", errEx); + } + } + return; + } + + MessageExchange msgExchange = this.getMessageExchange(); + + if (ExchangeStatus.ACTIVE.equals(status) ) { + processActive(); + } else if (ExchangeStatus.DONE.equals(status) ) { + processDone(); + } else if (ExchangeStatus.ERROR.equals(status) ) { + processError(msgExchange.getError()); + } + } + +} diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/BasicComponentLifeCycle.java b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/BasicComponentLifeCycle.java new file mode 100644 index 000000000..d23330373 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/BasicComponentLifeCycle.java @@ -0,0 +1,398 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * AbstractComponentLifeCycle.java + */ + +package net.openesb.component.${componentName}.common; + +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.jbi.JBIException; +import javax.jbi.component.Component; +import javax.jbi.component.ComponentContext; +import javax.jbi.component.ComponentLifeCycle; +import javax.jbi.messaging.DeliveryChannel; +import javax.jbi.messaging.MessagingException; +import javax.management.MBeanServer; +import javax.management.ObjectName; +import javax.management.StandardMBean; + +/** + * This class implements the javax.jbi.component.ComponentLifeCycle. This is an + * abstract class that keeps the reference to the component context and the lifecycle + * extension mbeans. It implements the lifecycle method and provide the extended methods + * for each lifecycle methods to implement component specific functionality. + *

+ * It makes sure that the mininum initialization required for the component + * lifecycle is implemented by this class or the classes extending this class. + *

+ * Another important functionality implemented in this class is that it initializes the global + * RuntimeContext for the component with the ComponentContext passed by the JBI runtime and the + * opened delivery channel to make them available globally to any class in the component implementation + * that may need it during component lifecycle + *

+ * Service engine or a binding component lifecycle implementation can directly extend + * this class for their required functionality and override some of the methods to provide + * their own implementation. + * + * @see javax.jbi.ComponentLifeCycle + * @author chikkala + */ +public class BasicComponentLifeCycle implements ComponentLifeCycle { + /** reference to the component runtime */ + private Component mCompRuntime; + /** component context */ + private ComponentContext mComponentContext; + /** Extension Mbean Name*/ + private ObjectName mExtensionMBeanName; + /** Extension Mbean Implementation*/ + private StandardMBean mExtensionMBeanImpl; + /** a message receiver that accepts messages from delivery channel */ + private MessageExchangeReceiver mMsgExchReceiver; + + /** + * constructor for the ComponentLifecycle implementation. + * @param compRuntime + */ + protected BasicComponentLifeCycle(Component compRuntime) { + this.mCompRuntime = compRuntime; + } + /** + * @return Component + */ + public final Component getComponentRuntime() { + return this.mCompRuntime; + } + /** + * @return ComponentContext component context. + */ + public final ComponentContext getComponentContext() { + return mComponentContext; + } + /** + * @return component name + */ + protected String getComponentName() { + return (this.mComponentContext != null) ? + this.mComponentContext.getComponentName() : null; + } + /////////////////////////////////////////////////////////////////////////// + // ComponentLifeCycle interface implemenation + /////////////////////////////////////////////////////////////////////////// + + /** + * Initializes the component lifecycle. This method makes sure that the + * component context passed by the jbi runtime is saved in the lifecycle + * object before calling the other component initialization methods to + * completely initialize the component. + * @param context Component context + * @see javax.jbi.component.ComponentLifeCycle${symbol_pound}init(javax.jbi.component.ComponentContext) + * @throws javax.jbi.JBIException on error + */ + public final void init(ComponentContext context) throws JBIException { + + if ( context == null ) { + throw new JBIException("Null Component Context received in " + + "Component Lifecycle init "); + } + this.mComponentContext = context; // 0. save the component context passed by jbi framework. + // initialize the content + initGlobalContext(); // 1. Initialize component runtime context. + registerExtensionMBean(); // 2. Create and register extension mbean. + openDeliveryChannel(); // 3. Open delivery channel. + initMessageExchangeReceiver(); // 4. Create message exchange receiver. + doInit(); // 5. Do any component specific initialization such + // as static service providers and consumers initialization. + + this.getLogger().fine("Component " + this.getComponentName() + " initialized"); + } + + /** + * Starts the component. Extended classes can override/implement the methods called + * in this method to provide component specify start functionality. + * + * @see javax.jbi.component.ComponentLifeCycle${symbol_pound}start() + * @throws javax.jbi.JBIException on error + */ + public final void start() throws JBIException { + + doStart(); // 1. do any other component specific start tasks such as + // activating any static service providers and consumers. + startMessageExchangeProcessing(); // 2. begin accepting and processing message exchanges. + + this.getLogger().fine("Component " + this.getComponentName() + " started"); + } + + /** + * Stop the component.Extended classes can override/implement the methods called + * in this method to provide component specify stop functionality. + * @throws javax.jbi.JBIException + * @see javax.jbi.component.ComponentLifeCycle${symbol_pound}stop() + */ + public final void stop() throws JBIException { + + stopMessageExchangeProcessing(); // 1. stop accepting and processing message exchanges. + doStop(); // 2. do any other component specific stop tasks such as + // deactivating any static service providers and consumers. + this.getLogger().fine("Component " + this.getComponentName() + " stopped."); + } + + /** + * Shut down the component. Extended classes can override/implement the methods called + * in this method to provide component specify shut down functionality. + * @throws javax.jbi.JBIException + * @see javax.jbi.component.ComponentLifeCycle${symbol_pound}shutDown() + */ + public final void shutDown() throws JBIException { + // clean up all resources. + shutdownMessageExchangeReceiver(); // 1. remove the message receiver. + closeDeliveryChannel(); // 2. close delivery channel + unregisterExtensionMBean(); // 3. unregister and remove extension mbean if exists. + doShutDown(); // 4. do any other component specific clean up tasks such + // as clean any static service providers and consumer resource. + this.getLogger().fine("Component " + this.getComponentName() + " shut down"); + } + /** + * create jmx object name for the extension mbean. default implementation does + * not required to have the extension mbean. + * @return ObjectName of the extension mbean + */ + protected ObjectName createExtensionMBeanName() { + return null; + } + /** + * gets the reference to the extension mbean name. + * @see javax.jbi.component.ComponentLifeCycle${symbol_pound}getExtensionMBeanName() + * @return ObjectName of the extension mbean objectname or null if component + * does not support extension mbean + */ + public final ObjectName getExtensionMBeanName() { + if ( this.mExtensionMBeanName == null ) { + this.mExtensionMBeanName = this.createExtensionMBeanName(); + } + return this.mExtensionMBeanName; + } + /** + * create mbean implementation for the extension mbean as a StandardMBean. default + * implementation does not require the extension mbean + * @return the ExtensionMBean implementation as StandardMBean + */ + protected StandardMBean createExtensionMBean() { + return null; + } + /** + * gets the reference to the extension mbean. + * @return extension mbean implementation or null if component does not support. + */ + protected final StandardMBean getExtensionMBean() { + if ( this.mExtensionMBeanImpl == null ) { + this.mExtensionMBeanImpl = this.createExtensionMBean(); + } + return this.mExtensionMBeanImpl; + } + /** + * if there is an extension mbean supported by the component, then register + * it with the mbean server. + * @throws JBIException on error registering mbean + */ + protected final void registerExtensionMBean() throws JBIException { + // creatre the extension mbean's object name + ObjectName mbeanName = this.getExtensionMBeanName(); + // create the extension mbean implemenation. + StandardMBean mbeanImpl = this.getExtensionMBean(); + + if ( mbeanName == null || mbeanImpl == null ) { + this.getLogger().fine(this.getComponentName() + + " Does not have Extension MBean implemenation "); + return; + } + // register with mbean only if object name and implementation are non null + try { + MBeanServer mbServer = RuntimeHelper.getComponentContext().getMBeanServer(); + mbServer.registerMBean(mbeanImpl, mbeanName); + } catch (Exception e) { + throw new JBIException("Failed to register Extension MBean for " + + this.getComponentName(), e); + } + } + /** + * remove the registered extension mbean from the mbean server if any. + */ + protected final void unregisterExtensionMBean() { + ObjectName mbeanName = this.getExtensionMBeanName(); + if ( mbeanName == null ) { + return; + } + try { + MBeanServer mbServer = RuntimeHelper.getComponentContext().getMBeanServer(); + mbServer.unregisterMBean(mbeanName); + } catch (Exception e) { + this.getLogger().log(Level.WARNING, + "Failed to unregister Extension MBean from MBeanServer for " + this.getComponentName(), e); + } + } + /** + * creates MessageExchangeReceiver implementation that handles receiving and processing + * the message exchanges from the delivery channel. Component should implement + * this method to provide the MessageReceiver. + * + * Component may return null indicating that they don't need the message receiver + * that can receive and process message exchanges from delivery channel. For example, + * components that have only service consumers which send a synchronous messages to + * providers don't need this. + * + * @throws java.lang.Exception + * @return MessageExchangeReceiver implementation. null if the component does not support it. + * @see com.sun.jbi.sample.component.common.DefaultComponentLifecycle${symbol_pound}createMessageExchangeReceiver + */ + protected MessageExchangeReceiver createMessageExchangeReceiver() { + return null; + } + /** + * returns the message exchange receiver implementation reference + * @return MessageExchangeReceiver interface + */ + protected final MessageExchangeReceiver getMessageExchangeReceiver() { + if ( this.mMsgExchReceiver == null ) { + this.mMsgExchReceiver = createMessageExchangeReceiver(); + } + return this.mMsgExchReceiver; + } + /** + * creates a message receiver object as part of the component initialization. + * @throws javax.jbi.JBIException + */ + protected void initMessageExchangeReceiver() throws JBIException { + // create and initialize the MessageExchangeReceiver + MessageExchangeReceiver mxReceiver = getMessageExchangeReceiver(); + if ( mxReceiver != null ) { + mxReceiver.initReceiver(); + } + } + /** + * allows the component to accept the message exchange objects from the + * delivery channel and process it as part of the component startup process. + * @throws javax.jbi.JBIException + */ + protected void startMessageExchangeProcessing() throws JBIException { + // start message processing + MessageExchangeReceiver mxReceiver = getMessageExchangeReceiver(); + if ( mxReceiver != null ) { + mxReceiver.startProcessing(); + } + } + /** + * stops the component from accepting the message exchange objects from the + * delivery channel as part of the component stop process + * @throws javax.jbi.JBIException + */ + protected void stopMessageExchangeProcessing() throws JBIException { + // stop message processing + MessageExchangeReceiver mxReceiver = getMessageExchangeReceiver(); + if ( mxReceiver != null ) { + mxReceiver.stopProcessing(); + } + } + /** + * removes the message receiver as part of the component shutdown process + * @throws javax.jbi.JBIException + */ + protected void shutdownMessageExchangeReceiver() throws JBIException { + // clean up message processing. + MessageExchangeReceiver mxReceiver = getMessageExchangeReceiver(); + if ( mxReceiver != null ) { + mxReceiver.shutdownReceiver(); + } + } + /** + * Returns logger initialized from the component context or a default logger. + * @return Logger + */ + protected Logger getLogger() { + return RuntimeHelper.getLogger(); + } + /** + * initializes the RuntimeContext during component init lifecycle phase. This + * includes setting the ComponentContext and loggers etc. extended classes must + * save the component context in the RuntimeContext in this methods implementation. + * @see com.sun.jbi.sample.component.common.DefaultComponentLifecycle${symbol_pound}initGlobalContext + */ + protected void initGlobalContext() { + RuntimeContext.getInstance().setComponentContext(this.getComponentContext()); + RuntimeContext.getInstance().setLogger(this.getClass().getName(), null); + } + /** opens the delivery channel to accept or send message exchange objects + * @see com.sun.jbi.sample.component.common.DefaultComponentLifecycle${symbol_pound}openDeliveryChannel + */ + protected void openDeliveryChannel() { + try { + DeliveryChannel channel = this.getComponentContext().getDeliveryChannel(); + RuntimeContext.getInstance().setDeliveryChannel(channel); + } catch (MessagingException ex) { + ex.printStackTrace(); + } + } + /** closes the delivery channel as part of the component shutdown process. + * @see com.sun.jbi.sample.component.common.DefaultComponentLifecycle${symbol_pound}closeDeliveryChannel + */ + protected void closeDeliveryChannel() { + // closes delivery channel and remove the reference. + try { + DeliveryChannel channel = RuntimeHelper.getDeliveryChannel(); + if ( channel != null ) { + channel.close(); + } + } catch (MessagingException ex) { + ex.printStackTrace(); + } finally { + RuntimeContext.getInstance().setDeliveryChannel(null); + } + } + /** + * chance to extended classes to do any extra component specific init tasks. If the component + * supports static service providers or consumers without deployment support, they can be + * initialized here in the class extended from this class in implementing such a component. + * This method is invoked in the implementation of ComponentLifeCycle${symbol_pound}init method by this class. + * @throws javax.jbi.JBIException + * @see com.sun.jbi.sample.component.common.AbstractComponentLifecycle${symbol_pound}init + */ + protected void doInit() throws JBIException { + //NOOP + } + /** + * chance to extended classes to do any extra component specific start tasks. If the component + * supports static service providers or consumers without deployment support, they can be + * activated here in the class extended from this class in implementing such a component. + * This method is invoked in the implementation of ComponentLifeCycle${symbol_pound}start method by this class. + * @throws javax.jbi.JBIException + * @see com.sun.jbi.sample.component.common.AbstractComponentLifecycle${symbol_pound}start + */ + protected void doStart() throws JBIException { + //NOOP + } + /** + * chance to extended classes to do any extra component specific stop tasks. If the component + * supports static service providers or consumers without deployment support, they can be + * deactivated here in the class extended from this class in implementing such a component. + * This method is invoked in the implementation of ComponentLifeCycle${symbol_pound}stop method by this class. + * @throws javax.jbi.JBIException + * @see com.sun.jbi.sample.component.common.AbstractComponentLifecycle${symbol_pound}stop + */ + protected void doStop() throws JBIException { + //NOOP + } + /** + * chance to extended classes to do any extra component specific shutdown tasks.If the component + * supports static service providers or consumers without deployment support, they can be + * cleaned up here in the class extended from this class in implementing such a component. + * This method is invoked in the implementation of ComponentLifeCycle${symbol_pound}shutdown method by this class. + * @throws javax.jbi.JBIException + * @see com.sun.jbi.sample.component.common.AbstractComponentLifecycle${symbol_pound}shutdown + */ + protected void doShutDown() throws JBIException { + //NOOP + } + +} diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/ComponentInstaller.java b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/ComponentInstaller.java new file mode 100644 index 000000000..748a57ade --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/ComponentInstaller.java @@ -0,0 +1,275 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + /* + * ComponentInstaller.java + */ +package net.openesb.component.${componentName}.common; + +import java.util.List; +import java.util.logging.Level; +import javax.jbi.component.Bootstrap; +import javax.jbi.component.InstallationContext; +import java.util.logging.Logger; +import javax.jbi.JBIException; +import javax.management.MBeanServer; +import javax.management.ObjectName; +import javax.management.StandardMBean; + +/** + * This class implements the javax.jbi.component.Bootstrap. This class implements + * the minimum required functionality for component installation contract + * of the jbi component in the jbi environment. It also takes care of maintaining + * the installation context reference and installation specific logger creation and + * installation extension mbean registration and unregistration during initialization + * and cleanup. Extended classes only need to supply the mbean name and its implementation + * object for the installation extensions. + * + * It makes sure that the installation context and the loggers are available to + * the classes extended from this class to add more installation specific functionality. + * + * Service engine or a binding component installation implementation can directly use + * this class or extend this class to add more functionality to their installation + * process. + * + * @see javax.jbi.Bootstrap + * @author chikkala + */ +public class ComponentInstaller implements Bootstrap { + /** default logger*/ + private Logger mDefLogger; + /** bootstrap logger */ + private Logger mBTLogger ; + /** Installation Context . */ + private InstallationContext mInstallationContext; + /** Extension Mbean Name*/ + private ObjectName mExtensionMBeanName; + /** Extension Mbean Implementation*/ + private StandardMBean mExtensionMBeanImpl; + + /** Constructor to create the ComponentInstaller. */ + public ComponentInstaller() { + } + /** + * @return InstallationContext of the component. + */ + public final InstallationContext getInstallationContext() { + return this.mInstallationContext; + } + protected String getComponentName() { + return (this.mInstallationContext != null) ? + this.mInstallationContext.getComponentName() : null; + } + /** + * @return logger initialized from the installation context or a default + * logger. + */ + protected Logger getLogger() { + // try init bootstrap logger + if (this.mBTLogger == null && this.mInstallationContext != null ) { + try { + this.mBTLogger = + this.mInstallationContext.getContext().getLogger(this.getClass().getName(), null); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + // init default logger if required + if ( this.mBTLogger == null && this.mDefLogger == null) { + this.mDefLogger = Logger.getLogger(this.getClass().getName(), null); + } + return (this.mBTLogger != null) ? this.mBTLogger : this.mDefLogger; + } + /** + * Initializes the installation environment for a component. + * @see javax.jbi.component.Bootstrap${symbol_pound}init(javax.jbi.component.InstallationContext) + */ + public final void init(InstallationContext installContext) throws javax.jbi.JBIException { + + if ( installContext == null ) { + throw new JBIException("Null Installation Context received in " + + "Component Bootstrap initialization"); + } + // save the installation context reference passed by the jbi framework. + this.mInstallationContext = installContext; + registerExtensionMBean(); // create and register extension mbean + doInit(); // do any other extra initialization required specific to the component installation. + // initialize logger + this.getLogger().fine(this.mInstallationContext.getComponentName() + + " : Component Installer initialized"); + } + /** + * default implementation just logs the method call. extended classes should override this. + * @see javax.jbi.component.Bootstrap${symbol_pound}onInstall() + */ + public void onInstall() throws javax.jbi.JBIException { + //TODO: do required initializaton and resource creation + this.getLogger().fine(this.mInstallationContext.getComponentName() + + " : Component installed."); + } + /** + * default implementation just logs the method call. + * @see javax.jbi.component.Bootstrap${symbol_pound}onUninstall() + */ + public void onUninstall() throws javax.jbi.JBIException { + //TODO: do clean up the resource and other stuff. + this.getLogger().fine(this.mInstallationContext.getComponentName() + + " : Component uninstalled"); + } + /** + * default noop implementation of the cleanup. + * @see javax.jbi.component.Bootstrap${symbol_pound}cleanUp() + */ + public final void cleanUp() throws javax.jbi.JBIException { + + unregisterExtensionMBean(); // unregister extension mbean and remove it + doCleanUp(); // do any other extra cleanup specific to the component installation. + this.getLogger().fine( this.mInstallationContext.getComponentName() + + " Component Installer Cleaned up"); + } + + /** + * create jmx object name for the extension mbean. Extended classes should + * return the component specific installer extension mbean name here. + */ + protected ObjectName createExtensionMBeanName() { + return null; + } + /** + * default implementation that does not have extension mbean return null. + * @see javax.jbi.component.Bootstrap${symbol_pound}getExtensionMBeanName() + */ + public final javax.management.ObjectName getExtensionMBeanName() { + if ( this.mExtensionMBeanName == null ) { + this.mExtensionMBeanName = createExtensionMBeanName(); + } + return this.mExtensionMBeanName; + } + /** + * create mbean implementation for the extension mbean as a StandardMBean. Extended + * classes should return the installer extension mbean implementation as the + * standard mbean. + */ + protected StandardMBean createExtensionMBean() { + return null; + } + /** + * returns the installation extension mbean implementation. + * @return StandardMBean for the extension mbean implementation. + */ + protected final StandardMBean getExtensionMBean() { + if ( this.mExtensionMBeanImpl == null ) { + this.mExtensionMBeanImpl = this.createExtensionMBean(); + } + return this.mExtensionMBeanImpl; + } + /** + * Chance to extended classes to do the component installation specific init. + * Installation context will be initialized before calling this method. So, + * initialize other things if required in this method. + * @throws javax.jbi.JBIException on error + * @see com.sun.jbi.sample.component.common.ComponentInstaller${symbol_pound}init( + * javax.jbi.component.InstallationContext) + */ + protected void doInit() throws JBIException { + this.getLogger().info(this.getInstallationContext().getComponentName() + + " : Component Installer initialized"); + } + /** + * Chance to extended classes to do the component installation specific cleanup. + * ExtensionMbean will be unregistered before calling this method. + * @throws javax.jbi.JBIException on error + * @see com.sun.jbi.sample.component.common.ComponentInstaller${symbol_pound}cleanUp( + * javax.jbi.component.InstallationContext) + */ + protected void doCleanUp() throws JBIException { + this.getLogger().fine(this.getInstallationContext().getComponentName() + + " : Component Installer doCleanUp"); + } + /** + * if there is an extension mbean supported by the component, then register + * it with the mbean server. + */ + protected void registerExtensionMBean() throws JBIException { + // creatre the installation extension mbean's object name + ObjectName mbeanName = this.getExtensionMBeanName(); + // create the extension mbean implemenation if the object name is created. + StandardMBean mbeanImpl = this.getExtensionMBean(); + + if ( mbeanName == null || mbeanImpl == null ) { + this.getLogger().fine(this.getComponentName() + + " Does not have Installation Extension MBean implemenation "); + return; + } + // register with mbean only if object name and implementation are non null + try { + MBeanServer mbServer = this.getInstallationContext().getContext().getMBeanServer(); + mbServer.registerMBean(mbeanImpl, mbeanName); + } catch (Exception e) { + throw new JBIException("Failed to register Installation Extension MBean for " + + this.getComponentName(), e); + } + } + /** + * remove the registered extension mbean from the mbean server. + */ + protected void unregisterExtensionMBean() { + ObjectName mbeanName = this.getExtensionMBeanName(); + if ( mbeanName == null ) { + return; + } + try { + MBeanServer mbServer = this.getInstallationContext().getContext().getMBeanServer(); + mbServer.unregisterMBean(mbeanName); + } catch (Exception e) { + this.getLogger().log(Level.WARNING, + "Failed to unregister Installation extension MBean for " + this.getComponentName(), e); + } + } + /** + * This method is called by the JBI runtime to allow a component to upgrade + * it's workspace and any existing Service Units to match the new version of + * the component. The JBI runtime copies the existing workspace root to the + * new workspace root prior to calling this method, so that the component + * can examine the contents of the workspace root to determine the version + * of the component from which the upgrade is being made. All updates to the + * workspace root are done in-place; in the event of a failure, the JBI + * runtime reverts back to the original workspace root, the original install + * root, and the original Service Unit roots for the component. + * + * Note1: The component must ensure that it never holds open references + * to any files in the workspace root or any of the Service Unit roots upon + * returning from this method. Failure to do so will cause problems when + * the runtime attempts to complete the upgrade processing. + * + * Note2: The installation context that is normally initialized + * by the runtime by calling ${symbol_pound}init method of the javax.jbi.Bootstrap interface + * before install and uninstall will not be called before calling this + * upgrade method. So, installation context can not be used in this method's + * implementation. + * + * Note3: Since there won't be any installation context available, the logger + * that returned from the ${symbol_pound}getLogger method is a default logger created using + * the package name of this class or extended class if the method is overridden + * in the extended class. + * + * @param workspaceRoot the workspace root for the new version of the + * component that will replace the currently installed version. This is + * populated with the contents of the original workspace root and the + * component must update it to match the new version of the component. + * @param serviceUnitRoots a list of directory paths to all of the Service + * Units currently deployed to the component. The component must update all + * of these to match the new version of the component. + * @exception JBIException when there is an error requiring that the upgrade + * be terminated. + */ + public void upgrade(String workspaceRoot, List serviceUnitRoots) + throws javax.jbi.JBIException + { + //TODO: override this method in the extended class to handle the + // workspace root and service unit roots upgrade according to the + // component's requirement. + this.getLogger().fine("Default upgrade implementation. " + + "TODO: Implement workspace root and service unit roots upgrade."); + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/ComponentRuntime.java b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/ComponentRuntime.java new file mode 100644 index 000000000..50b0bd3b5 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/ComponentRuntime.java @@ -0,0 +1,174 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * ComponentRuntime.java + */ +package net.openesb.component.${componentName}.common; + +import java.util.logging.Logger; +import javax.jbi.component.Component; +import javax.jbi.component.ComponentContext; +import javax.jbi.component.ComponentLifeCycle; +import javax.jbi.component.ServiceUnitManager; +import javax.jbi.messaging.MessageExchange; +import javax.jbi.servicedesc.ServiceEndpoint; +import org.w3c.dom.Document; +import org.w3c.dom.DocumentFragment; + +/** + * This class implements javax.jbi.component.Component interface which is + * responsible for creating the Component Lifecycle implementation and the + * ServiceUnitManager implementation for the jbi component. + * + * This class makes sure that non null component lifecycle implementation is + * returns by this class or any classes extended from this class which is + * required as a component contract. It also provides default implementation of + * all methods of the Component interface which the extended classes can + * override to add more functionality. + * + * @see javax.jbi.component.Component + * @author chikkala + */ +public class ComponentRuntime implements Component { + /** Component LifeCycle implementation */ + private ComponentLifeCycle mLifeCycle; + /** ServiceUnitManager implementation */ + private ServiceUnitManager mSUManager; + /** default logger*/ + private Logger mDefLogger; + + /** Creates a new instance of ComponentImpl */ + public ComponentRuntime() { + this.mLifeCycle = null; + this.mSUManager = null; + } + /** + * returns the ComponentContext. Any component runtime class extended from + * this class can override this method to return their own reference to the + * ComponentContext. + * @return ComponentContext component context. + */ + public ComponentContext getComponentContext() { + ComponentContext ctx = null; + if ( this.mLifeCycle != null && this.mLifeCycle instanceof BasicComponentLifeCycle ) { + ctx = ((BasicComponentLifeCycle) this.mLifeCycle).getComponentContext(); + } + return ctx; + } + /** + * Returns logger initialized from the component context or a default logger. + * @return Logger + */ + public Logger getLogger() { + Logger logger = null; + if ( this.mLifeCycle != null && this.mLifeCycle instanceof BasicComponentLifeCycle ) { + logger = ((BasicComponentLifeCycle) this.mLifeCycle).getLogger(); + } + // init default logger if required + if ( logger == null && this.mDefLogger == null) { + this.mDefLogger = Logger.getLogger(this.getClass().getName(), null); + } + return (logger != null) ? logger : this.mDefLogger; + } + /** + * return the ComponentLifeCycle implementation. if returned null, the + * ComponentLifeCycleImpl will be used as the component lifecycle + * Extended classes can override this method and do their own ComponentLifecyle + * specific creation. + */ + protected ComponentLifeCycle createComponentLifeCycle() { + return new BasicComponentLifeCycle(this); + } + /** + * Get the life cycle control interface for this component. + * + * @return the life cycle control interface for this component + * @see javax.jbi.Component${symbol_pound}getLifeCycle() + */ + public final ComponentLifeCycle getLifeCycle() { + if ( this.mLifeCycle == null ) { + this.mLifeCycle = createComponentLifeCycle(); + if ( this.mLifeCycle == null ) { + this.getLogger().fine("Creating basic component lifecycle implemenation"); + // use the default ComponentLifeCycle Impl if a component + // specific implementation return null in createComponentLifeCycle. + this.mLifeCycle = new BasicComponentLifeCycle(this); + } + } + return this.mLifeCycle; + } + /** + * if this component supports service unit deployment, then return the + * service unit manager, else return null. + * Extended classes can override this method and do their own ServiceUnitManager + * specific creation. + */ + protected ServiceUnitManager createServiceUnitManager() { + return null; + } + /** + * Get the Service Unit manager for this component. + * + * @return the ServiceUnitManager for this component, or + * null if there is none. + * @see javax.jbi.Component${symbol_pound}getServiceUnitManager() + */ + public final ServiceUnitManager getServiceUnitManager() { + if ( this.mSUManager == null ) { + this.mSUManager = createServiceUnitManager(); + } + return this.mSUManager; + } + /** + * Retrieves a DOM representation containing metadata which describes the + * service provided by this component, through the given endpoint. + * + * Default implementation does not support service description. + * + * @see javax.jbi.Component${symbol_pound}getServiceDescription(javax.jbi.servicedesc.ServiceEndpoint) + */ + public Document getServiceDescription(ServiceEndpoint serviceEndpoint) { + return null; + } + /** + * This method is called by JBI to check if this component, in the role of + * provider of the service indicated by the given exchange, can actually + * perform the operation desired. + * + * Default implementation has no policy and allows all exchanges with consumer. + * + * @see javax.jbi.Component${symbol_pound}isExchangeWithProviderOkay( + * javax.jbi.servicedesc.ServiceEndpoint, javax.jbi.messaging.MessageExchange) + */ + public boolean isExchangeWithConsumerOkay( + ServiceEndpoint serviceEndpoint, MessageExchange messageExchange) { + return true; + } + /** + * This method is called by JBI to check if this component, in the role of + * consumer of the service indicated by the given exchange, can actually + * interact with the provider properly. The provider is described by the + * given endpoint and the service description supplied by that endpoint. + * + * Default implementation has no policy and allows all exchanges with provider. + * + * @see javax.jbi.Component${symbol_pound}isExchangeWithProviderOkay( + * javax.jbi.servicedesc.ServiceEndpoint, javax.jbi.messaging.MessageExchange) + */ + public boolean isExchangeWithProviderOkay( + ServiceEndpoint serviceEndpoint, MessageExchange messageExchange) { + return true; + } + /** + * Resolve the given endpoint reference. + * + * Default implementation does not have any XML dialect. So can not resolve the + * endpoint from the document fragment. + * + * @see javax.jbi.Component${symbol_pound}resolveEndpointReference(org.w3c.dom.DocumentFragment) + */ + public ServiceEndpoint resolveEndpointReference(DocumentFragment documentFragment) { + return null; + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/DefaultMessageExchangeReceiver.java b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/DefaultMessageExchangeReceiver.java new file mode 100644 index 000000000..a64ca5141 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/DefaultMessageExchangeReceiver.java @@ -0,0 +1,180 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * DefaultMessageExchangeReceiver.java + * + */ + +package net.openesb.component.${componentName}.common; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; +import javax.jbi.JBIException; +import javax.jbi.messaging.DeliveryChannel; +import javax.jbi.messaging.ExchangeStatus; +import javax.jbi.messaging.MessageExchange; +import javax.jbi.messaging.MessagingException; + +/** + * This class implements MessageExchangeReceiver interface. This is a default implementation that + * demonstrates the multi-threaded environment to receive and process message exchanges from the + * delivery channel. It uses a main thread to receive message exchanges from the delivery channel + * and then processes the received message exchanges in a individual threads from the thread pool. + * The controller methods of MessageExchangeReceiver controls the main thread and the thread pool + * execution. + * + * @author chikkala + */ +public class DefaultMessageExchangeReceiver implements MessageExchangeReceiver { + + /** delivery channel accept time out */ + private final static long DC_ACCEPT_TIME_OUT = 3000; // milliseconds + /** receiver thread wait time before polling for messages after woke up **/ + private final static long RECEIVER_WAIT_TIME = 2000; // milliseconds + /** receiver thread wait time before force shutdown */ + private final static long RECEIVER_SHUTDOWN_WAIT_TIME = 10; // seconds + /** handler threads wait time before forced shutdown */ + private final static long HANDLERS_SHUTDOWN_WAIT_TIME = 30; // seconds + /** handler thread pool size */ + private final static int HANDLER_THREAD_POOL_SIZE = 5; + /** receiver thread accept message exchange condition */ + private Boolean mCanAccept = false; + /** receiver thread termination condition */ + private Boolean mContinue = true; + /** receiver thread executor service */ + private ExecutorService mReceiverThreadMgr; + /** handler thread executor service */ + private ExecutorService mHandlerThreadPool; + + /** no default constructor for extended classes */ + public DefaultMessageExchangeReceiver() { + } + /** + * this method is called from the ComponentLifecyle.init method of the AbstractComponentLifecycle + * to initialize the message exchange receiving resources such as threads and thread pools + * throws JBIException on error + */ + public final void initReceiver() throws JBIException { + + this.mHandlerThreadPool = Executors.newFixedThreadPool(HANDLER_THREAD_POOL_SIZE); + this.mReceiverThreadMgr = Executors.newSingleThreadExecutor(); + + this.mReceiverThreadMgr.execute(new Runnable() { + public void run() { + Thread t = Thread.currentThread(); + while ( mContinue ) { + if (mCanAccept) { + receiveAndProcessMessageExchange(); + } else { + try { + t.sleep(RECEIVER_WAIT_TIME); + } catch (InterruptedException interruptException) { + // someone must have interrupted this thread + // do nothing + RuntimeHelper.logDebug("Interrupted the MessageReceiverThread in Sleep"); + } + } + } + } + }); + } + /** + * this method is called from the ComponentLifecyle.shutdown method of the AbstractComponentLifecycle + * to cleanup the message exchange receiving resources such as threads and thread pools. + * throws JBIException on error + */ + public final void shutdownReceiver() throws JBIException { + + synchronized ( mContinue ) { + mContinue = false; + } + boolean terminated = false; + try { + this.mReceiverThreadMgr.shutdown(); + terminated = this.mReceiverThreadMgr.awaitTermination( + RECEIVER_SHUTDOWN_WAIT_TIME, TimeUnit.SECONDS); + } catch (InterruptedException ex) { + RuntimeHelper.logDebug(ex); + } finally { + if ( !terminated ) { + RuntimeHelper.logDebug("Message Receiver not shutdown. Forcing shutdown"); + this.mReceiverThreadMgr.shutdownNow(); + } + } + shutdownHandlers(); + } + /** + * shutdown all the working threads from the thread pool. + */ + private final void shutdownHandlers() throws JBIException { + + boolean terminated = false; + try { + this.mHandlerThreadPool.shutdown(); + terminated = this.mHandlerThreadPool.awaitTermination( + HANDLERS_SHUTDOWN_WAIT_TIME, TimeUnit.SECONDS); + } catch (InterruptedException ex) { + RuntimeHelper.logDebug(ex); + } finally { + if ( !terminated ) { + RuntimeHelper.logDebug("Handler threads not shutdown. Forcing shutdown"); + this.mHandlerThreadPool.shutdownNow(); + } + } + } + /** + * this method is called from the ComponentLifecyle.start method of the AbstractComponentLifecycle + * to start receiving the message exchanges from the delivery channel and process them. + * throws JBIException on error + */ + public final void startProcessing() throws JBIException { + + synchronized ( this.mCanAccept ) { + this.mCanAccept = true; + } + } + /** + * this method is called from the ComponentLifecyle.stop method of the AbstractComponentLifecycle + * to stop receiving the message exchanges from the delivery channel. + * throws JBIException on error + */ + public final void stopProcessing() throws JBIException { + + synchronized ( this.mCanAccept ) { + this.mCanAccept = false; + } + } + + protected MessageExchangeSupport getMessageExchangeSupport() { + return RuntimeHelper.getMessageExchangeSupport(); + } + + private void receiveAndProcessMessageExchange() { + try { + DeliveryChannel channel = RuntimeHelper.getDeliveryChannel(); + if ( channel == null ) { + RuntimeHelper.logDebug("DeliveryChannel Not Opened for receiving messages"); + return; + } + final MessageExchange msgExchange = channel.accept(DC_ACCEPT_TIME_OUT); + if ( msgExchange == null ) { + // delivery channel timeout occurred. do nothing. + // RuntimeHelper.logDebug("DeliveryChannel returned null message exchange from accept"); + return; + } + final ExchangeStatus status = msgExchange.getStatus(); + // process message exchange in a separate thread + this.mHandlerThreadPool.execute(new Runnable() { + public void run() { + getMessageExchangeSupport().fireMessageExchangeReceived(status, msgExchange); + } + }); + + } catch (MessagingException ex) { + RuntimeHelper.logWarning(ex); + ex.printStackTrace(); + } + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/MessageExchangeHandler.java b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/MessageExchangeHandler.java new file mode 100644 index 000000000..4631b23a1 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/MessageExchangeHandler.java @@ -0,0 +1,31 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * MessageExchangeHandler.java + * + */ + +package net.openesb.component.${componentName}.common; + +import javax.jbi.messaging.ExchangeStatus; +import javax.jbi.messaging.MessageExchange; + +/** + * This interface is a Handler to perform message exchanges when the component + * receives the MessageExchange object from the delivery channel. + * Implementation of this interface should implement the processing of + * the active, error, done status of the MessageExchange object according to + * the MEP for which the MessageExchange object is created. + * + * @author chikkala + */ +public interface MessageExchangeHandler { + /** + * this method will be invoked to process the MessageExchange + * object. + * @param msgExchange MessageExchange object to process. + */ + void processMessageExchange(ExchangeStatus status, MessageExchange msgExchange); + +} diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/MessageExchangeListener.java b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/MessageExchangeListener.java new file mode 100644 index 000000000..7701fc300 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/MessageExchangeListener.java @@ -0,0 +1,36 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * MessageExchangeListener.java + */ + +package net.openesb.component.${componentName}.common; + +import javax.jbi.messaging.ExchangeStatus; +import javax.jbi.messaging.MessageExchange; + +/** + * This interface defines the notification mechanism with which the message exchange object received + * from the delivery channel is processed by the interesting parties. A particular service endpoint + * implementation would first register the implementation of this interface with MessageExchangeSupport + * to get the notification of a received message exchange on a particular service endpoint and the + * implementation of the interface would process the message exchange when notified. + * + * When the com.sun.jbi.sample.component.common.DefaultMessageExchangeReceiver receives the message exchange + * object, it asks the MessageExchangeSupport to notify the MessageExchangeLister that is registered for the + * received message exchange object to process the message exchange object. + * @see com.sun.jbi.sample.component.common.MessageExchangeSupport + * @see com.sun.jbi.sample.component.common.DefaultMessageExchangeReceiver + * @see com.sun.jbi.sample.component.common.deployment.ProviderEndpoint + * @see com.sun.jbi.sample.component.common.deployment.ProviderEndpoint + * @author chikkala + */ +public interface MessageExchangeListener { + /** + * MessageExchangeSupport will call this method to notify the lister implementation that a + * message exchange is received from the delivery channel. + * @param me MessageExchange Object + */ + void messageExchangeReceived(ExchangeStatus status, MessageExchange me); +} diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/MessageExchangeReceiver.java b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/MessageExchangeReceiver.java new file mode 100644 index 000000000..3efd441f4 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/MessageExchangeReceiver.java @@ -0,0 +1,47 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * MessageExchangeReceiver.java + * + */ + +package net.openesb.component.${componentName}.common; + +import javax.jbi.JBIException; + +/** + * This interface provides the methods can controls the receiving and processing of the message + * exchange objects from the delivery channel during the component lifecycle operations. + * The implementation of this interface can use multi-threaded environment to receive and process + * message exchanges from the delivery channel during the component lifecycle. + * @see com.sun.jbi.sample.component.common.DefaultMessageExchangeReceiver + * @author chikkala + */ +public interface MessageExchangeReceiver { + /** + * this method is called from the ComponentLifecyle.init method of the AbstractComponentLifecycle + * to initialize the message exchange receiving resources such as threads and thread pools + * throws JBIException on error + */ + void initReceiver() throws JBIException; + /** + * this method is called from the ComponentLifecyle.start method of the AbstractComponentLifecycle + * to start receiving the message exchanges from the delivery channel and process them. + * throws JBIException on error + */ + void startProcessing() throws JBIException; + /** + * this method is called from the ComponentLifecyle.stop method of the AbstractComponentLifecycle + * to stop receiving the message exchanges from the delivery channel. + * throws JBIException on error + */ + void stopProcessing() throws JBIException; + /** + * this method is called from the ComponentLifecyle.shutdown method of the AbstractComponentLifecycle + * to cleanup the message exchange receiving resources such as threads and thread pools. + * throws JBIException on error + */ + void shutdownReceiver() throws JBIException; + +} diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/MessageExchangeSupport.java b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/MessageExchangeSupport.java new file mode 100644 index 000000000..2ebdc602d --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/MessageExchangeSupport.java @@ -0,0 +1,170 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * MessageExchangeSupport.java + * + */ + +package net.openesb.component.${componentName}.common; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import javax.jbi.messaging.ExchangeStatus; +import javax.jbi.messaging.MessageExchange; +import javax.jbi.messaging.MessageExchange.Role; +import javax.xml.namespace.QName; + +/** + * This class supports the registering and unregistering MessageExchangeListeners and the + * MessageExchangeHandlers that can be used to process the received message exchange from a + * delivery channel. A global reference to this class will be created in RuntimeContext object to + * provide access to this class from any where in the component runtime. + * + * A ProviderEndpoint or ConsumerEndpoint interested in a MessageExchange received from a delivery + * channel for a particular service endpoint will register the MessageExchangeListener with this + * class. The DefaultMessageExchangeReceiver when received a message exchange object from the delivery + * channel uses MessageExchangeSupport.processMessageExchange method to notify the registered listener. + * + * The MessageExchangeListener implementation ( ProviderEndpoint or ConsumerEndpoint ) while processing + * received message ( messageExchangeReceived()) will create and register the message exchange handlers + * to process the message exchange. + * + * @see RuntimeContext${symbol_pound}getMessageExchangeSupport + * @see RuntimeHelper${symbol_pound}getMessageExchangeSupport + * @see DefaultMessageExchangeReceiver${symbol_pound}receiveAndProcessMessageExchange + * @see com.sun.jbi.sample.component.common.deployment.ProviderEndpoint + * @author chikkala + */ +public class MessageExchangeSupport { + /** listener map to notify a message exchange received event */ + private Map mListeners; + /** handlers that can process the message exchange */ + private Map mHandlers; + /** Creates a new instance of MessageExchangeSupport */ + public MessageExchangeSupport() { + this.mListeners = Collections.synchronizedMap(new HashMap()); + this.mHandlers = Collections.synchronizedMap(new HashMap()); + } + /** + * generates key that will be used to store the MessageExchangeListener objects. + * @param serviceName QName of the service + * @param endpointName endpoint name of the service. + */ + public String createListenerKey(Role role, QName interfaceName, QName serviceName, String endpointName) { + + StringBuffer strBuff = new StringBuffer(); + strBuff.append(interfaceName).append("+"); + strBuff.append(serviceName).append("+"); + strBuff.append(endpointName).append("+"); + String roleType = null; + if ( Role.CONSUMER.equals(role) ) { + roleType = "CONSUMER"; + } else if ( Role.PROVIDER.equals(role) ) { + roleType = "PROVIDER"; + } + strBuff.append(roleType); + return strBuff.toString(); + } + /** + * adds message exchange listener who are interested in receiving the notification when the + * message exchange is received from delivery channel. The listener can be registered with the + * following combination of the parameters: (role,interfaceName,serviceName, endpointName), + * (role,interfaceName,null, null), (role, null,serviceName, endpointName), (role, null,serviceName, null) + * + * @param role role of the message exchange listener PROVIDER or CONSUMER - can not be null. + * @param interfaceName QName of the interface ( protType ) - can be null if the serviceName is not null + * @param serviceName QName of the service - can be null if interfaceName is not null. + * @param endpointName endpoint name of the service. - can be null if the serviceName is not null. + * @param listener MessageExchangeListener object + */ + public synchronized void addMessageExchangeListener(Role role, QName interfaceName, QName serviceName, String endpointName, MessageExchangeListener listener) { + String key = createListenerKey(role, interfaceName, serviceName, endpointName); + this.mListeners.put(key, listener); + } + /** + * removes any message exchange listener registered for the service endpoint specified by the serviceName and + * endpoint name. + * @param serviceName QName of the service + * @param endpointName endpoint name of the service. + */ + public synchronized void removeMessageExchangeListener(Role role, QName interfaceName, QName serviceName, String endpointName) { + String key = createListenerKey(role, interfaceName, serviceName, endpointName); + MessageExchangeListener listener = this.mListeners.remove(key); + if ( listener == null ) { + RuntimeHelper.getLogger().fine("No message exchange listener removed with key " + key); + } + } + /** + * finds the MessageExchangeListner registers for the endpoint for which the message exchange is + * received and call the method on the listener + */ + public boolean fireMessageExchangeReceived(ExchangeStatus status, MessageExchange me) { + boolean notified = false; + Role role = me.getRole(); + QName interfaceName = me.getInterfaceName(); + QName serviceName = me.getEndpoint().getServiceName(); + String endpointName = me.getEndpoint().getEndpointName(); + // lookup with complete service description ( role + interface + service + endpoint ) + String key = createListenerKey(role, interfaceName, serviceName, endpointName); + RuntimeHelper.getLogger().fine("looking up for mx listener with key " + key); + MessageExchangeListener listener = this.mListeners.get(key); + + if ( listener == null ) { // lookup with role+interface name + key = createListenerKey(role, interfaceName, null, null); + RuntimeHelper.getLogger().fine("looking up for mx listener with key " + key); + listener = this.mListeners.get(key); + } + if ( listener == null ) { // lookup with role + serviceName + endpointName + key = createListenerKey(role, null, serviceName, endpointName); + RuntimeHelper.getLogger().fine("looking up for mx listener with key " + key); + listener = this.mListeners.get(key); + } + if ( listener == null ) { // lookup with with role + serviceName + key = createListenerKey(role, null, serviceName, null); + RuntimeHelper.getLogger().fine("looking up for mx listener with key " + key); + listener = this.mListeners.get(key); + } + if ( listener == null ) { + RuntimeHelper.getLogger().fine("Could not find listener for message exchange" + me); + notified = false; + } else { + listener.messageExchangeReceived(status,me); + notified = true; + } + return notified; + } + /** + * registers the MessageExchangeHandler implementation against the message exchange id. + * @param me MessageExchange for which the handler need to be assigned + * @param handler MessageExchangeHandler implementation that will be registers. + */ + public synchronized void addMessageExchangeHandler(MessageExchange me, MessageExchangeHandler handler) { + this.mHandlers.put(me.getExchangeId(), handler); + } + /** + * removes the MessageExchangeHandler for the particular message exchange object + */ + public synchronized void removeMessageExchangeHandler(MessageExchange me) { + MessageExchangeHandler handler = this.mHandlers.remove(me.getExchangeId()); + if ( handler == null ) { + RuntimeHelper.getLogger().fine("No MessageExchangeHandler found for removing " + me.getExchangeId()); + } + } + /** + * looks up the registered message exchange handler for the message exchange object + * @param me MessageExchangeHandler. + */ + public synchronized MessageExchangeHandler findMessageExchangeHandler(MessageExchange me) { + return this.mHandlers.get(me.getExchangeId()); + } + /** + * looks up the registered message exchange handler for the message exchange object with Id + * @param exchangeId message exchange object's id + */ + public synchronized MessageExchangeHandler findMessageExchangeHandler(String exchangeId) { + return this.mHandlers.get(exchangeId); + } + +} diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/RuntimeContext.java b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/RuntimeContext.java new file mode 100644 index 000000000..ac67bb2f1 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/RuntimeContext.java @@ -0,0 +1,176 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * RuntimeContext.java + * + */ + +package net.openesb.component.${componentName}.common; + +import java.util.logging.Logger; +import javax.jbi.component.ComponentContext; +import javax.jbi.messaging.DeliveryChannel; + +/** + * This class is global context for all the component runtime to store and + * retrieve the information that should be available anywhere in the component runtime. + * + * Each instance variable of this class will be initialized at various points of the + * component runtime using setter methods on this class. + * + * The two important objects that will be initialized and available from this context are + * ComponentContext and the opened DeliveryChannel objects both of which will be set from the + * implementation {@link BasicComponentLifeCycle}. + * + * Note that the ComponentContext from this global context will not be available until + * the jbi framework calls the init method of the ComponentLifeCycle of the component and + * then intern the implementation of the init method sets the context. + * + * @see BasicComponentLifeCycle${symbol_pound}initGlobalContext + * @see BasicComponentLifeCycle${symbol_pound}openDeliveryChannel + * @see BasicComponentLifeCycle${symbol_pound}closeDeliveryChannel + * @author chikkala + */ +public final class RuntimeContext { + /** RuntimeContext singleton instance */ + private static RuntimeContext sRuntimeContext; + /** default logger*/ + private Logger mDefLogger; + /** Logger object. */ + private Logger mLogger; + /** Holds value of property ComponentContext. */ + private ComponentContext mComponentContext; + /** Holds value of property DeliveryChannel. */ + private DeliveryChannel mDeliveryChannel; + /** MessageExchange processing support **/ + private MessageExchangeSupport mMESupport; + + /** outside code can not instantiate RuntimeContext */ + private RuntimeContext() { + } + /** + * @return RuntimeContext instance. + */ + public static RuntimeContext getInstance() { + if ( sRuntimeContext == null ) { + synchronized (RuntimeContext.class) { + if ( sRuntimeContext == null ) { + sRuntimeContext = new RuntimeContext(); + } + } + } + return sRuntimeContext; + } + /** + * Getter for to obtaining ComponentContext from any where in the component runtime. + * @return ComponentContext. + */ + public ComponentContext getComponentContext() { + return this.mComponentContext; + } + /** + * Sets the Component context reference in Runtime context for global access + * any class in the component runtime. + * com.sun.jbi.sample.component.common.AbstractComponentLifeCycle${symbol_pound}initContext + * method implementation should call this method to set the global context. + * see com.sun.jbi.sample.component.common.DefaultComponentLifeCycle${symbol_pound}initContext + * for details. + * @param componentContext New value of property ComponentContext. + * @see BasicComponentLifeCycle${symbol_pound}initGlobalContext + */ + public void setComponentContext(ComponentContext componentContext) { + if ( this.mComponentContext != null ) { + (new IllegalStateException("Component Context already " + + "initialized in RuntimeContext")).printStackTrace(); + } + this.mComponentContext = componentContext; + } + /** + * Getter for obtaining opened delivery channel from any where in the component runtime. + * @return DeliveryChannel. + */ + public DeliveryChannel getDeliveryChannel() { + return this.mDeliveryChannel; + } + /** + * Sets the opened delivery channel reference in Runtime context for global access + * any class in the component runtime. + * com.sun.jbi.sample.component.common.AbstractComponentLifeCycle${symbol_pound}initContext + * method implementation should call this method to set the global context. + * see com.sun.jbi.sample.component.common.DefaultComponentLifeCycle${symbol_pound}initContext + * for details. + * + * @param componentContext New value of property ComponentContext. + */ + public void setDeliveryChannel(DeliveryChannel deliveryChannel) { + if ( deliveryChannel != null && this.mDeliveryChannel != null ) { + (new IllegalStateException("Delivery Channel already " + + "initialized in RuntimeContext")).printStackTrace(); + } + this.mDeliveryChannel = deliveryChannel; + } + /** + * Sets the logger. + * + * @param name name for the Logger. + * @param resourceBundle resource bundle for the logger. can be null. + */ + public void setLogger(String name, String resourceBundle) { + + if (this.mComponentContext != null) { + // get the logger from component context if the component context is not null + try { + this.mLogger = this.mComponentContext.getLogger(name, resourceBundle); + } catch (Exception ex) { + ex.printStackTrace(); + } + } else { + this.mDefLogger = Logger.getLogger(name, resourceBundle); + } + } + /** + * Returns the logger. + * + * @return Logger + */ + public Logger getLogger() { + + // try init logger + if (this.mLogger == null && this.mComponentContext != null ) { + try { + this.mLogger = + this.mComponentContext.getLogger(this.getClass().getName(), null); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + // init default logger if required + if ( this.mLogger == null && this.mDefLogger == null) { + this.mDefLogger = Logger.getLogger(this.getClass().getName(), null); + } + return (this.mLogger != null) ? this.mLogger : this.mDefLogger; + } + /** + * Returns the Component Name if the ComponentContext is set. else null + * @return component name + */ + public String getComponentName() { + String componentName = null; + if (this.mComponentContext != null) { + componentName = this.mComponentContext.getComponentName(); + } + return componentName; + } + /** + * Global MessageExchangeSupport reference. Various classes in the common + * component runtime would use this method to obtain the MessageExchangeSupport + * for processing message exchange objects received from delivery channel. + */ + public MessageExchangeSupport getMessageExchangeSupport() { + if ( this.mMESupport == null ) { + this.mMESupport = new MessageExchangeSupport(); + } + return this.mMESupport; + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/RuntimeHelper.java b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/RuntimeHelper.java new file mode 100644 index 000000000..9f86d1fd4 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/RuntimeHelper.java @@ -0,0 +1,360 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * RuntimeHelper.java + */ + +package net.openesb.component.${componentName}.common; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.PrintWriter; +import java.io.Reader; +import java.io.StringReader; +import java.io.StringWriter; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.jbi.component.ComponentContext; +import javax.jbi.messaging.DeliveryChannel; +import javax.xml.namespace.QName; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.transform.OutputKeys; +import javax.xml.transform.Source; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerConfigurationException; +import javax.xml.transform.TransformerException; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.sax.SAXSource; +import javax.xml.transform.stream.StreamResult; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.EntityResolver; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.SAXParseException; +import org.xml.sax.helpers.DefaultHandler; + +/** + * This is a helper class that have bunch of methods for xml processing. + * @author chikkala + */ +public class RuntimeHelper { + + public static Logger getLogger() { + return RuntimeContext.getInstance().getLogger(); + } + + public static void logWarning(Object logObj) { + if ( logObj instanceof Throwable) { + getLogger().log(Level.WARNING, ((Throwable)logObj).getMessage(), (Throwable)logObj); + } else { + getLogger().warning(logObj.toString()); + } + } + + public static void logError(Object logObj) { + if ( logObj instanceof Throwable) { + getLogger().log(Level.SEVERE, ((Throwable)logObj).getMessage(), (Throwable)logObj); + } else { + getLogger().severe(logObj.toString()); + } + } + + public static void logDebug(Object logObj) { + if ( logObj instanceof Throwable) { + getLogger().log(Level.FINER, ((Throwable)logObj).getMessage(), (Throwable)logObj); + } else { + getLogger().finer(logObj.toString()); + } + } + + public static String getComponentName() { + return RuntimeContext.getInstance().getComponentName(); + } + public static ComponentContext getComponentContext() { + return RuntimeContext.getInstance().getComponentContext(); + } + public static DeliveryChannel getDeliveryChannel() { + return RuntimeContext.getInstance().getDeliveryChannel(); + } + + public static MessageExchangeSupport getMessageExchangeSupport() { + return RuntimeContext.getInstance().getMessageExchangeSupport(); + } + + /** + * return the DOM Document + * @param xmlReader Reader + * @return dom document + * @throws Exception on parser exception or any other exception + */ + public static Document buildDOMDocument(Reader xmlReader) throws Exception { + InputSource xmlSource = new InputSource(xmlReader); + return buildDOMDocument(xmlSource); + } + /** + * return the DOM Document + * @param xmlReader Reader + * @return dom document + * @throws Exception on parser exception or any other exception + */ + public static Document buildDOMDocument(InputSource xmlSource) throws Exception { + Document xmlDoc = null; + DocumentBuilderFactory docBuilderFactory = + DocumentBuilderFactory.newInstance(); + docBuilderFactory.setValidating(false); + docBuilderFactory.setNamespaceAware(true); + DocumentBuilder docBuilder = + docBuilderFactory.newDocumentBuilder(); + docBuilder.setErrorHandler( new DefaultHandler() { + public void fatalError(SAXParseException e) + throws SAXException { + throw new SAXException(e.getMessage()); + } + }); + + docBuilder.setEntityResolver(new EntityResolver() { + public InputSource resolveEntity(String publicId, String systemId) + throws SAXException, IOException { + StringReader reader = + new StringReader(""); // NOI18N + InputSource source = new InputSource(reader); + source.setPublicId(publicId); + source.setSystemId(systemId); + return source; + } + }); + + xmlDoc = docBuilder.parse(xmlSource); + + return xmlDoc; + } + /** + * reads xml text from DOMSource to StringBuffer + */ + public static StringBuffer readFromDOMSource(DOMSource domSource) { + + StringWriter writer = new StringWriter(); + + TransformerFactory tFactory = TransformerFactory.newInstance(); + Transformer trans = null; + try { + trans = tFactory.newTransformer(); + trans.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, + "yes"); + trans.setOutputProperty(OutputKeys.INDENT, "yes"); + StreamResult result = new StreamResult(writer); + trans.transform(domSource, result); + } catch (TransformerConfigurationException ex) { + ex.printStackTrace(); + } catch (TransformerException ex) { + ex.printStackTrace(); + } + + return writer.getBuffer(); + } + /** + * reads the xml text from InputSource into a StringBuffer + */ + public static StringBuffer readFromInputSource(InputSource inSource) { + + StringWriter writer = new StringWriter(); + PrintWriter out = new PrintWriter(writer); + InputStream inStream = inSource.getByteStream(); + Reader reader = inSource.getCharacterStream(); + if ( reader == null ) { + reader = new InputStreamReader(inStream); + } + BufferedReader buff = new BufferedReader(reader); + try { + + for ( String line = null; (line = buff.readLine()) != null ; ) { + out.println(line); + } + } catch (IOException ex) { + ex.printStackTrace(); + } + + return writer.getBuffer(); + } + /** + * reads xml from from DOM, SAX or Stream Source into a string buffer + */ + public static StringBuffer readFromSource(Source source) { + if ( source instanceof DOMSource ) { + return readFromDOMSource((DOMSource)source); + } else { + InputSource inSource = SAXSource.sourceToInputSource(source); + if ( inSource != null ) { + return readFromInputSource(inSource); + } else { + return null; + } + } + } + /** + * creates a DOMSource from the xml text read from the reader. + */ + public static DOMSource createDOMSource(Reader xmlReader) { + Document doc = null; + try { + doc = buildDOMDocument(xmlReader); + } catch (Exception ex) { + ex.printStackTrace(); + } + return new DOMSource(doc); + } + /** + * creates a DOMSource from any source. If the source itself is DOMSource, + * the source is returned as it is as DOMSource. + */ + public static DOMSource sourceToDOMSource(Source source) { + if ( source instanceof DOMSource) { + return (DOMSource) source; + } + InputSource xmlSource = SAXSource.sourceToInputSource(source); + Document doc = null; + try { + doc = buildDOMDocument(xmlSource); + } catch (Exception ex) { + ex.printStackTrace(); + } + return new DOMSource(doc); + } + /** + * converts the ex stracktrace to string. + */ + public static StringBuffer getExceptionStackTrace(Exception ex) { + StringWriter strWriter = new StringWriter(); + if ( ex != null ) { + PrintWriter out = new PrintWriter(strWriter); + ex.printStackTrace(out); + } + return strWriter.getBuffer(); + } + /** + * may be used to set the exception as fault content. + */ + public static String getExceptionAsXmlText(Exception ex) { + String message = replaceXmlEscapeCharsToEntityRefereces(ex.getMessage()); + String stackTrace = replaceXmlEscapeCharsToEntityRefereces( + getExceptionStackTrace(ex).toString()); + String exXmlText = + "" + + "" + message + "" + + "" + stackTrace + "" + + "" ; + return exXmlText; + } + + /** + * may be used to set the exception as fault content. + */ + public static String getExceptionAsText(Exception ex) { + String message = replaceXmlEscapeCharsToEntityRefereces(ex.getMessage()); + String stackTrace = replaceXmlEscapeCharsToEntityRefereces( + getExceptionStackTrace(ex).toString()); + StringBuffer buff = new StringBuffer(); + buff.append(message); + buff.append(System.getProperty("line.separator", "${symbol_escape}n")); + buff.append(stackTrace); + return buff.toString(); + } + + + /** + * For attribute values which denote a QName, i.e. include a namespace prefix, + * resolve the value into a QName. + * If a namespace can not be resolved, it is set to empty - it does not + * result in an exception + * @param attrValue the string value of the attribute + * @param element the element the attribute belongs to + */ + public static QName resolveAttrQName(String attrValue, Element element) { + int aColonLoc = attrValue.indexOf(":"); + String aLocalName = attrValue; + String aPrefix = null; + String aNS = null; + if (aColonLoc > -1) { + aPrefix = attrValue.substring(0, aColonLoc); + aLocalName = attrValue.substring(aColonLoc + 1); + + // Traverse up the hierarchy until a namespace definition is found + // or the top of the document is reached. + Node currNode = element; + while ((aNS == null || aNS.equals("")) && currNode != null) { + if (currNode.getNodeType() == Node.ELEMENT_NODE) { + aNS = ((Element) currNode).getAttribute("xmlns:" + aPrefix); + } + currNode = currNode.getParentNode(); + } + } + + QName qName = new QName(aNS, aLocalName, aPrefix); + + return qName; + } + + /** + * replaces the xml entity references with the xml escape chars + * @param xmlString Text with the xml escape chars + * @param Text with the xml entity references + */ + public static String replaceXmlEscapeCharsToEntityRefereces(String xmlString) { + if ( xmlString == null ) { + return xmlString; + } + + // just convert < , > and & only + StringBuffer sbuff = new StringBuffer(2 * xmlString.length()); + for ( int i = 0; i < xmlString.length(); ++i ) { + switch ( xmlString.charAt(i) ) { + case '&': sbuff.append("&"); + break; + case '<': sbuff.append("<"); + break; + case '>': sbuff.append(">"); + break; + default: sbuff.append( xmlString.charAt(i) ); + } + } + return sbuff.toString(); + } + + /** + * return Element node from a document node or non document. Use to extract + * the message root element. + * @root node from which the Element node will be extracted. + * @return Element node. + */ + public static Element getElement(Node root) { + Element msgEl = null; + if ( root instanceof Document) { + msgEl = ((Document)root).getDocumentElement(); + } else if (root instanceof Element) { + msgEl = (Element)root; + } else { + NodeList nodeList = root.getChildNodes(); + for ( int i=0; i < nodeList.getLength(); ++i) { + Node node = nodeList.item(i); + if ( node instanceof Element ) { + msgEl = (Element) node; + break; + } + } + } + return msgEl; + } + + public static Element getElement(DOMSource domSource) { + return getElement(domSource.getNode()); + } + +} diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/deployment/AbstractServiceUnitManager.java b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/deployment/AbstractServiceUnitManager.java new file mode 100644 index 000000000..7a188abea --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/deployment/AbstractServiceUnitManager.java @@ -0,0 +1,312 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * AbstractServiceUnitManager.java + * + */ + +package net.openesb.component.${componentName}.common.deployment; + +import net.openesb.component.${componentName}.common.RuntimeHelper; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.jbi.component.ServiceUnitManager; +import javax.jbi.management.DeploymentException; + +/** + * This is an abstract class that implements {@link javax.jbi.component.ServiceUnitManager} to provide a + * service unit deployment support for the component. The implementation supported by this service + * unit manager and related classes in this package provides WSDL1.1 based service unit deployment + * in the component. + * + * @see javax.jbi.component.ServiceUnitManager + * @see ServiceUnit + * + * @author chikkala + */ +public abstract class AbstractServiceUnitManager implements ServiceUnitManager { + + /** Map of ServiceUnit Name to the ServiceUnit Object for all the service units + * deployed in the component */ + private Map mSUMap; + + /** Creates a new instance of AbstractSUManager */ + protected AbstractServiceUnitManager() { + this.mSUMap = Collections.synchronizedMap(new HashMap()); + } + /** returns the component name + * @return component name. + */ + protected abstract String getComponentName(); + /** + * @return Logger + */ + protected abstract Logger getLogger(); + /** + * returns the creation of the ServiceUnit implementation specific to the service unit deployment + * for the component. + * @param suName service unit name + * @param suRootPath service unit root path + * @param concrete implementation of the ServiceUnit class. + */ + protected abstract ServiceUnit createServiceUnit(String suName, String suRootPath) + throws DeploymentException; + /** + * returns the service unit object deployed by the specified name. or null if not deployed. + * @param suName service unit name to look for + * @param ServiceUnit object for the suName. or null if not present. + */ + private ServiceUnit getServiceUnit(String suName) { + return this.mSUMap.get(suName); + } + /** + * lookup for the deployed service unit. If not there, throws a deployment exception. + * @param suName service unit name + * @return ServiceUnit object + * @throws DeploymentException if the service unit is not present. + */ + private ServiceUnit findServiceUnit(String suName) throws DeploymentException { + ServiceUnit serviceUnit = getServiceUnit(suName); + if ( serviceUnit == null ) { + throw new DeploymentException("Service unit " + suName + " does not exist"); + } + return serviceUnit; + } + /** + * add the service unit object to the list of deployed service units. if there is already a + * service unit present with the name, throws a deployment exception. + * @param su service unit to add + * @return ServiceUnit object that is added. + * @throws DeploymentException if the service unit already present. + */ + private ServiceUnit addServiceUnit(ServiceUnit su) throws DeploymentException { + String suName = su.getName(); + ServiceUnit oldSU = getServiceUnit(suName); + if ( oldSU != null ) { + throw new DeploymentException("Service unit " + suName + "already exists"); + } + this.mSUMap.put(suName, su); + return su; + } + /** + * removes service unit object from the list of deployed service units. if there is no + * service unit present with the name, throws a deployment exception. + * @param su service unit to add + * @return ServiceUnit object that is being removed. + * @throws DeploymentException if the service unit already present. + */ + private ServiceUnit removeServiceUnit(ServiceUnit su) throws DeploymentException { + String suName = su.getName(); + ServiceUnit oldSU = getServiceUnit(suName); + if ( oldSU == null ) { + throw new DeploymentException("Service unit " + suName + " does not exist"); + } + return this.mSUMap.remove(suName); + } + /** + * creates the concrete service unit implementation and calls the load method on it to initialize + * the created service unit. + * @param suName service unit name to create + * @param suRootPath service unit root path. + * @return ServiceUnit that is created and loaded. + */ + private ServiceUnit loadServiceUnit(String suName, String suRootPath) throws DeploymentException { + ServiceUnit serviceUnit = createServiceUnit(suName, suRootPath); + serviceUnit.doLoad(); + return serviceUnit; + } + /** + * deploys a service unit. it creates and loads the service unit object for the suName and then call + * doDeploy on the service unit and adds it to the deployed service unit list + * @return result as jbi management xml + * @throws DeploymentException if there is an error deploying. + */ + private synchronized String deployServiceUnit(String suName, String suRootPath) throws DeploymentException { + String result = suName; + ServiceUnit oldSU = getServiceUnit(suName); + if ( oldSU != null ) { + throw new DeploymentException("Service unit " + suName + "already exists"); + } + ServiceUnit serviceUnit = loadServiceUnit(suName, suRootPath); + serviceUnit.doDeploy(); + addServiceUnit(serviceUnit); + return result; + } + /** + * Deploy a Service Unit to the component. + * @see javax.jbi.component.ServiceUnitManager${symbol_pound}deploy(String, String); + */ + public final String deploy(String suName, String suRootPath) throws DeploymentException { + this.getLogger().fine("Deploying service unit " + suName + " with suRootPath " + suRootPath); + String compName = this.getComponentName(); + boolean isSuccess = true; + String mainMsg = "Successfully deployed service unit " + suName; + Exception errEx = null; + try { + deployServiceUnit(suName, suRootPath); + } catch (Exception ex) { + isSuccess = false; + errEx = ex; + mainMsg = "Failed to deploy service unit " + suName ; + this.getLogger().log(Level.FINE, mainMsg, ex); + } + return createComponentTaskResultXML(compName, "deployTask", isSuccess, mainMsg, errEx); + } + + /** + * undeploys the service unit. it looks up the existing deployed service unit and call doUndeploy + * on it and then removes from the deployed service unit list. + */ + private synchronized String undeployServiceUnit(String suName, String suRootPath) throws DeploymentException { + String result = suName; + ServiceUnit serviceUnit = findServiceUnit(suName); + serviceUnit.doUndeploy(); + removeServiceUnit(serviceUnit); + return result; + } + /** + * Undeploy a service unit from the component. + * @see javax.jbi.component.ServiceUnitManager${symbol_pound}undeploy(String, String); + */ + public final String undeploy(String suName, String suRootPath) throws DeploymentException { + this.getLogger().fine("Undeploying service unit " + suName + " with suRootPath " + suRootPath); + String compName = this.getComponentName(); + boolean isSuccess = true; + String mainMsg = "Successfully undeployed service unit " + suName; + Exception errEx = null; + try { + undeployServiceUnit(suName, suRootPath); + } catch (Exception ex) { + isSuccess = false; + errEx = ex; + mainMsg = "Failed to undeploy service unit " + suName ; + this.getLogger().log(Level.FINE, mainMsg, errEx); + } + return createComponentTaskResultXML(compName, "undeployTask", isSuccess, mainMsg, errEx); + } + /** + * Initialize the given deployed service unit. + * @see javax.jbi.component.ServiceUnitManager${symbol_pound}init(String, String); */ + public final void init(String suName, String suRootPath) + throws DeploymentException { + this.getLogger().fine("Initializing service unit " + suName + " with suRootPath " + suRootPath); + String result = suName; + ServiceUnit serviceUnit = getServiceUnit(suName); + if ( serviceUnit == null ) { // if the service unit not exists, create and add + serviceUnit = loadServiceUnit(suName, suRootPath); // create and load service unit + addServiceUnit(serviceUnit); // add service unit to existing service units + } + serviceUnit.doInit(); // Do Service unit initialization tasks + this.getLogger().fine("Service unit initialized:" + suName); + } + /** + * Shut down the deployment. + * @see javax.jbi.component.ServiceUnitManager${symbol_pound}shutdown(String); + */ + public final void shutDown(String suName) throws DeploymentException { + ServiceUnit serviceUnit = findServiceUnit(suName); // find service unit + serviceUnit.doShutdown(); // Do Service unit shutdown tasks + this.getLogger().fine("Service unit shut down:" + suName); + } + /** + * Start the deployed service unit. + * @see javax.jbi.component.ServiceUnitManager${symbol_pound}start(String); + */ + public final void start(String suName) throws DeploymentException { + ServiceUnit serviceUnit = findServiceUnit(suName); // find service unit + serviceUnit.doStart(); // Do service unit start tasks. + this.getLogger().fine("Service unit started:" + suName ); + } + /** + * Stop the deployed service unit. + * @see javax.jbi.component.ServiceUnitManager${symbol_pound}stop(String); + */ + public final void stop(String suName) throws DeploymentException { + ServiceUnit serviceUnit = findServiceUnit(suName); // find service unit + serviceUnit.doStop(); // do service unit stop tasks + this.getLogger().fine("Service unit stopped: " + suName + " stopped."); + } + + /** + * helper method to create result message as jbi management message xml. + * @param componentName name of the component for this xml. + * @param taskId task id + * @param isSuccess true to format a success result, false to format a failed result. + * @param mainMsg main result message + * @param errEx Exception, null if there is no exception in failure message. + * @return XML string. + */ + protected static String createComponentTaskResultXML( + String componentName, String taskId, boolean isSuccess, String mainMsg, Exception errEx ) { + + String exMsgXml = getComponentTaskResultExceptionXML(errEx); + String mainMsgXmlEsc = RuntimeHelper.replaceXmlEscapeCharsToEntityRefereces(mainMsg); + String taskResult = isSuccess ? "SUCCESS" : "FAILED"; + String msgType = isSuccess ? "INFO" : "ERROR"; + + String xmlResult = + "" + + " " + componentName + "" + + " " + + " " + + " " + taskId + "" + + " " + taskResult + "" + + " " + msgType + "" + + " " + + " " + + " SU_MGR_MSG_ID" + + " " + mainMsgXmlEsc + "" + + " " + + " " + + exMsgXml + + " " + + " " + + ""; + + return xmlResult; + } + /** + * converts the exception to the jbi management message xml chunk. + */ + private static String getComponentTaskResultExceptionXML(Exception errEx) { + StringBuffer exMsgBuff = new StringBuffer(); + if ( errEx == null ) { + return exMsgBuff.toString(); // empty string. + } + + List exList = new ArrayList(); + int exLevel = 0; + for ( Throwable cause = errEx ; cause != null ; cause = cause.getCause() ) { + String causeMsg = RuntimeHelper.replaceXmlEscapeCharsToEntityRefereces( + cause.getMessage()); + StringWriter stBuff = new StringWriter(); + PrintWriter stOut = new PrintWriter(stBuff); + StackTraceElement[] stList = cause.getStackTrace(); + for (StackTraceElement stEl : stList) { + stOut.println(stEl.toString()); + } + stOut.close(); + String causeStackTrace = RuntimeHelper.replaceXmlEscapeCharsToEntityRefereces( + stBuff.getBuffer().toString()); + + exMsgBuff.append(""); + exMsgBuff.append(" " + exLevel + ""); + exMsgBuff.append(" " + "SU_MGR_EXP_ID"); + exMsgBuff.append(" " + causeMsg + ""); + exMsgBuff.append(" "); + exMsgBuff.append(" " + causeStackTrace + ""); + exMsgBuff.append(""); + ++exLevel; + } + + return exMsgBuff.toString(); + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/deployment/ConsumerEndpoint.java b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/deployment/ConsumerEndpoint.java new file mode 100644 index 000000000..b954fe260 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/deployment/ConsumerEndpoint.java @@ -0,0 +1,208 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * ConsumerEndpoint.java + */ + +package net.openesb.component.${componentName}.common.deployment; + +import javax.jbi.JBIException; +import javax.jbi.component.ComponentContext; +import javax.jbi.messaging.DeliveryChannel; +import javax.jbi.messaging.InOnly; +import javax.jbi.messaging.InOut; +import javax.jbi.messaging.MessageExchange.Role; +import javax.jbi.messaging.MessageExchangeFactory; +import javax.jbi.messaging.MessagingException; +import javax.jbi.messaging.NormalizedMessage; +import javax.jbi.servicedesc.ServiceEndpoint; +import javax.wsdl.Definition; +import javax.xml.namespace.QName; + +/** + * This class extends from Endpoint class and implements lifecycle methods functionality required for the + * endpoint for a service consumer. {@link ServiceUnit${symbol_pound}createConsumerEndpoint} creates the object of this + * type to implement the service consumer functionality. + * + * @see ServiceUnit${symbol_pound}createConsumerEndpoint + * @author chikkala + */ + +public class ConsumerEndpoint extends Endpoint { + /** + * This constructor initializes the endpoint with CONSUMER role and makes sure that the service + * description passed to it is of consumer description. + */ + protected ConsumerEndpoint(SUDescriptor.Consumes consumes, Definition wsdlDef, ServiceUnit su) { + super(Role.CONSUMER, consumes, wsdlDef, su); + } + /** + * constructor that does not need service unit information. useful for creating the endpoint for + * static services provided by the component. + */ + protected ConsumerEndpoint(SUDescriptor.Consumes consumes, Definition wsdlDef) { + this(consumes, wsdlDef, null); + } + public final void init() throws JBIException { + getLogger().fine("ConsumerEndpoint: init called"); + doInit(); //1. initialize the endpiont resources + addMessageExchangeListener(); //2. register message exchange linster. + } + public final void activate() throws JBIException { + getLogger().fine("ConsumerEndpoint: activate called"); + //1. do common ativation tasks. + doActivate(); //2. do any other activation related tasks. + } + + public final void deactivate() throws JBIException { + getLogger().fine("ConsumerEndpoint: deactivate called"); + //1. do common deactivation tasks. + doDeactivate(); //2. do any other deactivation related tasks. + } + + public final void clean() throws JBIException { + getLogger().fine("ConsumerEndpoint: clean called"); + removeMessageExchangeListener(); //1. remove message exchange listener + doClean(); //2. clean up any other resources. + } + + protected void doInit() throws JBIException { + //NOOP + } + protected void doActivate() throws JBIException { + //NOOP + } + protected void doDeactivate() throws JBIException { + //NOOP + } + protected void doClean() throws JBIException { + //NOOP + } + + /** + * helper method to find the active ServiceEndpiont for the service described with the + * serviceDescriptor. This method looks for the Active ServiceEndpoint using interface or + * service name or service name and the endpoint name. + */ + public ServiceEndpoint findServiceEndpoint() { + + QName serviceType = this.getService().getInterface(); + QName serviceName = this.getService().getServiceName(); + String endpointName = this.getService().getEndpointName(); + + ServiceEndpoint [] refs = null; + ServiceEndpoint serviceEndpoint = null; + ComponentContext compContext = this.getComponentContext(); + + if ( compContext == null ) { + this.getLogger().info("Null Component context. Can not find ServiceEndpoint"); + return null; + } + // lookup ServiceEndpiont with concrete service(serice qname + endpoint name). + if ( serviceName != null && endpointName != null ) { + this.getLogger().info("Looking for ServiceEndpoint with:" + + " ServiceName: " + serviceName + " EndpointName: " + endpointName); + serviceEndpoint = compContext.getEndpoint(serviceName, endpointName); + } + // else lookup ServiceEndpiont with Service Name + if ( serviceEndpoint == null && serviceName != null && endpointName == null) { + this.getLogger().info("Looking for ServiceEndpoint with Service name: " + serviceName); + refs = compContext.getEndpointsForService(serviceName); + if ( refs != null && refs.length > 0 ) { + serviceEndpoint = refs[0]; + } + } + // else lookup ServiceEndpont with serviceType + if ( serviceEndpoint == null && serviceType != null && + serviceName == null && endpointName == null) { + this.getLogger().info("Looking for ServiceEndpoint with Service type: " + serviceType); + refs = compContext.getEndpoints(serviceType); + if ( refs != null && refs.length > 0 ) { + serviceEndpoint = refs[0]; + } + } + + return serviceEndpoint; + } + + /** + * this method creates a InOutMessageExchange Object and sets the required + * data on the MessageExchange object including the create and set the Normalized + * message object to hold the input message on the MessageExchange object. + */ + public InOut createInOutMessageExchange(QName operation) + throws MessagingException, JBIException { + + ServiceEndpoint serviceEndpoint = null; + // find a ServiceEndpoint activated by the Service Providers for this service + serviceEndpoint = findServiceEndpoint(); + + if ( serviceEndpoint == null ) { + // if not found a activated ServiceEndpoint for this service, throw exception. + throw new JBIException("Can not find an Active ServiceEndpoint for ${symbol_escape}n" + this.getService()); + } else { + this.setServiceEndpoint(serviceEndpoint); + } + + InOut inOutME = null; + DeliveryChannel channel = this.getDeliveryChannel(); + // create message exchange factory for the endpiont + MessageExchangeFactory factory = channel.createExchangeFactory(serviceEndpoint); + // create INOUT Message Exchange + inOutME = factory.createInOutExchange(); + // set operation + inOutME.setOperation(operation); + // set interface if that is not set + if ( inOutME.getInterfaceName() == null ) { + inOutME.setInterfaceName(this.getService().getInterface()); + } + // create IN Nomralized Message + NormalizedMessage inMsg = inOutME.createMessage(); + // set IN Normalized message on message exchange + inOutME.setInMessage(inMsg); + + return inOutME; + } + + /** + * this method creates a InOnlyMessageExchange Object and sets the required + * data on the MessageExchange object including the create and set the Normalized + * message object to hold the input message on the MessageExchange object. + */ + public InOnly createInOnlyMessageExchange(QName operation) + throws MessagingException, JBIException { + + ServiceEndpoint serviceEndpoint = null; + // find a ServiceEndpoint activated by the Service Providers for this service + serviceEndpoint = findServiceEndpoint(); + + if ( serviceEndpoint == null ) { + // if not found a activated ServiceEndpoint for this service, throw exception. + throw new JBIException("Can not find an Active ServiceEndpoint for ${symbol_escape}n" + this.getService()); + } else { + this.setServiceEndpoint(serviceEndpoint); + } + + InOnly inOnlyME = null; + DeliveryChannel channel = this.getDeliveryChannel(); + // create message exchange factory for the endpiont + MessageExchangeFactory factory = channel.createExchangeFactory(serviceEndpoint); + // create INOUT Message Exchange + inOnlyME = factory.createInOnlyExchange(); + // set operation + inOnlyME.setOperation(operation); + // set interface if that is not set + if ( inOnlyME.getInterfaceName() == null ) { + inOnlyME.setInterfaceName(this.getService().getInterface()); + } + // create IN Nomralized Message + NormalizedMessage inMsg = inOnlyME.createMessage(); + // set IN Normalized message on message exchange + inOnlyME.setInMessage(inMsg); + + return inOnlyME; + } + + +} \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/deployment/Endpoint.java b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/deployment/Endpoint.java new file mode 100644 index 000000000..63e0f1790 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/deployment/Endpoint.java @@ -0,0 +1,289 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * Endpoint.java + * + */ + +package net.openesb.component.${componentName}.common.deployment; + +import net.openesb.component.${componentName}.common.MessageExchangeHandler; +import net.openesb.component.${componentName}.common.MessageExchangeListener; +import net.openesb.component.${componentName}.common.MessageExchangeSupport; +import net.openesb.component.${componentName}.common.RuntimeHelper; +import net.openesb.component.${componentName}.common.wsdl.WSDLProcessor; +import java.util.logging.Logger; +import javax.jbi.JBIException; +import javax.jbi.component.ComponentContext; +import javax.jbi.messaging.DeliveryChannel; +import javax.jbi.messaging.ExchangeStatus; +import javax.jbi.messaging.MessageExchange; +import javax.jbi.messaging.MessageExchange.Role; +import javax.jbi.servicedesc.ServiceEndpoint; +import javax.wsdl.Binding; +import javax.wsdl.Definition; +import javax.wsdl.Operation; +import javax.xml.namespace.QName; + +/** + * This is an abstract class that represents the Endpoint defined for service provisioning or + * consumption in a jbi component. It stores the required service description ( wsdl definition, + * role, service unit to which it belongs etc) and defines the lifecycle operations {@link ${symbol_pound}init}, + * {@link ${symbol_pound}activate}, {@link ${symbol_pound}deactivate}, {@link ${symbol_pound}clean} to control a service endpoint that + * provides or consumes the service. + *

+ * Extended classes implement the abstract methods defined in this class to implement the endpoint + * functionality by providing the functionality to process the deployment artifacts specific to this + * endpoint, configure the endpoint to send/receive messages to/from delivery channel and process them + * according to the specific service implementation. + * + * @author chikkala + */ +public abstract class Endpoint { + /** Role of this endpoint. CONSUMER or PROVIDER */ + private Role mRole; + /** Service description from the SU descriptor for which this endpoint is configured */ + private SUDescriptor.Service mService; + /** WSDL definition corresponding to this endpoint */ + private Definition mWsdlDef; + /** service endpoint corresponding to this endpoint */ + private ServiceEndpoint mServiceEndpoint; + /** service unit from which this endpoint is created */ + private ServiceUnit mSU; // can be null + /** private constructor to force extended classes to use the parameterized constructor */ + private Endpoint() { + } + /** Creates a new instance of Endpoint + * @param role CONSUMER or PRVODER role. + * @param service service description from the su descriptor + * @param wsdl wsdl definition corresponding to this endpoint + * @param su service unit object which created this endpoint. + */ + protected Endpoint(Role role, SUDescriptor.Service service, Definition wsdl, ServiceUnit su) { + this.mService = service; + this.mRole = role; + this.mWsdlDef = wsdl; + this.mSU = su; + } + /** Creates a new instance of Endpoint without service unit. may be useful for static endpoints that + * are not part of the deployment + * @param role CONSUMER or PRVODER role. + * @param service service info from the su descriptor + * @param wsdl wsdl definition corresponding to this endpoint + */ + protected Endpoint(Role role, SUDescriptor.Service service, Definition wsdl) { + this(role, service, wsdl, null); + } + /** + * should be called to initialize any resources related to this endpoint object + * throws JBIException + */ + public abstract void init() throws JBIException; + /** + * activates the endpoint to send/receive messages + * throws JBIException + */ + public abstract void activate() throws JBIException; + /** + * deactivates the endpoint + * throws JBIException + */ + public abstract void deactivate() throws JBIException; + /** + * clean endpoint + * throws JBIException + */ + public abstract void clean() throws JBIException; + + public final Role getRole() { + return this.mRole; + } + public final boolean isProvider() { + return (Role.PROVIDER.equals(this.getRole())); + } + public final boolean isConsumer() { + return (Role.CONSUMER.equals(this.getRole())); + } + public final Definition getWSDL() { + return this.mWsdlDef; + } + public final SUDescriptor.Service getService() { + return this.mService; + } + public final ServiceEndpoint getServiceEndpoint() { + return this.mServiceEndpoint; + } + protected final void setServiceEndpoint(ServiceEndpoint svcEP) { + this.mServiceEndpoint = svcEP; + } + public final ServiceUnit getServiceUnit() { + return this.mSU; + } + /** + * generates an ID that would uniquely identify this endpoint implementation. Use as a key to map + * any information to store that is related to this endpoint. + */ + public final String getID() { + StringBuffer strBuff = new StringBuffer(); + strBuff.append(this.mService.getInterface()).append("+"); + strBuff.append(this.mService.getServiceName()).append("+"); + strBuff.append(this.mService.getEndpointName()).append("+"); + String roleType = null; + if ( Role.CONSUMER.equals(this.mRole) ) { + roleType = "CONSUMER"; + } else if ( Role.PROVIDER.equals(this.mRole) ) { + roleType = "PROVIDER"; + } + strBuff.append(roleType); + return strBuff.toString(); + } + + @Override + public String toString() { + return "Endpoint : " + "${symbol_escape}n" + this.mService; + } + /** + * checks if this endpoint is configured for the binding component or service engine. + */ + public boolean isForBindingComponent() { + boolean isForBindingComponent = false; + if ( this.mSU != null ) { + try { + isForBindingComponent = this.mSU.getSUDescriptor().isForBindingComponent(); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + return isForBindingComponent; + } + + public QName getOperationQName(String opName) { + return new QName(this.getService().getInterface().getNamespaceURI(), opName); + } + + public Operation getWSDLOperation(QName opQName) { + String opName = null; + if ( opQName != null ) { + opName = opQName.getLocalPart(); + } + Operation operation = WSDLProcessor.findOperation(this.getWSDL(), + this.getService().getInterface(), opName); + return operation; + } + + public Binding getWSDLBinding() { + QName interfaceName = this.getService().getInterface(); + QName serviceName = this.getService().getServiceName(); + String endpointName = this.getService().getEndpointName(); + if ( serviceName != null ) { + return WSDLProcessor.findServiceBinding(this.getWSDL(), serviceName, endpointName); + } else { + return WSDLProcessor.findInterfaceBinding(this.getWSDL(), interfaceName, null); + } + } + /** @return logger */ + public Logger getLogger() { + return RuntimeHelper.getLogger(); + } + /** @return ComponentContext */ + public ComponentContext getComponentContext() { + return RuntimeHelper.getComponentContext(); + } + /** @return DeliveryChannel */ + public DeliveryChannel getDeliveryChannel() { + return RuntimeHelper.getDeliveryChannel(); + } + /** + * helper function to get the MessageExchangeSupport object + */ + public MessageExchangeSupport getMessageExchangeSupport() { + return RuntimeHelper.getMessageExchangeSupport(); + } + + public MessageExchangeHandler createMessageExchangeHandler() { + return null; + } + /** + * creates the message exchange listener. Extended classes should return + * MessageExchangeListener implementation. + * @return MessageExchangeListener or null. + * + */ + protected MessageExchangeListener createMessageExchangeListener() { + return null; + } + /** + * Creates and adds message exchange listener to receive message exchange received notification. + */ + protected void addMessageExchangeListener() { + QName interfaceName = this.getService().getInterface(); + QName serviceName = this.getService().getServiceName(); + String endpointName = this.getService().getEndpointName(); + MessageExchangeListener meListener = createMessageExchangeListener(); + MessageExchangeSupport meListenerSupport = getMessageExchangeSupport(); + if ( meListenerSupport != null && meListener != null ) { + meListenerSupport.addMessageExchangeListener( + this.getRole(), interfaceName, serviceName, endpointName, meListener); + if ( serviceName != null ) { + meListenerSupport.addMessageExchangeListener( + this.getRole(), null, serviceName, endpointName, meListener); + } + } + } + /** + * Removes message exchange listener from the MessageExchangeSupport. + */ + protected void removeMessageExchangeListener() { + QName interfaceName = this.getService().getInterface(); + QName serviceName = this.getService().getServiceName(); + String endpointName = this.getService().getEndpointName(); + MessageExchangeSupport meListenerSupport = getMessageExchangeSupport(); + if ( meListenerSupport != null ) { + meListenerSupport.removeMessageExchangeListener( + this.getRole(), interfaceName, serviceName, endpointName); + if ( serviceName != null ) { + meListenerSupport.removeMessageExchangeListener( + this.getRole(), null, serviceName, endpointName); + } + } + } + + public final boolean processMessageExchangeWithHandler(ExchangeStatus status, MessageExchange me) { + + //1. lookup handler + //2. if not there create one and register + //3. call process message exchange on it + //4. check status. if that is the end, remove the handler + + MessageExchangeSupport support = this.getMessageExchangeSupport(); + if ( support == null ) { + getLogger().fine("No MessageExchangeSupport present"); + return false; + } + MessageExchangeHandler handler = support.findMessageExchangeHandler(me); + if ( handler == null ) { + handler = this.createMessageExchangeHandler(); + if ( handler == null ) { + getLogger().fine("MessageExchangeHandler not supported"); + return false; + } + support.addMessageExchangeHandler(me, handler); + } + + handler.processMessageExchange(status, me); + + getLogger().fine("XXX MX Handler processed ME with STATUS: " + status); + + if (!ExchangeStatus.ACTIVE.equals(status) ) { + // DONE or ERROR means done with the me. + getLogger().fine("End of ME processing. STATUS: " + status + + ". Removing the MX Handler ..."); + support.removeMessageExchangeHandler(me); + } + + return true; + } + +} + diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/deployment/ProviderEndpoint.java b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/deployment/ProviderEndpoint.java new file mode 100644 index 000000000..63a17e906 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/deployment/ProviderEndpoint.java @@ -0,0 +1,107 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * ProviderEndpoint.java + * + */ + +package net.openesb.component.${componentName}.common.deployment; + +import net.openesb.component.${componentName}.common.deployment.SUDescriptor.Service; +import javax.jbi.JBIException; +import javax.jbi.messaging.MessageExchange.Role; +import javax.jbi.servicedesc.ServiceEndpoint; +import javax.wsdl.Definition; + +/** + * This class extends from Endpoint class and implements lifecycle methods functionality required for the + * endpoint for a service provider. {@link ServiceUnit${symbol_pound}createProviderEndpoint} creates the object of this + * type to implement the service provider functionality. It makes sure that this class or the extended + * classes will activate or deactivate the ServiceEndpoint corresponding to the service + * provided by the endpoint is performed during the activate and deactivate method calls as part of the + * endpoint lifecycle. + * + * @see ServiceUnit${symbol_pound}createProviderEndpoint + * @author chikkala + */ + +public class ProviderEndpoint extends Endpoint { + /** + * This constructor initializes the endpoint with PROVIDER role and makes sure that the service + * description passed to it is of provider description. + */ + protected ProviderEndpoint(SUDescriptor.Provides provides, Definition wsdlDef, ServiceUnit su) { + super(Role.PROVIDER, provides, wsdlDef, su); + } + /** + * constructor that does not need service unit information. useful for creating the endpoint for + * static services provided by the component. + */ + protected ProviderEndpoint(SUDescriptor.Provides provides, Definition wsdlDef) { + this(provides, wsdlDef, null); + } + /** + * initializes the endpoint and creates and registers the MessageExchangeListener with + * MessageExchangeSupport. + */ + public final void init() throws JBIException { + getLogger().fine("ProviderEndpiont: init called"); + doInit(); //1. initialize the endpiont resources + addMessageExchangeListener(); //2. register message exchange linster. + } + /** + * calls activatesServiceEndpoint for the Provider. + */ + public final void activate() throws JBIException { + getLogger().fine("ProviderEndpiont: activate called"); + activateServiceEndpoint(); //1. activate service endpoint in NMR + doActivate(); //2. do any other activation related tasks. + } + /** + * calls deactivateServiceEndpoint for the Provider. + */ + public final void deactivate() throws JBIException { + getLogger().fine("ProviderEndpiont: deactivate called"); + deactivateServiceEndpoint(); //1. deactivates the service endpoint in NMR + doDeactivate(); //2. do any other deactivation related tasks. + } + /** + * removes the message exchange listener. cleans up other resources + */ + public final void clean() throws JBIException { + getLogger().fine("ProviderEndpiont: clean called"); + removeMessageExchangeListener(); //1. remove message exchange listener + doClean(); //2. clean up any other resources. + } + /** + * Activates the ServiceEndpoint with NMR + */ + private void activateServiceEndpoint() throws JBIException { + Service service = this.getService(); + ServiceEndpoint svcEP = this.getComponentContext().activateEndpoint( + service.getServiceName(), service.getEndpointName()); + this.setServiceEndpoint(svcEP); + } + /** + * Deactivates ServiceEndpoint in NMR + */ + private void deactivateServiceEndpoint() throws JBIException { + this.getComponentContext().deactivateEndpoint(this.getServiceEndpoint()); + this.setServiceEndpoint(null); + } + + protected void doInit() throws JBIException { + //NOOP + } + protected void doActivate() throws JBIException { + //NOOP + } + protected void doDeactivate() throws JBIException { + //NOOP + } + protected void doClean() throws JBIException { + //NOOP + } + +} \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/deployment/SUDescriptor.java b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/deployment/SUDescriptor.java new file mode 100644 index 000000000..c74d639fa --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/deployment/SUDescriptor.java @@ -0,0 +1,364 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * SUDescriptor.java + */ + +package net.openesb.component.${componentName}.common.deployment; + +import net.openesb.component.${componentName}.common.RuntimeHelper; +import java.io.FileReader; +import java.io.IOException; +import java.io.Reader; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import javax.jbi.management.DeploymentException; +import javax.xml.namespace.QName; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; + +/** + * This interface represent the service unit descriptor (jbi.xml) model. This will be used in + * ServiceUnit implementation to find the services provided and consumed by this service unit. + * {@link SUDescriptorFactory${symbol_pound}getSUDescriptor} method reads the jbi.xml in the service unit to + * to the implementation of this interface. + * + * @see SUDescriptorFactory + * @see Consumes + * @see Provides + * @see ServiceUnit + * + * @author chikkala + */ +public interface SUDescriptor { + + Collection getProvidedServices(); + + Collection getConsumedServices(); + + boolean isForBindingComponent(); + + /** + * base interface that models the service information described in the service unit descriptor for + * consumed services and provided services. + */ + public interface Service { + /** + * Getter for property interfaceQName. + * @return Value of property interfaceQName. + */ + QName getInterface(); + /** + * Getter for property serviceName. + * @return Value of property serviceName. + */ + QName getServiceName(); + /** + * Getter for property endpointName. + * @return Value of property endpointName. + */ + String getEndpointName(); + } + /** + * marker interface that represents the provided services in the service unit + */ + public interface Provides extends Service { + } + /** + * this interface represents the consumed service information in the su descriptor. + */ + public interface Consumes extends Service { + + public final static String STANDARD_LINK = "standard"; + public final static String SOFT_LINK = "soft"; + public final static String HARD_LINK = "hard"; + /** + * Getter for property linkType. + * @return Value of property linkType. + */ + String getLinkType(); + } + /** + * This is a factory class that can build the Service Unit Descriptor model from the jbi.xml + */ + public static class SUDescriptorFactory { + + protected final static String JBI_TAG_NAME = "services"; + protected final static String SERVICES_TAG_NAME = "services"; + protected final static String BC_TAG_NAME = "binding-component"; + protected final static String PROVIDES_TAG_NAME = "provides"; + protected final static String CONSUMES_TAG_NAME = "consumes"; + protected final static String INTERFACE_TAG_NAME = "interface-name"; + protected final static String SERVICE_TAG_NAME = "service-name"; + protected final static String ENDPOINT_TAG_NAME = "endpoint-name"; + protected final static String LINK_TYPE_TAG_NAME = "link-type"; + /** + * method that builds the Service unit descriptor model from the jbi.xml + */ + public static SUDescriptor getSUDescriptor(String jbiXmlPath) throws Exception { + FileReader reader = null; + try { + reader = new FileReader(jbiXmlPath); + SUDescriptor suDesc = getSUDescriptor(reader); + return suDesc; + } finally { + if ( reader != null ) { + try { + reader.close(); + } catch (IOException ex) { + // ignore + } + } + } + } + /** + * method that builds the Service unit descriptor model from the jbi.xml + */ + public static SUDescriptor getSUDescriptor(Reader reader) throws Exception { + SUDescriptor suDescriptor = null; + Document suDescDoc = RuntimeHelper.buildDOMDocument(reader); + Element jbiEl = suDescDoc.getDocumentElement(); + if (JBI_TAG_NAME.equals(jbiEl.getTagName())) { + throw new DeploymentException("Invalid service unit descriptor : no jbi root element"); + } + + NodeList servicesNL = jbiEl.getElementsByTagName(SERVICES_TAG_NAME); + if (servicesNL != null && servicesNL.getLength() == 1) { + Element servicesEl = (Element) servicesNL.item(0); + suDescriptor = SUDescriptorImpl.createSUDescriptor(servicesEl); + } else { + throw new DeploymentException("Invalid service unit descriptor : invalid services element"); + } + + return suDescriptor; + } + + } + /** + * This class implements SUDescriptor + */ + public static class SUDescriptorImpl implements SUDescriptor { + + private List mConsumedList; + private List mProvidedList; + private boolean mIsForBindingComponent; + + protected SUDescriptorImpl(boolean isForBindingComponent) { + this.mIsForBindingComponent = isForBindingComponent; + this.mConsumedList = new ArrayList(); + this.mProvidedList = new ArrayList(); + } + + protected void addProvidedService(Provides provides) { + this.mProvidedList.add(provides); + } + + protected void addConsumedService(Consumes consumes) { + this.mConsumedList.add(consumes); + } + + public Collection getProvidedServices() { + // return unmodifiable collection + return Collections.unmodifiableCollection(this.mProvidedList); + } + + public Collection getConsumedServices() { + // return unmodifiable collection + return Collections.unmodifiableCollection(this.mConsumedList); + } + + public boolean isForBindingComponent() { + return this.mIsForBindingComponent; + } + + protected static SUDescriptor createSUDescriptor(Element servicesEl) throws Exception { + boolean isForBC = false; + String bcTagString = servicesEl.getAttribute(SUDescriptorFactory.BC_TAG_NAME); + isForBC = Boolean.valueOf(bcTagString).booleanValue(); + SUDescriptorImpl suDesc = new SUDescriptorImpl(isForBC); + // add consumes + NodeList consumesNL = servicesEl.getElementsByTagName(SUDescriptorFactory.CONSUMES_TAG_NAME); + for ( int i=0; i < consumesNL.getLength(); ++i) { + Element consumesEl = (Element) consumesNL.item(i); + Consumes consumes = ConsumedService.createConsumedService(consumesEl); + suDesc.addConsumedService(consumes); + } + // add provides + NodeList providesNL = servicesEl.getElementsByTagName(SUDescriptorFactory.PROVIDES_TAG_NAME); + for ( int i=0; i < providesNL.getLength(); ++i) { + Element providesEl = (Element) providesNL.item(i); + Provides provides = ProvidedService.createProvidedService(providesEl); + suDesc.addProvidedService(provides); + } + + return suDesc; + } + } + /** + * Base class that implements the Service interface + */ + public static abstract class AbstractService implements Service { + + private QName mInterface; + private QName mServiceName; + private String mEndpointName; + + private AbstractService() { + } + /** + * Getter for property interfaceQName. + * @return Value of property interfaceQName. + */ + public QName getInterface() { + return this.mInterface; + } + + /** + * Setter for property interfaceQName. + * @param interfaceQName New value of property interfaceQName. + */ + protected void setInterface(QName interfaceQName) { + this.mInterface = interfaceQName; + } + + /** + * Getter for property serviceName. + * @return Value of property serviceName. + */ + public QName getServiceName() { + return this.mServiceName; + } + + /** + * Setter for property serviceName. + * @param serviceName New value of property serviceName. + */ + protected void setServiceName(QName serviceName) { + this.mServiceName = serviceName; + } + + /** + * Getter for property endpointName. + * @return Value of property endpointName. + */ + public String getEndpointName() { + return this.mEndpointName; + } + + /** + * Setter for property endpointName. + * @param endpointName New value of property endpointName. + */ + protected void setEndpointName(String endpointName) { + this.mEndpointName = endpointName; + } + + } + /** + * This class implements the Provides interface + */ + public static class ProvidedService + extends AbstractService + implements Provides { + protected ProvidedService(QName interfaceQName, QName serviceName, String endpointName) { + this.setInterface(interfaceQName); + this.setServiceName(serviceName); + this.setEndpointName(endpointName); + } + + @Override + public String toString() { + return "Provides :" + + "${symbol_escape}n${symbol_escape}t interface-name= " + getInterface() + + "${symbol_escape}n${symbol_escape}t service-name= " + getServiceName() + + "${symbol_escape}n${symbol_escape}t endpont-name= " + getEndpointName(); + } + + protected static Provides createProvidedService(Element providesEl) throws Exception { + + String ifName = providesEl.getAttribute(SUDescriptorFactory.INTERFACE_TAG_NAME); + String serviceName = providesEl.getAttribute(SUDescriptorFactory.SERVICE_TAG_NAME); + String endpointName = providesEl.getAttribute(SUDescriptorFactory.ENDPOINT_TAG_NAME); + if ( ifName == null || serviceName == null || endpointName == null ) { + throw new Exception("Invalid provides element: missing " + SUDescriptorFactory.INTERFACE_TAG_NAME + + " or " + SUDescriptorFactory.SERVICE_TAG_NAME + " or " + SUDescriptorFactory.ENDPOINT_TAG_NAME ); + } + QName ifQName = RuntimeHelper.resolveAttrQName(ifName, providesEl); + QName serviceQName = RuntimeHelper.resolveAttrQName(serviceName, providesEl); + + return new ProvidedService(ifQName, serviceQName, endpointName); + } + } + /** + * This class implements the Consumes interface. + */ + public static class ConsumedService + extends AbstractService + implements Consumes { + private String mLinkType; + protected ConsumedService(QName interfaceQName, + QName serviceName, String endpointName, String linkType) { + this.setInterface(interfaceQName); + this.setServiceName(serviceName); + this.setEndpointName(endpointName); + this.mLinkType = linkType; + } + + /** + * Getter for property linkType. + * @return Value of property linkType. + */ + public String getLinkType() { + return this.mLinkType; + } + + @Override + public String toString() { + return "Cosumes :" + + "${symbol_escape}n${symbol_escape}t interface-name= " + getInterface() + + "${symbol_escape}n${symbol_escape}t service-name= " + getServiceName() + + "${symbol_escape}n${symbol_escape}t endpont-name= " + getEndpointName() + + "${symbol_escape}n${symbol_escape}t link-type= " + getLinkType(); + } + + protected static Consumes createConsumedService(Element consumesEl) throws Exception { + + String ifName = consumesEl.getAttribute(SUDescriptorFactory.INTERFACE_TAG_NAME); + String serviceName = consumesEl.getAttribute(SUDescriptorFactory.SERVICE_TAG_NAME); + String endpointName = consumesEl.getAttribute(SUDescriptorFactory.ENDPOINT_TAG_NAME); + String linkType = consumesEl.getAttribute(SUDescriptorFactory.LINK_TYPE_TAG_NAME); + if ( linkType == null || linkType.trim().length() == 0 ) { + linkType = STANDARD_LINK; + } + + if ( ifName == null ) { + throw new Exception("Invalid consumes element: missing " + + SUDescriptorFactory.INTERFACE_TAG_NAME ); + } + if ( serviceName == null || endpointName == null ) { + throw new Exception("Invalid consumes element: missing " + + SUDescriptorFactory.SERVICE_TAG_NAME + " or " + + SUDescriptorFactory.ENDPOINT_TAG_NAME ); + } + + QName ifQName = RuntimeHelper.resolveAttrQName(ifName, consumesEl); + QName serviceQName = null; + if ( serviceName != null ) { + serviceQName = RuntimeHelper.resolveAttrQName(serviceName, consumesEl); + } + if ( serviceQName != null && endpointName != null && linkType != null ) { + if (!(STANDARD_LINK.equals(linkType) || + SOFT_LINK.equals(linkType) || HARD_LINK.equals(linkType)) ) { + throw new Exception("Invalid consumes attribute value" + + SUDescriptorFactory.LINK_TYPE_TAG_NAME + "=" + linkType); + } + } + return new ConsumedService(ifQName, serviceQName, endpointName, linkType); + } + } + +} diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/deployment/ServiceUnit.java b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/deployment/ServiceUnit.java new file mode 100644 index 000000000..eca695ea0 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/deployment/ServiceUnit.java @@ -0,0 +1,464 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * ServiceUnit.java + * + */ + +package net.openesb.component.${componentName}.common.deployment; + +import net.openesb.component.${componentName}.common.RuntimeHelper; +import net.openesb.component.${componentName}.common.deployment.SUDescriptor.Consumes; +import net.openesb.component.${componentName}.common.deployment.SUDescriptor.Provides; +import net.openesb.component.${componentName}.common.deployment.SUDescriptor.Service; +import net.openesb.component.${componentName}.common.wsdl.WSDLProcessor; +import java.io.File; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.jbi.management.DeploymentException; +import javax.wsdl.Definition; +import javax.wsdl.WSDLException; + +/** + * This is an abstract class that implements the service unit functionality in the component which + * processes the service unit artifacts and implement the actual service unit lifecycle functionality. + * The AbstractServiceUnitManager and its extended classes that implement the ServiceUnitManager + * functionality creates and maintains the reference to the concrete implementation of this class to + * invoke the functionality implemented by this class and its concrete implementation during the + * execution of the ServiceUnitMangers lifecycle methods by the jbi runtime. + *

+ * The main lifecycle methods of this class that will be called by the ServiceUnitManger implementation + * during the service unit deployment lifecycle are {@link ${symbol_pound}doload}, {@link ${symbol_pound}doDeploy}, {@link ${symbol_pound}doUndeploy}, + * {@link ${symbol_pound}doInit}, {@link ${symbol_pound}doStart}, {@link ${symbol_pound}doStop} and {@link ${symbol_pound}doShutdown} + *

+ * Service unit processing supported by this implementation is based on wsdl 1.1 deployments where the + * services provided and consumed in this service unit are described using wsdl 1.1 definitions. + *

+ * The main service unit artifacts that will be processed during deployment lifecycle of the service + * unit are 1.Service unit descriptor(jbi.xml) that describes the services provided and consumed by + * this service unit. 2.WSDL 1.1 document that describes the service definition 3.Component specific + * configurations related to services provided and consumed by this service unit. + *

+ * When the service unit is for Binding Component, the component specific configurations are read + * from the WSDL1.1 extensions defined in the WSDL document corresponding to the service provider + * or consumer deployed with this service unit. + *

+ * When the service unit is for Service Engine, the component specific configurations are read + * from the deployment artifacts such as xslt files and mapping files in the service unit zip file + * along with the WSDL document corresponding to the service provider or consumer deployed with this + * service unit. + * + * @see SUDescriptor + * @see Endpoint + * @see ProviderEndpoint + * @see ConsumerEndpoint + * @see WSDLProcessor + * @author chikkala + */ +public abstract class ServiceUnit { + /** Service Unit Name */ + private String mSUName; + /** Service Unit Root path passed by jbi runtime */ + private String mSURootPath; + /** service unit descriptor model unmarshalled from service unit jbi.xml */ + private SUDescriptor mSUDescriptor; + /** Map of Endpoint Key to ProviderEndpoint configurations in this service unit */ + private Map mProviderEndpointMap; + /** Map of Endpoint Key to ConsumerEndpoint configurations in this service unit */ + private Map mConsumerEndpointMap; + /** Map of Service Key to the WSDL Definition in this service unit */ + private Map mWSDLMap; + /** WSDLProcessor configured for this service unit to process wsdls in the service unit */ + private WSDLProcessor mWSDLProcessor; + /** + * + * @param suName + * @param suRootPath + */ + protected ServiceUnit(String suName, String suRootPath) { + this.mSUName = suName; + this.mSURootPath = suRootPath; + this.mSUDescriptor = null; + this.mWSDLMap = new HashMap(); + this.mProviderEndpointMap = new HashMap(); + this.mConsumerEndpointMap = new HashMap(); + } + /** returns service unit name + * @return service unit name + */ + public String getName() { + return this.mSUName; + } + /** returns service unit root path where the su artifacts are unzipped by the jbi runtime + * @return path to the service unit root directory. + */ + public String getSURootPath() { + return this.mSURootPath; + } + protected SUDescriptor createSUDescriptor() throws Exception { + File jbiXmlFile = new File(this.getSURootPath(), "META-INF/jbi.xml"); + String jbiXmlPath = jbiXmlFile.getAbsolutePath(); + return SUDescriptor.SUDescriptorFactory.getSUDescriptor(jbiXmlPath); + } + /** return the Service unit descriptor model that was read from the jbi.xml + * @return SUDescriptor + */ + public SUDescriptor getSUDescriptor() throws Exception { + if ( this.mSUDescriptor == null ) { + this.mSUDescriptor = createSUDescriptor(); + } + return this.mSUDescriptor; + } + public ProviderEndpoint getProviderEndpoint(String providerID) { + return this.mProviderEndpointMap.get(providerID); + } + public Collection getProviderEndpoints() { + return Collections.unmodifiableCollection(this.mProviderEndpointMap.values()); + } + public ConsumerEndpoint getConsumerEndpoint(String cosumerID) { + return this.mConsumerEndpointMap.get(cosumerID); + } + + public Collection getConsumerEndpoints() { + return Collections.unmodifiableCollection(this.mConsumerEndpointMap.values()); + } + /** + * @return Logger + */ + protected Logger getLogger() { + return RuntimeHelper.getLogger(); + } + /** + * extended classes implement this method to create the su specific WSDLProcessor. for examples, + * a su supporting binding component may have wsdl extensions that it want to registry for reading + * the configurations from the wsdl file. + * @return WSDLProcessor + * @see com.sun.jbi.sample.component.common.wsdl.WSDLProcessor + * @see com.sun.jbi.sample.component.common.wsdl.AbstractExtensionRegistry + */ + protected WSDLProcessor createWSDLProcessor() { + return new WSDLProcessor(this.getSURootPath()); + } + /** + * return the WSDLProcessor reference by creates if it is not yet created. + * @return WSDLProcessor. + */ + public final WSDLProcessor getWSDLProcessor() { + if ( this.mWSDLProcessor == null ) { + this.mWSDLProcessor = createWSDLProcessor(); + } + return this.mWSDLProcessor; + } + /** + * loads the service unit artifacts into the SU model. AbstractServiceUnitManager implementation + * calls this method during the during deploy and init lifecycle methods when the service unit + * object is newly created. + */ + public void doLoad() throws DeploymentException { + try { + SUDescriptor suDesc = getSUDescriptor(); // load jbi.xml + loadServiceDefinitions(); // check if the wsdls are valid for corresponding services. + loadOtherArtifacts(); // additional validations specific to component deployment features. + loadEndpoints(); // create endpoints + } catch ( DeploymentException jbiEx) { + throw jbiEx; + } catch (Exception ex) { + throw new DeploymentException(ex); + } + } + /** extended classes implement this method to perform the su specific deployment related tasks in + * this method implementation. + * @throws DeploymentException on error. + */ + public void doDeploy() throws DeploymentException { + // NOOP. doLoad has done it all. + this.getLogger().fine("ServiceUnit.doDeploy"); + } + /** extended classes implement this method to perform the su specific undeployment related tasks in + * this method implementation. + * @throws DeploymentException on error. + */ + public void doUndeploy() throws DeploymentException { + //NOOP + this.getLogger().fine("ServiceUnit.doUndeploy"); + } + /** extended classes implement this method to perform the su specific initialization tasks in + * this method implementation. + * @throws DeploymentException on error. + */ + public void doInit() throws DeploymentException { + this.getLogger().fine("ServiceUnit.doInit"); + this.doInitEndpoints(); + } + /** extended classes implement this method to perform the su specific tasks on start in + * this method implementation. + * @throws DeploymentException on error. + */ + public void doStart() throws DeploymentException { + this.getLogger().fine("ServiceUnit.doStart"); + this.doActivateEndpoints(); + } + /** extended classes implement this method to perform the su specific tasks on stop in + * this method implementation. + * @throws DeploymentException on error. + */ + public void doStop() throws DeploymentException { + this.getLogger().fine("ServiceUnit.doStop"); + this.doDeactivateEndpoints(); + } + /** extended classes implement this method to perform the su specific tasks on shutdown in + * this method implementation. + * @throws DeploymentException on error. + */ + public void doShutdown() throws DeploymentException { + this.getLogger().fine("ServiceUnit.doShutdown"); + this.doCleanEndpoints(); + } + /** + * create the ProviderEndpoint that implement the service provider implementation specific to this su. + * @return ProviderEndpoint or null if the SU does not support the service provider access + */ + protected ProviderEndpoint createProviderEndpoint(Provides provides, Definition wsdlDef) { + return null; + } + /** + * create the ProviderEndpoint that implement the service consumer implementation specific to this su. + * @return ConsumerEndpoint or null if the SU does not support the service consumer access + */ + protected ConsumerEndpoint createConsumerEndpoint(Consumes consumes, Definition wsdlDef) { + return null; + } + /** + * generates the key based on the service to store the wsdl definitions . + */ + protected String getServiceKey(Service service) { + StringBuffer strBuff = new StringBuffer(); + strBuff.append(service.getInterface()).append("+"); + strBuff.append(service.getServiceName()).append("+"); + strBuff.append(service.getEndpointName()); + return strBuff.toString(); + } + /** + * looks up the wsdl definition loaded for this service. + */ + protected Definition findWSDLFor(Service service) throws WSDLException { + Definition wsdlDef = null; + String key = this.getServiceKey(service); + wsdlDef = this.mWSDLMap.get(key); + return wsdlDef; + } + + protected Definition findWSDL(List wsdlList, Service service, boolean ignoreEndpointLookup) { + Definition foundDef = null; + for ( Definition def : wsdlList ) { + if ( WSDLProcessor.isWSDLFor(def, service.getInterface(), service.getServiceName(), + ((ignoreEndpointLookup) ? null : service.getEndpointName()) ) ) { + foundDef = def; + break; + } + } + return foundDef; + } + /** + * loads the WSDL definitions corresponds to the service providers and consumers defined in the + * service unit descriptor. + */ + protected void loadServiceDefinitions() throws Exception { + + this.mWSDLMap = new HashMap(); + + WSDLProcessor wsdlProcessor = getWSDLProcessor(); + List wsdlList = wsdlProcessor.readWSDLs(this.getSURootPath()); + this.getLogger().fine("Number of wsdl definitions in service unit " + wsdlList.size()); + + List services = new ArrayList(); + services.addAll(this.getSUDescriptor().getProvidedServices()); + services.addAll(this.getSUDescriptor().getConsumedServices()); + + boolean isForBinding = this.getSUDescriptor().isForBindingComponent(); + this.getLogger().fine("Is this service unit for Binding? " + isForBinding); + + for ( Service service : services ) { + this.getLogger().fine("Looking up WSDL for service " + service); + boolean ignoreEndpointLookup = false; + boolean providerAtEngine = false; + if ( !isForBinding && service instanceof Provides ) { + ignoreEndpointLookup = true; + providerAtEngine = true; + } + Definition def = findWSDL(wsdlList, service, ignoreEndpointLookup); + if ( def == null ) { + throw new Exception("WSDL Definition not found for " + service); + } + this.mWSDLMap.put(getServiceKey(service), def); + if ( providerAtEngine ) { + // provider at engine. so add engine binding and endpoint to the wsdl + wsdlProcessor.create${componentName}Binding(def, + service.getInterface(), service.getServiceName(), service.getEndpointName()); + } + } + } + /** extended classes implement this method to perform the su specific artifacts validation in + * this method implementation. + * @throws DeploymentException on error. + */ + protected void loadOtherArtifacts() throws DeploymentException { + // nothing to validate further. + this.getLogger().fine("ServiceUnit.loadOtherArtifacts"); + } + /** + * creates ProviderEndpoint and ConsumerEndpoint objects corresponding to the service providers + * and consumers described in the su descriptor ( jbi.xml ) + */ + protected void loadEndpoints() throws Exception { + + this.mProviderEndpointMap = new HashMap(); + this.mConsumerEndpointMap = new HashMap(); + + Collection providesList = this.getSUDescriptor().getProvidedServices(); + for ( Provides provides : providesList ) { + Definition wsdlDef = findWSDLFor(provides); + if ( wsdlDef == null ) { + throw new DeploymentException("WSDL Definitions not found for " + provides); + } + ProviderEndpoint provider = createProviderEndpoint(provides, wsdlDef); + this.mProviderEndpointMap.put(provider.getID(), provider); + } + + Collection consumesList = this.getSUDescriptor().getConsumedServices(); + for ( Consumes consumes : consumesList ) { + Definition wsdlDef = findWSDLFor(consumes); + if ( wsdlDef == null ) { + throw new DeploymentException("WSDL Definitions not found for " + consumes); + } + ConsumerEndpoint consumer = createConsumerEndpoint(consumes, wsdlDef); + this.mConsumerEndpointMap.put(consumer.getID(), consumer); + } + } + /** + * initializes the Endpoint objects created corresponding to the consumer and providers defined + * in the su descriptor + */ + protected void doInitEndpoints() throws DeploymentException { + // init endpoints. if any initialization fails, rollback the already inited endpoints + List initedEndpoints = new ArrayList(); + List allEndpoints = new ArrayList(); + allEndpoints.addAll(this.getProviderEndpoints()); + allEndpoints.addAll(this.getConsumerEndpoints()); + + for ( Endpoint endpoint : allEndpoints ) { + try { + endpoint.init(); + initedEndpoints.add(endpoint); + } catch ( Exception initEx) { + doCleanEndpoints(initedEndpoints); + throw new DeploymentException(initEx); + } + } + + } + /** + * invokes activates method of all provider and consumer endpoint object in this su. if there is + * and error activating any one the endpoints, it deactivates the already activated ones and throws + * the error + */ + protected void doActivateEndpoints() throws DeploymentException { + // activate providers first and then consumers + List activatedEndpoints = new ArrayList(); + List allEndpoints = new ArrayList(); + allEndpoints.addAll(this.getProviderEndpoints()); + allEndpoints.addAll(this.getConsumerEndpoints()); + + for ( Endpoint endpoint : allEndpoints ) { + try { + endpoint.activate(); + activatedEndpoints.add(endpoint); + } catch ( Exception actEx) { + doDeactivateEndpoints(activatedEndpoints); + throw new DeploymentException(actEx); + } + } + } + /** + * invokes deactivate method on the list of Endpoint objects passed to this method + */ + protected void doDeactivateEndpoints(List endpoints) { + for ( Endpoint endpoint : endpoints ) { + try { + endpoint.deactivate(); + } catch(Exception ex) { + // ignore the exception and log it. + this.getLogger().log(Level.FINE, ex.getMessage(), ex); + } + } + } + /** + * invokes deactivate method on the all consumer and provider endpoint objects + */ + protected void doDeactivateEndpoints() { + // deactivate consumers first and then the providers + List allEndpoints = new ArrayList(); + allEndpoints.addAll(this.getConsumerEndpoints()); + allEndpoints.addAll(this.getProviderEndpoints()); + doDeactivateEndpoints(allEndpoints); + } + /** + * invokes clean method on the list of endpoint objects + */ + protected void doCleanEndpoints(List endpoints) { + for ( Endpoint endpoint : endpoints ) { + try { + endpoint.clean(); + } catch(Exception ex) { + // ignore the exception and log it. + this.getLogger().log(Level.FINE, ex.getMessage(), ex); + } + } + } + /** + * invokes clean method on the all consumer and provider endpoint objects in this su. + */ + protected void doCleanEndpoints() { + + List allEndpoints = new ArrayList(); + allEndpoints.addAll(this.getConsumerEndpoints()); + allEndpoints.addAll(this.getProviderEndpoints()); + doCleanEndpoints(allEndpoints); + } + /** + * prints the service unit description + */ + protected final String printDetails() { + + StringWriter writer = new StringWriter(); + PrintWriter out = new PrintWriter(writer); + + out.println("ServiceUnit Name : " + this.getName()); + out.println("ServiceUnit Root : " + this.getSURootPath()); + + SUDescriptor suDesc = null; + try { + suDesc = this.getSUDescriptor(); + for ( SUDescriptor.Consumes consumer : suDesc.getConsumedServices()) { + out.println(consumer); + } + for ( SUDescriptor.Provides provides : suDesc.getProvidedServices()) { + out.println(provides); + } + } catch (Exception ex) { + ex.printStackTrace(out); + } + return writer.getBuffer().toString(); + } + + +} diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/wsdl/AbstractExtensibilityElement.java b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/wsdl/AbstractExtensibilityElement.java new file mode 100644 index 000000000..7c4e85e5a --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/wsdl/AbstractExtensibilityElement.java @@ -0,0 +1,44 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * AbstractExtensibilityElement.java + */ + +package net.openesb.component.${componentName}.common.wsdl; + +import javax.wsdl.extensions.ExtensibilityElement; +import javax.xml.namespace.QName; + +/** + * This is an abstract class which can be extended to create jwsdl (wsdl4j's) extension elements model to + * read/write the wsdl extension elements in wsdl 1.1 xml. + * + * @author chikkala + */ +public abstract class AbstractExtensibilityElement implements ExtensibilityElement, java.io.Serializable { + public static final long serialVersionUID = 1; + private QName mElementType; + private Boolean mRequired; + + /** Creates a new instance of AbstractExtensibilityElement */ + protected AbstractExtensibilityElement() { + } + + public void setElementType(QName elementType) { + this.mElementType = elementType; + } + + public QName getElementType() { + return this.mElementType; + } + + public void setRequired(Boolean required) { + this.mRequired = required; + } + + public Boolean getRequired() { + return this.mRequired; + } + +} diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/wsdl/AbstractExtensionRegistry.java b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/wsdl/AbstractExtensionRegistry.java new file mode 100644 index 000000000..6bc7a60ef --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/wsdl/AbstractExtensionRegistry.java @@ -0,0 +1,45 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * AbstractExtensionRegistry.java + */ + +package net.openesb.component.${componentName}.common.wsdl; + +import java.util.List; +import javax.wsdl.extensions.ExtensionRegistry; + +/** + * This is the abstract class used to add the wsdl extension serializers and deserializers to the + * wsdl extension registry configured to read/write wsdl extensions into a know java model. + * @see AbstractExtensionSerializer + * @see WSDLProcessor + * @author chikkala + */ +public abstract class AbstractExtensionRegistry extends ExtensionRegistry { + + /** Creates a new instance of AbstractSerializer + * it calls the createSerializers method to get the list of + * serializers and then call registerSerializer on each AbstractExtensionSerializer + * to register them with this registry. + * @see AbstractExtensionSerializer${symbol_pound}registerSerializer + */ + protected AbstractExtensionRegistry() { + super(); + List list = createSerializers(); + for (AbstractExtensionSerializer ser : list ) { + ser.registerSerializer(this); + } + // register ${componentName} Binding serializers + AbstractExtensionSerializer seBindingSer = new SEBindingExt.SEBindingExtSerializer(); + seBindingSer.registerSerializer(this); + } + /** + * create wsdl extension serializers for each extension element to register with the extension + * registry. + * @return List of AbstractExtensionSerializer objects for serializing/deserializing the wsdl extensions. + * @see AbstractExtensionSerializer + */ + protected abstract List createSerializers(); +} diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/wsdl/AbstractExtensionSerializer.java b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/wsdl/AbstractExtensionSerializer.java new file mode 100644 index 000000000..2cd2512cd --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/wsdl/AbstractExtensionSerializer.java @@ -0,0 +1,123 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * AbstractExtensionSerializer.java + */ + +package net.openesb.component.${componentName}.common.wsdl; + +import java.io.PrintWriter; +import java.io.Serializable; +import java.util.Set; +import javax.wsdl.Definition; +import javax.wsdl.WSDLException; +import javax.wsdl.extensions.ExtensibilityElement; +import javax.wsdl.extensions.ExtensionDeserializer; +import javax.wsdl.extensions.ExtensionRegistry; +import javax.wsdl.extensions.ExtensionSerializer; +import javax.xml.namespace.QName; +import org.w3c.dom.Attr; +import org.w3c.dom.Element; + +/** + * This class is an abstract class that should be extended to implements extension serializer and + * deserializer. This class implements the code required for registering the serializer and deserializer + * implemented by this class. THe AbstractExtensionRegistry class calls the ${symbol_pound}registerSerializer method + * to register the concrete implementation of this class with extension registry. + * @see AbstractExtensionRegistry + * @author chikkala + */ +public abstract class AbstractExtensionSerializer + implements ExtensionSerializer, ExtensionDeserializer, Serializable { + + public static final long serialVersionUID = 1; + + private Class mParentType; + private Class mExtensionType; + private QName mElementType; + + /** Creates a new instance of AbstractSerializer */ + public AbstractExtensionSerializer(Class parentType, QName elementType, Class extensionType) { + this.mParentType = parentType; + this.mElementType = elementType; + this.mExtensionType = extensionType; + } + + public Class getParentType() { + return this.mParentType; + } + public QName getElementType() { + return this.mElementType; + } + public Class getExtensionType() { + return this.mExtensionType; + } + + public void registerSerializer(ExtensionRegistry extReg) { + extReg.registerSerializer(this.mParentType, this.mElementType, this); + extReg.registerDeserializer(this.mParentType, this.mElementType, this); + extReg.mapExtensionTypes(this.mParentType, this.mElementType, this.mExtensionType); + } + + public void marshall(Class parentType, QName elementType, ExtensibilityElement extension, + PrintWriter pw, Definition def, ExtensionRegistry extReg ) throws WSDLException { + // DO NOTHING. Binding component runtime does not need to serialize the wsdl extensions. + } + + public ExtensibilityElement unmarshall(Class parentType, QName elementType, Element el, + Definition def, ExtensionRegistry extReg) throws WSDLException { + return null; + } + + public static String getAttribute(Element el, String attrName) { + String attrValue = null; + Attr attr = el.getAttributeNode(attrName); + if ( attr != null ) { + attrValue = attr.getValue(); + } + return attrValue; + } + + protected String getNamespacePrefix(Definition def, String namespaceURI, String defPrefix) { + String prefix = null; + prefix = def.getPrefix(namespaceURI); + if ( prefix == null ) { + Set keySet = def.getNamespaces().keySet(); + String newPrefix = "ns"; + if ( defPrefix != null && defPrefix.trim().length() > 0 ){ + newPrefix = defPrefix; + } + prefix = newPrefix; + for ( int i=0; i < Integer.MAX_VALUE; ++i) { + if (!keySet.contains(prefix)) { + break; + } else { + prefix = newPrefix + i; + } + } + } + return prefix; + } + /** + * @return the name with the prefix defined for the namespaceURI in the wsdl definition. + * @throws WSDLException if the prefix not found in the wsdl definition. note that the + * default prefix is an empty string. + */ + protected String getQualifiedName(Definition def, + String namespaceURI, String localName) throws WSDLException { + String prefix = null; + if (namespaceURI != null && !namespaceURI.equals("")) { + prefix = def.getPrefix(namespaceURI); + if ( prefix == null ) { + throw new WSDLException(WSDLException.OTHER_ERROR, + "Can not find prefix in WSDL Definition for " + namespaceURI); + } + } + if ( prefix != null && !prefix.equals("")) { + return prefix + ":" + localName; + } else { + return localName; + } + } +} diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/wsdl/AbstractNormalizer.java b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/wsdl/AbstractNormalizer.java new file mode 100644 index 000000000..1eb2ab533 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/wsdl/AbstractNormalizer.java @@ -0,0 +1,229 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * AbstractNormalizer.java + */ + +package net.openesb.component.${componentName}.common.wsdl; + +import java.util.ArrayList; +import java.util.List; +import javax.jbi.messaging.MessagingException; +import javax.jbi.messaging.NormalizedMessage; +import javax.wsdl.Binding; +import javax.wsdl.Definition; +import javax.wsdl.Message; +import javax.wsdl.Operation; +import javax.wsdl.Part; +import javax.xml.namespace.QName; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.transform.dom.DOMSource; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +/** + * This is an abstract class that implements most of the functionality to normalize the binding protocol + * specific concrete message to jbi wrapper and and denormalize jbi wrapper to the concrete binding + * protocol specific message. + *

+ * The extended classes specific to particular binding protocol will be used when a jbi binding + * component is sending and receiving messages from the external service providers and consumers using + * a particular binding protocol known to this class. Extended implementation of this class should make + * use of the helper methods in this class in normalizing and denormalizing the messages. + * @see JMXBindingNormalizer + * @author chikkala + */ +public abstract class AbstractNormalizer { + + public static final String XMLNS_NS = "http://www.w3.org/2000/xmlns/"; + /** wsdl definition to use when normalizing and denormalizing */ + private Definition mWSDL; + /** Binding definition to use when normalizing and denormalizing */ + private Binding mBinding; + + private AbstractNormalizer() {} + /** Creates a new instance of JMXBCNormalizer */ + public AbstractNormalizer(Definition wsdl, Binding binding) { + this.mWSDL = wsdl; + this.mBinding = binding; + } + /** + * normalize the binding protocol specific concrete message to jbi wrapper. + * @param operation wsdl operation for which a concrete message should be normalized. + * @param normMsg NoramalizedMessage which will be configurate with normalized data from + * the concrete message + * @param msgSource concrete mssage of a particular binding protocol. + */ + public abstract void normalizeInput(Operation operation, NormalizedMessage normMsg, DOMSource msgSource) + throws MessagingException; + /** + * normalize the binding protocol specific concrete message to jbi wrapper. + * @param operation wsdl operation for which a concrete message should be normalized. + * @param normMsg NoramalizedMessage which will be configurate with normalized data from + * the concrete message + * @param msgSource concrete message of a particular binding protocol. + */ + public abstract void normalizeOutput(Operation operation, NormalizedMessage normMsg, DOMSource msgSource) + throws MessagingException; + /** + * normalize the binding protocol specific concrete message to jbi wrapper. + * @param operation wsdl operation for which a concrete message should be normalized. + * @param normMsg NoramalizedMessage which will be configurate with normalized data from + * the concrete message + * @param msgSource concrete message of a particular binding protocol. + */ + public abstract void normalizeFault(Operation operation, String faultName, NormalizedMessage normMsg, DOMSource msgSource) + throws MessagingException; + /** + * denormalize the normalized message into a concrete message for a particular binding protocol + * @param operation wsdl operation for which a concrete message should be de-normalized. + * @param normMsg NormalizedMessage which should be used to create de-normalized message. + */ + public abstract DOMSource denormalizeInput(Operation operation, NormalizedMessage normMsg) + throws MessagingException; + /** + * denormalize the normalized message into a concrete message for a particular binding protocol + * @param operation wsdl operation for which a concrete message should be denormalized. + * @param normMsg NormalizedMessage which should be used to create denormalized message. + */ + public abstract DOMSource denormalizeOutput(Operation operation, NormalizedMessage normMsg) + throws MessagingException; + + /** + * denormalized the normalized fault message into a concrete message for a particular binding protocol + * @param operation wsdl operation for which a concrete message should be denormalized. + * @param normMsg NormalizedMessage which should be used to create denormalized message. + */ + public abstract DOMSource denormalizeFault(Operation operation, String faultName, NormalizedMessage normMsg) + throws MessagingException; + /** + * @return the wsdl definition to use in normalizing and denormalizing the message + */ + protected Definition getWSDL() { + return this.mWSDL; + } + /** + * @return the wsdl binding definition to use in normalizing and denormalizing the message + */ + protected Binding getBinding() { + return this.mBinding; + } + /** + * create and add message parts to the jbiWrapper according to the abstract message model. This + * method assumes that the each element in the msgParts list passed to it is mapped to the part + * of the abstract wsdl message and uses the type or element attribute of the abstract message to + * determine whether the element is actual part element or a wrapped part type. + * Use this method in normalizing the concrete protocol specific message to jbi wrapper message. + * @param jbiWrapper object that holds the jbi wrapper information. + * @param wsdlMsg abstract message from the wsdl definition + * @param msgParts actual message parts from the concrete message + */ + protected void addMessagePartsToJBIWrapper(WSDL11JBIWrapper jbiWrapper, Message wsdlMsg, List msgParts) throws MessagingException { + List wsdlParts = wsdlMsg.getOrderedParts(null); + for ( int i=0; i < wsdlParts.size(); ++i ) { + Part wsdlPart = (Part) wsdlParts.get(i); + if ( i >= msgParts.size() ) { + throw new MessagingException("missing message content for part " + wsdlPart.getName()); + } + Element msgPart = msgParts.get(i); + if ( wsdlPart.getElementName() != null ) { + jbiWrapper.appendPart(msgPart); + } else { + // it is type. + // check the element name is same as part + if ( !wsdlPart.getName().equals(msgPart.getLocalName()) ) { + throw new MessagingException("mismatched message content for part " + wsdlPart.getName()); + } + if ( !wsdlMsg.getQName().getNamespaceURI().equals(msgPart.getNamespaceURI()) ) { + throw new MessagingException("mismatched message content namespace for part " + wsdlPart.getName()); + } + // check the content is text or element. + List partContent = getChildElements(msgPart); + if ( partContent.size() > 0 ) { + // add content as part elements + jbiWrapper.appendPart(partContent); + } else { + // add the content as text + jbiWrapper.appendPart(msgPart.getTextContent()); + } + } + } + } + /** + * extracts the message parts from the jbiWrapper according to the abstract wsdl message + * definition passed to it. Use this method in denormalizing the jbi wrapper message into the + * binding protocol specific concrete message. + * @param jbiWrapper jbi wrapper object that contains message parts and the message type information. + * @param wsdlMsg abstract wsdl message definition to use in constructing the part elements. + */ + protected List getMessagePartsFromJBIWrapper(WSDL11JBIWrapper jbiWrapper, Message wsdlMsg) + throws MessagingException, ParserConfigurationException { + + List msgParts = new ArrayList(); + int jbiPartCount = jbiWrapper.getPartCount(); + List wsdlParts = wsdlMsg.getOrderedParts(null); + QName msgType = jbiWrapper.getType(); + if (!wsdlMsg.getQName().getNamespaceURI().equals(msgType.getNamespaceURI())) { + throw new MessagingException("Namespace mismatch between jbi wrapper message type and wsdl message"); + } + Document newDoc = jbiWrapper.getDocumentBuilder().newDocument(); + for ( int i=0; i < wsdlParts.size(); ++i ) { + Part wsdlPart = (Part) wsdlParts.get(i); + if ( i >= jbiPartCount ) { + throw new MessagingException("missing message content for part " + wsdlPart.getName()); + } + if ( wsdlPart.getElementName() != null ) { + msgParts.add(jbiWrapper.getPartAsElement(i)); + } else { + // it is type. create a new element for a typed part + // check the element name is same as part + String prefix = msgType.getPrefix(); + String nsURI = msgType.getNamespaceURI(); + String localName = wsdlPart.getName(); + Element partEl = newDoc.createElementNS(nsURI, prefix + ":" + localName); + partEl.setAttributeNS(XMLNS_NS, "xmlns:"+prefix, nsURI); + NodeList partContent = jbiWrapper.getPart(i); + appendChildren(partEl, partContent, newDoc, true); + msgParts.add(partEl); + } + } + return msgParts; + } + /** + * utility method that can append the nodeList passed to it to the element children. + * @param el element node to which the nodeList should be appended + * @param doc the document object that should be used to import the nodeList + * @param importNode true if the nodeList should be imported while appending the nodeList to the + * element children. false if no import is necessary. + */ + protected void appendChildren(Element el, NodeList nodeList, Document doc, boolean importNode) { + + for ( int pIdx = 0; pIdx < nodeList.getLength(); ++pIdx) { + Node node = nodeList.item(pIdx); + if ( importNode ) { + node = doc.importNode(node, true); + } + el.appendChild(node); + } + } + /** + * @param el element from which to extract the child elements + * @return List list of child Element nodes. + */ + protected List getChildElements(Element el) { + List list = new ArrayList(); + NodeList nodeList = el.getChildNodes(); + for ( int i=0; i < nodeList.getLength(); ++i) { + Node node = nodeList.item(i); + if (!(node instanceof Element) ){ + continue; + } + list.add((Element)node); + } + return list; + } + +} diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/wsdl/SEBindingExt.java b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/wsdl/SEBindingExt.java new file mode 100644 index 000000000..fa18158a7 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/wsdl/SEBindingExt.java @@ -0,0 +1,99 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * SEBindingExt.java + */ + +package net.openesb.component.${componentName}.common.wsdl; + +import java.io.PrintWriter; +import javax.wsdl.Binding; +import javax.wsdl.Definition; +import javax.wsdl.WSDLException; +import javax.wsdl.extensions.ExtensibilityElement; +import javax.wsdl.extensions.ExtensionRegistry; +import javax.xml.namespace.QName; +import org.w3c.dom.Element; + +/** + * This interface and its implementation classes implement wsdl 1.1 extension model for the + * jbi service engine binding that is defined in jsr 208(sec. 5.5.6.1). to read/write concrete binding + * element in the wsdl definition for the service endpoint binding provided by the service engine. + * The wsdl definition with this binding information can be used in providing the service provider + * metadata returned by the service engine in Component.getServiceDescription. + *

+ * AbstractExtensionRegistry by default include this extension serializers in the + * registry to read/write this service engine binding type in the wsdl definition. + *

+ * During a service unit deployment/initialization in the service engine, the deployed wsdl definition + * is loaded and modified to provide this binding for the service provided by the engine. + * + * @see WSDLProcessor${symbol_pound}create${componentName}Binding + * @see AbstractExtensionRegistry + * @see com.sun.jbi.sample.component.common.deployment.ServiceUnit${symbol_pound}loadServiceDefinitions + * @author chikkala + */ +public interface SEBindingExt extends ExtensibilityElement, java.io.Serializable { + + public static final String NS_URI = "http://java.sun.com/xml/ns/jbi/binding/service+engine"; + public static final String NS_DEF_PREFIX = "jbise"; + /** Element names. */ + public static final String EL_BINDING_EXT = "binding"; + /**Qualified element names.*/ + public static final QName QN_BINDING_EXT = new QName(NS_URI, EL_BINDING_EXT); + + public static class SEBindingExtImpl extends AbstractExtensibilityElement implements SEBindingExt { + + public SEBindingExtImpl() { + setElementType(QN_BINDING_EXT); + } + @Override + public String toString() { + StringBuffer buff = new StringBuffer(); + buff.append("<"+NS_DEF_PREFIX+":"+EL_BINDING_EXT); + buff.append("/>"); + return buff.toString(); + } + /** + * creates and adds the jbi service engine binding extensibility element to the wsdl definition + * under specified binding definition. + */ + public static SEBindingExtImpl addExtensibilityElement(Definition wsdlDef, Binding binding) { + SEBindingExtImpl bindingExt = new SEBindingExt.SEBindingExtImpl(); + WSDLProcessor.addExtensibilityElement(wsdlDef, binding, bindingExt, SEBindingExt.NS_DEF_PREFIX); + return bindingExt; + } + } + /** + * serializer and descrializer implementation for the binding extension element. + */ + public static class SEBindingExtSerializer extends AbstractExtensionSerializer { + + public SEBindingExtSerializer() { + super(Binding.class, QN_BINDING_EXT, SEBindingExtImpl.class); + } + + @Override + public ExtensibilityElement unmarshall(Class parentType, QName elementType, Element el, + Definition def, ExtensionRegistry extReg) throws WSDLException { + SEBindingExt extObj = (SEBindingExt)extReg.createExtension(parentType, elementType); + return extObj; + } + + @Override + public void marshall(Class parentType, QName elementType, ExtensibilityElement extension, + PrintWriter pw, Definition def, ExtensionRegistry extReg ) throws WSDLException { + + String elName = getQualifiedName(def, NS_URI, EL_BINDING_EXT); + + SEBindingExt extObj = (SEBindingExt)extension; + + StringBuffer buff = new StringBuffer(); + buff.append("<" + elName ); + buff.append("/>"); + pw.println(buff.toString()); + } + } + +} diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/wsdl/WSDL11JBIWrapper.java b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/wsdl/WSDL11JBIWrapper.java new file mode 100644 index 000000000..20a09646b --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/wsdl/WSDL11JBIWrapper.java @@ -0,0 +1,471 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * WSDL11JBIWrapper.java + * + */ + +package net.openesb.component.${componentName}.common.wsdl; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import javax.wsdl.Fault; +import javax.wsdl.Input; +import javax.wsdl.Message; +import javax.wsdl.Operation; +import javax.wsdl.Output; +import javax.xml.namespace.QName; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.transform.dom.DOMSource; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.w3c.dom.Text; + +/** + * This class wraps the wsdl11 messages to the jbi wrapper message suitable for + * processing in the wsdl2.0 model of the normalized message in jbi as defined in jsr208 like + * + * + * + * + * + * + * + * + * + * + * @author chikkala + */ +public class WSDL11JBIWrapper { + + public static final String XMLNS_NS = "http://www.w3.org/2000/xmlns/"; + public static final String WRAPPER_NAMESPACE = "http://java.sun.com/xml/ns/jbi/wsdl-11-wrapper"; + public static final String DEF_NS_PREFIX = "jbiwrp"; + public static final String DEF_MESSAGE_NS_PREFIX = "msgns"; + public static final String JBI_MESSAGE_EL = "message"; + public static final String JBI_PART_EL = "part"; + public static final String VERSION_ATTR = "version"; + public static final String VERSION_ATTR_VALUE = "1.0"; + public static final String TYPE_ATTR = "type"; + public static final String NAME_ATTR = "name"; + + private static DocumentBuilder sDocBuilder = null; + /** qname of message attribute from wsdl:input, wsdl:output or wsdl:fault */ + private QName mType; + /** optional name attribute from wsdl:input, wsdl:output or wsdl:fault */ + private String mName; + /** each parts contents as node list */ + List mPartConentList = new ArrayList(); + + /** Creates a new instance of WSDL11JBIWrapper */ + public WSDL11JBIWrapper() { + } + /** creates the namespace aware document builder. extended classes can override this method + * to return the doc builder created else where. + */ + protected DocumentBuilder createDocumentBuilder() throws ParserConfigurationException { + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + factory.setNamespaceAware(true); + return factory.newDocumentBuilder(); + } + /** return the document builder + * @return DocumentBuilder + */ + public final DocumentBuilder getDocumentBuilder() throws ParserConfigurationException { + if ( WSDL11JBIWrapper.sDocBuilder == null ) { + WSDL11JBIWrapper.sDocBuilder = createDocumentBuilder(); + } + return WSDL11JBIWrapper.sDocBuilder; + } + /** + * @return type qname of message attribute from wsdl:input, wsdl:output or wsdl:fault + */ + public QName getType() { + return this.mType; + } + /** + * @param type qname of message attribute from wsdl:input, wsdl:output or wsdl:fault + */ + public void setType(QName type) { + this.mType = type; + } + /** @return name attribute from wsdl:input, wsdl:output or wsdl:fault. or null if not set. */ + public String getName() { + return this.mName; + } + /** + * @param name optional name attribute from wsdl:input, wsdl:output or wsdl:fault. can be null. + */ + public void setName(String name) { + this.mName = name; + } + /** + * appends part content as node list + */ + public void appendPart(NodeList partContent) { + this.mPartConentList.add(partContent); + } + /** + * append part content from the List of nodes + */ + public void appendPart(List partContent) { + this.mPartConentList.add(new NodeListImpl(partContent)); + } + /** + * append part content as element + */ + public void appendPart(Element partContent) { + this.mPartConentList.add(new NodeListImpl(partContent)); + } + /** + * append part content from DOMSource + */ + public void appendPart(DOMSource partContent) { + Element partConentEl = getElement(partContent.getNode()); + this.mPartConentList.add(new NodeListImpl(partConentEl)); + } + /** + * append part content as text node. + */ + public void appendPart(String partContent) { + Text textContent = null; + try { + textContent = this.getDocumentBuilder().newDocument().createTextNode(partContent); + } catch (ParserConfigurationException ex) { + ex.printStackTrace(); + } + if ( textContent != null ) { + this.mPartConentList.add(new NodeListImpl(textContent)); + } + } + /** + * append list of part contents each is a NodeList to the parts + */ + public void appendParts(List partContentList) { + this.mPartConentList.addAll(partContentList); + } + /** + * returned the ordered list of part contents. + */ + public List getParts() { + return Collections.unmodifiableList(this.mPartConentList); + } + /** + * return the number of parts + */ + public int getPartCount() { + return this.mPartConentList.size(); + } + /** + * return the part content at a particular index as NodeList. + */ + public NodeList getPart(int idx) { + return this.mPartConentList.get(idx); + } + /** + * return part context at a particular index as text + */ + public String getPartAsText(int idx) { + NodeList partNodes = getPart(idx); + Document doc; + try { + doc = this.getDocumentBuilder().newDocument(); + Element el = doc.createElementNS(WRAPPER_NAMESPACE, DEF_NS_PREFIX + ":" + JBI_PART_EL); + for ( int i=0; i < partNodes.getLength(); ++i) { + el.appendChild(partNodes.item(i)); + } + return el.getTextContent(); + } catch (ParserConfigurationException ex) { + return null; + } + } + /** + * return part context at a particular index as Element + */ + public Element getPartAsElement(int idx) { + Element contentEl = null; + NodeList partNodes = getPart(idx); + for ( int i=0; i < partNodes.getLength(); ++i) { + Node node = partNodes.item(i); + if ( node instanceof Element) { + contentEl = (Element)node; + break; + } + } + return contentEl; + } + /** + * creates Document from this wrapper object. Before calling this method, + * the type, name (optional) and parts contents should be set. + * @return Document containing the wsdl 11 wrapper xml + */ + public Document toDocument() throws ParserConfigurationException { + + Document wrapperDoc = getDocumentBuilder().newDocument(); + Element jbiMessage = wrapperDoc.createElementNS(WRAPPER_NAMESPACE, DEF_NS_PREFIX + ":" + JBI_MESSAGE_EL); + jbiMessage.setAttribute(VERSION_ATTR, VERSION_ATTR_VALUE); + wrapperDoc.appendChild(jbiMessage); + + QName type = this.getType(); + if ( type == null ) { + type = new QName("", "", DEF_MESSAGE_NS_PREFIX); + } + // set the jbiMessage attributes + String prefix = type.getPrefix(); + if (prefix == null || prefix.length() == 0) { + prefix = DEF_MESSAGE_NS_PREFIX; + } + jbiMessage.setAttribute(TYPE_ATTR, prefix + ":" + type.getLocalPart()); + jbiMessage.setAttributeNS( XMLNS_NS, "xmlns:" + prefix, type.getNamespaceURI()); + + String name = this.getName(); + if (name != null && name.trim().length() > 0 ) { + jbiMessage.setAttribute(NAME_ATTR, name); + } + + List partContentList = this.getParts(); + for ( NodeList nodeList : partContentList ) { + // set jbi part message + Element jbiPart = wrapperDoc.createElementNS(WRAPPER_NAMESPACE, DEF_NS_PREFIX + ":" + JBI_PART_EL); + jbiMessage.appendChild(jbiPart); + for ( int i =0; i < nodeList.getLength(); ++i ) { + Node importedMsgNode = wrapperDoc.importNode(nodeList.item(i), true); + jbiPart.appendChild(importedMsgNode); + } + } + + return wrapperDoc; + + } + /** + * creates DOMSource from this wrapper object. Before calling this method, + * the type, name (optional) and parts contents should be set. + * @return DOMSource containing the wsdl 11 wrapper xml + */ + public DOMSource toDOMSource() throws ParserConfigurationException { + DOMSource wrappedSource = new DOMSource(); + wrappedSource.setNode(toDocument()); + return wrappedSource; + } + /** + * return Element node from a document node or non document. Use to extract + * the message root element. + * @root node from which the Element node will be extracted. + * @return Element node. + */ + public static Element getElement(Node root) { + Element msgEl = null; + if ( root instanceof Document) { + msgEl = ((Document)root).getDocumentElement(); + } else if (root instanceof Element) { + msgEl = (Element)root; + } else { + NodeList nodeList = root.getChildNodes(); + for ( int i=0; i < nodeList.getLength(); ++i) { + Node node = nodeList.item(i); + if ( node instanceof Element ) { + msgEl = (Element) node; + break; + } + } + } + return msgEl; + } + /** + * creates wrapper object from the DOMSource that has wsdl 11 wrapper xml. + * @param wrappedMsg wsdl 11 wrapper xml as DOMSource + * @return WSDL11JBIWrapper representing the wrapper xml. + */ + public static WSDL11JBIWrapper sourceToWrapper(DOMSource wrappedMsg) { + Element jbiMessage = getElement(wrappedMsg.getNode()); + if ( jbiMessage == null ) { + return null; + } + String nsURI = jbiMessage.getNamespaceURI(); + String tagName = jbiMessage.getLocalName(); + if (!WRAPPER_NAMESPACE.equals(nsURI) || !JBI_MESSAGE_EL.equals(tagName)) { + return null; + } + String name = jbiMessage.getAttribute(NAME_ATTR); + String typeQN = jbiMessage.getAttribute(TYPE_ATTR); + String typePrefix = ""; + String typeName = ""; + if ( typeQN != null && typeQN.trim().length() > 0 ) { + int idx = typeQN.indexOf(':'); + if ( idx >= 0 ) { + typePrefix = typeQN.substring(0, idx); + if ( typeQN.length() > idx ) { + typeName = typeQN.substring(idx+1); + } + } else { + typePrefix = ""; + typeName = typeQN; + } + } + String typeURI = jbiMessage.getAttribute("xmlns:" + typePrefix); + QName typeQName = new QName(typeURI, typeName, typePrefix); + + WSDL11JBIWrapper wrapper = new WSDL11JBIWrapper(); + wrapper.setName(name); + wrapper.setType(typeQName); + NodeList jbiPartList = jbiMessage.getElementsByTagNameNS(WRAPPER_NAMESPACE, JBI_PART_EL); + for ( int i=0; i < jbiPartList.getLength(); ++i) { + Node jbiPart = jbiPartList.item(i); + wrapper.appendPart(jbiPart.getChildNodes()); + } + return wrapper; + } + /** + * creates the WSDL11JBIWrapper object and sets the type and name of the object + * @param type qname of message attribute from wsdl:input, wsdl:output or wsdl:fault + * @param name optional name attribute from wsdl:input, wsdl:output or wsdl:fault + * @return the jbi message wrapper object + */ + public static WSDL11JBIWrapper createWrapper(QName type, String name ) throws ParserConfigurationException { + WSDL11JBIWrapper wrapper = new WSDL11JBIWrapper(); + wrapper.setName(name); + wrapper.setType(type); + return wrapper; + } + /** + * creates the WSDL11JBIWrapper object. useful when the message has one part and the + * part content has multiple child element. + * @param type qname of message attribute from wsdl:input, wsdl:output or wsdl:fault + * @param name optional name attribute from wsdl:input, wsdl:output or wsdl:fault + * @param partContent part content as node list + * @return the jbi message wrapper object + */ + public static WSDL11JBIWrapper createWrapper(QName type, String name, NodeList partContent) throws ParserConfigurationException { + WSDL11JBIWrapper wrapper = createWrapper(type, name); + wrapper.appendPart(partContent); + return wrapper; + } + /** + * creates the WSDL11JBIWrapper object. useful when the message has one part and the + * part content is a single element + * @param type qname of message attribute from wsdl:input, wsdl:output or wsdl:fault + * @param name optional name attribute from wsdl:input, wsdl:output or wsdl:fault + * @param partContent part content as node list + * @return the jbi message wrapper object + */ + public static WSDL11JBIWrapper createWrapper(QName type, String name, Element msgEl) throws ParserConfigurationException { + WSDL11JBIWrapper wrapper = createWrapper(type, name, new WSDL11JBIWrapper.NodeListImpl(msgEl)); + return wrapper; + } + + public static WSDL11JBIWrapper createWrapper(QName type, String name, DOMSource inputSource) throws ParserConfigurationException { + WSDL11JBIWrapper wrapper = createWrapper(type, name); + Node msgNode = getElement(inputSource.getNode()); + NodeList nodeList = new WSDL11JBIWrapper.NodeListImpl(msgNode); + wrapper.appendPart(nodeList); + return wrapper; + } + /** + * creates the wrapped message using the wsdl4j operations input element for type and name. + * @param msg DOMSource for the unwrapped message + * @param operation wsdl4j operation object representing the operation of the PortType + * @return DOMSource wrapped message as DOMSource + */ + public static WSDL11JBIWrapper createInputWrapper(Operation operation) throws ParserConfigurationException { + QName type = null; + String name = null; + + Input input = operation.getInput(); + if ( input == null ) { + return null; + } + name = input.getName(); + Message wsdlMsg = input.getMessage(); + type = wsdlMsg.getQName(); + + WSDL11JBIWrapper wrapper = createWrapper(type, name); + return wrapper; + } + /** + * creates the wrapped message using the wsdl4j operations output element for type and name. + * @param msg DOMSource for the unwrapped message + * @param operation wsdl4j operation object representing the operation of the PortType + * @return DOMSource wrapped message as DOMSource + */ + public static WSDL11JBIWrapper createOutputWrapper(Operation operation) throws ParserConfigurationException { + QName type = null; + String name = null; + + Output output = operation.getOutput(); + if ( output == null) { + return null; + } + name = output.getName(); + Message wsdlMsg = output.getMessage(); + type = wsdlMsg.getQName(); + + WSDL11JBIWrapper wrapper = createWrapper(type, name); + return wrapper; + } + /** + * creates the wrapped message using the wsdl4j operations output element for type and name. + * @param msg DOMSource for the unwrapped message + * @param operation wsdl4j operation object representing the operation of the PortType + * @param faultName fault name, can be null to look for the fault with no name. + * @return DOMSource wrapped message as DOMSource + */ + public static WSDL11JBIWrapper createFaultWrapper(Operation operation, String faultName) throws ParserConfigurationException { + QName type = null; + String name = null; + @SuppressWarnings("unchecked") + Map faultMap = operation.getFaults(); + Fault fault = faultMap.get(faultName); + + if ( fault == null ) { + return null; + } + name = fault.getName(); + Message wsdlMsg = fault.getMessage(); + type = wsdlMsg.getQName(); + + WSDL11JBIWrapper wrapper = createWrapper(type, name); + return wrapper; + } + /** + * NodeList implementation. + */ + public static class NodeListImpl extends ArrayList implements NodeList { + + public NodeListImpl() { + super(); + } + + public NodeListImpl(Node aNode) { + super(); + if (aNode != null) { + this.add(aNode); + } + } + + public NodeListImpl(List nodes) { + if (nodes != null) { + this.addAll(nodes); + } + } + + public int getLength() { + return this.size(); + } + + public Node item(int idx) { + return this.get(idx); + } + + } + +} diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/wsdl/WSDLProcessor.java b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/wsdl/WSDLProcessor.java new file mode 100644 index 000000000..9eb0ca32c --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/jbiadapter/src/net/openesb/component/__componentName__/common/wsdl/WSDLProcessor.java @@ -0,0 +1,419 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * WSDLProcessor.java + */ + +package net.openesb.component.${componentName}.common.wsdl; + +import java.io.File; +import java.io.FileFilter; +import java.io.IOException; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Set; +import javax.wsdl.Binding; +import javax.wsdl.Definition; +import javax.wsdl.Operation; +import javax.wsdl.Port; +import javax.wsdl.PortType; +import javax.wsdl.Service; +import javax.wsdl.WSDLException; +import javax.wsdl.extensions.ElementExtensible; +import javax.wsdl.extensions.ExtensibilityElement; +import javax.wsdl.extensions.ExtensionRegistry; +import javax.wsdl.factory.WSDLFactory; +import javax.wsdl.xml.WSDLReader; +import javax.wsdl.xml.WSDLWriter; +import javax.xml.namespace.QName; + +/** + * This class is used to configure jwsdl(wsdl4j) to read and process wsdl documents with wsdl extensions. + * It provides set of helper methods to read and process the wsdl definitions from files with .wsdl + * extension from a specified directory. + *

+ * A Binding Component that is processing the wsdl extensions for its deployment configuration would + * extend this class and provide the required ExtensionRegistry that will have the extension serializers + * and deserializers configured to read/write the extensions from/to the java model. + *

+ * A Service Engine that is processing the wsdl during deployment can directly use this class + * to process the wsdl as the default implementation returned by this class configures the wsdl extension + * registry to read/write the service engine binding extensions. + * + * @see AbstractExtensionRegistry + * @see SEBindingExt + * @author chikkala + */ +public class WSDLProcessor { + + private String mXmlCatalogPath = "xml-catalog.xml"; + private String mWsdlDirPath = ""; + private WSDLReader mReader; + + /** Creates a new instance of WSDLProcessor + */ + public WSDLProcessor(String wsdlDir) { + this(wsdlDir, null); + } + /** Creates a new instance of WSDLProcessor + */ + public WSDLProcessor(String wsdlDir, String xmlCatPath) { + if ( wsdlDir != null ) { + this.mWsdlDirPath = wsdlDir; + } + if ( xmlCatPath != null ) { + this.mXmlCatalogPath = xmlCatPath; + } + } + /** @return directory path from which this class reads the wsdl files with .wsdl as file extension. */ + public String getWSDLDirectory() { + return this.mWsdlDirPath; + } + /** path to the xml catalog file in the service unit which can be used for Catalog-based entity + * and URI resolution. + */ + public String getXmlCatelogPath() { + return this.mXmlCatalogPath; + } + /** wsdl extension registry required for processing the wsdl extensions in the wsdl definition to + * java model. Binding component that is processing the wsdl extensions for its deployment + * configuration would provide the required ExtensionRegistry that will have the extension serializers + * and deserializers configured to read/write the extensions from/to the java model. + * @return ExtensionSerializer + * @see AbstractExtensionSerializer + */ + protected ExtensionRegistry getExtensionRegistry() { + return new AbstractExtensionRegistry() { + protected List createSerializers() { + return new ArrayList(); + } + }; + } + /** + * @return the WSDLReader configured with extension registry to process the wsdl extensions. + */ + public final WSDLReader getWSDLReader() throws WSDLException { + if ( this.mReader == null ) { + WSDLFactory factory = WSDLFactory.newInstance(); + this.mReader = factory.newWSDLReader(); + // reader.setFeature("javax.wsdl.verbose", true); + // reader.setFeature("javax.wsdl.importDocuments", true); + this.mReader.setExtensionRegistry(getExtensionRegistry()); + } + return this.mReader; + } + /** + * reads the wsdl file and returns the wsdl definition jwsdl model. + * @param wsldFilePath relative path to wsdl file from the the root wsdl directory returns from + * ${symbol_pound}getWSDLDirectory in the service unit or or absolute path . + * @return Definition + */ + public Definition readWSDL(String wsdlFilePath) throws WSDLException { + File wsdlFile = new File(wsdlFilePath); + if ( !wsdlFile.isAbsolute() ) { + wsdlFile = new File(this.mWsdlDirPath, wsdlFilePath); + } + return getWSDLReader().readWSDL(wsdlFile.getAbsolutePath()); + } + /** + * reads the files with .wsdl file extension in a directory. If the directory should + * be searched recursively, it searches this directory, all child directories of this + * directory and then to their child directories recursively. + * @param dir directory file to search for .wsdl files + * @param rec if set to true, it recursively searches the directory. if set to false, only + * this directory is searched. + * @return List of Files with .wsdl extension. + */ + public List listWSDLFiles(File dir, final boolean rec) throws IOException { + if ( dir == null || !dir.isDirectory()) { + throw new IOException(dir + " is not a directory for looking up wsdl files"); + } + List wsdlList = new ArrayList(); + File[] files = dir.listFiles(new FileFilter() { + public boolean accept(File pathname) { + if ( rec && pathname.isDirectory()) { + return true; + } else { + String name = pathname.getName(); + int idx = name.lastIndexOf('.'); + if ( idx < 0 ) { + return false; + } + String ext = name.substring(idx); + return ".wsdl".equalsIgnoreCase(ext); + } + } + }); + for ( File file : files ) { + if ( rec && file.isDirectory()) { + List wsdlFiles = listWSDLFiles(file, rec); + wsdlList.addAll(wsdlFiles); + } else { + wsdlList.add(file); + } + } + return wsdlList; + } + /** + * reads the files with .wsdl file extension in a directory fromDir and return the list of + * wsdl definitions corresponding to them. + * @param fromDir path to the directory relative to the root wsdl directory returns from + * ${symbol_pound}getWSDLDirectory or the absolute path to the directory. + */ + public List readWSDLs(String fromDir) throws WSDLException { + if ( fromDir == null ) { fromDir = ""; } + File wsdlDir = new File(fromDir); + if (!wsdlDir.isAbsolute()) { + wsdlDir = new File(this.mWsdlDirPath, fromDir); + } + + List wsdlFiles = new ArrayList(); + try { + wsdlFiles = listWSDLFiles(wsdlDir, true); + } catch (IOException ioEx) { + throw new WSDLException("WSDLFileReadError", ioEx.getMessage(),ioEx); + } + + List wsdlPaths = new ArrayList(); + for ( File wsdlFile : wsdlFiles) { + wsdlPaths.add(wsdlFile.getAbsolutePath()); + } + Collections.sort(wsdlPaths); + + List wsdlList = new ArrayList(); + for ( String wsdlPath : wsdlPaths ) { + Definition wsdlDef = readWSDL(wsdlPath); + wsdlList.add(wsdlDef); + } + return wsdlList; + } + /** + * finds PortType using port type ( interface ) qname. + */ + public static PortType findInterface(Definition wsdlDef, QName interfaceName) { + return wsdlDef.getPortType(interfaceName); + } + /** finds the Service using service qname */ + public static Service findService(Definition wsdlDef, QName serviceName) { + return wsdlDef.getService(serviceName); + } + /** finds the wsdl port using service qname and endpoint name */ + public static Port findServiceEndpoint(Definition wsdlDef, QName serviceName, String endpointName) { + Service service = null; + Port port = null; + service = findService(wsdlDef, serviceName); + if ( service != null ) { + port = service.getPort(endpointName); + } + return port; + } + /** + * finds the binding definition to which the service with serviceName and endpointName was bound. + */ + public static Binding findServiceBinding(Definition wsdlDef, QName serviceName, String endpointName) { + Binding binding = null; + Port port = findServiceEndpoint(wsdlDef, serviceName, endpointName); + if ( port != null ) { + binding = port.getBinding(); + } + return binding; + } + /** + * finds the binding definition using the interface(portType) qname with a + */ + public static Binding findInterfaceBinding(Definition wsdlDef, + QName interfaceQName, QName extQName) { + Map bindingMap = wsdlDef.getBindings(); + @SuppressWarnings("unchecked") + Collection bindings = bindingMap.values(); + for ( Binding binding : bindings ) { + if ( binding.getPortType().getQName().equals(interfaceQName)) { + return binding; + } + } + return null; + } + + /** + * find the wsdl4j operation corresponds to the interface+operation. + * @param wsdlDef wsdl definition + * @param portTypeQName portType QName + * @param opName operation name. if null, first operation in the portType + * is returned. + * @return Operation corresponding to the portType+opName + */ + public static Operation findOperation(Definition wsdlDef, + QName portTypeQName, String opName) { + Operation operation = null; + PortType portType = wsdlDef.getPortType(portTypeQName); + if ( portType != null ) { + if ( opName != null ) { + operation = portType.getOperation(opName, null, null); + } else { + @SuppressWarnings("unchecked") + List list = portType.getOperations(); + if ( list != null && list.size() > 0 ) { + operation = list.get(0); + } + } + } + return operation; + } + /** + * verifies whether the wsdl definition contains the specified service descriptions or not. Used + * to locate the wsdl definition for the services describes in service unit deployment + * descriptor(jbi.xm). + * @param interfaceName portType qname to find in the definition. can be null if you are trying to + * find only service endpoint description. + * @param serviceName qname for the service to find in this wsdl. can be null if + * you are trying to find only portType (abstract service) description. + * @param endpointName port name to find in the service definition. null if only + * service with any port should be looked up. + * + * @return true if the wsdl definition contains the specified service description. + */ + public static boolean isWSDLFor(Definition wsdlDef, + QName interfaceName, QName serviceName, String endpointName) { + PortType portType = null; + Service service = null; + Port port = null; + if ( interfaceName != null ) { + portType = findInterface(wsdlDef, interfaceName); + } + + if ( serviceName != null ) { + service = findService(wsdlDef, serviceName); + } + + if ( endpointName != null && service != null ) { + port = service.getPort(endpointName); + } + + boolean isWSDL = true; + + if ( (interfaceName != null && portType == null) || + ( serviceName != null && service == null ) || + ( endpointName != null && (service == null || port == null)) ) { + isWSDL = false; + } + + return isWSDL; + } + /** + * creates a binding definition that contains a service engine binding elements in the specified + * wsdl definition for a portType. It will try to find/create the binding element with interface + * local name with a "_JBISEBinding" suffix and add service engine binding element to it if it + * is not present. + * @param wsdl wsdl definition + * @param interfaceName portType qname to which the binding is created. + * @return a Binding contains service engine binding that is created for the portType. + */ + public Binding create${componentName}Binding(Definition wsdl, QName interfaceName) { + QName bindingQName = new QName(wsdl.getQName().getNamespaceURI(), + interfaceName.getLocalPart() + "_JBISEBinding"); + Binding binding = wsdl.getBinding(bindingQName); + if ( binding == null ) { + binding = wsdl.createBinding(); + binding.setQName(bindingQName); + binding.setPortType(wsdl.getPortType(interfaceName)); + binding.setUndefined(false); + + ExtensibilityElement bindingExt = + SEBindingExt.SEBindingExtImpl.addExtensibilityElement(wsdl, binding); + + wsdl.addBinding(binding); + } + return binding; + } + /** + * creates port and binding elements that provide the the service engine binding for a service. + * @param wsdl wsdl definition + * @param interfaceName portType qname to which the binding is created. + * @param serviceName service under which the port definition bound to the service engine binding + * should be created. + * @param endpointName port name. + * @return a Binding contains service engine binding that is created for the portType. + */ + public Binding create${componentName}Binding(Definition wsdl, QName interfaceName, QName serviceName, String endpointName ) { + Binding binding = null; + Service service = findService(wsdl, serviceName); + if ( service == null ) { + return null; + } + Port port = service.getPort(endpointName); + if ( port != null ) { + binding = port.getBinding(); + } else { + // create port + port = wsdl.createPort(); + port.setName(endpointName); + binding = create${componentName}Binding(wsdl, interfaceName); + port.setBinding(binding); + service.addPort(port); + } + return binding; + } + /** prints the wsdl to text from the wsdl definition */ + public static void printWSDL(PrintWriter out, Definition def) { + try { + WSDLFactory factory = WSDLFactory.newInstance(); + WSDLWriter wsdlWriter = factory.newWSDLWriter(); + wsdlWriter.writeWSDL(def, out); + } catch (WSDLException ex) { + ex.printStackTrace(out); + } + } + /** prints the wsdl to text from the wsdl definition */ + public static String printWSDLToString(Definition def) { + StringWriter writer = new StringWriter(); + PrintWriter out = new PrintWriter(writer); + printWSDL(out, def); + out.close(); + return writer.getBuffer().toString(); + } + /** returns an existing namespace prefix or create one if not exists for the corresponding namespaceURI */ + public static String getNamespacePrefix(Definition def, String namespaceURI, String defPrefix) { + String prefix = null; + prefix = def.getPrefix(namespaceURI); + if ( prefix == null ) { + Set keySet = def.getNamespaces().keySet(); + String newPrefix = "ns"; + if ( defPrefix != null && defPrefix.trim().length() > 0 ){ + newPrefix = defPrefix; + } + prefix = newPrefix; + for ( int i=0; i < Integer.MAX_VALUE; ++i) { + if (!keySet.contains(prefix)) { + break; + } else { + prefix = newPrefix + i; + } + } + } + return prefix; + } + + /** + * creates and adds the jbi service engine binding extensibility element to the wsdl definition + * under specified binding definition. + */ + public static void addExtensibilityElement(Definition wsdlDef, + ElementExtensible extensibleEl, ExtensibilityElement extEl, String defPrefix) { + QName elementType = extEl.getElementType(); + String namespaceURI = elementType.getNamespaceURI(); + String prefix = wsdlDef.getPrefix(namespaceURI); + if ( prefix == null ) { + // no namespace prefix defined. create one. + prefix = WSDLProcessor.getNamespacePrefix(wsdlDef, namespaceURI, defPrefix); + wsdlDef.addNamespace(prefix, namespaceURI); + } + extensibleEl.addExtensibilityElement(extEl); + } + +} diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/nbactions.xml b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/nbactions.xml new file mode 100644 index 000000000..a326f04f7 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/nbactions.xml @@ -0,0 +1,75 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + + + clean + + * + + + clean + + + true + + + + build + + * + + + install + + + true + + + + test + + * + + + package + + + false + + + + rebuild + + * + + + clean + install + + + true + + + + CUSTOM-testreport + testreport + + surefire-report:report-only + + + true + + + + CUSTOM-allreports + allreports + + site + + + true + + + diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/packaging/nbactions.xml b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/packaging/nbactions.xml new file mode 100644 index 000000000..45118cf65 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/packaging/nbactions.xml @@ -0,0 +1,51 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + + + clean + + clean + + + + build + + install + + + + test + + package + + + + rebuild + + clean + install + + + + CUSTOM-testreport + testreport + + surefire-report:report-only + + + true + + + + CUSTOM-allreports + allreports + + site + + + true + + + diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/packaging/pom.xml b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/packaging/pom.xml new file mode 100644 index 000000000..7337970c7 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/packaging/pom.xml @@ -0,0 +1,185 @@ + + + + package-common + open-jbi-components + 1.1 + ../../build-common/package-common + + 4.0.0 + ${groupId} + ${componentName}-installer + sun-${componentName}-engine + ${version} + ${componentName} packaging description + + + + META-INF + src + true + + *.xml + + + + + + maven-antrun-plugin + + + ${project.artifactId}-generate-i18n-descriptors + process-resources + + run + + + + + + + + + + + + + + + + + + ${project.artifactId}-rename-jars + process-classes + + run + + + + + + + maven-dependency-plugin + + + ${project.artifactId}-fetch-deps + generate-sources + + copy-dependencies + + + ${project.build.outputDirectory}/lib + true + true + + + + + + maven-surefire-plugin + + true + + + + maven-jar-plugin + + + ${project.build.outputDirectory}/META-INF/MANIFEST.MF + + + + + + org.apache.felix + maven-bundle-plugin + + + bundle-manifest + process-classes + + manifest + + + + + + sun-${componentName}-engine + ${componentName} Component + ${componentName} Engine + ${OSGI_VERSION} + <_removeheaders>${OSGI_MANIFEST_REMOVE_HEADERS}, Export-Package + *;-noimport:=true + lib/${componentName}-jbiadapter.jar, + lib/common-util.jar, + lib/resolver.jar, + lib/componentsl.jar + * + * + + + + + + + + open-jbi-components + ${componentName}-jbiadapter + ${version} + true + + + open-jbi-components + common-util + true + + + + open-jbi-components + resolver + true + + + + + open-jbi-components + componentsl + true + + + diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/packaging/src/jbi.xml b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/packaging/src/jbi.xml new file mode 100644 index 000000000..9ed1d7a62 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/packaging/src/jbi.xml @@ -0,0 +1,45 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) + + + + + + + ${componentName} + Description of service engine : ${componentName} + + + net.openesb.component.${componentName}.ProviderSERuntime + + + lib/${componentName}-jbiadapter.jar + + lib/wsdl4j-1.6.2.jar + + + net.openesb.component.${componentName}.ProviderSEInstaller + + + lib/${componentName}-jbiadapter.jar + + lib/wsdl4j-1.6.2.jar + + + + + diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/packaging/src/newse-config.properties b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/packaging/src/newse-config.properties new file mode 100644 index 000000000..eac2a48bf --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/packaging/src/newse-config.properties @@ -0,0 +1,6 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +${symbol_pound}Default I18n properties bundle +${symbol_pound}Thu Aug 01 18:36:50 IST 2013 +/jbi${symbol_escape}:jbi/jbi${symbol_escape}:component/jbi${symbol_escape}:identification/jbi${symbol_escape}:description=Description of service engine ${symbol_escape}: newse diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/pom.xml b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/pom.xml new file mode 100644 index 000000000..8faee15e1 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/pom.xml @@ -0,0 +1,59 @@ + + + + ojc-common + open-jbi-components + 1.1 + ../build-common/ojc-common + + 4.0.0 + ${groupId} + ${artifactId} + pom + ${artifactId}-top + ${version} + Top-level Build for ${artifactId}-top + + install + + + + + + + runSystemTests + + + + jbiadapter + packaging + + + + + diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/smvn.bat b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/smvn.bat new file mode 100644 index 000000000..054886d8e --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/main/resources/archetype-resources/smvn.bat @@ -0,0 +1,6 @@ +@echo off +set JAVA_HOME=C:\Program Files (x86)\Java\jdk1.6.0_38 +set path=%path%;C:\Program Files (x86)\Java\jdk1.6.0_38\bin +set JV_SRCROOT=D:\codes\logicoyOpenESB\openesb-components +set JV_GFBASE=D:\softwares\openesb_logicoy_last_working57\glassfish +mvn -Dmaven.test.skip=true -Dmaven.repo.local=C:\Users\logicoyparam\m2\repository %* \ No newline at end of file diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/test/resources/projects/basic/archetype.properties b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/test/resources/projects/basic/archetype.properties new file mode 100644 index 000000000..f930aa149 --- /dev/null +++ b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/test/resources/projects/basic/archetype.properties @@ -0,0 +1,6 @@ +#Fri Aug 02 18:50:56 IST 2013 +package=it.pkg +version=0.1-SNAPSHOT +groupId=archetype.it +artifactId=serviceEngineArchtype +componentName=${artifactId} diff --git a/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/test/resources/projects/basic/goal.txt b/maven-ojc-archeType-v2/maven-archetype-service-engine-v2/src/test/resources/projects/basic/goal.txt new file mode 100644 index 000000000..e69de29bb