[
  {
    "path": ".gitattributes",
    "content": "# Auto detect text files and perform LF normalization\n* text=auto\n\n# Custom for Visual Studio\n*.cs     diff=csharp\n*.sln    merge=union\n*.csproj merge=union\n*.vbproj merge=union\n*.fsproj merge=union\n*.dbproj merge=union\n\n# Standard to msysgit\n*.doc\t diff=astextplain\n*.DOC\t diff=astextplain\n*.docx diff=astextplain\n*.DOCX diff=astextplain\n*.dot  diff=astextplain\n*.DOT  diff=astextplain\n*.pdf  diff=astextplain\n*.PDF\t diff=astextplain\n*.rtf\t diff=astextplain\n*.RTF\t diff=astextplain\n"
  },
  {
    "path": ".gitignore",
    "content": "\n\n# Eclipse artifacts\n/.project\n\n/.classpath\n\n/.settings\n\n\n/bin\n/target\n\n/.git\n/temp.txt\n/release.properties\n/.idea\n/demo-rest-jersey-spring.iml\n"
  },
  {
    "path": "LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2013 Codingpedia.org \n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "# demo-rest-jersey-spring @ [![Codingpedia.org 100%](http://img.shields.io/badge/Codingpedia.org-100%25-blue.svg)](http://www.codingpedia.org)\n\n## Prerequisites:\n* MySQL 5.5 or 5.6 \n* IDE ( preffered Eclipse 4.3+) \n* JDK 1.7 (if you want to use Jetty 9 with the jetty-maven-plugin from project)\n* Maven 3.*\n\n## Install and run the project \n1. download/clone the project \n2. prepare the database\n  * import in MySQL the self-contained file that comes with the project - [demo-rest-jersey-spring / src / main / resources / input_data / DumpRESTdemoDB.sql](https://github.com/Codingpedia/demo-rest-jersey-spring/blob/master/src/main/resources/input_data/DumpRESTdemoDB.sql)\n  * username/password - `rest_demo`/`rest_demo`\n3. change to the root folder of the project and excute the following maven command \n  * `mvn clean install jetty:run  -Djetty.port=8888 -DskipTests=true`\n  * now the REST api is up and running with Jetty on `localhost:8888` \n  \n> **Note:** you could run a similar configuration from Eclipse if you have the m2e plugin installed - see pic below\n\n> **Note:** after you `mvn install` the application, you can deploy the generated __.war__ file in any web container like Tomcat for example. \n\n## Testing the project \n\n### From Maven (failsafe plugin)\nRun the following maven command on the console in the root directory of the project \n  \n  ```mvn clean install verify -Djetty.port=8888```\n\nOR\n  \n  the same in Eclipse \n![Eclipse run configuration](http://www.codingpedia.org/wp-content/uploads/2014/01/run-integration-tests-eclipse.png \"Run configuration in Eclipse\")\n### SoapUI (recommended)\n- [download and install SoapUI](http://sourceforge.net/projects/soapui/files/)\n- import the REST project in SoapUI - [demo-rest-jersey-spring / src / main / resources / soapui / Test-Demo-REST-Jersey-with-Spring-soapui-project.xml](https://github.com/Codingpedia/demo-rest-jersey-spring/blob/master/src/main/resources/soapui/Test-Demo-REST-Jersey-with-Spring-soapui-project.xml)\n- check out our [How to test REST API with SoapUI](http://youtu.be/XV7WW0bDy9c) video tutorial on YouTube\n\n## Go to blog post\n[Tutorial – REST API design and implementation in Java with Jersey and Spring](http://www.codingpedia.org/ama/tutorial-rest-api-design-and-implementation-in-java-with-jersey-and-spring/) - complete explanation of this implementation. \n## Changelog\n\n## License\n\n[MIT](https://github.com/Codingpedia/demo-rest-jersey-spring/blob/master/LICENSE) &copy; [Codingpedia.org](http://www.codingpedia.org)\n\n"
  },
  {
    "path": "pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\t<groupId>org.codingpedia</groupId>\n\t<artifactId>demo-rest-jersey-spring</artifactId>\n\t<version>0.0.1-SNAPSHOT</version>\n\t<packaging>war</packaging>\n\t<name>DemoRestWS</name>\n\t<description>Example of building REST web services with spring, jersey and jpa2/hibernate</description>\n\n\t<properties>\n\t\t<spring.version>4.1.4.RELEASE</spring.version>\n\t\t<spring.security.version>3.2.5.RELEASE</spring.security.version>\n\t\t<jersey.version>2.14</jersey.version>\n\t\t<jackson.version>1.9.13</jackson.version>\n\t\t<hibernate.version>4.2.7.Final</hibernate.version>\n\t\t<jetty.maven.plugin.version>9.2.6.v20141205</jetty.maven.plugin.version> <!-- Adapt this to a version found on http://repo.maven.apache.org/maven2/org/eclipse/jetty/jetty-maven-plugin/ -->\n\t\t<logback.version>1.1.1</logback.version>\n\t\t<jcloverslf4j.version>1.7.6</jcloverslf4j.version>\n\t</properties>\n\n\t<repositories>\n\t\t<repository>\n\t\t\t<id>maven2-repository.java.net</id>\n\t\t\t<name>Java.net Repository for Maven</name>\n\t\t\t<url>http://download.java.net/maven/2/</url>\n\t\t</repository>\n\t</repositories>\n\t\n\t<scm>\n\t\t<developerConnection>scm:https://github.com/Codingpedia/demo-rest-jersey-spring.git</developerConnection>\n\t\t<url>https://github.com/Codingpedia/demo-rest-jersey-spring</url>\n\t</scm>\n\t\n\t<dependencies>\n\t\t<!-- Jersey-Spring http://mvnrepository.com/artifact/org.glassfish.jersey.ext/jersey-spring3/2.4.1 -->\n\t\t<dependency>\n\t\t\t<groupId>org.glassfish.jersey.ext</groupId>\n\t\t\t<artifactId>jersey-spring3</artifactId>\n\t\t\t<version>${jersey.version}</version>\n\t\t\t<exclusions>\n\t\t\t\t<exclusion>\n\t\t\t\t\t<groupId>org.springframework</groupId>\n\t\t\t\t\t<artifactId>spring-core</artifactId>\n\t\t\t\t</exclusion>\n\t\t\t\t<exclusion>\n\t\t\t\t\t<groupId>org.springframework</groupId>\n\t\t\t\t\t<artifactId>spring-web</artifactId>\n\t\t\t\t</exclusion>\n\t\t\t\t<exclusion>\n\t\t\t\t\t<groupId>org.springframework</groupId>\n\t\t\t\t\t<artifactId>spring-beans</artifactId>\n\t\t\t\t</exclusion>\n\t\t\t</exclusions>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.glassfish.jersey.media</groupId>\n\t\t\t<artifactId>jersey-media-json-jackson</artifactId>\n\t\t\t<version>${jersey.version}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.glassfish.jersey.media</groupId>\n\t\t\t<artifactId>jersey-media-multipart</artifactId>\n\t\t\t<version>${jersey.version}</version>\n\t\t</dependency>\t\n\t\t<dependency>\n\t\t\t<groupId>org.glassfish.jersey.ext</groupId>\n\t\t\t<artifactId>jersey-entity-filtering</artifactId>\n\t\t\t<version>${jersey.version}</version>\n\t\t</dependency>\t\t\t\t\n\n\t\t<!-- Spring 3 dependencies -->\n\t\t<dependency>\n\t\t\t<groupId>org.springframework</groupId>\n\t\t\t<artifactId>spring-core</artifactId>\n\t\t\t<version>${spring.version}</version>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>org.springframework</groupId>\n\t\t\t<artifactId>spring-context</artifactId>\n\t\t\t<version>${spring.version}</version>\n\t\t\t<exclusions>\n\t\t\t   <exclusion>\n\t\t\t      <groupId>commons-logging</groupId>\n\t\t\t      <artifactId>commons-logging</artifactId>\n\t\t\t   </exclusion>\n\t\t\t</exclusions>\t\t\t\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>org.springframework</groupId>\n\t\t\t<artifactId>spring-web</artifactId>\n\t\t\t<version>${spring.version}</version>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>org.springframework</groupId>\n\t\t\t<artifactId>spring-jdbc</artifactId>\n\t\t\t<version>${spring.version}</version>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>org.springframework</groupId>\n\t\t\t<artifactId>spring-tx</artifactId>\n\t\t\t<version>${spring.version}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework</groupId>\n\t\t\t<artifactId>spring-orm</artifactId>\n\t\t\t<version>${spring.version}</version>\n\t\t</dependency>\n\t\t<!-- Spring security -->\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.security</groupId>\n\t\t\t<artifactId>spring-security-core</artifactId>\n\t\t\t<version>${spring.security.version}</version>\n\t\t</dependency>\n \t\t<dependency>\n\t\t\t<groupId>org.springframework.security</groupId>\n\t\t\t<artifactId>spring-security-web</artifactId>\n\t\t\t<version>${spring.security.version}</version>\n\t\t</dependency>\n \t\t<dependency>\n\t\t\t<groupId>org.springframework.security</groupId>\n\t\t\t<artifactId>spring-security-config</artifactId>\n\t\t\t<version>${spring.security.version}</version>\n\t\t</dependency>\n\t\t\n\t\t<!-- MySQL JDBC connector -->\n\t\t<dependency>\n\t\t\t<groupId>mysql</groupId>\n\t\t\t<artifactId>mysql-connector-java</artifactId>\n\t\t\t<version>5.1.27</version>\n\t\t\t<scope>provided</scope>\n\t\t</dependency>\n\n\t\t<!-- tomcat jdbc -->\n\t\t<dependency>\n\t\t\t<groupId>org.apache.tomcat</groupId>\n\t\t\t<artifactId>tomcat-jdbc</artifactId>\n\t\t\t<version>7.0.35</version>\n\t\t\t<scope>provided</scope>\n\t\t</dependency>\n\n\t\t<!-- ******* JPA/Hibernate ******** -->\n\t\t<dependency>\n\t\t\t<groupId>org.hibernate</groupId>\n\t\t\t<artifactId>hibernate-core</artifactId>\n\t\t\t<version>${hibernate.version}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.hibernate.javax.persistence</groupId>\n\t\t\t<artifactId>hibernate-jpa-2.0-api</artifactId>\n\t\t\t<version>1.0.1.Final</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.hibernate</groupId>\n\t\t\t<artifactId>hibernate-entitymanager</artifactId>\n\t\t\t<version>${hibernate.version}</version>\n\t\t</dependency>\n\n\t\t<!-- testing -->\n\t    <!-- Jersey-client -->\n\t\t<dependency>\n\t\t\t<groupId>org.glassfish.jersey.core</groupId>\n\t\t\t<artifactId>jersey-client</artifactId>\n\t\t\t<version>${jersey.version}</version>\t\t\t\n\t\t</dependency>\t\t\t\n\t\t<dependency>\n\t\t\t<groupId>commons-dbcp</groupId>\n\t\t\t<artifactId>commons-dbcp</artifactId>\n\t\t\t<version>1.4</version>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>commons-beanutils</groupId>\n\t\t\t<artifactId>commons-beanutils</artifactId>\n\t\t\t<version>1.9.1</version>\n\t\t</dependency>\t\t\n\t\t<dependency>\n\t\t\t<groupId>org.springframework</groupId>\n\t\t\t<artifactId>spring-test</artifactId>\n\t\t\t<version>${spring.version}</version>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>junit</groupId>\n\t\t\t<artifactId>junit</artifactId>\n\t\t\t<version>4.11</version>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.mockito</groupId>\n\t\t\t<artifactId>mockito-all</artifactId>\n\t\t\t<version>1.10.8</version>\n\t\t</dependency>\t\t\n\t\t<dependency>\n\t\t\t<groupId>org.glassfish.jersey.test-framework.providers</groupId>\n\t\t\t<artifactId>jersey-test-framework-provider-external</artifactId>\n\t\t\t<version>2.5.1</version>\n\t\t</dependency>\n\t\t\n\t\t<!-- LogBack dependencies --> \n\t\t<dependency>\n\t\t\t<groupId>ch.qos.logback</groupId>\n\t\t\t<artifactId>logback-classic</artifactId>\n\t\t\t<version>${logback.version}</version>\n\t\t</dependency>\n\t\t<dependency>                                    \n\t\t\t<groupId>org.slf4j</groupId>                \n\t\t\t<artifactId>jcl-over-slf4j</artifactId>     \n\t\t\t<version>${jcloverslf4j.version}</version>  \n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>org.codehaus.jackson</groupId>\n\t\t\t<artifactId>jackson-core-asl</artifactId>\n\t\t\t<version>${jackson.version}</version>\n\t\t</dependency>\t\t\n\t\t<dependency>\n\t\t\t<groupId>org.codehaus.jackson</groupId>\n\t\t\t<artifactId>jackson-mapper-asl</artifactId>\n\t\t\t<version>${jackson.version}</version>\n\t\t</dependency>\t\t\n\t\t<dependency>\n\t\t\t<groupId>org.codehaus.jackson</groupId>\n\t\t\t<artifactId>jackson-jaxrs</artifactId>\n\t\t\t<version>${jackson.version}</version>\n\t\t</dependency>\t\n\t\t\n\t\t<dependency>\n\t\t\t<groupId>javax.servlet</groupId>\n\t\t\t<artifactId>javax.servlet-api</artifactId>\n\t\t\t<version>3.1.0</version>\n\t\t\t<scope>provided</scope>\n\t\t</dependency>\t\t\t  \t\t\t\t\n\t</dependencies>\n\n\t<build>\n\t\t<plugins>\n\t\t    <!-- use the plugin to generate customed war name -->\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-war-plugin</artifactId>\n\t\t\t\t<version>2.5</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<warName>${project.artifactId}</warName>\n\t\t\t        <archive>\n\t\t\t            <manifest>\n\t\t\t                <addDefaultImplementationEntries>true</addDefaultImplementationEntries>\n\t\t\t                <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>\n\t\t\t            </manifest>\n\t\t\t        </archive>\t\t\t\t\t\n\t\t\t\t</configuration>\n\t\t\t\t<executions>\n\t\t\t\t\t<execution>\n\t\t\t\t\t\t<phase>package</phase>\n\t\t\t\t\t\t<goals>\n\t\t\t\t\t\t\t<goal>manifest</goal>\n\t\t\t\t\t\t</goals>\n\t\t\t\t\t\t<inherited>true</inherited>\n\t\t\t\t\t</execution>\n\t\t\t\t</executions>\t\t\t\t\n\t\t\t</plugin>\t\t    \n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-release-plugin</artifactId>\n\t\t\t\t<version>2.5.1</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<providerImplementations>\n\t\t\t\t\t\t<git>jgit</git>\n\t\t\t\t\t</providerImplementations>\n\t\t\t\t\t<tagBase>https://github.com/Codingpedia/demo-rest-jersey-spring/releases</tagBase>\n\t\t\t\t\t<tagNameFormat>v@{project.version}</tagNameFormat>\n\t\t\t\t</configuration>\n\t\t\t\t<dependencies>\n\t\t\t\t\t<dependency>\n\t\t\t\t    \t<groupId>org.apache.maven.scm</groupId>\n\t\t\t\t    \t<artifactId>maven-scm-provider-jgit</artifactId>\n\t\t\t\t        <version>1.9.2</version>\n\t\t\t\t\t</dependency>\n\t\t\t\t</dependencies>\t\t\t\t\n\t\t\t</plugin>\t\t\t\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.eclipse.jetty</groupId>\n\t\t\t\t<artifactId>jetty-maven-plugin</artifactId>\n\t\t\t\t<version>${jetty.maven.plugin.version}</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<jettyXml>${project.basedir}/src/main/resources/config/jetty9.xml</jettyXml>\n\t\t\t\t\t<!-- ,${project.basedir}/src/main/resources/config/jetty-ssl.xml, ${project.basedir}/src/main/resources/config/jetty-https.xml -->\n\t\t\t\t\t<stopKey>STOP</stopKey>\n\t\t\t\t\t<stopPort>9999</stopPort>\n\t\t\t\t\t<stopWait>5</stopWait>\n\t\t\t\t\t<scanIntervalSeconds>5</scanIntervalSeconds>\n\t\t\t\t\t<scanTargets>\n\t\t\t\t\t\t<scanTarget>${project.basedir}/src/main</scanTarget>\n\t\t\t\t\t\t<scanTarget>${project.basedir}/src/test</scanTarget>\n\t\t\t\t\t</scanTargets>\n\t\t\t\t\t<contextXml>${project.basedir}/src/test/resources/jetty-context.xml</contextXml>\n\t\t\t\t\t<webAppConfig>\n\t\t\t\t\t\t<contextPath>/${project.artifactId}</contextPath>\n\t\t\t\t\t</webAppConfig>\n\t\t\t\t</configuration>\n\t\t\t\t<dependencies>\n\t\t\t\t\t<dependency>\n\t\t\t\t\t\t<groupId>mysql</groupId>\n\t\t\t\t\t\t<artifactId>mysql-connector-java</artifactId>\n\t\t\t\t\t\t<version>5.1.27</version>\n\t\t\t\t\t</dependency>\n\t\t\t\t</dependencies>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\t\t\t\t\n    <profiles>\n        <profile>\n            <id>failsafeTestRunner</id>\t\n\t\t\t<build>\n\t\t\t\t<plugins>\n\t\t\t\t\t<plugin>\n\t\t\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t\t\t<artifactId>maven-failsafe-plugin</artifactId>\n\t\t\t\t\t\t<version>2.16</version>\n\t\t\t\t\t\t<executions>\n\t\t\t\t\t\t\t<execution>\n\t\t\t\t\t\t\t\t<id>integration-test</id>\n\t\t\t\t\t\t\t\t<goals>\n\t\t\t\t\t\t\t\t\t<goal>integration-test</goal>\n\t\t\t\t\t\t\t\t</goals>\n\t\t\t\t\t\t\t</execution>\n\t\t\t\t\t\t\t<execution>\n\t\t\t\t\t\t\t\t<id>verify</id>\n\t\t\t\t\t\t\t\t<goals>\n\t\t\t\t\t\t\t\t\t<goal>verify</goal>\n\t\t\t\t\t\t\t\t</goals>\n\t\t\t\t\t\t\t</execution>\n\t\t\t\t\t\t</executions>\n\t\t\t\t\t</plugin>\t\t\n\t\t\t\t\t<plugin>\n\t\t\t\t\t\t<groupId>org.eclipse.jetty</groupId>\n\t\t\t\t\t\t<artifactId>jetty-maven-plugin</artifactId>\n\t\t\t\t\t\t<version>${jetty.maven.plugin.version}</version>\n\t\t\t\t\t\t<configuration>\n\t\t\t\t\t\t\t<jettyConfig>${project.basedir}/src/main/resources/config/jetty9.xml</jettyConfig>\n\t\t\t\t\t\t\t<stopKey>STOP</stopKey>\n\t\t\t\t\t\t\t<stopPort>9999</stopPort>\n\t\t\t\t\t\t\t<stopWait>5</stopWait>\n\t\t\t\t\t\t\t<scanIntervalSeconds>5</scanIntervalSeconds>\n\t\t\t\t\t\t\t<scanTargets>\n\t\t\t\t\t\t\t\t<scanTarget>${project.basedir}/src/main</scanTarget>\n\t\t\t\t\t\t\t\t<scanTarget>${project.basedir}/src/test</scanTarget>\n\t\t\t\t\t\t\t</scanTargets>\n\t\t\t\t\t\t\t<contextXml>${project.basedir}/src/test/resources/jetty-context.xml</contextXml>\n\t\t\t\t\t\t\t<webAppConfig>\n\t\t\t\t\t\t\t\t<contextPath>/${project.artifactId}</contextPath>\n\t\t\t\t\t\t\t</webAppConfig>\n\t\t\t\t\t\t</configuration>\n\t\t\t\t\t\t<dependencies>\n\t\t\t\t\t\t\t<dependency>\n\t\t\t\t\t\t\t\t<groupId>mysql</groupId>\n\t\t\t\t\t\t\t\t<artifactId>mysql-connector-java</artifactId>\n\t\t\t\t\t\t\t\t<version>5.1.27</version>\n\t\t\t\t\t\t\t</dependency>\n\t\t\t\t\t\t</dependencies>\n\t\t\t\t\t\t<executions>\n\t\t\t\t\t\t\t<execution>\n\t\t\t\t\t\t\t\t<id>start-jetty</id>\n\t\t\t\t\t\t\t\t<phase>pre-integration-test</phase>\n\t\t\t\t\t\t\t\t<goals>\n\t\t\t\t\t\t\t\t\t<goal>run-exploded</goal>\n\t\t\t\t\t\t\t\t</goals>\n\t\t\t\t\t\t\t\t<configuration>\n\t\t\t\t\t\t\t\t\t<scanIntervalSeconds>0</scanIntervalSeconds>\n\t\t\t\t\t\t\t\t\t<daemon>true</daemon>\n\t\t\t\t\t\t\t\t</configuration>\n\t\t\t\t\t\t\t</execution>\n\t\t\t\t\t\t\t<execution>\n\t\t\t\t\t\t\t\t<id>stop-jetty</id>\n\t\t\t\t\t\t\t\t<phase>post-integration-test</phase>\n\t\t\t\t\t\t\t\t<goals>\n\t\t\t\t\t\t\t\t\t<goal>stop</goal>\n\t\t\t\t\t\t\t\t</goals>\n\t\t\t\t\t\t\t</execution>\n\t\t\t\t\t\t</executions>\n\t\t\t\t\t</plugin>\n\t\t\t\t</plugins>\n\t\t\t</build>\n\t\t</profile>\n\t\t\n        <!-- profile to run soapui integration tests against the \"local\" jetty started on local machine -->\n        <profile>\n            <id>soapuiTestRunner-local-jetty</id>\n            <build>\n                <plugins>\n                    <plugin>\n                        <groupId>com.smartbear.soapui</groupId>\n                        <artifactId>soapui-maven-plugin</artifactId>\n                        <version>5.0.0</version>\n                        <executions>\n                            <execution>\n                                <phase>test</phase>\n                                <goals>\n                                    <goal>test</goal>\n                                </goals>\n                                <configuration>\n                                    <projectFile>${project.basedir}/src/test/resources/soapui/Test-Demo-REST-Jersey-with-Spring-soapui-project.xml\n                                    </projectFile>\n                                    <outputFolder>${project.build.directory}\\soapui-logs\\test-results</outputFolder>                                         \n                                    <projectProperties>\n                                        <value>baseUrl=http://localhost:8888</value>\n                                    </projectProperties>\n                                    <!-- specify where to  put the soapui generated log files-->\n\t\t\t\t\t\t\t\t\t<soapuiProperties>\n\t\t\t\t\t\t\t\t\t\t<property>\n\t\t\t\t\t\t\t\t\t\t\t<name>soapui.logroot</name>\n\t\t\t\t\t\t\t\t\t\t\t<value>${project.build.directory}/soapui-logs/</value>\n\t\t\t\t\t\t\t\t\t\t</property>\n\t\t\t\t\t\t\t\t\t</soapuiProperties>                                    \n                                </configuration>\n                            </execution>\n                        </executions>\n                    </plugin>\n                </plugins>\n            </build>\n        </profile>\n        \n        <!-- profile to run soapui integration tests against the \"development\" machine. Here I have a local tomcat instance, and but in \n        a continuous integration environment, you could start the integration tests after the deployment job has been finished -->\n        <profile>\n            <id>soapuiTestRunner-dev-tomcat</id>\n            <build>\n                <plugins>\n                    <plugin>\n                        <groupId>com.smartbear.soapui</groupId>\n                        <artifactId>soapui-maven-plugin</artifactId>\n                        <version>5.0.0</version>\n                        <executions>\n                            <execution>\n                                <!--Run as part of the test phase in the Maven lifecycle-->\n                                <phase>test</phase>\n                                <goals>\n                                    <!--Run the test phase of com.smartbear.soapui:maven-soapui-plugin-->\n                                    <goal>test</goal>\n                                </goals>\n                                <configuration>\n                                    <projectFile>${project.basedir}/src/test/resources/soapui/Test-Demo-REST-Jersey-with-Spring-soapui-project.xml\n                                    </projectFile>\n                                    <outputFolder>${project.build.directory}\\soapui-logs\\test-results</outputFolder>                                    \n                                    <projectProperties>\n                                        <value>baseUrl=http://localhost:8080</value>\n                                    </projectProperties>\n                                    <junitReport>true</junitReport>\n                                     <!-- specify where to  put the soapui generated log files-->\n\t\t\t\t\t\t\t\t\t<soapuiProperties>\n\t\t\t\t\t\t\t\t\t\t<property>\n\t\t\t\t\t\t\t\t\t\t\t<name>soapui.logroot</name>\n\t\t\t\t\t\t\t\t\t\t\t<value>${project.build.directory}/soapui-logs/</value>\n\t\t\t\t\t\t\t\t\t\t</property>\n\t\t\t\t\t\t\t\t\t</soapuiProperties>                                    \n                                </configuration>\n                            </execution>\n                        </executions>\n                    </plugin>\n                </plugins>\n            </build>\n        </profile>        \t\t\n\t</profiles>                \t\t\n\t    \t\n</project>  "
  },
  {
    "path": "src/main/java/org/codingpedia/demo/rest/RestDemoJaxRsApplication.java",
    "content": "package org.codingpedia.demo.rest;\n\nimport org.glassfish.jersey.message.GZipEncoder;\nimport org.glassfish.jersey.message.filtering.EntityFilteringFeature;\nimport org.glassfish.jersey.server.ResourceConfig;\nimport org.glassfish.jersey.server.filter.EncodingFilter;\n\n/**\n * Registers the components to be used by the JAX-RS application\n * \n * @author ama\n * \n */\npublic class RestDemoJaxRsApplication extends ResourceConfig {\n\n\t/**\n\t * Register JAX-RS application components.\n\t */\n\tpublic RestDemoJaxRsApplication() {\n\t\t\n        packages(\"org.codingpedia.demo.rest\");\n        \n//\t\t// register application resources\n//\t\tregister(PodcastsResource.class);\n//\t\tregister(PodcastLegacyResource.class);\n//\n//\t\t// register filters\n//\t\tregister(RequestContextFilter.class);\n//\t\tregister(LoggingResponseFilter.class);\n//\t\tregister(CORSResponseFilter.class);\n//\n//\t\t// register exception mappers\n//\t\tregister(GenericExceptionMapper.class);\n//\t\tregister(AppExceptionMapper.class);\n//      register(CustomReasonPhraseExceptionMapper.class);\n//\t\tregister(NotFoundExceptionMapper.class);\n//\n//\t\t// register features\n//\t\tregister(JacksonFeature.class);\n\t\tregister(EntityFilteringFeature.class);\n\t\tEncodingFilter.enableFor(this, GZipEncoder.class);\t\t\n\t\t\n//\t\tproperty(EntityFilteringFeature.ENTITY_FILTERING_SCOPE, new Annotation[] {PodcastDetailedView.Factory.get()});\n\t}\n}\n"
  },
  {
    "path": "src/main/java/org/codingpedia/demo/rest/dao/PodcastDao.java",
    "content": "package org.codingpedia.demo.rest.dao;\n\nimport java.util.List;\n\n/**\n * \n * @author ama\n * @see <a href=\"http://www.codingpedia.org/ama/spring-mybatis-integration-example/\">http://www.codingpedia.org/ama/spring-mybatis-integration-example/</a>\n */\npublic interface PodcastDao {\n\t\n\tpublic List<PodcastEntity> getPodcasts(String orderByInsertionDate);\n\n\tpublic List<PodcastEntity> getRecentPodcasts(int numberOfDaysToLookBack);\n\t\n\t/**\n\t * Returns a podcast given its id\n\t * \n\t * @param id\n\t * @return\n\t */\n\tpublic PodcastEntity getPodcastById(Long id);\n\t\n\t/**\n\t * Find podcast by feed\n\t * \n\t * @param feed\n\t * @return the podcast with the feed specified feed or null if not existent \n\t */\n\tpublic PodcastEntity getPodcastByFeed(String feed);\t\n\n\tpublic void deletePodcastById(Long id);\n\n\tpublic Long createPodcast(PodcastEntity podcast);\n\n\tpublic void updatePodcast(PodcastEntity podcast);\n\n\t/** removes all podcasts */\n\tpublic void deletePodcasts();\n\n\t/** \n\t * Returns all podcasts from \"legacy\" system\n\t * @return\n\t */\n\tpublic List<PodcastEntity> getLegacyPodcasts();\n\t\n\t/**\n\t * Returns a \"legacy\" podcast given its id\n\t * \n\t * @param id\n\t * @return\n\t */\n\tpublic PodcastEntity getLegacyPodcastById(Long id);\t\n\n}\n"
  },
  {
    "path": "src/main/java/org/codingpedia/demo/rest/dao/PodcastDaoJPA2Impl.java",
    "content": "package org.codingpedia.demo.rest.dao;\n\nimport java.util.Calendar;\nimport java.util.Date;\nimport java.util.GregorianCalendar;\nimport java.util.List;\nimport java.util.TimeZone;\n\nimport javax.persistence.EntityManager;\nimport javax.persistence.NoResultException;\nimport javax.persistence.PersistenceContext;\nimport javax.persistence.Query;\nimport javax.persistence.TemporalType;\nimport javax.persistence.TypedQuery;\n\npublic class PodcastDaoJPA2Impl implements PodcastDao {\n\n\t@PersistenceContext(unitName=\"demoRestPersistence\")\n\tprivate EntityManager entityManager;\n\n\t@PersistenceContext(unitName=\"demoRestPersistenceLegacy\")\n\tprivate EntityManager entityManagerLegacy;\n\t\n\tpublic List<PodcastEntity> getPodcasts(String orderByInsertionDate) {\n\t\tString sqlString = null;\n\t\tif(orderByInsertionDate != null){\n\t\t\tsqlString = \"SELECT p FROM PodcastEntity p\" + \" ORDER BY p.insertionDate \" + orderByInsertionDate;\n\t\t} else {\n\t\t\tsqlString = \"SELECT p FROM PodcastEntity p\";\n\t\t}\t\t \n\t\tTypedQuery<PodcastEntity> query = entityManager.createQuery(sqlString, PodcastEntity.class);\t\t\n\n\t\treturn query.getResultList();\n\t}\n\n\tpublic List<PodcastEntity> getRecentPodcasts(int numberOfDaysToLookBack) {\n\t\t\n\t\tCalendar calendar = new GregorianCalendar();\n\t\tcalendar.setTimeZone(TimeZone.getTimeZone(\"UTC+1\"));//Munich time \n\t\tcalendar.setTime(new Date());\n\t\tcalendar.add(Calendar.DATE, -numberOfDaysToLookBack);//substract the number of days to look back \n\t\tDate dateToLookBackAfter = calendar.getTime();\n\t\t\n\t\tString qlString = \"SELECT p FROM PodcastEntity p where p.insertionDate > :dateToLookBackAfter ORDER BY p.insertionDate DESC\";\n\t\tTypedQuery<PodcastEntity> query = entityManager.createQuery(qlString, PodcastEntity.class);\t\t\n\t\tquery.setParameter(\"dateToLookBackAfter\", dateToLookBackAfter, TemporalType.DATE);\n\n\t\treturn query.getResultList();\n\t}\n\t\n\tpublic PodcastEntity getPodcastById(Long id) {\n\t\t\n\t\ttry {\n\t\t\tString qlString = \"SELECT p FROM PodcastEntity p WHERE p.id = ?1\";\n\t\t\tTypedQuery<PodcastEntity> query = entityManager.createQuery(qlString, PodcastEntity.class);\t\t\n\t\t\tquery.setParameter(1, id);\n\n\t\t\treturn query.getSingleResult();\n\t\t} catch (NoResultException e) {\n\t\t\treturn null;\n\t\t}\n\t}\n\t\n\tpublic PodcastEntity getPodcastByFeed(String feed) {\n\t\t\n\t\ttry {\n\t\t\tString qlString = \"SELECT p FROM PodcastEntity p WHERE p.feed = ?1\";\n\t\t\tTypedQuery<PodcastEntity> query = entityManager.createQuery(qlString, PodcastEntity.class);\t\t\n\t\t\tquery.setParameter(1, feed);\n\n\t\t\treturn query.getSingleResult();\n\t\t} catch (NoResultException e) {\n\t\t\treturn null;\n\t\t}\n\t}\n\t\n\n\tpublic void deletePodcastById(Long id) {\n\t\t\n\t\tPodcastEntity podcast = entityManager.find(PodcastEntity.class, id);\n\t\tentityManager.remove(podcast);\n\t\t\n\t}\n\n\tpublic Long createPodcast(PodcastEntity podcast) {\n\t\t\n\t\tpodcast.setInsertionDate(new Date());\n\t\tentityManager.merge(podcast);\n\t\tentityManager.flush();//force insert to receive the id of the podcast\n\t\t\n\t\treturn podcast.getId();\n\t}\n\n\tpublic void updatePodcast(PodcastEntity podcast) {\n\t\t//TODO think about partial update and full update \n\t\tentityManager.merge(podcast);\t\t\n\t}\n\t\n\tpublic void deletePodcasts() {\n\t\tQuery query = entityManager.createNativeQuery(\"TRUNCATE TABLE podcasts\");\t\t\n\t\tquery.executeUpdate();\n\t}\n\n\tpublic List<PodcastEntity> getLegacyPodcasts() {\n\t\t\n\t\tString qlString = \"SELECT p FROM PodcastEntity p\";\n\t\tTypedQuery<PodcastEntity> query = entityManagerLegacy.createQuery(qlString, PodcastEntity.class);\t\t\n\n\t\treturn query.getResultList();\n\t}\n\n\tpublic PodcastEntity getLegacyPodcastById(Long id) {\n\t\ttry {\n\t\t\tString qlString = \"SELECT p FROM PodcastEntity p WHERE p.id = ?1\";\n\t\t\tTypedQuery<PodcastEntity> query = entityManagerLegacy.createQuery(qlString, PodcastEntity.class);\t\t\n\t\t\tquery.setParameter(1, id);\n\n\t\t\treturn query.getSingleResult();\n\t\t} catch (NoResultException e) {\n\t\t\treturn null;\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "src/main/java/org/codingpedia/demo/rest/dao/PodcastEntity.java",
    "content": "package org.codingpedia.demo.rest.dao;\n\nimport java.io.Serializable;\nimport java.lang.reflect.InvocationTargetException;\nimport java.util.Date;\n\nimport javax.persistence.Column;\nimport javax.persistence.Entity;\nimport javax.persistence.GeneratedValue;\nimport javax.persistence.Id;\nimport javax.persistence.Table;\n\nimport org.apache.commons.beanutils.BeanUtils;\nimport org.codingpedia.demo.rest.resource.podcast.Podcast;\n\n/**\n * Podcast entity \n * \n * @author ama\n *\n */\n@Entity\n@Table(name=\"podcasts\")\npublic class PodcastEntity implements Serializable {\n\n\tprivate static final long serialVersionUID = -8039686696076337053L;\n\n\t/** id of the podcast */\n\t@Id\n\t@GeneratedValue\n\t@Column(name=\"id\")\n\tprivate Long id;\n\t\n\t/** title of the podcast */\n\t@Column(name=\"title\")\n\tprivate String title;\n\t\t\n\t/** link of the podcast on Podcastpedia.org */\n\t@Column(name=\"link_on_podcastpedia\")\n\tprivate String linkOnPodcastpedia;\n\t\n\t/** url of the feed */\n\t@Column(name=\"feed\")\n\tprivate String feed;\n\t\n\t/** description of the podcast */\n\t@Column(name=\"description\")\n\tprivate String description; \n\t\t\n\t/** insertion date in the database */\n\t@Column(name=\"insertion_date\")\n\tprivate Date insertionDate;\n\n\tpublic PodcastEntity(){}\n\t\n\tpublic PodcastEntity(String title, String linkOnPodcastpedia, String feed,\n\t\t\tString description) {\n\t\t\n\t\tthis.title = title;\n\t\tthis.linkOnPodcastpedia = linkOnPodcastpedia;\n\t\tthis.feed = feed;\n\t\tthis.description = description;\n\t\t\n\t}\n\t\n\tpublic PodcastEntity(Podcast podcast){\n\t\ttry {\n\t\t\tBeanUtils.copyProperties(this, podcast);\n\t\t} catch (IllegalAccessException e) {\n\t\t\t// TODO Auto-generated catch block\n\t\t\te.printStackTrace();\n\t\t} catch (InvocationTargetException e) {\n\t\t\t// TODO Auto-generated catch block\n\t\t\te.printStackTrace();\n\t\t}\t\t\n\t}\n\t\t\n\tpublic String getTitle() {\n\t\treturn title;\n\t}\n\n\tpublic void setTitle(String title) {\n\t\tthis.title = title;\n\t}\n\n\tpublic String getLinkOnPodcastpedia() {\n\t\treturn linkOnPodcastpedia;\n\t}\n\n\tpublic void setLinkOnPodcastpedia(String linkOnPodcastpedia) {\n\t\tthis.linkOnPodcastpedia = linkOnPodcastpedia;\n\t}\n\n\tpublic String getDescription() {\n\t\treturn description;\n\t}\n\n\tpublic void setDescription(String description) {\n\t\tthis.description = description;\n\t}\n\n\tpublic Long getId() {\n\t\treturn id;\n\t}\n\n\tpublic void setId(Long id) {\n\t\tthis.id = id;\n\t}\n\n\tpublic String getFeed() {\n\t\treturn feed;\n\t}\n\n\tpublic void setFeed(String feed) {\n\t\tthis.feed = feed;\n\t}\n\n\tpublic Date getInsertionDate() {\n\t\treturn insertionDate;\n\t}\n\n\tpublic void setInsertionDate(Date insertionDate) {\n\t\tthis.insertionDate = insertionDate;\n\t}\n\t\t\n}\n"
  },
  {
    "path": "src/main/java/org/codingpedia/demo/rest/errorhandling/AbstractStatusType.java",
    "content": "package org.codingpedia.demo.rest.errorhandling;\n\nimport javax.ws.rs.core.Response.Status;\nimport javax.ws.rs.core.Response.Status.Family;\nimport javax.ws.rs.core.Response.StatusType;\n\n/**\n * Class used to provide custom StatusTypes, especially for the the Reason Phrase that appears in the HTTP Status Response\n */\npublic abstract class AbstractStatusType implements StatusType {\n\n\tpublic AbstractStatusType(final Family family, final int statusCode,\n                          final String reasonPhrase) {\n\t    super();\n\t\n\t    this.family = family;\n\t    this.statusCode = statusCode;\n\t    this.reasonPhrase = reasonPhrase;\n\t}\n\t\n\tprotected AbstractStatusType(final Status status,\n\t                             final String reasonPhrase) {\n\t    this(status.getFamily(), status.getStatusCode(), reasonPhrase);\n\t}\n\t\n\t@Override\n\tpublic Family getFamily() { return family; }\n\t\n\t@Override\n\tpublic String getReasonPhrase() { return reasonPhrase; }\n\t\n\t@Override\n\tpublic int getStatusCode() { return statusCode; }\n\n\tprivate final Family family;\n\tprivate final int statusCode;\n\tprivate final String reasonPhrase;\n\t\n}\n"
  },
  {
    "path": "src/main/java/org/codingpedia/demo/rest/errorhandling/AppException.java",
    "content": "package org.codingpedia.demo.rest.errorhandling;\n\n\n/**\n * Class to map application related exceptions\n * \n * @author amacoder\n *\n */\npublic class AppException extends Exception {\n\n\tprivate static final long serialVersionUID = -8999932578270387947L;\n\t\n\t/** \n\t * contains redundantly the HTTP status of the response sent back to the client in case of error, so that\n\t * the developer does not have to look into the response headers. If null a default \n\t */\n\tInteger status;\n\t\n\t/** application specific error code */\n\tint code; \n\t\t\n\t/** link documenting the exception */\t\n\tString link;\n\t\n\t/** detailed error description for developers*/\n\tString developerMessage;\t\n\t\n\t/**\n\t * \n\t * @param status\n\t * @param code\n\t * @param message\n\t * @param developerMessage\n\t * @param link\n\t */\n\tpublic AppException(int status, int code, String message,\n\t\t\tString developerMessage, String link) {\n\t\tsuper(message);\n\t\tthis.status = status;\n\t\tthis.code = code;\n\t\tthis.developerMessage = developerMessage;\n\t\tthis.link = link;\n\t}\n\n\tpublic AppException() { }\n\n\tpublic int getStatus() {\n\t\treturn status;\n\t}\n\n\tpublic void setStatus(int status) {\n\t\tthis.status = status;\n\t}\n\n\tpublic int getCode() {\n\t\treturn code;\n\t}\n\n\tpublic void setCode(int code) {\n\t\tthis.code = code;\n\t}\n\n\tpublic String getDeveloperMessage() {\n\t\treturn developerMessage;\n\t}\n\n\tpublic void setDeveloperMessage(String developerMessage) {\n\t\tthis.developerMessage = developerMessage;\n\t}\n\n\tpublic String getLink() {\n\t\treturn link;\n\t}\n\n\tpublic void setLink(String link) {\n\t\tthis.link = link;\n\t}\n\t\t\t\t\t\n}\n"
  },
  {
    "path": "src/main/java/org/codingpedia/demo/rest/errorhandling/AppExceptionMapper.java",
    "content": "package org.codingpedia.demo.rest.errorhandling;\n\nimport javax.ws.rs.core.MediaType;\nimport javax.ws.rs.core.Response;\nimport javax.ws.rs.ext.ExceptionMapper;\nimport javax.ws.rs.ext.Provider;\n\n@Provider\npublic class AppExceptionMapper implements ExceptionMapper<AppException> {\n\n\tpublic Response toResponse(AppException ex) {\n\t\treturn Response.status(ex.getStatus())\n\t\t\t\t.entity(new ErrorMessage(ex))\n\t\t\t\t.type(MediaType.APPLICATION_JSON).\n\t\t\t\tbuild();\n\t}\n\n}\n"
  },
  {
    "path": "src/main/java/org/codingpedia/demo/rest/errorhandling/CustomReasonPhraseException.java",
    "content": "package org.codingpedia.demo.rest.errorhandling;\n\npublic class CustomReasonPhraseException extends Exception {\n\t\t\n\tprivate static final long serialVersionUID = -271582074543512905L;\n\t\n\tprivate final int businessCode;\n\n\tpublic CustomReasonPhraseException(int businessCode, String message) {\n\t\tsuper(message);\n\t\tthis.businessCode = businessCode;\n\t}\n\n\tpublic int getBusinessCode() {\n\t\treturn businessCode;\n\t}\n\t\t\n}\n"
  },
  {
    "path": "src/main/java/org/codingpedia/demo/rest/errorhandling/CustomReasonPhraseExceptionMapper.java",
    "content": "package org.codingpedia.demo.rest.errorhandling;\n\nimport javax.ws.rs.core.Response;\nimport javax.ws.rs.core.Response.Status;\nimport javax.ws.rs.ext.ExceptionMapper;\nimport javax.ws.rs.ext.Provider;\n\n@Provider\npublic class CustomReasonPhraseExceptionMapper implements ExceptionMapper<CustomReasonPhraseException> {\n\n\tpublic Response toResponse(CustomReasonPhraseException bex) {\n\t\treturn Response.status(new CustomReasonPhraseExceptionStatusType(Status.BAD_REQUEST))\n\t\t\t\t.entity(\"Custom Reason Phrase exception occured : \" + bex.getMessage())\n\t\t\t\t.build();\n\t}\n\n}\n"
  },
  {
    "path": "src/main/java/org/codingpedia/demo/rest/errorhandling/CustomReasonPhraseExceptionStatusType.java",
    "content": "package org.codingpedia.demo.rest.errorhandling;\n\nimport javax.ws.rs.core.Response.Status;\n\n/**\n * Implementation of StatusType for CustomReasonPhraseException.\n * The Reason Phrase is set in this case to \"Custom error message\"\n */\npublic class CustomReasonPhraseExceptionStatusType extends AbstractStatusType{\n\t\n\tprivate static final String CUSTOM_EXCEPTION_REASON_PHRASE = \"Custom error message\";\n\t\n\tpublic CustomReasonPhraseExceptionStatusType(Status httpStatus) {\n\t\tsuper(httpStatus, CUSTOM_EXCEPTION_REASON_PHRASE);\n\t}\n\n}\n"
  },
  {
    "path": "src/main/java/org/codingpedia/demo/rest/errorhandling/ErrorMessage.java",
    "content": "package org.codingpedia.demo.rest.errorhandling;\n\nimport java.lang.reflect.InvocationTargetException;\n\nimport javax.ws.rs.NotFoundException;\nimport javax.ws.rs.core.Response;\nimport javax.xml.bind.annotation.XmlElement;\nimport javax.xml.bind.annotation.XmlRootElement;\n\nimport org.apache.commons.beanutils.BeanUtils;\n\n\n@XmlRootElement\npublic class ErrorMessage {\n\t\n\t/** contains the same HTTP Status code returned by the server */\n\t@XmlElement(name = \"status\")\n\tint status;\n\t\n\t/** application specific error code */\n\t@XmlElement(name = \"code\")\n\tint code;\n\t\n\t/** message describing the error*/\n\t@XmlElement(name = \"message\")\n\tString message;\n\t\t\n\t/** link point to page where the error message is documented */\n\t@XmlElement(name = \"link\")\n\tString link;\n\t\n\t/** extra information that might useful for developers */\n\t@XmlElement(name = \"developerMessage\")\n\tString developerMessage;\t\n\n\tpublic int getStatus() {\n\t\treturn status;\n\t}\n\n\tpublic void setStatus(int status) {\n\t\tthis.status = status;\n\t}\n\n\tpublic int getCode() {\n\t\treturn code;\n\t}\n\n\tpublic void setCode(int code) {\n\t\tthis.code = code;\n\t}\n\n\tpublic String getMessage() {\n\t\treturn message;\n\t}\n\n\tpublic void setMessage(String message) {\n\t\tthis.message = message;\n\t}\n\n\tpublic String getDeveloperMessage() {\n\t\treturn developerMessage;\n\t}\n\n\tpublic void setDeveloperMessage(String developerMessage) {\n\t\tthis.developerMessage = developerMessage;\n\t}\n\n\tpublic String getLink() {\n\t\treturn link;\n\t}\n\n\tpublic void setLink(String link) {\n\t\tthis.link = link;\n\t}\n\t\n\tpublic ErrorMessage(AppException ex){\n\t\ttry {\n\t\t\tBeanUtils.copyProperties(this, ex);\n\t\t} catch (IllegalAccessException e) {\n\t\t\t// TODO Auto-generated catch block\n\t\t\te.printStackTrace();\n\t\t} catch (InvocationTargetException e) {\n\t\t\t// TODO Auto-generated catch block\n\t\t\te.printStackTrace();\n\t\t}\n\t}\n\t\n\tpublic ErrorMessage(NotFoundException ex){\n\t\tthis.status = Response.Status.NOT_FOUND.getStatusCode();\n\t\tthis.message = ex.getMessage();\n\t\tthis.link = \"https://jersey.java.net/apidocs/2.8/jersey/javax/ws/rs/NotFoundException.html\";\t\t\n\t}\n\n\tpublic ErrorMessage() {}\n}\n"
  },
  {
    "path": "src/main/java/org/codingpedia/demo/rest/errorhandling/GenericExceptionMapper.java",
    "content": "package org.codingpedia.demo.rest.errorhandling;\n\nimport java.io.PrintWriter;\nimport java.io.StringWriter;\n\nimport javax.ws.rs.WebApplicationException;\nimport javax.ws.rs.core.MediaType;\nimport javax.ws.rs.core.Response;\nimport javax.ws.rs.ext.ExceptionMapper;\nimport javax.ws.rs.ext.Provider;\n\nimport org.codingpedia.demo.rest.filters.AppConstants;\n\n@Provider\npublic class GenericExceptionMapper implements ExceptionMapper<Throwable> {\n \n\tpublic Response toResponse(Throwable ex) {\n\t\t\n\t\tErrorMessage errorMessage = new ErrorMessage();\t\t\n\t\tsetHttpStatus(ex, errorMessage);\n\t\terrorMessage.setCode(AppConstants.GENERIC_APP_ERROR_CODE);\n\t\terrorMessage.setMessage(ex.getMessage());\n\t\tStringWriter errorStackTrace = new StringWriter();\n\t\tex.printStackTrace(new PrintWriter(errorStackTrace));\n\t\terrorMessage.setDeveloperMessage(errorStackTrace.toString());\n\t\terrorMessage.setLink(AppConstants.BLOG_POST_URL);\n\t\t\t\t\n\t\treturn Response.status(errorMessage.getStatus())\n\t\t\t\t.entity(errorMessage)\n\t\t\t\t.type(MediaType.APPLICATION_JSON)\n\t\t\t\t.build();\t\n\t}\n\n\tprivate void setHttpStatus(Throwable ex, ErrorMessage errorMessage) {\n\t\tif(ex instanceof WebApplicationException ) { //NICE way to combine both of methods, say it in the blog \n\t\t\terrorMessage.setStatus(((WebApplicationException)ex).getResponse().getStatus());\n\t\t} else {\n\t\t\terrorMessage.setStatus(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode()); //defaults to internal server error 500\n\t\t}\n\t}\n}\n\n"
  },
  {
    "path": "src/main/java/org/codingpedia/demo/rest/errorhandling/NotFoundExceptionMapper.java",
    "content": "package org.codingpedia.demo.rest.errorhandling;\n\nimport javax.ws.rs.NotFoundException;\nimport javax.ws.rs.core.MediaType;\nimport javax.ws.rs.core.Response;\nimport javax.ws.rs.ext.ExceptionMapper;\nimport javax.ws.rs.ext.Provider;\n\n@Provider\npublic class NotFoundExceptionMapper implements ExceptionMapper<NotFoundException> {\n\n\tpublic Response toResponse(NotFoundException ex) {\n\t\treturn Response.status(ex.getResponse().getStatus())\n\t\t\t\t.entity(new ErrorMessage(ex))\n\t\t\t\t.type(MediaType.APPLICATION_JSON) //this has to be set to get the generated JSON \n\t\t\t\t.build();\n\t}\n\n}\n"
  },
  {
    "path": "src/main/java/org/codingpedia/demo/rest/filters/AppConstants.java",
    "content": "package org.codingpedia.demo.rest.filters;\n\npublic class AppConstants {\n\t\n\tpublic static final int GENERIC_APP_ERROR_CODE = 5001;\t\t\n\tpublic static final String BLOG_POST_URL = \"http://www.codingpedia.org/ama/tutorial-rest-api-design-and-implementation-in-java-with-jersey-and-spring/\";\n\n}\n"
  },
  {
    "path": "src/main/java/org/codingpedia/demo/rest/filters/CORSResponseFilter.java",
    "content": "package org.codingpedia.demo.rest.filters;\n\nimport java.io.IOException;\n\nimport javax.ws.rs.container.ContainerRequestContext;\nimport javax.ws.rs.container.ContainerResponseContext;\nimport javax.ws.rs.container.ContainerResponseFilter;\nimport javax.ws.rs.core.MultivaluedMap;\nimport javax.ws.rs.ext.Provider;\n\n@Provider\npublic class CORSResponseFilter\nimplements ContainerResponseFilter {\n\n\tpublic void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext)\n\t\t\tthrows IOException {\n\n\t\tMultivaluedMap<String, Object> headers = responseContext.getHeaders();\n\t\t\n\t\theaders.add(\"Access-Control-Allow-Origin\", \"*\");\n\t\t//headers.add(\"Access-Control-Allow-Origin\", \"http://podcastpedia.org\"); //allows CORS requests only coming from podcastpedia.org\t\t\n\t\theaders.add(\"Access-Control-Allow-Methods\", \"GET, POST, DELETE, PUT\");\t\t\t\n\t\theaders.add(\"Access-Control-Allow-Headers\", \"X-Requested-With, Content-Type, X-Codingpedia\");\n\t}\n\n}\n"
  },
  {
    "path": "src/main/java/org/codingpedia/demo/rest/filters/LoggingResponseFilter.java",
    "content": "package org.codingpedia.demo.rest.filters;\n\nimport java.io.IOException;\n\nimport javax.ws.rs.container.ContainerRequestContext;\nimport javax.ws.rs.container.ContainerResponseContext;\nimport javax.ws.rs.container.ContainerResponseFilter;\nimport javax.ws.rs.ext.Provider;\n\nimport org.codehaus.jackson.map.ObjectMapper;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n@Provider\npublic class LoggingResponseFilter\n\t\timplements ContainerResponseFilter {\n\n\tprivate static final Logger logger = LoggerFactory.getLogger(LoggingResponseFilter.class);\n\n\tpublic void filter(ContainerRequestContext requestContext,\n\t\t\tContainerResponseContext responseContext) throws IOException {\n\t\tString method = requestContext.getMethod();\n\n\t\tlogger.debug(\"Requesting \" + method + \" for path \" + requestContext.getUriInfo().getPath());\n\t\tObject entity = responseContext.getEntity();\n\t\tif (entity != null) {\n\t\t\tlogger.debug(\"Response \" + new ObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(entity));\n\t\t}\n\t\t\n\t}\n\n}"
  },
  {
    "path": "src/main/java/org/codingpedia/demo/rest/helpers/DateISO8601Adapter.java",
    "content": "package org.codingpedia.demo.rest.helpers;\nimport java.text.SimpleDateFormat;\nimport java.util.Date;\n\nimport javax.xml.bind.annotation.adapters.XmlAdapter;\n\npublic class DateISO8601Adapter extends XmlAdapter<String, Date> {\n\t\n\tprivate static final String ISO_8601_DATE_FORMAT = \"yyyy-MM-dd'T'HH:mm:ss.SSZZ\";\n\tprivate SimpleDateFormat dateFormat;\n\t\n\tpublic DateISO8601Adapter() {\n\t\tsuper();\n\n\t\tdateFormat = new SimpleDateFormat(ISO_8601_DATE_FORMAT);\n\t}\t\n\n\t@Override\n\tpublic Date unmarshal(String v) throws Exception {\n\t\treturn dateFormat.parse(v);\n\t}\n\n\t@Override\n\tpublic String marshal(Date v) throws Exception {\n\t\treturn dateFormat.format(v);\n\t}\n\n}\n"
  },
  {
    "path": "src/main/java/org/codingpedia/demo/rest/helpers/NullAwareBeanUtilsBean.java",
    "content": "package org.codingpedia.demo.rest.helpers;\n\nimport java.lang.reflect.InvocationTargetException;\n\nimport org.apache.commons.beanutils.BeanUtilsBean;\n\n/**\n * Stackoverflow solution to copy non-null properties only, see {@link <a href=\"http://stackoverflow.com/questions/1301697/helper-in-order-to-copy-non-null-properties-from-object-to-another-java\">Helper in order to copy non null properties from object to another ? (Java)</a>}\n * \n */\npublic class NullAwareBeanUtilsBean extends BeanUtilsBean{\n\t\n    @Override\n    public void copyProperty(Object dest, String name, Object value)\n            throws IllegalAccessException, InvocationTargetException {\n        if(value==null)return;\n        super.copyProperty(dest, name, value);\n    }\n    \n}\n"
  },
  {
    "path": "src/main/java/org/codingpedia/demo/rest/interceptors/Compress.java",
    "content": "package org.codingpedia.demo.rest.interceptors;\n\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\n\nimport javax.ws.rs.NameBinding;\n\n//@Compress annotation is the name binding annotation\n@NameBinding\n@Retention(RetentionPolicy.RUNTIME)\npublic @interface Compress {}\n"
  },
  {
    "path": "src/main/java/org/codingpedia/demo/rest/interceptors/GZIPWriterInterceptor.java",
    "content": "package org.codingpedia.demo.rest.interceptors;\n\nimport java.io.IOException;\nimport java.io.OutputStream;\nimport java.util.zip.GZIPOutputStream;\n\nimport javax.ws.rs.WebApplicationException;\nimport javax.ws.rs.core.MultivaluedMap;\nimport javax.ws.rs.ext.Provider;\nimport javax.ws.rs.ext.WriterInterceptor;\nimport javax.ws.rs.ext.WriterInterceptorContext;\n\n\n/**\n * \n * The jersey framework has a built-in functionality to easily enable content encoding.\n * The functionality can be activated by the following code line <code>EncodingFilter.enableFor(ResourceConfig rc, GZipEncoder.class)</code>\n * \n * You can use this <code>WriterInterceptor</code> to <b>selectively</b> compress responses on the method level. \n */\n@Provider\n@Compress\npublic class GZIPWriterInterceptor implements WriterInterceptor {\n\t \n    @Override\n    public void aroundWriteTo(WriterInterceptorContext context)\n                    throws IOException, WebApplicationException {\n    \t\n    \tMultivaluedMap<String,Object> headers = context.getHeaders();\n    \theaders.add(\"Content-Encoding\", \"gzip\");\n    \t\n        final OutputStream outputStream = context.getOutputStream();\n        context.setOutputStream(new GZIPOutputStream(outputStream));\n        context.proceed();\n    }\n}"
  },
  {
    "path": "src/main/java/org/codingpedia/demo/rest/resource/manifest/ImplementationDetails.java",
    "content": "package org.codingpedia.demo.rest.resource.manifest;\n\nimport javax.xml.bind.annotation.XmlElement;\nimport javax.xml.bind.annotation.XmlAccessType;\nimport javax.xml.bind.annotation.XmlAccessorType;\nimport javax.xml.bind.annotation.XmlRootElement;\n\n@XmlRootElement\n@XmlAccessorType(XmlAccessType.FIELD)\npublic class ImplementationDetails {\n\n\t@XmlElement(name = \"implementationTitle\")\t\n\tString implementationTitle;\n\n\t@XmlElement(name = \"implementationVersion\")\t\n\tString implementationVersion;\n\t\n\t@XmlElement(name = \"implementationVendorId\")\t\n\tString implementationVendorId;\n\n\tpublic String getImplementationTitle() {\n\t\treturn implementationTitle;\n\t}\n\n\tpublic void setImplementationTitle(String implementationTitle) {\n\t\tthis.implementationTitle = implementationTitle;\n\t}\n\n\tpublic String getImplementationVersion() {\n\t\treturn implementationVersion;\n\t}\n\n\tpublic void setImplementationVersion(String implementationVersion) {\n\t\tthis.implementationVersion = implementationVersion;\n\t}\n\n\tpublic String getImplementationVendorId() {\n\t\treturn implementationVendorId;\n\t}\n\n\tpublic void setImplementationVendorId(String implementationVendorId) {\n\t\tthis.implementationVendorId = implementationVendorId;\n\t}\n\t\t\n}\n"
  },
  {
    "path": "src/main/java/org/codingpedia/demo/rest/resource/manifest/ManifestResource.java",
    "content": "package org.codingpedia.demo.rest.resource.manifest;\n\nimport java.io.FileNotFoundException;\nimport java.io.IOException;\nimport java.util.jar.Attributes;\n\nimport javax.ws.rs.GET;\nimport javax.ws.rs.Path;\nimport javax.ws.rs.Produces;\nimport javax.ws.rs.core.MediaType;\nimport javax.ws.rs.core.Response;\n\nimport org.springframework.beans.factory.annotation.Autowired;\n\n@Path(\"/manifest\")\npublic class ManifestResource {\n\t\n\t@Autowired\n\tManifestService manifestService;\n\t\n\t@GET\n\t@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })\n\tpublic Response getManifestAttributes() throws FileNotFoundException, IOException{\n\t\tAttributes manifestAttributes = manifestService.getManifestAttributes();\n\t\t\n\t\treturn Response.status(Response.Status.OK)\n\t\t\t\t.entity(manifestAttributes)\n\t\t\t\t.build();\n\t}\t\n\t\n\t@Path(\"/implementation-details\")\n\t@GET\t\n\t@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })\n\tpublic Response getVersion() throws FileNotFoundException, IOException{\n\t\tImplementationDetails implementationVersion = manifestService.getImplementationVersion();\n\t\t\n\t\treturn Response.status(Response.Status.OK)\n\t\t\t\t.entity(implementationVersion)\n\t\t\t\t.build();\n\t}\n\t\n}\n"
  },
  {
    "path": "src/main/java/org/codingpedia/demo/rest/resource/manifest/ManifestService.java",
    "content": "package org.codingpedia.demo.rest.resource.manifest;\n\nimport java.io.File;\nimport java.io.FileInputStream;\nimport java.io.FileNotFoundException;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.util.jar.Attributes;\nimport java.util.jar.Manifest;\n\nimport javax.servlet.ServletContext;\n\nimport org.springframework.beans.factory.annotation.Autowired;\n\npublic class ManifestService {\n\t\n\t@Autowired\n\tServletContext context;\n\t\n\t\n\tAttributes getManifestAttributes() throws FileNotFoundException, IOException{\n\t    InputStream resourceAsStream = context.getResourceAsStream(\"/META-INF/MANIFEST.MF\");\n\t    Manifest mf = new Manifest();\n\t    mf.read(resourceAsStream);\n\t    Attributes atts = mf.getMainAttributes();\n\t    \n\t    return atts;\t    \t\t\n\t}\t\n\t\n\tImplementationDetails getImplementationVersion() throws FileNotFoundException, IOException{\n\t    String appServerHome = context.getRealPath(\"/\");\n\t    File manifestFile = new File(appServerHome, \"META-INF/MANIFEST.MF\");\n\n\t    Manifest mf = new Manifest();\n\n\t    mf.read(new FileInputStream(manifestFile));\n\n\t    Attributes atts = mf.getMainAttributes();\n\t    ImplementationDetails response = new ImplementationDetails();\n\t    response.setImplementationTitle(atts.getValue(\"Implementation-Title\"));\n\t    response.setImplementationVersion(atts.getValue(\"Implementation-Version\"));\n\t    response.setImplementationVendorId(atts.getValue(\"Implementation-Vendor-Id\"));\n\t    \n\t    return response;\t\t\n\t}\n\t\n}\n"
  },
  {
    "path": "src/main/java/org/codingpedia/demo/rest/resource/podcast/CustomReasonPhraseExceptionMockResource.java",
    "content": "package org.codingpedia.demo.rest.resource.podcast;\n\nimport javax.ws.rs.GET;\nimport javax.ws.rs.Path;\n\nimport org.codingpedia.demo.rest.errorhandling.CustomReasonPhraseException;\nimport org.codingpedia.demo.rest.service.PodcastService;\nimport org.springframework.beans.factory.annotation.Autowired;\n\n@Path(\"/mocked-custom-reason-phrase-exception\")\npublic class CustomReasonPhraseExceptionMockResource {\n\t\n\t@Autowired\n\tprivate PodcastService podcastService;\n\t\n\t@GET\n\tpublic void testReasonChangedInResponse() throws CustomReasonPhraseException{\n\t\tpodcastService.generateCustomReasonPhraseException();\n\t}\n}\n"
  },
  {
    "path": "src/main/java/org/codingpedia/demo/rest/resource/podcast/Podcast.java",
    "content": "package org.codingpedia.demo.rest.resource.podcast;\n\nimport java.io.Serializable;\nimport java.lang.reflect.InvocationTargetException;\nimport java.util.Date;\n\nimport javax.xml.bind.annotation.XmlAccessType;\nimport javax.xml.bind.annotation.XmlAccessorType;\nimport javax.xml.bind.annotation.XmlElement;\nimport javax.xml.bind.annotation.XmlRootElement;\nimport javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;\n\nimport org.apache.commons.beanutils.BeanUtils;\nimport org.codingpedia.demo.rest.dao.PodcastEntity;\nimport org.codingpedia.demo.rest.helpers.DateISO8601Adapter;\n\n/**\n * Podcast resource placeholder for json/xml representation \n * \n * @author ama\n *\n */\n@SuppressWarnings(\"restriction\")\n@XmlRootElement\n@XmlAccessorType(XmlAccessType.FIELD)\npublic class Podcast implements Serializable {\n\n\tprivate static final long serialVersionUID = -8039686696076337053L;\n\n\t/** id of the podcast */\n\t@XmlElement(name = \"id\")\t\n\tprivate Long id;\n\t\n\t/** title of the podcast */\n\t@XmlElement(name = \"title\")\t\n\tprivate String title;\n\t\t\n\t/** link of the podcast on Podcastpedia.org */\n\t@XmlElement(name = \"linkOnPodcastpedia\")\t\n\tprivate String linkOnPodcastpedia;\n\t\n\t/** url of the feed */\n\t@XmlElement(name = \"feed\")\t\n\tprivate String feed;\n\t\n\t/** description of the podcast */\n\t@XmlElement(name = \"description\")\n\t@PodcastDetailedView\t\n\tprivate String description; \n\t\t\n\t/** insertion date in the database */\n\t@XmlElement(name = \"insertionDate\")\n\t@XmlJavaTypeAdapter(DateISO8601Adapter.class)\t\n\t@PodcastDetailedView\n\tprivate Date insertionDate;\n\n\tpublic Podcast(PodcastEntity podcastEntity){\n\t\ttry {\n\t\t\tBeanUtils.copyProperties(this, podcastEntity);\n\t\t} catch (IllegalAccessException e) {\n\t\t\t// TODO Auto-generated catch block\n\t\t\te.printStackTrace();\n\t\t} catch (InvocationTargetException e) {\n\t\t\t// TODO Auto-generated catch block\n\t\t\te.printStackTrace();\n\t\t}\n\t}\n\t\n\tpublic Podcast(String title, String linkOnPodcastpedia, String feed,\n\t\t\tString description) {\n\t\t\n\t\tthis.title = title;\n\t\tthis.linkOnPodcastpedia = linkOnPodcastpedia;\n\t\tthis.feed = feed;\n\t\tthis.description = description;\n\t\t\n\t}\n\t\n\tpublic Podcast(){}\n\t\t\n\tpublic String getTitle() {\n\t\treturn title;\n\t}\n\n\tpublic void setTitle(String title) {\n\t\tthis.title = title;\n\t}\n\n\tpublic String getLinkOnPodcastpedia() {\n\t\treturn linkOnPodcastpedia;\n\t}\n\n\tpublic void setLinkOnPodcastpedia(String linkOnPodcastpedia) {\n\t\tthis.linkOnPodcastpedia = linkOnPodcastpedia;\n\t}\n\n\tpublic String getDescription() {\n\t\treturn description;\n\t}\n\n\tpublic void setDescription(String description) {\n\t\tthis.description = description;\n\t}\n\n\tpublic Long getId() {\n\t\treturn id;\n\t}\n\n\tpublic void setId(Long id) {\n\t\tthis.id = id;\n\t}\n\n\tpublic String getFeed() {\n\t\treturn feed;\n\t}\n\n\tpublic void setFeed(String feed) {\n\t\tthis.feed = feed;\n\t}\n\t\n\tpublic Date getInsertionDate() {\n\t\treturn insertionDate;\n\t}\n\n\tpublic void setInsertionDate(Date insertionDate) {\n\t\tthis.insertionDate = insertionDate;\n\t}\n\t\t\n}\n"
  },
  {
    "path": "src/main/java/org/codingpedia/demo/rest/resource/podcast/PodcastDetailedView.java",
    "content": "package org.codingpedia.demo.rest.resource.podcast;\n\nimport java.lang.annotation.Documented;\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\nimport org.glassfish.hk2.api.AnnotationLiteral;\nimport org.glassfish.jersey.message.filtering.EntityFiltering;\n\n@Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})\n@Retention(RetentionPolicy.RUNTIME)\n@Documented\n@EntityFiltering\npublic @interface PodcastDetailedView {\n\n    /**\n     * Factory class for creating instances of {@code ProjectDetailedView} annotation.\n     */\n    public static class Factory extends AnnotationLiteral<PodcastDetailedView> implements PodcastDetailedView {\n\n        /**\n\t\t * \n\t\t */\n\t\tprivate static final long serialVersionUID = 3052755593743363317L;\n\n\t\tprivate Factory() {\n        }\n\n        public static PodcastDetailedView get() {\n            return new Factory();\n        }\n    }\n}\n"
  },
  {
    "path": "src/main/java/org/codingpedia/demo/rest/resource/podcast/PodcastLegacyResource.java",
    "content": "package org.codingpedia.demo.rest.resource.podcast;\n\nimport java.util.List;\n\nimport javax.ws.rs.GET;\nimport javax.ws.rs.Path;\nimport javax.ws.rs.PathParam;\nimport javax.ws.rs.Produces;\nimport javax.ws.rs.core.MediaType;\nimport javax.ws.rs.core.Response;\n\nimport org.codingpedia.demo.rest.errorhandling.AppException;\nimport org.codingpedia.demo.rest.service.PodcastService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Component;\n\n/**\n * \n * Service class that handles REST requests\n * \n * @author amacoder\n * \n */\n@Component\n@Path(\"/legacy/podcasts\")\npublic class PodcastLegacyResource {\n\n\t@Autowired\n\tprivate PodcastService podcastService;\n\n\t/************************************ READ ************************************/\n\t/**\n\t * Returns all resources (podcasts) from the database\n\t * \n\t * @return\n\t * @throws AppException \n\t */\n\t@GET\n\t@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })\n\tpublic List<Podcast> getPodcasts() throws AppException {\n\t\treturn podcastService.getLegacyPodcasts();\n\t}\n\n\t@GET\n\t@Path(\"{id}\")\n\t@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })\n\tpublic Response findById(@PathParam(\"id\") Long id) throws AppException {\t\t\n\t\tPodcast podcastById = podcastService.getLegacyPodcastById(id);\n\t\tif (podcastById != null) {\n\t\t\treturn Response.status(200).entity(podcastById).build();\n\t\t} else {\n\t\t\tString message = \"The podcast with the id \" + id + \" does not exist\"; \n\t\t\tthrow new AppException(404, 4004, message, message, \"link\");\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "src/main/java/org/codingpedia/demo/rest/resource/podcast/PodcastsResource.java",
    "content": "package org.codingpedia.demo.rest.resource.podcast;\n\nimport java.io.IOException;\nimport java.lang.annotation.Annotation;\nimport java.util.List;\n\nimport javax.ws.rs.Consumes;\nimport javax.ws.rs.DELETE;\nimport javax.ws.rs.FormParam;\nimport javax.ws.rs.GET;\nimport javax.ws.rs.POST;\nimport javax.ws.rs.PUT;\nimport javax.ws.rs.Path;\nimport javax.ws.rs.PathParam;\nimport javax.ws.rs.Produces;\nimport javax.ws.rs.QueryParam;\nimport javax.ws.rs.core.MediaType;\nimport javax.ws.rs.core.Response;\n\nimport org.codingpedia.demo.rest.errorhandling.AppException;\nimport org.codingpedia.demo.rest.service.PodcastService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Component;\nimport org.springframework.transaction.annotation.Transactional;\n\nimport com.fasterxml.jackson.core.JsonGenerationException;\nimport com.fasterxml.jackson.databind.JsonMappingException;\n\n/**\n * \n * Service class that handles REST requests\n * \n * @author amacoder\n * \n */\n@Component\n@Path(\"/podcasts\")\npublic class PodcastsResource {\n\n\t@Autowired\n\tprivate PodcastService podcastService;\n\n\t/*\n\t * *********************************** CREATE ***********************************\n\t */\n\n\t/**\n\t * Adds a new resource (podcast) from the given json format (at least title\n\t * and feed elements are required at the DB level)\n\t * \n\t * @param podcast\n\t * @return\n\t * @throws AppException\n\t */\n\t@POST\n\t@Consumes({ MediaType.APPLICATION_JSON })\n\t@Produces({ MediaType.TEXT_HTML })\n\tpublic Response createPodcast(Podcast podcast) throws AppException {\n\t\tLong createPodcastId = podcastService.createPodcast(podcast);\n\t\treturn Response.status(Response.Status.CREATED)// 201\n\t\t\t\t.entity(\"A new podcast has been created\")\n\t\t\t\t.header(\"Location\",\n\t\t\t\t\t\t\"http://localhost:8888/demo-rest-jersey-spring/podcasts/\"\n\t\t\t\t\t\t\t\t+ String.valueOf(createPodcastId)).build();\n\t}\n\n\t/**\n\t * Adds a new podcast (resource) from \"form\" (at least title and feed\n\t * elements are required at the DB level)\n\t * \n\t * @param title\n\t * @param linkOnPodcastpedia\n\t * @param feed\n\t * @param description\n\t * @return\n\t * @throws AppException\n\t */\n\t@POST\n\t@Consumes({ MediaType.APPLICATION_FORM_URLENCODED })\n\t@Produces({ MediaType.TEXT_HTML })\n\tpublic Response createPodcastFromApplicationFormURLencoded(\n\t\t\t@FormParam(\"title\") String title,\n\t\t\t@FormParam(\"linkOnPodcastpedia\") String linkOnPodcastpedia,\n\t\t\t@FormParam(\"feed\") String feed,\n\t\t\t@FormParam(\"description\") String description) throws AppException {\n\n\t\tPodcast podcast = new Podcast(title, linkOnPodcastpedia, feed,\n\t\t\t\tdescription);\n\t\tLong createPodcastid = podcastService.createPodcast(podcast);\n\n\t\treturn Response\n\t\t\t\t.status(Response.Status.CREATED)// 201\n\t\t\t\t.entity(\"A new podcast/resource has been created at /demo-rest-jersey-spring/podcasts/\"\n\t\t\t\t\t\t+ createPodcastid)\n\t\t\t\t.header(\"Location\",\n\t\t\t\t\t\t\"http://localhost:8888/demo-rest-jersey-spring/podcasts/\"\n\t\t\t\t\t\t\t\t+ String.valueOf(createPodcastid)).build();\n\t}\n\n\t/**\n\t * A list of resources (here podcasts) provided in json format will be added\n\t * to the database.\n\t * \n\t * @param podcasts\n\t * @return\n\t * @throws AppException\n\t */\n\t@POST\n\t@Path(\"list\")\n\t@Consumes({ MediaType.APPLICATION_JSON })\n\tpublic Response createPodcasts(List<Podcast> podcasts) throws AppException {\n\t\tpodcastService.createPodcasts(podcasts);\n\t\treturn Response.status(Response.Status.CREATED) // 201\n\t\t\t\t.entity(\"List of podcasts was successfully created\").build();\n\t}\n\n\t/*\n\t * *********************************** READ ***********************************\n\t */\n\t/**\n\t * Returns all resources (podcasts) from the database\n\t * \n\t * @return\n\t * @throws IOException\n\t * @throws JsonMappingException\n\t * @throws JsonGenerationException\n\t * @throws AppException\n\t */\n\t@GET\n\t//@Compress //can be used only if you want to SELECTIVELY enable compression at the method level. By using the EncodingFilter everything is compressed now. \n\t@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })\n\tpublic List<Podcast> getPodcasts(\n\t\t\t@QueryParam(\"orderByInsertionDate\") String orderByInsertionDate,\n\t\t\t@QueryParam(\"numberDaysToLookBack\") Integer numberDaysToLookBack)\n\t\t\tthrows IOException,\tAppException {\n\t\tList<Podcast> podcasts = podcastService.getPodcasts(\n\t\t\t\torderByInsertionDate, numberDaysToLookBack);\n\t\treturn podcasts;\n\t}\n\n\t@GET\n\t@Path(\"{id}\")\n\t@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })\n\tpublic Response getPodcastById(@PathParam(\"id\") Long id, @QueryParam(\"detailed\") boolean detailed)\n\t\t\tthrows IOException,\tAppException {\n\t\tPodcast podcastById = podcastService.getPodcastById(id);\n\t\treturn Response.status(200)\n\t\t\t\t.entity(podcastById, detailed ? new Annotation[]{PodcastDetailedView.Factory.get()} : new Annotation[0])\n\t\t\t\t.header(\"Access-Control-Allow-Headers\", \"X-extra-header\")\n\t\t\t\t.allow(\"OPTIONS\").build();\n\t}\n\t\n//\t@GET\n//\t@Path(\"{id}\")\n//\t@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })\n//\t@PodcastDetailedView\n//\tpublic Podcast getPodcastById(@PathParam(\"id\") Long id, @QueryParam(\"detailed\") boolean detailed)\n//\t\t\tthrows IOException,\tAppException {\n//\t\tPodcast podcastById = podcastService.getPodcastById(id);\n//\t\t\n//\t\treturn podcastById;\n////\t\treturn Response.status(200)\n////\t\t\t\t.entity(podcastById, detailed ? new Annotation[]{PodcastDetailedView.Factory.get()} : new Annotation[0])\n////\t\t\t\t.header(\"Access-Control-Allow-Headers\", \"X-extra-header\")\n////\t\t\t\t.allow(\"OPTIONS\").build();\n//\t}\t\n\n\t/*\n\t * *********************************** UPDATE ***********************************\n\t */\n\n\t/**\n\t * The method offers both Creation and Update resource functionality. If\n\t * there is no resource yet at the specified location, then a podcast\n\t * creation is executed and if there is then the resource will be full\n\t * updated.\n\t * \n\t * @param id\n\t * @param podcast\n\t * @return\n\t * @throws AppException\n\t */\n\t@PUT\n\t@Path(\"{id}\")\n\t@Consumes({ MediaType.APPLICATION_JSON })\n\t@Produces({ MediaType.TEXT_HTML })\n\tpublic Response putPodcastById(@PathParam(\"id\") Long id, Podcast podcast)\n\t\t\tthrows AppException {\n\n\t\tPodcast podcastById = podcastService.verifyPodcastExistenceById(id);\n\n\t\tif (podcastById == null) {\n\t\t\t// resource not existent yet, and should be created under the\n\t\t\t// specified URI\n\t\t\tLong createPodcastId = podcastService.createPodcast(podcast);\n\t\t\treturn Response\n\t\t\t\t\t.status(Response.Status.CREATED)\n\t\t\t\t\t// 201\n\t\t\t\t\t.entity(\"A new podcast has been created AT THE LOCATION you specified\")\n\t\t\t\t\t.header(\"Location\",\n\t\t\t\t\t\t\t\"http://localhost:8888/demo-rest-jersey-spring/podcasts/\"\n\t\t\t\t\t\t\t\t\t+ String.valueOf(createPodcastId)).build();\n\t\t} else {\n\t\t\t// resource is existent and a full update should occur\n\t\t\tpodcastService.updateFullyPodcast(podcast);\n\t\t\treturn Response\n\t\t\t\t\t.status(Response.Status.OK)\n\t\t\t\t\t// 200\n\t\t\t\t\t.entity(\"The podcast you specified has been fully updated created AT THE LOCATION you specified\")\n\t\t\t\t\t.header(\"Location\",\n\t\t\t\t\t\t\t\"http://localhost:8888/demo-rest-jersey-spring/podcasts/\"\n\t\t\t\t\t\t\t\t\t+ String.valueOf(id)).build();\n\t\t}\n\t}\n\n\t// PARTIAL update\n\t@POST\n\t@Path(\"{id}\")\n\t@Consumes({ MediaType.APPLICATION_JSON })\n\t@Produces({ MediaType.TEXT_HTML })\n\tpublic Response partialUpdatePodcast(@PathParam(\"id\") Long id,\n\t\t\tPodcast podcast) throws AppException {\n\t\tpodcast.setId(id);\n\t\tpodcastService.updatePartiallyPodcast(podcast);\n\t\treturn Response\n\t\t\t\t.status(Response.Status.OK)\n\t\t\t\t// 200\n\t\t\t\t.entity(\"The podcast you specified has been successfully updated\")\n\t\t\t\t.build();\n\t}\n\n\t/*\n\t * *********************************** DELETE ***********************************\n\t */\n\t@DELETE\n\t@Path(\"{id}\")\n\t@Produces({ MediaType.TEXT_HTML })\n\tpublic Response deletePodcastById(@PathParam(\"id\") Long id) {\n\t\tpodcastService.deletePodcastById(id);\n\t\treturn Response.status(Response.Status.NO_CONTENT)// 204\n\t\t\t\t.entity(\"Podcast successfully removed from database\").build();\n\t}\n\n\t@DELETE\n\t@Produces({ MediaType.TEXT_HTML })\n\tpublic Response deletePodcasts() {\n\t\tpodcastService.deletePodcasts();\n\t\treturn Response.status(Response.Status.NO_CONTENT)// 204\n\t\t\t\t.entity(\"All podcasts have been successfully removed\").build();\n\t}\n\n\tpublic void setpodcastService(PodcastService podcastService) {\n\t\tthis.podcastService = podcastService;\n\t}\n\n}\n"
  },
  {
    "path": "src/main/java/org/codingpedia/demo/rest/service/PodcastService.java",
    "content": "package org.codingpedia.demo.rest.service;\n\nimport java.util.List;\n\nimport org.codingpedia.demo.rest.errorhandling.AppException;\nimport org.codingpedia.demo.rest.errorhandling.CustomReasonPhraseException;\nimport org.codingpedia.demo.rest.resource.podcast.Podcast;\n\n/**\n * \n * @author ama\n * @see <a href=\"http://www.codingpedia.org/ama/spring-mybatis-integration-example/\">http://www.codingpedia.org/ama/spring-mybatis-integration-example/</a>\n */\npublic interface PodcastService {\n\t\n\t/*\n\t * ******************** Create related methods **********************\n\t * */\n\tpublic Long createPodcast(Podcast podcast) throws AppException;\n\tpublic void createPodcasts(List<Podcast> podcasts) throws AppException;\n\n\t\t\n\t/*\n\t ******************** Read related methods ********************\n\t  */ \t\n\t/**\n\t * \n\t * @param orderByInsertionDate - if set, it represents the order by criteria (ASC or DESC) for displaying podcasts\n\t * @param numberDaysToLookBack - if set, it represents number of days to look back for podcasts, null \n\t * @return list with podcasts coressponding to search criterias\n\t * @throws AppException\n\t */\n\tpublic List<Podcast> getPodcasts(String orderByInsertionDate, Integer numberDaysToLookBack) throws AppException;\n\t\n\t/**\n\t * Returns a podcast given its id\n\t * \n\t * @param id\n\t * @return\n\t * @throws AppException \n\t */\n\tpublic Podcast getPodcastById(Long id) throws AppException;\n\t/** \n\t * Returns all podcasts from \"legacy\" system\n\t * @return\n\t */\n\tpublic List<Podcast> getLegacyPodcasts();\n\t\n\t/**\n\t * Returns a \"legacy\" podcast given its id\n\t * \n\t * @param id\n\t * @return\n\t */\n\tpublic Podcast getLegacyPodcastById(Long id);\n\t\n\t\n\t/*\n\t * ******************** Update related methods **********************\n\t * */\t\n\tpublic void updateFullyPodcast(Podcast podcast) throws AppException;\n\tpublic void updatePartiallyPodcast(Podcast podcast) throws AppException;\t\n\t\n\t\t\n\t/*\n\t * ******************** Delete related methods **********************\n\t * */\n\tpublic void deletePodcastById(Long id);\n\t\n\t/** removes all podcasts */\n\tpublic void deletePodcasts();\n\n\t/*\n\t * ******************** Helper methods **********************\n\t * */\n\tpublic Podcast verifyPodcastExistenceById(Long id);\n\t\n\t/**\n\t * Empty method generating a Business Exception\n\t * @throws CustomReasonPhraseException\n\t */\n\tpublic void generateCustomReasonPhraseException() throws CustomReasonPhraseException;\n\n}\n"
  },
  {
    "path": "src/main/java/org/codingpedia/demo/rest/service/PodcastServiceDbAccessImpl.java",
    "content": "package org.codingpedia.demo.rest.service;\n\nimport java.lang.reflect.InvocationTargetException;\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport javax.ws.rs.core.Response;\n\nimport org.apache.commons.beanutils.BeanUtilsBean;\nimport org.codingpedia.demo.rest.dao.PodcastDao;\nimport org.codingpedia.demo.rest.dao.PodcastEntity;\nimport org.codingpedia.demo.rest.errorhandling.AppException;\nimport org.codingpedia.demo.rest.errorhandling.CustomReasonPhraseException;\nimport org.codingpedia.demo.rest.filters.AppConstants;\nimport org.codingpedia.demo.rest.helpers.NullAwareBeanUtilsBean;\nimport org.codingpedia.demo.rest.resource.podcast.Podcast;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.transaction.annotation.Transactional;\n\npublic class PodcastServiceDbAccessImpl implements PodcastService {\n\n\t@Autowired\n\tPodcastDao podcastDao;\n\t\t\n\t/********************* Create related methods implementation ***********************/\n\t@Transactional(\"transactionManager\")\n\tpublic Long createPodcast(Podcast podcast) throws AppException {\n\t\t\n\t\tvalidateInputForCreation(podcast);\n\t\t\n\t\t//verify existence of resource in the db (feed must be unique)\n\t\tPodcastEntity podcastByFeed = podcastDao.getPodcastByFeed(podcast.getFeed());\n\t\tif(podcastByFeed != null){\n\t\t\tthrow new AppException(Response.Status.CONFLICT.getStatusCode(), 409, \"Podcast with feed already existing in the database with the id \" + podcastByFeed.getId(),\n\t\t\t\t\t\"Please verify that the feed and title are properly generated\", AppConstants.BLOG_POST_URL);\n\t\t}\n\t\t\n\t\treturn podcastDao.createPodcast(new PodcastEntity(podcast));\n\t}\n\n\tprivate void validateInputForCreation(Podcast podcast) throws AppException {\n\t\tif(podcast.getFeed() == null){\n\t\t\tthrow new AppException(Response.Status.BAD_REQUEST.getStatusCode(), 400, \"Provided data not sufficient for insertion\",\n\t\t\t\t\t\"Please verify that the feed is properly generated/set\", AppConstants.BLOG_POST_URL);\n\t\t}\n\t\tif(podcast.getTitle() == null){\n\t\t\tthrow new AppException(Response.Status.BAD_REQUEST.getStatusCode(), 400, \"Provided data not sufficient for insertion\",\n\t\t\t\t\t\"Please verify that the title is properly generated/set\", AppConstants.BLOG_POST_URL);\n\t\t}\n\t\t//etc...\n\t}\n\t\n\t@Transactional(\"transactionManager\")\n\tpublic void createPodcasts(List<Podcast> podcasts) throws AppException {\n\t\tfor (Podcast podcast : podcasts) {\n\t\t\tcreatePodcast(podcast);\n\t\t}\t\t\n\t}\t\n\t\n\t\n\t // ******************** Read related methods implementation **********************\t\t\n\tpublic List<Podcast> getPodcasts(String orderByInsertionDate, Integer numberDaysToLookBack) throws AppException {\n\t\t\n\t\t//verify optional parameter numberDaysToLookBack first \n\t\tif(numberDaysToLookBack!=null){\n\t\t\tList<PodcastEntity> recentPodcasts = podcastDao.getRecentPodcasts(numberDaysToLookBack);\t\t\t\n\t\t\treturn getPodcastsFromEntities(recentPodcasts);\t\t\t\n\t\t}\n\t\t\n\t\tif(isOrderByInsertionDateParameterValid(orderByInsertionDate)){\n\t\t\tthrow new AppException(Response.Status.BAD_REQUEST.getStatusCode(), 400, \"Please set either ASC or DESC for the orderByInsertionDate parameter\", null , AppConstants.BLOG_POST_URL);\n\t\t}\t\t\t\n\t\tList<PodcastEntity> podcasts = podcastDao.getPodcasts(orderByInsertionDate);\n\t\t\n\t\treturn getPodcastsFromEntities(podcasts);\n\t}\n\n\tprivate boolean isOrderByInsertionDateParameterValid(\n\t\t\tString orderByInsertionDate) {\n\t\treturn orderByInsertionDate!=null \n\t\t\t\t&& !(\"ASC\".equalsIgnoreCase(orderByInsertionDate) || \"DESC\".equalsIgnoreCase(orderByInsertionDate));\n\t}\n\t\n\tpublic Podcast getPodcastById(Long id) throws AppException {\t\t\n\t\tPodcastEntity podcastById = podcastDao.getPodcastById(id);\n\t\tif(podcastById == null){\n\t\t\tthrow new AppException(Response.Status.NOT_FOUND.getStatusCode(), \n\t\t\t\t\t404, \n\t\t\t\t\t\"The podcast you requested with id \" + id + \" was not found in the database\",\n\t\t\t\t\t\"Verify the existence of the podcast with the id \" + id + \" in the database\",\n\t\t\t\t\tAppConstants.BLOG_POST_URL);\t\t\t\n\t\t}\n\t\t\n\t\treturn new Podcast(podcastDao.getPodcastById(id));\n\t}\t\n\n\tprivate List<Podcast> getPodcastsFromEntities(List<PodcastEntity> podcastEntities) {\n\t\tList<Podcast> response = new ArrayList<Podcast>();\n\t\tfor(PodcastEntity podcastEntity : podcastEntities){\n\t\t\tresponse.add(new Podcast(podcastEntity));\t\t\t\t\t\n\t\t}\n\t\t\n\t\treturn response;\n\t}\n\n\tpublic List<Podcast> getRecentPodcasts(int numberOfDaysToLookBack) {\n\t\tList<PodcastEntity> recentPodcasts = podcastDao.getRecentPodcasts(numberOfDaysToLookBack);\n\t\t\n\t\treturn getPodcastsFromEntities(recentPodcasts);\n\t}\n\n\tpublic List<Podcast> getLegacyPodcasts() {\n\t\tList<PodcastEntity> legacyPodcasts = podcastDao.getLegacyPodcasts();\n\t\t\n\t\treturn getPodcastsFromEntities(legacyPodcasts);\n\t}\n\n\tpublic Podcast getLegacyPodcastById(Long id) {\n\t\treturn new Podcast(podcastDao.getLegacyPodcastById(id));\n\t}\n\t\n\t\n\t/********************* UPDATE-related methods implementation ***********************/\t\n\t@Transactional(\"transactionManager\")\n\tpublic void updateFullyPodcast(Podcast podcast) throws AppException {\n\t\t//do a validation to verify FULL update with PUT\n\t\tif(isFullUpdate(podcast)){\n\t\t\tthrow new AppException(Response.Status.BAD_REQUEST.getStatusCode(), \n\t\t\t\t\t400, \n\t\t\t\t\t\"Please specify all properties for Full UPDATE\",\n\t\t\t\t\t\"required properties - id, title, feed, lnkOnPodcastpedia, description\" ,\n\t\t\t\t\tAppConstants.BLOG_POST_URL);\t\t\t\n\t\t}\n\t\t\n\t\tPodcast verifyPodcastExistenceById = verifyPodcastExistenceById(podcast.getId());\n\t\tif(verifyPodcastExistenceById == null){\n\t\t\tthrow new AppException(Response.Status.NOT_FOUND.getStatusCode(), \n\t\t\t\t\t404, \n\t\t\t\t\t\"The resource you are trying to update does not exist in the database\",\n\t\t\t\t\t\"Please verify existence of data in the database for the id - \" + podcast.getId(),\n\t\t\t\t\tAppConstants.BLOG_POST_URL);\t\t\t\t\n\t\t}\n\t\t\t\t\n\t\tpodcastDao.updatePodcast(new PodcastEntity(podcast));\n\t}\n\n\t/**\n\t * Verifies the \"completeness\" of podcast resource sent over the wire\n\t * \n\t * @param podcast\n\t * @return\n\t */\n\tprivate boolean isFullUpdate(Podcast podcast) {\n\t\treturn podcast.getId() == null\n\t\t\t\t|| podcast.getFeed() == null\n\t\t\t\t|| podcast.getLinkOnPodcastpedia() == null\n\t\t\t\t|| podcast.getTitle() == null\n\t\t\t\t|| podcast.getDescription() == null;\n\t}\n\t\n\t/********************* DELETE-related methods implementation ***********************/\n\t@Transactional(\"transactionManager\")\n\tpublic void deletePodcastById(Long id) {\n\t\tpodcastDao.deletePodcastById(id);\n\t}\n\t\n\t@Transactional(\"transactionManager\")\t\n\tpublic void deletePodcasts() {\n\t\tpodcastDao.deletePodcasts();\t\t\n\t}\n\n\tpublic Podcast verifyPodcastExistenceById(Long id) {\n\t\tPodcastEntity podcastById = podcastDao.getPodcastById(id);\n\t\tif(podcastById == null){\n\t\t\treturn null;\n\t\t} else {\n\t\t\treturn new Podcast(podcastById);\t\t\t\n\t\t}\n\t}\n\n\t@Transactional(\"transactionManager\")\n\tpublic void updatePartiallyPodcast(Podcast podcast) throws AppException {\n\t\t//do a validation to verify existence of the resource\t\t\n\t\tPodcast verifyPodcastExistenceById = verifyPodcastExistenceById(podcast.getId());\n\t\tif(verifyPodcastExistenceById == null){\n\t\t\tthrow new AppException(Response.Status.NOT_FOUND.getStatusCode(), \n\t\t\t\t\t404, \n\t\t\t\t\t\"The resource you are trying to update does not exist in the database\",\n\t\t\t\t\t\"Please verify existence of data in the database for the id - \" + podcast.getId(),\n\t\t\t\t\tAppConstants.BLOG_POST_URL);\t\t\t\t\n\t\t}\n\t\tcopyPartialProperties(verifyPodcastExistenceById, podcast);\t\t\n\t\tpodcastDao.updatePodcast(new PodcastEntity(verifyPodcastExistenceById));\n\t\t\n\t}\n\n\tprivate void copyPartialProperties(Podcast verifyPodcastExistenceById,\n\t\t\t\t\t\tPodcast podcast) {\n\t\t\n\t\tBeanUtilsBean notNull=new NullAwareBeanUtilsBean();\n\t\ttry {\n\t\t\tnotNull.copyProperties(verifyPodcastExistenceById, podcast);\n\t\t} catch (IllegalAccessException e) {\n\t\t\t// TODO Auto-generated catch block\n\t\t\te.printStackTrace();\n\t\t} catch (InvocationTargetException e) {\n\t\t\t// TODO Auto-generated catch block\n\t\t\te.printStackTrace();\n\t\t}\n\t\t\n\t}\n\n\t@Override\n\tpublic void generateCustomReasonPhraseException() throws CustomReasonPhraseException {\t\t\n\t\tthrow new CustomReasonPhraseException(4000, \"message attached to the Custom Reason Phrase Exception\");\t\t\n\t}\n\n\tpublic void setPodcastDao(PodcastDao podcastDao) {\n\t\tthis.podcastDao = podcastDao;\n\t}\n\t\t\n}\n"
  },
  {
    "path": "src/main/resources/config/jetty9.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Configure class=\"org.eclipse.jetty.webapp.WebAppContext\">\n  <New id=\"demoDS\" class=\"org.eclipse.jetty.plus.jndi.Resource\">\n     <Arg></Arg>\n     <Arg>jdbc/restDemoDB</Arg>\n     <Arg>\n        <New class=\"com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource\">\n           <Set name=\"Url\">jdbc:mysql://localhost:3306/rest_demo?allowMultiQueries=true</Set>\n           <Set name=\"User\">rest_demo</Set>\n           <Set name=\"Password\">rest_demo</Set>\n        </New>\n     </Arg>\n    </New>\n  <New id=\"demoLegacyDS\" class=\"org.eclipse.jetty.plus.jndi.Resource\">\n     <Arg></Arg>\n     <Arg>jdbc/restDemoLegacyDB</Arg>\n     <Arg>\n        <New class=\"com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource\">\n           <Set name=\"Url\">jdbc:mysql://localhost:3306/rest_demo_legacy?allowMultiQueries=true</Set>\n           <Set name=\"User\">rest_demo</Set>\n           <Set name=\"Password\">rest_demo</Set>\n        </New>\n     </Arg>\n    </New>    \n</Configure>"
  },
  {
    "path": "src/main/resources/config/persistence-demo.xml",
    "content": "<persistence version=\"2.0\" xmlns=\"http://java.sun.com/xml/ns/persistence\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd\">\n   <persistence-unit name=\"demoRestPersistence\">\n      <provider>org.hibernate.ejb.HibernatePersistence</provider>\n   </persistence-unit>\n\n   <persistence-unit name=\"demoRestPersistenceLegacy\">\n      <provider>org.hibernate.ejb.HibernatePersistence</provider>\n   </persistence-unit>   \n</persistence>"
  },
  {
    "path": "src/main/resources/input_data/DumpRESTdemoDB.sql",
    "content": "CREATE DATABASE  IF NOT EXISTS `rest_demo` /*!40100 DEFAULT CHARACTER SET utf8 */;\nUSE `rest_demo`;\n-- MySQL dump 10.13  Distrib 5.6.10, for Win64 (x86_64)\n--\n-- Host: 127.0.0.1    Database: rest_demo\n-- ------------------------------------------------------\n-- Server version\t5.6.10-log\n\n/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;\n/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;\n/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;\n/*!40101 SET NAMES utf8 */;\n/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;\n/*!40103 SET TIME_ZONE='+00:00' */;\n/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;\n/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;\n/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;\n/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;\n\n--\n-- Table structure for table `podcasts`\n--\n\nDROP TABLE IF EXISTS `podcasts`;\n/*!40101 SET @saved_cs_client     = @@character_set_client */;\n/*!40101 SET character_set_client = utf8 */;\nCREATE TABLE `podcasts` (\n  `id` bigint(20) NOT NULL AUTO_INCREMENT,\n  `title` varchar(145) NOT NULL,\n  `feed` varchar(145) NOT NULL,\n  `insertion_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,\n  `description` varchar(500) DEFAULT NULL,\n  `link_on_podcastpedia` varchar(145) DEFAULT NULL,\n  PRIMARY KEY (`id`),\n  UNIQUE KEY `feed_UNIQUE` (`feed`)\n) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;\n/*!40101 SET character_set_client = @saved_cs_client */;\n\n--\n-- Dumping data for table `podcasts`\n--\n\nLOCK TABLES `podcasts` WRITE;\n/*!40000 ALTER TABLE `podcasts` DISABLE KEYS */;\nINSERT INTO `podcasts` VALUES (1,'Quarks & Co - zum Mitnehmen','http://podcast.wdr.de/quarks.xml','2014-01-09 20:21:10','Quarks & Co: Das Wissenschaftsmagazin','http://www.podcastpedia.org/podcasts/1/Quarks-Co-zum-Mitnehmen'),(2,'- The Naked Scientists Podcast - Stripping Down Science','http://www.thenakedscientists.com/naked_scientists_podcast.xml','2014-01-09 20:21:10','The Naked Scientists flagship science show brings you a lighthearted look at the latest scientific breakthroughs, interviews with the world top scientists, answers to your science questions and science experiments to try at home.','http://www.podcastpedia.org/podcasts/792/-The-Naked-Scientists-Podcast-Stripping-Down-Science'),(3,'NPR: TED Radio Hour Podcast','http://www.npr.org/rss/podcast.php?id=510298','2014-01-09 20:21:10','The TED Radio Hour is a journey through fascinating ideas: astonishing inventions, fresh approaches to old problems, new ways to think and create. Based on Talks given by riveting speakers on the world-renowned TED stage, each show is centered on a common theme - such as the source of happiness, crowd-sourcing innovation, power shifts, or inexplicable connections. The TED Radio Hour is hosted by Guy Raz, and is a co-production of NPR & TED. Follow the show @TEDRadioHour.','http://www.podcastpedia.org/podcasts/1183/NPR-TED-Radio-Hour-Podcast');\n/*!40000 ALTER TABLE `podcasts` ENABLE KEYS */;\nUNLOCK TABLES;\n/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;\n\n/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;\n/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;\n/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;\n/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;\n/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;\n/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;\n/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;\n\n-- Dump completed on 2014-01-09 20:21:54\n"
  },
  {
    "path": "src/main/resources/input_data/DumpRESTdemoDB_legacy.sql",
    "content": "CREATE DATABASE  IF NOT EXISTS `rest_demo_legacy` /*!40100 DEFAULT CHARACTER SET utf8 */;\nUSE `rest_demo_legacy`;\n-- MySQL dump 10.13  Distrib 5.6.10, for Win64 (x86_64)\n--\n-- Host: 127.0.0.1    Database: rest_demo\n-- ------------------------------------------------------\n-- Server version\t5.6.10-log\n\n/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;\n/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;\n/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;\n/*!40101 SET NAMES utf8 */;\n/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;\n/*!40103 SET TIME_ZONE='+00:00' */;\n/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;\n/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;\n/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;\n/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;\n\n--\n-- Table structure for table `podcasts`\n--\n\nDROP TABLE IF EXISTS `podcasts`;\n/*!40101 SET @saved_cs_client     = @@character_set_client */;\n/*!40101 SET character_set_client = utf8 */;\nCREATE TABLE `podcasts` (\n  `id` bigint(20) NOT NULL AUTO_INCREMENT,\n  `title` varchar(145) NOT NULL,\n  `feed` varchar(145) NOT NULL,\n  `insertion_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,\n  `description` varchar(500) DEFAULT NULL,\n  `link_on_podcastpedia` varchar(145) DEFAULT NULL,\n  PRIMARY KEY (`id`),\n  UNIQUE KEY `feed_UNIQUE` (`feed`)\n) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;\n/*!40101 SET character_set_client = @saved_cs_client */;\n\n--\n-- Dumping data for table `podcasts`\n--\n\nLOCK TABLES `podcasts` WRITE;\n/*!40000 ALTER TABLE `podcasts` DISABLE KEYS */;\nINSERT INTO `podcasts` VALUES (1,'Quarks & Co - zum Mitnehmen','http://podcast.wdr.de/quarks.xml','2014-01-09 20:21:10','Quarks & Co: Das Wissenschaftsmagazin','http://www.podcastpedia.org/podcasts/1/Quarks-Co-zum-Mitnehmen'),(2,'- The Naked Scientists Podcast - Stripping Down Science','http://www.thenakedscientists.com/naked_scientists_podcast.xml','2014-01-09 20:21:10','The Naked Scientists flagship science show brings you a lighthearted look at the latest scientific breakthroughs, interviews with the world top scientists, answers to your science questions and science experiments to try at home.','http://www.podcastpedia.org/podcasts/792/-The-Naked-Scientists-Podcast-Stripping-Down-Science'),(3,'NPR: TED Radio Hour Podcast','http://www.npr.org/rss/podcast.php?id=510298','2014-01-09 20:21:10','The TED Radio Hour is a journey through fascinating ideas: astonishing inventions, fresh approaches to old problems, new ways to think and create. Based on Talks given by riveting speakers on the world-renowned TED stage, each show is centered on a common theme - such as the source of happiness, crowd-sourcing innovation, power shifts, or inexplicable connections. The TED Radio Hour is hosted by Guy Raz, and is a co-production of NPR & TED. Follow the show @TEDRadioHour.','http://www.podcastpedia.org/podcasts/1183/NPR-TED-Radio-Hour-Podcast');\n/*!40000 ALTER TABLE `podcasts` ENABLE KEYS */;\nUNLOCK TABLES;\n/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;\n\n/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;\n/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;\n/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;\n/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;\n/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;\n/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;\n/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;\n\n-- Dump completed on 2014-01-09 20:21:54\n"
  },
  {
    "path": "src/main/resources/input_data/populate_db.sql",
    "content": "select * from podcasts;\n\ninsert into podcasts\nset title = 'Quarks & Co - zum Mitnehmen',\nlink_on_podcastpedia ='http://www.podcastpedia.org/podcasts/1/Quarks-Co-zum-Mitnehmen',\nfeed = 'http://podcast.wdr.de/quarks.xml',\ndescription='Quarks & Co: Das Wissenschaftsmagazin';\n\ninsert into podcasts\nset title = '- The Naked Scientists Podcast - Stripping Down Science',\nlink_on_podcastpedia ='http://www.podcastpedia.org/podcasts/792/-The-Naked-Scientists-Podcast-Stripping-Down-Science',\nfeed = 'http://www.thenakedscientists.com/naked_scientists_podcast.xml',\ndescription='The Naked Scientists flagship science show brings you a lighthearted look at the latest scientific breakthroughs, interviews with the world top scientists, answers to your science questions and science experiments to try at home.';\n\ninsert into podcasts\nset title = 'NPR: TED Radio Hour Podcast',\nlink_on_podcastpedia ='http://www.podcastpedia.org/podcasts/1183/NPR-TED-Radio-Hour-Podcast',\nfeed = 'http://www.npr.org/rss/podcast.php?id=510298',\ndescription='The TED Radio Hour is a journey through fascinating ideas: astonishing inventions, fresh approaches to old problems, new ways to think and create. Based on Talks given by riveting speakers on the world-renowned TED stage, each show is centered on a common theme - such as the source of happiness, crowd-sourcing innovation, power shifts, or inexplicable connections. The TED Radio Hour is hosted by Guy Raz, and is a co-production of NPR & TED. Follow the show @TEDRadioHour.';\n\nselect * from podcasts;\n\n"
  },
  {
    "path": "src/main/resources/logback.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<configuration>\n\t<appender name=\"consoleAppender\" class=\"ch.qos.logback.core.ConsoleAppender\">\n\t\t<layout class=\"ch.qos.logback.classic.PatternLayout\">\n\t\t\t<Pattern>%date{ISO8601} [%thread] %-5level %logger{36} - %msg %n\n\t\t\t</Pattern>\n\t\t</layout>\n\t\t<filter class=\"ch.qos.logback.classic.filter.ThresholdFilter\">\n\t\t\t<level>TRACE</level>\n\t\t</filter>\n\t</appender>\n\n  \t<appender name=\"dailyRollingFileAppender\" class=\"ch.qos.logback.core.rolling.RollingFileAppender\">\n\t\t<File>c:/tmp/rest-demo/rest-demo.log</File>\n\t\t<rollingPolicy class=\"ch.qos.logback.core.rolling.TimeBasedRollingPolicy\">\n\t\t    <!-- daily rollover -->\n\t\t\t<FileNamePattern>c:/tmp/rest-demo/archive/rest-demo.%d{yyyy-MM-dd}.log</FileNamePattern>\n\t\t\t\n\t\t\t<!-- keep 30 days' worth of history -->\n\t\t\t<maxHistory>30</maxHistory>\t\t\t\n\t\t</rollingPolicy>\n \n\t\t<encoder>\n\t\t\t<Pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{35} - %msg %n</Pattern>\n\t\t</encoder> \t    \n  \t</appender>\n  \t<appender name=\"minuteRollingFileAppender\" class=\"ch.qos.logback.core.rolling.RollingFileAppender\">\n\t\t<rollingPolicy class=\"ch.qos.logback.core.rolling.TimeBasedRollingPolicy\">\n\t\t    <!-- rollover every minute -->\n\t\t\t<FileNamePattern>c:/tmp/rest-demo/archive/minutes/rest-demo-minute.%d{yyyy-MM-dd_HH-mm}.log</FileNamePattern>\n\t\t\t\n\t\t\t<!-- keep 1 day worth of history -->\n\t\t\t<maxHistory>1</maxHistory>\t\t\t\n\t\t</rollingPolicy>\n \n\t\t<encoder>\n\t\t\t<Pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{35} - %msg %n</Pattern>\n\t\t</encoder> \t    \n  \t</appender>  \t\n  \t\t\n\t<logger name=\"org.codingpedia\" additivity=\"false\">\n\t    <level value=\"DEBUG\" />\n\t\t<appender-ref ref=\"dailyRollingFileAppender\"/>\n\t\t<appender-ref ref=\"minuteRollingFileAppender\"/>\n\t\t<appender-ref ref=\"consoleAppender\" />\n\t</logger>\n\n\t<root>\n\t\t<level value=\"INFO\" />\n\t\t<appender-ref ref=\"consoleAppender\" />\n\t</root>\n</configuration> "
  },
  {
    "path": "src/main/resources/spring/applicationContext.xml",
    "content": "<beans xmlns=\"http://www.springframework.org/schema/beans\"\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" \n\txmlns:context=\"http://www.springframework.org/schema/context\"\n\txmlns:tx=\"http://www.springframework.org/schema/tx\"\t\n\txsi:schemaLocation=\"\n\t\thttp://www.springframework.org/schema/beans\t\n\t\thttp://www.springframework.org/schema/beans/spring-beans.xsd\n\t \n\t\thttp://www.springframework.org/schema/tx \n\t\thttp://www.springframework.org/schema/tx/spring-tx.xsd\n\t\t \n\t\thttp://www.springframework.org/schema/context\n\t\thttp://www.springframework.org/schema/context/spring-context.xsd\">\n \n\t<context:component-scan base-package=\"org.codingpedia.demo.rest.*\" />\n \n\t<!-- ************ JPA configuration *********** -->\n\t<tx:annotation-driven transaction-manager=\"transactionManager\" />  \n    <bean id=\"transactionManager\" class=\"org.springframework.orm.jpa.JpaTransactionManager\">\n        <property name=\"entityManagerFactory\" ref=\"entityManagerFactory\" />\n    </bean>\n    <bean id=\"transactionManagerLegacy\" class=\"org.springframework.orm.jpa.JpaTransactionManager\">\n        <property name=\"entityManagerFactory\" ref=\"entityManagerFactoryLegacy\" />\n    </bean>    \n    <bean id=\"entityManagerFactory\" class=\"org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean\">\n        <property name=\"persistenceXmlLocation\" value=\"classpath:config/persistence-demo.xml\" />\n        <property name=\"persistenceUnitName\" value=\"demoRestPersistence\" />        \n        <property name=\"dataSource\" ref=\"restDemoDS\" />\n        <property name=\"packagesToScan\" value=\"org.codingpedia.demo.*\" />\n        <property name=\"jpaVendorAdapter\">\n            <bean class=\"org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter\">\n                <property name=\"showSql\" value=\"true\" />\n                <property name=\"databasePlatform\" value=\"org.hibernate.dialect.MySQLDialect\" />\n            </bean>\n        </property>\n    </bean>     \n    <bean id=\"entityManagerFactoryLegacy\" class=\"org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean\">\n        <property name=\"persistenceXmlLocation\" value=\"classpath:config/persistence-demo.xml\" />\n        <property name=\"persistenceUnitName\" value=\"demoRestPersistenceLegacy\" />\n        <property name=\"dataSource\" ref=\"restDemoLegacyDS\" />\n        <property name=\"packagesToScan\" value=\"org.codingpedia.demo.*\" />\n        <property name=\"jpaVendorAdapter\">\n            <bean class=\"org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter\">\n                <property name=\"showSql\" value=\"true\" />\n                <property name=\"databasePlatform\" value=\"org.hibernate.dialect.MySQLDialect\" />\n            </bean>\n        </property>\n    </bean>        \n    \t\n\t<bean id=\"podcastDao\" class=\"org.codingpedia.demo.rest.dao.PodcastDaoJPA2Impl\"/>\t\n    <bean id=\"podcastService\" class=\"org.codingpedia.demo.rest.service.PodcastServiceDbAccessImpl\" />\t\n    <bean id=\"podcastsResource\" class=\"org.codingpedia.demo.rest.resource.podcast.PodcastsResource\" />\n    <bean id=\"podcastLegacyResource\" class=\"org.codingpedia.demo.rest.resource.podcast.PodcastLegacyResource\" />\n    \n    <bean id=\"versionService\" class=\"org.codingpedia.demo.rest.resource.manifest.ManifestService\" />\n    \n\t<bean id=\"restDemoDS\" class=\"org.springframework.jndi.JndiObjectFactoryBean\" scope=\"singleton\">\n\t    <property name=\"jndiName\" value=\"java:comp/env/jdbc/restDemoDB\" />\n\t    <property name=\"resourceRef\" value=\"true\" />        \n\t</bean>\n\t<bean id=\"restDemoLegacyDS\" class=\"org.springframework.jndi.JndiObjectFactoryBean\" scope=\"singleton\">\n\t    <property name=\"jndiName\" value=\"java:comp/env/jdbc/restDemoLegacyDB\" />\n\t    <property name=\"resourceRef\" value=\"true\" />        \n\t</bean>\t\n</beans>"
  },
  {
    "path": "src/main/resources/spring/security-context.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans:beans xmlns=\"http://www.springframework.org/schema/security\"\n    xmlns:beans=\"http://www.springframework.org/schema/beans\"\n    xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n    xmlns:security=\"http://www.springframework.org/schema/security\"    \n    xsi:schemaLocation=\"\n    \thttp://www.springframework.org/schema/beans \n    \thttp://www.springframework.org/schema/beans/spring-beans.xsd\n                \n        http://www.springframework.org/schema/security \n        http://www.springframework.org/schema/security/spring-security.xsd\">\n\t\n\t<!-- Stateless RESTful services use BASIC authentication -->\n    <security:http create-session=\"stateless\" pattern=\"/manifest/**\">\n        <security:intercept-url pattern=\"/**\" access=\"ROLE_REST\"/>\n        <security:http-basic/>\n    </security:http>\n\n    <security:authentication-manager>\n        <security:authentication-provider>\n            <security:user-service>\n                <security:user name=\"rest\" password=\"rest\" authorities=\"ROLE_REST\"/>\n            </security:user-service>\n        </security:authentication-provider>\n    </security:authentication-manager>\n\n</beans:beans>"
  },
  {
    "path": "src/main/webapp/META-INF/.gitignore",
    "content": "/MANIFEST.MF\n"
  },
  {
    "path": "src/main/webapp/META-INF/context.xml",
    "content": "<Context>\n  <Resource\n\t   name=\"jdbc/restDemoDB\"\n\t   auth=\"Container\"\n\t   type=\"javax.sql.DataSource\"\n\t   factory=\"org.apache.tomcat.jdbc.pool.DataSourceFactory\"\n\t   initialSize=\"5\"\n\t   maxActive=\"55\"\n\t   maxIdle=\"21\"\n\t   minIdle=\"13\"\n\t   timeBetweenEvictionRunsMillis=\"34000\"\n\t   minEvictableIdleTimeMillis=\"55000\"\n\t   validationQuery=\"SELECT 1\"\n\t   validationInterval=\"34\"\n\t   testOnBorrow=\"true\"\n\t   removeAbandoned=\"true\"\n\t   removeAbandonedTimeout=\"233\"\n\t   username=\"rest_demo\"\n\t   password=\"rest_demo\"\n\t   driverClassName=\"com.mysql.jdbc.Driver\"\n\t   url=\"jdbc:mysql://localhost:3306/rest_demo?allowMultiQueries=true\"\n   /> \n</Context>"
  },
  {
    "path": "src/main/webapp/WEB-INF/web.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<web-app version=\"3.0\" xmlns=\"http://java.sun.com/xml/ns/javaee\"\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd\">\n\t<display-name>Demo - Restful Web Application</display-name>\n   \n\t<listener>\n\t\t<listener-class>\n\t\t\torg.springframework.web.context.ContextLoaderListener\n\t\t</listener-class>\n\t</listener>\n\t\n\t<context-param>\n\t\t<param-name>contextConfigLocation</param-name>\n\t\t<param-value>\n\t\t    classpath:spring/applicationContext.xml\n\t\t    classpath:spring/security-context.xml\n\t\t</param-value>\n\t</context-param>\n \n\t<servlet>\n\t\t<servlet-name>jersey-servlet</servlet-name>\n\t\t<servlet-class>\n\t\t\torg.glassfish.jersey.servlet.ServletContainer\n\t\t</servlet-class>\n\t\t<init-param>\n\t\t\t<param-name>javax.ws.rs.Application</param-name>\n\t\t\t<param-value>org.codingpedia.demo.rest.RestDemoJaxRsApplication</param-value>\t\t\t\n\t\t</init-param>\t\t\n\t\t<load-on-startup>1</load-on-startup>\n\t</servlet>\n \n\t<servlet-mapping>\n\t\t<servlet-name>jersey-servlet</servlet-name>\n\t\t<url-pattern>/*</url-pattern>\n\t</servlet-mapping>\n\t\n    <!--Hook into spring security-->\n    <filter>\n        <filter-name>springSecurityFilterChain</filter-name>\n        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>\n    </filter>\n\n    <filter-mapping>\n      <filter-name>springSecurityFilterChain</filter-name>\n      <url-pattern>/manifest/*</url-pattern>\n    </filter-mapping>\t\n     \n\t<resource-ref>\n        <description>Database resource for rest demo web application </description>\n        <res-ref-name>jdbc/restDemoDB</res-ref-name>\n        <res-type>javax.sql.DataSource</res-type>\n        <res-auth>Container</res-auth>\n    </resource-ref>\t\n\t<resource-ref>\n        <description>Database resource for legacy system of demo rest web application </description>\n        <res-ref-name>jdbc/restDemoLegacyDB</res-ref-name>\n        <res-type>javax.sql.DataSource</res-type>\n        <res-auth>Container</res-auth>\n    </resource-ref>\t    \n</web-app>"
  },
  {
    "path": "src/test/java/org/codingpedia/demo/rest/service/PodcastServiceDbAccessImplTest.java",
    "content": "package org.codingpedia.demo.rest.service;\n\nimport static org.mockito.Mockito.*;\n\nimport org.codingpedia.demo.rest.dao.PodcastDao;\nimport org.codingpedia.demo.rest.dao.PodcastEntity;\nimport org.codingpedia.demo.rest.errorhandling.AppException;\nimport org.codingpedia.demo.rest.resource.podcast.Podcast;\nimport org.junit.Assert;\nimport org.junit.Before;\nimport org.junit.Rule;\nimport org.junit.Test;\nimport org.junit.rules.ExpectedException;\nimport org.junit.runner.RunWith;\nimport org.mockito.Mock;\nimport org.mockito.runners.MockitoJUnitRunner;\n\n@RunWith(MockitoJUnitRunner.class)\npublic class PodcastServiceDbAccessImplTest {\n\n\tprivate static final Long CREATED_PODCAST_RESOURCE_ID = Long.valueOf(1);\n\tprivate static final String SOME_FEED = \"some_feed\";\n\tprivate static final String SOME_TITLE = \"some title\";\n\tprivate static final String EXISTING_FEED = \"http://quarks.de/feed\";\n\tprivate static final Long SOME_ID = 13L;\n\t\n\t@Rule\n\tpublic ExpectedException exception = ExpectedException.none();\t\n\n\tPodcastServiceDbAccessImpl sut;//system under test\n\t\n\t@Mock\n\tPodcastDao podcastDao;\n\t\n\t@Before\n\tpublic void setUp() throws Exception {\t\t\n\t\tsut = new PodcastServiceDbAccessImpl();\n\t\tsut.setPodcastDao(podcastDao);\n\t}\n\n\t@Test\n\tpublic void testCreatePodcast_successful() throws AppException {\n\t\t\n\t\twhen(podcastDao.getPodcastByFeed(SOME_FEED)).thenReturn(null);\t\t\n\t\twhen(podcastDao.createPodcast(any(PodcastEntity.class))).thenReturn(CREATED_PODCAST_RESOURCE_ID);\n\t\t\n\t\tPodcast podcast = new Podcast();\n\t\tpodcast.setFeed(SOME_FEED);\n\t\tpodcast.setTitle(SOME_TITLE);\n\t\tLong createPodcast = sut.createPodcast(podcast);\n\t\t\n\t\tverify(podcastDao).getPodcastByFeed(SOME_FEED);//verifies if the method podcastDao.getPodcastByFeed has been called exactly once with that exact input parameter\n\t\tverify(podcastDao, times(1)).getPodcastByFeed(SOME_FEED);//same as above\n\t\tverify(podcastDao, times(1)).getPodcastByFeed(eq(SOME_FEED));//same as above\n\t\tverify(podcastDao, times(1)).getPodcastByFeed(anyString());//verifies if the method podcastDao.getPodcastByFeed has been called exactly once with any string as input\n\t\tverify(podcastDao, atLeastOnce()).getPodcastByFeed(SOME_FEED);//verifies if the method podcastDao.getPodcastByFeed has been called at least once with that exact input parameter\t\t\n\t\tverify(podcastDao, atLeast(1)).getPodcastByFeed(SOME_FEED);//verifies if the method podcastDao.getPodcastByFeed has been called at least once with that exact input parameter\n\t\tverify(podcastDao, times(1)).createPodcast(any(PodcastEntity.class));\n\t\tverify(podcastDao, never()).getLegacyPodcastById(anyLong());//verifies the method podcastDao.getLegacyPodcastById has never been called\n\t\t\n\t\tAssert.assertTrue(createPodcast == CREATED_PODCAST_RESOURCE_ID);\n\t}\n\n\t@Test(expected=AppException.class)\t\n\tpublic void testCreatePodcast_error() throws AppException {\n\t\t\n\t\tPodcastEntity existingPodcast = new PodcastEntity();\n\t\twhen(podcastDao.getPodcastByFeed(EXISTING_FEED)).thenReturn(existingPodcast);\t\t\t\n\t\t\n\t\tPodcast podcast = new Podcast();\n\t\tpodcast.setFeed(EXISTING_FEED);\n\t\tpodcast.setTitle(SOME_TITLE);\n\t\tsut.createPodcast(podcast);\n\n\t}\n\t\n\t@Test\t\n\tpublic void testCreatePodcast_validation_missingFeed() throws AppException {\n\t\t\n\t\texception.expect(AppException.class);\n\t\texception.expectMessage(\"Provided data not sufficient for insertion\");\n\t\t\t\t\t\t\n\t\tsut.createPodcast(new Podcast());\n\n\t}\t\t\n\t\n\t@Test\t\n\tpublic void testCreatePodcast_validation_missingTitle() throws AppException {\n\t\t\n\t\texception.expect(AppException.class);\n\t\texception.expectMessage(\"Provided data not sufficient for insertion\");\n\t\t\t\t\t\t\n\t\tPodcast podcast = new Podcast();\n\t\tpodcast.setFeed(EXISTING_FEED);\n\t\tsut.createPodcast(podcast);\n\n\t}\t\n\t\n\n\t@Test\n\tpublic void testUpdatePartiallyPodcast_successful() throws AppException {\n\t\t\n\t\tPodcastEntity podcastEntity = new PodcastEntity();\n\t\tpodcastEntity.setId(SOME_ID);\n\t\twhen(podcastDao.getPodcastById(SOME_ID)).thenReturn(podcastEntity);\t\t\n\t\tdoNothing().when(podcastDao).updatePodcast(any(PodcastEntity.class));\n\t\t\n\t\tPodcast podcast = new Podcast(podcastEntity);\n\t\tpodcast.setFeed(SOME_FEED);\n\t\tpodcast.setTitle(SOME_TITLE);\n\t\tsut.updatePartiallyPodcast(podcast);\n\t\t\n\t\tverify(podcastDao).getPodcastById(SOME_ID);//verifies if the method podcastDao.getPodcastById has been called exactly once with that exact input parameter\n\t\tverify(podcastDao).updatePodcast(any(PodcastEntity.class));\t\t\n\t\t\n\t\tAssert.assertTrue(podcast.getFeed() == SOME_FEED);\n\t\tAssert.assertTrue(podcast.getTitle() == SOME_TITLE);\n\t}\n\t\n\t@Test\n\tpublic void testUpdatePartiallyPodcast_not_existing_podcast() {\n\t\t\n\t\twhen(podcastDao.getPodcastById(SOME_ID)).thenReturn(null);\n\t\t\n\t\tPodcast podcast = new Podcast();\n\t\tpodcast.setId(SOME_ID);\n\t\ttry {\n\t\t\tsut.updatePartiallyPodcast(podcast);\n\t\t\tAssert.fail(\"Should have thrown an exception\"); \n\t\t} catch (AppException e) {\n\t\t\tverify(podcastDao).getPodcastById(SOME_ID);//verifies if the method podcastDao.getPodcastById has been called exactly once with that exact input parameter\n\t\t\tAssert.assertEquals(e.getCode(), 404);\n\t\t}\n\t\t\n\t}\t\n\t\n}\n"
  },
  {
    "path": "src/test/java/org/codingpedia/demo/rest/service/integration/RestDemoServiceIT.java",
    "content": "package org.codingpedia.demo.rest.service.integration;\n\nimport java.io.IOException;\nimport java.util.List;\n\nimport javax.ws.rs.client.Client;\nimport javax.ws.rs.client.ClientBuilder;\nimport javax.ws.rs.client.Invocation.Builder;\nimport javax.ws.rs.client.WebTarget;\nimport javax.ws.rs.core.GenericType;\nimport javax.ws.rs.core.MediaType;\nimport javax.ws.rs.core.Response;\n\nimport org.codehaus.jackson.JsonGenerationException;\nimport org.codehaus.jackson.map.JsonMappingException;\nimport org.codehaus.jackson.map.ObjectMapper;\nimport org.codingpedia.demo.rest.resource.podcast.Podcast;\nimport org.glassfish.jersey.client.ClientConfig;\nimport org.glassfish.jersey.jackson.JacksonFeature;\nimport org.junit.Assert;\nimport org.junit.Test;\n\npublic class RestDemoServiceIT {\n\n\t@Test\n\tpublic void testGetPodcasts() throws JsonGenerationException,\n\t\t\tJsonMappingException, IOException {\n\n\t\tClientConfig clientConfig = new ClientConfig();\n\t\tclientConfig.register(JacksonFeature.class);\n\n\t\tClient client = ClientBuilder.newClient(clientConfig);\n\n\t\tWebTarget webTarget = client\n\t\t\t\t.target(\"http://localhost:8888/demo-rest-jersey-spring/podcasts/\");\n\n\t\tBuilder request = webTarget.request();\n\t\trequest.header(\"Content-type\", MediaType.APPLICATION_JSON);\n\n\t\tResponse response = request.get();\n\t\tAssert.assertTrue(response.getStatus() == 200);\n\n\t\tList<Podcast> podcasts = response\n\t\t\t\t.readEntity(new GenericType<List<Podcast>>() {\n\t\t\t\t});\n\n\t\tObjectMapper mapper = new ObjectMapper();\n\t\tSystem.out.print(mapper.writerWithDefaultPrettyPrinter()\n\t\t\t\t.writeValueAsString(podcasts));\n\n\t\tAssert.assertTrue(\"At least one podcast is present\",\n\t\t\t\tpodcasts.size() > 0);\n\t}\n\n\t@Test\n\tpublic void testGetPodcast() throws JsonGenerationException,\n\t\t\tJsonMappingException, IOException {\n\n\t\tClientConfig clientConfig = new ClientConfig();\n\t\tclientConfig.register(JacksonFeature.class);\n\n\t\tClient client = ClientBuilder.newClient(clientConfig);\n\n\t\tWebTarget webTarget = client\n\t\t\t\t.target(\"http://localhost:8888/demo-rest-jersey-spring/podcasts/2\");\n\n\t\tBuilder request = webTarget.request(MediaType.APPLICATION_JSON);\n\n\t\tResponse response = request.get();\n\t\tAssert.assertTrue(response.getStatus() == 200);\n\n\t\tPodcast podcast = response.readEntity(Podcast.class);\n\n\t\tObjectMapper mapper = new ObjectMapper();\n\t\tSystem.out\n\t\t\t\t.print(\"Received podcast from database *************************** \"\n\t\t\t\t\t\t+ mapper.writerWithDefaultPrettyPrinter()\n\t\t\t\t\t\t\t\t.writeValueAsString(podcast));\n\n\t}\n\t\n\t@Test\n\tpublic void testGetLegacyPodcasts() throws JsonGenerationException,\n\t\t\tJsonMappingException, IOException {\n\n\t\tClientConfig clientConfig = new ClientConfig();\n\t\tclientConfig.register(JacksonFeature.class);\n\n\t\tClient client = ClientBuilder.newClient(clientConfig);\n\n\t\tWebTarget webTarget = client\n\t\t\t\t.target(\"http://localhost:8888/demo-rest-jersey-spring/legacy/podcasts/\");\n\n\t\tBuilder request = webTarget.request();\n\t\trequest.header(\"Content-type\", MediaType.APPLICATION_JSON);\n\n\t\tResponse response = request.get();\n\t\tAssert.assertTrue(response.getStatus() == 200);\n\n\t\tList<Podcast> podcasts = response\n\t\t\t\t.readEntity(new GenericType<List<Podcast>>() {\n\t\t\t\t});\n\n\t\tObjectMapper mapper = new ObjectMapper();\n\t\tSystem.out.print(mapper.writerWithDefaultPrettyPrinter()\n\t\t\t\t.writeValueAsString(podcasts));\n\n\t\tAssert.assertTrue(\"At least one podcast is present in the LEGACY\",\n\t\t\t\tpodcasts.size() > 0);\n\t}\n\n\t@Test\n\tpublic void testGetLegacyPodcast() throws JsonGenerationException,\n\t\t\tJsonMappingException, IOException {\n\n\t\tClientConfig clientConfig = new ClientConfig();\n\t\tclientConfig.register(JacksonFeature.class);\n\n\t\tClient client = ClientBuilder.newClient(clientConfig);\n\n\t\tWebTarget webTarget = client\n\t\t\t\t.target(\"http://localhost:8888/demo-rest-jersey-spring/legacy/podcasts/2\");\n\n\t\tBuilder request = webTarget.request(MediaType.APPLICATION_JSON);\n\n\t\tResponse response = request.get();\n\t\tAssert.assertTrue(response.getStatus() == 200);\n\n\t\tPodcast podcast = response.readEntity(Podcast.class);\n\n\t\tObjectMapper mapper = new ObjectMapper();\n\t\tSystem.out\n\t\t\t\t.print(\"Received podcast from LEGACY database *************************** \"\n\t\t\t\t\t\t+ mapper.writerWithDefaultPrettyPrinter()\n\t\t\t\t\t\t\t\t.writeValueAsString(podcast));\n\n\t}\n\t\n}\n"
  },
  {
    "path": "src/test/resources/data-source.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\tApplication context definition for PetClinic Datasource.\n-->\n<beans xmlns=\"http://www.springframework.org/schema/beans\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\t\txmlns:p=\"http://www.springframework.org/schema/p\"\n\t\txmlns:context=\"http://www.springframework.org/schema/context\" \n\t\txmlns:jdbc=\"http://www.springframework.org/schema/jdbc\"\n\t\txsi:schemaLocation=\"\n\t\t\thttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd\n\t\t\thttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd\n\t\t\thttp://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd\">\n\t\t\t\t\n  \t<!-- ========================= DATASOURCE DEFINITION ========================= -->\t\t\n\t   <!-- pcm-data.xml -->\t\n\t \t <!-- When resourceRef is true, the value of jndiName will be prepended with\n\tserver’s JNDI directory. Consequently, the actual name used will be\n\tjava:comp/env/jdbc/pcmDB. \n\t<bean id=\"dataSource\"\n\t\tclass=\"org.springframework.jndi.JndiObjectFactoryBean\"\n\t\tscope=\"singleton\">\n\t\t<property name=\"jndiName\" value=\"jdbc/pcmDB\" />\n\t\t<property name=\"resourceRef\" value=\"true\" />\t\t\n\t</bean> \n\t-->\n\t\n\t<!-- Configurer that replaces ${...} placeholders with values from a properties file -->\n\t<!-- (in this case, JDBC-related settings for the dataSource definition below) -->\n\t<context:property-placeholder location=\"classpath:db.properties\"/>\n\t\t\n\t<bean id=\"dataSource\" destroy-method=\"close\"\n\t  class=\"org.apache.commons.dbcp.BasicDataSource\">\n\t    <property name=\"driverClassName\" value=\"${db.driver}\"/>\n\t    <property name=\"url\" value=\"${db.url}\"/>\n\t    <property name=\"username\" value=\"${db.username}\"/>\n\t    <property name=\"password\" value=\"${db.password}\"/>\n\t    <property name=\"initialSize\" value=\"3\"/>\n        <property name=\"testWhileIdle\" value=\"true\" />\n        <property name=\"timeBetweenEvictionRunsMillis\" value=\"300000\" />\n        <property name=\"numTestsPerEvictionRun\" value=\"6\" />\n        <property name=\"minEvictableIdleTimeMillis\" value=\"1800000\" />\n        <property name=\"maxActive\" value=\"5\" />\n        <property name=\"maxIdle\" value=\"5\" />\n        <property name=\"maxWait\" value=\"5000\" />\n        <property name=\"poolPreparedStatements\" value=\"true\" />\n        <property name=\"maxOpenPreparedStatements\" value=\"10\" />\t    \n\t</bean>\t\n\t\n\t<bean id=\"configDataSource\" destroy-method=\"close\"\n\t  class=\"org.apache.commons.dbcp.BasicDataSource\">\n\t    <property name=\"driverClassName\" value=\"${db.driver}\"/>\n\t    <property name=\"url\" value=\"${db.url}\"/>\n\t    <property name=\"username\" value=\"${db.username}\"/>\n\t    <property name=\"password\" value=\"${db.password}\"/>\n\t    <property name=\"initialSize\" value=\"3\"/>\n        <property name=\"testWhileIdle\" value=\"true\" />\n        <property name=\"timeBetweenEvictionRunsMillis\" value=\"300000\" />\n        <property name=\"numTestsPerEvictionRun\" value=\"6\" />\n        <property name=\"minEvictableIdleTimeMillis\" value=\"1800000\" />\n        <property name=\"maxActive\" value=\"5\" />\n        <property name=\"maxIdle\" value=\"5\" />\n        <property name=\"maxWait\" value=\"5000\" />\n        <property name=\"poolPreparedStatements\" value=\"true\" />\n        <property name=\"maxOpenPreparedStatements\" value=\"10\" />\t    \n\t</bean>\t\n\n</beans>"
  },
  {
    "path": "src/test/resources/db.properties",
    "content": "db.driver=com.mysql.jdbc.Driver\ndb.url=jdbc:mysql://localhost:3307/pcmDB?allowMultiQueries=true\ndb.username=rest_demo\ndb.password=rest_demo\n\n"
  },
  {
    "path": "src/test/resources/jetty-context.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Configure class=\"org.eclipse.jetty.webapp.WebAppContext\">\n <Call name=\"setAttribute\">\n  <Arg>org.eclipse.jetty.server.webapp.WebInfIncludeJarPattern</Arg>\n  <Arg>^$</Arg>\n </Call>\n</Configure>"
  },
  {
    "path": "src/test/resources/soapui/Test-Demo-REST-Jersey-with-Spring-soapui-project.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<con:soapui-project activeEnvironment=\"Default\" name=\"Test Demo REST Jersey with Spring\" resourceRoot=\"\" soapui-version=\"5.0.0\" abortOnError=\"false\" runType=\"SEQUENTIAL\" xmlns:con=\"http://eviware.com/soapui/config\"><con:settings/><con:interface xsi:type=\"con:RestService\" wadlVersion=\"http://wadl.dev.java.net/2009/02\" name=\"http://localhost:8888\" type=\"rest\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><con:settings/><con:definitionCache type=\"TEXT\" rootPart=\"\"/><con:endpoints><con:endpoint>${#Project#baseUrl}</con:endpoint><con:endpoint>http://localhost:8080/demo-rest-jersey-spring</con:endpoint><con:endpoint>http://localhost:8888/demo-rest-jersey-spring</con:endpoint></con:endpoints><con:resource name=\"podcasts\" path=\"/podcasts/\"><con:settings/><con:parameters><con:parameter><con:name>orderByInsertionDate</con:name><con:style>QUERY</con:style></con:parameter></con:parameters><con:method name=\"GET podcasts\" method=\"GET\"><con:settings/><con:parameters/><con:representation type=\"RESPONSE\"><con:mediaType>application/json</con:mediaType><con:status>200</con:status><con:params/><con:element>Response</con:element></con:representation><con:representation type=\"FAULT\"><con:mediaType>application/json</con:mediaType><con:status>400 500</con:status><con:params/><con:element xmlns:pod=\"http://localhost/demo-rest-jersey-spring/podcasts/\">pod:Fault</con:element></con:representation><con:representation type=\"RESPONSE\"><con:mediaType xsi:nil=\"true\"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type=\"RESPONSE\"><con:mediaType xsi:nil=\"true\"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type=\"RESPONSE\"><con:mediaType>application/xml</con:mediaType><con:status>200</con:status><con:params/><con:element>podcasts</con:element></con:representation><con:request name=\"Request 1\" mediaType=\"application/json\"><con:settings><con:setting id=\"com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers\">&lt;xml-fragment/></con:setting></con:settings><con:endpoint>${#Project#baseUrl}</con:endpoint><con:request/><con:originalUri>http://localhost/demo-rest-jersey-spring/podcasts/</con:originalUri><con:credentials><con:username xsi:nil=\"true\"/><con:password xsi:nil=\"true\"/><con:domain xsi:nil=\"true\"/><con:authType>No Authorization</con:authType></con:credentials><con:jmsConfig JMSDeliveryMode=\"PERSISTENT\"/><con:jmsPropertyConfig/><con:parameters/><con:parameterOrder><con:entry/></con:parameterOrder></con:request></con:method><con:method name=\"POST new podcast with JSON\" method=\"POST\"><con:settings/><con:parameters/><con:representation type=\"FAULT\"><con:mediaType>application/json</con:mediaType><con:status>406 500 409 400</con:status><con:params/><con:element xmlns:pod=\"http://localhost/demo-rest-jersey-spring/podcasts/\">pod:Fault</con:element></con:representation><con:representation type=\"REQUEST\"><con:mediaType>application/json</con:mediaType><con:params/></con:representation><con:representation type=\"RESPONSE\"><con:mediaType xsi:nil=\"true\"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type=\"RESPONSE\"><con:mediaType xsi:nil=\"true\"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type=\"RESPONSE\"><con:mediaType>text/html</con:mediaType><con:status>201</con:status><con:params/><con:element>html</con:element></con:representation><con:representation type=\"RESPONSE\"><con:mediaType xsi:nil=\"true\"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type=\"RESPONSE\"><con:mediaType xsi:nil=\"true\"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type=\"RESPONSE\"><con:mediaType xsi:nil=\"true\"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type=\"RESPONSE\"><con:mediaType xsi:nil=\"true\"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:request name=\"Request 1\" mediaType=\"application/json\" postQueryString=\"false\"><con:settings/><con:endpoint>${#Project#baseUrl}</con:endpoint><con:request/><con:credentials><con:username xsi:nil=\"true\"/><con:password xsi:nil=\"true\"/><con:domain xsi:nil=\"true\"/><con:authType>No Authorization</con:authType></con:credentials><con:jmsConfig JMSDeliveryMode=\"PERSISTENT\"/><con:jmsPropertyConfig/><con:parameters/></con:request></con:method><con:method name=\"POST new podcast with form url encoded data\" method=\"POST\"><con:settings/><con:parameters><con:parameter><con:name>title</con:name><con:value/><con:style>QUERY</con:style><con:default/></con:parameter><con:parameter><con:name>linkOnPodcastpedia</con:name><con:value/><con:style>QUERY</con:style><con:default/></con:parameter><con:parameter><con:name>feed</con:name><con:value/><con:style>QUERY</con:style><con:default/></con:parameter><con:parameter><con:name>description</con:name><con:value/><con:style>QUERY</con:style><con:default/></con:parameter></con:parameters><con:representation type=\"FAULT\"><con:mediaType>application/json</con:mediaType><con:status>406 500 409 400 415</con:status><con:params/><con:element xmlns:pod=\"http://localhost/demo-rest-jersey-spring/podcasts/\">pod:Fault</con:element></con:representation><con:representation type=\"REQUEST\"><con:mediaType>application/json</con:mediaType><con:params/></con:representation><con:representation type=\"RESPONSE\"><con:mediaType xsi:nil=\"true\"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type=\"RESPONSE\"><con:mediaType xsi:nil=\"true\"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type=\"RESPONSE\"><con:mediaType>text/html</con:mediaType><con:status>201</con:status><con:params/><con:element>html</con:element></con:representation><con:representation type=\"RESPONSE\"><con:mediaType xsi:nil=\"true\"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type=\"REQUEST\"><con:mediaType>multipart/form-data</con:mediaType><con:params/></con:representation><con:representation type=\"REQUEST\"><con:mediaType>application/x-www-form-urlencoded</con:mediaType><con:params/></con:representation><con:request name=\"Request 1\" mediaType=\"application/x-www-form-urlencoded\" postQueryString=\"true\"><con:settings><con:setting id=\"com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers\">&lt;xml-fragment/></con:setting></con:settings><con:endpoint>${#Project#baseUrl}</con:endpoint><con:request/><con:originalUri>http://localhost/demo-rest-jersey-spring/podcasts/</con:originalUri><con:credentials><con:username xsi:nil=\"true\"/><con:password xsi:nil=\"true\"/><con:domain xsi:nil=\"true\"/><con:authType>No Authorization</con:authType></con:credentials><con:jmsConfig JMSDeliveryMode=\"PERSISTENT\"/><con:jmsPropertyConfig/><con:parameters/><con:parameterOrder><con:entry>orderByInsertionDate</con:entry><con:entry>title</con:entry><con:entry>linkOnPodcastpedia</con:entry><con:entry>feed</con:entry><con:entry>description</con:entry></con:parameterOrder></con:request></con:method><con:method name=\"DELETE all podcasts\" method=\"DELETE\"><con:settings/><con:parameters/><con:representation type=\"RESPONSE\"><con:mediaType xsi:nil=\"true\"/><con:status>204</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type=\"RESPONSE\"><con:mediaType xsi:nil=\"true\"/><con:status>204</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type=\"RESPONSE\"><con:mediaType xsi:nil=\"true\"/><con:status>204</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type=\"RESPONSE\"><con:mediaType xsi:nil=\"true\"/><con:status>204</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type=\"RESPONSE\"><con:mediaType xsi:nil=\"true\"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type=\"RESPONSE\"><con:mediaType xsi:nil=\"true\"/><con:status>204</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type=\"FAULT\"><con:mediaType xsi:nil=\"true\"/><con:status>404</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type=\"RESPONSE\"><con:mediaType xsi:nil=\"true\"/><con:status>204</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type=\"RESPONSE\"><con:mediaType xsi:nil=\"true\"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type=\"RESPONSE\"><con:mediaType xsi:nil=\"true\"/><con:status>204</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type=\"RESPONSE\"><con:mediaType xsi:nil=\"true\"/><con:status>204</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type=\"FAULT\"><con:mediaType xsi:nil=\"true\"/><con:status>404</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type=\"FAULT\"><con:mediaType xsi:nil=\"true\"/><con:status>404</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type=\"RESPONSE\"><con:mediaType xsi:nil=\"true\"/><con:status>204</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type=\"RESPONSE\"><con:mediaType xsi:nil=\"true\"/><con:status>204</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type=\"FAULT\"><con:mediaType>application/json</con:mediaType><con:status>500</con:status><con:params/><con:element xmlns:pod=\"http://localhost/demo-rest-jersey-spring/podcasts/\">pod:Fault</con:element></con:representation><con:representation type=\"RESPONSE\"><con:mediaType xsi:nil=\"true\"/><con:status>204</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type=\"RESPONSE\"><con:mediaType xsi:nil=\"true\"/><con:status>204</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type=\"RESPONSE\"><con:mediaType xsi:nil=\"true\"/><con:status>204</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type=\"RESPONSE\"><con:mediaType xsi:nil=\"true\"/><con:status>204</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type=\"RESPONSE\"><con:mediaType xsi:nil=\"true\"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type=\"RESPONSE\"><con:mediaType xsi:nil=\"true\"/><con:status>204</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type=\"RESPONSE\"><con:mediaType xsi:nil=\"true\"/><con:status>204</con:status><con:params/><con:element>data</con:element></con:representation><con:request name=\"Request 1\" mediaType=\"application/json\"><con:settings/><con:endpoint>${#Project#baseUrl}</con:endpoint><con:request/><con:credentials><con:username xsi:nil=\"true\"/><con:password xsi:nil=\"true\"/><con:domain xsi:nil=\"true\"/><con:authType>No Authorization</con:authType></con:credentials><con:jmsConfig JMSDeliveryMode=\"PERSISTENT\"/><con:jmsPropertyConfig/><con:parameters/></con:request></con:method></con:resource><con:resource name=\"{id}\" path=\"/podcasts/{id}\"><con:settings/><con:parameters><con:parameter><con:name>id</con:name><con:value>id</con:value><con:style>TEMPLATE</con:style><con:default>id</con:default></con:parameter></con:parameters><con:method name=\"GET podcast by {id}\" method=\"GET\"><con:settings/><con:parameters/><con:representation type=\"RESPONSE\"><con:mediaType>application/json</con:mediaType><con:status>200</con:status><con:params/><con:element xmlns:ns=\"http://localhost/demo-rest-jersey-spring/podcasts/1\">ns:Response</con:element></con:representation><con:representation type=\"FAULT\"><con:mediaType>application/json</con:mediaType><con:status>404 500</con:status><con:params/><con:element xmlns:pod=\"http://localhost/demo-rest-jersey-spring/podcasts/\">pod:Fault</con:element></con:representation><con:representation type=\"RESPONSE\"><con:mediaType xsi:nil=\"true\"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type=\"FAULT\"><con:mediaType xsi:nil=\"true\"/><con:status>404</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type=\"FAULT\"><con:mediaType xsi:nil=\"true\"/><con:status>404</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type=\"RESPONSE\"><con:mediaType xsi:nil=\"true\"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type=\"RESPONSE\"><con:mediaType>application/xml</con:mediaType><con:status>200</con:status><con:params/><con:element>podcast</con:element></con:representation><con:representation type=\"FAULT\"><con:mediaType>text/html; charset=ISO-8859-1</con:mediaType><con:status>404</con:status><con:params/><con:element>html</con:element></con:representation><con:representation type=\"RESPONSE\"><con:mediaType xsi:nil=\"true\"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:request name=\"Request 1\" mediaType=\"application/json\"><con:settings><con:setting id=\"com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers\">&lt;xml-fragment/></con:setting></con:settings><con:endpoint>${#Project#baseUrl}</con:endpoint><con:request/><con:originalUri>http://localhost/demo-rest-jersey-spring/podcasts/1</con:originalUri><con:credentials><con:username xsi:nil=\"true\"/><con:password xsi:nil=\"true\"/><con:domain xsi:nil=\"true\"/><con:authType>No Authorization</con:authType></con:credentials><con:jmsConfig JMSDeliveryMode=\"PERSISTENT\"/><con:jmsPropertyConfig/><con:parameters><entry key=\"id\" value=\"1\" xmlns=\"http://eviware.com/soapui/config\"/></con:parameters></con:request></con:method><con:method name=\"PUT podcast by {id}\" method=\"PUT\"><con:settings/><con:parameters/><con:representation type=\"FAULT\"><con:mediaType>application/json</con:mediaType><con:status>405 404 500 400</con:status><con:params/><con:element xmlns:ns=\"http://localhost/demo-rest-jersey-spring/podcasts/2\">ns:Fault</con:element></con:representation><con:representation type=\"REQUEST\"><con:mediaType>application/json</con:mediaType><con:params/></con:representation><con:representation type=\"RESPONSE\"><con:mediaType xsi:nil=\"true\"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type=\"RESPONSE\"><con:mediaType>text/html</con:mediaType><con:status>201 200</con:status><con:params/><con:element>html</con:element></con:representation><con:representation type=\"FAULT\"><con:mediaType>text/plain</con:mediaType><con:status>400</con:status><con:params/><con:element>data</con:element></con:representation><con:request name=\"Request 1\" mediaType=\"application/json\" postQueryString=\"false\"><con:settings/><con:endpoint>${#Project#baseUrl}</con:endpoint><con:request/><con:credentials><con:username xsi:nil=\"true\"/><con:password xsi:nil=\"true\"/><con:domain xsi:nil=\"true\"/><con:authType>No Authorization</con:authType></con:credentials><con:jmsConfig JMSDeliveryMode=\"PERSISTENT\"/><con:jmsPropertyConfig/><con:parameters><entry key=\"id\" value=\"1\" xmlns=\"http://eviware.com/soapui/config\"/></con:parameters></con:request></con:method><con:method name=\"POST (partial update) podcast by {id}\" method=\"POST\"><con:settings/><con:parameters/><con:representation type=\"REQUEST\"><con:mediaType>application/json</con:mediaType><con:params/></con:representation><con:representation type=\"FAULT\"><con:mediaType>application/json</con:mediaType><con:status>400 404 500</con:status><con:params/><con:element xmlns:ns=\"http://localhost/demo-rest-jersey-spring/podcasts/3\">ns:Fault</con:element></con:representation><con:representation type=\"RESPONSE\"><con:mediaType>text/html</con:mediaType><con:status>200</con:status><con:params/><con:element>html</con:element></con:representation><con:representation type=\"RESPONSE\"><con:mediaType xsi:nil=\"true\"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type=\"RESPONSE\"><con:mediaType xsi:nil=\"true\"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:request name=\"Request 1\" mediaType=\"application/json\" postQueryString=\"false\"><con:settings/><con:endpoint>${#Project#baseUrl}</con:endpoint><con:request/><con:credentials><con:username xsi:nil=\"true\"/><con:password xsi:nil=\"true\"/><con:domain xsi:nil=\"true\"/><con:authType>No Authorization</con:authType></con:credentials><con:jmsConfig JMSDeliveryMode=\"PERSISTENT\"/><con:jmsPropertyConfig/><con:parameters/></con:request></con:method><con:method name=\"DELETE podcast by {id}\" method=\"DELETE\"><con:settings/><con:parameters/><con:representation type=\"RESPONSE\"><con:mediaType xsi:nil=\"true\"/><con:status>204</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type=\"RESPONSE\"><con:mediaType xsi:nil=\"true\"/><con:status>204</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type=\"RESPONSE\"><con:mediaType xsi:nil=\"true\"/><con:status>204</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type=\"RESPONSE\"><con:mediaType xsi:nil=\"true\"/><con:status>204</con:status><con:params/><con:element>data</con:element></con:representation><con:request name=\"Request 1\" mediaType=\"application/json\"><con:settings/><con:endpoint>${#Project#baseUrl}</con:endpoint><con:request/><con:credentials><con:username xsi:nil=\"true\"/><con:password xsi:nil=\"true\"/><con:domain xsi:nil=\"true\"/><con:authType>No Authorization</con:authType></con:credentials><con:jmsConfig JMSDeliveryMode=\"PERSISTENT\"/><con:jmsPropertyConfig/><con:parameters/></con:request></con:method><con:method name=\"Do a HEAD\" method=\"HEAD\"><con:settings/><con:parameters/><con:representation type=\"RESPONSE\"><con:mediaType xsi:nil=\"true\"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:request name=\"Request 1\" mediaType=\"application/json\"><con:settings><con:setting id=\"com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers\">&lt;xml-fragment/></con:setting></con:settings><con:endpoint>${#Project#baseUrl}</con:endpoint><con:request/><con:originalUri>http://localhost/demo-rest-jersey-spring/podcasts/1</con:originalUri><con:credentials><con:username xsi:nil=\"true\"/><con:password xsi:nil=\"true\"/><con:domain xsi:nil=\"true\"/><con:authType>No Authorization</con:authType></con:credentials><con:jmsConfig JMSDeliveryMode=\"PERSISTENT\"/><con:jmsPropertyConfig/><con:parameters><entry key=\"id\" value=\"1\" xmlns=\"http://eviware.com/soapui/config\"/></con:parameters></con:request></con:method></con:resource><con:resource name=\"manifest\" path=\"/manifest\"><con:settings/><con:parameters/><con:resource name=\"manifest-attributes\" path=\"implementation-details\"><con:settings/><con:parameters/><con:method name=\"Method 1\" method=\"GET\"><con:settings/><con:parameters/><con:representation type=\"FAULT\"><con:mediaType>application/json</con:mediaType><con:status>500</con:status><con:params/><con:element xmlns:man=\"http://localhost/demo-rest-jersey-spring/version/manifest-attributes\">man:Fault</con:element></con:representation><con:representation type=\"RESPONSE\"><con:mediaType>application/json</con:mediaType><con:status>200</con:status><con:params/><con:element>Response</con:element></con:representation><con:representation type=\"RESPONSE\"><con:mediaType>application/xml</con:mediaType><con:status>200</con:status><con:params/><con:element>implementationDetails</con:element></con:representation><con:representation type=\"FAULT\"><con:mediaType>text/html; charset=ISO-8859-1</con:mediaType><con:status>401</con:status><con:params/><con:element>html</con:element></con:representation><con:representation type=\"FAULT\"><con:mediaType>text/html;charset=utf-8</con:mediaType><con:status>401</con:status><con:params/><con:element>html</con:element></con:representation><con:request name=\"Request 1\" mediaType=\"application/json\"><con:settings><con:setting id=\"com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers\">&lt;entry key=\"accept\" value=\"application/json\" xmlns=\"http://eviware.com/soapui/config\"/></con:setting></con:settings><con:endpoint>${#Project#baseUrl}</con:endpoint><con:request/><con:originalUri>http://localhost/demo-rest-jersey-spring/version/manifest-attributes</con:originalUri><con:credentials><con:username xsi:nil=\"true\"/><con:password xsi:nil=\"true\"/><con:domain xsi:nil=\"true\"/><con:authType>No Authorization</con:authType></con:credentials><con:jmsConfig JMSDeliveryMode=\"PERSISTENT\"/><con:jmsPropertyConfig/><con:parameters/></con:request></con:method></con:resource><con:method name=\"Method 1\" method=\"GET\"><con:settings/><con:parameters/><con:representation type=\"FAULT\"><con:mediaType>text/html; charset=ISO-8859-1</con:mediaType><con:status>404 500 401</con:status><con:params/><con:element>html</con:element></con:representation><con:representation type=\"FAULT\"><con:mediaType>application/json</con:mediaType><con:status>500 404</con:status><con:params/><con:element xmlns:ver=\"http://localhost/version\">ver:Fault</con:element></con:representation><con:representation type=\"RESPONSE\"><con:mediaType xsi:nil=\"true\"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type=\"RESPONSE\"><con:mediaType>application/xml</con:mediaType><con:status>200</con:status><con:params/><con:element>versionResponse</con:element></con:representation><con:representation type=\"RESPONSE\"><con:mediaType>application/json</con:mediaType><con:status>200</con:status><con:params/><con:element xmlns:ver=\"http://localhost/version\">ver:Response</con:element></con:representation><con:representation type=\"RESPONSE\"><con:mediaType xsi:nil=\"true\"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type=\"RESPONSE\"><con:mediaType xsi:nil=\"true\"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type=\"RESPONSE\"><con:mediaType xsi:nil=\"true\"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type=\"RESPONSE\"><con:mediaType xsi:nil=\"true\"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type=\"RESPONSE\"><con:mediaType xsi:nil=\"true\"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type=\"RESPONSE\"><con:mediaType xsi:nil=\"true\"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type=\"FAULT\"><con:mediaType>text/html;charset=utf-8</con:mediaType><con:status>401</con:status><con:params/><con:element>html</con:element></con:representation><con:request name=\"Request 1\" mediaType=\"application/json\"><con:settings><con:setting id=\"com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers\">&lt;entry key=\"Accept\" value=\"application/json\" xmlns=\"http://eviware.com/soapui/config\"/></con:setting></con:settings><con:endpoint>${#Project#baseUrl}</con:endpoint><con:request/><con:originalUri>http://localhost/version</con:originalUri><con:credentials><con:username xsi:nil=\"true\"/><con:password xsi:nil=\"true\"/><con:domain xsi:nil=\"true\"/><con:authType>No Authorization</con:authType></con:credentials><con:jmsConfig JMSDeliveryMode=\"PERSISTENT\"/><con:jmsPropertyConfig/><con:parameters/></con:request></con:method></con:resource></con:interface><con:testSuite name=\"CRUD podcasts TestSuite\"><con:settings/><con:runType>SEQUENTIAL</con:runType><con:testCase failOnError=\"true\" failTestCaseOnErrors=\"true\" keepSession=\"false\" maxResults=\"0\" name=\"Create podcast resource\" searchProperties=\"true\" id=\"fc29773f-3919-4f97-932c-0be066273d12\"><con:settings/><con:testStep type=\"properties\" name=\"Properties\"><con:settings/><con:config xsi:type=\"con:PropertiesStep\" saveFirst=\"true\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><con:properties><con:property><con:name>sysdate</con:name><con:value/></con:property></con:properties></con:config></con:testStep><con:testStep type=\"restrequest\" name=\"_prepare : DELETE all podcasts - 204 (NO_CONTENT)\"><con:settings/><con:config service=\"http://localhost:8888\" resourcePath=\"/podcasts/\" methodName=\"DELETE all podcasts\" xsi:type=\"con:RestRequestStep\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><con:restRequest name=\"_prepare : DELETE all podcasts - 204 (NO_CONTENT)\" mediaType=\"application/json\"><con:settings><con:setting id=\"com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers\">&lt;xml-fragment/></con:setting></con:settings><con:endpoint>${#Project#baseUrl}</con:endpoint><con:request/><con:originalUri>http://localhost/demo-rest-jersey-spring/podcasts/</con:originalUri><con:assertion type=\"Valid HTTP Status Codes\" name=\"Valid HTTP Status Codes - 204 No Content\"><con:configuration><codes>204</codes></con:configuration></con:assertion><con:credentials><con:username xsi:nil=\"true\"/><con:password xsi:nil=\"true\"/><con:domain xsi:nil=\"true\"/><con:authType>No Authorization</con:authType></con:credentials><con:jmsConfig JMSDeliveryMode=\"PERSISTENT\"/><con:jmsPropertyConfig/><con:parameters/></con:restRequest></con:config></con:testStep><con:testStep type=\"restrequest\" name=\"POST new podcast without feed - 400 (BAD_REQUEST)\"><con:settings/><con:config service=\"http://localhost:8888\" resourcePath=\"/podcasts/\" methodName=\"POST new podcast with JSON\" xsi:type=\"con:RestRequestStep\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><con:restRequest name=\"POST new podcast without feed - 400 (BAD_REQUEST)\" mediaType=\"application/json\" postQueryString=\"false\"><con:settings><con:setting id=\"com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers\">&lt;xml-fragment/></con:setting></con:settings><con:endpoint>${#Project#baseUrl}</con:endpoint><con:request>{\n\t\"title\":\"- The Naked Scientists Podcast - Stripping Down Science-new-title2\",\n\t\"linkOnPodcastpedia\":\"http://www.podcastpedia.org/podcasts/792/-The-Naked-Scientists-Podcast-Stripping-Down-Science\",\n\t\"description\":\"The Naked Scientists flagship science show brings you a lighthearted look at the latest scientific breakthroughs, interviews with the world top scientists, answers to your science questions and science experiments to try at home.\"\n}</con:request><con:originalUri>http://localhost/demo-rest-jersey-spring/podcasts/</con:originalUri><con:assertion type=\"Valid HTTP Status Codes\" name=\"Valid HTTP Status Codes - 400 Bad Request\"><con:configuration><codes>400</codes></con:configuration></con:assertion><con:assertion type=\"Simple Contains\" name=\"Contains error message\"><con:configuration><token>Please verify that the feed is properly generated/set</token><ignoreCase>false</ignoreCase><useRegEx>false</useRegEx></con:configuration></con:assertion><con:credentials><con:username xsi:nil=\"true\"/><con:password xsi:nil=\"true\"/><con:domain xsi:nil=\"true\"/><con:authType>No Authorization</con:authType></con:credentials><con:jmsConfig JMSDeliveryMode=\"PERSISTENT\"/><con:jmsPropertyConfig/><con:parameters/></con:restRequest></con:config></con:testStep><con:testStep type=\"restrequest\" name=\"POST new podcast without title - 400 (BAD_REQUEST)\"><con:settings/><con:config service=\"http://localhost:8888\" resourcePath=\"/podcasts/\" methodName=\"POST new podcast with JSON\" xsi:type=\"con:RestRequestStep\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><con:restRequest name=\"POST new podcast without title - 400 (BAD_REQUEST)\" mediaType=\"application/json\" postQueryString=\"false\"><con:settings><con:setting id=\"com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers\">&lt;xml-fragment/></con:setting></con:settings><con:endpoint>${#Project#baseUrl}</con:endpoint><con:request>{\n\t\"linkOnPodcastpedia\":\"http://www.podcastpedia.org/podcasts/792/-The-Naked-Scientists-Podcast-Stripping-Down-Science\",\n\t\"feed\":\"http://www.thenakedscientists.com/naked_scientists_podcast.xml33\",\n\t\"description\":\"The Naked Scientists flagship science show brings you a lighthearted look at the latest scientific breakthroughs, interviews with the world top scientists, answers to your science questions and science experiments to try at home.\"\n}</con:request><con:originalUri>http://localhost/demo-rest-jersey-spring/podcasts/</con:originalUri><con:assertion type=\"Valid HTTP Status Codes\" name=\"Valid HTTP Status Codes - 400 Bad Request\"><con:configuration><codes>400</codes></con:configuration></con:assertion><con:assertion type=\"Simple Contains\" name=\"Contains error message\"><con:configuration><token>Please verify that the title is properly generated/set</token><ignoreCase>false</ignoreCase><useRegEx>false</useRegEx></con:configuration></con:assertion><con:credentials><con:username xsi:nil=\"true\"/><con:password xsi:nil=\"true\"/><con:domain xsi:nil=\"true\"/><con:authType>No Authorization</con:authType></con:credentials><con:jmsConfig JMSDeliveryMode=\"PERSISTENT\"/><con:jmsPropertyConfig/><con:parameters/></con:restRequest></con:config></con:testStep><con:testStep type=\"restrequest\" name=\"POST new podcast correctly - 201 (CREATED)\"><con:settings/><con:config service=\"http://localhost:8888\" resourcePath=\"/podcasts/\" methodName=\"POST new podcast with JSON\" xsi:type=\"con:RestRequestStep\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><con:restRequest name=\"POST new podcast correctly - 201 (CREATED)\" mediaType=\"application/json\" postQueryString=\"false\"><con:settings><con:setting id=\"com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers\">&lt;xml-fragment/></con:setting></con:settings><con:endpoint>${#Project#baseUrl}</con:endpoint><con:request>{\n\"title\":\"- The Naked Scientists Podcast - Stripping Down Science\",\n\"linkOnPodcastpedia\":\"http://www.podcastpedia.org/podcasts/792/-The-Naked-Scientists-Podcast-Stripping-Down-Science\",\n\"feed\":\"feed_placeholder\",\n\"description\":\"The Naked Scientists flagship science show brings you a lighthearted look at the latest scientific breakthroughs, interviews with the world top scientists, answers to your science questions and science experiments to try at home.\"\n}</con:request><con:originalUri>http://localhost/demo-rest-jersey-spring/podcasts/</con:originalUri><con:assertion type=\"Valid HTTP Status Codes\" name=\"Valid HTTP Status Codes - 201 Created\"><con:configuration><codes>201</codes></con:configuration></con:assertion><con:assertion type=\"GroovyScriptAssertion\" name=\"Verify &quot;Location&quot; header\"><con:configuration><scriptText>//// check for the location header\nassert messageExchange.responseHeaders[\"Location\"] != \"http://localhost:8888/demo-rest-jersey-spring/podcasts/1\"</scriptText></con:configuration></con:assertion><con:credentials><con:username xsi:nil=\"true\"/><con:password xsi:nil=\"true\"/><con:domain xsi:nil=\"true\"/><con:authType>No Authorization</con:authType></con:credentials><con:jmsConfig JMSDeliveryMode=\"PERSISTENT\"/><con:jmsPropertyConfig/><con:parameters/></con:restRequest></con:config></con:testStep><con:testStep type=\"restrequest\" name=\"POST same podcast as before to receive - 409 (CONFLICT)\"><con:settings/><con:config service=\"http://localhost:8888\" resourcePath=\"/podcasts/\" methodName=\"POST new podcast with JSON\" xsi:type=\"con:RestRequestStep\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><con:restRequest name=\"POST same podcast as before to receive - 409 (CONFLICT)\" mediaType=\"application/json\" postQueryString=\"false\"><con:settings><con:setting id=\"com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers\">&lt;xml-fragment/></con:setting></con:settings><con:endpoint>${#Project#baseUrl}</con:endpoint><con:request>{\n\t\"title\":\"- The Naked Scientists Podcast - Stripping Down Science\",\n\t\"linkOnPodcastpedia\":\"http://www.podcastpedia.org/podcasts/792/-The-Naked-Scientists-Podcast-Stripping-Down-Science\",\n\t\"feed\":\"feed_placeholder\",\n\t\"description\":\"The Naked Scientists flagship science show brings you a lighthearted look at the latest scientific breakthroughs, interviews with the world top scientists, answers to your science questions and science experiments to try at home.\"\n}</con:request><con:originalUri>http://localhost/demo-rest-jersey-spring/podcasts/</con:originalUri><con:assertion type=\"Valid HTTP Status Codes\" name=\"Valid HTTP status - 409 Conflict\"><con:configuration><codes>409</codes></con:configuration></con:assertion><con:credentials><con:username xsi:nil=\"true\"/><con:password xsi:nil=\"true\"/><con:domain xsi:nil=\"true\"/><con:authType>No Authorization</con:authType></con:credentials><con:jmsConfig JMSDeliveryMode=\"PERSISTENT\"/><con:jmsPropertyConfig/><con:parameters/></con:restRequest></con:config></con:testStep><con:testStep type=\"restrequest\" name=\"PUT new podcast at location - 201 (CREATED)\"><con:settings/><con:config service=\"http://localhost:8888\" resourcePath=\"/podcasts/{id}\" methodName=\"PUT podcast by {id}\" xsi:type=\"con:RestRequestStep\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><con:restRequest name=\"PUT new podcast at location - 201 (CREATED)\" mediaType=\"application/json\" postQueryString=\"false\"><con:settings><con:setting id=\"com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers\">&lt;xml-fragment/></con:setting></con:settings><con:endpoint>${#Project#baseUrl}</con:endpoint><con:request>{\n\t\"id\":2,\n\t\"title\":\"Quarks &amp; Co - zum Mitnehmen\",\n\t\"linkOnPodcastpedia\":\"http://www.podcastpedia.org/quarks\",\n\t\"feed\":\"http://podcast.wdr.de/quarks.xml\",\n\t\"description\":\"Quarks &amp; Co: Das Wissenschaftsmagazin\"\n}</con:request><con:originalUri>http://localhost/demo-rest-jersey-spring/podcasts/2</con:originalUri><con:assertion type=\"Valid HTTP Status Codes\" name=\"Valid HTTP Status Codes - 201 Created\"><con:configuration><codes>201</codes></con:configuration></con:assertion><con:assertion type=\"GroovyScriptAssertion\" name=\"Verify &quot;Location&quot; header\"><con:configuration><scriptText>// check for the amazon id header\nassert messageExchange.responseHeaders[\"Location\"] != \"http://localhost:8888/demo-rest-jersey-spring/podcasts/2\"</scriptText></con:configuration></con:assertion><con:credentials><con:username xsi:nil=\"true\"/><con:password xsi:nil=\"true\"/><con:domain xsi:nil=\"true\"/><con:authType>No Authorization</con:authType></con:credentials><con:jmsConfig JMSDeliveryMode=\"PERSISTENT\"/><con:jmsPropertyConfig/><con:parameters><entry key=\"id\" value=\"2\" xmlns=\"http://eviware.com/soapui/config\"/></con:parameters></con:restRequest></con:config></con:testStep><con:properties/></con:testCase><con:testCase failOnError=\"true\" failTestCaseOnErrors=\"true\" keepSession=\"false\" maxResults=\"0\" name=\"Read podcast resource\" searchProperties=\"true\" id=\"80911afd-e6bb-4f0d-87b2-5abde5d71499\"><con:settings/><con:testStep type=\"restrequest\" name=\"GET new inserted podcast - 200 (OK)\"><con:settings/><con:config service=\"http://localhost:8888\" resourcePath=\"/podcasts/{id}\" methodName=\"GET podcast by {id}\" xsi:type=\"con:RestRequestStep\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><con:restRequest name=\"GET new inserted podcast - 200 (OK)\" mediaType=\"application/json\"><con:settings><con:setting id=\"com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers\">&lt;entry key=\"Accept\" value=\"application/json, application/xml\" xmlns=\"http://eviware.com/soapui/config\"/></con:setting><con:setting id=\"RecordRequestRepresentations\">true</con:setting></con:settings><con:endpoint>${#Project#baseUrl}</con:endpoint><con:request/><con:originalUri>http://localhost/demo-rest-jersey-spring/podcasts/</con:originalUri><con:assertion type=\"Valid HTTP Status Codes\" name=\"Valid HTTP Status Codes\"><con:configuration><codes>200</codes></con:configuration></con:assertion><con:assertion type=\"Simple Contains\" name=\"Contains specified &quot;feed&quot; property\"><con:configuration><token>feed_placeholder</token><ignoreCase>false</ignoreCase><useRegEx>false</useRegEx></con:configuration></con:assertion><con:credentials><con:username xsi:nil=\"true\"/><con:password xsi:nil=\"true\"/><con:domain xsi:nil=\"true\"/><con:authType>No Authorization</con:authType></con:credentials><con:jmsConfig JMSDeliveryMode=\"PERSISTENT\"/><con:jmsPropertyConfig/><con:parameters><entry key=\"id\" value=\"1\" xmlns=\"http://eviware.com/soapui/config\"/></con:parameters><con:parameterOrder><con:entry/></con:parameterOrder></con:restRequest></con:config></con:testStep><con:testStep type=\"restrequest\" name=\"GET podcasts sorted by insertion date DESC - 200 (OK)\"><con:settings/><con:config service=\"http://localhost:8888\" resourcePath=\"/podcasts/\" methodName=\"GET podcasts\" xsi:type=\"con:RestRequestStep\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><con:restRequest name=\"GET podcasts sorted by insertion date DESC - 200 (OK)\" mediaType=\"application/json\"><con:settings><con:setting id=\"com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers\">&lt;entry key=\"Accept\" value=\"application/json, application/xml\" xmlns=\"http://eviware.com/soapui/config\"/></con:setting></con:settings><con:endpoint>${#Project#baseUrl}</con:endpoint><con:request/><con:originalUri>http://localhost/demo-rest-jersey-spring/podcasts/</con:originalUri><con:assertion type=\"Valid HTTP Status Codes\" name=\"Valid HTTP Status Codes\"><con:configuration><codes>200</codes></con:configuration></con:assertion><con:assertion type=\"Simple Contains\" name=\"Verify &quot;feed&quot; property\"><con:configuration><token>feed_placeholder</token><ignoreCase>false</ignoreCase><useRegEx>false</useRegEx></con:configuration></con:assertion><con:assertion type=\"Simple Contains\" name=\"Verify &quot;feed&quot; property for second podcast\"><con:configuration><token>http://podcast.wdr.de/quarks.xml</token><ignoreCase>false</ignoreCase><useRegEx>false</useRegEx></con:configuration></con:assertion><con:credentials><con:username xsi:nil=\"true\"/><con:password xsi:nil=\"true\"/><con:domain xsi:nil=\"true\"/><con:authType>No Authorization</con:authType></con:credentials><con:jmsConfig JMSDeliveryMode=\"PERSISTENT\"/><con:jmsPropertyConfig/><con:parameters><entry key=\"orderByInsertionDate\" value=\"DESC\" xmlns=\"http://eviware.com/soapui/config\"/></con:parameters><con:parameterOrder><con:entry/></con:parameterOrder></con:restRequest></con:config></con:testStep><con:properties/></con:testCase><con:testCase failOnError=\"true\" failTestCaseOnErrors=\"true\" keepSession=\"false\" maxResults=\"0\" name=\"Update podcast resource\" searchProperties=\"true\" id=\"20401da1-67cc-46eb-b7dd-c75548cc1269\"><con:settings/><con:testStep type=\"restrequest\" name=\"PUT not &quot;complete&quot; podcast for FULL update - 400 (BAD_REQUEST)\"><con:settings/><con:config service=\"http://localhost:8888\" resourcePath=\"/podcasts/{id}\" methodName=\"PUT podcast by {id}\" xsi:type=\"con:RestRequestStep\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><con:restRequest name=\"PUT not &quot;complete&quot; podcast for FULL update - 400 (BAD_REQUEST)\" mediaType=\"application/json\" postQueryString=\"false\"><con:settings><con:setting id=\"com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers\">&lt;xml-fragment/></con:setting></con:settings><con:endpoint>${#Project#baseUrl}</con:endpoint><con:request>{\n\t\"id\":2,\n\t\"title\":\"Quarks &amp; Co - zum Mitnehmen\",\n\t\"linkOnPodcastpedia\":\"http://www.podcastpedia.org/quarks\",\n\t\"feed\":\"http://podcast.wdr.de/quarks.xml\"\n}</con:request><con:originalUri>http://localhost/demo-rest-jersey-spring/podcasts/2</con:originalUri><con:assertion type=\"Valid HTTP Status Codes\" name=\"Valid HTTP Status Codes\"><con:configuration><codes>400</codes></con:configuration></con:assertion><con:credentials><con:username xsi:nil=\"true\"/><con:password xsi:nil=\"true\"/><con:domain xsi:nil=\"true\"/><con:authType>No Authorization</con:authType></con:credentials><con:jmsConfig JMSDeliveryMode=\"PERSISTENT\"/><con:jmsPropertyConfig/><con:parameters><entry key=\"id\" value=\"2\" xmlns=\"http://eviware.com/soapui/config\"/></con:parameters></con:restRequest></con:config></con:testStep><con:testStep type=\"restrequest\" name=\"PUT podcast for FULL update - 200 (OK)\"><con:settings/><con:config service=\"http://localhost:8888\" resourcePath=\"/podcasts/{id}\" methodName=\"PUT podcast by {id}\" xsi:type=\"con:RestRequestStep\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><con:restRequest name=\"PUT podcast for FULL update - 200 (OK)\" mediaType=\"application/json\" postQueryString=\"false\"><con:settings><con:setting id=\"com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers\">&lt;xml-fragment/></con:setting></con:settings><con:endpoint>${#Project#baseUrl}</con:endpoint><con:request>{\n\t\"id\":2,\n\t\"title\":\"Quarks &amp; Co - zum Mitnehmen\",\n\t\"linkOnPodcastpedia\":\"http://www.podcastpedia.org/quarks\",\n\t\"feed\":\"http://podcast.wdr.de/quarks.xml\",\n\t\"description\":\"Quarks &amp; Co: Das Wissenschaftsmagazin\"\n}</con:request><con:originalUri>http://localhost/demo-rest-jersey-spring/podcasts/2</con:originalUri><con:assertion type=\"Valid HTTP Status Codes\" name=\"Valid HTTP Status Codes\"><con:configuration><codes>200</codes></con:configuration></con:assertion><con:credentials><con:username xsi:nil=\"true\"/><con:password xsi:nil=\"true\"/><con:domain xsi:nil=\"true\"/><con:authType>No Authorization</con:authType></con:credentials><con:jmsConfig JMSDeliveryMode=\"PERSISTENT\"/><con:jmsPropertyConfig/><con:parameters><entry key=\"id\" value=\"2\" xmlns=\"http://eviware.com/soapui/config\"/></con:parameters></con:restRequest></con:config></con:testStep><con:testStep type=\"restrequest\" name=\"POST (partial update) for not existent podcast - 404 (NOT_FOUND)\"><con:settings/><con:config service=\"http://localhost:8888\" resourcePath=\"/podcasts/{id}\" methodName=\"POST (partial update) podcast by {id}\" xsi:type=\"con:RestRequestStep\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><con:restRequest name=\"POST (partial update) for not existent podcast - 404 (NOT_FOUND)\" mediaType=\"application/json\" postQueryString=\"false\"><con:settings><con:setting id=\"com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers\">&lt;xml-fragment/></con:setting></con:settings><con:endpoint>${#Project#baseUrl}</con:endpoint><con:request>{\n\t\"title\":\"Quarks &amp; Co - zum Mitnehmen - GREAT PODCAST\"\n}</con:request><con:originalUri>http://localhost/demo-rest-jersey-spring/podcasts/3</con:originalUri><con:assertion type=\"Valid HTTP Status Codes\" name=\"Valid HTTP Status Codes\"><con:configuration><codes>404</codes></con:configuration></con:assertion><con:credentials><con:username xsi:nil=\"true\"/><con:password xsi:nil=\"true\"/><con:domain xsi:nil=\"true\"/><con:authType>No Authorization</con:authType></con:credentials><con:jmsConfig JMSDeliveryMode=\"PERSISTENT\"/><con:jmsPropertyConfig/><con:parameters><entry key=\"id\" value=\"3\" xmlns=\"http://eviware.com/soapui/config\"/></con:parameters></con:restRequest></con:config></con:testStep><con:testStep type=\"restrequest\" name=\"POST (partial update) podcast - 200 (OK)\"><con:settings/><con:config service=\"http://localhost:8888\" resourcePath=\"/podcasts/{id}\" methodName=\"POST (partial update) podcast by {id}\" xsi:type=\"con:RestRequestStep\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><con:restRequest name=\"POST (partial update) podcast - 200 (OK)\" mediaType=\"application/json\" postQueryString=\"false\"><con:settings><con:setting id=\"com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers\">&lt;xml-fragment/></con:setting></con:settings><con:endpoint>${#Project#baseUrl}</con:endpoint><con:request>{\n\t\"title\":\"Quarks &amp; Co - zum Mitnehmen - GREAT PODCAST\"\n}</con:request><con:originalUri>http://localhost/demo-rest-jersey-spring/podcasts/3</con:originalUri><con:assertion type=\"Valid HTTP Status Codes\" name=\"Valid HTTP Status Codes\"><con:configuration><codes>200</codes></con:configuration></con:assertion><con:credentials><con:username xsi:nil=\"true\"/><con:password xsi:nil=\"true\"/><con:domain xsi:nil=\"true\"/><con:authType>No Authorization</con:authType></con:credentials><con:jmsConfig JMSDeliveryMode=\"PERSISTENT\"/><con:jmsPropertyConfig/><con:parameters><entry key=\"id\" value=\"2\" xmlns=\"http://eviware.com/soapui/config\"/></con:parameters></con:restRequest></con:config></con:testStep><con:properties/></con:testCase><con:testCase failOnError=\"true\" failTestCaseOnErrors=\"true\" keepSession=\"false\" maxResults=\"0\" name=\"Delete podcast resource\" searchProperties=\"true\" id=\"246dc87a-024d-443a-a540-6e7bac95de76\"><con:settings/><con:testStep type=\"restrequest\" name=\"DELETE second inserted podcast - 204 (NO_CONTENT)\"><con:settings/><con:config service=\"http://localhost:8888\" resourcePath=\"/podcasts/{id}\" methodName=\"DELETE podcast by {id}\" xsi:type=\"con:RestRequestStep\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><con:restRequest name=\"DELETE second inserted podcast - 204 (NO_CONTENT)\" mediaType=\"application/json\"><con:settings><con:setting id=\"com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers\">&lt;xml-fragment/></con:setting></con:settings><con:endpoint>${#Project#baseUrl}</con:endpoint><con:request/><con:originalUri>http://localhost/demo-rest-jersey-spring/podcasts/2</con:originalUri><con:assertion type=\"Valid HTTP Status Codes\" name=\"Valid HTTP Status Codes\"><con:configuration><codes>204</codes></con:configuration></con:assertion><con:credentials><con:username xsi:nil=\"true\"/><con:password xsi:nil=\"true\"/><con:domain xsi:nil=\"true\"/><con:authType>No Authorization</con:authType></con:credentials><con:jmsConfig JMSDeliveryMode=\"PERSISTENT\"/><con:jmsPropertyConfig/><con:parameters><entry key=\"id\" value=\"2\" xmlns=\"http://eviware.com/soapui/config\"/></con:parameters></con:restRequest></con:config></con:testStep><con:testStep type=\"restrequest\" name=\"GET deleted podcast - 404 (NOT_FOUND)\"><con:settings/><con:config service=\"http://localhost:8888\" resourcePath=\"/podcasts/{id}\" methodName=\"GET podcast by {id}\" xsi:type=\"con:RestRequestStep\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><con:restRequest name=\"GET deleted podcast - 404 (NOT_FOUND)\" mediaType=\"application/json\"><con:settings><con:setting id=\"com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers\">&lt;xml-fragment/></con:setting><con:setting id=\"RecordRequestRepresentations\">true</con:setting></con:settings><con:endpoint>${#Project#baseUrl}</con:endpoint><con:request/><con:originalUri>http://localhost/demo-rest-jersey-spring/podcasts/</con:originalUri><con:assertion type=\"Valid HTTP Status Codes\" name=\"Valid HTTP Status Codes\"><con:configuration><codes>404</codes></con:configuration></con:assertion><con:credentials><con:username xsi:nil=\"true\"/><con:password xsi:nil=\"true\"/><con:domain xsi:nil=\"true\"/><con:authType>No Authorization</con:authType></con:credentials><con:jmsConfig JMSDeliveryMode=\"PERSISTENT\"/><con:jmsPropertyConfig/><con:parameters><entry key=\"id\" value=\"2\" xmlns=\"http://eviware.com/soapui/config\"/></con:parameters><con:parameterOrder><con:entry/></con:parameterOrder></con:restRequest></con:config></con:testStep><con:properties/></con:testCase><con:testCase failOnError=\"true\" failTestCaseOnErrors=\"true\" keepSession=\"false\" maxResults=\"0\" name=\"Bonus operations\" searchProperties=\"true\" id=\"e1fea66b-faec-4c42-ae03-19087cadb4fc\"><con:settings/><con:testStep type=\"restrequest\" name=\"add podcast from application form urlencoded\"><con:settings/><con:config service=\"http://localhost:8888\" resourcePath=\"/podcasts/\" methodName=\"POST new podcast with form url encoded data\" xsi:type=\"con:RestRequestStep\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><con:restRequest name=\"add podcast from application form urlencoded\" mediaType=\"application/x-www-form-urlencoded\" postQueryString=\"true\"><con:settings><con:setting id=\"com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers\">&lt;xml-fragment/></con:setting></con:settings><con:endpoint>${#Project#baseUrl}</con:endpoint><con:request/><con:originalUri>http://localhost/demo-rest-jersey-spring/podcasts/</con:originalUri><con:credentials><con:username xsi:nil=\"true\"/><con:password xsi:nil=\"true\"/><con:domain xsi:nil=\"true\"/><con:authType>No Authorization</con:authType></con:credentials><con:jmsConfig JMSDeliveryMode=\"PERSISTENT\"/><con:jmsPropertyConfig/><con:parameters>\n  <con:entry key=\"title\" value=\"Day in Tech History\"/>\n  <con:entry key=\"feed\" value=\"http://www.dayintechhistory.com/feed/podcast-2\"/>\n  <con:entry key=\"linkOnPodcastpedia\" value=\"http://www.podcastpedia.org/podcasts/766/Day-in-Tech-History\"/>\n</con:parameters><con:parameterOrder><con:entry>orderByInsertionDate</con:entry><con:entry>title</con:entry><con:entry>linkOnPodcastpedia</con:entry><con:entry>feed</con:entry><con:entry>description</con:entry></con:parameterOrder></con:restRequest></con:config></con:testStep><con:properties/></con:testCase><con:properties/></con:testSuite><con:testSuite name=\"Check API alive\"><con:settings/><con:runType>SEQUENTIAL</con:runType><con:testCase failOnError=\"true\" failTestCaseOnErrors=\"true\" keepSession=\"false\" maxResults=\"0\" name=\"Get Manifest details\" searchProperties=\"true\" id=\"74432ac9-2589-40ad-976a-234c00455cba\"><con:settings/><con:testStep type=\"restrequest\" name=\"GET manifest\"><con:settings/><con:config service=\"http://localhost:8888\" resourcePath=\"/manifest\" methodName=\"Method 1\" xsi:type=\"con:RestRequestStep\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><con:restRequest name=\"GET manifest\" mediaType=\"application/json\"><con:settings><con:setting id=\"com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers\">&lt;entry key=\"Accept\" value=\"application/json\" xmlns=\"http://eviware.com/soapui/config\"/></con:setting></con:settings><con:endpoint>${#Project#baseUrl}</con:endpoint><con:request/><con:originalUri>http://localhost/version</con:originalUri><con:assertion type=\"Valid HTTP Status Codes\" name=\"Valid HTTP Status Codes - 200 OK\"><con:configuration><codes>200</codes></con:configuration></con:assertion><con:assertion type=\"Simple Contains\" name=\"Contains &quot;DemoRestWS&quot;\"><con:configuration><token>DemoRestWS</token><ignoreCase>false</ignoreCase><useRegEx>false</useRegEx></con:configuration></con:assertion><con:credentials><con:username>rest</con:username><con:password>rest</con:password><con:domain xsi:nil=\"true\"/><con:selectedAuthProfile>Basic</con:selectedAuthProfile><con:addedBasicAuthenticationTypes>Basic</con:addedBasicAuthenticationTypes><con:authType>Global HTTP Settings</con:authType></con:credentials><con:jmsConfig JMSDeliveryMode=\"PERSISTENT\"/><con:jmsPropertyConfig/><con:parameters/></con:restRequest></con:config></con:testStep><con:testStep type=\"restrequest\" name=\"GET implementation details\"><con:settings/><con:config service=\"http://localhost:8888\" resourcePath=\"/manifest/implementation-details\" methodName=\"Method 1\" xsi:type=\"con:RestRequestStep\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><con:restRequest name=\"GET implementation details\" mediaType=\"application/json\"><con:settings><con:setting id=\"com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers\">&lt;entry key=\"accept\" value=\"application/json\" xmlns=\"http://eviware.com/soapui/config\"/></con:setting></con:settings><con:endpoint>${#Project#baseUrl}</con:endpoint><con:request/><con:originalUri>http://localhost/demo-rest-jersey-spring/version/manifest-attributes</con:originalUri><con:assertion type=\"Valid HTTP Status Codes\" name=\"Valid HTTP Status Codes - 200 OK\"><con:configuration><codes>200</codes></con:configuration></con:assertion><con:credentials><con:username>rest</con:username><con:password>rest</con:password><con:domain xsi:nil=\"true\"/><con:selectedAuthProfile>Basic</con:selectedAuthProfile><con:addedBasicAuthenticationTypes>Basic</con:addedBasicAuthenticationTypes><con:authType>Global HTTP Settings</con:authType></con:credentials><con:jmsConfig JMSDeliveryMode=\"PERSISTENT\"/><con:jmsPropertyConfig/><con:parameters/></con:restRequest></con:config></con:testStep><con:properties/></con:testCase><con:properties/></con:testSuite><con:properties><con:property><con:name>baseUrl</con:name><con:value>http://localhost:8888/demo-rest-jersey-spring</con:value></con:property></con:properties><con:wssContainer/><con:oAuth2ProfileContainer/><con:sensitiveInformation/></con:soapui-project>"
  },
  {
    "path": "src/test/resources/test-applicationContext.xml",
    "content": "<beans xmlns=\"http://www.springframework.org/schema/beans\"\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" \n\txmlns:context=\"http://www.springframework.org/schema/context\"\n\txmlns:tx=\"http://www.springframework.org/schema/tx\"\t\n\txsi:schemaLocation=\"\n\t\thttp://www.springframework.org/schema/beans\t\n\t\thttp://www.springframework.org/schema/beans/spring-beans.xsd\n\t \n\t\thttp://www.springframework.org/schema/tx \n\t\thttp://www.springframework.org/schema/tx/spring-tx.xsd\n\t\t \n\t\thttp://www.springframework.org/schema/context\n\t\thttp://www.springframework.org/schema/context/spring-context.xsd\">\n \n\t<context:component-scan base-package=\"org.codingpedia.demo.rest.*\" />\n    \n    <!-- import the dataSource definition -->\n    <import resource=\"data-source.xml\"/> \n     \n\t<!--\n\t\tInstruct Spring to perform declarative transaction management\n\t\tautomatically on annotated classes.\n\t-->\t\n\t<tx:annotation-driven transaction-manager=\"transactionManager\" />  \n    <bean id=\"transactionManager\"\n          class=\"org.springframework.jdbc.datasource.DataSourceTransactionManager\">\n        <property name=\"dataSource\" ref=\"dataSource\"/>\n    </bean>  \n    \t\n\t<!-- =============== MyBATIS beans configuration ================== -->\n\t<bean id=\"podcastDao\" class=\"org.mybatis.spring.mapper.MapperFactoryBean\">\n\t   <property name=\"sqlSessionFactory\" ref=\"sqlSessionFactory\"/>    \n\t   <property name=\"mapperInterface\" value=\"org.codingpedia.demo.rest.dao.PodcastDao\" />\n\t</bean>\n\t\n\t<bean id=\"sqlSessionFactory\" class=\"org.mybatis.spring.SqlSessionFactoryBean\">\n\t    <property name=\"dataSource\" ref=\"dataSource\" />\n\t    <property name=\"configLocation\" value=\"classpath:config/mybatisV3.xml\"/>\n\t</bean>\n\t\n    <bean id=\"podcastResource\" class=\"org.codingpedia.demo.rest.resource.PodcastResource\" >\n    \t<property name=\"podcastService\" ref=\"podcastService\"/>\n    </bean>\n    \n    <bean id=\"podcastService\" class=\"org.codingpedia.demo.rest.service.PodcastServiceDbAccessImpl\" >\n    \t<property name=\"podcastDao\" ref=\"podcastDao\"/>\n    </bean>    \n    \n\t<bean id=\"dataSource\" class=\"org.springframework.jndi.JndiObjectFactoryBean\" scope=\"singleton\">\n\t    <property name=\"jndiName\" value=\"java:comp/env/jdbc/restDemoDB\" />\n\t    <property name=\"resourceRef\" value=\"true\" />        \n\t</bean>\n</beans>"
  }
]