Add new rest plugin and angularjs based example application with support for bean validation and multi language support
Project: http://git-wip-us.apache.org/repos/asf/struts-examples/repo Commit: http://git-wip-us.apache.org/repos/asf/struts-examples/commit/a183bf5c Tree: http://git-wip-us.apache.org/repos/asf/struts-examples/tree/a183bf5c Diff: http://git-wip-us.apache.org/repos/asf/struts-examples/diff/a183bf5c Branch: refs/heads/master Commit: a183bf5cb414ee19ad5788e09d579f71d4f0ddea Parents: eb48254 Author: Johannes Geppert <jo...@apache.org> Authored: Mon Oct 5 19:23:17 2015 +0200 Committer: Johannes Geppert <jo...@apache.org> Committed: Mon Oct 5 19:23:18 2015 +0200 ---------------------------------------------------------------------- pom.xml | 7 +- rest-angular/pom.xml | 227 + .../struts/actions/IndexController.java | 56 + .../struts/actions/data/LanguageController.java | 41 + .../struts/actions/data/OrderController.java | 80 + .../struts/actions/data/package-info.java | 6 + .../ExceptionHandlerInterceptor.java | 52 + .../apache/examples/struts/models/Order.java | 86 + .../examples/struts/services/OrdersService.java | 41 + .../src/main/resources/exceptions_de.properties | 1 + .../src/main/resources/exceptions_en.properties | 1 + .../src/main/resources/frontend_de.properties | 16 + .../src/main/resources/frontend_en.properties | 16 + rest-angular/src/main/resources/jshint.conf.js | 13 + rest-angular/src/main/resources/log4j2.xml | 16 + rest-angular/src/main/resources/struts.xml | 82 + .../src/main/resources/validation_de.properties | 2 + .../src/main/resources/validation_en.properties | 2 + .../src/main/webapp/WEB-INF/content/index.jsp | 78 + rest-angular/src/main/webapp/WEB-INF/web.xml | 20 + rest-angular/src/main/webapp/css/app.css | 4 + .../src/main/webapp/css/bootstrap-theme.css | 476 + .../src/main/webapp/css/bootstrap-theme.css.map | 1 + .../src/main/webapp/css/bootstrap-theme.min.css | 5 + rest-angular/src/main/webapp/css/bootstrap.css | 6584 +++ .../src/main/webapp/css/bootstrap.css.map | 1 + .../src/main/webapp/css/bootstrap.min.css | 5 + .../fonts/glyphicons-halflings-regular.eot | Bin 0 -> 20127 bytes .../fonts/glyphicons-halflings-regular.svg | 288 + .../fonts/glyphicons-halflings-regular.ttf | Bin 0 -> 45404 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 0 -> 23424 bytes .../fonts/glyphicons-halflings-regular.woff2 | Bin 0 -> 18028 bytes rest-angular/src/main/webapp/index.jsp | 1 + rest-angular/src/main/webapp/js/app.js | 26 + rest-angular/src/main/webapp/js/config.js | 57 + .../main/webapp/js/controllers/AppController.js | 53 + .../webapp/js/controllers/OrderAddController.js | 47 + .../js/controllers/OrderDetailController.js | 44 + .../js/controllers/OrderEditController.js | 56 + .../webapp/js/controllers/OrdersController.js | 51 + .../js/lib/angular-translate-loader-url.min.js | 6 + .../main/webapp/js/lib/angular-translate.min.js | 6 + .../webapp/js/lib/angular/angular-animate.js | 3862 ++ .../js/lib/angular/angular-animate.min.js | 56 + .../js/lib/angular/angular-animate.min.js.map | 8 + .../main/webapp/js/lib/angular/angular-aria.js | 393 + .../webapp/js/lib/angular/angular-aria.min.js | 13 + .../js/lib/angular/angular-aria.min.js.map | 8 + .../webapp/js/lib/angular/angular-cookies.js | 321 + .../js/lib/angular/angular-cookies.min.js | 9 + .../js/lib/angular/angular-cookies.min.js.map | 8 + .../main/webapp/js/lib/angular/angular-csp.css | 21 + .../webapp/js/lib/angular/angular-loader.js | 443 + .../webapp/js/lib/angular/angular-loader.min.js | 10 + .../js/lib/angular/angular-loader.min.js.map | 8 + .../js/lib/angular/angular-message-format.js | 980 + .../lib/angular/angular-message-format.min.js | 26 + .../angular/angular-message-format.min.js.map | 8 + .../webapp/js/lib/angular/angular-messages.js | 678 + .../js/lib/angular/angular-messages.min.js | 11 + .../js/lib/angular/angular-messages.min.js.map | 8 + .../main/webapp/js/lib/angular/angular-mocks.js | 2458 + .../webapp/js/lib/angular/angular-resource.js | 675 + .../js/lib/angular/angular-resource.min.js | 13 + .../js/lib/angular/angular-resource.min.js.map | 8 + .../main/webapp/js/lib/angular/angular-route.js | 991 + .../webapp/js/lib/angular/angular-route.min.js | 15 + .../js/lib/angular/angular-route.min.js.map | 8 + .../webapp/js/lib/angular/angular-sanitize.js | 683 + .../js/lib/angular/angular-sanitize.min.js | 16 + .../js/lib/angular/angular-sanitize.min.js.map | 8 + .../webapp/js/lib/angular/angular-scenario.js | 40108 +++++++++++++++++ .../main/webapp/js/lib/angular/angular-touch.js | 628 + .../webapp/js/lib/angular/angular-touch.min.js | 13 + .../js/lib/angular/angular-touch.min.js.map | 8 + .../src/main/webapp/js/lib/angular/angular.js | 28688 ++++++++++++ .../main/webapp/js/lib/angular/angular.min.js | 293 + .../webapp/js/lib/angular/angular.min.js.map | 8 + .../src/main/webapp/js/lib/angular/errors.json | 1 + .../js/lib/angular/i18n/angular-locale_aa-dj.js | 128 + .../js/lib/angular/i18n/angular-locale_aa-er.js | 128 + .../js/lib/angular/i18n/angular-locale_aa-et.js | 128 + .../js/lib/angular/i18n/angular-locale_aa.js | 128 + .../js/lib/angular/i18n/angular-locale_af-na.js | 110 + .../js/lib/angular/i18n/angular-locale_af-za.js | 110 + .../js/lib/angular/i18n/angular-locale_af.js | 110 + .../lib/angular/i18n/angular-locale_agq-cm.js | 128 + .../js/lib/angular/i18n/angular-locale_agq.js | 128 + .../js/lib/angular/i18n/angular-locale_ak-gh.js | 128 + .../js/lib/angular/i18n/angular-locale_ak.js | 128 + .../js/lib/angular/i18n/angular-locale_am-et.js | 110 + .../js/lib/angular/i18n/angular-locale_am.js | 110 + .../lib/angular/i18n/angular-locale_ar-001.js | 110 + .../js/lib/angular/i18n/angular-locale_ar-ae.js | 110 + .../js/lib/angular/i18n/angular-locale_ar-bh.js | 110 + .../js/lib/angular/i18n/angular-locale_ar-dj.js | 110 + .../js/lib/angular/i18n/angular-locale_ar-dz.js | 110 + .../js/lib/angular/i18n/angular-locale_ar-eg.js | 110 + .../js/lib/angular/i18n/angular-locale_ar-eh.js | 110 + .../js/lib/angular/i18n/angular-locale_ar-er.js | 110 + .../js/lib/angular/i18n/angular-locale_ar-il.js | 110 + .../js/lib/angular/i18n/angular-locale_ar-iq.js | 110 + .../js/lib/angular/i18n/angular-locale_ar-jo.js | 110 + .../js/lib/angular/i18n/angular-locale_ar-km.js | 110 + .../js/lib/angular/i18n/angular-locale_ar-kw.js | 110 + .../js/lib/angular/i18n/angular-locale_ar-lb.js | 110 + .../js/lib/angular/i18n/angular-locale_ar-ly.js | 110 + .../js/lib/angular/i18n/angular-locale_ar-ma.js | 110 + .../js/lib/angular/i18n/angular-locale_ar-mr.js | 110 + .../js/lib/angular/i18n/angular-locale_ar-om.js | 110 + .../js/lib/angular/i18n/angular-locale_ar-ps.js | 110 + .../js/lib/angular/i18n/angular-locale_ar-qa.js | 110 + .../js/lib/angular/i18n/angular-locale_ar-sa.js | 110 + .../js/lib/angular/i18n/angular-locale_ar-sd.js | 110 + .../js/lib/angular/i18n/angular-locale_ar-so.js | 110 + .../js/lib/angular/i18n/angular-locale_ar-ss.js | 110 + .../js/lib/angular/i18n/angular-locale_ar-sy.js | 110 + .../js/lib/angular/i18n/angular-locale_ar-td.js | 110 + .../js/lib/angular/i18n/angular-locale_ar-tn.js | 110 + .../js/lib/angular/i18n/angular-locale_ar-ye.js | 110 + .../js/lib/angular/i18n/angular-locale_ar.js | 110 + .../js/lib/angular/i18n/angular-locale_as-in.js | 128 + .../js/lib/angular/i18n/angular-locale_as.js | 128 + .../lib/angular/i18n/angular-locale_asa-tz.js | 128 + .../js/lib/angular/i18n/angular-locale_asa.js | 128 + .../lib/angular/i18n/angular-locale_ast-es.js | 128 + .../js/lib/angular/i18n/angular-locale_ast.js | 128 + .../angular/i18n/angular-locale_az-cyrl-az.js | 110 + .../lib/angular/i18n/angular-locale_az-cyrl.js | 110 + .../angular/i18n/angular-locale_az-latn-az.js | 110 + .../lib/angular/i18n/angular-locale_az-latn.js | 110 + .../js/lib/angular/i18n/angular-locale_az.js | 110 + .../lib/angular/i18n/angular-locale_bas-cm.js | 128 + .../js/lib/angular/i18n/angular-locale_bas.js | 128 + .../js/lib/angular/i18n/angular-locale_be-by.js | 110 + .../js/lib/angular/i18n/angular-locale_be.js | 110 + .../lib/angular/i18n/angular-locale_bem-zm.js | 128 + .../js/lib/angular/i18n/angular-locale_bem.js | 128 + .../lib/angular/i18n/angular-locale_bez-tz.js | 128 + .../js/lib/angular/i18n/angular-locale_bez.js | 128 + .../js/lib/angular/i18n/angular-locale_bg-bg.js | 110 + .../js/lib/angular/i18n/angular-locale_bg.js | 110 + .../angular/i18n/angular-locale_bm-latn-ml.js | 128 + .../lib/angular/i18n/angular-locale_bm-latn.js | 128 + .../js/lib/angular/i18n/angular-locale_bm-ml.js | 115 + .../js/lib/angular/i18n/angular-locale_bm.js | 128 + .../js/lib/angular/i18n/angular-locale_bn-bd.js | 110 + .../js/lib/angular/i18n/angular-locale_bn-in.js | 110 + .../js/lib/angular/i18n/angular-locale_bn.js | 110 + .../js/lib/angular/i18n/angular-locale_bo-cn.js | 128 + .../js/lib/angular/i18n/angular-locale_bo-in.js | 128 + .../js/lib/angular/i18n/angular-locale_bo.js | 128 + .../js/lib/angular/i18n/angular-locale_br-fr.js | 110 + .../js/lib/angular/i18n/angular-locale_br.js | 110 + .../lib/angular/i18n/angular-locale_brx-in.js | 128 + .../js/lib/angular/i18n/angular-locale_brx.js | 128 + .../angular/i18n/angular-locale_bs-cyrl-ba.js | 128 + .../lib/angular/i18n/angular-locale_bs-cyrl.js | 128 + .../angular/i18n/angular-locale_bs-latn-ba.js | 128 + .../lib/angular/i18n/angular-locale_bs-latn.js | 128 + .../js/lib/angular/i18n/angular-locale_bs.js | 128 + .../lib/angular/i18n/angular-locale_byn-er.js | 115 + .../js/lib/angular/i18n/angular-locale_byn.js | 115 + .../js/lib/angular/i18n/angular-locale_ca-ad.js | 128 + .../i18n/angular-locale_ca-es-valencia.js | 128 + .../js/lib/angular/i18n/angular-locale_ca-es.js | 128 + .../js/lib/angular/i18n/angular-locale_ca-fr.js | 128 + .../js/lib/angular/i18n/angular-locale_ca-it.js | 128 + .../js/lib/angular/i18n/angular-locale_ca.js | 128 + .../lib/angular/i18n/angular-locale_cgg-ug.js | 128 + .../js/lib/angular/i18n/angular-locale_cgg.js | 128 + .../lib/angular/i18n/angular-locale_chr-us.js | 110 + .../js/lib/angular/i18n/angular-locale_chr.js | 110 + .../angular/i18n/angular-locale_ckb-arab-iq.js | 128 + .../angular/i18n/angular-locale_ckb-arab-ir.js | 128 + .../lib/angular/i18n/angular-locale_ckb-arab.js | 128 + .../lib/angular/i18n/angular-locale_ckb-iq.js | 128 + .../lib/angular/i18n/angular-locale_ckb-ir.js | 128 + .../angular/i18n/angular-locale_ckb-latn-iq.js | 128 + .../lib/angular/i18n/angular-locale_ckb-latn.js | 128 + .../js/lib/angular/i18n/angular-locale_ckb.js | 128 + .../js/lib/angular/i18n/angular-locale_cs-cz.js | 128 + .../js/lib/angular/i18n/angular-locale_cs.js | 128 + .../js/lib/angular/i18n/angular-locale_cy-gb.js | 110 + .../js/lib/angular/i18n/angular-locale_cy.js | 110 + .../js/lib/angular/i18n/angular-locale_da-dk.js | 141 + .../js/lib/angular/i18n/angular-locale_da-gl.js | 141 + .../js/lib/angular/i18n/angular-locale_da.js | 141 + .../lib/angular/i18n/angular-locale_dav-ke.js | 128 + .../js/lib/angular/i18n/angular-locale_dav.js | 128 + .../js/lib/angular/i18n/angular-locale_de-at.js | 128 + .../js/lib/angular/i18n/angular-locale_de-be.js | 128 + .../js/lib/angular/i18n/angular-locale_de-ch.js | 128 + .../js/lib/angular/i18n/angular-locale_de-de.js | 128 + .../js/lib/angular/i18n/angular-locale_de-li.js | 128 + .../js/lib/angular/i18n/angular-locale_de-lu.js | 128 + .../js/lib/angular/i18n/angular-locale_de.js | 128 + .../lib/angular/i18n/angular-locale_dje-ne.js | 128 + .../js/lib/angular/i18n/angular-locale_dje.js | 128 + .../lib/angular/i18n/angular-locale_dsb-de.js | 128 + .../js/lib/angular/i18n/angular-locale_dsb.js | 128 + .../lib/angular/i18n/angular-locale_dua-cm.js | 128 + .../js/lib/angular/i18n/angular-locale_dua.js | 128 + .../lib/angular/i18n/angular-locale_dyo-sn.js | 128 + .../js/lib/angular/i18n/angular-locale_dyo.js | 128 + .../js/lib/angular/i18n/angular-locale_dz-bt.js | 128 + .../js/lib/angular/i18n/angular-locale_dz.js | 128 + .../lib/angular/i18n/angular-locale_ebu-ke.js | 128 + .../js/lib/angular/i18n/angular-locale_ebu.js | 128 + .../js/lib/angular/i18n/angular-locale_ee-gh.js | 128 + .../js/lib/angular/i18n/angular-locale_ee-tg.js | 128 + .../js/lib/angular/i18n/angular-locale_ee.js | 128 + .../js/lib/angular/i18n/angular-locale_el-cy.js | 110 + .../js/lib/angular/i18n/angular-locale_el-gr.js | 110 + .../js/lib/angular/i18n/angular-locale_el.js | 110 + .../lib/angular/i18n/angular-locale_en-001.js | 128 + .../lib/angular/i18n/angular-locale_en-150.js | 128 + .../js/lib/angular/i18n/angular-locale_en-ag.js | 128 + .../js/lib/angular/i18n/angular-locale_en-ai.js | 128 + .../js/lib/angular/i18n/angular-locale_en-as.js | 128 + .../js/lib/angular/i18n/angular-locale_en-au.js | 128 + .../js/lib/angular/i18n/angular-locale_en-bb.js | 128 + .../js/lib/angular/i18n/angular-locale_en-be.js | 128 + .../js/lib/angular/i18n/angular-locale_en-bm.js | 128 + .../js/lib/angular/i18n/angular-locale_en-bs.js | 128 + .../js/lib/angular/i18n/angular-locale_en-bw.js | 128 + .../js/lib/angular/i18n/angular-locale_en-bz.js | 128 + .../js/lib/angular/i18n/angular-locale_en-ca.js | 128 + .../js/lib/angular/i18n/angular-locale_en-cc.js | 128 + .../js/lib/angular/i18n/angular-locale_en-ck.js | 128 + .../js/lib/angular/i18n/angular-locale_en-cm.js | 128 + .../js/lib/angular/i18n/angular-locale_en-cx.js | 128 + .../js/lib/angular/i18n/angular-locale_en-dg.js | 128 + .../js/lib/angular/i18n/angular-locale_en-dm.js | 128 + .../js/lib/angular/i18n/angular-locale_en-er.js | 128 + .../js/lib/angular/i18n/angular-locale_en-fj.js | 128 + .../js/lib/angular/i18n/angular-locale_en-fk.js | 128 + .../js/lib/angular/i18n/angular-locale_en-fm.js | 128 + .../js/lib/angular/i18n/angular-locale_en-gb.js | 128 + .../js/lib/angular/i18n/angular-locale_en-gd.js | 128 + .../js/lib/angular/i18n/angular-locale_en-gg.js | 128 + .../js/lib/angular/i18n/angular-locale_en-gh.js | 128 + .../js/lib/angular/i18n/angular-locale_en-gi.js | 128 + .../js/lib/angular/i18n/angular-locale_en-gm.js | 128 + .../js/lib/angular/i18n/angular-locale_en-gu.js | 128 + .../js/lib/angular/i18n/angular-locale_en-gy.js | 128 + .../js/lib/angular/i18n/angular-locale_en-hk.js | 128 + .../js/lib/angular/i18n/angular-locale_en-ie.js | 128 + .../js/lib/angular/i18n/angular-locale_en-im.js | 128 + .../js/lib/angular/i18n/angular-locale_en-in.js | 128 + .../js/lib/angular/i18n/angular-locale_en-io.js | 128 + .../lib/angular/i18n/angular-locale_en-iso.js | 128 + .../js/lib/angular/i18n/angular-locale_en-je.js | 128 + .../js/lib/angular/i18n/angular-locale_en-jm.js | 128 + .../js/lib/angular/i18n/angular-locale_en-ke.js | 128 + .../js/lib/angular/i18n/angular-locale_en-ki.js | 128 + .../js/lib/angular/i18n/angular-locale_en-kn.js | 128 + .../js/lib/angular/i18n/angular-locale_en-ky.js | 128 + .../js/lib/angular/i18n/angular-locale_en-lc.js | 128 + .../js/lib/angular/i18n/angular-locale_en-lr.js | 128 + .../js/lib/angular/i18n/angular-locale_en-ls.js | 128 + .../js/lib/angular/i18n/angular-locale_en-mg.js | 128 + .../js/lib/angular/i18n/angular-locale_en-mh.js | 128 + .../js/lib/angular/i18n/angular-locale_en-mo.js | 128 + .../js/lib/angular/i18n/angular-locale_en-mp.js | 128 + .../js/lib/angular/i18n/angular-locale_en-ms.js | 128 + .../js/lib/angular/i18n/angular-locale_en-mt.js | 128 + .../js/lib/angular/i18n/angular-locale_en-mu.js | 128 + .../js/lib/angular/i18n/angular-locale_en-mw.js | 128 + .../js/lib/angular/i18n/angular-locale_en-my.js | 128 + .../js/lib/angular/i18n/angular-locale_en-na.js | 128 + .../js/lib/angular/i18n/angular-locale_en-nf.js | 128 + .../js/lib/angular/i18n/angular-locale_en-ng.js | 128 + .../js/lib/angular/i18n/angular-locale_en-nr.js | 128 + .../js/lib/angular/i18n/angular-locale_en-nu.js | 128 + .../js/lib/angular/i18n/angular-locale_en-nz.js | 128 + .../js/lib/angular/i18n/angular-locale_en-pg.js | 128 + .../js/lib/angular/i18n/angular-locale_en-ph.js | 128 + .../js/lib/angular/i18n/angular-locale_en-pk.js | 128 + .../js/lib/angular/i18n/angular-locale_en-pn.js | 128 + .../js/lib/angular/i18n/angular-locale_en-pr.js | 128 + .../js/lib/angular/i18n/angular-locale_en-pw.js | 128 + .../js/lib/angular/i18n/angular-locale_en-rw.js | 128 + .../js/lib/angular/i18n/angular-locale_en-sb.js | 128 + .../js/lib/angular/i18n/angular-locale_en-sc.js | 128 + .../js/lib/angular/i18n/angular-locale_en-sd.js | 128 + .../js/lib/angular/i18n/angular-locale_en-sg.js | 128 + .../js/lib/angular/i18n/angular-locale_en-sh.js | 128 + .../js/lib/angular/i18n/angular-locale_en-sl.js | 128 + .../js/lib/angular/i18n/angular-locale_en-ss.js | 128 + .../js/lib/angular/i18n/angular-locale_en-sx.js | 128 + .../js/lib/angular/i18n/angular-locale_en-sz.js | 128 + .../js/lib/angular/i18n/angular-locale_en-tc.js | 128 + .../js/lib/angular/i18n/angular-locale_en-tk.js | 128 + .../js/lib/angular/i18n/angular-locale_en-to.js | 128 + .../js/lib/angular/i18n/angular-locale_en-tt.js | 128 + .../js/lib/angular/i18n/angular-locale_en-tv.js | 128 + .../js/lib/angular/i18n/angular-locale_en-tz.js | 128 + .../js/lib/angular/i18n/angular-locale_en-ug.js | 128 + .../js/lib/angular/i18n/angular-locale_en-um.js | 128 + .../js/lib/angular/i18n/angular-locale_en-us.js | 128 + .../js/lib/angular/i18n/angular-locale_en-vc.js | 128 + .../js/lib/angular/i18n/angular-locale_en-vg.js | 128 + .../js/lib/angular/i18n/angular-locale_en-vi.js | 128 + .../js/lib/angular/i18n/angular-locale_en-vu.js | 128 + .../js/lib/angular/i18n/angular-locale_en-ws.js | 128 + .../js/lib/angular/i18n/angular-locale_en-za.js | 128 + .../js/lib/angular/i18n/angular-locale_en-zm.js | 128 + .../js/lib/angular/i18n/angular-locale_en-zw.js | 128 + .../js/lib/angular/i18n/angular-locale_en.js | 128 + .../lib/angular/i18n/angular-locale_eo-001.js | 128 + .../js/lib/angular/i18n/angular-locale_eo.js | 128 + .../lib/angular/i18n/angular-locale_es-419.js | 110 + .../js/lib/angular/i18n/angular-locale_es-ar.js | 110 + .../js/lib/angular/i18n/angular-locale_es-bo.js | 110 + .../js/lib/angular/i18n/angular-locale_es-cl.js | 110 + .../js/lib/angular/i18n/angular-locale_es-co.js | 110 + .../js/lib/angular/i18n/angular-locale_es-cr.js | 110 + .../js/lib/angular/i18n/angular-locale_es-cu.js | 110 + .../js/lib/angular/i18n/angular-locale_es-do.js | 110 + .../js/lib/angular/i18n/angular-locale_es-ea.js | 110 + .../js/lib/angular/i18n/angular-locale_es-ec.js | 110 + .../js/lib/angular/i18n/angular-locale_es-es.js | 110 + .../js/lib/angular/i18n/angular-locale_es-gq.js | 110 + .../js/lib/angular/i18n/angular-locale_es-gt.js | 110 + .../js/lib/angular/i18n/angular-locale_es-hn.js | 110 + .../js/lib/angular/i18n/angular-locale_es-ic.js | 110 + .../js/lib/angular/i18n/angular-locale_es-mx.js | 110 + .../js/lib/angular/i18n/angular-locale_es-ni.js | 110 + .../js/lib/angular/i18n/angular-locale_es-pa.js | 110 + .../js/lib/angular/i18n/angular-locale_es-pe.js | 110 + .../js/lib/angular/i18n/angular-locale_es-ph.js | 110 + .../js/lib/angular/i18n/angular-locale_es-pr.js | 110 + .../js/lib/angular/i18n/angular-locale_es-py.js | 110 + .../js/lib/angular/i18n/angular-locale_es-sv.js | 110 + .../js/lib/angular/i18n/angular-locale_es-us.js | 110 + .../js/lib/angular/i18n/angular-locale_es-uy.js | 110 + .../js/lib/angular/i18n/angular-locale_es-ve.js | 110 + .../js/lib/angular/i18n/angular-locale_es.js | 110 + .../js/lib/angular/i18n/angular-locale_et-ee.js | 128 + .../js/lib/angular/i18n/angular-locale_et.js | 128 + .../js/lib/angular/i18n/angular-locale_eu-es.js | 110 + .../js/lib/angular/i18n/angular-locale_eu.js | 110 + .../lib/angular/i18n/angular-locale_ewo-cm.js | 128 + .../js/lib/angular/i18n/angular-locale_ewo.js | 128 + .../js/lib/angular/i18n/angular-locale_fa-af.js | 110 + .../js/lib/angular/i18n/angular-locale_fa-ir.js | 110 + .../js/lib/angular/i18n/angular-locale_fa.js | 110 + .../js/lib/angular/i18n/angular-locale_ff-cm.js | 128 + .../js/lib/angular/i18n/angular-locale_ff-gn.js | 128 + .../js/lib/angular/i18n/angular-locale_ff-mr.js | 128 + .../js/lib/angular/i18n/angular-locale_ff-sn.js | 128 + .../js/lib/angular/i18n/angular-locale_ff.js | 128 + .../js/lib/angular/i18n/angular-locale_fi-fi.js | 128 + .../js/lib/angular/i18n/angular-locale_fi.js | 128 + .../lib/angular/i18n/angular-locale_fil-ph.js | 128 + .../js/lib/angular/i18n/angular-locale_fil.js | 128 + .../js/lib/angular/i18n/angular-locale_fo-fo.js | 128 + .../js/lib/angular/i18n/angular-locale_fo.js | 128 + .../js/lib/angular/i18n/angular-locale_fr-be.js | 110 + .../js/lib/angular/i18n/angular-locale_fr-bf.js | 110 + .../js/lib/angular/i18n/angular-locale_fr-bi.js | 110 + .../js/lib/angular/i18n/angular-locale_fr-bj.js | 110 + .../js/lib/angular/i18n/angular-locale_fr-bl.js | 110 + .../js/lib/angular/i18n/angular-locale_fr-ca.js | 110 + .../js/lib/angular/i18n/angular-locale_fr-cd.js | 110 + .../js/lib/angular/i18n/angular-locale_fr-cf.js | 110 + .../js/lib/angular/i18n/angular-locale_fr-cg.js | 110 + .../js/lib/angular/i18n/angular-locale_fr-ch.js | 110 + .../js/lib/angular/i18n/angular-locale_fr-ci.js | 110 + .../js/lib/angular/i18n/angular-locale_fr-cm.js | 110 + .../js/lib/angular/i18n/angular-locale_fr-dj.js | 110 + .../js/lib/angular/i18n/angular-locale_fr-dz.js | 110 + .../js/lib/angular/i18n/angular-locale_fr-fr.js | 110 + .../js/lib/angular/i18n/angular-locale_fr-ga.js | 110 + .../js/lib/angular/i18n/angular-locale_fr-gf.js | 110 + .../js/lib/angular/i18n/angular-locale_fr-gn.js | 110 + .../js/lib/angular/i18n/angular-locale_fr-gp.js | 110 + .../js/lib/angular/i18n/angular-locale_fr-gq.js | 110 + .../js/lib/angular/i18n/angular-locale_fr-ht.js | 110 + .../js/lib/angular/i18n/angular-locale_fr-km.js | 110 + .../js/lib/angular/i18n/angular-locale_fr-lu.js | 110 + .../js/lib/angular/i18n/angular-locale_fr-ma.js | 110 + .../js/lib/angular/i18n/angular-locale_fr-mc.js | 110 + .../js/lib/angular/i18n/angular-locale_fr-mf.js | 110 + .../js/lib/angular/i18n/angular-locale_fr-mg.js | 110 + .../js/lib/angular/i18n/angular-locale_fr-ml.js | 110 + .../js/lib/angular/i18n/angular-locale_fr-mq.js | 110 + .../js/lib/angular/i18n/angular-locale_fr-mr.js | 110 + .../js/lib/angular/i18n/angular-locale_fr-mu.js | 110 + .../js/lib/angular/i18n/angular-locale_fr-nc.js | 110 + .../js/lib/angular/i18n/angular-locale_fr-ne.js | 110 + .../js/lib/angular/i18n/angular-locale_fr-pf.js | 110 + .../js/lib/angular/i18n/angular-locale_fr-pm.js | 110 + .../js/lib/angular/i18n/angular-locale_fr-re.js | 110 + .../js/lib/angular/i18n/angular-locale_fr-rw.js | 110 + .../js/lib/angular/i18n/angular-locale_fr-sc.js | 110 + .../js/lib/angular/i18n/angular-locale_fr-sn.js | 110 + .../js/lib/angular/i18n/angular-locale_fr-sy.js | 110 + .../js/lib/angular/i18n/angular-locale_fr-td.js | 110 + .../js/lib/angular/i18n/angular-locale_fr-tg.js | 110 + .../js/lib/angular/i18n/angular-locale_fr-tn.js | 110 + .../js/lib/angular/i18n/angular-locale_fr-vu.js | 110 + .../js/lib/angular/i18n/angular-locale_fr-wf.js | 110 + .../js/lib/angular/i18n/angular-locale_fr-yt.js | 110 + .../js/lib/angular/i18n/angular-locale_fr.js | 110 + .../lib/angular/i18n/angular-locale_fur-it.js | 128 + .../js/lib/angular/i18n/angular-locale_fur.js | 128 + .../js/lib/angular/i18n/angular-locale_fy-nl.js | 128 + .../js/lib/angular/i18n/angular-locale_fy.js | 128 + .../js/lib/angular/i18n/angular-locale_ga-ie.js | 110 + .../js/lib/angular/i18n/angular-locale_ga.js | 110 + .../js/lib/angular/i18n/angular-locale_gd-gb.js | 128 + .../js/lib/angular/i18n/angular-locale_gd.js | 128 + .../js/lib/angular/i18n/angular-locale_gl-es.js | 128 + .../js/lib/angular/i18n/angular-locale_gl.js | 128 + .../lib/angular/i18n/angular-locale_gsw-ch.js | 110 + .../lib/angular/i18n/angular-locale_gsw-fr.js | 110 + .../lib/angular/i18n/angular-locale_gsw-li.js | 110 + .../js/lib/angular/i18n/angular-locale_gsw.js | 110 + .../js/lib/angular/i18n/angular-locale_gu-in.js | 110 + .../js/lib/angular/i18n/angular-locale_gu.js | 110 + .../lib/angular/i18n/angular-locale_guz-ke.js | 128 + .../js/lib/angular/i18n/angular-locale_guz.js | 128 + .../js/lib/angular/i18n/angular-locale_gv-im.js | 128 + .../js/lib/angular/i18n/angular-locale_gv.js | 128 + .../angular/i18n/angular-locale_ha-latn-gh.js | 128 + .../angular/i18n/angular-locale_ha-latn-ne.js | 128 + .../angular/i18n/angular-locale_ha-latn-ng.js | 128 + .../lib/angular/i18n/angular-locale_ha-latn.js | 128 + .../js/lib/angular/i18n/angular-locale_ha.js | 128 + .../lib/angular/i18n/angular-locale_haw-us.js | 110 + .../js/lib/angular/i18n/angular-locale_haw.js | 110 + .../js/lib/angular/i18n/angular-locale_he-il.js | 128 + .../js/lib/angular/i18n/angular-locale_he.js | 128 + .../js/lib/angular/i18n/angular-locale_hi-in.js | 110 + .../js/lib/angular/i18n/angular-locale_hi.js | 110 + .../js/lib/angular/i18n/angular-locale_hr-ba.js | 128 + .../js/lib/angular/i18n/angular-locale_hr-hr.js | 128 + .../js/lib/angular/i18n/angular-locale_hr.js | 128 + .../lib/angular/i18n/angular-locale_hsb-de.js | 128 + .../js/lib/angular/i18n/angular-locale_hsb.js | 128 + .../js/lib/angular/i18n/angular-locale_hu-hu.js | 110 + .../js/lib/angular/i18n/angular-locale_hu.js | 110 + .../js/lib/angular/i18n/angular-locale_hy-am.js | 110 + .../js/lib/angular/i18n/angular-locale_hy.js | 110 + .../js/lib/angular/i18n/angular-locale_ia-fr.js | 128 + .../js/lib/angular/i18n/angular-locale_ia.js | 128 + .../js/lib/angular/i18n/angular-locale_id-id.js | 110 + .../js/lib/angular/i18n/angular-locale_id.js | 110 + .../js/lib/angular/i18n/angular-locale_ig-ng.js | 128 + .../js/lib/angular/i18n/angular-locale_ig.js | 128 + .../js/lib/angular/i18n/angular-locale_ii-cn.js | 128 + .../js/lib/angular/i18n/angular-locale_ii.js | 128 + .../js/lib/angular/i18n/angular-locale_in.js | 110 + .../js/lib/angular/i18n/angular-locale_is-is.js | 141 + .../js/lib/angular/i18n/angular-locale_is.js | 141 + .../js/lib/angular/i18n/angular-locale_it-ch.js | 128 + .../js/lib/angular/i18n/angular-locale_it-it.js | 128 + .../js/lib/angular/i18n/angular-locale_it-sm.js | 128 + .../js/lib/angular/i18n/angular-locale_it.js | 128 + .../js/lib/angular/i18n/angular-locale_iw.js | 128 + .../js/lib/angular/i18n/angular-locale_ja-jp.js | 110 + .../js/lib/angular/i18n/angular-locale_ja.js | 110 + .../lib/angular/i18n/angular-locale_jgo-cm.js | 128 + .../js/lib/angular/i18n/angular-locale_jgo.js | 128 + .../lib/angular/i18n/angular-locale_jmc-tz.js | 128 + .../js/lib/angular/i18n/angular-locale_jmc.js | 128 + .../js/lib/angular/i18n/angular-locale_ka-ge.js | 110 + .../js/lib/angular/i18n/angular-locale_ka.js | 110 + .../lib/angular/i18n/angular-locale_kab-dz.js | 128 + .../js/lib/angular/i18n/angular-locale_kab.js | 128 + .../lib/angular/i18n/angular-locale_kam-ke.js | 128 + .../js/lib/angular/i18n/angular-locale_kam.js | 128 + .../lib/angular/i18n/angular-locale_kde-tz.js | 128 + .../js/lib/angular/i18n/angular-locale_kde.js | 128 + .../lib/angular/i18n/angular-locale_kea-cv.js | 128 + .../js/lib/angular/i18n/angular-locale_kea.js | 128 + .../lib/angular/i18n/angular-locale_khq-ml.js | 128 + .../js/lib/angular/i18n/angular-locale_khq.js | 128 + .../js/lib/angular/i18n/angular-locale_ki-ke.js | 128 + .../js/lib/angular/i18n/angular-locale_ki.js | 128 + .../angular/i18n/angular-locale_kk-cyrl-kz.js | 110 + .../lib/angular/i18n/angular-locale_kk-cyrl.js | 110 + .../js/lib/angular/i18n/angular-locale_kk.js | 110 + .../lib/angular/i18n/angular-locale_kkj-cm.js | 128 + .../js/lib/angular/i18n/angular-locale_kkj.js | 128 + .../js/lib/angular/i18n/angular-locale_kl-gl.js | 128 + .../js/lib/angular/i18n/angular-locale_kl.js | 128 + .../lib/angular/i18n/angular-locale_kln-ke.js | 128 + .../js/lib/angular/i18n/angular-locale_kln.js | 128 + .../js/lib/angular/i18n/angular-locale_km-kh.js | 110 + .../js/lib/angular/i18n/angular-locale_km.js | 110 + .../js/lib/angular/i18n/angular-locale_kn-in.js | 110 + .../js/lib/angular/i18n/angular-locale_kn.js | 110 + .../js/lib/angular/i18n/angular-locale_ko-kp.js | 110 + .../js/lib/angular/i18n/angular-locale_ko-kr.js | 110 + .../js/lib/angular/i18n/angular-locale_ko.js | 110 + .../lib/angular/i18n/angular-locale_kok-in.js | 128 + .../js/lib/angular/i18n/angular-locale_kok.js | 128 + .../angular/i18n/angular-locale_ks-arab-in.js | 128 + .../lib/angular/i18n/angular-locale_ks-arab.js | 128 + .../js/lib/angular/i18n/angular-locale_ks.js | 128 + .../lib/angular/i18n/angular-locale_ksb-tz.js | 128 + .../js/lib/angular/i18n/angular-locale_ksb.js | 128 + .../lib/angular/i18n/angular-locale_ksf-cm.js | 128 + .../js/lib/angular/i18n/angular-locale_ksf.js | 128 + .../lib/angular/i18n/angular-locale_ksh-de.js | 128 + .../js/lib/angular/i18n/angular-locale_ksh.js | 128 + .../js/lib/angular/i18n/angular-locale_kw-gb.js | 128 + .../js/lib/angular/i18n/angular-locale_kw.js | 128 + .../angular/i18n/angular-locale_ky-cyrl-kg.js | 110 + .../lib/angular/i18n/angular-locale_ky-cyrl.js | 110 + .../js/lib/angular/i18n/angular-locale_ky.js | 110 + .../lib/angular/i18n/angular-locale_lag-tz.js | 128 + .../js/lib/angular/i18n/angular-locale_lag.js | 128 + .../js/lib/angular/i18n/angular-locale_lb-lu.js | 128 + .../js/lib/angular/i18n/angular-locale_lb.js | 128 + .../js/lib/angular/i18n/angular-locale_lg-ug.js | 128 + .../js/lib/angular/i18n/angular-locale_lg.js | 128 + .../lib/angular/i18n/angular-locale_lkt-us.js | 128 + .../js/lib/angular/i18n/angular-locale_lkt.js | 128 + .../js/lib/angular/i18n/angular-locale_ln-ao.js | 110 + .../js/lib/angular/i18n/angular-locale_ln-cd.js | 110 + .../js/lib/angular/i18n/angular-locale_ln-cf.js | 110 + .../js/lib/angular/i18n/angular-locale_ln-cg.js | 110 + .../js/lib/angular/i18n/angular-locale_ln.js | 110 + .../js/lib/angular/i18n/angular-locale_lo-la.js | 110 + .../js/lib/angular/i18n/angular-locale_lo.js | 110 + .../js/lib/angular/i18n/angular-locale_lt-lt.js | 128 + .../js/lib/angular/i18n/angular-locale_lt.js | 128 + .../js/lib/angular/i18n/angular-locale_lu-cd.js | 128 + .../js/lib/angular/i18n/angular-locale_lu.js | 128 + .../lib/angular/i18n/angular-locale_luo-ke.js | 128 + .../js/lib/angular/i18n/angular-locale_luo.js | 128 + .../lib/angular/i18n/angular-locale_luy-ke.js | 128 + .../js/lib/angular/i18n/angular-locale_luy.js | 128 + .../js/lib/angular/i18n/angular-locale_lv-lv.js | 128 + .../js/lib/angular/i18n/angular-locale_lv.js | 128 + .../lib/angular/i18n/angular-locale_mas-ke.js | 128 + .../lib/angular/i18n/angular-locale_mas-tz.js | 128 + .../js/lib/angular/i18n/angular-locale_mas.js | 128 + .../lib/angular/i18n/angular-locale_mer-ke.js | 128 + .../js/lib/angular/i18n/angular-locale_mer.js | 128 + .../lib/angular/i18n/angular-locale_mfe-mu.js | 128 + .../js/lib/angular/i18n/angular-locale_mfe.js | 128 + .../js/lib/angular/i18n/angular-locale_mg-mg.js | 128 + .../js/lib/angular/i18n/angular-locale_mg.js | 128 + .../lib/angular/i18n/angular-locale_mgh-mz.js | 128 + .../js/lib/angular/i18n/angular-locale_mgh.js | 128 + .../lib/angular/i18n/angular-locale_mgo-cm.js | 128 + .../js/lib/angular/i18n/angular-locale_mgo.js | 128 + .../js/lib/angular/i18n/angular-locale_mk-mk.js | 128 + .../js/lib/angular/i18n/angular-locale_mk.js | 128 + .../js/lib/angular/i18n/angular-locale_ml-in.js | 110 + .../js/lib/angular/i18n/angular-locale_ml.js | 110 + .../angular/i18n/angular-locale_mn-cyrl-mn.js | 110 + .../lib/angular/i18n/angular-locale_mn-cyrl.js | 110 + .../js/lib/angular/i18n/angular-locale_mn.js | 110 + .../js/lib/angular/i18n/angular-locale_mr-in.js | 110 + .../js/lib/angular/i18n/angular-locale_mr.js | 110 + .../angular/i18n/angular-locale_ms-latn-bn.js | 110 + .../angular/i18n/angular-locale_ms-latn-my.js | 110 + .../angular/i18n/angular-locale_ms-latn-sg.js | 110 + .../lib/angular/i18n/angular-locale_ms-latn.js | 110 + .../js/lib/angular/i18n/angular-locale_ms.js | 110 + .../js/lib/angular/i18n/angular-locale_mt-mt.js | 110 + .../js/lib/angular/i18n/angular-locale_mt.js | 110 + .../lib/angular/i18n/angular-locale_mua-cm.js | 128 + .../js/lib/angular/i18n/angular-locale_mua.js | 128 + .../js/lib/angular/i18n/angular-locale_my-mm.js | 110 + .../js/lib/angular/i18n/angular-locale_my.js | 110 + .../lib/angular/i18n/angular-locale_naq-na.js | 128 + .../js/lib/angular/i18n/angular-locale_naq.js | 128 + .../js/lib/angular/i18n/angular-locale_nb-no.js | 110 + .../js/lib/angular/i18n/angular-locale_nb-sj.js | 110 + .../js/lib/angular/i18n/angular-locale_nb.js | 110 + .../js/lib/angular/i18n/angular-locale_nd-zw.js | 128 + .../js/lib/angular/i18n/angular-locale_nd.js | 128 + .../js/lib/angular/i18n/angular-locale_ne-in.js | 110 + .../js/lib/angular/i18n/angular-locale_ne-np.js | 110 + .../js/lib/angular/i18n/angular-locale_ne.js | 110 + .../js/lib/angular/i18n/angular-locale_nl-aw.js | 128 + .../js/lib/angular/i18n/angular-locale_nl-be.js | 128 + .../js/lib/angular/i18n/angular-locale_nl-bq.js | 128 + .../js/lib/angular/i18n/angular-locale_nl-cw.js | 128 + .../js/lib/angular/i18n/angular-locale_nl-nl.js | 128 + .../js/lib/angular/i18n/angular-locale_nl-sr.js | 128 + .../js/lib/angular/i18n/angular-locale_nl-sx.js | 128 + .../js/lib/angular/i18n/angular-locale_nl.js | 128 + .../lib/angular/i18n/angular-locale_nmg-cm.js | 128 + .../js/lib/angular/i18n/angular-locale_nmg.js | 128 + .../js/lib/angular/i18n/angular-locale_nn-no.js | 128 + .../js/lib/angular/i18n/angular-locale_nn.js | 128 + .../lib/angular/i18n/angular-locale_nnh-cm.js | 128 + .../js/lib/angular/i18n/angular-locale_nnh.js | 128 + .../js/lib/angular/i18n/angular-locale_no-no.js | 110 + .../js/lib/angular/i18n/angular-locale_no.js | 110 + .../js/lib/angular/i18n/angular-locale_nr-za.js | 128 + .../js/lib/angular/i18n/angular-locale_nr.js | 128 + .../lib/angular/i18n/angular-locale_nso-za.js | 128 + .../js/lib/angular/i18n/angular-locale_nso.js | 128 + .../lib/angular/i18n/angular-locale_nus-sd.js | 128 + .../js/lib/angular/i18n/angular-locale_nus.js | 128 + .../lib/angular/i18n/angular-locale_nyn-ug.js | 128 + .../js/lib/angular/i18n/angular-locale_nyn.js | 128 + .../js/lib/angular/i18n/angular-locale_om-et.js | 128 + .../js/lib/angular/i18n/angular-locale_om-ke.js | 128 + .../js/lib/angular/i18n/angular-locale_om.js | 128 + .../js/lib/angular/i18n/angular-locale_or-in.js | 110 + .../js/lib/angular/i18n/angular-locale_or.js | 110 + .../js/lib/angular/i18n/angular-locale_os-ge.js | 128 + .../js/lib/angular/i18n/angular-locale_os-ru.js | 128 + .../js/lib/angular/i18n/angular-locale_os.js | 128 + .../angular/i18n/angular-locale_pa-arab-pk.js | 110 + .../lib/angular/i18n/angular-locale_pa-arab.js | 110 + .../angular/i18n/angular-locale_pa-guru-in.js | 110 + .../lib/angular/i18n/angular-locale_pa-guru.js | 110 + .../js/lib/angular/i18n/angular-locale_pa.js | 110 + .../js/lib/angular/i18n/angular-locale_pl-pl.js | 128 + .../js/lib/angular/i18n/angular-locale_pl.js | 128 + .../js/lib/angular/i18n/angular-locale_ps-af.js | 128 + .../js/lib/angular/i18n/angular-locale_ps.js | 128 + .../js/lib/angular/i18n/angular-locale_pt-ao.js | 110 + .../js/lib/angular/i18n/angular-locale_pt-br.js | 110 + .../js/lib/angular/i18n/angular-locale_pt-cv.js | 110 + .../js/lib/angular/i18n/angular-locale_pt-gw.js | 110 + .../js/lib/angular/i18n/angular-locale_pt-mo.js | 110 + .../js/lib/angular/i18n/angular-locale_pt-mz.js | 110 + .../js/lib/angular/i18n/angular-locale_pt-pt.js | 110 + .../js/lib/angular/i18n/angular-locale_pt-st.js | 110 + .../js/lib/angular/i18n/angular-locale_pt-tl.js | 110 + .../js/lib/angular/i18n/angular-locale_pt.js | 110 + .../js/lib/angular/i18n/angular-locale_qu-bo.js | 128 + .../js/lib/angular/i18n/angular-locale_qu-ec.js | 128 + .../js/lib/angular/i18n/angular-locale_qu-pe.js | 128 + .../js/lib/angular/i18n/angular-locale_qu.js | 128 + .../js/lib/angular/i18n/angular-locale_rm-ch.js | 128 + .../js/lib/angular/i18n/angular-locale_rm.js | 128 + .../js/lib/angular/i18n/angular-locale_rn-bi.js | 128 + .../js/lib/angular/i18n/angular-locale_rn.js | 128 + .../js/lib/angular/i18n/angular-locale_ro-md.js | 128 + .../js/lib/angular/i18n/angular-locale_ro-ro.js | 128 + .../js/lib/angular/i18n/angular-locale_ro.js | 128 + .../lib/angular/i18n/angular-locale_rof-tz.js | 128 + .../js/lib/angular/i18n/angular-locale_rof.js | 128 + .../js/lib/angular/i18n/angular-locale_ru-by.js | 128 + .../js/lib/angular/i18n/angular-locale_ru-kg.js | 128 + .../js/lib/angular/i18n/angular-locale_ru-kz.js | 128 + .../js/lib/angular/i18n/angular-locale_ru-md.js | 128 + .../js/lib/angular/i18n/angular-locale_ru-ru.js | 128 + .../js/lib/angular/i18n/angular-locale_ru-ua.js | 128 + .../js/lib/angular/i18n/angular-locale_ru.js | 128 + .../js/lib/angular/i18n/angular-locale_rw-rw.js | 128 + .../js/lib/angular/i18n/angular-locale_rw.js | 128 + .../lib/angular/i18n/angular-locale_rwk-tz.js | 128 + .../js/lib/angular/i18n/angular-locale_rwk.js | 128 + .../lib/angular/i18n/angular-locale_sah-ru.js | 128 + .../js/lib/angular/i18n/angular-locale_sah.js | 128 + .../lib/angular/i18n/angular-locale_saq-ke.js | 128 + .../js/lib/angular/i18n/angular-locale_saq.js | 128 + .../lib/angular/i18n/angular-locale_sbp-tz.js | 128 + .../js/lib/angular/i18n/angular-locale_sbp.js | 128 + .../js/lib/angular/i18n/angular-locale_se-fi.js | 128 + .../js/lib/angular/i18n/angular-locale_se-no.js | 128 + .../js/lib/angular/i18n/angular-locale_se-se.js | 128 + .../js/lib/angular/i18n/angular-locale_se.js | 128 + .../lib/angular/i18n/angular-locale_seh-mz.js | 128 + .../js/lib/angular/i18n/angular-locale_seh.js | 128 + .../lib/angular/i18n/angular-locale_ses-ml.js | 128 + .../js/lib/angular/i18n/angular-locale_ses.js | 128 + .../js/lib/angular/i18n/angular-locale_sg-cf.js | 128 + .../js/lib/angular/i18n/angular-locale_sg.js | 128 + .../angular/i18n/angular-locale_shi-latn-ma.js | 128 + .../lib/angular/i18n/angular-locale_shi-latn.js | 128 + .../angular/i18n/angular-locale_shi-tfng-ma.js | 128 + .../lib/angular/i18n/angular-locale_shi-tfng.js | 128 + .../js/lib/angular/i18n/angular-locale_shi.js | 128 + .../js/lib/angular/i18n/angular-locale_si-lk.js | 128 + .../js/lib/angular/i18n/angular-locale_si.js | 128 + .../js/lib/angular/i18n/angular-locale_sk-sk.js | 128 + .../js/lib/angular/i18n/angular-locale_sk.js | 128 + .../js/lib/angular/i18n/angular-locale_sl-si.js | 128 + .../js/lib/angular/i18n/angular-locale_sl.js | 128 + .../lib/angular/i18n/angular-locale_smn-fi.js | 128 + .../js/lib/angular/i18n/angular-locale_smn.js | 128 + .../js/lib/angular/i18n/angular-locale_sn-zw.js | 128 + .../js/lib/angular/i18n/angular-locale_sn.js | 128 + .../js/lib/angular/i18n/angular-locale_so-dj.js | 128 + .../js/lib/angular/i18n/angular-locale_so-et.js | 128 + .../js/lib/angular/i18n/angular-locale_so-ke.js | 128 + .../js/lib/angular/i18n/angular-locale_so-so.js | 128 + .../js/lib/angular/i18n/angular-locale_so.js | 128 + .../js/lib/angular/i18n/angular-locale_sq-al.js | 110 + .../js/lib/angular/i18n/angular-locale_sq-mk.js | 110 + .../js/lib/angular/i18n/angular-locale_sq-xk.js | 110 + .../js/lib/angular/i18n/angular-locale_sq.js | 110 + .../angular/i18n/angular-locale_sr-cyrl-ba.js | 128 + .../angular/i18n/angular-locale_sr-cyrl-me.js | 128 + .../angular/i18n/angular-locale_sr-cyrl-rs.js | 128 + .../angular/i18n/angular-locale_sr-cyrl-xk.js | 128 + .../lib/angular/i18n/angular-locale_sr-cyrl.js | 128 + .../angular/i18n/angular-locale_sr-latn-ba.js | 128 + .../angular/i18n/angular-locale_sr-latn-me.js | 128 + .../angular/i18n/angular-locale_sr-latn-rs.js | 128 + .../angular/i18n/angular-locale_sr-latn-xk.js | 128 + .../lib/angular/i18n/angular-locale_sr-latn.js | 128 + .../js/lib/angular/i18n/angular-locale_sr.js | 128 + .../js/lib/angular/i18n/angular-locale_ss-sz.js | 128 + .../js/lib/angular/i18n/angular-locale_ss-za.js | 128 + .../js/lib/angular/i18n/angular-locale_ss.js | 128 + .../lib/angular/i18n/angular-locale_ssy-er.js | 128 + .../js/lib/angular/i18n/angular-locale_ssy.js | 128 + .../js/lib/angular/i18n/angular-locale_st-ls.js | 115 + .../js/lib/angular/i18n/angular-locale_st-za.js | 115 + .../js/lib/angular/i18n/angular-locale_st.js | 115 + .../js/lib/angular/i18n/angular-locale_sv-ax.js | 128 + .../js/lib/angular/i18n/angular-locale_sv-fi.js | 128 + .../js/lib/angular/i18n/angular-locale_sv-se.js | 128 + .../js/lib/angular/i18n/angular-locale_sv.js | 128 + .../js/lib/angular/i18n/angular-locale_sw-cd.js | 128 + .../js/lib/angular/i18n/angular-locale_sw-ke.js | 128 + .../js/lib/angular/i18n/angular-locale_sw-tz.js | 128 + .../js/lib/angular/i18n/angular-locale_sw-ug.js | 128 + .../js/lib/angular/i18n/angular-locale_sw.js | 128 + .../lib/angular/i18n/angular-locale_swc-cd.js | 128 + .../js/lib/angular/i18n/angular-locale_swc.js | 128 + .../js/lib/angular/i18n/angular-locale_ta-in.js | 110 + .../js/lib/angular/i18n/angular-locale_ta-lk.js | 110 + .../js/lib/angular/i18n/angular-locale_ta-my.js | 110 + .../js/lib/angular/i18n/angular-locale_ta-sg.js | 110 + .../js/lib/angular/i18n/angular-locale_ta.js | 110 + .../js/lib/angular/i18n/angular-locale_te-in.js | 110 + .../js/lib/angular/i18n/angular-locale_te.js | 110 + .../lib/angular/i18n/angular-locale_teo-ke.js | 128 + .../lib/angular/i18n/angular-locale_teo-ug.js | 128 + .../js/lib/angular/i18n/angular-locale_teo.js | 128 + .../angular/i18n/angular-locale_tg-cyrl-tj.js | 115 + .../lib/angular/i18n/angular-locale_tg-cyrl.js | 115 + .../js/lib/angular/i18n/angular-locale_tg.js | 115 + .../js/lib/angular/i18n/angular-locale_th-th.js | 110 + .../js/lib/angular/i18n/angular-locale_th.js | 110 + .../js/lib/angular/i18n/angular-locale_ti-er.js | 128 + .../js/lib/angular/i18n/angular-locale_ti-et.js | 128 + .../js/lib/angular/i18n/angular-locale_ti.js | 128 + .../lib/angular/i18n/angular-locale_tig-er.js | 115 + .../js/lib/angular/i18n/angular-locale_tig.js | 115 + .../js/lib/angular/i18n/angular-locale_tl.js | 128 + .../js/lib/angular/i18n/angular-locale_tn-bw.js | 128 + .../js/lib/angular/i18n/angular-locale_tn-za.js | 128 + .../js/lib/angular/i18n/angular-locale_tn.js | 128 + .../js/lib/angular/i18n/angular-locale_to-to.js | 128 + .../js/lib/angular/i18n/angular-locale_to.js | 128 + .../js/lib/angular/i18n/angular-locale_tr-cy.js | 110 + .../js/lib/angular/i18n/angular-locale_tr-tr.js | 110 + .../js/lib/angular/i18n/angular-locale_tr.js | 110 + .../js/lib/angular/i18n/angular-locale_ts-za.js | 128 + .../js/lib/angular/i18n/angular-locale_ts.js | 128 + .../lib/angular/i18n/angular-locale_twq-ne.js | 128 + .../js/lib/angular/i18n/angular-locale_twq.js | 128 + .../angular/i18n/angular-locale_tzm-latn-ma.js | 128 + .../lib/angular/i18n/angular-locale_tzm-latn.js | 128 + .../js/lib/angular/i18n/angular-locale_tzm.js | 128 + .../angular/i18n/angular-locale_ug-arab-cn.js | 128 + .../lib/angular/i18n/angular-locale_ug-arab.js | 128 + .../js/lib/angular/i18n/angular-locale_ug.js | 128 + .../js/lib/angular/i18n/angular-locale_uk-ua.js | 128 + .../js/lib/angular/i18n/angular-locale_uk.js | 128 + .../js/lib/angular/i18n/angular-locale_ur-in.js | 128 + .../js/lib/angular/i18n/angular-locale_ur-pk.js | 128 + .../js/lib/angular/i18n/angular-locale_ur.js | 128 + .../angular/i18n/angular-locale_uz-arab-af.js | 110 + .../lib/angular/i18n/angular-locale_uz-arab.js | 110 + .../angular/i18n/angular-locale_uz-cyrl-uz.js | 110 + .../lib/angular/i18n/angular-locale_uz-cyrl.js | 110 + .../angular/i18n/angular-locale_uz-latn-uz.js | 110 + .../lib/angular/i18n/angular-locale_uz-latn.js | 110 + .../js/lib/angular/i18n/angular-locale_uz.js | 110 + .../angular/i18n/angular-locale_vai-latn-lr.js | 128 + .../lib/angular/i18n/angular-locale_vai-latn.js | 128 + .../angular/i18n/angular-locale_vai-vaii-lr.js | 128 + .../lib/angular/i18n/angular-locale_vai-vaii.js | 128 + .../js/lib/angular/i18n/angular-locale_vai.js | 128 + .../js/lib/angular/i18n/angular-locale_ve-za.js | 128 + .../js/lib/angular/i18n/angular-locale_ve.js | 128 + .../js/lib/angular/i18n/angular-locale_vi-vn.js | 110 + .../js/lib/angular/i18n/angular-locale_vi.js | 110 + .../lib/angular/i18n/angular-locale_vo-001.js | 128 + .../js/lib/angular/i18n/angular-locale_vo.js | 128 + .../lib/angular/i18n/angular-locale_vun-tz.js | 128 + .../js/lib/angular/i18n/angular-locale_vun.js | 128 + .../lib/angular/i18n/angular-locale_wae-ch.js | 128 + .../js/lib/angular/i18n/angular-locale_wae.js | 128 + .../lib/angular/i18n/angular-locale_wal-et.js | 115 + .../js/lib/angular/i18n/angular-locale_wal.js | 115 + .../js/lib/angular/i18n/angular-locale_xh-za.js | 115 + .../js/lib/angular/i18n/angular-locale_xh.js | 115 + .../lib/angular/i18n/angular-locale_xog-ug.js | 128 + .../js/lib/angular/i18n/angular-locale_xog.js | 128 + .../lib/angular/i18n/angular-locale_yav-cm.js | 128 + .../js/lib/angular/i18n/angular-locale_yav.js | 128 + .../lib/angular/i18n/angular-locale_yi-001.js | 128 + .../js/lib/angular/i18n/angular-locale_yi.js | 128 + .../js/lib/angular/i18n/angular-locale_yo-bj.js | 128 + .../js/lib/angular/i18n/angular-locale_yo-ng.js | 128 + .../js/lib/angular/i18n/angular-locale_yo.js | 128 + .../lib/angular/i18n/angular-locale_zgh-ma.js | 128 + .../js/lib/angular/i18n/angular-locale_zgh.js | 128 + .../js/lib/angular/i18n/angular-locale_zh-cn.js | 110 + .../angular/i18n/angular-locale_zh-hans-cn.js | 110 + .../angular/i18n/angular-locale_zh-hans-hk.js | 110 + .../angular/i18n/angular-locale_zh-hans-mo.js | 110 + .../angular/i18n/angular-locale_zh-hans-sg.js | 110 + .../lib/angular/i18n/angular-locale_zh-hans.js | 110 + .../angular/i18n/angular-locale_zh-hant-hk.js | 110 + .../angular/i18n/angular-locale_zh-hant-mo.js | 110 + .../angular/i18n/angular-locale_zh-hant-tw.js | 110 + .../lib/angular/i18n/angular-locale_zh-hant.js | 110 + .../js/lib/angular/i18n/angular-locale_zh-hk.js | 110 + .../js/lib/angular/i18n/angular-locale_zh-tw.js | 110 + .../js/lib/angular/i18n/angular-locale_zh.js | 110 + .../js/lib/angular/i18n/angular-locale_zu-za.js | 110 + .../js/lib/angular/i18n/angular-locale_zu.js | 110 + .../src/main/webapp/js/lib/angular/version.json | 1 + .../src/main/webapp/js/lib/angular/version.txt | 1 + .../js/lib/ui-bootstrap-tpls-0.13.3.min.js | 10 + .../src/main/webapp/js/services/DataService.js | 102 + .../src/main/webapp/partials/order-detail.html | 22 + .../src/main/webapp/partials/order-form.html | 46 + .../src/main/webapp/partials/orders.html | 25 + .../struts/actions/IndexControllerTest.java | 30 + .../actions/data/OrderControllerTest.java | 110 + rest-angular/src/test/resources/log4j2.xml | 14 + 833 files changed, 180863 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/struts-examples/blob/a183bf5c/pom.xml ---------------------------------------------------------------------- diff --git a/pom.xml b/pom.xml index ebc876f..7e803d3 100644 --- a/pom.xml +++ b/pom.xml @@ -66,6 +66,7 @@ <module>message-resource</module> <module>preparable-interface</module> <module>restful2actionmapper</module> + <module>rest-angular</module> <module>spring-struts</module> <module>themes</module> <module>themes-override</module> @@ -96,10 +97,10 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> - <version>2.3.2</version> + <version>3.3</version> <configuration> - <source>1.7</source> - <target>1.7</target> + <source>1.8</source> + <target>1.8</target> </configuration> </plugin> </plugins> http://git-wip-us.apache.org/repos/asf/struts-examples/blob/a183bf5c/rest-angular/pom.xml ---------------------------------------------------------------------- diff --git a/rest-angular/pom.xml b/rest-angular/pom.xml new file mode 100644 index 0000000..395073a --- /dev/null +++ b/rest-angular/pom.xml @@ -0,0 +1,227 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + <parent> + <groupId>struts.apache.org</groupId> + <artifactId>struts2examples</artifactId> + <version>1.0.0</version> + </parent> + + <artifactId>rest-angular</artifactId> + + <name>REST Plugin based application with AngularJS frontend</name> + + <description>A REST Plugin based Struts2 application with AngularJS frontend, Bean validation, Exception Handling and multi language support.</description> + + <properties> + <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> + </properties> + + <dependencies> + + <dependency> + <groupId>org.apache.struts</groupId> + <artifactId>struts2-core</artifactId> + <version>${struts2.version}</version> + <exclusions> + <exclusion> + <artifactId>asm</artifactId> + <groupId>asm</groupId> + </exclusion> + <exclusion> + <artifactId>asm-commons</artifactId> + <groupId>asm</groupId> + </exclusion> + </exclusions> + </dependency> + + <dependency> + <groupId>org.apache.struts</groupId> + <artifactId>struts2-java8-support-plugin</artifactId> + <version>${struts2.version}</version> + </dependency> + <dependency> + <groupId>org.apache.struts</groupId> + <artifactId>struts2-convention-plugin</artifactId> + <version>${struts2.version}</version> + </dependency> + + <dependency> + <groupId>org.apache.struts</groupId> + <artifactId>struts2-rest-plugin</artifactId> + <version>${struts2.version}</version> + </dependency> + + <dependency> + <groupId>org.apache.struts</groupId> + <artifactId>struts2-junit-plugin</artifactId> + <version>${struts2.version}</version> + <scope>test</scope> + </dependency> + + <dependency> + <groupId>org.hamcrest</groupId> + <artifactId>hamcrest-all</artifactId> + <version>1.3</version> + <scope>test</scope> + </dependency> + + <dependency> + <groupId>org.apache.struts</groupId> + <artifactId>struts2-bean-validation-plugin</artifactId> + <version>${struts2.version}</version> + </dependency> + + <dependency> + <groupId>org.hibernate</groupId> + <artifactId>hibernate-validator</artifactId> + <version>4.3.2.Final</version> + </dependency> + + <dependency> + <groupId>com.fasterxml.jackson.core</groupId> + <artifactId>jackson-core</artifactId> + <version>2.6.1</version> + </dependency> + <dependency> + <groupId>com.fasterxml.jackson.core</groupId> + <artifactId>jackson-annotations</artifactId> + <version>2.6.1</version> + </dependency> + <dependency> + <groupId>com.fasterxml.jackson.core</groupId> + <artifactId>jackson-databind</artifactId> + <version>2.6.1</version> + </dependency> + + <dependency> + <groupId>org.apache.logging.log4j</groupId> + <artifactId>log4j-core</artifactId> + <version>${log4j2.version}</version> + </dependency> + + + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + <version>4.5</version> + <scope>test</scope> + </dependency> + + <dependency> + <groupId>com.jayway.jsonpath</groupId> + <artifactId>json-path</artifactId> + <version>2.0.0</version> + <scope>test</scope> + </dependency> + + <dependency> + <groupId>javax.servlet</groupId> + <artifactId>javax.servlet-api</artifactId> + <version>3.1.0</version> + <scope>provided</scope> + </dependency> + + <dependency> + <groupId>javax.servlet</groupId> + <artifactId>jsp-api</artifactId> + <version>2.0</version> + <scope>provided</scope> + </dependency> + + </dependencies> + + <build> + <plugins> + <plugin> + <groupId>com.cj.jshintmojo</groupId> + <artifactId>jshint-maven-plugin</artifactId> + <executions> + <execution> + <goals> + <goal>lint</goal> + </goals> + </execution> + </executions> + <configuration> + <configFile>src/main/resources/jshint.conf.js</configFile> + <directories> + <directory>src/main/webapp/js/</directory> + </directories> + <excludes> + <exclude>src/main/webapp/js/lib</exclude> + </excludes> + <reporter>jslint</reporter> + <reportFile>target/jshint.xml</reportFile> + <failOnError>true</failOnError> + </configuration> + </plugin> + <plugin> + <groupId>com.samaxes.maven</groupId> + <artifactId>minify-maven-plugin</artifactId> + <version>1.7.4</version> + <executions> + <execution> + <id>external-minify</id> + <phase>package</phase> + <configuration> + <jsEngine>CLOSURE</jsEngine> + <closureLanguage>ECMASCRIPT5_STRICT</closureLanguage> + <skipMinify>true</skipMinify> + <jsFinalFile>external.js</jsFinalFile> + <jsSourceFiles> + <jsSourceFile>lib/angular/angular.min.js</jsSourceFile> + <jsSourceFile>lib/angular/angular-route.min.js</jsSourceFile> + <jsSourceFile>lib/ui-bootstrap-tpls-0.13.3.min.js</jsSourceFile> + <jsSourceFile>lib/angular-translate.min.js</jsSourceFile> + <jsSourceFile>lib/angular-translate-loader-url.min.js</jsSourceFile> + </jsSourceFiles> + </configuration> + <goals> + <goal>minify</goal> + </goals> + </execution> + <execution> + <id>application-minify</id> + <phase>package</phase> + <configuration> + <jsEngine>CLOSURE</jsEngine> + <closureLanguage>ECMASCRIPT5_STRICT</closureLanguage> + <jsFinalFile>application.js</jsFinalFile> + <jsSourceFiles> + <jsSourceFile>app.js</jsSourceFile> + <jsSourceFile>config.js</jsSourceFile> + </jsSourceFiles> + <jsSourceIncludes> + <jsSourceInclude>services/*.js</jsSourceInclude> + <jsSourceInclude>controllers/*.js</jsSourceInclude> + </jsSourceIncludes> + + </configuration> + <goals> + <goal>minify</goal> + </goals> + </execution> + </executions> + </plugin> + <plugin> + <groupId>org.eclipse.jetty</groupId> + <artifactId>jetty-maven-plugin</artifactId> + <version>9.3.3.v20150827</version> + <configuration> + <webApp> + <contextPath>/${artifactId}</contextPath> + </webApp> + <stopKey>CTRL+C</stopKey> + <stopPort>8999</stopPort> + <scanIntervalSeconds>10</scanIntervalSeconds> + <webAppSourceDirectory>${basedir}/src/main/webapp/</webAppSourceDirectory> + <webAppConfig> + <descriptor>${basedir}/src/main/webapp/WEB-INF/web.xml</descriptor> + </webAppConfig> + </configuration> + </plugin> + </plugins> + </build> +</project> http://git-wip-us.apache.org/repos/asf/struts-examples/blob/a183bf5c/rest-angular/src/main/java/org/apache/examples/struts/actions/IndexController.java ---------------------------------------------------------------------- diff --git a/rest-angular/src/main/java/org/apache/examples/struts/actions/IndexController.java b/rest-angular/src/main/java/org/apache/examples/struts/actions/IndexController.java new file mode 100644 index 0000000..126e422 --- /dev/null +++ b/rest-angular/src/main/java/org/apache/examples/struts/actions/IndexController.java @@ -0,0 +1,56 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.examples.struts.actions; + +import com.opensymphony.xwork2.Action; +import org.apache.struts2.rest.DefaultHttpHeaders; +import org.apache.struts2.rest.HttpHeaders; +import org.apache.struts2.rest.RestActionSupport; + +public class IndexController extends RestActionSupport { + + private static final long serialVersionUID = 6153177836211979662L; + + private boolean useMinifiedResources = false; + + public HttpHeaders index() { + return new DefaultHttpHeaders("index") + .disableCaching(); + } + + public HttpHeaders show() { + return new DefaultHttpHeaders("show"); + } + + public String edit() { + return Action.SUCCESS; + } + + public String editNew() { + return Action.SUCCESS; + } + + public boolean isUseMinifiedResources() { + return useMinifiedResources; + } + + public void setUseMinifiedResources(boolean useMinifiedResources) { + this.useMinifiedResources = useMinifiedResources; + } +} http://git-wip-us.apache.org/repos/asf/struts-examples/blob/a183bf5c/rest-angular/src/main/java/org/apache/examples/struts/actions/data/LanguageController.java ---------------------------------------------------------------------- diff --git a/rest-angular/src/main/java/org/apache/examples/struts/actions/data/LanguageController.java b/rest-angular/src/main/java/org/apache/examples/struts/actions/data/LanguageController.java new file mode 100644 index 0000000..1fa09a5 --- /dev/null +++ b/rest-angular/src/main/java/org/apache/examples/struts/actions/data/LanguageController.java @@ -0,0 +1,41 @@ +package org.apache.examples.struts.actions.data; + +import com.opensymphony.xwork2.Action; +import com.opensymphony.xwork2.ActionContext; +import com.opensymphony.xwork2.ModelDriven; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.apache.struts2.rest.RestActionSupport; + +import java.util.Locale; +import java.util.Map; +import java.util.ResourceBundle; +import java.util.stream.Collectors; + +public class LanguageController extends RestActionSupport implements ModelDriven<Map<String, String>> { + + private static final Logger log = LogManager.getLogger(LanguageController.class); + + private Map<String, String> model; + + public String index() throws Exception { + + Locale locale = ActionContext.getContext().getLocale(); + log.debug("Get texts resources for locale: {}", locale); + + ResourceBundle bundle = getTexts("frontend"); + this.model = bundle.keySet() + .stream() + .collect(Collectors.toMap( + key -> key, + bundle::getString)); + + return Action.SUCCESS; + } + + + @Override + public Map<String, String> getModel() { + return model; + } +} http://git-wip-us.apache.org/repos/asf/struts-examples/blob/a183bf5c/rest-angular/src/main/java/org/apache/examples/struts/actions/data/OrderController.java ---------------------------------------------------------------------- diff --git a/rest-angular/src/main/java/org/apache/examples/struts/actions/data/OrderController.java b/rest-angular/src/main/java/org/apache/examples/struts/actions/data/OrderController.java new file mode 100644 index 0000000..5b6aefb --- /dev/null +++ b/rest-angular/src/main/java/org/apache/examples/struts/actions/data/OrderController.java @@ -0,0 +1,80 @@ +package org.apache.examples.struts.actions.data; + +import com.opensymphony.xwork2.ModelDriven; +import org.apache.examples.struts.models.Order; +import org.apache.examples.struts.services.OrdersService; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.apache.struts2.rest.DefaultHttpHeaders; +import org.apache.struts2.rest.HttpHeaders; +import org.apache.struts2.rest.RestActionSupport; + +import java.util.Collection; + +public class OrderController extends RestActionSupport implements ModelDriven<Object> { + + private static final Logger log = LogManager.getLogger(OrderController.class); + + private Order model = new Order(); + private String id; + private Collection<Order> list = null; + private OrdersService ordersService = new OrdersService(); + + // GET /data/order/1 + public HttpHeaders show() { + return new DefaultHttpHeaders("show"); + } + + // GET /data/order + public HttpHeaders index() { + list = ordersService.getAll(); + return new DefaultHttpHeaders("index") + .disableCaching(); + } + + // DELETE /data/order/1 + public String destroy() { + log.debug("Delete order with id: {}", id); + + // To demonstrate exception handling we throw an exception when someone tries to delete an order + if(id != null) { + throw new RuntimeException(getText("exception.operation.not.supported")); + } + + ordersService.remove(id); + return "success"; + } + + // POST /data/order + public HttpHeaders create() { + log.debug("Create new order: {}", model); + ordersService.save(model); + return new DefaultHttpHeaders("success") + .setLocationId(model.getId()); + } + + // PUT /data/order/1 + public String update() { + log.debug("Update order: {}", model); + ordersService.save(model); + return "success"; + } + + public void setId(String id) { + if (id != null) { + this.model = ordersService.get(id); + } + this.id = id; + } + + public Object getModel() { + if(list != null) { + return list; + } else { + if(model == null) { + model = new Order(); + } + return model; + } + } +} http://git-wip-us.apache.org/repos/asf/struts-examples/blob/a183bf5c/rest-angular/src/main/java/org/apache/examples/struts/actions/data/package-info.java ---------------------------------------------------------------------- diff --git a/rest-angular/src/main/java/org/apache/examples/struts/actions/data/package-info.java b/rest-angular/src/main/java/org/apache/examples/struts/actions/data/package-info.java new file mode 100644 index 0000000..fdd45c0 --- /dev/null +++ b/rest-angular/src/main/java/org/apache/examples/struts/actions/data/package-info.java @@ -0,0 +1,6 @@ +@ParentPackage("data") +@Namespace("/data") +package org.apache.examples.struts.actions.data; + +import org.apache.struts2.convention.annotation.Namespace; +import org.apache.struts2.convention.annotation.ParentPackage; \ No newline at end of file http://git-wip-us.apache.org/repos/asf/struts-examples/blob/a183bf5c/rest-angular/src/main/java/org/apache/examples/struts/interceptors/ExceptionHandlerInterceptor.java ---------------------------------------------------------------------- diff --git a/rest-angular/src/main/java/org/apache/examples/struts/interceptors/ExceptionHandlerInterceptor.java b/rest-angular/src/main/java/org/apache/examples/struts/interceptors/ExceptionHandlerInterceptor.java new file mode 100644 index 0000000..a5c4d38 --- /dev/null +++ b/rest-angular/src/main/java/org/apache/examples/struts/interceptors/ExceptionHandlerInterceptor.java @@ -0,0 +1,52 @@ +package org.apache.examples.struts.interceptors; + +import com.opensymphony.xwork2.Action; +import com.opensymphony.xwork2.ActionInvocation; +import com.opensymphony.xwork2.inject.Inject; +import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.apache.struts2.rest.ContentTypeHandlerManager; +import org.apache.struts2.rest.DefaultHttpHeaders; +import org.apache.struts2.rest.HttpHeaders; + +import javax.servlet.http.HttpServletResponse; +import java.util.HashMap; +import java.util.Map; + +public class ExceptionHandlerInterceptor extends MethodFilterInterceptor { + + private static final Logger log = LogManager.getLogger(ExceptionHandlerInterceptor.class); + + private static final String ACTION_ERROR = "actionError"; + + private ContentTypeHandlerManager manager; + + @Inject + public void setContentTypeHandlerManager(ContentTypeHandlerManager mgr) { + this.manager = mgr; + } + + @Override + protected String doIntercept(ActionInvocation actionInvocation) throws Exception { + try{ + return actionInvocation.invoke(); + } catch (Exception exception){ + log.warn("Exception occurred: {}", exception.getMessage()); + Map<String, Object> errors = new HashMap<>(); + + HttpHeaders httpHeaders = new DefaultHttpHeaders() + .disableCaching() + .withStatus(HttpServletResponse.SC_BAD_REQUEST) + .renderResult(Action.INPUT); + + if(exception instanceof SecurityException) { + errors.put(ACTION_ERROR, "Operation not allowed!"); + httpHeaders.setStatus(HttpServletResponse.SC_FORBIDDEN); + } else { + errors.put(ACTION_ERROR, exception.getMessage()); + } + return manager.handleResult(actionInvocation.getProxy().getConfig(), httpHeaders, errors); + } + } +} http://git-wip-us.apache.org/repos/asf/struts-examples/blob/a183bf5c/rest-angular/src/main/java/org/apache/examples/struts/models/Order.java ---------------------------------------------------------------------- diff --git a/rest-angular/src/main/java/org/apache/examples/struts/models/Order.java b/rest-angular/src/main/java/org/apache/examples/struts/models/Order.java new file mode 100644 index 0000000..a71303f --- /dev/null +++ b/rest-angular/src/main/java/org/apache/examples/struts/models/Order.java @@ -0,0 +1,86 @@ +package org.apache.examples.struts.models; + +import org.apache.commons.lang3.builder.EqualsBuilder; +import org.apache.commons.lang3.builder.HashCodeBuilder; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.hibernate.validator.constraints.NotBlank; + +import javax.validation.constraints.Max; +import javax.validation.constraints.Min; + +public class Order { + + + String id; + + @NotBlank(message = "validation.order.client") + String clientName; + + @Min(value = 10, message = "validation.order.amount") + @Max(value = 666, message = "validation.order.amount") + int amount; + + public Order() {} + + public Order(String id, String clientName, int amount) { + super(); + this.id = id; + this.clientName = clientName; + this.amount = amount; + } + public int getAmount() { + return amount; + } + public void setAmount(int amount) { + this.amount = amount; + } + public String getClientName() { + return clientName; + } + public void setClientName(String clientName) { + this.clientName = clientName; + } + public String getId() { + return id; + } + public void setId(String id) { + this.id = id; + } + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + if (obj == this) { + return true; + } + if (obj.getClass() != getClass()) { + return false; + } + Order rhs = (Order) obj; + return new EqualsBuilder() + .append(this.id, rhs.id) + .append(this.clientName, rhs.clientName) + .append(this.amount, rhs.amount) + .isEquals(); + } + + @Override + public int hashCode() { + return new HashCodeBuilder() + .append(id) + .append(clientName) + .append(amount) + .toHashCode(); + } + + @Override + public String toString() { + return new ToStringBuilder(this) + .append("id", id) + .append("clientName", clientName) + .append("amount", amount) + .toString(); + } +} http://git-wip-us.apache.org/repos/asf/struts-examples/blob/a183bf5c/rest-angular/src/main/java/org/apache/examples/struts/services/OrdersService.java ---------------------------------------------------------------------- diff --git a/rest-angular/src/main/java/org/apache/examples/struts/services/OrdersService.java b/rest-angular/src/main/java/org/apache/examples/struts/services/OrdersService.java new file mode 100644 index 0000000..47e63aa --- /dev/null +++ b/rest-angular/src/main/java/org/apache/examples/struts/services/OrdersService.java @@ -0,0 +1,41 @@ +package org.apache.examples.struts.services; + +import org.apache.examples.struts.models.Order; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class OrdersService { + + private static Map<String,Order> orders = new HashMap<>(); + private static int nextId = 6; + static { + orders.put("3", new Order("3", "Bob", 33)); + orders.put("4", new Order("4", "Sarah", 44)); + orders.put("5", new Order("5", "Jim", 66)); + } + + public Order get(String id) { + return orders.get(id); + } + + public List<Order> getAll() { + return new ArrayList<>(orders.values()); + } + + public void save(Order order) { + if (order.getId() == null) { + order.setId(String.valueOf(nextId++)); + } + + orders.put(order.getId(), order); + } + + public void remove(String id) { + orders.remove(id); + //throw new RuntimeException("Order remove currently not supported!"); + } + +} http://git-wip-us.apache.org/repos/asf/struts-examples/blob/a183bf5c/rest-angular/src/main/resources/exceptions_de.properties ---------------------------------------------------------------------- diff --git a/rest-angular/src/main/resources/exceptions_de.properties b/rest-angular/src/main/resources/exceptions_de.properties new file mode 100644 index 0000000..f704e35 --- /dev/null +++ b/rest-angular/src/main/resources/exceptions_de.properties @@ -0,0 +1 @@ +exception.operation.not.supported = L\u00F6schen ist zur Zeit nicht unterst\u00FCtzt\! http://git-wip-us.apache.org/repos/asf/struts-examples/blob/a183bf5c/rest-angular/src/main/resources/exceptions_en.properties ---------------------------------------------------------------------- diff --git a/rest-angular/src/main/resources/exceptions_en.properties b/rest-angular/src/main/resources/exceptions_en.properties new file mode 100644 index 0000000..d5cb4bf --- /dev/null +++ b/rest-angular/src/main/resources/exceptions_en.properties @@ -0,0 +1 @@ +exception.operation.not.supported = Delete is currently not supported\! http://git-wip-us.apache.org/repos/asf/struts-examples/blob/a183bf5c/rest-angular/src/main/resources/frontend_de.properties ---------------------------------------------------------------------- diff --git a/rest-angular/src/main/resources/frontend_de.properties b/rest-angular/src/main/resources/frontend_de.properties new file mode 100644 index 0000000..62c1066 --- /dev/null +++ b/rest-angular/src/main/resources/frontend_de.properties @@ -0,0 +1,16 @@ +app.name=Struts2 Bestellverwaltung + +orders = Bestellungen +orders.edit = Bearbeiten +orders.view = Ansehen +orders.delete = L\u00F6schen +orders.new = Neue Bestellung erstellen +orders.back = Zur Bestell\u00FCbersicht + +order = Bestellung +order.new = Neue Bestellung +order.edit = Bearbeite Bestellung +order.client = Kunde +order.amount = Anzahl + +save = Speichern http://git-wip-us.apache.org/repos/asf/struts-examples/blob/a183bf5c/rest-angular/src/main/resources/frontend_en.properties ---------------------------------------------------------------------- diff --git a/rest-angular/src/main/resources/frontend_en.properties b/rest-angular/src/main/resources/frontend_en.properties new file mode 100644 index 0000000..0ab07e4 --- /dev/null +++ b/rest-angular/src/main/resources/frontend_en.properties @@ -0,0 +1,16 @@ +app.name=Struts2 Order Manager + +orders = Orders +orders.edit = Edit +orders.view = View +orders.delete = Delete +orders.new = Create a new order +orders.back = Back to Orders + +order = Order +order.new = New Order +order.edit = Edit Order +order.client = Client +order.amount = Amount + +save = Save http://git-wip-us.apache.org/repos/asf/struts-examples/blob/a183bf5c/rest-angular/src/main/resources/jshint.conf.js ---------------------------------------------------------------------- diff --git a/rest-angular/src/main/resources/jshint.conf.js b/rest-angular/src/main/resources/jshint.conf.js new file mode 100644 index 0000000..350b03a --- /dev/null +++ b/rest-angular/src/main/resources/jshint.conf.js @@ -0,0 +1,13 @@ +{ + "maxparams": 5, + "indent": true, + "camelcase": true, + "eqeqeq": true, + "forin": true, + "immed": true, + "latedef": false, + "noarg": true, + "noempty": true, + "nonew": true, + "globals": {} +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/struts-examples/blob/a183bf5c/rest-angular/src/main/resources/log4j2.xml ---------------------------------------------------------------------- diff --git a/rest-angular/src/main/resources/log4j2.xml b/rest-angular/src/main/resources/log4j2.xml new file mode 100644 index 0000000..712b825 --- /dev/null +++ b/rest-angular/src/main/resources/log4j2.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Configuration> + <Appenders> + <Console name="STDOUT" target="SYSTEM_OUT"> + <PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/> + </Console> + </Appenders> + <Loggers> + <Logger name="com.opensymphony.xwork2" level="debug"/> + <Logger name="org.apache.struts2" level="debug"/> + <Logger name="org.apache.examples.struts" level="debug"/> + <Root level="warn"> + <AppenderRef ref="STDOUT"/> + </Root> + </Loggers> +</Configuration> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/struts-examples/blob/a183bf5c/rest-angular/src/main/resources/struts.xml ---------------------------------------------------------------------- diff --git a/rest-angular/src/main/resources/struts.xml b/rest-angular/src/main/resources/struts.xml new file mode 100644 index 0000000..950f0f2 --- /dev/null +++ b/rest-angular/src/main/resources/struts.xml @@ -0,0 +1,82 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<!DOCTYPE struts PUBLIC + "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN" + "http://struts.apache.org/dtds/struts-2.5.dtd"> +<struts> + + <constant name="struts.enable.DynamicMethodInvocation" value="false"/> + + <!-- Disable dev mode in productions --> + <constant name="struts.devMode" value="false"/> + <constant name="struts.handle.exception" value="false"/> + + <!-- Overwrite Convention --> + <constant name="struts.convention.action.suffix" value="Controller"/> + <constant name="struts.convention.action.mapAllMatches" value="true"/> + <constant name="struts.convention.package.locators" value="actions"/> + <constant name="struts.convention.default.parent.package" value="rest-angular"/> + <constant name="struts.action.extension" value=",,xml,json,action"/> + + <constant name="struts.custom.i18n.resources" value="frontend,validation,exceptions"/> + + <constant name="struts.mapper.class" value="rest"/> + + <!-- Use Jackson lib as content handler for all JSON requests --> + <bean type="org.apache.struts2.rest.handler.ContentTypeHandler" name="jackson" class="org.apache.struts2.rest.handler.JacksonLibHandler"/> + <constant name="struts.rest.handlerOverride.json" value="jackson"/> + + <!-- Set to false if the json content can be returned for any kind of http method --> + <constant name="struts.rest.content.restrictToGET" value="false"/> + + <!-- Set validation failure status code --> + <constant name="struts.rest.validationFailureStatusCode" value="406"/> + + + <!-- Set encoding to UTF-8, default is ISO-8859-1 --> + <constant name="struts.i18n.encoding" value="UTF-8"/> + <package name="rest-angular" extends="rest-default"> + <default-action-ref name="index" /> + <global-allowed-methods>index,show,create,update,destroy</global-allowed-methods> + </package> + <package name="data" extends="rest-angular" namespace="/data"> + <interceptors> + <!-- See BaseDataController --> + <interceptor name="dataError" class="org.apache.examples.struts.interceptors.ExceptionHandlerInterceptor"/> + <interceptor name="beanValidation" class="org.apache.struts.beanvalidation.validation.interceptor.BeanValidationInterceptor"/> + + <interceptor-stack name="dataDefaultStack"> + <interceptor-ref name="dataError"/> + <interceptor-ref name="alias"/> + <interceptor-ref name="servletConfig"/> + <interceptor-ref name="messages"> + <param name="operationMode">AUTOMATIC</param> + </interceptor-ref> + <interceptor-ref name="prepare"/> + <interceptor-ref name="i18n"/> + <interceptor-ref name="chain"/> + <interceptor-ref name="actionMappingParams"/> + <interceptor-ref name="scopedModelDriven"/> + <interceptor-ref name="modelDriven"> + <param name="refreshModelBeforeResult">true</param> + </interceptor-ref> + <interceptor-ref name="fileUpload"/> + <interceptor-ref name="checkbox"/> + <interceptor-ref name="staticParams"/> + <interceptor-ref name="params"/> + <interceptor-ref name="rest" /> + <interceptor-ref name="conversionError"/> + <interceptor-ref name="beanValidation"> + <param name="excludeMethods">input,back,cancel,browse,index,show,edit,editNew</param> + </interceptor-ref> + <interceptor-ref name="restWorkflow"> + <param name="excludeMethods">input,back,cancel,browse,index,show,edit,editNew</param> + </interceptor-ref> + </interceptor-stack> + + </interceptors> + + <default-interceptor-ref name="dataDefaultStack"/> + + </package> + +</struts> http://git-wip-us.apache.org/repos/asf/struts-examples/blob/a183bf5c/rest-angular/src/main/resources/validation_de.properties ---------------------------------------------------------------------- diff --git a/rest-angular/src/main/resources/validation_de.properties b/rest-angular/src/main/resources/validation_de.properties new file mode 100644 index 0000000..269740b --- /dev/null +++ b/rest-angular/src/main/resources/validation_de.properties @@ -0,0 +1,2 @@ +validation.order.client = Kunden Name darf nicht leer sein +validation.order.amount = Anzahl muss zwischen 10 und 666 sein http://git-wip-us.apache.org/repos/asf/struts-examples/blob/a183bf5c/rest-angular/src/main/resources/validation_en.properties ---------------------------------------------------------------------- diff --git a/rest-angular/src/main/resources/validation_en.properties b/rest-angular/src/main/resources/validation_en.properties new file mode 100644 index 0000000..a1e8e9c --- /dev/null +++ b/rest-angular/src/main/resources/validation_en.properties @@ -0,0 +1,2 @@ +validation.order.client = Client name can not be blank +validation.order.amount = Order amount needs to be between 10 and 666