├── BackboneREST ├── .gitignore ├── build.gradle ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── src │ ├── main │ ├── java │ │ └── es │ │ │ └── com │ │ │ └── blogspot │ │ │ └── elblogdepicodev │ │ │ └── todo │ │ │ ├── rest │ │ │ ├── Application.java │ │ │ ├── Tarea.java │ │ │ ├── TareasResource.java │ │ │ ├── TareasResourceClient.java │ │ │ └── TareasResourceImpl.java │ │ │ └── tapestry │ │ │ ├── components │ │ │ └── HolaMundo.java │ │ │ ├── pages │ │ │ └── Index.java │ │ │ └── services │ │ │ ├── AppModule.java │ │ │ ├── ResteasyRequestFilter.java │ │ │ ├── ResteasySymbols.java │ │ │ └── TapestryResteasyBootstrap.java │ ├── resources │ │ ├── es │ │ │ └── com │ │ │ │ └── blogspot │ │ │ │ └── elblogdepicodev │ │ │ │ └── todo │ │ │ │ └── tapestry │ │ │ │ └── pages │ │ │ │ └── Index.tml │ │ └── log4j.properties │ └── webapp │ │ ├── WEB-INF │ │ ├── .gitignore │ │ ├── classes │ │ │ └── .gitignore │ │ └── web.xml │ │ ├── bootstrap │ │ ├── css │ │ │ ├── bootstrap-responsive.css │ │ │ ├── bootstrap-responsive.min.css │ │ │ ├── bootstrap.css │ │ │ └── bootstrap.min.css │ │ ├── img │ │ │ ├── glyphicons-halflings-white.png │ │ │ └── glyphicons-halflings.png │ │ └── js │ │ │ ├── bootstrap.js │ │ │ └── bootstrap.min.js │ │ ├── css │ │ └── jasmine.css │ │ ├── images │ │ ├── backbone.png │ │ └── tapestry.png │ │ ├── index.jsp │ │ └── js │ │ ├── backbone.js │ │ ├── jasmine-html.js │ │ ├── jasmine.js │ │ ├── jquery.js │ │ ├── main.js │ │ ├── mustache.js │ │ ├── require.js │ │ ├── sinon.js │ │ ├── specs │ │ ├── main-specs.js │ │ └── tareas-specs.js │ │ ├── tareas.js │ │ └── underscore.js │ └── test │ └── javascript │ └── SpecRunner.html ├── HelloWorldActiviti ├── .gitignore ├── build.gradle ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── src │ ├── main │ ├── java │ │ └── es │ │ │ └── com │ │ │ └── blogspot │ │ │ └── elblogdepicodev │ │ │ └── activiti │ │ │ ├── Errores.java │ │ │ ├── HelloWorld.java │ │ │ ├── ReglasDeNegocio.java │ │ │ ├── Variables.java │ │ │ └── misc │ │ │ ├── Cliente.java │ │ │ ├── ComprobarExistenciasServiceTask.java │ │ │ └── Producto.java │ └── resources │ │ ├── activiti-h2.cfg.xml │ │ ├── activiti-mysql.cfg.xml │ │ ├── bpmn │ │ ├── Errores.bpmn20.xml │ │ ├── HelloWorld.bpmn20.xml │ │ ├── ReglasDeNegocio.bpmn20.xml │ │ └── Variables.bpmn20.xml │ │ ├── logback.xml │ │ └── rules │ │ ├── Descuento.drl │ │ ├── TipoCliente.drl │ │ └── TipoEnvio.drl │ └── test │ └── java │ └── es │ └── com │ └── blogspot │ └── elblogdepicodev │ └── activiti │ ├── ActivitiAbstractTest.java │ ├── ErroresTest.java │ ├── HelloWorldTest.java │ ├── ReglasDeNegocioTest.java │ └── VariablesTest.java ├── HelloWorldBackbone ├── .gitignore ├── HelloWorldBackbone.html ├── css │ └── bootstrap.css ├── img │ └── backbone.png └── js │ ├── backbone.js │ ├── jquery.js │ ├── main.js │ ├── mustache.js │ ├── require.js │ └── underscore.js ├── HelloWorldHibernate ├── .gitignore ├── HibernateJPA.sh ├── HibernateSearch.sh ├── build.gradle ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── src │ ├── main │ ├── java │ │ └── es │ │ │ └── com │ │ │ └── blogspot │ │ │ └── elblogdepicodev │ │ │ └── hibernate │ │ │ ├── HibernateJPA.java │ │ │ ├── HibernateSearch.java │ │ │ ├── Producto.java │ │ │ └── dao │ │ │ ├── .gitignore │ │ │ ├── Direction.java │ │ │ ├── GenericDAO.java │ │ │ ├── GenericDAOImpl.java │ │ │ ├── GenericSearchDAO.java │ │ │ ├── GenericSearchDAOImpl.java │ │ │ ├── Pagination.java │ │ │ ├── Sort.java │ │ │ └── SortConstraint.java │ └── resources │ │ └── META-INF │ │ └── persistence.xml │ └── test │ └── java │ └── es │ └── com │ └── blogspot │ └── elblogdepicodev │ └── hibernate │ └── HibernateTest.java ├── HelloWorldMustache ├── .gitignore └── src │ ├── HelloWorldMustache.html │ └── js │ ├── main.js │ ├── mustache.js │ └── require.js ├── HelloWorldRESTEasy ├── .gitignore ├── build.gradle ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── src │ └── main │ ├── java │ └── es │ │ └── com │ │ └── blogspot │ │ └── elblogdepicodev │ │ └── resteasy │ │ ├── Application.java │ │ ├── HelloWorldResource.java │ │ ├── HelloWorldResourceClient.java │ │ ├── HelloWorldResourceImpl.java │ │ └── Mensaje.java │ └── webapp │ ├── WEB-INF │ ├── .gitignore │ └── web.xml │ ├── helloworld-resteasy.jsp │ └── index.jsp ├── HelloWorldRequireJS ├── .gitignore └── src │ ├── HelloWorldRequireJS.html │ ├── build.js │ ├── built.js │ ├── js │ ├── figuras.js │ ├── main.js │ └── require.js │ └── r.js ├── HelloWorldSpock ├── .gitignore ├── build.gradle ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── src │ └── test │ └── groovy │ ├── HelloWorldSpock.groovy │ └── MockitoSpock.groovy ├── HelloWorldTapestry5GAE ├── README.md ├── build.gradle ├── gradle.cmd ├── gradle.sh ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── src │ └── main │ └── java │ ├── com │ └── blogspot │ │ └── elblogdepicodev │ │ └── tapestry │ │ └── helloWorld │ │ ├── components │ │ ├── Descripcion.java │ │ ├── Descripcion.tml │ │ ├── DescripcionGroovy.groovy │ │ ├── DescripcionGroovy.tml │ │ ├── HolaMundo.java │ │ ├── HolaMundoGroovy.groovy │ │ ├── Reloj.java │ │ ├── Reloj.js │ │ └── RelojGroovy.groovy │ │ ├── pages │ │ ├── Index.java │ │ ├── Index.tml │ │ ├── IndexGroovy.groovy │ │ └── IndexGroovy.tml │ │ └── services │ │ └── AppModule.java │ └── log4j.properties ├── HtmlError └── src │ ├── HtmlError.html │ └── js │ ├── log4javascript.js │ ├── main.js │ └── require.js ├── JamendoRadioPlayer └── JamendoRadioPlayer.py ├── Jansi ├── build.gradle ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── src │ └── main │ └── java │ └── es │ └── com │ └── blogspot │ └── elblogdepicodev │ └── jansi │ └── ColorConsola.java ├── JavaProperties ├── build.gradle ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── src │ └── main │ ├── java │ └── es │ │ └── com │ │ └── blogspot │ │ └── elblogdepicodev │ │ └── properties │ │ ├── EncodingControl.java │ │ └── Main.java │ └── resources │ ├── default.properties │ ├── utf8-1.properties │ └── utf8-2.properties ├── LICENSE ├── Log4javascript └── src │ ├── HelloWorldLog4javscript.html │ └── js │ ├── log4javascript.js │ ├── main.js │ └── require.js ├── MarionetteREST ├── .gitignore ├── build.gradle ├── build.js ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── grunt.js ├── package.json ├── r.js └── src │ ├── main │ ├── java │ │ └── es │ │ │ └── com │ │ │ └── blogspot │ │ │ └── elblogdepicodev │ │ │ └── todo │ │ │ ├── rest │ │ │ ├── Application.java │ │ │ ├── Tarea.java │ │ │ ├── TareasResource.java │ │ │ ├── TareasResourceClient.java │ │ │ └── TareasResourceImpl.java │ │ │ └── tapestry │ │ │ ├── components │ │ │ └── HolaMundo.java │ │ │ ├── pages │ │ │ └── Index.java │ │ │ └── services │ │ │ ├── AppModule.java │ │ │ ├── ResteasyRequestFilter.java │ │ │ ├── ResteasySymbols.java │ │ │ └── TapestryResteasyBootstrap.java │ ├── resources │ │ ├── es │ │ │ └── com │ │ │ │ └── blogspot │ │ │ │ └── elblogdepicodev │ │ │ │ └── todo │ │ │ │ └── tapestry │ │ │ │ └── pages │ │ │ │ └── Index.tml │ │ └── log4j.properties │ └── webapp │ │ ├── WEB-INF │ │ ├── .gitignore │ │ ├── classes │ │ │ └── .gitignore │ │ └── web.xml │ │ ├── bootstrap │ │ ├── css │ │ │ ├── bootstrap-responsive.css │ │ │ ├── bootstrap-responsive.min.css │ │ │ ├── bootstrap.css │ │ │ └── bootstrap.min.css │ │ ├── img │ │ │ ├── glyphicons-halflings-white.png │ │ │ └── glyphicons-halflings.png │ │ └── js │ │ │ ├── bootstrap.js │ │ │ └── bootstrap.min.js │ │ ├── css │ │ └── jasmine.css │ │ ├── images │ │ ├── backbone.png │ │ ├── marionette.png │ │ ├── requirejs.png │ │ └── tapestry5.png │ │ └── js │ │ ├── backbone.js │ │ ├── backbone.marionette.js │ │ ├── i18n.js │ │ ├── i18n │ │ └── nls │ │ │ ├── en │ │ │ └── mensajes.js │ │ │ └── mensajes.js │ │ ├── jasmine-html.js │ │ ├── jasmine.js │ │ ├── jquery.js │ │ ├── json2.js │ │ ├── main.js │ │ ├── main.min.js │ │ ├── mustache.js │ │ ├── plantillas.js │ │ ├── plantillas │ │ ├── estado.mustache │ │ ├── tarea.mustache │ │ └── tareas.mustache │ │ ├── require.js │ │ ├── sinon.js │ │ ├── specs │ │ ├── main-specs.js │ │ ├── requirejs-config.js │ │ └── tareas-specs.js │ │ ├── tareas.js │ │ ├── text.js │ │ └── underscore.js │ └── test │ └── javascript │ └── SpecRunner.html ├── PatronState ├── .gitignore ├── build.gradle ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── src │ ├── main │ └── java │ │ └── es │ │ └── com │ │ └── blogspot │ │ └── elblogdepicodev │ │ └── pattern │ │ └── state │ │ ├── Compra.java │ │ ├── CompraStateFactory.java │ │ └── compraState │ │ ├── AbstractCompraState.java │ │ ├── CanceladaCompraState.java │ │ ├── CompraState.java │ │ ├── CreadaCompraState.java │ │ ├── EnEsperaCompraState.java │ │ ├── EnviadaCompraState.java │ │ └── VerificadaCompraState.java │ └── test │ └── java │ └── es │ └── com │ └── blogspot │ └── elblogdepicodev │ └── pattern │ └── state │ └── CompraStateTest.java ├── PlugInTapestry ├── .gitignore ├── README.md ├── build.gradle ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── misc │ ├── PlugInTapestry.png │ └── inicio-rapido-5.png ├── pom.xml └── src │ ├── main │ ├── java │ │ └── es │ │ │ └── com │ │ │ └── blogspot │ │ │ └── elblogdepicodev │ │ │ └── plugintapestry │ │ │ ├── components │ │ │ ├── Ajax.java │ │ │ ├── HolaMundo.java │ │ │ ├── HolaMundoTemplate.java │ │ │ ├── Javascript.java │ │ │ ├── Layout.java │ │ │ ├── Layout.xdoc │ │ │ ├── ListSelect.java │ │ │ ├── NumeroProductos.java │ │ │ └── tapestry.png │ │ │ ├── entities │ │ │ └── Producto.java │ │ │ ├── misc │ │ │ ├── CDNAssetPathConverterImpl.java │ │ │ ├── ContextListener.java │ │ │ ├── DateTranslator.java │ │ │ ├── Direction.java │ │ │ ├── HibernateGridDataSource.java │ │ │ ├── Pagination.java │ │ │ ├── PlugInStack.java │ │ │ ├── Realm.java │ │ │ ├── Sort.java │ │ │ └── WildFlyClasspathURLConverter.java │ │ │ ├── mixins │ │ │ ├── Csrf.java │ │ │ └── SubmitOne.java │ │ │ ├── pages │ │ │ ├── Error404.java │ │ │ ├── Error500.java │ │ │ ├── ExceptionReport.java │ │ │ ├── Index.java │ │ │ ├── Login.java │ │ │ ├── Unauthorized.java │ │ │ └── admin │ │ │ │ └── ProductoAdmin.java │ │ │ └── services │ │ │ ├── AppModule.java │ │ │ ├── annotation │ │ │ └── Csrf.java │ │ │ ├── dao │ │ │ ├── GenericDAO.java │ │ │ ├── GenericDAOImpl.java │ │ │ ├── ProductoDAO.java │ │ │ └── ProductoDAOImpl.java │ │ │ ├── exceptions │ │ │ └── CsrfException.java │ │ │ ├── hibernate │ │ │ ├── HibernateConfigurer.java │ │ │ ├── HibernateEventAdapter.java │ │ │ ├── HibernateIntegrator.java │ │ │ ├── HibernateSessionSourceImpl.java │ │ │ └── ProductoEventAdapter.java │ │ │ ├── spring │ │ │ ├── AppConfiguration.java │ │ │ └── DummyService.java │ │ │ ├── sso │ │ │ └── Sid.java │ │ │ ├── transaction │ │ │ ├── AppModule.txt │ │ │ ├── HibernateSessionManagerImpl.java │ │ │ ├── HibernateTransactionServiceImpl.java │ │ │ ├── MandatoryTransactionAdvice.java │ │ │ ├── NestedTransactionAdvice.java │ │ │ ├── NeverTransactionAdvice.java │ │ │ ├── Propagation.java │ │ │ ├── RequiredTransactionAdvice.java │ │ │ ├── TransactionAdvisor.java │ │ │ ├── TransactionAdvisorImpl.java │ │ │ ├── TransactionDefinition.java │ │ │ ├── TransactionService.java │ │ │ └── Transactional.java │ │ │ └── workers │ │ │ └── CsrfWorker.java │ ├── resources │ │ ├── META-INF │ │ │ ├── assets │ │ │ │ └── app │ │ │ │ │ └── jquery-library.js │ │ │ ├── context.xml │ │ │ ├── modules │ │ │ │ └── app │ │ │ │ │ ├── colores.js │ │ │ │ │ ├── listSelect.js │ │ │ │ │ ├── saludador.js │ │ │ │ │ └── submitOne.js │ │ │ └── services │ │ │ │ └── org.hibernate.integrator.spi.Integrator │ │ ├── applicationContext.xml │ │ ├── es │ │ │ └── com │ │ │ │ └── blogspot │ │ │ │ └── elblogdepicodev │ │ │ │ └── plugintapestry │ │ │ │ ├── components │ │ │ │ ├── HolaMundoTemplate.tml │ │ │ │ ├── Layout.tml │ │ │ │ └── ListSelect.tml │ │ │ │ └── pages │ │ │ │ ├── Error404.tml │ │ │ │ ├── Error500.tml │ │ │ │ ├── ExceptionReport.tml │ │ │ │ ├── Index.tml │ │ │ │ ├── Login.tml │ │ │ │ ├── Unauthorized.tml │ │ │ │ └── admin │ │ │ │ └── ProductoAdmin.tml │ │ ├── hibernate.cfg.xml │ │ ├── log4j.properties │ │ └── shiro-users.properties │ └── webapp │ │ ├── WEB-INF │ │ ├── app.properties │ │ ├── app_en.properties │ │ └── web.xml │ │ ├── css │ │ └── app.css │ │ └── images │ │ └── tapestry.png │ └── test │ ├── groovy │ └── es │ │ └── com │ │ └── blogspot │ │ └── elblogdepicodev │ │ └── plugintapestry │ │ ├── components │ │ └── NumeroProductosSpec.groovy │ │ └── geb │ │ ├── GoogleSearchSpec.groovy │ │ ├── GoogleSpec.groovy │ │ └── IndexSpec.groovy │ ├── java │ └── es │ │ └── com │ │ └── blogspot │ │ └── elblogdepicodev │ │ └── plugintapestry │ │ ├── components │ │ ├── NumeroProductosTest.java │ │ ├── NumeroProductosTesterTest.java │ │ └── NumeroProductosXPathTesterTest.java │ │ └── test │ │ ├── AbstractTest.java │ │ ├── pages │ │ └── NumeroProductosTest.java │ │ └── services │ │ └── TestModule.java │ └── resources │ └── es │ └── com │ └── blogspot │ └── elblogdepicodev │ └── plugintapestry │ └── test │ └── pages │ └── NumeroProductosTest.tml ├── README.md ├── TapestryJPA ├── .gitignore ├── build.gradle ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── src │ └── main │ ├── java │ └── es │ │ └── com │ │ └── blogspot │ │ └── elblogdepicodev │ │ └── tapestry │ │ └── jpa │ │ ├── components │ │ ├── HolaMundo.java │ │ └── Layout.java │ │ ├── dao │ │ ├── GenericDAO.java │ │ ├── GenericDAOImpl.java │ │ ├── ProductoDAO.java │ │ ├── ProductoDAOImpl.java │ │ └── SimpleCriteriaBuilder.java │ │ ├── entities │ │ └── Producto.java │ │ ├── misc │ │ ├── AppValidationDecorator.java │ │ ├── AppValidationDecoratorFactory.java │ │ ├── DateTranslator.java │ │ ├── Direction.java │ │ ├── JPAGridDataSource.java │ │ ├── Pagination.java │ │ └── Sort.java │ │ ├── pages │ │ ├── Error404.java │ │ ├── Error500.java │ │ ├── ExceptionReport.java │ │ └── admin │ │ │ ├── EjemploJPA.java │ │ │ └── ProductoAdmin.java │ │ └── services │ │ └── AppModule.java │ ├── resources │ ├── META-INF │ │ └── persistence.xml │ ├── es │ │ └── com │ │ │ └── blogspot │ │ │ └── elblogdepicodev │ │ │ └── tapestry │ │ │ └── jpa │ │ │ ├── components │ │ │ ├── HolaMundo.tml │ │ │ └── Layout.tml │ │ │ └── pages │ │ │ ├── Error404.tml │ │ │ ├── Error500.tml │ │ │ ├── ExceptionReport.tml │ │ │ └── admin │ │ │ ├── EjemploJPA.tml │ │ │ └── ProductoAdmin.tml │ ├── log4j.properties │ └── org │ │ └── hibernate │ │ └── validator │ │ └── ValidationMessages_es.properties │ └── webapp │ ├── WEB-INF │ ├── .gitignore │ ├── app.properties │ └── web.xml │ ├── bootstrap │ ├── css │ │ ├── bootstrap-responsive.css │ │ ├── bootstrap-responsive.min.css │ │ ├── bootstrap.css │ │ └── bootstrap.min.css │ ├── img │ │ ├── glyphicons-halflings-white.png │ │ └── glyphicons-halflings.png │ └── js │ │ ├── bootstrap.js │ │ └── bootstrap.min.js │ ├── images │ └── tapestry.png │ └── index.jsp ├── TapestryRESTEasy ├── .gitignore ├── build.gradle ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── src │ └── main │ ├── java │ └── es │ │ └── com │ │ └── blogspot │ │ └── elblogdepicodev │ │ ├── resteasy │ │ ├── Application.java │ │ ├── HelloWorldResource.java │ │ ├── HelloWorldResourceClient.java │ │ ├── HelloWorldResourceImpl.java │ │ └── Mensaje.java │ │ └── tapestry │ │ └── resteasy │ │ ├── components │ │ └── HolaMundo.java │ │ ├── pages │ │ └── Index.java │ │ └── services │ │ ├── AppModule.java │ │ ├── ContadorService.java │ │ ├── ContadorServiceImpl.java │ │ ├── ResteasyRequestFilter.java │ │ ├── ResteasySymbols.java │ │ └── TapestryResteasyBootstrap.java │ ├── resources │ ├── es │ │ └── com │ │ │ └── blogspot │ │ │ └── elblogdepicodev │ │ │ └── tapestry │ │ │ └── resteasy │ │ │ └── pages │ │ │ └── Index.tml │ └── log4j.properties │ └── webapp │ ├── WEB-INF │ └── web.xml │ ├── images │ └── tapestry.png │ └── index.jsp ├── TapestrySecurity ├── .gitignore ├── build.gradle ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── src │ └── main │ ├── java │ └── es │ │ └── com │ │ └── blogspot │ │ └── elblogdepicodev │ │ └── tapestry │ │ └── security │ │ ├── components │ │ ├── HolaMundo.java │ │ └── Layout.java │ │ ├── misc │ │ ├── AppValidationDecorator.java │ │ └── AppValidationDecoratorFactory.java │ │ ├── pages │ │ ├── Index.java │ │ ├── Login.java │ │ ├── Unauthorized.java │ │ └── Xss.java │ │ └── services │ │ └── AppModule.java │ ├── resources │ ├── es │ │ └── com │ │ │ └── blogspot │ │ │ └── elblogdepicodev │ │ │ └── tapestry │ │ │ └── security │ │ │ ├── components │ │ │ ├── HolaMundo.tml │ │ │ └── Layout.tml │ │ │ └── pages │ │ │ ├── Index.tml │ │ │ ├── Login.tml │ │ │ ├── Unauthorized.tml │ │ │ └── Xss.tml │ ├── log4j.properties │ └── shiro-users.properties │ └── webapp │ ├── WEB-INF │ ├── .gitignore │ └── web.xml │ ├── bootstrap │ ├── css │ │ ├── bootstrap-responsive.css │ │ ├── bootstrap-responsive.min.css │ │ ├── bootstrap.css │ │ └── bootstrap.min.css │ ├── img │ │ ├── glyphicons-halflings-white.png │ │ └── glyphicons-halflings.png │ └── js │ │ ├── bootstrap.js │ │ └── bootstrap.min.js │ ├── images │ └── tapestry.png │ └── index.jsp ├── TapestrySkinning ├── .gitignore ├── build.gradle ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── src │ └── main │ ├── java │ └── es │ │ └── com │ │ └── blogspot │ │ └── elblogdepicodev │ │ └── tapestry │ │ └── skin │ │ ├── components │ │ └── HolaMundo.java │ │ ├── pages │ │ └── Index.java │ │ └── services │ │ ├── AppModule.java │ │ ├── CustomComponentRequestSelectorAnalyzer.java │ │ ├── CustomComponentResourceLocator.java │ │ └── DominioAxis.java │ ├── resources │ ├── es │ │ └── com │ │ │ └── blogspot │ │ │ └── elblogdepicodev │ │ │ └── tapestry │ │ │ └── skin │ │ │ ├── components │ │ │ ├── HolaMundo.tml │ │ │ ├── HolaMundo_com_es.tml │ │ │ └── HolaMundo_net.tml │ │ │ └── pages │ │ │ ├── Index.tml │ │ │ └── Index_net.tml │ └── log4j.properties │ └── webapp │ ├── WEB-INF │ ├── .gitignore │ └── web.xml │ ├── images │ └── tapestry.png │ └── index.jsp └── TapestryTest ├── .gitignore ├── README.md ├── build.gradle ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── src ├── main ├── java │ └── es │ │ └── com │ │ └── blogspot │ │ └── elblogdepicodev │ │ └── test │ │ └── tapestry │ │ ├── components │ │ └── HolaMundo.java │ │ ├── pages │ │ └── Index.java │ │ └── services │ │ ├── AppModule.java │ │ ├── MensajeService.java │ │ └── MensajeServiceImpl.java ├── resources │ ├── es │ │ └── com │ │ │ └── blogspot │ │ │ └── elblogdepicodev │ │ │ └── test │ │ │ └── tapestry │ │ │ └── pages │ │ │ └── Index.tml │ └── log4j.properties └── webapp │ ├── WEB-INF │ └── web.xml │ ├── bootstrap │ ├── css │ │ ├── bootstrap-responsive.css │ │ ├── bootstrap-responsive.min.css │ │ ├── bootstrap.css │ │ └── bootstrap.min.css │ ├── img │ │ ├── glyphicons-halflings-white.png │ │ └── glyphicons-halflings.png │ └── js │ │ ├── bootstrap.js │ │ └── bootstrap.min.js │ ├── images │ └── tapestry.png │ └── index.jsp └── test ├── groovy └── es │ └── com │ └── blogspot │ └── elblogdepicodev │ └── test │ └── geb │ ├── GoogleSearchSpec.groovy │ ├── GoogleSpec.groovy │ └── IndexSpec.groovy ├── java └── es │ └── com │ └── blogspot │ └── elblogdepicodev │ └── test │ └── tapestry │ ├── components │ ├── HolaMundoTest.java │ ├── HolaMundoTesterTest.java │ └── HolaMundoXPathTesterTest.java │ └── test │ ├── AbstractTest.java │ ├── pages │ └── HolaMundoTest.java │ └── services │ └── TestModule.java └── resources └── es └── com └── blogspot └── elblogdepicodev └── test └── tapestry └── test └── pages └── HolaMundoTest.tml /BackboneREST/.gitignore: -------------------------------------------------------------------------------- 1 | /bin 2 | /build 3 | /.classpath 4 | /.project 5 | /.gradle 6 | /.settings 7 | -------------------------------------------------------------------------------- /BackboneREST/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/picodotdev/elblogdepicodev/20bd29cd073151284af2620a98dbdbc64c2023e7/BackboneREST/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /BackboneREST/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Fri Apr 26 20:20:37 CEST 2013 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=http\://services.gradle.org/distributions/gradle-1.5-bin.zip 7 | -------------------------------------------------------------------------------- /BackboneREST/src/main/java/es/com/blogspot/elblogdepicodev/todo/rest/Application.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.todo.rest; 2 | 3 | import java.util.Collection; 4 | import java.util.Collections; 5 | import java.util.HashSet; 6 | import java.util.Set; 7 | 8 | @SuppressWarnings("unchecked") 9 | public class Application extends javax.ws.rs.core.Application { 10 | 11 | private Set singletons; 12 | 13 | public Application(Collection singletons) { 14 | this.singletons = new HashSet(); 15 | this.singletons.addAll(singletons); 16 | } 17 | 18 | @Override 19 | public Set> getClasses() { 20 | return Collections.EMPTY_SET; 21 | } 22 | 23 | @Override 24 | public Set getSingletons() { 25 | return singletons; 26 | } 27 | } -------------------------------------------------------------------------------- /BackboneREST/src/main/java/es/com/blogspot/elblogdepicodev/todo/rest/Tarea.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.todo.rest; 2 | 3 | public class Tarea { 4 | 5 | private Long id; 6 | 7 | private String descripcion; 8 | 9 | private Boolean completada; 10 | 11 | public Tarea() { 12 | } 13 | 14 | public Tarea(String descripcion, Boolean completada) { 15 | this(null, descripcion, completada); 16 | } 17 | 18 | public Tarea(Long id, String descripcion, Boolean completada) { 19 | this.id = id; 20 | this.descripcion = descripcion; 21 | this.completada = completada; 22 | } 23 | 24 | public Long getId() { 25 | return id; 26 | } 27 | 28 | public void setId(Long id) { 29 | this.id = id; 30 | } 31 | 32 | public String getDescripcion() { 33 | return descripcion; 34 | } 35 | 36 | public void setDescripcion(String descripcion) { 37 | this.descripcion = descripcion; 38 | } 39 | 40 | public Boolean isCompletada() { 41 | return completada; 42 | } 43 | 44 | public void setCompletada(Boolean completada) { 45 | this.completada = completada; 46 | } 47 | } -------------------------------------------------------------------------------- /BackboneREST/src/main/java/es/com/blogspot/elblogdepicodev/todo/rest/TareasResource.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.todo.rest; 2 | 3 | import java.util.Collection; 4 | 5 | import javax.ws.rs.Consumes; 6 | import javax.ws.rs.DELETE; 7 | import javax.ws.rs.GET; 8 | import javax.ws.rs.POST; 9 | import javax.ws.rs.PUT; 10 | import javax.ws.rs.Path; 11 | import javax.ws.rs.PathParam; 12 | import javax.ws.rs.Produces; 13 | import javax.ws.rs.core.MediaType; 14 | 15 | @Path("/tareas") 16 | public interface TareasResource { 17 | 18 | @Path("/tarea") 19 | @POST 20 | @Consumes(MediaType.APPLICATION_JSON) 21 | @Produces(MediaType.APPLICATION_JSON) 22 | public Tarea createTarea(Tarea tarea); 23 | 24 | @Path("/") 25 | @GET 26 | @Produces(MediaType.APPLICATION_JSON) 27 | public Collection readTareas(); 28 | 29 | @Path("/tarea/{id}") 30 | @PUT 31 | @Consumes(MediaType.APPLICATION_JSON) 32 | @Produces(MediaType.APPLICATION_JSON) 33 | public Tarea updateTarea(Tarea tarea); 34 | 35 | @Path("/tarea/{id}") 36 | @DELETE 37 | public void deleteTarea(@PathParam("id") Long id); 38 | } -------------------------------------------------------------------------------- /BackboneREST/src/main/java/es/com/blogspot/elblogdepicodev/todo/rest/TareasResourceImpl.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.todo.rest; 2 | 3 | import java.util.Collection; 4 | import java.util.TreeMap; 5 | 6 | public class TareasResourceImpl implements TareasResource { 7 | 8 | private TreeMap tareas; 9 | 10 | public TareasResourceImpl() { 11 | tareas = new TreeMap(); 12 | } 13 | 14 | @Override 15 | public Tarea createTarea(Tarea tarea) { 16 | Long id = 1l; 17 | if (!tareas.isEmpty()) { 18 | id = tareas.lastKey() + 1; 19 | } 20 | tarea.setId(id); 21 | tareas.put(id, tarea); 22 | return tarea; 23 | } 24 | 25 | @Override 26 | public Collection readTareas() { 27 | return tareas.values(); 28 | } 29 | 30 | @Override 31 | public Tarea updateTarea(Tarea tarea) { 32 | tareas.put(tarea.getId(), tarea); 33 | return tarea; 34 | } 35 | 36 | @Override 37 | public void deleteTarea(Long id) { 38 | tareas.remove(id); 39 | } 40 | } -------------------------------------------------------------------------------- /BackboneREST/src/main/java/es/com/blogspot/elblogdepicodev/todo/tapestry/components/HolaMundo.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.todo.tapestry.components; 2 | 3 | import org.apache.tapestry5.MarkupWriter; 4 | 5 | public class HolaMundo { 6 | 7 | protected boolean beginRender(MarkupWriter writer) { 8 | writer.write("Hola mundo Tapestry !!!"); 9 | return false; 10 | } 11 | } -------------------------------------------------------------------------------- /BackboneREST/src/main/java/es/com/blogspot/elblogdepicodev/todo/tapestry/pages/Index.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.todo.tapestry.pages; 2 | 3 | import java.util.Collection; 4 | 5 | import org.apache.tapestry5.ComponentResources; 6 | import org.apache.tapestry5.SymbolConstants; 7 | import org.apache.tapestry5.annotations.Property; 8 | import org.apache.tapestry5.ioc.annotations.Inject; 9 | import org.apache.tapestry5.ioc.annotations.Symbol; 10 | import org.apache.tapestry5.services.Request; 11 | 12 | import com.google.gson.Gson; 13 | 14 | import es.com.blogspot.elblogdepicodev.todo.rest.Tarea; 15 | import es.com.blogspot.elblogdepicodev.todo.rest.TareasResource; 16 | 17 | public class Index { 18 | 19 | @Inject 20 | @Symbol(SymbolConstants.TAPESTRY_VERSION) 21 | @Property 22 | private String tapestryVersion; 23 | 24 | @Inject 25 | @Property 26 | private Request request; 27 | 28 | @Inject 29 | private ComponentResources resources; 30 | 31 | @Inject 32 | private TareasResource tareasResource; 33 | 34 | public String getTareasJSON() { 35 | Collection tareas = tareasResource.readTareas(); 36 | return new Gson().toJson(tareas); 37 | } 38 | } -------------------------------------------------------------------------------- /BackboneREST/src/main/java/es/com/blogspot/elblogdepicodev/todo/tapestry/services/ResteasySymbols.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.todo.tapestry.services; 2 | 3 | public class ResteasySymbols { 4 | 5 | public static final String MAPPING_PREFIX = "resteasy.servlet.mapping.prefix"; 6 | public static final String MAPPING_PREFIX_JSAPI = "resteasy.servlet.mapping.prefix.jsapi"; 7 | 8 | } -------------------------------------------------------------------------------- /BackboneREST/src/main/java/es/com/blogspot/elblogdepicodev/todo/tapestry/services/TapestryResteasyBootstrap.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.todo.tapestry.services; 2 | 3 | import javax.servlet.ServletContext; 4 | 5 | import org.apache.tapestry5.ioc.services.SymbolSource; 6 | import org.jboss.resteasy.plugins.server.servlet.ListenerBootstrap; 7 | 8 | public class TapestryResteasyBootstrap extends ListenerBootstrap { 9 | 10 | SymbolSource source; 11 | 12 | public TapestryResteasyBootstrap(ServletContext servletContext, SymbolSource source) { 13 | super(servletContext); 14 | this.source = source; 15 | } 16 | 17 | public String getParameter(String name) { 18 | String val = null; 19 | 20 | try { 21 | val = source.valueForSymbol(name); 22 | } catch (RuntimeException e) { 23 | // ignore symbol not found 24 | } 25 | 26 | if (val == null) 27 | val = super.getParameter(name); 28 | 29 | return val; 30 | } 31 | 32 | @Override 33 | public String getInitParameter(String name) { 34 | return getParameter(name); 35 | } 36 | } -------------------------------------------------------------------------------- /BackboneREST/src/main/resources/log4j.properties: -------------------------------------------------------------------------------- 1 | # Set root logger level to DEBUG and its only appender to A1. 2 | log4j.rootLogger=ERROR, A1 3 | 4 | # A1 is set to be a ConsoleAppender. 5 | log4j.appender.A1=org.apache.log4j.ConsoleAppender 6 | 7 | # A1 uses PatternLayout. 8 | log4j.appender.A1.layout=org.apache.log4j.PatternLayout 9 | log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n -------------------------------------------------------------------------------- /BackboneREST/src/main/webapp/WEB-INF/.gitignore: -------------------------------------------------------------------------------- 1 | /lib 2 | -------------------------------------------------------------------------------- /BackboneREST/src/main/webapp/WEB-INF/classes/.gitignore: -------------------------------------------------------------------------------- 1 | /es 2 | -------------------------------------------------------------------------------- /BackboneREST/src/main/webapp/WEB-INF/web.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | BackboneREST 4 | Aplicacion de ejemplo de una lista de tareas usando Backbone y un servicio REST 5 | 6 | 7 | 9 | tapestry.app-package 10 | es.com.blogspot.elblogdepicodev.todo.tapestry 11 | 12 | 13 | 14 | app 15 | org.apache.tapestry5.TapestryFilter 16 | 17 | 18 | 19 | app 20 | /* 21 | 22 | 23 | 24 | 30 25 | COOKIE 26 | 27 | 28 | 29 | Index 30 | 31 | -------------------------------------------------------------------------------- /BackboneREST/src/main/webapp/bootstrap/img/glyphicons-halflings-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/picodotdev/elblogdepicodev/20bd29cd073151284af2620a98dbdbc64c2023e7/BackboneREST/src/main/webapp/bootstrap/img/glyphicons-halflings-white.png -------------------------------------------------------------------------------- /BackboneREST/src/main/webapp/bootstrap/img/glyphicons-halflings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/picodotdev/elblogdepicodev/20bd29cd073151284af2620a98dbdbc64c2023e7/BackboneREST/src/main/webapp/bootstrap/img/glyphicons-halflings.png -------------------------------------------------------------------------------- /BackboneREST/src/main/webapp/images/backbone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/picodotdev/elblogdepicodev/20bd29cd073151284af2620a98dbdbc64c2023e7/BackboneREST/src/main/webapp/images/backbone.png -------------------------------------------------------------------------------- /BackboneREST/src/main/webapp/images/tapestry.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/picodotdev/elblogdepicodev/20bd29cd073151284af2620a98dbdbc64c2023e7/BackboneREST/src/main/webapp/images/tapestry.png -------------------------------------------------------------------------------- /BackboneREST/src/main/webapp/index.jsp: -------------------------------------------------------------------------------- 1 | JSP -------------------------------------------------------------------------------- /BackboneREST/src/main/webapp/js/main.js: -------------------------------------------------------------------------------- 1 | define(['tareas'], function(tareas) { 2 | var tareasApp = new tareas.TareasApp({el: '#tareas'}); 3 | 4 | // Cargar los datos iniciales de la lista de tareas 5 | // Usar los datos precargados en la página, para evitar una petición 6 | // al servidor, los datos se incluyen en la página html de la aplicación. 7 | //tareasApp.resetTareas(tareas); 8 | 9 | // Aunque en la documentación de backbone recomiendan precargar los datos en la 10 | // página, esto impide cachearla, dependiendo 11 | // de la página tal vez sea mejor cachear la página y pedir los datos 12 | // en una petición AJAX. 13 | tareasApp.fetch(); 14 | }); -------------------------------------------------------------------------------- /BackboneREST/src/main/webapp/js/specs/main-specs.js: -------------------------------------------------------------------------------- 1 | define(['specs/tareas-specs'], function() { 2 | }); -------------------------------------------------------------------------------- /HelloWorldActiviti/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | /.gradle 3 | /.settings 4 | /bin 5 | /logs 6 | .classpath 7 | .project 8 | -------------------------------------------------------------------------------- /HelloWorldActiviti/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'eclipse' 2 | apply plugin: 'java' 3 | 4 | repositories { 5 | mavenCentral() 6 | maven { 7 | url 'https://maven.alfresco.com/nexus/content/repositories/activiti/' 8 | } 9 | } 10 | 11 | dependencies { 12 | compile 'com.h2database:h2:1.3.168' 13 | compile 'mysql:mysql-connector-java:5.1.21' 14 | compile 'commons-dbcp:commons-dbcp:1.4' 15 | compile 'org.activiti:activiti-engine:5.10' 16 | compile 'org.codehaus.groovy:groovy-all:2.0.1' 17 | 18 | compile 'junit:junit:4.10' 19 | compile 'org.slf4j:slf4j-api:1.7.0' 20 | compile 'org.slf4j:jul-to-slf4j:1.7.0' 21 | compile 'ch.qos.logback:logback-classic:1.0.7' 22 | 23 | compile 'org.drools:drools-core:5.4.0.Final' 24 | compile 'org.drools:drools-compiler:5.4.0.Final' 25 | } 26 | 27 | task wrapper(type: Wrapper) { 28 | gradleVersion = '1.2' 29 | } -------------------------------------------------------------------------------- /HelloWorldActiviti/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/picodotdev/elblogdepicodev/20bd29cd073151284af2620a98dbdbc64c2023e7/HelloWorldActiviti/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /HelloWorldActiviti/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Fri Sep 21 22:21:36 CEST 2012 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=http\://services.gradle.org/distributions/gradle-1.1-bin.zip 7 | -------------------------------------------------------------------------------- /HelloWorldActiviti/src/main/java/es/com/blogspot/elblogdepicodev/activiti/HelloWorld.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.activiti; 2 | 3 | import org.activiti.engine.ProcessEngine; 4 | import org.activiti.engine.ProcessEngineConfiguration; 5 | import org.activiti.engine.ProcessEngines; 6 | import org.activiti.engine.RepositoryService; 7 | import org.activiti.engine.RuntimeService; 8 | import org.h2.tools.Server; 9 | 10 | public class HelloWorld { 11 | 12 | public static void main(String[] args) throws Exception { 13 | Server server = null; 14 | try { 15 | server = Server.createTcpServer().start(); 16 | 17 | ProcessEngines.init(); 18 | 19 | ProcessEngine processEngine = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti-mysql.cfg.xml").buildProcessEngine(); 20 | 21 | RuntimeService runtimeService = processEngine.getRuntimeService(); 22 | RepositoryService repositoryService = processEngine.getRepositoryService(); 23 | 24 | repositoryService.createDeployment().addClasspathResource("bpmn/HelloWorld.bpmn20.xml").deploy(); 25 | 26 | runtimeService.startProcessInstanceByKey("helloWorld"); 27 | } finally { 28 | ProcessEngines.destroy(); 29 | if (server != null) 30 | server.stop(); 31 | } 32 | } 33 | } -------------------------------------------------------------------------------- /HelloWorldActiviti/src/main/java/es/com/blogspot/elblogdepicodev/activiti/misc/Cliente.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.activiti.misc; 2 | 3 | import java.io.Serializable; 4 | 5 | public class Cliente implements Serializable { 6 | 7 | private static final long serialVersionUID = -1041162141646175002L; 8 | 9 | public enum Tipo { 10 | VIP, NORMAL 11 | } 12 | 13 | Tipo tipo; 14 | 15 | public Cliente() { 16 | this(Tipo.NORMAL); 17 | } 18 | 19 | public Cliente(Tipo tipo) { 20 | this.tipo = tipo; 21 | } 22 | 23 | public Tipo getTipo() { 24 | return tipo; 25 | } 26 | 27 | public void setTipo(Tipo tipo) { 28 | this.tipo = tipo; 29 | } 30 | } -------------------------------------------------------------------------------- /HelloWorldActiviti/src/main/java/es/com/blogspot/elblogdepicodev/activiti/misc/ComprobarExistenciasServiceTask.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.activiti.misc; 2 | 3 | import org.activiti.engine.impl.pvm.PvmTransition; 4 | import org.activiti.engine.impl.pvm.delegate.ActivityBehavior; 5 | import org.activiti.engine.impl.pvm.delegate.ActivityExecution; 6 | 7 | public class ComprobarExistenciasServiceTask implements ActivityBehavior { 8 | 9 | @Override 10 | public void execute(ActivityExecution execution) throws Exception { 11 | PvmTransition transition = null; 12 | Producto producto = (Producto) execution.getVariable("producto"); 13 | if (producto.hayExistencias()) { 14 | transition = execution.getActivity().findOutgoingTransition("flowHayExistencias"); 15 | } else { 16 | transition = execution.getActivity().findOutgoingTransition("flowNoHayExistencias"); 17 | } 18 | execution.take(transition); 19 | } 20 | } -------------------------------------------------------------------------------- /HelloWorldActiviti/src/main/java/es/com/blogspot/elblogdepicodev/activiti/misc/Producto.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.activiti.misc; 2 | 3 | import java.io.Serializable; 4 | 5 | public class Producto implements Serializable { 6 | 7 | private static final long serialVersionUID = -2340188855153751355L; 8 | 9 | private String nombre; 10 | private Long existencias; 11 | 12 | public Producto() { 13 | } 14 | 15 | public Producto(String nombre, Long existencias) { 16 | this.nombre = nombre; 17 | this.existencias = existencias; 18 | } 19 | 20 | public String getNombre() { 21 | return nombre; 22 | } 23 | 24 | public void setNombre(String nombre) { 25 | this.nombre = nombre; 26 | } 27 | 28 | public Long getExistencias() { 29 | return existencias; 30 | } 31 | 32 | public void setExistencias(Long existencias) { 33 | this.existencias = existencias; 34 | } 35 | 36 | public boolean hayExistencias() { 37 | return existencias > 0; 38 | } 39 | } -------------------------------------------------------------------------------- /HelloWorldActiviti/src/main/resources/activiti-h2.cfg.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /HelloWorldActiviti/src/main/resources/activiti-mysql.cfg.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /HelloWorldActiviti/src/main/resources/bpmn/HelloWorld.bpmn20.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /HelloWorldActiviti/src/main/resources/bpmn/Variables.bpmn20.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /HelloWorldActiviti/src/main/resources/logback.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | %-23d{ISO8601} %-5p %-17t %80.80c %m%n 7 | false 8 | 9 | 10 | 11 | logs/scripts.log 12 | true 13 | 14 | %-23d{ISO8601} %-5p %-17t %80.80c %m%n 15 | false 16 | 17 | 18 | logs/scripts-%d{yyyy-MM-dd}.log 19 | 30 20 | true 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /HelloWorldActiviti/src/main/resources/rules/Descuento.drl: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.activiti 2 | 3 | import java.math.BigDecimal; 4 | import java.util.Map; 5 | 6 | import es.com.blogspot.elblogdepicodev.activiti.misc.Cliente; 7 | import es.com.blogspot.elblogdepicodev.activiti.misc.Cliente.Tipo; 8 | 9 | rule "DescuentoClienteVIP" 10 | when 11 | Cliente(tipo == Cliente.Tipo.VIP) 12 | o: Map() 13 | then 14 | o.put('descuento', new BigDecimal('10')); 15 | end 16 | 17 | rule "DescuentoClienteNormal" 18 | when 19 | Cliente(tipo == Cliente.Tipo.NORMAL) 20 | o: Map() 21 | then 22 | o.put('descuento', BigDecimal.ZERO); 23 | end 24 | -------------------------------------------------------------------------------- /HelloWorldActiviti/src/main/resources/rules/TipoCliente.drl: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.activiti 2 | 3 | import java.math.BigDecimal; 4 | 5 | import es.com.blogspot.elblogdepicodev.activiti.misc.Cliente; 6 | import es.com.blogspot.elblogdepicodev.activiti.misc.Cliente.Tipo; 7 | 8 | rule "TipoClienteVIP" 9 | when 10 | BigDecimal(this.compareTo(new BigDecimal('100')) == 1) 11 | c: Cliente() 12 | then 13 | c.setTipo(Tipo.VIP); 14 | end 15 | 16 | rule "TipoClienteNormal" 17 | when 18 | BigDecimal(this.compareTo(new BigDecimal('100')) <= 0) 19 | c: Cliente() 20 | then 21 | c.setTipo(Tipo.NORMAL); 22 | end -------------------------------------------------------------------------------- /HelloWorldActiviti/src/main/resources/rules/TipoEnvio.drl: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.activiti 2 | 3 | import java.util.Map; 4 | 5 | import es.com.blogspot.elblogdepicodev.activiti.misc.Cliente; 6 | import es.com.blogspot.elblogdepicodev.activiti.misc.Cliente.Tipo; 7 | 8 | rule "TipoEnvioClienteVIP" 9 | when 10 | Cliente(tipo == Cliente.Tipo.VIP) 11 | o: Map() 12 | then 13 | o.put('tipoEnvio', 'urgente'); 14 | end 15 | 16 | rule "TipoEnvioClienteNormal" 17 | when 18 | Cliente(tipo == Cliente.Tipo.NORMAL) 19 | o: Map() 20 | then 21 | o.put('tipoEnvio', 'normal'); 22 | end -------------------------------------------------------------------------------- /HelloWorldActiviti/src/test/java/es/com/blogspot/elblogdepicodev/activiti/ActivitiAbstractTest.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.activiti; 2 | 3 | import java.util.logging.Handler; 4 | import java.util.logging.LogManager; 5 | import java.util.logging.Logger; 6 | 7 | import org.activiti.engine.impl.util.LogUtil; 8 | import org.junit.BeforeClass; 9 | import org.slf4j.bridge.SLF4JBridgeHandler; 10 | 11 | public abstract class ActivitiAbstractTest { 12 | 13 | @BeforeClass 14 | public static void beforeClass() { 15 | // Integrar SLF4J con Activiti 16 | LogUtil.readJavaUtilLoggingConfigFromClasspath(); 17 | 18 | Logger rootLogger = LogManager.getLogManager().getLogger(""); 19 | Handler[] handlers = rootLogger.getHandlers(); 20 | for (Handler h : handlers) { 21 | rootLogger.removeHandler(h); 22 | } 23 | SLF4JBridgeHandler.install(); 24 | } 25 | } -------------------------------------------------------------------------------- /HelloWorldActiviti/src/test/java/es/com/blogspot/elblogdepicodev/activiti/HelloWorldTest.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.activiti; 2 | 3 | import org.activiti.engine.test.ActivitiRule; 4 | import org.activiti.engine.test.Deployment; 5 | import org.junit.Rule; 6 | import org.junit.Test; 7 | 8 | public class HelloWorldTest extends ActivitiAbstractTest { 9 | 10 | @Rule 11 | public ActivitiRule activitiRule = new ActivitiRule("activiti-h2.cfg.xml"); 12 | 13 | @Test 14 | @Deployment(resources = "bpmn/HelloWorld.bpmn20.xml") 15 | public void test1() { 16 | activitiRule.getRuntimeService().startProcessInstanceByKey("helloWorld"); 17 | 18 | System.out.println("Hola Mundo desde el test!"); 19 | } 20 | } -------------------------------------------------------------------------------- /HelloWorldBackbone/.gitignore: -------------------------------------------------------------------------------- 1 | /.project 2 | -------------------------------------------------------------------------------- /HelloWorldBackbone/HelloWorldBackbone.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Hello World Backbone 5 | 6 | 7 | 8 | 21 | 22 | 23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 | 34 | 35 | 36 | 37 | 38 | 39 |
40 |
41 |
42 |
43 |
44 |
45 | 46 | 47 | -------------------------------------------------------------------------------- /HelloWorldBackbone/img/backbone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/picodotdev/elblogdepicodev/20bd29cd073151284af2620a98dbdbc64c2023e7/HelloWorldBackbone/img/backbone.png -------------------------------------------------------------------------------- /HelloWorldHibernate/.gitignore: -------------------------------------------------------------------------------- 1 | /indexes 2 | /build 3 | /.classpath 4 | /.project 5 | /.gradle 6 | /.settings 7 | /bin 8 | -------------------------------------------------------------------------------- /HelloWorldHibernate/HibernateJPA.sh: -------------------------------------------------------------------------------- 1 | $JAVA_HOME/bin/java -classpath build/libs/*:build/libs/lib/* es.com.blogspot.elblogdepicodev.hibernate.HibernateJPA 2 | -------------------------------------------------------------------------------- /HelloWorldHibernate/HibernateSearch.sh: -------------------------------------------------------------------------------- 1 | $JAVA_HOME/bin/java -classpath build/libs/*:build/libs/lib/* es.com.blogspot.elblogdepicodev.hibernate.HibernateSearch 2 | -------------------------------------------------------------------------------- /HelloWorldHibernate/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'eclipse' 2 | apply plugin: 'java' 3 | 4 | repositories { 5 | mavenCentral() 6 | } 7 | 8 | dependencies { 9 | compile 'org.hibernate:hibernate-core:4.2.1.Final' 10 | compile 'org.hibernate:hibernate-search:4.2.0.Final' 11 | compile 'org.hibernate:hibernate-entitymanager:4.2.1.Final' 12 | 13 | compile 'mysql:mysql-connector-java:5.1.22' 14 | compile 'com.h2database:h2:1.3.171' 15 | 16 | compile 'junit:junit:4.10' 17 | } 18 | 19 | task wrapper(type: Wrapper) { 20 | gradleVersion = '1.7' 21 | } 22 | 23 | task copyToLib(type: Copy) { 24 | into "$buildDir/libs/lib" 25 | from configurations.runtime 26 | } -------------------------------------------------------------------------------- /HelloWorldHibernate/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/picodotdev/elblogdepicodev/20bd29cd073151284af2620a98dbdbc64c2023e7/HelloWorldHibernate/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /HelloWorldHibernate/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Fri Aug 16 20:49:41 CEST 2013 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=http\://services.gradle.org/distributions/gradle-1.7-bin.zip 7 | -------------------------------------------------------------------------------- /HelloWorldHibernate/src/main/java/es/com/blogspot/elblogdepicodev/hibernate/dao/.gitignore: -------------------------------------------------------------------------------- 1 | /GenericSearchDAO.java 2 | /GenericSearchDAOImpl.java 3 | -------------------------------------------------------------------------------- /HelloWorldHibernate/src/main/java/es/com/blogspot/elblogdepicodev/hibernate/dao/Direction.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.hibernate.dao; 2 | 3 | public enum Direction { 4 | ASCENDING, DESCENDING, UNSORTED 5 | } -------------------------------------------------------------------------------- /HelloWorldHibernate/src/main/java/es/com/blogspot/elblogdepicodev/hibernate/dao/GenericDAO.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.hibernate.dao; 2 | 3 | import java.util.List; 4 | 5 | public interface GenericDAO { 6 | 7 | T findById(Long id); 8 | 9 | List findAll(); 10 | 11 | List findAll(Pagination paginacion); 12 | 13 | long countAll(); 14 | 15 | void persist(T producto); 16 | 17 | void remove(T producto); 18 | 19 | void removeAll(); 20 | } -------------------------------------------------------------------------------- /HelloWorldHibernate/src/main/java/es/com/blogspot/elblogdepicodev/hibernate/dao/GenericSearchDAO.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.hibernate.dao; 2 | 3 | import java.util.List; 4 | 5 | public interface GenericSearchDAO { 6 | 7 | void indexAll() throws InterruptedException; 8 | 9 | List search(String q, String... campos); 10 | } -------------------------------------------------------------------------------- /HelloWorldHibernate/src/main/java/es/com/blogspot/elblogdepicodev/hibernate/dao/GenericSearchDAOImpl.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.hibernate.dao; 2 | 3 | import java.util.List; 4 | 5 | import javax.persistence.EntityManager; 6 | 7 | import org.apache.lucene.search.Query; 8 | import org.hibernate.search.jpa.FullTextEntityManager; 9 | import org.hibernate.search.jpa.Search; 10 | import org.hibernate.search.query.dsl.QueryBuilder; 11 | 12 | public class GenericSearchDAOImpl implements GenericSearchDAO { 13 | 14 | private Class clazz; 15 | private FullTextEntityManager fullTextEntityManager; 16 | 17 | public GenericSearchDAOImpl(Class clazz, EntityManager entityManager) { 18 | this.clazz = clazz; 19 | this.fullTextEntityManager = Search.getFullTextEntityManager(entityManager); 20 | } 21 | 22 | @Override 23 | public void indexAll() throws InterruptedException { 24 | fullTextEntityManager.createIndexer().startAndWait(); 25 | } 26 | 27 | @Override 28 | public List search(String q, String... campos) { 29 | QueryBuilder qb = fullTextEntityManager.getSearchFactory().buildQueryBuilder().forEntity(clazz).get(); 30 | Query query = qb.keyword().onFields(campos).matching(q).createQuery(); 31 | javax.persistence.Query persistenceQuery = fullTextEntityManager.createFullTextQuery(query, clazz); 32 | return persistenceQuery.getResultList(); 33 | } 34 | } -------------------------------------------------------------------------------- /HelloWorldHibernate/src/main/java/es/com/blogspot/elblogdepicodev/hibernate/dao/Pagination.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.hibernate.dao; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | import javax.persistence.criteria.CriteriaBuilder; 7 | import javax.persistence.criteria.Order; 8 | import javax.persistence.criteria.Root; 9 | 10 | public class Pagination { 11 | private int start; 12 | private int end; 13 | private List sort; 14 | 15 | public Pagination(int start, int end, List sort) { 16 | this.start = start; 17 | this.end = end; 18 | this.sort = sort; 19 | } 20 | 21 | public int getStart() { 22 | return start; 23 | } 24 | 25 | public void setStart(int start) { 26 | this.start = start; 27 | } 28 | 29 | public int getEnd() { 30 | return end; 31 | } 32 | 33 | public void setEnd(int end) { 34 | this.end = end; 35 | } 36 | 37 | public List getSort() { 38 | return sort; 39 | } 40 | 41 | public void setSort(List sort) { 42 | this.sort = sort; 43 | } 44 | 45 | @SuppressWarnings("rawtypes") 46 | public List getOrders(Root root, CriteriaBuilder cb) { 47 | List orders = new ArrayList(); 48 | for (Sort s : sort) { 49 | Order o = s.getOrder(root, cb); 50 | if (o != null) { 51 | orders.add(o); 52 | } 53 | } 54 | return orders; 55 | } 56 | } -------------------------------------------------------------------------------- /HelloWorldHibernate/src/main/java/es/com/blogspot/elblogdepicodev/hibernate/dao/SortConstraint.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.hibernate.dao; 2 | 3 | public class SortConstraint { 4 | 5 | private String property; 6 | private Direction direction; 7 | 8 | public String getProperty() { 9 | return property; 10 | } 11 | 12 | public void setProperty(String property) { 13 | this.property = property; 14 | } 15 | 16 | public Direction getDirection() { 17 | return direction; 18 | } 19 | 20 | public void setDirection(Direction direction) { 21 | this.direction = direction; 22 | } 23 | } -------------------------------------------------------------------------------- /HelloWorldMustache/.gitignore: -------------------------------------------------------------------------------- 1 | /.project 2 | -------------------------------------------------------------------------------- /HelloWorldMustache/src/HelloWorldMustache.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Hello World Mustache 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /HelloWorldRESTEasy/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | /.gradle 3 | /.settings 4 | /.classpath 5 | /.project 6 | /bin 7 | -------------------------------------------------------------------------------- /HelloWorldRESTEasy/build.gradle: -------------------------------------------------------------------------------- 1 | description = 'HelloWorldRESTEasy' 2 | version = '0.0.1' 3 | 4 | apply plugin: 'eclipse' 5 | apply plugin: 'java' 6 | apply plugin: 'war' 7 | apply plugin: 'tomcat' 8 | 9 | [tomcatRun, tomcatStop]*.stopKey = 'stopKey' 10 | 11 | buildscript { 12 | repositories { 13 | mavenCentral() 14 | } 15 | 16 | dependencies { 17 | classpath 'org.gradle.api.plugins:gradle-tomcat-plugin:0.9.7' 18 | } 19 | } 20 | 21 | repositories { 22 | mavenRepo name: 'JBoss Thirdparty', url: 'https://repository.jboss.org/nexus/content/repositories/thirdparty-releases' 23 | mavenCentral() 24 | } 25 | 26 | dependencies { 27 | compile 'org.jboss.resteasy:jaxrs-api:2.3.5.Final' 28 | compile 'org.jboss.resteasy:resteasy-jaxrs:2.3.5.Final' 29 | compile 'org.jboss.resteasy:resteasy-jsapi:2.3.5.Final' 30 | compile 'org.jboss.resteasy:resteasy-jaxb-provider:2.3.5.Final' 31 | compile 'org.jboss.resteasy:resteasy-jettison-provider:2.3.5.Final' 32 | 33 | providedCompile 'javax.servlet:servlet-api:2.5' 34 | 35 | // Tomcat 36 | tomcat 'org.apache.tomcat.embed:tomcat-embed-core:7.0.37' 37 | tomcat 'org.apache.tomcat.embed:tomcat-embed-logging-juli:7.0.37' 38 | tomcat('org.apache.tomcat.embed:tomcat-embed-jasper:7.0.37') { 39 | exclude group: 'org.eclipse.jdt.core.compiler', module: 'ecj' 40 | } 41 | } 42 | 43 | task wrapper(type: Wrapper) { 44 | gradleVersion = '1.4' 45 | } -------------------------------------------------------------------------------- /HelloWorldRESTEasy/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/picodotdev/elblogdepicodev/20bd29cd073151284af2620a98dbdbc64c2023e7/HelloWorldRESTEasy/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /HelloWorldRESTEasy/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Fri Mar 01 19:47:35 CET 2013 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=http\://services.gradle.org/distributions/gradle-1.4-bin.zip 7 | -------------------------------------------------------------------------------- /HelloWorldRESTEasy/src/main/java/es/com/blogspot/elblogdepicodev/resteasy/Application.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.resteasy; 2 | 3 | import java.util.Collections; 4 | import java.util.HashSet; 5 | import java.util.Set; 6 | 7 | @SuppressWarnings("unchecked") 8 | public class Application extends javax.ws.rs.core.Application { 9 | 10 | private Set> classes = new HashSet>(); 11 | 12 | public Application() { 13 | classes.add(HelloWorldResourceImpl.class); 14 | } 15 | 16 | @Override 17 | public Set> getClasses() { 18 | return classes; 19 | } 20 | 21 | @Override 22 | public Set getSingletons() { 23 | return Collections.EMPTY_SET; 24 | } 25 | } -------------------------------------------------------------------------------- /HelloWorldRESTEasy/src/main/java/es/com/blogspot/elblogdepicodev/resteasy/HelloWorldResource.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.resteasy; 2 | 3 | import javax.ws.rs.GET; 4 | import javax.ws.rs.Path; 5 | import javax.ws.rs.PathParam; 6 | import javax.ws.rs.Produces; 7 | import javax.ws.rs.core.MediaType; 8 | 9 | @Path("/helloworld") 10 | public interface HelloWorldResource { 11 | 12 | @GET 13 | @Path("/saluda") 14 | public String getSaluda(); 15 | 16 | @GET 17 | @Path("/saluda/{nombre}") 18 | public String getSaludaA(@PathParam("nombre") String nombre); 19 | 20 | @GET 21 | @Path("/mensaje/{nombre}") 22 | @Produces(MediaType.APPLICATION_JSON) 23 | public Mensaje getMensajeJSON(@PathParam("nombre") String nombre); 24 | 25 | @GET 26 | @Path("/mensaje/{nombre}") 27 | @Produces(MediaType.APPLICATION_XML) 28 | public Mensaje getMensajeXML(@PathParam("nombre") String nombre); 29 | } -------------------------------------------------------------------------------- /HelloWorldRESTEasy/src/main/java/es/com/blogspot/elblogdepicodev/resteasy/HelloWorldResourceImpl.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.resteasy; 2 | 3 | import java.text.MessageFormat; 4 | import java.text.SimpleDateFormat; 5 | import java.util.Date; 6 | 7 | public class HelloWorldResourceImpl implements HelloWorldResource { 8 | 9 | @Override 10 | public String getSaluda() { 11 | return "¡Hola mundo!"; 12 | } 13 | 14 | @Override 15 | public String getSaludaA(String nombre) { 16 | return MessageFormat.format("¡Hola {0}!", nombre); 17 | } 18 | 19 | @Override 20 | public Mensaje getMensajeJSON(String nombre) { 21 | return buildMensaje(nombre); 22 | } 23 | 24 | @Override 25 | public Mensaje getMensajeXML(String nombre) { 26 | return buildMensaje(nombre); 27 | } 28 | 29 | private Mensaje buildMensaje(String nombre) { 30 | return new Mensaje(nombre, "¡Hola mundo!", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); 31 | } 32 | } -------------------------------------------------------------------------------- /HelloWorldRESTEasy/src/main/java/es/com/blogspot/elblogdepicodev/resteasy/Mensaje.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.resteasy; 2 | 3 | import javax.xml.bind.annotation.XmlAttribute; 4 | import javax.xml.bind.annotation.XmlElement; 5 | import javax.xml.bind.annotation.XmlRootElement; 6 | 7 | @XmlRootElement(name = "mensaje") 8 | public class Mensaje { 9 | 10 | private String nombre; 11 | private String mensaje; 12 | private String fecha; 13 | 14 | public Mensaje() { 15 | } 16 | 17 | public Mensaje(String nombre, String mensaje, String fecha) { 18 | this.nombre = nombre; 19 | this.mensaje = mensaje; 20 | this.fecha = fecha; 21 | } 22 | 23 | @XmlElement 24 | public String getNombre() { 25 | return nombre; 26 | } 27 | 28 | public void setNombre(String nombre) { 29 | this.nombre = nombre; 30 | } 31 | 32 | @XmlElement 33 | public String getMensaje() { 34 | return mensaje; 35 | } 36 | 37 | public void setMensaje(String mensaje) { 38 | this.mensaje = mensaje; 39 | } 40 | 41 | @XmlAttribute 42 | public String getFecha() { 43 | return fecha; 44 | } 45 | 46 | public void setFecha(String fecha) { 47 | this.fecha = fecha; 48 | } 49 | } -------------------------------------------------------------------------------- /HelloWorldRESTEasy/src/main/webapp/WEB-INF/.gitignore: -------------------------------------------------------------------------------- 1 | /lib 2 | /classes 3 | -------------------------------------------------------------------------------- /HelloWorldRESTEasy/src/main/webapp/WEB-INF/web.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/picodotdev/elblogdepicodev/20bd29cd073151284af2620a98dbdbc64c2023e7/HelloWorldRESTEasy/src/main/webapp/WEB-INF/web.xml -------------------------------------------------------------------------------- /HelloWorldRESTEasy/src/main/webapp/helloworld-resteasy.jsp: -------------------------------------------------------------------------------- 1 | 2 | 3 | Ejemplo sencillo de web service con RESTEasy 4 | 5 | 6 | 7 | 13 | 14 | -------------------------------------------------------------------------------- /HelloWorldRESTEasy/src/main/webapp/index.jsp: -------------------------------------------------------------------------------- 1 | JSP -------------------------------------------------------------------------------- /HelloWorldRequireJS/.gitignore: -------------------------------------------------------------------------------- 1 | /.project 2 | -------------------------------------------------------------------------------- /HelloWorldRequireJS/src/HelloWorldRequireJS.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Hello World RequireJS 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /HelloWorldRequireJS/src/build.js: -------------------------------------------------------------------------------- 1 | ({ 2 | baseUrl: "js", 3 | name: "main", 4 | out: "built.js" 5 | }) 6 | -------------------------------------------------------------------------------- /HelloWorldRequireJS/src/built.js: -------------------------------------------------------------------------------- 1 | define("figuras",[],function(){function e(e){this.lado=e}function t(e,t){this.base=e,this.altura=t}return e.prototype.calculateArea=function(){return this.lado*this.lado},t.prototype.calculateArea=function(){return this.base*this.altura/2},{Cuadrado:e,Triangulo:t}}),require(["figuras"],function(e){var t=new e.Cuadrado(4),n=new e.Triangulo(4,3);alert("El área de un cuadrado de lado "+t.lado+" es "+t.calculateArea()),alert("El área de un triágulo de base "+n.base+" y altura "+n.altura+" es "+n.calculateArea())}),define("main",function(){}); -------------------------------------------------------------------------------- /HelloWorldRequireJS/src/js/figuras.js: -------------------------------------------------------------------------------- 1 | define(function () { 2 | function Cuadrado(lado) { 3 | this.lado = lado; 4 | } 5 | 6 | Cuadrado.prototype.calculateArea = function() { 7 | return this.lado * this.lado; 8 | } 9 | 10 | function Triangulo(base, altura) { 11 | this.base = base; 12 | this.altura = altura; 13 | } 14 | 15 | Triangulo.prototype.calculateArea = function() { 16 | return (this.base * this.altura) / 2; 17 | } 18 | 19 | return {Cuadrado:Cuadrado, Triangulo:Triangulo}; 20 | }); 21 | -------------------------------------------------------------------------------- /HelloWorldRequireJS/src/js/main.js: -------------------------------------------------------------------------------- 1 | require(['figuras'], function(figuras) { 2 | var c = new figuras.Cuadrado(4); 3 | var t = new figuras.Triangulo(4, 3); 4 | 5 | alert('El área de un cuadrado de lado ' + c.lado + ' es ' + c.calculateArea()); 6 | alert('El área de un triágulo de base ' + t.base + ' y altura ' + t.altura + ' es ' + t.calculateArea()); 7 | }); 8 | -------------------------------------------------------------------------------- /HelloWorldSpock/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | /.gradle 3 | /.settings 4 | /bin 5 | .classpath 6 | .project 7 | -------------------------------------------------------------------------------- /HelloWorldSpock/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'eclipse' 2 | apply plugin: 'groovy' 3 | 4 | repositories { 5 | mavenCentral() 6 | } 7 | 8 | dependencies { 9 | groovy 'org.codehaus.groovy:groovy-all:1.8.6' 10 | 11 | testCompile 'org.mockito:mockito-all:1.9.0' 12 | testCompile 'org.spockframework:spock-core:0.6-groovy-1.8' 13 | } 14 | 15 | task wrapper(type: Wrapper) { 16 | gradleVersion = '1.2' 17 | } -------------------------------------------------------------------------------- /HelloWorldSpock/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/picodotdev/elblogdepicodev/20bd29cd073151284af2620a98dbdbc64c2023e7/HelloWorldSpock/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /HelloWorldSpock/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Fri Sep 21 22:21:22 CEST 2012 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=http\://services.gradle.org/distributions/gradle-1.0-bin.zip 7 | -------------------------------------------------------------------------------- /HelloWorldSpock/src/test/groovy/HelloWorldSpock.groovy: -------------------------------------------------------------------------------- 1 | import spock.lang.Specification 2 | 3 | class HelloWorldSpock extends Specification { 4 | def "length of Spock's and his friends' names"() { 5 | expect: 6 | name.size() == length 7 | 8 | where: 9 | name | length 10 | "Spock" | 5 11 | "Kirk" | 4 12 | "Scotty" | 6 13 | } 14 | } -------------------------------------------------------------------------------- /HelloWorldSpock/src/test/groovy/MockitoSpock.groovy: -------------------------------------------------------------------------------- 1 | import spock.lang.Specification 2 | import org.mockito.Mockito 3 | 4 | class MockitoSpock extends Specification { 5 | def "procesado de elementos"() { 6 | setup: 7 | def servicio = Mockito.mock(Servicio.class) 8 | Mockito.when(servicio.findDatos()).thenReturn([[id:1, letra:'A'], [id:2, letra:'B']]) 9 | 10 | def procesador = new Procesador(servicio) 11 | 12 | when: 13 | def resultado = procesador.procesar() 14 | 15 | then: 16 | resultado == '1,2' 17 | } 18 | } 19 | 20 | interface Servicio { 21 | 22 | List findDatos() 23 | } 24 | 25 | class Procesador { 26 | 27 | private Servicio servicio 28 | 29 | Procesador(Servicio servicio) { 30 | this.servicio = servicio 31 | } 32 | 33 | String procesar() { 34 | def datos = servicio.findDatos() 35 | def ids = datos.collect { 36 | it.id 37 | } 38 | return ids.join(',') 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /HelloWorldTapestry5GAE/README.md: -------------------------------------------------------------------------------- 1 | HelloWorldTapestry5GAE 2 | ====================== 3 | 4 | Aplicación ejemplo Hola mundo con Apache Tapestry 5 (5.3.4) para el Google App Engine 5 | 6 | Comandos 7 | -------- 8 | 9 | + Para compilar la aplicación: 10 | 11 | $ ./gradlew clean copyAll 12 | 13 | + Para probar en local: 14 | 15 | $ $GAE_HOME/bin/dev_appserver.sh src/main/webapp/ 16 | 17 | + Para subir la aplicación a Google App Engine: 18 | 19 | $ $GAE_HOME/bin/appcfg.sh update src/main/webapp/ 20 | 21 | Notas 22 | ----- 23 | 24 | + Tapestry file encoding google app engine: 25 | 26 | [TAP5-1778](https://issues.apache.org/jira/browse/TAP5-1778) 27 | [appconfig](http://code.google.com/intl/es-ES/appengine/docs/java/config/appconfig.html) 28 | -------------------------------------------------------------------------------- /HelloWorldTapestry5GAE/gradle.cmd: -------------------------------------------------------------------------------- 1 | @ECHO OFF 2 | %GRADLE_HOME%/bin/gradle %1 3 | -------------------------------------------------------------------------------- /HelloWorldTapestry5GAE/gradle.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | exec $GRADLE_HOME/bin/gradle $@ 3 | -------------------------------------------------------------------------------- /HelloWorldTapestry5GAE/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/picodotdev/elblogdepicodev/20bd29cd073151284af2620a98dbdbc64c2023e7/HelloWorldTapestry5GAE/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /HelloWorldTapestry5GAE/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Fri Jun 29 20:48:05 CEST 2012 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=http\://services.gradle.org/distributions/gradle-1.0-bin.zip 7 | -------------------------------------------------------------------------------- /HelloWorldTapestry5GAE/src/main/java/com/blogspot/elblogdepicodev/tapestry/helloWorld/components/Descripcion.java: -------------------------------------------------------------------------------- 1 | package com.blogspot.elblogdepicodev.tapestry.helloWorld.components; 2 | 3 | import org.apache.tapestry5.ComponentResources; 4 | import org.apache.tapestry5.ioc.annotations.Inject; 5 | 6 | public class Descripcion { 7 | 8 | @Inject 9 | private ComponentResources componentResources; 10 | 11 | public boolean enPaginaJava(){ 12 | return componentResources.getPageName().equals("Index"); 13 | } 14 | } -------------------------------------------------------------------------------- /HelloWorldTapestry5GAE/src/main/java/com/blogspot/elblogdepicodev/tapestry/helloWorld/components/DescripcionGroovy.groovy: -------------------------------------------------------------------------------- 1 | package com.blogspot.elblogdepicodev.tapestry.helloWorld.components 2 | 3 | import org.apache.tapestry5.ComponentResources 4 | import org.apache.tapestry5.ioc.annotations.Inject 5 | 6 | class DescripcionGroovy { 7 | 8 | @Inject 9 | private ComponentResources componentResources 10 | 11 | boolean enPaginaJava(){ 12 | return componentResources.pageName == 'Index' 13 | } 14 | } -------------------------------------------------------------------------------- /HelloWorldTapestry5GAE/src/main/java/com/blogspot/elblogdepicodev/tapestry/helloWorld/components/HolaMundo.java: -------------------------------------------------------------------------------- 1 | package com.blogspot.elblogdepicodev.tapestry.helloWorld.components; 2 | 3 | import org.apache.tapestry5.MarkupWriter; 4 | 5 | public class HolaMundo { 6 | 7 | protected boolean beginRender(MarkupWriter writer) { 8 | writer.write("Hola mundo Tapestry !!!"); 9 | return false; 10 | } 11 | } -------------------------------------------------------------------------------- /HelloWorldTapestry5GAE/src/main/java/com/blogspot/elblogdepicodev/tapestry/helloWorld/components/HolaMundoGroovy.groovy: -------------------------------------------------------------------------------- 1 | package com.blogspot.elblogdepicodev.tapestry.helloWorld.components 2 | 3 | import org.apache.tapestry5.MarkupWriter 4 | 5 | class HolaMundoGroovy { 6 | 7 | protected boolean beginRender(MarkupWriter writer) { 8 | writer.write("Hola mundo Tapestry !!!") 9 | return false 10 | } 11 | } -------------------------------------------------------------------------------- /HelloWorldTapestry5GAE/src/main/java/com/blogspot/elblogdepicodev/tapestry/helloWorld/components/Reloj.js: -------------------------------------------------------------------------------- 1 | function Reloj(spec) { 2 | this.id = spec.id; 3 | 4 | var sthis = this; 5 | 6 | var f = function(pe) { 7 | $(sthis.id).update(new Date().toString()); 8 | }; 9 | 10 | new PeriodicalExecuter(f, 1); 11 | } 12 | 13 | Tapestry.Initializer.reloj = function(spec) { 14 | new Reloj(spec); 15 | } -------------------------------------------------------------------------------- /HelloWorldTapestry5GAE/src/main/java/com/blogspot/elblogdepicodev/tapestry/helloWorld/pages/Index.java: -------------------------------------------------------------------------------- 1 | package com.blogspot.elblogdepicodev.tapestry.helloWorld.pages; 2 | 3 | import org.apache.tapestry5.SymbolConstants; 4 | import org.apache.tapestry5.annotations.Property; 5 | import org.apache.tapestry5.ioc.annotations.Inject; 6 | import org.apache.tapestry5.ioc.annotations.Symbol; 7 | 8 | public class Index { 9 | 10 | @Inject 11 | @Symbol(SymbolConstants.TAPESTRY_VERSION) 12 | @Property 13 | private String tapestryVersion; 14 | } 15 | -------------------------------------------------------------------------------- /HelloWorldTapestry5GAE/src/main/java/com/blogspot/elblogdepicodev/tapestry/helloWorld/pages/Index.tml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Hola mundo Tapestry con Java!!! 7 | 8 | 14 | 15 | 16 | Apache Tapestry 5
17 | Version: ${tapestryVersion}
18 |
19 | 20 | 21 |
22 |
23 | 24 | 25 |
26 |
27 | 28 | 29 |
30 |
31 | 32 | Google App Engine 33 | 34 | 35 | -------------------------------------------------------------------------------- /HelloWorldTapestry5GAE/src/main/java/com/blogspot/elblogdepicodev/tapestry/helloWorld/pages/IndexGroovy.groovy: -------------------------------------------------------------------------------- 1 | package com.blogspot.elblogdepicodev.tapestry.helloWorld.pages 2 | 3 | import org.apache.tapestry5.SymbolConstants; 4 | import org.apache.tapestry5.annotations.Property; 5 | import org.apache.tapestry5.ioc.annotations.Inject; 6 | import org.apache.tapestry5.ioc.annotations.Symbol; 7 | 8 | class IndexGroovy { 9 | 10 | @Inject 11 | @Symbol(SymbolConstants.TAPESTRY_VERSION) 12 | @Property 13 | private String tapestryVersion; 14 | } -------------------------------------------------------------------------------- /HelloWorldTapestry5GAE/src/main/java/com/blogspot/elblogdepicodev/tapestry/helloWorld/pages/IndexGroovy.tml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Hola mundo Tapestry con Groovy!!! 7 | 8 | 14 | 15 | 16 | Apache Tapestry 5
17 | Version: ${tapestryVersion}
18 |
19 | 20 | 21 |
22 |
23 | 24 | 25 |
26 |
27 | 28 | 29 |
30 |
31 | 32 | Google App Engine 33 | 34 | 35 | -------------------------------------------------------------------------------- /HelloWorldTapestry5GAE/src/main/java/com/blogspot/elblogdepicodev/tapestry/helloWorld/services/AppModule.java: -------------------------------------------------------------------------------- 1 | package com.blogspot.elblogdepicodev.tapestry.helloWorld.services; 2 | 3 | import org.apache.tapestry5.SymbolConstants; 4 | import org.apache.tapestry5.ioc.MappedConfiguration; 5 | 6 | public class AppModule { 7 | public static void contributeApplicationDefaults(MappedConfiguration configuration) { 8 | String production = "true"; 9 | configuration.add(SymbolConstants.PRODUCTION_MODE, production); 10 | configuration.add(SymbolConstants.COMPRESS_WHITESPACE, production); 11 | configuration.add(SymbolConstants.COMBINE_SCRIPTS, production); 12 | configuration.add(SymbolConstants.MINIFICATION_ENABLED, production); 13 | configuration.add(SymbolConstants.COMPACT_JSON, production); 14 | configuration.add(SymbolConstants.SUPPORTED_LOCALES, "es"); 15 | } 16 | } -------------------------------------------------------------------------------- /HtmlError/src/HtmlError.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | ¡Html Error! 5 | 6 | 15 | 16 | 17 |

¡Html Error!

18 | 19 | 20 | -------------------------------------------------------------------------------- /HtmlError/src/js/main.js: -------------------------------------------------------------------------------- 1 | require(['log4javascript'], function(log4j) { 2 | var log4j = log4javascript; 3 | 4 | var ajaxAppender = new log4j.AjaxAppender('http://localhost:8080/html-error/ajaxAppender'); 5 | var ajaxLayout = new log4j.PatternLayout('%d{HH:mm:ss} %-5p %c %m%n'); 6 | ajaxAppender.setLayout(ajaxLayout); 7 | ajaxAppender.setThreshold(log4j.Level.INFO); 8 | 9 | log4j.setEnabled(true); 10 | 11 | var log = log4j.getLogger('es.com.blogspot.elblogdepicodev.log4javascript'); 12 | 13 | log.addAppender(ajaxAppender); 14 | 15 | // Capturador de errores javascript 16 | window.onerror = function(message, url, linenumber) { 17 | log.error(message + ", " + url + ", " + linenumber); 18 | } 19 | 20 | // ¡Atención!: La siguiente linea de código va a producir un error 21 | error; 22 | }); 23 | -------------------------------------------------------------------------------- /Jansi/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'eclipse' 2 | apply plugin: 'java' 3 | apply plugin: 'application' 4 | 5 | mainClassName = 'es.com.blogspot.elblogdepicodev.jansi.ColorConsola' 6 | 7 | repositories { 8 | mavenCentral() 9 | } 10 | 11 | dependencies { 12 | compile 'org.fusesource.jansi:jansi:1.9' 13 | } 14 | 15 | task wrapper(type: Wrapper) { 16 | gradleVersion = '1.3' 17 | } 18 | -------------------------------------------------------------------------------- /Jansi/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/picodotdev/elblogdepicodev/20bd29cd073151284af2620a98dbdbc64c2023e7/Jansi/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /Jansi/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Fri Dec 21 21:43:42 CET 2012 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=http\://services.gradle.org/distributions/gradle-1.3-bin.zip 7 | -------------------------------------------------------------------------------- /JavaProperties/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'eclipse' 2 | apply plugin: 'java' 3 | apply plugin: 'application' 4 | 5 | mainClassName = 'es.com.blogspot.elblogdepicodev.properties.Main' 6 | 7 | repositories { 8 | mavenCentral() 9 | } 10 | 11 | dependencies { 12 | } 13 | 14 | task wrapper(type: Wrapper) { 15 | gradleVersion = '1.7' 16 | } 17 | -------------------------------------------------------------------------------- /JavaProperties/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/picodotdev/elblogdepicodev/20bd29cd073151284af2620a98dbdbc64c2023e7/JavaProperties/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /JavaProperties/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Fri Sep 20 18:41:16 CEST 2013 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=http\://services.gradle.org/distributions/gradle-1.7-bin.zip 7 | -------------------------------------------------------------------------------- /JavaProperties/src/main/java/es/com/blogspot/elblogdepicodev/properties/Main.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.properties; 2 | 3 | import java.util.ResourceBundle; 4 | 5 | public class Main { 6 | 7 | public static void main(String[] args) { 8 | // Cargar un archivo properties en ISO-8859-1. Los caracteres del String obtenido de prueba se cargan correctamente. 9 | { 10 | ResourceBundle bundle = ResourceBundle.getBundle("default"); 11 | 12 | String s = bundle.getString("prueba"); 13 | System.out.println(s); 14 | } 15 | 16 | // Cargar un archivo properties UTF-8 con codificación ISO-8859-1. Los caracteres del String obtenido de prueba NO se cargan correctamente. 17 | { 18 | ResourceBundle bundle = ResourceBundle.getBundle("utf8-1"); 19 | 20 | String s = bundle.getString("prueba"); 21 | System.out.println(s); 22 | } 23 | 24 | // Cargar un archivo properties en UTF-8. Los caracteres del String obtenido de prueba se cargan correctamente. 25 | { 26 | ResourceBundle bundle = ResourceBundle.getBundle("utf8-2", new EncodingControl("UTF-8")); 27 | 28 | String s = bundle.getString("prueba"); 29 | System.out.println(s); 30 | } 31 | } 32 | } -------------------------------------------------------------------------------- /JavaProperties/src/main/resources/default.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/picodotdev/elblogdepicodev/20bd29cd073151284af2620a98dbdbc64c2023e7/JavaProperties/src/main/resources/default.properties -------------------------------------------------------------------------------- /JavaProperties/src/main/resources/utf8-1.properties: -------------------------------------------------------------------------------- 1 | prueba=Esta es una prueba con la codificación utf-8 (áéíóú ñ). -------------------------------------------------------------------------------- /JavaProperties/src/main/resources/utf8-2.properties: -------------------------------------------------------------------------------- 1 | prueba=Esta es una prueba con la codificación utf-8 (áéíóú ñ). -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | This is free and unencumbered software released into the public domain. 2 | 3 | Anyone is free to copy, modify, publish, use, compile, sell, or 4 | distribute this software, either in source code form or as a compiled 5 | binary, for any purpose, commercial or non-commercial, and by any 6 | means. 7 | 8 | In jurisdictions that recognize copyright laws, the author or authors 9 | of this software dedicate any and all copyright interest in the 10 | software to the public domain. We make this dedication for the benefit 11 | of the public at large and to the detriment of our heirs and 12 | successors. We intend this dedication to be an overt act of 13 | relinquishment in perpetuity of all present and future rights to this 14 | software under copyright law. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 19 | IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR 20 | OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 21 | ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22 | OTHER DEALINGS IN THE SOFTWARE. 23 | 24 | For more information, please refer to 25 | -------------------------------------------------------------------------------- /Log4javascript/src/HelloWorldLog4javscript.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | ¡Hola mundo con log4javascript! 5 | 6 | 15 | 16 | 17 |

¡Hola mundo con log4javascript!

18 | 19 | 20 | -------------------------------------------------------------------------------- /Log4javascript/src/js/main.js: -------------------------------------------------------------------------------- 1 | require(['log4javascript'], function(log4j) { 2 | var layout = new log4j.PatternLayout('%d{HH:mm:ss} %-5p %c %m%n'); 3 | 4 | var popUpAppender = new log4j.PopUpAppender(); 5 | popUpAppender.setLayout(layout); 6 | popUpAppender.setThreshold(log4j.Level.INFO); 7 | 8 | var ajaxAppender = new log4j.AjaxAppender('ajaxAppender'); 9 | ajaxAppender.setLayout(layout); 10 | ajaxAppender.setThreshold(log4j.Level.ERROR); 11 | 12 | log4j.setEnabled(true); 13 | 14 | var log = log4j.getLogger('es.com.blogspot.elblogdepicodev.log4javascript'); 15 | 16 | log.addAppender(popUpAppender); 17 | log.addAppender(ajaxAppender); 18 | 19 | log.trace("Tracing message (appears in pop-up)"); 20 | log.debug("Debugging message (appears in pop-up)"); 21 | log.warn("Warn message (appears in pop-up)"); 22 | log.info("Info message (appears in pop-up)"); 23 | log.error("Error message (appears in pop-up and in server log)"); 24 | log.fatal("Fatal message (appears in pop-up and in server log)"); 25 | }); 26 | -------------------------------------------------------------------------------- /MarionetteREST/.gitignore: -------------------------------------------------------------------------------- 1 | /bin 2 | /build 3 | /.classpath 4 | /.project 5 | /.gradle 6 | /.settings 7 | /node_modules 8 | -------------------------------------------------------------------------------- /MarionetteREST/build.js: -------------------------------------------------------------------------------- 1 | ({ 2 | baseUrl: 'src/main/webapp/js', 3 | name: 'main', 4 | out: 'src/main/webapp/js/main.min.js', 5 | shim: { 6 | 'underscore': { 7 | exports: '_' 8 | }, 9 | 'json2': { 10 | exports: 'JSON' 11 | }, 12 | 'backbone': { 13 | deps: ['jquery', 'underscore', 'json2'], 14 | exports: 'Backbone' 15 | }, 16 | 'backbone.marionette' : { 17 | deps : [ 'backbone' ], 18 | exports : 'Marionette' 19 | } 20 | }, 21 | }) 22 | -------------------------------------------------------------------------------- /MarionetteREST/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/picodotdev/elblogdepicodev/20bd29cd073151284af2620a98dbdbc64c2023e7/MarionetteREST/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /MarionetteREST/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Fri Apr 04 17:07:47 CEST 2014 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=http\://services.gradle.org/distributions/gradle-1.10-bin.zip 7 | -------------------------------------------------------------------------------- /MarionetteREST/grunt.js: -------------------------------------------------------------------------------- 1 | module.exports = function(grunt) { 2 | grunt.initConfig({ 3 | pkg: grunt.file.readJSON('package.json'), 4 | jasmine: { 5 | requirejs: { 6 | options: { 7 | specs: 'src/**/specs/main-specs.js', 8 | template: require('grunt-template-jasmine-requirejs'), 9 | templateOptions: { 10 | requireConfigFile : 'src/main/webapp/js/specs/requirejs-config.js', 11 | requireConfig: { 12 | baseUrl: './src/main/webapp/js' 13 | } 14 | } 15 | } 16 | } 17 | } 18 | }); 19 | 20 | grunt.loadNpmTasks('grunt-contrib-jasmine'); 21 | 22 | grunt.registerTask('test', ['connect', 'jasmine:requirejs']); 23 | }; -------------------------------------------------------------------------------- /MarionetteREST/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "backbone-rest", 3 | "version": "0.1.0", 4 | "devDependencies": { 5 | "grunt": "0.4.4", 6 | "grunt-contrib-jasmine": "^0.5.3" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /MarionetteREST/src/main/java/es/com/blogspot/elblogdepicodev/todo/rest/Application.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.todo.rest; 2 | 3 | import java.util.Collection; 4 | import java.util.Collections; 5 | import java.util.HashSet; 6 | import java.util.Set; 7 | 8 | @SuppressWarnings("unchecked") 9 | public class Application extends javax.ws.rs.core.Application { 10 | 11 | private Set singletons; 12 | 13 | public Application(Collection singletons) { 14 | this.singletons = new HashSet(); 15 | this.singletons.addAll(singletons); 16 | } 17 | 18 | @Override 19 | public Set> getClasses() { 20 | return Collections.EMPTY_SET; 21 | } 22 | 23 | @Override 24 | public Set getSingletons() { 25 | return singletons; 26 | } 27 | } -------------------------------------------------------------------------------- /MarionetteREST/src/main/java/es/com/blogspot/elblogdepicodev/todo/rest/Tarea.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.todo.rest; 2 | 3 | public class Tarea { 4 | 5 | private Long id; 6 | 7 | private String descripcion; 8 | 9 | private Boolean completada; 10 | 11 | public Tarea() { 12 | } 13 | 14 | public Tarea(String descripcion, Boolean completada) { 15 | this(null, descripcion, completada); 16 | } 17 | 18 | public Tarea(Long id, String descripcion, Boolean completada) { 19 | this.id = id; 20 | this.descripcion = descripcion; 21 | this.completada = completada; 22 | } 23 | 24 | public Long getId() { 25 | return id; 26 | } 27 | 28 | public void setId(Long id) { 29 | this.id = id; 30 | } 31 | 32 | public String getDescripcion() { 33 | return descripcion; 34 | } 35 | 36 | public void setDescripcion(String descripcion) { 37 | this.descripcion = descripcion; 38 | } 39 | 40 | public Boolean isCompletada() { 41 | return completada; 42 | } 43 | 44 | public void setCompletada(Boolean completada) { 45 | this.completada = completada; 46 | } 47 | } -------------------------------------------------------------------------------- /MarionetteREST/src/main/java/es/com/blogspot/elblogdepicodev/todo/rest/TareasResource.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.todo.rest; 2 | 3 | import java.util.Collection; 4 | 5 | import javax.ws.rs.Consumes; 6 | import javax.ws.rs.DELETE; 7 | import javax.ws.rs.GET; 8 | import javax.ws.rs.POST; 9 | import javax.ws.rs.PUT; 10 | import javax.ws.rs.Path; 11 | import javax.ws.rs.PathParam; 12 | import javax.ws.rs.Produces; 13 | import javax.ws.rs.core.MediaType; 14 | 15 | @Path("/tareas") 16 | public interface TareasResource { 17 | 18 | @Path("/tarea") 19 | @POST 20 | @Consumes(MediaType.APPLICATION_JSON) 21 | @Produces(MediaType.APPLICATION_JSON) 22 | public Tarea createTarea(Tarea tarea); 23 | 24 | @Path("/") 25 | @GET 26 | @Produces(MediaType.APPLICATION_JSON) 27 | public Collection readTareas(); 28 | 29 | @Path("/tarea/{id}") 30 | @PUT 31 | @Consumes(MediaType.APPLICATION_JSON) 32 | @Produces(MediaType.APPLICATION_JSON) 33 | public Tarea updateTarea(Tarea tarea); 34 | 35 | @Path("/tarea/{id}") 36 | @DELETE 37 | public void deleteTarea(@PathParam("id") Long id); 38 | } -------------------------------------------------------------------------------- /MarionetteREST/src/main/java/es/com/blogspot/elblogdepicodev/todo/rest/TareasResourceImpl.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.todo.rest; 2 | 3 | import java.util.Collection; 4 | import java.util.TreeMap; 5 | 6 | public class TareasResourceImpl implements TareasResource { 7 | 8 | private TreeMap tareas; 9 | 10 | public TareasResourceImpl() { 11 | tareas = new TreeMap(); 12 | } 13 | 14 | @Override 15 | public Tarea createTarea(Tarea tarea) { 16 | Long id = 1l; 17 | if (!tareas.isEmpty()) { 18 | id = tareas.lastKey() + 1; 19 | } 20 | tarea.setId(id); 21 | tareas.put(id, tarea); 22 | return tarea; 23 | } 24 | 25 | @Override 26 | public Collection readTareas() { 27 | return tareas.values(); 28 | } 29 | 30 | @Override 31 | public Tarea updateTarea(Tarea tarea) { 32 | tareas.put(tarea.getId(), tarea); 33 | return tarea; 34 | } 35 | 36 | @Override 37 | public void deleteTarea(Long id) { 38 | tareas.remove(id); 39 | } 40 | } -------------------------------------------------------------------------------- /MarionetteREST/src/main/java/es/com/blogspot/elblogdepicodev/todo/tapestry/components/HolaMundo.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.todo.tapestry.components; 2 | 3 | import org.apache.tapestry5.MarkupWriter; 4 | 5 | public class HolaMundo { 6 | 7 | protected boolean beginRender(MarkupWriter writer) { 8 | writer.write("Hola mundo Tapestry !!!"); 9 | return false; 10 | } 11 | } -------------------------------------------------------------------------------- /MarionetteREST/src/main/java/es/com/blogspot/elblogdepicodev/todo/tapestry/services/ResteasySymbols.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.todo.tapestry.services; 2 | 3 | public class ResteasySymbols { 4 | 5 | public static final String MAPPING_PREFIX = "resteasy.servlet.mapping.prefix"; 6 | public static final String MAPPING_PREFIX_JSAPI = "resteasy.servlet.mapping.prefix.jsapi"; 7 | 8 | } -------------------------------------------------------------------------------- /MarionetteREST/src/main/java/es/com/blogspot/elblogdepicodev/todo/tapestry/services/TapestryResteasyBootstrap.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.todo.tapestry.services; 2 | 3 | import javax.servlet.ServletContext; 4 | 5 | import org.apache.tapestry5.ioc.services.SymbolSource; 6 | import org.jboss.resteasy.plugins.server.servlet.ListenerBootstrap; 7 | 8 | public class TapestryResteasyBootstrap extends ListenerBootstrap { 9 | 10 | SymbolSource source; 11 | 12 | public TapestryResteasyBootstrap(ServletContext servletContext, SymbolSource source) { 13 | super(servletContext); 14 | this.source = source; 15 | } 16 | 17 | public String getParameter(String name) { 18 | String val = null; 19 | 20 | try { 21 | val = source.valueForSymbol(name); 22 | } catch (RuntimeException e) { 23 | // ignore symbol not found 24 | } 25 | 26 | if (val == null) 27 | val = super.getParameter(name); 28 | 29 | return val; 30 | } 31 | 32 | @Override 33 | public String getInitParameter(String name) { 34 | return getParameter(name); 35 | } 36 | } -------------------------------------------------------------------------------- /MarionetteREST/src/main/resources/log4j.properties: -------------------------------------------------------------------------------- 1 | # Set root logger level to DEBUG and its only appender to A1. 2 | log4j.rootLogger=ERROR, A1 3 | 4 | # A1 is set to be a ConsoleAppender. 5 | log4j.appender.A1=org.apache.log4j.ConsoleAppender 6 | 7 | # A1 uses PatternLayout. 8 | log4j.appender.A1.layout=org.apache.log4j.PatternLayout 9 | log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n -------------------------------------------------------------------------------- /MarionetteREST/src/main/webapp/WEB-INF/.gitignore: -------------------------------------------------------------------------------- 1 | /lib 2 | -------------------------------------------------------------------------------- /MarionetteREST/src/main/webapp/WEB-INF/classes/.gitignore: -------------------------------------------------------------------------------- 1 | /es 2 | -------------------------------------------------------------------------------- /MarionetteREST/src/main/webapp/WEB-INF/web.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | BackboneREST 4 | Aplicacion de ejemplo de una lista de tareas usando Backbone y un servicio REST 5 | 6 | 7 | 9 | tapestry.app-package 10 | es.com.blogspot.elblogdepicodev.todo.tapestry 11 | 12 | 13 | 14 | app 15 | org.apache.tapestry5.TapestryFilter 16 | 17 | 18 | 19 | app 20 | /* 21 | 22 | 23 | 24 | 30 25 | COOKIE 26 | 27 | 28 | 29 | Index 30 | 31 | -------------------------------------------------------------------------------- /MarionetteREST/src/main/webapp/bootstrap/img/glyphicons-halflings-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/picodotdev/elblogdepicodev/20bd29cd073151284af2620a98dbdbc64c2023e7/MarionetteREST/src/main/webapp/bootstrap/img/glyphicons-halflings-white.png -------------------------------------------------------------------------------- /MarionetteREST/src/main/webapp/bootstrap/img/glyphicons-halflings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/picodotdev/elblogdepicodev/20bd29cd073151284af2620a98dbdbc64c2023e7/MarionetteREST/src/main/webapp/bootstrap/img/glyphicons-halflings.png -------------------------------------------------------------------------------- /MarionetteREST/src/main/webapp/images/backbone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/picodotdev/elblogdepicodev/20bd29cd073151284af2620a98dbdbc64c2023e7/MarionetteREST/src/main/webapp/images/backbone.png -------------------------------------------------------------------------------- /MarionetteREST/src/main/webapp/images/marionette.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/picodotdev/elblogdepicodev/20bd29cd073151284af2620a98dbdbc64c2023e7/MarionetteREST/src/main/webapp/images/marionette.png -------------------------------------------------------------------------------- /MarionetteREST/src/main/webapp/images/requirejs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/picodotdev/elblogdepicodev/20bd29cd073151284af2620a98dbdbc64c2023e7/MarionetteREST/src/main/webapp/images/requirejs.png -------------------------------------------------------------------------------- /MarionetteREST/src/main/webapp/images/tapestry5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/picodotdev/elblogdepicodev/20bd29cd073151284af2620a98dbdbc64c2023e7/MarionetteREST/src/main/webapp/images/tapestry5.png -------------------------------------------------------------------------------- /MarionetteREST/src/main/webapp/js/i18n/nls/en/mensajes.js: -------------------------------------------------------------------------------- 1 | define({ 2 | 'Lista_de_tareas': 'Tasks List', 3 | 'COMPLETADAS_tareas_de_TOTAL_completadas': '{{completadas}} tasks of {{total}} completed', 4 | 'Muy_bien_has_completado_todas_las_tareas': '¡Perfect! You has done all tasks', 5 | 'Limpiar': 'Clean', 6 | 'Introduce_una_nueva_tarea': 'Type a new task' 7 | }); -------------------------------------------------------------------------------- /MarionetteREST/src/main/webapp/js/i18n/nls/mensajes.js: -------------------------------------------------------------------------------- 1 | define({ 2 | 'root': { 3 | 'Lista_de_tareas': 'Lista de tareas', 4 | 'COMPLETADAS_tareas_de_TOTAL_completadas': '{{completadas}} tareas de {{total}} completadas', 5 | 'Muy_bien_has_completado_todas_las_tareas': '¡Muy bien! has completado todas las tareas', 6 | 'Limpiar': 'Limpiar', 7 | 'Introduce_una_nueva_tarea': 'Introduce una nueva tarea' 8 | }, 9 | 'en': true 10 | }); -------------------------------------------------------------------------------- /MarionetteREST/src/main/webapp/js/main.js: -------------------------------------------------------------------------------- 1 | define(['tareas'], function(tareas) { 2 | var tareasApp = new tareas.TareasApp({ el: "#tareas" }); 3 | 4 | // Cargar los datos iniciales de la lista de tareas 5 | // Usar los datos precargados en la página, para evitar una petición 6 | // al servidor, los datos se incluyen en la página html de la aplicación. 7 | //tareasApp.resetTareas(tareas); 8 | 9 | // Aunque en la documentación de backbone recomiendan precargar los datos en la 10 | // página, esto impide cachearla, dependiendo 11 | // de la página tal vez sea mejor cachear la página y pedir los datos 12 | // en una petición AJAX. 13 | tareasApp.fetch(); 14 | }); -------------------------------------------------------------------------------- /MarionetteREST/src/main/webapp/js/plantillas.js: -------------------------------------------------------------------------------- 1 | define('plantillas', ['mustache', 'text!plantillas/tareas.mustache', 'text!plantillas/tarea.mustache', 'text!plantillas/estado.mustache'], function(Mustache, tareas, tarea, estado) { 2 | var cache = {}; 3 | 4 | function get(plantilla) { 5 | if (cache[plantilla] == null) { 6 | cache[plantilla] = Mustache.compile(plantilla); 7 | } 8 | return cache[plantilla]; 9 | } 10 | 11 | return { 12 | tareas: function() { 13 | return get(tareas); 14 | }, 15 | tarea: function() { 16 | return get(tarea); 17 | }, 18 | estado: function() { 19 | return get(estado); 20 | } 21 | } 22 | }); -------------------------------------------------------------------------------- /MarionetteREST/src/main/webapp/js/plantillas/estado.mustache: -------------------------------------------------------------------------------- 1 | {{#total}} 2 | {{message.COMPLETADAS_tareas_de_TOTAL_completadas}} 3 | {{/total}} 4 | {{^total}} 5 | {{message.Muy_bien_has_completado_todas_las_tareas}} 6 | {{/total}} -------------------------------------------------------------------------------- /MarionetteREST/src/main/webapp/js/plantillas/tarea.mustache: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /MarionetteREST/src/main/webapp/js/plantillas/tareas.mustache: -------------------------------------------------------------------------------- 1 |

{{message.Lista_de_tareas}}

2 | 3 |
4 |
5 | -------------------------------------------------------------------------------- /MarionetteREST/src/main/webapp/js/specs/main-specs.js: -------------------------------------------------------------------------------- 1 | define(['specs/tareas-specs'], function() { 2 | }); -------------------------------------------------------------------------------- /MarionetteREST/src/main/webapp/js/specs/requirejs-config.js: -------------------------------------------------------------------------------- 1 | requirejs.config({ 2 | baseUrl: './', 3 | shim : { 4 | 'underscore': { 5 | exports: '_' 6 | }, 7 | 'backbone': { 8 | deps: ['underscore'], 9 | exports: 'Backbone' 10 | }, 11 | 'json2': { 12 | exports: 'JSON' 13 | }, 14 | 'backbone.marionette': { 15 | deps: [ 'backbone' ], 16 | exports: 'Marionette' 17 | }, 18 | 'sinon': { 19 | exports: 'sinon' 20 | } 21 | }, 22 | locale: 'es' 23 | }); -------------------------------------------------------------------------------- /PatronState/.gitignore: -------------------------------------------------------------------------------- 1 | /bin 2 | /build 3 | /.classpath 4 | /.project 5 | /.settings 6 | /.gradle 7 | -------------------------------------------------------------------------------- /PatronState/build.gradle: -------------------------------------------------------------------------------- 1 | description = 'PatronState' 2 | version = '0.0.1' 3 | 4 | apply plugin: 'eclipse' 5 | apply plugin: 'java' 6 | 7 | repositories { 8 | mavenCentral() 9 | } 10 | 11 | dependencies { 12 | testCompile 'junit:junit:4.11' 13 | } 14 | 15 | task wrapper(type: Wrapper) { 16 | gradleVersion = '1.7' 17 | } 18 | -------------------------------------------------------------------------------- /PatronState/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/picodotdev/elblogdepicodev/20bd29cd073151284af2620a98dbdbc64c2023e7/PatronState/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /PatronState/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Sat Aug 24 20:56:26 CEST 2013 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=http\://services.gradle.org/distributions/gradle-1.7-bin.zip 7 | -------------------------------------------------------------------------------- /PatronState/src/main/java/es/com/blogspot/elblogdepicodev/pattern/state/compraState/CanceladaCompraState.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.pattern.state.compraState; 2 | 3 | import es.com.blogspot.elblogdepicodev.pattern.state.Compra; 4 | 5 | public class CanceladaCompraState extends AbstractCompraState { 6 | 7 | public CanceladaCompraState(Compra compra) { 8 | super(compra); 9 | } 10 | } -------------------------------------------------------------------------------- /PatronState/src/main/java/es/com/blogspot/elblogdepicodev/pattern/state/compraState/CompraState.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.pattern.state.compraState; 2 | 3 | import java.math.BigDecimal; 4 | 5 | import es.com.blogspot.elblogdepicodev.pattern.state.Compra.FormaEnvio; 6 | import es.com.blogspot.elblogdepicodev.pattern.state.Compra.FormaPago; 7 | 8 | public interface CompraState { 9 | 10 | void comprar(BigDecimal precio, FormaPago formaPago, FormaEnvio formaEnvio); 11 | void verificar(); 12 | void cancelar(); 13 | void enviar(); 14 | } -------------------------------------------------------------------------------- /PatronState/src/main/java/es/com/blogspot/elblogdepicodev/pattern/state/compraState/CreadaCompraState.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.pattern.state.compraState; 2 | 3 | import java.math.BigDecimal; 4 | 5 | import es.com.blogspot.elblogdepicodev.pattern.state.Compra; 6 | import es.com.blogspot.elblogdepicodev.pattern.state.Compra.FormaEnvio; 7 | import es.com.blogspot.elblogdepicodev.pattern.state.Compra.FormaPago; 8 | import es.com.blogspot.elblogdepicodev.pattern.state.CompraStateFactory.Estado; 9 | 10 | public class CreadaCompraState extends AbstractCompraState { 11 | 12 | public CreadaCompraState(Compra compra) { 13 | super(compra); 14 | } 15 | 16 | @Override 17 | public void comprar(BigDecimal precio, FormaPago formaPago, FormaEnvio formaEnvio) { 18 | getCompra().setPrecio(precio); 19 | getCompra().setFormaPago(formaPago); 20 | getCompra().setFormaEnvio(formaEnvio); 21 | 22 | getCompra().setEstado(Estado.EN_ESPERA); 23 | } 24 | 25 | @Override 26 | public void cancelar() { 27 | getCompra().setEstado(Estado.CANCELADA); 28 | } 29 | } -------------------------------------------------------------------------------- /PatronState/src/main/java/es/com/blogspot/elblogdepicodev/pattern/state/compraState/EnEsperaCompraState.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.pattern.state.compraState; 2 | 3 | import es.com.blogspot.elblogdepicodev.pattern.state.Compra; 4 | import es.com.blogspot.elblogdepicodev.pattern.state.CompraStateFactory.Estado; 5 | 6 | public class EnEsperaCompraState extends AbstractCompraState { 7 | 8 | public EnEsperaCompraState(Compra compra) { 9 | super(compra); 10 | } 11 | 12 | @Override 13 | public void verificar() { 14 | getCompra().setEstado(Estado.VERIFICADA); 15 | } 16 | 17 | @Override 18 | public void cancelar() { 19 | getCompra().setEstado(Estado.CANCELADA); 20 | } 21 | } -------------------------------------------------------------------------------- /PatronState/src/main/java/es/com/blogspot/elblogdepicodev/pattern/state/compraState/EnviadaCompraState.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.pattern.state.compraState; 2 | 3 | import es.com.blogspot.elblogdepicodev.pattern.state.Compra; 4 | 5 | public class EnviadaCompraState extends AbstractCompraState { 6 | 7 | public EnviadaCompraState(Compra compra) { 8 | super(compra); 9 | } 10 | } -------------------------------------------------------------------------------- /PatronState/src/main/java/es/com/blogspot/elblogdepicodev/pattern/state/compraState/VerificadaCompraState.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.pattern.state.compraState; 2 | 3 | import es.com.blogspot.elblogdepicodev.pattern.state.Compra; 4 | import es.com.blogspot.elblogdepicodev.pattern.state.CompraStateFactory.Estado; 5 | 6 | public class VerificadaCompraState extends AbstractCompraState { 7 | 8 | public VerificadaCompraState(Compra compra) { 9 | super(compra); 10 | } 11 | 12 | @Override 13 | public void enviar() { 14 | getCompra().setEstado(Estado.ENVIADA); 15 | } 16 | } -------------------------------------------------------------------------------- /PatronState/src/test/java/es/com/blogspot/elblogdepicodev/pattern/state/CompraStateTest.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.pattern.state; 2 | 3 | import java.math.BigDecimal; 4 | 5 | import org.junit.Assert; 6 | import org.junit.Test; 7 | 8 | import es.com.blogspot.elblogdepicodev.pattern.state.compraState.EnviadaCompraState; 9 | 10 | public class CompraStateTest { 11 | 12 | @Test 13 | public void test1() { 14 | Compra compra = new Compra(); 15 | compra.getEstado().comprar(new BigDecimal("10.50"), Compra.FormaPago.PAYPAL, Compra.FormaEnvio.UPS); 16 | compra.getEstado().verificar(); 17 | compra.getEstado().enviar(); 18 | 19 | Assert.assertTrue(compra.getEstado() instanceof EnviadaCompraState); 20 | } 21 | } -------------------------------------------------------------------------------- /PlugInTapestry/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | /target 3 | /.gradle 4 | /.settings 5 | /bin 6 | /.classpath 7 | /.project 8 | -------------------------------------------------------------------------------- /PlugInTapestry/README.md: -------------------------------------------------------------------------------- 1 | Esta es la aplicación con el código fuente completo de los ejemplos del libro [PlugIn Tapestry](http://goo.gl/WFQgY). 2 | 3 | Puedes probar los ejemplos muy fácilmente y sin necesidad de instalar nada previamente en tu equipo 4 | (salvo git y ni eso ya que puedes descargar el [siguiente zip con todo el código del repositorio](https://github.com/picodotdev/elblogdepicodev/archive/master.zip)). 5 | 6 | Utiliza los siguientes comandos para probarlos en tu equipo. 7 | 8 | ### Windows 9 |

10 | git clone git://github.com/picodotdev/elblogdepicodev.git 
11 | # Si no se dispone de git, descargar el zip con el repositorio completo y descomprimir 
12 | cd elblogdepicodev/PlugInTapestry/ 
13 | ./gradlew.cmd tomcatRun 
14 | # Abrir en el navegador con la URL indicada al final de la terminal
15 | 
16 | 17 | ### Linux / Mac 18 |

19 | git clone git://github.com/picodotdev/elblogdepicodev.git 
20 | # Si no se dispone de git, descargar el zip con el repositorio completo y descomprimir 
21 | cd elblogdepicodev/PlugInTapestry/ 
22 | ./gradlew tomcatRun 
23 | # Abrir en el navegador con la URL indicada al final de la terminal
24 | 
25 | 26 | ###### Mensajes del inicio del servidor de aplicaciones 27 | ![Inicio servidor de aplicaciones](/misc/inicio-rapido-5.png) 28 | 29 | ###### Captura de la aplicación 30 | ![Inicio servidor de aplicaciones](/misc/PlugInTapestry.png) -------------------------------------------------------------------------------- /PlugInTapestry/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/picodotdev/elblogdepicodev/20bd29cd073151284af2620a98dbdbc64c2023e7/PlugInTapestry/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /PlugInTapestry/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Sat Apr 11 01:35:02 CEST 2015 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-2.3-bin.zip 7 | -------------------------------------------------------------------------------- /PlugInTapestry/misc/PlugInTapestry.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/picodotdev/elblogdepicodev/20bd29cd073151284af2620a98dbdbc64c2023e7/PlugInTapestry/misc/PlugInTapestry.png -------------------------------------------------------------------------------- /PlugInTapestry/misc/inicio-rapido-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/picodotdev/elblogdepicodev/20bd29cd073151284af2620a98dbdbc64c2023e7/PlugInTapestry/misc/inicio-rapido-5.png -------------------------------------------------------------------------------- /PlugInTapestry/src/main/java/es/com/blogspot/elblogdepicodev/plugintapestry/components/Ajax.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.plugintapestry.components; 2 | 3 | import org.apache.tapestry5.BindingConstants; 4 | import org.apache.tapestry5.ComponentResources; 5 | import org.apache.tapestry5.MarkupWriter; 6 | import org.apache.tapestry5.annotations.Environmental; 7 | import org.apache.tapestry5.annotations.Parameter; 8 | import org.apache.tapestry5.ioc.annotations.Inject; 9 | import org.apache.tapestry5.json.JSONArray; 10 | import org.apache.tapestry5.json.JSONObject; 11 | import org.apache.tapestry5.services.javascript.JavaScriptSupport; 12 | 13 | /** 14 | * @tapestrydoc 15 | */ 16 | public class Ajax { 17 | 18 | @Parameter(defaultPrefix = BindingConstants.LITERAL) 19 | private String selector; 20 | 21 | @Environmental 22 | private JavaScriptSupport support; 23 | 24 | @Inject 25 | private ComponentResources componentResources; 26 | 27 | Object onGetColores() { 28 | return new JSONArray("Rojo", "Verde", "Azul", "Negro"); 29 | } 30 | 31 | protected void afterRender(MarkupWriter writer) { 32 | String link = componentResources.createEventLink("getColores").toAbsoluteURI(); 33 | 34 | JSONObject spec = new JSONObject(); 35 | spec.put("selector", selector); 36 | spec.put("link", link); 37 | 38 | support.require("app/colores").invoke("init").with(spec); 39 | } 40 | } -------------------------------------------------------------------------------- /PlugInTapestry/src/main/java/es/com/blogspot/elblogdepicodev/plugintapestry/components/HolaMundo.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.plugintapestry.components; 2 | 3 | import org.apache.tapestry5.MarkupWriter; 4 | 5 | /** 6 | * @tapestrydoc 7 | */ 8 | public class HolaMundo { 9 | 10 | boolean beginRender(MarkupWriter writer) { 11 | writer.write("¡Hola mundo! (java)"); 12 | return false; 13 | } 14 | } -------------------------------------------------------------------------------- /PlugInTapestry/src/main/java/es/com/blogspot/elblogdepicodev/plugintapestry/components/HolaMundoTemplate.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.plugintapestry.components; 2 | 3 | /** 4 | * @tapestrydoc 5 | */ 6 | public class HolaMundoTemplate { 7 | } -------------------------------------------------------------------------------- /PlugInTapestry/src/main/java/es/com/blogspot/elblogdepicodev/plugintapestry/components/Javascript.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.plugintapestry.components; 2 | 3 | import org.apache.tapestry5.BindingConstants; 4 | import org.apache.tapestry5.annotations.Environmental; 5 | import org.apache.tapestry5.annotations.Parameter; 6 | import org.apache.tapestry5.annotations.Property; 7 | import org.apache.tapestry5.json.JSONObject; 8 | import org.apache.tapestry5.services.javascript.JavaScriptSupport; 9 | 10 | /** 11 | * @tapestrydoc 12 | */ 13 | public class Javascript { 14 | 15 | @Parameter(defaultPrefix = BindingConstants.LITERAL) 16 | @Property 17 | private String selector; 18 | 19 | @Parameter(defaultPrefix = BindingConstants.LITERAL) 20 | @Property 21 | private String mensaje; 22 | 23 | @Environmental 24 | private JavaScriptSupport support; 25 | 26 | void setupRender() { 27 | JSONObject spec = new JSONObject(); 28 | spec.put("selector", selector); 29 | spec.put("mensaje", mensaje); 30 | 31 | support.require("app/saludador").invoke("init").with(spec); 32 | } 33 | } -------------------------------------------------------------------------------- /PlugInTapestry/src/main/java/es/com/blogspot/elblogdepicodev/plugintapestry/components/Layout.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.plugintapestry.components; 2 | 3 | import org.apache.tapestry5.BindingConstants; 4 | import org.apache.tapestry5.ComponentResources; 5 | import org.apache.tapestry5.annotations.Import; 6 | import org.apache.tapestry5.annotations.Parameter; 7 | import org.apache.tapestry5.annotations.Property; 8 | import org.apache.tapestry5.ioc.annotations.Inject; 9 | 10 | /** 11 | * @tapestrydoc 12 | */ 13 | @Import(stack = { "core", "plugin" }) 14 | public class Layout { 15 | 16 | @Parameter(defaultPrefix = BindingConstants.LITERAL) 17 | @Property 18 | private String titulo; 19 | 20 | @Property 21 | private String pagina; 22 | 23 | @Inject 24 | ComponentResources resources; 25 | 26 | void setupRender() { 27 | pagina = resources.getPageName(); 28 | } 29 | } -------------------------------------------------------------------------------- /PlugInTapestry/src/main/java/es/com/blogspot/elblogdepicodev/plugintapestry/components/Layout.xdoc: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 |

En este ejemplo se muestra como usar el componente en una página.

5 | 6 | 7 | 9 | 11 | ... 12 | ]]> 13 | 14 | 15 |
16 | 17 |
-------------------------------------------------------------------------------- /PlugInTapestry/src/main/java/es/com/blogspot/elblogdepicodev/plugintapestry/components/NumeroProductos.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.plugintapestry.components; 2 | 3 | import org.apache.tapestry5.MarkupWriter; 4 | import org.apache.tapestry5.annotations.BeginRender; 5 | import org.apache.tapestry5.ioc.annotations.Inject; 6 | 7 | import es.com.blogspot.elblogdepicodev.plugintapestry.services.dao.ProductoDAO; 8 | 9 | /** 10 | * @tapestrydoc 11 | */ 12 | public class NumeroProductos { 13 | 14 | @Inject 15 | ProductoDAO dao; 16 | 17 | @BeginRender 18 | boolean beginRender(MarkupWriter writer) { 19 | long numero = dao.countAll(); 20 | writer.write(String.format("Hay %d productos", numero)); 21 | return false; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /PlugInTapestry/src/main/java/es/com/blogspot/elblogdepicodev/plugintapestry/components/tapestry.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/picodotdev/elblogdepicodev/20bd29cd073151284af2620a98dbdbc64c2023e7/PlugInTapestry/src/main/java/es/com/blogspot/elblogdepicodev/plugintapestry/components/tapestry.png -------------------------------------------------------------------------------- /PlugInTapestry/src/main/java/es/com/blogspot/elblogdepicodev/plugintapestry/misc/ContextListener.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.plugintapestry.misc; 2 | 3 | import javax.servlet.ServletContext; 4 | import javax.servlet.ServletContextEvent; 5 | import javax.servlet.ServletContextListener; 6 | 7 | public class ContextListener implements ServletContextListener { 8 | 9 | public static ServletContext SERVLET_CONTEXT; 10 | 11 | @Override 12 | public void contextInitialized(ServletContextEvent sce) { 13 | SERVLET_CONTEXT = sce.getServletContext(); 14 | } 15 | 16 | @Override 17 | public void contextDestroyed(ServletContextEvent sce) { 18 | } 19 | } -------------------------------------------------------------------------------- /PlugInTapestry/src/main/java/es/com/blogspot/elblogdepicodev/plugintapestry/misc/Direction.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.plugintapestry.misc; 2 | 3 | public enum Direction { 4 | ASCENDING, DESCENDING, UNSORTED 5 | } -------------------------------------------------------------------------------- /PlugInTapestry/src/main/java/es/com/blogspot/elblogdepicodev/plugintapestry/misc/Pagination.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.plugintapestry.misc; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | import org.hibernate.criterion.Order; 7 | 8 | public class Pagination { 9 | private int start; 10 | private int end; 11 | private List sort; 12 | 13 | public Pagination(int start, int end, List sort) { 14 | this.start = start; 15 | this.end = end; 16 | this.sort = sort; 17 | } 18 | 19 | public int getStart() { 20 | return start; 21 | } 22 | 23 | public void setStart(int start) { 24 | this.start = start; 25 | } 26 | 27 | public int getEnd() { 28 | return end; 29 | } 30 | 31 | public void setEnd(int end) { 32 | this.end = end; 33 | } 34 | 35 | public List getSort() { 36 | return sort; 37 | } 38 | 39 | public void setSort(List sort) { 40 | this.sort = sort; 41 | } 42 | 43 | public List getOrders() { 44 | List orders = new ArrayList(); 45 | for (Sort s : sort) { 46 | Order o = s.getOrder(); 47 | if (o != null) { 48 | orders.add(o); 49 | } 50 | } 51 | return orders; 52 | } 53 | } -------------------------------------------------------------------------------- /PlugInTapestry/src/main/java/es/com/blogspot/elblogdepicodev/plugintapestry/mixins/SubmitOne.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.plugintapestry.mixins; 2 | 3 | import org.apache.tapestry5.ClientElement; 4 | import org.apache.tapestry5.ComponentResources; 5 | import org.apache.tapestry5.annotations.InjectContainer; 6 | import org.apache.tapestry5.ioc.annotations.Inject; 7 | import org.apache.tapestry5.json.JSONObject; 8 | import org.apache.tapestry5.services.javascript.JavaScriptSupport; 9 | 10 | public class SubmitOne { 11 | 12 | @Inject 13 | private JavaScriptSupport support; 14 | 15 | @InjectContainer 16 | private ClientElement element; 17 | 18 | @Inject 19 | private ComponentResources resources; 20 | 21 | public void afterRender() { 22 | JSONObject spec = new JSONObject(); 23 | spec.put("elementId", element.getClientId()); 24 | 25 | support.require("app/submitOne").invoke("init").with(spec); 26 | } 27 | } -------------------------------------------------------------------------------- /PlugInTapestry/src/main/java/es/com/blogspot/elblogdepicodev/plugintapestry/pages/Error404.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.plugintapestry.pages; 2 | 3 | import org.apache.tapestry5.SymbolConstants; 4 | import org.apache.tapestry5.annotations.Import; 5 | import org.apache.tapestry5.annotations.Property; 6 | import org.apache.tapestry5.ioc.annotations.Inject; 7 | import org.apache.tapestry5.ioc.annotations.Symbol; 8 | import org.apache.tapestry5.services.Request; 9 | 10 | /** 11 | * @tapestrydoc 12 | */ 13 | @SuppressWarnings("unused") 14 | public class Error404 { 15 | 16 | @Property 17 | @Inject 18 | private Request request; 19 | 20 | @Property 21 | @Inject 22 | @Symbol(SymbolConstants.PRODUCTION_MODE) 23 | private boolean productionMode; 24 | } -------------------------------------------------------------------------------- /PlugInTapestry/src/main/java/es/com/blogspot/elblogdepicodev/plugintapestry/pages/Error500.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.plugintapestry.pages; 2 | 3 | import org.apache.tapestry5.SymbolConstants; 4 | import org.apache.tapestry5.annotations.Import; 5 | import org.apache.tapestry5.annotations.Property; 6 | import org.apache.tapestry5.ioc.annotations.Inject; 7 | import org.apache.tapestry5.ioc.annotations.Symbol; 8 | import org.apache.tapestry5.services.Request; 9 | 10 | /** 11 | * @tapestrydoc 12 | */ 13 | @SuppressWarnings("unused") 14 | public class Error500 { 15 | 16 | @Property 17 | @Inject 18 | private Request request; 19 | 20 | @Property 21 | @Inject 22 | @Symbol(SymbolConstants.PRODUCTION_MODE) 23 | private boolean productionMode; 24 | } -------------------------------------------------------------------------------- /PlugInTapestry/src/main/java/es/com/blogspot/elblogdepicodev/plugintapestry/pages/Unauthorized.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.plugintapestry.pages; 2 | 3 | import org.apache.tapestry5.SymbolConstants; 4 | import org.apache.tapestry5.annotations.Property; 5 | import org.apache.tapestry5.ioc.annotations.Inject; 6 | import org.apache.tapestry5.ioc.annotations.Symbol; 7 | 8 | /** 9 | * @tapestrydoc 10 | */ 11 | public class Unauthorized { 12 | 13 | @Inject 14 | @Symbol(SymbolConstants.TAPESTRY_VERSION) 15 | @Property 16 | private String tapestryVersion; 17 | } 18 | -------------------------------------------------------------------------------- /PlugInTapestry/src/main/java/es/com/blogspot/elblogdepicodev/plugintapestry/services/annotation/Csrf.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.plugintapestry.services.annotation; 2 | 3 | import java.lang.annotation.Documented; 4 | import java.lang.annotation.ElementType; 5 | import java.lang.annotation.Retention; 6 | import java.lang.annotation.RetentionPolicy; 7 | import java.lang.annotation.Target; 8 | 9 | @Target(ElementType.METHOD) 10 | @Retention(RetentionPolicy.RUNTIME) 11 | @Documented 12 | public @interface Csrf { 13 | } -------------------------------------------------------------------------------- /PlugInTapestry/src/main/java/es/com/blogspot/elblogdepicodev/plugintapestry/services/dao/GenericDAO.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.plugintapestry.services.dao; 2 | 3 | import java.io.Serializable; 4 | import java.util.List; 5 | 6 | import es.com.blogspot.elblogdepicodev.plugintapestry.misc.Pagination; 7 | 8 | public interface GenericDAO { 9 | 10 | T findById(Serializable id); 11 | 12 | List findAll(); 13 | 14 | List findAll(Pagination paginacion); 15 | 16 | long countAll(); 17 | 18 | void persist(T entity); 19 | 20 | void remove(T entity); 21 | 22 | void removeAll(); 23 | } -------------------------------------------------------------------------------- /PlugInTapestry/src/main/java/es/com/blogspot/elblogdepicodev/plugintapestry/services/dao/ProductoDAO.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.plugintapestry.services.dao; 2 | 3 | import es.com.blogspot.elblogdepicodev.plugintapestry.entities.Producto; 4 | 5 | public interface ProductoDAO extends GenericDAO { 6 | 7 | } -------------------------------------------------------------------------------- /PlugInTapestry/src/main/java/es/com/blogspot/elblogdepicodev/plugintapestry/services/dao/ProductoDAOImpl.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.plugintapestry.services.dao; 2 | 3 | import org.hibernate.SessionFactory; 4 | import org.springframework.beans.factory.annotation.Autowired; 5 | 6 | import es.com.blogspot.elblogdepicodev.plugintapestry.entities.Producto; 7 | 8 | public class ProductoDAOImpl extends GenericDAOImpl implements ProductoDAO { 9 | 10 | @Autowired 11 | public ProductoDAOImpl(SessionFactory sessionFactory) { 12 | super(Producto.class, sessionFactory); 13 | } 14 | } -------------------------------------------------------------------------------- /PlugInTapestry/src/main/java/es/com/blogspot/elblogdepicodev/plugintapestry/services/exceptions/CsrfException.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.plugintapestry.services.exceptions; 2 | 3 | public class CsrfException extends Exception { 4 | 5 | private static final long serialVersionUID = -5205940043310676114L; 6 | 7 | public CsrfException() { 8 | } 9 | 10 | public CsrfException(String message) { 11 | super(message); 12 | } 13 | } -------------------------------------------------------------------------------- /PlugInTapestry/src/main/java/es/com/blogspot/elblogdepicodev/plugintapestry/services/hibernate/HibernateConfigurer.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.plugintapestry.services.hibernate; 2 | 3 | import javax.annotation.PostConstruct; 4 | 5 | import org.hibernate.SessionFactory; 6 | import org.hibernate.event.service.spi.EventListenerRegistry; 7 | import org.hibernate.event.spi.EventType; 8 | import org.hibernate.internal.SessionFactoryImpl; 9 | import org.springframework.beans.factory.annotation.Autowired; 10 | import org.springframework.stereotype.Component; 11 | 12 | @Component 13 | public class HibernateConfigurer { 14 | 15 | @Autowired 16 | private SessionFactory sessionFactory; 17 | 18 | @Autowired 19 | private ProductoEventAdapter productoEventAdapter; 20 | 21 | @PostConstruct 22 | public void registerListeners() { 23 | SessionFactoryImpl sfi = (SessionFactoryImpl) sessionFactory; 24 | EventListenerRegistry elr = sfi.getServiceRegistry().getService(EventListenerRegistry.class); 25 | 26 | elr.setListeners(EventType.PRE_INSERT, productoEventAdapter); 27 | elr.setListeners(EventType.PRE_UPDATE, productoEventAdapter); 28 | elr.setListeners(EventType.PRE_DELETE, productoEventAdapter); 29 | elr.setListeners(EventType.POST_INSERT, productoEventAdapter); 30 | elr.setListeners(EventType.POST_UPDATE, productoEventAdapter); 31 | elr.setListeners(EventType.POST_DELETE, productoEventAdapter); 32 | } 33 | } -------------------------------------------------------------------------------- /PlugInTapestry/src/main/java/es/com/blogspot/elblogdepicodev/plugintapestry/services/spring/DummyService.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.plugintapestry.services.spring; 2 | 3 | import es.com.blogspot.elblogdepicodev.plugintapestry.entities.Producto; 4 | 5 | public class DummyService { 6 | 7 | public void process(String action, Object entity) { 8 | if (entity instanceof Producto) { 9 | Producto p = (Producto) entity; 10 | System.out.println(String.format("Action: %s, Id: %d", action, p.getId())); 11 | } 12 | } 13 | } -------------------------------------------------------------------------------- /PlugInTapestry/src/main/java/es/com/blogspot/elblogdepicodev/plugintapestry/services/sso/Sid.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.plugintapestry.services.sso; 2 | 3 | import java.io.Serializable; 4 | import java.util.UUID; 5 | 6 | public class Sid implements Serializable { 7 | 8 | private static final long serialVersionUID = -4552333438930728660L; 9 | 10 | private String sid; 11 | 12 | protected Sid(String sid) { 13 | this.sid = sid; 14 | } 15 | 16 | public static Sid newInstance() { 17 | return new Sid(UUID.randomUUID().toString()); 18 | } 19 | 20 | public String getSid() { 21 | return sid; 22 | } 23 | 24 | public boolean isValid(String sid) { 25 | return this.sid.equals(sid); 26 | } 27 | } -------------------------------------------------------------------------------- /PlugInTapestry/src/main/java/es/com/blogspot/elblogdepicodev/plugintapestry/services/transaction/AppModule.txt: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.plugintapestry.services; 2 | 3 | ... 4 | 5 | public class AppModule { 6 | 7 | public static void bind(ServiceBinder binder) { 8 | ... 9 | 10 | // Servicios para la gestión de transacciones 11 | binder.bind(HibernateSessionManager.class, HibernateSessionManagerImpl.class).scope(ScopeConstants.PERTHREAD).withId("AppHibernateSessionManager"); 12 | binder.bind(TransactionAdvisor.class, TransactionAdvisorImpl.class); 13 | binder.bind(TransactionService.class, HibernateTransactionServiceImpl.class).scope(ScopeConstants.PERTHREAD); 14 | 15 | ... 16 | } 17 | 18 | public static void contributeServiceOverride(MappedConfiguration configuration, @Local HibernateSessionManager sessionManager) { 19 | configuration.add(HibernateSessionManager.class, sessionManager); 20 | } 21 | 22 | ... 23 | 24 | /** 25 | * Dar soporte transaccional a los servicios con una interfaz que cumplan el patrón (los advices se aplican a los métodos de una interfaz). 26 | */ 27 | @Match({ "*DAO" }) 28 | public static void adviseTransaction(TransactionAdvisor advisor, MethodAdviceReceiver receiver) { 29 | advisor.addAdvice(receiver); 30 | } 31 | } -------------------------------------------------------------------------------- /PlugInTapestry/src/main/java/es/com/blogspot/elblogdepicodev/plugintapestry/services/transaction/HibernateSessionManagerImpl.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.plugintapestry.services.transaction; 2 | 3 | import org.apache.tapestry5.hibernate.HibernateSessionManager; 4 | import org.apache.tapestry5.hibernate.HibernateSessionSource; 5 | import org.apache.tapestry5.ioc.services.PerthreadManager; 6 | import org.hibernate.Session; 7 | 8 | public class HibernateSessionManagerImpl implements HibernateSessionManager { 9 | 10 | private Session session; 11 | 12 | public HibernateSessionManagerImpl(HibernateSessionSource source, PerthreadManager manager) { 13 | this.session = source.create(); 14 | 15 | manager.addThreadCleanupCallback(new Runnable() { 16 | @Override 17 | public void run() { 18 | cleanup(); 19 | } 20 | }); 21 | } 22 | 23 | public void abort() { 24 | session.getTransaction().rollback(); 25 | } 26 | 27 | public void commit() { 28 | session.getTransaction().commit(); 29 | } 30 | 31 | public Session getSession() { 32 | return session; 33 | } 34 | 35 | private void cleanup() { 36 | session.close(); 37 | } 38 | } -------------------------------------------------------------------------------- /PlugInTapestry/src/main/java/es/com/blogspot/elblogdepicodev/plugintapestry/services/transaction/MandatoryTransactionAdvice.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.plugintapestry.services.transaction; 2 | 3 | import org.apache.tapestry5.plastic.MethodAdvice; 4 | import org.apache.tapestry5.plastic.MethodInvocation; 5 | 6 | public class MandatoryTransactionAdvice implements MethodAdvice { 7 | private TransactionService service; 8 | 9 | public MandatoryTransactionAdvice(TransactionService service) { 10 | this.service = service; 11 | } 12 | 13 | public void advise(MethodInvocation invocation) { 14 | if (!service.isWithinTransaction()) { 15 | throw new RuntimeException("Debe haber una transacción"); 16 | } 17 | invocation.proceed(); 18 | } 19 | } -------------------------------------------------------------------------------- /PlugInTapestry/src/main/java/es/com/blogspot/elblogdepicodev/plugintapestry/services/transaction/NestedTransactionAdvice.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.plugintapestry.services.transaction; 2 | 3 | import org.apache.tapestry5.plastic.MethodAdvice; 4 | import org.apache.tapestry5.plastic.MethodInvocation; 5 | 6 | public class NestedTransactionAdvice implements MethodAdvice { 7 | 8 | private TransactionDefinition definition; 9 | private TransactionService service; 10 | 11 | public NestedTransactionAdvice(TransactionDefinition definition, TransactionService service) { 12 | this.definition = definition; 13 | this.service = service; 14 | } 15 | 16 | public void advise(MethodInvocation invocation) { 17 | try { 18 | service.begin(definition); 19 | invocation.proceed(); 20 | service.commit(); 21 | } catch (Exception e) { 22 | service.rollback(); 23 | throw e; 24 | } 25 | } 26 | } -------------------------------------------------------------------------------- /PlugInTapestry/src/main/java/es/com/blogspot/elblogdepicodev/plugintapestry/services/transaction/NeverTransactionAdvice.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.plugintapestry.services.transaction; 2 | 3 | import org.apache.tapestry5.plastic.MethodAdvice; 4 | import org.apache.tapestry5.plastic.MethodInvocation; 5 | 6 | public class NeverTransactionAdvice implements MethodAdvice { 7 | 8 | private TransactionService service; 9 | 10 | public NeverTransactionAdvice(TransactionService service) { 11 | this.service = service; 12 | } 13 | 14 | public void advise(MethodInvocation invocation) { 15 | if (service.isWithinTransaction()) { 16 | throw new RuntimeException("Hay una transacción activa y se require ninguna"); 17 | } 18 | invocation.proceed(); 19 | } 20 | } -------------------------------------------------------------------------------- /PlugInTapestry/src/main/java/es/com/blogspot/elblogdepicodev/plugintapestry/services/transaction/Propagation.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.plugintapestry.services.transaction; 2 | 3 | public enum Propagation { 4 | REQUIRED, SUPPORTS, NEVER, NESTED, MANDATORY 5 | } -------------------------------------------------------------------------------- /PlugInTapestry/src/main/java/es/com/blogspot/elblogdepicodev/plugintapestry/services/transaction/RequiredTransactionAdvice.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.plugintapestry.services.transaction; 2 | 3 | import org.apache.tapestry5.plastic.MethodAdvice; 4 | import org.apache.tapestry5.plastic.MethodInvocation; 5 | 6 | public class RequiredTransactionAdvice implements MethodAdvice { 7 | 8 | private TransactionDefinition definition; 9 | private TransactionService service; 10 | 11 | public RequiredTransactionAdvice(TransactionDefinition definition, TransactionService service) { 12 | this.definition = definition; 13 | this.service = service; 14 | } 15 | 16 | public void advise(MethodInvocation invocation) { 17 | boolean isNew = service.beginIfNoPresent(definition); 18 | 19 | try { 20 | invocation.proceed(); 21 | 22 | if (isNew) { 23 | service.commit(); 24 | } 25 | } catch (Exception e) { 26 | if (isNew) { 27 | service.rollback(); 28 | } 29 | throw e; 30 | } 31 | } 32 | } -------------------------------------------------------------------------------- /PlugInTapestry/src/main/java/es/com/blogspot/elblogdepicodev/plugintapestry/services/transaction/TransactionAdvisor.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.plugintapestry.services.transaction; 2 | 3 | import org.apache.tapestry5.ioc.MethodAdviceReceiver; 4 | 5 | public interface TransactionAdvisor { 6 | void addAdvice(MethodAdviceReceiver methodAdviceReceiver); 7 | } -------------------------------------------------------------------------------- /PlugInTapestry/src/main/java/es/com/blogspot/elblogdepicodev/plugintapestry/services/transaction/TransactionDefinition.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.plugintapestry.services.transaction; 2 | 3 | public class TransactionDefinition { 4 | 5 | private Propagation propagation; 6 | private Integer isolation; 7 | private Boolean readOnly; 8 | private Integer timeout; 9 | 10 | public TransactionDefinition(Propagation propagation, Integer isolation, Boolean readOnly, Integer timeout) { 11 | this.propagation = propagation; 12 | this.isolation = isolation; 13 | this.readOnly = readOnly; 14 | this.timeout = timeout; 15 | } 16 | 17 | public Propagation getPropagation() { 18 | return propagation; 19 | } 20 | 21 | public void setPropagation(Propagation propagation) { 22 | this.propagation = propagation; 23 | } 24 | 25 | public Integer getIsolation() { 26 | return isolation; 27 | } 28 | 29 | public void setIsolation(Integer isolation) { 30 | this.isolation = isolation; 31 | } 32 | 33 | public Boolean getReadOnly() { 34 | return readOnly; 35 | } 36 | 37 | public void setReadOnly(Boolean readOnly) { 38 | this.readOnly = readOnly; 39 | } 40 | 41 | public Integer getTimeout() { 42 | return timeout; 43 | } 44 | 45 | public void setTimeout(Integer timeout) { 46 | this.timeout = timeout; 47 | } 48 | } -------------------------------------------------------------------------------- /PlugInTapestry/src/main/java/es/com/blogspot/elblogdepicodev/plugintapestry/services/transaction/TransactionService.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.plugintapestry.services.transaction; 2 | 3 | public interface TransactionService { 4 | 5 | boolean beginIfNoPresent(TransactionDefinition definition); 6 | 7 | void begin(TransactionDefinition definition); 8 | 9 | void commit(); 10 | 11 | void rollback(); 12 | 13 | boolean isWithinTransaction(); 14 | } -------------------------------------------------------------------------------- /PlugInTapestry/src/main/java/es/com/blogspot/elblogdepicodev/plugintapestry/services/transaction/Transactional.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.plugintapestry.services.transaction; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | @Retention(RetentionPolicy.RUNTIME) 9 | @Target({ ElementType.METHOD }) 10 | public @interface Transactional { 11 | Propagation propagation() default Propagation.REQUIRED; 12 | int isolation() default -1; 13 | boolean readonly() default false; 14 | int timeout() default -1; 15 | } -------------------------------------------------------------------------------- /PlugInTapestry/src/main/resources/META-INF/context.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /PlugInTapestry/src/main/resources/META-INF/modules/app/colores.js: -------------------------------------------------------------------------------- 1 | define("app/colores", ["jquery"], function($) { 2 | function Colores(spec) { 3 | var _this = this; 4 | 5 | this.spec = spec; 6 | 7 | setTimeout(function() { 8 | _this.getColores(); 9 | }, 2000); 10 | } 11 | 12 | Colores.prototype.getColores = function() { 13 | var _this = this; 14 | 15 | $.ajax({ 16 | url: this.spec.link, 17 | success: function(colores) { 18 | var c = colores.join(); 19 | $(_this.spec.selector).html(c); 20 | } 21 | }); 22 | } 23 | 24 | function init(spec) { 25 | new Colores(spec); 26 | } 27 | 28 | return { 29 | init: init 30 | } 31 | }); -------------------------------------------------------------------------------- /PlugInTapestry/src/main/resources/META-INF/modules/app/listSelect.js: -------------------------------------------------------------------------------- 1 | define("app/listSelect", ["jquery"], function($) { 2 | function ListSelect(spec) { 3 | var _this = this; 4 | 5 | this.spec = spec; 6 | 7 | $("#" + this.spec.all).on("change", function() { 8 | _this.onChangeAll(); 9 | }); 10 | $("#" + this.spec.checkboxs + " input[type='checkbox']").not("#" + this.spec.all).on("change", function() { 11 | _this.onChangeCheckbox(); 12 | }); 13 | } 14 | 15 | ListSelect.prototype.onChangeAll = function() { 16 | var checked = $("#" + this.spec.all).is(":checked"); 17 | $("#" + this.spec.checkboxs + " input[type='checkbox']").not("#" + this.spec.all).prop("checked", checked); 18 | } 19 | 20 | ListSelect.prototype.onChangeCheckbox = function() { 21 | var checked = this.isAllChecked(); 22 | $("#" + this.spec.all).prop("checked", checked); 23 | } 24 | 25 | ListSelect.prototype.isAllChecked = function() { 26 | return $("#" + this.spec.checkboxs + " input[type='checkbox']").not("#" + this.spec.all).length == $("#" + this.spec.checkboxs + " input[type='checkbox']:checked").not("#" + this.spec.all).length; 27 | } 28 | 29 | function init(spec) { 30 | new ListSelect(spec); 31 | } 32 | 33 | return { 34 | init: init 35 | } 36 | }); -------------------------------------------------------------------------------- /PlugInTapestry/src/main/resources/META-INF/modules/app/saludador.js: -------------------------------------------------------------------------------- 1 | define("app/saludador", ["jquery"], function($) { 2 | function Saludador(spec) { 3 | this.spec = spec; 4 | } 5 | 6 | Saludador.prototype.render = function() { 7 | $(this.spec.selector).html(this.spec.mensaje); 8 | } 9 | 10 | function init(spec) { 11 | new Saludador(spec).render(); 12 | } 13 | 14 | return { 15 | init: init 16 | }; 17 | }); -------------------------------------------------------------------------------- /PlugInTapestry/src/main/resources/META-INF/services/org.hibernate.integrator.spi.Integrator: -------------------------------------------------------------------------------- 1 | #es.com.blogspot.elblogdepicodev.plugintapestry.services.hibernate.HibernateIntegrator -------------------------------------------------------------------------------- /PlugInTapestry/src/main/resources/applicationContext.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | -------------------------------------------------------------------------------- /PlugInTapestry/src/main/resources/es/com/blogspot/elblogdepicodev/plugintapestry/components/HolaMundoTemplate.tml: -------------------------------------------------------------------------------- 1 | 2 | 3 | ¡Hola mundo! (template) 4 | -------------------------------------------------------------------------------- /PlugInTapestry/src/main/resources/es/com/blogspot/elblogdepicodev/plugintapestry/components/Layout.tml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ${titulo} 7 | 8 | 9 | 10 | 11 | 12 |
13 |
14 | 17 |

PlugIn Tapestry

18 |
19 | 20 |
21 | 22 |
23 | 24 |
25 | 26 |
27 | 28 | 31 |
32 | 33 | -------------------------------------------------------------------------------- /PlugInTapestry/src/main/resources/es/com/blogspot/elblogdepicodev/plugintapestry/components/ListSelect.tml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Todos 8 | 9 | 10 | 11 | 12 | 13 | ${value} 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /PlugInTapestry/src/main/resources/es/com/blogspot/elblogdepicodev/plugintapestry/pages/Error404.tml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |
5 |

Página o recurso no encontrado

6 | 7 | Error 404 8 | 9 |

10 | Oooops! Parece que lo que estás buscando ya no se encuentra en su sitio prueba a encontrarlo desde la página Inicio. 11 |

12 | 13 | 14 |
15 |

Información

16 | 17 |
18 |
19 |
20 | -------------------------------------------------------------------------------- /PlugInTapestry/src/main/resources/es/com/blogspot/elblogdepicodev/plugintapestry/pages/Error500.tml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |
5 |

Error en el servidor

6 | 7 | Error 500 8 | 9 |

10 | Oooops! Se ha producido un error en el servidor, puedes volver a la página Inicio. 11 |

12 | 13 | 14 |
15 |

Información

16 | 17 |
18 |
19 |
20 | -------------------------------------------------------------------------------- /PlugInTapestry/src/main/resources/es/com/blogspot/elblogdepicodev/plugintapestry/pages/Login.tml: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | Apache Tapestry 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 |
13 | 14 |
15 | 16 | 17 |
18 | 19 |
20 | 21 |
22 |
23 |
24 | 25 | -------------------------------------------------------------------------------- /PlugInTapestry/src/main/resources/es/com/blogspot/elblogdepicodev/plugintapestry/pages/Unauthorized.tml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | No tienes permisos pare realizar la operación. 5 |
6 |
7 | Volver la la página Index 8 | 9 | -------------------------------------------------------------------------------- /PlugInTapestry/src/main/resources/hibernate.cfg.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | org.h2.Driver 8 | jdbc:h2:mem:test 9 | sa 10 | sa 11 | org.hibernate.dialect.H2Dialect 12 | update 13 | true 14 | 15 | -------------------------------------------------------------------------------- /PlugInTapestry/src/main/resources/shiro-users.properties: -------------------------------------------------------------------------------- 1 | # Archivo que contiene los usuarios y contraseñas junto con los permisos y roles 2 | 3 | # Usuarios, passwords y roles 4 | # Usuario «root» con contraseña «password» y rol «root» 5 | user.root = password,root 6 | 7 | # Permisos de los roles 8 | # Rol «root» con permiso «cuenta:reset» 9 | role.root = "cuenta:reset" -------------------------------------------------------------------------------- /PlugInTapestry/src/main/webapp/WEB-INF/app.properties: -------------------------------------------------------------------------------- 1 | # This is where global application properties go. 2 | # You can also have individual message catalogs for each page and each 3 | # component that override these defaults. 4 | # The name of this file is based on the element in web. 5 | PlugIn_Tapestry=PlugIn Tapestry 6 | Este_mensaje_esta_localizado_=Este mensaje está localizado según el idioma enviado por el navegador. -------------------------------------------------------------------------------- /PlugInTapestry/src/main/webapp/WEB-INF/app_en.properties: -------------------------------------------------------------------------------- 1 | # This is where global application properties go. 2 | # You can also have individual message catalogs for each page and each 3 | # component that override these defaults. 4 | # The name of this file is based on the element in web. 5 | PlugIn_Tapestry=PlugIn Tapestry 6 | 7 | Este_mensaje_esta_localizado_=This message is located according to the language sent by the browser -------------------------------------------------------------------------------- /PlugInTapestry/src/main/webapp/css/app.css: -------------------------------------------------------------------------------- 1 | body { 2 | font-family: 'Open Sans', sans-serif; 3 | padding-top: 20px; 4 | padding-bottom: 40px; 5 | } 6 | 7 | h1, h2, h3, h4, h5, h6 { 8 | font-family: 'Cantarell', sans-serif; 9 | font-weight: bold; 10 | } 11 | 12 | a:link, a:visited, a:active, a:hover { 13 | color: #539126; 14 | } 15 | 16 | /* Main marketing message and sign up button */ 17 | .jumbotron { /* margin: 60px 0;*/ 18 | text-align: center; 19 | } 20 | 21 | .jumbotron h1 { 22 | font-size: 72px; 23 | line-height: 1; 24 | } 25 | 26 | .jumbotron .btn { 27 | font-size: 21px; 28 | padding: 14px 24px; 29 | } -------------------------------------------------------------------------------- /PlugInTapestry/src/main/webapp/images/tapestry.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/picodotdev/elblogdepicodev/20bd29cd073151284af2620a98dbdbc64c2023e7/PlugInTapestry/src/main/webapp/images/tapestry.png -------------------------------------------------------------------------------- /PlugInTapestry/src/test/groovy/es/com/blogspot/elblogdepicodev/plugintapestry/components/NumeroProductosSpec.groovy: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.plugintapestry.components 2 | 3 | import org.apache.tapestry5.MarkupWriter 4 | import org.apache.tapestry5.internal.services.MarkupWriterImpl 5 | 6 | import es.com.blogspot.elblogdepicodev.plugintapestry.services.dao.ProductoDAO 7 | 8 | import spock.lang.Specification 9 | 10 | class NumeroProductosSpec extends Specification { 11 | 12 | def conNombre() { 13 | setup: 14 | // Si tuviese alguna propiedad de algún servicio con la anotación @Inject tendríamos crear 15 | // un mock de la dependencia 16 | def dao = Mock(ProductoDAO.class) 17 | dao.countAll() >> 0l 18 | 19 | // Crear el componente 20 | def componente = new NumeroProductos() 21 | 22 | // Si tuviese parámetros (anotación @Parameter) deberíamos inyectarlos, para ello debemos 23 | // crear setters o cambiar el ámbito de visibilidad a package (sin ámbito) 24 | componente.dao = dao 25 | 26 | // Ejecutar el sujecto bajo prueba 27 | def writer = new MarkupWriterImpl() 28 | 29 | when: 30 | componente.beginRender(writer) 31 | 32 | then: 33 | // Comprobar el resultado 34 | "Hay 0 productos" == writer.toString() 35 | } 36 | } -------------------------------------------------------------------------------- /PlugInTapestry/src/test/groovy/es/com/blogspot/elblogdepicodev/plugintapestry/geb/GoogleSearchSpec.groovy: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.plugintapestry.geb 2 | 3 | import geb.Page 4 | import geb.spock.GebSpec 5 | 6 | class GoogleHomePage extends Page { 7 | static url = 'http://google.es/' 8 | static at = { title == 'Google' } 9 | static content = { 10 | searchField { $("input[name=q]") } 11 | searchButton(to: GoogleResultsPage) { $("input[value='Buscar con Google']") } 12 | } 13 | } 14 | 15 | class GoogleResultsPage extends Page { 16 | static at = { waitFor { title.endsWith("Buscar con Google") } } 17 | static content = { 18 | results(wait: true) { $("li.g") } 19 | result { index -> return results[index] } 20 | resultLink { index -> result(index).find("h3.r a") } 21 | } 22 | } 23 | 24 | class GoogleSearchSpec extends GebSpec { 25 | def 'go to google'() { 26 | when: 27 | to GoogleHomePage 28 | searchField().value "Chuck Norris" 29 | searchButton().click() 30 | 31 | then: 32 | at GoogleResultsPage 33 | resultLink(0).text().contains("Chuck") 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /PlugInTapestry/src/test/groovy/es/com/blogspot/elblogdepicodev/plugintapestry/geb/GoogleSpec.groovy: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.plugintapestry.geb 2 | 3 | import geb.spock.GebSpec 4 | 5 | class GoogleSpec extends GebSpec { 6 | def 'go to google'() { 7 | when: 8 | go 'http://www.google.es' 9 | 10 | then: 11 | title == 'Google' 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /PlugInTapestry/src/test/groovy/es/com/blogspot/elblogdepicodev/plugintapestry/geb/IndexSpec.groovy: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.plugintapestry.geb 2 | 3 | import geb.Page 4 | import geb.spock.GebSpec 5 | 6 | // Definición de la página índice 7 | class IndexPage extends Page { 8 | // Localización 9 | static url = 'http://localhost:8080/PlugInTapestry/index' 10 | // Determinar que se cargó una página 11 | static at = { title.startsWith('PlugIn') } 12 | // Definición de los elementos de la página 13 | static content = { 14 | meta { $('meta[pagina]') } 15 | } 16 | } 17 | 18 | class IndexSpec extends GebSpec { 19 | def 'go to index'() { 20 | when: 21 | to IndexPage 22 | 23 | then: 24 | meta.@pagina == 'Index' 25 | } 26 | } -------------------------------------------------------------------------------- /PlugInTapestry/src/test/java/es/com/blogspot/elblogdepicodev/plugintapestry/components/NumeroProductosTest.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.plugintapestry.components; 2 | 3 | import org.apache.tapestry5.MarkupWriter; 4 | import org.apache.tapestry5.internal.services.MarkupWriterImpl; 5 | import org.junit.Assert; 6 | import org.junit.Test; 7 | import org.mockito.Mockito; 8 | 9 | import es.com.blogspot.elblogdepicodev.plugintapestry.services.dao.ProductoDAO; 10 | 11 | public class NumeroProductosTest { 12 | 13 | @Test 14 | public void conNombre() { 15 | // Si tuviese alguna propiedad de algún servicio con la anotación @Inject tendríamos crear 16 | // un mock de la dependencia 17 | ProductoDAO dao = Mockito.mock(ProductoDAO.class); 18 | Mockito.when(dao.countAll()).thenReturn(0l); 19 | 20 | // Crear el componente 21 | NumeroProductos componente = new NumeroProductos(); 22 | 23 | // Si tuviese parámetros (anotación @Parameter) deberíamos inyectarlos, para ello debemos 24 | // crear setters o cambiar el ámbito de visibilidad a package (sin ámbito) 25 | componente.dao = dao; 26 | 27 | // Ejecutar el sujecto bajo prueba 28 | MarkupWriter writer = new MarkupWriterImpl(); 29 | componente.beginRender(writer); 30 | 31 | // Comprobar el resultado 32 | Assert.assertEquals("Hay 0 productos", writer.toString()); 33 | } 34 | } -------------------------------------------------------------------------------- /PlugInTapestry/src/test/java/es/com/blogspot/elblogdepicodev/plugintapestry/components/NumeroProductosXPathTesterTest.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.plugintapestry.components; 2 | 3 | import org.apache.tapestry5.dom.Document; 4 | import org.jaxen.JaxenException; 5 | import org.junit.Assert; 6 | import org.junit.Before; 7 | import org.junit.Test; 8 | import org.mockito.Mockito; 9 | 10 | import com.formos.tapestry.testify.core.ForComponents; 11 | import com.formos.tapestry.xpath.TapestryXPath; 12 | 13 | import es.com.blogspot.elblogdepicodev.plugintapestry.services.dao.ProductoDAO; 14 | import es.com.blogspot.elblogdepicodev.plugintapestry.test.AbstractTest; 15 | 16 | public class NumeroProductosXPathTesterTest extends AbstractTest { 17 | 18 | // @ForComponents("nombre") 19 | // private String nombre; 20 | 21 | @ForComponents 22 | private ProductoDAO dao; 23 | 24 | @Before 25 | public void before() { 26 | dao = Mockito.mock(ProductoDAO.class); 27 | Mockito.when(dao.countAll()).thenReturn(0l); 28 | } 29 | 30 | @Test 31 | public void ceroProductos() throws JaxenException { 32 | Document doc = tester.renderPage("test/NumeroProductosTest"); 33 | String text = TapestryXPath.xpath("id('componente')").selectSingleElement(doc).getChildMarkup(); 34 | Assert.assertEquals("Hay 0 productos", text); 35 | } 36 | } -------------------------------------------------------------------------------- /PlugInTapestry/src/test/java/es/com/blogspot/elblogdepicodev/plugintapestry/test/AbstractTest.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.plugintapestry.test; 2 | 3 | import com.formos.tapestry.testify.core.TapestryTester; 4 | import com.formos.tapestry.testify.junit4.TapestryTest; 5 | 6 | import es.com.blogspot.elblogdepicodev.plugintapestry.test.services.TestModule; 7 | 8 | public abstract class AbstractTest extends TapestryTest { 9 | 10 | private static final TapestryTester SHARED_TESTER = new TapestryTester("es.com.blogspot.elblogdepicodev.plugintapestry", "app", "src/main/webapp", TestModule.class); 11 | 12 | public AbstractTest() { 13 | super(SHARED_TESTER); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /PlugInTapestry/src/test/java/es/com/blogspot/elblogdepicodev/plugintapestry/test/pages/NumeroProductosTest.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.plugintapestry.test.pages; 2 | 3 | public class NumeroProductosTest { 4 | 5 | // Parámetro que recibirá el componete. 6 | // El valor se obtiene como si se tratase de un servicio, para los tipos promitivos de datos o 7 | // String se selecciona el servicio por nombre (los servicios se inyectan en función de su 8 | // interfaz o clase) 9 | // @Inject 10 | // @Service("nombre") 11 | // @Property 12 | // private String nombre; 13 | } -------------------------------------------------------------------------------- /PlugInTapestry/src/test/java/es/com/blogspot/elblogdepicodev/plugintapestry/test/services/TestModule.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.plugintapestry.test.services; 2 | 3 | import org.apache.tapestry5.ioc.Configuration; 4 | import org.apache.tapestry5.services.LibraryMapping; 5 | 6 | public class TestModule { 7 | 8 | public static void contributeComponentClassResolver(Configuration configuration) { 9 | configuration.add(new LibraryMapping("test", "es.com.blogspot.elblogdepicodev.plugintapestry.test")); 10 | } 11 | } -------------------------------------------------------------------------------- /PlugInTapestry/src/test/resources/es/com/blogspot/elblogdepicodev/plugintapestry/test/pages/NumeroProductosTest.tml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 |
6 | 7 |
8 | 9 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | elblogdepicodev 2 | =============== 3 | 4 | Este repositorio de Git contiene el código fuente de los ejemplos que he explicado en el blog 5 | [El blog de pico.dev](http://elblogdepicodev.blogspot.com.es/) y que puedes probar en tu propio 6 | equipo. 7 | 8 | Más ejemplos en el [repositorio](https://github.com/picodotdev/blog-ejemplos) de [Blog Bitix](http://picodotdev.github.io/blog-bitix/), continuación de El blog de pico.dev. 9 | -------------------------------------------------------------------------------- /TapestryJPA/.gitignore: -------------------------------------------------------------------------------- 1 | /bin 2 | /build 3 | /.gradle 4 | /.settings 5 | /.classpath 6 | /.project 7 | -------------------------------------------------------------------------------- /TapestryJPA/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/picodotdev/elblogdepicodev/20bd29cd073151284af2620a98dbdbc64c2023e7/TapestryJPA/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /TapestryJPA/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Fri May 24 17:33:23 CEST 2013 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=http\://services.gradle.org/distributions/gradle-1.6-bin.zip 7 | -------------------------------------------------------------------------------- /TapestryJPA/src/main/java/es/com/blogspot/elblogdepicodev/tapestry/jpa/components/HolaMundo.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.tapestry.jpa.components; 2 | 3 | 4 | public class HolaMundo { 5 | 6 | } -------------------------------------------------------------------------------- /TapestryJPA/src/main/java/es/com/blogspot/elblogdepicodev/tapestry/jpa/components/Layout.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.tapestry.jpa.components; 2 | 3 | public class Layout { 4 | 5 | } -------------------------------------------------------------------------------- /TapestryJPA/src/main/java/es/com/blogspot/elblogdepicodev/tapestry/jpa/dao/GenericDAO.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.tapestry.jpa.dao; 2 | 3 | import java.util.List; 4 | 5 | import org.apache.tapestry5.jpa.annotations.CommitAfter; 6 | 7 | import es.com.blogspot.elblogdepicodev.tapestry.jpa.misc.Pagination; 8 | 9 | public interface GenericDAO { 10 | 11 | T findById(Long id); 12 | 13 | List findAll(); 14 | 15 | List findAll(Pagination paginacion); 16 | 17 | long countAll(); 18 | 19 | @CommitAfter 20 | void persist(T producto); 21 | 22 | @CommitAfter 23 | void remove(T producto); 24 | 25 | @CommitAfter 26 | void removeAll(); 27 | } -------------------------------------------------------------------------------- /TapestryJPA/src/main/java/es/com/blogspot/elblogdepicodev/tapestry/jpa/dao/ProductoDAO.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.tapestry.jpa.dao; 2 | 3 | import java.util.List; 4 | 5 | import org.apache.tapestry5.jpa.annotations.CommitAfter; 6 | 7 | import es.com.blogspot.elblogdepicodev.tapestry.jpa.entities.Producto; 8 | import es.com.blogspot.elblogdepicodev.tapestry.jpa.misc.Pagination; 9 | 10 | public interface ProductoDAO { 11 | 12 | Producto findById(Long id); 13 | List findAll(Pagination paginacion); 14 | 15 | @CommitAfter 16 | void persist(Producto producto); 17 | @CommitAfter 18 | void remove(Producto producto); 19 | @CommitAfter 20 | void removeAll(); 21 | } -------------------------------------------------------------------------------- /TapestryJPA/src/main/java/es/com/blogspot/elblogdepicodev/tapestry/jpa/dao/SimpleCriteriaBuilder.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.tapestry.jpa.dao; 2 | 3 | import javax.persistence.criteria.CriteriaBuilder; 4 | import javax.persistence.criteria.CriteriaQuery; 5 | import javax.persistence.criteria.Root; 6 | 7 | public interface SimpleCriteriaBuilder { 8 | 9 | void build(CriteriaBuilder cb, CriteriaQuery cq, Root c); 10 | } -------------------------------------------------------------------------------- /TapestryJPA/src/main/java/es/com/blogspot/elblogdepicodev/tapestry/jpa/misc/AppValidationDecoratorFactory.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.tapestry.jpa.misc; 2 | 3 | import org.apache.tapestry5.MarkupWriter; 4 | import org.apache.tapestry5.ValidationDecorator; 5 | import org.apache.tapestry5.services.Environment; 6 | import org.apache.tapestry5.services.ValidationDecoratorFactory; 7 | 8 | public class AppValidationDecoratorFactory implements ValidationDecoratorFactory { 9 | private final Environment environment; 10 | 11 | public AppValidationDecoratorFactory(Environment environment) { 12 | this.environment = environment; 13 | } 14 | 15 | public ValidationDecorator newInstance(MarkupWriter writer) { 16 | return new AppValidationDecorator(environment, writer); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /TapestryJPA/src/main/java/es/com/blogspot/elblogdepicodev/tapestry/jpa/misc/Direction.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.tapestry.jpa.misc; 2 | 3 | public enum Direction { 4 | ASCENDING, DESCENDING, UNSORTED 5 | } -------------------------------------------------------------------------------- /TapestryJPA/src/main/java/es/com/blogspot/elblogdepicodev/tapestry/jpa/misc/Pagination.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.tapestry.jpa.misc; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | import javax.persistence.criteria.CriteriaBuilder; 7 | import javax.persistence.criteria.Order; 8 | import javax.persistence.criteria.Root; 9 | 10 | public class Pagination { 11 | private int start; 12 | private int end; 13 | private List sort; 14 | 15 | public Pagination(int start, int end, List sort) { 16 | this.start = start; 17 | this.end = end; 18 | this.sort = sort; 19 | } 20 | 21 | public int getStart() { 22 | return start; 23 | } 24 | 25 | public void setStart(int start) { 26 | this.start = start; 27 | } 28 | 29 | public int getEnd() { 30 | return end; 31 | } 32 | 33 | public void setEnd(int end) { 34 | this.end = end; 35 | } 36 | 37 | public List getSort() { 38 | return sort; 39 | } 40 | 41 | public void setSort(List sort) { 42 | this.sort = sort; 43 | } 44 | 45 | @SuppressWarnings("rawtypes") 46 | public List getOrders(Root root, CriteriaBuilder cb) { 47 | List orders = new ArrayList(); 48 | for (Sort s : sort) { 49 | Order o = s.getOrder(root, cb); 50 | if (o != null) { 51 | orders.add(o); 52 | } 53 | } 54 | return orders; 55 | } 56 | } -------------------------------------------------------------------------------- /TapestryJPA/src/main/java/es/com/blogspot/elblogdepicodev/tapestry/jpa/pages/Error404.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.tapestry.jpa.pages; 2 | 3 | import org.apache.tapestry5.SymbolConstants; 4 | import org.apache.tapestry5.annotations.Import; 5 | import org.apache.tapestry5.annotations.Property; 6 | import org.apache.tapestry5.ioc.annotations.Inject; 7 | import org.apache.tapestry5.ioc.annotations.Symbol; 8 | import org.apache.tapestry5.services.Request; 9 | 10 | /** 11 | * @tapestrydoc 12 | */ 13 | @SuppressWarnings("unused") 14 | public class Error404 { 15 | 16 | @Property 17 | @Inject 18 | private Request request; 19 | 20 | @Property 21 | @Inject 22 | @Symbol(SymbolConstants.PRODUCTION_MODE) 23 | private boolean productionMode; 24 | } -------------------------------------------------------------------------------- /TapestryJPA/src/main/java/es/com/blogspot/elblogdepicodev/tapestry/jpa/pages/Error500.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.tapestry.jpa.pages; 2 | 3 | import org.apache.tapestry5.SymbolConstants; 4 | import org.apache.tapestry5.annotations.Import; 5 | import org.apache.tapestry5.annotations.Property; 6 | import org.apache.tapestry5.ioc.annotations.Inject; 7 | import org.apache.tapestry5.ioc.annotations.Symbol; 8 | import org.apache.tapestry5.services.Request; 9 | 10 | /** 11 | * @tapestrydoc 12 | */ 13 | @SuppressWarnings("unused") 14 | public class Error500 { 15 | 16 | @Property 17 | @Inject 18 | private Request request; 19 | 20 | @Property 21 | @Inject 22 | @Symbol(SymbolConstants.PRODUCTION_MODE) 23 | private boolean productionMode; 24 | } -------------------------------------------------------------------------------- /TapestryJPA/src/main/resources/META-INF/persistence.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | org.hibernate.ejb.HibernatePersistence 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /TapestryJPA/src/main/resources/es/com/blogspot/elblogdepicodev/tapestry/jpa/components/HolaMundo.tml: -------------------------------------------------------------------------------- 1 | 2 | 3 | ¡Hola mundo Tapestry! 4 | -------------------------------------------------------------------------------- /TapestryJPA/src/main/resources/es/com/blogspot/elblogdepicodev/tapestry/jpa/components/Layout.tml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Ejemplo sobre como usar persistencia con JPA mediante Hibernate en Apache Tapestry 5 7 | 8 | 9 | 17 | 18 | 19 |
20 |
21 |
22 | Apache Tapestry 5
23 | 24 | 25 |
26 |
27 |
28 | 29 | -------------------------------------------------------------------------------- /TapestryJPA/src/main/resources/es/com/blogspot/elblogdepicodev/tapestry/jpa/pages/Error404.tml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |
5 |

Página o recurso no encontrado

6 | 7 | Error 404 8 | 9 |

10 | Oooops! Parece que lo que estás buscando ya no se encuentra en su sitio prueba a encontrarlo desde la página Inicio. 11 |

12 | 13 | 14 |
15 |

Información

16 | 17 |
18 |
19 |
20 | -------------------------------------------------------------------------------- /TapestryJPA/src/main/resources/es/com/blogspot/elblogdepicodev/tapestry/jpa/pages/Error500.tml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |
5 |

Error en el servidor

6 | 7 | Error 500 8 | 9 |

10 | Oooops! Se ha producido un error en el servidor, puedes volver a la página Inicio. 11 |

12 | 13 | 14 |
15 |

Información

16 | 17 |
18 |
19 |
20 | -------------------------------------------------------------------------------- /TapestryJPA/src/main/resources/es/com/blogspot/elblogdepicodev/tapestry/jpa/pages/admin/EjemploJPA.tml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | Versión: ${tapestryVersion}
7 |
8 | 9 |

Lista de productos

10 | 11 | 12 | ${producto.nombre} 13 | 14 | 15 | Eliminar 16 | 17 | 18 |

No hay productos.

19 |
20 |
21 | Nuevo producto 22 | 23 | -------------------------------------------------------------------------------- /TapestryJPA/src/main/resources/log4j.properties: -------------------------------------------------------------------------------- 1 | # Set root logger level to DEBUG and its only appender to A1. 2 | log4j.rootLogger=ERROR, A1 3 | 4 | # A1 is set to be a ConsoleAppender. 5 | log4j.appender.A1=org.apache.log4j.ConsoleAppender 6 | 7 | # A1 uses PatternLayout. 8 | log4j.appender.A1.layout=org.apache.log4j.PatternLayout 9 | log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n -------------------------------------------------------------------------------- /TapestryJPA/src/main/webapp/WEB-INF/.gitignore: -------------------------------------------------------------------------------- 1 | /lib 2 | /classes 3 | -------------------------------------------------------------------------------- /TapestryJPA/src/main/webapp/WEB-INF/app.properties: -------------------------------------------------------------------------------- 1 | date-format-exception=Tiene que ingresar un valor válido para {0}. -------------------------------------------------------------------------------- /TapestryJPA/src/main/webapp/bootstrap/img/glyphicons-halflings-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/picodotdev/elblogdepicodev/20bd29cd073151284af2620a98dbdbc64c2023e7/TapestryJPA/src/main/webapp/bootstrap/img/glyphicons-halflings-white.png -------------------------------------------------------------------------------- /TapestryJPA/src/main/webapp/bootstrap/img/glyphicons-halflings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/picodotdev/elblogdepicodev/20bd29cd073151284af2620a98dbdbc64c2023e7/TapestryJPA/src/main/webapp/bootstrap/img/glyphicons-halflings.png -------------------------------------------------------------------------------- /TapestryJPA/src/main/webapp/images/tapestry.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/picodotdev/elblogdepicodev/20bd29cd073151284af2620a98dbdbc64c2023e7/TapestryJPA/src/main/webapp/images/tapestry.png -------------------------------------------------------------------------------- /TapestryJPA/src/main/webapp/index.jsp: -------------------------------------------------------------------------------- 1 | <% response.sendRedirect("admin/producto"); %> -------------------------------------------------------------------------------- /TapestryRESTEasy/.gitignore: -------------------------------------------------------------------------------- 1 | /bin 2 | /build 3 | /.classpath 4 | /.project 5 | /.gradle 6 | /.settings 7 | -------------------------------------------------------------------------------- /TapestryRESTEasy/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/picodotdev/elblogdepicodev/20bd29cd073151284af2620a98dbdbc64c2023e7/TapestryRESTEasy/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /TapestryRESTEasy/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Fri Feb 22 23:27:08 CET 2013 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=http\://services.gradle.org/distributions/gradle-1.4-bin.zip 7 | -------------------------------------------------------------------------------- /TapestryRESTEasy/src/main/java/es/com/blogspot/elblogdepicodev/resteasy/Application.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.resteasy; 2 | 3 | import java.util.Collection; 4 | import java.util.Collections; 5 | import java.util.HashSet; 6 | import java.util.Set; 7 | 8 | @SuppressWarnings("unchecked") 9 | public class Application extends javax.ws.rs.core.Application { 10 | 11 | private Set singletons; 12 | 13 | public Application(Collection singletons) { 14 | this.singletons = new HashSet(); 15 | this.singletons.addAll(singletons); 16 | } 17 | 18 | @Override 19 | public Set> getClasses() { 20 | return Collections.EMPTY_SET; 21 | } 22 | 23 | @Override 24 | public Set getSingletons() { 25 | return singletons; 26 | } 27 | } -------------------------------------------------------------------------------- /TapestryRESTEasy/src/main/java/es/com/blogspot/elblogdepicodev/resteasy/HelloWorldResource.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.resteasy; 2 | 3 | import javax.ws.rs.GET; 4 | import javax.ws.rs.Path; 5 | import javax.ws.rs.PathParam; 6 | import javax.ws.rs.Produces; 7 | import javax.ws.rs.core.MediaType; 8 | 9 | @Path("/helloworld") 10 | public interface HelloWorldResource { 11 | 12 | @GET 13 | @Path("/saluda") 14 | public String getSaluda(); 15 | 16 | @GET 17 | @Path("/saluda/{nombre}") 18 | public String getSaludaA(@PathParam("nombre") String nombre); 19 | 20 | @GET 21 | @Path("/mensaje/{nombre}") 22 | @Produces(MediaType.APPLICATION_JSON) 23 | public Mensaje getMensajeJSON(@PathParam("nombre") String nombre); 24 | 25 | @GET 26 | @Path("/mensaje/{nombre}") 27 | @Produces(MediaType.APPLICATION_XML) 28 | public Mensaje getMensajeXML(@PathParam("nombre") String nombre); 29 | } -------------------------------------------------------------------------------- /TapestryRESTEasy/src/main/java/es/com/blogspot/elblogdepicodev/resteasy/HelloWorldResourceImpl.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.resteasy; 2 | 3 | import java.text.MessageFormat; 4 | import java.text.SimpleDateFormat; 5 | import java.util.Date; 6 | 7 | import es.com.blogspot.elblogdepicodev.tapestry.resteasy.services.ContadorService; 8 | 9 | public class HelloWorldResourceImpl implements HelloWorldResource { 10 | 11 | private ContadorService contadorService; 12 | 13 | public HelloWorldResourceImpl(ContadorService contadorService) { 14 | this.contadorService = contadorService; 15 | } 16 | 17 | @Override 18 | public String getSaluda() { 19 | contadorService.incrementar(); 20 | return "¡Hola mundo!"; 21 | } 22 | 23 | @Override 24 | public String getSaludaA(String nombre) { 25 | contadorService.incrementar(); 26 | return MessageFormat.format("¡Hola {0}!", nombre); 27 | } 28 | 29 | @Override 30 | public Mensaje getMensajeJSON(String nombre) { 31 | contadorService.incrementar(); 32 | return buildMensaje(nombre); 33 | } 34 | 35 | @Override 36 | public Mensaje getMensajeXML(String nombre) { 37 | contadorService.incrementar(); 38 | return buildMensaje(nombre); 39 | } 40 | 41 | private Mensaje buildMensaje(String nombre) { 42 | return new Mensaje(nombre, "¡Hola mundo!", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); 43 | } 44 | } -------------------------------------------------------------------------------- /TapestryRESTEasy/src/main/java/es/com/blogspot/elblogdepicodev/resteasy/Mensaje.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.resteasy; 2 | 3 | import javax.xml.bind.annotation.XmlAttribute; 4 | import javax.xml.bind.annotation.XmlElement; 5 | import javax.xml.bind.annotation.XmlRootElement; 6 | 7 | @XmlRootElement(name = "mensaje") 8 | public class Mensaje { 9 | 10 | private String nombre; 11 | private String mensaje; 12 | private String fecha; 13 | 14 | public Mensaje() { 15 | } 16 | 17 | public Mensaje(String nombre, String mensaje, String fecha) { 18 | this.nombre = nombre; 19 | this.mensaje = mensaje; 20 | this.fecha = fecha; 21 | } 22 | 23 | @XmlElement 24 | public String getNombre() { 25 | return nombre; 26 | } 27 | 28 | public void setNombre(String nombre) { 29 | this.nombre = nombre; 30 | } 31 | 32 | @XmlElement 33 | public String getMensaje() { 34 | return mensaje; 35 | } 36 | 37 | public void setMensaje(String mensaje) { 38 | this.mensaje = mensaje; 39 | } 40 | 41 | @XmlAttribute 42 | public String getFecha() { 43 | return fecha; 44 | } 45 | 46 | public void setFecha(String fecha) { 47 | this.fecha = fecha; 48 | } 49 | } -------------------------------------------------------------------------------- /TapestryRESTEasy/src/main/java/es/com/blogspot/elblogdepicodev/tapestry/resteasy/components/HolaMundo.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.tapestry.resteasy.components; 2 | 3 | import org.apache.tapestry5.MarkupWriter; 4 | 5 | public class HolaMundo { 6 | 7 | protected boolean beginRender(MarkupWriter writer) { 8 | writer.write("Hola mundo Tapestry !!!"); 9 | return false; 10 | } 11 | } -------------------------------------------------------------------------------- /TapestryRESTEasy/src/main/java/es/com/blogspot/elblogdepicodev/tapestry/resteasy/pages/Index.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.tapestry.resteasy.pages; 2 | 3 | import org.apache.tapestry5.SymbolConstants; 4 | import org.apache.tapestry5.annotations.Property; 5 | import org.apache.tapestry5.ioc.annotations.Inject; 6 | import org.apache.tapestry5.ioc.annotations.Symbol; 7 | 8 | public class Index { 9 | 10 | @Inject 11 | @Symbol(SymbolConstants.TAPESTRY_VERSION) 12 | @Property 13 | private String tapestryVersion; 14 | } 15 | -------------------------------------------------------------------------------- /TapestryRESTEasy/src/main/java/es/com/blogspot/elblogdepicodev/tapestry/resteasy/services/ContadorService.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.tapestry.resteasy.services; 2 | 3 | public interface ContadorService { 4 | 5 | public void incrementar(); 6 | public long getCuenta(); 7 | } 8 | -------------------------------------------------------------------------------- /TapestryRESTEasy/src/main/java/es/com/blogspot/elblogdepicodev/tapestry/resteasy/services/ContadorServiceImpl.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.tapestry.resteasy.services; 2 | 3 | public class ContadorServiceImpl implements ContadorService { 4 | 5 | private long cuenta; 6 | 7 | @Override 8 | public void incrementar() { 9 | cuenta++; 10 | } 11 | 12 | @Override 13 | public long getCuenta() { 14 | return cuenta; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /TapestryRESTEasy/src/main/java/es/com/blogspot/elblogdepicodev/tapestry/resteasy/services/ResteasySymbols.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.tapestry.resteasy.services; 2 | 3 | public class ResteasySymbols { 4 | 5 | public static final String MAPPING_PREFIX = "resteasy.servlet.mapping.prefix"; 6 | public static final String MAPPING_PREFIX_JSAPI = "resteasy.servlet.mapping.prefix.jsapi"; 7 | 8 | } -------------------------------------------------------------------------------- /TapestryRESTEasy/src/main/java/es/com/blogspot/elblogdepicodev/tapestry/resteasy/services/TapestryResteasyBootstrap.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.tapestry.resteasy.services; 2 | 3 | import javax.servlet.ServletContext; 4 | 5 | import org.apache.tapestry5.ioc.services.SymbolSource; 6 | import org.jboss.resteasy.plugins.server.servlet.ListenerBootstrap; 7 | 8 | public class TapestryResteasyBootstrap extends ListenerBootstrap { 9 | 10 | SymbolSource source; 11 | 12 | public TapestryResteasyBootstrap(ServletContext servletContext, SymbolSource source) { 13 | super(servletContext); 14 | this.source = source; 15 | } 16 | 17 | public String getParameter(String name) { 18 | String val = null; 19 | 20 | try { 21 | val = source.valueForSymbol(name); 22 | } catch (RuntimeException e) { 23 | // ignore symbol not found 24 | } 25 | 26 | if (val == null) 27 | val = super.getParameter(name); 28 | 29 | return val; 30 | } 31 | 32 | @Override 33 | public String getInitParameter(String name) { 34 | return getParameter(name); 35 | } 36 | } -------------------------------------------------------------------------------- /TapestryRESTEasy/src/main/resources/es/com/blogspot/elblogdepicodev/tapestry/resteasy/pages/Index.tml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Aplicación de ejemplo de Apache Tapestry 5 integrado con RESTEasy 7 | 8 | 14 | 15 | 16 | 17 | Apache Tapestry 5
18 | Versión: ${tapestryVersion}
19 |
20 | 21 | 22 |
23 |
24 | 31 | 32 | -------------------------------------------------------------------------------- /TapestryRESTEasy/src/main/resources/log4j.properties: -------------------------------------------------------------------------------- 1 | # Set root logger level to DEBUG and its only appender to A1. 2 | log4j.rootLogger=ERROR, A1 3 | 4 | # A1 is set to be a ConsoleAppender. 5 | log4j.appender.A1=org.apache.log4j.ConsoleAppender 6 | 7 | # A1 uses PatternLayout. 8 | log4j.appender.A1.layout=org.apache.log4j.PatternLayout 9 | log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n -------------------------------------------------------------------------------- /TapestryRESTEasy/src/main/webapp/WEB-INF/web.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | TapestryRESTEasy 4 | Aplicacion de ejemplo de Apache Tapestry 5 integrado con RESTEasy 5 | 6 | 7 | 9 | tapestry.app-package 10 | es.com.blogspot.elblogdepicodev.tapestry.resteasy 11 | 12 | 13 | 14 | app 15 | org.apache.tapestry5.TapestryFilter 16 | 17 | 18 | 19 | app 20 | /* 21 | 22 | 23 | 24 | 30 25 | COOKIE 26 | 27 | 28 | 29 | Index 30 | 31 | -------------------------------------------------------------------------------- /TapestryRESTEasy/src/main/webapp/images/tapestry.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/picodotdev/elblogdepicodev/20bd29cd073151284af2620a98dbdbc64c2023e7/TapestryRESTEasy/src/main/webapp/images/tapestry.png -------------------------------------------------------------------------------- /TapestryRESTEasy/src/main/webapp/index.jsp: -------------------------------------------------------------------------------- 1 | JSP -------------------------------------------------------------------------------- /TapestrySecurity/.gitignore: -------------------------------------------------------------------------------- 1 | /bin 2 | /build 3 | /.gradle 4 | /.settings 5 | /.classpath 6 | /.project 7 | -------------------------------------------------------------------------------- /TapestrySecurity/build.gradle: -------------------------------------------------------------------------------- 1 | description = 'TapestrySecurity' 2 | version = '0.0.1' 3 | 4 | apply plugin: 'eclipse' 5 | apply plugin: 'java' 6 | apply plugin: 'war' 7 | apply plugin: 'tomcat' 8 | 9 | [tomcatRun, tomcatStop]*.stopKey = 'stopKey' 10 | 11 | buildscript { 12 | repositories { 13 | mavenCentral() 14 | } 15 | 16 | dependencies { 17 | classpath 'org.gradle.api.plugins:gradle-tomcat-plugin:0.9.8' 18 | } 19 | } 20 | 21 | repositories { 22 | flatDir name: 'Local', dirs: 'misc/lib' 23 | mavenCentral() 24 | } 25 | 26 | dependencies { 27 | compile 'org.apache.tapestry:tapestry5-annotations:5.3.7' 28 | compile 'org.apache.tapestry:tapestry-core:5.3.7' 29 | 30 | compile('org.tynamo:tapestry-security:0.5.1') { 31 | exclude(group: 'org.apache.shiro') 32 | } 33 | compile 'org.apache.shiro:shiro-all:1.2.1' 34 | 35 | providedCompile 'javax.servlet:servlet-api:2.5' 36 | 37 | // Tomcat 38 | tomcat 'org.apache.tomcat.embed:tomcat-embed-core:7.0.39' 39 | tomcat 'org.apache.tomcat.embed:tomcat-embed-logging-juli:7.0.39' 40 | tomcat('org.apache.tomcat.embed:tomcat-embed-jasper:7.0.39') { 41 | exclude group: 'org.eclipse.jdt.core.compiler', module: 'ecj' 42 | } 43 | } 44 | 45 | task wrapper(type: Wrapper) { 46 | gradleVersion = '1.6' 47 | } 48 | -------------------------------------------------------------------------------- /TapestrySecurity/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/picodotdev/elblogdepicodev/20bd29cd073151284af2620a98dbdbc64c2023e7/TapestrySecurity/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /TapestrySecurity/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Fri May 24 17:33:23 CEST 2013 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=http\://services.gradle.org/distributions/gradle-1.6-bin.zip 7 | -------------------------------------------------------------------------------- /TapestrySecurity/src/main/java/es/com/blogspot/elblogdepicodev/tapestry/security/components/HolaMundo.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.tapestry.security.components; 2 | 3 | 4 | public class HolaMundo { 5 | 6 | } -------------------------------------------------------------------------------- /TapestrySecurity/src/main/java/es/com/blogspot/elblogdepicodev/tapestry/security/components/Layout.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.tapestry.security.components; 2 | 3 | public class Layout { 4 | 5 | } -------------------------------------------------------------------------------- /TapestrySecurity/src/main/java/es/com/blogspot/elblogdepicodev/tapestry/security/misc/AppValidationDecoratorFactory.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.tapestry.security.misc; 2 | 3 | import org.apache.tapestry5.MarkupWriter; 4 | import org.apache.tapestry5.ValidationDecorator; 5 | import org.apache.tapestry5.services.Environment; 6 | import org.apache.tapestry5.services.ValidationDecoratorFactory; 7 | 8 | public class AppValidationDecoratorFactory implements ValidationDecoratorFactory { 9 | private final Environment environment; 10 | 11 | public AppValidationDecoratorFactory(Environment environment) { 12 | this.environment = environment; 13 | } 14 | 15 | public ValidationDecorator newInstance(MarkupWriter writer) { 16 | return new AppValidationDecorator(environment, writer); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /TapestrySecurity/src/main/java/es/com/blogspot/elblogdepicodev/tapestry/security/pages/Unauthorized.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.tapestry.security.pages; 2 | 3 | import org.apache.tapestry5.SymbolConstants; 4 | import org.apache.tapestry5.annotations.Property; 5 | import org.apache.tapestry5.ioc.annotations.Inject; 6 | import org.apache.tapestry5.ioc.annotations.Symbol; 7 | 8 | public class Unauthorized { 9 | 10 | @Inject 11 | @Symbol(SymbolConstants.TAPESTRY_VERSION) 12 | @Property 13 | private String tapestryVersion; 14 | } 15 | -------------------------------------------------------------------------------- /TapestrySecurity/src/main/java/es/com/blogspot/elblogdepicodev/tapestry/security/pages/Xss.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.tapestry.security.pages; 2 | 3 | import java.text.Format; 4 | import java.text.MessageFormat; 5 | 6 | import org.apache.tapestry5.PersistenceConstants; 7 | import org.apache.tapestry5.SymbolConstants; 8 | import org.apache.tapestry5.annotations.Persist; 9 | import org.apache.tapestry5.annotations.Property; 10 | import org.apache.tapestry5.ioc.annotations.Inject; 11 | import org.apache.tapestry5.ioc.annotations.Symbol; 12 | 13 | public class Xss { 14 | 15 | @Inject 16 | @Symbol(SymbolConstants.TAPESTRY_VERSION) 17 | @Property 18 | private String tapestryVersion; 19 | 20 | @Persist(PersistenceConstants.FLASH) 21 | @Property 22 | private String dato; 23 | 24 | public Object[] getDatos() { 25 | return new Object[] { dato }; 26 | } 27 | 28 | public Format getFormat() { 29 | return new MessageFormat("{0}"); 30 | } 31 | } -------------------------------------------------------------------------------- /TapestrySecurity/src/main/resources/es/com/blogspot/elblogdepicodev/tapestry/security/components/HolaMundo.tml: -------------------------------------------------------------------------------- 1 | 2 | 3 | ¡Hola mundo Tapestry! 4 | -------------------------------------------------------------------------------- /TapestrySecurity/src/main/resources/es/com/blogspot/elblogdepicodev/tapestry/security/components/Layout.tml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Ejemplo sobre como aplicar seguridad en una aplicación Apache Tapestry 5 7 | 8 | 9 | 17 | 18 | 19 |
20 |
21 |
22 | Apache Tapestry 5
23 | 24 | 25 |
26 |
27 |
28 | 29 | -------------------------------------------------------------------------------- /TapestrySecurity/src/main/resources/es/com/blogspot/elblogdepicodev/tapestry/security/pages/Unauthorized.tml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | No tienes permisos pare realizar la operación.
7 |
8 | Volver la la página Index 9 | 10 | -------------------------------------------------------------------------------- /TapestrySecurity/src/main/resources/es/com/blogspot/elblogdepicodev/tapestry/security/pages/Xss.tml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | Versión: ${tapestryVersion}
7 |
8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |

17 | 18 |

19 | Introduce
20 | <script type="text/javascript">alert('Prueba de fallo de seguridad XSS');</script> 21 |

22 |
23 | 24 |

25 | Dato filtrado (expansión):
26 | ${dato} 27 |

28 | 29 |

30 | Dato filtrado (filtrado):
31 | 32 |

33 | 34 | 35 | -------------------------------------------------------------------------------- /TapestrySecurity/src/main/resources/log4j.properties: -------------------------------------------------------------------------------- 1 | # Set root logger level to DEBUG and its only appender to A1. 2 | log4j.rootLogger=ERROR, A1 3 | 4 | # A1 is set to be a ConsoleAppender. 5 | log4j.appender.A1=org.apache.log4j.ConsoleAppender 6 | 7 | # A1 uses PatternLayout. 8 | log4j.appender.A1.layout=org.apache.log4j.PatternLayout 9 | log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n -------------------------------------------------------------------------------- /TapestrySecurity/src/main/resources/shiro-users.properties: -------------------------------------------------------------------------------- 1 | # Usuarios, passwords y roles 2 | user.root = password,root 3 | user.superuser = password,superuser 4 | user.user = password,user 5 | 6 | # Permisos de los roles 7 | role.root = "cuenta:add2,substract1,reset" 8 | role.superuser = "cuenta:add2" 9 | #role.user = "" -------------------------------------------------------------------------------- /TapestrySecurity/src/main/webapp/WEB-INF/.gitignore: -------------------------------------------------------------------------------- 1 | /lib 2 | /classes 3 | -------------------------------------------------------------------------------- /TapestrySecurity/src/main/webapp/WEB-INF/web.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | TapestrySecurity 4 | Ejemplo sobre como aplicar seguridad en una aplicación Apache Tapestry 5 5 | 6 | 7 | 9 | tapestry.app-package 10 | es.com.blogspot.elblogdepicodev.tapestry.security 11 | 12 | 13 | 14 | app 15 | org.apache.tapestry5.TapestryFilter 16 | 17 | 18 | 19 | app 20 | /* 21 | 22 | 23 | 24 | 30 25 | COOKIE 26 | 27 | 28 | 29 | Index 30 | 31 | -------------------------------------------------------------------------------- /TapestrySecurity/src/main/webapp/bootstrap/img/glyphicons-halflings-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/picodotdev/elblogdepicodev/20bd29cd073151284af2620a98dbdbc64c2023e7/TapestrySecurity/src/main/webapp/bootstrap/img/glyphicons-halflings-white.png -------------------------------------------------------------------------------- /TapestrySecurity/src/main/webapp/bootstrap/img/glyphicons-halflings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/picodotdev/elblogdepicodev/20bd29cd073151284af2620a98dbdbc64c2023e7/TapestrySecurity/src/main/webapp/bootstrap/img/glyphicons-halflings.png -------------------------------------------------------------------------------- /TapestrySecurity/src/main/webapp/images/tapestry.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/picodotdev/elblogdepicodev/20bd29cd073151284af2620a98dbdbc64c2023e7/TapestrySecurity/src/main/webapp/images/tapestry.png -------------------------------------------------------------------------------- /TapestrySecurity/src/main/webapp/index.jsp: -------------------------------------------------------------------------------- 1 | <% response.sendRedirect("index"); %> -------------------------------------------------------------------------------- /TapestrySkinning/.gitignore: -------------------------------------------------------------------------------- 1 | /bin 2 | /build 3 | /.gradle 4 | /.settings 5 | /.classpath 6 | /.project 7 | -------------------------------------------------------------------------------- /TapestrySkinning/build.gradle: -------------------------------------------------------------------------------- 1 | description = 'TapestrySkinning' 2 | version = '0.0.1' 3 | 4 | apply plugin: 'eclipse' 5 | apply plugin: 'java' 6 | apply plugin: 'war' 7 | apply plugin: 'tomcat' 8 | 9 | [tomcatRun, tomcatStop]*.stopKey = 'stopKey' 10 | 11 | buildscript { 12 | repositories { 13 | mavenCentral() 14 | } 15 | 16 | dependencies { 17 | classpath 'org.gradle.api.plugins:gradle-tomcat-plugin:0.9.7' 18 | } 19 | } 20 | 21 | repositories { 22 | flatDir name: 'Local', dirs: 'misc/lib' 23 | mavenCentral() 24 | } 25 | 26 | dependencies { 27 | compile 'org.apache.tapestry:tapestry5-annotations:5.3.6' 28 | compile 'org.apache.tapestry:tapestry-core:5.3.6' 29 | 30 | providedCompile 'javax.servlet:servlet-api:2.5' 31 | 32 | // Tomcat 33 | tomcat 'org.apache.tomcat.embed:tomcat-embed-core:7.0.37' 34 | tomcat 'org.apache.tomcat.embed:tomcat-embed-logging-juli:7.0.37' 35 | tomcat('org.apache.tomcat.embed:tomcat-embed-jasper:7.0.37') { 36 | exclude group: 'org.eclipse.jdt.core.compiler', module: 'ecj' 37 | } 38 | } 39 | 40 | task wrapper(type: Wrapper) { 41 | gradleVersion = '1.4' 42 | } -------------------------------------------------------------------------------- /TapestrySkinning/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/picodotdev/elblogdepicodev/20bd29cd073151284af2620a98dbdbc64c2023e7/TapestrySkinning/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /TapestrySkinning/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Sat Mar 02 11:02:16 CET 2013 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=http\://services.gradle.org/distributions/gradle-1.4-bin.zip 7 | -------------------------------------------------------------------------------- /TapestrySkinning/src/main/java/es/com/blogspot/elblogdepicodev/tapestry/skin/components/HolaMundo.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.tapestry.skin.components; 2 | 3 | 4 | public class HolaMundo { 5 | 6 | } -------------------------------------------------------------------------------- /TapestrySkinning/src/main/java/es/com/blogspot/elblogdepicodev/tapestry/skin/pages/Index.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.tapestry.skin.pages; 2 | 3 | import org.apache.tapestry5.SymbolConstants; 4 | import org.apache.tapestry5.annotations.Property; 5 | import org.apache.tapestry5.ioc.annotations.Inject; 6 | import org.apache.tapestry5.ioc.annotations.Symbol; 7 | 8 | public class Index { 9 | 10 | @Inject 11 | @Symbol(SymbolConstants.TAPESTRY_VERSION) 12 | @Property 13 | private String tapestryVersion; 14 | } 15 | -------------------------------------------------------------------------------- /TapestrySkinning/src/main/java/es/com/blogspot/elblogdepicodev/tapestry/skin/services/CustomComponentRequestSelectorAnalyzer.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.tapestry.skin.services; 2 | 3 | import java.util.Locale; 4 | 5 | import javax.servlet.http.HttpServletRequest; 6 | 7 | import org.apache.tapestry5.ioc.services.ThreadLocale; 8 | import org.apache.tapestry5.services.pageload.ComponentRequestSelectorAnalyzer; 9 | import org.apache.tapestry5.services.pageload.ComponentResourceSelector; 10 | 11 | public class CustomComponentRequestSelectorAnalyzer implements ComponentRequestSelectorAnalyzer { 12 | 13 | private final ThreadLocale threadLocale; 14 | private final HttpServletRequest request; 15 | 16 | public CustomComponentRequestSelectorAnalyzer(ThreadLocale threadLocale, HttpServletRequest request) { 17 | this.threadLocale = threadLocale; 18 | this.request = request; 19 | } 20 | 21 | @Override 22 | public ComponentResourceSelector buildSelectorForRequest() { 23 | Locale locale = threadLocale.getLocale(); 24 | DominioAxis dominio = DominioAxis.getByServerName(request.getServerName()); 25 | return new ComponentResourceSelector(locale).withAxis(DominioAxis.class, dominio); 26 | } 27 | } -------------------------------------------------------------------------------- /TapestrySkinning/src/main/java/es/com/blogspot/elblogdepicodev/tapestry/skin/services/DominioAxis.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.tapestry.skin.services; 2 | 3 | public enum DominioAxis { 4 | 5 | COM_ES, NET; 6 | 7 | public static DominioAxis getByServerName(String serverName) { 8 | if (serverName == null) { 9 | return null; 10 | } 11 | 12 | for (DominioAxis dominio : values()) { 13 | String d = dominio.name().toLowerCase().replaceAll("_", "."); 14 | if (serverName.endsWith(d)) { 15 | return dominio; 16 | } 17 | } 18 | return null; 19 | } 20 | } -------------------------------------------------------------------------------- /TapestrySkinning/src/main/resources/es/com/blogspot/elblogdepicodev/tapestry/skin/components/HolaMundo.tml: -------------------------------------------------------------------------------- 1 | 2 | 3 | ¡Hola mundo Tapestry! 4 | -------------------------------------------------------------------------------- /TapestrySkinning/src/main/resources/es/com/blogspot/elblogdepicodev/tapestry/skin/components/HolaMundo_com_es.tml: -------------------------------------------------------------------------------- 1 | 2 | 3 | ¡Hola mundo Tapestry desde el dominio .com.es! 4 | -------------------------------------------------------------------------------- /TapestrySkinning/src/main/resources/es/com/blogspot/elblogdepicodev/tapestry/skin/components/HolaMundo_net.tml: -------------------------------------------------------------------------------- 1 | 2 | 3 | ¡Hola mundo Tapestry desde el dominio .net! 4 | -------------------------------------------------------------------------------- /TapestrySkinning/src/main/resources/es/com/blogspot/elblogdepicodev/tapestry/skin/pages/Index.tml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Aplicacion de ejemplo de Apache Tapestry 5 sobre como cambiar el aspecto de una web en función de algunas variables 7 | 8 | 14 | 15 | 16 | Apache Tapestry 5
17 | Versión: ${tapestryVersion}
18 |
19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /TapestrySkinning/src/main/resources/es/com/blogspot/elblogdepicodev/tapestry/skin/pages/Index_net.tml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Aplicacion de ejemplo de Apache Tapestry 5 sobre como cambiar el aspecto de una web en función de algunas variables 7 | 8 | 14 | 15 | 16 | Apache Tapestry 5
17 | Versión: ${tapestryVersion}
18 | Dominio: .net
19 |
20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /TapestrySkinning/src/main/resources/log4j.properties: -------------------------------------------------------------------------------- 1 | # Set root logger level to DEBUG and its only appender to A1. 2 | log4j.rootLogger=ERROR, A1 3 | 4 | # A1 is set to be a ConsoleAppender. 5 | log4j.appender.A1=org.apache.log4j.ConsoleAppender 6 | 7 | # A1 uses PatternLayout. 8 | log4j.appender.A1.layout=org.apache.log4j.PatternLayout 9 | log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n -------------------------------------------------------------------------------- /TapestrySkinning/src/main/webapp/WEB-INF/.gitignore: -------------------------------------------------------------------------------- 1 | /lib 2 | /classes 3 | -------------------------------------------------------------------------------- /TapestrySkinning/src/main/webapp/WEB-INF/web.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | TapestrySkinning 4 | Aplicacion de ejemplo de Apache Tapestry 5 sobre como cambiar el aspecto de una web en función de algunas variables 5 | 6 | 7 | 9 | tapestry.app-package 10 | es.com.blogspot.elblogdepicodev.tapestry.skin 11 | 12 | 13 | 14 | app 15 | org.apache.tapestry5.TapestryFilter 16 | 17 | 18 | 19 | app 20 | /* 21 | 22 | 23 | 24 | 30 25 | COOKIE 26 | 27 | 28 | 29 | Index 30 | 31 | -------------------------------------------------------------------------------- /TapestrySkinning/src/main/webapp/images/tapestry.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/picodotdev/elblogdepicodev/20bd29cd073151284af2620a98dbdbc64c2023e7/TapestrySkinning/src/main/webapp/images/tapestry.png -------------------------------------------------------------------------------- /TapestrySkinning/src/main/webapp/index.jsp: -------------------------------------------------------------------------------- 1 | JSP -------------------------------------------------------------------------------- /TapestryTest/.gitignore: -------------------------------------------------------------------------------- 1 | /bin 2 | /build 3 | /.classpath 4 | /.project 5 | /.gradle 6 | /.settings 7 | -------------------------------------------------------------------------------- /TapestryTest/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/picodotdev/elblogdepicodev/20bd29cd073151284af2620a98dbdbc64c2023e7/TapestryTest/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /TapestryTest/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Fri Jun 21 18:38:13 CEST 2013 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=http\://services.gradle.org/distributions/gradle-1.6-bin.zip 7 | -------------------------------------------------------------------------------- /TapestryTest/src/main/java/es/com/blogspot/elblogdepicodev/test/tapestry/components/HolaMundo.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.test.tapestry.components; 2 | 3 | import java.text.MessageFormat; 4 | 5 | import org.apache.tapestry5.MarkupWriter; 6 | import org.apache.tapestry5.annotations.BeginRender; 7 | import org.apache.tapestry5.annotations.Parameter; 8 | import org.apache.tapestry5.ioc.annotations.Inject; 9 | 10 | import es.com.blogspot.elblogdepicodev.test.tapestry.services.MensajeService; 11 | 12 | public class HolaMundo { 13 | 14 | @Parameter(value = "literal:Tapestry") 15 | String nombre; 16 | 17 | @Inject 18 | MensajeService mensajeService; 19 | 20 | @BeginRender 21 | boolean beginRender(MarkupWriter writer) { 22 | String mensaje = mensajeService.getMensaje(); 23 | String text = MessageFormat.format(mensaje, nombre); 24 | writer.write(text); 25 | return false; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /TapestryTest/src/main/java/es/com/blogspot/elblogdepicodev/test/tapestry/pages/Index.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.test.tapestry.pages; 2 | 3 | import org.apache.tapestry5.SymbolConstants; 4 | import org.apache.tapestry5.annotations.Property; 5 | import org.apache.tapestry5.ioc.annotations.Inject; 6 | import org.apache.tapestry5.ioc.annotations.Symbol; 7 | 8 | public class Index { 9 | 10 | @Inject 11 | @Symbol(SymbolConstants.TAPESTRY_VERSION) 12 | @Property 13 | private String tapestryVersion; 14 | } -------------------------------------------------------------------------------- /TapestryTest/src/main/java/es/com/blogspot/elblogdepicodev/test/tapestry/services/AppModule.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.test.tapestry.services; 2 | 3 | import org.apache.tapestry5.SymbolConstants; 4 | import org.apache.tapestry5.ioc.MappedConfiguration; 5 | import org.apache.tapestry5.ioc.ServiceBinder; 6 | 7 | public class AppModule { 8 | 9 | public static void contributeApplicationDefaults(MappedConfiguration configuration) { 10 | String production = "false"; 11 | configuration.add(SymbolConstants.PRODUCTION_MODE, production); 12 | configuration.add(SymbolConstants.COMPRESS_WHITESPACE, production); 13 | configuration.add(SymbolConstants.COMBINE_SCRIPTS, production); 14 | configuration.add(SymbolConstants.MINIFICATION_ENABLED, production); 15 | configuration.add(SymbolConstants.COMPACT_JSON, production); 16 | configuration.add(SymbolConstants.SUPPORTED_LOCALES, "es"); 17 | } 18 | 19 | public static void bind(ServiceBinder binder) { 20 | binder.bind(MensajeService.class, MensajeServiceImpl.class); 21 | } 22 | } -------------------------------------------------------------------------------- /TapestryTest/src/main/java/es/com/blogspot/elblogdepicodev/test/tapestry/services/MensajeService.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.test.tapestry.services; 2 | 3 | public interface MensajeService { 4 | 5 | String getMensaje(); 6 | } -------------------------------------------------------------------------------- /TapestryTest/src/main/java/es/com/blogspot/elblogdepicodev/test/tapestry/services/MensajeServiceImpl.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.test.tapestry.services; 2 | 3 | public class MensajeServiceImpl implements MensajeService { 4 | 5 | @Override 6 | public String getMensaje() { 7 | return "Hola mundo {0}!!!"; 8 | } 9 | } -------------------------------------------------------------------------------- /TapestryTest/src/main/resources/log4j.properties: -------------------------------------------------------------------------------- 1 | # Set root logger level to DEBUG and its only appender to A1. 2 | log4j.rootLogger=ERROR, A1 3 | 4 | # A1 is set to be a ConsoleAppender. 5 | log4j.appender.A1=org.apache.log4j.ConsoleAppender 6 | 7 | # A1 uses PatternLayout. 8 | log4j.appender.A1.layout=org.apache.log4j.PatternLayout 9 | log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n -------------------------------------------------------------------------------- /TapestryTest/src/main/webapp/WEB-INF/web.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | TapestryTest 4 | Aplicacion de ejemplo de como hacer pruebas unitarias y de integración con Apache Tapestry 5 | 6 | 7 | 9 | tapestry.app-package 10 | es.com.blogspot.elblogdepicodev.test.tapestry 11 | 12 | 13 | 14 | app 15 | org.apache.tapestry5.TapestryFilter 16 | 17 | 18 | 19 | app 20 | /* 21 | 22 | 23 | 24 | 30 25 | COOKIE 26 | 27 | 28 | 29 | Index 30 | 31 | 32 | -------------------------------------------------------------------------------- /TapestryTest/src/main/webapp/bootstrap/img/glyphicons-halflings-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/picodotdev/elblogdepicodev/20bd29cd073151284af2620a98dbdbc64c2023e7/TapestryTest/src/main/webapp/bootstrap/img/glyphicons-halflings-white.png -------------------------------------------------------------------------------- /TapestryTest/src/main/webapp/bootstrap/img/glyphicons-halflings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/picodotdev/elblogdepicodev/20bd29cd073151284af2620a98dbdbc64c2023e7/TapestryTest/src/main/webapp/bootstrap/img/glyphicons-halflings.png -------------------------------------------------------------------------------- /TapestryTest/src/main/webapp/images/tapestry.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/picodotdev/elblogdepicodev/20bd29cd073151284af2620a98dbdbc64c2023e7/TapestryTest/src/main/webapp/images/tapestry.png -------------------------------------------------------------------------------- /TapestryTest/src/main/webapp/index.jsp: -------------------------------------------------------------------------------- 1 | JSP -------------------------------------------------------------------------------- /TapestryTest/src/test/groovy/es/com/blogspot/elblogdepicodev/test/geb/GoogleSearchSpec.groovy: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.test.geb 2 | 3 | import geb.Page 4 | import geb.spock.GebSpec 5 | 6 | class GoogleHomePage extends Page { 7 | static url = 'http://google.es/' 8 | static at = { title == 'Google' } 9 | static content = { 10 | searchField { $("input[name=q]") } 11 | searchButton(to: GoogleResultsPage) { $("input[value='Buscar con Google']") } 12 | } 13 | } 14 | 15 | class GoogleResultsPage extends Page { 16 | static at = { waitFor { title.endsWith("Buscar con Google") } } 17 | static content = { 18 | results(wait: true) { $("li.g") } 19 | result { index -> return results[index] } 20 | resultLink { index -> result(index).find("h3.r a") } 21 | } 22 | } 23 | 24 | class GoogleSearchSpec extends GebSpec { 25 | def 'go to google'() { 26 | when: 27 | to GoogleHomePage 28 | searchField().value "Chuck Norris" 29 | searchButton().click() 30 | 31 | then: 32 | at GoogleResultsPage 33 | resultLink(0).text().contains("Chuck") 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /TapestryTest/src/test/groovy/es/com/blogspot/elblogdepicodev/test/geb/GoogleSpec.groovy: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.test.geb 2 | 3 | import geb.spock.GebSpec 4 | 5 | class GoogleSpec extends GebSpec { 6 | def 'go to google'() { 7 | when: 8 | go 'http://www.google.es' 9 | 10 | then: 11 | title == 'Google' 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /TapestryTest/src/test/groovy/es/com/blogspot/elblogdepicodev/test/geb/IndexSpec.groovy: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.test.geb 2 | 3 | import geb.Page 4 | import geb.spock.GebSpec 5 | 6 | class IndexPage extends Page { 7 | static url = 'http://localhost:8080/TapestryTest/Index' 8 | static at = { title.endsWith('Apache Tapestry') } 9 | static content = { 10 | id { $('#id1') } 11 | } 12 | } 13 | 14 | class IndexSpec extends GebSpec { 15 | def 'go to index'() { 16 | when: 17 | to IndexPage 18 | 19 | then: 20 | id.text() == 'Hola mundo Tapestry!!!' 21 | } 22 | } -------------------------------------------------------------------------------- /TapestryTest/src/test/java/es/com/blogspot/elblogdepicodev/test/tapestry/components/HolaMundoTest.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.test.tapestry.components; 2 | 3 | import org.apache.tapestry5.MarkupWriter; 4 | import org.apache.tapestry5.internal.services.MarkupWriterImpl; 5 | import org.junit.Assert; 6 | import org.junit.Test; 7 | import org.mockito.Mockito; 8 | 9 | import es.com.blogspot.elblogdepicodev.test.tapestry.services.MensajeService; 10 | 11 | public class HolaMundoTest { 12 | 13 | @Test 14 | public void conNombre() { 15 | // Dependencias 16 | MensajeService mensajeService = Mockito.mock(MensajeService.class); 17 | Mockito.when(mensajeService.getMensaje()).thenReturn("Hola mundo {0}!!!"); 18 | 19 | // Crear el componente 20 | HolaMundo componente = new HolaMundo(); 21 | 22 | // Inyectar las dependencias 23 | componente.nombre = "picodotdev"; 24 | componente.mensajeService = mensajeService; 25 | 26 | // Ejecutar el sujecto bajo prueba 27 | MarkupWriter writer = new MarkupWriterImpl(); 28 | componente.beginRender(writer); 29 | 30 | // Comprobar el resultado 31 | Assert.assertEquals("Hola mundo picodotdev!!!", writer.toString()); 32 | } 33 | } -------------------------------------------------------------------------------- /TapestryTest/src/test/java/es/com/blogspot/elblogdepicodev/test/tapestry/test/AbstractTest.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.test.tapestry.test; 2 | 3 | import com.formos.tapestry.testify.core.TapestryTester; 4 | import com.formos.tapestry.testify.junit4.TapestryTest; 5 | 6 | import es.com.blogspot.elblogdepicodev.test.tapestry.test.services.TestModule; 7 | 8 | 9 | public abstract class AbstractTest extends TapestryTest { 10 | 11 | private static final TapestryTester SHARED_TESTER = new TapestryTester("es.com.blogspot.elblogdepicodev.test.tapestry", "app", "src/main/webapp", TestModule.class); 12 | 13 | public AbstractTest() { 14 | super(SHARED_TESTER); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /TapestryTest/src/test/java/es/com/blogspot/elblogdepicodev/test/tapestry/test/pages/HolaMundoTest.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.test.tapestry.test.pages; 2 | 3 | import org.apache.tapestry5.annotations.Property; 4 | import org.apache.tapestry5.annotations.Service; 5 | import org.apache.tapestry5.ioc.annotations.Inject; 6 | 7 | public class HolaMundoTest { 8 | 9 | // Parámetro que recibirá el componete. 10 | // El valor se obtiene como si se tratase de un servicio mediante 11 | // la anotación @Inject/@Service, como el tipo es String para distinguir 12 | // entre varios se le da un nombre. 13 | @Inject 14 | @Service("nombre") 15 | @Property 16 | private String nombre; 17 | } -------------------------------------------------------------------------------- /TapestryTest/src/test/java/es/com/blogspot/elblogdepicodev/test/tapestry/test/services/TestModule.java: -------------------------------------------------------------------------------- 1 | package es.com.blogspot.elblogdepicodev.test.tapestry.test.services; 2 | 3 | import org.apache.tapestry5.ioc.Configuration; 4 | import org.apache.tapestry5.services.LibraryMapping; 5 | 6 | public class TestModule { 7 | 8 | public static void contributeComponentClassResolver(Configuration configuration) { 9 | configuration.add(new LibraryMapping("test", "es.com.blogspot.elblogdepicodev.test.tapestry.test")); 10 | } 11 | } -------------------------------------------------------------------------------- /TapestryTest/src/test/resources/es/com/blogspot/elblogdepicodev/test/tapestry/test/pages/HolaMundoTest.tml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 |
6 |
7 | 8 | 9 | --------------------------------------------------------------------------------