From d252f6ef50412968beab64540e402636f7bd620f Mon Sep 17 00:00:00 2001 From: Siwat Sirichai Date: Thu, 29 Oct 2020 16:38:56 +0700 Subject: [PATCH] Add Source Code Linter Pipeline --- .ucdetector_reports/.icons/FewReference.gif | Bin 0 -> 943 bytes .ucdetector_reports/.icons/Final.gif | Bin 0 -> 960 bytes .ucdetector_reports/.icons/Other.gif | Bin 0 -> 592 bytes .ucdetector_reports/.icons/Reference.gif | Bin 0 -> 959 bytes .ucdetector_reports/.icons/TestOnly.gif | Bin 0 -> 947 bytes .../.icons/VisibilityDefault.gif | Bin 0 -> 968 bytes .../.icons/VisibilityPrivate.gif | Bin 0 -> 964 bytes .../.icons/VisibilityProtected.gif | Bin 0 -> 970 bytes .ucdetector_reports/.icons/html.xslt | 274 ++ .../.icons/j_annotation_obj.gif | Bin 0 -> 350 bytes .ucdetector_reports/.icons/j_class_obj.gif | Bin 0 -> 586 bytes .ucdetector_reports/.icons/j_enum_obj.gif | Bin 0 -> 361 bytes .../.icons/j_field_public_obj.gif | Bin 0 -> 124 bytes .../.icons/j_innerclass_public_obj.gif | Bin 0 -> 586 bytes .ucdetector_reports/.icons/j_int_obj.gif | Bin 0 -> 574 bytes .ucdetector_reports/.icons/j_methpub_obj.gif | Bin 0 -> 193 bytes .ucdetector_reports/.icons/ucd.gif | Bin 0 -> 951 bytes .ucdetector_reports/.icons/ucdetector.dtd | 79 + .ucdetector_reports/.icons/ucdetector32.png | Bin 0 -> 1934 bytes .ucdetector_reports/UCDetectorReport_001.html | 101 + .ucdetector_reports/UCDetectorReport_001.txt | 3 + screwdriver-3.5.6/.classpath | 27 + screwdriver-3.5.6/.project | 23 + screwdriver-3.5.6/.screwMaven/.classpath | 40 + screwdriver-3.5.6/.screwMaven/.project | 37 + .../.screwMaven/.settings/.jsdtscope | 13 + .../org.eclipse.core.resources.prefs | 6 + .../.settings/org.eclipse.jdt.core.prefs | 9 + .../.settings/org.eclipse.m2e.core.prefs | 4 + .../org.eclipse.wst.common.component | 11 + ...se.wst.common.project.facet.core.prefs.xml | 12 + ....eclipse.wst.common.project.facet.core.xml | 9 + ...rg.eclipse.wst.jsdt.ui.superType.container | 1 + .../org.eclipse.wst.jsdt.ui.superType.name | 1 + .../org.eclipse.wst.validation.prefs | 2 + .../org.eclipse.core.resources.prefs | 4 + .../.settings/org.eclipse.jdt.core.prefs | 6 + .../.settings/org.eclipse.m2e.core.prefs | 4 + .../Eclipse Public License - Version 1.0.html | 260 ++ screwdriver-3.5.6/Leoncavallo.xml | 313 ++ screwdriver-3.5.6/MarkupsList-3.3.1.html | 6 + screwdriver-3.5.6/ReferenceManual-3.3.1.html | 6 + screwdriver-3.5.6/TermsOfUse.txt | 53 + screwdriver-3.5.6/UserGuide-3.5.1.html | 6 + screwdriver-3.5.6/Versions_History.html | 6 + .../box/include/primary_JBoss EAP 5.2.eli | 10 + .../box/include/primary_JBoss EAP 5.2.uv.eli | 13 + .../box/include/primary_JBoss EAP 6.4.eli | 14 + .../box/include/primary_JBoss EAP 6.4.uv.eli | 18 + .../primary_JBoss EAP 6.4_s3_h3_jpa1.eli | 18 + .../box/include/primary_JBoss EAP 7.1.eli | 12 + .../primary_JBoss EAP 7.1_s3_h3_jpa1.eli | 17 + .../box/include/primary_JBoss EAP 7.1_s4.eli | 16 + .../primary_JBoss EAP 7.1_s4_h5_jpa2.eli | 17 + .../include/primary_JBoss EAP 7.1_uv_s4.eli | 11 + .../primary_JBoss EAP 7.1_uv_s4_h5_jpa2.eli | 19 + .../box/include/primary_Tomcat 7.0.eli | 8 + .../box/include/primary_Tomcat 7.0.uv.eli | 12 + .../box/include/userpass_domain.eli | 1 + .../box/include/userpass_simple.eli | 1 + .../box/include/userpass_trivial.eli | 1 + .../box/snippets/ViewResolver.txt | 4 + .../box/snippets/antisamyDepen.txt | 16 + .../box/snippets/cancella_extpr.txt | 12 + .../box/snippets/cancella_hv_3.txt | 33 + .../box/snippets/corpoDispatcherTiles_2.txt | 8 + .../box/snippets/corpoDispatcherTiles_3.txt | 10 + .../box/snippets/css/bootstrap.css | 3277 +++++++++++++++++ .../box/snippets/css/hammer_A0.css | 126 + .../box/snippets/css/screwdriver.css | 57 + screwdriver-3.5.6/box/snippets/depen_0.txt | 5 + screwdriver-3.5.6/box/snippets/depen_1.txt | 42 + screwdriver-3.5.6/box/snippets/depen_2.txt | 42 + screwdriver-3.5.6/box/snippets/depen_3.txt | 37 + screwdriver-3.5.6/box/snippets/depen_4.txt | 35 + .../box/snippets/depen_apache_ldap.txt | 20 + .../box/snippets/depen_captcha_1.1.txt | 5 + .../box/snippets/depen_captcha_1.2.1.txt | 5 + .../box/snippets/depen_hvalid.txt | 5 + .../box/snippets/depen_jackson.txt | 11 + .../box/snippets/depen_secu_3.1.txt | 26 + .../box/snippets/depen_secu_3.2.txt | 26 + .../snippets/depen_spring_3.1.0.RELEASE.txt | 66 + .../snippets/depen_spring_3.1.1.RELEASE.txt | 65 + .../snippets/depen_spring_3.2.0.RELEASE.txt | 67 + .../snippets/depen_spring_3.2.13.RELEASE.txt | 66 + .../snippets/depen_spring_4.0.3.RELEASE.txt | 66 + .../snippets/depen_spring_4.3.12.RELEASE.txt | 66 + .../box/snippets/depen_tiles.txt | 37 + .../box/snippets/depen_validator.txt | 5 + .../snippets/depen_webflow_2.3.3.RELEASE.txt | 5 + screwdriver-3.5.6/box/snippets/filte.txt | 49 + screwdriver-3.5.6/box/snippets/htv_3.4.txt | 44 + screwdriver-3.5.6/box/snippets/hv_3.4.txt | 33 + screwdriver-3.5.6/box/snippets/hv_3.5.txt | 37 + screwdriver-3.5.6/box/snippets/hv_3.6.txt | 35 + .../box/snippets/hv_5.1.0.Final.txt | 22 + .../box/snippets/jacksonView.txt | 4 + ...tiveDirectoryLdapAuthoritiesPopulator.java | 37 + .../box/snippets/java/AntiSamyListener.java | 55 + .../ApplicUserAuthenticationProvider.java | 34 + .../box/snippets/java/Belonger.java | 21 + .../box/snippets/java/ControllerBelong.java | 4 + .../snippets/java/ControllerBelongLDAP.java | 6 + .../java/CrossSiteScriptingFilter.java | 56 + screwdriver-3.5.6/box/snippets/java/Crud.java | 23 + .../java/DomainSpringSecurityUserContext.java | 50 + ...nUsernamePasswordAuthenticationFilter.java | 39 + ...inUsernamePasswordAuthenticationToken.java | 34 + .../snippets/java/DoorControllerBelong.java | 43 + .../box/snippets/java/GenericComponent.java | 19 + .../box/snippets/java/GenericController.java | 43 + .../box/snippets/java/GenericCrud.java | 114 + .../snippets/java/GenericRailDaoImplJPA1.java | 221 ++ .../snippets/java/GenericRailDaoImplJPA2.java | 332 ++ .../java/GenericRailDaoImplJPA2JRE7.java | 349 ++ .../box/snippets/java/HttpRequestWrapper.java | 83 + .../snippets/java/JsessionIdRemoveFilter.java | 87 + screwdriver-3.5.6/box/snippets/java/King.java | 27 + .../box/snippets/java/KingDao.java | 13 + .../box/snippets/java/KingDaoImpl.java | 17 + .../box/snippets/java/LoggedUser.java | 16 + .../LoggedUserMethodArgumentResolver.java | 45 + .../box/snippets/java/Notice.java | 40 + .../box/snippets/java/QuartzJob.java | 33 + .../box/snippets/java/QuartzTask.java | 8 + .../box/snippets/java/QuartzTaskImpl.java | 24 + .../box/snippets/java/ScrewInterceptor.java | 38 + .../java/SimpleSpringSecurityUserContext.java | 50 + ...eUsernamePasswordAuthenticationFilter.java | 47 + ...leUsernamePasswordAuthenticationToken.java | 33 + .../box/snippets/java/UserAuthorityUtils.java | 36 + .../box/snippets/java/UserContext.java | 20 + .../box/snippets/java/XssSanitizer.java | 37 + .../box/snippets/java/jpa2/Filter.java | 14 + .../box/snippets/java/jpa2/GenericDao.java | 140 + .../snippets/java/jpa2/GenericDaoImpl.java | 341 ++ .../box/snippets/java/jpa2/Order.java | 8 + .../box/snippets/java/jpa2/OrderBuilder.java | 63 + .../snippets/java/jpa2/PaginatedFilter.java | 30 + .../snippets/java/jpa2/SearchParameter.java | 7 + .../java/jpa2/SearchParameterBuilder.java | 71 + .../snippets/java/jpa2/SingularParameter.java | 31 + .../snippets/java/jpa2/StringParameter.java | 26 + .../java/ldapAuthenticationModel.java | 9 + .../java/ldapAuthenticationModelService.java | 9 + .../box/snippets/jsp/base_jsp.txt | 17 + .../box/snippets/jsp/error_jsp.txt | 31 + .../box/snippets/jsp/footer_jsp.txt | 2 + .../box/snippets/jsp/header_jsp.txt | 13 + .../box/snippets/jsp/login_jsp.txt | 59 + screwdriver-3.5.6/box/snippets/jsp/ok_jsp.txt | 22 + .../box/snippets/jsp/warning_jsp.txt | 22 + screwdriver-3.5.6/box/snippets/listn_0.txt | 7 + screwdriver-3.5.6/box/snippets/pom_build.txt | 71 + screwdriver-3.5.6/box/snippets/pompr_0.txt | 0 .../box/snippets/properties/config.properties | 1 + .../box/snippets/properties/log4j.properties | 20 + screwdriver-3.5.6/box/snippets/robots.txt | 2 + screwdriver-3.5.6/box/snippets/secuFilte.txt | 10 + .../testaDispatcher_3.1.0.RELEASE.txt | 14 + .../testaDispatcher_3.1.1.RELEASE.txt | 14 + .../testaDispatcher_3.2.13.RELEASE.txt | 14 + .../testaDispatcher_4.0.3.RELEASE.txt | 14 + .../testaDispatcher_4.3.12.RELEASE.txt | 14 + .../box/snippets/testaOrm_3.1.0.RELEASE.txt | 18 + .../box/snippets/testaOrm_3.2.13.RELEASE.txt | 20 + .../box/snippets/testaOrm_4.0.3.RELEASE.txt | 18 + .../box/snippets/testaOrm_4.3.12.RELEASE.txt | 18 + .../snippets/testaService_3.1.0.RELEASE.txt | 13 + .../snippets/testaService_3.2.13.RELEASE.txt | 13 + .../snippets/testaService_4.0.3.RELEASE.txt | 13 + .../snippets/testaService_4.3.12.RELEASE.txt | 13 + .../testaSpringProperties_3.1.0.RELEASE.txt | 13 + .../testaSpringProperties_3.2.13.RELEASE.txt | 13 + .../testaSpringProperties_4.0.3.RELEASE.txt | 13 + .../box/snippets/testaSpringSecurity_3.1.txt | 14 + .../box/snippets/testaSpringSecurity_3.2.txt | 14 + .../box/snippets/testaTiles_2.txt | 6 + .../box/snippets/testaTiles_3.txt | 5 + screwdriver-3.5.6/box/snippets/uvListener.txt | 3 + .../box/snippets/web.xml.spring.txt | 21 + screwdriver-3.5.6/box/snippets/web.xml.txt | 13 + .../box/snippets/web_captcha.txt | 10 + screwdriver-3.5.6/box/snippets/weberror.txt | 10 + screwdriver-3.5.6/box/snippets/webmime.txt | 20 + screwdriver-3.5.6/box/snippets/xml/policy.xml | 191 + .../box/snippets/xml/quartz-job.xml | 63 + .../box/snippets/xml/root-context.xml | 8 + .../snippets/xml/security-ldap-explicitly.xml | 43 + .../box/snippets/xml/webflow.xml | 7 + screwdriver-3.5.6/lib/jsp-api-2.2.jar | Bin 0 -> 49757 bytes screwdriver-3.5.6/lib/log4j-1.2.17.jar | Bin 0 -> 489883 bytes screwdriver-3.5.6/log4j-1.2.17.jar | Bin 0 -> 489883 bytes screwdriver-3.5.6/log4j.properties | 14 + screwdriver-3.5.6/makejar.xml | 31 + screwdriver-3.5.6/pom.xml | 51 + screwdriver-3.5.6/properties.dtd | 15 + screwdriver-3.5.6/silver.ele | 45 + screwdriver-3.5.6/silver.properties | 4 + .../ramecera/salad/analysis/CutComments.java | 302 ++ .../it/ramecera/salad/analysis/Flute.java | 513 +++ .../salad/analysis/JavaAnnotation.java | 47 + .../ramecera/salad/analysis/JavaMethod.java | 52 + .../ramecera/salad/analysis/JavaProperty.java | 54 + .../it/ramecera/salad/everyday/Candies.java | 112 + .../salad/everyday/ExactException.java | 157 + .../ramecera/salad/everyday/HandleDate.java | 1764 +++++++++ .../salad/everyday/MatriceCaratteri.java | 32 + .../java/it/ramecera/salad/everyday/Mix.java | 1662 +++++++++ .../it/ramecera/salad/everyday/Point2D.java | 55 + .../salad/everyday/StartingOperations.java | 301 ++ .../it/ramecera/salad/everyday/StringInt.java | 54 + .../ramecera/salad/everyday/Stringa2Int.java | 54 + .../it/ramecera/salad/everyday/Strings.java | 643 ++++ .../it/ramecera/salad/everyday/Universal.java | 181 + .../java/it/ramecera/salad/file/Abacus.java | 842 +++++ .../it/ramecera/salad/file/Equipment.java | 1015 +++++ .../java/it/ramecera/salad/file/FileBase.java | 64 + .../java/it/ramecera/salad/file/Folder.java | 448 +++ .../it/ramecera/salad/file/ReadMyFile.java | 213 ++ .../ramecera/salad/graphic/AskForDelete.java | 301 ++ .../it/ramecera/salad/graphic/Dynamics.java | 53 + .../it/ramecera/salad/graphic/Permission.java | 301 ++ .../it/ramecera/salad/graphic/Placard.java | 209 ++ .../salad/graphic/ProgressBarAccess.java | 69 + .../it/ramecera/salad/graphic/Remember.java | 326 ++ .../it/ramecera/screwdriver/CandyScrew.java | 216 ++ .../java/it/ramecera/screwdriver/Cst.java | 112 + .../ramecera/screwdriver/ElementaryFile.java | 2397 ++++++++++++ .../java/it/ramecera/screwdriver/Hammer.java | 568 +++ .../java/it/ramecera/screwdriver/Imply.java | 113 + .../java/it/ramecera/screwdriver/Markup.java | 286 ++ .../java/it/ramecera/screwdriver/Skill.java | 2192 +++++++++++ .../java/it/ramecera/screwdriver/Train.java | 93 + .../java/it/ramecera/screwdriver/Wagon.java | 771 ++++ .../screwdriver/component/Base_jsp.java | 434 +++ .../screwdriver/component/Bootstrap_css.java | 121 + .../component/ControllerBelong_java.java | 741 ++++ .../screwdriver/component/Dispatcher_xml.java | 365 ++ .../screwdriver/component/FileComponent.java | 406 ++ .../component/GenericModel_java.java | 68 + .../ramecera/screwdriver/component/Hoof.java | 163 + .../ImplementTabellaService_java.java | 106 + .../component/ImplementTableDao_java.java | 126 + .../InterfaceTabellaService_java.java | 71 + .../component/InterfaceTableDao_java.java | 92 + .../component/JspFormImpl_java.java | 141 + .../screwdriver/component/JspForm_java.java | 436 +++ .../component/JspPlainImpl_java.java | 129 + .../screwdriver/component/JspPlain_java.java | 353 ++ .../screwdriver/component/Navigation_jsp.java | 214 ++ .../screwdriver/component/Orm_xml.java | 315 ++ .../screwdriver/component/Pom_properties.java | 71 + .../screwdriver/component/Pom_xml.java | 413 +++ .../screwdriver/component/Quartz_job_xml.java | 129 + .../component/Screwdriver_css.java | 84 + .../component/Screwdriver_cssC.java | 85 + .../screwdriver/component/Service_xml.java | 73 + .../component/SpringProperties_xml.java | 136 + .../component/SpringSecurity_xml.java | 611 +++ .../screwdriver/component/Tiles_xml.java | 73 + .../UserAuthenticationProvider_java.java | 188 + .../component/UserContextImpl_java.java | 301 ++ .../screwdriver/component/Web_xml.java | 253 ++ .../screwdriver/component/Webflow_xml.java | 73 + .../screwdriver/outfits/ClockHands.java | 87 + .../screwdriver/outfits/ControllerBelong.java | 61 + .../ramecera/screwdriver/outfits/Costume.java | 126 + .../screwdriver/outfits/DBPlaceKit.java | 60 + .../screwdriver/outfits/ELEMethod.java | 123 + .../screwdriver/outfits/JspBeanElement.java | 234 ++ .../ramecera/screwdriver/outfits/JspKit.java | 206 ++ .../ramecera/screwdriver/outfits/MenuKit.java | 40 + .../screwdriver/outfits/RequestMap.java | 159 + .../screwdriver/outfits/TableOutfit.java | 152 + .../utilities/ValidConstScrew.java | 72 + .../utilities/ValidationLabelScrew.java | 77 + .../utilities/ValidationMessageScrew.java | 38 + .../target/classes/META-INF/MANIFEST.MF | 7 + .../screwdriver/pom.properties | 7 + .../maven/it.ramecera.ict/screwdriver/pom.xml | 51 + versions.properties | 13 + waxds-copper/.classpath | 20 + waxds-copper/.project | 34 + .../.settings/org.eclipse.jdt.core.prefs | 9 + .../.settings/org.eclipse.jpt.core.prefs | 3 + ...g.eclipse.jpt.entitygen.ramecerawax.copper | Bin 0 -> 1460 bytes .../.settings/org.eclipse.m2e.core.prefs | 4 + ...se.wst.common.project.facet.core.prefs.xml | 7 + ....eclipse.wst.common.project.facet.core.xml | 7 + .../Eclipse Public License - Version 1.0.html | 259 ++ waxds-copper/TermsOfUse.txt | 53 + waxds-copper/createSchema.sql | 1 + waxds-copper/dropCreateAll.sql | 86 + waxds-copper/function_upd_dt.sql | 7 + waxds-copper/inserts.sql | 13 + waxds-copper/makeJar.jardesc | 16 + waxds-copper/pom.xml | 39 + waxds-copper/src/META-INF/persistence.xml | 8 + .../screwdriver/waxds/copper/Actor.java | 199 + .../screwdriver/waxds/copper/Author.java | 118 + .../screwdriver/waxds/copper/Novel.java | 103 + .../target/classes/META-INF/MANIFEST.MF | 5 + .../waxds-copper/pom.properties | 7 + .../it.ramecera.ict/waxds-copper/pom.xml | 39 + .../target/classes/META-INF/persistence.xml | 8 + .../screwdriver/waxds/copper/Actor.class | Bin 0 -> 5415 bytes .../screwdriver/waxds/copper/Actor.java | 199 + .../screwdriver/waxds/copper/Author.class | Bin 0 -> 3564 bytes .../screwdriver/waxds/copper/Author.java | 118 + .../screwdriver/waxds/copper/Novel.class | Bin 0 -> 2777 bytes .../screwdriver/waxds/copper/Novel.java | 103 + 313 files changed, 36277 insertions(+) create mode 100644 .ucdetector_reports/.icons/FewReference.gif create mode 100644 .ucdetector_reports/.icons/Final.gif create mode 100644 .ucdetector_reports/.icons/Other.gif create mode 100644 .ucdetector_reports/.icons/Reference.gif create mode 100644 .ucdetector_reports/.icons/TestOnly.gif create mode 100644 .ucdetector_reports/.icons/VisibilityDefault.gif create mode 100644 .ucdetector_reports/.icons/VisibilityPrivate.gif create mode 100644 .ucdetector_reports/.icons/VisibilityProtected.gif create mode 100644 .ucdetector_reports/.icons/html.xslt create mode 100644 .ucdetector_reports/.icons/j_annotation_obj.gif create mode 100644 .ucdetector_reports/.icons/j_class_obj.gif create mode 100644 .ucdetector_reports/.icons/j_enum_obj.gif create mode 100644 .ucdetector_reports/.icons/j_field_public_obj.gif create mode 100644 .ucdetector_reports/.icons/j_innerclass_public_obj.gif create mode 100644 .ucdetector_reports/.icons/j_int_obj.gif create mode 100644 .ucdetector_reports/.icons/j_methpub_obj.gif create mode 100644 .ucdetector_reports/.icons/ucd.gif create mode 100644 .ucdetector_reports/.icons/ucdetector.dtd create mode 100644 .ucdetector_reports/.icons/ucdetector32.png create mode 100644 .ucdetector_reports/UCDetectorReport_001.html create mode 100644 .ucdetector_reports/UCDetectorReport_001.txt create mode 100644 screwdriver-3.5.6/.classpath create mode 100644 screwdriver-3.5.6/.project create mode 100644 screwdriver-3.5.6/.screwMaven/.classpath create mode 100644 screwdriver-3.5.6/.screwMaven/.project create mode 100644 screwdriver-3.5.6/.screwMaven/.settings/.jsdtscope create mode 100644 screwdriver-3.5.6/.screwMaven/.settings/org.eclipse.core.resources.prefs create mode 100644 screwdriver-3.5.6/.screwMaven/.settings/org.eclipse.jdt.core.prefs create mode 100644 screwdriver-3.5.6/.screwMaven/.settings/org.eclipse.m2e.core.prefs create mode 100644 screwdriver-3.5.6/.screwMaven/.settings/org.eclipse.wst.common.component create mode 100644 screwdriver-3.5.6/.screwMaven/.settings/org.eclipse.wst.common.project.facet.core.prefs.xml create mode 100644 screwdriver-3.5.6/.screwMaven/.settings/org.eclipse.wst.common.project.facet.core.xml create mode 100644 screwdriver-3.5.6/.screwMaven/.settings/org.eclipse.wst.jsdt.ui.superType.container create mode 100644 screwdriver-3.5.6/.screwMaven/.settings/org.eclipse.wst.jsdt.ui.superType.name create mode 100644 screwdriver-3.5.6/.screwMaven/.settings/org.eclipse.wst.validation.prefs create mode 100644 screwdriver-3.5.6/.settings/org.eclipse.core.resources.prefs create mode 100644 screwdriver-3.5.6/.settings/org.eclipse.jdt.core.prefs create mode 100644 screwdriver-3.5.6/.settings/org.eclipse.m2e.core.prefs create mode 100644 screwdriver-3.5.6/Eclipse Public License - Version 1.0.html create mode 100644 screwdriver-3.5.6/Leoncavallo.xml create mode 100644 screwdriver-3.5.6/MarkupsList-3.3.1.html create mode 100644 screwdriver-3.5.6/ReferenceManual-3.3.1.html create mode 100644 screwdriver-3.5.6/TermsOfUse.txt create mode 100644 screwdriver-3.5.6/UserGuide-3.5.1.html create mode 100644 screwdriver-3.5.6/Versions_History.html create mode 100644 screwdriver-3.5.6/box/include/primary_JBoss EAP 5.2.eli create mode 100644 screwdriver-3.5.6/box/include/primary_JBoss EAP 5.2.uv.eli create mode 100644 screwdriver-3.5.6/box/include/primary_JBoss EAP 6.4.eli create mode 100644 screwdriver-3.5.6/box/include/primary_JBoss EAP 6.4.uv.eli create mode 100644 screwdriver-3.5.6/box/include/primary_JBoss EAP 6.4_s3_h3_jpa1.eli create mode 100644 screwdriver-3.5.6/box/include/primary_JBoss EAP 7.1.eli create mode 100644 screwdriver-3.5.6/box/include/primary_JBoss EAP 7.1_s3_h3_jpa1.eli create mode 100644 screwdriver-3.5.6/box/include/primary_JBoss EAP 7.1_s4.eli create mode 100644 screwdriver-3.5.6/box/include/primary_JBoss EAP 7.1_s4_h5_jpa2.eli create mode 100644 screwdriver-3.5.6/box/include/primary_JBoss EAP 7.1_uv_s4.eli create mode 100644 screwdriver-3.5.6/box/include/primary_JBoss EAP 7.1_uv_s4_h5_jpa2.eli create mode 100644 screwdriver-3.5.6/box/include/primary_Tomcat 7.0.eli create mode 100644 screwdriver-3.5.6/box/include/primary_Tomcat 7.0.uv.eli create mode 100644 screwdriver-3.5.6/box/include/userpass_domain.eli create mode 100644 screwdriver-3.5.6/box/include/userpass_simple.eli create mode 100644 screwdriver-3.5.6/box/include/userpass_trivial.eli create mode 100644 screwdriver-3.5.6/box/snippets/ViewResolver.txt create mode 100644 screwdriver-3.5.6/box/snippets/antisamyDepen.txt create mode 100644 screwdriver-3.5.6/box/snippets/cancella_extpr.txt create mode 100644 screwdriver-3.5.6/box/snippets/cancella_hv_3.txt create mode 100644 screwdriver-3.5.6/box/snippets/corpoDispatcherTiles_2.txt create mode 100644 screwdriver-3.5.6/box/snippets/corpoDispatcherTiles_3.txt create mode 100644 screwdriver-3.5.6/box/snippets/css/bootstrap.css create mode 100644 screwdriver-3.5.6/box/snippets/css/hammer_A0.css create mode 100644 screwdriver-3.5.6/box/snippets/css/screwdriver.css create mode 100644 screwdriver-3.5.6/box/snippets/depen_0.txt create mode 100644 screwdriver-3.5.6/box/snippets/depen_1.txt create mode 100644 screwdriver-3.5.6/box/snippets/depen_2.txt create mode 100644 screwdriver-3.5.6/box/snippets/depen_3.txt create mode 100644 screwdriver-3.5.6/box/snippets/depen_4.txt create mode 100644 screwdriver-3.5.6/box/snippets/depen_apache_ldap.txt create mode 100644 screwdriver-3.5.6/box/snippets/depen_captcha_1.1.txt create mode 100644 screwdriver-3.5.6/box/snippets/depen_captcha_1.2.1.txt create mode 100644 screwdriver-3.5.6/box/snippets/depen_hvalid.txt create mode 100644 screwdriver-3.5.6/box/snippets/depen_jackson.txt create mode 100644 screwdriver-3.5.6/box/snippets/depen_secu_3.1.txt create mode 100644 screwdriver-3.5.6/box/snippets/depen_secu_3.2.txt create mode 100644 screwdriver-3.5.6/box/snippets/depen_spring_3.1.0.RELEASE.txt create mode 100644 screwdriver-3.5.6/box/snippets/depen_spring_3.1.1.RELEASE.txt create mode 100644 screwdriver-3.5.6/box/snippets/depen_spring_3.2.0.RELEASE.txt create mode 100644 screwdriver-3.5.6/box/snippets/depen_spring_3.2.13.RELEASE.txt create mode 100644 screwdriver-3.5.6/box/snippets/depen_spring_4.0.3.RELEASE.txt create mode 100644 screwdriver-3.5.6/box/snippets/depen_spring_4.3.12.RELEASE.txt create mode 100644 screwdriver-3.5.6/box/snippets/depen_tiles.txt create mode 100644 screwdriver-3.5.6/box/snippets/depen_validator.txt create mode 100644 screwdriver-3.5.6/box/snippets/depen_webflow_2.3.3.RELEASE.txt create mode 100644 screwdriver-3.5.6/box/snippets/filte.txt create mode 100644 screwdriver-3.5.6/box/snippets/htv_3.4.txt create mode 100644 screwdriver-3.5.6/box/snippets/hv_3.4.txt create mode 100644 screwdriver-3.5.6/box/snippets/hv_3.5.txt create mode 100644 screwdriver-3.5.6/box/snippets/hv_3.6.txt create mode 100644 screwdriver-3.5.6/box/snippets/hv_5.1.0.Final.txt create mode 100644 screwdriver-3.5.6/box/snippets/jacksonView.txt create mode 100644 screwdriver-3.5.6/box/snippets/java/ActiveDirectoryLdapAuthoritiesPopulator.java create mode 100644 screwdriver-3.5.6/box/snippets/java/AntiSamyListener.java create mode 100644 screwdriver-3.5.6/box/snippets/java/ApplicUserAuthenticationProvider.java create mode 100644 screwdriver-3.5.6/box/snippets/java/Belonger.java create mode 100644 screwdriver-3.5.6/box/snippets/java/ControllerBelong.java create mode 100644 screwdriver-3.5.6/box/snippets/java/ControllerBelongLDAP.java create mode 100644 screwdriver-3.5.6/box/snippets/java/CrossSiteScriptingFilter.java create mode 100644 screwdriver-3.5.6/box/snippets/java/Crud.java create mode 100644 screwdriver-3.5.6/box/snippets/java/DomainSpringSecurityUserContext.java create mode 100644 screwdriver-3.5.6/box/snippets/java/DomainUsernamePasswordAuthenticationFilter.java create mode 100644 screwdriver-3.5.6/box/snippets/java/DomainUsernamePasswordAuthenticationToken.java create mode 100644 screwdriver-3.5.6/box/snippets/java/DoorControllerBelong.java create mode 100644 screwdriver-3.5.6/box/snippets/java/GenericComponent.java create mode 100644 screwdriver-3.5.6/box/snippets/java/GenericController.java create mode 100644 screwdriver-3.5.6/box/snippets/java/GenericCrud.java create mode 100644 screwdriver-3.5.6/box/snippets/java/GenericRailDaoImplJPA1.java create mode 100644 screwdriver-3.5.6/box/snippets/java/GenericRailDaoImplJPA2.java create mode 100644 screwdriver-3.5.6/box/snippets/java/GenericRailDaoImplJPA2JRE7.java create mode 100644 screwdriver-3.5.6/box/snippets/java/HttpRequestWrapper.java create mode 100644 screwdriver-3.5.6/box/snippets/java/JsessionIdRemoveFilter.java create mode 100644 screwdriver-3.5.6/box/snippets/java/King.java create mode 100644 screwdriver-3.5.6/box/snippets/java/KingDao.java create mode 100644 screwdriver-3.5.6/box/snippets/java/KingDaoImpl.java create mode 100644 screwdriver-3.5.6/box/snippets/java/LoggedUser.java create mode 100644 screwdriver-3.5.6/box/snippets/java/LoggedUserMethodArgumentResolver.java create mode 100644 screwdriver-3.5.6/box/snippets/java/Notice.java create mode 100644 screwdriver-3.5.6/box/snippets/java/QuartzJob.java create mode 100644 screwdriver-3.5.6/box/snippets/java/QuartzTask.java create mode 100644 screwdriver-3.5.6/box/snippets/java/QuartzTaskImpl.java create mode 100644 screwdriver-3.5.6/box/snippets/java/ScrewInterceptor.java create mode 100644 screwdriver-3.5.6/box/snippets/java/SimpleSpringSecurityUserContext.java create mode 100644 screwdriver-3.5.6/box/snippets/java/SimpleUsernamePasswordAuthenticationFilter.java create mode 100644 screwdriver-3.5.6/box/snippets/java/SimpleUsernamePasswordAuthenticationToken.java create mode 100644 screwdriver-3.5.6/box/snippets/java/UserAuthorityUtils.java create mode 100644 screwdriver-3.5.6/box/snippets/java/UserContext.java create mode 100644 screwdriver-3.5.6/box/snippets/java/XssSanitizer.java create mode 100644 screwdriver-3.5.6/box/snippets/java/jpa2/Filter.java create mode 100644 screwdriver-3.5.6/box/snippets/java/jpa2/GenericDao.java create mode 100644 screwdriver-3.5.6/box/snippets/java/jpa2/GenericDaoImpl.java create mode 100644 screwdriver-3.5.6/box/snippets/java/jpa2/Order.java create mode 100644 screwdriver-3.5.6/box/snippets/java/jpa2/OrderBuilder.java create mode 100644 screwdriver-3.5.6/box/snippets/java/jpa2/PaginatedFilter.java create mode 100644 screwdriver-3.5.6/box/snippets/java/jpa2/SearchParameter.java create mode 100644 screwdriver-3.5.6/box/snippets/java/jpa2/SearchParameterBuilder.java create mode 100644 screwdriver-3.5.6/box/snippets/java/jpa2/SingularParameter.java create mode 100644 screwdriver-3.5.6/box/snippets/java/jpa2/StringParameter.java create mode 100644 screwdriver-3.5.6/box/snippets/java/ldapAuthenticationModel.java create mode 100644 screwdriver-3.5.6/box/snippets/java/ldapAuthenticationModelService.java create mode 100644 screwdriver-3.5.6/box/snippets/jsp/base_jsp.txt create mode 100644 screwdriver-3.5.6/box/snippets/jsp/error_jsp.txt create mode 100644 screwdriver-3.5.6/box/snippets/jsp/footer_jsp.txt create mode 100644 screwdriver-3.5.6/box/snippets/jsp/header_jsp.txt create mode 100644 screwdriver-3.5.6/box/snippets/jsp/login_jsp.txt create mode 100644 screwdriver-3.5.6/box/snippets/jsp/ok_jsp.txt create mode 100644 screwdriver-3.5.6/box/snippets/jsp/warning_jsp.txt create mode 100644 screwdriver-3.5.6/box/snippets/listn_0.txt create mode 100644 screwdriver-3.5.6/box/snippets/pom_build.txt create mode 100644 screwdriver-3.5.6/box/snippets/pompr_0.txt create mode 100644 screwdriver-3.5.6/box/snippets/properties/config.properties create mode 100644 screwdriver-3.5.6/box/snippets/properties/log4j.properties create mode 100644 screwdriver-3.5.6/box/snippets/robots.txt create mode 100644 screwdriver-3.5.6/box/snippets/secuFilte.txt create mode 100644 screwdriver-3.5.6/box/snippets/testaDispatcher_3.1.0.RELEASE.txt create mode 100644 screwdriver-3.5.6/box/snippets/testaDispatcher_3.1.1.RELEASE.txt create mode 100644 screwdriver-3.5.6/box/snippets/testaDispatcher_3.2.13.RELEASE.txt create mode 100644 screwdriver-3.5.6/box/snippets/testaDispatcher_4.0.3.RELEASE.txt create mode 100644 screwdriver-3.5.6/box/snippets/testaDispatcher_4.3.12.RELEASE.txt create mode 100644 screwdriver-3.5.6/box/snippets/testaOrm_3.1.0.RELEASE.txt create mode 100644 screwdriver-3.5.6/box/snippets/testaOrm_3.2.13.RELEASE.txt create mode 100644 screwdriver-3.5.6/box/snippets/testaOrm_4.0.3.RELEASE.txt create mode 100644 screwdriver-3.5.6/box/snippets/testaOrm_4.3.12.RELEASE.txt create mode 100644 screwdriver-3.5.6/box/snippets/testaService_3.1.0.RELEASE.txt create mode 100644 screwdriver-3.5.6/box/snippets/testaService_3.2.13.RELEASE.txt create mode 100644 screwdriver-3.5.6/box/snippets/testaService_4.0.3.RELEASE.txt create mode 100644 screwdriver-3.5.6/box/snippets/testaService_4.3.12.RELEASE.txt create mode 100644 screwdriver-3.5.6/box/snippets/testaSpringProperties_3.1.0.RELEASE.txt create mode 100644 screwdriver-3.5.6/box/snippets/testaSpringProperties_3.2.13.RELEASE.txt create mode 100644 screwdriver-3.5.6/box/snippets/testaSpringProperties_4.0.3.RELEASE.txt create mode 100644 screwdriver-3.5.6/box/snippets/testaSpringSecurity_3.1.txt create mode 100644 screwdriver-3.5.6/box/snippets/testaSpringSecurity_3.2.txt create mode 100644 screwdriver-3.5.6/box/snippets/testaTiles_2.txt create mode 100644 screwdriver-3.5.6/box/snippets/testaTiles_3.txt create mode 100644 screwdriver-3.5.6/box/snippets/uvListener.txt create mode 100644 screwdriver-3.5.6/box/snippets/web.xml.spring.txt create mode 100644 screwdriver-3.5.6/box/snippets/web.xml.txt create mode 100644 screwdriver-3.5.6/box/snippets/web_captcha.txt create mode 100644 screwdriver-3.5.6/box/snippets/weberror.txt create mode 100644 screwdriver-3.5.6/box/snippets/webmime.txt create mode 100644 screwdriver-3.5.6/box/snippets/xml/policy.xml create mode 100644 screwdriver-3.5.6/box/snippets/xml/quartz-job.xml create mode 100644 screwdriver-3.5.6/box/snippets/xml/root-context.xml create mode 100644 screwdriver-3.5.6/box/snippets/xml/security-ldap-explicitly.xml create mode 100644 screwdriver-3.5.6/box/snippets/xml/webflow.xml create mode 100644 screwdriver-3.5.6/lib/jsp-api-2.2.jar create mode 100644 screwdriver-3.5.6/lib/log4j-1.2.17.jar create mode 100644 screwdriver-3.5.6/log4j-1.2.17.jar create mode 100644 screwdriver-3.5.6/log4j.properties create mode 100644 screwdriver-3.5.6/makejar.xml create mode 100644 screwdriver-3.5.6/pom.xml create mode 100644 screwdriver-3.5.6/properties.dtd create mode 100644 screwdriver-3.5.6/silver.ele create mode 100644 screwdriver-3.5.6/silver.properties create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/salad/analysis/CutComments.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/salad/analysis/Flute.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/salad/analysis/JavaAnnotation.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/salad/analysis/JavaMethod.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/salad/analysis/JavaProperty.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/salad/everyday/Candies.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/salad/everyday/ExactException.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/salad/everyday/HandleDate.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/salad/everyday/MatriceCaratteri.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/salad/everyday/Mix.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/salad/everyday/Point2D.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/salad/everyday/StartingOperations.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/salad/everyday/StringInt.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/salad/everyday/Stringa2Int.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/salad/everyday/Strings.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/salad/everyday/Universal.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/salad/file/Abacus.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/salad/file/Equipment.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/salad/file/FileBase.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/salad/file/Folder.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/salad/file/ReadMyFile.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/salad/graphic/AskForDelete.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/salad/graphic/Dynamics.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/salad/graphic/Permission.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/salad/graphic/Placard.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/salad/graphic/ProgressBarAccess.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/salad/graphic/Remember.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/CandyScrew.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/Cst.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/ElementaryFile.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/Hammer.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/Imply.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/Markup.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/Skill.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/Train.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/Wagon.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/Base_jsp.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/Bootstrap_css.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/ControllerBelong_java.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/Dispatcher_xml.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/FileComponent.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/GenericModel_java.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/Hoof.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/ImplementTabellaService_java.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/ImplementTableDao_java.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/InterfaceTabellaService_java.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/InterfaceTableDao_java.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/JspFormImpl_java.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/JspForm_java.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/JspPlainImpl_java.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/JspPlain_java.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/Navigation_jsp.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/Orm_xml.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/Pom_properties.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/Pom_xml.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/Quartz_job_xml.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/Screwdriver_css.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/Screwdriver_cssC.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/Service_xml.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/SpringProperties_xml.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/SpringSecurity_xml.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/Tiles_xml.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/UserAuthenticationProvider_java.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/UserContextImpl_java.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/Web_xml.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/Webflow_xml.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/outfits/ClockHands.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/outfits/ControllerBelong.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/outfits/Costume.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/outfits/DBPlaceKit.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/outfits/ELEMethod.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/outfits/JspBeanElement.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/outfits/JspKit.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/outfits/MenuKit.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/outfits/RequestMap.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/outfits/TableOutfit.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/utilities/ValidConstScrew.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/utilities/ValidationLabelScrew.java create mode 100644 screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/utilities/ValidationMessageScrew.java create mode 100644 screwdriver-3.5.6/target/classes/META-INF/MANIFEST.MF create mode 100644 screwdriver-3.5.6/target/classes/META-INF/maven/it.ramecera.ict/screwdriver/pom.properties create mode 100644 screwdriver-3.5.6/target/classes/META-INF/maven/it.ramecera.ict/screwdriver/pom.xml create mode 100644 versions.properties create mode 100644 waxds-copper/.classpath create mode 100644 waxds-copper/.project create mode 100644 waxds-copper/.settings/org.eclipse.jdt.core.prefs create mode 100644 waxds-copper/.settings/org.eclipse.jpt.core.prefs create mode 100644 waxds-copper/.settings/org.eclipse.jpt.entitygen.ramecerawax.copper create mode 100644 waxds-copper/.settings/org.eclipse.m2e.core.prefs create mode 100644 waxds-copper/.settings/org.eclipse.wst.common.project.facet.core.prefs.xml create mode 100644 waxds-copper/.settings/org.eclipse.wst.common.project.facet.core.xml create mode 100644 waxds-copper/Eclipse Public License - Version 1.0.html create mode 100644 waxds-copper/TermsOfUse.txt create mode 100644 waxds-copper/createSchema.sql create mode 100644 waxds-copper/dropCreateAll.sql create mode 100644 waxds-copper/function_upd_dt.sql create mode 100644 waxds-copper/inserts.sql create mode 100644 waxds-copper/makeJar.jardesc create mode 100644 waxds-copper/pom.xml create mode 100644 waxds-copper/src/META-INF/persistence.xml create mode 100644 waxds-copper/src/it/ramecera/screwdriver/waxds/copper/Actor.java create mode 100644 waxds-copper/src/it/ramecera/screwdriver/waxds/copper/Author.java create mode 100644 waxds-copper/src/it/ramecera/screwdriver/waxds/copper/Novel.java create mode 100644 waxds-copper/target/classes/META-INF/MANIFEST.MF create mode 100644 waxds-copper/target/classes/META-INF/maven/it.ramecera.ict/waxds-copper/pom.properties create mode 100644 waxds-copper/target/classes/META-INF/maven/it.ramecera.ict/waxds-copper/pom.xml create mode 100644 waxds-copper/target/classes/META-INF/persistence.xml create mode 100644 waxds-copper/target/classes/it/ramecera/screwdriver/waxds/copper/Actor.class create mode 100644 waxds-copper/target/classes/it/ramecera/screwdriver/waxds/copper/Actor.java create mode 100644 waxds-copper/target/classes/it/ramecera/screwdriver/waxds/copper/Author.class create mode 100644 waxds-copper/target/classes/it/ramecera/screwdriver/waxds/copper/Author.java create mode 100644 waxds-copper/target/classes/it/ramecera/screwdriver/waxds/copper/Novel.class create mode 100644 waxds-copper/target/classes/it/ramecera/screwdriver/waxds/copper/Novel.java diff --git a/.ucdetector_reports/.icons/FewReference.gif b/.ucdetector_reports/.icons/FewReference.gif new file mode 100644 index 0000000000000000000000000000000000000000..13e8b78c1b0b3e472c3bcfb1dd44df1ac3a58c50 GIT binary patch literal 943 zcmZ?wbh9u|6krfw_|Cw<@IP+%)}5PIZdf&U`Ttyo)$>;zIdFK}+AUjFZ`!zg{o2K= z5A5E*Z|C0SvzPAOwrA(29mftGJ9+Hn@gv6%?mKwu#Hk|(k9y`V{Qv*t|NsB~ed&Gm zV9DsIae`}4kDo%rSIq_0;d-rrmQWRc~|_2I8K#jfp(-#H^~ zc}L9Z-uMqotv5|bTG0_RuQqIMZP>(ozy3Vm3Hg4LivlJW1^x#EpkqhDXb4a@1QdU= zFfuS$FzA4c1?33_jvj_W4jGRP3mltuId%jDK6-FKOr0agV8J0pz77_S3XX?|6p!$- zShWZ^K7Me#N6~FTM&JYoE-`(FHieCw61sXsC5|X8n5248L_|X%;)6o++4-759w#~) z8hGZj_@?aGaEOtSktI!HN)_W_UJ1#~Vo$mjzG0P4;x2lTWyZ|Amd&){Xn`U##}2X2 Jd^{Ws)&SA~tjqua literal 0 HcmV?d00001 diff --git a/.ucdetector_reports/.icons/Final.gif b/.ucdetector_reports/.icons/Final.gif new file mode 100644 index 0000000000000000000000000000000000000000..a63b65aa36803f1baae1bf392f78446d39225c9d GIT binary patch literal 960 zcmZ?wbhEHb6krfw_|CwvVd*RNf? z`oQk}`*!YKK6~ljZF_cZ+HvgAv6IJ69zSyY;J$;WPMkV&@Th0*!vFtI{{R2)-9{Q{xYzi!ojzd!Hm)rnuOPWpOf;{Cn#PZn9eTp#{=Q|#Kl_?H9)`m^Y_v_E|osjQ0xhPF6XAwcC2Q2fcl z$iQIEpaU`&lqcLd<}&1S$arjca6m>=BcNf!gT@9ajVO^bj)v_A#MI3qUI;j`@Cr-n zB}h~rbZeGmV~sNDC_K!@tQErLGqLGtH?O?YgboXVC#|Aa~LU|5uK zN?KG?D97<|YnPA__qHt$6kEF2h#NoRF>F%5BF(8Bk|5B$=H^TjRUeK9hen=GmRhCO Zi3=DQmor&*sLX6+d$7ENm5qhL8UQ&&v2g$Z literal 0 HcmV?d00001 diff --git a/.ucdetector_reports/.icons/Other.gif b/.ucdetector_reports/.icons/Other.gif new file mode 100644 index 0000000000000000000000000000000000000000..f0f5d834cfeb305e7c4e127d5ad776efc5e057b1 GIT binary patch literal 592 zcmZ?wbhEHb6krfwc*el+?8(y&OV{k)x^wf&4XfrZUp{Ne>iH{<95}pf?UpU8H*H+L ze(mDb%V#g$yKT?TO*>vbfBE$B(`QegEnl*C+1fp;HtzGxUFe@w7m!>Zl-dxR-(z;0u1@-TW#aw4^-mUA-n+E_<@)f~ zn_}1Y#qXSvw!9@6Y>sb>f$+lfGV=czv| z*RNf? z`oQk}`*!YKK6~ljZF_cZ+HvgAv6IJ69zSyY;J$;WPMkV&@Th0*!vFtI{{R2)-9{Q{xYzi!ojzd!Hm)rnuOPWpOf;{Cn#PZn9eTp#{=Q|#Kl_?H9)`m^Y_v_E|osjQ0xhPG|!3&855Ga zg+**z3Jwag9~G9?XcKT;ta5CMmD_@hgNCff_(jsSbRrCxj!G!n@I8qXU~*-Y(NOX^ z7;=cEE1*=tWa7g^T2oO_bU!Q4wA)`Csa5#^+ PQNx1S8`j@%V6X-N8QHGV literal 0 HcmV?d00001 diff --git a/.ucdetector_reports/.icons/VisibilityDefault.gif b/.ucdetector_reports/.icons/VisibilityDefault.gif new file mode 100644 index 0000000000000000000000000000000000000000..c71e22ae73c1c720767da20773e69e91da6b81f0 GIT binary patch literal 968 zcmZ?wbh9u|6krfw_|CwvVd)wMhX0#aZdf&U`SMvyR?lB?@6Y>sb>f$+lfGV=czv| zzK@!?1tFI$Ml9E}aFuH14? zJ8tZ_@R*HT)~REG;e^E}dF7pY94;@I`f8?W>$i%?Hm2yQVL+Nm)aA~2Rs5A93q?24NvS%SbVUDp@Ny? iNkds4n^fx8M*?dUb=$Zl9rlRo+)y~Ur-_+~!5RQl_PHtm literal 0 HcmV?d00001 diff --git a/.ucdetector_reports/.icons/VisibilityPrivate.gif b/.ucdetector_reports/.icons/VisibilityPrivate.gif new file mode 100644 index 0000000000000000000000000000000000000000..f35be0c939fbc9c2cc81ff75cbcff53a0a20d62d GIT binary patch literal 964 zcmZ?wbh9u|6krfw_|CwvVd@6Y>sb>f$+lfGV=czv| zzK@!?1tFI$Ml9E}aFuH14? zJ8tZ_@R*HT)~REG;e^E}dF7pY94;@I`f8?W>$i%?Hm2yQVL+Nm)aA~2Rs5A93q?24NvS%SbVUDp+daK d!P=a;cN4dGmPhwPCpLk6W@(cd<%tdq)&MI0waNeh literal 0 HcmV?d00001 diff --git a/.ucdetector_reports/.icons/VisibilityProtected.gif b/.ucdetector_reports/.icons/VisibilityProtected.gif new file mode 100644 index 0000000000000000000000000000000000000000..8f1b320e304045946eaa180d42abd443d2362019 GIT binary patch literal 970 zcmZ?wbh9u|6krfw_|CwvVd(?$` zePH+geLMFqpS^VNwmmyH?KpPm*vVrjj~_XHaNogGCr%wXc+@j@;s5_9|NsB@?@RBi z2TOi`*!=QZ@z0m5eu2>HU$<(%-=FvO>clTsCw;v#@&4ZWCyOj!t`C2`DRymN{LUF^ z%R6FL_r`x%YQ1Sf(u$6ld9`74Yr`hy`}ODfPRRG0Tof?5DDXc7FpPrH5TJ4hDE?$& zWMHsh&;gkX$`cG6%NYteWIQ%3aA2_HQ$>QcU9EMD;-P0|DmLz<1O5+eR<6gEvU?Eepgh{iIj2Gjf zCU&MQ4cQgOtu34k0vZzvH!tYq5f8JlU`RN?(;Tm#u!B+Ak&!8#bJ + + + + + + + Copyright (c) 2016 Joerg Spieler All rights reserved. This program and the + accompanying materials are made available under the terms of the Eclipse + Public License v1.0 which accompanies this distribution, and is available at + http://www.eclipse.org/legal/epl-v10.html + + + +To create custom reports change: +ECLIPSE_HOME/dropins/org.ucdetector_*.jar/org/ucdetector/report/html.xslt + + + + + UCDetector Report + + + +

+ + UCDetector homepage + + UCDetector Report +

+ + + + + + + + + +
+

About search

+ + + + + + + + + #E6E6FA + #FFFACD + + + + + + + +
PropertyValue
+ + + +
+
+

Preferences

+ + + + + + + + + #E6E6FA + #FFFACD + + + + + + + +
PreferenceValue
+ + + +
+ preferences above are different from default prefences. +
+ +

Searched in

+ + + + + + + + + #E6E6FA + #FFFACD + + + + + + + +
ElementType
+ + + +
+ Searched: +
+ + +

Warnings

+ + + + + + + + + + + + + + + + + + #E6E6FA + #FFFACD + + + + + + + + + + + + + + + + + + + + + + + +
NrJavaMarkerDescriptionReferences**AuthorLocation*Java typeMarker type
+ + + + {javaType/@long} + + + {@markerType} + + + + + + + + + + +   + + + + + + + + + + + declaration + + + + + + + + + + + + + + + + + + +
+ + +

+* To get links to the source locations, copy and paste first column (or table) to Eclipse 'Java Stack Trace Console'

+** Set 'Detect code with max number of references' > 0

+

+ + + +

+ + Exceptions found during detection +

+
    + +
  • + + + +
    +									
    +										
    +									
    +								
    +
  • +
    +
+
+
+ +
+ Created with + UCDetector + + +
+
+ + +
+
+ diff --git a/.ucdetector_reports/.icons/j_annotation_obj.gif b/.ucdetector_reports/.icons/j_annotation_obj.gif new file mode 100644 index 0000000000000000000000000000000000000000..435d62ed4c38a09b7c6b040e83e8a25cd77f0f8b GIT binary patch literal 350 zcmZ?wbhEHb6krfwxXQo~S-rp|dx~EAbp4F!CfT#ha%Y?8&UPtZ=vuMJy>f9t{qpFJ zweP?Dc>DSLkKccND<&0AUeUK|_v!;@k6gNa>iYfs$t&vTZ|dKCV)pKHGq)Yze){^m zuRr%*y#49N@2|i9eE#|S+Vht;Uc7qx?aSxizyAOK&p>UU_>+Z^fkA~q2V^kFPYi6; z4wEKK@swa`ZB09&VyiW?(?mJKOny>d8F!_LafAPIr4>F_ijJQrNJeT1A7ovdCZs0E z*xEQFcs5gdBQJ-92$P~Ov#@ldAQKaZh^#M{q*4l#LQqsZqoVAbDCtgLf%&q0e9}u8 ceVvvE1~W>ocXD-S<&@dBci;X4dmS090V>sYS^xk5 literal 0 HcmV?d00001 diff --git a/.ucdetector_reports/.icons/j_class_obj.gif b/.ucdetector_reports/.icons/j_class_obj.gif new file mode 100644 index 0000000000000000000000000000000000000000..e4c2a836f83e7dc72d29873fded01e7206eba2f5 GIT binary patch literal 586 zcmZ?wbhEHb6krfwc*ekxv!cRsX(Ohwq+z^!{nkw1lu( zDPc2HV&`P7KEHX-jYA>R6T@ewM9fTyo0E0x)!k_2wz@P-Sk|APSoeSzXn7Dfh!ClGm2|QYKe-7h)T#Q@$He9j?`9AQ4ux} zP&?5iq-<&#X{ezXX|J!t&@97aWMj6{+|Gn&T@xp-YRQ`y8=a5yFmmdtZYWsP+AXH8 bqq4{4!~q5-W`Qq@Pi$O#yuX);k--`O+yTtY literal 0 HcmV?d00001 diff --git a/.ucdetector_reports/.icons/j_enum_obj.gif b/.ucdetector_reports/.icons/j_enum_obj.gif new file mode 100644 index 0000000000000000000000000000000000000000..15535f52f52b20b465a9adbe6c766edffc0a287c GIT binary patch literal 361 zcmZ?wbhEHb6krfwxXQrL6RFS_qtX|v+8?VnAx?clyvD=?%}I&claqBPr|3^fHJF-i zG(E#~Mz+Pw9Lrg`Hna2X<`p~7D{+}$>bjuJePOxB!g9~W)xJw={Fl}SF0Bh(Rv)~w zIbv07^!o0U4ZUfbCS+}yoVRUS(au@ryXI8wo?EkTVdH@%t%sI(9$z=<%(l7bb}YEK zXX%aOTOM9M^8eqz|Ns9pkOCBcvM@3*7%=F7G=coYz}Dt4L*UsZ2Lb-x>=P|h1!TLo zBx{(?ZMm4W`z^y7XK^Kws+nhXx)U|`GaEA_V|tnb zI~QvO=Y%vZB_-(z%}z30f`V!4a~8-YG6)NI>Sr?KIH@r5YHZjb%dQfx!XzXnDkj9V XHQYsnn}=Is^??&7Po4I4WUvMR>jHhA literal 0 HcmV?d00001 diff --git a/.ucdetector_reports/.icons/j_field_public_obj.gif b/.ucdetector_reports/.icons/j_field_public_obj.gif new file mode 100644 index 0000000000000000000000000000000000000000..d4cb4254d92bcafa0341fc69e353c8cafe6944fe GIT binary patch literal 124 zcmZ?wbhEHb6krfw*v!Bn(B^A0Bg183N$uYG6Hly@>kKN~SlYRx@jnRsX(Ohwq+z^!{nkw1lu( zDPc2HV&`P7KEHX-jYA>R6T@ewM9fTyo0E0x)!k_2wz@P-Sk|APSoeSzXn7Dfh!ClGm2|QYKe-7h)T#Q@$He9j?`9AQ4ux} zP&?5iq-<&#X{ezXX|J!t&@97aWMj6{+|Gn&T@xp-YRQ`y8=a5yFmmdtZYWsP+AXH8 bqq4{4!~q5-W`Qq@Pi$O#yuX);k--`O+yTtY literal 0 HcmV?d00001 diff --git a/.ucdetector_reports/.icons/j_int_obj.gif b/.ucdetector_reports/.icons/j_int_obj.gif new file mode 100644 index 0000000000000000000000000000000000000000..2ebc46e1d3bc5ff3f095274d451e1c1acac6e8fb GIT binary patch literal 574 zcmZ?wbhEHb6krfwc*ekRbkBpMd+%Mp__82wLw@YKqJ)iw@f(U0Hsn$Z9h7r>-fBhr|0yaoImOGqG@NA&OE%B11e|ducvPA!7Nde1Kf>tC2EKTrV zloGT&HF!m8$jY4Pwb{{Ya$?pLCTz@)TUVO0skvlNXVw0;irw9{`@3rP^)(z^IQ7iB zrI&VYxOL{(lQ_SHnUQPOExqy|3>bzWQ2fcl$iU#tpaXI{C{7sIXE!)EIot8EGPCj7 zHTO7MGjs7y;$pV$?bEXob(|w=r8livQq@e%X}J@Vn1!ljGat99so-*kO{P3T&Fl^= z`VRxXubL!4|)qjO}gg>klxZ?TGXw~#-V zU_Y2&N}FX?r*L1YbYiM-aj|xBv2}#Mgo3?-guaA=wSS1Yfrz+)iMWB7#*ml2h^x<; ztIwFU(w+bR{{R30A^8LW0015UEC2ui01yBW000F(peK%GX`X1Rt}L1aL$Vf5mpMgx vG+WO#2NYmJDM}^)l;8n@L?90V%CN9pFcyU&MPO(u48jTlL$uClRtNw)MiWcq literal 0 HcmV?d00001 diff --git a/.ucdetector_reports/.icons/ucd.gif b/.ucdetector_reports/.icons/ucd.gif new file mode 100644 index 0000000000000000000000000000000000000000..2243d81e0b5196a3618894c9ef31b23c81fa6279 GIT binary patch literal 951 zcmZ?wbh9u|6krfw_|CwvR7-33)}5PIZdf&U`SMvyR?lB?@6Y>sb>f$+lfGV=czv| z3f=(XsFbfNVgabUy;ra~0Nm-VX8-^I literal 0 HcmV?d00001 diff --git a/.ucdetector_reports/.icons/ucdetector.dtd b/.ucdetector_reports/.icons/ucdetector.dtd new file mode 100644 index 0000000..bbcff40 --- /dev/null +++ b/.ucdetector_reports/.icons/ucdetector.dtd @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.ucdetector_reports/.icons/ucdetector32.png b/.ucdetector_reports/.icons/ucdetector32.png new file mode 100644 index 0000000000000000000000000000000000000000..1b0dd471e577e967690685e56f810af8a878b3da GIT binary patch literal 1934 zcmV;92XXj`P)GS z@7FoI>mT>#l7t%`Ex(zaJ^MRn_w)Vk@0^_@wAS1*gb+I>O&X(2^Ao^C4ZWriXU#;S zZDo6VxX_fAZ3}`uA^VTlW3De4=>K{>>8Iy^|GXl6K;+eF3;~Sk&pafEgC4=CwWp#7&i~Vqbr`p;gRU=1kK!`K_ zIV-6HiF5$l6J*n&2YCHI6&yJ0Ct?@lEG}izLsKdB15gwXrCYW=zbaTzfPnFUl^ZIl z^_HQ}0L*P{w1IyQ%=KMSym`Ks*6Th1rjJupRr=AHB&JL=enL3`k3C0#II}d1jFpok^loQFJOwkxP?( zITaeU7{F0z;gwoT;8L#L6n}XBYo78mttZkkG&n?vA>UqUI3v@Ncm*@ui@ zW67e)ctjGFieyU=y^crcZ@8%0hj8gUC@|lrLp2Ml$HE$@#+tD z4aXSvGwlBT%;~}~_arS*9#sZK)owD%#PHYP7*{(Ot`thi{5X^7!w{NcGxm$X>ZYx? zGI^7L&TXF!;x@KtFc(^uz)@6$r`AVpr6SrFCL<(PMfnidH{iCkN%nQ%Hf3jE^`Yl( z1;0r^_x737aq(8hVsxOUgh0)BT!C6XY*RG-Y!^x@tW*bhUZMEepP+>E20ZsJM7vLt zNky=RB__nJ^4w7G)Z>s!&$vB50{xV zq0Xbkd(VO5H{bf@KMviofbQSU@ZoXoz%(4AW>g5Xs0N&sSpm)}aP$qDWH?+{kq&xJ z{29|5L}pT?<9%qYl+yY~k>G)tF2A#YJ!@!bI zTN2{Kcnp_Q;tJ|xXRbQF{+(a#F8K2~T!_oB%?#RxxaOGgQ5ZVgUa^AuaUr04z#gX`|B0xi&X7;S|i z*UNM-9qnCI7TXB)KLe$KCz;!5e-wCDfHo@)Z@?Vn+F1#hS-72p+hMRHw4Z7rmDZFM z+ouw-)DtY+lm4i107u3qtTTqfS!HB*pb~@=ZRMZ?`e^SJK4@&F#H*tvem%Q#{gK4S zfoFF>ik^5RuB8ZO-3vF`jzHdd_Bxa7VgEaaNn29+eQNgD^^KvA3kNXL(tI_Q%$S#s z9|qygxeX1deTdN2PIfgka-}x$! zv=t(J?IP_hr#XJ4U1cm4vlPp|{qpYj?iD;QVE+sA?n^7N+0tUYtsP)`l*S+&PMVe! z+LmIUCD`!X*4 + + + + UCDetector Report + + + +

+ UCDetector homepageUCDetector Report +

+ + + + +
+

About search

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyValue
Operating systemWindows 10 - 10.0
Java14.0.2+12-46
Eclipse4.17.0.v20200902-1800
Eclipse productSpring Tool Suite 4, Version: 4.8.0.RELEASE, Build Id: 202009151856
UCDetector2.0.0
ModeDefault [built-in]
Created report2020-10-29 15:48:10
Search duration232 millis
Warnings1
+
+

Preferences

+ + + + +
PreferenceValue
+ 0 preferences above are different from default prefences. +
+

Searched in

+ + + + + + + +
ElementType
GolfScoreSourceType
+ Searched: 1
+

Warnings

+ + + + + + + + + +
NrJavaMarkerDescriptionReferences**AuthorLocation*Java typeMarker type
1ClassReferenceClass "GolfScore" has 0 references0 GolfScore.declaration(GolfScore.java:9)ClassReference
+

+ * To get links to the source locations, copy and paste first column (or table) to Eclipse 'Java Stack Trace Console' +
+ ** Set 'Detect code with max number of references' > 0 +
+

+
+ +
+ Created with UCDetector + 2.0.0
+
+ + diff --git a/.ucdetector_reports/UCDetectorReport_001.txt b/.ucdetector_reports/UCDetectorReport_001.txt new file mode 100644 index 0000000..d091d25 --- /dev/null +++ b/.ucdetector_reports/UCDetectorReport_001.txt @@ -0,0 +1,3 @@ +Created with UCDetector 2.0.0 2020-10-29 15:48:09 http://www.ucdetector.org/ Created by class: org.ucdetector.report.TextReport +Location Description Java Marker Author +GolfScore.(GolfScore.java:9) Class "GolfScore" has 0 references GolfScore org.ucdetector.analyzeMarkerReference diff --git a/screwdriver-3.5.6/.classpath b/screwdriver-3.5.6/.classpath new file mode 100644 index 0000000..03ac35c --- /dev/null +++ b/screwdriver-3.5.6/.classpath @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/screwdriver-3.5.6/.project b/screwdriver-3.5.6/.project new file mode 100644 index 0000000..14ac40b --- /dev/null +++ b/screwdriver-3.5.6/.project @@ -0,0 +1,23 @@ + + + screwdriver-3.5.6 + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + + diff --git a/screwdriver-3.5.6/.screwMaven/.classpath b/screwdriver-3.5.6/.screwMaven/.classpath new file mode 100644 index 0000000..c51eb12 --- /dev/null +++ b/screwdriver-3.5.6/.screwMaven/.classpath @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/screwdriver-3.5.6/.screwMaven/.project b/screwdriver-3.5.6/.screwMaven/.project new file mode 100644 index 0000000..f9e9335 --- /dev/null +++ b/screwdriver-3.5.6/.screwMaven/.project @@ -0,0 +1,37 @@ + + + XappnameX + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.wst.common.project.facet.core.builder + + + + + org.eclipse.wst.validation.validationbuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.jem.workbench.JavaEMFNature + org.eclipse.wst.common.modulecore.ModuleCoreNature + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + org.eclipse.wst.common.project.facet.core.nature + org.eclipse.wst.jsdt.core.jsNature + + diff --git a/screwdriver-3.5.6/.screwMaven/.settings/.jsdtscope b/screwdriver-3.5.6/.screwMaven/.settings/.jsdtscope new file mode 100644 index 0000000..2418123 --- /dev/null +++ b/screwdriver-3.5.6/.screwMaven/.settings/.jsdtscope @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/screwdriver-3.5.6/.screwMaven/.settings/org.eclipse.core.resources.prefs b/screwdriver-3.5.6/.screwMaven/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..7280518 --- /dev/null +++ b/screwdriver-3.5.6/.screwMaven/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,6 @@ +eclipse.preferences.version=1 +encoding//src/main/java=UTF8 +encoding//src/main/resources=UTF8 +encoding//src/test/java=UTF8 +encoding//src/test/resources=UTF8 +encoding/=UTF8 diff --git a/screwdriver-3.5.6/.screwMaven/.settings/org.eclipse.jdt.core.prefs b/screwdriver-3.5.6/.screwMaven/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..4e4a3ad --- /dev/null +++ b/screwdriver-3.5.6/.screwMaven/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,9 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.release=disabled +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/screwdriver-3.5.6/.screwMaven/.settings/org.eclipse.m2e.core.prefs b/screwdriver-3.5.6/.screwMaven/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 0000000..f897a7f --- /dev/null +++ b/screwdriver-3.5.6/.screwMaven/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/screwdriver-3.5.6/.screwMaven/.settings/org.eclipse.wst.common.component b/screwdriver-3.5.6/.screwMaven/.settings/org.eclipse.wst.common.component new file mode 100644 index 0000000..2f9092c --- /dev/null +++ b/screwdriver-3.5.6/.screwMaven/.settings/org.eclipse.wst.common.component @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/screwdriver-3.5.6/.screwMaven/.settings/org.eclipse.wst.common.project.facet.core.prefs.xml b/screwdriver-3.5.6/.screwMaven/.settings/org.eclipse.wst.common.project.facet.core.prefs.xml new file mode 100644 index 0000000..6d59853 --- /dev/null +++ b/screwdriver-3.5.6/.screwMaven/.settings/org.eclipse.wst.common.project.facet.core.prefs.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/screwdriver-3.5.6/.screwMaven/.settings/org.eclipse.wst.common.project.facet.core.xml b/screwdriver-3.5.6/.screwMaven/.settings/org.eclipse.wst.common.project.facet.core.xml new file mode 100644 index 0000000..7e607f0 --- /dev/null +++ b/screwdriver-3.5.6/.screwMaven/.settings/org.eclipse.wst.common.project.facet.core.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/screwdriver-3.5.6/.screwMaven/.settings/org.eclipse.wst.jsdt.ui.superType.container b/screwdriver-3.5.6/.screwMaven/.settings/org.eclipse.wst.jsdt.ui.superType.container new file mode 100644 index 0000000..3bd5d0a --- /dev/null +++ b/screwdriver-3.5.6/.screwMaven/.settings/org.eclipse.wst.jsdt.ui.superType.container @@ -0,0 +1 @@ +org.eclipse.wst.jsdt.launching.baseBrowserLibrary \ No newline at end of file diff --git a/screwdriver-3.5.6/.screwMaven/.settings/org.eclipse.wst.jsdt.ui.superType.name b/screwdriver-3.5.6/.screwMaven/.settings/org.eclipse.wst.jsdt.ui.superType.name new file mode 100644 index 0000000..05bd71b --- /dev/null +++ b/screwdriver-3.5.6/.screwMaven/.settings/org.eclipse.wst.jsdt.ui.superType.name @@ -0,0 +1 @@ +Window \ No newline at end of file diff --git a/screwdriver-3.5.6/.screwMaven/.settings/org.eclipse.wst.validation.prefs b/screwdriver-3.5.6/.screwMaven/.settings/org.eclipse.wst.validation.prefs new file mode 100644 index 0000000..04cad8c --- /dev/null +++ b/screwdriver-3.5.6/.screwMaven/.settings/org.eclipse.wst.validation.prefs @@ -0,0 +1,2 @@ +disabled=06target +eclipse.preferences.version=1 diff --git a/screwdriver-3.5.6/.settings/org.eclipse.core.resources.prefs b/screwdriver-3.5.6/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..f9fe345 --- /dev/null +++ b/screwdriver-3.5.6/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,4 @@ +eclipse.preferences.version=1 +encoding//src/main/java=UTF-8 +encoding//src/test/java=UTF-8 +encoding/=UTF-8 diff --git a/screwdriver-3.5.6/.settings/org.eclipse.jdt.core.prefs b/screwdriver-3.5.6/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..71ac301 --- /dev/null +++ b/screwdriver-3.5.6/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,6 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 +org.eclipse.jdt.core.compiler.compliance=1.5 +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.release=disabled +org.eclipse.jdt.core.compiler.source=1.5 diff --git a/screwdriver-3.5.6/.settings/org.eclipse.m2e.core.prefs b/screwdriver-3.5.6/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 0000000..f897a7f --- /dev/null +++ b/screwdriver-3.5.6/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/screwdriver-3.5.6/Eclipse Public License - Version 1.0.html b/screwdriver-3.5.6/Eclipse Public License - Version 1.0.html new file mode 100644 index 0000000..e484bef --- /dev/null +++ b/screwdriver-3.5.6/Eclipse Public License - Version 1.0.html @@ -0,0 +1,260 @@ + + + + + +Eclipse Public License - Version 1.0 + + + + + + +

Eclipse Public License - v 1.0

+ +

THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE +PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR +DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS +AGREEMENT.

+ +

1. DEFINITIONS

+ +

"Contribution" means:

+ +

a) in the case of the initial Contributor, the initial +code and documentation distributed under this Agreement, and

+

b) in the case of each subsequent Contributor:

+

i) changes to the Program, and

+

ii) additions to the Program;

+

where such changes and/or additions to the Program +originate from and are distributed by that particular Contributor. A +Contribution 'originates' from a Contributor if it was added to the +Program by such Contributor itself or anyone acting on such +Contributor's behalf. Contributions do not include additions to the +Program which: (i) are separate modules of software distributed in +conjunction with the Program under their own license agreement, and (ii) +are not derivative works of the Program.

+ +

"Contributor" means any person or entity that distributes +the Program.

+ +

"Licensed Patents" mean patent claims licensable by a +Contributor which are necessarily infringed by the use or sale of its +Contribution alone or when combined with the Program.

+ +

"Program" means the Contributions distributed in accordance +with this Agreement.

+ +

"Recipient" means anyone who receives the Program under +this Agreement, including all Contributors.

+ +

2. GRANT OF RIGHTS

+ +

a) Subject to the terms of this Agreement, each +Contributor hereby grants Recipient a non-exclusive, worldwide, +royalty-free copyright license to reproduce, prepare derivative works +of, publicly display, publicly perform, distribute and sublicense the +Contribution of such Contributor, if any, and such derivative works, in +source code and object code form.

+ +

b) Subject to the terms of this Agreement, each +Contributor hereby grants Recipient a non-exclusive, worldwide, +royalty-free patent license under Licensed Patents to make, use, sell, +offer to sell, import and otherwise transfer the Contribution of such +Contributor, if any, in source code and object code form. This patent +license shall apply to the combination of the Contribution and the +Program if, at the time the Contribution is added by the Contributor, +such addition of the Contribution causes such combination to be covered +by the Licensed Patents. The patent license shall not apply to any other +combinations which include the Contribution. No hardware per se is +licensed hereunder.

+ +

c) Recipient understands that although each Contributor +grants the licenses to its Contributions set forth herein, no assurances +are provided by any Contributor that the Program does not infringe the +patent or other intellectual property rights of any other entity. Each +Contributor disclaims any liability to Recipient for claims brought by +any other entity based on infringement of intellectual property rights +or otherwise. As a condition to exercising the rights and licenses +granted hereunder, each Recipient hereby assumes sole responsibility to +secure any other intellectual property rights needed, if any. For +example, if a third party patent license is required to allow Recipient +to distribute the Program, it is Recipient's responsibility to acquire +that license before distributing the Program.

+ +

d) Each Contributor represents that to its knowledge it +has sufficient copyright rights in its Contribution, if any, to grant +the copyright license set forth in this Agreement.

+ +

3. REQUIREMENTS

+ +

A Contributor may choose to distribute the Program in object code +form under its own license agreement, provided that:

+ +

a) it complies with the terms and conditions of this +Agreement; and

+ +

b) its license agreement:

+ +

i) effectively disclaims on behalf of all Contributors +all warranties and conditions, express and implied, including warranties +or conditions of title and non-infringement, and implied warranties or +conditions of merchantability and fitness for a particular purpose;

+ +

ii) effectively excludes on behalf of all Contributors +all liability for damages, including direct, indirect, special, +incidental and consequential damages, such as lost profits;

+ +

iii) states that any provisions which differ from this +Agreement are offered by that Contributor alone and not by any other +party; and

+ +

iv) states that source code for the Program is available +from such Contributor, and informs licensees how to obtain it in a +reasonable manner on or through a medium customarily used for software +exchange.

+ +

When the Program is made available in source code form:

+ +

a) it must be made available under this Agreement; and

+ +

b) a copy of this Agreement must be included with each +copy of the Program.

+ +

Contributors may not remove or alter any copyright notices contained +within the Program.

+ +

Each Contributor must identify itself as the originator of its +Contribution, if any, in a manner that reasonably allows subsequent +Recipients to identify the originator of the Contribution.

+ +

4. COMMERCIAL DISTRIBUTION

+ +

Commercial distributors of software may accept certain +responsibilities with respect to end users, business partners and the +like. While this license is intended to facilitate the commercial use of +the Program, the Contributor who includes the Program in a commercial +product offering should do so in a manner which does not create +potential liability for other Contributors. Therefore, if a Contributor +includes the Program in a commercial product offering, such Contributor +("Commercial Contributor") hereby agrees to defend and +indemnify every other Contributor ("Indemnified Contributor") +against any losses, damages and costs (collectively "Losses") +arising from claims, lawsuits and other legal actions brought by a third +party against the Indemnified Contributor to the extent caused by the +acts or omissions of such Commercial Contributor in connection with its +distribution of the Program in a commercial product offering. The +obligations in this section do not apply to any claims or Losses +relating to any actual or alleged intellectual property infringement. In +order to qualify, an Indemnified Contributor must: a) promptly notify +the Commercial Contributor in writing of such claim, and b) allow the +Commercial Contributor to control, and cooperate with the Commercial +Contributor in, the defense and any related settlement negotiations. The +Indemnified Contributor may participate in any such claim at its own +expense.

+ +

For example, a Contributor might include the Program in a commercial +product offering, Product X. That Contributor is then a Commercial +Contributor. If that Commercial Contributor then makes performance +claims, or offers warranties related to Product X, those performance +claims and warranties are such Commercial Contributor's responsibility +alone. Under this section, the Commercial Contributor would have to +defend claims against the other Contributors related to those +performance claims and warranties, and if a court requires any other +Contributor to pay any damages as a result, the Commercial Contributor +must pay those damages.

+ +

5. NO WARRANTY

+ +

EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS +PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS +OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, +ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY +OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely +responsible for determining the appropriateness of using and +distributing the Program and assumes all risks associated with its +exercise of rights under this Agreement , including but not limited to +the risks and costs of program errors, compliance with applicable laws, +damage to or loss of data, programs or equipment, and unavailability or +interruption of operations.

+ +

6. DISCLAIMER OF LIABILITY

+ +

EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT +NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING +WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR +DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED +HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

+ +

7. GENERAL

+ +

If any provision of this Agreement is invalid or unenforceable under +applicable law, it shall not affect the validity or enforceability of +the remainder of the terms of this Agreement, and without further action +by the parties hereto, such provision shall be reformed to the minimum +extent necessary to make such provision valid and enforceable.

+ +

If Recipient institutes patent litigation against any entity +(including a cross-claim or counterclaim in a lawsuit) alleging that the +Program itself (excluding combinations of the Program with other +software or hardware) infringes such Recipient's patent(s), then such +Recipient's rights granted under Section 2(b) shall terminate as of the +date such litigation is filed.

+ +

All Recipient's rights under this Agreement shall terminate if it +fails to comply with any of the material terms or conditions of this +Agreement and does not cure such failure in a reasonable period of time +after becoming aware of such noncompliance. If all Recipient's rights +under this Agreement terminate, Recipient agrees to cease use and +distribution of the Program as soon as reasonably practicable. However, +Recipient's obligations under this Agreement and any licenses granted by +Recipient relating to the Program shall continue and survive.

+ +

Everyone is permitted to copy and distribute copies of this +Agreement, but in order to avoid inconsistency the Agreement is +copyrighted and may only be modified in the following manner. The +Agreement Steward reserves the right to publish new versions (including +revisions) of this Agreement from time to time. No one other than the +Agreement Steward has the right to modify this Agreement. The Eclipse +Foundation is the initial Agreement Steward. The Eclipse Foundation may +assign the responsibility to serve as the Agreement Steward to a +suitable separate entity. Each new version of the Agreement will be +given a distinguishing version number. The Program (including +Contributions) may always be distributed subject to the version of the +Agreement under which it was received. In addition, after a new version +of the Agreement is published, Contributor may elect to distribute the +Program (including its Contributions) under the new version. Except as +expressly stated in Sections 2(a) and 2(b) above, Recipient receives no +rights or licenses to the intellectual property of any Contributor under +this Agreement, whether expressly, by implication, estoppel or +otherwise. All rights in the Program not expressly granted under this +Agreement are reserved.

+ +

This Agreement is governed by the laws of the State of New York and +the intellectual property laws of the United States of America. No party +to this Agreement will bring a legal action under this Agreement more +than one year after the cause of action arose. Each party waives its +rights to a jury trial in any resulting litigation.

+ + + + \ No newline at end of file diff --git a/screwdriver-3.5.6/Leoncavallo.xml b/screwdriver-3.5.6/Leoncavallo.xml new file mode 100644 index 0000000..15653fc --- /dev/null +++ b/screwdriver-3.5.6/Leoncavallo.xml @@ -0,0 +1,313 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/screwdriver-3.5.6/MarkupsList-3.3.1.html b/screwdriver-3.5.6/MarkupsList-3.3.1.html new file mode 100644 index 0000000..700b92b --- /dev/null +++ b/screwdriver-3.5.6/MarkupsList-3.3.1.html @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/screwdriver-3.5.6/ReferenceManual-3.3.1.html b/screwdriver-3.5.6/ReferenceManual-3.3.1.html new file mode 100644 index 0000000..0ad81d3 --- /dev/null +++ b/screwdriver-3.5.6/ReferenceManual-3.3.1.html @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/screwdriver-3.5.6/TermsOfUse.txt b/screwdriver-3.5.6/TermsOfUse.txt new file mode 100644 index 0000000..b7348af --- /dev/null +++ b/screwdriver-3.5.6/TermsOfUse.txt @@ -0,0 +1,53 @@ +Definitions +Software: Any software that is made available to you +by plug-in "Drill", by the application "Screwdriver" +and all software associated to it. Your use of the +Software is governed by the terms of the end user +license agreement EPL which accompanies or is +included with the Software ("License Agreement"). + +DISCLAIMER +THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY +OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT +LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF +COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO +EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY +GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR +CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF +CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE +USE OR INABILITY TO USE THE SOFTWARE OR FROM OTHER +DEALINGS IN THIS SOFTWARE. BEING A CODE GENERATOR, +THIS DECLARATION REFERS NOT ONLY TO THE SOFTWARE +PROVIDED, BUT ALSO TO ALL THE APPLICATIONS THAT WILL +BE GENERATED BY IT. +THE FINAL USER OF "SCREWDRIVER" OWNS THE INTELLECTUAL +PROPERTIES OF THE SOFTWARE HE HAS GENERATED. + +Definizioni +Software: qualsiasi software reso disponibile dal +plug-in "Drill", dall'applicazione "Screwdriver" e da +tutto il software ad esso associato. L'utilizzo del +software è regolato dai termini del contratto di +licenza per l'utente finale LGPL che accompagna o è +incluso nel software ("Contratto di licenza"). + +DECLINAZIONE DI RESPONSABILITA' +QUESTO SOFTWARE È FORNITO "COSÌ COM'È", SENZA ALCUN +TIPO DI GARANZIA, ESPRESSA O IMPLICITA, SENZA ALCUNA +GARANZIA DI COMMERCIABILITÀ, IDONEITÀ A UN +PARTICOLARE SCOPO E SENZA DIRITTO DI COPYRIGHT, +BREVETTO, MARCHIO O ALTRO DIRITTO. IN NESSUN CASO IL +TITOLARE DEL COPYRIGHT SARÀ RESPONSABILE DI QUALSIASI +RECLAMO, DANNO O ALTRA RESPONSABILITÀ, COMPRESO +QUALSIASI DANNO GENERALE, SPECIALE, INDIRETTO, +INCIDENTALE O CONSEQUENZIALE, SIA NELL'AMBITO DI UN +CONTRATTO, SIA DI UNA CONTROVERSIA O ALTRO, DERIVANTE +DALL'UTILIZZO O DALL'IMPOSSIBILITÀ DI UTILIZZARE +QUESTO SOFTWARE. TRATTANDOSI DI UN GENERATORE DI +CODICE, QUESTA DICHIARAZIONE SI RIFERISCE NON SOLO AL +SOFTWARE FORNITO, MA ANCHE A TUTTE LE APPLICAZIONI +CHE SARANNO DA ESSO GENERATE. +L'UTENTE FINALE DI "SCREWDRIVER" DETIENE LA PROPRIETÀ +INTELLETTUALE DEL SOFTWARE CHE HA GENERATO. \ No newline at end of file diff --git a/screwdriver-3.5.6/UserGuide-3.5.1.html b/screwdriver-3.5.6/UserGuide-3.5.1.html new file mode 100644 index 0000000..bb4130d --- /dev/null +++ b/screwdriver-3.5.6/UserGuide-3.5.1.html @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/screwdriver-3.5.6/Versions_History.html b/screwdriver-3.5.6/Versions_History.html new file mode 100644 index 0000000..91f082a --- /dev/null +++ b/screwdriver-3.5.6/Versions_History.html @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/screwdriver-3.5.6/box/include/primary_JBoss EAP 5.2.eli b/screwdriver-3.5.6/box/include/primary_JBoss EAP 5.2.eli new file mode 100644 index 0000000..98b39f6 --- /dev/null +++ b/screwdriver-3.5.6/box/include/primary_JBoss EAP 5.2.eli @@ -0,0 +1,10 @@ +appse+JBoss EAP 5.2 +sv+3.2.13.RELEASE +mavmo+4.0.0 +mavgr+it.ramecera.ict +mv+0.0.1-SNAPSHOT +depen+2 +pompr+0 +mavco+1.7 +sreso+ +defaulan+en \ No newline at end of file diff --git a/screwdriver-3.5.6/box/include/primary_JBoss EAP 5.2.uv.eli b/screwdriver-3.5.6/box/include/primary_JBoss EAP 5.2.uv.eli new file mode 100644 index 0000000..113f8dd --- /dev/null +++ b/screwdriver-3.5.6/box/include/primary_JBoss EAP 5.2.uv.eli @@ -0,0 +1,13 @@ +appse+JBoss EAP 5.2 +sv+3.2.13.RELEASE +uv+3.1.4.RELEASE +hv+3.4 +mavmo+4.0.0 +mavgr+it.ramecera.ict +mv+0.0.1-SNAPSHOT +depen+2 +pompr+0 +mavco+1.7 +hvalid+4.2.0.Final +sreso+ +defaulan+en \ No newline at end of file diff --git a/screwdriver-3.5.6/box/include/primary_JBoss EAP 6.4.eli b/screwdriver-3.5.6/box/include/primary_JBoss EAP 6.4.eli new file mode 100644 index 0000000..a493ea5 --- /dev/null +++ b/screwdriver-3.5.6/box/include/primary_JBoss EAP 6.4.eli @@ -0,0 +1,14 @@ +appse+JBoss EAP 6.4 +mavmo+4.0.0 +mavgr+it.ramecera.ict +mv+0.0.1-SNAPSHOT +depen+4 +pompr+0 +mavco+1.7 +jeev+6.0 +hv+3.5+hjpav+1 +hvalid+4.2.0.Final +log4j+2.5 +sv+3.2.13.RELEASE +sreso+ +defaulan+en \ No newline at end of file diff --git a/screwdriver-3.5.6/box/include/primary_JBoss EAP 6.4.uv.eli b/screwdriver-3.5.6/box/include/primary_JBoss EAP 6.4.uv.eli new file mode 100644 index 0000000..f4fc197 --- /dev/null +++ b/screwdriver-3.5.6/box/include/primary_JBoss EAP 6.4.uv.eli @@ -0,0 +1,18 @@ +appse+JBoss EAP 6.4 +sv+3.2.13.RELEASE +uv+3.1.4.RELEASE +hv+3.5+hjpav+2 +mavmo+4.0.0 +mavbu+ +mavcp+2.3.2 +mavwa+2.1.1 +mavcl+2.3 +mavgr+it.ramecera.ict +mv+0.0.1-SNAPSHOT +depen+2 +pompr+0 +mavco+1.7 +log4j+2.5 +hvalid+4.2.0.Final +sreso+ +defaulan+en \ No newline at end of file diff --git a/screwdriver-3.5.6/box/include/primary_JBoss EAP 6.4_s3_h3_jpa1.eli b/screwdriver-3.5.6/box/include/primary_JBoss EAP 6.4_s3_h3_jpa1.eli new file mode 100644 index 0000000..07803ea --- /dev/null +++ b/screwdriver-3.5.6/box/include/primary_JBoss EAP 6.4_s3_h3_jpa1.eli @@ -0,0 +1,18 @@ +appse+JBoss EAP 6.4 +mavmo+4.0.0 +mavgr+it.ramecera.ict +mavbu+ +mavcp+2.3.2 +mavwa+2.1.1 +mavcl+2.3 +mv+0.0.1-SNAPSHOT +depen+4 +pompr+0 +mavco+1.7 +jeev+6.0 +hv+3.5+hjpav+1 +hvalid+4.2.0.Final +log4j+2.5 +sv+3.2.13.RELEASE +sreso+ +defaulan+en \ No newline at end of file diff --git a/screwdriver-3.5.6/box/include/primary_JBoss EAP 7.1.eli b/screwdriver-3.5.6/box/include/primary_JBoss EAP 7.1.eli new file mode 100644 index 0000000..7e610aa --- /dev/null +++ b/screwdriver-3.5.6/box/include/primary_JBoss EAP 7.1.eli @@ -0,0 +1,12 @@ +appse+JBoss EAP 7.1 +mavmo+4.0.0 +mavgr+it.ramecera.ict +mv+0.0.1-SNAPSHOT +depen+4 +pompr+0 +mavco+1.8 +jeev+6.0 +sv+4.3.12.RELEASE +log4j+2.5 +sreso+ +defaulan+en \ No newline at end of file diff --git a/screwdriver-3.5.6/box/include/primary_JBoss EAP 7.1_s3_h3_jpa1.eli b/screwdriver-3.5.6/box/include/primary_JBoss EAP 7.1_s3_h3_jpa1.eli new file mode 100644 index 0000000..fc293c0 --- /dev/null +++ b/screwdriver-3.5.6/box/include/primary_JBoss EAP 7.1_s3_h3_jpa1.eli @@ -0,0 +1,17 @@ +appse+JBoss EAP 7.1 +mavmo+4.0.0 +mavgr+it.ramecera.ict +mavbu+ +mavcp+2.3.2 +mavwa+2.1.1 +mavcl+2.3 +mv+0.0.1-SNAPSHOT +depen+4 +pompr+0 +mavco+1.7 +jeev+6.0 +hv+3.5+hjpav+1 +log4j+2.5 +sv+3.2.13.RELEASE +sreso+ +defaulan+en \ No newline at end of file diff --git a/screwdriver-3.5.6/box/include/primary_JBoss EAP 7.1_s4.eli b/screwdriver-3.5.6/box/include/primary_JBoss EAP 7.1_s4.eli new file mode 100644 index 0000000..5a54008 --- /dev/null +++ b/screwdriver-3.5.6/box/include/primary_JBoss EAP 7.1_s4.eli @@ -0,0 +1,16 @@ +appse+JBoss EAP 7.1 +mavmo+4.0.0 +mavgr+it.ramecera.ict +mavbu+ +mavcp+2.3.2 +mavwa+2.1.1 +mavcl+2.3 +mv+0.0.1-SNAPSHOT +depen+4 +pompr+0 +mavco+1.8 +jeev+6.0 +sv+4.3.12.RELEASE +log4j+2.5 +sreso+ +defaulan+en \ No newline at end of file diff --git a/screwdriver-3.5.6/box/include/primary_JBoss EAP 7.1_s4_h5_jpa2.eli b/screwdriver-3.5.6/box/include/primary_JBoss EAP 7.1_s4_h5_jpa2.eli new file mode 100644 index 0000000..d162c5e --- /dev/null +++ b/screwdriver-3.5.6/box/include/primary_JBoss EAP 7.1_s4_h5_jpa2.eli @@ -0,0 +1,17 @@ +appse+JBoss EAP 7.1 +mavmo+4.0.0 +mavgr+it.ramecera.ict +mavbu+ +mavcp+2.3.2 +mavwa+2.1.1 +mavcl+2.3 +mv+0.0.1-SNAPSHOT +depen+4 +pompr+0 +mavco+1.8 +jeev+6.0 +sv+4.3.12.RELEASE +log4j+2.5 +hv+5.1.0.Final+hjpav+2 +sreso+ +defaulan+en \ No newline at end of file diff --git a/screwdriver-3.5.6/box/include/primary_JBoss EAP 7.1_uv_s4.eli b/screwdriver-3.5.6/box/include/primary_JBoss EAP 7.1_uv_s4.eli new file mode 100644 index 0000000..2eed1b8 --- /dev/null +++ b/screwdriver-3.5.6/box/include/primary_JBoss EAP 7.1_uv_s4.eli @@ -0,0 +1,11 @@ +appse+JBoss EAP 7.1 +mavgr+it.ramecera.ict +mv+0.0.1-SNAPSHOT +depen+4 +pompr+0 +mavco+1.8 +jeev+6.0 +sv+4.3.12.RELEASE +uv+3.1.4.RELEASE +sreso+ +defaulan+en \ No newline at end of file diff --git a/screwdriver-3.5.6/box/include/primary_JBoss EAP 7.1_uv_s4_h5_jpa2.eli b/screwdriver-3.5.6/box/include/primary_JBoss EAP 7.1_uv_s4_h5_jpa2.eli new file mode 100644 index 0000000..83af47a --- /dev/null +++ b/screwdriver-3.5.6/box/include/primary_JBoss EAP 7.1_uv_s4_h5_jpa2.eli @@ -0,0 +1,19 @@ +appse+JBoss EAP 7.1 +mavmo+4.0.0 +mavgr+it.ramecera.ict +mavbu+ +mavcp+2.3.2 +mavwa+2.1.1 +mavcl+2.3 +mv+0.0.1-SNAPSHOT +depen+4 +pompr+0 +mavco+1.8 +jeev+6.0 +sv+4.3.12.RELEASE +log4j+2.5 +hv+5.1.0.Final+hjpav+2 +uv+3.1.4.RELEASE +sreso+ +defaulan+en +charset+UTF-8 diff --git a/screwdriver-3.5.6/box/include/primary_Tomcat 7.0.eli b/screwdriver-3.5.6/box/include/primary_Tomcat 7.0.eli new file mode 100644 index 0000000..f54ecdc --- /dev/null +++ b/screwdriver-3.5.6/box/include/primary_Tomcat 7.0.eli @@ -0,0 +1,8 @@ +appse+Tomcat 7.0 +sv+3.1.0.RELEASE +mavmo+4.0.0 +mavgr+it.ipzs +mv+0.0.1-SNAPSHOT +mavco+1.7 +sreso+ +defaulan+en \ No newline at end of file diff --git a/screwdriver-3.5.6/box/include/primary_Tomcat 7.0.uv.eli b/screwdriver-3.5.6/box/include/primary_Tomcat 7.0.uv.eli new file mode 100644 index 0000000..92b262c --- /dev/null +++ b/screwdriver-3.5.6/box/include/primary_Tomcat 7.0.uv.eli @@ -0,0 +1,12 @@ +appse+Tomcat 7.0 +sv+3.1.0.RELEASE +uv+3.1.4.RELEASE +mavmo+4.0.0 +mavgr+it.ipzs +mv+0.0.1-SNAPSHOT +mavco+1.7 +htv+3.4 +depen+2 +hvalid+4.2.0.Final +sreso+ +defaulan+en \ No newline at end of file diff --git a/screwdriver-3.5.6/box/include/userpass_domain.eli b/screwdriver-3.5.6/box/include/userpass_domain.eli new file mode 100644 index 0000000..e21d116 --- /dev/null +++ b/screwdriver-3.5.6/box/include/userpass_domain.eli @@ -0,0 +1 @@ +colorform+rgb(254, 231, 234) diff --git a/screwdriver-3.5.6/box/include/userpass_simple.eli b/screwdriver-3.5.6/box/include/userpass_simple.eli new file mode 100644 index 0000000..e21d116 --- /dev/null +++ b/screwdriver-3.5.6/box/include/userpass_simple.eli @@ -0,0 +1 @@ +colorform+rgb(254, 231, 234) diff --git a/screwdriver-3.5.6/box/include/userpass_trivial.eli b/screwdriver-3.5.6/box/include/userpass_trivial.eli new file mode 100644 index 0000000..e21d116 --- /dev/null +++ b/screwdriver-3.5.6/box/include/userpass_trivial.eli @@ -0,0 +1 @@ +colorform+rgb(254, 231, 234) diff --git a/screwdriver-3.5.6/box/snippets/ViewResolver.txt b/screwdriver-3.5.6/box/snippets/ViewResolver.txt new file mode 100644 index 0000000..158b5d0 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/ViewResolver.txt @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/screwdriver-3.5.6/box/snippets/antisamyDepen.txt b/screwdriver-3.5.6/box/snippets/antisamyDepen.txt new file mode 100644 index 0000000..960881d --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/antisamyDepen.txt @@ -0,0 +1,16 @@ + + + org.owasp.antisamy + antisamy + 1.5.3 + + + xml-apis-ext + xml-apis + + + xml-apis + xml-apis + + + diff --git a/screwdriver-3.5.6/box/snippets/cancella_extpr.txt b/screwdriver-3.5.6/box/snippets/cancella_extpr.txt new file mode 100644 index 0000000..216c287 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/cancella_extpr.txt @@ -0,0 +1,12 @@ + + + + screw_list_A + + + + + + + \ No newline at end of file diff --git a/screwdriver-3.5.6/box/snippets/cancella_hv_3.txt b/screwdriver-3.5.6/box/snippets/cancella_hv_3.txt new file mode 100644 index 0000000..7594cd8 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/cancella_hv_3.txt @@ -0,0 +1,33 @@ + + + + + org.hibernate + hibernate-core + 3.3.2.GA + compile + + + org.hibernate + hibernate-annotations + 3.4.0.GA + compile + + + org.hibernate + hibernate-commons-annotations + 3.1.0.GA + compile + + + org.hibernate + hibernate-validator + 3.1.0.GA + compile + + + org.hibernate + hibernate-tools + 3.2.3.GA + compile + \ No newline at end of file diff --git a/screwdriver-3.5.6/box/snippets/corpoDispatcherTiles_2.txt b/screwdriver-3.5.6/box/snippets/corpoDispatcherTiles_2.txt new file mode 100644 index 0000000..dbccd38 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/corpoDispatcherTiles_2.txt @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/screwdriver-3.5.6/box/snippets/corpoDispatcherTiles_3.txt b/screwdriver-3.5.6/box/snippets/corpoDispatcherTiles_3.txt new file mode 100644 index 0000000..9a6b951 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/corpoDispatcherTiles_3.txt @@ -0,0 +1,10 @@ + + + + + + + \ No newline at end of file diff --git a/screwdriver-3.5.6/box/snippets/css/bootstrap.css b/screwdriver-3.5.6/box/snippets/css/bootstrap.css new file mode 100644 index 0000000..c70f1c8 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/css/bootstrap.css @@ -0,0 +1,3277 @@ +/*! + * Bootstrap v2.0.1 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ +.clearfix { + *zoom: 1; +} + +.clearfix:before, .clearfix:after { + display: table; + content: ""; +} + +.clearfix:after { + clear: both; +} + +article, aside, details, figcaption, figure, footer, header, hgroup, nav, + section { + display: block; +} + +audio, canvas, video { + display: inline-block; + *display: inline; + *zoom: 1; +} + +audio:not ([controls] ) { + display: none; +} + +html { + font-size: 100%; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} + +a:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +a:hover, a:active { + outline: 0; +} + +sub, sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +img { + max-width: 100%; + height: auto; + border: 0; + -ms-interpolation-mode: bicubic; +} + +button, input, select, textarea { + margin: 0; + font-size: 100%; + vertical-align: middle; +} + +button, input { + *overflow: visible; + line-height: normal; +} + +button::-moz-focus-inner, input::-moz-focus-inner { + padding: 0; + border: 0; +} + +button, input[type="button"], input[type="reset"], input[type="submit"] + { + cursor: pointer; + -webkit-appearance: button; +} + +input[type="search"] { + -webkit-appearance: textfield; + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; +} + +input[type="search"]::-webkit-search-decoration, input[type="search"]::-webkit-search-cancel-button + { + -webkit-appearance: none; +} + +textarea { + overflow: auto; + vertical-align: top; +} + +body { + margin: 0; + font-family: "Verdana"; + font-size: 18px; + line-height: 32px; + color: #333333; + background-color: #ffffff; +} + +a { + color: yellow; + text-decoration: none; +} + +a:hover { + color: red; + text-decoration: underline; +} + +.row { + margin-left: -20px; + *zoom: 1; +} + +.row:before, .row:after { + display: table; + content: ""; +} + +.row:after { + clear: both; +} + +[class*="span"] { + float: left; + margin-left: 20px; +} + +.span1 { + width: 60px; +} + +.span2 { + width: 140px; +} + +.span3 { + width: 220px; +} + +.span4 { + width: 300px; +} + +.span5 { + width: 380px; +} + +.span6 { + width: 460px; +} + +.span7 { + width: 540px; +} + +.span8 { + width: 620px; +} + +.span9 { + width: 700px; +} + +.span10 { + width: 780px; +} + +.span11 { + width: 860px; +} + +.span12, .container { + width: 940px; +} + +.offset1 { + margin-left: 100px; +} + +.offset2 { + margin-left: 180px; +} + +.offset3 { + margin-left: 260px; +} + +.offset4 { + margin-left: 340px; +} + +.offset5 { + margin-left: 420px; +} + +.offset6 { + margin-left: 500px; +} + +.offset7 { + margin-left: 580px; +} + +.offset8 { + margin-left: 660px; +} + +.offset9 { + margin-left: 740px; +} + +.offset10 { + margin-left: 820px; +} + +.offset11 { + margin-left: 900px; +} + +.row-fluid { + width: 100%; + *zoom: 1; +} + +.row-fluid:before, .row-fluid:after { + display: table; + content: ""; +} + +.row-fluid:after { + clear: both; +} + +.row-fluid>[class*="span"] { + float: left; + margin-left: 2.127659574%; +} + +.row-fluid>[class*="span"]:first-child { + margin-left: 0; +} + +.row-fluid>.span1 { + width: 6.382978723%; +} + +.row-fluid>.span2 { + width: 14.89361702%; +} + +.row-fluid>.span3 { + width: 23.404255317%; +} + +.row-fluid>.span4 { + width: 31.914893614%; +} + +.row-fluid>.span5 { + width: 40.425531911%; +} + +.row-fluid>.span6 { + width: 48.93617020799999%; +} + +.row-fluid>.span7 { + width: 57.446808505%; +} + +.row-fluid>.span8 { + width: 65.95744680199999%; +} + +.row-fluid>.span9 { + width: 74.468085099%; +} + +.row-fluid>.span10 { + width: 82.97872339599999%; +} + +.row-fluid>.span11 { + width: 91.489361693%; +} + +.row-fluid>.span12 { + width: 99.99999998999999%; +} + +.container { + width: 940px; + margin-left: auto; + margin-right: auto; + *zoom: 1; +} + +.container:before, .container:after { + display: table; + content: ""; +} + +.container:after { + clear: both; +} + +.container-fluid { + padding-left: 20px; + padding-right: 20px; + *zoom: 1; +} + +.container-fluid:before, .container-fluid:after { + display: table; + content: ""; +} + +.container-fluid:after { + clear: both; +} + +p { + margin: 0 0 9px; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 13px; + line-height: 18px; +} + +p small { + font-size: 11px; + color: #999999; +} + +.lead { + margin-bottom: 18px; + font-size: 20px; + font-weight: 200; + line-height: 27px; +} + +h1, h2, h3, h4, h5, h6 { + margin: 1px; + font-weight: bold; + color: #333333; + text-rendering: optimizelegibility; +} + +h1 small, h2 small, h3 small, h4 small, h5 small, h6 small { + font-weight: normal; + color: #999999; +} + +h1 { + font-size: 30px; + line-height: 36px; +} + +h1 small { + font-size: 18px; +} + +h2 { + font-size: 24px; + line-height: 36px; +} + +h2 small { + font-size: 18px; +} + +h3 { + line-height: 27px; + font-size: 18px; +} + +h3 small { + font-size: 14px; +} + +h4, h5, h6 { + line-height: 18px; +} + +h4 { + font-size: 14px; +} + +h4 small { + font-size: 12px; +} + +h5 { + font-size: 12px; +} + +h6 { + font-size: 11px; + color: #999999; + text-transform: uppercase; +} + +.page-header { + padding-bottom: 17px; + margin: 18px 0; + border-bottom: 1px solid #eeeeee; +} + +.page-header h1 { + line-height: 1; +} + +ul, ol { + padding: 0; + margin: 0 0 9px 25px; +} + +ul ul, ul ol, ol ol, ol ul { + margin-bottom: 0; +} + +ul { + list-style: disc; +} + +ol { + list-style: decimal; +} + +li { + line-height: 24px; +} + +ul.unstyled, ol.unstyled { + margin-left: 0; + list-style: none; +} + +dl { + margin-bottom: 18px; +} + +dt, dd { + line-height: 18px; +} + +dt { + font-weight: bold; +} + +dd { + margin-left: 9px; +} + +hr { + margin: 18px 0; + border: 0; + border-top: 1px solid #eeeeee; + border-bottom: 1px solid #ffffff; +} + +strong { + font-weight: bold; +} + +em { + font-style: italic; +} + +.muted { + color: #999999; +} + +abbr { + font-size: 90%; + text-transform: uppercase; + border-bottom: 1px dotted #ddd; + cursor: help; +} + +blockquote { + padding: 0 0 0 15px; + margin: 0 0 18px; + border-left: 5px solid #eeeeee; +} + +blockquote p { + margin-bottom: 0; + font-size: 16px; + font-weight: 300; + line-height: 22.5px; +} + +blockquote small { + display: block; + line-height: 18px; + color: #999999; +} + +blockquote small:before { + content: '\2014 \00A0'; +} + +blockquote.pull-right { + float: right; + padding-left: 0; + padding-right: 15px; + border-left: 0; + border-right: 5px solid #eeeeee; +} + +blockquote.pull-right p, blockquote.pull-right small { + text-align: right; +} + +q:before, q:after, blockquote:before, blockquote:after { + content: ""; +} + +address { + display: block; + margin-bottom: 18px; + line-height: 18px; + font-style: normal; +} + +small { + font-size: 100%; +} + +cite { + font-style: normal; +} + +code, pre { + padding: 0 3px 2px; + font-family: Menlo, Monaco, "Courier New", monospace; + font-size: 12px; + color: #333333; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +code { + padding: 3px 4px; + color: #d14; + background-color: #f7f7f9; + border: 1px solid #e1e1e8; +} + +pre { + display: block; + padding: 8.5px; + margin: 0 0 9px; + font-size: 12px; + line-height: 18px; + background-color: #f5f5f5; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.15); + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + white-space: pre; + white-space: pre-wrap; + word-break: break-all; + word-wrap: break-word; +} + +pre.prettyprint { + margin-bottom: 18px; +} + +pre code { + padding: 0; + color: inherit; + background-color: transparent; + border: 0; +} + +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} + +.label { + padding: 2px 4px 3px; + font-size: 11.049999999999999px; + font-weight: bold; + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #999999; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +.label:hover { + color: #ffffff; + text-decoration: none; +} + +.label-important { + background-color: #b94a48; +} + +.label-important:hover { + background-color: #953b39; +} + +.label-warning { + background-color: #f89406; +} + +.label-warning:hover { + background-color: #c67605; +} + +.label-success { + background-color: #468847; +} + +.label-success:hover { + background-color: #356635; +} + +.label-info { + background-color: #3a87ad; +} + +.label-info:hover { + background-color: #2d6987; +} + +table { + max-width: 100%; + border-collapse: collapse; + border-spacing: 0; +} + +.table { + width: 100%; + margin-bottom: 18px; +} + +.table th, .table td { + padding: 8px; + line-height: 18px; + text-align: left; + vertical-align: top; + border-top: 1px solid #ddd; +} + +.table th { + font-weight: bold; +} + +.table thead th { + vertical-align: bottom; +} + +.table thead:first-child tr th, .table thead:first-child tr td { + border-top: 0; +} + +.table tbody+tbody { + border-top: 2px solid #ddd; +} + +.table-condensed th, .table-condensed td { + padding: 4px 5px; +} + +.table-bordered { + border: 1px solid #ddd; + border-collapse: separate; + *border-collapse: collapsed; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.table-bordered th+th, .table-bordered td+td, .table-bordered th+td, + .table-bordered td+th { + border-left: 1px solid #ddd; +} + +.table-bordered thead:first-child tr:first-child th, .table-bordered tbody:first-child tr:first-child th, + .table-bordered tbody:first-child tr:first-child td { + border-top: 0; +} + +.table-bordered thead:first-child tr:first-child th:first-child, + .table-bordered tbody:first-child tr:first-child td:first-child { + -webkit-border-radius: 4px 0 0 0; + -moz-border-radius: 4px 0 0 0; + border-radius: 4px 0 0 0; +} + +.table-bordered thead:first-child tr:first-child th:last-child, + .table-bordered tbody:first-child tr:first-child td:last-child { + -webkit-border-radius: 0 4px 0 0; + -moz-border-radius: 0 4px 0 0; + border-radius: 0 4px 0 0; +} + +.table-bordered thead:last-child tr:last-child th:first-child, + .table-bordered tbody:last-child tr:last-child td:first-child { + -webkit-border-radius: 0 0 0 4px; + -moz-border-radius: 0 0 0 4px; + border-radius: 0 0 0 4px; +} + +.table-bordered thead:last-child tr:last-child th:last-child, + .table-bordered tbody:last-child tr:last-child td:last-child { + -webkit-border-radius: 0 0 4px 0; + -moz-border-radius: 0 0 4px 0; + border-radius: 0 0 4px 0; +} + +.table-striped tbody tr:nth-child(odd) td, .table-striped tbody tr:nth-child(odd) th + { + background-color: #f9f9f9; +} + +.table tbody tr:hover td, .table tbody tr:hover th { + background-color: #f5f5f5; +} + +table .span1 { + float: none; + width: 44px; + margin-left: 0; +} + +table .span2 { + float: none; + width: 124px; + margin-left: 0; +} + +table .span3 { + float: none; + width: 204px; + margin-left: 0; +} + +table .span4 { + float: none; + width: 284px; + margin-left: 0; +} + +table .span5 { + float: none; + width: 364px; + margin-left: 0; +} + +table .span6 { + float: none; + width: 444px; + margin-left: 0; +} + +table .span7 { + float: none; + width: 524px; + margin-left: 0; +} + +table .span8 { + float: none; + width: 604px; + margin-left: 0; +} + +table .span9 { + float: none; + width: 684px; + margin-left: 0; +} + +table .span10 { + float: none; + width: 764px; + margin-left: 0; +} + +table .span11 { + float: none; + width: 844px; + margin-left: 0; +} + +table .span12 { + float: none; + width: 924px; + margin-left: 0; +} + +form { + margin: 0 0 18px; +} + +fieldset { + padding: 0; + margin: 0; + border: 0; +} + +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 27px; + font-size: 19.5px; + line-height: 36px; + color: #333333; + border: 0; + border-bottom: 1px solid #eee; +} + +legend small { + font-size: 13.5px; + color: #999999; +} + +label, input, button, select, textarea { + font-size: 13px; + font-weight: normal; + line-height: 18px; +} + +input, button, select, textarea { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; +} + +label { + display: block; + margin-bottom: 5px; + color: #333333; +} + +input, textarea, select, .uneditable-input { + display: inline-block; + width: 210px; + height: 22px; + padding: 4px; + margin-bottom: 9px; + font-size: 13px; + line-height: 18px; + color: #555555; + border: 1px solid #ccc; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +.uneditable-textarea { + width: auto; + height: auto; +} + +label input, label textarea, label select { + display: block; +} + +input[type="image"], input[type="checkbox"], input[type="radio"] { + width: auto; + height: auto; + padding: 0; + margin: 3px 0; + *margin-top: 0; + /* IE7 */ + line-height: normal; + cursor: pointer; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + border: 0 \9; + /* IE9 and down */ +} + +input[type="image"] { + border: 0; +} + +input[type="file"] { + width: auto; + padding: initial; + line-height: initial; + border: initial; + background-color: #ffffff; + background-color: initial; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} + +input[type="button"], input[type="reset"], input[type="submit"] { + width: auto; + height: auto; +} + +select, input[type="file"] { + height: 28px; + /* In IE7, the height of the select element cannot be changed by height, only font-size */ + *margin-top: 4px; + /* For IE7, add top margin to align select with labels */ + line-height: 28px; +} + +input[type="file"] { + line-height: 18px \9; +} + +select { + width: 220px; + background-color: #ffffff; +} + +select[multiple], select[size] { + height: auto; +} + +input[type="image"] { + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} + +textarea { + height: auto; +} + +input[type="hidden"] { + display: none; +} + +.radio, .checkbox { + padding-left: 18px; +} + +.radio input[type="radio"], .checkbox input[type="checkbox"] { + float: left; + margin-left: -18px; +} + +.controls>.radio:first-child, .controls>.checkbox:first-child { + padding-top: 5px; +} + +.radio.inline, .checkbox.inline { + display: inline-block; + padding-top: 5px; + margin-bottom: 0; + vertical-align: middle; +} + +.radio.inline+.radio.inline, .checkbox.inline+.checkbox.inline { + margin-left: 10px; +} + +input, textarea { + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -webkit-transition: border linear 0.2s, box-shadow linear 0.2s; + -moz-transition: border linear 0.2s, box-shadow linear 0.2s; + -ms-transition: border linear 0.2s, box-shadow linear 0.2s; + -o-transition: border linear 0.2s, box-shadow linear 0.2s; + transition: border linear 0.2s, box-shadow linear 0.2s; +} + +input:focus, textarea:focus { + border-color: rgba(82, 168, 236, 0.8); + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px + rgba(82, 168, 236, 0.6); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px + rgba(82, 168, 236, 0.6); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px + rgba(82, 168, 236, 0.6); + outline: 0; + outline: thin dotted \9; + /* IE6-9 */ +} + +input[type="file"]:focus, input[type="radio"]:focus, input[type="checkbox"]:focus, + select:focus { + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +.input-mini { + width: 60px; +} + +.input-small { + width: 90px; +} + +.input-medium { + width: 150px; +} + +.input-large { + width: 210px; +} + +.input-xlarge { + width: 270px; +} + +.input-xxlarge { + width: 530px; +} + +input[class*="span"], select[class*="span"], textarea[class*="span"], + .uneditable-input { + float: none; + margin-left: 0; +} + +input.span1, textarea.span1, .uneditable-input.span1 { + width: 50px; +} + +input.span2, textarea.span2, .uneditable-input.span2 { + width: 130px; +} + +input.span3, textarea.span3, .uneditable-input.span3 { + width: 210px; +} + +input.span4, textarea.span4, .uneditable-input.span4 { + width: 290px; +} + +input.span5, textarea.span5, .uneditable-input.span5 { + width: 370px; +} + +input.span6, textarea.span6, .uneditable-input.span6 { + width: 450px; +} + +input.span7, textarea.span7, .uneditable-input.span7 { + width: 530px; +} + +input.span8, textarea.span8, .uneditable-input.span8 { + width: 610px; +} + +input.span9, textarea.span9, .uneditable-input.span9 { + width: 690px; +} + +input.span10, textarea.span10, .uneditable-input.span10 { + width: 770px; +} + +input.span11, textarea.span11, .uneditable-input.span11 { + width: 850px; +} + +input.span12, textarea.span12, .uneditable-input.span12 { + width: 930px; +} + +input[disabled], select[disabled], textarea[disabled], input[readonly], + select[readonly], textarea[readonly] { + background-color: #f5f5f5; + border-color: #ddd; + cursor: not-allowed; +} + +.control-group.warning>label, .control-group.warning .help-block, + .control-group.warning .help-inline { + color: #c09853; +} + +.control-group.warning input, .control-group.warning select, + .control-group.warning textarea { + color: #c09853; + border-color: #c09853; +} + +.control-group.warning input:focus, .control-group.warning select:focus, + .control-group.warning textarea:focus { + border-color: #a47e3c; + -webkit-box-shadow: 0 0 6px #dbc59e; + -moz-box-shadow: 0 0 6px #dbc59e; + box-shadow: 0 0 6px #dbc59e; +} + +.control-group.warning .input-prepend .add-on, .control-group.warning .input-append .add-on + { + color: #c09853; + background-color: #fcf8e3; + border-color: #c09853; +} + +.control-group.error>label, .control-group.error .help-block, + .control-group.error .help-inline { + color: #b94a48; +} + +.control-group.error input, .control-group.error select, .control-group.error textarea + { + color: #b94a48; + border-color: #b94a48; +} + +.control-group.error input:focus, .control-group.error select:focus, + .control-group.error textarea:focus { + border-color: #953b39; + -webkit-box-shadow: 0 0 6px #d59392; + -moz-box-shadow: 0 0 6px #d59392; + box-shadow: 0 0 6px #d59392; +} + +.control-group.error .input-prepend .add-on, .control-group.error .input-append .add-on + { + color: #b94a48; + background-color: #f2dede; + border-color: #b94a48; +} + +.control-group.success>label, .control-group.success .help-block, + .control-group.success .help-inline { + color: #468847; +} + +.control-group.success input, .control-group.success select, + .control-group.success textarea { + color: #468847; + border-color: #468847; +} + +.control-group.success input:focus, .control-group.success select:focus, + .control-group.success textarea:focus { + border-color: #356635; + -webkit-box-shadow: 0 0 6px #7aba7b; + -moz-box-shadow: 0 0 6px #7aba7b; + box-shadow: 0 0 6px #7aba7b; +} + +.control-group.success .input-prepend .add-on, .control-group.success .input-append .add-on + { + color: #468847; + background-color: #dff0d8; + border-color: #468847; +} + +input:focus:required:invalid, textarea:focus:required:invalid, select:focus:required:invalid + { + color: #b94a48; + border-color: #ee5f5b; +} + +input:focus:required:invalid:focus, textarea:focus:required:invalid:focus, + select:focus:required:invalid:focus { + border-color: #e9322d; + -webkit-box-shadow: 0 0 6px #f8b9b7; + -moz-box-shadow: 0 0 6px #f8b9b7; + box-shadow: 0 0 6px #f8b9b7; +} + +.form-actions { + padding: 17px 20px 18px; + margin-top: 18px; + margin-bottom: 18px; + background-color: +backformaction+; + border-top: 1px solid #ddd; +} + +.uneditable-input { + display: block; + background-color: #ffffff; + border-color: #eee; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + cursor: not-allowed; +} + +:-moz-placeholder { + color: #999999; +} + +::-webkit-input-placeholder { + color: #999999; +} + +.help-block { + display: block; + margin-top: 5px; + margin-bottom: 0; + color: #999999; +} + +.help-inline { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + *zoom: 1; + margin-bottom: 9px; + vertical-align: middle; + padding-left: 5px; +} + +.input-prepend, .input-append { + margin-bottom: 5px; + *zoom: 1; +} + +.input-prepend:before, .input-append:before, .input-prepend:after, + .input-append:after { + display: table; + content: ""; +} + +.input-prepend:after, .input-append:after { + clear: both; +} + +.input-prepend input, .input-append input, .input-prepend .uneditable-input, + .input-append .uneditable-input { + -webkit-border-radius: 0 3px 3px 0; + -moz-border-radius: 0 3px 3px 0; + border-radius: 0 3px 3px 0; +} + +.input-prepend input:focus, .input-append input:focus, .input-prepend .uneditable-input:focus, + .input-append .uneditable-input:focus { + position: relative; + z-index: 2; +} + +.input-prepend .uneditable-input, .input-append .uneditable-input { + border-left-color: #ccc; +} + +.input-prepend .add-on, .input-append .add-on { + float: left; + display: block; + width: auto; + min-width: 16px; + height: 18px; + margin-right: -1px; + padding: 4px 5px; + font-weight: normal; + line-height: 18px; + color: #999999; + text-align: center; + text-shadow: 0 1px 0 #ffffff; + background-color: #f5f5f5; + border: 1px solid #ccc; + -webkit-border-radius: 3px 0 0 3px; + -moz-border-radius: 3px 0 0 3px; + border-radius: 3px 0 0 3px; +} + +.input-prepend .active, .input-append .active { + background-color: #a9dba9; + border-color: #46a546; +} + +.input-prepend .add-on { + *margin-top: 1px; + /* IE6-7 */ +} + +.input-append input, .input-append .uneditable-input { + float: left; + -webkit-border-radius: 3px 0 0 3px; + -moz-border-radius: 3px 0 0 3px; + border-radius: 3px 0 0 3px; +} + +.input-append .uneditable-input { + border-left-color: #eee; + border-right-color: #ccc; +} + +.input-append .add-on { + margin-right: 0; + margin-left: -1px; + -webkit-border-radius: 0 3px 3px 0; + -moz-border-radius: 0 3px 3px 0; + border-radius: 0 3px 3px 0; +} + +.input-append input:first-child { + *margin-left: -160px; +} + +.input-append input:first-child+.add-on { + *margin-left: -21px; +} + +.search-query { + padding-left: 14px; + padding-right: 14px; + margin-bottom: 0; + -webkit-border-radius: 14px; + -moz-border-radius: 14px; + border-radius: 14px; +} + +.form-search input, .form-inline input, .form-horizontal input, + .form-search textarea, .form-inline textarea, .form-horizontal textarea, + .form-search select, .form-inline select, .form-horizontal select, + .form-search .help-inline, .form-inline .help-inline, .form-horizontal .help-inline, + .form-search .uneditable-input, .form-inline .uneditable-input, + .form-horizontal .uneditable-input { + display: inline-block; + margin-bottom: 0; +} + +.form-search .hide, .form-inline .hide, .form-horizontal .hide { + display: none; +} + +.form-search label, .form-inline label, .form-search .input-append, + .form-inline .input-append, .form-search .input-prepend, .form-inline .input-prepend + { + display: inline-block; +} + +.form-search .input-append .add-on, .form-inline .input-prepend .add-on, + .form-search .input-append .add-on, .form-inline .input-prepend .add-on + { + vertical-align: middle; +} + +.form-search .radio, .form-inline .radio, .form-search .checkbox, + .form-inline .checkbox { + margin-bottom: 0; + vertical-align: middle; +} + +.control-group { + margin-bottom: 9px; +} + +legend+.control-group { + margin-top: 18px; + -webkit-margin-top-collapse: separate; +} + +.form-horizontal .control-group { + margin-bottom: 18px; + *zoom: 1; +} + +.form-horizontal .control-group:before, .form-horizontal .control-group:after + { + display: table; + content: ""; +} + +.form-horizontal .control-group:after { + clear: both; +} + +.form-horizontal .control-label { + float: left; + width: 140px; + padding-top: 5px; + text-align: right; +} + +.form-horizontal .controls { + margin-left: 160px; +} + +.form-horizontal .form-actions { + padding-left: 160px; +} + +.btn { + display: inline-block; + padding: 4px 10px 4px; + margin-bottom: 0; + font-size: 13px; + line-height: 18px; + color: #333333; + text-align: center; + text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); + vertical-align: middle; + background-color: #f5f5f5; + background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -ms-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), + to(#e6e6e6)); + background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -o-linear-gradient(top, #ffffff, #e6e6e6); + background-image: linear-gradient(top, #ffffff, #e6e6e6); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', + endColorstr='#e6e6e6', GradientType=0); + border-color: #e6e6e6 #e6e6e6 #bfbfbf; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(enabled= false); + border: 1px solid #ccc; + border-bottom-color: #bbb; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px + rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px + rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px + rgba(0, 0, 0, 0.05); + cursor: pointer; + filter: progid:DXImageTransform.Microsoft.gradient(enabled= false); + *margin-left: .3em; +} + +.btn:hover, .btn:active, .btn.active, .btn.disabled, .btn[disabled] { + background-color: #e6e6e6; +} + +.btn:active, .btn.active { + background-color: #cccccc \9; +} + +.btn:first-child { + *margin-left: 0; +} + +.btn:hover { + color: #333333; + text-decoration: none; + background-color: #e6e6e6; + background-position: 0 -15px; + -webkit-transition: background-position 0.1s linear; + -moz-transition: background-position 0.1s linear; + -ms-transition: background-position 0.1s linear; + -o-transition: background-position 0.1s linear; + transition: background-position 0.1s linear; +} + +.btn:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +.btn.active, .btn:active { + background-image: none; + -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px + rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px + rgba(0, 0, 0, 0.05); + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px + rgba(0, 0, 0, 0.05); + background-color: #e6e6e6; + background-color: #d9d9d9 \9; + outline: 0; +} + +.btn.disabled, .btn[disabled] { + cursor: default; + background-image: none; + background-color: #e6e6e6; + opacity: 0.65; + filter: alpha(opacity = 65); + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} + +.btn-large { + padding: 9px 14px; + font-size: 15px; + line-height: normal; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} + +.btn-large [class^="icon-"] { + margin-top: 1px; +} + +.btn-small { + padding: 5px 9px; + font-size: 11px; + line-height: 16px; +} + +.btn-small [class^="icon-"] { + margin-top: -1px; +} + +.btn-mini { + padding: 2px 6px; + font-size: 11px; + line-height: 14px; +} + +.btn-primary, .btn-primary:hover, .btn-warning, .btn-warning:hover, + .btn-danger, .btn-danger:hover, .btn-success, .btn-success:hover, + .btn-info, .btn-info:hover, .btn-inverse, .btn-inverse:hover { + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + color: #ffffff; +} + +.btn-primary.active, .btn-warning.active, .btn-danger.active, + .btn-success.active, .btn-info.active, .btn-dark.active { + color: rgba(255, 255, 255, 0.75); +} + +.btn-primary { + background-color: #006dcc; + background-image: -moz-linear-gradient(top, #0088cc, #0044cc); + background-image: -ms-linear-gradient(top, #0088cc, #0044cc); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), + to(#0044cc)); + background-image: -webkit-linear-gradient(top, #0088cc, #0044cc); + background-image: -o-linear-gradient(top, #0088cc, #0044cc); + background-image: linear-gradient(top, #0088cc, #0044cc); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', + endColorstr='#0044cc', GradientType=0); + border-color: #0044cc #0044cc #002a80; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(enabled= false); +} + +.btn-primary:hover, .btn-primary:active, .btn-primary.active, + .btn-primary.disabled, .btn-primary[disabled] { + background-color: #0044cc; +} + +.btn-primary:active, .btn-primary.active { + background-color: #003399 \9; +} + +.btn-warning { + background-color: #faa732; + background-image: -moz-linear-gradient(top, #fbb450, #f89406); + background-image: -ms-linear-gradient(top, #fbb450, #f89406); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), + to(#f89406)); + background-image: -webkit-linear-gradient(top, #fbb450, #f89406); + background-image: -o-linear-gradient(top, #fbb450, #f89406); + background-image: linear-gradient(top, #fbb450, #f89406); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fbb450', + endColorstr='#f89406', GradientType=0); + border-color: #f89406 #f89406 #ad6704; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(enabled= false); +} + +.btn-warning:hover, .btn-warning:active, .btn-warning.active, + .btn-warning.disabled, .btn-warning[disabled] { + background-color: #f89406; +} + +.btn-warning:active, .btn-warning.active { + background-color: #c67605 \9; +} + +.btn-danger { + background-color: #da4f49; + background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f); + background-image: -ms-linear-gradient(top, #ee5f5b, #bd362f); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), + to(#bd362f)); + background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f); + background-image: -o-linear-gradient(top, #ee5f5b, #bd362f); + background-image: linear-gradient(top, #ee5f5b, #bd362f); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', + endColorstr='#bd362f', GradientType=0); + border-color: #bd362f #bd362f #802420; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(enabled= false); +} + +.btn-danger:hover, .btn-danger:active, .btn-danger.active, .btn-danger.disabled, + .btn-danger[disabled] { + background-color: #bd362f; +} + +.btn-danger:active, .btn-danger.active { + background-color: #942a25 \9; +} + +.btn-success { + background-color: #5bb75b; + background-image: -moz-linear-gradient(top, #62c462, #51a351); + background-image: -ms-linear-gradient(top, #62c462, #51a351); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), + to(#51a351)); + background-image: -webkit-linear-gradient(top, #62c462, #51a351); + background-image: -o-linear-gradient(top, #62c462, #51a351); + background-image: linear-gradient(top, #62c462, #51a351); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', + endColorstr='#51a351', GradientType=0); + border-color: #51a351 #51a351 #387038; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(enabled= false); +} + +.btn-success:hover, .btn-success:active, .btn-success.active, + .btn-success.disabled, .btn-success[disabled] { + background-color: #51a351; +} + +.btn-success:active, .btn-success.active { + background-color: #408140 \9; +} + +.btn-info { + background-color: #49afcd; + background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4); + background-image: -ms-linear-gradient(top, #5bc0de, #2f96b4); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), + to(#2f96b4)); + background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4); + background-image: -o-linear-gradient(top, #5bc0de, #2f96b4); + background-image: linear-gradient(top, #5bc0de, #2f96b4); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', + endColorstr='#2f96b4', GradientType=0); + border-color: #2f96b4 #2f96b4 #1f6377; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(enabled= false); +} + +.btn-info:hover, .btn-info:active, .btn-info.active, .btn-info.disabled, + .btn-info[disabled] { + background-color: #2f96b4; +} + +.btn-info:active, .btn-info.active { + background-color: #24748c \9; +} + +.btn-inverse { + background-color: #393939; + background-image: -moz-linear-gradient(top, #454545, #262626); + background-image: -ms-linear-gradient(top, #454545, #262626); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#454545), + to(#262626)); + background-image: -webkit-linear-gradient(top, #454545, #262626); + background-image: -o-linear-gradient(top, #454545, #262626); + background-image: linear-gradient(top, #454545, #262626); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#454545', + endColorstr='#262626', GradientType=0); + border-color: #262626 #262626 #000000; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(enabled= false); +} + +.btn-inverse:hover, .btn-inverse:active, .btn-inverse.active, + .btn-inverse.disabled, .btn-inverse[disabled] { + background-color: #262626; +} + +.btn-inverse:active, .btn-inverse.active { + background-color: #0c0c0c \9; +} + +button.btn, input[type="submit"].btn { + *padding-top: 2px; + *padding-bottom: 2px; +} + +button.btn::-moz-focus-inner, input[type="submit"].btn::-moz-focus-inner + { + padding: 0; + border: 0; +} + +button.btn.large, input[type="submit"].btn.large { + *padding-top: 7px; + *padding-bottom: 7px; +} + +button.btn.small, input[type="submit"].btn.small { + *padding-top: 3px; + *padding-bottom: 3px; +} + +[class^="icon-"], [class*=" icon-"] { + display: inline-block; + width: 14px; + height: 14px; + line-height: 14px; + vertical-align: text-top; + background-image: url("../img/glyphicons-halflings.png"); + background-position: 14px 14px; + background-repeat: no-repeat; + *margin-right: .3em; +} + +[class^="icon-"]:last-child, [class*=" icon-"]:last-child { + *margin-left: 0; +} + +.icon-white { + background-image: url("../img/glyphicons-halflings-white.png"); +} + +.icon-glass { + background-position: 0 0; +} + +.icon-music { + background-position: -24px 0; +} + +.icon-search { + background-position: -48px 0; +} + +.icon-envelope { + background-position: -72px 0; +} + +.icon-heart { + background-position: -96px 0; +} + +.icon-star { + background-position: -120px 0; +} + +.icon-star-empty { + background-position: -144px 0; +} + +.icon-user { + background-position: -168px 0; +} + +.icon-film { + background-position: -192px 0; +} + +.icon-th-large { + background-position: -216px 0; +} + +.icon-th { + background-position: -240px 0; +} + +.icon-th-list { + background-position: -264px 0; +} + +.icon-ok { + background-position: -288px 0; +} + +.icon-remove { + background-position: -312px 0; +} + +.icon-zoom-in { + background-position: -336px 0; +} + +.icon-zoom-out { + background-position: -360px 0; +} + +.icon-off { + background-position: -384px 0; +} + +.icon-signal { + background-position: -408px 0; +} + +.icon-cog { + background-position: -432px 0; +} + +.icon-trash { + background-position: -456px 0; +} + +.icon-home { + background-position: 0 -24px; +} + +.icon-file { + background-position: -24px -24px; +} + +.icon-time { + background-position: -48px -24px; +} + +.icon-road { + background-position: -72px -24px; +} + +.icon-download-alt { + background-position: -96px -24px; +} + +.icon-download { + background-position: -120px -24px; +} + +.icon-upload { + background-position: -144px -24px; +} + +.icon-inbox { + background-position: -168px -24px; +} + +.icon-play-circle { + background-position: -192px -24px; +} + +.icon-repeat { + background-position: -216px -24px; +} + +.icon-refresh { + background-position: -240px -24px; +} + +.icon-list-alt { + background-position: -264px -24px; +} + +.icon-lock { + background-position: -287px -24px; +} + +.icon-flag { + background-position: -312px -24px; +} + +.icon-headphones { + background-position: -336px -24px; +} + +.icon-volume-off { + background-position: -360px -24px; +} + +.icon-volume-down { + background-position: -384px -24px; +} + +.icon-volume-up { + background-position: -408px -24px; +} + +.icon-qrcode { + background-position: -432px -24px; +} + +.icon-barcode { + background-position: -456px -24px; +} + +.icon-tag { + background-position: 0 -48px; +} + +.icon-tags { + background-position: -25px -48px; +} + +.icon-book { + background-position: -48px -48px; +} + +.icon-bookmark { + background-position: -72px -48px; +} + +.icon-print { + background-position: -96px -48px; +} + +.icon-camera { + background-position: -120px -48px; +} + +.icon-font { + background-position: -144px -48px; +} + +.icon-bold { + background-position: -167px -48px; +} + +.icon-italic { + background-position: -192px -48px; +} + +.icon-text-height { + background-position: -216px -48px; +} + +.icon-text-width { + background-position: -240px -48px; +} + +.icon-align-left { + background-position: -264px -48px; +} + +.icon-align-center { + background-position: -288px -48px; +} + +.icon-align-right { + background-position: -312px -48px; +} + +.icon-align-justify { + background-position: -336px -48px; +} + +.icon-list { + background-position: -360px -48px; +} + +.icon-indent-left { + background-position: -384px -48px; +} + +.icon-indent-right { + background-position: -408px -48px; +} + +.icon-facetime-video { + background-position: -432px -48px; +} + +.icon-picture { + background-position: -456px -48px; +} + +.icon-pencil { + background-position: 0 -72px; +} + +.icon-map-marker { + background-position: -24px -72px; +} + +.icon-adjust { + background-position: -48px -72px; +} + +.icon-tint { + background-position: -72px -72px; +} + +.icon-edit { + background-position: -96px -72px; +} + +.icon-share { + background-position: -120px -72px; +} + +.icon-check { + background-position: -144px -72px; +} + +.icon-move { + background-position: -168px -72px; +} + +.icon-step-backward { + background-position: -192px -72px; +} + +.icon-fast-backward { + background-position: -216px -72px; +} + +.icon-backward { + background-position: -240px -72px; +} + +.icon-play { + background-position: -264px -72px; +} + +.icon-pause { + background-position: -288px -72px; +} + +.icon-stop { + background-position: -312px -72px; +} + +.icon-forward { + background-position: -336px -72px; +} + +.icon-fast-forward { + background-position: -360px -72px; +} + +.icon-step-forward { + background-position: -384px -72px; +} + +.icon-eject { + background-position: -408px -72px; +} + +.icon-chevron-left { + background-position: -432px -72px; +} + +.icon-chevron-right { + background-position: -456px -72px; +} + +.icon-plus-sign { + background-position: 0 -96px; +} + +.icon-minus-sign { + background-position: -24px -96px; +} + +.icon-remove-sign { + background-position: -48px -96px; +} + +.icon-ok-sign { + background-position: -72px -96px; +} + +.icon-question-sign { + background-position: -96px -96px; +} + +.icon-info-sign { + background-position: -120px -96px; +} + +.icon-screenshot { + background-position: -144px -96px; +} + +.icon-remove-circle { + background-position: -168px -96px; +} + +.icon-ok-circle { + background-position: -192px -96px; +} + +.icon-ban-circle { + background-position: -216px -96px; +} + +.icon-arrow-left { + background-position: -240px -96px; +} + +.icon-arrow-right { + background-position: -264px -96px; +} + +.icon-arrow-up { + background-position: -289px -96px; +} + +.icon-arrow-down { + background-position: -312px -96px; +} + +.icon-share-alt { + background-position: -336px -96px; +} + +.icon-resize-full { + background-position: -360px -96px; +} + +.icon-resize-small { + background-position: -384px -96px; +} + +.icon-plus { + background-position: -408px -96px; +} + +.icon-minus { + background-position: -433px -96px; +} + +.icon-asterisk { + background-position: -456px -96px; +} + +.icon-exclamation-sign { + background-position: 0 -120px; +} + +.icon-gift { + background-position: -24px -120px; +} + +.icon-leaf { + background-position: -48px -120px; +} + +.icon-fire { + background-position: -72px -120px; +} + +.icon-eye-open { + background-position: -96px -120px; +} + +.icon-eye-close { + background-position: -120px -120px; +} + +.icon-warning-sign { + background-position: -144px -120px; +} + +.icon-plane { + background-position: -168px -120px; +} + +.icon-calendar { + background-position: -192px -120px; +} + +.icon-random { + background-position: -216px -120px; +} + +.icon-comment { + background-position: -240px -120px; +} + +.icon-magnet { + background-position: -264px -120px; +} + +.icon-chevron-up { + background-position: -288px -120px; +} + +.icon-chevron-down { + background-position: -313px -119px; +} + +.icon-retweet { + background-position: -336px -120px; +} + +.icon-shopping-cart { + background-position: -360px -120px; +} + +.icon-folder-close { + background-position: -384px -120px; +} + +.icon-folder-open { + background-position: -408px -120px; +} + +.icon-resize-vertical { + background-position: -432px -119px; +} + +.icon-resize-horizontal { + background-position: -456px -118px; +} + +.btn-group { + position: relative; + *zoom: 1; + *margin-left: .3em; +} + +.btn-group:before, .btn-group:after { + display: table; + content: ""; +} + +.btn-group:after { + clear: both; +} + +.btn-group:first-child { + *margin-left: 0; +} + +.btn-group+.btn-group { + margin-left: 5px; +} + +.btn-toolbar { + margin-top: 9px; + margin-bottom: 9px; +} + +.btn-toolbar .btn-group { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + *zoom: 1; +} + +.btn-group .btn { + position: relative; + float: left; + margin-left: -1px; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.btn-group .btn:first-child { + margin-left: 0; + -webkit-border-top-left-radius: 4px; + -moz-border-radius-topleft: 4px; + border-top-left-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; + border-bottom-left-radius: 4px; +} + +.btn-group .btn:last-child, .btn-group .dropdown-toggle { + -webkit-border-top-right-radius: 4px; + -moz-border-radius-topright: 4px; + border-top-right-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -moz-border-radius-bottomright: 4px; + border-bottom-right-radius: 4px; +} + +.btn-group .btn.large:first-child { + margin-left: 0; + -webkit-border-top-left-radius: 6px; + -moz-border-radius-topleft: 6px; + border-top-left-radius: 6px; + -webkit-border-bottom-left-radius: 6px; + -moz-border-radius-bottomleft: 6px; + border-bottom-left-radius: 6px; +} + +.btn-group .btn.large:last-child, .btn-group .large.dropdown-toggle { + -webkit-border-top-right-radius: 6px; + -moz-border-radius-topright: 6px; + border-top-right-radius: 6px; + -webkit-border-bottom-right-radius: 6px; + -moz-border-radius-bottomright: 6px; + border-bottom-right-radius: 6px; +} + +.btn-group .btn:hover, .btn-group .btn:focus, .btn-group .btn:active, + .btn-group .btn.active { + z-index: 2; +} + +.btn-group .dropdown-toggle:active, .btn-group.open .dropdown-toggle { + outline: 0; +} + +.btn-group .dropdown-toggle { + padding-left: 8px; + padding-right: 8px; + -webkit-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 + 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 + rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 + rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + *padding-top: 5px; + *padding-bottom: 5px; +} + +.btn-group.open { + *z-index: 1000; +} + +.btn-group.open .dropdown-menu { + display: block; + margin-top: 1px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} + +.btn-group.open .dropdown-toggle { + background-image: none; + -webkit-box-shadow: inset 0 1px 6px rgba(0, 0, 0, 0.15), 0 1px 2px + rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 1px 6px rgba(0, 0, 0, 0.15), 0 1px 2px + rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 6px rgba(0, 0, 0, 0.15), 0 1px 2px + rgba(0, 0, 0, 0.05); +} + +.btn .caret { + margin-top: 7px; + margin-left: 0; +} + +.btn:hover .caret, .open.btn-group .caret { + opacity: 1; + filter: alpha(opacity = 100); +} + +.btn-primary .caret, .btn-danger .caret, .btn-info .caret, .btn-success .caret, + .btn-inverse .caret { + border-top-color: #ffffff; + opacity: 0.75; + filter: alpha(opacity = 75); +} + +.btn-small .caret { + margin-top: 4px; +} + +.nav { + margin-left: 0; + margin-bottom: 18px; + list-style: none; +} + +.nav>li>a { + display: block; +} + +.nav>li>a:hover { + text-decoration: none; + background-color: #eeeeee; +} + +.nav .nav-header { + display: block; + padding: 3px 15px; + font-size: 11px; + font-weight: bold; + line-height: 18px; + color: #999999; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); + text-transform: uppercase; +} + +.nav li+.nav-header { + margin-top: 9px; +} + +.nav-list { + padding-left: 14px; + padding-right: 14px; + margin-bottom: 0; +} + +.nav-list>li>a, .nav-list .nav-header { + margin-left: -15px; + margin-right: -15px; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); +} + +.nav-list>li>a { + padding: 3px 15px; +} + +.nav-list .active>a, .nav-list .active>a:hover { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); + background-color: #0088cc; +} + +.nav-list [class^="icon-"] { + margin-right: 2px; +} + +.nav-tabs, .nav-pills { + *zoom: 1; +} + +.nav-tabs:before, .nav-pills:before, .nav-tabs:after, .nav-pills:after { + display: table; + content: ""; +} + +.nav-tabs:after, .nav-pills:after { + clear: both; +} + +.nav-tabs>li, .nav-pills>li { + float: left; +} + +.nav-tabs>li>a, .nav-pills>li>a { + padding-right: 12px; + padding-left: 12px; + margin-right: 2px; + line-height: 14px; +} + +.nav-tabs { + border-bottom: 1px solid #ddd; +} + +.nav-tabs>li { + margin-bottom: -1px; +} + +.nav-tabs>li>a { + padding-top: 9px; + padding-bottom: 9px; + border: 1px solid transparent; + -webkit-border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; +} + +.nav-tabs>li>a:hover { + border-color: #eeeeee #eeeeee #dddddd; +} + +.nav-tabs>.active>a, .nav-tabs>.active>a:hover { + color: #555555; + background-color: #ffffff; + border: 1px solid #ddd; + border-bottom-color: transparent; + cursor: default; +} + +.nav-pills>li>a { + padding-top: 8px; + padding-bottom: 8px; + margin-top: 2px; + margin-bottom: 2px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} + +.nav-pills .active>a, .nav-pills .active>a:hover { + color: #ffffff; + background-color: #0088cc; +} + +.nav-stacked>li { + float: none; +} + +.nav-stacked>li>a { + margin-right: 0; +} + +.nav-tabs.nav-stacked { + border-bottom: 0; +} + +.nav-tabs.nav-stacked>li>a { + border: 1px solid #ddd; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.nav-tabs.nav-stacked>li:first-child>a { + -webkit-border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; +} + +.nav-tabs.nav-stacked>li:last-child>a { + -webkit-border-radius: 0 0 4px 4px; + -moz-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; +} + +.nav-tabs.nav-stacked>li>a:hover { + border-color: #ddd; + z-index: 2; +} + +.nav-pills.nav-stacked>li>a { + margin-bottom: 3px; +} + +.nav-pills.nav-stacked>li:last-child>a { + margin-bottom: 1px; +} + +.nav-tabs .dropdown-menu, .nav-pills .dropdown-menu { + margin-top: 1px; + border-width: 1px; +} + +.nav-pills .dropdown-menu { + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.nav-tabs .dropdown-toggle .caret, .nav-pills .dropdown-toggle .caret { + border-top-color: #0088cc; + margin-top: 6px; +} + +.nav-tabs .dropdown-toggle:hover .caret, .nav-pills .dropdown-toggle:hover .caret + { + border-top-color: #005580; +} + +.nav-tabs .active .dropdown-toggle .caret, .nav-pills .active .dropdown-toggle .caret + { + border-top-color: #333333; +} + +.nav>.dropdown.active>a:hover { + color: #000000; + cursor: pointer; +} + +.nav-tabs .open .dropdown-toggle, .nav-pills .open .dropdown-toggle, + .nav>.open.active>a:hover { + color: #ffffff; + background-color: #999999; + border-color: #999999; +} + +.nav .open .caret, .nav .open.active .caret, .nav .open a:hover .caret { + border-top-color: #ffffff; + opacity: 1; + filter: alpha(opacity = 100); +} + +.tabs-stacked .open>a:hover { + border-color: #999999; +} + +.tabbable { + *zoom: 1; +} + +.tabbable:before, .tabbable:after { + display: table; + content: ""; +} + +.tabbable:after { + clear: both; +} + +.tab-content { + overflow: hidden; +} + +.tabs-below .nav-tabs, .tabs-right .nav-tabs, .tabs-left .nav-tabs { + border-bottom: 0; +} + +.tab-content>.tab-pane, .pill-content>.pill-pane { + display: none; +} + +.tab-content>.active, .pill-content>.active { + display: block; +} + +.tabs-below .nav-tabs { + border-top: 1px solid #ddd; +} + +.tabs-below .nav-tabs>li { + margin-top: -1px; + margin-bottom: 0; +} + +.tabs-below .nav-tabs>li>a { + -webkit-border-radius: 0 0 4px 4px; + -moz-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; +} + +.tabs-below .nav-tabs>li>a:hover { + border-bottom-color: transparent; + border-top-color: #ddd; +} + +.tabs-below .nav-tabs .active>a, .tabs-below .nav-tabs .active>a:hover { + border-color: transparent #ddd #ddd #ddd; +} + +.tabs-left .nav-tabs>li, .tabs-right .nav-tabs>li { + float: none; +} + +.tabs-left .nav-tabs>li>a, .tabs-right .nav-tabs>li>a { + min-width: 74px; + margin-right: 0; + margin-bottom: 3px; +} + +.tabs-left .nav-tabs { + float: left; + margin-right: 19px; + border-right: 1px solid #ddd; +} + +.tabs-left .nav-tabs>li>a { + margin-right: -1px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +.tabs-left .nav-tabs>li>a:hover { + border-color: #eeeeee #dddddd #eeeeee #eeeeee; +} + +.tabs-left .nav-tabs .active>a, .tabs-left .nav-tabs .active>a:hover { + border-color: #ddd transparent #ddd #ddd; + *border-right-color: #ffffff; +} + +.tabs-right .nav-tabs { + float: right; + margin-left: 19px; + border-left: 1px solid #ddd; +} + +.tabs-right .nav-tabs>li>a { + margin-left: -1px; + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.tabs-right .nav-tabs>li>a:hover { + border-color: #eeeeee #eeeeee #eeeeee #dddddd; +} + +.tabs-right .nav-tabs .active>a, .tabs-right .nav-tabs .active>a:hover { + border-color: #ddd #ddd #ddd transparent; + *border-left-color: #ffffff; +} + +.navbar { + overflow: visible; + margin-bottom: 18px; +} + +.navbar-inner { + padding-left: 20px; + padding-right: 20px; + background-color: #2c2c2c; + background-image: -moz-linear-gradient(top, +mozColor1+, +mozColor2+); + background-image: -ms-linear-gradient(top, +mozColor1+, +mozColor2+); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#333333), + to(#222222)); + background-image: -webkit-linear-gradient(top, +mozColor1+, +mozColor2+); + background-image: -o-linear-gradient(top, +mozColor1+, +mozColor2+); + background-image: linear-gradient(top, +mozColor1+, +mozColor2+); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', + endColorstr='#222222', GradientType=0); + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 + rgba(0, 0, 0, 0.1); + -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 + rgba(0, 0, 0, 0.1); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 + rgba(0, 0, 0, 0.1); +} + +.btn-navbar { + display: none; + float: right; + padding: 7px 10px; + margin-left: 5px; + margin-right: 5px; + background-color: #2c2c2c; + background-image: -moz-linear-gradient(top, +mozColor1+, +mozColor2+); + background-image: -ms-linear-gradient(top, +mozColor1+, +mozColor2+); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#333333), + to(#222222)); + background-image: -webkit-linear-gradient(top, +mozColor1+, +mozColor2+); + background-image: -o-linear-gradient(top, +mozColor1+, +mozColor2+); + background-image: linear-gradient(top, +mozColor1+, +mozColor2+); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', + endColorstr='#222222', GradientType=0); + border-color: #222222 #222222 #000000; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(enabled= false); + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 + rgba(255, 255, 255, 0.075); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 + rgba(255, 255, 255, 0.075); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 + rgba(255, 255, 255, 0.075); +} + +.btn-navbar:hover, .btn-navbar:active, .btn-navbar.active, .btn-navbar.disabled, + .btn-navbar[disabled] { + background-color: #222222; +} + +.btn-navbar:active, .btn-navbar.active { + background-color: #080808 \9; +} + +.btn-navbar .icon-bar { + display: block; + width: 18px; + height: 2px; + background-color: #f5f5f5; + -webkit-border-radius: 1px; + -moz-border-radius: 1px; + border-radius: 1px; + -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); + -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); + box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); +} + +.btn-navbar .icon-bar+.icon-bar { + margin-top: 3px; +} + +.nav-collapse.collapse { + height: auto; +} + +.navbar .brand:hover { + text-decoration: none; + color: +ooptionhover+; +} + +.navbar .brand { + float: left; + display: block; + padding: 8px 20px 12px; + margin-left: -100px; + font-size: 24px; + font-weight: 200; + line-height: 1; + color: +ooptioncolor+; +} + +.navbar .navbar-text { + margin-bottom: 0; + line-height: 40px; + color: #999999; +} + +.navbar .navbar-text a:hover { + color: #ffffff; + background-color: transparent; +} + +.navbar .btn, .navbar .btn-group { + margin-top: 5px; +} + +.navbar .btn-group .btn { + margin-top: 0; +} + +.navbar-form { + margin-bottom: 0; + *zoom: 1; +} + +.navbar-form:before, .navbar-form:after { + display: table; + content: ""; +} + +.navbar-form:after { + clear: both; +} + +.navbar-form input, .navbar-form select { + display: inline-block; + margin-top: 5px; + margin-bottom: 0; +} + +.navbar-form .radio, .navbar-form .checkbox { + margin-top: 5px; +} + +.navbar-form input[type="image"], .navbar-form input[type="checkbox"], + .navbar-form input[type="radio"] { + margin-top: 3px; +} + +.navbar-form .input-append, .navbar-form .input-prepend { + margin-top: 6px; + white-space: nowrap; +} + +.navbar-form .input-append input, .navbar-form .input-prepend input { + margin-top: 0; +} + +.navbar-search { + position: relative; + float: left; + margin-top: 6px; + margin-bottom: 0; +} + +.navbar-search .search-query { + padding: 4px 9px; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 13px; + font-weight: normal; + line-height: 1; + color: #ffffff; + color: rgba(255, 255, 255, 0.75); + background: #666; + background: rgba(255, 255, 255, 0.3); + border: 1px solid #111; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0px + rgba(255, 255, 255, 0.15); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0px + rgba(255, 255, 255, 0.15); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0px + rgba(255, 255, 255, 0.15); + -webkit-transition: none; + -moz-transition: none; + -ms-transition: none; + -o-transition: none; + transition: none; +} + +.navbar-search .search-query :-moz-placeholder { + color: #eeeeee; +} + +.navbar-search .search-query::-webkit-input-placeholder { + color: #eeeeee; +} + +.navbar-search .search-query:hover { + color: #ffffff; + background-color: #999999; + background-color: rgba(255, 255, 255, 0.5); +} + +.navbar-search .search-query:focus, .navbar-search .search-query.focused + { + padding: 5px 10px; + color: #333333; + text-shadow: 0 1px 0 #ffffff; + background-color: #ffffff; + border: 0; + -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + outline: 0; +} + +.navbar-fixed-top { + position: fixed; + top: 0; + right: 0; + left: 0; + z-index: 1030; +} + +.navbar-fixed-top .navbar-inner { + padding-left: 0; + padding-right: 0; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.navbar .nav { + position: relative; + left: 0; + display: block; + float: left; + margin: 0 10px 0 0; +} + +.navbar .nav.pull-right { + float: right; +} + +.navbar .nav>li { + display: block; + float: left; +} + +.navbar .nav>li>* { + float: none; + padding: 13px 10px 11px; + line-height: 19px; + color: +ooptmaincolor+; + text-decoration: none; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} + +.navbar .nav>li>a:hover { + background-color: transparent; + color: #ffffff; + text-decoration: none; +} + +.navbar .nav .active>a, .navbar .nav .active>a:hover { + color: #ffffff; + text-decoration: none; + background-color: #222222; +} + +.navbar .divider-vertical { + height: 40px; + width: 1px; + margin: 0 9px; + overflow: hidden; + background-color: #222222; + border-right: 1px solid #333333; +} + +.navbar .nav.pull-right { + margin-left: 10px; + margin-right: 0; +} + +.navbar .dropdown-menu { + margin-top: 1px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.navbar .dropdown-menu:before { + content: ''; + display: inline-block; + border-left: 7px solid transparent; + border-right: 7px solid transparent; + border-bottom: 7px solid #ccc; + border-bottom-color: rgba(0, 0, 0, 0.2); + position: absolute; + top: -7px; + left: 9px; +} + +.navbar .dropdown-menu:after { + content: ''; + display: inline-block; + border-left: 6px solid transparent; + border-right: 6px solid transparent; + border-bottom: 6px solid #ffffff; + position: absolute; + top: -6px; + left: 10px; +} + +.navbar .nav .dropdown-toggle .caret, .navbar .nav .open.dropdown .caret + { + border-top-color: #ffffff; +} + +.navbar .nav .active .caret { + opacity: 1; + filter: alpha(opacity = 100); +} + +.navbar .nav .open>.dropdown-toggle, .navbar .nav .active>.dropdown-toggle, + .navbar .nav .open.active>.dropdown-toggle { + background-color: transparent; +} + +.navbar .nav .active>.dropdown-toggle:hover { + color: #ffffff; +} + +.navbar .nav.pull-right .dropdown-menu { + left: auto; + right: 0; +} + +.navbar .nav.pull-right .dropdown-menu:before { + left: auto; + right: 12px; +} + +.navbar .nav.pull-right .dropdown-menu:after { + left: auto; + right: 13px; +} + +.breadcrumb { + padding: 7px 14px; + margin: 0 0 18px; + background-color: #fbfbfb; + background-image: -moz-linear-gradient(top, #ffffff, #f5f5f5); + background-image: -ms-linear-gradient(top, #ffffff, #f5f5f5); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), + to(#f5f5f5)); + background-image: -webkit-linear-gradient(top, #ffffff, #f5f5f5); + background-image: -o-linear-gradient(top, #ffffff, #f5f5f5); + background-image: linear-gradient(top, #ffffff, #f5f5f5); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', + endColorstr='#f5f5f5', GradientType=0); + border: 1px solid #ddd; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + -webkit-box-shadow: inset 0 1px 0 #ffffff; + -moz-box-shadow: inset 0 1px 0 #ffffff; + box-shadow: inset 0 1px 0 #ffffff; +} + +.breadcrumb li { + display: inline-block; + text-shadow: 0 1px 0 #ffffff; +} + +.breadcrumb .divider { + padding: 0 5px; + color: #999999; +} + +.breadcrumb .active a { + color: #333333; +} + +.pagination { + height: 36px; + margin: 18px 0; +} + +.pagination ul { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + *zoom: 1; + margin-left: 0; + margin-bottom: 0; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.pagination li { + display: inline; +} + +.pagination a { + float: left; + padding: 0 14px; + line-height: 34px; + text-decoration: none; + border: 1px solid #ddd; + border-left-width: 0; +} + +.pagination a:hover, .pagination .active a { + background-color: #f5f5f5; +} + +.pagination .active a { + color: #999999; + cursor: default; +} + +.pagination .disabled a, .pagination .disabled a:hover { + color: #999999; + background-color: transparent; + cursor: default; +} + +.pagination li:first-child a { + border-left-width: 1px; + -webkit-border-radius: 3px 0 0 3px; + -moz-border-radius: 3px 0 0 3px; + border-radius: 3px 0 0 3px; +} + +.pagination li:last-child a { + -webkit-border-radius: 0 3px 3px 0; + -moz-border-radius: 0 3px 3px 0; + border-radius: 0 3px 3px 0; +} + +.pagination-centered { + text-align: center; +} + +.pagination-right { + text-align: right; +} + +.pager { + margin-left: 0; + margin-bottom: 18px; + list-style: none; + text-align: center; + *zoom: 1; +} + +.pager:before, .pager:after { + display: table; + content: ""; +} + +.pager:after { + clear: both; +} + +.pager li { + display: inline; +} + +.pager a { + display: inline-block; + padding: 5px 14px; + background-color: #fff; + border: 1px solid #ddd; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; +} + +.pager a:hover { + text-decoration: none; + background-color: #f5f5f5; +} + +.pager .next a { + float: right; +} + +.pager .previous a { + float: left; +} + +.alert { + padding: 8px 35px 8px 14px; + margin-bottom: 18px; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); + background-color: #fcf8e3; + border: 1px solid #fbeed5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.alert, .alert-heading { + color: #c09853; +} + +.alert .close { + position: relative; + top: -2px; + right: -21px; + line-height: 18px; +} + +.alert-success { + background-color: #dff0d8; + border-color: #d6e9c6; +} + +.alert-success, .alert-success .alert-heading { + color: #468847; +} + +.alert-danger, .alert-error { + background-color: #f2dede; + border-color: #eed3d7; +} + +.alert-danger, .alert-error, .alert-danger .alert-heading, .alert-error .alert-heading + { + color: #b94a48; +} + +.alert-info { + background-color: #d9edf7; + border-color: #bce8f1; +} + +.alert-info, .alert-info .alert-heading { + color: #3a87ad; +} + +.alert-block { + padding-top: 14px; + padding-bottom: 14px; +} + +.alert-block>p, .alert-block>ul { + margin-bottom: 0; +} + +.alert-block p+p { + margin-top: 5px; +} + +.pull-right { + float: right; +} + +.pull-left { + float: left; +} + +.hide { + display: none; +} + +.show { + display: block; +} + +.invisible { + visibility: hidden; +} \ No newline at end of file diff --git a/screwdriver-3.5.6/box/snippets/css/hammer_A0.css b/screwdriver-3.5.6/box/snippets/css/hammer_A0.css new file mode 100644 index 0000000..0dd8417 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/css/hammer_A0.css @@ -0,0 +1,126 @@ +body { + font-family: Georgia, "Times New Roman", Times, serif; + font-size: 12px; + background-color: #CCFF99; + color: #000080; + border-top: 4px solid #993366; + border-right: 4px none #993366; + border-bottom: 4px solid #993366; + border-left: 4px none #993366; +} + +/* Headings */ +h1 { + font-size: 145% +} + +td { + font-family: "Times New Roman", Times, serif; + font-size: 17px; +} + +th { + font-family: "Times New Roman", Times, serif; + font-size: 14px; +} + +form { + font-family: "Times New Roman", Times, serif; + font-size: 12px; +} + +input { + font-family: "Times New Roman", Times, serif; + font-size: 12px; +} + +textarea { + font-family: "Times New Roman", Times, serif; + font-size: 12px; + border: thick double; +} + +select { + font-family: "Times New Roman", Times, serif; + font-size: 12px; +} + +ul { + font-family: "Times New Roman", Times, serif; + font-size: 12px; + list-style-type: circle; + list-style-position: outside; +} + +li { + font-family: "Times New Roman", Times, serif; + font-size: 12px; +} + +ol { + font-family: "Times New Roman", Times, serif; + font-size: 12px; + list-style-type: upper-alpha; + list-style-position: outside; +} + +.storia { + font-family: "Times New Roman", Times, serif; + font-size: 16px; + color: #007F00; + font-style: Normal; +} + +/* Table colors */ +.TableHeadingColor { + background: #CCCCFF +} /* Dark mauve */ +.TableSubHeadingColor { + background: #EEEEFF +} /* Light mauve */ +.TableRowColor { + background: #FFFFFF +} /* White */ + +/* Font used in left-hand frame lists */ +.FrameTitleFont { + font-size: 110%; + font-family: Helvetica, Arial, sans-serif +} + +.FrameHeadingFont { + font-size: 110%; + font-family: Helvetica, Arial, sans-serif +} + +.FrameItemFont { + font-size: 110%; + font-family: Helvetica, Arial, sans-serif +} + +/* Navigation bar fonts and colors */ +.NavBarCell1 { + background-color: #EEEEFF; +} /* Light mauve */ +.NavBarCell1Rev { + background-color: #00008B; +} /* Dark Blue */ +.NavBarFont1 { + font-family: Arial, Helvetica, sans-serif; + color: #000000; +} + +.NavBarFont1Rev { + font-family: Arial, Helvetica, sans-serif; + color: #FFFFFF; +} + +.NavBarCell2 { + font-family: Arial, Helvetica, sans-serif; + background-color: #FFFFFF; +} + +.NavBarCell3 { + font-family: Arial, Helvetica, sans-serif; + background-color: #FFFFFF; +} \ No newline at end of file diff --git a/screwdriver-3.5.6/box/snippets/css/screwdriver.css b/screwdriver-3.5.6/box/snippets/css/screwdriver.css new file mode 100644 index 0000000..4412f31 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/css/screwdriver.css @@ -0,0 +1,57 @@ +.checkdress { + margin-top: 0px; + margin-bottom: 14px; +} + +.labeldress { + margin-top: 0px; + margin-bottom: -10px; +} + +.formdress { + margin-left: 40px; +} + +.radiodress { + font-size: 13px; +} + +.formn_btn { + display: inline-block; + padding: 4px 12px 3px; + margin-bottom: 9px; + font-size: 13px; + line-height: 18px; + color: blue; + text-align: center; + text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); + vertical-align: middle; + background-color: #f5f5f5; + background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -ms-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), + to(#e6e6e6)); + background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -o-linear-gradient(top, #ffffff, #e6e6e6); + background-image: linear-gradient(top, #ffffff, #e6e6e6); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', + endColorstr='#e6e6e6', GradientType=0); + border-color: #e6e6e6 #e6e6e6 #bfbfbf; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(enabled= false); + border: 1px solid #ccc; + border-bottom-color: #bbb; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px + rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px + rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px + rgba(0, 0, 0, 0.05); + cursor: pointer; + filter: progid:DXImageTransform.Microsoft.gradient(enabled= false); + *margin-left: .3em; +} \ No newline at end of file diff --git a/screwdriver-3.5.6/box/snippets/depen_0.txt b/screwdriver-3.5.6/box/snippets/depen_0.txt new file mode 100644 index 0000000..6a8f066 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/depen_0.txt @@ -0,0 +1,5 @@ + + javax.servlet + jsp-api + 2.0 + \ No newline at end of file diff --git a/screwdriver-3.5.6/box/snippets/depen_1.txt b/screwdriver-3.5.6/box/snippets/depen_1.txt new file mode 100644 index 0000000..62101ef --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/depen_1.txt @@ -0,0 +1,42 @@ + + javax.servlet + javax.servlet-api + 3.1.0 + + + xercesImpl + xerces + 2.9.1 + + + + commons-fileupload + commons-fileupload + 1.3.1 + + + org.apache.commons + commons-io + 1.3.2 + + + commons-codec + commons-codec + 1.4 + + + + net.sourceforge.wurfl + wurfl + 1.3.1.1 + + + logback-classic + ch.qos.logback + + + slf4j-api + org.slf4j + + + \ No newline at end of file diff --git a/screwdriver-3.5.6/box/snippets/depen_2.txt b/screwdriver-3.5.6/box/snippets/depen_2.txt new file mode 100644 index 0000000..b4fcee2 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/depen_2.txt @@ -0,0 +1,42 @@ + + xercesImpl + xerces + 2.9.1 + + + javax.servlet + jsp-api + 2.0 + + + + commons-codec + commons-codec + 1.4 + + + commons-fileupload + commons-fileupload + 1.2.2 + + + + net.sourceforge.wurfl + wurfl + 1.3.1.1 + + + logback-classic + ch.qos.logback + + + slf4j-api + org.slf4j + + + + + javassist + javassist + 3.12.1.GA + \ No newline at end of file diff --git a/screwdriver-3.5.6/box/snippets/depen_3.txt b/screwdriver-3.5.6/box/snippets/depen_3.txt new file mode 100644 index 0000000..7bd9686 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/depen_3.txt @@ -0,0 +1,37 @@ + + cglib + cglib-nodep + 2.2.2 + runtime + + + com.h2database + h2 + 1.3.163 + runtime + + + javax.servlet + jsp-api + 2.0 + + + javax.validation + validation-api + 1.0.0.GA + + + joda-time + joda-time + 2.0 + + + org.slf4j + slf4j-api + 1.6.4 + + + org.slf4j + slf4j-log4j12 + 1.6.4 + \ No newline at end of file diff --git a/screwdriver-3.5.6/box/snippets/depen_4.txt b/screwdriver-3.5.6/box/snippets/depen_4.txt new file mode 100644 index 0000000..4f70d14 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/depen_4.txt @@ -0,0 +1,35 @@ + + xercesImpl + xerces + 2.9.1 + + + javax.servlet + jsp-api + 2.0 + + + commons-codec + commons-codec + 1.4 + + + commons-fileupload + commons-fileupload + 1.2.2 + + + javassist + javassist + 3.12.1.GA + + + org.slf4j + slf4j-log4j12 + 1.7.5 + + + org.slf4j + slf4j-api + 1.7.5 + \ No newline at end of file diff --git a/screwdriver-3.5.6/box/snippets/depen_apache_ldap.txt b/screwdriver-3.5.6/box/snippets/depen_apache_ldap.txt new file mode 100644 index 0000000..ad26fde --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/depen_apache_ldap.txt @@ -0,0 +1,20 @@ + + org.apache.directory.server + apacheds-core + 1.5.5 + + + org.apache.directory.server + apacheds-protocol-ldap + 1.5.5 + + + org.apache.directory.shared + shared-ldap + 0.9.15 + + + org.springframework.security + spring-security-ldap + 3.1.0.RELEASE + \ No newline at end of file diff --git a/screwdriver-3.5.6/box/snippets/depen_captcha_1.1.txt b/screwdriver-3.5.6/box/snippets/depen_captcha_1.1.txt new file mode 100644 index 0000000..ac7e44a --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/depen_captcha_1.1.txt @@ -0,0 +1,5 @@ + + com.google.code.maven-play-plugin.org.playframework + jj-simplecaptcha + 1.1 + \ No newline at end of file diff --git a/screwdriver-3.5.6/box/snippets/depen_captcha_1.2.1.txt b/screwdriver-3.5.6/box/snippets/depen_captcha_1.2.1.txt new file mode 100644 index 0000000..337358f --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/depen_captcha_1.2.1.txt @@ -0,0 +1,5 @@ + + com.google.code.maven-play-plugin.org.playframework + jj-simplecaptcha + 1.2.1 + \ No newline at end of file diff --git a/screwdriver-3.5.6/box/snippets/depen_hvalid.txt b/screwdriver-3.5.6/box/snippets/depen_hvalid.txt new file mode 100644 index 0000000..e8a6a7f --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/depen_hvalid.txt @@ -0,0 +1,5 @@ + + org.hibernate + hibernate-validator + +hvalid+ + \ No newline at end of file diff --git a/screwdriver-3.5.6/box/snippets/depen_jackson.txt b/screwdriver-3.5.6/box/snippets/depen_jackson.txt new file mode 100644 index 0000000..6898c23 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/depen_jackson.txt @@ -0,0 +1,11 @@ + + org.codehaus.jackson + jackson-core-asl + +jackson+ + + + org.codehaus.jackson + jackson-mapper-asl + +jackson+ + runtime + \ No newline at end of file diff --git a/screwdriver-3.5.6/box/snippets/depen_secu_3.1.txt b/screwdriver-3.5.6/box/snippets/depen_secu_3.1.txt new file mode 100644 index 0000000..c681b34 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/depen_secu_3.1.txt @@ -0,0 +1,26 @@ + + org.springframework.security + spring-security-core + ${org.springframework.security.version} + + + org.springframework.security + spring-security-web + ${org.springframework.security.version} + + + org.springframework.security + spring-security-config + ${org.springframework.security.version} + + + spring-asm + org.springframework + + + + + org.springframework.security + spring-security-taglibs + ${org.springframework.security.version} + \ No newline at end of file diff --git a/screwdriver-3.5.6/box/snippets/depen_secu_3.2.txt b/screwdriver-3.5.6/box/snippets/depen_secu_3.2.txt new file mode 100644 index 0000000..c681b34 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/depen_secu_3.2.txt @@ -0,0 +1,26 @@ + + org.springframework.security + spring-security-core + ${org.springframework.security.version} + + + org.springframework.security + spring-security-web + ${org.springframework.security.version} + + + org.springframework.security + spring-security-config + ${org.springframework.security.version} + + + spring-asm + org.springframework + + + + + org.springframework.security + spring-security-taglibs + ${org.springframework.security.version} + \ No newline at end of file diff --git a/screwdriver-3.5.6/box/snippets/depen_spring_3.1.0.RELEASE.txt b/screwdriver-3.5.6/box/snippets/depen_spring_3.1.0.RELEASE.txt new file mode 100644 index 0000000..0d61930 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/depen_spring_3.1.0.RELEASE.txt @@ -0,0 +1,66 @@ + + org.springframework + spring-core + ${spring.version} + + + org.springframework + spring-expression + ${spring.version} + + + org.springframework + spring-beans + ${spring.version} + + + org.springframework + spring-aop + ${spring.version} + + + org.springframework + spring-context + ${spring.version} + + + org.springframework + spring-context-support + ${spring.version} + + + org.springframework + spring-tx + ${spring.version} + + + org.springframework + spring-orm + ${spring.version} + + + org.springframework + spring-web + ${spring.version} + + + org.springframework + spring-webmvc + ${spring.version} + + + org.springframework + spring-asm + ${spring.version} + + + org.springframework + spring-jdbc + ${spring.version} + + + javax.servlet + jstl + 1.2 + + \ No newline at end of file diff --git a/screwdriver-3.5.6/box/snippets/depen_spring_3.1.1.RELEASE.txt b/screwdriver-3.5.6/box/snippets/depen_spring_3.1.1.RELEASE.txt new file mode 100644 index 0000000..8874112 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/depen_spring_3.1.1.RELEASE.txt @@ -0,0 +1,65 @@ + + org.springframework + spring-core + ${spring.version} + + + org.springframework + spring-expression + ${spring.version} + + + org.springframework + spring-beans + ${spring.version} + + + org.springframework + spring-aop + ${spring.version} + + + org.springframework + spring-context + ${spring.version} + + + org.springframework + spring-context-support + ${spring.version} + + + org.springframework + spring-tx + ${spring.version} + + + org.springframework + spring-orm + ${spring.version} + + + org.springframework + spring-web + ${spring.version} + + + org.springframework + spring-webmvc + ${spring.version} + + + org.springframework + spring-asm + ${spring.version} + + + org.springframework + spring-jdbc + ${spring.version} + + + javax.servlet + jstl + 1.2 + \ No newline at end of file diff --git a/screwdriver-3.5.6/box/snippets/depen_spring_3.2.0.RELEASE.txt b/screwdriver-3.5.6/box/snippets/depen_spring_3.2.0.RELEASE.txt new file mode 100644 index 0000000..887c042 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/depen_spring_3.2.0.RELEASE.txt @@ -0,0 +1,67 @@ + + org.springframework + spring-core + ${spring.version} + + + spring-asm + org.springframework + + + + + org.springframework + spring-expression + ${spring.version} + + + org.springframework + spring-beans + ${spring.version} + + + org.springframework + spring-aop + ${spring.version} + + + org.springframework + spring-context + ${spring.version} + + + org.springframework + spring-context-support + ${spring.version} + + + org.springframework + spring-tx + ${spring.version} + + + org.springframework + spring-orm + ${spring.version} + + + org.springframework + spring-web + ${spring.version} + + + org.springframework + spring-webmvc + ${spring.version} + + + org.springframework + spring-jdbc + ${spring.version} + + + javax.servlet + jstl + 1.2 + + \ No newline at end of file diff --git a/screwdriver-3.5.6/box/snippets/depen_spring_3.2.13.RELEASE.txt b/screwdriver-3.5.6/box/snippets/depen_spring_3.2.13.RELEASE.txt new file mode 100644 index 0000000..843515f --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/depen_spring_3.2.13.RELEASE.txt @@ -0,0 +1,66 @@ + + org.springframework + spring-core + ${spring.version} + + + spring-asm + org.springframework + + + + + org.springframework + spring-expression + ${spring.version} + + + org.springframework + spring-beans + ${spring.version} + + + org.springframework + spring-aop + ${spring.version} + + + org.springframework + spring-context + ${spring.version} + + + org.springframework + spring-context-support + ${spring.version} + + + org.springframework + spring-tx + ${spring.version} + + + org.springframework + spring-orm + ${spring.version} + + + org.springframework + spring-web + ${spring.version} + + + org.springframework + spring-webmvc + ${spring.version} + + + org.springframework + spring-jdbc + ${spring.version} + + + javax.servlet + jstl + 1.2 + \ No newline at end of file diff --git a/screwdriver-3.5.6/box/snippets/depen_spring_4.0.3.RELEASE.txt b/screwdriver-3.5.6/box/snippets/depen_spring_4.0.3.RELEASE.txt new file mode 100644 index 0000000..95e4749 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/depen_spring_4.0.3.RELEASE.txt @@ -0,0 +1,66 @@ + + org.springframework + spring-core + ${spring.version} + + + spring-asm + org.springframework + + + + + org.springframework + spring-expression + ${spring.version} + + + org.springframework + spring-beans + ${spring.version} + + + org.springframework + spring-aop + ${spring.version} + + + org.springframework + spring-context + ${spring.version} + + + org.springframework + spring-context-support + ${spring.version} + + + org.springframework + spring-tx + ${spring.version} + + + org.springframework + spring-orm + ${spring.version} + + + org.springframework + spring-web + ${spring.version} + + + org.springframework + spring-webmvc + ${spring.version} + + + org.springframework + spring-jdbc + ${spring.version} + + + javax.servlet + jstl + 1.2 + \ No newline at end of file diff --git a/screwdriver-3.5.6/box/snippets/depen_spring_4.3.12.RELEASE.txt b/screwdriver-3.5.6/box/snippets/depen_spring_4.3.12.RELEASE.txt new file mode 100644 index 0000000..95e4749 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/depen_spring_4.3.12.RELEASE.txt @@ -0,0 +1,66 @@ + + org.springframework + spring-core + ${spring.version} + + + spring-asm + org.springframework + + + + + org.springframework + spring-expression + ${spring.version} + + + org.springframework + spring-beans + ${spring.version} + + + org.springframework + spring-aop + ${spring.version} + + + org.springframework + spring-context + ${spring.version} + + + org.springframework + spring-context-support + ${spring.version} + + + org.springframework + spring-tx + ${spring.version} + + + org.springframework + spring-orm + ${spring.version} + + + org.springframework + spring-web + ${spring.version} + + + org.springframework + spring-webmvc + ${spring.version} + + + org.springframework + spring-jdbc + ${spring.version} + + + javax.servlet + jstl + 1.2 + \ No newline at end of file diff --git a/screwdriver-3.5.6/box/snippets/depen_tiles.txt b/screwdriver-3.5.6/box/snippets/depen_tiles.txt new file mode 100644 index 0000000..e217a4f --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/depen_tiles.txt @@ -0,0 +1,37 @@ + + + org.apache.tiles + tiles-core + ${apache.tiles.version} + + + slf4j-api + org.slf4j + + + + + org.apache.tiles + tiles-api + ${apache.tiles.version} + + + org.apache.tiles + tiles-jsp + ${apache.tiles.version} + + + org.apache.tiles + tiles-servlet + ${apache.tiles.version} + + + org.apache.tiles + tiles-servlet-wildcard + ${apache.tiles.version} + + + org.apache.tiles + tiles-template + ${apache.tiles.version} + \ No newline at end of file diff --git a/screwdriver-3.5.6/box/snippets/depen_validator.txt b/screwdriver-3.5.6/box/snippets/depen_validator.txt new file mode 100644 index 0000000..6f078d2 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/depen_validator.txt @@ -0,0 +1,5 @@ + + javax.validation + validation-api + 1.0.0.GA + \ No newline at end of file diff --git a/screwdriver-3.5.6/box/snippets/depen_webflow_2.3.3.RELEASE.txt b/screwdriver-3.5.6/box/snippets/depen_webflow_2.3.3.RELEASE.txt new file mode 100644 index 0000000..cbb89ff --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/depen_webflow_2.3.3.RELEASE.txt @@ -0,0 +1,5 @@ + + org.springframework.webflow + spring-webflow + 2.3.3.RELEASE + \ No newline at end of file diff --git a/screwdriver-3.5.6/box/snippets/filte.txt b/screwdriver-3.5.6/box/snippets/filte.txt new file mode 100644 index 0000000..9509fc3 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/filte.txt @@ -0,0 +1,49 @@ + + characterEncodingFilter + org.springframework.web.filter.CharacterEncodingFilter + + encoding + UTF-8 + + + forceEncoding + true + + + + characterEncodingFilter + /* + + + ResponseOverrideFilter + org.displaytag.filter.ResponseOverrideFilter + + + ResponseOverrideFilter + /* + + + HttpMethodFilter + org.springframework.web.filter.HiddenHttpMethodFilter + + + HttpMethodFilter + /* + + + + crossSiteScriptingFilter + +zoccolo+.web.filter.CrossSiteScriptingFilter + + + crossSiteScriptingFilter + /* + + + JsessionIdRemoveFilter + +zoccolo+.web.filter.JsessionIdRemoveFilter + + + JsessionIdRemoveFilter + /* + \ No newline at end of file diff --git a/screwdriver-3.5.6/box/snippets/htv_3.4.txt b/screwdriver-3.5.6/box/snippets/htv_3.4.txt new file mode 100644 index 0000000..14ea331 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/htv_3.4.txt @@ -0,0 +1,44 @@ + + org.hibernate + hibernate-core + 3.3.2.GA + + + org.hibernate + hibernate-annotations + 3.4.0.GA + + + org.hibernate + hibernate-commons-annotations + 3.1.0.GA + + + org.hibernate + hibernate-tools + 3.2.3.GA + + + javax.validation + validation-api + 1.0.0.GA + + + org.slf4j + slf4j-api + 1.6.4 + runtime + + + org.slf4j + slf4j-api + 1.6.4 + runtime + + + org.slf4j + slf4j-log4j12 + 1.6.4 + runtime + + \ No newline at end of file diff --git a/screwdriver-3.5.6/box/snippets/hv_3.4.txt b/screwdriver-3.5.6/box/snippets/hv_3.4.txt new file mode 100644 index 0000000..06a7327 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/hv_3.4.txt @@ -0,0 +1,33 @@ + + org.hibernate + hibernate-core + 3.3.2.GA + + + org.hibernate + hibernate-annotations + 3.4.0.GA + + + org.hibernate + hibernate-commons-annotations + 3.1.0.GA + + + org.hibernate + hibernate-tools + 3.2.3.GA + + + org.slf4j + slf4j-api + 1.6.4 + runtime + + + org.slf4j + slf4j-log4j12 + 1.6.4 + runtime + + \ No newline at end of file diff --git a/screwdriver-3.5.6/box/snippets/hv_3.5.txt b/screwdriver-3.5.6/box/snippets/hv_3.5.txt new file mode 100644 index 0000000..96b9708 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/hv_3.5.txt @@ -0,0 +1,37 @@ + + org.hibernate + hibernate-core + 3.3.2.GA + + + org.hibernate + hibernate-annotations + 3.4.0.GA + + + org.hibernate + hibernate-commons-annotations + 3.1.0.GA + + + org.hibernate + hibernate-tools + 3.2.3.GA + + + org.slf4j + slf4j-api + 1.6.4 + runtime + + + org.slf4j + slf4j-log4j12 + 1.6.4 + runtime + + + javassist + javassist + 3.12.1.GA + \ No newline at end of file diff --git a/screwdriver-3.5.6/box/snippets/hv_3.6.txt b/screwdriver-3.5.6/box/snippets/hv_3.6.txt new file mode 100644 index 0000000..7fa1ace --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/hv_3.6.txt @@ -0,0 +1,35 @@ + + org.hibernate + hibernate-core + 3.6.6.Final + + + org.hibernate + hibernate-annotations + 3.5.6-Final + + + org.hibernate + hibernate-commons-annotations + 3.2.0.Final + + + org.hibernate + hibernate-tools + 3.6.0.Final + + + org.slf4j + slf4j-api + 1.6.0 + + + org.hibernate + hibernate-search + 3.4.1.Final + + + javassist + javassist + 3.12.1.GA + \ No newline at end of file diff --git a/screwdriver-3.5.6/box/snippets/hv_5.1.0.Final.txt b/screwdriver-3.5.6/box/snippets/hv_5.1.0.Final.txt new file mode 100644 index 0000000..bc82e63 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/hv_5.1.0.Final.txt @@ -0,0 +1,22 @@ + + org.hibernate + hibernate-core + 5.1.0.Final + + + antlr + antlr + + + + + org.hibernate + hibernate-entitymanager + 5.1.0.Final + + + antlr + antlr + + + \ No newline at end of file diff --git a/screwdriver-3.5.6/box/snippets/jacksonView.txt b/screwdriver-3.5.6/box/snippets/jacksonView.txt new file mode 100644 index 0000000..63d8bf2 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/jacksonView.txt @@ -0,0 +1,4 @@ + + + \ No newline at end of file diff --git a/screwdriver-3.5.6/box/snippets/java/ActiveDirectoryLdapAuthoritiesPopulator.java b/screwdriver-3.5.6/box/snippets/java/ActiveDirectoryLdapAuthoritiesPopulator.java new file mode 100644 index 0000000..f557ffd --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/java/ActiveDirectoryLdapAuthoritiesPopulator.java @@ -0,0 +1,37 @@ +package +zoccolo+.security.ldap.userdetails.ad; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import org.springframework.ldap.core.DirContextOperations; +import org.springframework.ldap.core.DistinguishedName; +import org.springframework.ldap.core.LdapRdn; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.ldap.authentication.ad.ActiveDirectoryLdapAuthenticationProvider; +import org.springframework.security.ldap.userdetails.LdapAuthoritiesPopulator; + +/** + * An {@link LdapAuthoritiesPopulator} that is based on the {@link ActiveDirectoryLdapAuthenticationProvider}. The + * implementation obtains the {@link GrantedAuthority}'s from the userData's memberOf attribute. It then uses the last + * {@link LdapRdn}'s value as the {@link GrantedAuthority}. + * + * @author Rob Winch + * @see ActiveDirectoryLdapAuthenticationProvider + */ +public final class ActiveDirectoryLdapAuthoritiesPopulator + implements LdapAuthoritiesPopulator { + + @Override + public Collection getGrantedAuthorities(DirContextOperations userData, String username) { + String[] groups = userData.getStringAttributes("memberOf"); + List authorities = new ArrayList(); + + for (String group : groups) { + LdapRdn authority = new DistinguishedName(group).removeLast(); + authorities.add(new SimpleGrantedAuthority(authority.getValue())); + } + return authorities; + } +} \ No newline at end of file diff --git a/screwdriver-3.5.6/box/snippets/java/AntiSamyListener.java b/screwdriver-3.5.6/box/snippets/java/AntiSamyListener.java new file mode 100644 index 0000000..8bf9b0c --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/java/AntiSamyListener.java @@ -0,0 +1,55 @@ +package +zoccolo+.web.listener; + +import +zoccolo+.web.sanitizer.XssSanitizer; + +import java.io.InputStream; + +import javax.servlet.ServletContext; +import javax.servlet.ServletContextEvent; +import javax.servlet.ServletContextListener; + +import org.apache.log4j.Logger; +import org.owasp.validator.html.PolicyException; + +public class AntiSamyListener + implements ServletContextListener { + + public static final String POLICY_FILE_PATH = "policy_file_path"; + public static final String ANTISAMY_SANITIZER = "sanitizer"; + + static Logger log = Logger.getLogger(AntiSamyListener.class); + + public void contextDestroyed(ServletContextEvent servletContextEvent) { + log.info("Context destroyed"); + } + + public void contextInitialized(ServletContextEvent servletContextEvent) { + ServletContext servletContext = servletContextEvent.getServletContext(); + String policyFilePath = (String) servletContext.getInitParameter(POLICY_FILE_PATH); + if (policyFilePath == null) { + throw new RuntimeException( + "Policy file path is null. Please set it up in web.xml!!!"); + } + log.info("XSS Policy file path read."); + + InputStream is = getClass().getClassLoader().getResourceAsStream( + policyFilePath); + try { + is.available(); + log.info("XSS Policy file loaded."); + } catch (Exception e) { + throw new RuntimeException("Policy file " + policyFilePath + + " does not exists!"); + } + + try { + XssSanitizer sanitizer = new XssSanitizer(policyFilePath); + log.info("XSS Sanitizer created."); + servletContext.setAttribute(ANTISAMY_SANITIZER, sanitizer); + log.info("XSS bound in Servlet Context as: " + ANTISAMY_SANITIZER); + } catch (PolicyException pex) { + throw new RuntimeException("Policy exception: " + pex.getMessage()); + } + } + /* screwdriver_knife */ +} diff --git a/screwdriver-3.5.6/box/snippets/java/ApplicUserAuthenticationProvider.java b/screwdriver-3.5.6/box/snippets/java/ApplicUserAuthenticationProvider.java new file mode 100644 index 0000000..adcaee6 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/java/ApplicUserAuthenticationProvider.java @@ -0,0 +1,34 @@ +package +zoccolo+.web.authentication; + +import java.util.Collection; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.DataAccessException; +import org.springframework.security.authentication.AuthenticationProvider; +import org.springframework.security.authentication.BadCredentialsException; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.stereotype.Component; + +import +zoccolo+.web.authentication.+userpass+UsernamePasswordAuthenticationToken; +import +zoccolo+.web.authentication.authority.UserAuthorityUtils; +import +domain+.screwdriver.+dsname+.+dbschema+.+tabuser+; +import +zoccolo+.+rail+.dao.I+Rail++tabuser+Dao; + +/** Autenticazione */ +@Component +public class +Applicaz+UserAuthenticationProvider + implements AuthenticationProvider { + + private I+Rail++tabuser+Dao<+tabuser+> +rail++tabuser+; + + @Autowired + public +Applicaz+UserAuthenticationProvider(I+Rail++tabuser+Dao<+tabuser+> +rail++tabuser+) { + if (+rail++tabuser+ == null) { + throw new IllegalArgumentException( + "Screwdriver: +rail++tabuser+ cannot be null"); + } + this.+rail++tabuser+ = +rail++tabuser+; + } \ No newline at end of file diff --git a/screwdriver-3.5.6/box/snippets/java/Belonger.java b/screwdriver-3.5.6/box/snippets/java/Belonger.java new file mode 100644 index 0000000..2ae6ab8 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/java/Belonger.java @@ -0,0 +1,21 @@ +package +zoccolo+.security; + +import java.util.Collection; + +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.userdetails.User; + +public class Belonger extends User { + + public Belonger(String username, String password, boolean enabled, + boolean accountNonExpired, boolean credentialsNonExpired, + boolean accountNonLocked, + Collection authorities) { + super(username, password, enabled, accountNonExpired, + credentialsNonExpired, accountNonLocked, authorities); + } + + private static final long serialVersionUID = 4190186200539186925L; + + /* screwdriver_knife */ +} diff --git a/screwdriver-3.5.6/box/snippets/java/ControllerBelong.java b/screwdriver-3.5.6/box/snippets/java/ControllerBelong.java new file mode 100644 index 0000000..5fa4f36 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/java/ControllerBelong.java @@ -0,0 +1,4 @@ +package +zoccolo+.web.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; \ No newline at end of file diff --git a/screwdriver-3.5.6/box/snippets/java/ControllerBelongLDAP.java b/screwdriver-3.5.6/box/snippets/java/ControllerBelongLDAP.java new file mode 100644 index 0000000..e48b5a8 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/java/ControllerBelongLDAP.java @@ -0,0 +1,6 @@ +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.ldap.userdetails.InetOrgPerson; +import org.springframework.security.ldap.userdetails.LdapUserDetails; +import org.springframework.security.ldap.userdetails.Person; + diff --git a/screwdriver-3.5.6/box/snippets/java/CrossSiteScriptingFilter.java b/screwdriver-3.5.6/box/snippets/java/CrossSiteScriptingFilter.java new file mode 100644 index 0000000..3ba5863 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/java/CrossSiteScriptingFilter.java @@ -0,0 +1,56 @@ +package +zoccolo+.web.filter; + +import +zoccolo+.web.servlet.HttpRequestWrapper; + +import java.io.IOException; + +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.log4j.Logger; + +public class CrossSiteScriptingFilter implements Filter { + + static Logger log = Logger.getLogger(CrossSiteScriptingFilter.class); + + @SuppressWarnings("unused") + private FilterConfig filterConfig; + + /** + * @see Filter#destroy() + */ + public void destroy() { + this.filterConfig = null; + } + + /** + * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain) + */ + public void doFilter(ServletRequest request, ServletResponse response, + FilterChain chain) throws IOException, ServletException { + + String sessionid = ((HttpServletRequest) request).getSession().getId(); + // be careful overwriting: JSESSIONID may have been set with other flags + ((HttpServletResponse) response).setHeader("SET-COOKIE", "JSESSIONID=" + sessionid + ";Path=/; HttpOnly"); + + chain.doFilter(new HttpRequestWrapper((HttpServletRequest)request), response); + } + + /** + * @see Filter#init(FilterConfig) + */ + public void init(FilterConfig filterConfig) throws ServletException { + this.filterConfig = filterConfig; + log.info("CrossSiteScriptingFilter correctly initialized."); + } + + /* screwdriver_knife */ + +} + diff --git a/screwdriver-3.5.6/box/snippets/java/Crud.java b/screwdriver-3.5.6/box/snippets/java/Crud.java new file mode 100644 index 0000000..2e76695 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/java/Crud.java @@ -0,0 +1,23 @@ + // R = READ + private ModelAndView screw+jsp+R(+Jsp+Form +jsp+Form) { + return new ModelAndView("+screwModel+", "belong", + +jsp+Form); + } + + // C = CREATE + private ModelAndView screw+jsp+C(+Jsp+Form +jsp+Form) { + Notice notice = new Notice(); + return new ModelAndView("answers/ok", "belong", notice); + } + + // U = UPDATE + private ModelAndView screw+jsp+U(+Jsp+Form +jsp+Form) { + Notice notice = new Notice(); + return new ModelAndView("answers/ok", "belong", notice); + } + + // D = DELETE + private ModelAndView screw+jsp+D(+Jsp+Form +jsp+Form) { + Notice notice = new Notice(); + return new ModelAndView("answers/ok", "belong", notice); + } diff --git a/screwdriver-3.5.6/box/snippets/java/DomainSpringSecurityUserContext.java b/screwdriver-3.5.6/box/snippets/java/DomainSpringSecurityUserContext.java new file mode 100644 index 0000000..42972e6 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/java/DomainSpringSecurityUserContext.java @@ -0,0 +1,50 @@ +package +zoccolo+.web.authentication; + +import java.util.Collection; + +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.context.SecurityContext; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.stereotype.Component; + +import +zoccolo+.web.authentication.authority.UserAuthorityUtils; +import +tabposition+.+tabella+; + +/** + * An implementation of {@link UserContext} that looks up the {@link CalendarUser} using the Spring Security's + * {@link Authentication} by principal name. + * + * @author Rob Winch + * + */ +@Component +public class SpringSecurityUserContext implements UserContext { + /** + * Get the {@link CalendarUser} by casting the {@link Authentication}'s principal to a {@link CalendarUser}. + */ + @Override + public +tabella+ getCurrentUser() { + SecurityContext context = SecurityContextHolder.getContext(); + Authentication authentication = context.getAuthentication(); + if (authentication == null) { + return null; + } + return (+tabella+) authentication.getPrincipal(); + } + + /** + * Sets the {@link CalendarUser} as the current {@link Authentication}'s principal. It uses + */ + @Override + public void setCurrentUser(+tabella+ user) { + if (user == null) { + throw new IllegalArgumentException("user cannot be null"); + } + Collection authorities = UserAuthorityUtils.createAuthorities(user); + UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(user, + user.get+password+(),authorities); + SecurityContextHolder.getContext().setAuthentication(authentication); + } +} diff --git a/screwdriver-3.5.6/box/snippets/java/DomainUsernamePasswordAuthenticationFilter.java b/screwdriver-3.5.6/box/snippets/java/DomainUsernamePasswordAuthenticationFilter.java new file mode 100644 index 0000000..61c7ce1 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/java/DomainUsernamePasswordAuthenticationFilter.java @@ -0,0 +1,39 @@ +package +zoccolo+.web.authentication; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.security.authentication.AuthenticationServiceException; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; + +import +zoccolo+.web.authentication.DomainUsernamePasswordAuthenticationToken; + +/** + * An extension to the existing {@link UsernamePasswordAuthenticationFilter} that obtains a domain parameter and then + * creates a {@link DomainUsernamePasswordAuthenticationToken}. + * + * @author Rob Winch + * + */ +public final class DomainUsernamePasswordAuthenticationFilter extends UsernamePasswordAuthenticationFilter { + + public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) + throws AuthenticationException { + if (!request.getMethod().equals("POST")) { + throw new AuthenticationServiceException("Authentication method not supported: " + request.getMethod()); + } + + String username = obtainUsername(request); + String password = obtainPassword(request); + String domain = request.getParameter("domain"); + + DomainUsernamePasswordAuthenticationToken authRequest = new DomainUsernamePasswordAuthenticationToken(username, + password, domain); + + setDetails(request, authRequest); + return this.getAuthenticationManager().authenticate(authRequest); + } + /* screwdriver_knife */ +} \ No newline at end of file diff --git a/screwdriver-3.5.6/box/snippets/java/DomainUsernamePasswordAuthenticationToken.java b/screwdriver-3.5.6/box/snippets/java/DomainUsernamePasswordAuthenticationToken.java new file mode 100644 index 0000000..e965f1d --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/java/DomainUsernamePasswordAuthenticationToken.java @@ -0,0 +1,34 @@ +package +zoccolo+.web.authentication; + +import java.util.Collection; + +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.GrantedAuthority; + +import +jpapath+.+tabella+; + +public final class DomainUsernamePasswordAuthenticationToken + + extends UsernamePasswordAuthenticationToken { + + private final String domain; + + public DomainUsernamePasswordAuthenticationToken(String principal, String credentials, String domain) { + super(principal, credentials); + this.domain = domain; + } + + public DomainUsernamePasswordAuthenticationToken(+tabella+ principal, String credentials, String domain, + Collection authorities) { + super(principal, credentials, authorities); + this.domain = domain; + } + + public String getDomain() { + return domain; + } + + private static final long serialVersionUID = -5138870746127783L; + + /* screwdriver_knife */ +} diff --git a/screwdriver-3.5.6/box/snippets/java/DoorControllerBelong.java b/screwdriver-3.5.6/box/snippets/java/DoorControllerBelong.java new file mode 100644 index 0000000..b5b8698 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/java/DoorControllerBelong.java @@ -0,0 +1,43 @@ +package +zoccolo+.web.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.servlet.ModelAndView; +import javax.servlet.http.HttpServletRequest; + +import +zoccolo+.web.model.utility.Notice; +/**

+ * Home page controller. + *

+*/ +@Controller +public class DoorControllerBelong { + + @RequestMapping("/") + public String welcome() { + return "home/index"; + } + + @RequestMapping("/default") + public String welcomeDefault() { + return "home/index"; + } + + @RequestMapping("/login/form") + public String chiSei() { + return "home/login"; + } + + +signup+ + + @RequestMapping("/answers/errorPage") + public ModelAndView materia_1(HttpServletRequest request) { + Notice notice = new Notice(); + notice.setScrewFormattedText("Unauthorized access, user " + + request.getUserPrincipal().getName() + + " has no sufficient faculties."); + return new ModelAndView("answers/error", "belong", notice); + } + + /* screwdriver_knife */ +} diff --git a/screwdriver-3.5.6/box/snippets/java/GenericComponent.java b/screwdriver-3.5.6/box/snippets/java/GenericComponent.java new file mode 100644 index 0000000..73f33bf --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/java/GenericComponent.java @@ -0,0 +1,19 @@ +package +zoccolo+.web.controller; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; + +public class GenericComponent { + + protected final Log logger = LogFactory.getLog(this.getClass()); + + @Autowired + public ApplicationContext context; + + public String getMessage(String key, Object ...variables) { + return context.getMessage(key, variables, null); + } + +} \ No newline at end of file diff --git a/screwdriver-3.5.6/box/snippets/java/GenericController.java b/screwdriver-3.5.6/box/snippets/java/GenericController.java new file mode 100644 index 0000000..864c8ee --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/java/GenericController.java @@ -0,0 +1,43 @@ +package +zoccolo+.web.controller; + +import +zoccolo+.web.controller.GenericComponent; + +import javax.servlet.http.HttpServletRequest; + +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.servlet.ModelAndView; + +public class GenericController extends GenericComponent { + + @ExceptionHandler(Exception.class) + public ModelAndView handleError(HttpServletRequest req, Exception exception) { + logger.error("Request: " + req.getRequestURL() + " raised " + exception); + + exception.printStackTrace(); + ModelAndView mav = new ModelAndView("page.error"); + + return mav; + } + + + protected String localizeViewName(String viewBaseName, HttpServletRequest request) { + + String ret = viewBaseName; + String lang = getSessionAttribute("lang", request); + + if ("en".equals(lang)) + ret += ".en"; + return ret; + } + + @SuppressWarnings("unchecked") + protected T getSessionAttribute(String name, HttpServletRequest request) { + try { + T toReturn = (T) request.getSession().getAttribute(name); + return toReturn == null ? null : toReturn; + } catch (ClassCastException e) { + return null; + } + } + +} \ No newline at end of file diff --git a/screwdriver-3.5.6/box/snippets/java/GenericCrud.java b/screwdriver-3.5.6/box/snippets/java/GenericCrud.java new file mode 100644 index 0000000..24c1520 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/java/GenericCrud.java @@ -0,0 +1,114 @@ +package +zoccolo+.generic; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +import org.hibernate.Criteria; +import org.hibernate.HibernateException; +import org.hibernate.Query; +import org.hibernate.Session; +import org.hibernate.criterion.Criterion; +import org.hibernate.criterion.Order; +import org.hibernate.criterion.Projections; +import org.springframework.dao.DataAccessException; + +public abstract interface GenericCrud { + + public abstract void clear() + + throws DataAccessException, Exception; + + public abstract void delete(T entity) + + throws DataAccessException, Exception; + + public abstract void deleteById(ID id) + + throws DataAccessException, Exception; + + public abstract List findAll() + + throws HibernateException, Exception; + + public abstract List findAll(Order order) + + throws HibernateException, Exception; + + public abstract List findByCriteria(Criterion... criterion) + + throws HibernateException, Exception; + + public abstract List findByCriteria(Order order, Criterion... criterion) + + throws HibernateException, Exception; + + public abstract T findUniqueByCriteria(Criterion... criterion) + + throws HibernateException, Exception; + + public abstract List findByExample(T exampleInstance, + String[] excludeProperty) + + throws HibernateException, Exception; + + public abstract T findById(ID id, boolean lock) + + throws DataAccessException, Exception; + + public abstract void flush() + + throws DataAccessException, Exception; + + public abstract T makePersistent(T entity) + + throws DataAccessException, Exception; + + public abstract void makeTransient(T entity) + + throws DataAccessException, Exception; + + public abstract void save(T entity) + + throws DataAccessException, Exception; + + public abstract void saveOrUpdate(T entity) + + throws DataAccessException, Exception; + + public void update(T entity) + + throws DataAccessException, Exception; + + public void merge(T entity) + + throws DataAccessException, Exception; + + public String getDialect() + + throws HibernateException, Exception; + + public List oneColumnQuery(final String q) + + throws HibernateException, Exception; + + public List manyColumnQuery(final String q) + + throws HibernateException; + + public Integer howManyRows(Criterion... criterion) + + throws DataAccessException; + + public Integer howManyRows() + + throws DataAccessException; + + public Integer howManyRowsAlias(String p, String alias, + Criterion... criterion) + + throws DataAccessException; + + /* screwdriver_knife */ + +} \ No newline at end of file diff --git a/screwdriver-3.5.6/box/snippets/java/GenericRailDaoImplJPA1.java b/screwdriver-3.5.6/box/snippets/java/GenericRailDaoImplJPA1.java new file mode 100644 index 0000000..c44217a --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/java/GenericRailDaoImplJPA1.java @@ -0,0 +1,221 @@ +package +zoccolo+.+rail+; + +import +zoccolo+.generic.GenericCrud; + +import java.io.Serializable; +import java.lang.reflect.ParameterizedType; +import java.util.ArrayList; +import java.util.List; + +import org.hibernate.Criteria; +import org.hibernate.HibernateException; +import org.hibernate.LockMode; +import org.hibernate.Query; +import org.hibernate.Session; +import org.hibernate.criterion.Criterion; +import org.hibernate.criterion.Example; +import org.hibernate.criterion.Order; +import org.hibernate.criterion.Projections; +import org.hibernate.impl.SessionFactoryImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.dao.DataAccessException; +import org.springframework.orm.hibernate3.HibernateTemplate; +import org.springframework.transaction.annotation.Transactional; + +@Transactional("+rail+TxManager") +public abstract class Generic+Rail+DaoImpl + implements GenericCrud { + + private final Class persistentClass; + + @Autowired(required = true) + @Qualifier("+rail+Template") + protected HibernateTemplate +rail+Template; + + @SuppressWarnings("unchecked") + public Generic+Rail+DaoImpl() { + this.persistentClass = (Class) ((ParameterizedType) getClass() + .getGenericSuperclass()).getActualTypeArguments()[0]; + } + + public void clear() throws DataAccessException { + +rail+Template.clear(); + } + + public void delete(T entity) throws DataAccessException { + +rail+Template.delete(entity); + } + + public void deleteById(ID id) throws DataAccessException { + T entity = +rail+Template.get(persistentClass, id); + +rail+Template.delete(entity); + } + + public List findAll() throws HibernateException { + return findByCriteria(); + } + + @SuppressWarnings("unchecked") + public List findAll(Order order) throws HibernateException { + Criteria crit = +rail+Template.getSessionFactory().getCurrentSession() + .createCriteria(persistentClass); + crit.addOrder(order); + return crit.list(); + } + + @SuppressWarnings("unchecked") + public List findByCriteria(Order order, Criterion... criterion) + throws HibernateException { + Criteria criteria = +rail+Template.getSessionFactory().getCurrentSession() + .createCriteria(persistentClass).addOrder(order); + for (Criterion c : criterion) { + criteria.add(c); + } + return criteria.list(); + } + + @SuppressWarnings("unchecked") + public List findByCriteria(Criterion... criterion) + throws HibernateException { + Criteria criteria = +rail+Template.getSessionFactory() + .getCurrentSession().createCriteria(persistentClass); + for (Criterion c : criterion) { + criteria.add(c); + } + return criteria.list(); + } + + @SuppressWarnings("unchecked") + public String getDialect() + + throws HibernateException { + + SessionFactoryImpl sfi = (SessionFactoryImpl) +rail+Template + .getSessionFactory(); + return sfi.getDialect().toString(); + } + + @SuppressWarnings("unchecked") + public List oneColumnQuery(final String q) + + throws HibernateException { + + Session session = +rail+Template.getSessionFactory() + .getCurrentSession(); + Query query = session.createQuery(q); + return (List) query.list(); + } + + @SuppressWarnings("unchecked") + public List manyColumnQuery(final String q) + + throws HibernateException { + + Session session = +rail+Template.getSessionFactory() + .getCurrentSession(); + Query query = session.createQuery(q); + return (List) query.list(); + } + + @Override + public Integer howManyRows(Criterion... criterion) + + throws DataAccessException { + + Criteria criteria = +rail+Template.getSessionFactory().getCurrentSession() + .createCriteria(persistentClass) + .setProjection(Projections.rowCount()); + for (Criterion c : criterion) { + criteria.add(c); + } + return (Integer)criteria.uniqueResult(); + } + + @Override + public Integer howManyRowsAlias(String p, String alias, Criterion... criterion) + + throws DataAccessException { + + Criteria criteria = +rail+Template.getSessionFactory().getCurrentSession() + .createCriteria(persistentClass) + .setProjection(Projections.rowCount()); + criteria.createAlias(p, alias); + for (Criterion c : criterion) { + criteria.add(c); + } + return (Integer)criteria.uniqueResult(); + } + + @Override + public Integer howManyRows() throws DataAccessException { + Criteria criteria = +rail+Template.getSessionFactory().getCurrentSession() + .createCriteria(persistentClass) + .setProjection(Projections.rowCount()); + return (Integer)criteria.uniqueResult(); + } + + @SuppressWarnings("unchecked") + public T findUniqueByCriteria(Criterion... criterion) + throws HibernateException { + Criteria crit = +rail+Template.getSessionFactory().getCurrentSession() + .createCriteria(persistentClass); + for (Criterion c : criterion) { + crit.add(c); + } + return (T) crit.uniqueResult(); + } + + @SuppressWarnings("unchecked") + public List findByExample(T exampleInstance, String[] excludeProperty) + throws HibernateException { + Criteria crit = +rail+Template.getSessionFactory().getCurrentSession() + .createCriteria(persistentClass); + Example example = Example.create(exampleInstance); + for (String exclude : excludeProperty) { + example.excludeProperty(exclude); + } + crit.add(example); + return crit.list(); + } + + public T findById(ID id, boolean lock) throws DataAccessException { + T entity; + if (lock) + entity = +rail+Template.load(persistentClass, id, LockMode.UPGRADE); + else + entity = +rail+Template.load(persistentClass, id); + + return entity; + } + + public void flush() throws DataAccessException { + +rail+Template.flush(); + } + + public T makePersistent(T entity) throws DataAccessException { + +rail+Template.saveOrUpdate(entity); + return entity; + } + + public void makeTransient(T entity) throws DataAccessException { + +rail+Template.delete(entity); + } + + public void save(T entity) throws DataAccessException { + +rail+Template.save(entity); + } + + public void saveOrUpdate(T entity) throws DataAccessException { + +rail+Template.saveOrUpdate(entity); + } + + public void update(T entity) throws DataAccessException { + +rail+Template.update(entity); + } + + public void merge(T entity) throws DataAccessException { + +rail+Template.merge(entity); + } + /* screwdriver_knife */ +} diff --git a/screwdriver-3.5.6/box/snippets/java/GenericRailDaoImplJPA2.java b/screwdriver-3.5.6/box/snippets/java/GenericRailDaoImplJPA2.java new file mode 100644 index 0000000..a81ab3b --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/java/GenericRailDaoImplJPA2.java @@ -0,0 +1,332 @@ +package +zoccolo+.+rail+; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.PersistenceException; +import javax.persistence.Tuple; +import javax.persistence.TypedQuery; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Expression; +import javax.persistence.criteria.Predicate; +import javax.persistence.criteria.Root; +import javax.persistence.Query; + +import org.apache.log4j.LogManager; +import org.apache.log4j.Logger; +import org.springframework.transaction.annotation.Transactional; + +import +zoccolo+.jpa.Filter; +import +zoccolo+.jpa.Order; +import +zoccolo+.jpa.OrderBuilder.OrderType; +import +zoccolo+.jpa.PaginatedFilter; +import +zoccolo+.jpa.SearchParameter; +import +zoccolo+.jpa.dao.GenericDao; + +/** + * Implementation of the interface for dao management.
+ * IMPORTANT - Reference to the persistence context JPA is set in this implementation. + * + * @param + */ +public abstract class Generic+Rail+DaoImpl implements GenericDao { + + public static final Logger logger = LogManager.getLogger(Generic+Rail+DaoImpl.class); + + @PersistenceContext(unitName="+rail+EntityManagerFactory") + protected EntityManager em; + + protected String generateDebugParameters(List> parameters) { + if (parameters == null || parameters.size() == 0) { + return "[]"; + } + StringBuffer paramsDebug = new StringBuffer("["); + for (SearchParameter parameter : parameters) { + paramsDebug.append(" ").append(parameter.getName()).append("=").append(parameter.getValue()); + } + paramsDebug.append("]"); + + return paramsDebug.toString(); + } + + protected List createOrderClauseList(CriteriaBuilder cb, Root root, Order[] order) { + List orderList = new ArrayList(); + if (order == null) return orderList; + + for (Order ord : order) { + if (OrderType.ASC.toString().equals(ord.getAsc())) { + orderList.add(cb.asc(root.get(ord.getOrder()))); + } else { + orderList.add(cb.desc(root.get(ord.getOrder()))); + } + } + return orderList; + } + + @Transactional(rollbackFor=PersistenceException.class) + public T create(T entity) { + if (logger.isDebugEnabled()) logger.debug("Create entity: " + entity); + em.persist(entity); + em.flush(); + return entity; + } + + @Transactional(rollbackFor=PersistenceException.class) + public T update(T entity) { + // Check if instance is detached + if (!em.contains(entity)) { + if (logger.isDebugEnabled()) logger.debug("Update entity: " + entity); + entity = em.merge(entity); + } + em.flush(); + return entity; + } + + @Transactional(rollbackFor=PersistenceException.class) + public void remove(T entity) { + if (logger.isDebugEnabled()) logger.debug("Remove entity: " + entity); + // check if instance is detached + if (!em.contains(entity)) { + entity = em.merge(entity); + } + em.remove(entity); + em.flush(); + } + + public T findUniqueById(Class entityClass, Integer id) { + if (logger.isDebugEnabled()) logger.debug("findUniqueById(" + entityClass.getName() + ", " + id + ")"); + T result = em.find(entityClass, id); + return result; + } + + public T findUniqueById(Class entityClass, Long id) { + if (logger.isDebugEnabled()) logger.debug("findUniqueById(" + entityClass.getName() + ", " + id + ")"); + T result = em.find(entityClass, id); + return result; + } + + public T findUniqueById(Class entityClass, String id) { + if (logger.isDebugEnabled()) logger.debug("findUniqueById(" + entityClass.getName() + ", '" + id + "')"); + T result = em.find(entityClass, id); + return result; + } + + public Collection findListBy(Class entityClass, String fieldName, + Class fieldClass, Object fieldValue) { + + CriteriaBuilder cb = em.getCriteriaBuilder(); + + CriteriaQuery cq = cb.createQuery(entityClass); + Root root = cq.from(entityClass); + + Predicate predicate = cb.equal( + root.get(fieldName).as(fieldClass), + fieldValue); + + cq.where(predicate); + + TypedQuery tq = em.createQuery(cq); + + if (logger.isDebugEnabled()) logger.debug("Start of findListBy(" + entityClass + "," + + " '" + fieldName + "'" + " " + fieldClass + "" + " '" + fieldValue + "')"); + Collection results = tq.getResultList(); + + return results; + } + + public List like(Class fieldClazz, String fieldName, + Class valueClazz, String fieldValue) { + + CriteriaBuilder cb = em.getCriteriaBuilder(); + + CriteriaQuery cq = cb.createQuery(fieldClazz); + Root root = cq.from(fieldClazz); + + + Predicate predicate = cb.like( + (Expression)cb.upper( root.get(fieldName).as(valueClazz)), "%"+ + fieldValue.toUpperCase()+"%"); + + cq.where(predicate); + + TypedQuery tq = em.createQuery(cq); + + List results = tq.getResultList(); + + return results; + } + + public Collection findAll(Class entityClass, Order ... order) { + CriteriaBuilder cb = em.getCriteriaBuilder(); + + CriteriaQuery cq = cb.createQuery(entityClass); + Root root = cq.from(entityClass); + + cq.orderBy(createOrderClauseList(cb, root, order)); + + TypedQuery tq = em.createQuery(cq); + + if (logger.isDebugEnabled()) logger.debug("Start of findAll(" + entityClass + ") method"); + Collection result = tq.getResultList(); + + return result; + } + + public Boolean exists(Class entityClass, Integer id) { + if (logger.isDebugEnabled()) logger.debug("Start of exists(" + entityClass + ", " + id + ") method"); + T result = em.find(entityClass, id); + return result == null ? false : true; + } + + public Boolean exists(Class entityClass, Long id) { + if (logger.isDebugEnabled()) logger.debug("Start of exists(" + entityClass + ", " + id + ") method"); + T result = em.find(entityClass, id); + return result == null ? false : true; + } + + public Boolean exists(Class entityClass, String id) { + if (logger.isDebugEnabled()) logger.debug("Start of exists(" + entityClass + ", " + id + ") method"); + T result = em.find(entityClass, id); + return result == null ? false : true; + } + + /** + * Metodo da implementare per effettuare un'inizializzazione di una entity + * con caricamenti di dati lazy. Per default restituisce la entity + * inalterata. + * + * la HibernateUtils.initialize(). + * + * @param entity + * @return + */ + protected T load(T entity) { + return entity; + } + + protected void setPagination(TypedQuery tq, Filter filter) { + if (filter instanceof PaginatedFilter) { + PaginatedFilter pfilter = (PaginatedFilter) filter; + + int firstResult = pfilter.getFirstResult(); + int pageSize = pfilter.getPageSize(); + + if (logger.isTraceEnabled()) logger.trace("Range (" + firstResult + ", " + pageSize + ")"); + tq.setFirstResult(firstResult); + tq.setMaxResults(pageSize); + } + } + + public Long count(Class entityClass) { + CriteriaBuilder cb = em.getCriteriaBuilder(); + CriteriaQuery cq = cb.createQuery(Long.class); + Root root = cq.from(entityClass); + cq.select(cb.count(root)); + + TypedQuery tq = em.createQuery(cq); + Long result = tq.getSingleResult(); + return result; + } + + public Long count(Class entityClass, Filter filter) { + CriteriaBuilder cb = em.getCriteriaBuilder(); + CriteriaQuery cq = cb.createQuery(Long.class); + Root root = cq.from(entityClass); + + List predicates = new ArrayList(); + if (!filter.getParams().isEmpty()) { + predicates.add(getLikePredicate(cb, root, filter.getParams())); + } + if (predicates.size() > 0) { + cq.where(cb.and(predicates.toArray(new Predicate[] {}))); + } + + cq.select(cb.count(root)); + + TypedQuery tq = em.createQuery(cq); + Long result = tq.getSingleResult(); + return result; + } + + + @SuppressWarnings("unchecked") + public List fetch(Class entityClass, Filter filter, Order... order) { + CriteriaBuilder cb = em.getCriteriaBuilder(); + CriteriaQuery cq = cb.createTupleQuery(); + Root root = cq.from(entityClass); + + List predicates = new ArrayList(); + if (!filter.getParams().isEmpty()) { + predicates.add(getLikePredicate(cb, root, filter.getParams())); + } + if (predicates.size() > 0) { + cq.where(cb.and(predicates.toArray(new Predicate[] {}))); + } + + cq.select(cb.tuple(root)); + + cq.distinct(true); + + cq.orderBy(createOrderClauseList(cb, root, order)); + + TypedQuery tq = em.createQuery(cq); + + setPagination(tq, filter); + List results = tq.getResultList(); + List loadedResults = new ArrayList(); + for (Tuple result : results) { + loadedResults.add(load((T) result.get(0))); + } + return loadedResults; + } + + + public boolean existsByFilename(Class entityClass, SearchParameter fileName) { + CriteriaBuilder cb = em.getCriteriaBuilder(); + CriteriaQuery cq = cb.createQuery(Long.class); + Root root = cq.from(entityClass); + + Predicate p = cb.equal(root.get(fileName.getName()).as(String.class), fileName.getValue()); + cq.where(p); + + cq.select(cb.count(root)); + + TypedQuery tq = em.createQuery(cq); + Long result = tq.getSingleResult(); + return result > 0; + } + + private Predicate getLikePredicate(CriteriaBuilder cb, Root root, List> parameters) { + List orPredicates = new ArrayList(); + + for (SearchParameter parameter : parameters) { + orPredicates.add(cb.like(cb.upper(root.get(parameter.getName()).as(String.class)), "%" + parameter.getValue().toUpperCase() + "%")); + } + + return cb.or(orPredicates.toArray(new Predicate[] {})); + } + + @SuppressWarnings("unchecked") + + public List oneColumnQuery(final String string) { + Query qu = em.createQuery(string); + List sE = qu.getResultList(); + return sE; + } + + public List manyColumnQuery(final String string) { + Query qu = em.createQuery(string); + List sE = qu.getResultList(); + return sE; + } + + public Object findByPrimary(Class entityClass, Object chiave) { + Object x = em.find(entityClass, chiave); + return x; + } + /* screwdriver_knife */ +} diff --git a/screwdriver-3.5.6/box/snippets/java/GenericRailDaoImplJPA2JRE7.java b/screwdriver-3.5.6/box/snippets/java/GenericRailDaoImplJPA2JRE7.java new file mode 100644 index 0000000..7e283f8 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/java/GenericRailDaoImplJPA2JRE7.java @@ -0,0 +1,349 @@ +package +zoccolo+.+rail+; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.PersistenceException; +import javax.persistence.Tuple; +import javax.persistence.TypedQuery; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Expression; +import javax.persistence.criteria.Predicate; +import javax.persistence.criteria.Root; +import javax.persistence.Query; + +import org.apache.log4j.LogManager; +import org.apache.log4j.Logger; +import org.springframework.transaction.annotation.Transactional; + +import +zoccolo+.jpa.Filter; +import +zoccolo+.jpa.Order; +import +zoccolo+.jpa.OrderBuilder.OrderType; +import +zoccolo+.jpa.PaginatedFilter; +import +zoccolo+.jpa.SearchParameter; +import +zoccolo+.jpa.dao.GenericDao; + +/** + * Implementation of the interface for dao management.
+ * IMPORTANT - Reference to the persistence context JPA is set in this implementation. + * + * @param + */ +public abstract class Generic+Rail+DaoImpl implements GenericDao { + + public static final Logger logger = LogManager.getLogger(Generic+Rail+DaoImpl.class); + + @PersistenceContext(unitName="+rail+EntityManagerFactory") + protected EntityManager em; + + protected String generateDebugParameters(List> parameters) { + if (parameters == null || parameters.size() == 0) { + return "[]"; + } + StringBuffer paramsDebug = new StringBuffer("["); + for (SearchParameter parameter : parameters) { + paramsDebug.append(" ").append(parameter.getName()).append("=").append(parameter.getValue()); + } + paramsDebug.append("]"); + + return paramsDebug.toString(); + } + + protected List createOrderClauseList(CriteriaBuilder cb, Root root, Order[] order) { + List orderList = new ArrayList<>(); + if (order == null) return orderList; + + for (Order ord : order) { + if (OrderType.ASC.toString().equals(ord.getAsc())) { + orderList.add(cb.asc(root.get(ord.getOrder()))); + } else { + orderList.add(cb.desc(root.get(ord.getOrder()))); + } + } + return orderList; + } + + @Override + @Transactional(rollbackFor=PersistenceException.class) + public T create(T entity) { + if (logger.isDebugEnabled()) logger.debug("Create entity: " + entity); + em.persist(entity); + em.flush(); + return entity; + } + + @Override + @Transactional(rollbackFor=PersistenceException.class) + public T update(T entity) { + // Check if instance is detached + if (!em.contains(entity)) { + if (logger.isDebugEnabled()) logger.debug("Update entity: " + entity); + entity = em.merge(entity); + } + em.flush(); + return entity; + } + + @Override + @Transactional(rollbackFor=PersistenceException.class) + public void remove(T entity) { + if (logger.isDebugEnabled()) logger.debug("Remove entity: " + entity); + // check if instance is detached + if (!em.contains(entity)) { + entity = em.merge(entity); + } + em.remove(entity); + em.flush(); + } + + @Override + public T findUniqueById(Class entityClass, Integer id) { + if (logger.isDebugEnabled()) logger.debug("findUniqueById(" + entityClass.getName() + ", " + id + ")"); + T result = em.find(entityClass, id); + return result; + } + + @Override + public T findUniqueById(Class entityClass, Long id) { + if (logger.isDebugEnabled()) logger.debug("findUniqueById(" + entityClass.getName() + ", " + id + ")"); + T result = em.find(entityClass, id); + return result; + } + + @Override + public T findUniqueById(Class entityClass, String id) { + if (logger.isDebugEnabled()) logger.debug("findUniqueById(" + entityClass.getName() + ", '" + id + "')"); + T result = em.find(entityClass, id); + return result; + } + + @Override + public Collection findListBy(Class entityClass, String fieldName, + Class fieldClass, Object fieldValue) { + + CriteriaBuilder cb = em.getCriteriaBuilder(); + + CriteriaQuery cq = cb.createQuery(entityClass); + Root root = cq.from(entityClass); + + Predicate predicate = cb.equal( + root.get(fieldName).as(fieldClass), + fieldValue); + + cq.where(predicate); + + TypedQuery tq = em.createQuery(cq); + + if (logger.isDebugEnabled()) logger.debug("Start of findListBy(" + entityClass + "," + + " '" + fieldName + "'" + " " + fieldClass + "" + " '" + fieldValue + "')"); + Collection results = tq.getResultList(); + + return results; + } + + @Override + public List like(Class fieldClazz, String fieldName, + Class valueClazz, String fieldValue) { + + CriteriaBuilder cb = em.getCriteriaBuilder(); + + CriteriaQuery cq = cb.createQuery(fieldClazz); + Root root = cq.from(fieldClazz); + + + Predicate predicate = cb.like( + (Expression)cb.upper( root.get(fieldName).as(valueClazz)), "%"+ + fieldValue.toUpperCase()+"%"); + + cq.where(predicate); + + TypedQuery tq = em.createQuery(cq); + + List results = tq.getResultList(); + + return results; + } + + + @Override + public Collection findAll(Class entityClass, Order ... order) { + CriteriaBuilder cb = em.getCriteriaBuilder(); + + CriteriaQuery cq = cb.createQuery(entityClass); + Root root = cq.from(entityClass); + + cq.orderBy(createOrderClauseList(cb, root, order)); + + TypedQuery tq = em.createQuery(cq); + + if (logger.isDebugEnabled()) logger.debug("Start of findAll(" + entityClass + ") method"); + Collection result = tq.getResultList(); + + return result; + } + + @Override + public Boolean exists(Class entityClass, Integer id) { + if (logger.isDebugEnabled()) logger.debug("Start of exists(" + entityClass + ", " + id + ") method"); + T result = em.find(entityClass, id); + return result == null ? false : true; + } + + @Override + public Boolean exists(Class entityClass, Long id) { + if (logger.isDebugEnabled()) logger.debug("Start of exists(" + entityClass + ", " + id + ") method"); + T result = em.find(entityClass, id); + return result == null ? false : true; + } + + @Override + public Boolean exists(Class entityClass, String id) { + if (logger.isDebugEnabled()) logger.debug("Start of exists(" + entityClass + ", " + id + ") method"); + T result = em.find(entityClass, id); + return result == null ? false : true; + } + + /** + * Metodo da implementare per effettuare un'inizializzazione di una entity + * con caricamenti di dati lazy. Per default restituisce la entity + * inalterata. + * + * la HibernateUtils.initialize(). + * + * @param entity + * @return + */ + protected T load(T entity) { + return entity; + } + + protected void setPagination(TypedQuery tq, Filter filter) { + if (filter instanceof PaginatedFilter) { + PaginatedFilter pfilter = (PaginatedFilter) filter; + + int firstResult = pfilter.getFirstResult(); + int pageSize = pfilter.getPageSize(); + + if (logger.isTraceEnabled()) logger.trace("Range (" + firstResult + ", " + pageSize + ")"); + tq.setFirstResult(firstResult); + tq.setMaxResults(pageSize); + } + } + + @Override + public Long count(Class entityClass) { + CriteriaBuilder cb = em.getCriteriaBuilder(); + CriteriaQuery cq = cb.createQuery(Long.class); + Root root = cq.from(entityClass); + cq.select(cb.count(root)); + + TypedQuery tq = em.createQuery(cq); + Long result = tq.getSingleResult(); + return result; + } + + @Override + public Long count(Class entityClass, Filter filter) { + CriteriaBuilder cb = em.getCriteriaBuilder(); + CriteriaQuery cq = cb.createQuery(Long.class); + Root root = cq.from(entityClass); + + List predicates = new ArrayList<>(); + if (!filter.getParams().isEmpty()) { + predicates.add(getLikePredicate(cb, root, filter.getParams())); + } + if (predicates.size() > 0) { + cq.where(cb.and(predicates.toArray(new Predicate[] {}))); + } + + cq.select(cb.count(root)); + + TypedQuery tq = em.createQuery(cq); + Long result = tq.getSingleResult(); + return result; + } + + @Override + @SuppressWarnings("unchecked") + public List fetch(Class entityClass, Filter filter, Order... order) { + CriteriaBuilder cb = em.getCriteriaBuilder(); + CriteriaQuery cq = cb.createTupleQuery(); + Root root = cq.from(entityClass); + + List predicates = new ArrayList<>(); + if (!filter.getParams().isEmpty()) { + predicates.add(getLikePredicate(cb, root, filter.getParams())); + } + if (predicates.size() > 0) { + cq.where(cb.and(predicates.toArray(new Predicate[] {}))); + } + + cq.select(cb.tuple(root)); + + cq.distinct(true); + + cq.orderBy(createOrderClauseList(cb, root, order)); + + TypedQuery tq = em.createQuery(cq); + + setPagination(tq, filter); + List results = tq.getResultList(); + List loadedResults = new ArrayList(); + for (Tuple result : results) { + loadedResults.add(load((T) result.get(0))); + } + return loadedResults; + } + + @Override + public boolean existsByFilename(Class entityClass, SearchParameter fileName) { + CriteriaBuilder cb = em.getCriteriaBuilder(); + CriteriaQuery cq = cb.createQuery(Long.class); + Root root = cq.from(entityClass); + + Predicate p = cb.equal(root.get(fileName.getName()).as(String.class), fileName.getValue()); + cq.where(p); + + cq.select(cb.count(root)); + + TypedQuery tq = em.createQuery(cq); + Long result = tq.getSingleResult(); + return result > 0; + } + + private Predicate getLikePredicate(CriteriaBuilder cb, Root root, List> parameters) { + List orPredicates = new ArrayList(); + + for (SearchParameter parameter : parameters) { + orPredicates.add(cb.like(cb.upper(root.get(parameter.getName()).as(String.class)), "%" + parameter.getValue().toUpperCase() + "%")); + } + + return cb.or(orPredicates.toArray(new Predicate[] {})); + } + + @SuppressWarnings("unchecked") + @Override + public List oneColumnQuery(final String string) { + Query qu = em.createQuery(string); + List sE = qu.getResultList(); + return sE; + } + + @Override + public List manyColumnQuery(final String string) { + Query qu = em.createQuery(string); + List sE = qu.getResultList(); + return sE; + } + + @Override + public Object findByPrimary(Class entityClass, Object chiave) { + Object x = em.find(entityClass, chiave); + return x; + } + /* screwdriver_knife */ +} diff --git a/screwdriver-3.5.6/box/snippets/java/HttpRequestWrapper.java b/screwdriver-3.5.6/box/snippets/java/HttpRequestWrapper.java new file mode 100644 index 0000000..7379934 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/java/HttpRequestWrapper.java @@ -0,0 +1,83 @@ +package +zoccolo+.web.servlet; + +import +zoccolo+.web.listener.AntiSamyListener; + +import +zoccolo+.web.sanitizer.XssSanitizer; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; + +import org.owasp.validator.html.CleanResults; +import org.owasp.validator.html.PolicyException; +import org.owasp.validator.html.ScanException; + +public class HttpRequestWrapper extends HttpServletRequestWrapper { + + private XssSanitizer sanitizer; + + public HttpRequestWrapper(HttpServletRequest servletRequest) { + super(servletRequest); + this.sanitizer = (XssSanitizer) + this.getSession().getServletContext(). + getAttribute(AntiSamyListener.ANTISAMY_SANITIZER); + if(this.sanitizer == null) + throw new RuntimeException("Antisamy is not bound in ServletContext"); + } + + @Override + public String[] getParameterValues(String parameter) { + String[] retVal = null; + String[] values = super.getParameterValues(parameter); + if(values != null) + { + retVal = new String[values.length]; + for(int i = 0; i < values.length; i++) + { + if(values[i] != null) + retVal[i] = this.cleanXss(values[i]); + else + retVal[i] = values[i]; + } + } + return retVal; + } + + @Override + public String getParameter(String parameter) { + String paramValue = super.getParameter(parameter); + if(paramValue != null) + return this.cleanXss(paramValue); + else + return null; + } + + @Override + public String getHeader(String name) { + String value = super.getHeader(name); + if(value != null) + return this.cleanXss(value); + else + return null; + } + + private String cleanXss(String parameterValue){ + String retVal = null; + if(parameterValue != null) { + try + { + CleanResults cr = this.sanitizer.scan(parameterValue); + retVal = cr.getCleanHTML(); + } + catch (ScanException e) + { + throw new RuntimeException("ScanException: "+e.getMessage()); + } + catch (PolicyException e) + { + throw new RuntimeException("ScanException: "+e.getMessage()); + } + } + return retVal; + } + /* screwdriver_knife */ +} diff --git a/screwdriver-3.5.6/box/snippets/java/JsessionIdRemoveFilter.java b/screwdriver-3.5.6/box/snippets/java/JsessionIdRemoveFilter.java new file mode 100644 index 0000000..2cf1c53 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/java/JsessionIdRemoveFilter.java @@ -0,0 +1,87 @@ +package +zoccolo+.web.filter; + +import java.io.IOException; + +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpServletResponseWrapper; + +/** + * Servlet Filter implementation class JsessionIdRemoveFilter + */ +public class JsessionIdRemoveFilter implements Filter { + + /** + * Default constructor. + */ + public JsessionIdRemoveFilter() { + } + + /** + * @see Filter#destroy() + */ + public void destroy() { + } + + /** + * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain) + */ + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { + if (!(req instanceof HttpServletRequest)) { + chain.doFilter(req, res); + return; + } + + HttpServletRequest request = (HttpServletRequest) req; + HttpServletResponse response = (HttpServletResponse) res; + // Redirect requests with JSESSIONID in URL to clean version + // (old links bookmarked/stored by bots) + // This is ONLY triggered if the request did not also contain a + // JSESSIONID cookie! Which should be fine for bots... + if (request.isRequestedSessionIdFromURL()) { + String url = request.getRequestURL() + .append(request.getQueryString() != null ? "?" + + request.getQueryString() : + "").toString(); + response.setHeader("Location", url); + response.sendError(HttpServletResponse.SC_MOVED_PERMANENTLY); + return; + } + // Prevent rendering of JSESSIONID in URLs for all outgoing links + HttpServletResponseWrapper wrappedResponse = new + HttpServletResponseWrapper( + response) { + @Override + public String encodeRedirectUrl(String url) { + return url; + } + @Override + public String encodeRedirectURL(String url) { + return url; + } + @Override + public String encodeUrl(String url) { + return url; + } + @Override + public String encodeURL(String url) { + return url; + } + }; + + chain.doFilter(req, wrappedResponse); + } + + /** + * @see Filter#init(FilterConfig) + */ + public void init(FilterConfig fConfig) throws ServletException { + } + /* screwdriver_knife */ +} diff --git a/screwdriver-3.5.6/box/snippets/java/King.java b/screwdriver-3.5.6/box/snippets/java/King.java new file mode 100644 index 0000000..e97be1a --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/java/King.java @@ -0,0 +1,27 @@ +package +zoccolo+.domain; + +import java.io.Serializable; + +public class King implements Serializable { + + private String userid; + private String password; + + private static final long serialVersionUID = 8433999509932007961L; + + public String getUserid() { + return userid; + } + + public void setUserid(String userid) { + this.userid = userid; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } +} \ No newline at end of file diff --git a/screwdriver-3.5.6/box/snippets/java/KingDao.java b/screwdriver-3.5.6/box/snippets/java/KingDao.java new file mode 100644 index 0000000..916d8b8 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/java/KingDao.java @@ -0,0 +1,13 @@ +package +zoccolo+.web.authentication; + +import java.util.List; + +import org.springframework.dao.EmptyResultDataAccessException; + +import +zoccolo+.domain.King; + +public interface KingDao { + + King getUser(String id); + +} diff --git a/screwdriver-3.5.6/box/snippets/java/KingDaoImpl.java b/screwdriver-3.5.6/box/snippets/java/KingDaoImpl.java new file mode 100644 index 0000000..78a1fa3 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/java/KingDaoImpl.java @@ -0,0 +1,17 @@ +package +zoccolo+.web.authentication; + +import java.util.List; + +import org.springframework.dao.EmptyResultDataAccessException; +import org.springframework.stereotype.Repository; + +import +zoccolo+.domain.King; + +@Repository +public class KingDaoImpl implements KingDao { + + public King getUser(String id) { + King king = new King(); + return king; + } +} diff --git a/screwdriver-3.5.6/box/snippets/java/LoggedUser.java b/screwdriver-3.5.6/box/snippets/java/LoggedUser.java new file mode 100644 index 0000000..5d9b341 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/java/LoggedUser.java @@ -0,0 +1,16 @@ +package +zoccolo+.web.annotation; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.PARAMETER) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface LoggedUser { + + /* screwdriver_knife */ + +} diff --git a/screwdriver-3.5.6/box/snippets/java/LoggedUserMethodArgumentResolver.java b/screwdriver-3.5.6/box/snippets/java/LoggedUserMethodArgumentResolver.java new file mode 100644 index 0000000..92a0925 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/java/LoggedUserMethodArgumentResolver.java @@ -0,0 +1,45 @@ +package +zoccolo+.web.resolver; + +import +zoccolo+.security.Belonger; +import +zoccolo+.web.annotation.LoggedUser; + +import java.security.Principal; + +import org.springframework.core.MethodParameter; +import org.springframework.security.core.Authentication; +import org.springframework.stereotype.Component; +import org.springframework.web.bind.support.WebArgumentResolver; +import org.springframework.web.bind.support.WebDataBinderFactory; +import org.springframework.web.context.request.NativeWebRequest; +import org.springframework.web.method.support.HandlerMethodArgumentResolver; +import org.springframework.web.method.support.ModelAndViewContainer; + +@Component +public class LoggedUserMethodArgumentResolver + implements HandlerMethodArgumentResolver { + + @Override + public boolean supportsParameter(MethodParameter methodParameter) { + return + methodParameter.getParameterAnnotation(LoggedUser.class) != null + && methodParameter.getParameterType().equals(Belonger.class); + } + + @Override + public Object resolveArgument(MethodParameter methodParameter, + ModelAndViewContainer mavContainer, + NativeWebRequest webRequest, + WebDataBinderFactory binderFactory) throws Exception { + + if (this.supportsParameter(methodParameter)) { + Principal principal = webRequest.getUserPrincipal(); + return principal==null?null:(Belonger) ((Authentication) principal).getPrincipal(); + } + else { + return WebArgumentResolver.UNRESOLVED; + } + } + + /* screwdriver_knife */ + +} diff --git a/screwdriver-3.5.6/box/snippets/java/Notice.java b/screwdriver-3.5.6/box/snippets/java/Notice.java new file mode 100644 index 0000000..139495c --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/java/Notice.java @@ -0,0 +1,40 @@ +package +zoccolo+.web.model.utility; + +import org.apache.log4j.Logger; + +public class Notice { + + /** ordinary logger */ + @SuppressWarnings("unused") + private static final Logger logger = Logger.getLogger( + Notice.class); + + /** proprietà  del bean */ + private String screwFormattedText; + + /** proprietà  del bean */ + private String screwFreeText; + + /** standard get method */ + public String getScrewFreeText() { + return screwFreeText; + } + + /** standard set method, argument String */ + public void setScrewFreeText(String screwFreeText) { + this.screwFreeText = screwFreeText; + } + + /** standard get method */ + public String getScrewFormattedText() { + + return this.screwFormattedText; + } + + /** standard set method, argument String */ + public void setScrewFormattedText(String s) { + + this.screwFormattedText = s; + } + /* screwdriver_knife */ +} diff --git a/screwdriver-3.5.6/box/snippets/java/QuartzJob.java b/screwdriver-3.5.6/box/snippets/java/QuartzJob.java new file mode 100644 index 0000000..53f03b3 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/java/QuartzJob.java @@ -0,0 +1,33 @@ +package +zoccolo+.job; + +import +zoccolo+.task.impl.+Quartztask+TaskImpl; + +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; +import org.apache.log4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.quartz.QuartzJobBean; +import org.springframework.web.context.support.SpringBeanAutowiringSupport; + +public class +Quartzjob+ extends QuartzJobBean { + + private static final Logger log = Logger.getLogger(+Quartzjob+.class); + + @Autowired + +Quartztask+TaskImpl task; + + @Override + protected void executeInternal(JobExecutionContext arg0) + + throws JobExecutionException { + + try { + log.debug("executeInternal..."); + SpringBeanAutowiringSupport + .processInjectionBasedOnCurrentContext(this); + task.execute(arg0); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/screwdriver-3.5.6/box/snippets/java/QuartzTask.java b/screwdriver-3.5.6/box/snippets/java/QuartzTask.java new file mode 100644 index 0000000..7b634e5 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/java/QuartzTask.java @@ -0,0 +1,8 @@ +package +zoccolo+.task; + +import org.quartz.JobExecutionContext; + +public interface +Quartztask+Task { + + public void execute(JobExecutionContext ctx) throws Exception; +} diff --git a/screwdriver-3.5.6/box/snippets/java/QuartzTaskImpl.java b/screwdriver-3.5.6/box/snippets/java/QuartzTaskImpl.java new file mode 100644 index 0000000..76f6286 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/java/QuartzTaskImpl.java @@ -0,0 +1,24 @@ +package +zoccolo+.task.impl; + +import java.util.Date; + +import org.apache.log4j.Logger; +import org.quartz.JobExecutionContext; +import org.springframework.web.context.support.SpringBeanAutowiringSupport; + +import +zoccolo+.task.+Quartztask+Task; + +public class +Quartztask+TaskImpl implements +Quartztask+Task { + + private static final Logger log = Logger.getLogger( + +Quartztask+TaskImpl.class); + + public void execute(JobExecutionContext ctx) + + throws Exception { + + SpringBeanAutowiringSupport + .processInjectionBasedOnCurrentContext(this); + /* screwdriver_knife */ + } +} diff --git a/screwdriver-3.5.6/box/snippets/java/ScrewInterceptor.java b/screwdriver-3.5.6/box/snippets/java/ScrewInterceptor.java new file mode 100644 index 0000000..0462f30 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/java/ScrewInterceptor.java @@ -0,0 +1,38 @@ +package +zoccolo+.web.interceptor; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.web.servlet.HandlerInterceptor; +import org.springframework.web.servlet.ModelAndView; + +public class +nocciolo+ implements HandlerInterceptor { + + public void afterCompletion(HttpServletRequest arg0, + HttpServletResponse arg1, Object arg2, Exception arg3) + throws Exception { + // TODO Auto-generated method stub + } + + public void postHandle(HttpServletRequest arg0, + HttpServletResponse arg1, Object arg2, ModelAndView arg3) + throws Exception { + // TODO Auto-generated method stub + } + + public boolean preHandle(HttpServletRequest arg0, + HttpServletResponse arg1, Object arg2) throws Exception { + /* 2020-01-20: if I set "return false", I obtain a white home page, + * nothing works. */ + return true; + } + + public void afterConcurrentHandlingStarted( + HttpServletRequest request, HttpServletResponse response, Object handler) + throws Exception { + // TODO Auto-generated method stub + } + + /* screwdriver_knife */ + +} diff --git a/screwdriver-3.5.6/box/snippets/java/SimpleSpringSecurityUserContext.java b/screwdriver-3.5.6/box/snippets/java/SimpleSpringSecurityUserContext.java new file mode 100644 index 0000000..42972e6 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/java/SimpleSpringSecurityUserContext.java @@ -0,0 +1,50 @@ +package +zoccolo+.web.authentication; + +import java.util.Collection; + +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.context.SecurityContext; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.stereotype.Component; + +import +zoccolo+.web.authentication.authority.UserAuthorityUtils; +import +tabposition+.+tabella+; + +/** + * An implementation of {@link UserContext} that looks up the {@link CalendarUser} using the Spring Security's + * {@link Authentication} by principal name. + * + * @author Rob Winch + * + */ +@Component +public class SpringSecurityUserContext implements UserContext { + /** + * Get the {@link CalendarUser} by casting the {@link Authentication}'s principal to a {@link CalendarUser}. + */ + @Override + public +tabella+ getCurrentUser() { + SecurityContext context = SecurityContextHolder.getContext(); + Authentication authentication = context.getAuthentication(); + if (authentication == null) { + return null; + } + return (+tabella+) authentication.getPrincipal(); + } + + /** + * Sets the {@link CalendarUser} as the current {@link Authentication}'s principal. It uses + */ + @Override + public void setCurrentUser(+tabella+ user) { + if (user == null) { + throw new IllegalArgumentException("user cannot be null"); + } + Collection authorities = UserAuthorityUtils.createAuthorities(user); + UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(user, + user.get+password+(),authorities); + SecurityContextHolder.getContext().setAuthentication(authentication); + } +} diff --git a/screwdriver-3.5.6/box/snippets/java/SimpleUsernamePasswordAuthenticationFilter.java b/screwdriver-3.5.6/box/snippets/java/SimpleUsernamePasswordAuthenticationFilter.java new file mode 100644 index 0000000..210b2b9 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/java/SimpleUsernamePasswordAuthenticationFilter.java @@ -0,0 +1,47 @@ +package +zoccolo+.web.authentication; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.security.authentication.AuthenticationServiceException; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; + +import +zoccolo+.web.authentication.SimpleUsernamePasswordAuthenticationToken; + +/** + * An extension to the existing + * {@link UsernamePasswordAuthenticationFilter} that obtains + * a domain parameter and then + * creates a {@link DomainUsernamePasswordAuthenticationToken}. + * + * @author Rob Winch + * + */ +public final class SimpleUsernamePasswordAuthenticationFilter + + extends UsernamePasswordAuthenticationFilter { + + public Authentication attemptAuthentication(HttpServletRequest + request, HttpServletResponse response) + + throws AuthenticationException { + + if (!request.getMethod().equals("POST")) { + throw new AuthenticationServiceException( + "Authentication method not supported: " + + request.getMethod()); + } + String username = obtainUsername(request); + String password = obtainPassword(request); + + SimpleUsernamePasswordAuthenticationToken authRequest + = new SimpleUsernamePasswordAuthenticationToken(username, + password); + + setDetails(request, authRequest); + return this.getAuthenticationManager().authenticate(authRequest); + } + /* screwdriver_knife */ +} \ No newline at end of file diff --git a/screwdriver-3.5.6/box/snippets/java/SimpleUsernamePasswordAuthenticationToken.java b/screwdriver-3.5.6/box/snippets/java/SimpleUsernamePasswordAuthenticationToken.java new file mode 100644 index 0000000..1558737 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/java/SimpleUsernamePasswordAuthenticationToken.java @@ -0,0 +1,33 @@ +package +zoccolo+.web.authentication; + +import java.util.Collection; + +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.GrantedAuthority; +import java.math.BigInteger; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +import +jpapath+.+tabella+; + +public final class SimpleUsernamePasswordAuthenticationToken + + extends UsernamePasswordAuthenticationToken { + + private static final long serialVersionUID = -5138870746127783L; + + public SimpleUsernamePasswordAuthenticationToken(String principal, + String credentials) { + super(principal, credentials); + } + + public SimpleUsernamePasswordAuthenticationToken(Utenti principal, + String credentials, + Collection authorities) { + super(principal, credentials, authorities); + } + + +newMethod+ + + /* screwdriver_knife */ +} diff --git a/screwdriver-3.5.6/box/snippets/java/UserAuthorityUtils.java b/screwdriver-3.5.6/box/snippets/java/UserAuthorityUtils.java new file mode 100644 index 0000000..aa16b11 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/java/UserAuthorityUtils.java @@ -0,0 +1,36 @@ +package +zoccolo+.web.authentication.authority; + +import java.util.Collection; +import java.util.List; + +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.AuthorityUtils; + +import +tabposition+.+tabella+; + +/** + * A utility class used for creating the {@link GrantedAuthority}'s given a {@link +tabella+}. In a real solution + * this would be looked up in the existing system, but for simplicity our original system had no notion of authorities. + * + * @author Rob Winch + * + */ +public final class UserAuthorityUtils { + + private static final List ADMIN_ROLES = AuthorityUtils.createAuthorityList("ROLE_ADMIN", + "ROLE_USER"); + private static final List USER_ROLES = AuthorityUtils.createAuthorityList("ROLE_USER"); + + private UserAuthorityUtils() { + + } + + public static Collection createAuthorities(+tabella+ user) { + String username = user.getChiave(); +// NON CANCELLARE + if (username.startsWith("admin")) { + return ADMIN_ROLES; + } + return USER_ROLES; + } +} diff --git a/screwdriver-3.5.6/box/snippets/java/UserContext.java b/screwdriver-3.5.6/box/snippets/java/UserContext.java new file mode 100644 index 0000000..a9927fe --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/java/UserContext.java @@ -0,0 +1,20 @@ +package +zoccolo+.web.authentication; + +import +beanposition+.+bean+; + +public interface UserContext { + + /** + * Gets the currently logged in {@link +bean+} or null if there is no authenticated user. + * + * @return + */ + +bean+ getCurrentUser(); + + /** + * Sets the currently logged in {@link +bean+}. + * @param user the logged in {@link +bean+}. Cannot be null. + * @throws IllegalArgumentException if the {@link +bean+} is null. + */ + void setCurrentUser(+bean+ user); +} diff --git a/screwdriver-3.5.6/box/snippets/java/XssSanitizer.java b/screwdriver-3.5.6/box/snippets/java/XssSanitizer.java new file mode 100644 index 0000000..defb638 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/java/XssSanitizer.java @@ -0,0 +1,37 @@ +package +zoccolo+.web.sanitizer; + +import org.owasp.validator.html.AntiSamy; +import org.owasp.validator.html.CleanResults; +import org.owasp.validator.html.Policy; +import org.owasp.validator.html.PolicyException; +import org.owasp.validator.html.ScanException; + +public class XssSanitizer { + + private AntiSamy antiSamy; + private Policy policy; + + + public XssSanitizer(String policyFilePath) throws PolicyException{ + this.policy = Policy.getInstance(this.getClass().getResourceAsStream(policyFilePath)); + + this.antiSamy = new AntiSamy(this.policy); + } + + public CleanResults scan(String input) throws ScanException, PolicyException{ + if(input == null) + throw new ScanException("input parameter is null."); + CleanResults cleanResults = this.antiSamy.scan(input); + return cleanResults; + } + + public AntiSamy getAntiSamy() { + return antiSamy; + } + + public Policy getPolicy() { + return policy; + } + /* screwdriver_knife */ +} + diff --git a/screwdriver-3.5.6/box/snippets/java/jpa2/Filter.java b/screwdriver-3.5.6/box/snippets/java/jpa2/Filter.java new file mode 100644 index 0000000..1f86f99 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/java/jpa2/Filter.java @@ -0,0 +1,14 @@ +package +zoccolo+.jpa; + +import java.util.ArrayList; +import java.util.List; + +import +zoccolo+.jpa.SearchParameter; + +public class Filter { + private List> params = new ArrayList>(); + + public List> getParams() { + return params; + } +} diff --git a/screwdriver-3.5.6/box/snippets/java/jpa2/GenericDao.java b/screwdriver-3.5.6/box/snippets/java/jpa2/GenericDao.java new file mode 100644 index 0000000..c73bae2 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/java/jpa2/GenericDao.java @@ -0,0 +1,140 @@ +package +zoccolo+.jpa.dao; + +import java.util.Collection; +import java.util.List; + +import +zoccolo+.jpa.Filter; +import +zoccolo+.jpa.Order; +import +zoccolo+.jpa.SearchParameter; + +/** + * Generic CRUD interface implemented by all DAOs. + * + * @param entity to be managed. + */ +public interface GenericDao { + + /** + * Persist the entity in DB (though a flush). + * + * @param entity + * @return + */ + T create(T entity); + + /** + * Flush DB changes made in the entity, merging if the entity + * is detached from the session. + * + * @param entity + * @return + */ + T update(T entity); + + /** + * Effettua la rimozione dell'entity da db, effettuando il flush. + * Esegue il merge se l'entity è detached dalla sessione. + * + * @param entity + */ + void remove(T entity); + + /** + * Ritrova l'entity con id associato. + * + * @param entityClass + * @param id + * @return + */ + T findUniqueById(Class entityClass, Integer id); + + /** + * Ritrova l'entity con id associato. + * + * @param entityClass + * @param id + * @return + */ + T findUniqueById(Class entityClass, Long id); + + /** + * Ritrova l'entity con id associato. + * + * @param entityClass + * @param id + * @return + */ + T findUniqueById(Class entityClass, String id); + + /** + * Effettua una ricerca generica per il valore di un parametro. + * + * @param entityClass Tipo di entity da ricercare. + * @param fieldName Nome del campo di ricerca. + * @param fieldClass Classe del campo di ricerca. + * @param fieldValue Valore del campo di ricerca. + * + * @return Elenco non ordinato dei valori trovati. + */ + Collection findListBy(Class entityClass, String fieldName, Class fieldClass, Object fieldValue); + + /** + * Effettua una ricerca full con ordinamento. + * + * @param entityClass Tipo di entity da ricercare. + * @param order Elenco di elementi di ordinamento + * @return Elenco ordinato di tutti gli elementi della tabella indicata dall'entity. + */ + Collection findAll(Class entityClass, Order ... order); + + /** + * Verifica se esiste un record dall'id specificato. + * + * @param id + * @param entityClass + * @return + */ + Boolean exists(Class entityClass, Integer id); + + /** + * Verifica se esiste un record dall'id specificato. + * + * @param id + * @param entityClass + * @return + */ + Boolean exists(Class entityClass, Long id); + + /** + * Verifica se esiste un record dall'id specificato. + * + * @param id + * @param entityClass + * @return + */ + Boolean exists(Class entityClass, String id); + + /** + * Ottiene una lista di risultati con una like. + * + * @param fieldValue + * @param clazz + * @return + */ + List like(Class fieldClazz, String fieldName, Class class1, String fieldValue); + + Long count(Class entityClass); + + Long count(Class entityClass, Filter filter); + + List fetch(Class entityClass, Filter filter, Order... order); + + boolean existsByFilename(Class entityClass, SearchParameter fileName); + + List oneColumnQuery(final String string); + + List manyColumnQuery(final String string); + + Object findByPrimary(Class entityClass, Object chiave); + +} diff --git a/screwdriver-3.5.6/box/snippets/java/jpa2/GenericDaoImpl.java b/screwdriver-3.5.6/box/snippets/java/jpa2/GenericDaoImpl.java new file mode 100644 index 0000000..4a5e10d --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/java/jpa2/GenericDaoImpl.java @@ -0,0 +1,341 @@ +package +zoccolo+.jpa.dao.impl; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.PersistenceException; +import javax.persistence.Tuple; +import javax.persistence.TypedQuery; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Expression; +import javax.persistence.criteria.Predicate; +import javax.persistence.criteria.Root; +import javax.persistence.Query; + +import org.apache.log4j.LogManager; +import org.apache.log4j.Logger; +import org.springframework.transaction.annotation.Transactional; + +import +zoccolo+.jpa.Filter; +import +zoccolo+.jpa.Order; +import +zoccolo+.jpa.OrderBuilder.OrderType; +import +zoccolo+.jpa.PaginatedFilter; +import +zoccolo+.jpa.SearchParameter; +import +zoccolo+.jpa.dao.GenericDao; + +/** + * Implementation of the interface for dao management.
+ * IMPORTANT - Reference to the persistence context JPA is set in this implementation. + * + * @param + */ +public abstract class GenericDaoImpl implements GenericDao { + + public static final Logger logger = LogManager.getLogger(GenericDaoImpl.class); + + @PersistenceContext(unitName="+rail+EntityManagerFactory") + protected EntityManager em; + + protected String generateDebugParameters(List> parameters) { + if (parameters == null || parameters.size() == 0) { + return "[]"; + } + StringBuffer paramsDebug = new StringBuffer("["); + for (SearchParameter parameter : parameters) { + paramsDebug.append(" ").append(parameter.getName()).append("=").append(parameter.getValue()); + } + paramsDebug.append("]"); + + return paramsDebug.toString(); + } + + protected List createOrderClauseList(CriteriaBuilder cb, Root root, Order[] order) { + List orderList = new ArrayList<>(); + if (order == null) return orderList; + + for (Order ord : order) { + if (OrderType.ASC.toString().equals(ord.getAsc())) { + orderList.add(cb.asc(root.get(ord.getOrder()))); + } else { + orderList.add(cb.desc(root.get(ord.getOrder()))); + } + } + return orderList; + } + + @Override + @Transactional(rollbackFor=PersistenceException.class) + public T create(T entity) { + if (logger.isDebugEnabled()) logger.debug("Create entity: " + entity); + em.persist(entity); + em.flush(); + return entity; + } + + @Override + @Transactional(rollbackFor=PersistenceException.class) + public T update(T entity) { + // Check if instance is detached + if (!em.contains(entity)) { + if (logger.isDebugEnabled()) logger.debug("Update entity: " + entity); + entity = em.merge(entity); + } + em.flush(); + return entity; + } + + @Override + @Transactional(rollbackFor=PersistenceException.class) + public void remove(T entity) { + if (logger.isDebugEnabled()) logger.debug("Remove entity: " + entity); + // check if instance is detached + if (!em.contains(entity)) { + entity = em.merge(entity); + } + em.remove(entity); + em.flush(); + } + + @Override + public T findUniqueById(Class entityClass, Integer id) { + if (logger.isDebugEnabled()) logger.debug("findUniqueById(" + entityClass.getName() + ", " + id + ")"); + T result = em.find(entityClass, id); + return result; + } + + @Override + public T findUniqueById(Class entityClass, Long id) { + if (logger.isDebugEnabled()) logger.debug("findUniqueById(" + entityClass.getName() + ", " + id + ")"); + T result = em.find(entityClass, id); + return result; + } + + @Override + public T findUniqueById(Class entityClass, String id) { + if (logger.isDebugEnabled()) logger.debug("findUniqueById(" + entityClass.getName() + ", '" + id + "')"); + T result = em.find(entityClass, id); + return result; + } + + @Override + public Collection findListBy(Class entityClass, String fieldName, + Class fieldClass, Object fieldValue) { + + CriteriaBuilder cb = em.getCriteriaBuilder(); + + CriteriaQuery cq = cb.createQuery(entityClass); + Root root = cq.from(entityClass); + + Predicate predicate = cb.equal( + root.get(fieldName).as(fieldClass), + fieldValue); + + cq.where(predicate); + + TypedQuery tq = em.createQuery(cq); + + if (logger.isDebugEnabled()) logger.debug("Start of findListBy(" + entityClass + "," + + " '" + fieldName + "'" + " " + fieldClass + "" + " '" + fieldValue + "')"); + Collection results = tq.getResultList(); + + return results; + } + + @Override + public List like(Class fieldClazz, String fieldName, + Class valueClazz, String fieldValue) { + + CriteriaBuilder cb = em.getCriteriaBuilder(); + + CriteriaQuery cq = cb.createQuery(fieldClazz); + Root root = cq.from(fieldClazz); + + + Predicate predicate = cb.like( + (Expression)cb.upper( root.get(fieldName).as(valueClazz)), "%"+ + fieldValue.toUpperCase()+"%"); + + cq.where(predicate); + + TypedQuery tq = em.createQuery(cq); + + List results = tq.getResultList(); + + return results; + } + + + @Override + public Collection findAll(Class entityClass, Order ... order) { + CriteriaBuilder cb = em.getCriteriaBuilder(); + + CriteriaQuery cq = cb.createQuery(entityClass); + Root root = cq.from(entityClass); + + cq.orderBy(createOrderClauseList(cb, root, order)); + + TypedQuery tq = em.createQuery(cq); + + if (logger.isDebugEnabled()) logger.debug("Start of findAll(" + entityClass + ")"); + Collection result = tq.getResultList(); + + return result; + } + + @Override + public Boolean exists(Class entityClass, Long id) { + if (logger.isDebugEnabled()) logger.debug("Start of exists(" + entityClass + ", " + id + ")"); + T result = em.find(entityClass, id); + return result == null ? false : true; + } + + @Override + public Boolean exists(Class entityClass, String id) { + if (logger.isDebugEnabled()) logger.debug("Start of exists(" + entityClass + ", " + id + ")"); + T result = em.find(entityClass, id); + return result == null ? false : true; + } + + /** + * Metodo da implementare per effettuare un'inizializzazione di una entity + * con caricamenti di dati lazy. Per default restituisce la entity + * inalterata. + * + * la HibernateUtils.initialize(). + * + * @param entity + * @return + */ + protected T load(T entity) { + return entity; + } + + protected void setPagination(TypedQuery tq, Filter filter) { + if (filter instanceof PaginatedFilter) { + PaginatedFilter pfilter = (PaginatedFilter) filter; + + int firstResult = pfilter.getFirstResult(); + int pageSize = pfilter.getPageSize(); + + if (logger.isTraceEnabled()) logger.trace("Range (" + firstResult + ", " + pageSize + ")"); + tq.setFirstResult(firstResult); + tq.setMaxResults(pageSize); + } + } + + @Override + public Long count(Class entityClass) { + CriteriaBuilder cb = em.getCriteriaBuilder(); + CriteriaQuery cq = cb.createQuery(Long.class); + Root root = cq.from(entityClass); + cq.select(cb.count(root)); + + TypedQuery tq = em.createQuery(cq); + Long result = tq.getSingleResult(); + return result; + } + + @Override + public Long count(Class entityClass, Filter filter) { + CriteriaBuilder cb = em.getCriteriaBuilder(); + CriteriaQuery cq = cb.createQuery(Long.class); + Root root = cq.from(entityClass); + + List predicates = new ArrayList<>(); + if (!filter.getParams().isEmpty()) { + predicates.add(getLikePredicate(cb, root, filter.getParams())); + } + if (predicates.size() > 0) { + cq.where(cb.and(predicates.toArray(new Predicate[] {}))); + } + + cq.select(cb.count(root)); + + TypedQuery tq = em.createQuery(cq); + Long result = tq.getSingleResult(); + return result; + } + + @Override + @SuppressWarnings("unchecked") + public List fetch(Class entityClass, Filter filter, Order... order) { + CriteriaBuilder cb = em.getCriteriaBuilder(); + CriteriaQuery cq = cb.createTupleQuery(); + Root root = cq.from(entityClass); + + List predicates = new ArrayList<>(); + if (!filter.getParams().isEmpty()) { + predicates.add(getLikePredicate(cb, root, filter.getParams())); + } + if (predicates.size() > 0) { + cq.where(cb.and(predicates.toArray(new Predicate[] {}))); + } + + cq.select(cb.tuple(root)); + + cq.distinct(true); + + cq.orderBy(createOrderClauseList(cb, root, order)); + + TypedQuery tq = em.createQuery(cq); + + setPagination(tq, filter); + List results = tq.getResultList(); + List loadedResults = new ArrayList(); + for (Tuple result : results) { + loadedResults.add(load((T) result.get(0))); + } + return loadedResults; + } + + @Override + public boolean existsByFilename(Class entityClass, SearchParameter fileName) { + CriteriaBuilder cb = em.getCriteriaBuilder(); + CriteriaQuery cq = cb.createQuery(Long.class); + Root root = cq.from(entityClass); + + Predicate p = cb.equal(root.get(fileName.getName()).as(String.class), fileName.getValue()); + cq.where(p); + + cq.select(cb.count(root)); + + TypedQuery tq = em.createQuery(cq); + Long result = tq.getSingleResult(); + return result > 0; + } + + private Predicate getLikePredicate(CriteriaBuilder cb, Root root, List> parameters) { + List orPredicates = new ArrayList(); + + for (SearchParameter parameter : parameters) { + orPredicates.add(cb.like(cb.upper(root.get(parameter.getName()).as(String.class)), "%" + parameter.getValue().toUpperCase() + "%")); + } + + return cb.or(orPredicates.toArray(new Predicate[] {})); + } + + @SuppressWarnings("unchecked") + @Override + public List oneColumnQuery(final String string) { + Query qu = em.createQuery(string); + List sE = qu.getResultList(); + return sE; + } + + @Override + public List manyColumnQuery(final String string) { + Query qu = em.createQuery(string); + List sE = qu.getResultList(); + return sE; + } + + @Override + public Object findByPrimary(Class entityClass, Object chiave) { + Object x = em.find(entityClass, chiave); + return x; + } +} diff --git a/screwdriver-3.5.6/box/snippets/java/jpa2/Order.java b/screwdriver-3.5.6/box/snippets/java/jpa2/Order.java new file mode 100644 index 0000000..411447c --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/java/jpa2/Order.java @@ -0,0 +1,8 @@ +package +zoccolo+.jpa; + +public interface Order { + + public String getOrder(); + public String getAsc(); + +} diff --git a/screwdriver-3.5.6/box/snippets/java/jpa2/OrderBuilder.java b/screwdriver-3.5.6/box/snippets/java/jpa2/OrderBuilder.java new file mode 100644 index 0000000..1d810c5 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/java/jpa2/OrderBuilder.java @@ -0,0 +1,63 @@ +package +zoccolo+.jpa; + +import java.util.ArrayList; +import java.util.List; + +public class OrderBuilder { + + public static enum OrderType { + ASC("asc"), DESC("desc"); + + private String value; + + private OrderType(String value) { + this.value = value; + } + + @Override + public String toString() { + return this.value.toString(); + } + } + + private List orders; + + public OrderBuilder() { + orders = new ArrayList(); + } + + public OrderBuilder add(final String order) { + orders.add(new Order() { + public String getOrder() { + return order; + } + + public String getAsc() { + return OrderType.ASC.toString(); + } + }); + return this; + } + + public OrderBuilder add(final String order, final String asc) { + orders.add(new Order() { + public String getOrder() { + return order; + } + + public String getAsc() { + return asc; + } + }); + return this; + } + + public List getOrders() { + return orders; + } + + public Order[] toArray() { + return orders.toArray(new Order[] {}); + } + +} diff --git a/screwdriver-3.5.6/box/snippets/java/jpa2/PaginatedFilter.java b/screwdriver-3.5.6/box/snippets/java/jpa2/PaginatedFilter.java new file mode 100644 index 0000000..5c829d2 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/java/jpa2/PaginatedFilter.java @@ -0,0 +1,30 @@ +package +zoccolo+.jpa; + +public class PaginatedFilter extends Filter { + + private int firstResult = 1; + + private int pageSize = 5; + + public PaginatedFilter(int firstResult, int pageSize) { + this.firstResult = firstResult; + this.pageSize = pageSize; + } + + public int getFirstResult() { + return firstResult; + } + + public void setFirstResult(int firstResult) { + this.firstResult = firstResult; + } + + public int getPageSize() { + return pageSize; + } + + public void setPageSize(int pageSize) { + this.pageSize = pageSize; + } + +} diff --git a/screwdriver-3.5.6/box/snippets/java/jpa2/SearchParameter.java b/screwdriver-3.5.6/box/snippets/java/jpa2/SearchParameter.java new file mode 100644 index 0000000..d040571 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/java/jpa2/SearchParameter.java @@ -0,0 +1,7 @@ +package +zoccolo+.jpa; + +public interface SearchParameter { + String getName(); + T getValue(); + Class getType(); +} diff --git a/screwdriver-3.5.6/box/snippets/java/jpa2/SearchParameterBuilder.java b/screwdriver-3.5.6/box/snippets/java/jpa2/SearchParameterBuilder.java new file mode 100644 index 0000000..ddfa38b --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/java/jpa2/SearchParameterBuilder.java @@ -0,0 +1,71 @@ +package +zoccolo+.jpa; + +import javax.persistence.metamodel.SingularAttribute; + +public class SearchParameterBuilder { + + public static SearchParameter getStringParam(String name, String value) { + return new StringParameter(name, value); + } + + /** + * Per parametri anonimi. + */ + public static SearchParameter getStringParam(String value) { + return getStringParam("", value); + } + + public static SearchParameter getParam(SingularAttribute sa, final T value) { + return new SingularParameter(sa, value); + } + + /** + * Il value non deve essere null. + */ + public static SearchParameter getParam(final String name, final T value) { + return new SearchParameter() { + @Override + public String getName() { + return name; + } + + @Override + public T getValue() { + return value; + } + + @SuppressWarnings("unchecked") + @Override + public Class getType() { + return (Class) value.getClass(); + } + }; + } + + /** + * Per parametri anonimi. + */ + public static SearchParameter getParam(String value) { + return getParam("", value); + } + + public static SearchParameter getParam(final String name, final T value, final Class clazz) { + return new SearchParameter() { + @Override + public String getName() { + return name; + } + + @Override + public T getValue() { + return value; + } + + @Override + public Class getType() { + return clazz; + } + }; + } + +} diff --git a/screwdriver-3.5.6/box/snippets/java/jpa2/SingularParameter.java b/screwdriver-3.5.6/box/snippets/java/jpa2/SingularParameter.java new file mode 100644 index 0000000..68ee2bb --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/java/jpa2/SingularParameter.java @@ -0,0 +1,31 @@ +package +zoccolo+.jpa; + +import javax.persistence.metamodel.SingularAttribute; + +public class SingularParameter implements SearchParameter { + + private final String name; + + private final T value; + + private final Class type; + + public SingularParameter(SingularAttribute sa, T value) { + this.name = sa.getName(); + this.value = value; + this.type = sa.getJavaType(); + } + + public String getName() { + return name; + } + + public T getValue() { + return value; + } + + public Class getType() { + return type; + } + +} diff --git a/screwdriver-3.5.6/box/snippets/java/jpa2/StringParameter.java b/screwdriver-3.5.6/box/snippets/java/jpa2/StringParameter.java new file mode 100644 index 0000000..4767ebc --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/java/jpa2/StringParameter.java @@ -0,0 +1,26 @@ +package +zoccolo+.jpa; + +public class StringParameter implements SearchParameter { + + private final String name; + + private final String value; + + public StringParameter(String name, String value) { + this.name = name; + this.value = value; + } + + public String getName() { + return name; + } + + public String getValue() { + return value; + } + + public Class getType() { + return String.class; + } + +} diff --git a/screwdriver-3.5.6/box/snippets/java/ldapAuthenticationModel.java b/screwdriver-3.5.6/box/snippets/java/ldapAuthenticationModel.java new file mode 100644 index 0000000..8f6862e --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/java/ldapAuthenticationModel.java @@ -0,0 +1,9 @@ + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + if(authentication == null) { + throw new IllegalStateException("authentication cannot be null. Make sure you are logged in."); + } + Object principal = authentication.getPrincipal(); + model.addAttribute("user", principal); + model.addAttribute("isLdapUserDetails", principal instanceof LdapUserDetails); + model.addAttribute("isLdapPerson", principal instanceof Person); + model.addAttribute("isLdapInetOrgPerson", principal instanceof InetOrgPerson); \ No newline at end of file diff --git a/screwdriver-3.5.6/box/snippets/java/ldapAuthenticationModelService.java b/screwdriver-3.5.6/box/snippets/java/ldapAuthenticationModelService.java new file mode 100644 index 0000000..cbc78f4 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/java/ldapAuthenticationModelService.java @@ -0,0 +1,9 @@ + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + if(authentication == null) { + throw new IllegalStateException("authentication cannot be null. Make sure you are logged in."); + } + Object principal = userDetailsService.loadUserByUsername(authentication.getName()); + model.addAttribute("user", principal); + model.addAttribute("isLdapUserDetails", principal instanceof LdapUserDetails); + model.addAttribute("isLdapPerson", principal instanceof Person); + model.addAttribute("isLdapInetOrgPerson", principal instanceof InetOrgPerson); diff --git a/screwdriver-3.5.6/box/snippets/jsp/base_jsp.txt b/screwdriver-3.5.6/box/snippets/jsp/base_jsp.txt new file mode 100644 index 0000000..60b7b5a --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/jsp/base_jsp.txt @@ -0,0 +1,17 @@ + +<%@ page language="java" pageEncoding="+charset+" contentType="text/html; charset=+charset+" %> +<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> ++sec+ ++pragma+ + + +header+ + +navigation+ + ++belong+ + ++text+ ++footer+ + \ No newline at end of file diff --git a/screwdriver-3.5.6/box/snippets/jsp/error_jsp.txt b/screwdriver-3.5.6/box/snippets/jsp/error_jsp.txt new file mode 100644 index 0000000..e405698 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/jsp/error_jsp.txt @@ -0,0 +1,31 @@ + +<%@ page language="java" pageEncoding="UTF-8" contentType="text/html; charset=UTF-8" %> +<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> +<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %> + + + + + + +navigation+ + +
Error
+

${belong.screwFreeText}

+
+ +
+ + + +

+ +

+ + diff --git a/screwdriver-3.5.6/box/snippets/jsp/footer_jsp.txt b/screwdriver-3.5.6/box/snippets/jsp/footer_jsp.txt new file mode 100644 index 0000000..454e17f --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/jsp/footer_jsp.txt @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/screwdriver-3.5.6/box/snippets/jsp/header_jsp.txt b/screwdriver-3.5.6/box/snippets/jsp/header_jsp.txt new file mode 100644 index 0000000..2fd96ad --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/jsp/header_jsp.txt @@ -0,0 +1,13 @@ +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> + + +titolo+: ${pageTitle} + + + + + + + + + + \ No newline at end of file diff --git a/screwdriver-3.5.6/box/snippets/jsp/login_jsp.txt b/screwdriver-3.5.6/box/snippets/jsp/login_jsp.txt new file mode 100644 index 0000000..3bb4ef5 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/jsp/login_jsp.txt @@ -0,0 +1,59 @@ + +<%@ page language="java" contentType="text/html; charset=ISO-8859-1" + pageEncoding="ISO-8859-1"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> + + + + + + <c:out value="${pageTitle}"/> + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ Failed to login. + + Reason: + +
+
+ +
+ You have been logged out. +
+
+ + + + +
+ +
+
+
+ + \ No newline at end of file diff --git a/screwdriver-3.5.6/box/snippets/jsp/ok_jsp.txt b/screwdriver-3.5.6/box/snippets/jsp/ok_jsp.txt new file mode 100644 index 0000000..9ac34e8 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/jsp/ok_jsp.txt @@ -0,0 +1,22 @@ + +<%@ page language="java" pageEncoding="UTF-8" contentType="text/html; charset=UTF-8" %> +<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> +<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %> + + + + + +
OK
+

${belong.screwFreeText}

+
+ +
+ + + + + diff --git a/screwdriver-3.5.6/box/snippets/jsp/warning_jsp.txt b/screwdriver-3.5.6/box/snippets/jsp/warning_jsp.txt new file mode 100644 index 0000000..5b4320d --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/jsp/warning_jsp.txt @@ -0,0 +1,22 @@ + +<%@ page language="java" pageEncoding="UTF-8" contentType="text/html; charset=UTF-8" %> +<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> +<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %> + + + + + +
Warning
+

${belong.screwFreeText}

+
+ +
+ + + + + diff --git a/screwdriver-3.5.6/box/snippets/listn_0.txt b/screwdriver-3.5.6/box/snippets/listn_0.txt new file mode 100644 index 0000000..03c1701 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/listn_0.txt @@ -0,0 +1,7 @@ + + + org.springframework.web.context.ContextLoaderListener + + + org.springframework.web.context.request.RequestContextListener + \ No newline at end of file diff --git a/screwdriver-3.5.6/box/snippets/pom_build.txt b/screwdriver-3.5.6/box/snippets/pom_build.txt new file mode 100644 index 0000000..32f4aac --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/pom_build.txt @@ -0,0 +1,71 @@ + + +final.name+ + + + ${basedir}/src/main/resources + + *.properties + + + + + + org.apache.maven.plugins + maven-compiler-plugin + +maven.compiler.plugin+ + + ${pom.java.version} + ${pom.java.version} + + + + org.apache.maven.plugins + maven-war-plugin + +maven.war.plugin+ + + .svn/,**/.svn/ + false + + + + maven-clean-plugin + +maven.clean.plugin+ + + + + ${basedir}/src/main/webapp/WEB-INF/lib + + *.jar + + + + ${basedir}/src/main/webapp/WEB-INF/classes + + *.properties + **/*.class + *.xml + + + + + + + org.codehaus.mojo + properties-maven-plugin + 1.0.0 + + + initialize + + read-project-properties + + + + pom.properties + + + + + + + diff --git a/screwdriver-3.5.6/box/snippets/pompr_0.txt b/screwdriver-3.5.6/box/snippets/pompr_0.txt new file mode 100644 index 0000000..e69de29 diff --git a/screwdriver-3.5.6/box/snippets/properties/config.properties b/screwdriver-3.5.6/box/snippets/properties/config.properties new file mode 100644 index 0000000..5520ddd --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/properties/config.properties @@ -0,0 +1 @@ +# screwdriver_knife \ No newline at end of file diff --git a/screwdriver-3.5.6/box/snippets/properties/log4j.properties b/screwdriver-3.5.6/box/snippets/properties/log4j.properties new file mode 100644 index 0000000..2810c2c --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/properties/log4j.properties @@ -0,0 +1,20 @@ +# Root logger option +log4j.rootLogger=INFO, file +# Spring logger option +log4j.logger.org.springframework=WARN + +# Redirect log messages to console +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.Target=System.out +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%c{1}(%M:%L) - %m%n + +# Redirect log messages to a log file +log4j.appender.file=org.apache.log4j.RollingFileAppender + +#outputs to Jboss home +log4j.appender.file.File=${jboss.base.dir}/log/+applicaz+.log +log4j.appender.file.MaxFileSize=5MB +log4j.appender.file.MaxBackupIndex=10 +log4j.appender.file.layout=org.apache.log4j.PatternLayout +log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}(%M:%L) - %m%n \ No newline at end of file diff --git a/screwdriver-3.5.6/box/snippets/robots.txt b/screwdriver-3.5.6/box/snippets/robots.txt new file mode 100644 index 0000000..77470cb --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/robots.txt @@ -0,0 +1,2 @@ +User-agent: * +Disallow: / \ No newline at end of file diff --git a/screwdriver-3.5.6/box/snippets/secuFilte.txt b/screwdriver-3.5.6/box/snippets/secuFilte.txt new file mode 100644 index 0000000..4c11c5a --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/secuFilte.txt @@ -0,0 +1,10 @@ + + springSecurityFilterChain + org.springframework.web.filter.DelegatingFilterProxy + + + springSecurityFilterChain + /* + REQUEST + ERROR + \ No newline at end of file diff --git a/screwdriver-3.5.6/box/snippets/testaDispatcher_3.1.0.RELEASE.txt b/screwdriver-3.5.6/box/snippets/testaDispatcher_3.1.0.RELEASE.txt new file mode 100644 index 0000000..8b9a91d --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/testaDispatcher_3.1.0.RELEASE.txt @@ -0,0 +1,14 @@ + + \ No newline at end of file diff --git a/screwdriver-3.5.6/box/snippets/testaDispatcher_3.1.1.RELEASE.txt b/screwdriver-3.5.6/box/snippets/testaDispatcher_3.1.1.RELEASE.txt new file mode 100644 index 0000000..8b9a91d --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/testaDispatcher_3.1.1.RELEASE.txt @@ -0,0 +1,14 @@ + + \ No newline at end of file diff --git a/screwdriver-3.5.6/box/snippets/testaDispatcher_3.2.13.RELEASE.txt b/screwdriver-3.5.6/box/snippets/testaDispatcher_3.2.13.RELEASE.txt new file mode 100644 index 0000000..8b5c852 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/testaDispatcher_3.2.13.RELEASE.txt @@ -0,0 +1,14 @@ + + \ No newline at end of file diff --git a/screwdriver-3.5.6/box/snippets/testaDispatcher_4.0.3.RELEASE.txt b/screwdriver-3.5.6/box/snippets/testaDispatcher_4.0.3.RELEASE.txt new file mode 100644 index 0000000..d929860 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/testaDispatcher_4.0.3.RELEASE.txt @@ -0,0 +1,14 @@ + + \ No newline at end of file diff --git a/screwdriver-3.5.6/box/snippets/testaDispatcher_4.3.12.RELEASE.txt b/screwdriver-3.5.6/box/snippets/testaDispatcher_4.3.12.RELEASE.txt new file mode 100644 index 0000000..d929860 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/testaDispatcher_4.3.12.RELEASE.txt @@ -0,0 +1,14 @@ + + \ No newline at end of file diff --git a/screwdriver-3.5.6/box/snippets/testaOrm_3.1.0.RELEASE.txt b/screwdriver-3.5.6/box/snippets/testaOrm_3.1.0.RELEASE.txt new file mode 100644 index 0000000..9837e29 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/testaOrm_3.1.0.RELEASE.txt @@ -0,0 +1,18 @@ + + + \ No newline at end of file diff --git a/screwdriver-3.5.6/box/snippets/testaOrm_3.2.13.RELEASE.txt b/screwdriver-3.5.6/box/snippets/testaOrm_3.2.13.RELEASE.txt new file mode 100644 index 0000000..844bfb7 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/testaOrm_3.2.13.RELEASE.txt @@ -0,0 +1,20 @@ + + + \ No newline at end of file diff --git a/screwdriver-3.5.6/box/snippets/testaOrm_4.0.3.RELEASE.txt b/screwdriver-3.5.6/box/snippets/testaOrm_4.0.3.RELEASE.txt new file mode 100644 index 0000000..aed372e --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/testaOrm_4.0.3.RELEASE.txt @@ -0,0 +1,18 @@ + + + \ No newline at end of file diff --git a/screwdriver-3.5.6/box/snippets/testaOrm_4.3.12.RELEASE.txt b/screwdriver-3.5.6/box/snippets/testaOrm_4.3.12.RELEASE.txt new file mode 100644 index 0000000..aed372e --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/testaOrm_4.3.12.RELEASE.txt @@ -0,0 +1,18 @@ + + + \ No newline at end of file diff --git a/screwdriver-3.5.6/box/snippets/testaService_3.1.0.RELEASE.txt b/screwdriver-3.5.6/box/snippets/testaService_3.1.0.RELEASE.txt new file mode 100644 index 0000000..2bc5ed8 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/testaService_3.1.0.RELEASE.txt @@ -0,0 +1,13 @@ + + diff --git a/screwdriver-3.5.6/box/snippets/testaService_3.2.13.RELEASE.txt b/screwdriver-3.5.6/box/snippets/testaService_3.2.13.RELEASE.txt new file mode 100644 index 0000000..8bc23c6 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/testaService_3.2.13.RELEASE.txt @@ -0,0 +1,13 @@ + + diff --git a/screwdriver-3.5.6/box/snippets/testaService_4.0.3.RELEASE.txt b/screwdriver-3.5.6/box/snippets/testaService_4.0.3.RELEASE.txt new file mode 100644 index 0000000..2a54793 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/testaService_4.0.3.RELEASE.txt @@ -0,0 +1,13 @@ + + diff --git a/screwdriver-3.5.6/box/snippets/testaService_4.3.12.RELEASE.txt b/screwdriver-3.5.6/box/snippets/testaService_4.3.12.RELEASE.txt new file mode 100644 index 0000000..2a54793 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/testaService_4.3.12.RELEASE.txt @@ -0,0 +1,13 @@ + + diff --git a/screwdriver-3.5.6/box/snippets/testaSpringProperties_3.1.0.RELEASE.txt b/screwdriver-3.5.6/box/snippets/testaSpringProperties_3.1.0.RELEASE.txt new file mode 100644 index 0000000..ed78abc --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/testaSpringProperties_3.1.0.RELEASE.txt @@ -0,0 +1,13 @@ + + + diff --git a/screwdriver-3.5.6/box/snippets/testaSpringProperties_3.2.13.RELEASE.txt b/screwdriver-3.5.6/box/snippets/testaSpringProperties_3.2.13.RELEASE.txt new file mode 100644 index 0000000..c98bfe3 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/testaSpringProperties_3.2.13.RELEASE.txt @@ -0,0 +1,13 @@ + + + diff --git a/screwdriver-3.5.6/box/snippets/testaSpringProperties_4.0.3.RELEASE.txt b/screwdriver-3.5.6/box/snippets/testaSpringProperties_4.0.3.RELEASE.txt new file mode 100644 index 0000000..fee951d --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/testaSpringProperties_4.0.3.RELEASE.txt @@ -0,0 +1,13 @@ + + + diff --git a/screwdriver-3.5.6/box/snippets/testaSpringSecurity_3.1.txt b/screwdriver-3.5.6/box/snippets/testaSpringSecurity_3.1.txt new file mode 100644 index 0000000..435f40f --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/testaSpringSecurity_3.1.txt @@ -0,0 +1,14 @@ + + \ No newline at end of file diff --git a/screwdriver-3.5.6/box/snippets/testaSpringSecurity_3.2.txt b/screwdriver-3.5.6/box/snippets/testaSpringSecurity_3.2.txt new file mode 100644 index 0000000..61a583b --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/testaSpringSecurity_3.2.txt @@ -0,0 +1,14 @@ + + \ No newline at end of file diff --git a/screwdriver-3.5.6/box/snippets/testaTiles_2.txt b/screwdriver-3.5.6/box/snippets/testaTiles_2.txt new file mode 100644 index 0000000..d2d0d44 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/testaTiles_2.txt @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/screwdriver-3.5.6/box/snippets/testaTiles_3.txt b/screwdriver-3.5.6/box/snippets/testaTiles_3.txt new file mode 100644 index 0000000..c247a00 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/testaTiles_3.txt @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/screwdriver-3.5.6/box/snippets/uvListener.txt b/screwdriver-3.5.6/box/snippets/uvListener.txt new file mode 100644 index 0000000..4a4fa2c --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/uvListener.txt @@ -0,0 +1,3 @@ + + org.springframework.security.web.session.HttpSessionEventPublisher + diff --git a/screwdriver-3.5.6/box/snippets/web.xml.spring.txt b/screwdriver-3.5.6/box/snippets/web.xml.spring.txt new file mode 100644 index 0000000..46e1c06 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/web.xml.spring.txt @@ -0,0 +1,21 @@ + + + + 20 + + + + DispatcherServlet + org.springframework.web.servlet.DispatcherServlet + + contextConfigLocation + + /WEB-INF/spring/DispatcherServlet.xml + + + +startup+ + + + DispatcherServlet + / + diff --git a/screwdriver-3.5.6/box/snippets/web.xml.txt b/screwdriver-3.5.6/box/snippets/web.xml.txt new file mode 100644 index 0000000..ee159ef --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/web.xml.txt @@ -0,0 +1,13 @@ + + + + 20 + + + + + + + + + diff --git a/screwdriver-3.5.6/box/snippets/web_captcha.txt b/screwdriver-3.5.6/box/snippets/web_captcha.txt new file mode 100644 index 0000000..d6f38b7 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/web_captcha.txt @@ -0,0 +1,10 @@ + + SimpleCaptcha + nl.captcha.servlet.SimpleCaptchaServlet + + + + SimpleCaptcha + /captcha.png + diff --git a/screwdriver-3.5.6/box/snippets/weberror.txt b/screwdriver-3.5.6/box/snippets/weberror.txt new file mode 100644 index 0000000..cc2f74f --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/weberror.txt @@ -0,0 +1,10 @@ + + + + 404 + /notFound + + + 500 + /notFound + \ No newline at end of file diff --git a/screwdriver-3.5.6/box/snippets/webmime.txt b/screwdriver-3.5.6/box/snippets/webmime.txt new file mode 100644 index 0000000..81a510e --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/webmime.txt @@ -0,0 +1,20 @@ + + ttf + application/x-font-ttf + + + woff + application/font-woff + + + woff2 + application/font-woff + + + eot + application/vnd.ms-fontobject + + + map + text/plain + \ No newline at end of file diff --git a/screwdriver-3.5.6/box/snippets/xml/policy.xml b/screwdriver-3.5.6/box/snippets/xml/policy.xml new file mode 100644 index 0000000..a16fa6a --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/xml/policy.xml @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + force non-empty with a '+' at the end instead of '*' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + g + grin + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/screwdriver-3.5.6/box/snippets/xml/quartz-job.xml b/screwdriver-3.5.6/box/snippets/xml/quartz-job.xml new file mode 100644 index 0000000..b00a63b --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/xml/quartz-job.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +applicaz+ + AUTO + org.quartz.simpl.SimpleThreadPool + 25 + 5 + 60000 + org.quartz.impl.jdbcjobstore.JobStoreTX + org.quartz.impl.jdbcjobstore.StdJDBCDelegate + false + QRTZ_ + true + 20000 + dataSource + 90000 + + + + + + + + + + + + + + + true + + + + + diff --git a/screwdriver-3.5.6/box/snippets/xml/root-context.xml b/screwdriver-3.5.6/box/snippets/xml/root-context.xml new file mode 100644 index 0000000..5cb2a94 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/xml/root-context.xml @@ -0,0 +1,8 @@ + + + + + + diff --git a/screwdriver-3.5.6/box/snippets/xml/security-ldap-explicitly.xml b/screwdriver-3.5.6/box/snippets/xml/security-ldap-explicitly.xml new file mode 100644 index 0000000..03032c1 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/xml/security-ldap-explicitly.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/screwdriver-3.5.6/box/snippets/xml/webflow.xml b/screwdriver-3.5.6/box/snippets/xml/webflow.xml new file mode 100644 index 0000000..6264743 --- /dev/null +++ b/screwdriver-3.5.6/box/snippets/xml/webflow.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/screwdriver-3.5.6/lib/jsp-api-2.2.jar b/screwdriver-3.5.6/lib/jsp-api-2.2.jar new file mode 100644 index 0000000000000000000000000000000000000000..64e1b74aceb343b444a3cdb34da02023eadf597a GIT binary patch literal 49757 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%0DevZdx-CMXEP^bS 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γNMbA4E@zfF`N4v*BPdvWmV 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�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�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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/screwdriver-3.5.6/pom.xml b/screwdriver-3.5.6/pom.xml new file mode 100644 index 0000000..0f247d6 --- /dev/null +++ b/screwdriver-3.5.6/pom.xml @@ -0,0 +1,51 @@ + + 4.0.0 + it.ramecera.ict + screwdriver + 3.5.6 + screwdriver + http://www.ramecera.it + + UTF-8 + + a java source code generator + + + log4j + log4j + 1.2.17 + + + javax.servlet.jsp + jsp-api + 2.2 + + + + src/main/java + + + org.apache.maven.plugins + maven-compiler-plugin + 2.3.2 + + 1.8 + 1.8 + + + + org.apache.maven.plugins + maven-jar-plugin + 3.1.0 + + + + true + it.ramecera.screwdriver.Hammer + + + + + + + \ No newline at end of file diff --git a/screwdriver-3.5.6/properties.dtd b/screwdriver-3.5.6/properties.dtd new file mode 100644 index 0000000..4a22bd5 --- /dev/null +++ b/screwdriver-3.5.6/properties.dtd @@ -0,0 +1,15 @@ + + + + + + + + + + + + + diff --git a/screwdriver-3.5.6/silver.ele b/screwdriver-3.5.6/silver.ele new file mode 100644 index 0000000..6b5c328 --- /dev/null +++ b/screwdriver-3.5.6/silver.ele @@ -0,0 +1,45 @@ +primary+JBoss EAP 7.1_uv_s4_h5_jpa2 +hvalid+4.2.0.Final +userpass+trivial +xprovider+class +uspaformuser+ramecera,oxford +uspaformadmin+admin,manchester +company+it.ramecera +odefcss+prince+obackcolor+azure+ocolor+darkgreen+opadding+12+ofontsize+90+omargin+120+oalign+center +odefcss+dati+obackcolor+azure+ocolor+black+opadding+20+ofontsize+30+omargin+12+oalign+left +odefcss+mediumheight+obackcolor+azure+ocolor+black+opadding+20+ofontsize+20+omargin+12+oalign+left +bdefmenu+resin+bfixedtop+ +blabel+Home+burl+/ +blabel+Tables list+burl+/whole/list +blabel+AUTHORS+burl+/superior/au_single +blabel+ACTORS+burl+/superior/ac_single +blabel+NOVELS+burl+/superior/no_single +bdefmenu+tray +blabel+Home+burl+/ +blabel+Contribute+burl+/whole/list +indexjsp++bmenu+tray+ooptbackcol1+orange+ooptbackcol2+brown+ooptioncolor+black+ooptionhover+white +text+MY SILVER+cssclass+prince +jsp+master/tables_list.jsp+string+tlnotice+belong+tlnotice+cssclass+mediumheight+bmenu+resin+pagetitle+List of the DB tables +formn+tlbox+flabel+Choose a DB table+fcartel+O---O---O+ftokens+actors, authors, novels +jsp+master/au_single.jsp+string+au_text+belong+au_text+cssclass+mediumheight+bmenu+resin+pagetitle+CRUD on "authors" table+crud+ +formt+key+flabel+Key +formt+name+flabel+First name +formt+surname+flabel+Last name +formn+modifier+flabel+Registered by+fcartel+O---O---O+hsqln+select concat(firstName, ' ', lastName) from Actor where star != 0+dao+IRail0ActorDao +jsp+master/ac_single.jsp+string+ac_text+belong+ac_text+cssclass+mediumheight+bmenu+resin+pagetitle+CRUD on "actors" table+crud+ +formt+key+flabel+Key +formt+name+flabel+First name +formt+surname+flabel+Last name +formr+position+flabel+Work position+ftokens+clerk,manager,chairman+fstart+1 +formn+modifier+flabel+Registered by+fcartel+O---O---O+hsqln+select concat(firstName, ' ', lastName) from Actor where star != 0+dao+IRail0ActorDao +jsp+master/no_single.jsp+string+no_text+belong+no_text+cssclass+mediumheight+bmenu+resin+pagetitle+CRUD on "novels" table+crud+ +formt+key+flabel+Key +formt+name+flabel+Title +formt+language+flabel+Language +formt+no_author+flabel+Author +formn+modifier+flabel+Registered by+fcartel+O---O---O+hsqln+select concat(firstName, ' ', lastName) from Actor where star != 0+dao+IRail0ActorDao +requmap+superior/au_single+goal+master/au_single.jsp+permit+admin +requmap+superior/ac_single+goal+master/ac_single.jsp+permit+admin +requmap+superior/no_single+goal+master/no_single.jsp+permit+admin +requmap+whole/list+goal+master/tables_list.jsp+permit+admin +hdefrail+0+hjndi+waxds+hdbschema+copper+hdbms+postgres \ No newline at end of file diff --git a/screwdriver-3.5.6/silver.properties b/screwdriver-3.5.6/silver.properties new file mode 100644 index 0000000..b815c18 --- /dev/null +++ b/screwdriver-3.5.6/silver.properties @@ -0,0 +1,4 @@ +input_directory=. +output_directory=../. +inside=false +freeze= \ No newline at end of file diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/salad/analysis/CutComments.java b/screwdriver-3.5.6/src/main/java/it/ramecera/salad/analysis/CutComments.java new file mode 100644 index 0000000..28de85f --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/salad/analysis/CutComments.java @@ -0,0 +1,302 @@ +// +// https://www.ramecera.it/myscrewdriver.html +// e-mail: screwdriver@ramecera.it +// +package it.ramecera.salad.analysis; + +import it.ramecera.salad.everyday.Candies; +import it.ramecera.salad.everyday.ExactException; +import it.ramecera.salad.everyday.Mix; +import it.ramecera.salad.everyday.Strings; +import it.ramecera.salad.file.FileBase; + +/** + *

+ * Creation date: 2020-10-03
+ * Last updated: 2020-10-03
+ * Company: Rameceraâ„¢
+ *

+ * + * @author Massimo Maglioni + *

+ * Description: + *

+ */ +public class CutComments { + + /** conventional sign */ + final static private char BELL = 7; + /** conventional sign */ + final static private String BELLS = String.valueOf(BELL); + /** conventional sign */ + final static private char DQ = 34; + + /** + *

+ * Creation date: 2020-04-18
+ * Last updated: 2020-04-18
+ * Company: Ramecera + * + * @author Massimo Maglioni + *

+ * Description: + *

+ * @param s text to process + * @param fb file informations + * @return 3 text strings + * @throws ExactException */ + public static String[] production(final String s, FileBase fb) + + throws ExactException { + + String[] d = new String[3]; + String t = s; + /* I delete all carriage-return characters */ + t = t.replaceAll("\\r", ""); + /* mercy corrections: "/** /**" becomes "/**" */ + t = t.replaceAll("\\x2f\\x2a\\x2a\\x20\\x2f\\x2a\\x2a", "/**"); + /* mercy corrections: "/** /**" becomes "/**" */ + t = t.replaceAll("\\x2f\\x2a\\x2a\\x20+\\x2f\\x2a\\x2a", "/**"); + /* mercy corrections: delete initial string + * "slash** * *slash" */ + t = t.replaceFirst("\\x2f\\x2a\\x2a\\n\\x20\\x2a\\x20\\n\\x" + + "20\\x2a\\x2f\\n", ""); + /* mercy corrections: "// /*" becomes "/**" */ + t = t.replaceAll("\\x2f\\x2f\\x20+\\x2f\\x2a", "/*"); + String[] text1E, text2E; + // -------- PRODUCTION ------------- + /* production of the fliles BCI */ + text1E = production1(fb.fileName, "bci", t, "/*", "*/"); + /* production of the fliles LCI and NUD */ + text2E = production2(fb.fileName, "lci", text1E[1], "//", + Candies.LF); + // --------------------------------- + d[0] = text1E[0]; + d[1] = text2E[0]; + d[2] = text2E[1]; + return d; + } + + /** + *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09
+ * + * @author Massimo Maglioni + *

+ * Description: it produces the block comments text and a + * java file whithout them (line comments are still + * present). + *

+ * @param fileName obvious + * @param extension obvious + * @param input input text + * @param flip the opening string: slash-asterisk + * @param flop the closing string: asterisk-slash + * @return the two text, blocks comments and the nude text(line + * comments are still present). + * @throws ExactException */ + private static String[] production1(final String fileName, + final String extension, final String input, + final String flip, final String flop) + + throws ExactException { + + String t = input; + String[] u = new String[2]; + /* nude text */ + String tn = ""; + String cit = ""; + int lJ = indexSearch(t, flip, fileName, true); + int wJ = lJ; + int endJ = -1, wendJ = 0; + System.out.println(fileName); + while (lJ > -1) { + wJ = lJ; + /* I'm looking for the next one because I have to check that + * the closing of the comment does not go beyond the next + * opening; it would be an important irregularity */ + lJ = indexSearch(t, flip, lJ + 1, true, fileName); + /* max is the maximum limit, it must not go beyond */ + int maxJ = 0; + if (lJ == -1) { + maxJ = t.length(); + } else { + maxJ = lJ; + } + wendJ = endJ; + /* my corrections (+1, +2, -2) keep in mind the opening and + * closing strings */ + endJ = indexSearch(t, flop, wJ + 1, true, fileName) + 2; + if ((endJ == -1 | endJ > maxJ)) { + throw new ExactException("In the file " + fileName + + " the succession of the comments is wrong."); + } else { + /* single is the single block comment */ + /* now the closure was found before maximum value + * (maxJ), so it would be fine... */ + String single = t.substring(wJ + 2, endJ - 2); + String before = t.substring(wendJ + 1, wJ); + /* ...but I must make sure that I have not left behind a + * closure, because it would denounce the consecutive + * presence of 2 closings in the previous block */ + if (indexSearch(before, flop, fileName, false) > -1) { + throw new ExactException("In the file " + fileName + + " the string " + flop + + " is present in a wrong position."); + } + tn += before + extension + BELLS + Candies.LF; + single = Strings.compact_A(single); + /* mercy corrections: search " * ", replace " " */ + single = single.replaceAll("\\x20\\x2a\\x20", " "); + cit += single + Candies.LF; + } + } + tn += t.substring(endJ + 1); + int cL = cit.length(); + if (cL > 0) { + /* I delete the last character, it is a line feed */ + cit = cit.substring(0, cL - 1); + } + u[0] = cit; + u[1] = tn; + return u; + } + + /** + *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09
+ * + * @author Massimo Maglioni + *

+ * Description: it produce the line comments text and a java + * file whithout any comment (nude). + *

+ * @param fileName obvious + * @param extension obvious + * @param input input text + * @param flip the opening string: // + * @param flop the closing string: a line feed + * @return the two text, line comments and the nude text (comments + * are present no more). + * @throws ExactException */ + private static String[] production2(final String fileName, + final String extension, final String input, + final String flip, final String flop) + + throws ExactException { + + String t = input; + String[] u = new String[2]; + String tn = ""; + String cit = ""; + int lJ = indexSearch(t, flip, fileName, false); + int endJ = 0, wendJ = 0; + while (lJ > -1) { + wendJ = endJ; + endJ = indexSearch(t, flop, lJ + 1, false, fileName); + if (endJ == -1) { + endJ = t.length(); + } + String single = t.substring(lJ, endJ); + tn += t.substring(wendJ, lJ) + extension + BELLS; + single = Strings.compact_A(single); + cit += single.substring(2).trim() + Candies.LF; + lJ = indexSearch(t, flip, endJ, false, fileName); + } + tn += t.substring(endJ); + int cL = cit.length(); + if (cL > 0) { + /* I delete the last character, it is a line feed */ + cit = cit.substring(0, cL - 1); + } + u[0] = cit; + u[1] = tn; + return u; + } + + /** + *

+ * Creation date: 2020-04-10
+ * Last updated: 2020-04-10
+ * + * @author Massimo Maglioni + *

+ * Description: + *

+ * @param text + * @param x + * @param k + * @param type true=block comment, false=line comment + * @param fileName obvious + * @return */ + private static int indexSearch(final String text, final String x, + final int k, final boolean type, String fileName) { + int j = 1; + int m = k - 1; + String before0 = null; + while (j % 2 == 1) { + m = text.indexOf(x, m + 1); + if (m == -1 | (x.equals(Candies.LF) & !type)) { + break; + } + int from = 0; + if (k > 1) { + from = k - 1; + } + if (type) { + before0 = text.substring(from, m + 2); // block + } else { + before0 = text.substring(from + 1, m + 2); // line + } + /* I cancel all double backslashes \\ (to avoid error dued + * to possible presence of a string "\\" */ + String before1 = before0.replaceAll("\\x5c\\x5c", ""); + /* I cancel all double quotes contained in a constant string + * (x5cx22-->\") */ + String before2 = before1.replaceAll("\\x5c\\x22", ""); + // /* I cancel all characters contained in a line comment */ + // String before2 = before1.replaceAll("\\x2f\\x2f.+\\n", + // ""); + /* I cancel all double quotes (\") contained in a block + * comment */ + String before3 = before2.replaceAll("\\n", ""); + String before4 = before3.replaceAll("\\r", ""); + String before5 = before4.replaceAll( + "\\x2f\\x2a.+?\\x2a\\x2f", ""); + j = Mix.charQ(before5, DQ); + if (j % 2 == 1) { + // if (x.equals("//")) { + // System.out.println("geppo"); + // } + System.out.println("-----------------cerco>" + x + + "<---- in >" + fileName + + "<------------------"); + // System.out.println("intervento double-quote" + // + Candies.LF + before0); + } + } + return m; + } + + /** + *

+ * Creation date: 2020-04-10
+ * Last updated: 2020-04-10
+ * + * @author Massimo Maglioni + *

+ * Description: + *

+ * @param text + * @param x + * @param type true=block comment, false=line comment + * @param k + * @return */ + private static int indexSearch(final String text, final String x, + final String fileName, boolean type) { + return indexSearch(text, x, 0, type, fileName); + } + +} diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/salad/analysis/Flute.java b/screwdriver-3.5.6/src/main/java/it/ramecera/salad/analysis/Flute.java new file mode 100644 index 0000000..6307cd1 --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/salad/analysis/Flute.java @@ -0,0 +1,513 @@ +// +// https://www.ramecera.it/myscrewdriver.html +// e-mail: screwdriver@ramecera.it +// +/* This program and the accompanying materials are made available under + * the terms of the Eclipse Public License v1.0 which accompanies this + * distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html */ +package it.ramecera.salad.analysis; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import it.ramecera.salad.everyday.Candies; +import it.ramecera.salad.everyday.ExactException; +import it.ramecera.salad.everyday.Mix; +import it.ramecera.salad.everyday.Strings; +import it.ramecera.salad.file.Equipment; + +/** + *

+ * Elementary structure of a Java class; interfaces and inner classes + * are excluded. + *

+ *

+ * Creation date: 2020-04-09
+ * modification date: 2020-04-09
+ * Company: Rameceraâ„¢ + *

+ *

+ * Modifications:
+ *

+ * + * @author M. Maglioni */ +public class Flute { + + // PUBLIC PROPERTIES + + /** the file to be analyzed */ + public File file; + /** the package */ + public String fpackage; + /** if it is abstract */ + public boolean fabstract; + /** the list of imports, without the word import and without a final + * semicolon */ + public List fimportE = new ArrayList(); + /** class name */ + public String fclass; + /** the extends */ + public String fextends; + /** the implementations */ + public String fimplements; + /** visibility: public = 3 default = 1 */ + public int fvisibilita; + /** if it is final */ + public boolean ffinal; + /** if it is static */ + public boolean fstatic; + /** class annotations */ + public List fannotationE; + /** list of class properties */ + public List fpropertyE = new ArrayList(); + /** list of class methods */ + public List fmethodE = new ArrayList(); + + /** scope of the properties of a Java class */ + public static final String[] VISIBILITA = { "default", "private", + "protected", "public" }; + + // PRIVATE PROPERTY + + private String t; + private int penna; + + /** conventional sign */ + final static private char BELL = 7; + final static private String BELLS = String.valueOf(BELL); + /** conventional sign */ + final static private String ALFA = "alfa" + BELLS; + /** conventional sign */ + final static private String BETA0 = "beta0" + BELLS; + /** conventional sign */ + final static private String BETA1 = "beta1" + BELLS; + /** conventional sign */ + final static private String GAMMA0 = "gamma0" + BELLS; + /** conventional sign */ + final static private String GAMMA1 = "gamma1" + BELLS; + /** quotes */ + final static private char VIRGOLETTE = 34; + /** open parenthesis */ + final static private char PARENTESI_APERTA = 40; + /** open parenthesis */ + final static private char PARENTESI_CHIUSA = 41; + /** conventional sign */ + final static private String CAVA0 = "(flax28x7b"; + /** conventional sign */ + final static private String CAVA1 = "flax7dx29)"; + /** conventional sign */ + final static private String ALT_CHIO = "flax40"; + + /** @param file file to be analyzed */ + public Flute(File file) { + this.file = file; + } + + /** @param g file to be analyzed */ + public Flute(final String g) { + this.file = new File(g); + } + + /** + *

+ * Analysis of a .java file to extract its salient elements. + *

+ *

+ * Creation date: 2020-04-09
+ * modification date: 2020-04-09
+ * Company: Rameceraâ„¢ + *

+ *

+ * Modifications:
+ *

+ * + * @author M. Maglioni + * @throws IOException standard exception + * @throws FileNotFoundException exceptionals standard + * @throws ExactException standard exception */ + final public void analyze() + + throws FileNotFoundException, IOException, ExactException { + + t = Equipment.oneString(file); + /* I remove all comments, including those of javadoc; I foresee + * both the case and the end-line is CR + LF, and the case of + * only LF */ + t = t.replaceAll("\\x2f\\x2f.+\\x0d", ""); + t = t.replaceAll("\\x2f\\x2f.+\\x0a", ""); + t = Strings.compact_A(t); + /* with the combination. +? I intend to capture all the + * characters until the next end-comment notification, ie x2ax2f + * (asterisk-slash); if instead I had written only. +, he would + * have gone to capture the last end-comment */ + t = t.replaceAll("\\x2f\\x2a.+?\\x2a\\x2f", ""); + t = t.replaceAll("\\x5c\\x22", ALFA); // backslash and quotes + // equal and opening brace + t = t.replaceAll("\\x3d\\s?\\x7b", "=" + GAMMA0); + // closing brace and semicolon + t = t.replaceAll("\\x7d\\s?\\x3b", GAMMA1 + ";"); + // closing brace and comma + t = t.replaceAll("\\x7d\\s?\\x2c", GAMMA1 + ","); + // closing brace and closed round bracket + t = t.replaceAll("\\x7d\\s?\\x29", GAMMA1 + ")"); + int virgoletteQ = Mix.charQ(t, VIRGOLETTE); + if (virgoletteQ % 2 != 0) { + ExactException ce = new ExactException(); + ce.className = fclass + + " (analized by it.ramecera.salad.analysis.Flute)"; + ce.code = 20060001; + throw ce; + } + /* there must be at least one opening brace */ + int ga = t.indexOf(123); + if (ga == -1) { + ExactException ce = new ExactException(); + ce.className = fclass + + " (analized by it.ramecera.salad.analysis.Flute)"; + ce.code = 20060002; + throw ce; + } + char punto_e_virgola = 59; + interni(BETA0, punto_e_virgola); + char chiusa_parentesi = 41; + interni(BETA1, chiusa_parentesi); + /* the prologue goes from the beginning of the file to the + * declaration of the name of the class included */ + String prologo = t.substring(0, ga); + String[] q = prologo.split("\\x3b"); // 3b is semicolon + if (!q[0].trim().startsWith("package")) { + ExactException ce = new ExactException(); + ce.className = fclass + + " (analized by it.ramecera.salad.analysis.Flute)"; + ce.code = 20060004; + throw ce; + } else { + fpackage = q[0].replaceFirst("\\s*package\\s", "").trim(); + } + for (int m = 1; m < q.length - 1; m++) { + String x = q[m].replaceFirst("\\s*import\\s", ""); + fimportE.add(x.trim()); + } + String centro0 = q[q.length - 1].trim(); + fannotationE = annota(centro0); + String centro1 = centro0.substring(penna); + int impleJ = centro1.indexOf(" implements "); + int extJ = centro1.indexOf(" extends "); + String centro2 = null; + if (impleJ > -1 & extJ == -1) { + centro2 = centro1.substring(0, impleJ); + /* 12 is the length of the string "implements" */ + fimplements = centro1.substring(impleJ + 12); + } else if (impleJ == -1 & extJ > -1) { + centro2 = centro1.substring(0, extJ); + /* 9 is the length of the string "extends" */ + fextends = centro1.substring(extJ + 9); + } else if (impleJ > -1 & extJ > -1) { + if (impleJ < extJ) { + ExactException ce = new ExactException(); + ce.className = fclass + + " (analized by it.ramecera.salad.analysis.Flute)"; + ce.code = 20060006; + throw ce; + } + centro2 = centro1.substring(0, extJ); + /* 9 is the length of the string "extends" */ + fextends = centro1.substring(extJ + 9, impleJ); + /* 12 is the length of the string "implements" */ + fimplements = centro1.substring(impleJ + 12); + } + String[] b1 = Strings.parole_A(centro2); + for (int k = 0; k < b1.length; k++) { + if (b1[k].equals("static")) { + fstatic = true; + } else if (b1[k].equals("final")) { + ffinal = true; + } else if (b1[k].equals("abstract")) { + fabstract = true; + } else if (b1[k].equals("public")) { + fvisibilita = 3; + } else if (b1[k].substring(0, 1).matches("\\p{Upper}")) { + fclass = b1[k]; + } + } + /* the body is what follows the prologue (see above), then from + * the first clip, which opens the course of the class, + * onwards */ + String corpo = t.substring(ga + 1); + /* in the body I have to correct the existence of complex + * annotations that contain round braces that braces, open and + * closed */ + corpo = corpo.replaceAll("\\x28\\x7b", CAVA0); + corpo = corpo.replaceAll("\\x7d\\x29", CAVA1); + String[] r = corpo.split("\\x7d"); // 7d is the closing brace + for (int m = 0; m < r.length - 1; m++) { + int i = r[m].indexOf(123); // 123 is the opening brace + if (i == -1) { + ExactException ce = new ExactException(); + ce.className = fclass + + " (analized by it.ramecera.salad.analysis.Flute)"; + ce.code = 20060007; + throw ce; + } else { + JavaMethod method = new JavaMethod(); + method.grezzo0 = r[m].substring(0, i).trim(); + String[] p0 = method.grezzo0.split("\\x3b"); // x3b =; + for (int j = 0; j < p0.length - 1; j++) { + JavaProperty property = new JavaProperty(); + String grezzo5 = p0[j]; + int pareAperteQ = Mix.charQ(grezzo5, + PARENTESI_APERTA); + int pareChiuseQ = Mix.charQ(grezzo5, + PARENTESI_CHIUSA); + if (pareAperteQ != pareChiuseQ) { + ExactException ce = new ExactException(); + ce.className = fclass + + " (analized by it.ramecera.salad.analysis.Flute)"; + ce.code = 20060003; + throw ce; + } + int ugualeJ = -1; + do { + /* 61 is the same */ + ugualeJ = grezzo5.indexOf(61, ugualeJ + 1); + if (ugualeJ == -1) { + break; + } + String prima = grezzo5.substring(0, ugualeJ); + pareAperteQ = Mix.charQ(prima, + PARENTESI_APERTA); + pareChiuseQ = Mix.charQ(prima, + PARENTESI_CHIUSA); + } while (pareAperteQ > pareChiuseQ); + if (ugualeJ > -1) { + property.fvalore = ripristina(grezzo5.substring( + ugualeJ + 1)); + if (property.fvalore.startsWith("new ")) { + property.fnew = property.fvalore.substring( + 4); + property.fvalore = null; + } + grezzo5 = grezzo5.substring(0, ugualeJ); + } + property.fannotationE = annota(grezzo5); + if (property.fannotationE.size() > 0) { + grezzo5 = grezzo5.substring(penna - 1); + } + String[] b2 = Strings.parole_A(grezzo5); + /* the propery name is the last word */ + property.fnome = b2[b2.length - 1]; + for (int k = 0; k < b2.length - 1; k++) { + if (b2[k].endsWith("[]")) { + b2[k] = b2[k].substring(0, b2[k].length() + - 2); + property.quadre = true; + } + if (b2[k].equals("static")) { + property.fstatic = true; + } else if (b2[k].equals("final")) { + property.ffinal = true; + } else if (b2[k].equals("abstract")) { + property.fabstract = true; + } else if (b2[k].equals("public")) { + property.fvisibilita = 3; + } else if (b2[k].equals("protected")) { + property.fvisibilita = 2; + } else if (b2[k].equals("private")) { + property.fvisibilita = 1; + } else if (b2[k].equals("int") | b2[k].equals( + "double") | b2[k].equals("byte") | b2[k] + .equals("short") | b2[k].equals( + "float") | b2[k].equals( + "boolean") + | b2[k].equals("char") | b2[k].equals( + "long")) { + property.fprimitivo = b2[k]; + } else if (b2[k].substring(0, 1).matches( + "\\p{Upper}")) { + property.fclasse = b2[k]; + } + } + fpropertyE.add(property); + } + method.testata = p0[p0.length - 1]; + method.row1 = r[m].substring(i + 1).trim(); + if (!method.row1.equals("")) { + // 3b is the semicolon + String[] p1 = method.row1.split("\\x3b"); + for (int j = 0; j < p1.length; j++) { + String ist = ripristina(p1[j]); + method.istruzioneE.add(ist); + } + } + fmethodE.add(method); + } + } + for (int j = 0; j < fannotationE.size(); j++) { + JavaAnnotation a = fannotationE.get(j); + if (a.fargument != null) { + a.tokenE = a.fargument.split("\\x2c"); // x2c is comma + for (int k = 0; k < a.tokenE.length; k++) { + String x = a.tokenE[k].trim(); + a.tokenE[k] = x.trim(); + String[] d = new String[2]; + int m = x.indexOf(Candies.EQUALITY_SIGN); + if (m > -1) { + d[0] = x.substring(0, m).trim(); + d[1] = x.substring(m + 1).trim(); + if (d[1].startsWith("\"") & d[1].endsWith("\"") + & d[1].length() > 1) { + d[1] = d[1].substring(1, d[1].length() - 1); + } + if (a.paramE.containsKey(d[0])) { + ExactException ce = new ExactException(); + ce.code = 20060008; + ce.className = fclass + + " (analized by it.ramecera.salad.analysis.Flute)"; + ce.datum = "The parameters of annotation @" + + a.fnome + " aren't unique: " + x + + "."; + throw ce; + } else { + a.paramE.put(d[0], d[1]); + } + } + } + } + } + } + + final private void interni(final String tappo, final char c) { + int j0 = 0, j1 = 0; + // int k = 0; + j0 = t.indexOf(34, 0); // 34 are the quotes " + j1 = t.indexOf(34, j0 + 1); + while (j0 > -1) { + // k ++; + int n = t.indexOf(c, j0); + /* if there is and is less than the next ... */ + if (n > -1 & n < j1) { + /* ... then I found an internal character */ + t = t.substring(0, n) + tappo + t.substring(n + 1); + j1 += tappo.length() - 1; + } + j0 = t.indexOf(34, j1 + 1); + j1 = t.indexOf(34, j0 + 1); + } + } + + final private List annota(final String a0) + + throws ExactException { + + String a = a0; + List aE = new ArrayList(); + /* remediation of all annotations nested in correspondence of + * the pair CAVA0 and CAVA1 " */ + String pezzo0 = null; + String pezzo1 = null; + String pezzo2 = null; + int nc0 = a.indexOf(CAVA0); + int nc1 = a.indexOf(CAVA1); + if (nc0 > 1 & nc1 > 1) { + pezzo0 = a.substring(0, nc0); + pezzo1 = a.substring(nc0, nc1); + pezzo2 = a.substring(nc1); + pezzo1 = pezzo1.replaceAll("\\x40", ALT_CHIO); + a = pezzo0 + pezzo1 + pezzo2; + } + int j0 = 0, j1 = 0; + // int k = 0; + j0 = a.indexOf(64, 0); // 64 is the snail @ + j1 = a.indexOf(64, j0 + 1); + /* now I have to correct the value of j1, because there might be + * nested annotations; I don't have to stop on snails that are + * inside the pair of braces */ + /* GAMMA1 is the closing brace */ + int g0 = a.indexOf(GAMMA1 + ")", j0 + 1); + /* if j1 -1) { + /* for each annotation I have the index j0 which points to + * the scroll, but also j1 which points to the next */ + // k ++; + int pta0 = a.indexOf(40, j0); // 40 is the open parenthesis + JavaAnnotation z = null; + /* if the open round bracket is and is less than the next + * ... */ + if (pta0 > -1 & (pta0 < j1 | j1 == -1)) { + /* ... then I found a topic, I look for the closing + * parenthesis */ + /* 41 is the closing parenthesis */ + int ptc0 = a.indexOf(41, pta0); + /* but now I have to correct the value of ptc0 because I + * need not the next closed parenthesis, but the one + * that really corresponds to a closing; in fact it is + * necessary to take into account the nested + * annotations */ + int ptc1 = a.indexOf(GAMMA1 + ")", pta0); + /* if I found GAMMA1), that's the good value */ + if (ptc1 > -1) { + ptc0 = ptc1; + } + if (ptc0 == -1 | (ptc0 > j1 & j1 > -1)) { + ExactException ce = new ExactException(); + ce.code = 20060005; + ce.className = fclass + + " (analized by it.ramecera.salad.analysis.Flute)"; + throw ce; + } + penna = ptc0; + /* the instantiated annotation, in the case of nested + * annotations, is the most external; the internal ones + * are part of the internal material (topic properties) + * of the first */ + z = new JavaAnnotation(a.substring(j0 + 1, pta0), a + .substring(pta0 + 1, ptc0)); + } else if (j1 == -1) { + /* if it isn't there, and we are at the last + * annotation */ + penna = a.indexOf(32, j0); + z = new JavaAnnotation(a.substring(j0 + 1, penna), + null); + } else { + /* if it is not there, and we are not at the last + * annotation */ + penna = j1 - 1; + z = new JavaAnnotation(a.substring(j0 + 1, penna), + null); + } + aE.add(z); + /* in the first search there is no +1 because, unlike the + * quotes, I don't have to look for separate couples, but a + * couple that starts with the second element of the + * previous couple */ + if (j1 == -1) { + j0 = -1; + } else { + j0 = a.indexOf(64, j1); + } + j1 = a.indexOf(64, j0 + 1); + } + penna += 2; + return aE; + } + + String ripristina(final String s) { + String r = s; + r = r.replaceAll(ALFA, "\""); + r = r.replaceAll(BETA0, ";"); + r = r.replaceAll(BETA1, ")"); + r = r.replaceAll(GAMMA0, "{"); + r = r.replaceAll(GAMMA1, "}"); + return r.trim(); + } +} diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/salad/analysis/JavaAnnotation.java b/screwdriver-3.5.6/src/main/java/it/ramecera/salad/analysis/JavaAnnotation.java new file mode 100644 index 0000000..7d33634 --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/salad/analysis/JavaAnnotation.java @@ -0,0 +1,47 @@ +// +// https://www.ramecera.it/myscrewdriver.html +// e-mail: screwdriver@ramecera.it +// +/* This program and the accompanying materials are made available under + * the terms of the Eclipse Public License v1.0 which accompanies this + * distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html */ +package it.ramecera.salad.analysis; + +import java.util.HashMap; +import java.util.Map; + +/** + *

+ * Annotation in a Java class, both class, property, and method + * annotations. + *

+ *

+ * Creation date: 2020-04-09
+ * modification date: 2020-04-09
+ * Company: Rameceraâ„¢ + *

+ *

+ * Modifications:
+ *

+ * + * @author M. Maglioni */ +public class JavaAnnotation { + + /** @param fnome name of annotation + * @param fargomento argument of annotation */ + public JavaAnnotation(final String fnome, final String fargomento) { + super(); + this.fnome = fnome; + this.fargument = fargomento; + } + + /** name without the "at" character */ + public String fnome; + /** argument */ + public String fargument; + /** arguments token */ + public String[] tokenE; + /** arguments parameters */ + public Map paramE = new HashMap(); +} diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/salad/analysis/JavaMethod.java b/screwdriver-3.5.6/src/main/java/it/ramecera/salad/analysis/JavaMethod.java new file mode 100644 index 0000000..35a85e7 --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/salad/analysis/JavaMethod.java @@ -0,0 +1,52 @@ +// +// https://www.ramecera.it/myscrewdriver.html +// e-mail: screwdriver@ramecera.it +// +/* This program and the accompanying materials are made available under + * the terms of the Eclipse Public License v1.0 which accompanies this + * distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html */ +package it.ramecera.salad.analysis; + +import java.util.ArrayList; +import java.util.List; + +/** + *

+ * Property of a Java class. + *

+ *

+ * Creation date: 2020-04-09
+ * modification date: 2020-04-09
+ * Company: Rameceraâ„¢ + *

+ *

+ * Modifications:
+ *

+ * + * @author M. Maglioni */ +public class JavaMethod { + /** visibility: public = 3, protected = 2, default = 0, private = + * 1 */ + public int fvisibilita; + /** if it is abstract */ + public boolean fabstract; + /** if it is final */ + public boolean ffinal; + /** if it is static */ + public boolean fstatic; + /** raw content n. 0 */ + public String grezzo0; + /** raw content n. 1 */ + public String row1; + /** name of the method */ + public String fnome; + /** elementary type returned */ + public String fprimitivo; + /** type returned */ + public String fclasse; + /** the source code, list of instructions without the semicolon */ + public List istruzioneE = new ArrayList(); + /** line containing the method name */ + public String testata; +} diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/salad/analysis/JavaProperty.java b/screwdriver-3.5.6/src/main/java/it/ramecera/salad/analysis/JavaProperty.java new file mode 100644 index 0000000..ccec2bc --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/salad/analysis/JavaProperty.java @@ -0,0 +1,54 @@ +// +// https://www.ramecera.it/myscrewdriver.html +// e-mail: screwdriver@ramecera.it +// +/* This program and the accompanying materials are made available under + * the terms of the Eclipse Public License v1.0 which accompanies this + * distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html */ +package it.ramecera.salad.analysis; + +import java.util.List; + +/** + *

+ * Property of a Java class. + *

+ *

+ * Creation date: 2020-04-09
+ * modification date: 2020-04-09
+ * Company: Rameceraâ„¢ + *

+ *

+ * Modifications:
+ *

+ * + * @author M. Maglioni */ +public class JavaProperty { + /** the primitive type (int, boolean, etc .; String is not + * primitive) returned; otherwise it remains null */ + public String fprimitivo; + /** name of the returned class */ + public String fclasse; + /** name of the property */ + public String fnome; + /** if there is a new (then simple = false), it says what is after + * the new; if not present, it is null */ + public String fnew; + /** visibility: public = 3, protected = 2, private = 1, default = + * 0 */ + public int fvisibilita; + /** if it is abstract */ + public boolean fabstract; + /** if it is final */ + public boolean ffinal; + /** if it is static */ + public boolean fstatic; + /** property value */ + public String fvalore; + /** if it is an array defined by [] */ + public boolean quadre; + + /** class annotations */ + public List fannotationE; +} diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/salad/everyday/Candies.java b/screwdriver-3.5.6/src/main/java/it/ramecera/salad/everyday/Candies.java new file mode 100644 index 0000000..abb1c81 --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/salad/everyday/Candies.java @@ -0,0 +1,112 @@ +// +// https://www.ramecera.it/myscrewdriver.html +// e-mail: screwdriver@ramecera.it +// +/* This program and the accompanying materials are made available under + * the terms of the Eclipse Public License v1.0 which accompanies this + * distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html */ +package it.ramecera.salad.everyday; + +import java.util.Properties; + +/** + *

+ * Treatment of property data. This data is conventionally called + * candy. + *

+ *

+ * Creation date: 2020-04-09
+ * modification date: 2020-04-09
+ * Company: Rameceraâ„¢ + *

+ *

+ * Modifications:
+ *

+ * + * @author M. Maglioni */ +public interface Candies { + + /** ordinary properties */ + public Properties properties = new Properties(); + + /** peculiar character */ + public static final char H92 = 92; // backslash + /** peculiar character */ + public static final char H47 = 47; // slash; + /** peculiar character */ + public static final String SLASH = String.valueOf(H47); + /** peculiar character */ + public static final char PARENTESI_APERTA = 40; + /** peculiar character */ + public static final char PARENTESI_CHIUSA = 41; + /** peculiar character */ + public static final char LINE_FEED = 10; + /** peculiar character */ + public final static char H13 = 13; + /** peculiar character */ + public final static char H171 = 171; + /** peculiar character */ + public final static char H160 = 160; + /** peculiar character */ + public final static char H187 = 187; + /** peculiar character */ + public final static char EQUALITY_SIGN = 61; + /** peculiar character */ + public final static String SPACE = " "; + /** peculiar character */ + public final static String NON_BREAKING = String.valueOf(H160); + /** peculiar character */ + public final static String CAAP = String.valueOf(H171); + /** peculiar character */ + public final static String CACH = String.valueOf(H187); + /** peculiar character */ + public final static String CR = String.valueOf(H13); + /** peculiar character */ + public static final String LF = String.valueOf(LINE_FEED); + /** peculiar character */ + public static final char TAB = 9; + /** peculiar character */ + public static final String TABS = String.valueOf(TAB); + /** peculiar character */ + public String UNDERSCORE = "_"; + /** peculiar character */ + public String COMMA = ","; + /** peculiar character */ + public String COLON = ":"; + /** particular codes, operations of a file corrections */ + public int SURGERY1 = 1; + /** particular signs */ + public static final String SEGNO_A = "çvç"; + /** particular signs */ + public static final String[] CRUD = { "C", "R", "U", "D" }; + /** Roman numerals from 1 to 50 */ + public static final String[] ROMANI = { "", "I", "II", "III", "IV", + "V", "VI", "VII", "VIII", "IX", "X", "XI", "XII", "XIII", + "XIV", "XV", "XVI", "XVII", "XVIII", "IXX", "XX", "XXI", + "XXII", "XXIII", "XXIV", "XXV", "XXVI", "XXVII", "XXVIII", + "IXXX", "XXX", "XXXI", "XXXII", "XXXIII", "XXXIV", "XXXV", + "XXXVI", "XXXVII", "XXXVIII", "XXXIX", "XXXX", "XXXXI", + "XXXXII", "XXXXIII", "XXXXIV", "XXXXV", "XXXXVI", "XXXXVII", + "XXXXVIII", "IL", "L" }; + + /** + *

+ * Reads the properties file and returns it on the same object t. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param p name of the properties file + * @throws ExactException objecting if the data contained in the + * properties file is incorrect */ + public abstract void readProperties(String p) + + throws ExactException; + +} diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/salad/everyday/ExactException.java b/screwdriver-3.5.6/src/main/java/it/ramecera/salad/everyday/ExactException.java new file mode 100644 index 0000000..fe0cea1 --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/salad/everyday/ExactException.java @@ -0,0 +1,157 @@ +// +// https://www.ramecera.it/myscrewdriver.html +// e-mail: screwdriver@ramecera.it +// +/* This program and the accompanying materials are made available under + * the terms of the Eclipse Public License v1.0 which accompanies this + * distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html */ +package it.ramecera.salad.everyday; + +/** + *

+ * Class to handle an exception with a code specification. + *

+ *

+ * Company: Rameceraâ„¢
+ * Creation date: 2020-04-09
+ * Last updated: 2020-06-13
+ * Modifications: none
+ *

+ * + * @author M. Maglioni */ + +public class ExactException + + extends Exception { + + /** pure formality */ + static final long serialVersionUID = 0; + + /** string information, for use as desired */ + public String datum; + + /** numerical information, for use as desired */ + public int code; + + /** full information, for use as desired */ + public int n; + + /** in which class the exception occurred */ + public String className; + + /** in which method the exception occurred */ + public String method; + + /** in which element the exception occurred */ + public int line; + + /** + *

+ * Default constructor. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-06-13
+ * Modifications: none
+ *

+ */ + public ExactException() { + + } + + /** + *

+ * Next constructor. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09
+ * Modifications: none
+ *

+ * + * @param s message associated with the exception, sent to the + * superclass */ + public ExactException(final String s) { + super(s); + } + + /** + *

+ * Next constructor. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-06-13
+ * Modifications: none
+ *

+ * + * @param datum message associated with the exception + * @param code error code + * @param className obvious + * @param methodName obvious */ + public ExactException(final String datum, final int code, + final String className, final String methodName) { + super(datum); + this.datum = datum; + this.code = code; + this.className = className; + this.method = methodName; + } + + /** + *

+ * Next constructor. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-06-13
+ * Modifications: none
+ *

+ * + * @param datum message associated with the exception + * @param code error code + * @param className obvious + * @param methodName obvious + * @param line which element produced an error */ + public ExactException(final String datum, final int code, + final String className, final String methodName, + final int line) { + super(datum); + this.datum = datum; + this.code = code; + this.className = className; + this.method = methodName; + this.line = line; + } + + /** + *

+ * Creation date: 2020-04-20
+ * Last updated: 2020-04-20
+ * Class: ExactException + * + * @author M. Maglioni + *

+ * Description: + *

+ * @return the datum */ + public String getData() { + return datum; + } + + /** + *

+ * Creation date: 2020-04-20
+ * Last updated: 2020-06-13
+ * Class: ExactException + * + * @author M. Maglioni + *

+ * Description: + *

+ * @param datum obvious */ + public void setDatum(String datum) { + this.datum = datum; + } +} \ No newline at end of file diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/salad/everyday/HandleDate.java b/screwdriver-3.5.6/src/main/java/it/ramecera/salad/everyday/HandleDate.java new file mode 100644 index 0000000..63c3c75 --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/salad/everyday/HandleDate.java @@ -0,0 +1,1764 @@ +// +// https://www.ramecera.it/myscrewdriver.html +// e-mail: screwdriver@ramecera.it +// +/* This program and the accompanying materials are made available under + * the terms of the Eclipse Public License v1.0 which accompanies this + * distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html */ +package it.ramecera.salad.everyday; + +import java.sql.Timestamp; +import java.text.DecimalFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.TimeZone; +import java.util.jar.Attributes; +import java.util.regex.Pattern; + +/** + *

+ * Various utility methods. Compared to the previous version, all the + * deprecated methods have been canceled. + *

+ *

+ * Company: Rameceraâ„¢
+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @author M. Maglioni */ +public class HandleDate { + + /* error code: 200yyxxx */ + + /** + *

+ * Constructs a date in the XML standard, with double quotation + * marks, starting from a numerical date written as yyyymmmmgg (as + * happens on the DB Guritel). + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ * 08/04 08: corrected the format from # dd / MM / yyyy # to # MM / + * dd / yyyy #
+ *

+ * + * @param i the number to be transformed + * @return the date in XML format */ + public static String dataPerXML_A(int i) { + String year = new DecimalFormat("0000").format(i / 10000); + String month = new DecimalFormat("00").format(i % 10000 / 100); + String day = new DecimalFormat("00").format(i % 100); + return "\"" + year + "-" + month + "-" + day + "\""; + } + + /** + *

+ * Constructs the date pattern in the form yyyy mm dd differently + * depending on the DBMS used. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ * 08/04 08: corrected the format from # dd / MM / yyyy # to # MM / + * dd / yyyy #
+ *

+ * + * @param d the date to be formatted, Date + * @param jd object the jdbc of the DB server + * @return the necessary pattern */ + public static String dataPerDBMS_A(Date d, String jd) { + + if (Pattern.matches("jdbc:db2:\\p{Graph}+", jd) | jd + .equalsIgnoreCase("DB2")) + return "'" + new SimpleDateFormat("yyyy-MM-dd").format(d) + + "'"; + else if (Pattern.matches("jdbc:odbc:\\p{Graph}+", jd) | jd + .equalsIgnoreCase("Access")) + return "#" + new SimpleDateFormat("MM/dd/yyyy").format(d) + + "#"; // style + // English, + // mmddyy + else + return new SimpleDateFormat("dd/MM/yyyy").format(d); + } + + /** + *

+ * Overload of the previous one. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param c the date to be formatted, Calendar object + * @param jd the jdbc of the DB server + * @return the necessary pattern */ + public static String dataPerDBMS_A(Calendar c, String jd) { + + return dataPerDBMS_A(c.getTime(), jd); + } + + /** + *

+ * Constructs the date and time pattern in the form yyyy MM dd hh mm + * ss differently according to the DBMS used. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param d the date to be formatted + * @param jd the url of the DB server + * @return the necessary pattern + * @since SVutensiliJ4_1.3.0 */ + public static String dataPerDBMS_B(Date d, String jd) { + + if (Pattern.matches("jdbc:db2:\\p{Graph}+", jd) | jd + .equalsIgnoreCase("DB2")) + return "'" + new SimpleDateFormat("yyyy-MM-dd-HH.mm.ss") + .format(d) + "'"; + else if (Pattern.matches("jdbc:odbc:\\p{Graph}+", jd) | jd + .equalsIgnoreCase("Access")) + return "#" + new SimpleDateFormat("MM/dd/yyyy HH.mm.ss") + .format(d) + "#"; // English style, MMddyy + else if (Pattern.matches("jdbc:hsqldb:\\p{Graph}+", jd)) + return "'" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") + .format(d) + "'"; + else + return new SimpleDateFormat("dd/MM/yyyy HH.mm.ss").format( + d); + } + + /** + *

+ * Constructs the date and time pattern in the form yyyy MM dd hh mm + * ss differently according to the DBMS used. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param d the date to be formatted + * @param jd the url of the DB server + * @return the necessary pattern + * @since SVutensiliJ4_1.3.0 */ + public static String dataPerDBMS_B(Timestamp d, String jd) { + + if (Pattern.matches("jdbc:db2:\\p{Graph}+", jd) | jd + .equalsIgnoreCase("DB2")) + return "'" + new SimpleDateFormat("yyyy-MM-dd-HH.mm.ss.SSS") + .format(d) + "'"; + else if (Pattern.matches("jdbc:odbc:\\p{Graph}+", jd) | jd + .equalsIgnoreCase("Access")) + return "#" + new SimpleDateFormat("MM/dd/yyyy HH.mm.ss.SSS") + .format(d) + "#"; // English style, MMddyy + else if (Pattern.matches("jdbc:hsqldb:\\p{Graph}+", jd)) + return "'" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS") + .format(d) + "'"; + else + return new SimpleDateFormat("dd/MM/yyyy HH.mm.ss.SSS") + .format(d); + } + + /** + *

+ * Constructs the date and time pattern in the form yyyy MM dd hh mm + * ss differently according to the DBMS used. Overload of + * dataPerDBMS_B to make use of Calendar objects instead of Date + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param d the date to be formatted + * @param u the url of the DB server + * @return the necessary pattern + * @since SVsalad_2.0.0 */ + public static String dataPerDBMS_C(Calendar d, String u) { + + if (Pattern.matches("jdbc:db2:\\p{Graph}+", u) | u + .equalsIgnoreCase("DB2")) + return "'" + new SimpleDateFormat("yyyy-MM-dd-HH.mm.ss") + .format(d.getTime()) + "'"; + else if (Pattern.matches("jdbc:odbc:\\p{Graph}+", u)) + return "#" + new SimpleDateFormat("MM/dd/yyyy HH.mm.ss") + .format(d.getTime()) + "#"; // English style, + // mmddyy + else if (Pattern.matches("jdbc:hsqldb:\\p{Graph}+", u)) + return "'" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") + .format(d.getTime()) + "'"; + else if (Pattern.matches("jdbc:postgresql:\\p{Graph}+", u)) + return "'" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") + .format(d.getTime()) + "'"; + else + return new SimpleDateFormat("dd/MM/yyyy HH.mm.ss").format(d + .getTime()); + } + + /** + *

+ * Constructs the date and time pattern in the form yyyy MM dd hh mm + * ss differently according to the DBMS used. Overload of + * dataPerDBMS_B to make use of Timestamp objects instead of Date + *

+ *

+ * Creation date: 2020-04-09
+ * last modified date: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param d the date to be formatted + * @param u the url of the DB server + * @return the necessary pattern + * @since salad_0 */ + public static String dataPerDBMS_C(Timestamp d, String u) { + + if (Pattern.matches("jdbc:db2:\\p{Graph}+", u) | u + .equalsIgnoreCase("DB2")) + return "'" + new SimpleDateFormat("yyyy-MM-dd-HH.mm.ss") + .format(d.getTime()) + "'"; + else if (Pattern.matches("jdbc:odbc:\\p{Graph}+", u)) + return "#" + new SimpleDateFormat("MM/dd/yyyy HH.mm.ss") + .format(d.getTime()) + "#"; // English style, + // mmddyy + else if (Pattern.matches("jdbc:hsqldb:\\p{Graph}+", u)) + return "'" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") + .format(d.getTime()) + "'"; + else + return new SimpleDateFormat("dd/MM/yyyy HH.mm.ss").format(d + .getTime()); + } + + /** + *

+ * Constructs the date and time pattern in the form "yyyy MM dd hh + * mm ss SSS" in different ways depending on the DBMS used. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param d the date to be formatted + * @param u the url of the DB server + * @return the necessary pattern + * @since salad_0 */ + public static String dataPerDBMS_D(Timestamp d, String u) { + + if (Pattern.matches("jdbc:db2:\\p{Graph}+", u) | u + .equalsIgnoreCase("DB2")) + return "'" + new SimpleDateFormat("yyyy-MM-dd-HH.mm.ss.SSS") + .format(d.getTime()) + "'"; + else if (Pattern.matches("jdbc:odbc:\\p{Graph}+", u)) + return "#" + new SimpleDateFormat("MM/dd/yyyy HH.mm.ss") + .format(d.getTime()) + "#"; // English style, + // mmddyy + else if (Pattern.matches("jdbc:hsqldb:\\p{Graph}+", u)) + return "'" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") + .format(d.getTime()) + "'"; + else + return new SimpleDateFormat("dd/MM/yyyy HH.mm.ss").format(d + .getTime()); + } + + /** + *

+ * Constructs the date and time pattern in the form yyyy MM dd hh mm + * ss differently according to the DBMS used. It differs from the + * previous version in that the date is provided as a long. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param l the date to be formatted in the form of a number of + * milliseconds + * @param u the url of the DB server + * @return the necessary pattern + * @since SVutensiliJ4_1.3.0 */ + public static String dataPerDBMS_B(long l, String u) { + + return dataPerDBMS_B(new Date(l), u); + } + + /** attention, not accented vowels, for caution */ + public static String[] italianWeekDays = { + + "", "domenica", "lunedi", "martedi", "mercoledi", "giovedi", + "venerdi", "sabato" }; + + /** months of the year */ + public static String[] italianWeekMonths = { + + "gennaio", "febbraio", "marzo", "aprile", "maggio", + "giugno", "luglio", "agosto", "settembre", "ottobre", + "novembre", "dicembre" }; + + /** length of months of the year, formatted 00 */ + public static String[] longTimeMonths = { + + "31", "28", "31", "30", "31", "30", "31", "31", "30", "31", + "30", "31" }; + + /** + *

+ * Simple routine to transform a date from yyyymmdd to dd / MM / + * yyyy. Old name: acconciaData0. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ * + * @param s string to format + * @return formatted date string */ + public static String acconciaData_A(String s) { + + return s.substring(6, 8) + "/" + s.substring(4, 6) + "/" + s + .substring(0, 4); + } + + /** + *

+ * Simple routine to transform a date from MM / dd / yyyy to dd / MM + * / yyyy. Old name: acconciaData1. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ * + * @param s string to format + * @return formatted date string */ + public static String acconciaData_B(String s) { + + return s.substring(3, 5) + "/" + s.substring(0, 2) + "/" + s + .substring(6, 10); + } + + /** + *

+ * Simple routine to transform a date from date-object to + * month-extended g yyyy. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ * + * @param d date to be processed + * @return date string in extended format */ + public static String acconciaData_C(Date d) { + + Calendar c = Calendar.getInstance(); + c.setTime(d); + return c.get(Calendar.DAY_OF_MONTH) + Candies.SPACE + + italianWeekMonths[c.get(Calendar.MONTH)] + + Candies.SPACE + c.get(Calendar.YEAR); + } + + /** + *

+ * Simple routine to transform a date from date-object to dd / MM / + * yy. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Modifications:
+ * 12/06 09: fixed error on "form" sign
+ *

+ * + * @param c date to be processed + * @return date string in extended format */ + public static String acconciaData_D(Calendar c) { + + return new DecimalFormat("00").format(c.get( + Calendar.DAY_OF_MONTH)) + "/" + new DecimalFormat("00") + .format(c.get(Calendar.MONTH) + 1) + "/" + + new DecimalFormat("00").format(c.get(Calendar.YEAR) + % 100); + } + + /** + *

+ * Overload of the previous one. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param d date to be processed + * @return date string in dd / MM / yy format */ + public static String acconciaData_D(Date d) { + + Calendar c = Calendar.getInstance(); + c.setTime(d); + return acconciaData_D(c); + } + + /** + *

+ * Overload of the previous one. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param millis date to be processed, expressed in milliseconds + * @return date string in format dd / MM / yy */ + public static String acconciaData_D(long millis) { + + Calendar c = Calendar.getInstance(); + c.setTimeInMillis(millis); + return acconciaData_D(c); + } + + /** + *

+ * Simple routine to transform a date from Calendar object to + * yyyy-MM-dd. Remember that the form yyyy-MM-dd is the XML standard + * for writing dates. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param c date to be processed + * @return date string in extended format */ + public static String acconciaData_E(Calendar c) { + + return new DecimalFormat("0000").format(c.get(Calendar.YEAR)) + + "-" + new DecimalFormat("00").format(c.get( + Calendar.MONTH) + 1) + "-" + new DecimalFormat( + "00").format(c.get( + Calendar.DAY_OF_MONTH)); + } + + /** + *

+ * Overload of the previous one. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param millis data to be processed, expressed in milliseconds + * @return date string in extended format */ + public static String acconciaData_E(long millis) { + + Calendar c = Calendar.getInstance(); + c.setTimeInMillis(millis); + return acconciaData_E(c); + } + + /** + *

+ * Overload of the previous one. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param d date to be processed + * @return date string in yyyy-MM-dd format */ + public static String acconciaData_E(Date d) { + + Calendar c = Calendar.getInstance(); + c.setTime(d); + return acconciaData_E(c); + } + + /** + *

+ * Simple routine to transform a date from date-object to dd / MM / + * yyyy. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param c date to be processed + * @return date string in extended format */ + public static String acconciaData_F(Calendar c) { + + return new DecimalFormat("00").format(c.get( + Calendar.DAY_OF_MONTH)) + "/" + new DecimalFormat("00") + .format(c.get(Calendar.MONTH) + 1) + "/" + + new DecimalFormat("0000").format(c.get( + Calendar.YEAR)); + } + + /** + *

+ * Overload of the previous one. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param d data to be processed + * @return date string in extended format */ + public static String acconciaData_F(Date d) { + + Calendar c = Calendar.getInstance(); + c.setTime(d); + return acconciaData_F(c); + } + + /** + *

+ * Overload of the previous one. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param d data to be processed + * @return date string in extended format */ + public static String acconciaData_F(Timestamp d) { + + Calendar c = Calendar.getInstance(); + c.setTime(d); + return acconciaData_F(c); + } + + /** + *

+ * Simple routine to transform a date from date-object to yyyymmdd. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param c date to be processed + * @return date string in extended format */ + public static String acconciaData_G(Calendar c) { + + return new DecimalFormat("0000").format(c.get(Calendar.YEAR)) + + new DecimalFormat("00").format(c.get(Calendar.MONTH) + + 1) + new DecimalFormat("00").format(c.get( + Calendar.DAY_OF_MONTH)); + } + + /** + *

+ * Overload of the previous one. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param d data to be processed + * @return date string in extended format */ + public static String acconciaData_G(Date d) { + + Calendar c = Calendar.getInstance(); + c.setTime(d); + return acconciaData_G(c); + } + + /** + *

+ * Simple routine to transform a date from date-object to dd / MM / + * yyyy hh: mm: ss. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param c date to be processed + * @return date string in extended format */ + public static String acconciaData_H(Calendar c) { + + return new DecimalFormat("00").format(c.get( + Calendar.DAY_OF_MONTH)) + "/" + new DecimalFormat("00") + .format(c.get(Calendar.MONTH) + 1) + "/" + + new DecimalFormat("0000").format(c.get(Calendar.YEAR)) + + Candies.SPACE + new DecimalFormat("00").format(c.get( + Calendar.HOUR_OF_DAY)) + ":" + + new DecimalFormat("00").format(c.get(Calendar.MINUTE)) + + ":" + new DecimalFormat("00").format(c.get( + Calendar.SECOND)); + } + + /** + *

+ * Overload of the previous one. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param d date to be processed + * @return date string in format dd / MM / yy hh: mm: ss */ + public static String acconciaData_H(Date d) { + + Calendar c = Calendar.getInstance(); + c.setTime(d); + return acconciaData_H(c); + } + + /** + *

+ * Overload of the previous one. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param millis date to be processed, expressed in milliseconds + * @return date string in format dd / MM / yy hh: mm: ss */ + public static String acconciaData_H(long millis) { + + Calendar c = Calendar.getInstance(); + c.setTimeInMillis(millis); + return acconciaData_H(c); + } + + /** + *

+ * Overload of the previous one. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param timestamp date to be processed, expressed as timestamp + * @return date string in format dd / MM / yy hh: mm: ss */ + public static String acconciaData_H(Timestamp timestamp) { + + Calendar c = Calendar.getInstance(); + c.setTimeInMillis(timestamp.getTime()); + return acconciaData_H(c); + } + + /** + *

+ * Simple routine to transform a date from data-object to hh: mm: + * ss. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09
+ *

+ *

+ * Changes:
+ * 2020-04-09: changed the name from acconciaData_h to + * acconciaData_O
+ *

+ * + * @param c date to be processed + * @return date string in extended format */ + public static String acconciaData_O(Calendar c) { + + return new DecimalFormat("00").format(c.get( + Calendar.HOUR_OF_DAY)) + ":" + new DecimalFormat("00") + .format(c.get(Calendar.MINUTE)) + ":" + + new DecimalFormat("00").format(c.get( + Calendar.SECOND)); + } + + /** + *

+ * Overload of the previous one. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param millis data to be processed, expressed in milliseconds + * @return date string in format hh: mm: ss */ + public static String acconciaData_O(long millis) { + + Calendar c = Calendar.getInstance(); + c.setTimeInMillis(millis); + return acconciaData_O(c); + } + + /** + *

+ * Simple routine to transform a date from yyyy-mm-dd (XML standard) + * to a Date object + *

+ *

+ * Creation date: 2020-04-09
+ * last modified date: 10/21 / 10 + *

+ * + * @param s string to format + * @return formatted date string + * @throws ExactException objects if the date given is incorrect */ + + public static Date acconciaData_I(String s) + + throws ExactException { + + return pacco(s.substring(8, 10), s.substring(5, 7), s.substring( + 0, 4)); + } + + /** + *

+ * Simple routine to transform a date from yyyymmdd to a Date + * object. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ * + * @param s string to format + * @return formatted date string + * @throws ExactException object if the date provided is + * incorrect */ + + public static Date acconciaData_K(String s) + + throws ExactException { + + return pacco(s.substring(6, 8), s.substring(4, 6), s.substring( + 0, 4)); + } + + /** + *

+ * Simple routine to transform a date from yyyy-mm-dd (XML standard) + * to an 8-digit number yyyymmdd + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ * + * @param s the date in XML format + * @return the date as integer + * @throws ExactException objecting if the given date is + * incorrect */ + + public static int acconciaData_L(String s) + + throws ExactException { + + try { + int giorno = Integer.valueOf(s.substring(8, 10)); + int mese = Integer.valueOf(s.substring(5, 7)); + int anno = Integer.valueOf(s.substring(0, 4)); + return anno * 10000 + mese * 100 + giorno; + } catch (NumberFormatException nfe) { + throw new ExactException(nfe.getMessage(), 100300, + "HandleDate", ""); + } + } + + /** + *

+ * Simple routine to transform a date from data-object to + * yyyymmdd_hhmmss. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param c date to be processed + * @return date string in extended format */ + public static String acconciaData_J(Calendar c) { + + return new DecimalFormat("0000").format(c.get(Calendar.YEAR)) + + new DecimalFormat("00").format(c.get(Calendar.MONTH) + + 1) + new DecimalFormat("00").format(c.get( + Calendar.DAY_OF_MONTH)) + "_" + + new DecimalFormat("00").format(c.get( + Calendar.HOUR_OF_DAY)) + new DecimalFormat("00") + .format(c.get(Calendar.MINUTE)) + + new DecimalFormat("00").format(c.get( + Calendar.SECOND)); + } + + /** + *

+ * Overload of the previous one. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param d data to be processed + * @return date string in extended format */ + public static String acconciaData_J(Date d) { + + Calendar c = Calendar.getInstance(); + c.setTime(d); + return acconciaData_J(c); + } + + /** + *

+ * Simple routine to transform a date from dd / mm / yyyy HH.mm.ss + * to a Date object. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ * + * @param s string to format + * @return formatted date string + * @throws ExactException object if the date provided is + * incorrect */ + + public static Date acconciaData_M(String s) + + throws ExactException { + + return pacco(s.substring(0, 2), s.substring(3, 5), s.substring( + 6, 10), s.substring(11, 13), s.substring(14, 16), s + .substring(17, 19)); + } + + /** + *

+ * Simple routine to transform a date from dd / mm / yyyy to Date + * object. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ * + * @param s string to format + * @return formatted date string + * @throws ExactException object if the date provided is + * incorrect */ + + public static Date acconciaData_P(String s) + + throws ExactException { + + return pacco(s.substring(0, 2), s.substring(3, 5), s.substring( + 6, 10)); + } + + /** + *

+ * Simple routine to transform a date from date-object to yyyy / mm + * / dd hh: mm: ss. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param c date to be processed + * @return date string in extended format */ + public static String acconciaData_N(Calendar c) { + + return new DecimalFormat("0000").format(c.get(Calendar.YEAR)) + + "/" + new DecimalFormat("00").format(c.get( + Calendar.MONTH) + 1) + "/" + new DecimalFormat( + "00").format(c.get( + Calendar.DAY_OF_MONTH)) + + Candies.SPACE + new DecimalFormat("00").format(c.get( + Calendar.HOUR_OF_DAY)) + ":" + + new DecimalFormat("00").format(c.get(Calendar.MINUTE)) + + ":" + new DecimalFormat("00").format(c.get( + Calendar.SECOND)); + } + + /** + *

+ * Overload of the previous one. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param d date to be processed + * @return date string in format dd / MM / yy hh: mm: ss */ + public static String acconciaData_N(Date d) { + + Calendar c = Calendar.getInstance(); + c.setTime(d); + return acconciaData_N(c); + } + + /** + *

+ * Simple routine to transform a date from date-object to yyyy / mm + * / dd. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param c date to be processed + * @return date string in extended format */ + public static String acconciaData_Q(Calendar c) { + + return new DecimalFormat("0000").format(c.get(Calendar.YEAR)) + + "/" + new DecimalFormat("00").format(c.get( + Calendar.MONTH) + 1) + "/" + new DecimalFormat( + "00").format(c.get( + Calendar.DAY_OF_MONTH)); + } + + /** + *

+ * Overload of the previous one. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param d data to be processed + * @return date string in extended format */ + public static String acconciaData_Q(Date d) { + + Calendar c = Calendar.getInstance(); + c.setTime(d); + return acconciaData_Q(c); + } + + /** + *

+ * Set the hours, minutes, seconds and milliseconds to 0. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param c the date to be processed + * @return the purified date of hours, minutes, seconds and + * milliseconds */ + public static Calendar ammazzaMinuti(Calendar c) { + c.set(Calendar.HOUR_OF_DAY, 0); + c.set(Calendar.MINUTE, 0); + c.set(Calendar.SECOND, 0); + c.set(Calendar.MILLISECOND, 0); + return c; + } + + /** + *

+ * Routine to produce the current time in the form hh: mm: ss. + *

+ *

+ * Creation date: 22 / apr / 08
+ * Last updated: 22 / apr / 08 + *

+ *

+ * Changes:
+ *

+ * + * @return the current time */ + public static String currentTime_B() { + + TimeZone tz = TimeZone.getTimeZone("Europe/Paris"); + Calendar c = Calendar.getInstance(tz); + return new DecimalFormat("00").format(c.get( + Calendar.HOUR_OF_DAY)) + ":" + new DecimalFormat("00") + .format(c.get(Calendar.MINUTE)) + ":" + + new DecimalFormat("00").format(c.get( + Calendar.SECOND)); + } + + /** + *

+ * Formal date check. It can be customized using the format + * parameter. + *

+ *

+ * Creation date: 21 / Feb / 08
+ * Last updated: 21 / Feb / 08 + *

+ *

+ * Changes:
+ *

+ * + * @param data obvious + * @param format for example: dd-MM-yyyy + * @return true or false */ + public static boolean eDataValida(String data, String format) { + + try { + SimpleDateFormat sdf = new SimpleDateFormat(format); + sdf.setLenient(false); + sdf.parse(data); + Date d = sdf.getCalendar().getTime(); + String s = new SimpleDateFormat(format).format(d); + return s.equals(data); + } catch (ParseException e) { + return false; + } catch (IllegalArgumentException e) { + return false; + } + } + + /** + *

+ * Formal check of a written date such as: 5 September 1980. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param data obvious + * @return true or false */ + public static Date eLongValidDate(String data) { + String t = Strings.compact_A(data); + String[] wordE = t.split(Candies.SPACE); + if (wordE.length != 3) + return null; + int i = 0; + for (; i < 12 && !wordE[1].equalsIgnoreCase( + italianWeekMonths[i]); i++) + ; + if (i == 12) + return null; + try { + return pacco(wordE[0], Integer.valueOf(i + 1).toString(), + wordE[2]); + } catch (ExactException e) { + return null; + } + } + + /** + *

+ * Production of today's date in the form dd / mm / yyyy. + *

+ * Creation date: 22 / apr / 08
+ * Last updated: 22 / apr / 08 + *

+ *

+ * Changes:
+ *

+ * + * @return la string containing today's date */ + public static String currentDate_C() { + + TimeZone tz = TimeZone.getTimeZone("Europe/Paris"); + Calendar c = Calendar.getInstance(tz); + return new DecimalFormat("00").format(c.get( + Calendar.DAY_OF_MONTH)) + "/" + new DecimalFormat("00") + .format(c.get(Calendar.MONTH) + 1) + "/" + + new DecimalFormat("0000").format(c.get( + Calendar.YEAR)); + } + + /** + *

+ * Production of today's date in the form yyyy / MM / dd. + *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @return la string containing today's date + * @since 2.1.0, package 2.0.0 */ + public static String dataCorrente_D() { + + TimeZone tz = TimeZone.getTimeZone("Europe/Paris"); + Calendar c = Calendar.getInstance(tz); + return new DecimalFormat("0000").format(c.get(Calendar.YEAR)) + + "/" + new DecimalFormat("00").format(c.get( + Calendar.MONTH) + 1) + "/" + new DecimalFormat( + "00").format(c.get( + Calendar.DAY_OF_MONTH)); + } + + /** + *

+ * Calculation of how many days there are in a month. The month must + * be given as a number from 1 to 12. + *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes :
+ * 2020-04-09: added the else to the if, otherwise it was an error + *
+ * 2020-04-09: corrected error on the sign of "form"
+ *

+ * + * @param mese month, as a number from 1 to 12 + * @param anno a positive 4-digit number + * @return how many days; if the month is incorrect, an empty string + * returns */ + public static String quantiGiorniMese(int mese, int anno) { + + String q = ""; + if (mese < 1 | mese > 12) + return q; + if ((anno % 4) == 0 & (anno % 400) > 0) + longTimeMonths[1] = "29"; + else + // 2020-04-09 + longTimeMonths[1] = "28"; + return longTimeMonths[mese - 1]; + } + + /** + *

+ * Transformation of a date from three integers: day, month, year to + * a Date object. The month must be given as a number from 1 to 12. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param day as a number from 1 to 28, 29, 30 or 31 + * @param month as a number from 1 to 12 + * @param year a 4-digit positive number + * @return l Date object; if the month is incorrect, return an empty + * string + * @throws ExactException exception for incorrect date */ + public static Date pacco(int day, int month, int year) + throws ExactException { + + if (!eDataValida(day + "-" + month + "-" + year, "d-M-yyyy")) { + ExactException ce = new ExactException("yyyy-MM-dd=" + year + + "-" + month + "-" + day, 100301, "HandleDate", + ""); + throw ce; + } + Calendar c = Calendar.getInstance(); + c.set(year, month - 1, day, 0, 0, 0); + c.set(Calendar.MILLISECOND, 0); + Date d = c.getTime(); + return d; + } + + /** + *

+ * Variant of the previous one using 3 strings instead of 3 numbers. + * Transformation of a date from three integers: day, month, year to + * a Date object. The month must be provided as a number from 1 to + * 12.
+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param dayS as string from 1 to 28, 29, 30 or 31 + * @param monthS as string from 1 to 12 + * @param yearS as string, 4 digits + * @return the Date object; if the month is incorrect, return an + * empty string + * @throws ExactException exception for incorrect date */ + public static Date pacco(final String dayS, final String monthS, + final String yearS) + + throws ExactException { + + int giorno = Integer.valueOf(dayS).intValue(); + int mese = Integer.valueOf(monthS).intValue(); + int anno = Integer.valueOf(yearS).intValue(); + return pacco(giorno, mese, anno); + } + + /** + *

+ * Variant of the previous one that returns a Calendar object + * instead of a Date.
+ *

+ * Creation date: 2020-04-09
+ * last modified date: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param dayS as string from 1 to 28, 29, 30 or 31 + * @param monthS as string from 1 to 12 + * @param yearS as string, 4 digits + * @return the Date object; if the month is incorrect, return an + * empty string + * @throws ExactException exception for incorrect date */ + public static Calendar calPacco(final String dayS, + final String monthS, final String yearS) + throws ExactException { + + int giorno = Integer.valueOf(dayS).intValue(); + int mese = Integer.valueOf(monthS).intValue(); + int anno = Integer.valueOf(yearS).intValue(); + Calendar c = Calendar.getInstance(); + c.setTime(pacco(giorno, mese, anno)); + c = ammazzaMinuti(c); + return c; + } + + /** + *

+ * Variant of the previous one using a single string of the type d / + * M / yyyy or d-M-yyyy. If the date is not valid, the usual + * ExactException is made. For practical reasons it was necessary to + * move from CodeExceprion to ExactException. + *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param s input string + * @return the object Date + * @throws ExactException exception for null or incorrect date */ + public static Date pacco(final String s) + + throws ExactException { + + ExactException ne = new ExactException(); + ne.datum = "date=" + s; + if (s == null) + throw ne; + String t[] = s.split("-"); + String u[] = s.split("/"); + try { + if (t.length == 3) + return pacco(t[0], t[1], t[2]); + else if (u.length == 3) + return pacco(u[0], u[1], u[2]); + else { + throw ne; + } + } catch (ExactException e) { + throw ne; + } + } + + /** + *

+ * Variant of the previous one using a single string of the type + * yyyy-mm-dd (it is also the XML standard). If the date is not + * valid, the usual ExactException is made. For practical reasons it + * was necessary to move from ExactException to ExactException. + *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param s input string + * @return the object Date + * @throws ExactException exception for null or incorrect date + * @since 3 */ + public static Calendar xml(final String s) + + throws ExactException { + + ExactException ne = new ExactException(); + ne.datum = "date=" + s; + if (s == null) + throw ne; + String t[] = s.split("-"); + try { + if (t.length == 3) + return calPacco(t[2], t[1], t[0]); + else { + throw ne; + } + } catch (ExactException e) { + throw ne; + } + } + + /** + *

+ * Transformation of a date from 6 integers: day, month, year, hour, + * minutes, seconds to a Date object. The month must be given as a + * number from 1 to 12. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param day as a number from 1 to 28, 29, 30 or 31 + * @param month as a number from 1 to 12 + * @param year a 4-digit positive number + * @param hours the hours of the day + * @param minutes the minutes of the hour + * @param seconds the seconds of the minute + * @return the Date object; if the month is incorrect, return an + * empty string + * @throws ExactException exception for incorrect date */ + public static Date pacco(final int day, final int month, + final int year, final int hours, final int minutes, + final int seconds) + + throws ExactException { + + if (!eDataValida(day + "-" + month + "-" + year, "dd-MM-yyyy") + | hours > 23 | hours < 0 | minutes > 59 | minutes < 0 + | seconds > 59 | seconds < 0) { + ExactException ce = new ExactException( + "gg-mm-aaaa hh:mm:ss=" + day + "-" + month + "-" + + year + Candies.SPACE + hours + ":" + + minutes + ":" + seconds, 100302, + "HandleDate", ""); + throw ce; + } + Calendar c = Calendar.getInstance(); + c.set(year, month - 1, day, hours, minutes, seconds); + c.set(Calendar.MILLISECOND, 0); + return c.getTime(); + } + + /** + *

+ * Variant of the previous one using 6 strings instead of 6 numbers. + * Transformation of a date from 6 integers: day, month, year, + * hours, minutes and seconds into a Date object.
+ *

+ * Creation date: 2020-04-09
+ * Last updated: 21 / 11/08 + *

+ *

+ * Changes:
+ *

+ * + * @param dayS as a string from 1 to 28, 29, 30 or 31 + * @param monthS as a string from 1 to 12 + * @param yearS as string, 4 digits + * @param hoursS as string, 2 digits + * @param minutesS as string, 2 digits + * @param secondsS as string, 2 digits + * @return the Date object; if the month is incorrect, return an + * empty string + * @throws ExactException exception for incorrect date */ + public static Date pacco(final String dayS, final String monthS, + final String yearS, final String hoursS, + final String minutesS, final String secondsS) + + throws ExactException { + + int giorno = Integer.valueOf(dayS).intValue(); + int mese = Integer.valueOf(monthS).intValue(); + int anno = Integer.valueOf(yearS).intValue(); + int ore = Integer.valueOf(hoursS).intValue(); + int minuti = Integer.valueOf(minutesS).intValue(); + int secondi = Integer.valueOf(secondsS).intValue(); + return pacco(giorno, mese, anno, ore, minuti, secondi); + } + + /** + *

+ * Calculation of the number of days between two dates of type + * Calendar, independent of the type of calendar. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param d1 The first date. + * @param d2 The second date. + * @return The number of days between the two dates. Zero is + * returned if the dates are the same, one if the dates are + * adjacent, etc. The order of the dates does not matter, + * the value returned is always >= 0. If Calendar types + * of d1 and d2 are different, the result may not be + * accurate. */ + public static int quantiGiorni(Calendar d1, Calendar d2) { + + if (d1.after(d2)) { // swap dates so that d1 is start and d2 is + // end + Calendar swap = d1; + d1 = d2; + d2 = swap; + } + int days = d2.get(Calendar.DAY_OF_YEAR) - d1.get( + Calendar.DAY_OF_YEAR); + int y2 = d2.get(Calendar.YEAR); + if (d1.get(Calendar.YEAR) != y2) { + d1 = (Calendar) d1.clone(); + do { + days += d1.getActualMaximum(Calendar.DAY_OF_YEAR); + d1.add(Calendar.YEAR, 1); + } while (d1.get(Calendar.YEAR) != y2); + } + return days; + } + + /** + *

+ * Calculation of the date contained in a manifest such as + * Built-Date. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param attributes the attributes of the manifest + * @return data as object Date + * @throws ExactException exception for incorrect date */ + public static Date builtDate(Attributes attributes) + throws ExactException { + + Date data = null; + String dataS = attributes.getValue("Built-Date"); + if (dataS.length() == 16) + data = pacco(dataS.substring(8, 10), dataS.substring(5, 7), + dataS.substring(0, 4), dataS.substring(11, 13), + dataS.substring(14, 16), "0"); + else + data = pacco(dataS.substring(8, 10), dataS.substring(5, 7), + dataS.substring(0, 4), dataS.substring(11, 13), + dataS.substring(14, 16), dataS.substring(17, 19)); + return data; + } + + /** + *

+ * Examination of a date written in a text-box. It is to be used if + * you want to test the date just while the operator is writing it, + * digit by digit. The year is always 4 digits. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param data exception for incorrect date + * @param dataMin minimum acceptable value for the date + * @param dataMax maximum acceptable value for the date + * @return the date, if it is valid; otherwise a null returns */ + public static Calendar dataFluida(final String data, + Calendar dataMin, Calendar dataMax) { + + if (Pattern.matches("\\d{1,2}/\\d{1,2}/\\d{4}", data) + && (HandleDate.eDataValida(data, "d/M/yyyy") + | HandleDate.eDataValida(data, "dd/M/yyyy") + | HandleDate.eDataValida(data, "d/MM/yyyy") + | HandleDate.eDataValida(data, "dd/MM/yyyy"))) { + String[] parola = new String[2]; + int anno = 0, mese = 0, giorno = 0; + parola = data.split("/"); + anno = Integer.valueOf(parola[2]); + mese = Integer.valueOf(parola[1]); + giorno = Integer.valueOf(parola[0]); + Calendar c = Calendar.getInstance(); + c.set(anno, mese - 1, giorno, 0, 0, 0); + c.set(Calendar.MILLISECOND, 0); + if (c.compareTo(dataMin) >= 0 & c.compareTo(dataMax) <= 0) + return c; + else + return null; + } else + return null; + } + + /** + *

+ * Transformation of a date + time as a string into a Calendar + * object. It must be of the type g / m / yyyy hh: mm: ss or g / m / + * yyyy hh: mm: ss, sss or g / m / yyyy hh: mm: ss.sss. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param b string date + time + * @return true or false + * @throws ExactException standard exception */ + public static Calendar formatBoxCal(final String b) + + throws ExactException { + + /* error code: 20050xxx */ + + ExactException ce = new ExactException(); + ce.className = "HandleDate"; + ce.method = "formatBox"; + ce.code = 0; + Calendar c = Calendar.getInstance(); + if (b == null || b.isEmpty()) { + ce.code = 20050000; + ce.datum = "The provided datum is null or empty."; + throw ce; + } + String s = Strings.compact_A(b); + String[] p = s.split("\\x20"); // the space character + if (p.length != 2) { + ce.datum = "The provided datum is incorrect," + + " it must contain one space."; + ce.code = 20050001; + throw ce; + } + if (!eDataValida(p[0], "d/M/yyyy")) { + ce.datum = "The provided date is uncorrect, it must be" + + " written according to format d/M/yyyy."; + ce.code = 20050002; + throw ce; + } + String[] q = p[0].split("\\x2f"); // the slash character + c.set(Calendar.DAY_OF_MONTH, Integer.valueOf(q[0]).intValue()); + c.set(Calendar.MONTH, Integer.valueOf(q[1]).intValue() - 1); + c.set(Calendar.YEAR, Integer.valueOf(q[2]).intValue()); + Integer[] y = eOraValida(p[1]); + if (y == null) { + ce.datum = "The provided time is incorrect, it must be " + + " written according to format" + + " hh:mm:ss or hh:mm:ss,sss."; + ce.code = 20050003; + throw ce; + } + c.set(Calendar.HOUR_OF_DAY, y[0].intValue()); + c.set(Calendar.MINUTE, y[1].intValue()); + c.set(Calendar.SECOND, y[2].intValue()); + c.set(Calendar.MILLISECOND, y[3].intValue()); + return c; + } + + /** + *

+ * Variant of the previous one, produces a Timestamp object instead + * of a Calendar object. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param b the string date + time + * @return the object Timestamp + * @throws ExactException application exception */ + public static Timestamp formatBoxTim(final String b) + + throws ExactException { + + Calendar c = formatBoxCal(b); + long l = c.getTimeInMillis(); + return new Timestamp(l); + } + + /** + *

+ * Formal time control. It must be of the type hh: mm: ss or hh: mm: + * ss, sss or hh: mm: ss.sss. If it is not correct, the method + * returns a null value. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param now obvious + * @return true or false */ + public static Integer[] eOraValida(String now) { + + /* error code: 20051xxx */ + + Integer[] x = new Integer[4]; + if (now == null || now.isEmpty()) { + return null; + } + String[] r = now.split("\\x3a"); // 3a is the colon character + if (r.length != 3) { + return null; + } + r[0] = r[0].trim(); + r[1] = r[1].trim(); + r[2] = r[2].trim(); + /* I turn the point into a comma when milliseconds are + * expressed */ + r[2] = r[2].replaceFirst("\\x2e", ","); + if (!r[0].matches("\\d{2}") | !r[1].matches("\\d{2}")) { + return null; + } else if (r[2].matches("\\d{2}")) { + x[0] = Integer.valueOf(r[0]); + x[1] = Integer.valueOf(r[1]); + x[2] = Integer.valueOf(r[2]); + x[3] = Integer.valueOf(0); + if (x[0].intValue() > 23 | x[1].intValue() > 59 | x[2] + .intValue() > 59) { + return null; + } else { + return x; + } + } else if (r[2].matches("\\d{2}\\x2c\\d{3}")) { + x[0] = Integer.valueOf(r[0]); + x[1] = Integer.valueOf(r[1]); + x[2] = Integer.valueOf(r[2].substring(0, 2)); + x[3] = Integer.valueOf(r[2].substring(3, 6)); + if (x[0].intValue() > 23 | x[1].intValue() > 59 | x[2] + .intValue() > 59) { + return null; + } else { + return x; + } + } else { + return null; + } + } +} \ No newline at end of file diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/salad/everyday/MatriceCaratteri.java b/screwdriver-3.5.6/src/main/java/it/ramecera/salad/everyday/MatriceCaratteri.java new file mode 100644 index 0000000..c25d0a1 --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/salad/everyday/MatriceCaratteri.java @@ -0,0 +1,32 @@ +/** + * + */ +package it.ramecera.salad.everyday; + +/** + *

+ * Bean contenitore per una una matrice bidimensionale di caratteri, pi� + * un punto a 2 dimensioni che indica le coordinate dell'angolo in alto + * a sinistra della matrice, rispetto ad un riferimento pi� grande. + *

+ *

+ * azienda: Ramecera
+ * data creazione: 2014-01-17
+ * data ultima modifica: 2014-01-17 + *

+ *

+ * Modifiche:
+ * + *

+ * + * @author M. Maglioni + * @since 6.1 */ + +public class MatriceCaratteri { + + /** le coordinate dell'angolo superiore sinistro della matrice nel + * suo contesto */ + public Point2D dove = new Point2D(); + /** la matrice di caratteri */ + public char[][] x; +} diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/salad/everyday/Mix.java b/screwdriver-3.5.6/src/main/java/it/ramecera/salad/everyday/Mix.java new file mode 100644 index 0000000..c4d9533 --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/salad/everyday/Mix.java @@ -0,0 +1,1662 @@ +// +// https://www.ramecera.it/myscrewdriver.html +// e-mail: screwdriver@ramecera.it +// +/* This program and the accompanying materials are made available under + * the terms of the Eclipse Public License v1.0 which accompanies this + * distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html */ +package it.ramecera.salad.everyday; + +import java.io.File; +import java.io.FilenameFilter; +import java.sql.Connection; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.regex.Pattern; +// import org.eclipse.jface.dialogs.MessageDialog; + +import org.apache.log4j.Logger; + +import it.ramecera.salad.file.FileBase; +import it.ramecera.salad.graphic.Placard; + +/** + *

+ * Various utility methods. + *

+ *

+ * Company: Ramecera™ ​​
+ * Creation date: 2020-04-09
+ * Last updated: 2020-09-24S
+ *

+ *

+ * Changes:
+ *

+ * + * @author M. Maglioni */ + +public class Mix { + + // CONSTANT + /** 2 spaces */ + public final static String DOUBLEBLANK = " "; + + /** + *

+ * First make a trim. If the first character is a capital letter, + * this method converts it to lower case; otherwise it does nothing. + *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-06-20 + *

+ * Modifications:
+ *

+ * + * @param g the complete path of file + * @return la lowercase string */ + public static String lowercaseFirstChar(final String g) { + if (g == null) { + return null; + } + String s = g.trim(); + if (s.equals("")) { + return s; + } + char ini = s.charAt(0); + if (ini > 64 & ini < 91) { // if it is capitalized + String iniziale = s.substring(0, 1); + String resto = s.substring(1); + return iniziale.toLowerCase() + resto; + } else { + return s; + } + } + + /** + *

+ * First make a trim. If the first character is an lowercase letter, + * this method converts it to uppercase; otherwise it does nothing. + *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-06-20 + *

+ * Modifications:
+ *

+ * + * @param g the complete path of file + * @return la uppercase string */ + public static String uppercaseFirstChar(final String g) { + if (g == null) { + return null; + } + String s = g.trim(); + if (s.equals("")) { + return s; + } + char ini = s.charAt(0); + if (ini > 96 & ini < 123) { // if it is lowercase + String iniziale = s.substring(0, 1); + String resto = s.substring(1); + return iniziale.toUpperCase() + resto; + } else { + return s; + } + } + + /** + *

+ * Given a complete file path, it produces an array of 3 strings + * containing respectively: the path, the file, the character (slash + * or backslash) that separates the path from the file. Example: + * /monte/mare/stella.bmp produces: / monte / mare, stella.bmp, /. + *
+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ * Modifications:
+ *

+ * + * @param g the complete path of file + * @return the 3 elements produced */ + public static String[] separaPath(final String g) { + String e[] = new String[3]; + if (g.indexOf(92) > -1) { // character 92 is the backslash + e[2] = "\\"; + } else { + e[2] = "/"; + } + String h = g.replaceAll("\\x5c", "/"); + String[] d = h.split("\\x2f"); + e[1] = d[d.length - 1]; + if (g.equals(e[1])) { + e[2] = ""; + e[0] = ""; + } else { + e[0] = g.substring(0, g.length() - 1 - e[1].length()); + } + return e; + } + + /** + *

+ * Given a complete path of files, it produces an array of 3 strings + * containing respectively: the path, the name of the file without + * extension and without final dot, the extension without initial + * dot. Example: /monte/mare/stella.bmp produces: / monte / mare, + * stella, bmp.
+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ * + * @param g the complete path of file + * @return the 3 elements produced */ + public static String[] analizzaPath(final String g) { + String e[] = new String[3]; + String h = g.replaceAll("\\x5c", "/");// the hex 5c is the + // backslash + String[] d = h.split("\\x2f");// hex 2f is slash + e[1] = d[d.length - 1]; + if (g.equals(e[1])) { + e[0] = ""; + } else { + e[0] = g.substring(0, g.length() - 1 - e[1].length()); + } + e[2] = estraiExtension(e[1]); + if (e[2] == null) { + e[2] = ""; + } + e[1] = e[1].substring(0, e[1].length() - e[2].length() - 1); + return e; + } + + /** + *

+ * It could have been an overload of the previous method, but the + * name was changed because only the type of return changes. + *

+ * Creation date: 11 apr 2019
+ * Last updated: 11 apr 2019
+ *

+ * Modifications:
+ *

+ * + * @param file the complete path of file + * @return i 3 elements produced */ + public static FileBase analizzaPathBase(File file) { + String e[] = analizzaPath(file.getPath()); + FileBase fb = new FileBase(e[0], e[1], e[2], 0); + return fb; + } + + /** + *

+ * Given a string, it produces 3 different versions of the same: + *

+ *
    + *
  • all lowercase
  • + *
  • all uppercase
  • + *
  • all words with initials capital
  • + *
+ *

+ * The text is compacted to eliminate double spaces. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Modifications:
+ *

+ * + * @param s the phrase to convert + * @return the 3 elements produced */ + public static String[] like_A(final String s) { + String s1 = compattaSpazi_B(s); + String[] u = new String[3]; + if (s1.equals("")) { + u[0] = ""; + u[1] = ""; + u[2] = ""; + return u; + } + u[0] = s1.toLowerCase(); + u[1] = s1.toUpperCase(); + String v[] = u[0].split(Candies.SPACE); + String z = ""; + for (String t : v) { + z += Candies.SPACE + t.substring(0, 1).toUpperCase() + t + .substring(1); + } + u[2] = z.substring(1); + return u; + } + + /** + *

+ * Extracts the bits that make up an integer. All the bits minus the + * last one, the one indicating the sign, are extracted; therefore, + * for a 32-bit integer, the 31 bits further left are extracted. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ * + * @param i the number to be sent + * @return the array of bits */ + public static Boolean[] sbitta_A(final int i) { + Boolean[] b = new Boolean[Integer.SIZE - 1]; + double p; + int u; + for (int j = 0; j < Integer.SIZE - 1; j++) { + p = Math.pow(2, j); + u = (int) Math.round(p); + b[j] = Boolean.valueOf((i & u) == u); + } + return b; + } + + /** + *

+ * Creation of a sequence of identical characters in quantity q. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ * + * @param c the character to be appended + * @param q the amount of spaces to be appended + * @return the string of q spaces */ + public static String piastrelle(final char c, final int q) { + String sequenza = "", car = String.valueOf(c); + for (int i = 0; i < q; i++) + sequenza = sequenza.concat(car); + return sequenza; + } + + /** + *

+ * Creation of a sequence of groups of identical characters in + * quantity q. It differs from the previous one in that it + * accumulates groups of characters instead of a single character. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ * + * @param s the group of characters to be appended + * @param q the amount of spaces to be appended + * @return the string of q spaces */ + public static String piastrelle(final String s, final int q) { + String sequenza = ""; + for (int i = 0; i < q; i++) + sequenza = sequenza.concat(s); + return sequenza; + } + + /** + *

+ * Calculation of an array of characters starting from its + * hexadecimal code. We speak of ordinary characters, that is, + * within the ASCII set. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ * + * @param m character array to convert + * @return ordinary character array + * @throws ExactException occurs if the hexadecimal code is + * incorrect */ + public static char[] daEsadAChar(char[] m) + + throws ExactException { + + if (m.length % 2 != 0) + throw new ExactException( + "The quantity of characrters is not an even number."); + if (!Pattern.matches("\\p{XDigit}+", String.copyValueOf(m))) + throw new ExactException( + "Any characters not between 0 and f are present."); + char[] ml = new char[m.length]; + int[] k = new int[m.length]; + char[] n = new char[m.length / 2]; + // I convert to lowercase + for (int i = 0; i < m.length; i++) { + if (Character.isDigit(m[i])) + ml[i] = m[i]; + else + ml[i] = Character.toLowerCase(m[i]); + } + // I convert each character into an integer + for (int i = 0; i < m.length; i++) { + if (ml[i] < 'a') + k[i] = ml[i] - 48; + else + k[i] = ml[i] - 87; + } + // I calculate the true character + for (int i = 0; i < m.length; i += 2) { + n[i / 2] = (char) (k[i] * 16 + k[i + 1]); + } + return n; + } + + /** + *

+ * Calculation of an array of characters starting from its + * hexadecimal code. We speak of ordinary characters, that is, + * within the ASCII set. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ * + * @param m character array to convert + * @return ordinary character array + * @throws ExactException trigger if the hexadecimal code is + * incorrect */ + public static byte[] daEsadAByte(byte[] m) + + throws ExactException { + + char v = 0; + if (m.length % 2 != 0) + throw new ExactException( + "The quantity of characrters is not even: " + + m.length + "."); + for (int j = 0; j < m.length; j++) { + v = (char) (m[j]); + if (!Pattern.matches("\\p{XDigit}+", Character.toString( + v))) { + throw new ExactException("At position " + j + + " any characters not between 0 and f are present: " + + v + " cioè " + m[j]); + } + } + byte[] ml = new byte[m.length]; // the same input array + // convert + // lowercase + int[] k = new int[m.length]; + byte[] n = new byte[m.length / 2]; + // I convert to lowercase + for (int i = 0; i < m.length; i++) { + v = (char) (m[i]); + if (Character.isDigit(v)) + ml[i] = m[i]; + else + ml[i] = (byte) ((Character.toLowerCase(v)) - 127); + } + // I convert each character into an integer + for (int i = 0; i < m.length; i++) { + if (ml[i] < -30) // -30 = character a + k[i] = ml[i] + 79; // -79 = zero character + else + k[i] = ml[i] + 40; // the character W 87, distant 10 + // positions from to + } + // I calculate the true character + for (int i = 0; i < m.length; i += 2) { + n[i / 2] = (byte) ((k[i] * 16 + k[i + 1]) - 127); + } + return n; + } + + /** + *

+ * Calculation of an array of characters starting from its + * hexadecimal code. We speak of Unicode characters, therefore 4 + * hexadecimal characters for each character. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ * + * @param m character array to convert + * @return ordinary character array + * @throws ExactException occurs if the hexadecimal code is + * incorrect */ + public static char[] daEsadACharUnicode(char[] m) + throws ExactException { + if (m.length % 4 != 0) + throw new ExactException( + "The quantity of characters is not a multiple of 4."); + if (!Pattern.matches("\\p{XDigit}+", String.copyValueOf(m))) + throw new ExactException( + "Any characters not between 0 and f are present."); + char[] ml = new char[m.length]; + int[] k = new int[m.length]; + char[] n = new char[m.length / 4]; + // I convert to lowercase + for (int i = 0; i < m.length; i++) { + if (Character.isDigit(m[i])) + ml[i] = m[i]; + else + ml[i] = Character.toLowerCase(m[i]); + } + // I convert each character into an integer + for (int i = 0; i < m.length; i++) { + if (ml[i] < 'a') + k[i] = ml[i] - 48; + else + k[i] = ml[i] - 87; + } + // I calculate the true character + for (int i = 0; i < m.length; i += 4) { + n[i / 4] = (char) (k[i] * 4096 + k[i + 1] * 256 + k[i + 2] + * 16 + k[i + 3]); + } + return n; + } + + /** + *

+ * Calculation of an array of hexadecimal codes starting from an + * array of ordinary characters, that is, within the ASCII set. + * Obviously the output is twice as long. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ * + * @param m character array to convert + * @return lowercase hexadecimal character array + * @see "prog. bigExport_1.1.0, data class of Export" + * @see "prog. bigExport_2.0.0, data class of DiExport" + * @since 1.2.2 */ + public static char[] daCharAdEsad(char[] m) { + int[] k = new int[m.length]; + char[] n = new char[m.length * 2]; + char[] c = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + 'a', 'b', 'c', 'd', 'e', 'f' }; + for (int i = 0; i < m.length; i++) + k[i] = m[i]; + for (int i = 0; i < m.length; i++) { + n[i * 2] = c[k[i] / 16]; + n[i * 2 + 1] = c[k[i] % 16]; + } + return n; + } + + /** + *

+ * Encrypting a string from a key. The encrypted output is further + * transformed into hexadecimal. As a result, the output is twice as + * long. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ * + * @param m character array to convert + * @param key encryption key + * @return encrypted character array + * @throws ExactException incorrect use */ + public static char[] crittaSemplice_A(char[] m, final String key) + + throws ExactException { + + if (m == null | key == null) { + throw new ExactException("One or some given parameters" + + " are null."); + } + String chiave1 = key; + while (chiave1.length() < m.length) { + chiave1 += chiave1; + } + char[] z = new char[m.length]; + String chiave2 = chiave1.substring(0, m.length); + char[] c = chiave2.toCharArray(); + for (int i = 0; i < z.length; i++) + z[i] = (char) (m[i] ^ c[i]); + return daCharAdEsad(z); + } + + /** + *

+ * Decryption of a string, to be coupled to what obtained with the + * crittaSemplice_A method. The string is first transformed from + * hexadecimal to ASCII, then decrypted with the same key with which + * it was encrypted. Obviously the output is half the length. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ * + * @param m character array to convert + * @param key encryption key + * @return encrypted character array + * @throws ExactException incorrect use */ + public static char[] decrittaSemplice_A(char[] m, final String key) + + throws ExactException { + + if (m == null | key == null) { + throw new ExactException( + "One or some given parameters are null."); + } + String chiave1 = key; + if (m.length % 2 != 0) { + throw new ExactException( + "The quantity of characters to decript is not an even number."); + } + while (chiave1.length() < m.length / 2) { + chiave1 += chiave1; + } + char[] z = new char[m.length / 2]; + char[] m1 = Mix.daEsadAChar(m); + String chiave2 = chiave1.substring(0, z.length); + char[] c = chiave2.toCharArray(); + for (int i = 0; i < z.length; i++) + z[i] = (char) (m1[i] ^ c[i]); + return z; + } + + /** + *

+ * Calculation of a 6-character array of the domain [A-Z0-9] + * starting from a long integer not greater than 36 raised to 6. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Modifications:
+ * + * @param m integer long + * @return character array of the domain [A-Z0-9 ] */ + public static char[] daLong6Char(final long m) { + long xm = m; + int q = 0; + long w = 0; + char[] n = new char[6]; + char[] c = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', + 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', + 'W', 'X', 'Y', 'Z' }; + for (int i = 5; i > -1; i--) { + w = (long) Math.pow(36, i); + q = (int) (xm / w); + n[i] = c[q]; + xm -= q * w; + } + return n; + } + + /** + *

+ * Calculation of a 3-character array of the domain [A-Z0-9] + * starting from a long integer not exceeding 36 raised to 3. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Modifications:
+ * + * @param m integer long + * @return character array of the domain [A-Z0-9 ] + * @since 2.0.0 */ + public static char[] daLong3Char(final long m) { + long xm = m; + int q = 0; + long w = 0; + char[] n = new char[3]; + char[] c = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', + 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', + 'W', 'X', 'Y', 'Z' }; + for (int i = 2; i > -1; i--) { + w = (long) Math.pow(36, i); + q = (int) (xm / w); + n[i] = c[q]; + xm -= q * w; + } + return n; + } + + /** + *

+ * Calculation of an array of 1 or 2 characters of the domain [A-Z] + * starting from an integer not greater than 701 (26 + 26 26 - 1). + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ * + * @param m number integer long + * @return domain character array [AZ] */ + public static char[] daLong2Char(final int m) { + int xm = m; + int q = 0; + long w = 0; + char[] n2 = new char[2]; + char[] n1 = new char[1]; + char[] c = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', + 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', + 'V', 'W', 'X', 'Y', 'Z' }; + if (xm < 26) { + n1[0] = c[xm]; + return n1; + } else { + xm -= 26; + for (int i = 1; i > -1; i--) { + w = (long) Math.pow(26, i); + q = (int) (xm / w); + n2[i] = c[q]; + xm -= q * w; + } + return n2; + } + } + + /** + *

+ * Calculation of an array of hexadecimal codes starting from an + * array of Unicode characters. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ * + * @param m character array to convert + * @return lowercase hexadecimal character array */ + public static char[] fromCharToEsadUnicode(char[] m) { + int[] k = new int[m.length]; // I prepare an array of integers + // in + // help + // of the input array + char[] n = new char[m.length * 4]; // I prepare the output + // array, + // long + // the quadruple + char[] c = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + 'a', 'b', 'c', 'd', 'e', 'f' }; + for (int i = 0; i < m.length; i++) + k[i] = m[i]; // I transform the input array into integers + for (int i = 0; i < m.length; i++) { + n[i * 4] = c[k[i] / 4096]; + n[i * 4 + 1] = c[(k[i] % 4096) / 256]; + n[i * 4 + 2] = c[(k[i] % 256) / 16]; + n[i * 4 + 3] = c[(k[i] % 16)]; + } + return n; + } + + /** + *

+ * Work around the error that occurs when using the main main "args" + * argument. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ * + * @param args the same array coming from the main. + * @return a null string or the first argument. + * @since 1.0.0 */ + public static String un_arg(String[] args) { + if (args.length == 0) { + return ""; + } + return args[0]; + } + + /** + *

+ * Simple routine to put two double angle quotes, before and after a + * string. + *

+ *

+ * creation date: 2020-03-10
+ * + * @param a the input string + * @return the string with the double angle quotes */ + final public static String dress_A(final String a) { + String s = Candies.CAAP + a + Candies.CACH; + return s; + } + + /** + *

+ * Simple routine to make sure that a path indication actually ends + * with slash or backslash. If not, add it. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Modifications:
+ * 10/04 08: added the trim + * + * @param y the path to check + * @return the path complete with slash or backslash */ + public static String dress_C(final String y) { + String s = y.trim(); + if (!s.endsWith("/") & !s.endsWith("\\")) + s += System.getProperty("file.separator"); + return s; + } + + /** + *

+ * Simple routine to make sure that a path indication actually ends + * with slash. If not, add it. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ * + * @param y the path to check + * @return the complete path of slash */ + public static String dress_CU(final String y) { + String s = y.trim(); + if (!s.endsWith("/") & !s.endsWith("\\")) + s += "/"; + return s; + } + + /** + *

+ * Simple routine to make sure that the indication of a path + * actually ends with slash or backslash, but with different + * criteria compared to vesti_CU. If not, add it. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Modifications:
+ * 10/04 08: added the trim + * + * @param y the path to be checked + * @return the path complete with slash or backslash */ + public static String dress_D(final String y) { + String s = y.trim(); + // if there is at least one backslash + if (s.indexOf(92) > -1 & !s.endsWith("\\")) { + s += "\\"; + // if there is at least one slash + } else if (s.indexOf(47) > -1 & !s.endsWith("/")) { + s += "/"; + } else if (!s.endsWith("/") & !s.endsWith("\\")) { + s += System.getProperty("file.separator"); + } + return s; + } + + /** + *

+ * Simple routine to delay code execution. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ * + * @param thousandths duration of the delay in thousandths of a + * second */ + public static void ritardo0(final long thousandths) { + long i = System.currentTimeMillis(); + while (System.currentTimeMillis() < (i + thousandths)) { + } + ; + } + + /** + *

+ * Routine to count the occurrence of a certain character in a + * string. It is a faster method than transforming the whole string + * into many characters and then counting. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09
+ *

+ * + * @param s the string to be examined + * @param t the character to be examined search for + * @return how many times */ + public static int charQ(final String s, final char t) { + int i = 0, j = 0; + if (s == null) + return i; + int tn = t; + j = s.indexOf(tn, j); + while (j != -1) { + i++; + j = s.indexOf(tn, j + 1); + } + return i; + } + + /** + *

+ * Routine for finding the last occurrence of a given character in a + * string. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09
+ *

+ * + * @param s the string to be examined + * @param t the character to be search for + * @return how many times */ + public static int ultimaPosizione(final String s, final char t) { + int j = 0, jW = -1; + if (s == null) + return -1; + int tn = t; + j = s.indexOf(tn, j); + while (j != -1) { + jW = j; + j = s.indexOf(tn, j + 1); + } + return jW; + } + + /** + *

+ * Routine to extract the extension from a file name. Return null if + * there is no extension. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09
+ *

+ *

+ * Modifications: 2020-04-09: replaced the last return from return + * null to return ""
+ * + * @param g the file name to be analyzed + * @return how many times */ + public static String estraiExtension(final String g) { + /* split according to the point character */ + String u[] = g.split("\\x2e"); + String e = null; + if (u.length == 1) { + return null; + } else { + e = u[u.length - 1].toLowerCase(); + } + /* if the extension contains neither slash nor backslash, it is + * OK */ + if (e.indexOf(47) == -1 & e.indexOf(92) == -1) { + return e; + } else { /* otherwise it is not an extension */ + return ""; + } + } + + /** + *

+ * Routine to find the last occurrence of a given string in a + * string. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09
+ *

+ * + * @param s the string to be examined + * @param t the string to be examined search for + * @return how many times */ + public static int ultimaPosizione(final String s, final String t) { + int j = 0, jW = -1; + if (s == null) + return -1; + j = s.indexOf(t, j); + while (j != -1) { + jW = j; + j = s.indexOf(t, j + 1); + } + return jW; + } + + /** + *

+ * Routine for counting the occurrence of a given substring in a + * string. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09
+ *

+ * + * @param tutto string to be examined + * @param parte substring from search for + * @return how many times */ + public static int stringheQ(final String tutto, + final String parte) { + int i = 0, j = 0; + if (tutto == null) + return i; + String p1 = parte; + int pL = parte.length(); + j = tutto.indexOf(p1, j); + while (j != -1) { + i++; + j = tutto.indexOf(p1, j + pL); + } + return i; + } + + /** + *

+ * Routine to verify that the content of a string is an integer, + * compatible with the int type. Warning, using Pattern.matches ("\\ + * d +", xxxxx) I would also verify the absence of the + or - sign. + * I don't need to. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ * 10/11 / 08: added trim on the input parameter 2020-04-09: null + * possibility provided + *

+ * + * @param s string to be verified + * @return true or false if the content is numeric or not + * @since 1.2.2 */ + public static boolean verificaIntero(final String s) { + int m; + try { + m = Integer.parseInt(s.trim()); + /* just to not have the hassle of the warning: the local + * variable is never read */ + if ((m + 1) == (m + 1)) { + m = 0; + } + return true; + } catch (NumberFormatException e) { + return false; + } catch (NullPointerException e) { + return false; + } + } + + /** + *

+ * Routine to verify that the content of a string is an integer, + * compatible with the long type. Warning, using Pattern.matches + * ("\\ d +", xxxxx) I would also verify the absence of the + or - + * sign. I don't need to. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ * 10/11 / 08: added the trim on the input parameter 2020-04-09: + * null possibility provided + *

+ * + * @param s string to be verified + * @return true or false if the content is numeric or not + * @since 1.2.2 */ + public static boolean verificaLong(final String s) { + long m; + try { + m = Long.parseLong(s.trim()); + /* just to not have the hassle of the warning: the local + * variable is never read */ + if ((m + 1) == (m + 1)) { + m = 0; + } + return true; + } catch (NumberFormatException e) { + return false; + } catch (NullPointerException e) { + return false; + } + } + + /** Routine to verify that the content of a string is an integer, + * compatible with the short type. + * + * @param s string to check + * @return true or false if the content is numeric or not + * @since 1.2.2 */ + public static boolean verificaShort(final String s) { + int m; + try { + m = Short.parseShort(s); + if ((m + 1) == (m + 1)) { + /* just to not have the hassle of the warning: the local + * variable is never read */ + m = 0; + } + return true; + } catch (NumberFormatException e) { + return false; + } + } + + /** + *

+ * Implementation of the accept method for the FilenameFilter + * interface. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @return a new object FilenameFilter + * @param filter the pattern to be compared, to implement + * filtering */ + public static final FilenameFilter fileFilter(final String filter) { + final String s = filter; + return new FilenameFilter() { + @Override + public boolean accept(File dir, String name) { + String path = new File(name).getName(); + return Pattern.matches(s, path); + } + }; + } + + /** + *

+ * Implementation of the accept method for the FilenameFilter + * interface. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @return a new FilenameFilter + * @since 1.2.1 object */ + public static final FilenameFilter filterDirectory() { + return new FilenameFilter() { + @Override + public boolean accept(File dir, String name) { + return new File(dress_CU(dir.getPath()) + name) + .isDirectory(); + } + }; + } + + /** + *

+ * Implementation of the accept method for the FilenameFilter + * interface. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param filter filter for searching + * @return a new FilenameFilter object */ + public static final FilenameFilter filtroDirectory( + final String filter) { + final String s = filter; + return new FilenameFilter() { + @Override + public boolean accept(File dir, String name) { + File file = new File(dress_CU(dir.getPath()) + name); + String path = file.getName(); + return file.isDirectory() & Pattern.matches(s, path); + } + }; + } + + /** + *

+ * Convenience for checking the nullity of a string. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @return true if the string is a null object or an empty string + * @param s the string to be checked */ + public static final boolean isNothing(final String s) { + return s == null || s.equals(""); + } + + /** + *

+ * If it is a color of those expected for CSS. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @return true If the color to be checked is a color of those + * provided for the CSS + * @param s string to evaluate */ + public static final boolean isCssColor(final String s) { + String t = s.toLowerCase(); + int i = 0; + for (; i < Universal.cssColorE.length; i++) { + if (t.equals(Universal.cssColorE[i].toLowerCase())) + break; + } + return i < Universal.cssColorE.length; + } + + /** + *

+ * Compact a phrase (string) containing more than one blank between + * words in a phrase containing individual blanks. An alternative + * algorithm for obtaining an identical result is found in + * Strings.compatta_A (String).
+ * Ex: "___John__goes_to____school___"
+ * becomes: "John goes to school" + *

+ *

+ * Deprecated 2013- 08-29 because it is too slow, replaced with + * it.ramecera.salad.everyday.Strings.compatta_A. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ * 2020-04-09: added final to parameter a, and slightly modified the + * algorithm
+ * 2020-04-09: added trim
+ *

+ * + * @param a the string to be compacted + * @return the compacted string */ + public static String compactingSpaces_A(final String a) { + if (a == null) + return null; + int j; + String b = a.trim(); + /* algorithm: all look for a double blank, then glue the two + * substrings so that it becomes a single blank; cycle until + * there are no more */ + j = b.lastIndexOf(DOUBLEBLANK, b.length()); + while (j != -1) { + b = b.substring(0, j) + b.substring(j + 1); + j = b.lastIndexOf(DOUBLEBLANK, j - 1); + } + return b.trim(); + } + + /** Transform any empty string into a null string. + *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09
+ *

+ * + * @param s the string to be tested + * @return the resulting string + * @since 1.2.2 */ + public static String stringaNulla(final String s) { + if (s != null && s.equals("")) + return null; + else + return s; + } + + /** Transform any null string into an empty string. + *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ * + * @param s the string to be tested + * @return the resulting string + * @since 1.2.2 */ + public static String nonNullo(final String s) { + if (s == null) + return ""; + else + return s; + } + + /** Turn any null string into a zero. + *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ * 2020-04-09: changed the time with the or double + *

+ * + * @param s the string to be tested + * @return the resulting string + * @since 1.3.0 */ + public static int nonNulloInt(final String s) { + if (s == null || !verificaIntero(s)) + return 0; + else + return Integer.parseInt(s); + } + + /** Cut the first n characters of a string, and if the string is + * shorter this method does nothing: it just returns the string. + *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ * + * @param s the string to be cut + * @param i how many characters you want to cut + * @return the resulting string */ + public static String taglia(final String s, final int i) { + if (s == null) + return ""; + if (s.length() > i) + return s.substring(0, i); + else + return s; + } + + /** + *

+ * Delete n characters at the bottom of a string, if they coincide + * with the string supplied to the second parameter. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ * + * @param s the string to be shortened + * @param tail the string to be compared with the tail of the string + * s + * @return the resulting string + * @since 1.3.0, SVutensiliJ4_1.3.0 */ + public static String tagliaLaCoda(final String s, + final String tail) { + if (s != null && s.endsWith(tail)) + return s.substring(0, s.length() - tail.length()); + else + return s; + } + + /** Latin numeral adverbs */ + // + // public static String [] adverbNumerale = { + // "", "semel", "bis", "ter", "quater", "quinquies", "sexies", + // "F" + // "octies", "novies", + // "decies", "undecies", "duodecies", "ter decies", "quater decies", + // "quindecies", "sedecies", + // "septies decies", "octies decies", "novies decies", + // "vicies", "vicies semel", "vicies bis", "vicies ter", + // "vicies quater", + // "vicies quinquies", + // "vicies sexies", "vicies septies", "duodetricies", "undetricies", + // "tricies", "tricies semel", "tricies bis", "tricies ter", + // "tricies quater", + // "tricies quinquies", "tricies sexies", "tricies septies", + // "Duodequadragies" + // "undequadragies", "quadragies", "quadragies semel", "quadragies + // BIS", + // "quadragies ter", + // "quadragies quater", "quadragies quinquies", "quadragies sexies", + // "quadragies septies", + // "duodequinquagies", "undequinquagies" + // }; + // they are different: 13, 14, 16, 18, 19 + public static String[] avverbioNumerale = { "", "semel", "bis", + "ter", "quater", "quinquies", "sexies", "septies", "octies", + "novies", "decies", "undecies", "duodecies", "terdecies", + "quaterdecies", "quindecies", "sex decies", + "septies decies", "duodevicies", "undevicies", "vicies", + "vicies semel", "vicies bis", "vicies ter", "vicies quater", + "vicies quinquies", "vicies sexies", "vicies septies", + "duodetricies", "undetricies", "tricies", "tricies semel", + "tricies bis", "tricies ter", "tricies quater", + "tricies quinquies", "tricies sexies", "tricies septies", + "duodequadragies", "undequadragies", "quadragies", + "quadragies semel", "quadragies bis", "quadragies ter", + "quadragies quater", "quadragies quinquies", + "quadragies sexies", "quadragies septies", + "duodequinquagies", "undequinquagies" }; + + /** + *

+ * Cleans a phrase (string) clean from the characters TAB, CR, LF, + * FF, VT and compacts everything. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Modifications:
+ * 2020-04-09: the replacement must not be with a null string but + * with a space character
+ *

+ * + * @param a the string to be compacted + * @return the compacted string + * @since 1.4.0, toolsJ4_2.0.0 */ + @Deprecated + public static String compattaSpazi_B(final String a) { + if (a == null) + return null; + String t = a.replaceAll("[\\t\\n\\x0B\\f\\r]", " "); // 2020-04-09 + return compactingSpaces_A(t); + } + + /** + *

+ * Closes multiple statements and related connection. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param statement the array of statements of the connection to the + * DB + * @param connection the connection to the DB + * @since salad_2.0.0 */ + public static void collapse(Statement[] statement, + Connection connection) { + try { + for (int i = 0; i < statement.length; i++) { + if (statement[i] != null) + statement[i].close(); + } + } catch (SQLException e0) { + } + try { + if (connection != null) + connection.close(); + } catch (SQLException e1) { + } + } + + /** Closes multiple statements and related connection. + *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param statement the statement of the connection to the DB + * @param connection the connection to the DB + * @since salad_2.0.0 */ + public static void collapse(Statement statement, + Connection connection) { + try { + if (statement != null) + statement.close(); + if (connection != null) + connection.close(); + } catch (SQLException e1) { + } + } + + /** + *

+ * Externation of a message, exposes a sign and writes it on the + * sysout. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Modifications:
+ * 10/01 / 11: facilitation of braces introduced instead of + * corporals
+ *

+ * + * @param m the message */ + public static void disclosing(final String m) { + /* x7d is the closing brace */ + String m0 = m.replaceAll("\\x7d", "»"); + /* x7b is the opening brace */ + String m1 = m0.replaceAll("\\x7b", "«"); + System.out.println("Placard: " + m1); + new Placard(null, m1, "Warning"); + } + + /** + *

+ * Routine for externalizing an error. There is no extension. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09
+ *

+ *

+ * Changes: + *

+ * + * @param m my message + * @param t message title + * @param logger obvious */ + static public void discloseError(final String m, final String t, + Logger logger) { + /* x7d is the closing brace */ + String m0 = m.replaceAll("\\x7d", "»"); + /* x7b is the opening brace */ + String m1 = m0.replaceAll("\\x7b", "«"); + new Placard(null, m1, t); + logger.error(t + ": " + m1); + } + + /** + *

+ * Routine for externalizing an error. There is no extension. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09
+ *

+ *

+ * Changes: + *

+ * + * @param m my message + * @param t message title + * @param logger obvious */ + static public void discloseInfo(final String m, final String t, + Logger logger) { + /* x7d is the closing brace */ + String m0 = m.replaceAll("\\x7d", "»"); + /* x7b is the opening brace */ + String m1 = m0.replaceAll("\\x7b", "«"); + new Placard(null, m1, t); + logger.info(t + ": " + m1); + } + + /** + *

+ * Routine for the externalization of a warning. There is no + * extension. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09
+ *

+ *

+ * Changes: + *

+ * + * @param m my message + * @param t message title + * @param logger obvious */ + static public void discloseWarning(final String m, final String t, + Logger logger) { + /* x7d is the closing brace */ + String m0 = m.replaceAll("\\x7d", "»"); + /* x7b is the opening brace */ + String m1 = m0.replaceAll("\\x7b", "«"); + new Placard(null, m1, t); + logger.warn(t + ": " + m1); + } + + /** + *

+ * Method to switch from a software version in the form 3, 4.2, or + * 2.0.11 to the form 3000000, 4002000, 2000011. + *

+ *

+ * Creation date: 2020-04-09
+ * data last modification: 2020-04-09 + *

+ * + * @param x the string indicating the version + * @param message the message to be displayed in case of + * irregularity + * @param code error code + * @return the number representing the absolute version + * @throws ExactException ordinary exception */ + public static int absoluteVersion(final String x, + final String message, final int code) + + throws ExactException { + + int sostanza = 0; + ExactException ee = new ExactException(); + /* if a dash is present, only what is left of the dash is taken + * into account; if it is not present, what is there is worth; + * the possible presence of an alphabetical string in the queue + * is not considered */ + String g[] = x.split("\\x2d"); + /* is divided into substrings by adopting the dot as a + * separator */ + String h[] = g[0].split("\\x2e"); + /* the possible presence of an alphabetical string in the queue + * is not considered */ + if (h.length == 1 && h[0].matches("\\d") || (h.length == 2 + && h[0].matches("\\d+") && h[1].matches( + "\\p{Alpha}+"))) { + sostanza = Integer.valueOf(h[0]) * 1000000; + } else if (h.length == 2 && h[0].matches("\\d+") && h[1] + .matches("\\d+")) { + sostanza = Integer.valueOf(h[0]) * 1000000 + Integer + .valueOf(h[1]) * 1000; + } else if (h.length == 3 && h[0].matches("\\d+") && h[1] + .matches("\\d+") && h[2].matches("\\p{Upper}+")) { + sostanza = Integer.valueOf(h[0]) * 1000000 + Integer + .valueOf(h[1]) * 1000; + } else if (h.length == 3 && h[0].matches("\\d+") && h[1] + .matches("\\d+") && h[2].matches("\\d+")) { + sostanza = Integer.valueOf(h[0]) * 1000000 + Integer + .valueOf(h[1]) * 1000 + Integer.valueOf(h[2]); + } else if (h.length == 4 && h[0].matches("\\d+") && h[1] + .matches("\\d+") && h[2].matches("\\d+") && h[3] + .matches("\\p{Alpha}+")) { + sostanza = Integer.valueOf(h[0]) * 1000000 + Integer + .valueOf(h[1]) * 1000 + Integer.valueOf(h[2]); + } else { + ee.code = code; + ee.datum = message; + throw ee; + } + return sostanza; + } + + /** + *

+ * Creation date: 2020-05-29
+ * Last updated: 2020-05-29
+ * Class: Mix + * + * @author M. Maglioni + *

+ * Description: it trasnform the format of a version from + * string n.n.n to an integer, base is 1000. Example: 3.5.1 + * becomes 3005001. + *

+ * @param v the version formatted n.n.n + * @return the version as an integer */ + public static Integer versionFormat_A(final String v) { + String[] x = v.split("\\x2e"); + int xd = x.length; + switch (xd) { + case 1: + if (x[0].matches("\\d{1,3}")) { + return Integer.valueOf(x[0]) * 1000000; + } else { + return null; + } + case 2: + if (x[0].matches("\\d{1,3}") & x[1].matches("\\d{1,3}")) { + return Integer.valueOf(x[0]) * 1000000 + Integer + .valueOf(x[1]) * 1000; + } else { + return null; + } + case 3: + if (x[0].matches("\\d{1,3}") & x[1].matches("\\d{1,3}") + & x[2].matches("\\d{1,3}")) { + return Integer.valueOf(x[0]) * 1000000 + Integer + .valueOf(x[1]) * 1000 + Integer.valueOf(x[2]); + } else { + return null; + } + default: + return null; + } + } +} diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/salad/everyday/Point2D.java b/screwdriver-3.5.6/src/main/java/it/ramecera/salad/everyday/Point2D.java new file mode 100644 index 0000000..ff1b396 --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/salad/everyday/Point2D.java @@ -0,0 +1,55 @@ +// +// https://www.ramecera.it/myscrewdriver.html +// e-mail: screwdriver@ramecera.it +// +/* This program and the accompanying materials are made available under + * the terms of the Eclipse Public License v1.0 which accompanies this + * distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html */ +package it.ramecera.salad.everyday; + +/** + *

+ * Bean container for a 2-dimensional point. + *

+ *

+ * Company: Rameceraâ„¢
+ * Creation date: 2020-06-13
+ * Last updated: 2020-06-13 + *

+ *

+ * Changes:
+ *

+ * + * @author M. Maglioni + * @since 1.2.3 */ +public class Point2D { + + /** y coordinate */ + public int row; + /** x coordinate */ + public int column; + + /** default constructor */ + public Point2D() { + } + + /** + *

+ * Useful constructor + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Modifications:
+ *

+ * + * @param y the row + * @param x the column */ + public Point2D(int y, int x) { + row = y; + column = x; + } +} diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/salad/everyday/StartingOperations.java b/screwdriver-3.5.6/src/main/java/it/ramecera/salad/everyday/StartingOperations.java new file mode 100644 index 0000000..0c64125 --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/salad/everyday/StartingOperations.java @@ -0,0 +1,301 @@ +// +// https://www.ramecera.it/myscrewdriver.html +// e-mail: screwdriver@ramecera.it +// + +/* This program and the accompanying materials are made available under + * the terms of the Eclipse Public License v1.0 which accompanies this + * distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html */ +package it.ramecera.salad.everyday; + +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.PrintStream; +import java.util.InvalidPropertiesFormatException; +import java.util.Properties; + +import it.ramecera.salad.graphic.Placard; + +/** + *

+ * General utility class for managing properties files. + *

+ *

+ * Company: Rameceraâ„¢
+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ * 2020-04-09: abandonment of SWT graphics in favor of Swing
+ *

+ * + * @author M. Maglioni */ +public class StartingOperations { + + /** + *

+ * Reading the properties file, this is an XML file. Since the + * routine already includes several error messages, in case of catch + * you will have to simply return, without displaying + * anything else; if anything, you can log the event. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-19-02
+ *

+ *

+ * Modifications:
+ * 2020-04-09: replaced SWT type message-box with Swing type + * Placard, ver. 2.0.0
+ * 2020-04-09: improvement of error messages, ver. 2.0.1
+ * 2020-04-09: added graphic parameter, it must not issue message + * boxes when the graphic is not foreseen, for example because it is + * in non-graphic Unix, ver. 2.1.0
+ *

+ * + * @param propertiesF the name of the file, positioned at the root + * of the project, of the XML type, containing the true + * graphic + * @param graphicOption true if it is possible to emit graphic + * elements; false if the message simply goes to System.out + * @return the properties extracted from the file, in object of the + * class Properties + * @throws ExactException standard exception */ + public static Properties myPropertiesXML(String propertiesF, + boolean graphicOption) + + throws ExactException { + + Properties p = new Properties(); + String a; + try { + p.loadFromXML(new FileInputStream(propertiesF)); + return p; + } catch (InvalidPropertiesFormatException e) { + a = "The file " + Mix.dress_A(propertiesF) + + " is incorrect."; + if (graphicOption) { + System.out.println(a); + new Placard(null, a); + } else { + System.out.println(a); + } + throw new ExactException(a, 100104, "StartingOperations", + ""); + } catch (FileNotFoundException e) { + if (propertiesF.equals("")) + a = "It's not indicated any properties file."; + else + a = "The file " + Mix.dress_A(propertiesF) + + " is not present."; + if (graphicOption) { + System.out.println(a); + new Placard(null, a); + } else { + System.out.println(a); + } + throw new ExactException(a, 100105, "StartingOperations", + ""); + } catch (IOException e) { + a = "The file " + Mix.dress_A(propertiesF) + + " isn't readable."; + if (graphicOption) { + System.out.println(a); + new Placard(null, a); + } else { + System.out.println(a); + } + throw new ExactException(a, 100106, "StartingOperations", + ""); + } + } + + /** + *

+ * Read the properties file. Since the routine already includes + * several error messages, in case of catch you will have to simply + * return, without displaying anything else; if anything, you + * can log the event. + *

+ *

+ * Creation date: 2020-10-02
+ * Last updated: 2020-10-02
+ *

+ *

+ * Historys:
+ *

+ * + * @param propertiesF the name of the file, positioned at the root + * of the project + * @param graphicOption true if it is possible to emit graphic + * elements; false if the message simply goes to System.out + * @return the properties extracted from the file, in object of the + * class Properties + * @throws ExactException standard exception */ + public static Properties myProperties(String propertiesF, + boolean graphicOption) + + throws ExactException { + + if (propertiesF == null) { + throw new ExactException("Instead of indicating a " + + "properties file, there is a null.", 100107, + "StartingOperations", "myProperties"); + } + Properties p = new Properties(); + String a = ""; + try { + p.load(new FileInputStream(propertiesF)); + return p; + } catch (InvalidPropertiesFormatException e) { + a = "The file " + Mix.dress_A(propertiesF) + + " is incorrect."; + if (graphicOption) { + System.out.println(a); + new Placard(null, a); + } else { + System.out.println(a); + } + throw new ExactException(a, 100108, "StartingOperations", + ""); + } catch (FileNotFoundException e) { + if (propertiesF.equals("")) + a = "It's not indicated any properties file."; + else + a = "The file " + Mix.dress_A(propertiesF) + + " is not present."; + if (graphicOption) { + System.out.println(a); + new Placard(null, a); + } else { + System.out.println(a); + } + throw new ExactException(a, 100109, "StartingOperations", + ""); + } catch (IOException e) { + a = "The file " + Mix.dress_A(propertiesF) + + " isn't readable."; + if (graphicOption) { + System.out.println(a); + new Placard(null, a); + } else { + System.out.println(a); + } + throw new ExactException(a, 100110, "StartingOperations", + ""); + } + } + + /** + *

+ * Writing the properties file, this is an XML file. + *

+ *

+ * Creation date: 2020-04-09
+ * last modification: 2020-04-09 + *

+ *

+ * Modifications:
+ * 2020-04-09 : replaced SWT message-box with Swing type Placard, + * created version 2.0.0 + *

+ * + * @param propertiesF the name of the file, positioned at the root + * of the project, of XML type, containing the properties + * @param p the properties object to write to disk + * @throws Exception The file cannot be written. */ + public static void yourPropertiesXML(String propertiesF, + Properties p) + + throws Exception { + + Exception err = new Exception("Uncorrect"); + try { + PrintStream printStream = new PrintStream(propertiesF); + p.storeToXML(printStream, "Written on " + HandleDate + .currentDate_C() + Candies.SPACE + HandleDate + .currentTime_B(), "UTF-8"); + printStream.close(); + } catch (IOException e) { + new Placard(null, "The file " + Mix.dress_A(propertiesF) + + " isn't writable."); + throw err; + } catch (NullPointerException e) { + new Placard(null, "Setting error in file " + Mix.dress_A( + propertiesF) + "."); + throw err; + } + } + + /** + *

+ * Reading and checking the existence of a property. + *

+ *

+ * Creation date: 2020-04-09
+ * last modification: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param p the object that contains all the properties + * @param label the label of the property + * @return the data relating to that label + * @throws ExactException the label is not present, therefore the + * data is null */ + public static String whetherPresent(Properties p, + final String label) + + throws ExactException { + + String v = p.getProperty(label); + if (v == null) + throw new ExactException("The property " + Mix.dress_A( + label) + " is missing or null.", 100111, + "StartingOperations", ""); + return v; + } + + /** + *

+ * Reading and checking the existence of a Boolean property. + *

+ *

+ * Creation date: 2020-04-09
+ * last modification: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @since J6_1 + * @param p the object that contains all the properties + * @param label the label of the property + * @return the data relating to that label + * @throws ExactException the label is not present, therefore the + * data is null */ + public static boolean propertyPresenteBoolean(Properties p, + final String label) + + throws ExactException { + + String v = p.getProperty(label).trim(); + if (v == null) + throw new ExactException("The property " + Mix.dress_A( + label) + " is missing or null.", 100112, + "StartingOperations", ""); + if (v.equalsIgnoreCase("false")) { + return false; + } else if (v.equalsIgnoreCase("true")) { + return true; + } else { + throw new ExactException("The property «" + Mix.dress_A( + label) + " is neither true nor false.", 100113, + "StartingOperations", ""); + } + } +} \ No newline at end of file diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/salad/everyday/StringInt.java b/screwdriver-3.5.6/src/main/java/it/ramecera/salad/everyday/StringInt.java new file mode 100644 index 0000000..02cf3af --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/salad/everyday/StringInt.java @@ -0,0 +1,54 @@ +// +// https://www.ramecera.it/myscrewdriver.html +// e-mail: screwdriver@ramecera.it +// +/* This program and the accompanying materials are made available under + * the terms of the Eclipse Public License v1.0 which accompanies this + * distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html */ +package it.ramecera.salad.everyday; + +/** + *

+ * Bean container for a string and an integer. + *

+ *

+ * Company: Rameceraâ„¢
+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @author M. Maglioni */ +public class StringInt { + + /** a string */ + public String s; + /** a number */ + public int i; + + /** default constructor */ + public StringInt() { + } + + /** + *

+ * Standard constructor. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param s the string + * @param i the integer */ + public StringInt(final String s, final int i) { + this.s = s; + this.i = i; + } +} diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/salad/everyday/Stringa2Int.java b/screwdriver-3.5.6/src/main/java/it/ramecera/salad/everyday/Stringa2Int.java new file mode 100644 index 0000000..0d52656 --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/salad/everyday/Stringa2Int.java @@ -0,0 +1,54 @@ +package it.ramecera.salad.everyday; + +/** + *

+ * Bean contenitore per una stringa e 2 interi. + *

+ *

+ * azienda: Ramecera
+ * data creazione: 2014-01-28
+ * data ultima modifica: 2014-01-28 + *

+ *

+ * Modifiche:
+ * + *

+ * + * @author M. Maglioni + * @since 6.1 + */ +public class Stringa2Int { + + /** la stringa */ + public String s; + /** 1° numero intero */ + public int i0; + /** 2° numero intero */ + public int i1; + + /** costruttore di default */ + public Stringa2Int() { + } + + /** + *

+ * Costruttore standard. + *

+ *

+ * data creazione: 2014-01-28
+ * data ultima modifica: 2014-01-28 + *

+ *

+ * Modifiche:
+ *

+ * + * @param s la stringa + * @param i0 il primo intero + * @param i1 il secondo intero + */ + public Stringa2Int(final String s, final int i0, final int i1) { + this.s = s; + this.i0 = i0; + this.i1 = i1; + } +} diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/salad/everyday/Strings.java b/screwdriver-3.5.6/src/main/java/it/ramecera/salad/everyday/Strings.java new file mode 100644 index 0000000..0612e39 --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/salad/everyday/Strings.java @@ -0,0 +1,643 @@ +// +// https://www.ramecera.it/myscrewdriver.html +// e-mail: screwdriver@ramecera.it +// +/* This program and the accompanying materials are made available under + * the terms of the Eclipse Public License v1.0 which accompanies this + * distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html */ +package it.ramecera.salad.everyday; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import it.ramecera.salad.file.ReadMyFile; +import it.ramecera.salad.graphic.Dynamics; + +/** + *

+ * Static methods of various utility. + *

+ *

+ * Company: Rameceraâ„¢
+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @author M. Maglioni + * @since 1.2.3 */ + +public class Strings { + // + /** XML and HTML entities */ + // public static final String[] tokenE = { "quot", "amp", "apos", + // "lt", + // "gt", + // "nbsp", "iexcl", "cent", "pound", "curren", "yen", "brvbar", + // "sect", "uml", "copy", "ordf", "laquo", "not", "shy", "reg", + // "macr", "deg", "plusmn", "sup2", "sup3", "acute", "micro", + // "para", + // "middot", "cedil", "sup1", "ordm", "raquo", "frac14", "frac12", + // "frac34", "iquest", "Agrave", "Aacute", "Acirc", "Atilde", + // "Auml", + // "Aring", "AElig", "Ccedil", "Egrave", "Eacute", "Ecirc", "Euml", + // "Igrave", "Iacute", "Icirc", "Iuml", "ETH", "Ntilde", "Ograve", + // "Oacute", "Ocirc", "Otilde", "Ouml", "times", "Oslash", "Ugrave", + // "Uacute", "Ucirc", "Uuml", "Yacute", "THORN", "szlig", "agrave", + // "aacute", "acirc", "atilde", "auml", "aring", "aelig", "ccedil", + // "egrave", "eacute", "ecirc", "euml", "igrave", "iacute", "icirc", + // "iuml", "eth", "ntilde", "ograve", "oacute", "ocirc", "otilde", + // "ouml", "divide", "oslash", "ugrave", "uacute", "ucirc", "uuml", + // "yacute", "thorn", "yuml", "OElig", "oelig", "Scaron", "scaron", + // "Yuml", "fnof", "circ", "tilde", "Alpha", "Beta", "Gamma", + // "Delta", + // "Epsilon", "Zeta", "Eta", "Theta", "Iota", "Kappa", "Lambda", + // "Mu", + // "Nu", "Xi", "Omicron", "Pi", "Rho", "Sigma", "Tau", "Upsilon", + // "Phi", "Chi", "Psi", "Omega", "alpha", "beta", "gamma", "delta", + // "epsilon", "zeta", "eta", "theta", "iota", "kappa", "lambda", + // "mu", + // "nu", "xi", "omicron", "pi", "rho", "sigmaf", "sigma", "tau", + // "upsilon", "phi", "chi", "psi", "omega", "thetasym", "upsih", + // "piv", "ensp", "emsp", "thinsp", "zwnj", "zwj", "lrm", "rlm", + // "ndash", "mdash", "lsquo", "rsquo", "sbquo", "ldquo", "rdquo", + // "bdquo", "dagger", "Dagger", "bull", "hellip", "permil", "prime", + // "Prime", "lsaquo", "rsaquo", "oline", "frasl", "euro", "image", + // "weierp", "real", "trade", "alefsym", "larr", "uarr", "rarr", + // "darr", "harr", "crarr", "lArr", "uArr", "rArr", "dArr", "hArr", + // "forall", "part", "exist", "empty", "nabla", "isin", "notin", + // "ni", + // "prod", "sum", "minus", "lowast", "radic", "prop", "infin", + // "ang", + // "and", "or", "cap", "cup", "int", "there4", "sim", "cong", + // "asymp", + // "ne", "equiv", "le", "ge", "sub", "sup", "nsub", "sube", "supe", + // "oplus", "otimes", "perp", "sdot", "vellip", "lceil", "rceil", + // "lfloor", "rfloor", "lang", "rang", "loz", "spades", "clubs", + // "hearts", "diams" }; + // + // public static final String[] tradE = { "quot", "amp", "apos", + // "lt", + // "gt", + // "nbsp", "iexcl", "cent", "pound", "curren", "yen", "brvbar", + // "sect", "uml", "copy", "ordf", "laquo", "not", "shy", "reg", + // "macr", "deg", "plusmn", "sup2", "sup3", "acute", "micro", + // "para", + // "middot", "cedil", "sup1", "ordm", "raquo", "frac14", "frac12", + // "frac34", "iquest", "Agrave", "Aacute", "Acirc", "Atilde", + // "Auml", + // "Aring", "AElig", "Ccedil", "Egrave", "Eacute", "Ecirc", "Euml", + // "Igrave", "Iacute", "Icirc", "Iuml", "ETH", "Ntilde", "Ograve", + // "Oacute", "Ocirc", "Otilde", "Ouml", "times", "Oslash", "Ugrave", + // "Uacute", "Ucirc", "Uuml", "Yacute", "THORN", "szlig", "agrave", + // "aacute", "acirc", "atilde", "auml", "aring", "aelig", "ccedil", + // "è", "é", "ecirc", "euml", "igrave", "iacute", "icirc", "iuml", + // "eth", "ntilde", "ograve", "oacute", "ocirc", "otilde", "ouml", + // "divide", "oslash", "ugrave", "uacute", "ucirc", "uuml", + // "yacute", + // "thorn", "yuml", "OElig", "oelig", "Scaron", "scaron", "Yuml", + // "fnof", "circ", "tilde", "Alpha", "Beta", "Gamma", "Delta", + // "Epsilon", "Zeta", "Eta", "Theta", "Iota", "Kappa", "Lambda", + // "Mu", + // "Nu", "Xi", "Omicron", "Pi", "Rho", "Sigma", "Tau", "Upsilon", + // "Phi", "Chi", "Psi", "Omega", "alpha", "beta", "gamma", "delta", + // "epsilon", "zeta", "eta", "theta", "iota", "kappa", "lambda", + // "mu", + // "nu", "xi", "omicron", "pi", "rho", "sigmaf", "sigma", "tau", + // "upsilon", "phi", "chi", "psi", "omega", "thetasym", "upsih", + // "piv", "ensp", "emsp", "thinsp", "zwnj", "zwj", "lrm", "rlm", + // "ndash", "mdash", "lsquo", "rsquo", "sbquo", "ldquo", "rdquo", + // "bdquo", "dagger", "Dagger", "bull", "hellip", "permil", "prime", + // "Prime", "lsaquo", "rsaquo", "oline", "frasl", "euro", "image", + // "weierp", "real", "trade", "alefsym", "larr", "uarr", "rarr", + // "darr", "harr", "crarr", "lArr", "uArr", "rArr", "dArr", "hArr", + // "forall", "part", "exist", "empty", "nabla", "isin", "notin", + // "ni", + // "prod", "sum", "minus", "lowast", "radic", "prop", "infin", + // "ang", + // "and", "or", "cap", "cup", "int", "there4", "sim", "cong", + // "asymp", + // "ne", "equiv", "le", "ge", "sub", "sup", "nsub", "sube", "supe", + // "oplus", "otimes", "perp", "sdot", "vellip", "lceil", "rceil", + // "lfloor", "rfloor", "lang", "rang", "loz", "spades", "clubs", + // "hearts", "diams" }; + + /** entities to convert */ + public static final String[] tokenE = { "quot", "amp", "apos", "lt", + "gt", "agrave", "egrave", "eacute", "igrave", "ograve", + "ugrave", "rsquo", "ndash" }; + + /** converted entities */ + public static final String[] tradE = { "\"", "&", "'", "<", ">", + "à", "è", "é", "ì", "ò", "ù", "'", "-" }; + + /** + *

+ * Replaces the entities with what is indicated in the second table. + * array + *

+ *

+ * version: 1.0.0
+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param s the sentence to be treated + * @return the array of words */ + public static String sostituisciEntities(final String s) { + if (s == null) { + return null; + } + String t = s; + String p = null; + String q = null; + int j = t.indexOf(38); + while (j > -1) { + p = t.substring(j + 1); + q = t.substring(0, j); + int l = 0; + for (; l < tokenE.length; l++) { + if (p.startsWith(tokenE[l] + ";")) { + break; + } + } + if (l < tokenE.length) { + t = q + tradE[l] + p.substring(tokenE[l].length() + 1); + } + j = t.indexOf(38, j + 1); + } + return t; + } + + /** + *

+ * Starting from a sentence, it produces the detached words and + * packed in an array. + *

+ *

+ * version: 1.0.0
+ * Creation date: 2020-04-09
+ * last modified date : 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param s the sentence to be treated + * @return the array of words */ + public static String[] parole_A(final String s) { + String t = compact_A(s); + return t.split(Candies.SPACE); + } + + /** + *

+ * Starting from a sentence, compact the multiple spaces between + * words by replacing them with a single space; it also eliminates + * head and tail spaces. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param s the sentence to be treated + * @return the compacted sentence */ + public static String compact_A(final String s) { + if (s == null) + return null; + String t = s.replaceAll("[\\t\\n\\x0B\\f\\r]", Candies.SPACE); // 2020-04-09 + t = t.trim(); + while (t.indexOf(Mix.DOUBLEBLANK) > -1) + t = t.replaceAll(Mix.DOUBLEBLANK, Candies.SPACE); + return t; + } + + /** + *

+ * Starting from a sentence, compact the multiple spaces between + * words by replacing them with a single space; it also eliminates + * head and tail spaces. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param s the sentence to be treated + * @return the compacted sentence */ + public static String compatta_B(final String s) { + if (s == null) + return null; + String t = s.replaceAll("[\\t\\n\\x0B\\f\\r]", Candies.SPACE); // 2020-04-09 + t = t.trim(); + while (t.indexOf(Mix.DOUBLEBLANK) > -1) + t = t.replaceAll(Mix.DOUBLEBLANK, Candies.SPACE); + /* refinement for java sources:). it becomes ). */ + t = t.replaceAll("\\x29\\x20\\x2e", ")."); + return t; + } + + /** + *

+ * Search for a string within a list-array of strings. If it finds + * it, it gives the row-column coordinates; if it does not find it, + * it gives coordinates -1 and -1. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param z the array list to search for + * @param s the string to search for + * @return the coordinates of the found string, or the pair of + * values ​​(-1, -1) */ + public static Point2D cercaStringa_A(List z, + final String s) { + + int zQ = z.size(); + int j = 0; + String riga = null; + for (; j < zQ; j++) { + riga = z.get(j); + if (riga.indexOf(s) > -1) + break; + } + if (j == zQ) + return new Point2D(-1, -1); + else + return new Point2D(j, z.get(j).indexOf(s)); + } + + /** + *

+ * Search for two ordered strings within an array list of strings. + * If it finds them, it gives the row-column coordinates of the + * first string; if it does not find it, it gives coordinates -1 and + * -1. Variant of the previous one. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param z the array list to search for + * @param s0 the 1st string to search + * @param s1 the 2nd string to search + * @return the coordinates of the string found, or the pair of + * values ​​(-1, -1) */ + public static Point2D cercaStringa_A(List z, + final String s0, final String s1) { + + int zQ = z.size(); + int j = 0; + String riga = null; + for (; j < zQ; j++) { + riga = z.get(j); + if (riga.indexOf(s0) < riga.indexOf(s1) & riga.indexOf( + s0) > -1) + break; + } + if (j == zQ) + return new Point2D(-1, -1); + else + return new Point2D(j, z.get(j).indexOf(s0)); + } + + /** + *

+ * Searches for three strings sorted within a list-array of strings. + * If it finds them, it gives the row-column coordinates of the + * first string; if it does not find it, it gives coordinates -1 and + * -1. Variant of the previous one. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param z the array list to search for + * @param s0 the 1st string to search + * @param s1 the 2nd string to search + * @param s2 the 3rd string to search + * @return the coordinates of the found string, or the pair of + * values (-1, -1) */ + public static Point2D cercaStringa_A(List z, + final String s0, final String s1, final String s2) { + + int zQ = z.size(); + int j = 0; + String riga = null; + for (; j < zQ; j++) { + riga = z.get(j); + if (riga.indexOf(s0) < riga.indexOf(s1) & riga.indexOf( + s1) < riga.indexOf(s2) & riga.indexOf(s0) > -1) + break; + } + if (j == zQ) + return new Point2D(-1, -1); + else + return new Point2D(j, z.get(j).indexOf(s0)); + } + + /** + *

+ * Searches for a specific occurrence of a string within an array + * list of strings. If it finds it, it gives the row-column + * coordinates; if it does not find it, it gives coordinates -1 and + * -1. Variant of the previous one. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param z the array list to search for + * @param s the string to search for + * @param occo occurrence of the string to search for + * @return the coordinates of the found string, or the pair of + * values ​​(-1, -1) */ + public static Point2D cercaStringa_A(List z, final String s, + final int occo) { + + int zQ = z.size(); + int j = 0; + int k = 0; + String riga = null; + for (; j < zQ; j++) { + riga = z.get(j); + if (riga.indexOf(s) > -1) + k++; + if (k == occo) + break; + } + if (j == zQ) + return new Point2D(-1, -1); + else + return new Point2D(j, z.get(j).indexOf(s)); + } + + /** + *

+ * Extracts tokens from a line of CSV files. If the line ends with + * the delimiting character, the delimiting character is not taken + * into account. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param t the line to be processed + * @param pv the separation character, usually; + * @param v2 the delimiting character, usually " + * @return the resulting string array */ + public static String[] gettoni_A(final String t, final String pv, + final String v2) { + if (t == null | pv.length() != 1 | v2.length() != 1) { + return null; + } + String[] s = t.split(pv); + for (int j = 0; j < s.length; j++) { + /* I have to treat each token (hypothesis that it is + * quotation marks): 1) I trim it, 2) I remove the first and + * last character quotation marks, 3) I replace the double + * character quotation marks with the single character */ + s[j] = s[j].trim(); + if (s[j].length() > 1 && s[j].startsWith(v2) && s[j] + .endsWith(v2)) { + s[j] = s[j].substring(1, s[j].length() - 1); + s[j] = s[j].replaceAll(v2 + "{2}", v2); + } + } + return s; + } + + /** + *

+ * Extracts the tokens from a line of CSV files, but (assuming that + * the characters are the semicolon and the double quotation mark) + * it takes into account the possibility that inside a token + * delimited by quotes there is a semicolon, which therefore should + * not be considered a delimiter. If a line ends with the delimiting + * character, the delimiting character is not taken into account. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param t the line to be processed + * @param pv the separation character, usually; + * @param v2 the delimitation character, usually " + * @return the resulting string array + * @throws ExactException standard exception */ + public static String[] tokens_B(final String t, final String pv, + final String v2) + + throws ExactException { + + if (t == null || t.length() == 0) { + throw new ExactException( + "The line to analyze is null or empty.", 101500, + "Strings", "gettoni_B"); + } else if (pv == null || pv.length() != 1) { + throw new ExactException("The separation character" + + " is null, empty or it is one.", 101501, + "Strings", "gettoni_B"); + } else if (v2 == null || v2.length() != 1) { + throw new ExactException("The delimitation character" + + " is null, empty or it is one.", 101502, + "Strings", "gettoni_B"); + } else if (v2.equals(pv)) { + throw new ExactException("The delimitation character" + + " must be different from the separation one.", + 101502, "Strings", "tokens_B"); + } + /* now I find a string that is certainly absent from the line to + * be examined, and that is suitable in reference to the + * separation and delimitation characters; I only use digits */ + int k = 0; + String w = ""; + String w1 = null; + for (; k < Integer.MAX_VALUE; k++) { + w1 = w + k; + if (t.indexOf(w1) == -1 & w1.indexOf(v2) == -1 & w1.indexOf( + pv) == -1) { + break; + } + } + /* the string w1 is used in place of the semicolons found inside + * strings marked with quotes. A restore operation follows */ + /* with this change I take into account that the split operation + * does not take into account a possible separation character + * that is exactly at the bottom of the line; this would be a + * mistake when I go to calculate the tokens quantities */ + String t0 = t + " "; + String[] b = t0.split(v2); + /* first check that the double quotes are in even quantities */ + int bL = b.length; + if (bL % 2 == 0) { + throw new ExactException( + "The quantity of the delimitation characters" + + " is an odd number, it is incorrect: " + + t, 101503, "Strings", "gettoni_B"); + } + String t1 = ""; + for (int i = 0; i < b.length; i++) { + if (i % 2 == 1 & b[i].indexOf(pv) > -1) { + b[i] = b[i].replaceAll(pv, w1); + } + t1 += b[i] + v2; + } + t1 = t1.substring(0, t1.length() - v2.length()); + String[] s = t1.split(pv); + for (int j = 0; j < s.length; j++) { + /* I have to treat each token (hypothesis that it is + * quotation marks): 1) I trim it, 2) I remove the first and + * last character quotation marks, 3) I replace the double + * character quotation marks with the single character */ + s[j] = s[j].trim(); + if (s[j].length() > 1 && s[j].startsWith(v2) && s[j] + .endsWith(v2)) { + s[j] = s[j].substring(1, s[j].length() - 1); + s[j] = s[j].replaceAll(v2 + "{2}", v2); + s[j] = s[j].replaceAll(w1, pv); // restoration + } + } + return s; + } + + /** + *

+ * Extracts the tokens from a line of CSV files, but (assuming that + * the characters are the semicolon and the double quotation mark) + * it takes into account the possibility that inside a token + * delimited by quotes there must be a semicolon, which therefore + * should not be considered a delimiter + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + * + * @param g the file input + * @param pv the separation character, usually; + * @param v2 the delimitation character, usually " + * @param din the progress bar with its neighboring labels + * @return the resulting string array + * @throws ExactException standard exception + * @throws IOException standard exception + * @throws FileNotFoundException standard exception */ + public static List> tokens_C(final String g, + final String pv, final String v2, Dynamics din) + + throws ExactException, FileNotFoundException, IOException { + + if (g == null || g.length() == 0) { + throw new ExactException("The given path is null or empty.", + 101504, "Strings", "tokens_C"); + } + List s = ReadMyFile.zebra_B(g); + List> tE = new ArrayList>(); + /* cycle on each row */ + String[] q = null; + List tokenE = null; + din.head.setText("0"); + din.head.paintImmediately(din.access.sinistra); + din.pb.setMinimum(0); + din.pb.setMaximum(s.size()); + for (int i = 0; i < s.size(); i++) { + din.head.setText(String.valueOf(i)); + din.head.paintImmediately(din.access.sinistra); + din.pb.setValue(i + 1); + din.pb.paintImmediately(din.access.bar); + q = tokens_B(s.get(i), pv, v2); + tokenE = new ArrayList(); + for (String f : q) { + tokenE.add(f); + } + tE.add(tokenE); + } + return tE; + } + + /** + *

+ * Clear all tags and spaces; therefore all words are sewn together. + *

+ * + * @param s my text + * @return the normalized string */ + public static String normalizzaTestoTaggato(final String s) { + if (s == null) { + return null; + } + String t = s.replaceAll("<\\p{ASCII}+?>", ""); + t = t.replaceAll("\\p{Space}+", ""); + return t; + } + + /** + *

+ * Searches for the first occurrence of a substring in a string and + * replaces it with something else. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param s the starting string + * @param target the substring to search for + * @param replace the string to replace + * @return the resulting string */ + public static String replaceFirst(final String s, + final String target, final String replace) { + if (s == null) { + return null; + } + int i = s.indexOf(target); + if (i == -1) { + return s; + } else { + return s.substring(0, i) + replace + s.substring(i + target + .length()); + } + } +} diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/salad/everyday/Universal.java b/screwdriver-3.5.6/src/main/java/it/ramecera/salad/everyday/Universal.java new file mode 100644 index 0000000..2ff75d0 --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/salad/everyday/Universal.java @@ -0,0 +1,181 @@ +// +// https://www.ramecera.it/myscrewdriver.html +// e-mail: screwdriver@ramecera.it +// +/* This program and the accompanying materials are made available under + * the terms of the Eclipse Public License v1.0 which accompanies this + * distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html */ +package it.ramecera.salad.everyday; + +/** + *

+ * List of ISO 3166-1 standard country codes. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ * + * @author M. Maglioni */ +public class Universal { + + /** list */ + public final static String[] charsetE = { "UTF-8", "ISO-8859-1", + "UTF-16" }; + /** list */ + public final static String[] countryCodeE = { "ax", "af", "al", + "dz", "as", "ad", "ao", "ai", "aq", "ag", "ar", "am", "aw", + "au", "at", "az", "bs", "bh", "bd", "bb", "by", "be", "bz", + "bj", "bm", "bt", "bo", "ba", "bw", "bv", "br", "io", "bn", + "bg", "bf", "bi", "kh", "cm", "ca", "cv", "ky", "cf", "td", + "cl", "cn", "cx", "cc", "co", "km", "cd", "cg", "ck", "cr", + "ci", "hr", "cu", "cy", "cz", "dk", "dj", "dm", "do", "ec", + "eg", "sv", "gq", "er", "ee", "et", "fk", "fo", "fj", "fi", + "fr", "gf", "pf", "tf", "ga", "gm", "ge", "de", "gh", "gi", + "gr", "gl", "gd", "gp", "gu", "gt", "gn", "gw", "gy", "ht", + "hm", "hn", "hk", "hu", "is", "in", "id", "ir", "iq", "ie", + "il", "it", "jm", "jp", "jo", "kz", "ke", "ki", "kp", "kr", + "kw", "kg", "la", "lv", "lb", "ls", "lr", "ly", "li", "lt", + "lu", "mo", "mk", "mg", "mw", "my", "mv", "ml", "mt", "mh", + "mq", "mr", "mu", "yt", "mx", "fm", "md", "mc", "mn", "ms", + "ma", "mz", "mm", "na", "nr", "np", "nl", "an", "nc", "nz", + "ni", "ne", "ng", "nu", "nf", "mp", "no", "om", "pk", "pw", + "ps", "pa", "pg", "py", "pe", "ph", "pn", "pl", "pt", "pr", + "qa", "re", "ro", "ru", "rw", "sh", "kn", "lc", "pm", "vc", + "ws", "sm", "st", "sa", "sn", "cs", "sc", "sl", "sg", "sk", + "si", "sb", "so", "za", "gs", "es", "lk", "sd", "sr", "sj", + "sz", "se", "ch", "sy", "tw", "tj", "tz", "th", "tl", "tg", + "tk", "to", "tt", "tn", "tr", "tm", "tc", "tv", "ug", "ua", + "ae", "gb", "us", "um", "uy", "uz", "vu", "va", "ve", "vn", + "vg", "vi", "wf", "eh", "ye", "zm", "zw" }; + /** list */ + public final static String[][] languageE = { { "Abkhazian", "AB" }, + { "Afar", "AA" }, { "Afrikaans", "AF" }, { "Albanian", + "SQ" }, { "Amharic", "AM" }, { "Arabic", "AR" }, { + "Armenian", "HY" }, { "Assamese", "AS" }, { + "Aymara", "AY" }, { "Azerbaijani", + "AZ" }, { "Bashkir", "BA" }, + { "Basque", "EU" }, { "Bengali,Bangla", "BN" }, { "Bhutani", + "DZ,Bangla" }, { "Bihari", "BH" }, { "Bislama", + "BI" }, { "Breton", "BR" }, { "Bulgarian", + "BG" }, { "Burmese", "MY" }, { + "Byelorussian", "BE" }, { + "Cambodian", "KM" }, + { "Catalan", "CA" }, { "Chinese", "ZH" }, { "Corsican", + "CO" }, { "Croatian", "HR,American" }, { "Czech", + "CS" }, { "Danish", "DA" }, { "Dutch", + "NL" }, { "English,American", + "EN" }, { "Esperanto", + "EO" }, { + "Estonian", + "ET" }, { + "Faeroese", + "FO" }, + { "Fiji", "FJ" }, { "Finnish", "FI" }, { "French", "FR" }, { + "Frisian", "FY" }, { "Gaelic (ScotsGaelic)", "GD" }, + { "Galician", "GL" }, { "Georgian", "KA" }, { "German", + "DE" }, { "Greek", "EL" }, { "Greenlandic", "KL" }, + { "Guarani", "GN" }, { "Gujarati", "GU" }, { "Hausa", + "HA" }, { "Hebrew", "IW" }, { "Hindi", "HI" }, { + "Hungarian", "HU" }, { "Icelandic", "IS" }, + { "Indonesian", "IN" }, { "Interlingua", "IA" }, { + "Interlingue", "IE" }, { "Inupiak", "IK" }, { + "Irish", "GA" }, { "Italian", "IT" }, { + "Japanese", "JA" }, { "Javanese", + "JW" }, { "Kannada", "KN" }, + { "Kashmiri", "KS" }, { "Kazakh", "KK" }, { "Kinyarwanda", + "RW" }, { "Kirghiz", "KY" }, { "Kirundi", "RN" }, { + "Korean", "KO" }, { "Kurdish", "KU" }, { + "Laothian", "LO" }, { "Latin", + "LA" }, { "Latvian,Lettish", + "LV" }, { "Lingala", + "LN,Lettish" }, + { "Lithuanian", "LT" }, { "Macedonian", "MK" }, { + "Malagasy", "MG" }, { "Malay", "MS" }, { + "Malayalam", "ML" }, { "Maltese", "MT" }, { + "Maori", "MI" }, { "Marathi", + "MR" }, { "Moldavian", + "MO" }, { + "Mongolian", + "MN" }, { + "Nauru", + "NA" }, + { "Nepali", "NE" }, { "Norwegian", "NO" }, { "Occitan", + "OC" }, { "Oriya", "OR" }, { "Oromo,Afan", + "OM,Afan" }, { "Pashto,Pushto", "PS" }, { + "Persian", "FA" }, { "Polish", + "PL" }, { "Portuguese", + "PT,Pushto" }, { + "Punjabi", + "PA" }, { + "Quechua", + "QU" }, + { "Rhaeto-Romance", "RM-Romance" }, { "Romanian", "RO" }, { + "Russian", "RU" }, { "Samoan", "SM" }, { "Sangro", + "SG" }, { "Sanskrit", "SA" }, { "Serbian", + "SR" }, { "Serbo-Croatian", "SH" }, + { "Sesotho", "ST-Croatian" }, { "Setswana", "TN" }, { + "Shona", "SN" }, { "Sindhi", "SD" }, { "Singhalese", + "SI" }, { "Siswati", "SS" }, { "Slovak", + "SK" }, { "Slovenian", "SL" }, { + "Somali", "SO" }, { + "Spanish", "ES" }, { + "Sudanese", + "SU" }, { + "Swahili", + "SW" }, + { "Swedish", "SV" }, { "Tagalog", "TL" }, { "Tajik", "TG" }, + { "Tamil", "TA" }, { "Tatar", "TT" }, { "Tegulu", "TE" }, { + "Thai", "TH" }, { "Tibetan", "BO" }, { "Tigrinya", + "TI" }, { "Tonga", "TO" }, { "Tsonga", + "TS" }, { "Turkish", "TR" }, { + "Turkmen", "TK" }, { "Twi", + "TW" }, { + "Ukrainian", + "UK" }, { + "Urdu", + "UR" }, + { "Uzbek", "UZ" }, { "Vietnamese", "VI" }, { "Volapuk", + "VO" }, { "Welsh", "CY" }, { "Wolof", "WO" }, { + "Xhosa", "XH" }, { "Yiddish", "JI" }, { + "Yoruba", "YO" }, { "Zulu", + "ZU" } }; + + /** list of valid colors for CSS */ + public final static String[] cssColorE = { "Black", "Navy", + "DarkBlue", "MediumBlue", "Blue", "DarkGreen", "Green", + "Teal", "DarkCyan", "DeepSkyBlue", "DarkTurquoise", + "MediumSpringGreen", "Lime", "SpringGreen", "Aqua", "Cyan", + "MidnightBlue", "DodgerBlue", "LightSeaGreen", + "ForestGreen", "SeaGreen", "DarkSlateGray", "LimeGreen", + "MediumSeaGreen", "Turquoise", "RoyalBlue", "SteelBlue", + "DarkSlateBlue", "MediumTurquoise", "Indigo", + "DarkOliveGreen", "CadetBlue", "CornflowerBlue", + "RebeccaPurple", "MediumAquaMarine", "DimGray", "SlateBlue", + "OliveDrab", "SlateGray", "LightSlateGray", + "MediumSlateBlue", "LawnGreen", "Chartreuse", "Aquamarine", + "Maroon", "Purple", "Olive", "Gray", "SkyBlue", + "LightSkyBlue", "BlueViolet", "DarkRed", "DarkMagenta", + "SaddleBrown", "DarkSeaGreen", "LightGreen", "MediumPurple", + "DarkViolet", "PaleGreen", "DarkOrchid", "YellowGreen", + "Sienna", "Brown", "DarkGray", "LightBlue", "GreenYellow", + "PaleTurquoise", "LightSteelBlue", "PowderBlue", + "FireBrick", "DarkGoldenRod", "MediumOrchid", "RosyBrown", + "DarkKhaki", "Silver", "MediumVioletRed", "IndianRed", + "Peru", "Chocolate", "Tan", "LightGray", "Thistle", + "Orchid", "GoldenRod", "PaleVioletRed", "Crimson", + "Gainsboro", "Plum", "BurlyWood", "LightCyan", "Lavender", + "DarkSalmon", "Violet", "PaleGoldenRod", "LightCoral", + "Khaki", "AliceBlue", "HoneyDew", "Azure", "SandyBrown", + "Wheat", "Beige", "WhiteSmoke", "MintCream", "GhostWhite", + "Salmon", "AntiqueWhite", "Linen", "LightGoldenRodYellow", + "OldLace", "Red", "Fuchsia", "Magenta", "DeepPink", + "OrangeRed", "Tomato", "HotPink", "Coral", "DarkOrange", + "LightSalmon", "Orange", "LightPink", "Pink", "Gold", + "PeachPuff", "NavajoWhite", "Moccasin", "Bisque", + "MistyRose", "BlanchedAlmond", "PapayaWhip", + "LavenderBlush", "SeaShell", "Cornsilk", "LemonChiffon", + "FloralWhite", "Snow", "Permission", "LightYellow", "Ivory", + "White" }; +} diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/salad/file/Abacus.java b/screwdriver-3.5.6/src/main/java/it/ramecera/salad/file/Abacus.java new file mode 100644 index 0000000..e9bc552 --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/salad/file/Abacus.java @@ -0,0 +1,842 @@ +// +// https://www.ramecera.it/myscrewdriver.html +// e-mail: screwdriver@ramecera.it +// +/* This program and the accompanying materials are made available under + * the terms of the Eclipse Public License v1.0 which accompanies this + * distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html */ + +package it.ramecera.salad.file; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.nio.file.DirectoryStream; +import java.nio.file.Files; +import java.nio.file.LinkOption; +import java.nio.file.Path; +import java.nio.file.StandardCopyOption; +import java.util.Calendar; +import java.util.StringTokenizer; +import java.util.TimeZone; +import java.util.regex.PatternSyntaxException; +import java.util.zip.ZipEntry; +import java.util.zip.ZipInputStream; + +import it.ramecera.salad.everyday.ExactException; +import it.ramecera.salad.everyday.Mix; + +/** + *

+ * Class for various operations on files. + *

+ *

+ * Company: Rameceraâ„¢
+ * Creation date: 2020-04-09
+ * Last updated: 2020-09-15
+ *

+ *

+ * Changes:
+ * 2020-04-09: inserted method: public static void estraiFiltroZip + * (final String fileZipOut, File destDir, final String filter) + *
+ *

+ * + * @author M. Maglioni * */ +public class Abacus { + + private static final String sep = System.getProperty( + "file.separator"); + + /** + *

+ * Deletion of files from a directory and all its subdirectories, at + * all depths. Eventually the path remains but is empty. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-06-03 + *

+ *

+ * Changes:
+ * + * @param y the path to be demolished + * @throws ExactException error in the parameters provided */ + public static void destroyDirectory(final String y) + + throws ExactException { + + if (y == null) { + throw new ExactException( + "The directory name for method \"eraseFiles\" is null.", + 101000, "Abacus", ""); + } + Folder folder = new Folder(); + File[] elencoE = folder.fileObjects(".+", y); + if (elencoE == null) { + throw new ExactException("The directory " + Mix.dress_A(y) + + " does not exist.", 101004, "Abacus", ""); + } + for (File x : elencoE) { + try { + if (x.isFile()) { + x.delete(); + } else if (x.isDirectory()) { + destroyDirectory(x.getCanonicalPath()); + x.delete(); + } + } catch (IOException e) { + throw new ExactException("Errore di I/O", 101001, + "Abacus", ""); + } + } + } + + /** + *

+ * Deleting the files of a directory, filtered according to a + * pattern. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ * + * @return quantity of deleted files + * @param pattern the pattern to filter the files, according to the + * codes of the class java.util.regex.Pattern. + * @param y the path where to look for the files + * @throws ExactException error code in the provided parameters */ + public static int eraseFiles(final String pattern, final String y) + + throws ExactException { + + if (pattern == null) { + throw new ExactException( + "The pattern for method \"eraseFiles\" is null.", + 101002, "Abacus", ""); + } + if (y == null) { + throw new ExactException( + "The directory name for method \"eraseFiles\" is null.", + 101003, "Abacus", ""); + } + // if necessary, I put a slash in the queue + String y1 = Mix.dress_D(y); + File f = new File(y1); + int i = 0; + try { + String[] g = f.list(Mix.fileFilter(pattern)); + for (i = 0; i < g.length; i++) { + File h = new File(y1 + g[i]); + h.delete(); + } + } catch (PatternSyntaxException pse) { + return 0; + } + return i; + } + + /** + *

+ * Find the most recent file among those present in a directory, + * filtered according to a pattern. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ * 21/01 / 09: eliminated the milliseconds from the final result. + *
+ *

+ * + * @return the most recent modification date, expressed as long + * number + * @param x the pattern to filter the files, according to the codes + * of the java.util class. regex.Pattern. + * @param y the directory to search for files + * @since SVutensiliJ4_1.2.2, class 1.1.0 */ + public static long ilPiuGiovaneFile_A(final String x, + final String y) { + + // if necessary, I put a slash in the queue + String y1 = Mix.dress_CU(y); + File f = new File(y1); + String[] g = f.list(Mix.fileFilter(x)); + int i; + long dateW = 0; + String nomeFileW = null; + for (i = 0; i < g.length; i++) { + File h = new File(y1 + g[i]); + if (h.lastModified() > dateW) { + dateW = h.lastModified(); + nomeFileW = h.getName(); + } + } + nomeFileW = nomeFileW + ""; // just to avoid the hassle of the + // warning + return dateW / 1000 * 1000; + } + + /** + *

+ * Find the most recent file among those present in a directory, + * filtered according to a pattern. It is returned not the name of + * the file, but its modification date, expressed as a Calendar + * object. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ * 21/01 / 09: milliseconds removed from the final result.
+ *

+ * + * @return the most recent modification date, expressed as a + * Calendar object; returns the date 2020-04-09 if the + * directory is empty + * @param x the pattern to filter the files, according to the codes + * of the class java.util.regex.Pattern. + * @param y the directory to search for files + * @since SVutensiliJ4_1.2.2, class 1.1.0 */ + public static Calendar ilPiuGiovaneFile_B(final String x, + final String y) { + + // if necessary, I put a slash in the queue + TimeZone tz = TimeZone.getTimeZone("Europe/Paris"); + Calendar calendarW = Calendar.getInstance(tz); + String y1 = Mix.dress_CU(y); + File f = new File(y1); + String[] g = f.list(Mix.fileFilter(x)); + if (g.length == 0) { + calendarW.set(Calendar.YEAR, 1900); + calendarW.set(Calendar.MONTH, 0); + calendarW.set(Calendar.DAY_OF_MONTH, 1); + return calendarW; + } + int i; + Calendar lastModified = Calendar.getInstance(tz); + calendarW.setTimeInMillis(0); + String nomeFileW = null; + for (i = 0; i < g.length; i++) { + File h = new File(y1 + g[i]); + lastModified.setTimeInMillis(h.lastModified()); + if (lastModified.after(calendarW)) { + calendarW = (Calendar) lastModified.clone(); + nomeFileW = h.getName(); + } + } + nomeFileW = nomeFileW + ""; // just to avoid the hassle of the + // warning + calendarW.set(Calendar.MILLISECOND, 0); + return calendarW; + } + + /** + *

+ * Count of files in a directory, filtered according to a pattern. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ * + * @return quantity of files found + * @param x the pattern to filter the files, according to the codes + * of the class java.util.regex.Pattern. + * @param y path where to search for files + * @see "prog. bigExport_2.0.0, class ExportSchema_1" */ + public static int contaFile(final String x, final String y) { + + // if necessary, I put a slash in the queue + File f = new File(y); + if (!f.exists() || !f.isDirectory()) + return -1; + String[] g = f.list(Mix.fileFilter(x)); + return g.length; + } + + /** + *

+ * Physical copy of one file to another, declaring a maximum length. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ * 20/05 08: sets the condition that the file does not already exist + * identically
+ * 2020-04-09: elimination of the preventive cancellation because it + * is useless
+ * 2020-04-09: reintroduced the delete estimate
+ *

+ * + * @param in file in unput + * @param out file in output + * @param max maximum file length + * @throws Exception ordinary exception */ + public static void copyFile(File in, File out, final int max) + + throws Exception { + + /* this is an economy: do nothing if the output already exists + * and is identical */ + if (out.exists() && !out.isDirectory() && in + .lastModified() == out.lastModified() && in + .length() == out.length()) + return; + + if (out.exists() && !out.isDirectory()) + out.delete(); + FileInputStream fis = new FileInputStream(in); + FileOutputStream fos = new FileOutputStream(out); + byte[] buf = new byte[max]; + int i = 0; + while ((i = fis.read(buf)) != -1) { + fos.write(buf, 0, i); + } + fis.close(); + fos.close(); + } + + /** + *

+ * Physical copy of one file on another; overload of the previous + * one. It differs from the previous one because there is no need to + * declare the maximum length. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ * 2013-08- 07: added the instruction setting the last modification + * date of the output file + *

+ * + * @param in file in unput + * @param out file in output + * @throws IOException standard exception */ + public static void copyFile(File in, File out) + + throws IOException { + + /* this is an economy: do nothing if the output already exists + * and is identical */ + if (out.exists() && !out.isDirectory() && in + .lastModified() == out.lastModified() && in + .length() == out.length()) + return; + + if (out.exists() && !out.isDirectory()) + out.delete(); + FileInputStream fis = new FileInputStream(in); + FileOutputStream fos = new FileOutputStream(out); + byte[] buf = new byte[(int) in.length()]; + int i = 0; + while ((i = fis.read(buf)) != -1) { + fos.write(buf, 0, i); + } + fis.close(); + fos.close(); + out.setLastModified(in.lastModified()); + } + + /** + *

+ * Physical copy of two files, queued, on another; an LF is placed + * between the two. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param i0 file in unput + * @param i1 file in unput + * @param o file in output + * @throws Exception ordinary exception */ + public static void mergeFile(String i0, String i1, String o) + + throws Exception { + + File in0 = new File(i0); + File in1 = new File(i1); + File out = new File(o); + if (out.exists() && !out.isDirectory()) + out.delete(); + FileInputStream fis0 = new FileInputStream(in0); + FileInputStream fis1 = new FileInputStream(in1); + FileOutputStream fos = new FileOutputStream(out); + byte[] buf = new byte[(int) in0.length()]; + int i = 0; + while ((i = fis0.read(buf)) != -1) { + fos.write(buf, 0, i); + } + fis0.close(); + fos.write(10); // line feed character + buf = new byte[(int) in1.length()]; + i = 0; + while ((i = fis1.read(buf)) != -1) { + fos.write(buf, 0, i); + } + fis1.close(); + fos.close(); + } + + /** + *

+ * Create a directory, if it doesn't already exist, after making + * sure it isn't a file.
+ * It can only create one directory at a time.
+ * Example: I have to create directory b in path C:/a;
+ * I must put the string: "C:/a/b" as the argument of the method, + * and I must first verify that C:/a exists.
+ *

+ *

+ * Creation date: 2020-09-03
+ * Last updated: 2020-09-03 + *

+ *

+ * Modifications:
+ *

+ * + * @param path to the directory to be built, complete with path */ + public static void buildDirectory(final String path) { + + File cradle = new File(path); + if (cradle.isFile()) + cradle.delete(); + if (!cradle.exists()) + cradle.mkdir(); + } + + /** + *

+ * Overload of the preceding method. + *

+ *

+ * Creation date: 2020-09-03
+ * Last updated: 2020-09-03 + *

+ *

+ * Modifications:
+ *

+ * + * @param cradle directory to be created */ + public static void buildDirectory(File cradle) { + + if (cradle.isFile()) + cradle.delete(); + if (!cradle.exists()) + cradle.mkdir(); + } + + /** + *

+ * Create a complete path, that is, make a succession of directories + * creations. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09
+ * Author: M. Maglioni + *

+ *

+ * Changes :
+ *

+ * + * @param path the directory to be built, complete with path */ + public static void costruisciDirectoryCompleta(final String path) { + StringTokenizer tokens = new StringTokenizer(path, System + .getProperty("file.separator")); + String[] segmenti = new String[tokens.countTokens()]; + int segmentiQ = 0; + while (tokens.hasMoreTokens()) { + segmenti[segmentiQ] = tokens.nextToken(); + segmentiQ++; + } + String percorso = segmenti[0]; + int i = 1; + while (i < segmenti.length) { + percorso += System.getProperty("file.separator") + + segmenti[i]; + buildDirectory(percorso); + i++; + } + } + + /** + *

+ * Create a complete path, that is, make a succession of directories + * creations. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09
+ * Author: M. Maglioni + *

+ *

+ * Changes :
+ *

+ * + * @param path the directory to be built, complete with path + * @param separator the separator (slash or backslash) inside the + * name of a path */ + public static void buildDirectoryCompletely(final String path, + final String separator) { + if (path.length() == 0) { + return; + } + StringTokenizer tokens = new StringTokenizer(path, separator); + String[] segmentE = new String[tokens.countTokens()]; + int segmentsQ = 0; + while (tokens.hasMoreTokens()) { + segmentE[segmentsQ] = tokens.nextToken(); + segmentsQ++; + } + String percorso = segmentE[0]; + int i = 1; + while (i < segmentE.length) { + percorso += System.getProperty("file.separator") + + segmentE[i]; + buildDirectory(percorso); + i++; + } + } + + /** + *

+ * Removing the extension from a file name. Deprecated on 2020-04-09 + * because it is not exact: if the file has no extension, and is + * preceded by a directory name containing a dot, it gives an + * incorrect result. The correct method to use is + * Mix.estraiExtension. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @return the name of the file without extension (nor dot, of + * course) + * @param s the name of the complete file */ + @Deprecated + public static String senzaExtension(final String s) { + int i = s.lastIndexOf("."); + if (i == -1) + return s; + else + return s.substring(0, i); + } + + /** + *

+ * Creation date: 2020-05-19
+ * Last updated: 2020-05-19
+ * Class: Abacus + * + * @author M. Maglioni + *

+ * Description: + *

+ * @param fileZipInput name of the input file + * @param destDir output directory + * @throws FileNotFoundException obvious + * @throws IOException obvious */ + public static void extractAllFromZip(final String fileZipInput, + File destDir) + + throws FileNotFoundException, IOException { + + byte[] buffer = new byte[1024]; + ZipInputStream zis = new ZipInputStream(new FileInputStream( + fileZipInput)); + ZipEntry zipEntry = zis.getNextEntry(); + while (zipEntry != null) { + File newFile = newFile(destDir, zipEntry); + String s = destDir.getAbsolutePath().replaceAll("\\x5c", + "/") + "/" + zipEntry.getName(); + if (zipEntry.getName().endsWith("/")) { + Abacus.buildDirectoryCompletely(s, "/"); + } else { + String t[] = Mix.analizzaPath(s); + Abacus.buildDirectoryCompletely(t[0], "/"); + FileOutputStream fos = new FileOutputStream(newFile); + int len; + while ((len = zis.read(buffer)) > 0) { + fos.write(buffer, 0, len); + } + fos.close(); + } + zipEntry = zis.getNextEntry(); + } + zis.closeEntry(); + zis.close(); + } + + /** + *

+ * Creation date: 2020-05-19
+ * Last updated: 2020-09-14
+ * Class: Abacus + * + * @author M. Maglioni + *

+ * Description: extraction of files from a zip archive, + * filtered by a "startWith" and by an "except" + *

+ *

+ * History:
+ * The description of N# is in project plan report.
+ * 2020-09-14 implementation of N16
+ *

+ * @param fileZipInput name of the input file + * @param destDir output directory + * @param filter obvious + * @param except I don't have to copy the "dummy.txt" files, because + * they were added to the jar only to allow the creation of + * some empty directories. + * @throws FileNotFoundException obvious + * @throws IOException obvious */ + public static void extractFromZipFilter(final String fileZipInput, + File destDir, final String filter, final String except) + + throws FileNotFoundException, IOException { + + byte[] buffer = new byte[1024]; + ZipInputStream zis = new ZipInputStream(new FileInputStream( + fileZipInput)); + ZipEntry zipEntry = zis.getNextEntry(); + while (zipEntry != null) { + if (zipEntry.toString().startsWith(filter)) { + File newFile = newFile(destDir, zipEntry); + String s = destDir.getAbsolutePath().replaceAll("\\x5c", + "/") + "/" + zipEntry.getName(); + if (zipEntry.getName().endsWith("/")) { + Abacus.buildDirectoryCompletely(s, "/"); + } else { + String t[] = Mix.analizzaPath(s); + Abacus.buildDirectoryCompletely(t[0], "/"); + if (!newFile.getName().equals(except) | except + .equals("")) { + FileOutputStream fos = new FileOutputStream( + newFile); + int len; + while ((len = zis.read(buffer)) > 0) { + fos.write(buffer, 0, len); + } + fos.close(); + } + } + } + zipEntry = zis.getNextEntry(); + } + zis.closeEntry(); + zis.close(); + } + + private static File newFile(File destinationDir, ZipEntry zipEntry) + + throws IOException { + + File destFile = new File(destinationDir, zipEntry.getName()); + + String destDirPath = destinationDir.getCanonicalPath(); + String destFilePath = destFile.getCanonicalPath(); + if (!destFilePath.startsWith(destDirPath + File.separator)) { + throw new IOException("Entry is outside of the target dir: " + + zipEntry.getName()); + } + return destFile; + } + + /** + *

+ * Creation date: 2020-09-15
+ * Class: Abacus + *

+ *

+ * Description: delete a directory, with all its content. + *

+ * + * @param path object to delete + * @throws IOException ordinary exception */ + final public static void deleteDirectoryRecursion(Path path) + + throws IOException { + + LinkOption[] nfl = new LinkOption[] { + LinkOption.NOFOLLOW_LINKS }; + deleteDirectoryRecursion(path, nfl); + } + + /** + *

+ * Creation date: 2020-09-15
+ * Class: Abacus + *

+ *

+ * Description: delete a directory, with all its content. + *

+ * + * @param path object to delete + * @param nfl link options + * @throws IOException ordinary exception */ + final public static void deleteDirectoryRecursion(Path path, + LinkOption[] nfl) + + throws IOException { + + if (!Files.exists(path, nfl)) { + return; + } + if (Files.isDirectory(path, LinkOption.NOFOLLOW_LINKS)) { + try (DirectoryStream entries = Files + .newDirectoryStream(path)) { + for (Path entry : entries) { + deleteDirectoryRecursion(entry, nfl); + } + } + } + Files.delete(path); + } + + /** + *

+ * Creation date: 2020-09-08
+ * Last updated: 2020-09-15
+ * Class: Abacus + *

+ *

+ * Description: copy all content of a directory. + *

+ * + * @param inPath input object + * @param outPath output object + * @param replace replace-existing optio + * @throws IOException ordinary exception */ + final public static void copyDirectoryRecursion(Path inPath, + Path outPath, final boolean replace) + + throws IOException { + + LinkOption[] nfl = new LinkOption[] { + LinkOption.NOFOLLOW_LINKS }; + copyDirectoryRecursion(inPath, outPath, replace, nfl); + } + + /** + *

+ * Creation date: 2020-09-08
+ * Last updated: 2020-09-15
+ * Class: Abacus + *

+ *

+ * Description: copy all content of a directory. + *

+ * + * @param inPath input object + * @param outPath output object + * @param replace replace-existing option + * @param nfl link options + * @throws IOException ordinary exception */ + final public static void copyDirectoryRecursion(Path inPath, + Path outPath, final boolean replace, LinkOption[] nfl) + + throws IOException { + + if (Files.exists(outPath, nfl) && !Files.isDirectory(outPath, + nfl)) { + throw new IOException("The output object " + Mix.dress_A( + outPath.toString()) + " is not a directory"); + } else if (!Files.exists(outPath, nfl)) { + Files.createDirectory(outPath); + } + try (DirectoryStream entries = Files.newDirectoryStream( + inPath)) { + for (Path entry : entries) { + Path n = new File(outPath.toFile().getAbsolutePath() + + sep + entry.getFileName()).toPath(); + if (Files.isDirectory(entry, + LinkOption.NOFOLLOW_LINKS)) { + if (!Files.exists(n)) { + Files.createDirectory(n); + } + copyDirectoryRecursion(entry, n, replace, nfl); + } else if (replace) { + Files.copy(entry, n, + StandardCopyOption.COPY_ATTRIBUTES, + StandardCopyOption.REPLACE_EXISTING); + } else { + Files.copy(entry, n, + StandardCopyOption.COPY_ATTRIBUTES); + } + } + } + } + + /** + *

+ * Creation date: 2020-09-08
+ * Last updated: 2020-09-15
+ * Class: Abacus + *

+ *

+ * Description: delete a directory, with all its content; + * overloading of the preceding one. + *

+ * + * @param file object to delete + * @throws IOException ordinary exception */ + final public static void deleteDirectoryRecursion(File file) + + throws IOException { + + deleteDirectoryRecursion(file.toPath()); + } + + /** + *

+ * Creation date: 2020-09-08
+ * Last updated: 2020-09-15
+ * Class: Abacus + *

+ *

+ * Description: copy a directory, with all its content; overloading + * of the preceding one. + *

+ * + * @param inputFile input object + * @param outputFile output object + * @param replace replace-existing option + * @throws IOException standard exception */ + final public static void copyDirectoryRecursion(File inputFile, + File outputFile, final boolean replace) + + throws IOException { + + copyDirectoryRecursion(inputFile.toPath(), outputFile.toPath(), + replace); + } +} \ No newline at end of file diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/salad/file/Equipment.java b/screwdriver-3.5.6/src/main/java/it/ramecera/salad/file/Equipment.java new file mode 100644 index 0000000..7827ba9 --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/salad/file/Equipment.java @@ -0,0 +1,1015 @@ +// +// https://www.ramecera.it/myscrewdriver.html +// e-mail: screwdriver@ramecera.it +// +/* This program and the accompanying materials are made available under + * the terms of the Eclipse Public License v1.0 which accompanies this + * distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html */ +package it.ramecera.salad.file; + +import java.io.BufferedInputStream; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.FileWriter; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.io.UnsupportedEncodingException; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; + +import org.apache.log4j.Logger; + +import it.ramecera.salad.everyday.Candies; +import it.ramecera.salad.everyday.ExactException; +import it.ramecera.salad.everyday.Mix; +import it.ramecera.salad.graphic.Placard; + +/** + *

+ * Class for reading files. The class should not be instantiated. + *

+ *

+ * Company: Rameceraâ„¢
+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ * 2020-04-09: various methods added 2020-04-09: modification of + * unicaStringaUnicode_B and creation of entities_A
+ *

+ * + * @author M. Maglioni */ + +public class Equipment { + + /** char Line Feed */ + public final static char LF = 10; // the line feed character + /** Line Feed font */ + public final static String LFS = Character.valueOf(LF).toString(); + + /** + *

+ * Reading a sequential file to deposit it on a single string. The + * file is fully deposited, for example the CR and/or LF are + * inserted exactly like all the other characters. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param file input file + * @return string with the entire contents of the + * @throws FileNotFoundException is triggered when the file does not + * exist + * @throws IOException is triggered when it cannot be read, for any + * other reason. */ + public static String oneString(File file) + + throws IOException, FileNotFoundException { + + String s; + int j, k; + BufferedInputStream bis = null; + try { + FileInputStream fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + j = (int) file.length(); + char[] c = new char[j]; + for (k = 0; k < j; k++) + c[k] = (char) bis.read(); + bis.close(); + s = new String(c); + } catch (FileNotFoundException e) { + throw e; + } catch (IOException e) { + bis.close(); + throw e; + } + return s; + } + + /** + *

+ * Overload of the previous method. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param g file name, including all path + * @return the all-inclusive string of all text + * @throws IOException ordinary exception + * @throws FileNotFoundException ordinary exception + * @since 1.0.0 - SVutensiliJ4_1.3.0 */ + public static String oneString(final String g) + + throws IOException, FileNotFoundException { + + return oneString(new File(g)); + } + + /** + *

+ * Overload of the previous method. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param is the InputStream object to read + * @return the all-inclusive string of all text + * @throws IOException ordinary exception + * @throws FileNotFoundException ordinary exception + * @since 3 */ + public static String unicaStringa(InputStream is) + + throws IOException, FileNotFoundException { + + String s; + int j, k; + BufferedInputStream bis = null; + try { + bis = new BufferedInputStream(is); + j = is.available(); + char[] c = new char[j]; + for (k = 0; k < j; k++) + c[k] = (char) bis.read(); + bis.close(); + s = new String(c); + } catch (FileNotFoundException e) { + throw e; + } catch (IOException e) { + bis.close(); + throw e; + } + return s; + } + + /** + *

+ * Reading of a sequential file to deposit it on a single string, + * with transformation in UTF. The file is fully deposited, for + * example the CR and/or LF are inserted exactly like all the other + * characters. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param file input file + * @param code code to be adopted + * @return string with the entire contents of the file + * @throws ExactException standard exception */ + public static String oneStringUnicode_A(File file, + final String code) + + throws ExactException { + + String s; + InputStreamReader isr = null; + if (file.length() > Integer.MAX_VALUE) { + throw new ExactException( + "The file length is greater than 2 GB," + + " it is not allowed.", 1108, "Equipment", + "oneStringUnicode_A"); + } else if (file.length() == 0) { + return ""; + } + try { + FileInputStream fis = new FileInputStream(file); + isr = new InputStreamReader(fis, code); + int j = (int) file.length(); + char[] c = new char[j]; + isr.read(c); + isr.close(); + int i; + for (i = j - 1; c[i] == 0; i--) + ; + s = (new String(c)).substring(0, i + 1); + } catch (UnsupportedEncodingException uee) { + throw new ExactException(uee.getMessage(), 100908, + "Equipment", "oneStringUnicode_A"); + } catch (FileNotFoundException fnfe) { + throw new ExactException("The file " + file.getPath() + + " was not found.", 100909, "Equipment", + "oneStringUnicode_A"); + } catch (IOException ioe) { + throw new ExactException(ioe.getMessage(), 100910, + "Equipment", "oneStringUnicode_A"); + } finally { + try { + isr.close(); + } catch (IOException e) { + // do nothing + } + } + return s; + } + + /** + *

+ * Reading of a sequential file to deposit it on a single string, + * with transformation in UTF. Overload of the previous one. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09
+ *

+ *

+ * Changes:
+ *

+ * + * @param f input file + * @param code code to be adopted + * @return string with the entire contents of the file + * @throws ExactException standard exception */ + public static String oneStringUnicode_A(final String f, + final String code) + + throws ExactException { + + return oneStringUnicode_A(new File(f), code); + } + + /** + *

+ * Reading of a sequential file to deposit it on a single string, + * with transformation into UTF and use of XML-character + * &#xffff;.
+ * By ffff we mean 4 hexadecimal characters, example : + * e445, 00fe, ff4a, etc. which correspond to 16 bits.
+ * The code is regulated by the production [66] of the W3C.
+ * The file is fully deposited, for example the CR and / or LF are + * inserted exactly like all the other characters. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Modifications:
+ * 29/12 08: extraction of part of the argorithm in the new + * entities_A method.
+ * 2020-04-09: replacement of the entities_A method with entities_B, + * to avoid saturation of the heap
+ *

+ * + * @param file input file + * @param code code to be adopted + * @return string with l the entire contents of the + * @throws FileNotFoundException is triggered when the file does not + * exist + * @throws IOException is triggered when it is not possible to read, + * for any other reason. + * @throws UnsupportedEncodingException UTF codes do not exist in + * that combination + * @since 2.0.0 - SVutensiliJ4_1.3.0 */ + public static String unicaStringaUnicode_B(File file, + final String code) + + throws UnsupportedEncodingException, IOException { + + String t = null; + InputStreamReader isr = null; + if (file.length() > Integer.MAX_VALUE / 2) + throw new IOException( + "The file length is greater than 1 GB, it is not allowed."); + try { + FileInputStream fis = new FileInputStream(file); + isr = new InputStreamReader(fis, code); + int m = (int) file.length(); + char[] c = new char[m]; // I prepare the array to + // accommodate i + // characters of the file + isr.read(c); // load the array c + isr.close(); // I close the file + t = String.valueOf(c); + } catch (FileNotFoundException e) { + throw e; + } catch (IOException e) { + isr.close(); + throw e; + } + return entities_C(t); + } + + /** + *

+ * Overload of the previous method. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param is the InputStream object to be read + * @param code encoding UNICODE + * @return the all-inclusive string of all text + * @throws UnsupportedEncodingException ordinary exception + * @throws IOException ordinary exception + * @throws FileNotFoundException ordinary exception + * @since 3 */ + public static String unicaStringaUnicode_B(InputStream is, + final String code) + + throws UnsupportedEncodingException, IOException { + + String t = null; + InputStreamReader isr = null; + if (is.available() > Integer.MAX_VALUE / 2) + throw new IOException( + "The file length is greater than 1 GB, it is not allowed."); + try { + isr = new InputStreamReader(is, code); + int m = is.available(); + char[] c = new char[m]; // I prepare the array to + // accommodate i + // characters of the file + isr.read(c); // load the array c + isr.close(); // I close the file + t = String.valueOf(c); + } catch (IOException e) { + isr.close(); + throw e; + } + return entities_C(t); + } + + /** + *

+ * String-to-string transformation, using XML-character + * &#xffff;.
+ * By ffff we mean 4 hexadecimal characters, for example: + * e445, 00fe, ff4a, etc. which correspond to 16 bits.
+ * The code is regulated by W3C production [66].
+ *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 29 / 04/08 + *

+ *

+ * Changes:
+ *

+ * + * @param t input string + * @return oputput string */ + public static String entities_A(final String t) { + if (t == null) { + return null; + } + String s; + int m = t.length(); + if (m == 0) { + return t; + } + /* I prepare the array to accommodate the characters of the + * file */ + char[] c = new char[m]; + c = t.toCharArray(); // load the array c + int k; + /* downgraded to not process any null in the queue */ + for (k = m - 1; c[k] == 0; k--) + ; + /* at this point we start looking for unicode characters; you + * have chosen to convert to ￿ all characters beyond 255 + * of the ASCII. */ + /* I prepare another 8 times long array, because they could all + * be special characters */ + char[] d = new char[(k + 1) * 8]; + /* there are 2 parallel scrolling indices, i and j, but every + * now and then j jumps 7 more points because we have + * encountered the sequence ￿ */ + int i, j; + for (i = 0, j = 0; i <= k; i++, j++) { + if (c[i] < 256) + d[j] = c[i]; + else { + char[] uno = new char[1]; + char[] esa = new char[4]; + uno[0] = c[i]; + esa = Mix.fromCharToEsadUnicode(uno); + d[j] = '&'; + d[j + 1] = '#'; + d[j + 2] = 'x'; + d[j + 3] = esa[0]; + d[j + 4] = esa[1]; + d[j + 5] = esa[2]; + d[j + 6] = esa[3]; + d[j + 7] = ';'; + j += 7; + } + } + String r = new String(d); + s = r.substring(0, j); + return s; + } + + /** + *

+ * Variant of the previous one, it only makes the amount of heap + * memory required by the JVM variable. This variant was introduced + * because the multiplier 8 in the new char of the original version + * of the method was excessive when applying the method to an entire + * file, corrected when applying to a simple sentence, as happens in + * the justify_A method of the class it.ipzs.utensiliJN + * .comuni.Giustificazione. The multiplier becomes a topic of the + * method. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param t input string + * @param h multiplier to decide how much heap memory space to take + * @return oputput string + * @since 3.0.0 - SVutensiliJ4_2.0.0 */ + public static String entities_A(final String t, final int h) { + if (t == null) { + return null; + } + String s; + int m = t.length(); + if (m == 0) { + return t; + } + char[] c = new char[m]; // I prepare the array to accommodate i + // characters + // of the file + c = t.toCharArray(); // load the array c + int k; + for (k = m - 1; c[k] == 0; k--) + ; // downgraded to not process any null in the queue + /* at this point we start looking for unicode characters; you + * have chosen to convert to ￿ all characters beyond 255 + * of the ASCII. */ + // I prepare another array long h times, because they could + // to be + // all + // Special characters + char[] d = new char[(k + 1) * h]; + /* there are 2 parallel scrolling indices, i and j, but every + * now and then j jumps 7 more points because we have + * encountered the sequence ￿ */ + int i, j; + for (i = 0, j = 0; i <= k; i++, j++) { + if (c[i] < 256) + d[j] = c[i]; + else { + char[] uno = new char[1]; + char[] esa = new char[4]; + uno[0] = c[i]; + esa = Mix.fromCharToEsadUnicode(uno); + d[j] = '&'; + d[j + 1] = '#'; + d[j + 2] = 'x'; + d[j + 3] = esa[0]; + d[j + 4] = esa[1]; + d[j + 5] = esa[2]; + d[j + 6] = esa[3]; + d[j + 7] = ';'; + j += 7; + } + } + String r = new String(d); + s = r.substring(0, j); + return s; + } + + /** + *

+ * String-to-string transformation, using XML-character + * &#xffff;.
+ * By ffff we mean 4 hexadecimal characters, for example: + * e445, 00fe, ff4a, etc. . which correspond to 16 bits.
+ * The code is regulated by W3C production [66].
+ * Version perfected compared to entities_A. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param t input string + * @return oputput string + * @since 3.0.0 - SVutensiliJ4_2.0.0 */ + public static String entities_C(final String t) { + return entities_C(t, 255); + } + + /** + *

+ * String-to-string transformation, using XML-character + * &#xffff;.
+ * By ffff we mean 4 hexadecimal characters, for example: + * e445, 00fe, ff4a, etc. . which correspond to 16 bits.
+ * The code is regulated by W3C production [66].
+ * Version perfected compared to entities_A. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param t input string + * @param limit limit beyond which the input transformation is + * triggered + * @return oputput string + * @since 3.0.0 - SVutensiliJ4_2.0.0 */ + public static String entities_C(final String t, final int limit) { + if (t == null) { + return null; + } + String s; + int m = t.length(); + if (m == 0) { + return t; + } + char[] c = new char[m]; // I prepare the array to accommodate i + // characters + // of the file + c = t.toCharArray(); // load the array c + int k; + for (k = m - 1; c[k] == 0; k--) + ; // downgraded to not process any null in the queue + int i, j, n; + n = 0; + for (i = 0; i <= k; i++) { // count in n how many characters + // will + // to be transformed + if (c[i] > limit) + n++; + } + /* at this point we start looking for unicode characters; you + * have chosen to convert to ￿ all characters beyond 255 + * of the ASCII. */ + /* I prepare another quite long array, taking into account the + * count of the characters just made */ + char[] d = new char[k + 1 + n * 7]; + /* there are 2 parallel scrolling indices, i and j, but every + * now and then j jumps 7 more points because we have + * encountered the sequence ￿ */ + for (i = 0, j = 0; i <= k; i++, j++) { + if (c[i] > limit) { + char[] uno = new char[1]; + char[] esa = new char[4]; + uno[0] = c[i]; + esa = Mix.fromCharToEsadUnicode(uno); + d[j] = '&'; + d[j + 1] = '#'; + d[j + 2] = 'x'; + d[j + 3] = esa[0]; + d[j + 4] = esa[1]; + d[j + 5] = esa[2]; + d[j + 6] = esa[3]; + d[j + 7] = ';'; + j += 7; + } else { + d[j] = c[i]; + } + } + String r = new String(d); + s = r.substring(0, j); + return s; + } + + /** + *

+ * Transformation of a text containing hexadecimal character + * reference into an ordinary 16-bit string per character; the + * code is regulated by W3C production [66]. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param s string to be written + * @return the Unicode string + * @since SVutensiliJ4_1.3.0 */ + public static String entities_Z(final String s) { + + int k = 0, m = 0; + char[] h = new char[4]; // the 4 hexadecimal characters; es. + // 45ea, + // 005b, + // etc. + int sL = s.length(); + char[] c = s.toCharArray(); // the array of input characters + char[] d = new char[sL]; // the array of characters in output + char[] uno = new char[1]; // the unicode character obtained + try { + /* I'm looking for the combination &#x (& = 38, # = 35, x = + * 120), and a semicolon (; = 59) further ahead */ + for (k = 0, m = 0; k < sL; k++, m++) { + if (k < sL - 7 && c[k] == 38 && c[k + 1] == 35 && c[k + + 2] == 120 && c[k + 7] == 59) { + h[0] = c[k + 3]; + h[1] = c[k + 4]; + h[2] = c[k + 5]; + h[3] = c[k + 6]; + uno = Mix.daEsadACharUnicode(h); + d[m] = uno[0]; + k += 7; + } else { + d[m] = c[k]; + } + } + } catch (ExactException e) { + System.out.println( + "Uncorrect Hexadecimal codes were found: " + String + .copyValueOf(h)); + } + return new String(d); + } + + /** + *

+ * Writing a sequential file starting from the text of a string. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param file output file + * @param s string to write + * @throws ExactException is triggered when the directory does not + * exist, or the file cannot be written */ + public static void scriviFileDaStringa(File file, final String s) + + throws ExactException { + + try { + PrintWriter out = new PrintWriter(new BufferedWriter( + new FileWriter(file))); + out.print(s); + out.close(); + } catch (FileNotFoundException nfe) { + throw new ExactException(nfe.getMessage() + + " - Not found directory: " + file.getName() + ".", + 100900, "Equipment", ""); + } catch (IOException ioe) { + throw new ExactException(ioe.getMessage() + + " - It is impossible to write in " + file + .getName() + ".", 100901, "Equipment", ""); + } + } + + /** + *

+ * Writing a sequential file starting from the text of a string. It + * differs from the writeFileFromStringa method because if + * everything is already exactly written it does nothing. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param file input file + * @param s string to write false + * @return if the file was not written, for economy, being already + * present and identical; true if + * @throws ExactException is triggered when the directory does not + * exist, or it is not possible to write to the file */ + public static boolean writeFileFromOneString_economy(File file, + final String s) + + throws ExactException { + + try { + String t = oneString(file); + // if everything is already exactly written, go away + if (t.equals(s)) + return false; + } catch (FileNotFoundException e) { + } catch (IOException e) { + e.printStackTrace(); + } + try { + PrintWriter out = new PrintWriter(new BufferedWriter( + new FileWriter(file))); + out.print(s); + out.close(); + } catch (FileNotFoundException nfe) { + throw new ExactException(nfe.getMessage() + + " - Not found directory «" + file.getName() + + "».", 100902, "Equipment", ""); + } catch (IOException ioe) { + throw new ExactException(ioe.getMessage() + + " - It is impossible to write in the file «" + + file.getName() + "»", 100903, "Equipment", ""); + } + return true; + } + + /** + *

+ * Writing a sequential file starting from the text of a string, + * with transformation in UTF. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param file output file + * @param s string to be written + * @param code Unicode code to be adopted + * @throws ExactException is triggered when the directory does not + * exist, or it is not possible to write to the file */ + public static void writeFileFromOneStringUnicode_A(File file, + final String s, final String code) + + throws ExactException { + + try { + FileOutputStream fos = new FileOutputStream(file); + OutputStreamWriter osw = new OutputStreamWriter(fos, code); + osw.write(s, 0, s.length()); + osw.close(); + } catch (FileNotFoundException nfe) { + throw new ExactException(nfe.getMessage() + + ", or not found the directory «" + file.getName() + + "».", 100904, "Equipment", ""); + } catch (IOException ioe) { + throw new ExactException(ioe.getMessage() + + " - It is impossible to write in the «" + file + .getName() + "».", 100905, "Equipment", ""); + } + } + + /** + *

+ * Writing a sequential file starting from the text of a string, + * with transformation in UTF-16 and use of XML character-entity + * &#xffff;.
+ * The code is regulated by W3C production [66]. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param file output file + * @param s string to be written + * @param code Unicode code to be adopted + * @throws ExactException is triggered when the directory does not + * exist, or it is not possible to write to the file */ + public static void scriviFileDaStringaUnicode_B(File file, + final String s, final String code) + + throws ExactException { + + int k = 0, m = 0; + char[] h = new char[4]; // the 4 hexadecimal characters; es. + // 45ea, + // 005b, + // etc. + int sL = s.length(); + char[] c = s.toCharArray(); // the array of input characters + char[] d = new char[sL]; // the array of characters in output + char[] uno = new char[1]; // the unicode character obtained + try { + /* I'm looking for the combination &#x (& = 38, # = 35, x = + * 120), and a semicolon (; = 59) further ahead */ + for (k = 0, m = 0; k < sL; k++, m++) { + if (k < sL - 7 && c[k] == 38 && c[k + 1] == 35 && c[k + + 2] == 120 && c[k + 7] == 59) { + h[0] = c[k + 3]; + h[1] = c[k + 4]; + h[2] = c[k + 5]; + h[3] = c[k + 6]; + uno = Mix.daEsadACharUnicode(h); + d[m] = uno[0]; + k += 7; + } else { + d[m] = c[k]; + } + } + } catch (ExactException e) { + System.out.println("Trovati codici esadecimali scorretti: " + + String.copyValueOf(h)); + } + String r = new String(d); + // if (replacement) + // m--; // when the character entity is in last place, + // must + // a correction + try { + FileOutputStream fos = new FileOutputStream(file); + OutputStreamWriter osw = new OutputStreamWriter(fos, code); + osw.write(r, 0, m); + osw.close(); + } catch (FileNotFoundException nfe) { + throw new ExactException(nfe.getMessage() + + " - Not found the directory «" + file.getName() + + "».", 100906, "Equipment", ""); + } catch (IOException ioe) { + throw new ExactException(ioe.getMessage() + + " - It is impossible to write in the file «" + + file.getName() + "».", 100907, "Equipment", ""); + } + } + + /** + *

+ * Writing a file extracted from a zip, assuming the presence of + * Unicode characters. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param z the zip file + * @param ze entry (i.e. internal element) of the zip file + * @param output output file + * @param code the type of encoding Unicode + * @throws ExactException is triggered when the directory does not + * exist, or it is not possible to write to the file + * @throws IOException standard exception + * @since 3 */ + public static void scriviZipEntry(ZipFile z, ZipEntry ze, + File output, final String code) + + throws ExactException, IOException { + + InputStream is = z.getInputStream(ze); + String unica = Equipment.unicaStringaUnicode_B(is, code); + unica = "" + + LFS + unica; + Equipment.scriviFileDaStringaUnicode_B(output, unica, code); + } + + /** + *

+ * Writing an empty file; if it already exists, empty or full, the + * method does nothing; if èd is a directory, the method does + * nothing. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param file the file to be created + * @throws ExactException is triggered when the file cannot be + * written, for example because the path is wrong. */ + public static void scriviFileVuoto(File file) + + throws ExactException { + + if (file.exists()) { + return; + } + try { + PrintWriter out = new PrintWriter(new BufferedWriter( + new FileWriter(file))); + out.close(); + } catch (IOException ioe) { + throw new ExactException(ioe.getMessage() + + " - It is impossible to write in the file " + file + .getName() + ".", 100908, "Equipment", ""); + } + } + + /** + *

+ * Overload of the previous one. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param s the file to be created + * @throws ExactException is triggered when the file cannot be + * written, for example because the path is wrong. */ + public static void scriviFileVuoto(final String s) + + throws ExactException { + + scriviFileVuoto(new File(s)); + } + + /** + *

+ * Creation date: 2020-10-06
+ * Class: Sweat + *

+ *

+ * Description: this method read a file, modify one time the + * corresponding string, finally write it. + *

+ * + * @param dY directory + * @param f name of the file to be modified + * @param x regular expression + * @param y replacement */ + static public boolean surgery(final String dY, final String f, + final String x, final String y, Logger logger) { + + File file = new File(Mix.dress_C(dY) + f); + if (!file.exists() || !file.isFile()) { + Mix.discloseError("The file " + Mix.dress_A(f) + + " is not present. It is not possible to continue.", + "Stop", logger); + return false; + } + try { + /* I am reading inside drill */ + String p0 = Equipment.oneStringUnicode_A(file, "UTF-8"); + /* I am updating */ + String p1 = p0.replaceFirst(x, y); + /* I am writing inside drill */ + FileOutputStream fos = new FileOutputStream(file); + OutputStreamWriter osw; + osw = new OutputStreamWriter(fos, "UTF-8"); + osw.write(p1, 0, p1.length()); + osw.close(); + } catch (ExactException e) { + String message = ""; + if (e.className != null) { + message += "Class: " + e.className + Candies.LF; + } + if (e.method != null) { + message += "Method: " + e.method + Candies.LF; + } + if (e.datum != null) { + message += Candies.LF + e.datum; + } + logger.error(message); + new Placard(null, message, "Error code " + e.code); + return false; + } catch (IOException e) { + Mix.discloseError("I/O error on The file " + Mix.dress_A( + file.getAbsolutePath()) + + ". It is not possible to continue." + Candies.LF + + e.getMessage(), "Stop", logger); + return false; + } + return true; + } +} \ No newline at end of file diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/salad/file/FileBase.java b/screwdriver-3.5.6/src/main/java/it/ramecera/salad/file/FileBase.java new file mode 100644 index 0000000..dad71d4 --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/salad/file/FileBase.java @@ -0,0 +1,64 @@ +// +// https://www.ramecera.it/myscrewdriver.html +// e-mail: screwdriver@ramecera.it +// +/* This program and the accompanying materials are made available under + * the terms of the Eclipse Public License v1.0 which accompanies this + * distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html */ +package it.ramecera.salad.file; + +import it.ramecera.salad.everyday.Mix; + +/** + *

+ * Company: Rameceraâ„¢
+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09
+ *

+ * + * @author M. Maglioni */ +public class FileBase { + + /** obvious */ + public String path; + /** obvious */ + public String fileName; + /** obvious */ + public String extension; + /** obvious */ + public int depth; + + /** obvious */ + public FileBase() { + + } + + /** @param path obvious + * @param fileName obvious + * @param extension obvious + * @param depth obvious */ + public FileBase(final String path, final String fileName, + final String extension, final int depth) { + super(); + this.path = path; + this.fileName = fileName; + this.extension = extension; + this.depth = depth; + } + + /** + *

+ * Creation date: 2020-04-16
+ * Last updated: 2020-04-16
+ * Class: FileBase + * + * @author M. Maglioni + *

+ * Description: + *

+ * @return the complete path and name of the file */ + public String getG() { + return Mix.dress_C(path) + fileName + "." + extension; + } +} diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/salad/file/Folder.java b/screwdriver-3.5.6/src/main/java/it/ramecera/salad/file/Folder.java new file mode 100644 index 0000000..519a051 --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/salad/file/Folder.java @@ -0,0 +1,448 @@ +// +// https://www.ramecera.it/myscrewdriver.html +// e-mail: screwdriver@ramecera.it +// +/* This program and the accompanying materials are made available under + * the terms of the Eclipse Public License v1.0 which accompanies this + * distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html */ + +package it.ramecera.salad.file; + +import java.io.File; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +import it.ramecera.salad.everyday.Mix; + +/** + *

+ * Processing of lists of files contained in a directory. + *

+ *

+ * Company: Rameceraâ„¢
+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-19
+ *

+ *

+ * Changes:
+ *

+ * + * @author M. Maglioni */ + +public class Folder { + + /** list of the files, with some their properties */ + public List fbE = new ArrayList(); + + /** + *

+ * Production of the list of files of a directory, filtered + * according to a pattern. It differs from the listFile + * method in that it produces an array of File objects and not + * simply their names. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @return array of strings with the found files + * @param filter the pattern to filter the files, according to the + * codes of the class java.util.regex.Pattern. + * @param y the path where to search for files */ + public File[] fileObjects(final String filter, final String y) { + // if necessary, I put a slash in the queue + String y1 = Mix.dress_C(y); + File f = new File(y); + if (!f.exists() || !f.isDirectory()) // quality control + return null; + String[] s = f.list(Mix.fileFilter(filter)); + File[] of = new File[s.length]; + for (int j = 0; j < s.length; j++) { + of[j] = new File(y1 + s[j]); + } + return of; + } + + /** + *

+ * Production of the list of files of a directory, filtered + * according to a pattern. It differs from the fileObjects + * method in that it produces an array of file objects sorted by + * "Last update", and not simply their names. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @return array of strings with the found files + * @param filter the pattern to filter the files, according to the + * codes of the class java.util.regex.Pattern. + * @param y the path where to search for files */ + public List oggettiFileOrdinaModi(final String filter, + final String y) { + // if necessary, I put a slash in the queue + String y1 = Mix.dress_CU(y); + File f = new File(y); + if (!f.exists() || !f.isDirectory()) // quality control + return null; + String[] s = f.list(Mix.fileFilter(filter)); + List of = new ArrayList(); + for (String t : s) { + of.add(new File(y1 + t)); + } + Collections.sort(of, new MyComparatorFileModi()); + return of; + } + + /** + *

+ * Production of the list of subdirectories of a directory. It + * differs from the objectsFile method in that it produces an + * array of File objects sorted by Last update, and not simply their + * names. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @return array of strings with directories found according to the + * codes of the java.util.regex.Pattern class. + * @param y the path where to search for files */ + public List dirObjects(final String y) { + // if necessary, I put a slash in the queue + String y1 = Mix.dress_CU(y); + File f = new File(y); + // if the input directory does not exist, or is not a directory + // ... + if (!f.exists() || !f.isDirectory()) // quality control + return null; // nothing is done about it + String[] s = f.list(Mix.filterDirectory()); + List of = new ArrayList(); + for (String t : s) { + of.add(new File(y1 + t)); + } + return of; + } + + /** + *

+ * Production of the list of subdirectories of a directory. It + * differs from the objectsFile method in that it produces an + * array of File objects sorted by Last update, and not simply their + * names. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @return array of strings with files found according to the codes + * of the java.util.regex.Pattern class. + * @param y the path where to search for files */ + public List oggettiDireOrdinaModi(final String y) { + // if necessary, I put a slash in the queue + String y1 = Mix.dress_CU(y); + File f = new File(y); + // if the input directory does not exist, or is not a directory + // ... + if (!f.exists() || !f.isDirectory()) // quality control + return null; // nothing is done about it + String[] s = f.list(Mix.filterDirectory()); + List of = new ArrayList(); + for (String t : s) { + of.add(new File(y1 + t)); + } + Collections.sort(of, new MyComparatorFileModi()); + return of; + } + + /** + *

+ * Production of the list of files of a directory, filtered + * according to a pattern. It differs from the objectsFile + * method in that it produces an array of File objects sorted by + * Last update, and not simply their names. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @return array of strings with the found files + * @param filter the pattern to filter the files, according to the + * codes of the class java.util.regex.Pattern. + * @param y the path where to search for files */ + public List oggettiFileOrdinaAlfa(final String filter, + final String y) { + // if necessary, I put a slash in the queue + String y1 = Mix.dress_CU(y); + File f = new File(y); + if (!f.exists() || !f.isDirectory()) // quality control + return null; + String[] s = f.list(Mix.fileFilter(filter)); + List of = new ArrayList(); + for (String t : s) { + of.add(new File(y1 + t)); + } + Collections.sort(of, new MyComparatorFileAlfa()); + return of; + } + + /** + *

+ * Production of the list of subdirectories of a directory. It + * differs from the ObjectsDire method in that it produces an + * array of File objects sorted by date of last modification, and + * not simply their names. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @return array of strings with files found according to the codes + * of the java.util.regex.Pattern class. + * @param y the path where to search for files */ + public List oggettiDireOrdinaAlfa(final String y) { + // if necessary, I put a slash in the queue + String y1 = Mix.dress_CU(y); + File f = new File(y); + // if the input directory does not exist, or is not a directory + // ... + if (!f.exists() || !f.isDirectory()) // quality control + return null; // nothing is done about it + String[] s = f.list(Mix.filterDirectory()); + List of = new ArrayList(); + for (String t : s) { + of.add(new File(y1 + t)); + } + Collections.sort(of, new MyComparatorFileAlfa()); + return of; + } + + /** + *

+ * Production of the list of subdirectories of a directory. It + * differs from the ObjectsDire method in that it produces an + * array of File objects sorted by date of last modification, and + * not simply their names. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @return array of strings with files found according to the codes + * of the java.util.regex.Pattern class. + * @param y the path where to search for files + * @param filter filter for selecting files */ + public List oggettiDireOrdinaAlfa(final String filter, + final String y) { + + // if necessary, I put a slash in the queue + String y1 = Mix.dress_CU(y); + File f = new File(y); + // if the input directory does not exist, or is not a directory + // ... + if (!f.exists() || !f.isDirectory()) // quality control + return null; // nothing is done about it + String[] s = f.list(Mix.filtroDirectory(filter)); + List of = new ArrayList(); + for (String t : s) { + of.add(new File(y1 + t)); + } + Collections.sort(of, new MyComparatorFileAlfa()); + return of; + } + + /** + *

+ * Production of the list of files of a directory, filtered + * according to a pattern. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @return array of strings with the found files + * @param filter the pattern to filter the files, according to the + * codes of the class java.util.regex.Pattern. + * @param y the path where to search for files */ + public String[] elencoFile(final String filter, final String y) { + File f = new File(y); + if (!f.exists() || !f.isDirectory()) // quality control + return null; + return f.list(Mix.fileFilter(filter)); + } + + /** + *

+ * Production of the list of files of a system of directories. + *

+ *

+ * Company: Rameceraâ„¢
+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09
+ *

+ * + * @param y input directory + * @return the file list */ + public List fileImmersion(final String y) { + int profondita = 0; + ArrayList fbE = new ArrayList(); + File f = new File(y); + if (!f.exists() || !f.isDirectory()) { + return null; + } + fbE = new ArrayList(); + fileAccumulation(y, fbE, profondita); + return fbE; + } + + private void fileAccumulation(final String y, List fbE, + int profondita) { + File[] aE = fileObjects("\\p{ASCII}+", y); + FileBase fb = null; + for (File a : aE) { + if (a.isDirectory()) { + continue; + } + fb = Mix.analizzaPathBase(a); + fb.depth = profondita; + fbE.add(fb); + } + profondita++; + List bE = dirObjects(y); + for (File c : bE) { + fileAccumulation(c.getPath(), fbE, profondita); + } + } + + /** + *

+ * Production of the list of directories of a system of directories, + * filtered according to a pattern. + *

+ *

+ * Company: Rameceraâ„¢
+ * Creation date: 2020-09-08
+ * Last updated: 2020-09-08
+ *

+ * + * @param y input directory + * @param pattern obvious + * @return the file list */ + public List dirImmersion(final String y, + final String pattern) { + int depth = 0; + ArrayList fbE = new ArrayList(); + File f = new File(y); + if (!f.exists() || !f.isDirectory()) { + return null; + } + fbE = new ArrayList(); + dirAccumulation(y, fbE, depth, pattern); + return fbE; + } + + private void dirAccumulation(final String y, List dirE, + int depth, final String pattern) { + File[] aE = fileObjects(pattern, y); + for (File a : aE) { + if (a.isDirectory()) { + dirE.add(a.getPath()); + } + } + depth++; + List bE = dirObjects(y); + for (File c : bE) { + dirAccumulation(c.getPath(), dirE, depth, pattern); + } + } + + /** Class needed to sort files by date */ + class MyComparatorFileModi implements Comparator { + + /** + *

+ * Method of comparison based on the date of the last + * modification of the file. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param f1 first object (file) + * @param f2 second object (file) + * @return minor = -1, major = 1 or equal = 0 */ + @Override + public int compare(File f1, File f2) { + if (f2.lastModified() == f1.lastModified()) + return 0; + else if (f2.lastModified() > f1.lastModified()) + return 1; + else + return -1; + } + } + + /** Class needed to sort files alphabetically by name */ + class MyComparatorFileAlfa implements Comparator { + + /** + *

+ * Method of comparison based on the date of the last + * modification of the file. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param f1 first object (file) + * @param f2 second object (file) + * @return minor = -1, major = 1 or equal = 0 */ + @Override + public int compare(File f1, File f2) { + return f1.getName().compareTo(f2.getName()); + } + } +} diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/salad/file/ReadMyFile.java b/screwdriver-3.5.6/src/main/java/it/ramecera/salad/file/ReadMyFile.java new file mode 100644 index 0000000..4c6ebbc --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/salad/file/ReadMyFile.java @@ -0,0 +1,213 @@ +// +// https://www.ramecera.it/myscrewdriver.html +// e-mail: screwdriver@ramecera.it +// +/* This program and the accompanying materials are made available under + * the terms of the Eclipse Public License v1.0 which accompanies this + * distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html */ +package it.ramecera.salad.file; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import it.ramecera.salad.everyday.Candies; +import it.ramecera.salad.everyday.ExactException; +import it.ramecera.salad.everyday.Mix; + +/** + *

+ * Class for reading files. The class should not be instantiated. + *

+ *

+ * Company: Rameceraâ„¢
+ * Creation date: 2020-04-09
+ *

+ * Changes:
+ *

+ * + * @author M. Maglioni */ + +public class ReadMyFile { + + /** + *

+ * Reading a sequential file. It is intended as structured with + * lines terminated by CR / LF or LF; the method reads the lines on + * a List of strings. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ * + * @param g file name, complete with path + * @return a List of strings + * @throws FileNotFoundException is triggered when the file does not + * exist + * @throws IOException is triggered when it is not possible to read, + * for any other reason */ + public static List zebra_A(final String g) + + throws IOException, FileNotFoundException { + + List al = new ArrayList(); + al.clear(); + String riga = null; + FileReader fr = null; + try { + fr = new FileReader(g); + } catch (FileNotFoundException enf) { + throw enf; + } + BufferedReader in = new BufferedReader(fr); + do { + try { + riga = in.readLine(); + } catch (IOException eio) { + in.close(); + throw eio; + } + al.add(riga); + } while (riga != null); + in.close(); + al.remove(al.size() - 1); + return al; + } + + /** + *

+ * Reading a sequential file. It is intended as structured with + * lines terminated by CR / LF or LF; the method reads the lines on + * a List of strings. It differs from zebra_A in that it ignores + * empty lines, which therefore do not weigh down the list. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ * + * @param g file name, complete with path + * @return a List of strings + * @throws FileNotFoundException is triggered when the file does not + * exist + * @throws IOException is triggered when it is not possible to read, + * for any other reason */ + public static List zebra_B(final String g) + + throws IOException, FileNotFoundException { + + List al = new ArrayList(); + String line = null; + FileReader fr = null; + try { + fr = new FileReader(g); + } catch (FileNotFoundException enf) { + throw enf; + } + BufferedReader in = new BufferedReader(fr); + do { + try { + line = in.readLine(); + } catch (IOException eio) { + in.close(); + throw eio; + } + if (line != null && !line.equals("")) { + al.add(line); + } + } while (line != null); + in.close(); + return al; + } + + /** + *

+ * Reading a sequential file. It is intended as structured with + * lines terminated by CR/LF or LF; the method reads the lines on a + * list of strings. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ * + * @param file the object File to be read + * @param code Unicode code to be adopted + * @return a List of strings + * @throws ExactException standard exception */ + public static List zebra_C(File file, final String code) + + throws ExactException { + + String s = Equipment.oneStringUnicode_A(file, code); + List r = new ArrayList(); + String[] p = s.split("\\x0a"); + for (String q : p) { + if (q.endsWith(Candies.CR)) { + q = q.substring(0, q.length() - 1); + } + r.add(q); + } + return r; + } + + /** + *

+ * As above, but the input provided is a File object. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ * + * @param f the file object + * @return a List of strings + * @throws FileNotFoundException is triggered when the file does not + * exist + * @throws IOException is triggered when it is not possible to read, + * for any other reason */ + public static List zebra_A(File f) + + throws IOException, FileNotFoundException { + + return zebra_A(f.getPath()); + } + + /** + *

+ * Production of the list of files of a directory, filtered + * according to a pattern. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @return an array list of strings with the found files + * @param x the pattern to filter the files, according to the codes + * of the java.util.regex.Pattern class. + * @param y the path to search for + * @since 1.0.0 files */ + public static List listaFile(final String x, + final String y) { + + // if necessary, I put a slash in the queue + File f = new File(y); + List l = new ArrayList(); + if (!f.exists() || !f.isDirectory()) // quality control + return l; + String[] sl = f.list(Mix.fileFilter(x)); + for (int i = 0; i < sl.length; i++) + l.add(sl[i]); + return l; + } +} \ No newline at end of file diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/salad/graphic/AskForDelete.java b/screwdriver-3.5.6/src/main/java/it/ramecera/salad/graphic/AskForDelete.java new file mode 100644 index 0000000..d0bdce7 --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/salad/graphic/AskForDelete.java @@ -0,0 +1,301 @@ +// +// https://www.ramecera.it/myscrewdriver.html +// e-mail: screwdriver@ramecera.it +// +/* This program and the accompanying materials are made available under + * the terms of the Eclipse Public License v1.0 which accompanies this + * distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html */ +package it.ramecera.salad.graphic; + +import java.awt.Color; +import java.awt.Font; +import java.awt.Frame; +import java.awt.Rectangle; + +import javax.swing.JButton; +import javax.swing.JDialog; +import javax.swing.JPanel; +import javax.swing.JTextArea; + +import it.ramecera.salad.everyday.Candies; +import it.ramecera.salad.everyday.Mix; + +/** + *

+ * Display class of a message box. It is used simply by calling: new + * Placard (component_owner, message);
+ * or: new Placard (component_owner, message, header); no method needs + * to be invoked. For other details see the constructor. + *

+ *

+ * Company: Rameceraâ„¢
+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Modifications:
+ *

+ * + * @author M. Maglioni */ +public class AskForDelete extends JDialog { + /** pure formality */ + private static final long serialVersionUID = 1L; + /** the panel containing the whole */ + private JPanel jContentPane = null; + /** the text of the message */ + private final String dispatch; + /** the title to the message */ + private String header = "Message:"; + /* the text-area object */ + private JTextArea textArea; + private int buttonX = 250; + private int buttonY = 250; + private int jdWidth = 607; + private int jdHeight = 350; + private final int taMargin = 18; + private final int taWidth = 565; + private int taHeight = 150; + private final int buWidth = 100; + private final int buHeight = 40; + private final int jdDowelTop = 55; + private final int jdDowelRight = 15; + private final int taDowelTop = 0; + private final int charsEveryLine = 68; + private final int lineFontVerdana16Height = 22; + private final int betweenButtons = 40; + /** the affirmative button */ + private JButton jButtonYes = null; + /** the negative button */ + private JButton jButtonNo = null; + /** says if I pressed yes (true) or not (false) */ + public boolean answer; + /** says if you need to lock the "yes" button */ + private boolean lockButtonYes; + + /** + *

+ * Only public property; warns that the message has been + * forwarded. */ + public boolean reduce; + + /** + *

+ * 2 parameter constructor. + *

+ *

+ * creation: 2020-04-09
+ * last modification: 2020-04-09
+ *

+ * Changes:
+ *

+ * + * @param owner the graphic component from which the pop-up of the + * message itself is born; + * @param s may be the message to be displayed */ + public AskForDelete(Frame owner, final String s) { + super(owner); + setFont(new Font("Verdana", Font.PLAIN, 15)); + dispatch = s; + initialize(); + } + + /** + *

+ * 3 parameter constructor. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param owner the graphic component from which the pop-up of the + * message itself is born; + * @param s the message to be displayed + * @param t the header of the message */ + public AskForDelete(Frame owner, String s, String t) { + super(owner); + dispatch = s; + header = t; + initialize(); + } + + /** + *

+ * 1 parameter constructor. In this case, the graphic component from + * which the pop-up of the message originates is indeterminate. + *

+ *

+ * creation: 2020-04-09
+ * last modification: 2020-04-09
+ *

+ * Changes:
+ *

+ * + * @param s the message to display */ + public AskForDelete(String s) { + super(new Frame()); + dispatch = s; + initialize(); + } + + /** ordinary initialization */ + private void initialize() { + this.setSize(jdWidth, jdHeight); + // center on the screen + this.setModal(true); + this.setLocationRelativeTo(null); + this.setTitle(header); + this.setContentPane(getJContentPane()); + jButtonYes.setEnabled(!lockButtonYes); + this.setVisible(true); + reduce = true; + } + + /** + *

+ * 4 parameter constructor. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Modifications:
+ *

+ * + * @param owner the graphic component from which the pop-up of the + * message itself originates; it can be null + * @param s the message to be displayed + * @param t the head of the box + * @param lockButtonYes if it is necessary to block the "Yes" button + * for obvious opportunity */ + public AskForDelete(Frame owner, final String s, final String t, + final boolean lockButtonYes) { + + super(owner); + dispatch = s; + header = t; + this.lockButtonYes = lockButtonYes; + initialize(); + } + + /** This method initializes jContentPane + * + * @return javax.swing.JPanel + * @see #initialize () */ + private JPanel getJContentPane() { + if (jContentPane == null) { + jContentPane = new JPanel(); + jContentPane.setLayout(null); + jContentPane.setBackground(new Color(250, 240, 230)); + textArea = new JTextArea(); + textArea.setEditable(false); + textArea.setFont(new Font("Verdana", Font.PLAIN, 16)); + textArea.setWrapStyleWord(true); + textArea.setLineWrap(true); + textArea.setBackground(new Color(250, 240, 230)); + /* estimate of the amount of lines in the message */ + int lineQ = dispatch.length() / charsEveryLine + 1 + Mix + .charQ(dispatch, Candies.LINE_FEED); + taHeight = taDowelTop + lineQ * lineFontVerdana16Height; + textArea.setBounds(taMargin, taMargin, taWidth, taHeight); + textArea.setText(dispatch); + jdWidth = taWidth + taMargin * 2 + jdDowelRight; + jdHeight = taHeight + taMargin * 3 + buHeight + jdDowelTop; + this.setSize(jdWidth, jdHeight); + jContentPane.add(textArea); + jContentPane.add(getJButtonYes(), null); + jContentPane.add(getJButtonNo(), null); + } + return jContentPane; + } + + /** This method initializes jButton Yes + *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Modifications:
+ *

+ * + * @return javax.swing.JButton + * @see #getJContentPane () */ + private JButton getJButtonYes() { + if (jButtonYes == null) { + jButtonYes = new JButton(); + buttonX = (jdWidth - betweenButtons - buWidth * 2) / 2; + buttonY = taMargin * 2 + taHeight; + jButtonYes.setBounds(new Rectangle(buttonX, buttonY, + buWidth, buHeight)); + jButtonYes.setText("Yes"); + jButtonYes.setEnabled(true); // generated + jButtonYes.setFont(new Font("Tahoma", Font.PLAIN, 14)); + jButtonYes.addMouseListener( + new java.awt.event.MouseAdapter() { + public void mouseClicked( + java.awt.event.MouseEvent e) { + if (jButtonYes.isEnabled()) { + jButtonYes_mouseClicked(); + } + } + }); + } + return jButtonYes; + } + + /** + *

+ * I close my box. + *

+ * + * @see #getJButtonYes () */ + private void jButtonYes_mouseClicked() { + answer = true; + dispose(); + } + + /** + *

+ * I close my box. + *

+ * + * @see #getJButtonNo () */ + private void jButtonNo_mouseClicked() { + answer = false; + dispose(); + } + + /** + *

+ * This method initializes jButtonNo. + *

+ * + * @return javax.swing.JButton + * @see #getJContentPane () */ + private JButton getJButtonNo() { + if (jButtonNo == null) { + // try { + jButtonNo = new JButton(); + buttonX = (jdWidth - betweenButtons - buWidth * 2) / 2 + + buWidth + betweenButtons; + buttonY = taMargin * 2 + taHeight; + jButtonNo.setBounds(new Rectangle(buttonX, buttonY, buWidth, + buHeight)); + jButtonNo.setText("No"); // generated + jButtonNo.setFont(new Font("Tahoma", Font.PLAIN, 14)); // generated + jButtonNo.addMouseListener( + new java.awt.event.MouseAdapter() { + public void mouseClicked( + java.awt.event.MouseEvent e) { + jButtonNo_mouseClicked(); + } + }); + } + return jButtonNo; + } +} // @jve: decl-index = 0: visual-constraint = "7.10" \ No newline at end of file diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/salad/graphic/Dynamics.java b/screwdriver-3.5.6/src/main/java/it/ramecera/salad/graphic/Dynamics.java new file mode 100644 index 0000000..5fe4ddb --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/salad/graphic/Dynamics.java @@ -0,0 +1,53 @@ +// +// https://www.ramecera.it/myscrewdriver.html +// e-mail: screwdriver@ramecera.it +// +/* This program and the accompanying materials are made available under + * the terms of the Eclipse Public License v1.0 which accompanies this + * distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html */ +package it.ramecera.salad.graphic; + +import javax.swing.JLabel; +import javax.swing.JProgressBar; + +/** + *

+ * Simple union of a progress bar and 2 labels, one on the left (named + * head) and one above. + *

+ *

+ * Company: Rameceraâ„¢
+ * Creation date: 2020-06-01
+ * Last updated: 2020-06-01 + *

+ *

+ * Changes:
+ *

+ * + * @author M. Maglioni */ +public class Dynamics { + + /** the progress bar */ + public JProgressBar pb; + /** the label, generally above the progress bar */ + public JLabel left; + /** the label on the left */ + public JLabel head; + /** synchrony */ + public ProgressBarAccess access; + /** visibility */ + public boolean visibile = false; + + /** @param pb progress bar object + * @param left label above the progress bar + * @param head label to the left of the progress bar */ + public Dynamics(JProgressBar pb, JLabel left, JLabel head) { + super(); + this.pb = pb; + this.left = left; + this.head = head; + access = new ProgressBarAccess(pb.getBounds(), left.getBounds(), + head.getBounds()); + } +} diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/salad/graphic/Permission.java b/screwdriver-3.5.6/src/main/java/it/ramecera/salad/graphic/Permission.java new file mode 100644 index 0000000..58bb102 --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/salad/graphic/Permission.java @@ -0,0 +1,301 @@ +// +// https://www.ramecera.it/myscrewdriver.html +// e-mail: screwdriver@ramecera.it +// +/* This program and the accompanying materials are made available under + * the terms of the Eclipse Public License v1.0 which accompanies this + * distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html */ +package it.ramecera.salad.graphic; + +import java.awt.Color; +import java.awt.Font; +import java.awt.Frame; +import java.awt.Rectangle; + +import javax.swing.JButton; +import javax.swing.JDialog; +import javax.swing.JPanel; +import javax.swing.JTextArea; + +import it.ramecera.salad.everyday.Candies; +import it.ramecera.salad.everyday.Mix; + +/** + *

+ * Display class of a message box. It is used simply by calling: new + * Placard (component_owner, message);
+ * or: new Placard (component_owner, message, header); no method needs + * to be invoked. For other details see the constructor. + *

+ *

+ * Company: Rameceraâ„¢
+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Modifications:
+ *

+ * + * @author M. Maglioni */ +public class Permission extends JDialog { + /** pure formality */ + private static final long serialVersionUID = 1L; + /** the panel containing the whole */ + private JPanel jContentPane = null; + /** the text of the message */ + private final String dispatch; + /** the title to the message */ + private String header = "Message:"; + /* the text-area object */ + private JTextArea textArea; + private int buttonX = 250; + private int buttonY = 250; + private int jdWidth = 607; + private int jdHeight = 350; + private final int taMargin = 18; + private final int taWidth = 565; + private int taHeight = 150; + private final int buWidth = 100; + private final int buHeight = 40; + private final int jdDowelTop = 55; + private final int jdDowelRight = 15; + private final int taDowelTop = 0; + private final int charsEveryLine = 68; + private final int lineFontVerdana16Height = 22; + private final int betweenButtons = 40; + /** the affirmative button */ + private JButton jButtonYes = null; + /** the negative button */ + private JButton jButtonNo = null; + /** says if I pressed yes (true) or not (false) */ + public boolean answer; + /** says if you need to lock the "yes" button */ + private boolean lockButtonYes; + + /** + *

+ * Only public property; warns that the message has been + * forwarded. */ + public boolean reduce; + + /** + *

+ * 2 parameter constructor. + *

+ *

+ * creation: 2020-04-09
+ * last modification: 2020-04-09
+ *

+ * Changes:
+ *

+ * + * @param owner the graphic component from which the pop-up of the + * message itself is born; + * @param s may be the message to be displayed */ + public Permission(Frame owner, final String s) { + super(owner); + setFont(new Font("Verdana", Font.PLAIN, 15)); + dispatch = s; + initialize(); + } + + /** + *

+ * 3 parameter constructor. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param owner the graphic component from which the pop-up of the + * message itself is born; + * @param s the message to be displayed + * @param t the header of the message */ + public Permission(Frame owner, String s, String t) { + super(owner); + dispatch = s; + header = t; + initialize(); + } + + /** + *

+ * 1 parameter constructor. In this case, the graphic component from + * which the pop-up of the message originates is indeterminate. + *

+ *

+ * creation: 2020-04-09
+ * last modification: 2020-04-09
+ *

+ * Changes:
+ *

+ * + * @param s the message to display */ + public Permission(String s) { + super(new Frame()); + dispatch = s; + initialize(); + } + + /** ordinary initialization */ + private void initialize() { + this.setSize(jdWidth, jdHeight); + // center on the screen + this.setModal(true); + this.setLocationRelativeTo(null); + this.setTitle(header); + this.setContentPane(getJContentPane()); + jButtonYes.setEnabled(!lockButtonYes); + this.setVisible(true); + reduce = true; + } + + /** + *

+ * 4 parameter constructor. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Modifications:
+ *

+ * + * @param owner the graphic component from which the pop-up of the + * message itself originates; it can be null + * @param s the message to be displayed + * @param t the head of the box + * @param lockButtonYes if it is necessary to block the "Yes" button + * for obvious opportunity */ + public Permission(Frame owner, final String s, final String t, + final boolean lockButtonYes) { + + super(owner); + dispatch = s; + header = t; + this.lockButtonYes = lockButtonYes; + initialize(); + } + + /** This method initializes jContentPane + * + * @return javax.swing.JPanel + * @see #initialize () */ + private JPanel getJContentPane() { + if (jContentPane == null) { + jContentPane = new JPanel(); + jContentPane.setLayout(null); + jContentPane.setBackground(new Color(250, 240, 230)); + textArea = new JTextArea(); + textArea.setEditable(false); + textArea.setFont(new Font("Verdana", Font.PLAIN, 16)); + textArea.setWrapStyleWord(true); + textArea.setLineWrap(true); + textArea.setBackground(new Color(250, 240, 230)); + /* estimate of the amount of lines in the message */ + int lineQ = dispatch.length() / charsEveryLine + 1 + Mix + .charQ(dispatch, Candies.LINE_FEED); + taHeight = taDowelTop + lineQ * lineFontVerdana16Height; + textArea.setBounds(taMargin, taMargin, taWidth, taHeight); + textArea.setText(dispatch); + jdWidth = taWidth + taMargin * 2 + jdDowelRight; + jdHeight = taHeight + taMargin * 3 + buHeight + jdDowelTop; + this.setSize(jdWidth, jdHeight); + jContentPane.add(textArea); + jContentPane.add(getJButtonYes(), null); + jContentPane.add(getJButtonNo(), null); + } + return jContentPane; + } + + /** This method initializes jButton Yes + *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Modifications:
+ *

+ * + * @return javax.swing.JButton + * @see #getJContentPane () */ + private JButton getJButtonYes() { + if (jButtonYes == null) { + jButtonYes = new JButton(); + buttonX = (jdWidth - betweenButtons - buWidth * 2) / 2; + buttonY = taMargin * 2 + taHeight; + jButtonYes.setBounds(new Rectangle(buttonX, buttonY, + buWidth, buHeight)); + jButtonYes.setText("Yes"); + jButtonYes.setEnabled(true); // generated + jButtonYes.setFont(new Font("Tahoma", Font.PLAIN, 14)); + jButtonYes.addMouseListener( + new java.awt.event.MouseAdapter() { + public void mouseClicked( + java.awt.event.MouseEvent e) { + if (jButtonYes.isEnabled()) { + jButtonYes_mouseClicked(); + } + } + }); + } + return jButtonYes; + } + + /** + *

+ * I close my box. + *

+ * + * @see #getJButtonYes () */ + private void jButtonYes_mouseClicked() { + answer = true; + dispose(); + } + + /** + *

+ * I close my box. + *

+ * + * @see #getJButtonNo () */ + private void jButtonNo_mouseClicked() { + answer = false; + dispose(); + } + + /** + *

+ * This method initializes jButtonNo. + *

+ * + * @return javax.swing.JButton + * @see #getJContentPane () */ + private JButton getJButtonNo() { + if (jButtonNo == null) { + // try { + jButtonNo = new JButton(); + buttonX = (jdWidth - betweenButtons - buWidth * 2) / 2 + + buWidth + betweenButtons; + buttonY = taMargin * 2 + taHeight; + jButtonNo.setBounds(new Rectangle(buttonX, buttonY, buWidth, + buHeight)); + jButtonNo.setText("No"); // generated + jButtonNo.setFont(new Font("Tahoma", Font.PLAIN, 14)); // generated + jButtonNo.addMouseListener( + new java.awt.event.MouseAdapter() { + public void mouseClicked( + java.awt.event.MouseEvent e) { + jButtonNo_mouseClicked(); + } + }); + } + return jButtonNo; + } +} // @jve: decl-index = 0: visual-constraint = "7.10" \ No newline at end of file diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/salad/graphic/Placard.java b/screwdriver-3.5.6/src/main/java/it/ramecera/salad/graphic/Placard.java new file mode 100644 index 0000000..6481188 --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/salad/graphic/Placard.java @@ -0,0 +1,209 @@ +// +// https://www.ramecera.it/myscrewdriver.html +// e-mail: screwdriver@ramecera.it +// +/* This program and the accompanying materials are made available under + * the terms of the Eclipse Public License v1.0 which accompanies this + * distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html */ +package it.ramecera.salad.graphic; + +import java.awt.Color; +import java.awt.Font; +import java.awt.Frame; +import java.awt.Rectangle; + +import javax.swing.JButton; +import javax.swing.JDialog; +import javax.swing.JPanel; +import javax.swing.JTextArea; + +import it.ramecera.salad.everyday.Candies; +import it.ramecera.salad.everyday.Mix; + +/** + *

+ * Display class of a message box. It is used simply by calling: new + * Placard (component_owner, message);
+ * or: new Placard (component_owner, message, header); no method needs + * to be invoked. For other details see the constructor. + *

+ *

+ * Company: Rameceraâ„¢
+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ * + * @author M. Maglioni */ +public class Placard extends JDialog { + /** pure formality */ + private static final long serialVersionUID = 1L; + /** the panel containing the whole */ + private JPanel jContentPane = null; + /** the OK button */ + private JButton jButton = null; + /** the text of the message */ + private final String dispatch; + /** the title to the message */ + private String header = "Message:"; + /* the text-area object */ + private JTextArea textArea; + private int buttonX = 250; + private int buttonY = 250; + private int jdWidth = 607; + private int jdHeight = 350; + private final int taMargin = 18; + private final int taWidth = 565; + private int taHeight = 150; + private final int buWidth = 100; + private final int buHeight = 40; + private final int jdDowelTop = 55; + private final int jdDowelRight = 15; + private final int taDowelTop = 0; + private final int charsEveryLine = 68; + private final int lineFontVerdana16Height = 22; + + /** + *

+ * Only public property; warns that the message has been + * forwarded. */ + public boolean reduce; + + /** + *

+ * 2 parameter constructor. + *

+ *

+ * creation: 2020-04-09
+ * last modification: 2020-04-09
+ *

+ * Changes:
+ *

+ * + * @param owner the graphic component from which the pop-up of the + * message itself is born; + * @param s may be the message to be displayed */ + public Placard(Frame owner, final String s) { + super(owner); + setFont(new Font("Verdana", Font.PLAIN, 15)); + dispatch = s; + initialize(); + } + + /** + *

+ * 3 parameter constructor. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param owner the graphic component from which the pop-up of the + * message itself is born; + * @param s the message to be displayed + * @param t the header of the message */ + public Placard(Frame owner, String s, String t) { + super(owner); + dispatch = s; + header = t; + initialize(); + } + + /** + *

+ * 1 parameter constructor. In this case, the graphic component from + * which the pop-up of the message originates is indeterminate. + *

+ *

+ * creation: 2020-04-09
+ * last modification: 2020-04-09
+ *

+ * Changes:
+ *

+ * + * @param s the message to display */ + public Placard(String s) { + super(new Frame()); + dispatch = s; + initialize(); + } + + /** ordinary initialization */ + private void initialize() { + this.setSize(jdWidth, jdHeight); + // center on the screen + this.setModal(true); + this.setLocationRelativeTo(null); + this.setTitle(header); + this.setContentPane(getJContentPane()); + this.setVisible(true); + reduce = true; + } + + /** This method initializes jContentPane + * + * @return javax.swing.JPanel + * @see #initialize () */ + private JPanel getJContentPane() { + if (jContentPane == null) { + jContentPane = new JPanel(); + jContentPane.setLayout(null); + jContentPane.setBackground(new Color(250, 240, 230)); + textArea = new JTextArea(); + textArea.setEditable(false); + textArea.setFont(new Font("Verdana", Font.PLAIN, 16)); + textArea.setWrapStyleWord(true); + textArea.setLineWrap(true); + textArea.setBackground(new Color(250, 240, 230)); + /* estimate of the amount of lines in the message */ + int lineQ = dispatch.length() / charsEveryLine + 1 + Mix + .charQ(dispatch, Candies.LINE_FEED); + taHeight = taDowelTop + lineQ * lineFontVerdana16Height; + textArea.setBounds(taMargin, taMargin, taWidth, taHeight); + textArea.setText(dispatch); + jdWidth = taWidth + taMargin * 2 + jdDowelRight; + jdHeight = taHeight + taMargin * 3 + buHeight + jdDowelTop; + this.setSize(jdWidth, jdHeight); + jContentPane.add(textArea); + jContentPane.add(getJButton(), null); + } + return jContentPane; + } + + /** This method initializes jButton + * + * @return javax.swing.JButton + * @see #getJContentPane () */ + private JButton getJButton() { + if (jButton == null) { + jButton = new JButton(); + buttonX = (jdWidth - buWidth) / 2; + buttonY = taMargin * 2 + taHeight; + jButton.setBounds(new Rectangle(buttonX, buttonY, buWidth, + buHeight)); + jButton.setText("OK"); + jButton.setFont(new Font("Arial", Font.PLAIN, 16)); + jButton.addMouseListener(new java.awt.event.MouseAdapter() { + @Override + public void mouseClicked(java.awt.event.MouseEvent e) { + jButton_mouseClicked(); + } + }); + } + return jButton; + } + + /** + *

+ * I close the box. + *

+ * + * @see #getJButton */ + private void jButton_mouseClicked() { + dispose(); + } +} // @jve: decl-index = 0: visual-constraint = "7.10" \ No newline at end of file diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/salad/graphic/ProgressBarAccess.java b/screwdriver-3.5.6/src/main/java/it/ramecera/salad/graphic/ProgressBarAccess.java new file mode 100644 index 0000000..81a353d --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/salad/graphic/ProgressBarAccess.java @@ -0,0 +1,69 @@ +// +// https://www.ramecera.it/myscrewdriver.html +// e-mail: screwdriver@ramecera.it +// +/* This program and the accompanying materials are made available under + * the terms of the Eclipse Public License v1.0 which accompanies this + * distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html */ +package it.ramecera.salad.graphic; + +import java.awt.Rectangle; + +/** + *

+ * Simple container of 2 auxiliary rectangles for the management of the + * progress bars. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ * 2020-04-09: stabilization on ver. 1.0.0
+ *

+ * + * @author M. Maglioni */ + +public class ProgressBarAccess { + /** rectangle for managing the progress bar */ + public Rectangle bar = new Rectangle(); + /** rectangle for label management */ + public Rectangle sinistra = new Rectangle(); + /** rectangle for label management on the left of the bar */ + public Rectangle testa = new Rectangle(); + + /** useful constructor + * + * @param barx the rectangle for the progress bar + * @param leftx the rectangle for the label + * @param testax the rectangle for the label to the left of the + * bar */ + public ProgressBarAccess(Rectangle barx, Rectangle leftx, + Rectangle testax) { + bar = barx; + sinistra = leftx; + testa = testax; + bar.x = 0; + bar.y = 0; + sinistra.x = 0; + sinistra.y = 0; + testa.x = 0; + testa.y = 0; + } + + /** useful constructor + * + * @param barx the rectangle for the progress bar + * @param leftx the rectangle for the label on the left of the + * bar */ + public ProgressBarAccess(Rectangle barx, Rectangle leftx) { + bar = barx; + sinistra = leftx; + bar.x = 0; + bar.y = 0; + sinistra.x = 0; + sinistra.y = 0; + } +} diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/salad/graphic/Remember.java b/screwdriver-3.5.6/src/main/java/it/ramecera/salad/graphic/Remember.java new file mode 100644 index 0000000..fdf3ec8 --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/salad/graphic/Remember.java @@ -0,0 +1,326 @@ +// +// https://www.ramecera.it/myscrewdriver.html +// e-mail: screwdriver@ramecera.it +// +/* This program and the accompanying materials are made available under + * the terms of the Eclipse Public License v1.0 which accompanies this + * distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html */ +package it.ramecera.salad.graphic; + +import java.awt.Color; +import java.awt.Font; +import java.awt.Frame; +import java.awt.Rectangle; + +import javax.swing.JButton; +import javax.swing.JDialog; +import javax.swing.JPanel; +import javax.swing.JTextArea; + +import it.ramecera.salad.everyday.Candies; +import it.ramecera.salad.everyday.Mix; +import javax.swing.JCheckBox; +import javax.swing.event.ChangeListener; +import javax.swing.event.ChangeEvent; + +/** + *

+ * Display class of a message box. It is used simply by calling: new + * Placard (component_owner, message);
+ * or: new Placard (component_owner, message, header); no method needs + * to be invoked. For other details see the constructor. + *

+ *

+ * Company: Rameceraâ„¢
+ * Creation date: 2020-04-09
+ * Last updated: 2020-09-10 + *

+ *

+ * Modifications:
+ *

+ * + * @author M. Maglioni */ +public class Remember extends JDialog { + /** pure formality */ + private static final long serialVersionUID = 1L; + /** the panel containing the whole */ + private JPanel jContentPane = null; + /** the text of the message */ + private final String dispatch; + /** the title to the message */ + private String header = "Message:"; + /* the text-area object */ + private JTextArea textArea; + private int buttonX = 250; + private int buttonY = 250; + private int jdWidth = 607; + private int jdHeight = 350; + private final int taMargin = 18; + private final int taWidth = 565; + private int taHeight = 150; + private final int buWidth = 100; + private final int buHeight = 40; + private final int checkX = 20; + private int checkY = 100; + private final int chWidth = 120; + private final int chHeight = 20; + private final int jdDowelTop = 55; + private final int jdDowelRight = 15; + private final int taDowelTop = 0; + private final int charsEveryLine = 68; + private final int lineFontVerdana16Height = 22; + private final int betweenButtons = 40; + /** the affirmative button */ + private JButton jButtonYes = null; + /** the negative button */ + private JButton jButtonNo = null; + /** says if you need to lock the "yes" button */ + private boolean lockButtonYes; + /** check-box Remember */ + private JCheckBox chckbxNewCheckBox; + // PUBLIC + /** says if I pressed yes (true) or not (false) */ + public boolean[] answer = { false, false }; + + /** + *

+ * Only public property; warns that the message has been + * forwarded. */ + public boolean reduce; + + /** + *

+ * 2 parameter constructor. + *

+ *

+ * creation: 2020-04-09
+ * last modification: 2020-04-09
+ *

+ * Changes:
+ *

+ * + * @param owner the graphic component from which the pop-up of the + * message itself is born; + * @param s may be the message to be displayed + * @wbp.parser.constructor */ + public Remember(Frame owner, final String s) { + super(owner); + setFont(new Font("Verdana", Font.PLAIN, 15)); + dispatch = s; + initialize(); + } + + /** + *

+ * 3 parameter constructor. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Changes:
+ *

+ * + * @param owner the graphic component from which the pop-up of the + * message itself is born; + * @param s the message to be displayed + * @param t the header of the message */ + public Remember(Frame owner, String s, String t) { + super(owner); + dispatch = s; + header = t; + initialize(); + } + + /** + *

+ * 1 parameter constructor. In this case, the graphic component from + * which the pop-up of the message originates is indeterminate. + *

+ *

+ * creation: 2020-04-09
+ * last modification: 2020-04-09
+ *

+ * Changes:
+ *

+ * + * @param s the message to display */ + public Remember(String s) { + super(new Frame()); + dispatch = s; + initialize(); + } + + /** ordinary initialization */ + private void initialize() { + this.setSize(jdWidth, jdHeight); + // center on the screen + this.setModal(true); + this.setLocationRelativeTo(null); + this.setTitle(header); + this.setContentPane(getJContentPane()); + jButtonYes.setEnabled(!lockButtonYes); + this.setVisible(true); + reduce = true; + } + + /** + *

+ * 4 parameter constructor. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Modifications:
+ *

+ * + * @param owner the graphic component from which the pop-up of the + * message itself originates; it can be null + * @param s the message to be displayed + * @param t the head of the box + * @param lockButtonYes if it is necessary to block the "Yes" button + * for obvious opportunity */ + public Remember(Frame owner, final String s, final String t, + final boolean lockButtonYes) { + + super(owner); + dispatch = s; + header = t; + this.lockButtonYes = lockButtonYes; + initialize(); + } + + /** This method initializes jContentPane + * + * @return javax.swing.JPanel + * @see #initialize () */ + private JPanel getJContentPane() { + if (jContentPane == null) { + jContentPane = new JPanel(); + jContentPane.setLayout(null); + jContentPane.setBackground(new Color(250, 240, 230)); + textArea = new JTextArea(); + textArea.setEditable(false); + textArea.setFont(new Font("Verdana", Font.PLAIN, 16)); + textArea.setWrapStyleWord(true); + textArea.setLineWrap(true); + textArea.setBackground(new Color(250, 240, 230)); + /* estimate of the amount of lines in the message */ + int lineQ = dispatch.length() / charsEveryLine + 1 + Mix + .charQ(dispatch, Candies.LINE_FEED); + taHeight = taDowelTop + lineQ * lineFontVerdana16Height; + textArea.setBounds(taMargin, taMargin, taWidth, taHeight); + textArea.setText(dispatch); + jdWidth = taWidth + taMargin * 2 + jdDowelRight; + jdHeight = taHeight + taMargin * 3 + buHeight + jdDowelTop; + this.setSize(jdWidth, jdHeight); + jContentPane.add(textArea); + jContentPane.add(getJButtonYes(), null); + jContentPane.add(getJButtonNo(), null); + + chckbxNewCheckBox = new JCheckBox("Remember"); + chckbxNewCheckBox.addChangeListener(new ChangeListener() { + public void stateChanged(ChangeEvent e) { + answer[1] = chckbxNewCheckBox.isSelected(); + } + }); + chckbxNewCheckBox.setFont(new Font("Verdana", Font.PLAIN, + 12)); + chckbxNewCheckBox.setToolTipText("Please ask me no more"); + checkY = taMargin * 2 + taHeight + buHeight / 3; + chckbxNewCheckBox.setBounds(checkX, checkY, chWidth, + chHeight); + jContentPane.add(chckbxNewCheckBox); + } + return jContentPane; + } + + /** This method initializes jButton Yes + *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Modifications:
+ *

+ * + * @return javax.swing.JButton + * @see #getJContentPane () */ + private JButton getJButtonYes() { + if (jButtonYes == null) { + jButtonYes = new JButton(); + buttonX = (jdWidth - betweenButtons - buWidth * 2) / 2; + buttonY = taMargin * 2 + taHeight; + jButtonYes.setBounds(new Rectangle(buttonX, buttonY, + buWidth, buHeight)); + jButtonYes.setText("Yes"); + jButtonYes.setEnabled(true); // generated + jButtonYes.setFont(new Font("Tahoma", Font.PLAIN, 14)); + jButtonYes.addMouseListener( + new java.awt.event.MouseAdapter() { + public void mouseClicked( + java.awt.event.MouseEvent e) { + if (jButtonYes.isEnabled()) { + jButtonYes_mouseClicked(); + } + } + }); + } + return jButtonYes; + } + + /** + *

+ * I close my box. + *

+ * + * @see #getJButtonYes () */ + private void jButtonYes_mouseClicked() { + answer[0] = true; + dispose(); + } + + /** + *

+ * I close my box. + *

+ * + * @see #getJButtonNo () */ + private void jButtonNo_mouseClicked() { + answer[0] = false; + dispose(); + } + + /** + *

+ * This method initializes jButtonNo. + *

+ * + * @return javax.swing.JButton + * @see #getJContentPane () */ + private JButton getJButtonNo() { + if (jButtonNo == null) { + // try { + jButtonNo = new JButton(); + buttonX = (jdWidth - betweenButtons - buWidth * 2) / 2 + + buWidth + betweenButtons; + buttonY = taMargin * 2 + taHeight; + jButtonNo.setBounds(new Rectangle(buttonX, buttonY, buWidth, + buHeight)); + jButtonNo.setText("No"); // generated + jButtonNo.setFont(new Font("Tahoma", Font.PLAIN, 14)); // generated + jButtonNo.addMouseListener( + new java.awt.event.MouseAdapter() { + public void mouseClicked( + java.awt.event.MouseEvent e) { + jButtonNo_mouseClicked(); + } + }); + } + return jButtonNo; + } +} // @jve: decl-index = 0: visual-constraint = "7.10" \ No newline at end of file diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/CandyScrew.java b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/CandyScrew.java new file mode 100644 index 0000000..c77d42b --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/CandyScrew.java @@ -0,0 +1,216 @@ +// +// https://www.ramecera.it/myscrewdriver.html +// e-mail: screwdriver@ramecera.it +// +/* This program and the accompanying materials are made available under + * the terms of the Eclipse Public License v1.0 which accompanies this + * distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html */ +package it.ramecera.screwdriver; + +import java.io.File; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; +import java.util.Properties; + +import it.ramecera.salad.everyday.Candies; +import it.ramecera.salad.everyday.ExactException; +import it.ramecera.salad.everyday.Mix; +import it.ramecera.salad.everyday.StartingOperations; + +/** + *

+ * Treatment of property data. This data is conventionally called + * candies. + *

+ *

+ * Creation date: 2020-04-09
+ * modification date: 2020-04-09
+ * Company: Rameceraâ„¢ + *

+ *

+ * Modifications:
+ *

+ * + * @author M. Maglioni */ +final public class CandyScrew implements Candies { + + /** application name */ + public String appName; + /** ELE file */ + public String ele; + /** input files */ + public File inputG; + /** input directory */ + public String inputYS; + /** input directory */ + public File inputY; + /** output directory */ + public String outputYS; + /** output directory, as a file */ + public File outputY; + /** box directory, contains everything you need to work */ + public String boxYS = "box"; + /** box directory, as a file */ + public File boxY; + /** include directory */ + public String includeYS; + /** include directory, as a file */ + public File includeY; + /** snippets directory */ + public String snippetsYS; + /** snippets directory, as a file */ + public File snippetsY; + /** if I encode the methods already in the .ele file */ + public boolean inside; + /** name of a file that must not be modified at all */ + public String freezeS; + /** the names of the files that must not be changed at all */ + public List freezeE = new ArrayList(); + /** the names of the files that must not be changed at all */ + public List freezeDueE = new ArrayList(); + /** the names of the files that need to be changed, however asking + * for permission */ + // public List bullDozerE = new ArrayList (); + + /** the list of properties */ + public Properties properties; + + /** + *

+ * Reads the properties file. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-09-24
+ *

+ *

+ * Modifications:
+ *

+ * + * @param fileProperties name of properties file + * + * @throws ExactException objects if the data contained in the + * properties file is incorrect */ + public void readProperties(String fileProperties) + + throws ExactException { + + String prop = fileProperties + ".properties"; + Path pp = new File(prop).toPath(); + if (!Files.exists(pp)) { + throw new ExactException("The file " + Mix.dress_A(prop) + + " does not exist.", 1400, this.getClass() + .getName(), ""); + } else if (Files.isDirectory(pp)) { + throw new ExactException("The file " + Mix.dress_A(prop) + + " is not actually a directory.", 1401, this + .getClass().getName(), ""); + } + properties = StartingOperations.myProperties(prop, true); + inputYS = StartingOperations.whetherPresent(properties, + Cst.DIRE_INPUT); + inputY = new File(inputYS); + if (!inputY.exists()) { + throw new ExactException("The directory «" + inputYS + + "» does not exist.", 1400, this.getClass() + .getName(), ""); + } else if (!inputY.isDirectory()) { + throw new ExactException("The directory «" + inputYS + + "» is not actually a directory.", 1401, this + .getClass().getName(), ""); + } + inputYS = Mix.dress_CU(inputYS); + inputG = new File(inputYS + ele); + if (!inputG.exists()) { + throw new ExactException("The file «" + ele + + "» does not exist.", 1402, this.getClass() + .getName(), ""); + } else if (!inputG.isFile()) { + throw new ExactException("The file «" + appName + + "» non è in realtà un file.", 1403, this + .getClass().getName(), ""); + } + outputYS = StartingOperations.whetherPresent(properties, + Cst.DIR_OUTPUT); + outputY = new File(outputYS); + if (!outputY.exists()) { + throw new ExactException("The directory «" + outputY + + "» does not exist.", 1404, this.getClass() + .getName(), ""); + } else if (!outputY.isDirectory()) { + throw new ExactException("The directory «" + outputYS + + "» is not actually a directory.", 1405, this + .getClass().getName(), ""); + } + outputYS = Mix.dress_CU(outputYS); + boxYS = "box"; + boxY = new File(inputYS + boxYS); + if (!boxY.exists()) { + throw new ExactException("The directory «" + boxY + + "» does not exist.", 1408, this.getClass() + .getName(), ""); + } else if (!boxY.isDirectory()) { + throw new ExactException("The directory «" + boxYS + + "» is not actually a directory.", 1409, this + .getClass().getName(), ""); + } + boxYS = Mix.dress_CU(boxYS); + includeYS = boxYS + "include/"; + includeY = new File(includeYS); + snippetsYS = boxYS + "snippets/"; + snippetsY = new File(snippetsYS); + inside = StartingOperations.propertyPresenteBoolean(properties, + Cst.INSIDE); + freezeS = properties.getProperty(Cst.FREEZE); + if (freezeS != null) { + String[] fE = null; + fE = freezeS.split("\\x2c"); // x2c is the comma + for (int i = 0; i < fE.length; i++) { + freezeE.add(fE[i].trim()); + } + } + } + + /** + *

+ * Reads the properties file. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09
+ *

+ *

+ * Modifications:
+ *

+ * + * @return the total string produced */ + @Override + public String toString() { + String s = ""; + s += Candies.LF + Candies.LF; + s += Cst.CUT0; + s += "DATA PRESENT IN PROPERTIES, INCLUDING THE DERIVATIVE ONES" + + Candies.LF; + s += Cst.CUT0; + s += "input file, only the file name: " + appName + Candies.LF; + s += "input file: " + inputG.getPath() + Candies.LF; + ; + s += "input directory: " + inputYS + Candies.LF; + s += "input directory, as file: " + inputY.getPath() + + Candies.LF; + s += "output directory: " + outputYS + Candies.LF; + s += "output directory, as file: " + outputY.getPath() + + Candies.LF; + s += "include directory: " + includeYS + Candies.LF; + s += "include directory, as file: " + includeY.getPath() + + Candies.LF; + s += "snippets directory: " + snippetsYS + Candies.LF; + s += "snippets directory, as file: " + snippetsY.getPath() + + Candies.LF; + s += Candies.LF; + return s; + } +} diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/Cst.java b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/Cst.java new file mode 100644 index 0000000..94c1673 --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/Cst.java @@ -0,0 +1,112 @@ +// +// https://www.ramecera.it/myscrewdriver.html +// e-mail: screwdriver@ramecera.it +// +/* This program and the accompanying materials are made available under + * the terms of the Eclipse Public License v1.0 which accompanies this + * distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html */ +package it.ramecera.screwdriver; + +import it.ramecera.salad.everyday.Candies; +import it.ramecera.salad.everyday.Mix; + +/** + *

+ * List of constants. + *

+ *

+ * Creation date: 2020-04-09
+ * modification date: 2020-06-03
+ * Company: Rameceraâ„¢ + *

+ *

+ * Modifications:
+ *

+ * + * @author M. Maglioni */ +final public class Cst { + /** property label */ + public static final String FILE_INPUT = "input file"; + /** property label */ + public static final String DIRE_INPUT = "input_directory"; + /** property label */ + public static final String DIR_OUTPUT = "output_directory"; + // VARIOUS + /** label for DB tables */ + public static final String RAIL = "rail"; + /** label for DB tables */ + public static final String RAILU = Mix.uppercaseFirstChar(RAIL); + /** label for DB tables */ + public static final String IRAILU = "I" + RAILU; + /** type of JSP */ + public static final int PLAIN = 0; + /** type of JSP */ + public static final String PLAINU = "Plain"; + /** type of JSP */ + public static final String PLAINX = "plain"; + /** type of JSP */ + public static final int MESSAGE = 9; + /** type of JSP */ + public static final int FORM = 1; + /** type of JSP */ + public static final String FORMX = "form"; + /** type of JSP */ + public static final String FORMU = "Form"; + /** type of JSP */ + public static final int MODEL = 2; + /** type of JSP */ + public static final String MODELX = "model"; + /** type of JSP */ + public static final String MODELU = "Model"; + /** control type */ + public static final String TEXT_BOX = "text box"; + /** control type */ + public static final String TEXT_AREA = "text area"; + /** control type */ + public static final String CHECK_BOX = "check box"; + /** control type */ + public static final String LIST_BOX = "list box"; + /** control type */ + public static final String RADIO_BUTTON = "radio button"; + /** control type list */ + public static final String[] controlE = { Cst.TEXT_BOX, + Cst.TEXT_AREA, Cst.CHECK_BOX, Cst.LIST_BOX, + Cst.RADIO_BUTTON }; + /** type of JSP */ + public static final String JX[] = { Cst.PLAINX, Cst.FORMX, + Cst.MODELX }; + /** type of JSP */ + public static final String JU[] = { Cst.PLAINU, Cst.FORMU, + Cst.MODELU }; + /** type of LDAP server */ + public static final String APACHE_DIRECTORY_SERVER = "ApacheDS"; + /** cut n. 0 */ + public static final String CUT0 = "----------------------------------------------------" + + Candies.LF; + /** cut n. 1 */ + public static final String CUT1 = "............................................" + + Candies.LF; + /** cut n. 2 */ + public static final String CUT2 = " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" + + Candies.LF; + /** cut n. 2 */ + public static final String CUT3 = " ****************************************************" + + Candies.LF; + /** list of JSP types */ + public static final String[] TIPO_JSPE = { PLAINU, FORMU, MODELU }; + /** if I encode the methods inside the .ele file */ + public static final String INSIDE = "inside"; + /** if I encode the methods inside the .ele file */ + public static final String FREEZE = "freeze"; + // CONSTANTS + /** constant to enter code manually */ + public static final String KNIFE = "screwdriver_knife"; + /** constant to enter code manually */ + public static final String LOWER = "screwdriver_lower"; + /** constant to enter code manually */ + public static final String UPPER = "screwdriver_upper"; + /** magic strings */ + public static final String MAGIC0 = "XXXSCREWXXX"; + +} diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/ElementaryFile.java b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/ElementaryFile.java new file mode 100644 index 0000000..d00250f --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/ElementaryFile.java @@ -0,0 +1,2397 @@ +// +// https://www.ramecera.it/myscrewdriver.html +// e-mail: screwdriver@ramecera.it +// +/* This program and the accompanying materials are made available under + * the terms of the Eclipse Public License v1.0 which accompanies this + * distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html */ +package it.ramecera.screwdriver; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Date; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; + +import org.apache.log4j.Logger; +import org.w3c.dom.Document; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.SAXException; + +import it.ramecera.salad.everyday.Candies; +import it.ramecera.salad.everyday.ExactException; +import it.ramecera.salad.everyday.Mix; +import it.ramecera.salad.everyday.Strings; +import it.ramecera.salad.file.Abacus; +import it.ramecera.salad.file.Equipment; +import it.ramecera.salad.file.Folder; +import it.ramecera.salad.file.ReadMyFile; +import it.ramecera.salad.graphic.AskForDelete; +import it.ramecera.screwdriver.component.Base_jsp; +import it.ramecera.screwdriver.component.Bootstrap_css; +import it.ramecera.screwdriver.component.ControllerBelong_java; +import it.ramecera.screwdriver.component.Dispatcher_xml; +import it.ramecera.screwdriver.component.FileComponent; +import it.ramecera.screwdriver.component.GenericModel_java; +import it.ramecera.screwdriver.component.Hoof; +import it.ramecera.screwdriver.component.ImplementTabellaService_java; +import it.ramecera.screwdriver.component.ImplementTableDao_java; +import it.ramecera.screwdriver.component.InterfaceTabellaService_java; +import it.ramecera.screwdriver.component.InterfaceTableDao_java; +import it.ramecera.screwdriver.component.JspFormImpl_java; +import it.ramecera.screwdriver.component.JspForm_java; +import it.ramecera.screwdriver.component.JspPlainImpl_java; +import it.ramecera.screwdriver.component.JspPlain_java; +import it.ramecera.screwdriver.component.Navigation_jsp; +import it.ramecera.screwdriver.component.Orm_xml; +import it.ramecera.screwdriver.component.Pom_properties; +import it.ramecera.screwdriver.component.Pom_xml; +import it.ramecera.screwdriver.component.Quartz_job_xml; +import it.ramecera.screwdriver.component.Screwdriver_css; +import it.ramecera.screwdriver.component.Screwdriver_cssC; +import it.ramecera.screwdriver.component.Service_xml; +import it.ramecera.screwdriver.component.SpringProperties_xml; +import it.ramecera.screwdriver.component.SpringSecurity_xml; +import it.ramecera.screwdriver.component.Tiles_xml; +import it.ramecera.screwdriver.component.UserAuthenticationProvider_java; +import it.ramecera.screwdriver.component.UserContextImpl_java; +import it.ramecera.screwdriver.component.Web_xml; +import it.ramecera.screwdriver.component.Webflow_xml; +import it.ramecera.screwdriver.outfits.ControllerBelong; +import it.ramecera.screwdriver.outfits.DBPlaceKit; +import it.ramecera.screwdriver.outfits.JspBeanElement; +import it.ramecera.screwdriver.outfits.JspKit; +import it.ramecera.screwdriver.outfits.MenuKit; +import it.ramecera.screwdriver.outfits.RequestMap; +import it.ramecera.screwdriver.outfits.TableOutfit; +import it.ramecera.screwdriver.utilities.ValidConstScrew; + +/** + *

+ * The jspType ele file object. + *

+ *

+ * Company: Rameceraâ„¢
+ * Creation date: 2020-04-09
+ * modification date: 2020-09-15
+ *

+ *

+ * History:
+ * The description of N# is in project plan report
+ * 2020-09-03 implementation of N3
+ * 2020-09-09 implementation of N8
+ *

+ * + * @author M. Maglioni */ + +final public class ElementaryFile { + + // PUBLIC + + /** the list of available markups */ + public HashMap markupE; + /** external properties */ + public CandyScrew candies; + /** list of trains */ + public List trainE = new ArrayList(); + /** application name according to Maven, is also the 3rd qualifier + * of the package after the company's internet domain (e.g. + * it.ramecera) */ + public String appName; + + // PRIVATE + + /** number of lines in the elementary file */ + private int zQ; + /** the stub of the row */ + private String stub = null; + private int posizioneVisiva = 1; + private Train train; + private String securityY = null, newLdap = null, newResolver = null, + newAnnotation = null, recycleBinY = null; + private String new5 = null, new58 = null, new581 = null, + new582 = null, new583 = null, new60 = null, new61 = null, + new62 = null, new63 = null, new71 = null, new72 = null, + new73 = null, new721 = null, new722 = null, new723 = null; + private String new513 = null, brickAuthenticationY = null, + brickAuthenticationAuthorityY = null, new515 = null, + new516 = null, new518 = null, new519 = null, domainY = null; + private Skill skill; + private Train ultimaJsp; + private JspKit kitLastJsp = null; + private Train lastDeclaredMenu; + private String stat = ""; + + // COMPONENTS + + private FileComponent genericRailDaoImpl; + private FileComponent service_xml; + private FileComponent orm_xml; + private FileComponent web_xml; + private FileComponent pom_properties; + private FileComponent quartz_job_xml; + private FileComponent webflow_xml; + private FileComponent pom_xml; + private FileComponent springProps_xml; + private FileComponent springSecurity_xml; + private FileComponent dispatcher_xml; + private FileComponent baseJsp; + private FileComponent headerJsp; + private FileComponent footerJsp; + private FileComponent quartzJob_java; + private FileComponent quartzTask_java; + private FileComponent quartzTaskImpl_java; + private FileComponent tiles_xml; + private FileComponent doorControllerBelong_java; + private FileComponent genericCrud_java; + private FileComponent controllerBelong_java; + private FileComponent jspForm_java; + private FileComponent jspFormImpl_java; + private FileComponent userAuthenticationProvider_java; + private FileComponent jspPlain_java; + private FileComponent jspPlainImpl_java; + private FileComponent genericModel_java; + private FileComponent bootstrap_css; + private FileComponent screwdriver_css; + private FileComponent screwdriver_cssC; + private FileComponent[] navigation_jsps; + private FileComponent springSecurityUserContext; + private FileComponent userAuthorityUtils; + private FileComponent interfacciaUserContext; + private FileComponent king; + private FileComponent kingDao; + private FileComponent kingDaoImpl; + private FileComponent userContextImpl; + + private static final String sep = System.getProperty( + "file.separator"); + /** ordinary logger */ + private static final Logger logger = Logger.getLogger( + ElementaryFile.class); + + // CONSTANTS + + // CONSTRUCTORS + + /** + *

+ * The markups list is forfeited with this constructor. + *

+ * + * @param markupE list of available markup + * @param candies external properties */ + public ElementaryFile(HashMap markupE, + CandyScrew candies) { + this.markupE = markupE; + this.candies = candies; + } + + // PUBLIC METHODS + + /** + *

+ * Reading and accommodation of all markups. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Modifications:
+ *

+ * + * @param inputY input directory + * @param inputF input file for conversion + * @param includeY directory containing the files include + * @throws ExactException exception specified by a numeric code */ + final public void trainFactory(final String inputY, + final String inputF, final String includeY) + + throws ExactException { + + List zebra; + ExactException ne = new ExactException(); + try { + zebra = ReadMyFile.zebra_A(inputY + inputF); + int zebraQ = zebra.size(); + if (zebraQ == 0) { + ne.code = 1703; + ne.datum = "The file " + Mix.dress_A(inputF) + + " is empty."; + ne.className = this.getClass().getName(); + throw ne; + } + trainE = composeTrains(zebra, includeY); + logger.trace(trainE_toString(trainE, markupE)); + logger.trace(Hammer.markupE_toString(markupE)); + } catch (IOException e) { + ne.code = 1704; + ne.datum = "Error acceding file " + Mix.dress_A(inputF) + + "."; + ne.className = this.getClass().getName(); + throw ne; + } + } + + /** + *

+ * To convert a train sequence into a maven-spring application. + *

+ *

+ * Company: Rameceraâ„¢
+ * Creation date: 2020-04-09
+ * Last updated: 2020-09-15 + *

+ *

+ * History:
+ * The description of N# is in project plan report.
+ * 2020-09-14 implementation of N16.
+ *

+ * + * @throws ExactException exception specified by a numeric code + * @throws FileNotFoundException a standard exception + * @throws IOException a standard exception */ + final public void convert() + + throws ExactException, FileNotFoundException, IOException { + + skill = new Skill(candies); + String initial = candies.outputYS + appName + "/src/main/java"; + File myApp = new File(initial); + if (myApp.exists()) { + Folder folder = new Folder(); + skill.initialDirE = folder.dirImmersion(initial, ".+"); + } + logger.trace(Candies.LF + "INITIAL DIRECTORIES"); + for (String s : skill.initialDirE) { + logger.debug(s); + } + /* FUTURE RELEASE N6 */ + // if (markupE.get("hddl").occorrenzaE.size() == 1) { + // skill.ddl = (String[]) markupE.get("hddl").occorrenzaE.get( + // 0).locomotor.substance; + // } + @SuppressWarnings("unused") + boolean done = false; + skill.factory_A(markupE, trainE, candies); + recycleBinY = candies.boxYS + "recycleBin"; + File recycleBin = new File(recycleBinY); + directoriesFactory_B(); + componentsInstanceExecution(); + pom_xml.directory(markupE); + fileModelPositions(); + + /* THE NECESSARY DIRECTORIES */ + genericModel_java.directory(markupE); + webflow_xml.directory(markupE); + controllerBelong_java.directory(markupE); + /* add Notice.java */ + FileComponent.addClass("Notice.java", + skill.javaWebModelUtilityY, "Notice.java", candies, + recycleBinY, skill, -1, markupE, "java"); + if (skill.antiSamy) { + FileComponent.addClass("CrossSiteScriptingFilter.java", + new513, "CrossSiteScriptingFilter.java", candies, + recycleBinY, skill, -1, markupE, "java"); + FileComponent.addClass("JsessionIdRemoveFilter.java", + new513, "JsessionIdRemoveFilter.java", candies, + recycleBinY, skill, -1, markupE, "java"); + FileComponent.addClass("HttpRequestWrapper.java", new519, + "HttpRequestWrapper.java", candies, recycleBinY, + skill, -1, markupE, "java"); + FileComponent.addClass("AntiSamyListener.java", new515, + "AntiSamyListener.java", candies, recycleBinY, + skill, -1, markupE, "java"); + FileComponent.addClass("XssSanitizer.java", new518, + "XssSanitizer.java", candies, recycleBinY, skill, + -1, markupE, "java"); + FileComponent.addFile("policy.xml", "policy.xml", new518, + candies, recycleBinY, skill); + } else { + new File(new513 + "/" + "CrossSiteScriptingFilter.java") + .delete(); + new File(new513 + "/" + "JsessionIdRemoveFilter.java") + .delete(); + new File(new519 + "/" + "HttpRequestWrapper.java").delete(); + new File(new515 + "/" + "AntiSamyListener.java").delete(); + /* I don't want antisamy, so the web / sanitizer directory + * should be deleted */ + if (new File(new518).exists()) { + Abacus.destroyDirectory(new518); + done = new File(new518).delete(); + } + } + if (skill.ldap) { + FileComponent.addFile("security-ldap-explicitly.xml", + "security-ldap-explicitly.xml", new71, candies, + recycleBinY, skill); + } else { + new File(new71 + "/" + "security-ldap-explicitly.xml") + .delete(); + } + + /* THE SUMMARY */ + + // BASEJSP - 1st LOOP ON JSP + + logger.trace(Candies.LF + Cst.CUT0 + "1° LOOP OVER JSP" + + Candies.LF + Cst.CUT0); + for (int i = 0; i < markupE.get("jsp").recurrenceE + .size(); i++) { + Train f = markupE.get("jsp").recurrenceE.get(i); + baseJsp.jspKit = ((JspKit) f.locomotor.substance); + baseJsp.jspKit.classeCss = f.wagonE.get("cssclass").text; + logger.trace(baseJsp.jspKit.toString()); + + // FORM + /* if there are graphic controls the JSP type is 1 (form), + * otherwise it takes the type of the first request map */ + if (baseJsp.jspKit.controlE.size() > 0) { + baseJsp.jspKit.jspType = Cst.FORM; + } else if (baseJsp.jspKit.requestMapE.size() == 0) { + baseJsp.jspKit.jspType = Cst.MESSAGE; + } else { + baseJsp.jspKit.jspType = baseJsp.jspKit.requestMapE.get( + 0).tipo; + } + if (baseJsp.jspKit.crud + & baseJsp.jspKit.jspType != Cst.FORM) { + ExactException ne = new ExactException(); + String messaggio = "Per la JSP «" + f.locomotor.text + + "» si dichiara il CRUD, ma non è un form;" + + " occorre specificare i tag formX+."; + ne.code = 1709; + ne.datum = messaggio; + ne.className = this.getClass().getName(); + throw ne; + } + // BELONG + Wagon v = f.wagonE.get("belong"); + if (v != null) { + // x2c is the comma + String[] partecipaE = v.text.split("\\x2c"); + for (String p : partecipaE) { + int m = 0; + p = p.trim(); + List propertyE = baseJsp.jspKit.stringPropertyE; + for (; m < propertyE.size(); m++) { + if (p.equals(propertyE.get(m).name)) { + break; + } + } + if (m == propertyE.size()) { + /* if I haven't found it among the ordinary + * properties, then I look for it among the + * array properties */ + List propertiesArrayE = baseJsp.jspKit.arrayStringPropertyE; + int mm = 0; + for (; mm < propertiesArrayE.size(); mm++) { + if (p.equals(propertiesArrayE.get( + mm).name)) { + break; + } + } + if (mm == propertiesArrayE.size()) { + ExactException ne = new ExactException(); + String messaggio = "For the JSP «" + Mix + .dress_A(f.locomotor.text) + + " is declared a value of belong " + + Mix.dress_A(v.text) + + " not present in its bean properties."; + ne.code = 1740; + ne.datum = messaggio; + ne.className = this.getClass().getName(); + throw ne; + } else { + propertiesArrayE.get(mm).participate = true; + } + } else { + propertyE.get(m).participate = true; + } + } + } + // BMENU + if (f.wagonE.get("bmenu") != null) { + baseJsp.jspKit.navigationBar = f.wagonE.get( + "bmenu").text; + int j = 0; + for (; j < markupE.get("bdefmenu").recurrenceE + .size(); j++) { + if (markupE.get("bdefmenu").recurrenceE.get( + j).locomotor.text.equals(f.wagonE.get( + "bmenu").text)) { + break; + } + } + if (j == markupE.get("bdefmenu").recurrenceE.size()) { + ExactException ce = new ExactException(); + String messaggio = "The data " + Mix.dress_A( + f.wagonE.get("bmenu").text) + + " in markup «bmenu» does not " + + "correspond to any menu definition"; + ce.code = 1711; + ce.datum = messaggio; + ce.className = this.getClass().getName(); + } else { + baseJsp.jspKit.menuKit = (MenuKit) markupE.get( + "bdefmenu").recurrenceE.get( + j).locomotor.substance; + } + } + } + + // BASEJSP - 2nd LOOP ON JSP + + /* fundamental loop, it contains sitesi and write for each of + * the jsp */ + logger.trace(Candies.LF + Cst.CUT0 + "2° LOOP SULLE JSP" + + Candies.LF + Cst.CUT0); + for (int i = 0; i < markupE.get("jsp").recurrenceE + .size(); i++) { + Train f = markupE.get("jsp").recurrenceE.get(i); + baseJsp.jspKit = (JspKit) f.locomotor.substance; + logger.trace(baseJsp.jspKit.toString()); + if (baseJsp.jspKit.fileName.equalsIgnoreCase("login") + & skill.springSecurity) { + ExactException ne = new ExactException("The JSP «" + + baseJsp.jspKit.fileName + + "» does not have to be declared with the" + + " jsp+ markup, because it is implicit in" + + " the use of Spring Security."); + ne.code = 1700; + ne.datum = ne.getMessage(); + ne.className = this.getClass().getName(); + throw ne; + } + /* no duplication check */ + int d = 0; + for (; d < i; d++) { + Train trainD = markupE.get("jsp").recurrenceE.get(d); + if (baseJsp.jspKit.fileName.equals( + ((JspKit) trainD.locomotor.substance).fileName)) { + break; + } + } + if (d < i) { + ExactException ne = new ExactException("The JSP «" + + baseJsp.jspKit.fileName + + "» is present more than once, a different" + + " name must be chosen."); + ne.code = 1701; + ne.datum = ne.getMessage(); + ne.className = this.getClass().getName(); + throw ne; + } + String ospiteY = new72; + if (baseJsp.jspKit.path.length() > 0) { + ospiteY += "/" + baseJsp.jspKit.path; + skill.buildDirectory(ospiteY); + } + baseJsp.synthesis(markupE, trainE, candies); + if (!baseJsp.jspKit.fileName.equals("login")) { + baseJsp.write(ospiteY, baseJsp.jspKit.fileName + "." + + baseJsp.jspKit.extension, + baseJsp.jspKit.fileName + "." + + baseJsp.jspKit.extension, "jsp", + candies, recycleBinY); + } + for (int k = 0; k < baseJsp.jspKit.requestMapE + .size(); k++) { + RequestMap requestMap = baseJsp.jspKit.requestMapE.get( + k); + // LOOP ON THE REQUEST MAP + if (!requestMap.pathRedirect.isEmpty()) { + Train train0 = null; + int n = 0; + for (; n < markupE.get("requmap").recurrenceE + .size(); n++) { + train0 = markupE.get("requmap").recurrenceE.get( + n); + if (train0.locomotor.text.equals( + requestMap.pathRedirect)) { + break; + } + } + if (n == markupE.get("requmap").recurrenceE + .size()) { + ExactException ne = new ExactException(); + String message = "For the «requmap+" + + requestMap.firstSegmentPath + "/" + + requestMap.jsp + "» with «redirect+" + + requestMap.pathRedirect + + "» there is no match in the " + + "request maps list."; + ne.code = 1631; + ne.datum = message; + ne.className = this.getClass().getName(); + throw ne; + } + } + requestMap.tipo = baseJsp.jspKit.jspType; + int j = 0; + for (; j < skill.correlationE.size(); j++) { + ControllerBelong correlazione = skill.correlationE + .get(j); + if (requestMap.firstSegmentPath.equals( + correlazione.gruppo)) { + correlazione.rmE.add(requestMap); + break; + } + } + if (j == skill.correlationE.size()) { + List zE = new ArrayList(); + zE.add(requestMap); + logger.trace(Candies.LF + Cst.CUT3 + + " * Not having found the first segment of path «" + + requestMap.firstSegmentPath + "»," + + Candies.LF + " * I insert my new" + + " request map:" + Candies.LF + + " * " + requestMap.toString() + + Cst.CUT3); + skill.correlationE.add(new ControllerBelong( + requestMap.firstSegmentPath, zE)); + } + } + } + + // JSPFORM - 3rd LOOP ON JSP + + logger.trace(Candies.LF + Cst.CUT0 + "3° LOOP SULLE JSP" + + Candies.LF + Cst.CUT0); + skill.tableDBE = new ArrayList(); + for (int i = 0; i < markupE.get("hdefrail").recurrenceE + .size(); i++) { + railFactory(i); + } + + skill.factory_B(markupE, trainE); + + // DB TABLES + + for (int j = 0; j < skill.tableDBE.size(); j++) { + dbTablesComponents(j); + } + skill.methodsFactory(markupE, trainE); + for (int i = 0; i < markupE.get("jsp").recurrenceE + .size(); i++) { + jspComponents(i); + } + genericModel_java.synthesis(markupE, trainE, candies); + genericModel_java.write(skill.javaWebModelY, + "GenericModel.java", "GenericModel.java", "java", + candies, recycleBinY); + if (skill.indexJsp) { + baseJsp.jspKit = (JspKit) markupE.get( + "indexjsp").recurrenceE.get(0).locomotor.substance; + baseJsp.jspKit.fileName = "index"; + if (markupE.get("indexjsp").recurrenceE.get(0).wagonE.get( + "bmenu").text != null) { + baseJsp.jspKit.navigationBar = markupE.get( + "indexjsp").recurrenceE.get(0).wagonE.get( + "bmenu").text; + } + baseJsp.synthesis(markupE, trainE, candies); + } + bootstrap_css.synthesis(markupE, trainE, candies); + screwdriver_css.synthesis(markupE, trainE, candies); + screwdriver_cssC.synthesis(markupE, trainE, candies); + for (int m = 0; m < markupE.get("bdefmenu").recurrenceE + .size(); m++) { + navigation_jsps[m].menuKit = (MenuKit) markupE.get( + "bdefmenu").recurrenceE.get(m).locomotor.substance; + navigation_jsps[m].synthesis(markupE, trainE, candies); + } + if (skill.quartzVers != null) { + quartz_job_xml.synthesis(markupE, trainE, candies); + } + web_xml.synthesis(markupE, trainE, candies); + pom_properties.synthesis(markupE, trainE, candies); + doorControllerBelong_java.synthesis(markupE, trainE, candies); + genericCrud_java.synthesis(markupE, trainE, candies); + if (skill.internalProperties) { + springProps_xml.synthesis(markupE, trainE, candies); + } + if (skill.webFlow) { + webflow_xml.synthesis(markupE, trainE, candies); + } + if (skill.spring) { + dispatcher_xml.synthesis(markupE, trainE, candies); + } + if (skill.tiles) { + tiles_xml.synthesis(markupE, trainE, candies); + } else { + headerJsp.synthesis(markupE, trainE, candies); + footerJsp.synthesis(markupE, trainE, candies); + } + if (skill.quartzVers != null) { + quartzJob_java.synthesis(markupE, trainE, candies); + quartzTask_java.synthesis(markupE, trainE, candies); + quartzTaskImpl_java.synthesis(markupE, trainE, candies); + } + if (skill.springSecurity) { + springSecurity_xml.synthesis(markupE, trainE, candies); + } + pom_xml.synthesis(markupE, trainE, candies); + if (skill.hasUseridPassword) { + if (skill.authenticationMode.equals("trivial")) { + king.synthesis(markupE, trainE, candies); + kingDao.synthesis(markupE, trainE, candies); + kingDaoImpl.synthesis(markupE, trainE, candies); + } else { + springSecurityUserContext.synthesis(markupE, trainE, + candies); + userAuthorityUtils.synthesis(markupE, trainE, candies); + } + interfacciaUserContext.synthesis(markupE, trainE, candies); + userContextImpl.synthesis(markupE, trainE, candies); + } + + /* THE SCRIPTURES */ + + if (skill.indexJsp) { + baseJsp.write(new722, "index.jsp", "index.jsp", "jsp", + candies, recycleBinY); + } + pom_xml.write(skill.eclipseProjectY, "pom.xml", "pom.xml", + "xml", candies, recycleBinY); + web_xml.write(skill.webInfY, "web.xml", "web.xml", "xml", + candies, recycleBinY); + pom_properties.write(skill.eclipseProjectY, "pom.properties", + "pom.properties", "properties", candies, recycleBinY); + if (skill.quartzVers != null) { + quartz_job_xml.write(new71, skill.applicationNameLower + + "-quartz-job.xml", skill.applicationNameLower + + "-quartz-job.xml", "xml", candies, + recycleBinY); + } + doorControllerBelong_java.write(skill.javaWebController, + "DoorControllerBelong.java", + "DoorControllerBelong.java", "java", candies, + recycleBinY); + if (skill.hibernate) { + genericCrud_java.write(new58, "GenericCrud.java", + "GenericCrud.java", "java", candies, recycleBinY); + } else { + done = FileComponent.deleteComponent(new58, + "GenericCrud.java", recycleBin, skill); + } + if (skill.internalProperties) { + springProps_xml.write(new71, skill.applicationNameLower + + "-props.xml", skill.applicationNameLower + + "-props.xml", "xml", candies, + recycleBinY); + } else { + done = FileComponent.deleteComponent(new71, + skill.applicationNameLower + "-props.xml", + recycleBin, skill); + } + if (skill.springSecurity) { + springSecurity_xml.write(new71, skill.applicationNameLower + + "-security.xml", skill.applicationNameLower + + "-security.xml", "xml", candies, + recycleBinY); + } else { + done = FileComponent.deleteComponent(new71, + skill.applicationNameLower + "-security.xml", + recycleBin, skill); + } + if (skill.spring) { + dispatcher_xml.write(new71, "DispatcherServlet.xml", + "DispatcherServlet.xml", "xml", candies, + recycleBinY); + } else { + done = FileComponent.deleteComponent(new71, + "DispatcherServlet.xml", recycleBin, skill); + } + if (skill.webFlow) { + for (int i = 0; i < markupE.get("wparams").recurrenceE + .size(); i++) { + Train f = markupE.get("wparams").recurrenceE.get(i); + String nome = f.locomotor.text; + String newF1 = skill.webFlowY + "/" + nome; + skill.buildDirectory(newF1); + webflow_xml.write(newF1, nome + "-flow.xml", nome + + "-flow.xml", "xml", candies, recycleBinY); + } + } + if (skill.tiles) { + tiles_xml.write(new73, "tiles.xml", "tiles.xml", "xml", + candies, recycleBinY); + } else { + headerJsp.write(new721, "header.jsp", "header.jsp", "jsp", + candies, recycleBinY); + footerJsp.write(new721, "footer.jsp", "footer.jsp", "jsp", + candies, recycleBinY); + } + if (skill.quartzVers != null) { + quartzJob_java.write(new63, skill.clockHands.jobNameU + + ".java", skill.clockHands.jobNameU + ".java", + "java", candies, recycleBinY); + quartzTask_java.write(new60, skill.clockHands.jobNameU + + "Task.java", skill.clockHands.jobNameU + + "Task.java", "java", candies, + recycleBinY); + quartzTaskImpl_java.write(new61, skill.clockHands.jobNameU + + "TaskImpl.java", skill.clockHands.jobNameU + + "TaskImpl.java", "java", candies, + recycleBinY); + } + bootstrap_css.write(new62, "bootstrap.css", "bootstrap.css", + "css", candies, recycleBinY); + screwdriver_css.write(new62, "screwdriver.css", + "screwdriver.css", "css", candies, recycleBinY); + // screwdriver_cssC.write(new62, "screwdriverC.css", + // "screwdriverC.css", "css", candies, recycleBinY); + for (int m = 0; m < markupE.get("bdefmenu").recurrenceE + .size(); m++) { + Train train = markupE.get("bdefmenu").recurrenceE.get(m); + navigation_jsps[m].write(new721, "navigation_" + + train.locomotor.text + ".jsp", "navigation_" + + train.locomotor.text + ".jsp", "jsp", + candies, recycleBinY); + } + FileComponent.addFile("root-context.xml", "root-context.xml", + new71, candies, recycleBinY, skill); + FileComponent.addFile("ok_jsp.txt", "ok.jsp", new723, candies, + recycleBinY, skill); + FileComponent.addFile("warning_jsp.txt", "warning.jsp", new723, + candies, recycleBinY, skill); + + // CONTROLLERS CREATION + for (int i = 0; i < skill.correlationE.size(); i++) { + ControllerBelong cnt = skill.correlationE.get(i); + skill.cntK = i; + skill.groupControllerF = cnt.gruppoMaius + + "GroupController"; + logger.info("CONTROLLER: skill.groupControllerF=" + + skill.groupControllerF); + controllerBelong_java = new ControllerBelong_java(skill, + "java/ControllerBelong.java"); + controllerBelong_java.synthesis(markupE, trainE, candies); + controllerBelong_java.write(skill.javaWebController, + skill.groupControllerF + ".java", + skill.groupControllerF + ".java", "java", candies, + recycleBinY); + } + if (skill.springSecurity) { + securityWrite(); + } else { + securityClean(); + } + if (skill.initialDirE.size() > 0 & skill.proposedDirE + .size() > 0) { + String[] iE = new String[skill.initialDirE.size()]; + for (int ij = 0; ij < skill.initialDirE.size(); ij++) { + iE[ij] = skill.initialDirE.get(ij).replace(Candies.H92, + Candies.H47); + } + String[] pE = new String[skill.proposedDirE.size()]; + for (int pj = 0; pj < skill.proposedDirE.size(); pj++) { + pE[pj] = skill.proposedDirE.get(pj).replace(Candies.H92, + Candies.H47); + } + Arrays.sort(iE); + Arrays.sort(pE); + int i = 0; + int p = 0; + while (i < iE.length) { + /* with this if I exclude every subdirectory because the + * comparison has already been done with the parent + * directory */ + int x = iE[i].compareTo(pE[p]); + if (x == 0) { + i++; + p++; + } else if (x > 0) { + p++; + } else { // < 0 + int iW = i; + do { + i++; + } while (i < iE.length && iE[i].startsWith(iE[i - 1] + + "/")); + iE[iW] = Cst.MAGIC0 + iE[iW]; + } + } + int z = 0; + for (int ij = 0; ij < iE.length; ij++) { + if (iE[ij].startsWith(Cst.MAGIC0)) { + z++; + } + } + if (z > 0) { + String question = null; + if (z == 1) { + question = "I am about to delete " + z + + " directory, because it has become useless:" + + " can I execute?"; + } else { + question = "I am about to delete " + z + + " directories, because they have become" + + " useless: can I execute?"; + } + AskForDelete askForDelete = new AskForDelete(null, + question, "Question", false); + logger.info(question); + logger.info(askForDelete.answer ? "Yes" : "No"); + if (askForDelete.answer) { + String x = Skill.datePosition(recycleBinY); + for (int ij = 0; ij < iE.length; ij++) { + if (iE[ij].startsWith(Cst.MAGIC0)) { + File f = new File(iE[ij].substring( + Cst.MAGIC0.length())); + String[] sectionE = iE[ij].split("/"); + String y = x + sectionE[sectionE.length + - 1]; + new File(y).mkdir(); + Abacus.copyDirectoryRecursion(f, new File( + y), true); + Abacus.deleteDirectoryRecursion(f); + } + } + } + } + } + + // STATISTICS + File logF = new File(candies.inputYS + "logs"); + File statF = new File(candies.inputYS + "logs" + sep + + "statistics.log"); + Path log = logF.toPath(); + if (Files.exists(log) && !Files.isDirectory(log)) { + Files.delete(log); + } + if (!Files.exists(log)) { + Files.createDirectory(log); + } + SimpleDateFormat df = new SimpleDateFormat( + "yyyy-MM-dd hh:mm:ss"); + String s = df.format(new Date()); + stat += "Application " + appName + " - Markups statistics on " + + s + Candies.LF + Candies.LF; + markupE.forEach((key, value) -> { + if (markupE.get(key).recurrenceE.size() > 0) { + int i = markupE.get(key).recurrenceE.size(); + stat += key + ": " + i + " " + (i == 1 ? "time" + : "times") + Candies.LF; + } + }); + Equipment.writeFileFromOneString_economy(statF, stat); + } + + /** + *

+ * Checks on markups. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Modifications:
+ *

+ * + * @throws ExactException error checking the contents of the file */ + final public void substantialChecks() + + throws ExactException { + + ExactException ne = new ExactException(); + for (int i = 0; i < trainE.size(); i++) { + Markup m = markupE.get(trainE.get(i).locomotor.stub); + + // CHECKING THE VALUE OF THE PRESUMED MARKUP + if (m.implyE != null) { + for (int n = 0; n < m.implyE.length; n++) { + if (!m.implyE[n].stub.equals("")) { + String ps = m.implyE[n].stub; + String pv = m.implyE[n].value; + boolean pd = m.implyE[n].direct; + int j = 0; + for (; j < trainE.size(); j++) { + if (trainE.get(j).locomotor.stub.equals( + ps)) { + break; + } + } + if (j == trainE.size() & pd) { + ne.datum = "The markup " + Mix.dress_A(ps) + + " presupposto da «" + trainE.get( + i).locomotor.stub + + "» non è presente tra i treni!"; + ne.code = 1705; + ne.className = this.getClass().getName(); + throw ne; + } else if (j < trainE.size() & !pd) { + ne.datum = "The markup " + Mix.dress_A(ps) + + ", recalled by " + Mix.dress_A( + trainE.get( + i).locomotor.stub) + + ", was not to be present among the trains!"; + ne.code = 1706; + ne.className = this.getClass().getName(); + throw ne; + } else if (!pv.isEmpty() && m.p == 5) { + if (((Integer) trainE.get( + i).locomotor.substance) + .intValue() > ((Integer) trainE + .get(j).locomotor.substance) + .intValue()) { + ne.datum = "The markup " + Mix.dress_A( + ps) + " implied by " + Mix + .dress_A(trainE.get( + i).locomotor.stub) + + " has version " + trainE.get( + j).locomotor.text + + ", less than required by " + + trainE.get(i).locomotor.stub + + ", which is " + Mix.dress_A( + trainE.get( + i).locomotor.text) + + "."; + ne.code = 1707; + ne.className = this.getClass() + .getName(); + throw ne; + } + } else if (j < trainE.size() && !pv.isEmpty() + && !trainE.get(j).locomotor.text.equals( + pv)) { + ne.datum = "The markup " + Mix.dress_A(ps) + + ", connected to " + Mix.dress_A( + trainE.get( + i).locomotor.stub) + + ", has value " + Mix.dress_A( + trainE.get( + j).locomotor.text) + + ", not conforming to that necessary for the presence of " + + Mix.dress_A(trainE.get( + i).locomotor.stub) + + ", which would like " + Mix + .dress_A(pv) + "."; + ne.code = 1708; + ne.className = this.getClass().getName(); + throw ne; + } + } + } + } + } + } + + // PRIVATE METHODS + + private void componentsInstanceExecution() { + web_xml = new Web_xml(skill, null); + pom_properties = new Pom_properties(skill, null); + quartz_job_xml = new Quartz_job_xml(skill, "testaOrm_" + + skill.springVersion + ".txt"); + webflow_xml = new Webflow_xml(skill, "xml/webflow.xml"); + pom_xml = new Pom_xml(skill, null); + springProps_xml = new SpringProperties_xml(skill, + "testaSpringProperties_" + skill.springVersion + + ".txt"); + springSecurity_xml = new SpringSecurity_xml(skill, + "testaSpringSecurity_" + + skill.springSecurityReductVersion + ".txt"); + dispatcher_xml = new Dispatcher_xml(skill, "testaDispatcher_" + + skill.springVersion + ".txt"); + baseJsp = new Base_jsp(skill, "jsp/base_jsp.txt"); + headerJsp = new Hoof(skill, "jsp/header_jsp.txt"); + footerJsp = new Hoof(skill, "jsp/footer_jsp.txt"); + quartzJob_java = new Hoof(skill, "java/QuartzJob.java"); + quartzTask_java = new Hoof(skill, "java/QuartzTask.java"); + quartzTaskImpl_java = new Hoof(skill, + "java/QuartzTaskImpl.java"); + if (skill.jpaVersion == 1) { + genericRailDaoImpl = new Hoof(skill, + "java/GenericRailDaoImplJPA1.java"); + } else { + genericRailDaoImpl = new Hoof(skill, + "java/GenericRailDaoImplJPA2.java"); + } + tiles_xml = new Tiles_xml(skill, null); + service_xml = new Service_xml(skill, "testaService_" + + skill.springVersion + ".txt"); + orm_xml = new Orm_xml(skill, "testaOrm_" + skill.springVersion + + ".txt"); + doorControllerBelong_java = new Hoof(skill, + "java/DoorControllerBelong.java"); + genericCrud_java = new Hoof(skill, "java/GenericCrud.java"); + controllerBelong_java = new ControllerBelong_java(skill, + "java/ControllerBelong.java"); + jspForm_java = new JspForm_java(skill, null); + jspFormImpl_java = new JspFormImpl_java(skill, null); + jspPlain_java = new JspPlain_java(skill, null); + jspPlainImpl_java = new JspPlainImpl_java(skill, null); + genericModel_java = new GenericModel_java(skill, + "java/GenericModel.java", candies); + userAuthenticationProvider_java = new UserAuthenticationProvider_java( + skill, "java/ApplicUserAuthenticationProvider.java"); + userContextImpl = new UserContextImpl_java(skill, null); + bootstrap_css = new Bootstrap_css(skill, "css/bootstrap.css"); + screwdriver_css = new Screwdriver_css(skill, + "css/screwdriver.css"); + screwdriver_cssC = new Screwdriver_cssC(skill, + "css/screwdriver.css"); + navigation_jsps = new Navigation_jsp[markupE.get( + "bdefmenu").recurrenceE.size()]; + for (int m = 0; m < markupE.get("bdefmenu").recurrenceE + .size(); m++) { + navigation_jsps[m] = new Navigation_jsp(skill, ""); + } + king = new Hoof(skill, "java/King.java"); + kingDao = new Hoof(skill, "java/KingDao.java"); + kingDaoImpl = new Hoof(skill, "java/KingDaoImpl.java"); + springSecurityUserContext = new Hoof(skill, "java/" + Mix + .uppercaseFirstChar(skill.authenticationMode) + + "SpringSecurityUserContext.java"); + userAuthorityUtils = new Hoof(skill, + "java/UserAuthorityUtils.java"); + interfacciaUserContext = new Hoof(skill, + "java/UserContext.java"); + } + + private void jspComponents(final int i) + + throws ExactException, FileNotFoundException, IOException { + + Train f = markupE.get("jsp").recurrenceE.get(i); + baseJsp.jspKit = ((JspKit) f.locomotor.substance); + logger.trace(baseJsp.jspKit.toString()); + /* if it is a form jsp ... */ + if (baseJsp.jspKit.jspType == 1) { + jspForm_java.jspKit = baseJsp.jspKit; + jspFormImpl_java.jspKit = baseJsp.jspKit; + jspForm_java.directory(markupE); + jspFormImpl_java.directory(markupE); + jspForm_java.synthesis(markupE, trainE, candies); + jspFormImpl_java.synthesis(markupE, trainE, candies); + String formName = baseJsp.jspKit.nomeFileU + Cst.FORMU + + ".java"; + jspForm_java.write(skill.javaWebModelBodyY, formName, + formName, "java", candies, recycleBinY); + formName = baseJsp.jspKit.nomeFileU + Cst.FORMU + + "Impl.java"; + /* here I add to the freeze list two classes that end with + * the string "Impl" */ + if (!candies.inside) { + candies.freezeDueE.add(formName); + } + jspFormImpl_java.write(skill.javaWebModelBodyY, formName, + formName, "java", candies, recycleBinY); + new File(skill.javaWebModelBodyY + "/" + + baseJsp.jspKit.nomeFileU + "Plain.java").delete(); + new File(skill.javaWebModelBodyY + "/" + + baseJsp.jspKit.nomeFileU + "PlainImpl.java") + .delete(); + } else if (baseJsp.jspKit.jspType == 0) { + /* ... then it is of the plain type */ + jspPlain_java.jspKit = baseJsp.jspKit; + jspPlainImpl_java.jspKit = baseJsp.jspKit; + jspPlain_java.directory(markupE); + jspPlainImpl_java.directory(markupE); + jspPlain_java.synthesis(markupE, trainE, candies); + jspPlainImpl_java.synthesis(markupE, trainE, candies); + String modelName = baseJsp.jspKit.nomeFileU + Cst.PLAINU + + ".java"; + jspPlain_java.write(skill.javaWebModelBodyY, modelName, + modelName, "java", candies, recycleBinY); + modelName = baseJsp.jspKit.nomeFileU + Cst.PLAINU + + "Impl.java"; + /* here I add to the freeze list two classes that end with + * the string "Impl" */ + if (!candies.inside) { + candies.freezeDueE.add(modelName); + } + jspPlainImpl_java.write(skill.javaWebModelBodyY, modelName, + modelName, "java", candies, recycleBinY); + new File(skill.javaWebModelBodyY + "/" + + baseJsp.jspKit.nomeFileU + "Form.java").delete(); + new File(skill.javaWebModelBodyY + "/" + + baseJsp.jspKit.nomeFileU + "FormImpl.java") + .delete(); + } + } + + private void dbTablesComponents(final int j) + + throws FileNotFoundException, ExactException, IOException, + ExactException { + + skill.tK = j; + TableOutfit ct = skill.tableDBE.get(skill.tK); + FileComponent interfacciaTabellaDao_java = new InterfaceTableDao_java( + skill, null, candies); + FileComponent interfacciaTabellaService_java = new InterfaceTabellaService_java( + skill, null, candies); + FileComponent tabellaDaoImpl_java = new ImplementTableDao_java( + skill, null, candies); + FileComponent tabellaServiceImpl_java = new ImplementTabellaService_java( + skill, null, candies); + interfacciaTabellaDao_java.synthesis(markupE, trainE, candies); + interfacciaTabellaDao_java.write(new5 + "/" + ct.railLowercase + + "/dao", "I" + ct.railUppercase + ct.entityName + + "Dao.java", "I" + ct.railUppercase + + ct.entityName + "Dao.java", "java", + candies, recycleBinY); + interfacciaTabellaService_java.synthesis(markupE, trainE, + candies); + interfacciaTabellaService_java.write(new5 + "/" + + ct.railLowercase + "/service", "I" + ct.railUppercase + + ct.entityName + "Service.java", "I" + + ct.railUppercase + ct.entityName + + "Service.java", "java", candies, + recycleBinY); + tabellaDaoImpl_java.synthesis(markupE, trainE, candies); + tabellaDaoImpl_java.write(new5 + "/" + skill.tableDBE.get( + j).railLowercase + "/dao/impl", ct.railUppercase + + ct.entityName + "Dao.java", ct.railUppercase + + ct.entityName + "Dao.java", "java", + candies, recycleBinY); + tabellaServiceImpl_java.synthesis(markupE, trainE, candies); + tabellaServiceImpl_java.write(new5 + "/" + ct.railLowercase + + "/service/impl", ct.railUppercase + skill.tableDBE + .get(j).entityName + "Service.java", + ct.railUppercase + ct.entityName + "Service.java", + "java", candies, recycleBinY); + } + + private static String trainE_toString(List fE, + HashMap mE) { + String s = ""; + s += Candies.LF + Candies.LF + Candies.LF; + s += Cst.CUT0; + s += "ELENCO DEI TRENI" + Candies.LF; + for (int i = 0; i < fE.size(); i++) { + s += Cst.CUT0; + Train f = fE.get(i); + Wagon v0 = f.locomotor; + s += v0.toString(0, mE); + if (f.wagonE.size() > 1) { + s += Cst.CUT1; + } + Collection valueE = f.wagonE.values(); + Iterator iterator = valueE.iterator(); + int j = 0; + while (iterator.hasNext()) { + Wagon v = iterator.next(); + s += v.toString(j, mE); + j++; + } + } + s += Candies.LF; + return s; + } + + /* i is the index of the occurrence of the markup rail */ + final private void railFactory(final int i) + + throws IOException, ExactException { + + Train t = markupE.get("hdefrail").recurrenceE.get(i); + if (t.wagonE.get("hjndi") != null) { + skill.jndi = t.wagonE.get("hjndi").text; + } + if (t.wagonE.get("hdbschema") == null) { + ExactException ne = new ExactException("Il luogo-DB «rail+" + + t.locomotor.text + + "» non è accompagnato dal markup «hdbschema»."); + ne.code = 1732; + ne.datum = ne.getMessage(); + ne.className = this.getClass().getName(); + throw ne; + } else { + skill.dbSchema = t.wagonE.get("hdbschema").text; + } + // skill.dbms = null; + if (t.wagonE.get("hdbms") == null) { + ExactException ne = new ExactException( + "The rail (pir datasource-DBschema «rail+" + + t.locomotor.text + + "» is not accompanied by markup «hdbms»."); + ne.code = 1710; + ne.datum = ne.getMessage(); + ne.className = this.getClass().getName(); + throw ne; + } else { + skill.dbms = t.wagonE.get("hdbms").text; + /* FUTURE RELEASE N6 */ + // skill.dbmsE.add(dbmsW); + } + if (t.wagonE.get("hjarv") != null) { + skill.versioneArtifactJPA = t.wagonE.get("hjarv").text; + } + t.locomotor.substance = new DBPlaceKit(skill.dbSchema, + skill.jndi, skill.dbms); + if (skill.hibernateVersion != null & markupE.get( + "hv").recurrenceE.get(0).wagonE.get("hjpav").text + .equals("2")) { + FileComponent.addClass("GenericController.java", + skill.javaWebController, "GenericController.java", + candies, recycleBinY, skill, -1, markupE, "java"); + FileComponent.addClass("GenericComponent.java", + skill.javaWebController, "GenericComponent.java", + candies, recycleBinY, skill, -1, markupE, "java"); + FileComponent.addClass("Filter.java", new581, "Filter.java", + candies, recycleBinY, skill, -1, markupE, + "java/jpa2"); + FileComponent.addClass("Order.java", new581, "Order.java", + candies, recycleBinY, skill, -1, markupE, + "java/jpa2"); + FileComponent.addClass("OrderBuilder.java", new581, + "OrderBuilder.java", candies, recycleBinY, skill, + -1, markupE, "java/jpa2"); + FileComponent.addClass("PaginatedFilter.java", new581, + "PaginatedFilter.java", candies, recycleBinY, skill, + -1, markupE, "java/jpa2"); + FileComponent.addClass("SearchParameter.java", new581, + "SearchParameter.java", candies, recycleBinY, skill, + -1, markupE, "java/jpa2"); + FileComponent.addClass("SingularParameter.java", new581, + "SingularParameter.java", candies, recycleBinY, + skill, -1, markupE, "java/jpa2"); + FileComponent.addClass("StringParameter.java", new581, + "StringParameter.java", candies, recycleBinY, skill, + -1, markupE, "java/jpa2"); + FileComponent.addClass("GenericDao.java", new582, + "GenericDao.java", candies, recycleBinY, skill, -1, + markupE, "java/jpa2"); + } + /* the double id is the sequence of java naming and DB schema */ + String doppioId = skill.jndi.toLowerCase() + "-" + + skill.dbSchema; + String new6 = new5 + "/" + Cst.RAIL + t.locomotor.text; + hibernateDirectoriesFactory(new6, new5, t); + File progettoJpa = new File(candies.outputYS + doppioId); + File persistence = new File(candies.outputYS + doppioId + + "/src/META-INF/persistence.xml"); + if (!progettoJpa.exists()) { + String messaggio = "The project JPA " + Mix.dress_A( + doppioId) + + " does not exist, it's impossible to continue."; + ExactException ce = new ExactException(messaggio); + ce.code = 1733; + ce.datum = ce.getMessage(); + ce.className = this.getClass().getName(); + throw ce; + } else if (!persistence.exists()) { + String message = "The file" + + " persistence.xml does not exist in directory «" + + "src/META-INF» of the JPA project " + Mix.dress_A( + doppioId); + Mix.discloseInfo(message, "Alarm", logger); + } else { + Document document = null; + NodeList nodeList0, nodeList1; + DocumentBuilderFactory factory = DocumentBuilderFactory + .newInstance(); + Node nodeDoc0, nodeDoc1; + // I create the document of the "persistence" file + DocumentBuilder builder; + try { + builder = factory.newDocumentBuilder(); + document = builder.parse(persistence); + } catch (ParserConfigurationException e) { + e.printStackTrace(); + } catch (SAXException e) { + e.printStackTrace(); + } + logger.trace( + "I've created the DOM document of persistence.xml" + + " for the DB-place " + Mix.dress_A( + doppioId)); + nodeList0 = document.getChildNodes(); + nodeDoc0 = nodeList0.item(0); + nodeList1 = nodeDoc0.getChildNodes(); + nodeDoc1 = nodeList1.item(1); + String[] rigaE = Strings.compact_A(nodeDoc1 + .getTextContent()).split("\\x20"); + for (String riga : rigaE) { + if (!riga.endsWith("PK")) { + riga += "+"; // trick to avoid exception, then + // I take off + String[] z = riga.split("\\x2e"); // x2e is the + // dot + if (z.length < 4) { + ExactException ne = new ExactException( + "The line of the file persistence.xml in the JPA project «" + + doppioId + "» is «" + riga + + "», but it is wrong."); + ne.code = 1712; + ne.datum = ne.getMessage(); + ne.className = this.getClass().getName(); + throw ne; + } + String ultimo = z[z.length - 1]; + String path = riga.substring(0, riga.indexOf(ultimo) + - 1); + ultimo = ultimo.substring(0, ultimo.length() - 1); + TableOutfit kit = new TableOutfit(ultimo, path, + z[z.length - 2], candies, z[z.length - 3], + Cst.RAIL, t.locomotor.text); + logger.debug(kit); + skill.tableDBE.add(kit); + } + } + } + skill.railK = i; + service_xml.synthesis(markupE, trainE, candies); + service_xml.write(new71, Cst.RAIL + t.locomotor.text + + "-service.xml", Cst.RAIL + t.locomotor.text + + "-service.xml", "xml", candies, recycleBinY); + orm_xml.synthesis(markupE, trainE, candies); + orm_xml.write(new71, Cst.RAIL + t.locomotor.text + "-orm.xml", + Cst.RAIL + t.locomotor.text + "-orm.xml", "xml", + candies, recycleBinY); + genericRailDaoImpl.synthesis(markupE, trainE, candies); + genericRailDaoImpl.write(new5 + "/" + Cst.RAIL + + t.locomotor.text, "Generic" + Cst.RAILU + + t.locomotor.text + "DaoImpl.java", "Generic" + + Cst.RAILU + t.locomotor.text + + "DaoImpl.java", "java", candies, + recycleBinY); + + } + + /* the directory to be created does not exist, but there was one, + * with a different name, which was really our application */ + final private void scruple(final String corrente, + final String superiore) { + File y = new File(corrente); + /* first I deal with the case that a file corresponds to that + * name, in which case I delete it */ + if (y.exists() & !y.isDirectory()) { + y.delete(); + } else if (!y.exists()) { + /* if it does not exist, I list the files and directories */ + Folder folder = new Folder(); + /* this is the list of what is contained in the parent, or + * parent, directory */ + File[] parentE = folder.fileObjects(".+", superiore); + /* this list is empty ... */ + if (parentE.length == 0) { + /* .. create the directory */ + skill.buildDirectory(y); + } else { /* if instead there is a list */ + int i = 0; + /* ... check if there is at least one directory */ + for (; i < parentE.length; i++) { + /* if you found it ... */ + if (parentE[i].isDirectory()) { + parentE[i].renameTo(y); + break; + } + } + /* if there is not even a directory, create it */ + if (i == parentE.length) { + skill.buildDirectory(y); + } + } + } else { + skill.proposedDirE.add(corrente); + } + } + + /* this method adds the creation of the typical Hibernate + * directories to the previous one */ + final private void hibernateDirectoriesFactory( + final String levelRail, final String superiore, Train t) { + + skill.buildDirectory(levelRail); + String brickServiceY = levelRail + "/service"; + skill.buildDirectory(brickServiceY); + String brickServiceImplY = brickServiceY + "/impl"; + skill.buildDirectory(brickServiceImplY); + String brickDaoY = levelRail + "/dao"; + skill.buildDirectory(brickDaoY); + String brickDaoImplY = brickDaoY + "/impl"; + skill.buildDirectory(brickDaoImplY); + } + + final private void directoriesFactory_B() + + throws ExactException, IOException { + + @SuppressWarnings("unused") + boolean done = false; + File f = null; + FileComponent.addFile("config.properties", "config.properties", + skill.mainResources, candies, recycleBinY, skill); + /* FUTURE RELEASE N6 */ + // if (skill.embedded) { + // f = new File(skill.mainResources + "/database"); + // skill.buildDirectory(f); + // Iterator iterator = skill.dbmsE.iterator(); + // while (iterator.hasNext()) { + // f = new File(skill.mainResources + "/database/" + Mix + // .inizialeMinuscola((String) (iterator.next()))); + // skill.buildDirectory(f); + // } + // } + String new520 = skill.mainResources + "/ldif"; + f = new File(new520); + if (skill.ldap) { + skill.buildDirectory(f); + File newFile = new File(new520 + "/" + + skill.applicationNameLower + ".ldif"); + done = newFile.createNewFile(); + Markup mFile = markupE.get("file"); + + int i = 0; + for (; i < mFile.recurrenceE.size(); i++) { + if (mFile.recurrenceE.get(i).locomotor.text.equals( + skill.applicationNameLower + ".ldif")) { + break; + } + } + if (i < mFile.recurrenceE.size()) { + Equipment.scriviFileDaStringa(newFile, + (String) mFile.recurrenceE.get( + i).locomotor.substance); + } + } else if (f.exists()) { + Abacus.destroyDirectory(new520); + done = f.delete(); + } + skill.webAppG = skill.mainY + "/webapp"; + String newMetaInf = skill.webAppG + "/META-INF"; + skill.webAppResourcesY = skill.webAppG + "/resources"; + new62 = skill.webAppResourcesY + "/css"; + String new64 = skill.webAppResourcesY + "/fonts"; + String new65 = skill.webAppResourcesY + "/images"; + String new66 = skill.webAppResourcesY + "/js"; + skill.webInfY = skill.webAppG + "/WEB-INF"; + new71 = skill.webInfY + "/spring"; + new72 = skill.webInfY + "/views"; + new721 = new72 + "/includes"; + new723 = new72 + "/answers"; + new722 = new72 + "/home"; + new73 = skill.webInfY + "/tiles"; + String newLib = skill.webInfY + "/lib"; + String newT0 = skill.eclipseProjectY + "src/test"; + String newT1 = newT0 + "/java"; + String newT2 = newT0 + "/resources"; + skill.buildDirectory(skill.mainY); + skill.buildDirectory(newT0); + skill.buildDirectory(skill.mainJavaY); + skill.buildDirectory(skill.webAppG); + skill.buildDirectory(skill.webInfY); + skill.buildDirectory(newMetaInf); + skill.buildDirectory(newLib); + skill.buildDirectory(new72); + if (!skill.tiles) { + skill.buildDirectory(new721); + } + skill.buildDirectory(new722); + skill.buildDirectory(new723); + f = new File(new73); + if (skill.tiles) { + skill.buildDirectory(f); + } else if (f.exists()) { + done = new File(new73).renameTo(new File(recycleBinY + + "/tiles")); + } + skill.buildDirectory(skill.webAppResourcesY); + skill.buildDirectory(new62); + skill.buildDirectory(new64); + skill.buildDirectory(new65); + skill.buildDirectory(new66); + if (skill.spring) { + skill.buildDirectory(new71); + /* I don't want spring, so the WEB-INF / spring directory + * must be deleted */ + } else if (new File(new71).exists()) { + Abacus.destroyDirectory(new71); + done = new File(new71).delete(); + } + skill.buildDirectory(newT1); + skill.buildDirectory(newT2); + String new4 = skill.mainJavaY; + String[] u = null; + u = skill.networkDomain.split("\\x2e"); + skill.pckg = skill.networkDomain; + for (int i = 0; i < u.length; i++) { + new4 += "/" + u[i]; + skill.buildDirectory(new4); + } + new5 = new4 + "/" + skill.applicationNameLower; + skill.pckg += "." + skill.applicationNameLower; + scruple(new5, new4); + skill.javaWebY = new5 + "/web"; + skill.javaUtilY = new5 + "/utilities"; + skill.buildDirectory(skill.javaWebY); + skill.buildDirectory(skill.javaUtilY); + String new53 = new5 + "/exception"; + skill.buildDirectory(new53); + new58 = new5 + "/generic"; + skill.buildDirectory(new58); + new581 = new5 + "/jpa"; + skill.buildDirectory(new581); + new582 = new581 + "/dao"; + skill.buildDirectory(new582); + new583 = new582 + "/impl"; + skill.buildDirectory(new583); + new60 = new5 + "/task"; + new61 = new60 + "/impl"; + new63 = new5 + "/job"; + if (skill.quartzVers == null) { + if (new File(new60).exists()) { + Abacus.destroyDirectory(new60); + done = new File(new60).delete(); + } + if (new File(new63).exists()) { + Abacus.destroyDirectory(new63); + done = new File(new63).delete(); + } + } else { + skill.buildDirectory(new60); + skill.buildDirectory(new63); + } + skill.buildDirectory(new60); + skill.buildDirectory(new61); + String new59 = new5 + "/mail"; + skill.buildDirectory(new59); + domainY = new5 + "/domain"; + skill.buildDirectory(domainY); + securityY = new5 + "/security"; + if (skill.springSecurity) { + skill.buildDirectory(securityY); + } + if (skill.ldap) { + newLdap = securityY + "/ldap"; + skill.buildDirectory(newLdap); + newLdap += "/userdetails"; + skill.buildDirectory(newLdap); + newLdap += "/ad"; + skill.buildDirectory(newLdap); + FileComponent.addClass( + "ActiveDirectoryLdapAuthoritiesPopulator.java", + newLdap, + "ActiveDirectoryLdapAuthoritiesPopulator.java", + candies, recycleBinY, skill, -1, markupE, "java"); + } + newAnnotation = skill.javaWebY + "/annotation"; + skill.buildDirectory(newAnnotation); + new513 = skill.javaWebY + "/filter"; + if (skill.filter) { + skill.buildDirectory(new513); + /* I don't want filters, so the directory needs to be + * cleared */ + } else if (new File(new513).exists()) { + Abacus.destroyDirectory(new513); + done = new File(new513).delete(); + } + brickAuthenticationY = skill.javaWebY + "/authentication"; + if (skill.authenticationProvider != null + && !skill.authenticationProvider.equals("ldap")) { + skill.buildDirectory(brickAuthenticationY); + /* ... then it means that I don't want filters, so the + * directory must be deleted */ + } else if (new File(brickAuthenticationY).exists()) { + Abacus.destroyDirectory(brickAuthenticationY); + done = new File(brickAuthenticationY).delete(); + } + if (skill.hasUseridPassword) { + brickAuthenticationAuthorityY = brickAuthenticationY + + "/authority"; + skill.buildDirectory(brickAuthenticationAuthorityY); + } + new515 = skill.javaWebY + "/listener"; + skill.buildDirectory(new515); + new516 = skill.javaWebY + "/mapping"; + skill.buildDirectory(new516); + newResolver = skill.javaWebY + "/resolver"; + skill.buildDirectory(newResolver); + new518 = skill.javaWebY + "/sanitizer"; + skill.buildDirectory(new518); + new519 = skill.javaWebY + "/servlet"; + skill.buildDirectory(new519); + String new51a = skill.javaWebY + "/validator"; + skill.buildDirectory(new51a); + } + + /* treatment of the links between markups that are significant for + * their position; es. formt, valconst */ + final private void eachTrainHooks(Train train, + final int posizioneVisiva) + + throws ExactException { + + List vcE = new ArrayList(); + /* the first time the markup file appears, I prepare the + * substance that will accept the text of the file */ + if (train.locomotor.stub.equals("file")) { + train.locomotor.substance = ""; + } + /* trattasiIndexJsp would seem useless, for now I leave it */ + if (train.locomotor.stub.equals("jsp")) { + // questionIndexJsp = false; + ultimaJsp = train; + } else if (train.locomotor.stub.equals("indexjsp")) { + ultimaJsp = train; + ultimaJsp.locomotor.substance = new JspKit(); + } + String ultimaFormLabel = ""; + if (train.wagonE.get("flabel") != null) { + ultimaFormLabel = train.wagonE.get("flabel").text; + } + if (train.locomotor.stub.length() > 4 + && train.locomotor.text != null && train.locomotor.text + .length() > 1 && train.locomotor.stub.substring( + 0, 4).equals("form")) { + String secondaLettera = train.locomotor.text.substring(1, + 2); + if (secondaLettera.toUpperCase().equals(secondaLettera)) { + ExactException ce = new ExactException( + "In un tag «formt+» la seconda lettera del name «" + + train.locomotor.text + + "» è maiuscola, is incorrect."); + ce.code = 1730; + ce.datum = ce.getMessage(); + ce.className = this.getClass().getName(); + throw ce; + } + } + JspBeanElement jbe = null; + if (train.locomotor.stub.equals("formt")) { + kitLastJsp = (JspKit) ultimaJsp.locomotor.substance; + jbe = new JspBeanElement(Mix.lowercaseFirstChar( + train.locomotor.text), null, true, ultimaFormLabel, + train.wagonE.get("mybutton"), vcE, Cst.TEXT_BOX); + kitLastJsp.controlE.add(jbe); + } else if (train.locomotor.stub.equals("forma")) { + kitLastJsp = (JspKit) ultimaJsp.locomotor.substance; + jbe = new JspBeanElement(Mix.lowercaseFirstChar( + train.locomotor.text), null, true, ultimaFormLabel, + train.wagonE.get("mybutton"), vcE, Cst.TEXT_AREA); + kitLastJsp.controlE.add(jbe); + } else if (train.locomotor.stub.equals("formc")) { + kitLastJsp = (JspKit) ultimaJsp.locomotor.substance; + jbe = new JspBeanElement(Mix.lowercaseFirstChar( + train.locomotor.text), null, true, ultimaFormLabel, + train.wagonE.get("mybutton"), vcE, Cst.CHECK_BOX); + kitLastJsp.controlE.add(jbe); + } else if (train.locomotor.stub.equals("formr")) { + kitLastJsp = (JspKit) ultimaJsp.locomotor.substance; + int start = 0; + if (train.wagonE.get("fstart") != null) { + start = Integer.valueOf(train.wagonE.get( + "fstart").text); + } + jbe = new JspBeanElement(Mix.lowercaseFirstChar( + train.locomotor.text), null, true, ultimaFormLabel, + null, train.wagonE.get("mybutton"), null, null, + Cst.RADIO_BUTTON, train.wagonE.get("ftokens"), + start); + kitLastJsp.controlE.add(jbe); + } else if (train.locomotor.stub.equals("formn")) { + kitLastJsp = (JspKit) ultimaJsp.locomotor.substance; + jbe = new JspBeanElement(Mix.lowercaseFirstChar( + train.locomotor.text), null, true, ultimaFormLabel, + train.wagonE.get("fcartel"), train.wagonE.get( + "mybutton"), train.wagonE.get("dao"), + train.wagonE.get("hsqln"), Cst.LIST_BOX, + train.wagonE.get("ftokens"), 0); + kitLastJsp.controlE.add(jbe); + } + if (train.locomotor.stub.equals("valcons")) { + jbe = kitLastJsp.controlE.get(kitLastJsp.controlE.size() + - 1); + ValidConstScrew vc = new ValidConstScrew(train.locomotor, + train.wagonE.get("valparams"), train.wagonE.get( + "valtag")); + jbe.validConstE.add(vc); + } + if (train.locomotor.stub.equals("bdefmenu")) { + lastDeclaredMenu = (markupE.get("bdefmenu").recurrenceE.get( + markupE.get("bdefmenu").recurrenceE.size() - 1)); + lastDeclaredMenu.locomotor.substance = new MenuKit(); + ((MenuKit) lastDeclaredMenu.locomotor.substance).navbarFixedTop = lastDeclaredMenu.wagonE + .containsKey("bfixedtop"); + } + if (train.locomotor.stub.equals("blabel") + & lastDeclaredMenu != null) { + String[] clic = new String[2]; + clic[0] = train.locomotor.text; + clic[1] = train.wagonE.get("burl").text; + ((MenuKit) lastDeclaredMenu.locomotor.substance).clicE.add( + clic); + } + if (train.locomotor.stub.equals("pragma") & ultimaJsp == null) { + String message = "The markup " + Mix.dress_A( + train.locomotor.stub) + " at the row " + + posizioneVisiva + + " must be preceded (even not immediately)" + + " by markup «jsp+»."; + ExactException ce = new ExactException(); + ce.code = 1713; + ce.datum = message; + ce.className = this.getClass().getName(); + throw ce; + } else if (train.locomotor.stub.equals("pragma")) { + /* I take the train of the last jsp */ + ((JspKit) (ultimaJsp.locomotor.substance)).pragma = true; + } + } + + /** + *

+ * Checking the presence of markups. + *

+ * + * @throws ExactException standard exception */ + final public void controlloPresenze() + + throws ExactException { + + ExactException ce = new ExactException(); + Collection valueE = markupE.values(); + Iterator iterator = valueE.iterator(); + while (iterator.hasNext()) { + Markup markup = iterator.next(); + /* I check the markups that must always be present at least + * once, but only if they are locomotives; to verify that + * they are locomotives */ + if (markup.presenza == 1 && (markup.implyE == null + || !markup.implyE[0].isWagon) && markup.recurrenceE + .size() != 1) { + // if (markup.presence == 1 && markup.occurrenceE + // .size ()! = 1) { + ce.code = 1714; + ce.datum = "The markup " + Mix.dress_A(markup.stub) + + " has to be present once and only once."; + ce.className = this.getClass().getName(); + throw ce; + } + if (markup.recurrenceE.size() == 0) { + continue; + } + if (markup.presenza == 2 & markup.recurrenceE.size() > 1) { + ce.code = 1715; + ce.datum = "The markup " + Mix.dress_A(markup.stub) + + " has to be present no more than once."; + ce.className = this.getClass().getName(); + throw ce; + } + if (markup.presenza == 3 | markup.presenza == 5 + & markup.recurrenceE.size() == 0) { + ce.code = 1716; + ce.datum = "The markup " + Mix.dress_A(markup.stub) + + " has to be present at least once."; + ce.className = this.getClass().getName(); + throw ce; + } + if (markup.implyE != null) { + /* the algorithm is based on a series of hours because, + * if I speak of "it presupposes a locomotive", there + * can be a range of possible locomotives, therefore the + * test must be satisfied at least once. Unfortunately, + * the algorithm is not adequate when other markups are + * assumed, which are not locomotives of the markup we + * are checking, but which must still be present */ + /* a column should be added in the Hammer class table: + * the current one becomes "presupposes locomotor", the + * new "presupposes markup" */ + boolean presente = false; + boolean assente = false; + String totalPresent = ""; + String totalAbsent = ""; + int totalPresentOnesQ = 0; + int totalAbsentOnesQ = 0; + for (int n = 0; n < markup.implyE.length; n++) { + if (markup.implyE[n].direct) { + presente |= markupE.get( + markup.implyE[n].stub).recurrenceE + .size() > 0; + totalPresent += markup.implyE[n].stub + " "; + totalPresentOnesQ++; + } else { + assente |= markupE.get( + markup.implyE[n].stub).recurrenceE + .size() == 0; + totalAbsent += markup.implyE[n].stub + " "; + totalAbsentOnesQ++; + } + } + /* if there is, remove the final space) */ + if (totalPresent.endsWith(Candies.SPACE)) { + totalPresent = totalPresent.substring(0, + totalPresent.length() - 1); + } + if (totalAbsent.endsWith(Candies.SPACE)) { + totalAbsent = totalAbsent.substring(0, totalAbsent + .length() - 1); + } + if (totalPresentOnesQ > 0 & !presente) { + ce.code = 1717; + if (totalPresentOnesQ == 1) { + ce.datum = "The markup " + Mix.dress_A( + totalPresent) + + " has to be present at least once," + + " it is required by the presence of " + + Mix.dress_A(markup.stub) + "."; + } else { + ce.datum = "The markup " + Mix.dress_A( + totalPresent) + + " has to be present at least once," + + " they are required by the presence of " + + Mix.dress_A(markup.stub) + "."; + + } + ce.className = this.getClass().getName(); + throw ce; + } + if (totalAbsentOnesQ > 0 & !assente) { + ce.code = 1736; + if (totalAbsentOnesQ == 1) { + ce.datum = "The markup " + Mix.dress_A( + totalAbsent) + + " it should not be present," + + " as determined by the configuration of " + + Mix.dress_A(markup.stub) + "."; + } else { + ce.datum = "None of the markups " + Mix.dress_A( + totalAbsent) + + " it should not be present," + + " as determined by the configuration of " + + Mix.dress_A(markup.stub) + "."; + } + ce.className = this.getClass().getName(); + throw ce; + } + } + if (markup.mandatoryWagE != null) { + for (int m = 0; m < markup.mandatoryWagE.length; m++) { + for (int n = 0; n < markup.recurrenceE + .size(); n++) { + Train train = markup.recurrenceE.get(n); + if (train.wagonE.get( + markup.mandatoryWagE[m]) == null) { + ce.code = 1718; + ce.datum = "The markup " + Mix.dress_A( + markup.mandatoryWagE[m]) + + " is missing after the markup " + + Mix.dress_A(markup.stub + "+" + + train.locomotor.text) + + "."; + ce.className = this.getClass().getName(); + throw ce; + } + } + } + } + if (markup.optionalWagE != null) { + for (int n = 0; n < markup.recurrenceE.size(); n++) { + Train train = markup.recurrenceE.get(n); + + Collection valueWagonE = train.wagonE + .values(); + Iterator iteratorWagon = valueWagonE + .iterator(); + while (iteratorWagon.hasNext()) { + Wagon wagon = iteratorWagon.next(); + int m = 0; + for (; m < markup.unioneE.length; m++) { + if (wagon.stub.equals(markup.unioneE[m])) { + break; + } + } + if (m == markup.unioneE.length) { + ce.code = 1731; + ce.datum = "The markup " + Mix.dress_A( + wagon.stub + "+" + wagon.text) + + " following " + Mix.dress_A( + train.locomotor.stub + "+" + + train.locomotor.text) + + " it is not expected in optional" + + " wagons nor in mandatory ones."; + ce.className = this.getClass().getName(); + throw ce; + } + } + } + } + } + int i = 0; + for (; i < markupE.get("blabel").recurrenceE.size(); i++) { + Train blabelTrain = markupE.get("blabel").recurrenceE.get( + i); + Wagon burlWagon = blabelTrain.wagonE.get("burl"); + int j = 0; + for (; j < markupE.get("requmap").recurrenceE.size(); j++) { + Train rmTrain = markupE.get("requmap").recurrenceE.get( + j); + if (rmTrain.locomotor.substance.equals( + burlWagon.substance)) { + break; + } + } + if (j == markupE.get("requmap").recurrenceE.size() + & !burlWagon.text.equals("/")) { + ce.code = 1738; + ce.datum = "The markup " + Mix.dress_A("blabel+" + + blabelTrain.locomotor.text) + + " calls an inexistent Request Map: " + Mix + .dress_A(burlWagon.text) + "."; + ce.className = this.getClass().getName(); + throw ce; + } + } + } + + final private List composeTrains(List zebra, + final String includeY) + + throws ExactException { + + String s = null; + int p = 0; + int rigaJ = 0; + String[] complessoE; + ExactException ne = new ExactException(); + for (rigaJ = 0; rigaJ < zebra.size(); rigaJ++) { + // here I trim the text, but only here + s = zebra.get(rigaJ).replaceAll("\\t", " ").trim(); + if (s.endsWith(Markup.PIU)) { + s += " "; + complessoE = s.split("\\x" + Markup.PIUX); + complessoE[complessoE.length - 1] = ""; + } else { + complessoE = s.split("\\x" + Markup.PIUX); + } + int complessoL = complessoE.length; + p = s.indexOf(Markup.PIUC); + /* if there is a + sign, and it is a file, and there are too + * many + signs ... */ + if (p > -1 && stub != null && stub.equals("file") + && complessoE.length != 2) { + ne.datum = "Nel markup " + Mix.dress_A(stub) + + " at line " + posizioneVisiva + + " the file name cannot contain the sign +."; + ne.code = 1719; + ne.n = rigaJ; + ne.className = this.getClass().getName(); + throw ne; + } else if (s == null || s.length() == 0 || s.startsWith( + "#")) { + /* if a line starts with a pound sign, it is a + * comment */ + posizioneVisiva++; + continue; + /* if the + sign is not there, or is in such a position + * that it cannot be a markup, we have a file markup, + * and it is not the first line (stub! = null) and the + * last valid stub is "file "... */ + } else if (s.length() > 0 && stub != null && markupE.get( + train.locomotor.stub).p == 20 && (p == -1 + || p < Markup.MAR_LP || p > Markup.MAR_LM + - 1 || !markupE.containsKey(s + .substring(0, p) + .toLowerCase()))) { + /* ... then accumulates the line as file content */ + String z = (String) train.locomotor.substance; + z += zebra.get(rigaJ) + Candies.LINE_FEED; + train.locomotor.substance = z; + /* if a line is null, empty or comment, skip it, but + * count it with indication */ + } else if (p > -1 && s.length() > 1 && p < s.length() + && complessoL > 2 // that is, it has more than 1 + + // sign + && markupE.containsKey(s.substring(0, p) + .toLowerCase()) && markupE.get(s.substring( + 0, p).toLowerCase()).wagon) { + ne.datum = "The markup " + Mix.dress_A(stub) + + " at line " + posizioneVisiva + + " must have one + sign, being a" + + " \"wagon\" type."; + ne.code = 1720; + ne.n = rigaJ; + ne.className = this.getClass().getName(); + throw ne; + } else if (p > -1 && s.length() > 1 && p < s.length() + && complessoL % 2 == 1 && markupE.containsKey(s + .substring(0, p).toLowerCase()) && !markupE + .get(s.substring(0, p) + .toLowerCase()).wagon) { + ne.datum = "The markup «" + s.substring(0, p) + + "+» in the row " + posizioneVisiva + + " must have an odd number of symbols +."; + ne.code = 1721; + ne.n = rigaJ; + ne.className = this.getClass().getName(); + throw ne; + } else if (p > -1 & s.length() > 1 && p < s.length()) { + String[] pezzoE = new String[complessoE.length / 2]; + for (int j = 0; j < pezzoE.length; j++) { + pezzoE[j] = complessoE[j * 2] + Markup.PIU + + complessoE[j * 2 + 1]; + pezzoE[j] = pezzoE[j].trim(); + eValido(pezzoE[j], rigaJ, includeY, zebra, j); + } + eachTrainHooks(train, posizioneVisiva); + trainE.add(train); + /* if instead the markup is not present, there is a text + * and we are on the first train ... */ + } else if (s.length() > 0 & zQ == 0) { + ne.datum = "The file \"ele\" must begin with a valid" + + " markup, not with a text: " + s; + ne.code = 1722; + ne.n = rigaJ; + ne.className = this.getClass().getName(); + throw ne; + } else if (s.length() > 0 & p > -1) { + + // NOT CREATION OF A NEW TRAIN, BUT ANYWAY INSTANTIATION + Wagon seg = new Wagon(markupE, stub, s, rigaJ, zQ, + train, posizioneVisiva); + Train f = new Train(seg, rigaJ); + eachTrainHooks(f, posizioneVisiva); + } + posizioneVisiva++; + } + return trainE; + } + + private void eValido(final String s, final int rigaJ, + final String includeY, List zebra, final int m) + + throws ExactException { + + File include = null; + ExactException ne = new ExactException(); + Wagon wagon = null; + try { + int p = s.indexOf(Markup.PIUC); + stub = s.substring(0, p).toLowerCase(); + String dato = s.substring(p + 1); + if (!markupE.containsKey(stub)) { + ne.datum = "The markup " + Mix.dress_A(stub + "+") + + " at line " + posizioneVisiva + + " it is not present among those expected."; + ne.code = 1723; + ne.n = rigaJ; + ne.className = this.getClass().getName(); + throw ne; + } else { + + // sigh of relief, CREATION OF A NEW TRAIN + + /* if it is the first train (undead, i.e. not of type + * 0) */ + if (zQ == 0) { + wagon = new Wagon(markupE, stub, dato, rigaJ, zQ, + null, posizioneVisiva); + } else { // otherwise write down the previous one + wagon = new Wagon(markupE, stub, dato, rigaJ, zQ, + train, posizioneVisiva); + } + if (m == 0) { + train = new Train(); + } + if (train.locomotor == null) { + train.locomotor = wagon; + } else if (train.wagonE.get(wagon.stub) != null) { + ne.datum = "The markup " + Mix.dress_A(wagon.stub) + + " is repeated at line " + posizioneVisiva + + " following " + Mix.dress_A( + train.locomotor.stub + "+" + + train.locomotor.text) + + ", " + "it is not acceptable."; + ne.code = 1734; + ne.n = rigaJ; + ne.className = this.getClass().getName(); + throw ne; + } else if (!markupE.get(wagon.stub).wagon) { + ne.datum = "The markup " + Mix.dress_A(wagon.stub) + + " is a locomotor, it cannot stay in a" + + " wagon position after " + Mix.dress_A( + train.locomotor.stub) + "."; + ne.code = 1735; + ne.n = rigaJ; + ne.className = this.getClass().getName(); + throw ne; + } else { // ... finally okay, I create the train + train.wagonE.put(wagon.stub, wagon); + int j = 0; + for (; j < markupE.get( + wagon.stub).implyE.length; j++) { + if (markupE.get(wagon.stub).implyE[j].isWagon + & markupE.get(wagon.stub).implyE[j].stub + .equals(train.locomotor.stub)) { + break; + } + } + if (j == markupE.get(wagon.stub).implyE.length) { + ne.datum = "The markup " + Mix.dress_A( + wagon.stub) + " is found after " + Mix + .dress_A(train.locomotor.stub) + + ", " + "it is not acceptable."; + ne.code = 1728; + ne.n = rigaJ; + ne.className = this.getClass().getName(); + throw ne; + } + } + if (m == 0) { + markupE.get(stub).recurrenceE.add(train); + } + /* when p calls an include (.eli) */ + if (m == 0 & (markupE.get(train.locomotor.stub).p == 9 + | markupE.get(train.locomotor.stub).p == 10 + | markupE.get(train.locomotor.stub).p == 11 + | markupE.get(train.locomotor.stub).p == 21)) { + train.locomotor.positionJ = trainE.size(); + Collection valueE = train.wagonE.values(); + Iterator iterator = valueE.iterator(); + while (iterator.hasNext()) { + Wagon v = iterator.next(); + v.positionJ = trainE.size(); + } + zQ++; + include = new File(includeY + train.locomotor.stub + + "_" + train.locomotor.substance + ".eli"); + if (include.exists()) { + List includeZ = ReadMyFile.zebra_A( + include.getPath()); + zebra.addAll(rigaJ + 1, includeZ); + posizioneVisiva -= includeZ.size(); + } else { + ne.datum = "The file " + Mix.dress_A(include + .getName()) + " does not exist."; + ne.code = 1724; + ne.n = rigaJ; + ne.className = this.getClass().getName(); + throw ne; + } + /* only if he's not follower ... */ + } else if (!train.locomotor.follower) { + train.locomotor.positionJ = trainE.size(); + Collection valueE = train.wagonE.values(); + Iterator iterator = valueE.iterator(); + while (iterator.hasNext()) { + Wagon v = iterator.next(); + v.positionJ = trainE.size(); + } + zQ++; + } + } + } catch (FileNotFoundException e) { + ne.code = 1726; + ne.datum = "The file " + include.getPath() + + " does not exist."; + ne.className = this.getClass().getName(); + throw ne; + } catch (IOException e) { + ne.code = 1727; + ne.datum = "Error in acceding file «" + include.getPath() + + "»."; + ne.className = this.getClass().getName(); + throw ne; + } + } + + private void fileModelPositions() { + + if (skill.hibernate) { + skill.hibernateVersion = markupE.get("hv").recurrenceE.get( + 0).locomotor.text; + String depenHiberF = "hv_" + skill.hibernateVersion + + ".txt"; + skill.depenHiberG = candies.snippetsYS + depenHiberF; + } + if (skill.jackson) { + String depenJacksonF = "depen_jackson.txt"; + skill.depenJacksonG = candies.snippetsYS + depenJacksonF; + } + if (skill.hiberValid) { + String depenHValidF = "depen_hvalid.txt"; + skill.depenHValidG = candies.snippetsYS + depenHValidF; + } + if (skill.springValid) { + String depenValidatorF = "depen_validator.txt"; + skill.depenValidatorG = candies.snippetsYS + + depenValidatorF; + } + } + + private void securityWrite() + + throws FileNotFoundException, ExactException, IOException { + + FileComponent.addClass("LoggedUser.java", newAnnotation, + "LoggedUser.java", candies, recycleBinY, skill, -1, + markupE, "java"); + FileComponent.addClass("LoggedUserMethodArgumentResolver.java", + newResolver, "LoggedUserMethodArgumentResolver.java", + candies, recycleBinY, skill, -1, markupE, "java"); + FileComponent.addClass("Belonger.java", securityY, + "Belonger.java", candies, recycleBinY, skill, -1, + markupE, "java"); + if (skill.authenticationProvider.equals("class") + && skill.authenticationMode != null + && !skill.authenticationMode.endsWith("trivial")) { + userAuthenticationProvider_java.synthesis(markupE, trainE, + candies); + userAuthenticationProvider_java.write(brickAuthenticationY, + Mix.uppercaseFirstChar(skill.applicationNameLower) + + "UserAuthenticationProvider.java", + "ApplicUserAuthenticationProvider.java", "java", + candies, recycleBinY); + } + FileComponent.addFile("error_jsp.txt", "error.jsp", new723, + candies, recycleBinY, skill); + if (skill.hasUseridPassword) { + FileComponent.addFile("login_jsp.txt", "login.jsp", new722, + candies, recycleBinY, skill); + if (skill.authenticationMode.equals("trivial")) { + king.write(domainY, "King.java", "King.java", "java", + candies, recycleBinY); + kingDao.write(brickAuthenticationY, "KingDao.java", + "KingDao.java", "java", candies, recycleBinY); + kingDaoImpl.write(brickAuthenticationY, + "KingDaoImpl.java", "KingDaoImpl.java", "java", + candies, recycleBinY); + } else { + userAuthorityUtils.write(brickAuthenticationAuthorityY, + "UserAuthorityUtils.java", + "UserAuthorityUtils.java", "java", candies, + recycleBinY); + springSecurityUserContext.write(brickAuthenticationY, + "springSecurityUserContext.java", + "springSecurityUserContext.java", "java", + candies, recycleBinY); + } + interfacciaUserContext.write(brickAuthenticationY, + "UserContext.java", "UserContext.java", "java", + candies, recycleBinY); + userContextImpl.write(brickAuthenticationY, + "UserContextStub.java", "UserContextImpl.java", + "java", candies, recycleBinY); + } + if (skill.hasUseridPassword) { + if (!new File(brickAuthenticationY).exists()) { + ExactException ne = new ExactException( + "You declared the \"userpass\" markup, but" + + " you did not declare an authentication " + + "provider with the \"xprovider\" markups," + + " or you declared \"ldap\"."); + ne.code = 1725; + ne.datum = ne.getMessage(); + ne.className = this.getClass().getName(); + throw ne; + } + if (skill.tableDBE.size() == 0 & !skill.authenticationMode + .equals("trivial")) { + ExactException ne = new ExactException( + "You have declared the \"userpass\" markup," + + " but you have not declared any group" + + " of tables using the \"hdefrail\" markup."); + ne.code = 1729; + ne.datum = ne.getMessage(); + ne.className = this.getClass().getName(); + throw ne; + } else if (skill.tableDBE.size() > 0 & markupE.get( + "utabuser").recurrenceE.size() > 0) { + int j = 0; + for (; j < skill.tableDBE.size(); j++) { + if (skill.tableDBE.get(j).dbSchema.equalsIgnoreCase( + skill.tabUser[3]) & skill.tableDBE.get( + j).railLowercase.equalsIgnoreCase( + Cst.RAIL + skill.tabUser[1]) + & skill.tableDBE.get(j).entityName + .equalsIgnoreCase( + skill.tabUser[0])) { + break; + } + } + if (j == skill.tableDBE.size()) { + ExactException ne = new ExactException( + "The \"utabuser\" markup value indicates a non-existent table name: «" + + skill.tabUser[0] + + "», or a non-existent code «rail» : «" + + skill.tabUser[1] + + "», or a non-existent DB schema: «" + + skill.tabUser[2] + "»"); + ne.code = 1702; + ne.datum = ne.getMessage(); + ne.className = this.getClass().getName(); + throw ne; + } else { + skill.tabUserJ = j; + } + } + } + if (skill.authenticationMode == null) { + /* do nothing */ + } else if (skill.authenticationMode.equals("domain")) { + FileComponent.deleteComponent(brickAuthenticationY, + "SimpleUsernamePasswordAuthenticationToken.java", + recycleBinY, skill); + FileComponent.deleteComponent(brickAuthenticationY, + "SimpleUsernamePasswordAuthenticationFilter.java", + recycleBinY, skill); + FileComponent.addClass( + "DomainUsernamePasswordAuthenticationFilter.java", + brickAuthenticationY, + "DomainUsernamePasswordAuthenticationFilter.java", + candies, recycleBinY, skill, -1, markupE, "java"); + /* for the token class, the index of the users table must be + * provided */ + FileComponent.addClass( + "DomainUsernamePasswordAuthenticationToken.java", + brickAuthenticationY, + "DomainUsernamePasswordAuthenticationToken.java", + candies, recycleBinY, skill, skill.tabUserJ, + markupE, "java"); + } else if (skill.authenticationMode.equals("simple")) { + FileComponent.deleteComponent(brickAuthenticationY, + "DomainUsernamePasswordAuthenticationToken.java", + recycleBinY, skill); + FileComponent.deleteComponent(brickAuthenticationY, + "DomainUsernamePasswordAuthenticationFilter.java", + recycleBinY, skill); + FileComponent.addClass( + "SimpleUsernamePasswordAuthenticationFilter.java", + brickAuthenticationY, + "SimpleUsernamePasswordAuthenticationFilter.java", + candies, recycleBinY, skill, -1, markupE, "java"); + /* for the token class, the index of the users table must be + * provided */ + FileComponent.addClass( + "SimpleUsernamePasswordAuthenticationToken.java", + brickAuthenticationY, + "SimpleUsernamePasswordAuthenticationToken.java", + candies, recycleBinY, skill, skill.tabUserJ, + markupE, "java"); + } + } + + private void securityClean() { + File dest = new File(recycleBinY + "/LoggedUser.java"); + dest.delete(); + new File(newAnnotation + "/LoggedUser.java").renameTo(dest); + dest = new File(recycleBinY + "/Belonger.java"); + dest.delete(); + new File(securityY + "/Belonger.java").renameTo(dest); + dest = new File(recycleBinY + + "/LoggedUserMethodArgumentResolver.java"); + dest.delete(); + new File(newResolver + "/LoggedUserMethodArgumentResolver.java") + .renameTo(dest); + } +} diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/Hammer.java b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/Hammer.java new file mode 100644 index 0000000..820e9e9 --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/Hammer.java @@ -0,0 +1,568 @@ +// +// https://www.ramecera.it/myscrewdriver.html +// e-mail: screwdriver@ramecera.it +// +/* This program and the accompanying materials are made available under + * the terms of the Eclipse Public License v1.0 which accompanies this + * distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html */ +package it.ramecera.screwdriver; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.Collection; +import java.util.HashMap; +import java.util.Iterator; + +import org.apache.log4j.Logger; +import org.apache.log4j.PropertyConfigurator; + +import it.ramecera.salad.everyday.Candies; +import it.ramecera.salad.everyday.ExactException; +import it.ramecera.salad.everyday.Mix; +import it.ramecera.salad.graphic.Placard; + +/** + *

+ * Application to automatically generate skeletons of a Maven + * application. + *

+ * + * @author M. Maglioni + *

+ * ​​Company: Ramecera™
+ * Creation date: 2020-04-09
+ * Last updated: 2020-08-20
+ *

+ */ +final public class Hammer { + + private static ExactException ne = new ExactException(); + + // CONSTANTS + + static boolean allRight; + + /** ordinary logger */ + private static final Logger logger = Logger.getLogger(Hammer.class); + + /** + *

+ * Simple main method. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-08-20
+ *

+ *

+ * History: 2020-08-02 implementation of N13 (see + * martoraProject.ods) + *

+ * + * @param args null + * @throws ExactException exception specified by a numerical code */ + public static void main(String[] args) + + throws ExactException { + + /** the types of markups are:
+ * 1 = a date, mandatory
+ * 2 = an unsigned non-negative integer, mandatory
+ * 3 = a string of at least 1 character, mandatory
+ * 4 = no parameters
+ * 5 = a version of a software, for example 1.3.13.RELEASE + * N6
+ * 6 = a string, optional
+ * 7 = a CSS color, of the type #ffffff or rgb ( 255,255,255) or + * white
+ * 8 = like 12, and automatically converted to lower case
+ * 9 = like 4, but to look for among it includes
+ * 10 = like 3, but to look for among includes
+ * 11 = like 5, but to be found among the includes
+ * 12 = like 3 but composed of a single word
+ * 13 = like 12 but with no more than one slash: example : + * "security / user.jsp", and at least one character after the + * slash
+ * 14 = like 13 but optional, and if there is no data, the one + * of the previous markup is taken
+ * 15 = an integer with or without sign, mandatory
+ * 16 = like 12 but optional
+ * occurrences are:
+ * 17 = a string composed of words separated by commas, + * mandatory
+ * 18 = a string consisting of a select SQL, mandatory
+ * 19 = a string, mandatory one of the values ​​declared in the + * "domain" column
+ * 20 = precedes the text of a file or of a source code
+ * 21 = like 19, but to be searched among the includes
+ * 22 = like 17, but optional
+ * 23 = a language code , ISO 639-1
+ * 24 = like 17, but substrings must be composed by one word * + * presence = 0: none or as many as you want
+ * presence = 1: one and only one
+ * presence = 2: 1 or none
+ * presence = 3: at least 1
+ * presence = 4: none or as many as you want, but without + * identical repetitions
+ * presence = 5: at least 1, but without identical repetitions + *
+ * Atoms, taken at 5 to 5, they go to form the markups. */ + /* @formatter:off */ + String[][] atomi = { + { "antisamy", "4", "2", "", "", "", "", "" }, + { "appse", "3", "1", "", "", "", "", "" }, + { "arraystring", "3", "3", "+jsp", "", "", "", "" }, + { "bdefmenu", "8", "4", "indexjsp", "", "bfixedtop", "", "" }, + { "belong", "3", "0", "+jsp", "", "", "", "" }, + { "bfixedtop", "4", "0", "+bdefmenu", "", "", "", "" }, + { "blabel", "3", "0", "bdefmenu", "burl", "", "", "" }, + { "blank", "4", "0", "+jsp", "", "", "", "" }, + { "bmenu", "8", "0", "+jsp, +indexjsp, +userpass", "", "", "", "" }, + { "boolean", "3", "3", "+jsp", "", "", "", "" }, + { "burl", "12", "3", "+blabel", "", "", "", "" }, + { "captc", "3", "2", "", "", "", "", "" }, + { "charset", "3", "2", "", "", "", "", "" }, + { "colorform", "7", "2", "userpass", "", "", "", "" }, + { "crud", "4", "0", "+jsp", "", "", "", "" }, + { "cssclass", "12", "4", "+text,+jsp", "", "", "", "" }, + { "dao", "24", "0", "+method, +formn", "", "", "", "" }, + { "defaulan", "23", "2", "", "", "", "", "" }, + { "depen", "2", "1", "", "", "", "", "" }, + { "dress", "12", "0", "+jsp", "", "", "", "" }, + { "edefn", "14", "0", "", "", "", "", "" }, + { "ev", "5", "2", "", "", "", "", "" }, + { "fcartel", "3", "0", "+formn", "", "", "", "" }, + { "file", "20", "4", "", "", "", "", "" }, + { "filte", "4", "2", "", "", "", "", "" }, + { "company", "3", "1", "", "", "", "", "" }, + { "flabel", "3", "0", "+formt,+formn,+forma,+formc,+formr", "", "", "", "" }, + { "forma", "3", "0", "jsp", "flabel", "", "", "forma, formc, formt, formn, formr, jsp, valcons" }, + { "formc", "3", "0", "jsp", "flabel", "", "", "forma, formc, formt, formn, formr, jsp, valcons" }, + { "formn", "3", "0", "jsp", "flabel, fcartel", "mybutton, dao, hsqln, ftokens", "", "forma, formc, formt, formn, formr, jsp, valcons" }, + { "formr", "3", "0", "jsp", "ftokens", "flabel, fstart", "", "forma, formc, formt,formn, formr, jsp, valcons" }, + { "formt", "3", "0", "jsp", "flabel", "", "", "forma, formc, formt,formn, formr, jsp, valcons" }, + { "fstart", "3", "0", "+formr", "", "", "", "" }, + { "ftokens", "17", "0", "+formn,+formr", "", "", "", "" }, + { "goal", "13", "3", "+requmap", "", "", "", "" }, + { "hdbms", "19", "0", "+hdefrail", "", "", "DB2, MySQL, Oracle, Oracle8i, Postgres", "" }, + { "hdbschema", "8", "4", "+hdefrail", "", "", "", "" }, + { "hdefrail", "19", "0", "", "hdbschema, hdbms", + "hjndi, hjarv", "0,1,2,3,4,5,6,7,8,9", "" }, + /* FUTURE RELEASE N6 */ +// { "hddl", "17", "2", "", "", "", "", "" }, +// { "hembedded", "4", "2", "", "", "", "", "" }, + { "hjarv", "5", "3", "+hdefrail", "", "", "", "" }, + { "hjndi", "12", "0", "+hdefrail", "", "", "", "" }, + { "hjpav", "19", "1", "+hv", "", "", "1,2", "", "" }, + { "hrail", "2", "0", "+utabuser, +qjobname", "", "", "", "" }, + { "hsqln", "18", "0", "+formn", "", "", "", "" }, + { "hv", "5", "2", "", "hjpav", "", "", "" }, + { "hvalid", "5", "2", "!svalid", "", "", "", "" }, + { "i18n", "3", "2", "sinterce", "", "", "", "" }, + { "indexjsp", "4", "2", "", "", "bmenu, ooptioncolor, ooptionhover, ooptbackcol1, ooptbackcol2", "", "" }, + { "integer", "3", "3", "+jsp", "", "", "", "" }, + { "jacksonver", "3", "2", "", "", "", "", "" }, + { "jeev", "5", "2", "", "", "", "", "" }, + { "jsp", "13", "4", "", "belong", + "bmenu, string, arraystring, integer, long, boolean, dress, cssclass, refresh, pagetitle, crud, blank, legend", "", "" }, + { "language", "23", "0", "i18n", "", "", "", "" }, + { "legend", "3", "0", "+jsp", "", "", "", "" }, + { "log4j", "5", "2", "", "", "", "", "" }, + { "long", "3", "3", "+jsp", "", "", "", "" }, + { "matrix", "4", "2", "", "", "", "", "" }, + { "mavbu", "4", "2", "mavcl, mavwa, mavcp", "", "", "", "" }, + { "mavcl", "5", "2", "mavbu, mavwa, mavcp", "", "", "", "" }, + { "mavco", "5", "1", "", "", "", "", "" }, + { "mavcp", "5", "2", "mavbu, mavwa, mavcl", "", "", "", "" }, + { "mavgr", "3", "1", "", "", "", "", "" }, + { "mavmo", "5", "1", "", "", "", "", "" }, + { "mavwa", "5", "2", "mavbu, mavcp, mavcl", "", "", "", "" }, + { "method", "20", "4", "", "", "", "", "" }, + { "model", "4", "3", "+requmap", "", "", "", "" }, + { "mv", "5", "1", "", "", "", "", "" }, + { "mybutton", "3", "0", "+formn, +formt, +forma", "", "", "", "" }, + { "oalign", "19", "3", "+odefcss", "", "", "left, center, right", "" }, + { "odefcss", "12", "4", "", "", "", "", "" }, + { "ooptbackcol1", "7", "0", "+indexjsp", "", "", "", "" }, + { "ooptbackcol2", "7", "0", "+indexjsp", "", "", "", "" }, + { "obackcolor", "7", "3", "+odefcss", "", "", "", "" }, + { "ocolor", "7", "3", "+odefcss", "", "", "", "" }, + { "ofontsize", "15", "3", "+odefcss", "", "", "", "" }, + { "omargin", "15", "3", "+odefcss", "", "", "", "" }, + { "ooptioncolor", "7", "0", "+indexjsp", "", "", "", "" }, + { "ooptionhover", "7", "0", "+indexjsp", "", "", "", "" }, + { "opadding", "15", "3", "+odefcss", "", "", "", "" }, + { "others", "24", "0", "+method", "", "", "", "" }, + { "pagetitle", "3", "0", "+jsp", "", "", "", "" }, + { "permit", "19", "0", "+requmap", "", "", "all, user, admin", "" }, + { "pompr", "2", "2", "", "", "", "", "" }, + { "pragma", "4", "2", "jsp", "", "", "", "" }, + { "pretprint", "4", "2", "sv+3.2.0", "", "", "", "" }, + { "primary", "10", "2", "", "", "", "", "" }, + { "qcron", "3", "2", "+qjobname", "", "", "", "" }, + { "qjobname", "12", "0", "quartz", "hrail", "qcron, qsimple", "", "" }, + { "quartz", "5", "2", "qjobname", "", "", "", "" }, + { "qsimple", "3", "2", "+qjobname", "", "", "", "" }, + { "redirect", "3", "0", "+requmap", "", "", "", "" }, + { "refresh", "2", "0", "+jsp", "", "", "", "" }, + { "requmap", "12", "0", "jsp", "", "model, permit, goal, redirect", "", "" }, + { "sdefauto", "19", "2", "", "", "", "no, byname, bytype, autodetect, constructor", "" }, + { "sieco", "14", "0", "", "", "", "", "" }, + { "sinterce", "12", "0", "", "", "", "", "" }, + { "uintp", "12", "0", "uv", "", "", "", "" }, + { "sreso", "16", "4", "", "", "", "", "" }, + { "srobo", "4", "2", "", "", "", "", "" }, + { "string", "3", "3", "+jsp", "", "", "", "" }, + { "sv", "5", "1", "primary", "", "", "", "" }, + { "svalid", "4", "2", "!hvalid", "", "", "", "" }, + { "text", "3", "2", "indexjsp", "cssclass", "", "", "" }, + { "upassword", "12", "2", "+utabuser", "", "", "", "" }, + { "userpass", "21", "2", "uv", "", "bmenu", + "simple, domain, trivial", "" }, + { "uspaformadmin", "3", "2", "userpass+trivial", "", "", "", "" }, + { "uspaformuser", "3", "2", "userpass+trivial", "", "", "", "" }, + { "usignup", "4", "2", "userpass", "", "", "", "" }, + { "utabuser", "12", "2", "userpass", + "hrail, uwelcome, upassword", "", "", "" }, + { "uv", "5", "2", "sv, xprovider", "", "", "", "" }, + { "uwelcome", "12", "2", "+utabuser", "", "", "", "" }, + { "valcons", "19", "0", "defaulan", "valtag", "valparams", "@AssertFalse, @AssertFalse.List, @AssertTrue, @AssertTrue.List, @DecimalMax, @DecimalMax.List, @DecimalMin, @DecimalMin.List, @Digits, @Digits.List, @Future, @Future.List, @Max, @Max.List, @Min, @Min.List, @NotEmpty, @NotNull, @NotNull.List, @Null, @Null.List, @Past, @Past.List, @Pattern, @Pattern.List, @Size, @Size.List", "formt, forma, formc, valcons" }, + { "vallabel", "3", "0", "defaulan", "valmess", "vallang", "", "" }, + { "vallang", "23", "0", "+vallabel", "", "", "", "" }, + { "valmess", "3", "0", "+vallabel", "", "", "", "" }, + { "valparams", "3", "0", "+valcons", "", "", "", "" }, + { "valtag", "3", "0", "+valcons", "", "", "", "" }, + { "weberror", "4", "2", "", "", "", "", "" }, + { "webmime", "4", "2", "", "", "", "", "" }, + { "wparams", "3", "0", "", "", "", "", "" }, + { "wv", "5", "2", "", "", "", "", "" }, + { "xauth", "18", "2", "xprovider+jdbc, !xgbac", "", "", "", "" }, + { "xencoder", "19", "2", "uv", "", "", "useridmd5, saltedsha256", "" }, + { "xlbase", "12", "2", "xprovider+ldap", "", "", "", "" }, + { "xgbac", "18", "2", "xprovider+jdbc, !xauth, !xusers", "", + "", "", "" }, + { "xlpass", "12", "2", "xprovider+ldap", "", "", "", "" }, + { "xlclass", "3", "2", "xprovider+ldap", "", "", "", "" }, + { "xlservice", "4", "2", "xprovider", "", "", "", "" }, + { "xprovider", "19", "2", "uv", "", "", + "user-service, class, jdbc, ldap", "" }, + { "xusers", "18", "2", "xprovider+jdbc, !xgbac", "", "", "", "" } }; + + /* @formatter:on */ + PropertyConfigurator.configure("log4j.properties"); + + // READING PROPERTIES + + if (args.length == 0) { + new Placard(null, "An argument is missing at the" + + " start of the main method."); + return; + } + String message = "Start of process"; + logger.info(Candies.LF + Candies.LF + + "===========================================" + + Candies.LF + message + Candies.LF + + "==========================================="); + CandyScrew candyScrew = new CandyScrew(); + candyScrew.appName = args[0]; + if (!candyScrew.appName.matches("\\p{Alpha}\\p{Graph}*")) { + Mix.discloseError("The application name " + Mix.dress_A( + candyScrew.appName) + " is incorrect.", "Stop", + logger); + return; + } + candyScrew.ele = candyScrew.appName + ".ele"; + try { + candyScrew.readProperties(candyScrew.appName); + logger.trace(candyScrew.toString()); + logger.info(Candies.LF + Cst.CUT0 + "ELEMENTARY FILE: " + + candyScrew.appName + Candies.LF + Cst.CUT0); + } catch (ExactException e) { + Mix.discloseError( + "Reading the properties, an error was found." + e + .getMessage(), "Stop", logger); + return; + } + + // IMPLEMENTATION OF THE LIST OF MARKUPS + + try { + // I instantiate the markups array + HashMap markupE = markupFactory(atomi); + Collection valueMarkupE = markupE.values(); + supposedMarkupsCheck(valueMarkupE.iterator(), markupE); + precedingOnesControl(valueMarkupE.iterator(), markupE); + logger.trace(markupE_toString(markupE)); + ElementaryFile elementaryFile = new ElementaryFile(markupE, + candyScrew); + elementaryFile.appName = candyScrew.appName; + /* we perform the transformation from ELE file to the trains + * structure */ + elementaryFile.trainFactory(candyScrew.inputYS, + candyScrew.ele, candyScrew.includeYS); + /* now I have the list of markups (and trains, therefore of + * occurrence), I scroll it to check the attendance */ + elementaryFile.controlloPresenze(); + /* checking the validity of a tape based on the version of a + * certain software */ + elementaryFile.substantialChecks(); + + // CONVERT + + /* the "convert" method turns trains into a maven / spring + * web app; remember that the elementary object is the input + * file */ + + elementaryFile.convert(); + + allRight = true; + message = "Process ending."; + } catch (ExactException e) { + message = ""; + if (e.className != null) { + message += "Class: " + e.className + Candies.LF; + } + if (e.method != null) { + message += "Method: " + e.method + Candies.LF; + } + if (e.datum != null) { + message += Candies.LF + e.datum; + } + logger.error(message); + new Placard(null, message, "Error code " + e.code); + message = "Process ending NO OK."; + } catch (FileNotFoundException e) { + ExactException ne = new ExactException(); + ne.datum = e.getMessage(); + ne.code = 1500; + logger.error(ne.datum); + new Placard(null, ne.datum, "Error code " + ne.code); + message = "Process ending NO OK."; + } catch (IOException e) { + e.printStackTrace(); + } + Mix.discloseInfo(message, "Notice", logger); + } + + /** + *

+ * Classic toString method, other than the fact that it is static. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09
+ *

+ * + * @param mE list of markups + * @return the compound string */ + public static String markupE_toString(HashMap mE) { + String s = ""; + s += Candies.LF + Candies.LF + Candies.LF + Candies.LF; + s += Cst.CUT0; + s += "ELENCO DEI MARKUP E DEI LORO PRESUPPOSTI" + Candies.LF; + s += Cst.CUT0; + Collection valueMarkupE = mE.values(); + Iterator iteratorMarkup = valueMarkupE.iterator(); + while (iteratorMarkup.hasNext()) { + Markup m = iteratorMarkup.next(); + s += Cst.CUT0; + s += "stub = " + m.stub; + s += "; p = " + m.p; + s += "; presenza = " + m.presenza; + if (m.mandatoryWagE != null) { + s += "; obbligatori = "; + for (String t : m.mandatoryWagE) { + s += t + ", "; + } + /* I cut the last 2 characters: "," */ + s = s.substring(0, s.length() - 2); + } + if (m.optionalWagE != null) { + s += "; facoltativi = "; + for (String t : m.optionalWagE) { + s += t + ", "; + } + /* I cut the last 2 characters: "," */ + s = s.substring(0, s.length() - 2); + } + if (m.wagon) { + s += "; it is a wagon" + Candies.LF; + } + s += Candies.LF; + if (m.implyE != null && m.implyE.length > 0) { + for (int i = 0; i < m.implyE.length; i++) { + Imply p = m.implyE[i]; + s += p.toString(i); + } + } + if (m.recurrenceE.size() > 0) { + s += " reciurrences list, quantity " + + m.recurrenceE.size() + Candies.LF; + for (int i = 0; i < m.recurrenceE.size(); i++) { + s += Cst.CUT2; + s += " Recurrence " + i + Candies.LF; + s += " " + m.recurrenceE.get(i).locomotor + .toString(0, mE); + Collection valueWagonE = m.recurrenceE.get( + i).wagonE.values(); + Iterator iteratorWagon = valueWagonE + .iterator(); + int j = 1; + while (iteratorWagon.hasNext()) { + Wagon wagon = iteratorWagon.next(); + s += " " + wagon.toString(j, mE); + j++; + } + } + } + } + s += Candies.LF; + return s; + } + + private static HashMap markupFactory( + String[][] atomi) + + throws ExactException { + + HashMap markupE = new HashMap(); + for (int i = 0; i < atomi.length; i++) { + Markup markup = new Markup(); + markup.markupFactory(atomi, i); + if (markupE.containsKey(markup.stub)) { + ne.datum = "The markup " + Mix.dress_A(markup.stub) + + " it is repeated in the markup definition table."; + ne.code = 1502; + throw ne; + } + markupE.put(markup.stub, markup); + } + return markupE; + } + + private static void supposedMarkupsCheck(Iterator iterator, + HashMap markupE) + + throws ExactException { + + while (iterator.hasNext()) { + Markup m = iterator.next(); + /* if the assumption markup declaration is present ... */ + if (m.implyE != null) { + for (int n = 0; n < m.implyE.length; n++) { + if (!m.implyE[n].stub.equals("")) { + if (!markupE.containsKey(m.implyE[n].stub)) { + ne.datum = "The markup " + Mix.dress_A( + m.implyE[n].stub) + ", supposed by " + + Mix.dress_A(m.stub) + + ", does not exist."; + ne.code = 1501; + throw ne; + } else if (m.implyE[n].isWagon) { + markupE.get(m.implyE[n].stub).wagon = false; + markupE.get(m.stub).wagon = true; + } + } + } + } + /* the following 2 checks verify the accuracy of the + * definition of the atoms, and regardless of what will then + * be written in the .ele file */ + if (m.mandatoryWagE != null) { + controlloObbligatori(markupE, m); + } + if (m.optionalWagE != null) { + controlloFacoltativi(markupE, m); + } + } + } + + /** + *

+ * Check the validity of the list of previous markups. + *

+ * + * @author M. Maglioni + *

+ * ​​Company: Ramecera™
+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09
+ *

+ */ + + private static void precedingOnesControl(Iterator iterator, + HashMap markupE) + + throws ExactException { + + while (iterator.hasNext()) { + Markup m = iterator.next(); + /* if the assumption markup declaration is present ... */ + if (m.precedingE != null) { + for (int n = 0; n < m.precedingE.length; n++) { + if (!markupE.containsKey(m.precedingE[n])) { + ne.datum = "The markup " + Mix.dress_A( + m.precedingE[n]) + + ", declared as previous by «" + Mix + .dress_A(m.stub) + + ", does not exist."; + ne.code = 1506; + throw ne; + } + } + } + } + } + + private static void controlloFacoltativi( + HashMap markupE, Markup m) + + throws ExactException { + + for (int j = 0; j < m.optionalWagE.length; j++) { + if (!markupE.containsKey(m.optionalWagE[j])) { + ne.datum = "The markup " + Mix.dress_A( + m.optionalWagE[j]) + ", optional for " + Mix + .dress_A(m.stub) + ", does not exist."; + ne.code = 1504; + throw ne; + } else if (m.mandatoryWagE != null) { + for (int j1 = 0; j1 < m.mandatoryWagE.length; j1++) { + if (m.optionalWagE[j].equals(m.mandatoryWagE[j1])) { + ne.datum = "The markup " + Mix.dress_A( + m.optionalWagE[j]) + + ", cannot be both optional and mandatory."; + ne.code = 1505; + throw ne; + } + } + } + } + } + + private static void controlloObbligatori( + HashMap markupE, Markup m) + + throws ExactException { + + for (int j = 0; j < m.mandatoryWagE.length; j++) { + if (!markupE.containsKey(m.mandatoryWagE[j])) { + ne.datum = "The markup " + Mix.dress_A( + m.mandatoryWagE[j]) + ", obbligatorio per " + + Mix.dress_A(m.stub) + ", does not exist."; + ne.code = 1503; + throw ne; + } else if (m.optionalWagE != null) { + for (int j1 = 0; j1 < m.optionalWagE.length; j1++) { + if (m.mandatoryWagE[j].equals(m.optionalWagE[j1])) { + ne.datum = "The markup " + Mix.dress_A( + m.mandatoryWagE[j]) + + ", cannot be both optional and mandatory."; + ne.code = 1504; + throw ne; + } + } + } + } + } +} diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/Imply.java b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/Imply.java new file mode 100644 index 0000000..5b0bfb1 --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/Imply.java @@ -0,0 +1,113 @@ +// +// https://www.ramecera.it/myscrewdriver.html +// e-mail: screwdriver@ramecera.it +// +/* This program and the accompanying materials are made available under + * the terms of the Eclipse Public License v1.0 which accompanies this + * distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html */ +package it.ramecera.screwdriver; + +import it.ramecera.salad.everyday.Candies; + +/** + *

+ * The assumed tags, i.e. the ones that must be present or absent in the + * .ele file, with their possible values. + *

+ *

+ * Company: Rameceraâ„¢
+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Modifications:
+ *

+ * + * @author M. Maglioni */ +final public class Imply { + + /** the name of the markup */ + public String stub; + /** the markup value */ + public String value; + /** if it must be present (true) or if it must be absent (false) */ + public boolean direct = true; + /** if it is a wagon type markup, i.e. subsequent, on the same + * line */ + public boolean isWagon; + + /** + *

+ * Ordinary constructor. + *

+ *

+ * Company: Rameceraâ„¢
+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Modifications:
+ *

+ * + * @param stub the name of the markup + * @param value the value of the markup + * @param direct if it must be present (true) or if it must be + * absent (false) + * @param isWagon if it is a tab of type wagon , that is to say that + * it is found in tow with another, which is called the + * head */ + public Imply(final String stub, final String value, + final boolean direct, final boolean isWagon) { + super(); + this.stub = stub; + this.value = value; + this.direct = direct; + this.isWagon = isWagon; + } + + /** + *

+ * Default constructor. + *

+ *

+ * Company: Rameceraâ„¢
+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Modifications:
+ *

+ */ + public Imply() { + } + + /** + *

+ * Classic toString method. + *

+ *

+ * Company: Rameceraâ„¢
+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Modifications:
+ *

+ * + * @param i index of the assumption + * @return the compound string */ + public String toString(final int i) { + String s = ""; + s += " implied " + i + "): stub = " + stub; + if (value != null && !value.isEmpty()) { + s += "; value = " + value; + } + s += "; direct = " + direct; + if (isWagon) { + s += "; FOLLOWED BY = " + isWagon; + } + s += ";" + Candies.LF; + return s; + } +} diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/Markup.java b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/Markup.java new file mode 100644 index 0000000..1af7fb1 --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/Markup.java @@ -0,0 +1,286 @@ +// +// https://www.ramecera.it/myscrewdriver.html +// e-mail: screwdriver@ramecera.it +// +/* This program and the accompanying materials are made available under + * the terms of the Eclipse Public License v1.0 which accompanies this + * distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html */ +package it.ramecera.screwdriver; + +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Pattern; + +import org.apache.log4j.Logger; + +import it.ramecera.salad.everyday.ExactException; +import it.ramecera.salad.everyday.Mix; +import it.ramecera.salad.everyday.Universal; + +/** + *

+ * Markup objects are simply 5-character words, called stub (stub + * = "mother" in a bank check book) placed at the beginning of each + * line; in the public properties we also have the type of markup, + * indicated for each of them, and the list of occurrencesE, used + * only later, after reading the ele file. + *

+ *

+ * Company: Rameceraâ„¢
+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Modifications:
+ *

+ * + * @author M. Maglioni */ + +final public class Markup { + + // + // PUBLIC PROPERTIES + // + + /** the type of markup, according to their use */ + public int p; + /** the prescription of its frequency */ + public int presenza; + /** the name of the markup, of 5 lowercase alphabetic characters */ + public String stub; + /** the name of the other markups that must be present or not + * present when there is this, and any allowed or necessary + * values */ + public Imply[] implyE; + /** in reference to the directly preceding markups, the list of the + * possible ones */ + public String[] precedingE; + /** if the markup can only be a wagon */ + public boolean wagon; + /** list of mandatory wagons that must follow */ + public String[] mandatoryWagE; + /** list of optional wagons that may follow */ + public String[] optionalWagE; + /** list of compulsory and optional wagons that can follow + * together */ + public String[] unioneE; + /** list of possible data values */ + public String[] expectedValueE; + /** the various points where the recurrence of this markup was found + * in trains; these numbers are the progressive in the train file, + * not in the input file, which in general is longer */ + public List recurrenceE = new ArrayList(); + + /** ordinary logger */ + private static final Logger logger = Logger.getLogger(Markup.class); + + // CONSTANT + + /** minimum length of a markup */ + final public static int MAR_LP = 2; + /** maximum length of a markup */ + final public static int MAR_LM = 16; + /** sign +, as a string */ + final public static String PIU = "+"; + /** sign +, as hexadecimal */ + final public static String PIUX = "2b"; + /** sign +, as char */ + final public static char PIUC = PIU.charAt(0); + + // + // PUBLIC METHODS + // + + /** + *

+ * This constructor is used to acquire the list of available + * markups. The atom array in question receives the data defined at + * the beginning of the Screwdriver class. + *

+ *

+ * Company: Rameceraâ„¢
+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ * + * @param atomi the array of strings to load both the names of the + * markups, and each type + * @param k the index of the pair to be used + * @throws ExactException standard error */ + final public void markupFactory(String[][] atomi, int k) + + throws ExactException { + + // maximum value the markup type can take + final int TIPO_M = 24; + // maximum value the presence code can take + final int PRESENCE_M = 5; + ExactException ce = new ExactException(); + stub = atomi[k][0].toLowerCase(); + String r = atomi[k][1]; + if (!Pattern.matches("\\d+", r)) { + ce.datum = "The 2nd element of the markup definition «" + + stub + "» is not a number, it is «" + r + "»."; + ce.className = this.getClass().getName(); + ce.code = 2300; + throw ce; + } + String q = atomi[k][2]; + if (!q.matches("\\d")) { + ce.datum = "The 3rd element of the markup definition «" + + stub + "» is not a number, it is «" + q + "»."; + ce.className = this.getClass().getName(); + ce.code = 2301; + throw ce; + } else { + presenza = Integer.valueOf(q).intValue(); + } + if (presenza > PRESENCE_M) { + ce.datum = "The 3rd element of the markup «" + stub + + "» is greater than " + PRESENCE_M + "."; + ce.className = this.getClass().getName(); + ce.code = 2301; + throw ce; + } + p = Integer.valueOf(r); + /* check that the type takes a value between 0 and the value + * defined as maximum */ + if (p < 0 | p > TIPO_M) { + ce.code = 2303; + ce.datum = "Markup: the number «" + p + "» in the " + k + + "th markup definition is incorrect."; + ce.className = this.getClass().getName(); + throw ce; + } + if (!stub.matches("\\p{Alnum}{" + MAR_LP + "," + MAR_LM + + "}")) { + ce.code = 2304; + ce.datum = "The markup " + Mix.dress_A(stub) + + " is incorrect, it must be from " + MAR_LP + + " to " + MAR_LM + " alphanumeric characters."; + ce.className = this.getClass().getName(); + throw ce; + } + /* checks on presupposeE must be postponed until after the + * acquisition of all markups */ + if (!atomi[k][3].equals("")) { // x2c is the comma + String[] s = atomi[k][3].toLowerCase().split("\\x2c"); + implyE = new Imply[s.length]; + for (int j = 0; j < implyE.length; j++) { + implyE[j] = new Imply(); + implyE[j].stub = s[j].trim(); + implyE[j].direct = !implyE[j].stub.startsWith("!"); + if (!implyE[j].direct) { + implyE[j].stub = implyE[j].stub.substring(1); + } + implyE[j].isWagon = implyE[j].stub.startsWith( + Markup.PIU); + if (implyE[j].isWagon) { + /* I remove the initial + */ + implyE[j].stub = implyE[j].stub.substring(1); + } + String h[] = implyE[j].stub.split("\\x" + Markup.PIUX); + if (h.length == 1) { + implyE[j].value = ""; + } else { + implyE[j].stub = h[0]; + implyE[j].value = h[1]; + } + if (implyE[j].stub.equals(stub)) { + ce.code = 2305; + ce.datum = "The markup " + Mix.dress_A( + implyE[j].stub) + + "» (supposed) cannot be equal to markup " + + Mix.dress_A(stub) + " (main)."; + ce.className = this.getClass().getName(); + throw ce; + } + } + } + /* in position [4] we find the compulsory wagons */ + int totale = 0; + String s = atomi[k][4].trim(); + if (s.isEmpty()) { + mandatoryWagE = null; + } else { + mandatoryWagE = s.split("\\x2c"); + totale += mandatoryWagE.length; + for (int i = 0; i < mandatoryWagE.length; i++) { + mandatoryWagE[i] = mandatoryWagE[i].trim() + .toLowerCase(); + if (!Pattern.matches("\\p{Alnum}+", mandatoryWagE[i])) { + Mix.discloseError("In the definition of " + Mix + .dress_A(stub) + " the mandatory wagon " + + Mix.dress_A(mandatoryWagE[i]) + + " is incorrect.", "Alarm", logger); + } + } + } + /* in position [5] we find the optional wagons */ + s = atomi[k][5].trim(); + if (s.isEmpty()) { + optionalWagE = null; + } else { + optionalWagE = s.split("\\x2c"); + totale += optionalWagE.length; + for (int i = 0; i < optionalWagE.length; i++) { + optionalWagE[i] = optionalWagE[i].trim().toLowerCase(); + if (!Pattern.matches("\\p{Alnum}+", optionalWagE[i])) { + Mix.discloseError("In the definition of " + Mix + .dress_A(stub) + " the optional wagon " + + Mix.dress_A(optionalWagE[i]) + + " is incorrect.", "Alarm", logger); + } + } + } + if (totale > 0) { + unioneE = new String[totale]; + if (mandatoryWagE != null) { + for (int i = 0; i < mandatoryWagE.length; i++) { + unioneE[i] = mandatoryWagE[i]; + } + } + if (optionalWagE != null) { + for (int i = 0; i < optionalWagE.length; i++) { + unioneE[i + totale + - optionalWagE.length] = optionalWagE[i]; + } + } + } + /* in position [7] we find the possible previous locomotives */ + s = atomi[k][7].trim(); + if (s.isEmpty()) { + precedingE = null; + } else { + // x2c is the comma + precedingE = s.split("\\x2c"); + for (int i = 0; i < precedingE.length; i++) { + precedingE[i] = precedingE[i].trim().toLowerCase(); + if (!Pattern.matches("\\p{Alnum}+", precedingE[i])) { + Mix.discloseError("In the definition of " + Mix + .dress_A(stub) + " the preceding locomotor " + + Mix.dress_A(precedingE[i]) + + " is incorrect.", "Alarm", logger); + } + } + } + /* position 6 is dominion, a list of strings delimited by + * commas */ + String w = atomi[k][6].trim(); + String tipo = atomi[k][1].trim(); + if (tipo.equals("23")) { + expectedValueE = new String[Universal.languageE.length]; + for (int i = 0; i < Universal.languageE.length; i++) { + expectedValueE[i] = Universal.languageE[i][1]; + } + } else if (w.isEmpty()) { + expectedValueE = null; + } else { + expectedValueE = w.split("\\x2c"); // x2c is comma + for (int i = 0; i < expectedValueE.length; i++) { + expectedValueE[i] = expectedValueE[i].trim(); + } + } + } +} diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/Skill.java b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/Skill.java new file mode 100644 index 0000000..09f58c4 --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/Skill.java @@ -0,0 +1,2192 @@ +// +// https://www.ramecera.it/myscrewdriver.html +// e-mail: screwdriver@ramecera.it +// +/* This program and the accompanying materials are made available under + * the terms of the Eclipse Public License v1.0 which accompanies this + * distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html */ +package it.ramecera.screwdriver; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; + +import it.ramecera.salad.everyday.Candies; +import it.ramecera.salad.everyday.ExactException; +import it.ramecera.salad.everyday.Mix; +import it.ramecera.salad.everyday.StringInt; +import it.ramecera.salad.everyday.Strings; +import it.ramecera.salad.everyday.Universal; +import it.ramecera.salad.file.Equipment; +import it.ramecera.salad.file.ReadMyFile; +import it.ramecera.salad.graphic.Remember; +import it.ramecera.screwdriver.component.FileComponent; +import it.ramecera.screwdriver.outfits.ClockHands; +import it.ramecera.screwdriver.outfits.ControllerBelong; +import it.ramecera.screwdriver.outfits.Costume; +import it.ramecera.screwdriver.outfits.ELEMethod; +import it.ramecera.screwdriver.outfits.JspBeanElement; +import it.ramecera.screwdriver.outfits.JspKit; +import it.ramecera.screwdriver.outfits.RequestMap; +import it.ramecera.screwdriver.outfits.TableOutfit; +import it.ramecera.screwdriver.utilities.ValidationLabelScrew; +import it.ramecera.screwdriver.utilities.ValidationMessageScrew; + +/** + *

+ * Class of characteristic elements of the application to be created. + *

+ * + * @author M. Maglioni + *

+ * ​​Company: Ramecera™
+ * Creation date: 2020-04-09
+ * Last updated: 2020-09-09
+ *

+ *

+ * History:
+ * The description of N# is in project plan report
+ * 2020-09-03 implementation of N3
+ * 2020-09-09 implementation of N8
+ *

+ */ +final public class Skill { + + private static final String sep = System.getProperty( + "file.separator"); + private static final String SCREW_MAVEN = ".screwMaven"; + // BOOLEAN CHARACTERISTICS + /** Boolean characteristic */ + public boolean spring = false; + /** Boolean characteristic */ + public boolean springSecurity = false; + /** Boolean characteristic */ + public boolean tiles = false; + /** Boolean characteristic */ + public boolean filter = false; + /** Boolean characteristic */ + public boolean antiSamy = false; + /** Boolean characteristic */ + public boolean captcha = false; + /** Boolean characteristic */ + public boolean ldap = false; + /** Boolean characteristic */ + public boolean webFlow = false; + /** Boolean characteristic */ + public boolean internalProperties = false; + /** Boolean characteristic */ + public boolean pomProperties = false; + /** Boolean characteristic */ + public boolean mavenBuild = false; + /** Boolean characteristic */ + public boolean mavenCompiler = false; + /** Boolean characteristic */ + public boolean mavenCompilerPlugin = false; + /** Boolean characteristic */ + public boolean mavenWarPlugin = false; + /** Boolean characteristic */ + public boolean mavenCleanPlugin = false; + /** Boolean characteristic */ + public boolean springValid = false; + /** Boolean characteristic */ + public boolean robots = false; + /** Boolean characteristic */ + public boolean i18n = false; + /** Boolean characteristic */ + public boolean viewController = false; + /** Boolean characteristic */ + public boolean defaultAutowire = false; + /** Boolean characteristic */ + public boolean interceptor = false; + /** Boolean characteristic */ + public boolean matrixVariables = false; + /** Boolean characteristic */ + public boolean hibernate = false; + /** Boolean characteristic */ + public boolean dependencies = false; + /** Boolean characteristic */ + public boolean jackson; + /** Boolean characteristic */ + public boolean prettyPrint; + /** Boolean characteristic */ + public boolean hiberValid; + /** Boolean characteristic */ + public boolean mimeMapping; + /** Boolean characteristic */ + public boolean errorPage; + /** Boolean characteristic */ + public boolean indexJsp; + /** Boolean characteristic */ + public boolean hasJsp; + /** Boolean characteristic */ + public boolean hasForm; + /** Boolean feature, reveals the presence of the "userpass" + * markup */ + public boolean hasUseridPassword; + /** Boolean characteristic */ + /* FUTURE RELEASE N6 */ + // public boolean embedded; + /** Boolean characteristic */ + public boolean ldapService; + /** Boolean characteristic */ + public boolean signup; + /** Boolean characteristic */ + private boolean remember; + private boolean wellIPermit; + + // SOFTWARE VERSIONS + /** software version */ + public String applicationServer; + /** software version */ + public String jeeVersion; + /** software version */ + public String springVersion; + /** 1st parameter (macro) of the software version */ + public int springVersion1m; + /** software version */ + public String tilesVersion; + /** software version */ + public String mavenCompilerVersion; + /** software version */ + public String mavenCompilerPluginVersion; + /** software version */ + public String mavenWarPluginVersion; + /** software version */ + public String mavenCleanPluginVersion; + /** software version */ + public String captchaVersion; + /** software version */ + public String webflowVersion; + /** software version */ + public String springSecurityReductVersion; + /** software version */ + public String springSecurityVersion; + /** software version */ + public String jacksonVersion; + /** software version */ + public String log4jVers; + /** software version */ + public String quartzVers; + /** software version */ + public String hiberValidVersion; + /** software version */ + public String hibernateVersion; + /** 1st parameter (macro) of the software version */ + public int hibernateVersion1m; + /** software version */ + public int jpaVersion; + /** software version */ + public String hibernateReductVersion; + + // PATHS AND FILES NAMES + + /** path of Java sources */ + public String sorgentiY; + /** path to Maven main directory */ + public String mainY; + /** path to Maven's main / java directory */ + public String mainJavaY; + /** project Eclipse name */ + public String eclipseProjectY; + /** resource path in webapp */ + public String webAppResourcesY; + /** webflow path */ + public String webFlowY; + /** webinf path */ + public String webInfY; + /** path for utilities for use in java classes */ + public String javaUtilY; + /** web path for use in java classes */ + public String javaWebY; + /** web / model path for use in java classes */ + public String javaWebModelY; + /** web / model / body path for use in java classes, body means the + * JSP directory */ + public String javaWebModelBodyY; + /** web / model / utility path for use in java classes */ + public String javaWebModelUtilityY; + /** web / controller path for use in java classes */ + public String javaWebController; + /** path and file name */ + public String webAppG; + /** path and file name */ + public String dependenciesG; + /** path and file name */ + public String depenHiberG; + /** path and file name */ + public String pomPropertiesG; + /** path and file name */ + public String springPropertiesG; + /** path and file name */ + public String applicUserAuthenticationProviderG; + /** path and file name */ + public String depenJacksonG; + /** path and file name */ + public String depenHValidG; + /** path and file name */ + public String depenValidatorG; + + // MAVEN + /** element of Maven */ + public String mavenModel; + /** element of Maven */ + public String mavenGroupId; + /** element of Maven */ + public String mavenVersion; + /** element of Maven */ + public String mavenPackage = "war"; + + // VARIOUS + /** the first part of the package, that is the network domain (2 + * elements) + the application (1 element) */ + public String pckg; + /** version of the artifact jar of the JPA project relating to the + * schema DB adopted */ + public String versioneArtifactJPA; + /** Maven src/main/resources directory */ + public String mainResources; + /** network domain of the company */ + public String networkDomain; + /** list of files containing DDL, in lowercase, without extension + * .sql */ + public String[] ddl; + /** name of the current controller file */ + public String groupControllerF; + /** background color of the field containing the button */ + /* # f5f5f5 is a gray color, the default color */ + public String backColorFormAction = "#f5f5f5"; + /** Unicode character set */ + public String charset = "UTF-8"; + /** Unicode character set */ + public String charsetSenzaTrattino = "UTF8"; + /** application name in lowercase */ + public String applicationNameLower; + /** name of the application */ + public String applicationName; + /** webflow parameter */ + public String paramWebflow; + /** xlbase parameter, the user group is specified, through + * group-search-base */ + public String searchBase; + /** name of the column of the users table which must appear after + * the logon with the welcome */ + public String welcome; + /** name of the column of the users table indicating the password */ + public String password; + + // QUARTZ + /** elements of a quartz trigger */ + public ClockHands clockHands; + /** list of triggers */ + public List handE = new ArrayList(); + + // SECURITY + /** if you qualify through userid / password, or in other ways + * (userpass markup value) */ + public String authenticationMode; + /** menu to be displayed on the JSP error .jsp, by mistake during an + * authentication */ + public String authenticationErrorMenu; + /** Authentication Provider methodology */ + public String authenticationProvider; + /** password verification methodology */ + public String ldapPasswordMethod; + /** Authentication Provider methodology */ + public String userDetailsClass; + /** select SQL for the case of Authentication Provider = + * jdbc-UserDetailsManager; selection of groups */ + public String groupAuthentication; + /** select SQL for the case of Authentication Provider = + * jdbc-UserDetailsManager; selection of users */ + public String usersByUserName; + /** select SQL for the case of Authentication Provider = + * jdbc-UserDetailsManager; selection of authorizations */ + public String authByUserName; + /** type of encoding and salt of the user's password */ + public String passEncoder; + /** DB table containing the list of users; the array contains: 0) + * the name of the table, 1) the rail code, 2) the jndi, 3) the DB + * scheme, 4) the welcome column, 5) the column containing the + * password */ + public String[] tabUser = new String[6]; + /** index, in the general list of DB tables, of the users table */ + public int tabUserJ = -1; + /** userid in the trivial case userid and password carved in the + * code, ROLE_USER case */ + public String userTrivialUSER; + /** userid in the trivial case userid and password carved in the + * code, case ROLE_ADMIN */ + public String userTrivialADMIN; + /** password in the trivial case userid and password carved in the + * code, ROLE_USER case */ + public String passTrivialUSER; + /** password in the trivial case userid and password carved in the + * code, case ROLE_ADMIN */ + public String passTrivialADMIN; + + /** types of DBMS */ + /* FUTURE RELEASE N6 */ + // public Set dbmsE = new HashSet(); + /** current DBMS */ + public String dbms; + /** DB current scheme */ + public String dbSchema; + /** Current JNDI */ + public String jndi; + + // PROPERTIES + /** properties */ + public CandyScrew candies; + + // INDICES + /** index of the default (local) language, linked to markup defaulan + * + */ + public int defaulan; + /** DB sites index */ + public int railK; + /** index of the DB table */ + public int tK; + /** index of the DB table containing the users */ + public int uK; + /** index of the groups of controllers; controllers are grouped by + * prefix; the prefix is ​​the first segment of the path */ + public int cntK; + + // COLLECTIONS + /** list of methods present as java source */ + public HashMap methodE = new HashMap(); + /** language codes, 2 characters */ + public List screwLanguageE = new ArrayList(); + /** validation messages map */ + public Map validationMessageE = new HashMap(); + /** languages ​​statistics map */ + public Map> languagesStatisticE = new HashMap>(); + /** list of DB tables */ + public List tableDBE = new ArrayList(); + /** list of correlations RequestMapping-JSP */ + public List correlationE = new ArrayList(); + /** list of CSS classes */ + public List costumeE = new ArrayList(); + /** list of KNIFE delimiters */ + public Map knifeE = new HashMap(); + /** list of KNIFE delimiters */ + public Map upperE = new HashMap(); + /** list of KNIFE delimiters */ + public Map lowerE = new HashMap(); + /** list of KNIFE delimiters */ + public Map knifeXE = new HashMap(); + /** list of KNIFE delimiters */ + public Map upperXE = new HashMap(); + /** list of KNIFE delimiters */ + public Map lowerXE = new HashMap(); + /** list of current initial directories (N3) */ + public List initialDirE = new ArrayList(); + /** list of created or proposed directories (N3) */ + public List proposedDirE = new ArrayList(); + + /** ORDINARY LOGGER */ + private static final Logger logger = Logger.getLogger(Skill.class); + + /** default constructor */ + public Skill() { + super(); + } + + /** helpful builder + * + * @param candies various constants */ + public Skill(CandyScrew candies) { + super(); + this.candies = candies; + knifeE.put("java", "/* " + Cst.KNIFE + " */"); + knifeE.put("css", "/* " + Cst.KNIFE + " */"); + knifeE.put("properties", "# " + Cst.KNIFE + ""); + knifeE.put("xml", ""); + knifeE.put("jsp", ""); + upperE.put("java", "/* " + Cst.UPPER + " */"); + upperE.put("css", "/* " + Cst.UPPER + " */"); + upperE.put("properties", "# " + Cst.UPPER + ""); + upperE.put("xml", ""); + upperE.put("jsp", ""); + lowerE.put("java", "/* " + Cst.LOWER + " */"); + lowerE.put("css", "/* " + Cst.LOWER + " */"); + lowerE.put("properties", "# " + Cst.LOWER + ""); + lowerE.put("xml", ""); + lowerE.put("jsp", ""); + knifeXE.put("java", "/\\x2a " + Cst.KNIFE + " \\x2a/"); + knifeXE.put("css", "/\\x2a " + Cst.KNIFE + " \\x2a/"); + knifeXE.put("properties", "# " + Cst.KNIFE + ""); + knifeXE.put("xml", ""); + knifeXE.put("jsp", ""); + upperXE.put("java", "/\\x2a " + Cst.UPPER + " \\x2a/"); + upperXE.put("css", "/\\x2a " + Cst.UPPER + " \\x2a/"); + upperXE.put("properties", "# " + Cst.UPPER + ""); + upperXE.put("xml", ""); + upperXE.put("jsp", ""); + lowerXE.put("java", "/\\x2a " + Cst.LOWER + " \\x2a/"); + lowerXE.put("css", "/\\x2a " + Cst.LOWER + " \\x2a/"); + lowerXE.put("properties", "# " + Cst.LOWER + ""); + lowerXE.put("xml", ""); + lowerXE.put("jsp", ""); + } + + /** + *

+ * Skill construction (part A). + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09
+ *

+ * + * @param markupE the list of markups + * @param trainE the list of trains + * @param candies the initial properties of the application + * @throws ExactException standard exception */ + public void factory_A(HashMap markupE, + List trainE, CandyScrew candies) + + throws ExactException { + + applicationName = candies.appName; + File f = new File(candies.outputYS + applicationName); + if (f.exists() & !f.isDirectory()) { + ExactException ce = new ExactException(); + ce.code = 1801; + ce.datum = "The value of given application name+: «" + + applicationName + + "» does not correspond to a real directory."; + ce.className = this.getClass().getName(); + throw ce; + } else { + buildDirectory(f); + } + applicationNameLower = applicationName.toLowerCase(); + spring = markupE.get("sv").recurrenceE.size() > 0; + springSecurity = markupE.get("uv").recurrenceE.size() > 0; + captcha = markupE.get("captc").recurrenceE.size() > 0; + webFlow = markupE.get("wparams").recurrenceE.size() > 0; + springValid = markupE.get("svalid").recurrenceE.size() > 0; + robots = markupE.get("srobo").recurrenceE.size() > 0; + viewController = markupE.get("sieco").recurrenceE.size() > 0; + tiles = markupE.get("ev").recurrenceE.size() > 0; + hibernate = markupE.get("hv").recurrenceE.size() > 0; + jackson = markupE.get("jacksonver").recurrenceE.size() > 0; + prettyPrint = markupE.get("pretprint").recurrenceE.size() > 0; + hiberValid = markupE.get("hvalid").recurrenceE.size() > 0; + i18n = markupE.get("i18n").recurrenceE.size() > 0; + pomProperties = markupE.get("pompr").recurrenceE.size() > 0; + dependencies = markupE.get("depen").recurrenceE.size() > 0; + defaultAutowire = markupE.get("sdefauto").recurrenceE + .size() > 0; + interceptor = markupE.get("sinterce").recurrenceE.size() > 0; + mavenBuild = markupE.get("mavbu").recurrenceE.size() > 0; + mavenCompiler = markupE.get("mavco").recurrenceE.size() > 0; + mavenCompilerPlugin = markupE.get("mavcp").recurrenceE + .size() > 0; + mavenWarPlugin = markupE.get("mavwa").recurrenceE.size() > 0; + mavenCleanPlugin = markupE.get("mavcl").recurrenceE.size() > 0; + matrixVariables = markupE.get("matrix").recurrenceE.size() > 0; + mimeMapping = markupE.get("webmime").recurrenceE.size() > 0; + errorPage = markupE.get("weberror").recurrenceE.size() > 0; + indexJsp = markupE.get("indexjsp").recurrenceE.size() > 0; + /* FUTURE RELEASE N6 */ + // embedded = markupE.get("hembedded").occorrenzaE.size() > 0; + ldapService = markupE.get("xlservice").recurrenceE.size() > 0; + signup = markupE.get("usignup").recurrenceE.size() > 0; + hasJsp = markupE.get("jsp").recurrenceE.size() > 0; + if (markupE.get("defaulan").recurrenceE.size() > 0) { + defaulan = (Integer) markupE.get("defaulan").recurrenceE + .get(0).locomotor.substance; + } else { + defaulan = -1; + } + if (markupE.get("xprovider").recurrenceE.size() > 0) { + authenticationProvider = markupE.get( + "xprovider").recurrenceE.get(0).locomotor.text + .toLowerCase(); + } + if (markupE.get("xlclass").recurrenceE.size() > 0) { + userDetailsClass = markupE.get("xlclass").recurrenceE.get( + 0).locomotor.text; + } + if (markupE.get("xlpass").recurrenceE.size() > 0) { + ldapPasswordMethod = markupE.get("xlpass").recurrenceE.get( + 0).locomotor.text; + } + if (authenticationProvider != null) { + ldap = authenticationProvider.equals("ldap"); + } + if (markupE.get("xgbac").recurrenceE.size() > 0) { + groupAuthentication = markupE.get("xgbac").recurrenceE.get( + 0).locomotor.text; + } + if (markupE.get("xusers").recurrenceE.size() > 0) { + usersByUserName = markupE.get("xusers").recurrenceE.get( + 0).locomotor.text; + } + if (markupE.get("xauth").recurrenceE.size() > 0) { + authByUserName = markupE.get("xauth").recurrenceE.get( + 0).locomotor.text; + } + if (markupE.get("xencoder").recurrenceE.size() > 0) { + passEncoder = markupE.get("xencoder").recurrenceE.get( + 0).locomotor.text; + } + if (markupE.get("uspaformadmin").recurrenceE.size() > 0) { + String[] up = markupE.get("uspaformadmin").recurrenceE.get( + 0).locomotor.text.split("\\x2c"); // x2c is the + // comma + if (up.length != 2) { + ExactException ne = new ExactException(); + ne.code = 1815; + ne.datum = "The markup uspaformadmin must have 2" + + " parameters, separated by a comma."; + ne.className = this.getClass().getName(); + throw ne; + } else { + userTrivialADMIN = up[0].trim(); + passTrivialADMIN = up[1].trim(); + } + } + if (markupE.get("uspaformuser").recurrenceE.size() > 0) { + String[] up = markupE.get("uspaformuser").recurrenceE.get( + 0).locomotor.text.split(","); + if (up.length != 2) { + ExactException ne = new ExactException(); + ne.code = 1825; + ne.datum = "The markup uspaformuser must have 2" + + " parameters, separated by a comma."; + ne.className = this.getClass().getName(); + throw ne; + } else { + userTrivialUSER = up[0].trim(); + passTrivialUSER = up[1].trim(); + } + } + for (Train t : markupE.get("odefcss").recurrenceE) { + Costume costume = new Costume(t); + costumeE.add(costume); + } + for (Train t : markupE.get("qjobname").recurrenceE) { + clockHands = new ClockHands(t.wagonE.get("qsimple"), + t.wagonE.get("qcron"), t.locomotor, t.locomotor, + t.wagonE.get("hrail")); + String r = t.wagonE.get("hrail").text; + int rJ = 0; + for (; rJ < markupE.get("hdefrail").recurrenceE + .size(); rJ++) { + if (r.equals(markupE.get("hdefrail").recurrenceE.get( + rJ).locomotor.text)) { + break; + } + } + if (rJ == markupE.get("hdefrail").recurrenceE.size()) { + ExactException ne = new ExactException(); + ne.code = 1812; + ne.datum = "The markup «hrail» of «quartz»" + + " presents a value " + r + + ", but it does not exist" + + " among the «hdefrail» definitions."; + ne.className = this.getClass().getName(); + throw ne; + } + handE.add(clockHands); + } + hasUseridPassword = markupE.get("userpass").recurrenceE + .size() > 0; + if (hasUseridPassword) { + authenticationMode = markupE.get("userpass").recurrenceE + .get(0).locomotor.text; + if (markupE.get("userpass").recurrenceE.get(0).wagonE + .containsKey("bmenu")) { + authenticationErrorMenu = markupE.get( + "userpass").recurrenceE.get(0).wagonE.get( + "bmenu").text; + } + } + internalProperties = markupE.get("uintp").recurrenceE + .size() > 0; + if (springSecurity & !spring) { + ExactException ne = new ExactException(); + ne.code = 1800; + ne.datum = "Spring Security cannot be applied for" + + " without having first declared Spring by means " + + "of sv markup."; + ne.className = this.getClass().getName(); + throw ne; + } + for (int i = 0; i < trainE.size(); i++) { + hasForm = false; + Train train = trainE.get(i); + if (train.locomotor.stub.equals("sv")) { + springVersion = train.locomotor.text; + String[] x = springVersion.split("\\x2e"); + springVersion1m = Integer.valueOf(x[0].trim()); + } else if (train.locomotor.stub.equals("appse")) { + applicationServer = train.locomotor.text; + } else if (train.locomotor.stub.equals("jeev")) { + jeeVersion = train.locomotor.text; + } else if (train.locomotor.stub.equals("uv")) { + int v = ((Integer) (train.locomotor.substance)) + .intValue() / 1000; + springSecurityReductVersion = (v / 1000) + "." + v + % 1000; + springSecurityVersion = train.locomotor.text; + } else if (train.locomotor.stub.equals("hv")) { + int v = ((Integer) (train.locomotor.substance)) + .intValue() / 1000; + hibernateReductVersion = String.valueOf(v / 1000); + hibernateVersion = train.locomotor.text; + String[] x = hibernateVersion.split("\\x2e"); + hibernateVersion1m = Integer.valueOf(x[0].trim()); + jpaVersion = Integer.valueOf(train.wagonE.get( + "hjpav").text); + } else if (train.locomotor.stub.equals("jacksonver")) { + jacksonVersion = train.locomotor.text; + } else if (train.locomotor.stub.equals("hvalid")) { + hiberValidVersion = train.locomotor.text; + } else if (train.locomotor.stub.equals("charset")) { + int j = 0; + String maiu = train.locomotor.text.toUpperCase(); + for (; j < Universal.charsetE.length; j++) { + if (Universal.charsetE[j].equals(maiu)) { + break; + } + } + if (j == Universal.charsetE.length) { + ExactException ce = new ExactException(); + ce.code = 1840; + ce.datum = "The value of the charset markup is wrong," + + " it isn't present in the list: " + trainE + .get(i).locomotor.text; + ce.className = this.getClass().getName(); + throw ce; + } else { + train.locomotor.text = maiu.toUpperCase(); + } + charset = train.locomotor.text; + charsetSenzaTrattino = Strings.replaceFirst(charset, + "-", ""); + } else if (train.locomotor.stub.equals("ev")) { + tilesVersion = train.locomotor.text; + } else if (train.locomotor.stub.equals("colorform")) { + backColorFormAction = train.locomotor.text; + } else if (train.locomotor.stub.equals("mavco")) { + mavenCompilerVersion = train.locomotor.text; + } else if (train.locomotor.stub.equals("mavcp")) { + mavenCompilerPluginVersion = train.locomotor.text; + } else if (train.locomotor.stub.equals("mavwa")) { + mavenWarPluginVersion = train.locomotor.text; + } else if (train.locomotor.stub.equals("mavcl")) { + mavenCleanPluginVersion = train.locomotor.text; + } else if (train.locomotor.stub.equals("captc")) { + captchaVersion = train.locomotor.text; + } else if (train.locomotor.stub.equals("mavmo")) { + mavenModel = train.locomotor.text; + } else if (train.locomotor.stub.equals("mavgr")) { + mavenGroupId = train.locomotor.text; + } else if (train.locomotor.stub.equals("mv")) { + mavenVersion = train.locomotor.text; + } else if (train.locomotor.stub.equals("filte")) { + filter = true; + } else if (train.locomotor.stub.equals("antisamy")) { + antiSamy = true; + } else if (train.locomotor.stub.equals("log4j")) { + log4jVers = train.locomotor.text; + } else if (train.locomotor.stub.equals("quartz")) { + quartzVers = train.locomotor.text; + } else if (train.locomotor.stub.equals("wv")) { + webflowVersion = train.locomotor.text; + } else if (train.locomotor.stub.equals("wparams")) { + paramWebflow = train.locomotor.text; + } else if (train.locomotor.stub.equals("xlbase")) { + searchBase = train.locomotor.text; + } else if (train.locomotor.stub.equals("requmap")) { + Map wE = train.wagonE; + int jspJ = 0; + List jspE = markupE.get("jsp").recurrenceE; + String pathJsp = ""; + /* if I have not specified the goal, it means that the + * request mapping oil path and the JSP path coincide */ + if (wE.get("goal") == null) { + pathJsp = train.locomotor.text; + } else { + pathJsp = wE.get("goal").text; + } + /* identification of the destination JSP */ + for (jspJ = 0; jspJ < jspE.size(); jspJ++) { + if (jspE.get(jspJ).locomotor.text.equals(pathJsp)) { + break; + } + } + JspKit jspKit = null; + /* for the "not found" case I make 2 different messages + * depending on whether the goal has been specified or + * not */ + if (jspJ == jspE.size() & wE.get("goal") == null) { + ExactException ne = new ExactException(); + ne.code = 1809; + ne.datum = "For the «requmap+" + trainE.get( + i).locomotor.text + + "» I assume an identical JSP path; but it" + + " does not exist in the JSPs list."; + ne.className = this.getClass().getName(); + throw ne; + } else if (jspJ == jspE.size()) { + ExactException ne = new ExactException(); + ne.code = 1841; + ne.datum = "The JSP indicated in goal+" + pathJsp + + " for the «requmap+" + trainE.get( + i).locomotor.text + + "» does not exist."; + ne.className = this.getClass().getName(); + throw ne; + } else { + jspKit = (JspKit) jspE.get( + jspJ).locomotor.substance; + } + String pathRedirect = wE.get("redirect") == null ? "" + : wE.get("redirect").text; + /* only after I have processed all the request maps can + * I verify that the redirect request map really + * exists */ + + RequestMap rm = null; + if (train.locomotor.text.equals(jspKit.path + "/" + + jspKit.fileName)) { + ExactException ne = new ExactException(); + ne.code = 1804; + ne.datum = "The path indicated in goal+" + wE.get( + "goal").text + + " è inutile, si prega di cancellarlo." + + " In fact, it is already adopted by default."; + ne.className = this.getClass().getName(); + throw ne; + } else if (wE.get("model") != null) { + jspKit.requestMapE.get(0).tipo = 2; + rm = new RequestMap(trainE.get(i).locomotor.text, + jspKit.path + "/" + jspKit.fileName, + pathRedirect, 2); + jspKit.requestMapE.add(rm); + } else { + if (jspKit.controlE.size() > 0) { + jspKit.jspType = Cst.FORM; + } else if (jspKit.requestMapE.size() == 0) { + jspKit.jspType = Cst.PLAIN; + } else { + jspKit.jspType = jspKit.requestMapE.get(0).tipo; + } + rm = new RequestMap(trainE.get(i).locomotor.text, + jspKit.path + "/" + jspKit.fileName, + pathRedirect, jspKit.jspType); + jspKit.requestMapE.add(rm); + } + } else if (train.locomotor.stub.equals("language")) { + int j = 0; + String minus = train.locomotor.text.toLowerCase(); + for (; j < Universal.languageE.length; j++) { + if (Universal.languageE[j][1].equalsIgnoreCase( + minus)) { + break; + } + } + if (j == Universal.languageE.length) { + ExactException ne = new ExactException(); + ne.code = 1802; + ne.datum = "The value of the markup \"language\" is wrong," + + " it isn't present in the list of language codes" + + " ISO 639-1: " + trainE.get( + i).locomotor.text + "."; + ne.className = this.getClass().getName(); + throw ne; + } else { + train.locomotor.text = minus; + screwLanguageE.add(new StringInt( + train.locomotor.text, j)); + } + + // END OF REQUMAP PROCESSING + + // PROCESS OF THE MARKUP VALLABEL + + + } else if (train.locomotor.stub.equals("vallabel")) { + /* ccJ is the numeric code of the language; the value -1 + * is used when I have not declared a language code, + * then I want the default value */ + int lcJ = -1; + if (train.wagonE.get("vallang") != null) { + int j = 0; + for (; j < Universal.languageE.length; j++) { + if (train.wagonE.get("vallang").text + .equalsIgnoreCase( + Universal.languageE[j][1])) { + break; + } + } + lcJ = j; + if (lcJ == defaulan) { + ExactException ce = new ExactException(); + ce.code = 1833; + ce.datum = "A vallang+ markup defines «" + + train.wagonE.get("vallang").text + + "», but this value is declared as" + + " default by defaulan+ markup." + + " Please omit this vallang+" + + train.wagonE.get("vallang").text + + "."; + ce.className = this.getClass().getName(); + throw ce; + } + } + /* the validation label is the couple label-code of + * language */ + ValidationLabelScrew vl = new ValidationLabelScrew( + train.locomotor.text, lcJ); + /* this couple must not appear two times */ + if (validationMessageE.containsKey(vl)) { + ExactException ne = new ExactException(); + ne.code = 1829; + ValidationMessageScrew vs = validationMessageE.get( + vl); + if (lcJ == -1) { + ne.datum = "Duplicated couple label-language in a" + + " validation message: " + vs.vl.label + + " (default value for language code)."; + } else { + ne.datum = "Duplicated couple label-language in a" + + " validation message: " + vs.vl.label + + "/" + + Universal.languageE[vs.vl.languageCodeIndex]; + } + + ne.className = this.getClass().getName(); + throw ne; + } else { + /* finally, the object vl is valid */ + validationMessageE.put(vl, + new ValidationMessageScrew(vl, train.wagonE + .get("valmess").text)); + List lsE = languagesStatisticE.get(lcJ); + /* if the ccJ code has not yet been entered ... */ + if (lsE == null) { + /* .. then enter it */ + ArrayList mE = new ArrayList(); + mE.add(train.locomotor.text + "=" + train.wagonE + .get("valmess").text); + languagesStatisticE.put(lcJ, mE); + } else { + /* ... otherwise record its message */ + lsE.add(train.locomotor.text + "=" + + train.wagonE.get("valmess").text); + languagesStatisticE.replace(lcJ, lsE); + } + } + + // END OF THE PROCESS OF THE MARKUP VALLABEL + + + } else if (train.locomotor.stub.equals("company")) { + networkDomain = train.locomotor.text; + if (networkDomain.startsWith(".") | networkDomain + .endsWith(".")) { + ExactException ne = new ExactException(); + ne.code = 1803; + ne.datum = "The value of markup «company» is wrong: " + + networkDomain; + ne.className = this.getClass().getName(); + throw ne; + } + } else if (train.locomotor.stub.equals("jsp")) { + JspKit jspKit = (JspKit) trainE.get( + i).locomotor.substance; + logger.trace(Candies.LF + Cst.CUT0 + + "I am processing the JSP " + jspKit.path + "/" + + jspKit.fileName + "." + jspKit.extension); + if (jspKit.controlE.size() > 0) { + hasForm = true; + } + if (train.wagonE.get("string") != null) { + String[] wE = train.wagonE.get("string").text.split( + "\\x2c"); + for (String w : wE) { + jspKit.stringPropertyE.add(new JspBeanElement(w + .trim(), "String", false, "", null, + null, null)); + } + } + if (train.wagonE.get("arraystring") != null) { + String[] wE = train.wagonE.get("arraystring").text + .split("\\x2c"); + for (String w : wE) { + jspKit.arrayStringPropertyE.add( + new JspBeanElement(w.trim(), + "ArrayList", false, "", + null, null, null)); + } + } + if (train.wagonE.get("integer") != null) { + String[] wE = train.wagonE.get("integer").text + .split("\\x2c"); + for (String w : wE) { + jspKit.integerPropertyE.add(new JspBeanElement(w + .trim(), "Integer", false, "", null, + null, null)); + } + } + if (train.wagonE.get("long") != null) { + String[] wE = train.wagonE.get("long").text.split( + "\\x2c"); + for (String w : wE) { + jspKit.longPropertyE.add(new JspBeanElement(w + .trim(), "Long", false, "", null, null, + null)); + } + } + if (train.wagonE.get("boolean") != null) { + String[] wE = train.wagonE.get("boolean").text + .split("\\x2c"); + for (String w : wE) { + jspKit.booleanPropertyE.add(new JspBeanElement(w + .trim(), "Boolean", false, "", null, + null, null)); + } + } + Wagon v = train.wagonE.get("dress"); + if (v != null) { + int m = 0; + List fE = markupE.get("method").recurrenceE; + for (; m < fE.size(); m++) { + if (fE.get(m).locomotor.text.equals(v.text)) { + break; + } + } + if (m == fE.size()) { + ExactException ne = new ExactException(); + ne.code = 1816; + ne.datum = "For JSP «" + trainE.get( + i).locomotor.text + + "», the indication of «dress+" + + v.text + "» does not exist among" + + " the declared methods."; + ne.className = this.getClass().getName(); + throw ne; + } + jspKit.methodE.add(v); + } + Wagon rv = train.wagonE.get("refresh"); + if (rv != null) { + jspKit.refresh = Integer.valueOf(rv.text); + } + Wagon ptv = train.wagonE.get("pagetitle"); + if (ptv != null) { + jspKit.pageTitle = ptv.text; + } + Wagon crudv = train.wagonE.get("crud"); + if (crudv != null) { + jspKit.crud = true; + } + } + } + + projectFactory(); + File dotClasspath = new File(SCREW_MAVEN + sep + ".classpath"); + int railQ = markupE.get("hdefrail").recurrenceE.size(); + String[] o = new String[railQ]; + for (int i = 0; i < railQ; i++) { + Train train = markupE.get("hdefrail").recurrenceE.get(i); + String jndi = train.wagonE.get("hjndi").text; + String dbschema = train.wagonE.get("hdbschema").text; + o[i] = jndi + "-" + dbschema; + } + correctFile(dotClasspath, "path=\"/", "xxxx-xxxx", + Candies.SURGERY1, o, new File(eclipseProjectY + + ".classpath"), "UTF-8"); + // LATEST CHECKS + for (int i = 0; i < trainE.size(); i++) { + Train train = trainE.get(i); + if (train.locomotor.stub.equals("valcons")) { + for (int lJ : languagesStatisticE.keySet()) { + ValidationLabelScrew vl = new ValidationLabelScrew( + train.wagonE.get("valtag").text, lJ); + if (validationMessageE.get(vl) == null) { + ExactException ce = new ExactException(); + if (lJ == -1) { + ce.datum = "In the list of messages in language «" + + Universal.languageE[defaulan][1] + + "», the label «" + train.wagonE + .get("valtag").text + + "» is missing."; + } else { + ce.datum = "In the list of messages in language «" + + Universal.languageE[lJ][1] + .toLowerCase() + + "», the label «" + train.wagonE + .get("valtag").text + + "» is missing."; + } + ce.code = 1839; + ce.className = this.getClass().getName(); + throw ce; + } + } + } + } + for (int lJ : languagesStatisticE.keySet()) { + String s = ""; + for (ValidationLabelScrew m : validationMessageE.keySet()) { + if (m.languageCodeIndex == lJ) { + s += m.label + "=" + validationMessageE.get( + m).message + Candies.LF; + } + } + s += knifeE.get("properties"); + String y = candies.outputYS + applicationName + + "/src/main/resources/"; + String nomeFileOutput = "messagesScrewValid"; + if (lJ > -1) { + nomeFileOutput += "_" + Universal.languageE[lJ][1] + .toLowerCase(); + } + nomeFileOutput += ".properties"; + try { + toTarget(y, nomeFileOutput, s, nomeFileOutput, + candies.boxYS + "recycleBin", "properties"); + // FileComponent.aggiungiFile (outputfilename, + // outputFileName, y, candies, candies.boxYS + // + "trash", this); + } catch (FileNotFoundException e) { + ExactException ce = new ExactException(); + ce.code = 1837; + ce.datum = "File not found exception."; + ce.className = this.getClass().getName(); + throw ce; + } catch (IOException e) { + ExactException ce = new ExactException(); + ce.code = 1838; + ce.datum = "I/O exception."; + ce.className = this.getClass().getName(); + throw ce; + } + } + + Iterator>> iterator = languagesStatisticE + .entrySet().iterator(); + int k = 0; + int primaFrequenza = 0; + while (iterator.hasNext()) { + Map.Entry> entry = iterator.next(); + if (k == 0) { + primaFrequenza = entry.getValue().size(); + } else if (entry.getValue().size() != primaFrequenza) { + ExactException ce = new ExactException(); + ce.code = 1830; + ce.datum = "The quantity of messages for language «" + + Universal.languageE[entry.getKey() + .intValue()][1] + "» (" + entry + .getValue().size() + + ") is different from the others. " + + "Please count again."; + ce.className = this.getClass().getName(); + throw ce; + } + k++; + } + if (screwLanguageE.size() > 0) { + if (screwLanguageE.size() != primaFrequenza) { + ExactException ce = new ExactException(); + ce.code = 1831; + ce.datum = "The quantity of markup language+ (" + + screwLanguageE.size() + + ") is different from the quantity of languages" + + " declared by vallabel+ (" + primaFrequenza + + "). " + "Please count again."; + ce.className = this.getClass().getName(); + throw ce; + } else { + for (StringInt x : screwLanguageE) { + if (languagesStatisticE.get(x.i) == null) { + ExactException ce = new ExactException(); + ce.code = 1832; + ce.datum = "The markup «language+" + x.s + + "» has no coincidence in the markups" + + " vallabel+."; + ce.className = this.getClass().getName(); + throw ce; + } + } + } + } + if (springVersion1m > 3 & jpaVersion == 1) { + ExactException ce = new ExactException(); + ce.code = 1828; + ce.datum = "If JPA has version 1, you need a version of" + + " Spring < 4; currently Spring is " + + springVersion; + ce.className = this.getClass().getName(); + throw ce; + } + if (hasUseridPassword && tabUser == null + && authenticationProvider != null + && !authenticationProvider.equals("ldap")) { + ExactException ce = new ExactException(); + ce.code = 1806; + ce.datum = "The \"utabuser\" markup must be used specifying" + + " the name of the table."; + ce.className = this.getClass().getName(); + throw ce; + } + if (tabUser[0] != null & authenticationProvider == null) { + ExactException ce = new ExactException(); + ce.code = 1807; + ce.datum = "The \"xprovider\" markup must be used " + + "specifying the authentication method."; + ce.className = this.getClass().getName(); + throw ce; + } + } + + /** + *

+ * Skill construction (part B). + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09
+ *

+ * + * @param markupE the list of markups + * @param trainE the train list + * @throws ExactException standard exception */ + public void factory_B(HashMap markupE, + List trainE) + + throws ExactException { + + for (int i = 0; i < trainE.size(); i++) { + if (trainE.get(i).locomotor.stub.equals("utabuser")) { + tabUser[0] = Mix.uppercaseFirstChar(trainE.get( + i).locomotor.text); + int k = 0; + for (; k < tableDBE.size(); k++) { + if (tabUser[0].equals(tableDBE.get(k).entityName)) { + break; + } + } + if (k == tableDBE.size()) { + ExactException ce = new ExactException(); + ce.code = 1814; + ce.datum = "The markup «utabuser»" + + " presents the value " + tabUser[0] + + ", but it does not exist" + + " amonf the definitions of the DB tables."; + ce.className = this.getClass().getName(); + throw ce; + } + if (trainE.get(i).wagonE.get("hrail") == null) { + ExactException ce = new ExactException(); + ce.code = 1810; + ce.datum = "The markup «utabuser» is not followed" + + " by the markup «hrail»."; + ce.className = this.getClass().getName(); + throw ce; + } else { + tabUser[1] = trainE.get(i).wagonE.get("hrail").text; + k = 0; + for (; k < markupE.get("hdefrail").recurrenceE + .size(); k++) { + if (tabUser[1].equals(markupE.get( + "hdefrail").recurrenceE.get( + k).locomotor.text)) { + break; + } + } + if (k == markupE.get("hdefrail").recurrenceE + .size()) { + ExactException ce = new ExactException(); + ce.code = 1811; + ce.datum = "The markup «hrail» of «utabuser»" + + " presents the value " + tabUser[1] + + ", but it does not exist" + + " among the definitions «hdefrail»."; + ce.className = this.getClass().getName(); + throw ce; + } + tabUser[2] = markupE.get("hdefrail").recurrenceE + .get(k).wagonE.get("hjndi").text; + tabUser[3] = markupE.get("hdefrail").recurrenceE + .get(k).wagonE.get("hdbschema").text; + int j = 0; + for (; j < tableDBE.size(); j++) { + if (tableDBE.get(j).entityName.equalsIgnoreCase( + tabUser[0]) & tableDBE.get(j).jndi + .equalsIgnoreCase(tabUser[2]) + & tableDBE.get(j).dbSchema + .equalsIgnoreCase(tabUser[3])) { + break; + } + } + if (j == tableDBE.size()) { + ExactException ce = new ExactException( + "I have not found the table used to " + + "verify the user's account " + + tabUser[0] + ", jndi=" + + tabUser[2] + ", DB schema=" + + tabUser[3], 2100, this + .getClass().getName(), + ""); + throw ce; + + } else { + uK = j; + } + TableOutfit ct = tableDBE.get(uK); + welcome = trainE.get(i).wagonE.get("uwelcome").text; + boolean presenza = FileComponent.checkColumn(ct, + welcome); + if (!presenza) { + ExactException ce = new ExactException( + "In the file " + ct.entityName + ".java" + + " could not find the DB column «" + + welcome + "»", 2101, this + .getClass().getName(), + "factory_B"); + throw ce; + + } + password = trainE.get(i).wagonE.get( + "upassword").text; + presenza = FileComponent.checkColumn(ct, password); + if (!presenza) { + ExactException ce = new ExactException( + "Nel file " + ct.entityName + ".java" + + " non ho trovato la column di DB «" + + password, 2102, this + .getClass().getName(), + ""); + throw ce; + } + } + } + } + } + + /** + *

+ * Construction of the methods whose source is fully present in the + * ele file, defined with the "method" markup. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09
+ *

+ * + * @param markupE the list of markups + * @param trainE the train list + * @throws ExactException standard exception */ + public void methodsFactory(HashMap markupE, + List trainE) + + throws ExactException { + + ExactException ne = new ExactException(); + for (int i = 0; i < trainE.size(); i++) { + Train t = trainE.get(i); + if (t.locomotor.stub.equals("method")) { + String sorgente = null; + if (candies.inside) { + sorgente = (String) t.locomotor.substance; + } else if (t.locomotor.substance != null + & !((String) (t.locomotor.substance)) + .isEmpty()) { + ne.datum = "The method " + Mix.dress_A( + t.locomotor.text) + + " has a source code declared" + + " in the ELE file," + + " but this is not allowed by " + + "the \"inside\" property."; + ne.code = 1824; + ne.className = this.getClass().getName(); + throw ne; + } + List daoE = new ArrayList(); + if (t.wagonE.get("dao") != null) { + String[][] dE = (String[][]) t.wagonE.get( + "dao").substance; + for (String s : dE[0]) { + if (s.startsWith(Cst.IRAILU) & s.endsWith( + "Dao")) { + s = s.substring(5, s.length() - 3); + int nr = -1; + String tabella = null; + if (s.matches( + "\\d{1}\\p{Alpha}\\p{Graph}*")) { + nr = Integer.valueOf(s.substring(0, 1)); + tabella = s.substring(1); + } else if (s.matches( + "\\d{2}\\p{Alpha}\\p{Graph}*")) { + nr = Integer.valueOf(s.substring(0, 2)); + tabella = s.substring(2); + } + String tab1 = Cst.RAIL + nr + tabella; + int l = 0; + for (; l < tableDBE.size(); l++) { + String entity = tableDBE.get( + l).railLowercase + tableDBE.get( + l).entityNameU; + String tableName = tableDBE.get( + l).railLowercase + tableDBE.get( + l).tableNameU; + if (tab1.equals(entity) | tab1.equals( + tableName)) { + break; + } + } + if (l == tableDBE.size()) { + Mix.discloseInfo("The object " + Mix + .dress_A("I" + Mix + .uppercaseFirstChar( + tab1)) + + " doesn't correspond to any" + + " of the DB tables declared" + + " in the JPA project.", + "Error", logger); + } else { + daoE.add(tableDBE.get(l)); + } + } else { + ne.datum = "The method " + Mix.dress_A( + t.locomotor.text) + + " has a dao+ containing uncorrect" + + " elements."; + ne.code = 1826; + ne.className = this.getClass().getName(); + throw ne; + } + } + } + String argoGrande = "", argoPiccolo = ""; + for (TableOutfit d : daoE) { + if (jpaVersion == 1) { + argoGrande += Candies.LF + Candies.TAB + + Candies.TAB + Candies.TAB + "I" + + d.railUppercase + d.entityNameU + + "Dao " + d.railLowercase + + d.entityName + "Dao" + ", "; + } else { + argoGrande += Candies.LF + Candies.TAB + + Candies.TAB + Candies.TAB + "I" + + d.railUppercase + d.entityNameU + + "Dao<" + d.pathDots + "." + + d.entityNameU + "> " + d.railLowercase + + d.entityName + "Dao" + ", "; + } + argoPiccolo += Candies.LF + Candies.TAB + + Candies.TAB + Candies.TAB + + d.railLowercase + d.entityName + "Dao" + + ", "; + } + /* cut the last 2 characters (comma and space) */ + if (argoGrande.length() > 2) { + argoGrande = argoGrande.substring(0, argoGrande + .length() - 2); + } + if (argoPiccolo.length() > 2) { + argoPiccolo = argoPiccolo.substring(0, argoPiccolo + .length() - 2); + } + List classiE = new ArrayList(); + if (t.wagonE.get("others") != null) { + String[] oE = (String[]) t.wagonE.get( + "others").substance; + for (String s : oE) { + String iniziale = s.substring(0, 1); + if (!iniziale.equals(iniziale.toUpperCase())) { + ne.datum = "The method «" + t.locomotor.text + + "» has an «others» markup " + + "which contains elements" + + " with a non-capital initial."; + ne.code = 1827; + ne.className = this.getClass().getName(); + throw ne; + } + classiE.add(s); + } + } + ELEMethod m = new ELEMethod(t.locomotor.text, sorgente, + argoGrande, argoPiccolo, daoE, classiE); + methodE.put(m.name, m); + } + } + } + + private void projectFactory() + + throws ExactException { + + eclipseProjectY = Mix.dress_CU(candies.outputYS + + applicationNameLower); + buildDirectory(eclipseProjectY); + File screwMaven = new File(SCREW_MAVEN); + if (!screwMaven.exists()) { + throw new ExactException("The directory " + eclipseProjectY + + "screwMaven was not found.", 1101, "Skill", + "projectFactory"); + } + File dotProject = new File(SCREW_MAVEN + sep + ".project"); + String[] o = new String[1]; + o[0] = applicationNameLower; + correctFile(dotProject, "", "XappnameX", Candies.SURGERY1, + o, new File(eclipseProjectY + ".project"), "UTF-8"); + sorgentiY = eclipseProjectY + "src"; + buildDirectory(sorgentiY); + mainY = sorgentiY + "/main"; + buildDirectory(mainY); + mainJavaY = mainY + "/java"; + buildDirectory(mainJavaY); + mainResources = mainY + "/resources"; + buildDirectory(mainResources); + } + + /** + *

+ * Creation date: 2020-09-27
+ * Last updated: 2020-09-27
+ * Class: Skill + * + * @author Massimo Maglioni + *

+ * Description: case SURGERY1: one time, substitution of + * target with the new application name; + *

+ * @param input file to be corrected + * @param prefix string preceding the gtarget to correct + * @param target string to be corrected + * @param op correction mode + * @param objectE string that replaces the target + * @param destination output file + * @param unicode chatacter code Unicode + * @throws ExactException standard exception */ + private void correctFile(File input, final String prefix, + final String target, final int op, final String[] objectE, + File destination, String unicode) + + throws ExactException { + + String s = Equipment.oneStringUnicode_A(input, unicode); + String b = ""; + if (objectE.length == 1) { + if (op == Candies.SURGERY1) { + b = s.replaceFirst(prefix + target, prefix + + objectE[0]); + } + } else { + if (op == Candies.SURGERY1) { + List a = ReadMyFile.zebra_C(input, unicode); + for (int i = 0; i < a.size(); i++) { + int j = a.get(i).indexOf(target); + if (j == -1) { + b += a.get(i) + Candies.LF; + } else { + for (int k = 0; k < objectE.length; k++) { + b += a.get(i).replaceFirst(prefix + target, + prefix + objectE[k]) + Candies.LF; + } + } + } + b = b.substring(0, b.length() - 1); + } + } + Equipment.writeFileFromOneStringUnicode_A(destination, b, + unicode); + } + + /** + *

+ * Create a directory, if it doesn't already exist, after making + * sure it isn't a file.
+ * It can only create one directory at a time.
+ * Example: I have to create directory b in path C:/a;
+ * I must put the string: "C:/a/b" as the argument of the method, + * and I must first verify that C:/a exists.
+ *

+ *

+ * Creation date: 2020-09-03
+ * Last updated: 2020-09-08 + *

+ *

+ * Modifications:
+ *

+ * + * @param path to the directory to be built, complete with path */ + public void buildDirectory(final String path) { + + File cradle = new File(path); + buildDirectory(cradle); + } + + /** + *

+ * Overload of the preceding method. + *

+ *

+ * Creation date: 2020-09-03
+ * Last updated: 2020-09-08 + *

+ *

+ * Modifications:
+ *

+ * + * @param cradle directory to be created */ + public void buildDirectory(File cradle) { + + if (cradle.isFile()) { + cradle.delete(); + } else { + proposedDirE.add(cradle.getPath()); + } + if (!cradle.exists()) { + cradle.mkdir(); + } + } + + /** + *

+ * Creation date: 2020-04-20
+ * Last updated: 2020-06-26
+ * Class: FileComponent + * + * @author Massimo Maglioni + *

+ * Description: This method analyzes the files to be + * written, compares them with the existing ones, then + * writes what is necessary. + *

+ * @param pre_existentPath pre-existent path + * @param pre_existentFilename the name of the output file, that is + * the one where the material is poured + * @param materialeProdottoDaScrewdriver code producted by + * Screwdriver application + * @param nomeFileOrigine this name would not be necessary, because + * the string is all contained in input material; however, + * for the eventual signaling to the user, in the + * "permission" method + * @param recycleBinY the path of the directory with the function of + * trash + * @param type the extension of the output file; only java, + * properties, xml and jsp are allowed + * @throws ExactException standard exception + * @throws FileNotFoundException standard exception + * @throws IOException standard exception */ + public void toTarget(final String pre_existentPath, + String pre_existentFilename, + String materialeProdottoDaScrewdriver, + final String nomeFileOrigine, final String recycleBinY, + final String type) + + throws ExactException, FileNotFoundException, IOException { + + /* the 3 strings, although identical, are repeated: those + * without X are used for simple searches for strings (indexOf, + * endswith, etc.), the one with the X for operations with the + * Pattern class */ + + String knife = knifeE.get(type); + String upper = upperE.get(type); + String lower = lowerE.get(type); + String knifeX = knifeXE.get(type); + String upperX = upperXE.get(type); + String lowerX = lowerXE.get(type); + File preExistent = null; + String outExt = Mix.estraiExtension(pre_existentFilename); + /* the default extension is .java */ + if (outExt == null) { + outExt = "java"; + pre_existentFilename = pre_existentFilename + "." + outExt; + } + /* the extension of the existing file must be one of those + * provided */ + if (!outExt.equals("java") & !outExt.equals("properties") + & !outExt.equals("jsp") & !outExt.equals("xml") + & !outExt.equals("css")) { + throw new ExactException("The file " + pre_existentFilename + + " in directory " + pre_existentPath + + " is declared with an extension not allowed: " + + outExt, 1103, "FileComponent", ""); + } + if (!outExt.equals(type)) { + throw new ExactException("The file " + pre_existentFilename + + " in directory " + pre_existentPath + + " is declared with an extension «" + outExt + + "» not corresponding to the type «" + type + "»", + 1108, "FileComponent", ""); + } + String inExt = Mix.estraiExtension(nomeFileOrigine); + /* the extension of the produced file must be one of those + * provided */ + if (!inExt.equals("java") & !inExt.equals("properties") & !inExt + .equals("jsp") & !inExt.equals("xml") & !inExt.equals( + "txt") & !inExt.equals("css")) { + throw new ExactException("The original file " + + nomeFileOrigine + + " is declared with an extension not allowed: " + + inExt, 1104, "FileComponent", ""); + } + if (!inExt.equals("txt") & !inExt.equals(type)) { + throw new ExactException("The original file " + + nomeFileOrigine + + " it is declared with an extension " + Mix + .dress_A(inExt) + + " not corresponding to the type " + Mix.dress_A( + type) + ".", 1109, "FileComponent", ""); + } + /* check that there is no confusion between the old and the new + * file; the new one can only contain the string "knife" */ + if (materialeProdottoDaScrewdriver.indexOf(upper) > -1 + | materialeProdottoDaScrewdriver.indexOf(lower) > -1) { + throw new ExactException("The original file «" + + nomeFileOrigine + + "» cannot contain either the string " + Mix + .dress_A(upper) + " or the string " + Mix + .dress_A(lower) + ".", 1105, + "FileComponent", ""); + } + preExistent = new File(Mix.dress_C(pre_existentPath) + + pre_existentFilename); + /* if the output file still does not exist, liquidate + * everything */ + if (!preExistent.exists()) { + /* note that the position of knife, that is, the column in + * the row, causes the same position for the upper string; + * originally knife should be after a TAB */ + String doublet = ""; + // if (!outExt.equals("properties")) { + // doublet += Candies.TAB; + // } + doublet += upper + Candies.LF; + if (!outExt.equals("properties")) { + doublet += Candies.TAB; + } + doublet += lower; + String trasformato = materialeProdottoDaScrewdriver + .replaceAll(knifeX, doublet); + Equipment.writeFileFromOneStringUnicode_A(preExistent, + trasformato, "UTF-8"); + return; + } + /* at this point we know that the worked file already existed */ + /* correction necessary to avoid breakdowns during + * construction */ + if (materialeProdottoDaScrewdriver.endsWith(knife)) { + materialeProdottoDaScrewdriver += Candies.LF; + } + materialeProdottoDaScrewdriver = clean( + materialeProdottoDaScrewdriver); + String[] newFileSegmentE = materialeProdottoDaScrewdriver.split( + knifeX); + int howManyKnives = newFileSegmentE.length - 1; + /* all variables with suffix R indicate material transformed + * according to the UTF-8 charset, or possibly that provided by + * the .ele file */ + String materialePreesistenteR = Equipment.oneStringUnicode_A( + preExistent, charset); + String materialePreesistente = Equipment.oneString(preExistent); + /* I use the new material string twice, to create upperSegmentoE + * and lowerSegmentoE respectively */ + /* 1st use */ + String materiale = materialePreesistente; + String materialeR = materialePreesistenteR; + /* I make a convenient correction */ + if (materiale.endsWith(upper)) { + materiale += Candies.LF; + } + if (materialeR.endsWith(upper)) { + materialeR += Candies.LF; + } + String[] upperSegmentoE = materiale.split(upperX); + String[] upperSegmentoRE = materialeR.split(upperX); + /* the amount of upper does not depend on the charset */ + int quantiUpper = upperSegmentoE.length - 1; + /* 2nd use */ + materiale = materialePreesistente; + materialeR = materialePreesistenteR; + /* I make a convenient correction */ + if (materiale.endsWith(lower)) { + materiale += Candies.LF; + } + if (materialeR.endsWith(lower)) { + materialeR += Candies.LF; + } + String[] lowerSegmentoE = materiale.split(lowerX); + @SuppressWarnings("unused") + String[] lowerSegmentoRE = materialeR.split(lowerX); + /* the amount of lower does not depend on the charset */ + int quantiLower = lowerSegmentoE.length - 1; + /* in the same way the following quantities do not depend on the + * charset */ + if (howManyKnives != quantiUpper) { + throw new ExactException( + "The file produced by Screwdriver «" + + nomeFileOrigine + + "» contains a quantity of KNIFE (" + + howManyKnives + ")" + Candies.LF + + "different from the quantity of UPPER (" + + quantiUpper + + ") that are present in the output file «" + + pre_existentFilename + + "», in the directory" + Candies.LF + + pre_existentPath + " .", 1106, + "FileComponent", ""); + } + if (howManyKnives != quantiLower) { + throw new ExactException( + "The file produced by Screwdriver «" + + nomeFileOrigine + + "» contains a quantity of di KNIFE (" + + howManyKnives + ")" + Candies.LF + + "different from the quantity of LOWER (" + + quantiLower + + ") that are present in the pre-existent file «" + + pre_existentFilename + + "» in the directory" + Candies.LF + + pre_existentPath + " .", 1107, + "FileComponent", ""); + } + /* control of lower-upper alternation */ + if (upperSegmentoE[0].indexOf(lower) > -1) { + throw new ExactException("The input file «" + + nomeFileOrigine + + "» contains a wrong alternation " + + "of UPPER and LOWER; it starts with a LOWER.", + 1110, "FileComponent", ""); + } + for (int i = 1; i <= quantiUpper; i++) { + if (upperSegmentoE[i].indexOf(lower) == -1) { + throw new ExactException("The input file «" + + nomeFileOrigine + + "» contains a wrong alternation " + + "of UPPER and LOWER (after the UPPER n. " + i + + ").", 1111, "FileComponent", ""); + } + } + if (lowerSegmentoE[lowerSegmentoE.length - 1].indexOf( + upper) > -1) { + throw new ExactException("The input file «" + + nomeFileOrigine + + "» contains a wrong alternation " + + "of UPPER and LOWER; it ends with an UPPER.", + 1112, "FileComponent", ""); + } + for (int i = 0; i < quantiLower; i++) { + if (lowerSegmentoE[i].indexOf(upper) == -1) { + throw new ExactException("The input file «" + + nomeFileOrigine + + "» contains a wrong alternation " + + "of UPPER and LOWER (before the LOWER n. " + i + + ").", 1113, "FileComponent", ""); + } + } + /* now we are sure that quantiUpper, quantiLower and quantiKnife + * indicate the same quantity */ + String[] oldFileSegmentE = new String[quantiUpper + 1]; + String[] oldFileSegmentRE = new String[quantiUpper + 1]; + /* containedE is the list of texts contained between a UPPER and + * a LOWER, therefore 1 less than the segments that are + * intermediate between the various upper-lower pairs; it is + * necessary to count the first and the last */ + /* remember that upperSegmentoE is the list of segments + * resulting from the split based on the upper only */ + /* for the old content we also refer to the text transformed + * according to the charset, so we calculate both with R and + * without R, but what will be really used is the one with R */ + String[] vecchioContenutoRE = new String[quantiUpper]; + String[] vecchioContenutoE = new String[quantiUpper]; + int k = 0; + for (int j = 0; j < quantiUpper + 1; j++) { + if (j == 0) { + oldFileSegmentE[j] = upperSegmentoE[j]; + oldFileSegmentRE[j] = upperSegmentoRE[j]; + } else { + k = upperSegmentoE[j].indexOf(lower); + oldFileSegmentE[j] = upperSegmentoE[j].substring(k + + lower.length()); + vecchioContenutoE[j - 1] = upperSegmentoE[j].substring( + 0, k); + k = upperSegmentoRE[j].indexOf(lower); + oldFileSegmentRE[j] = upperSegmentoRE[j].substring(k + + lower.length()); + vecchioContenutoRE[j - 1] = upperSegmentoRE[j] + .substring(0, k); + } + oldFileSegmentRE[j] = clean(oldFileSegmentRE[j]); + } + /* I remove any line-feeds in the queue */ + oldFileSegmentE[quantiUpper] = equalize( + oldFileSegmentE[quantiUpper]); + oldFileSegmentRE[quantiUpper] = equalize( + oldFileSegmentRE[quantiUpper]); + /* CURRENT SITUATION OF THE PRE-EXISTING MATERIAL */ + /* I make an example of a file that contains 2 upper-lower + * pairs; we have: oldSegmentE [0], oldContentsE [0], + * oldSegmentE [1], oldContentsE [1], oldSegmentE [2] */ + /* note that the distinction R and not R are not necessary for + * new text */ + newFileSegmentE[quantiUpper] = equalize( + newFileSegmentE[quantiUpper]); + boolean noQuestion = false; + k = 0; + /* now I compare each of the new segments with the old ones; the + * cycle continues until diversity is encountered */ + /* note that the comparison is made exclusively on the R + * version, that is, the text transformed according to the + * charset */ + for (; k < quantiUpper + 1; k++) { + String nuovo = newFileSegmentE[k]; + String vecchio = oldFileSegmentE[k]; + String vecchioR = oldFileSegmentRE[k]; + /* this if is set to save time in case it is not necessary + * to compact; could be removed */ + if (nuovo.equals(vecchioR) | nuovo.equals(vecchio)) { + continue; + } + nuovo = Strings.compatta_B(nuovo); + vecchio = Strings.compatta_B(vecchio); + vecchioR = Strings.compatta_B(vecchioR); + if (nuovo.equals(vecchioR) | nuovo.equals(vecchio)) { + continue; + } + /* it's not a java file, skip all import processing */ + if (!type.equals("java")) { + break; + } + + // 3 SECTORS EACH SEGMENTS + String coda = null; + int fineImport = 0; + /* the 3 sectors are: 1) before imports, i.e. comments line + * and package; 2) import lines; 3) after imports, i.e. + * ordinary java code */ + String[] newFileSectorE = new String[3]; + String[] oldFileSectorE = new String[3]; + String[] oldFileSectorRE = new String[3]; + String[] newFileSectorXE = newFileSegmentE[k].split( + "\\n\\x20*import "); + String[] oldFileSectorXE = oldFileSegmentE[k].split( + "\\n\\x20*import "); + String[] oldFileSectorRXE = oldFileSegmentRE[k].split( + "\\n\\x20*import "); + newFileSectorE[0] = newFileSectorXE[0]; + coda = newFileSectorXE[newFileSectorXE.length - 1]; + /* 59 is the semicolon */ + fineImport = coda.indexOf(59); + /* the +1 is used to go beyond the LINE FEED after the + * semicolon */ + newFileSectorE[2] = coda.substring(fineImport + 1); + + /* without R */ + oldFileSectorE[0] = oldFileSectorXE[0]; + coda = oldFileSectorXE[oldFileSectorXE.length - 1]; + /* 59 is the semicolon */ + fineImport = coda.indexOf(59); + /* the +1 is used to go beyond the LINE FEED after the + * semicolon */ + oldFileSectorE[2] = coda.substring(fineImport + 1); + + /* with R */ + oldFileSectorRE[0] = oldFileSectorRXE[0]; + coda = oldFileSectorRXE[oldFileSectorRXE.length - 1]; + /* 59 is the semicolon */ + fineImport = coda.indexOf(59); + /* the +1 is used to go beyond the LINE FEED after the + * semicolon */ + oldFileSectorRE[2] = coda.substring(fineImport + 1); + + // IMPORT PROCESSING + + /* since no import is assumed to have an ASCII character> + * 127, the distinction between "without R" and "with R" is + * not necessary */ + + List nuovoImportE = new ArrayList(); + // List vecchioImportE = new ArrayList (); + List vecchioImportRE = new ArrayList(); + /* oldImportE and newImportE are real and clean imports from + * the word import and semicolon */ + for (int i = 0; i < newFileSectorXE.length - 1; i++) { + /* 59 is the semicolon */ + /* the +1 is to skip the first line, which declares the + * package */ + int j = newFileSectorXE[i + 1].indexOf(59); + nuovoImportE.add(newFileSectorXE[i + 1].substring(0, j) + .trim()); + } + + /* 2 separate for loops for "without R" and "with R" */ + /* without R */ + // for (int i = 0; i salvatiE = new ArrayList(); + /* now I try if each of the old imports (therefore + * potentially typed by the developer after the first + * creation) is present or not from the source code produced + * by Screwdriver */ + + /* for this for loop, since we are going to read the + * contents of the imports and compare them, I assume that I + * can run only once, with the R mode, and then correctly + * save them. */ + for (int iv = 0; iv < vecchioImportRE.size(); iv++) { + String s = vecchioImportRE.get(iv); + int in = 0; + for (; in < nuovoImportE.size(); in++) { + if (s.equals(nuovoImportE.get(in))) { + break; + } + } + /* if the import is not present among those of this + * processing, this means that it has been entered by + * hand ... */ + if (in == nuovoImportE.size()) { + /* ... therefore I have to save it, and I memorize + * it by writing down w, which is the position of + * the last import that coincides instead */ + /* w could be -1 */ + salvatiE.add(s); + } + } + for (int is = 0; is < salvatiE.size(); is++) { + nuovoImportE.add(salvatiE.get(is)); + } + newFileSectorE[1] = ""; + for (int iv = 0; iv < nuovoImportE.size(); iv++) { + newFileSectorE[1] += "import " + nuovoImportE.get(iv) + + ";" + Candies.LF; + } + /* the 3 sectors are: 1) before imports, i.e. comments line + * and package; 2) import lines; 3) after imports, i.e. + * ordinary java code */ + Boolean[] comparison = new Boolean[3]; + for (int i = 0; i < 3; i++) { + comparison[i] = Strings.compatta_B(newFileSectorE[i]) + .equals(Strings.compatta_B(oldFileSectorRE[i])); + } + /* if the only difference is the added imports, there is no + * need to ask for permission */ + if (comparison[0] & comparison[1] & comparison[2]) { + continue; + } + newFileSegmentE[k] = newFileSectorE[0] + newFileSectorE[1] + + newFileSectorE[2]; + /* no question if only imports are different */ + noQuestion = comparison[0] & comparison[2]; + break; + } + /* if I find one, the k-th segment, different, then I have to + * trigger the request for permission to overwrite */ + if (k < quantiUpper + 1) { + /* I put the first piece ... */ + String cumulo = newFileSegmentE[0]; + /* ... and then the following */ + for (int n = 1; n < quantiUpper + 1; n++) { + cumulo += upper; + cumulo += vecchioContenutoRE[n - 1]; + cumulo += lower; + cumulo += newFileSegmentE[n]; + } + /* I call him arrogant when, despite the need to make a + * replacement, he does not ask for any permission */ + /* he is humble, because he is not arrogant, if the last + * argument is false; for now there are no other uses of + * humble with arrogant = true */ + finishLine(cumulo, pre_existentFilename, nomeFileOrigine, + recycleBinY, preExistent, candies, noQuestion); + } + } + + /** @param noQuestion false if I asks for permission before + * acting */ + private void finishLine(final String materialeOutput, + final String nomeFileOutput, final String nomeFileInput, + final String recycleBinY, File output, CandyScrew candies, + final boolean noQuestion) + + throws ExactException { + + /* freeze files are those that must not be touched at all, they + * are mentioned in the external properties file */ + if (!noQuestion & !remember) { + boolean freeze = false; + boolean freezeDue = false; + wellIPermit = false; + if (candies.freezeE != null) { + int i = 0; + for (; i < candies.freezeE.size(); i++) { + if (candies.freezeE.get(i).equalsIgnoreCase( + nomeFileOutput)) { + break; + } + } + freeze = i < candies.freezeE.size(); + } + /* could become freeze by looking in the other list */ + if (!freeze & candies.freezeDueE != null) { + int j = 0; + for (; j < candies.freezeDueE.size(); j++) { + if (candies.freezeDueE.get(j).equalsIgnoreCase( + nomeFileOutput)) { + break; + } + } + freezeDue = j < candies.freezeDueE.size(); + } + if (!freeze & !freezeDue) { + String question = "The file " + Mix.dress_A( + nomeFileOutput) + + " has changed, can I overwrite it?"; + logger.info(question); + /* the "Yes" button is locked only if I have declared + * some files as "freezeDue" and I have declared that + * the java source is not inside, that is, it is not + * written from java code already present in the ele + * file */ + boolean lockButtonYes = false; + Remember noMore = new Remember(null, question, + "Question", lockButtonYes); + logger.info(noMore.answer[0] ? "Yes" + : freeze ? "Mandatory NO" : "No"); + wellIPermit = noMore.answer[0]; + remember = noMore.answer[1]; + } else if (freezeDue) { + logger.info("So, I do not change the file " + Mix + .dress_A(nomeFileOutput) + "."); + } + } + if (wellIPermit) { + String x = Skill.datePosition(recycleBinY); + File destiny = new File(x + nomeFileInput); + destiny.delete(); + output.renameTo(destiny); + Equipment.writeFileFromOneStringUnicode_A(output, + materialeOutput, "UTF-8"); + } + } + + private static void searchForRepetion(List stringE, + final String fileName, final boolean old) + throws ExactException { + for (int i = 0; i < stringE.size(); i++) { + String s = stringE.get(i); + int j = i + 1; + for (; j < stringE.size(); j++) { + if (s.equals(stringE.get(j))) { + break; + } + } + if (j < stringE.size()) { + ExactException ce = new ExactException( + "There are 2 identical imports in the " + (old + ? "old " + : "new ") + Mix.dress_A(fileName) + ": " + + s, 1116, "FileComponent", ""); + throw ce; + } + } + } + + /* in producing the files within the algorithms of the program, LFs + * can be created more or less at the end of the file, which cause a + * "different" result in the comparison of the sources, and + * therefore a rewriting; to avoid this, I proceed to a draw of the + * LF in the queue */ + private static String equalize(final String s0) { + String s = s0; + /* I remove any line feed in the queue */ + while (s.endsWith(Candies.LF)) { + s = s.substring(0, s.length() - 1); + } + /* I replace only one */ + s += Candies.LF; + s = s.replaceAll("\\r\\n", Candies.LF); + s = s.replaceAll("\\n\\r", Candies.LF); + return s; + } + + private static String clean(final String s0) { + String s = s0; + s = s.replaceAll("\\r", ""); + return s; + } + + /** + *

+ * Creation date: 2020-09-09
+ * Last updated: 2020-09-09
+ * Class: Skill + * + * @author Massimo Maglioni + *

+ * Description: + *

+ * @param y directory name where a date has to be added + * @return the directory name followed by today date */ + public static String datePosition(final String y) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + String x = sdf.format(new Date()); + File d = new File(Mix.dress_C(y) + x); + if (d.exists() & !d.isDirectory()) { + d.delete(); + } + if (!d.exists()) { + d.mkdir(); + } + return d.getPath() + sep; + } +} \ No newline at end of file diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/Train.java b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/Train.java new file mode 100644 index 0000000..369ce19 --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/Train.java @@ -0,0 +1,93 @@ +// +// https://www.ramecera.it/myscrewdriver.html +// e-mail: screwdriver@ramecera.it +// +/* This program and the accompanying materials are made available under + * the terms of the Eclipse Public License v1.0 which accompanies this + * distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html */ +package it.ramecera.screwdriver; + +import java.util.HashMap; +import java.util.Map; + +import org.apache.log4j.Logger; + +import it.ramecera.salad.everyday.ExactException; + +/** + *

+ * The tape object indicates a line of the ele file, therefore of + * input, consisting of a markup and all the material (called + * substance), which is next to it; if there is no markup in the + * immediately following lines, all these lines are an integral part of + * the substance as if they were a single line.
+ * There are 9 public properties, of which the 2 most important are: + *

+ *
    + *
  • n: the markup, expressed with a number because it indicates the + * position of the markup in the list of markups;
  • + *
  • substance: it is an Object, because, depending on the content of + * the row, it is immediately transformed into a Timestamp , String, or + * Integer;
  • + *
+ * + *

+ * Company: Rameceraâ„¢
+ * Creation date: 2020-04-09
+ * Last updated: 2020-06-03
+ *

+ *

+ * Modifications:
+ * 2020-04-09: new method corrections
+ *

+ * + * @author M. Maglioni */ + +final public class Train { + + // PUBLIC PROPERTIES + + /** the first segment that makes up the train */ + public Wagon locomotor; + + /** the list of subsequent segments that make up the train */ + public Map wagonE = new HashMap(); + + // CONSTANT + + /** ordinary logger */ + @SuppressWarnings("unused") + private static final Logger logger = Logger.getLogger(Train.class); + + // constructorS + + /** default constructor */ + public Train() { + } + + /** + *

+ * Useful constructor + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09
+ *

+ * + * @param v wagon that makes up the fettuccia + * @param rigaJ the line of the file affected by the exception + * @throws ExactException standard exception */ + public Train(Wagon v, final int rigaJ) throws ExactException { + ExactException ne = new ExactException(); + if (wagonE.put(v.stub, v) != null) { + ne.datum = "Too much times I have declared the markup «" + + v.stub + "» following a «" + locomotor.stub + + "»."; + ne.code = 2200; + ne.n = rigaJ; + ne.className = this.getClass().getName(); + throw ne; + } + } +} diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/Wagon.java b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/Wagon.java new file mode 100644 index 0000000..f47a299 --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/Wagon.java @@ -0,0 +1,771 @@ +// +// https://www.ramecera.it/myscrewdriver.html +// e-mail: screwdriver@ramecera.it +// +/* This program and the accompanying materials are made available under + * the terms of the Eclipse Public License v1.0 which accompanies this + * distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html */ +package it.ramecera.screwdriver; + +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.regex.Pattern; + +import org.apache.log4j.Logger; + +import it.ramecera.salad.everyday.Candies; +import it.ramecera.salad.everyday.HandleDate; +import it.ramecera.salad.everyday.Mix; +import it.ramecera.salad.everyday.Strings; +import it.ramecera.salad.everyday.ExactException; +import it.ramecera.screwdriver.outfits.JspKit; +import it.ramecera.screwdriver.outfits.JspBeanElement; + +/** + *

+ * The wagon object indicates a markup with its data. + *

+ *

+ * Company: Rameceraâ„¢
+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Modifications:
+ *

+ * + * @author M. Maglioni */ +final public class Wagon { + + // PUBLIC PROPERTIES + + /** the stub */ + public String stub; + /** the main data */ + public Object substance; + /** the text */ + public String text; + /** the N. in the corresponding text file */ + public int rigaJ; + /** the N. placed in the train list on the corresponding text + * file */ + public int positionJ; + /** amount of words of the substance */ + public int wordQ; + /** technical evaluation of the text (if it is a SQL query of type + * select, how many columns there are; 1 = a single column of + * select; 2 = more columns of select) */ + public int valutazioneColonne; + /** if this segment is to be considered non-existent, remember that + * the default is false; a train is called a "follower" when it is + * the logical continuation of a previous train; it can be a + * continuation line of a text, or it can be a regular train that + * adds information to a previous train (example: formt+ is a + * follower of jsp+) */ + public boolean follower; + + /** ordinary logger */ + private static final Logger logger = Logger.getLogger(Wagon.class); + + /** default constructor */ + public Wagon() { + + } + + /** + *

+ * Creation date: 2020-04-29
+ * Last updated: 2020-06-27
+ * + * @author Massimo Maglioni + *

+ * Description: This constructor is used to completely + * define each markup: a line of text preceded by a label. + *

+ * + * @param markupE the list of markups + * @param stub the name of the markup + * @param substance object containing the data, i.e. a date, string + * or number + * @param rigaJ the line number on the + * @param hole the position that will occupy the strap of this + * segment in the list of trains; it is obtained from the + * account of valid trains obtained with the variable zQ + * @param trainW the previous train object, null if this train is + * the first; is the previous train in a logical sense, + * because there may be follower trains in the middle + * @param position of the markup position in the .ele file, + * corrected for the presence of .eli files with the function + * of include + * @throws ExactException the new segment is incorrect */ + public Wagon(HashMap markupE, final String stub, + Object substance, final int rigaJ, final int hole, + Train trainW, final int position) + + throws ExactException { + + this.stub = stub; + ExactException ne = new ExactException(); + /* I memorize the type of markup */ + int p = markupE.get(stub).p; + this.rigaJ = rigaJ; + this.substance = substance; + /* at this moment the substance can only be a string; only later + * will we qualify it as a date or integer or booelan */ + if (!this.substance.getClass().getName().equals( + "java.lang.String")) { + this.wordQ = 0; + ne.datum = "Attempt to construct a segment by supplying" + + " a substance that is not a string."; + throw ne; + } else if (this.substance.equals("")) { + this.wordQ = 0; + } else { + this.wordQ = ((String) this.substance).split(" ").length; + } + String x = ((String) substance); + logger.trace("stub=" + stub + ", x=" + x); + String message = null; + switch (p) { + /* The follower segment is a continuation segment of the text which + * is called follower because after its use it loses all + * reference */ + case 0: /* a free text; by definition the segment is follower */ + if (trainW == null) { + message = "An \"ele\" file must begin with a regular" + + " markup, not with a text: I have found " + + Mix.dress_A(x) + "."; + ne.code = 1600; + ne.datum = message; + ne.className = this.getClass().getName(); + ne.line = rigaJ; + throw ne; + } + // SHE'S DEAD + follower = true; + break; + case 1: // a date + x = Mix.compactingSpaces_A(x); + if (x.length() == 0) { + message = "There should be a date at the markup " + Mix + .dress_A(markupE.get(stub).stub) + " at line " + + position + + ", on the contrary there is nothing."; + ne.code = 1601; + ne.datum = message; + ne.className = this.getClass().getName(); + ne.line = rigaJ; + throw ne; + } else if (!HandleDate.eDataValida(x, "d-M-yyyy") + && !HandleDate.eDataValida(x, "d/M/yyyy") + && HandleDate.eLongValidDate(x) == null) { + message = "There should be a date at the markup " + Mix + .dress_A(markupE.get(stub).stub) + " at line " + + position + ", on the contrary I have found " + + Mix.dress_A(x); + ne.code = 1602; + ne.datum = message; + ne.className = this.getClass().getName(); + ne.line = rigaJ; + throw ne; + } else if (HandleDate.eDataValida(x, "d-M-yyyy")) { + this.substance = HandleDate.pacco(x); + } else if (HandleDate.eDataValida(x, "d/M/yyyy")) { + this.substance = HandleDate.pacco(x); + } else + this.substance = HandleDate.eLongValidDate(x); + break; + case 7: // a CSS color + x = Mix.compactingSpaces_A(x).toLowerCase(); + if (x.length() == 0) { + message = "There should be a CSS color at the markup " + + Mix.dress_A(markupE.get(stub).stub) + + " at line " + position + + ", on the contrary there is nothing."; + ne.code = 1603; + ne.datum = message; + ne.className = this.getClass().getName(); + ne.line = rigaJ; + throw ne; + } else if (!Mix.isCssColor(x) & !x.matches( + "\\x23[0123456789abcdef]{6}") & !x.matches( + "rgb\\x28\\d+\\x2c\\x20*\\d+\\x2c\\x20*\\d+\\x29")) { + message = "There should be a CSS color at the markup " + + Mix.dress_A(markupE.get(stub).stub) + + " at line " + position + + ", on the contrary I have found " + Mix + .dress_A(x); + ne.code = 1604; + ne.datum = message; + ne.className = this.getClass().getName(); + throw ne; + } else { + this.text = x.trim(); + this.substance = x.trim(); + } + break; + case 2: // an unsigned positive integer, mandatory + x = Mix.compactingSpaces_A(x); + if (x.length() == 0) { + message = "There should be a CSS color at the markup" + + markupE.get(stub).stub + "» at line " + + position + + ", on the contrary there is nothing."; + ne.code = 1605; + ne.datum = message; + ne.className = this.getClass().getName(); + throw ne; + } else if (!Pattern.matches("\\d+", x)) { + message = "There should be a number at the markup «" + + markupE.get(stub).stub + " at line " + + position + ", on the contrary I have found " + + Mix.dress_A(x); + ne.code = 1606; + ne.datum = message; + ne.className = this.getClass().getName(); + ne.line = rigaJ; + throw ne; + } + this.text = x; + this.substance = Long.valueOf(x); + break; + case 15: // an integer with or without sign, mandatory + x = Mix.compactingSpaces_A(x); + if (x.length() == 0) { + message = "There should be a number at the markup " + + Mix.dress_A(markupE.get(stub).stub) + + " at line " + position + + ", on the contrary there is nothing."; + ne.code = 1607; + ne.datum = message; + ne.className = this.getClass().getName(); + throw ne; + } else if (!Pattern.matches("[+-]?\\d+", x)) { + message = "There should be a number at the markup " + + Mix.dress_A(markupE.get(stub).stub) + + " at line " + position + + ", on the contrary I have found " + Mix + .dress_A(x); + ne.code = 1608; + ne.datum = message; + ne.className = this.getClass().getName(); + ne.line = rigaJ; + throw ne; + } + this.text = x; + this.substance = Long.valueOf(x); + break; + case 10: /* a string that refers to an include */ + case 6: // a string, optional + x = x.replaceAll("\\s", " "); + x = Mix.compactingSpaces_A(x); + this.text = x; + if (x.length() == 0) { + break; + } + case 20: // a string + if (p == 20) { + this.substance = ""; + } + case 3: // a string + x = Strings.compact_A(x); + if (x.length() == 0) { + message = "After the markup «" + markupE.get(stub).stub + + "» at line " + rigaJ + + " there must be anything, " + + "on the contrary there is nothing."; + ne.code = 1609; + ne.datum = message; + ne.className = this.getClass().getName(); + throw ne; + } + if (stub.equals("sdefauto")) { + x = x.toLowerCase(); + switch (x) { + case "no": + this.text = "no"; + break; + case "byname": + this.text = "byName"; + break; + case "bytype": + this.text = "byType"; + break; + case "autodetect": + this.text = "autodetect"; + break; + case "constructor": + this.text = "constructor"; + break; + default: + ne.code = 1610; + ne.datum = "The value " + Mix.dress_A(x) + + " for the markup " + Mix.dress_A(markupE + .get(stub).stub) + " at line " + + position + " was not expected."; + throw ne; + } + } else if (stub.startsWith("form") & markupE.get( + "jsp").recurrenceE.size() == 0) { + message = "The markup " + Mix.dress_A(stub) + + " at line " + position + + " must be preceded (even if not immediately) " + + "by the markup «jsp»."; + ne.code = 1612; + ne.datum = message; + ne.className = this.getClass().getName(); + throw ne; + } else if (stub.equals("formt")) { + this.text = x; + follower = true; + } else if (stub.equals("forma")) { + this.text = x; + follower = true; + } else if (stub.equals("formc")) { + this.text = x; + follower = true; + } else if (stub.equals("formn")) { + this.text = x; + follower = true; + } else if (stub.equals("formr")) { + this.text = x; + follower = true; + } else if (stub.equals("legend")) { + ((JspKit) trainW.locomotor.substance).legend = x; + } else if (markupE.get(stub).implyE != null && markupE.get( + stub).implyE.length == 1 && markupE.get( + stub).implyE[0].isWagon) { + this.text = x; + follower = true; + } else { + this.text = x; + } + break; + case 21: /* a string that refers to an include */ + case 23: /* a language code */ + case 19: + x = Mix.compactingSpaces_A(x); + int j = 0; + String[] eW = markupE.get(stub).expectedValueE; + for (; j < eW.length; j++) { + if (eW[j].trim().equalsIgnoreCase(x)) { + /* I correct a possible inaccuracy on upper / lower + * case */ + x = eW[j]; + break; + } + } + if (j == eW.length & x.isEmpty()) { + if (p == 23) { + message = "For the markup «" + markupE.get(stub) + + "» the expected values are the language codes ISO 639-1."; + } else { + message = "For the markup «" + markupE.get( + stub).stub + "» the expected values are: "; + for (String u : markupE.get(stub).expectedValueE) { + message += u + ", "; + } + message += "but no value has been declared."; + } + ne.code = 1626; + ne.datum = message; + ne.className = this.getClass().getName(); + throw ne; + } else if (j == eW.length) { + if (p == 23) { + message = "For the markup " + Mix.dress_A(markupE + .get(stub).stub) + + " the expected values are according to " + + "language code ISO 639-1, "; + } else { + message = "For the markup «" + stub + + "» the expected values are: "; + for (String u : markupE.get(stub).expectedValueE) { + message += u + ", "; + } + } + message += "but I have found " + Mix.dress_A(x) + "."; + ne.code = 1628; + ne.datum = message; + ne.className = this.getClass().getName(); + throw ne; + } + if (p == 23) { + this.text = x.toLowerCase(); + } else { + this.text = x; + } + if (p != 21) { + this.substance = Integer.valueOf(j); + } + break; + case 11: /* a string that refers to an include */ + case 5: // a version of software + x = Mix.compactingSpaces_A(x); + message = "The markup " + Mix.dress_A(stub) + " at line " + + rigaJ + " presents a value " + x + + " which on the contrary should be a version" + + " of software."; + this.substance = Mix.absoluteVersion(x, message, 1627); + this.text = x; + case 16: // like 12 but optional + x = x.replaceAll("\\s", " "); + x = Mix.compactingSpaces_A(x); + this.text = x; + if (x.length() == 0) { + break; + } + case 8: // like 12, and automatically converted to lowercase + case 12: // a one-word string + x = Mix.compactingSpaces_A(x); + if (x.length() == 0 | x.indexOf(32) > -1) { + message = "After the markup " + Mix.dress_A(stub) + + " at line " + position + + " there must be something, and it must be one word."; + ne.code = 1613; + ne.datum = message; + ne.className = this.getClass().getName(); + throw ne; + } else if (stub.equals("sinterce")) { + /* make sure the initial is capitalized, it's a classse + * java! */ + this.text = x.substring(0, 1).toUpperCase() + x + .substring(1); + } else if (stub.equals("bmenu")) { + this.text = x.toLowerCase(); + follower = true; + } else if (stub.equals("requmap") | stub.equals("burl")) { + if (x.startsWith(Candies.SLASH) & !x.equals( + Candies.SLASH)) { + message = "At line " + position + ", " + stub + "+" + + x + " path starts with a slash," + + " it will be automatically removed."; + logger.debug(message); + this.substance = x.substring(1); + this.text = x; + } else { + this.text = x; + } + } else if (p == 8) { + this.text = x.toLowerCase(); + } else { + this.text = x; + } + break; + case 14: /* a string of a path plus file name, not more than 1 + * slash, but optional */ + if ((stub.equals("edefn") | stub.equals("sieco")) & markupE + .get("jsp").recurrenceE.size() == 0) { + message = "The markup " + Mix.dress_A(stub) + + " at line " + position + + " must be preceded by the markup «jsp»."; + ne.code = 1616; + ne.datum = message; + ne.className = this.getClass().getName(); + throw ne; + } + x = x.replaceAll("\\t", " "); + x = Mix.compactingSpaces_A(x); + this.text = x; + if (x.length() == 0) { + x = (markupE.get("jsp").recurrenceE.get( + 0)).locomotor.text; + } + + case 13: /* a string of a path plus file name, not more than 1 + * slash */ + x = Mix.compactingSpaces_A(x); + x = x.replaceAll("\\x5c", "/"); // x5c is the backslash + if (Mix.stringheQ(x, "/") > 1 | Mix.stringheQ(x, ".") < 1) { + message = "After the markup " + Mix.dress_A(markupE.get( + stub).stub) + " at line " + position + + " there is an irregular path; it needs" + + " one directory without initial slash" + + " and a file with its extension."; + ne.code = 1617; + ne.datum = message; + ne.className = this.getClass().getName(); + ne.line = rigaJ; + throw ne; + } else { + this.text = x; + if (x.indexOf(47) == -1) { // ASCII 47 is the bar + x = "/" + x; + } + // hexadecimal 2f is the slash + this.substance = Mix.analizzaPath(x); + } + if (stub.equals("jsp")) { + String[] s = Mix.analizzaPath(x); + this.substance = new JspKit(s[0], s[1], s[2], false, + new ArrayList(), "", + new ArrayList(), positionJ, null, 0); + } + break; + + case 9: /* a string that refers to an include */ + case 4: // empty + /* Blank means markup without any parameters. To express a + * Boolean value, true / false is not used, but two distinct + * markups are used */ + if (x.length() > 0) { + message = "After the markup " + Mix.dress_A(markupE.get( + stub).stub) + " at line " + position + + " there must be nothing, on the contrary" + + " I have found " + Mix.dress_A(x) + "."; + ne.code = 1618; + ne.method = "Wagon constructor"; + ne.datum = message; + ne.line = rigaJ; + ne.className = this.getClass().getName(); + throw ne; + } + if (markupE.get(stub).implyE != null) { + for (int n = 0; n < markupE.get( + stub).implyE.length; n++) { + if (!markupE.get(stub).implyE[n].value.equals("")) { + message = "The markup " + Mix.dress_A(stub) + + " at line " + rigaJ + + " presents as supposed the markup " + + Mix.dress_A(markupE.get( + stub).implyE[n].stub + + Markup.PIU + markupE.get( + stub).implyE[n].value) + + " which should be a software version."; + this.substance = Mix.absoluteVersion(markupE + .get(stub).implyE[n].value, message, + 1625); + } + } + } + if (stub.equals("pragma")) { + follower = true; + } else if (stub.equals("blank")) { + ((JspKit) trainW.locomotor.substance).blank = true; + } + break; + + case 17: /* a mandatory string, consisting of substrings + * separated by commas */ + case 24: /* a mandatory string, consisting of words separated by + * commas */ + x = Strings.compact_A(x); + if (x.length() == 0) { + message = "After the markup «" + markupE.get(stub).stub + + "» at line " + rigaJ + + " there must be anything, on the contrary" + + " there is nothing."; + ne.code = 1619; + ne.datum = message; + ne.className = this.getClass().getName(); + throw ne; + } + String[] z = x.split("\\x2c"); // x2c is the comma + String[][] ss17 = new String[2][z.length]; + for (int i = 0; i < z.length; i++) { + ss17[0][i] = z[i].trim(); + if (ss17[0][i].isEmpty()) { + message = "After the markup " + markupE.get( + stub).stub + " at line " + rigaJ + + " there must be a list, but element n. " + + (i + 1) + " is empty."; + ne.code = 1620; + ne.datum = message; + ne.className = this.getClass().getName(); + throw ne; + } else if (ss17[0][i].indexOf(32) > -1 & p == 24) { + message = "At the markup " + markupE.get(stub).stub + + " at line " + rigaJ + + " there must be a list of words, but element n. " + + (i + 1) + " has more than one word."; + ne.code = 1620; + ne.datum = message; + ne.className = this.getClass().getName(); + throw ne; + } + } + this.substance = ss17; + break; + + case 22: /* an optional string, consisting of substrings + * separated by commas */ + x = x.replaceAll("\\s", " "); + x = Mix.compactingSpaces_A(x); + if (x.length() > 0) { + String[] ss22 = x.split("\\x2c"); // x2c is the comma + for (int i = 0; i < ss22.length; i++) { + ss22[i] = ss22[i].trim(); + } + this.substance = ss22; + this.text = x; + } + break; + + case 18: /* a mandatory string, consisting of a select SQL */ + x = x.trim(); + if (x.length() == 0) { + message = "After the markup «" + markupE.get(stub).stub + + "» at line " + rigaJ + + " there must be anything, on the contrary" + + " there is nothing."; + ne.code = 1622; + ne.datum = message; + ne.className = this.getClass().getName(); + throw ne; + } else if (!x.toLowerCase().startsWith("select ")) { + message = "The markup " + Mix.dress_A(markupE.get( + stub).stub) + " at line " + rigaJ + + " must start with the word «select»."; + ne.code = 1623; + ne.datum = message; + ne.className = this.getClass().getName(); + throw ne; + } else { + String w = x; + w = w.replaceAll("concat([^)]+)", "(dummy"); + int comma = w.indexOf(44); // ASCII 44 is comma + int sqlFrom = w.indexOf(" from "); + if (comma == -1 | comma > sqlFrom) { + this.valutazioneColonne = 1; + } else { + this.valutazioneColonne = 2; + } + this.text = x; + } + break; + default: + ne.code = 1650; + ne.datum = "The value " + p + " for the markup " + Mix + .dress_A(stub) + " at line " + position + + " was not expected."; + throw ne; + } + if (!follower) { + /* identical non-repeat check */ + if (markupE.get(stub).presenza == 4 | markupE.get( + stub).presenza == 5) { + int i = 0; + for (; i < markupE.get(stub).recurrenceE.size(); i++) { + if (markupE.get(stub).recurrenceE.get( + i).locomotor.text.equalsIgnoreCase(x)) { + break; + } + } + if (i < markupE.get(stub).recurrenceE.size()) { + message = "The markup " + Mix.dress_A(stub) + + " at line " + position + + " is a duplicate."; + ne.code = 1621; + ne.datum = message; + ne.className = this.getClass().getName(); + throw ne; + } + } + } + if (markupE.get(stub).precedingE != null) { + int i = 0; + for (; i < markupE.get(stub).precedingE.length; i++) { + if (markupE.get(stub).precedingE[i].equals( + trainW.locomotor.stub)) { + break; + } + } + if (i == markupE.get(stub).precedingE.length) { + message = "The markup " + Mix.dress_A(stub) + + " at line " + position + + " has as previous train " + Mix.dress_A( + trainW.locomotor.stub) + + ", is incorrect"; + ne.code = 1624; + ne.datum = message; + ne.className = this.getClass().getName(); + throw ne; + } + } + } + + // PUBLIC METHODS + + /** + *

+ * Classic clone method. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09
+ *

+ * + * @return the resulting string */ + final public Wagon clone() { + Wagon f = new Wagon(); + f.follower = follower; + f.wordQ = wordQ; + f.rigaJ = rigaJ; + f.positionJ = positionJ; + f.substance = substance; + f.stub = stub; + f.text = text; + return f; + } + + /** + *

+ * Display of a wagon. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ * + * @param i wagon index + * @param mE the list of markups + * @return the string resultant */ + final public String toString(final int i, + HashMap mE) { + String s = ""; + if (i > 0) { + s += "wagon " + i + ") "; + } + s += "[" + mE.get(stub).stub + "], line = " + rigaJ + + "; place = " + positionJ; + if (text != null) { + s += "; /text/-" + text; + } + s += "; className: " + substance.getClass().getName(); + String x = ""; + if (substance.getClass().getName().equals("java.lang.String") + && text == null && ((String) substance).length() == 0) { + x += "/string/-" + substance; + } + if (substance.getClass().getName().equals("java.util.Date")) { + x += "/data/ " + HandleDate.acconciaData_F( + (Date) substance); + } else if (substance.getClass().getName().equals( + "java.lang.Long")) { + x += "/l/-" + substance; + } else if (stub.equals("indexjsp")) { + x += "/index/-navigation bar=" + + ((JspKit) substance).navigationBar; + /* it is not an error, it is the name of the class + * corresponding to long [] */ + } else if (substance.getClass().getName().equals( + "it.ramecera.screwdriver.outfits.JspKit")) { + x += "/jspKit/-" + ((JspKit) substance).toString(); + /* it is not an error, it is the name of the class + * corresponding to long [] */ + } else if (substance.getClass().getName().equals("[J")) { + long[] d = (long[]) substance; + for (long e : d) { + x += "/tipo/-" + e; + } + } + if (!x.isEmpty()) { + s += "; substance = " + x; + } + s += Candies.LF; + return s; + } + +} diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/Base_jsp.java b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/Base_jsp.java new file mode 100644 index 0000000..a3b154c --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/Base_jsp.java @@ -0,0 +1,434 @@ +// +// https://www.ramecera.it/myscrewdriver.html +// e-mail: screwdriver@ramecera.it +// +/* This program and the accompanying materials are made available under + * the terms of the Eclipse Public License v1.0 which accompanies this + * distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html */ +package it.ramecera.screwdriver.component; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.HashMap; +import java.util.List; + +import it.ramecera.salad.everyday.Candies; +import it.ramecera.salad.everyday.ExactException; +import it.ramecera.salad.everyday.Strings; +import it.ramecera.salad.everyday.Universal; +import it.ramecera.salad.file.Equipment; +import it.ramecera.screwdriver.CandyScrew; +import it.ramecera.screwdriver.Cst; +import it.ramecera.screwdriver.Markup; +import it.ramecera.screwdriver.Skill; +import it.ramecera.screwdriver.Train; +import it.ramecera.screwdriver.outfits.JspBeanElement; + +/** @author M. Maglioni */ +final public class Base_jsp extends FileComponent { + + private String[][] buttonsCrud = { { "en", "Create", "Read", + "Update", "Delete" }, { "it", "Crea", "Leggi", "Modifica", + "Cancella" }, { "fr", "Créer", "Lire", "Modifier", + "Supprimer" } }; + + /** + *

+ * I produce the contents of a JSP. + *

+ * + * @author M. Maglioni + *

+ * Company: Rameceraâ„¢
+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09
+ *

+ * @param skill set of + * @param snippetG application descriptive data */ + public Base_jsp(Skill skill, String snippetG) { + super(); + this.skill = skill; + this.snippetG = snippetG; + } + + /** @param markupE markups list + * @param trainE trains list + * @param candyScrew useful application data + * @throws FileNotFoundException obvious + * @throws IOException obvious + * @throws ExactException exception specified by a numeric code */ + final public void synthesis(HashMap markupE, + List trainE, CandyScrew candyScrew) + + throws FileNotFoundException, IOException, ExactException { + + String baseG = skill.candies.snippetsYS + snippetG; + producedMaterial = Equipment.oneString(baseG); + String header = ""; + if (jspKit.refresh > 0) { + header += Candies.TABS + + "" + Candies.LF; + } + header += "" + Candies.LF + Candies.TABS + + ""; + String footer = ""; + String navigation = ""; + String p = ""; // collects material for pragma + String s = ""; + String t = ""; + String b = ""; // collects material to belong + if (jspKit.pageTitle != null) { + b += Candies.TABS + "
" + jspKit.pageTitle + "
" + Candies.LF; + } + boolean presenzaDivPrincipale = jspKit.jspType == Cst.FORM + & jspKit.classeCss != null & !skill.hiberValid + & !skill.springValid; + String divPrincipale = "
" + Candies.LF; + if (presenzaDivPrincipale) { + b += Candies.TABS + divPrincipale; + } + if (jspKit.jspType == Cst.FORM) { + b += Candies.TABS + "" + Candies.LF; + b += Candies.TABS + Candies.TABS + Candies.TABS + "" + + jspKit.legend + "" + Candies.LF; + b += Candies.TABS + Candies.TABS + Candies.TABS + + "" + Candies.LF; + } + /* for now it is assumed that only the "string" or + * "string array" properties participate */ + for (JspBeanElement jbe : jspKit.stringPropertyE) { + // if (x.partecipa & jspKit.jspType! = Cst.FORM) { + if (jbe.participate) { + b += Candies.TABS + Candies.TABS + Candies.TABS + + divPrincipale + Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + + "" + Candies.LF + Candies.TABS + + Candies.TABS + Candies.TABS + "
" + + Candies.LF; + } + } + for (JspBeanElement jbe : jspKit.arrayStringPropertyE) { + // if (x.partecipate & jspKit.jspType! = Cst.FORM) { + if (jbe.participate) { + b += Candies.TABS + divPrincipale; + b += Candies.TABS + Candies.TABS + + "" + + Candies.LF; + b += Candies.TABS + Candies.TABS + Candies.TABS + + "
" + Candies.LF; + b += Candies.TABS + Candies.TABS + "
" + + Candies.LF; + b += Candies.TABS + "" + Candies.LF; + } + } + for (JspBeanElement jbe : jspKit.controlE) { + if (jbe.participate) { + switch (jbe.controlType) { + case Cst.TEXT_BOX: + case Cst.TEXT_AREA: + b += Candies.TABS + Candies.TABS + Candies.TABS + + "" + Candies.LF; + b += Candies.TABS + Candies.TABS + Candies.TABS + + "" + Candies.LF; + if (skill.hiberValid | skill.springValid) { + b += Candies.TABS + Candies.TABS + Candies.TABS + + "" + + Candies.LF; + } + break; + case Cst.LIST_BOX: + b += Candies.TABS + Candies.TABS + Candies.TABS + + "" + Candies.LF; + b += Candies.TABS + Candies.TABS + Candies.TABS + + "" + Candies.LF; + b += Candies.TABS + Candies.TABS + Candies.TABS + + Candies.TABS + "" + Candies.LF; + } + b += Candies.TABS + Candies.TABS + Candies.TABS + + "" + Candies.LF; + break; + case Cst.CHECK_BOX: + b += Candies.TABS + Candies.TABS + Candies.TABS + + "
" + Candies.LF; + b += Candies.TABS + Candies.TABS + Candies.TABS + + Candies.TABS + "" + + Candies.LF; + b += Candies.TABS + Candies.TABS + Candies.TABS + + "
" + Candies.LF; + b += Candies.TABS + Candies.TABS + Candies.TABS + + "" + Candies.LF; + b += Candies.TABS + Candies.TABS + Candies.TABS + + "" + Candies.LF; + b += Candies.TABS + Candies.TABS + Candies.TABS + + Candies.TABS + "" + + Candies.LF; + b += Candies.TABS + Candies.TABS + Candies.TABS + + "" + Candies.LF; + b += Candies.TABS + Candies.TABS + Candies.TABS + + "
" + Candies.LF; + b += Candies.TABS + Candies.TABS + Candies.TABS + + "" + Candies.LF; + if (skill.hiberValid | skill.springValid) { + b += Candies.TABS + Candies.TABS + Candies.TABS + + "" + + Candies.LF; + } + b += Candies.TABS + Candies.TABS + Candies.TABS + + "
" + Candies.LF; + break; + case Cst.RADIO_BUTTON: + b += Candies.TABS + Candies.TABS + Candies.TABS + + "" + Candies.LF; + b += Candies.TABS + Candies.TABS + Candies.TABS + + "" + + Candies.LF; + String[][] wE = (String[][]) (jbe.ftokens.substance); + for (int tK = 0; tK < wE[0].length; tK++) { + b += Candies.TABS + Candies.TABS + Candies.TABS + + Candies.TABS + "" + Candies.LF; + b += Candies.TABS + Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + "" + + Candies.LF; + b += Candies.TABS + Candies.TABS + Candies.TABS + + Candies.TABS + "" + Candies.LF; + } + b += Candies.TABS + Candies.TABS + Candies.TABS + + "
" + + wE[0][tK] + Candies.NON_BREAKING + + Candies.NON_BREAKING + + "
" + Candies.LF; + break; + } + } + } + // for (JspBeanElement jbe : jspKit.controlE) { + // if (jbe.participate & (jbe.controlType.equals(Cst.TEXT_BOX) + // | jbe.controlType.equals(Cst.TEXT_AREA))) { + // } + // } + // for (JspBeanElement jbe : jspKit.controlE) { + // if (jbe.participate & jbe.controlType.equals( + // Cst.LIST_BOX)) { + // } + // } + // for (JspBeanElement jbe : jspKit.controlE) { + // if (jbe.participate & jbe.controlType.equals( + // Cst.CHECK_BOX)) { + // } + // } + // for (JspBeanElement jbe : jspKit.controlE) { + // if (jbe.participate & jbe.controlType.equals( + // Cst.RADIO_BUTTON)) { + // } + // } + int lJ = 0; + if (skill.defaulan > -1) { + for (; lJ < buttonsCrud.length; lJ++) { + if (buttonsCrud[lJ][0].equalsIgnoreCase( + Universal.languageE[skill.defaulan][1])) { + break; + } + } + if (lJ == buttonsCrud.length) { + lJ = 0; + } + } + if (jspKit.jspType == Cst.FORM) { + b += Candies.TABS + Candies.TABS + Candies.TABS + + "
" + Candies.LF; + if (jspKit.crud) { + b += Candies.TABS + Candies.TABS + Candies.TABS + + Candies.TABS + "" + Candies.LF; + b += Candies.TABS + Candies.TABS + Candies.TABS + + Candies.TABS + "" + Candies.LF; + b += Candies.TABS + Candies.TABS + Candies.TABS + + Candies.TABS + "" + Candies.LF; + b += Candies.TABS + Candies.TABS + Candies.TABS + + Candies.TABS + "" + Candies.LF; + } else { + b += Candies.TABS + Candies.TABS + Candies.TABS + + Candies.TABS + + "" + + Candies.LF; + } + b += Candies.TABS + Candies.TABS + Candies.TABS + "
" + + Candies.LF; + b += Candies.TABS + Candies.TABS + "" + + Candies.LF; + b += Candies.TABS + "" + Candies.LF; + } + if (presenzaDivPrincipale) { + b += "" + Candies.LF; + } + if (jspKit.pragma) { + p += "<%" + Candies.LF; + p += "response.setHeader(\"Pragma\",\"no-cache\");" + + Candies.LF; + p += "response.setHeader(\"Cache-Control\", \"no-cache\");" + + Candies.LF; + p += "response.setHeader(\"Expires\",\"-1\");" + Candies.LF; + p += "response.setHeader(\"X-UA-Compatible\",\"IE=9, IE=edge\");" + + Candies.LF; + p += "%>" + Candies.LF; + } + if (markupE.get("text").recurrenceE.size() > 0 & jspKit.fileName + .equals("index")) { + for (int m = 0; m < markupE.get("text").recurrenceE + .size(); m++) { + if (markupE.get("text").recurrenceE.get( + m).locomotor.positionJ > jspKit.placeJ) { + t = "
" + markupE + .get("text").recurrenceE + .get(m).locomotor.text + + "
"; + } + } + } + if (skill.springSecurity) { + s += "<%@ taglib prefix=\"sec\"" + + " uri=\"http://www.springframework.org" + + "/security/tags\" %>"; + } + if (skill.tiles) { + producedMaterial = Strings.replaceFirst(producedMaterial, + "+header+", ""); + producedMaterial = Strings.replaceFirst(producedMaterial, + "+footer+", ""); + } + if (jspKit.navigationBar == null || jspKit.navigationBar + .isEmpty()) { + producedMaterial = Strings.replaceFirst(producedMaterial, + "+navigation+", ""); + } else { + producedMaterial = Strings.replaceFirst(producedMaterial, + "+navigation+", navigation); + } + if (!skill.tiles) { + int h = producedMaterial.indexOf("+header+"); + if (h > -1) { + producedMaterial = producedMaterial.substring(0, h) + + header + producedMaterial.substring(h + 8); + } + int f = producedMaterial.indexOf("+footer+"); + if (f > -1) { + producedMaterial = producedMaterial.substring(0, f) + + footer + producedMaterial.substring(f + 8); + } + } + + /* WE COOK EVERYTHING (x2b è il segno +) */ + producedMaterial = Strings.replaceFirst(producedMaterial, + "+language+", buttonsCrud[lJ][0]); + producedMaterial = Strings.replaceFirst(producedMaterial, + "+belong+", b); + producedMaterial = Strings.replaceFirst(producedMaterial, + "+text+", t); + producedMaterial = Strings.replaceFirst(producedMaterial, + "+pragma+", p); + producedMaterial = Strings.replaceFirst(producedMaterial, + "+sec+", s); + producedMaterial = producedMaterial.replaceAll( + "\\x2bcharset\\x2b", skill.charset); + } + + /* written only to comply with the abstract class FileComponent */ + @SuppressWarnings("javadoc") + @Override + final public void directory(HashMap markupE) + + throws ExactException { + + } +} diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/Bootstrap_css.java b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/Bootstrap_css.java new file mode 100644 index 0000000..61027d0 --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/Bootstrap_css.java @@ -0,0 +1,121 @@ +// +// https://www.ramecera.it/myscrewdriver.html +// e-mail: screwdriver@ramecera.it +// +/* This program and the accompanying materials are made available under + * the terms of the Eclipse Public License v1.0 which accompanies this + * distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html */ +package it.ramecera.screwdriver.component; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.HashMap; +import java.util.List; + +import it.ramecera.salad.everyday.Candies; +import it.ramecera.salad.everyday.ExactException; +import it.ramecera.salad.everyday.Strings; +import it.ramecera.salad.file.Equipment; +import it.ramecera.screwdriver.CandyScrew; +import it.ramecera.screwdriver.Markup; +import it.ramecera.screwdriver.Skill; +import it.ramecera.screwdriver.Train; + +/** @author M. Maglioni */ +final public class Bootstrap_css extends FileComponent { + + /** @param skill set of descriptive data of the application + * @param snippetG position of the fragments */ + public Bootstrap_css(Skill skill, String snippetG) { + super(); + this.skill = skill; + this.snippetG = snippetG; + } + + /** @throws ExactException exception specified by a numeric code */ + @Override + public void synthesis(HashMap markupE, + List trainE, CandyScrew candyScrew) + + throws FileNotFoundException, IOException, ExactException { + + String g = skill.candies.snippetsYS + snippetG; + producedMaterial = Equipment.oneString(g) + Candies.LF; + + if (skill.pckg != null) { + producedMaterial = producedMaterial.replaceAll( + "\\x2bzoccolo\\x2b", skill.pckg); + } + if (skill.applicationNameLower != null) { + producedMaterial = Strings.replaceFirst(producedMaterial, + "+titolo+", skill.applicationNameLower); + } + if (markupE.get("indexjsp").recurrenceE.size() > 0 && markupE + .get("indexjsp").recurrenceE.get(0).wagonE.containsKey( + "ooptioncolor")) { + producedMaterial = producedMaterial.replaceAll( + "\\x2booptioncolor\\x2b", markupE.get( + "indexjsp").recurrenceE.get(0).wagonE.get( + "ooptioncolor").text); + producedMaterial = producedMaterial.replaceAll( + "\\x2booptmaincolor\\x2b", markupE.get( + "indexjsp").recurrenceE.get(0).wagonE.get( + "ooptioncolor").text); + + } else { + producedMaterial = producedMaterial.replaceAll( + "\\x2bmozColor1\\x2b", "black"); + } + if (markupE.get("indexjsp").recurrenceE.size() > 0 && markupE + .get("indexjsp").recurrenceE.get(0).wagonE.containsKey( + "ooptionhover")) { + producedMaterial = producedMaterial.replaceAll( + "\\x2booptionhover\\x2b", markupE.get( + "indexjsp").recurrenceE.get(0).wagonE.get( + "ooptionhover").text); + } else { + producedMaterial = producedMaterial.replaceAll( + "\\x2bmozColor1\\x2b", "white"); + } + if (skill.backColorFormAction != null) { + producedMaterial = Strings.replaceFirst(producedMaterial, + "+backformaction+", skill.backColorFormAction); + } + if (markupE.get("indexjsp").recurrenceE.size() > 0 && markupE + .get("indexjsp").recurrenceE.get(0).wagonE.containsKey( + "ooptbackcol1")) { + producedMaterial = producedMaterial.replaceAll( + "\\x2bmozColor1\\x2b", markupE.get( + "indexjsp").recurrenceE.get(0).wagonE.get( + "ooptbackcol1").text); + } else { + producedMaterial = producedMaterial.replaceAll( + "\\x2bmozColor1\\x2b", "black"); + } + if (markupE.get("indexjsp").recurrenceE.size() > 0 && markupE + .get("indexjsp").recurrenceE.get(0).wagonE.containsKey( + "ooptbackcol2")) { + producedMaterial = producedMaterial.replaceAll( + "\\x2bmozColor2\\x2b", markupE.get( + "indexjsp").recurrenceE.get(0).wagonE.get( + "ooptbackcol2").text); + } else { + producedMaterial = producedMaterial.replaceAll( + "\\x2bmozColor1\\x2b", "white"); + } + } + + /* written only to comply with the abstract class FileComponent */ + @SuppressWarnings("javadoc") + @Override + /** @param markupE the list of markups + * @param skill together with the characteristics of the application + * @param trash file where the deleted files are moved + * @throws ExactException exception specified by a numeric code */ + public void directory(HashMap markupE) + + throws ExactException { + + } +} diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/ControllerBelong_java.java b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/ControllerBelong_java.java new file mode 100644 index 0000000..fb97d42 --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/ControllerBelong_java.java @@ -0,0 +1,741 @@ +// +// https://www.ramecera.it/myscrewdriver.html +// e-mail: screwdriver@ramecera.it +// +/* This program and the accompanying materials are made available under + * the terms of the Eclipse Public License v1.0 which accompanies this + * distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html */ +package it.ramecera.screwdriver.component; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.HashMap; +import java.util.List; + +import org.apache.log4j.Logger; + +import it.ramecera.salad.everyday.Candies; +import it.ramecera.salad.everyday.ExactException; +import it.ramecera.salad.everyday.Mix; +import it.ramecera.salad.everyday.Strings; +import it.ramecera.salad.file.Equipment; +import it.ramecera.screwdriver.CandyScrew; +import it.ramecera.screwdriver.Cst; +import it.ramecera.screwdriver.Markup; +import it.ramecera.screwdriver.Skill; +import it.ramecera.screwdriver.Train; +import it.ramecera.screwdriver.Wagon; +import it.ramecera.screwdriver.outfits.JspBeanElement; +import it.ramecera.screwdriver.outfits.JspKit; +import it.ramecera.screwdriver.outfits.RequestMap; +import it.ramecera.screwdriver.outfits.TableOutfit; + +/** + *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-09-03
+ * Company: Rameceraâ„¢
+ *

+ * + *

+ * Description: + *

+ *

+ * History: 2020-08-03 implementation of N13 (see + * martoraProject.ods)
+ * 2020-09-03 implementation of N3 (see martoraProject.ods) + *

+ * + * @author Massimo Maglioni */ +final public class ControllerBelong_java extends FileComponent { + + /* stored materials */ + private String impForm = ""; + private String s = ""; + private String aws = ""; + + /** ordinary logger */ + @SuppressWarnings("unused") + private static final Logger logger = Logger.getLogger( + ControllerBelong_java.class); + + /** @param skill together with the descriptive data of the + * @param snippetG application */ + public ControllerBelong_java(Skill skill, String snippetG) { + super(); + this.skill = skill; + this.snippetG = snippetG; + } + + /** @throws ExactException exception specified by a numeric code */ + @Override + public void synthesis(HashMap markupE, + List trainE, CandyScrew candyScrew) + + throws FileNotFoundException, IOException, ExactException { + + String plainControllerG = skill.candies.snippetsYS + snippetG; + producedMaterial = Equipment.oneString(plainControllerG) + + Candies.LF; + producedMaterial += "import org.springframework.web.servlet.ModelAndView;" + + Candies.LF; + producedMaterial += "import java.util.Map;" + Candies.LF; + producedMaterial += "import java.util.List;" + Candies.LF; + producedMaterial += "import java.util.ArrayList;" + Candies.LF; + producedMaterial += "import org.hibernate.HibernateException;" + + Candies.LF; + producedMaterial += "import javax.servlet.http.HttpServletRequest;" + + Candies.LF; + producedMaterial += "+importModel+"; + producedMaterial += "+importForm+"; + producedMaterial += "+importPlain+"; + String impMod = ""; + impMod += "import org.springframework.ui.Model;" + Candies.LF; + impMod += "import org.springframework.web.bind.annotation.ModelAttribute;" + + Candies.LF; + impForm += "import org.springframework.web.bind.annotation" + + ".RequestMethod;" + Candies.LF; + impForm += "import org.springframework.web.servlet.mvc.support" + + ".RedirectAttributes;" + Candies.LF; + impForm += "import org.springframework.dao.DataAccessException;" + + Candies.LF; + impForm += "import org.springframework.validation.BindingResult;" + + Candies.LF; + if (skill.hiberValid | skill.springValid) { // v 1.10.2 + impForm += "import javax.validation.Valid;" + Candies.LF; + } + impForm += Candies.LF; + impForm += "import java.sql.Types;" + Candies.LF; + impForm += "import java.sql.Timestamp;" + Candies.LF; + impForm += "import java.util.Date;" + Candies.LF; + impForm += "import java.text.SimpleDateFormat;" + Candies.LF; + for (Train t : markupE.get("hdefrail").recurrenceE) { + impForm += "import " + skill.networkDomain + ".screwdriver." + + t.wagonE.get("hjndi").text.toLowerCase() + "." + + t.wagonE.get("hdbschema").text + ".*;" + + Candies.LF; + } + producedMaterial += "+importAutowired+"; + String impAuto = ""; + if (skill.hasUseridPassword) { + impAuto += "import " + skill.networkDomain + "." + + skill.applicationNameLower + + ".web.authentication.UserContext;" + Candies.LF; + if (skill.authenticationMode.equals("trivial")) { + impAuto += "import " + skill.networkDomain + "." + + skill.applicationNameLower + + ".web.authentication.KingDao" + ";" + + Candies.LF; + impAuto += "import org.springframework.beans.factory" + + ".annotation.Autowired;" + Candies.LF; + } else { + impAuto += "import " + skill.networkDomain + "." + + skill.applicationNameLower + "." + Cst.RAIL + + skill.tabUser[1] + ".service.I" + Cst.RAILU + + skill.tabUser[1] + skill.tabUser[0] + + "Service" + ";" + Candies.LF; + } + } + String impPlain = ""; + RequestMap zW = null; + /* the 5 elements of the request mapping: z [0] = + * requestMap.map; z [1] = requestMap.pathJsp; z [2] = + * requestMap.jsp; z [3] = requestMap.type; z [4] = + * requestMap.path; */ + /* JSP type: 0 = plain; 1 = form; 2 = model */ + boolean elencoImport = false; + for (int i = 0; i < skill.correlationE.get(skill.cntK).rmE + .size(); i++) { + RequestMap z = skill.correlationE.get(skill.cntK).rmE.get( + i); + if (z.tipo == Cst.MODEL) { + if (markupE.get("xprovider").recurrenceE.get( + 0).locomotor.text.equalsIgnoreCase("ldap") + & !elencoImport) { + producedMaterial += Equipment.oneString( + candyScrew.snippetsYS + + "java/ControllerBelongLDAP.java"); + elencoImport = true; + } + } else if (zW == null || !equivalente(z, zW)) { + String f = Mix.uppercaseFirstChar(z.jsp) + + Cst.TIPO_JSPE[z.tipo]; + producedMaterial += "import +zoccolo+.web.model." + + z.path + "." + f + ";" + Candies.LF; + producedMaterial += "import +zoccolo+.web.model." + + z.path + "." + f + "Impl;" + Candies.LF; + } + zW = z.clone(); + } + if (skill.ldapService) { + producedMaterial += "import org.springframework.security.core." + + "userdetails.UserDetailsService;" + Candies.LF; + producedMaterial += "import org.springframework.beans.factory." + + "annotation.Autowired;" + Candies.LF; + } + if (skill.log4jVers != null) { + producedMaterial += "import org.apache.log4j.Logger;" + + Candies.LF + Candies.LF; + } + + producedMaterial += Candies.LF + "@Controller" + Candies.LF; + producedMaterial += "@RequestMapping(\"/" + skill.correlationE + .get(skill.cntK).gruppo + "\")" + Candies.LF; + producedMaterial += "public class " + skill.groupControllerF + + " {" + Candies.LF + Candies.LF; + producedMaterial += "+autowireds+" + Candies.LF; + if (skill.hasUseridPassword) { + producedMaterial += Candies.TABS + + "private final UserContext userContext;" + + Candies.LF; + if (skill.authenticationMode.equals("trivial")) { + producedMaterial += Candies.TABS + + "private final KingDao holder;" + Candies.LF + + Candies.LF; + } else { + producedMaterial += Candies.TABS + "private final I" + + Cst.RAILU + skill.tabUser[1] + + skill.tabUser[0] + "Service holder;" + + Candies.LF + Candies.LF; + } + } + if (skill.log4jVers != null) { + producedMaterial += Candies.TABS + "/** ordinary logger */" + + Candies.LF; + producedMaterial += Candies.TABS + + "@SuppressWarnings(\"unused\")" + Candies.LF; + producedMaterial += Candies.TABS + + "private static final Logger logger = Logger.getLogger(" + + Candies.LF + Candies.TABS + Candies.TABS + + Candies.TABS + skill.groupControllerF + ".class);" + + Candies.LF + Candies.LF; + } + /* for the next for I first accumulate all the material in s, + * then only at the end I transfer s */ + boolean accountController = false; + boolean autowired = false; + if (skill.hasUseridPassword) { + + // constructor + + s += Candies.TABS + "@Autowired" + Candies.LF; + if (skill.authenticationMode.equals("trivial")) { + s += Candies.TABS + "public " + skill.groupControllerF + + "(UserContext userContext," + Candies.LF + + Candies.TABS + Candies.TABS + + "KingDao holder) {" + Candies.LF; + } else { + s += Candies.TABS + "public " + skill.groupControllerF + + "(UserContext userContext," + Candies.LF + + Candies.TABS + Candies.TABS + "I" + Cst.RAILU + + skill.tabUser[1] + skill.tabUser[0] + + "Service holder) {" + Candies.LF; + } + s += Candies.TABS + Candies.TABS + + "if (userContext == null) {" + Candies.LF; + s += Candies.TABS + Candies.TABS + Candies.TABS + + "throw new IllegalArgumentException(" + Candies.LF + + Candies.TABS + Candies.TABS + Candies.TABS + + Candies.TABS + "\"userContext cannot be null\");" + + Candies.LF; + s += Candies.TABS + Candies.TABS + "}" + Candies.LF; + s += Candies.TABS + Candies.TABS + "if (holder == null) {" + + Candies.LF; + s += Candies.TABS + Candies.TABS + Candies.TABS + + "throw new IllegalArgumentException(" + Candies.LF + + Candies.TABS + Candies.TABS + Candies.TABS + + Candies.TABS + "\"holder cannot be null\");" + + Candies.LF; + s += Candies.TABS + Candies.TABS + "}" + Candies.LF; + + s += Candies.TABS + Candies.TABS + + "this.userContext = userContext;" + Candies.LF; + s += Candies.TABS + Candies.TABS + "this.holder = holder;" + + Candies.LF; + s += Candies.TABS + "}" + Candies.LF; + } + for (int i = 0; i < skill.correlationE.get(skill.cntK).rmE + .size(); i++) { + RequestMap rm = skill.correlationE.get(skill.cntK).rmE.get( + i); + String idJsp = rm.pathJsp + ".jsp"; + int z = 0; + List tE = markupE.get("jsp").recurrenceE; + for (; z < tE.size(); z++) { + if (tE.get(z).locomotor.text.equals(idJsp)) { + break; + } + } + if (z == tE.size()) { + ExactException ne = new ExactException(); + ne.code = 2100; + ne.datum = "I've not fount the JSP " + Mix.dress_A( + idJsp) + "."; + ne.className = this.getClass().getName(); + throw ne; + } + JspKit jspKit = (JspKit) tE.get(z).locomotor.substance; + if (jspKit.crud & impForm.indexOf(".Notice") == -1) { + impForm += "import " + skill.networkDomain + "." + + skill.applicationNameLower + + ".web.model.utility.Notice;" + Candies.LF; + } + s += Candies.LF; + if (rm.tipo == Cst.PLAIN | rm.tipo == Cst.FORM) { + s += Candies.TABS + "@RequestMapping(value = { "; + for (int k = 0; k < rm.map.length; k++) { + s += "\"" + Strings.replaceFirst(rm.map[k], + skill.correlationE.get(skill.cntK).gruppo, + "") + "\", "; + } + /* I remove the last comma-space pair */ + s = s.substring(0, s.length() - 2); + s += " })" + Candies.LF; + s += Candies.TABS + "public ModelAndView " + + skill.correlationE.get(skill.cntK).gruppoMinus + + "_" + i + "(Map model," + + Candies.LF + Candies.TABS + Candies.TABS + + Candies.TABS + "HttpServletRequest request) {" + + Candies.LF + Candies.LF; + s += Candies.TABS + Candies.TABS + rm.jspU + + Cst.JU[rm.tipo] + " " + rm.jsp + + Cst.JU[rm.tipo] + " = new " + rm.jspU + + Cst.JU[rm.tipo] + "Impl();" + Candies.LF; + if (rm.tipo == Cst.FORM) { + s += Candies.TABS + Candies.TABS + "model.put(\"" + + rm.jsp + Cst.JU[rm.tipo] + "\", " + rm.jsp + + Cst.JU[rm.tipo] + ");" + Candies.LF; + /* list-boxes process */ + for (int k = 0; k < jspKit.controlE.size(); k++) { + JspBeanElement jbe = jspKit.controlE.get(k); + /* I reject the others */ + if (!jbe.controlType.equals(Cst.LIST_BOX)) { + continue; + } + if (jbe.dao != null & jbe.hsqln != null) { + tableReading(jbe, rm); + } else if (jbe.ftokens != null) { + tokensReading(jbe, rm); + } + } + } + for (Wagon metodo : jspKit.methodE) { + s += Candies.TABS + Candies.TABS + rm.jsp + + Cst.JU[rm.tipo] + "." + metodo.text + + "(request"; + if (!skill.methodE.get(metodo.text).lowerArguments + .isEmpty()) { + s += ", " + skill.methodE.get( + metodo.text).lowerArguments; + } + for (int cJ = 0; cJ < skill.methodE.get( + metodo.text).classE.size(); cJ++) { + s += ", other" + cJ; + } + s += ");" + Candies.LF; + for (TableOutfit tab : skill.methodE.get( + metodo.text).tableE) { + String interfaccia = "private I" + + tab.railUppercase + tab.entityNameU + + "Dao" + " " + tab.railLowercase + + tab.entityName + "Dao;"; + /* I have to avoid repetition */ + if (aws.indexOf(interfaccia) == -1) { + aws += Candies.TABS + "@Autowired" + + Candies.LF; + aws += Candies.TABS + interfaccia + + Candies.LF; + } + } + } + if (!aws.isEmpty() & !autowired) { + for (Train train : markupE.get( + "hdefrail").recurrenceE) { + impAuto += "import " + skill.networkDomain + "." + + skill.applicationNameLower + "." + + Cst.RAIL + train.locomotor.text + + ".dao.*;" + Candies.LF; + } + if (impAuto.indexOf(".Autowired;") == -1) { + impAuto += "import org.springframework.beans." + + "factory.annotation.Autowired;" + + Candies.LF; + } + autowired = true; + } + s += Candies.TABS + Candies.TABS + + "return new ModelAndView(\"" + rm.pathJsp + + "\", \"belong\"," + Candies.LF + Candies.TABS + + Candies.TABS + rm.jsp + Cst.JU[rm.tipo] + ");" + + Candies.LF; + } else { // type model + if (skill.ldapService & !accountController) { + if (skill.ldapService) { + s += Candies.TABS + + "private final UserDetailsService" + + " userDetailsService;" + Candies.LF; + } + s += Candies.TABS + "@Autowired" + Candies.LF; + s += Candies.TABS + "public " + + skill.groupControllerF + + "(UserDetailsService" + + " userDetailsService) {" + Candies.LF; + s += Candies.TABS + Candies.TABS + + "if (userDetailsService == null) {" + + Candies.LF; + s += Candies.TABS + + "throw new IllegalArgumentException(" + + "\"userDetailsService cannot be null\");" + + Candies.LF; + s += Candies.TABS + Candies.TABS + "}" + Candies.LF; + s += Candies.TABS + Candies.TABS + + "this.userDetailsService = userDetailsService;" + + Candies.LF; + s += Candies.TABS + "}" + Candies.LF; + accountController = true; + } + s += Candies.TABS + "@RequestMapping(value = { "; + for (int k = 0; k < rm.map.length; k++) { + s += "\"" + Strings.replaceFirst(rm.map[k], + skill.correlationE.get(skill.cntK).gruppo, + " ") + "\", "; + } + /* I remove the last comma-space pair */ + s = s.substring(0, s.length() - 2); + s += " })" + Candies.LF; + s += Candies.TABS + "public String view_" + i + + "(Model model) {" + Candies.LF + Candies.LF; + if (skill.ldapService) { + s += Equipment.oneString(candyScrew.snippetsYS + + "java/ldapAuthenticationModelService.java"); + } else { + s += Equipment.oneString(candyScrew.snippetsYS + + "java/ldapAuthenticationModel.java"); + } + s += Candies.TABS + Candies.TABS + "return \"" + + rm.pathJsp + "\";" + Candies.LF; + // producedMaterial = Strings.replaceFirst( + // producedMaterial, "+importModel+", impMod); + } + s += Candies.TABS + "}" + Candies.LF; + if (rm.tipo == Cst.FORM & jspKit.crud) { + // producedMaterial = Strings.replaceFirst( + // producedMaterial, "+importForm+", impForm); + for (int crudJ = 0; crudJ < 4; crudJ++) { + s += Candies.LF + Candies.TABS + + "@RequestMapping(value = \"/screw" + + rm.jsp + Candies.CRUD[crudJ] + + "\", method = RequestMethod.POST)" + + Candies.LF; + s += Candies.TABS + "public ModelAndView compile" + + rm.jsp + Candies.CRUD[crudJ] + "("; + if (skill.hiberValid | skill.springValid) { + s += "@ModelAttribute(\"" + rm.jsp + + Cst.JU[rm.tipo] + "\") "; + s += "@Valid "; // v 1.10.2 + } + s += rm.jspU + Cst.JU[rm.tipo] + "Impl " + rm.jsp + + Cst.JU[rm.tipo] + "," + Candies.LF; + s += Candies.TABS + Candies.TABS + + "BindingResult result," + Candies.LF; + s += Candies.TABS + Candies.TABS + + "RedirectAttributes redirectAttributes) {" + + Candies.LF; + if (skill.hiberValid | skill.springValid) { + s += Candies.TABS + Candies.TABS + + "if (result.hasErrors()) {" + + Candies.LF; + s += Candies.TABS + Candies.TABS + Candies.TABS + + "return new ModelAndView(\"" + + rm.pathJsp + "\", \"belong\"," + + Candies.LF + Candies.TABS + + Candies.TABS + rm.jsp + + Cst.JU[rm.tipo] + ");" + Candies.LF; + s += Candies.TABS + Candies.TABS + "}" + + Candies.LF; + } + + for (int j = 0; j < jspKit.controlE.size(); j++) { + JspBeanElement jbe = jspKit.controlE.get(j); + /* I reject the others */ + if (!jbe.controlType.equals(Cst.LIST_BOX)) { + continue; + } + if (crudJ == 1 & jbe.dao != null + & jbe.hsqln != null) { + tableReading(jbe, rm); + } else if (crudJ == 1 & jbe.ftokens != null) { + tokensReading(jbe, rm); + } + } + + s += Candies.TABS + Candies.TABS + + "/* here you can use " + rm.jsp + + Cst.JU[rm.tipo] + " */" + Candies.LF; + for (int j = 0; j < jspKit.controlE.size(); j++) { + JspBeanElement jbe = jspKit.controlE.get(j); + if (!jbe.controlType.equals(Cst.CHECK_BOX)) { + continue; + } + s += Candies.TABS + Candies.TABS + + "redirectAttributes.addAttribute(\"" + + jbe.name + "\", " + rm.jsp + "" + + Cst.JU[rm.tipo] + ".is" + jbe.nameU + + "());" + Candies.LF; + } + for (int j = 0; j < jspKit.controlE.size(); j++) { + JspBeanElement jbe = jspKit.controlE.get(j); + if (!jbe.controlType.equals(Cst.TEXT_AREA)) { + continue; + } + s += Candies.TABS + Candies.TABS + + "redirectAttributes.addAttribute(\"" + + jspKit.controlE.get(j).name + "\", " + + rm.jsp + "" + Cst.JU[rm.tipo] + ".get" + + jbe.nameU + "());" + Candies.LF; + + } + for (int j = 0; j < jspKit.controlE.size(); j++) { + JspBeanElement jbe = jspKit.controlE.get(j); + if (!jbe.controlType.equals(Cst.LIST_BOX)) { + continue; + } + s += Candies.TABS + Candies.TABS + + "redirectAttributes.addAttribute(\"" + + jspKit.controlE.get(j).name + "\", " + + rm.jsp + "" + Cst.JU[rm.tipo] + + ".getArr_" + jspKit.controlE.get( + j).name + "());" + Candies.LF; + } + for (int j = 0; j < jspKit.controlE.size(); j++) { + JspBeanElement jbe = jspKit.controlE.get(j); + if (!jbe.controlType.equals(Cst.TEXT_BOX)) { + continue; + } + s += Candies.TABS + Candies.TABS + + "redirectAttributes.addAttribute(\"" + + jspKit.controlE.get(j).name + "\", " + + rm.jsp + "" + Cst.JU[rm.tipo] + ".get" + + jspKit.controlE.get(j).nameU + "());" + + Candies.LF; + + } + s += Candies.TABS + Candies.TABS + "return screw" + + rm.jsp + Candies.CRUD[crudJ] + "(" + + rm.jsp + "Form);" + Candies.LF; + s += Candies.TABS + "}" + Candies.LF; + } + File crudMethods = new File(skill.candies.snippetsYS + + "java/Crud.java"); + String cr = Equipment.oneStringUnicode_A(crudMethods, + "UTF-8"); + cr = cr.replaceAll("\\x2bjsp\\x2b", rm.jsp); + cr = cr.replaceAll("\\x2bJsp\\x2b", rm.jspU); + cr = cr.replaceAll("\\x2bscrewModel\\x2b", rm.pathJsp); + s += cr; + } else if (rm.tipo == Cst.FORM) { // &!jspKit.crud + // producedMaterial = Strings.replaceFirst( + // producedMaterial, "+importForm+", impForm); + s += Candies.LF + Candies.TABS + + "@RequestMapping(value = \"/screw" + rm.jsp + + "\", method = RequestMethod.POST)" + + Candies.LF; + s += Candies.TABS + "public String compile" + rm.jsp + + "("; + if (skill.hiberValid | skill.springValid) { + s += "@ModelAttribute(\"" + rm.jsp + Cst.JU[rm.tipo] + + "\") "; + s += "@Valid "; // / v 1.10.2 + } + s += rm.jspU + Cst.JU[rm.tipo] + "Impl " + rm.jsp + + Cst.JU[rm.tipo] + "," + Candies.LF; + s += Candies.TABS + Candies.TABS + + "BindingResult result," + Candies.LF; + s += Candies.TABS + Candies.TABS + + "RedirectAttributes redirectAttributes) {" + + Candies.LF; + s += Candies.TABS + Candies.TABS + + "/* here you can use " + rm.jsp + + Cst.JU[rm.tipo] + " */" + Candies.LF; + if (skill.hiberValid | skill.springValid) { + s += Candies.TABS + Candies.TABS + + "if (result.hasErrors()) {" + Candies.LF; + s += Candies.TABS + Candies.TABS + Candies.TABS + + "return \"redirect:/" + rm.pathRedirect + + "\";" + Candies.LF; + s += Candies.TABS + Candies.TABS + "}" + Candies.LF; + } + for (int j = 0; j < jspKit.controlE.size(); j++) { + JspBeanElement jbe = jspKit.controlE.get(j); + if (!jbe.controlType.equals(Cst.CHECK_BOX)) { + continue; + } + s += Candies.TABS + Candies.TABS + + "redirectAttributes.addAttribute(\"" + + jbe.name + "\", " + rm.jsp + "" + + Cst.JU[rm.tipo] + ".is" + jbe.nameU + + "());" + Candies.LF; + + } + for (int j = 0; j < jspKit.controlE.size(); j++) { + JspBeanElement jbe = jspKit.controlE.get(j); + if (!jbe.controlType.equals(Cst.TEXT_AREA)) { + continue; + } + s += Candies.TABS + Candies.TABS + + "redirectAttributes.addAttribute(\"" + + jbe.name + "\", " + rm.jsp + "" + + Cst.JU[rm.tipo] + ".get" + jbe.nameU + + "());" + Candies.LF; + + } + for (int j = 0; j < jspKit.controlE.size(); j++) { + JspBeanElement jbe = jspKit.controlE.get(j); + if (!jbe.controlType.equals(Cst.LIST_BOX)) { + continue; + } + // s += Candies.TABS + Candies.TABS + // + "redirectAttributes.addAttribute(\"" + // + jbe.name + "\", " + rm.jsp + "" + // + Cst.JU[rm.tipo] + ".get" + jbe.nameU + // + "());" + Candies.LF; + s += Candies.TABS + Candies.TABS + + "redirectAttributes.addAttribute(\"" + + jspKit.controlE.get(j).name + "\", " + + rm.jsp + "" + Cst.JU[rm.tipo] + ".getArr_" + + jspKit.controlE.get(j).name + "());" + + Candies.LF; + } + for (int j = 0; j < jspKit.controlE.size(); j++) { + JspBeanElement jbe = jspKit.controlE.get(j); + if (!jbe.controlType.equals(Cst.TEXT_BOX)) { + continue; + } + s += Candies.TABS + Candies.TABS + + "redirectAttributes.addAttribute(\"" + + jbe.name + "\", " + rm.jsp + "" + + Cst.JU[rm.tipo] + ".get" + jbe.nameU + + "());" + Candies.LF; + } + s += Candies.TABS + Candies.TABS + "return \"redirect:/" + + rm.pathRedirect + "\";" + Candies.LF; + s += Candies.TABS + "}" + Candies.LF; + } else if (rm.tipo == Cst.PLAIN) { + // producedMaterial = Strings.replaceFirst( + // producedMaterial, "+importPlain+", impPlain); + } + } + producedMaterial += s; + producedMaterial += Candies.TABS + "/* " + Cst.KNIFE + " */" + + Candies.LF; + producedMaterial += "}" + Candies.LF; + /* WE COOK EVERYTHING */ + producedMaterial = Strings.replaceFirst(producedMaterial, + "+importModel+", impMod); + producedMaterial = Strings.replaceFirst(producedMaterial, + "+importForm+", impForm); + producedMaterial = Strings.replaceFirst(producedMaterial, + "+importPlain+", impPlain); + producedMaterial = producedMaterial.replaceAll( + "\\x2bzoccolo\\x2b", skill.pckg); + producedMaterial = Strings.replaceFirst(producedMaterial, + "+autowireds+", aws); + producedMaterial = Strings.replaceFirst(producedMaterial, + "+importAutowired+", impAuto); + } + + private void tableReading(JspBeanElement jbe, RequestMap rm) { + /* now I distinguish between a select with a single column + * (evaluation = 1) and select with multiple columns (evaluation + * = 2) */ + String interfaccia0 = ((String[][]) (jbe.dao.substance))[1][0]; + // impForm += "import org.hibernate.HibernateException;" + // + Candies.LF; + if (jbe.hsqln.valutazioneColonne == 1) { + /* one column case */ + s += Candies.TABS + Candies.TABS + "List " + + jbe.name + "E = null;" + Candies.LF; + s += Candies.TABS + Candies.TABS + "try {" + Candies.LF; + s += Candies.TABS + Candies.TABS + Candies.TABS + jbe.name + + "E = " + interfaccia0 + ".oneColumnQuery(\"" + + jbe.hsqln.text + "\");" + Candies.LF; + } else { + /* case many columns */ + s += Candies.TABS + Candies.TABS + "List " + + jbe.name + "E = null;" + Candies.LF; + s += Candies.TABS + Candies.TABS + "try {" + Candies.LF; + s += Candies.TABS + Candies.TABS + Candies.TABS + jbe.name + + "E = " + interfaccia0 + ".manyColumnQuery(\"" + + jbe.hsqln.text + "\");" + Candies.LF; + } + String interfaccia1 = "private " + interfaccia0.replaceFirst( + Cst.RAIL, Cst.IRAILU) + " " + Mix.lowercaseFirstChar( + interfaccia0) + ";"; + /* I have to avoid repetition */ + if (aws.indexOf(interfaccia1) == -1) { + aws += Candies.TABS + "@Autowired" + Candies.LF; + aws += Candies.TABS + interfaccia1 + Candies.LF; + } + s += Candies.TABS + Candies.TABS + + "} catch (HibernateException e) {" + Candies.LF; + s += Candies.TABS + Candies.TABS + Candies.TABS + + "e.printStackTrace();" + Candies.LF; + s += Candies.TABS + Candies.TABS + "} catch (Exception e) {" + + Candies.LF; + s += Candies.TABS + Candies.TABS + Candies.TABS + + "e.printStackTrace();" + Candies.LF; + s += Candies.TABS + Candies.TABS + "}" + Candies.LF; + s += Candies.TABS + Candies.TABS + rm.jsp + Cst.JU[rm.tipo] + + ".setArr_" + jbe.name + "(" + jbe.name + "E);" + + Candies.LF; + } + + private void tokensReading(JspBeanElement jbe, RequestMap rm) { + s += Candies.TABS + Candies.TABS + "List " + jbe.name + + "E = null;" + Candies.LF; + s += Candies.TABS + Candies.TABS + + "List tE = new ArrayList();" + + Candies.LF; + String[][] wE = (String[][]) (jbe.ftokens.substance); + for (int tK = 0; tK < wE[0].length; tK++) { + s += Candies.TABS + Candies.TABS + "tE.add(\"" + wE[0][tK] + + "\");" + Candies.LF; + } + s += Candies.TABS + Candies.TABS + "try {" + Candies.LF; + s += Candies.TABS + Candies.TABS + Candies.TABS + jbe.name + + "E = tE;" + Candies.LF; + s += Candies.TABS + Candies.TABS + "} catch (Exception e) {" + + Candies.LF; + s += Candies.TABS + Candies.TABS + Candies.TABS + + "e.printStackTrace();" + Candies.LF; + s += Candies.TABS + Candies.TABS + "}" + Candies.LF; + s += Candies.TABS + Candies.TABS + rm.jsp + Cst.JU[rm.tipo] + + ".setArr_" + jbe.name + "(" + jbe.name + "E);" + + Candies.LF; + } + + /* written only to comply with the abstract class FileComponent */ + @SuppressWarnings("javadoc") + @Override + /** @param markupE the list of markups + * @throws ExactException exception specified by a numeric code */ + public void directory(HashMap markupE) + + throws ExactException { + + skill.javaWebController = skill.javaWebY + "/controller"; + skill.buildDirectory(skill.javaWebController); + + } + + private boolean equivalente(RequestMap rm, RequestMap rmW) { + if (rm == null | rmW == null) { + return false; + } else { + return rm.path.equals(rmW.path) & rm.jsp.equals(rmW.jsp) + & rm.tipo == rmW.tipo; + } + } +} \ No newline at end of file diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/Dispatcher_xml.java b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/Dispatcher_xml.java new file mode 100644 index 0000000..08fcecf --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/Dispatcher_xml.java @@ -0,0 +1,365 @@ +// +// https://www.ramecera.it/myscrewdriver.html +// e-mail: screwdriver@ramecera.it +// +/* This program and the accompanying materials are made available under + * the terms of the Eclipse Public License v1.0 which accompanies this + * distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html */ +package it.ramecera.screwdriver.component; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.HashMap; +import java.util.List; + +import it.ramecera.salad.everyday.Candies; +import it.ramecera.salad.everyday.ExactException; +import it.ramecera.salad.everyday.Mix; +import it.ramecera.salad.everyday.Strings; +import it.ramecera.salad.everyday.Universal; +import it.ramecera.salad.file.Abacus; +import it.ramecera.salad.file.Equipment; +import it.ramecera.screwdriver.CandyScrew; +import it.ramecera.screwdriver.Markup; +import it.ramecera.screwdriver.Skill; +import it.ramecera.screwdriver.Train; + +/** + *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-06-20
+ * Company: Rameceraâ„¢ + *

+ * + * @author Massimo Maglioni + *

+ * Description: + *

+ */ +final public class Dispatcher_xml extends FileComponent { + + /** @param skill together with the descriptive data of the + * @param snippetG application */ + public Dispatcher_xml(Skill skill, String snippetG) { + super(); + this.skill = skill; + this.snippetG = snippetG; + } + + /** @throws ExactException exception specified by a numeric code */ + @Override + final public void synthesis(HashMap markupE, + List trainE, CandyScrew candyScrew) + + throws FileNotFoundException, IOException, ExactException { + + String dispatcherG = skill.candies.snippetsYS + snippetG; + producedMaterial = Equipment.oneString(dispatcherG) + + Candies.LF; + String xmlns_altri = ""; + String sdefauto = ""; + String location_altri = ""; + if (skill.defaultAutowire) { + sdefauto += "default-autowire = \"" + markupE.get( + "sdefauto").recurrenceE.get(0).locomotor.text + + "\""; + } + if (skill.springSecurity) { + xmlns_altri += Candies.LF + Candies.TABS + + "xmlns:s=\"http://www.springframework.org/schema/security\""; + location_altri += Candies.LF + Candies.TABS + Candies.TABS + + Candies.TABS + + "http://www.springframework.org/schema/security"; + location_altri += Candies.LF + Candies.TABS + Candies.TABS + + Candies.TABS + + "http://www.springframework.org/schema/secu" + + "rity/spring-security-" + + skill.springSecurityReductVersion + ".xsd"; + } + if (skill.webFlow) { + xmlns_altri += Candies.LF + Candies.TABS + + "xmlns:webflow-config=\"http://www.spring" + + "framework.org/schema/webflow-config\""; + location_altri += Candies.LF + Candies.TABS + Candies.TABS + + Candies.TABS + "http://www.springframe" + + "work.org/schema/webflow-config"; + location_altri += Candies.LF + Candies.TABS + Candies.TABS + + Candies.TABS + + "http://www.springframework.org/schema/web" + + "flow-config/spring-webflow-config-2.3.xsd"; + } + location_altri += Candies.LF + Candies.TABS + Candies.TABS + + Candies.TABS + + "http://www.springframework.org/schema/jdbc"; + location_altri += Candies.LF + Candies.TABS + Candies.TABS + + Candies.TABS + + "http://www.springframework.org/schema/jdbc/spring-jdbc-3.1.xsd"; + producedMaterial += Candies.TABS + "" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + + "" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "" + Candies.LF; + } + producedMaterial += Candies.TABS + "" + + Candies.LF; + producedMaterial += Candies.TABS + + "" + Candies.LF; + producedMaterial += Candies.TABS + + "" + + Candies.LF; + if (skill.springSecurity) { + producedMaterial += Candies.TABS + + "" + Candies.LF; + } + producedMaterial += Candies.LF; + /* RESOURCES */ + for (int i = 0; i < markupE.get("sreso").recurrenceE + .size(); i++) { + String risorsa = markupE.get("sreso").recurrenceE.get( + i).locomotor.text; + if (i == 0 & risorsa.length() == 0) { + producedMaterial += Candies.TABS + + "" + Candies.LF; + if (markupE.get("sreso").recurrenceE.size() > 1) { + ExactException ce = new ExactException( + "The \"sreso+\" markup without data is incompatible with other sreso+.", + 1000, this.getClass().getName(), ""); + throw ce; + } + } else if (i > 0 & risorsa.length() == 0) { + ExactException ce = new ExactException( + "The \"sreso+\" markup without data is incompatible with other sreso+.", + 1001, this.getClass().getName(), ""); + throw ce; + } else { + producedMaterial += Candies.TABS + + "" + Candies.LF + Candies.LF; + skill.buildDirectory(skill.webAppResourcesY + "/" + + risorsa); + } + } + producedMaterial += Candies.TABS + + "" + Candies.LF + + Candies.LF; + if (skill.robots) { + producedMaterial += Candies.TABS + + "" + + Candies.LF; + File robots = new File(skill.candies.snippetsYS + + "robots.txt"); + if (!robots.exists() | !robots.isFile()) { + ExactException ce = new ExactException( + "Among the snippets the file " + + "«robots.txt» does not exist.", 1002, + this.getClass().getName(), ""); + throw ce; + } else { + Abacus.copyFile(robots, new File(skill.webAppG + "/" + + "robots.txt")); + } + } + /* INTERCEPTOR */ + String newInterceptor = skill.javaWebY + "/interceptor"; + File screwInterceptor = null; + if (skill.interceptor) { + skill.buildDirectory(newInterceptor); + producedMaterial += Candies.LF + Candies.TABS + + ""; + screwInterceptor = new File(skill.candies.snippetsYS + + "java/ScrewInterceptor.java"); + if (!screwInterceptor.exists() | !screwInterceptor + .isFile()) { + ExactException ce = new ExactException( + "Among the snippets the file " + + "«ScrewInterceptor.java» does not exist.", + 1003, this.getClass().getName(), ""); + throw ce; + } + } + for (int i = 0; i < markupE.get("sinterce").recurrenceE + .size(); i++) { + String nomeFile = Mix.uppercaseFirstChar(markupE.get( + "sinterce").recurrenceE.get(i).locomotor.text); + FileComponent.addClass("ScrewInterceptor.java", + newInterceptor, nomeFile, skill.candies, + recycleBinY, skill, -1, markupE, "java"); + producedMaterial += Candies.LF + Candies.TABS + Candies.TABS + + ""; + } + if (skill.interceptor) { + if (skill.i18n) { + producedMaterial += Candies.LF + Candies.TABS + + Candies.TABS + + ""; + producedMaterial += Candies.LF + Candies.TABS + + Candies.TABS + Candies.TABS + + ""; + producedMaterial += Candies.LF + Candies.TABS + + Candies.TABS + "" + Candies.LF; + } + producedMaterial += Candies.LF + Candies.TABS + + "" + Candies.LF + Candies.LF; + } + if (skill.viewController) { + producedMaterial += Candies.LF; + for (int i = 0; i < markupE.get("sieco").recurrenceE + .size(); i++) { + String[] s = (String[]) markupE.get("sieco").recurrenceE + .get(i).locomotor.substance; + producedMaterial += Candies.TABS + + "" + Candies.LF + Candies.LF; + } + } + if (skill.tiles) { + String[] qualificatoreE = skill.tilesVersion.split("\\x2e"); + String g = skill.candies.snippetsYS + + "corpoDispatcherTiles_" + qualificatoreE[0] + + ".txt"; + producedMaterial += Equipment.oneString(g) + Candies.LF; + } else { + String g = skill.candies.snippetsYS + "ViewResolver.txt"; + producedMaterial += Equipment.oneString(g) + Candies.LF; + } + if (skill.i18n) { + producedMaterial += Candies.LF + Candies.TABS + + ""; + producedMaterial += Candies.LF + Candies.TABS + Candies.TABS + + ""; + producedMaterial += Candies.LF + Candies.TABS + "" + + Candies.LF + Candies.LF; + } + if (skill.springValid | skill.hiberValid) { + producedMaterial += Candies.TABS + "" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "" + Candies.LF; + producedMaterial += Candies.TABS + "" + Candies.LF; + producedMaterial += Candies.TABS + + "" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "" + + Candies.LF; + producedMaterial += Candies.TABS + "" + Candies.LF; + } + if (skill.prettyPrint) { + String g = skill.candies.snippetsYS + "jacksonView.txt"; + producedMaterial += Equipment.oneString(g) + Candies.LF + + Candies.LF; + } + /* FUTURE RELEASE N6 */ + // if (skill.embedded) { + // embeddedMaker(); + // } + producedMaterial += "" + Candies.LF; + /* WE COOK EVERYTHING */ + producedMaterial = Strings.replaceFirst(producedMaterial, + "+xmlns_altri+", xmlns_altri); + producedMaterial = Strings.replaceFirst(producedMaterial, + "+default-autowire+", sdefauto); + producedMaterial = Strings.replaceFirst(producedMaterial, + "+location_altri+", location_altri); + producedMaterial = producedMaterial.replaceAll( + "\\x2bzoccolo\\x2b", skill.pckg); + producedMaterial += ""; + } + + /* FUTURE RELEASE N6 */ + // final private void embeddedMaker() + // + // throws ExactException { + // + // Iterator iterator = skill.dbmsE.iterator(); + // while (iterator.hasNext()) { + // producedMaterial += Candies.TABS + // + "" + Candies.LF; + // if (skill.ddl != null) { + // for (int i = 0; i < skill.ddl.length; i++) { + // producedMaterial += Candies.TABS + Candies.TABS + // + "" + Candies.LF; + // Equipment.scriviFileVuoto(skill.mainResources + // + "/database/" + Mix.lowercaseInitial( + // (String) (iterator.next())) + "/" + // + skill.ddl[i] + ".sql"); + // } + // } + // } + // producedMaterial += Candies.TABS + "" + // + Candies.LF; + // producedMaterial += Candies.TABS + // + "" + Candies.LF; + // producedMaterial += Candies.TABS + "" + Candies.LF; + // } + + /* written only to comply with the abstract class FileComponent */ + @SuppressWarnings("javadoc") + @Override + /** @param markupE the list of markups + * @param skill together with the characteristics of the application + * @param trash file where the deleted files are moved + * @throws ExactException exception specified by a numeric code */ + public void directory(HashMap markupE) + + throws ExactException { + + } +} diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/FileComponent.java b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/FileComponent.java new file mode 100644 index 0000000..8ee82f6 --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/FileComponent.java @@ -0,0 +1,406 @@ +// +// https://www.ramecera.it/myscrewdriver.html +// e-mail: screwdriver@ramecera.it +// +/* This program and the accompanying materials are made available under + * the terms of the Eclipse Public License v1.0 which accompanies this + * distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html */ +package it.ramecera.screwdriver.component; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.HashMap; +import java.util.List; + +import it.ramecera.salad.analysis.Flute; +import it.ramecera.salad.analysis.JavaAnnotation; +import it.ramecera.salad.analysis.JavaProperty; +import it.ramecera.salad.everyday.Candies; +import it.ramecera.salad.everyday.ExactException; +import it.ramecera.salad.everyday.Mix; +import it.ramecera.salad.everyday.Strings; +import it.ramecera.salad.file.Equipment; +import it.ramecera.screwdriver.CandyScrew; +import it.ramecera.screwdriver.Cst; +import it.ramecera.screwdriver.Markup; +import it.ramecera.screwdriver.Skill; +import it.ramecera.screwdriver.Train; +import it.ramecera.screwdriver.outfits.JspKit; +import it.ramecera.screwdriver.outfits.MenuKit; +import it.ramecera.screwdriver.outfits.TableOutfit; + +/** + *

+ * Application to automatically generate files that make up an + * application. + *

+ * + * @author M. Maglioni + *

+ * ​​Company: Ramecera™
+ * Creation date: 2020-04-09
+ * Last updated: 2020-09-09
+ *

+ *

+ * History:
+ * The description of N# is in project plan report.
+ * 2020-09-03 implementation of N3
+ * 2020-09-09 implementation of N8
+ *

+ */ +public abstract class FileComponent { + + // PROTECTED + + /** the main features of the application */ + protected Skill skill; + /** the properties of the job */ + protected CandyScrew candies; + /** directory with recycle bin function */ + protected String recycleBinY; + + protected final static String SERVER_HOME = "${jboss.server.home.url}"; + + // PUBLIC + + /** the content of the file to be built */ + public String producedMaterial = ""; + /** the snippet to be copied, path and file name */ + public String snippetG; + /** Jsp kit of JSP features */ + public JspKit jspKit = new JspKit(); + /** Jsp kit of JSP features */ + public MenuKit menuKit = new MenuKit(); + + /** name of the Quartz configuration file */ + public static final String QUARTZ_JOB_XML_F = "quartz-job.xml"; + + // PRIVATE + // + // private static final String sep = System.getProperty( + // "file.separator"); + // /** ordinary logger */ + // private static final Logger logger = Logger.getLogger( + // FileComponent.class); + + /** + *

+ * Class for producing the component file. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09
+ *

+ * + * @param markupE the list of markups + * @param trainE the train list + * @param candyScrew list of application properties + * @throws IOException ordinary exception + * @throws FileNotFoundException ordinary exception + * @throws ExactException ordinary exception + * @throws ExactException standard exception */ + public abstract void synthesis(HashMap markupE, + List trainE, CandyScrew candyScrew) + + throws FileNotFoundException, IOException, ExactException, + ExactException; + + /** @param markupE the list of markups + * @throws ExactException exception specified by a numeric code */ + abstract public void directory(HashMap markupE) + + throws ExactException; + + /** + *

+ * Class for writing the component file. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09
+ *

+ * + * @param y output directory + * @param nomeFileOutput output file + * @param filenameInput input file name + * @param type the extension of the output file; only java, + * properties, xml and jsp are allowed + * @param candies the set of properties external to the application + * @param recycleBinY recycle bin directory + * @throws ExactException specified by a numeric code + * @throws IOException ordinary exception + * @throws FileNotFoundException ordinary exception */ + public void write(final String y, final String nomeFileOutput, + final String filenameInput, final String type, + CandyScrew candies, final String recycleBinY) + + throws ExactException, FileNotFoundException, IOException { + skill.toTarget(y, nomeFileOutput, producedMaterial, + filenameInput, recycleBinY, type); + } + + /** + *

+ * Class for deleting the component file. Return false if the file + * does not exist or cannot be moved. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09
+ *

+ * + * @param y directory of the file to be deleted + * @param f file from delete + * @param trash directory where you put the deleted files + * @param skill TODO + * @return if the operation was successful */ + public static boolean deleteComponent(final String y, + final String f, File trash, Skill skill) { + File x = new File(Mix.dress_C(y) + f); + if (!x.exists()) { + return false; + } + skill.buildDirectory(trash); + File destinazione = new File(trash.getPath() + "/" + f); + destinazione.delete(); + return x.renameTo(destinazione); + } + + /** + *

+ * Overload of the previous method. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09
+ *

+ * + * @param y directory of the file to be deleted + * @param f file from delete + * @param trash directory where you put the deleted files + * @param skill TODO + * @return if the operation was successful */ + public static boolean deleteComponent(final String y, + final String f, final String trash, Skill skill) { + return deleteComponent(y, f, new File(trash), skill); + } + + /** @param filenameInput class name + * @param outputPath path to go to write + * @param outputFile name of the output file + * @param candies application main constants + * @param trashY the directory with trash function + * @param skill set of application descriptive data + * @param tableJ index in the list of DB tables + * @param markupE map of markups + * @param tipoFileInput type of input file, as classified inside the + * box + * @throws ExactException standard exception + * @throws IOException standard exception + * @throws FileNotFoundException standard exception */ + public static void addClass(final String filenameInput, + final String outputPath, final String outputFile, + CandyScrew candies, final String trashY, Skill skill, + final int tableJ, HashMap markupE, + final String tipoFileInput) + + throws ExactException, FileNotFoundException, IOException { + + String dir = candies.snippetsYS + tipoFileInput; + String material = Equipment.oneStringUnicode_A(dir + "/" + + filenameInput, "UTF-8"); + material = Strings.replaceFirst(material, "package +zoccolo+", + "package " + skill.pckg); + material = material.replaceAll("\\x2bApplicaz\\x2b", Mix + .uppercaseFirstChar(skill.applicationNameLower)); + material = material.replaceAll("import \\x2bzoccolo\\x2b", + "import " + skill.pckg); + material = material.replaceAll("\\x2bnocciolo\\x2b", + outputFile); + if (tableJ > -1) { + material = material.replaceAll("\\x2btabella\\x2b", + skill.tableDBE.get(tableJ).entityName); + material = material.replaceAll("\\x2bdbschema\\x2b", + skill.tableDBE.get(tableJ).railLowercase); + material = Strings.replaceFirst(material, "+jpapath+", + skill.tableDBE.get(tableJ).pathDots); + } + material = material.replaceAll("\\x2bRail\\x2b", Cst.RAILU + + skill.tabUser[1]); + material = material.replaceAll("\\x2brail\\x2b", Cst.RAIL + + skill.tabUser[1]); + material = material.replaceAll("\\x2btabuser\\x2b", Mix + .uppercaseFirstChar(skill.tabUser[0])); + if (!markupE.get("xencoder").recurrenceE.isEmpty() && markupE + .get("xencoder").recurrenceE.get(0).locomotor.text + .equalsIgnoreCase("useridmd5")) { + String t = ""; + t += "public String getCredentials() {" + Candies.LF; + t += Candies.TABS + Candies.TABS + + "String s = super.getPrincipal()" + Candies.LF; + t += Candies.TABS + Candies.TABS + + "+ (String) super.getCredentials();" + Candies.LF; + t += Candies.TABS + Candies.TABS + "MessageDigest m = null;" + + Candies.LF; + t += Candies.TABS + Candies.TABS + "try {" + Candies.LF; + t += Candies.TABS + Candies.TABS + Candies.TABS + + "m = MessageDigest.getInstance(\"MD5\");" + + Candies.LF; + t += Candies.TABS + Candies.TABS + + "} catch (NoSuchAlgorithmException e) {" + + Candies.LF; + t += Candies.TABS + Candies.TABS + "}" + Candies.LF; + t += Candies.TABS + Candies.TABS + + "m.update(s.getBytes(), 0, s.length());" + + Candies.LF; + t += Candies.TABS + Candies.TABS + + "return new BigInteger(1, m.digest()).toString(16);" + + Candies.LF; + t += Candies.TABS + "}"; + material = Strings.replaceFirst(material, "+newMethod+", t); + } else { + material = Strings.replaceFirst(material, "+newMethod+", + ""); + } + skill.toTarget(outputPath, outputFile, material, filenameInput, + trashY, "java"); + } + + /** @param inputFileName obvious + * @param outputFileName obvious + * @param outputPath path of the output file + * @param candies external properties + * @param recycleBinY directory-trashcan, i.e. where to put the + * files to be deleted + * @param skill set of application descriptive data + * @throws ExactException a standard exception + * @throws IOException standard exception + * @throws FileNotFoundException standard exception */ + public static void addFile(final String inputFileName, + String outputFileName, final String outputPath, + CandyScrew candies, final String recycleBinY, Skill skill) + + throws ExactException, FileNotFoundException, IOException { + + String dir = candies.snippetsYS; + String extension = Mix.estraiExtension(inputFileName); + String tipo = "xml"; + if (extension != null && extension.equals("xml")) { + dir += "xml/"; + } else if (extension != null && extension.equals("css")) { + dir += "css/"; + } else if (inputFileName.endsWith("_jsp.txt")) { + dir += "jsp/"; + tipo = "jsp"; + } else if (inputFileName.endsWith(".properties")) { + dir += "properties/"; + } + if (extension != null && extension.equals("java")) { + tipo = extension; + } else if (extension != null && extension.equals( + "properties")) { + tipo = extension; + } else if (extension != null && extension.equals("jsp")) { + tipo = extension; + } + String material = Equipment.oneString(dir + inputFileName); + material = Strings.replaceFirst(material, "+Applicaz+", Mix + .uppercaseFirstChar(skill.applicationNameLower)); + if (skill.authenticationErrorMenu == null) { + material = Strings.replaceFirst(material, "+navigation+", + ""); + } else { + material = Strings.replaceFirst(material, "+navigation+", + ""); + } + material = material.replaceAll("\\x2bapplicaz\\x2b", + skill.applicationNameLower); + skill.toTarget(outputPath, outputFileName, material, + inputFileName, recycleBinY, tipo); + } + + /** identifies the type of the key; it doesn't have to be a + * primitive type */ + + protected String[] locateKey(TableOutfit ct) + + throws ExactException, FileNotFoundException, IOException { + + Flute flute = ct.flute; + int i = 0; + int j = 0; + String tipo = null; + String nome = null; + String[] b = new String[3]; + for (; i < flute.fpropertyE.size(); i++) { + JavaProperty p = flute.fpropertyE.get(i); + j = 0; + for (; j < p.fannotationE.size(); j++) { + JavaAnnotation a = p.fannotationE.get(j); + if (a.fnome.equals("EmbeddedId") | a.fnome.equals( + "Id")) { + if (p.fprimitivo != null) { + ExactException ce = new ExactException( + "In the «" + ct.entityName + ".java»" + + " the key «" + p.fnome + + "» is declared by the primitive type «" + + p.fprimitivo + + "», it is not allowed.", 1101, + this.getClass().getName(), ""); + throw ce; + } + tipo = p.fclasse; + nome = p.fnome; + break; + } + } + if (j < p.fannotationE.size()) { + break; + } + } + if (i == flute.fpropertyE.size()) { + // b [0] = ""; + // b [1] = ""; + // b [2] = ""; + // return b; + ExactException ce = new ExactException("In the file " + + ct.entityName + ".java" + + "there are no Id annotation or Embedded Id.", + 1102, this.getClass().getName(), ""); + throw ce; + } + /* the 3 elements are: 1) property annotation; 2) property + * class; 3) name of the property */ + b[0] = flute.fpropertyE.get(i).fannotationE.get(j).fnome; + b[1] = tipo; + b[2] = nome; + return b; + } + + /** + *

+ * Identifies the type of the key; must not be a primitive type + *

+ * + * @param ct table main elements + * @param nomeColonna column name + * @return whether the DB table column is present or not */ + + public static boolean checkColumn(TableOutfit ct, + String nomeColonna) { + + Flute flute = ct.flute; + int i = 0; + for (; i < flute.fpropertyE.size(); i++) { + JavaProperty p = flute.fpropertyE.get(i); + if (p.fnome.equalsIgnoreCase(nomeColonna)) { + break; + } + } + return i < flute.fpropertyE.size(); + } +} \ No newline at end of file diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/GenericModel_java.java b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/GenericModel_java.java new file mode 100644 index 0000000..2af085e --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/GenericModel_java.java @@ -0,0 +1,68 @@ +// +// https://www.ramecera.it/myscrewdriver.html +// e-mail: screwdriver@ramecera.it +// +/* This program and the accompanying materials are made available under + * the terms of the Eclipse Public License v1.0 which accompanies this + * distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html */ +package it.ramecera.screwdriver.component; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.HashMap; +import java.util.List; + +import it.ramecera.salad.everyday.Candies; +import it.ramecera.salad.everyday.ExactException; +import it.ramecera.screwdriver.CandyScrew; +import it.ramecera.screwdriver.Markup; +import it.ramecera.screwdriver.Skill; +import it.ramecera.screwdriver.Train; + +/** @author M. Maglioni */ +final public class GenericModel_java extends FileComponent { + + /** @param skill application base values + * @param snippetG path and snippet file name (fragment) + * @param candies external application properties */ + public GenericModel_java(Skill skill, String snippetG, + CandyScrew candies) { + super(); + this.skill = skill; + this.snippetG = snippetG; + this.candies = candies; + } + + /** @throws ExactException exception specified by a numeric code */ + @Override + public void synthesis(HashMap markupE, + List trainE, CandyScrew candyScrew) + + throws FileNotFoundException, IOException, ExactException { + + producedMaterial += "package " + skill.pckg + ".web.model;" + + Candies.LF; + producedMaterial += "/* screwdriver_knife */" + Candies.LF; + producedMaterial += Candies.LF + "public class GenericModel {" + + Candies.LF + Candies.LF; + producedMaterial += "/* screwdriver_knife */" + Candies.LF; + producedMaterial += "}" + Candies.LF; + } + + /* written only to comply with the abstract class FileComponent */ + @SuppressWarnings("javadoc") + @Override + /** @param markupE the list of markups + * @param skill together with the characteristics of the application + * @param trash file where the deleted files are moved + * @throws ExactException exception specified by a numeric code */ + public void directory(HashMap markupE) + + throws ExactException { + skill.javaWebModelY = skill.javaWebY + "/model"; + skill.buildDirectory(skill.javaWebModelY); + skill.javaWebModelUtilityY = skill.javaWebModelY + "/utility"; + skill.buildDirectory(skill.javaWebModelUtilityY); + } +} diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/Hoof.java b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/Hoof.java new file mode 100644 index 0000000..7baa735 --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/Hoof.java @@ -0,0 +1,163 @@ +// +// https://www.ramecera.it/myscrewdriver.html +// e-mail: screwdriver@ramecera.it +// +/* This program and the accompanying materials are made available under + * the terms of the Eclipse Public License v1.0 which accompanies this + * distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html */ +package it.ramecera.screwdriver.component; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.HashMap; +import java.util.List; + +import it.ramecera.salad.everyday.Candies; +import it.ramecera.salad.everyday.ExactException; +import it.ramecera.salad.everyday.Mix; +import it.ramecera.salad.everyday.Strings; +import it.ramecera.salad.file.Equipment; +import it.ramecera.screwdriver.CandyScrew; +import it.ramecera.screwdriver.Cst; +import it.ramecera.screwdriver.Markup; +import it.ramecera.screwdriver.Skill; +import it.ramecera.screwdriver.Train; + +/** + *

+ * This class is used for the following components: headerJsp, + * footerJsp, genericRailDaoImplJPAx, tiles_xml, service_xml, orm_xml, + * doorControllerBelong_java, genericCrud_java, controllerBelong_java, + * jspForm_java, jspPlain_ java, Xtajut user , quartzTask_java, + * quartzTaskImpl_java + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-06-20
+ * Company: Rameceraâ„¢ + *

+ * + * @author Massimo Maglioni + *

+ * Description: + *

+ */ +final public class Hoof extends FileComponent { + + /** @param skill together with the descriptive data of the + * @param snippetG application */ + public Hoof(Skill skill, String snippetG) { + super(); + this.skill = skill; + this.snippetG = snippetG; + } + + /** @throws ExactException exception specified by a numeric code */ + @Override + public void synthesis(HashMap markupE, + List trainE, CandyScrew candyScrew) + + throws FileNotFoundException, IOException, ExactException { + + String g = skill.candies.snippetsYS + snippetG; + producedMaterial = Equipment.oneString(g) + Candies.LF; + + /* WE COOK EVERYTHING */ + if (skill.pckg != null) { + producedMaterial = producedMaterial.replaceAll( + "\\x2bzoccolo\\x2b", skill.pckg); + } + if (skill.applicationNameLower != null) { + producedMaterial = Strings.replaceFirst(producedMaterial, + "+titolo+", skill.applicationNameLower); + } + if (skill.quartzVers != null) { + producedMaterial = producedMaterial.replaceAll( + "\\x2bQuartzjob\\x2b", skill.clockHands.jobNameU); + producedMaterial = producedMaterial.replaceAll( + "\\x2bQuartztask\\x2b", skill.clockHands.taskNameU); + } + if (skill.hasUseridPassword) { + producedMaterial = Strings.replaceFirst(producedMaterial, + "+tabposition+", (skill.networkDomain + + ".screwdriver." + skill.tabUser[2] + "." + + skill.tabUser[3]).toLowerCase()); + if (skill.authenticationMode.equals("trivial")) { + producedMaterial = Strings.replaceFirst( + producedMaterial, "+beanposition+", skill.pckg + + ".domain"); + } else { + producedMaterial = Strings.replaceFirst( + producedMaterial, "+beanposition+", + (skill.networkDomain + ".screwdriver." + + skill.tabUser[2] + "." + + skill.tabUser[3]).toLowerCase()); + } + if (producedMaterial.indexOf("+tabella+") > -1) { + producedMaterial = producedMaterial.replaceAll( + "\\x2btabella\\x2b", skill.tabUser[0]); + } + if (producedMaterial.indexOf("+bean+") > -1) { + if (skill.authenticationMode.equals("trivial")) { + producedMaterial = producedMaterial.replaceAll( + "\\x2bbean\\x2b", "King"); + } else { + producedMaterial = producedMaterial.replaceAll( + "\\x2bbean\\x2b", skill.tabUser[0]); + } + } + if (producedMaterial.indexOf("+userrail+") > -1) { + producedMaterial = producedMaterial.replaceAll( + "\\x2buserrail\\x2b", Cst.RAIL + + skill.tabUser[1]); + } + if (producedMaterial.indexOf("+Userrail+") > -1) { + producedMaterial = producedMaterial.replaceAll( + "\\x2bUserrail\\x2b", Cst.RAILU + + skill.tabUser[1]); + } + producedMaterial = Strings.replaceFirst(producedMaterial, + "+password+", Mix.uppercaseFirstChar( + skill.password)); + } + if (markupE.get("hdefrail").recurrenceE.size() > 0) { + Train f = markupE.get("hdefrail").recurrenceE.get( + skill.railK); + producedMaterial = producedMaterial.replaceAll( + "\\x2brail\\x2b", Cst.RAIL + f.locomotor.text); + producedMaterial = producedMaterial.replaceAll( + "\\x2bRail\\x2b", Cst.RAILU + f.locomotor.text); + } + + if (markupE.get("usignup").recurrenceE.size() > 0) { + String t = ""; + t += Candies.TABS + "@RequestMapping(\"/signup/form\")" + + Candies.LF; + t += Candies.TABS + "public String nuovoUtente() {" + + Candies.LF; + t += Candies.TABS + Candies.TABS + "return \"home/signup\";" + + Candies.LF; + t += Candies.TABS + "}" + Candies.LF; + producedMaterial = Strings.replaceFirst(producedMaterial, + "+signup+", t); + } else { + producedMaterial = Strings.replaceFirst(producedMaterial, + "+signup+", ""); + } + } + + /* written only to comply with the abstract class FileComponent */ + @SuppressWarnings("javadoc") + @Override + /** @param markupE the list of markups + * @param skill together with the descriptive data of the + * application + * @param file basket where the deleted files are moved + * @throws ExactException exception specified by a numerical code */ + public void directory(HashMap markupE) + + throws ExactException { + + } +} diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/ImplementTabellaService_java.java b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/ImplementTabellaService_java.java new file mode 100644 index 0000000..782944b --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/ImplementTabellaService_java.java @@ -0,0 +1,106 @@ +// +// https://www.ramecera.it/myscrewdriver.html +// e-mail: screwdriver@ramecera.it +// +/* This program and the accompanying materials are made available under + * the terms of the Eclipse Public License v1.0 which accompanies this + * distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html */ +package it.ramecera.screwdriver.component; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.HashMap; +import java.util.List; + +import it.ramecera.salad.everyday.Candies; +import it.ramecera.salad.everyday.ExactException; +import it.ramecera.screwdriver.CandyScrew; +import it.ramecera.screwdriver.Cst; +import it.ramecera.screwdriver.Markup; +import it.ramecera.screwdriver.Skill; +import it.ramecera.screwdriver.Train; +import it.ramecera.screwdriver.outfits.TableOutfit; + +/** @author M. Maglioni */ +final public class ImplementTabellaService_java extends FileComponent { + + /** @param skill application base values + * @param snippetG path and snippet file name (fragment) + * @param candies external application properties */ + public ImplementTabellaService_java(Skill skill, String snippetG, + CandyScrew candies) { + super(); + this.skill = skill; + this.snippetG = snippetG; + this.candies = candies; + } + + /** @throws ExactException exception specified by a numeric code */ + @Override + public void synthesis(HashMap markupE, + List trainE, CandyScrew candyScrew) + + throws FileNotFoundException, IOException, ExactException { + + TableOutfit ct = skill.tableDBE.get(skill.tK); + producedMaterial += "package " + skill.pckg + "." + + ct.railLowercase + ".service.impl;" + Candies.LF + + Candies.LF; + producedMaterial += "import " + skill.pckg + "." + + ct.railLowercase + ".dao.I" + ct.railUppercase + + ct.entityName + "Dao;" + Candies.LF; + producedMaterial += "import " + ct.pathDots + "." + + ct.entityName + ";" + Candies.LF; + producedMaterial += "import " + skill.pckg + "." + + ct.railLowercase + ".service.I" + ct.railUppercase + + ct.entityName + "Service;" + Candies.LF; + producedMaterial += "import org.springframework.stereotype.Service;" + + Candies.LF; + if (skill.log4jVers != null) { + producedMaterial += "import org.apache.log4j.Logger;" + + Candies.LF + Candies.LF; + } + producedMaterial += "import org.springframework.beans.factory.annotation.Autowired;" + + Candies.LF; + producedMaterial += "import org.hibernate.criterion.Restrictions;" + + Candies.LF; + producedMaterial += "import org.hibernate.criterion.Projections;" + + Candies.LF; + producedMaterial += "import org.springframework.transaction.annotation.Transactional;" + + Candies.LF + Candies.LF; + producedMaterial += "@Service" + Candies.LF; + producedMaterial += "@Transactional" + Candies.LF; + producedMaterial += "public class " + ct.railUppercase + + ct.entityName + "Service" + Candies.LF; + producedMaterial += Candies.TABS + "implements I" + + ct.railUppercase + ct.entityName + "Service {" + + Candies.LF + Candies.LF; + if (skill.log4jVers != null) { + producedMaterial += Candies.TABS + "/** ordinary logger */" + + Candies.LF; + producedMaterial += Candies.TABS + + "@SuppressWarnings(\"unused\")" + Candies.LF; + producedMaterial += Candies.TABS + + "private static Logger logger = Logger.getLogger(" + + ct.railUppercase + ct.entityName + "Service" + + ".class.getName());" + Candies.LF + Candies.LF; + } + producedMaterial += Candies.TABS + "/* " + Cst.KNIFE + " */" + + Candies.LF; + producedMaterial += "}"; + } + + /* written only to comply with the abstract class FileComponent */ + @SuppressWarnings("javadoc") + @Override + /** @param markupE the list of markups + * @param skill together with the characteristics of the application + * @param trash file where the deleted files are moved + * @throws ExactException exception specified by a numeric code */ + public void directory(HashMap markupE) + + throws ExactException { + + } +} diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/ImplementTableDao_java.java b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/ImplementTableDao_java.java new file mode 100644 index 0000000..c14eed7 --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/ImplementTableDao_java.java @@ -0,0 +1,126 @@ +// +// https://www.ramecera.it/myscrewdriver.html +// e-mail: screwdriver@ramecera.it +// +/* This program and the accompanying materials are made available under + * the terms of the Eclipse Public License v1.0 which accompanies this + * distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html */ +package it.ramecera.screwdriver.component; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.HashMap; +import java.util.List; + +import it.ramecera.salad.everyday.Candies; +import it.ramecera.salad.everyday.ExactException; +import it.ramecera.screwdriver.CandyScrew; +import it.ramecera.screwdriver.Cst; +import it.ramecera.screwdriver.Markup; +import it.ramecera.screwdriver.Skill; +import it.ramecera.screwdriver.Train; +import it.ramecera.screwdriver.outfits.TableOutfit; + +/** @author M. Maglioni */ +final public class ImplementTableDao_java extends FileComponent { + + /** @param skill application descriptive data set + * @param snippetG path and snippet file name (fragment) + * @param candies external properties of the application */ + public ImplementTableDao_java(Skill skill, String snippetG, + CandyScrew candies) { + super(); + this.skill = skill; + this.snippetG = snippetG; + this.candies = candies; + } + + /** @throws ExactException exception specified by a numeric code */ + @Override + public void synthesis(HashMap markupE, + List trainE, CandyScrew candyScrew) + + throws FileNotFoundException, IOException, ExactException { + + String[] tipo = locateKey(skill.tableDBE.get(skill.tK)); + TableOutfit ct = skill.tableDBE.get(skill.tK); + producedMaterial += "package " + skill.pckg + "." + + ct.railLowercase + ".dao.impl;" + Candies.LF + + Candies.LF; + producedMaterial += "import org.hibernate.Criteria;" + + Candies.LF; + producedMaterial += "import org.hibernate.criterion.Projections;" + + Candies.LF; + producedMaterial += "import org.springframework.dao.DataAccessException;" + + Candies.LF; + producedMaterial += "import org.springframework.stereotype.Repository;" + + Candies.LF + Candies.LF; + producedMaterial += "import " + skill.pckg + "." + + ct.railLowercase + ".dao.I" + ct.railUppercase + + ct.entityName + "Dao;" + Candies.LF; + producedMaterial += "import " + ct.pathDots + "." + + ct.entityName + ";" + Candies.LF; + if (tipo[0].equals("EmbeddedId")) { + producedMaterial += "import " + ct.pathDots + "." + tipo[1] + + ";" + Candies.LF; + } + producedMaterial += "import " + skill.pckg + "." + + ct.railLowercase + ".Generic" + ct.railUppercase + + "DaoImpl;" + Candies.LF + Candies.LF; + if (skill.log4jVers != null) { + producedMaterial += "import org.apache.log4j.Logger;" + + Candies.LF + Candies.LF; + } + producedMaterial += "@Repository" + Candies.LF; + if (skill.jpaVersion == 1) { + producedMaterial += "public class " + ct.railUppercase + + ct.entityName + "Dao extends" + Candies.LF + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + "Generic" + + ct.railUppercase + "DaoImpl<" + ct.entityName + + ", " + tipo[1] + ">" + Candies.LF + Candies.LF; + producedMaterial += Candies.TABS + "implements I" + + ct.railUppercase + ct.entityName + "Dao {" + + Candies.LF + Candies.LF; + } else { + producedMaterial += "public class " + ct.railUppercase + + ct.entityName + "Dao extends" + Candies.LF + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + "Generic" + + ct.railUppercase + "DaoImpl" + Candies.LF + + Candies.LF; + producedMaterial += Candies.TABS + "implements I" + + ct.railUppercase + ct.entityName + "Dao {" + + Candies.LF + Candies.LF; + } + if (skill.log4jVers != null) { + producedMaterial += Candies.TABS + "/** ordinary logger */" + + Candies.LF; + producedMaterial += Candies.TABS + + "@SuppressWarnings(\"unused\")" + Candies.LF; + producedMaterial += Candies.TABS + + "private static Logger logger = Logger.getLogger(" + + Candies.LF + Candies.TABS + Candies.TABS + + Candies.TABS + ct.railUppercase + ct.entityName + + "Dao" + ".class);" + Candies.LF + Candies.LF; + } + producedMaterial += Candies.TABS + "/* " + Cst.KNIFE + " */" + + Candies.LF; + producedMaterial += "}"; + } + + /* written only to comply with the abstract class FileComponent */ + @SuppressWarnings("javadoc") + @Override + /** @param markupE the list of markups + * @param skill together with the descriptive data of the + * application + * @param file basket where the deleted files are moved + * @throws ExactException exception specified by a numerical code */ + public void directory(HashMap markupE) + + throws ExactException { + + } +} diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/InterfaceTabellaService_java.java b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/InterfaceTabellaService_java.java new file mode 100644 index 0000000..c5bcfc9 --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/InterfaceTabellaService_java.java @@ -0,0 +1,71 @@ +// +// https://www.ramecera.it/myscrewdriver.html +// e-mail: screwdriver@ramecera.it +// +/* This program and the accompanying materials are made available under + * the terms of the Eclipse Public License v1.0 which accompanies this + * distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html */ +package it.ramecera.screwdriver.component; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.HashMap; +import java.util.List; + +import it.ramecera.salad.everyday.Candies; +import it.ramecera.salad.everyday.ExactException; +import it.ramecera.screwdriver.CandyScrew; +import it.ramecera.screwdriver.Cst; +import it.ramecera.screwdriver.Markup; +import it.ramecera.screwdriver.Skill; +import it.ramecera.screwdriver.Train; +import it.ramecera.screwdriver.outfits.TableOutfit; + +/** @author M. Maglioni */ +final public class InterfaceTabellaService_java extends FileComponent { + + /** @param skill application base values + * @param snippetG path and snippet file name (fragment) + * @param candies external application properties */ + public InterfaceTabellaService_java(Skill skill, String snippetG, + CandyScrew candies) { + super(); + this.skill = skill; + this.snippetG = snippetG; + this.candies = candies; + } + + /** @throws ExactException exception specified by a numeric code */ + @Override + public void synthesis(HashMap markupE, + List trainE, CandyScrew candyScrew) + + throws FileNotFoundException, IOException, ExactException { + + TableOutfit ct = skill.tableDBE.get(skill.tK); + producedMaterial += "package " + skill.pckg + "." + + ct.railLowercase + ".service;" + Candies.LF + + Candies.LF; + producedMaterial += "import " + ct.pathDots + "." + + ct.entityName + ";" + Candies.LF + Candies.LF; + producedMaterial += "public interface I" + ct.railUppercase + + ct.entityName + "Service {" + Candies.LF + Candies.LF; + producedMaterial += Candies.TABS + "/* " + Cst.KNIFE + " */" + + Candies.LF; + producedMaterial += "}"; + } + + /* written only to comply with the abstract class FileComponent */ + @SuppressWarnings("javadoc") + @Override + /** @param markupE the list of markups + * @param skill together with the characteristics of the application + * @param trash file where the deleted files are moved + * @throws ExactException exception specified by a numeric code */ + public void directory(HashMap markupE) + + throws ExactException { + + } +} diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/InterfaceTableDao_java.java b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/InterfaceTableDao_java.java new file mode 100644 index 0000000..04a9620 --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/InterfaceTableDao_java.java @@ -0,0 +1,92 @@ +// +// https://www.ramecera.it/myscrewdriver.html +// e-mail: screwdriver@ramecera.it +// +/* This program and the accompanying materials are made available under + * the terms of the Eclipse Public License v1.0 which accompanies this + * distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html */ +package it.ramecera.screwdriver.component; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.HashMap; +import java.util.List; + +import it.ramecera.salad.everyday.Candies; +import it.ramecera.salad.everyday.ExactException; +import it.ramecera.screwdriver.CandyScrew; +import it.ramecera.screwdriver.Cst; +import it.ramecera.screwdriver.Markup; +import it.ramecera.screwdriver.Skill; +import it.ramecera.screwdriver.Train; +import it.ramecera.screwdriver.outfits.TableOutfit; + +/** @author M. Maglioni */ +final public class InterfaceTableDao_java extends FileComponent { + + /** @param skill application main elements + * @param snippetG file containing the snippet + * @param candies elements */ + public InterfaceTableDao_java(Skill skill, String snippetG, + CandyScrew candies) { + super(); + this.skill = skill; + this.snippetG = snippetG; + this.candies = candies; + } + + /** @throws ExactException exception specified by a numeric code */ + @Override + public void synthesis(HashMap markupE, + List trainE, CandyScrew candyScrew) + + throws FileNotFoundException, IOException, ExactException { + + String[] tipo = locateKey(skill.tableDBE.get(skill.tK)); + TableOutfit ct = skill.tableDBE.get(skill.tK); + producedMaterial += "package " + skill.pckg + "." + + skill.tableDBE.get(skill.tK).railLowercase + ".dao;" + + Candies.LF + Candies.LF; + producedMaterial += "import " + ct.pathDots + "." + + ct.entityName + ";" + Candies.LF; + if (tipo[0].equals("EmbeddedId")) { + producedMaterial += "import " + ct.pathDots + "." + tipo[1] + + ";" + Candies.LF; + } + producedMaterial += "import org.springframework.dao.DataAccessException;" + + Candies.LF + Candies.LF; + if (skill.jpaVersion == 1) { + producedMaterial += "import " + skill.pckg + + ".generic.GenericCrud;" + Candies.LF + Candies.LF; + producedMaterial += "public interface I" + ct.railUppercase + + ct.entityName + "Dao" + Candies.LF + Candies.LF + + Candies.TABS + "extends GenericCrud<" + + ct.entityName + ", " + tipo[1] + "> {" + + Candies.LF + Candies.LF; + } else { + producedMaterial += "import " + skill.pckg + + ".jpa.dao.GenericDao;" + Candies.LF + Candies.LF; + producedMaterial += "public interface I" + ct.railUppercase + + ct.entityName + "Dao" + Candies.LF + Candies.LF + + Candies.TABS + "extends GenericDao {" + + Candies.LF + Candies.LF; + } + producedMaterial += Candies.TABS + "/* " + Cst.KNIFE + " */" + + Candies.LF; + producedMaterial += "}"; + } + + /* written only to comply with the abstract class FileComponent */ + @SuppressWarnings("javadoc") + @Override + /** @param markupE the list of markups + * @param skill together with the characteristics of the application + * @param trash file where the deleted files are moved + * @throws ExactException exception specified by a numeric code */ + public void directory(HashMap markupE) + + throws ExactException { + + } +} diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/JspFormImpl_java.java b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/JspFormImpl_java.java new file mode 100644 index 0000000..295ea2a --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/JspFormImpl_java.java @@ -0,0 +1,141 @@ +// +// https://www.ramecera.it/myscrewdriver.html +// e-mail: screwdriver@ramecera.it +// +/* This program and the accompanying materials are made available under + * the terms of the Eclipse Public License v1.0 which accompanies this + * distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html */ +package it.ramecera.screwdriver.component; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.HashMap; +import java.util.List; + +import it.ramecera.salad.everyday.Candies; +import it.ramecera.salad.everyday.ExactException; +import it.ramecera.salad.everyday.Mix; +import it.ramecera.screwdriver.CandyScrew; +import it.ramecera.screwdriver.Cst; +import it.ramecera.screwdriver.Markup; +import it.ramecera.screwdriver.Skill; +import it.ramecera.screwdriver.Train; +import it.ramecera.screwdriver.outfits.TableOutfit; + +/** + *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-06-20
+ * Company: Rameceraâ„¢ + *

+ * + * @author Massimo Maglioni + *

+ * Description: + *

+ */ +final public class JspFormImpl_java extends FileComponent { + + /** @param skill application main data + * @param snippetG name of the file containing the snippet */ + public JspFormImpl_java(Skill skill, String snippetG) { + super(); + this.skill = skill; + this.snippetG = snippetG; + } + + /** @throws ExactException exception specified by a numeric code */ + @Override + public void synthesis(HashMap markupE, + List trainE, CandyScrew candyScrew) + + throws FileNotFoundException, IOException, ExactException { + + producedMaterial = ""; + producedMaterial += "package " + skill.pckg + ".web.model." + + jspKit.path + ";" + Candies.LF + Candies.LF; + for (int i = 0; i < jspKit.methodE.size(); i++) { + String nomeMetodo = jspKit.methodE.get(i).text; + for (int j = 0; j < skill.methodE.get(nomeMetodo).tableE + .size(); j++) { + TableOutfit t = skill.methodE.get(nomeMetodo).tableE + .get(j); + producedMaterial += "import " + skill.pckg + "." + + t.railLowercase + ".dao.I" + Mix + .uppercaseFirstChar(t.railLowercase) + + t.entityName + "Dao;" + Candies.LF; + producedMaterial += "import " + skill.pckg + "." + + t.railLowercase + ".dao.impl." + Mix + .uppercaseFirstChar(t.railLowercase) + + t.entityName + "Dao;" + Candies.LF; + } + } + producedMaterial += "import org.springframework.stereotype.Component;" + + Candies.LF; + producedMaterial += Candies.LF + + "import javax.servlet.http.HttpServletRequest;" + + Candies.LF; + if (skill.log4jVers != null) { + producedMaterial += Candies.LF + + "import org.apache.log4j.Logger;" + Candies.LF + + Candies.LF; + } + producedMaterial += "@Component" + Candies.LF; + producedMaterial += "public class " + jspKit.nomeFileU + + Cst.FORMU + "Impl extends " + jspKit.nomeFileU + + Cst.FORMU + " {" + Candies.LF + Candies.LF; + if (skill.log4jVers != null) { + producedMaterial += Candies.TABS + "/** ordinary logger */" + + Candies.LF; + producedMaterial += Candies.TABS + + "@SuppressWarnings(\"unused\")" + Candies.LF; + producedMaterial += Candies.TABS + + "private static final Logger logger = Logger.getLogger(" + + Candies.LF + Candies.TABS + Candies.TABS + + Candies.TABS + jspKit.nomeFileU + Cst.FORMU + + "Impl.class);" + Candies.LF + Candies.LF; + } + for (int i = 0; i < jspKit.methodE.size(); i++) { + String nomeMetodo = jspKit.methodE.get(i).text; + producedMaterial += Candies.TABS + "@Override" + Candies.LF; + producedMaterial += Candies.TABS + "public void " + + nomeMetodo + "("; + producedMaterial += "HttpServletRequest request"; + if (!skill.methodE.get(nomeMetodo).upperArguments.trim() + .isEmpty()) { + producedMaterial += ", "; + } + producedMaterial += skill.methodE.get( + nomeMetodo).upperArguments; + for (int cJ = 0; cJ < skill.methodE.get(nomeMetodo).classE + .size(); cJ++) { + producedMaterial += ", "; + producedMaterial += skill.methodE.get( + nomeMetodo).classE.get(cJ) + " other" + cJ; + + } + producedMaterial += ") {" + Candies.LF + Candies.LF; + if (skill.methodE.get(nomeMetodo).source != null) { + producedMaterial += skill.methodE.get( + nomeMetodo).source + Candies.LF; + } + producedMaterial += Candies.TAB + "}" + Candies.LF + + Candies.LF; + } + producedMaterial += "}" + Candies.LF; + } + + /* written only to comply with the abstract class FileComponent */ + @SuppressWarnings("javadoc") + @Override + /** @param markupE the list of markups + * @param skill together with the characteristics of the application + * @param trash file where the deleted files are moved + * @throws ExactException exception specified by a numeric code */ + public void directory(HashMap markupE) + + throws ExactException { + + } +} diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/JspForm_java.java b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/JspForm_java.java new file mode 100644 index 0000000..06ee5da --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/JspForm_java.java @@ -0,0 +1,436 @@ +// +// https://www.ramecera.it/myscrewdriver.html +// e-mail: screwdriver@ramecera.it +// +/* This program and the accompanying materials are made available under + * the terms of the Eclipse Public License v1.0 which accompanies this + * distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html */ +package it.ramecera.screwdriver.component; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.HashMap; +import java.util.List; + +import it.ramecera.salad.everyday.Candies; +import it.ramecera.salad.everyday.ExactException; +import it.ramecera.screwdriver.CandyScrew; +import it.ramecera.screwdriver.Cst; +import it.ramecera.screwdriver.Markup; +import it.ramecera.screwdriver.Skill; +import it.ramecera.screwdriver.Train; +import it.ramecera.screwdriver.Wagon; +import it.ramecera.screwdriver.outfits.JspBeanElement; +import it.ramecera.screwdriver.utilities.ValidConstScrew; + +/** + *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-06-20
+ * Company: Rameceraâ„¢ + *

+ * + * @author Massimo Maglioni + *

+ * Description: + *

+ */ +final public class JspForm_java extends FileComponent { + + /** @param skill application main data + * @param snippetG name of the file containing the snippet */ + public JspForm_java(Skill skill, String snippetG) { + super(); + this.skill = skill; + this.snippetG = snippetG; + } + + /** @throws ExactException exception specified by a numeric code */ + @Override + public void synthesis(HashMap markupE, + List trainE, CandyScrew candyScrew) + + throws FileNotFoundException, IOException, ExactException { + + producedMaterial = ""; + producedMaterial += "package " + skill.pckg + ".web.model." + + jspKit.path + ";" + Candies.LF + Candies.LF; + producedMaterial += "import java.text.DecimalFormat;" + + Candies.LF; + producedMaterial += "import javax.servlet.http.HttpServletRequest;" + + Candies.LF; + if (jspKit.arrayStringPropertyE.size() > 0) { + producedMaterial += "import java.util.List;" + Candies.LF; + producedMaterial += "import java.util.ArrayList;" + + Candies.LF; + } + producedMaterial += "import " + skill.pckg + + ".web.model.GenericModel;" + Candies.LF; + if (jspKit.controlE.size() > 0) { + producedMaterial += "import java.util.ArrayList;" + + Candies.LF; + producedMaterial += "import java.util.List;" + Candies.LF; + } + for (Train t : markupE.get("hdefrail").recurrenceE) { + producedMaterial += "import " + skill.networkDomain + + ".screwdriver." + t.wagonE.get("hjndi").text + .toLowerCase() + "." + t.wagonE.get( + "hdbschema").text + ".*;" + + Candies.LF; + } + if (jspKit.methodE.size() > 0) { + producedMaterial += "import org.springframework.dao." + + "DataAccessException;" + Candies.LF; + } + if (skill.log4jVers != null) { + producedMaterial += "import org.apache.log4j.Logger;" + + Candies.LF + Candies.LF; + } + if (jspKit.methodE.size() > 0) { + for (Train t : markupE.get("hdefrail").recurrenceE) { + producedMaterial += "import " + skill.networkDomain + + "." + skill.applicationNameLower + "." + + Cst.RAIL + t.locomotor.text + ".dao.*;" + + Candies.LF; + } + } + if (jspKit.methodE.size() > 0) { + producedMaterial += "abstract "; + } + producedMaterial += "public class " + jspKit.nomeFileU + + Cst.FORMU + " extends GenericModel {" + Candies.LF + + Candies.LF; + + if (skill.log4jVers != null) { + producedMaterial += Candies.TABS + "/** ordinary logger */" + + Candies.LF; + producedMaterial += Candies.TABS + + "@SuppressWarnings(\"unused\")" + Candies.LF; + producedMaterial += Candies.TABS + + "private static final Logger logger = Logger.getLogger(" + + Candies.LF + Candies.TABS + Candies.TABS + + Candies.TABS + jspKit.nomeFileU + Cst.FORMU + + ".class);" + Candies.LF + Candies.LF; + } + for (JspBeanElement jbe : jspKit.integerPropertyE) { + producedMaterial += Candies.TABS + "/** bean property */" + + Candies.LF; + producedMaterial += Candies.TABS + "private " + + jbe.datumType + " " + jbe.name + ";" + Candies.LF + + Candies.LF; + producedMaterial += Candies.TABS + + "/** standard get method */" + Candies.LF; + producedMaterial += Candies.TABS + "public " + jbe.datumType + + " get" + jbe.nameU + "() {" + Candies.LF + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "return this." + jbe.name + ";" + Candies.LF; + producedMaterial += Candies.TABS + "}" + Candies.LF + + Candies.LF; + producedMaterial += Candies.TABS + + "/** standard set method, argument " + + jbe.datumType + " */" + Candies.LF; + producedMaterial += Candies.TABS + "public void set" + + jbe.nameU + "(" + jbe.datumType + " s) {" + + Candies.LF + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + "this." + + jbe.name + " = s;" + Candies.LF; + producedMaterial += Candies.TABS + "}" + Candies.LF; + } + for (JspBeanElement jbe : jspKit.longPropertyE) { + producedMaterial += Candies.TABS + "/** bean property */" + + Candies.LF; + producedMaterial += Candies.TABS + "private " + + jbe.datumType + " " + jbe.name + ";" + Candies.LF + + Candies.LF; + producedMaterial += Candies.TABS + + "/** standard get method */" + Candies.LF; + producedMaterial += Candies.TABS + "public " + jbe.datumType + + " get" + jbe.nameU + "() {" + Candies.LF + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "return this." + jbe.name + ";" + Candies.LF; + producedMaterial += Candies.TABS + "}" + Candies.LF; + + producedMaterial += Candies.TABS + + "/** standard set method, argument " + + jbe.datumType + " */" + Candies.LF; + producedMaterial += Candies.TABS + "public void set" + + jbe.nameU + "(final " + jbe.datumType + " s) {" + + Candies.LF + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + "this." + + jbe.name + " = s;" + Candies.LF; + producedMaterial += Candies.TABS + "}" + Candies.LF; + } + for (JspBeanElement jbe : jspKit.booleanPropertyE) { + producedMaterial += Candies.TABS + "/** bean property */" + + Candies.LF; + producedMaterial += Candies.TABS + "private " + + jbe.datumType + " " + jbe.name + ";" + Candies.LF + + Candies.LF; + producedMaterial += Candies.TABS + + "/** standard get method */" + Candies.LF; + producedMaterial += Candies.TABS + "public " + jbe.datumType + + " is" + jbe.nameU + "() {" + Candies.LF + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "return this." + jbe.name + ";" + Candies.LF; + producedMaterial += Candies.TABS + "}" + Candies.LF + + Candies.LF; + producedMaterial += Candies.TABS + + "/** standard set method, argument " + + jbe.datumType + " */" + Candies.LF; + producedMaterial += Candies.TABS + "public void set" + + jbe.nameU + "(" + jbe.datumType + " s) {" + + Candies.LF + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + "this." + + jbe.name + " = s;" + Candies.LF; + producedMaterial += Candies.TABS + "}" + Candies.LF; + } + for (JspBeanElement jbe : jspKit.stringPropertyE) { + producedMaterial += Candies.TABS + "/** bean property */" + + Candies.LF; + producedMaterial += Candies.TABS + "private " + + jbe.datumType + " " + jbe.name + ";" + Candies.LF + + Candies.LF; + producedMaterial += Candies.TABS + + "/** standard get method */" + Candies.LF; + producedMaterial += Candies.TABS + "public " + jbe.datumType + + " get" + jbe.nameU + "() {" + Candies.LF + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "return this." + jbe.name + ";" + Candies.LF; + producedMaterial += Candies.TABS + "}" + Candies.LF + + Candies.LF; + producedMaterial += Candies.TABS + + "/** standard set method, argument " + + jbe.datumType + " */" + Candies.LF; + producedMaterial += Candies.TABS + "public void set" + + jbe.nameU + "(" + jbe.datumType + " s) {" + + Candies.LF + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + "this." + + jbe.name + " = s;" + Candies.LF; + producedMaterial += Candies.TABS + "}" + Candies.LF; + } + for (JspBeanElement jbe : jspKit.arrayStringPropertyE) { + producedMaterial += Candies.TABS + "/** bean property */" + + Candies.LF; + producedMaterial += Candies.TABS + "private " + + jbe.datumType + " " + jbe.name + ";" + Candies.LF + + Candies.LF; + producedMaterial += Candies.TABS + + "/** standard get method */" + Candies.LF; + producedMaterial += Candies.TABS + "public " + jbe.datumType + + " get" + jbe.nameU + "() {" + Candies.LF + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "return this." + jbe.name + ";" + Candies.LF; + producedMaterial += Candies.TABS + "}" + Candies.LF + + Candies.LF; + producedMaterial += Candies.TABS + + "/** standard set method, argument " + + jbe.datumType + " */" + Candies.LF; + producedMaterial += Candies.TABS + "public void set" + + jbe.nameU + "(" + jbe.datumType + " s) {" + + Candies.LF + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + "this." + + jbe.name + " = s;" + Candies.LF; + producedMaterial += Candies.TABS + "}" + Candies.LF; + } + for (int j = 0; j < jspKit.controlE.size(); j++) { + JspBeanElement jbe = jspKit.controlE.get(j); + if (!jbe.controlType.equals(Cst.TEXT_BOX)) { + continue; + } + producedMaterial += Candies.LF; + for (ValidConstScrew vc : jbe.validConstE) { + producedMaterial += Candies.TABS + vc.valcons.text + + "("; + if (vc.valparams != null) { + producedMaterial += vc.valparams.text + ", "; + } + producedMaterial += "message = \"{" + vc.valtag.text + + "}\")" + Candies.LF; + } + stringProperty(jbe.name, jbe.nameU); + } + for (int j = 0; j < jspKit.controlE.size(); j++) { + JspBeanElement jbe = jspKit.controlE.get(j); + if (!jbe.controlType.equals(Cst.TEXT_AREA)) { + continue; + } + producedMaterial += Candies.LF; + for (ValidConstScrew vc : jbe.validConstE) { + producedMaterial += Candies.TABS + vc.valcons.text + + "("; + if (vc.valparams != null) { + producedMaterial += vc.valparams.text + ", "; + } + producedMaterial += "message = \"{" + vc.valtag.text + + "}\")" + Candies.LF; + } + stringProperty(jbe.name, jbe.nameU); + } + for (int j = 0; j < jspKit.controlE.size(); j++) { + JspBeanElement jbe = jspKit.controlE.get(j); + if (!jbe.controlType.equals(Cst.LIST_BOX)) { + continue; + } + producedMaterial += Candies.LF; + if (jbe.ftokens != null) { + producedMaterial += Candies.TABS + + "private List arr_" + jbe.name + ";" + + Candies.LF + Candies.LF; + producedMaterial += Candies.TABS + + "public List getArr_" + jbe.name + + "() {" + Candies.LF + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "return arr_" + jbe.name + ";" + Candies.LF; + producedMaterial += Candies.TABS + "}" + Candies.LF; + producedMaterial += Candies.TABS + "public void setArr_" + + jbe.name + "(List arr_" + jbe.name + + ") {" + Candies.LF; + } else if (jbe.hsqln.valutazioneColonne == 1) { + producedMaterial += Candies.TABS + + "private List arr_" + jbe.name + ";" + + Candies.LF + Candies.LF; + producedMaterial += Candies.TABS + + "public List getArr_" + jbe.name + + "() {" + Candies.LF + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "return arr_" + jbe.name + ";" + Candies.LF; + producedMaterial += Candies.TABS + "}" + Candies.LF; + producedMaterial += Candies.TABS + "public void setArr_" + + jbe.name + "(List arr_" + jbe.name + + ") {" + Candies.LF; + } else { + producedMaterial += Candies.TABS + + "private List arr_" + jbe.name + ";" + + Candies.LF + Candies.LF; + producedMaterial += Candies.TABS + + "public List getArr_" + jbe.name + + "() {" + Candies.LF + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "return arr_" + jbe.name + ";" + Candies.LF; + producedMaterial += Candies.TABS + "}" + Candies.LF; + producedMaterial += Candies.TABS + "public void setArr_" + + jbe.name + "(List arr_" + jbe.name + + ") {" + Candies.LF; + } + producedMaterial += Candies.TABS + Candies.TABS + + "this.arr_" + jbe.name + " = arr_" + jbe.name + + ";" + Candies.LF; + producedMaterial += Candies.TABS + "}" + Candies.LF + + Candies.LF; + stringProperty("selected", "Selected"); + } + for (int j = 0; j < jspKit.controlE.size(); j++) { + JspBeanElement jbe = jspKit.controlE.get(j); + if (!jbe.controlType.equals(Cst.CHECK_BOX)) { + continue; + } + producedMaterial += Candies.LF; + for (ValidConstScrew vc : jbe.validConstE) { + producedMaterial += Candies.TABS + vc.valcons.text + + "("; + if (vc.valparams != null) { + producedMaterial += vc.valparams.text + ", "; + } + producedMaterial += "message = \"{" + vc.valtag.text + + "}\")" + Candies.LF; + } + producedMaterial += Candies.TABS + "private boolean " + + jbe.name + ";" + Candies.LF + Candies.LF; + producedMaterial += Candies.TABS + "public boolean is" + + jbe.nameU + "() {" + Candies.LF + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + "return " + + jbe.name + ";" + Candies.LF; + producedMaterial += Candies.TABS + "}" + Candies.LF; + producedMaterial += Candies.TABS + "public void set" + + jbe.nameU + "(boolean " + jbe.name + ") {" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + "this." + + jbe.name + " = " + jbe.name + ";" + Candies.LF; + producedMaterial += Candies.TABS + "}" + Candies.LF; + } + for (int j = 0; j < jspKit.controlE.size(); j++) { + JspBeanElement jbe = jspKit.controlE.get(j); + if (!jbe.controlType.equals(Cst.RADIO_BUTTON)) { + continue; + } + producedMaterial += Candies.LF; + producedMaterial += Candies.TABS + "private Integer " + + jbe.name + ";" + Candies.LF + Candies.LF; + producedMaterial += Candies.TABS + "public Integer get" + + jbe.nameU + "() {" + Candies.LF + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + "return " + + jbe.name + ";" + Candies.LF; + producedMaterial += Candies.TABS + "}" + Candies.LF; + producedMaterial += Candies.TABS + "public void set" + + jbe.nameU + "(Integer " + jbe.name + ") {" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + "this." + + jbe.name + " = " + jbe.name + ";" + Candies.LF; + producedMaterial += Candies.TABS + "}" + Candies.LF; + } + /* abstract method declaration */ + for (Wagon d : jspKit.methodE) { + producedMaterial += Candies.LF + "/** additional method */" + + Candies.LF; + producedMaterial += Candies.TABS + "abstract public void " + + d.text + "("; + producedMaterial += "HttpServletRequest request"; + if (!skill.methodE.get(d.text).upperArguments.trim() + .isEmpty()) { + producedMaterial += ", "; + } + producedMaterial += skill.methodE.get( + d.text).upperArguments; + for (int cJ = 0; cJ < skill.methodE.get(d.text).classE + .size(); cJ++) { + producedMaterial += ", "; + producedMaterial += skill.methodE.get(d.text).classE + .get(cJ) + " other" + cJ; + + } + producedMaterial += ");" + Candies.LF; + } + producedMaterial += Candies.TABS + "/* " + Cst.KNIFE + " */" + + Candies.LF; + producedMaterial += "}" + Candies.LF; + } + + private void stringProperty(final String name, final String nameU) { + producedMaterial += Candies.TABS + "private String " + name + + ";" + Candies.LF + Candies.LF; + producedMaterial += Candies.TABS + "public String get" + nameU + + "() {" + Candies.LF + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + "return " + + name + ";" + Candies.LF; + producedMaterial += Candies.TABS + "}" + Candies.LF; + producedMaterial += Candies.TABS + "public void set" + nameU + + "(String " + name + ") {" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + "this." + name + + " = " + name + ";" + Candies.LF; + producedMaterial += Candies.TABS + "}" + Candies.LF; + } + + /* written only to comply with the abstract class FileComponent */ + @SuppressWarnings("javadoc") + @Override + /** @param markupE the list of markups + * @param skill together with the characteristics of the application + * @param trash file where the deleted files are moved + * @throws ExactException exception specified by a numeric code */ + public void directory(HashMap markupE) + + throws ExactException { + + skill.javaWebModelY = skill.javaWebY + "/model"; + skill.buildDirectory(skill.javaWebModelY); + skill.javaWebModelBodyY = skill.javaWebModelY + "/" + + jspKit.path; + skill.buildDirectory(skill.javaWebModelBodyY); + } +} diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/JspPlainImpl_java.java b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/JspPlainImpl_java.java new file mode 100644 index 0000000..b7e186a --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/JspPlainImpl_java.java @@ -0,0 +1,129 @@ +// +// https://www.ramecera.it/myscrewdriver.html +// e-mail: screwdriver@ramecera.it +// +/* This program and the accompanying materials are made available under + * the terms of the Eclipse Public License v1.0 which accompanies this + * distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html */ +package it.ramecera.screwdriver.component; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.HashMap; +import java.util.List; + +import it.ramecera.salad.everyday.Candies; +import it.ramecera.salad.everyday.ExactException; +import it.ramecera.salad.everyday.Mix; +import it.ramecera.screwdriver.CandyScrew; +import it.ramecera.screwdriver.Cst; +import it.ramecera.screwdriver.Markup; +import it.ramecera.screwdriver.Skill; +import it.ramecera.screwdriver.Train; +import it.ramecera.screwdriver.outfits.TableOutfit; + +/** @author M. Maglioni */ +final public class JspPlainImpl_java extends FileComponent { + + /** @param skill application main data + * @param snippetG name of the file containing the snippet */ + public JspPlainImpl_java(Skill skill, String snippetG) { + super(); + this.skill = skill; + this.snippetG = snippetG; + } + + /** @throws ExactException exception specified by a numeric code */ + @Override + public void synthesis(HashMap markupE, + List trainE, CandyScrew candies) + + throws FileNotFoundException, IOException, ExactException { + + producedMaterial = ""; + producedMaterial += "package " + skill.pckg + ".web.model." + + jspKit.path + ";" + Candies.LF + Candies.LF; + for (int i = 0; i < jspKit.methodE.size(); i++) { + String nomeMetodo = jspKit.methodE.get(i).text; + for (int j = 0; j < skill.methodE.get(nomeMetodo).tableE + .size(); j++) { + TableOutfit t = skill.methodE.get(nomeMetodo).tableE + .get(j); + producedMaterial += "import " + skill.pckg + "." + + t.railLowercase + ".dao.I" + Mix + .uppercaseFirstChar(t.railLowercase) + + t.entityName + "Dao;" + Candies.LF; + producedMaterial += "import " + skill.pckg + "." + + t.railLowercase + ".dao.impl." + Mix + .uppercaseFirstChar(t.railLowercase) + + t.entityName + "Dao;" + Candies.LF; + } + } + producedMaterial += "import org.springframework.stereotype.Component;" + + Candies.LF; + producedMaterial += Candies.LF + + "import javax.servlet.http.HttpServletRequest;" + + Candies.LF; + if (skill.log4jVers != null) { + producedMaterial += Candies.LF + + "import org.apache.log4j.Logger;" + Candies.LF + + Candies.LF; + } + producedMaterial += "@Component" + Candies.LF; + producedMaterial += "public class " + jspKit.nomeFileU + + Cst.PLAINU + "Impl extends " + jspKit.nomeFileU + + Cst.PLAINU + " {" + Candies.LF + Candies.LF; + if (skill.log4jVers != null) { + producedMaterial += Candies.LF + Candies.TABS + + "/** ordinary logger */" + Candies.LF; + producedMaterial += Candies.TABS + + "@SuppressWarnings(\"unused\")" + Candies.LF; + producedMaterial += Candies.TABS + + "private static final Logger logger = Logger.getLogger(" + + Candies.LF + Candies.TABS + Candies.TABS + + Candies.TABS + jspKit.nomeFileU + Cst.PLAINU + + "Impl.class);" + Candies.LF + Candies.LF; + } + for (int i = 0; i < jspKit.methodE.size(); i++) { + String nomeMetodo = jspKit.methodE.get(i).text; + producedMaterial += Candies.TABS + "@Override" + Candies.LF; + producedMaterial += Candies.TABS + "public void " + + nomeMetodo + "("; + producedMaterial += "HttpServletRequest request"; + if (!skill.methodE.get(nomeMetodo).upperArguments.trim() + .isEmpty()) { + producedMaterial += ", "; + } + producedMaterial += skill.methodE.get( + nomeMetodo).upperArguments; + for (int cJ = 0; cJ < skill.methodE.get(nomeMetodo).classE + .size(); cJ++) { + producedMaterial += ", "; + producedMaterial += skill.methodE.get(nomeMetodo).classE + .get(cJ) + " other" + cJ; + } + producedMaterial += ") {" + Candies.LF + Candies.LF; + if (skill.methodE.get(nomeMetodo).source != null) { + producedMaterial += skill.methodE.get(nomeMetodo).source + + Candies.LF; + } + producedMaterial += Candies.TAB + "}" + Candies.LF + + Candies.LF; + } + producedMaterial += "}" + Candies.LF; + } + + /* written only to comply with the abstract class FileComponent */ + @SuppressWarnings("javadoc") + @Override + /** @param markupE the list of markups + * @param skill together with the characteristics of the application + * @param trash file where the deleted files are moved + * @throws ExactException exception specified by a numeric code */ + public void directory(HashMap markupE) + + throws ExactException { + + } +} diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/JspPlain_java.java b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/JspPlain_java.java new file mode 100644 index 0000000..af24476 --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/JspPlain_java.java @@ -0,0 +1,353 @@ +// +// https://www.ramecera.it/myscrewdriver.html +// e-mail: screwdriver@ramecera.it +// +/* This program and the accompanying materials are made available under + * the terms of the Eclipse Public License v1.0 which accompanies this + * distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html */ +package it.ramecera.screwdriver.component; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.HashMap; +import java.util.List; + +import it.ramecera.salad.everyday.Candies; +import it.ramecera.salad.everyday.ExactException; +import it.ramecera.salad.everyday.Mix; +import it.ramecera.screwdriver.CandyScrew; +import it.ramecera.screwdriver.Cst; +import it.ramecera.screwdriver.Markup; +import it.ramecera.screwdriver.Skill; +import it.ramecera.screwdriver.Train; +import it.ramecera.screwdriver.Wagon; +import it.ramecera.screwdriver.outfits.JspBeanElement; + +/** @author M. Maglioni */ +final public class JspPlain_java extends FileComponent { + + /** @param skill application main data + * @param snippetG name of the file containing the snippet */ + public JspPlain_java(Skill skill, String snippetG) { + super(); + this.skill = skill; + this.snippetG = snippetG; + } + + /** @throws ExactException exception specified by a numeric code */ + @Override + public void synthesis(HashMap markupE, + List trainE, CandyScrew candies) + + throws FileNotFoundException, IOException, ExactException { + + producedMaterial = ""; + producedMaterial += "package " + skill.pckg + ".web.model." + + jspKit.path + ";" + Candies.LF + Candies.LF; + producedMaterial += "import java.text.DecimalFormat;" + + Candies.LF; + producedMaterial += "import javax.servlet.http.HttpServletRequest;" + + Candies.LF; + producedMaterial += "import " + skill.pckg + + ".web.model.GenericModel;" + Candies.LF; + if (jspKit.arrayStringPropertyE.size() > 0) { + producedMaterial += "import java.util.ArrayList;" + + Candies.LF; + } + for (Train t : markupE.get("hdefrail").recurrenceE) { + producedMaterial += "import " + skill.networkDomain + + ".screwdriver." + t.wagonE.get("hjndi").text + .toLowerCase() + "." + t.wagonE.get( + "hdbschema").text + ".*;" + + Candies.LF; + } + if (jspKit.methodE.size() > 0) { + producedMaterial += "import org.springframework.dao." + + "DataAccessException;" + Candies.LF; + } + if (jspKit.methodE.size() > 0) { + for (Train t : markupE.get("hdefrail").recurrenceE) { + producedMaterial += "import " + skill.networkDomain + + "." + skill.applicationNameLower + "." + + Cst.RAIL + t.locomotor.text + ".dao.*;" + + Candies.LF; + } + } + if (skill.log4jVers != null) { + producedMaterial += "import org.apache.log4j.Logger;" + + Candies.LF + Candies.LF; + } + if (jspKit.methodE.size() > 0) { + producedMaterial += "abstract "; + } + producedMaterial += "public class " + jspKit.nomeFileU + + Cst.PLAINU + " extends GenericModel {" + Candies.LF + + Candies.LF; + if (jspKit.stringPropertyE.size() > 0) { + for (JspBeanElement x : jspKit.stringPropertyE) { + producedMaterial += Candies.TABS + + "/** proprietà del bean */" + Candies.LF; + producedMaterial += Candies.TABS + "private " + + x.datumType + " " + x.name + ";" + Candies.LF; + } + } + if (jspKit.arrayStringPropertyE.size() > 0) { + for (JspBeanElement x : jspKit.arrayStringPropertyE) { + producedMaterial += Candies.TABS + + "/** proprietà del bean */" + Candies.LF; + producedMaterial += Candies.TABS + "private " + + x.datumType + " " + x.name + ";" + Candies.LF; + } + } + if (jspKit.integerPropertyE.size() > 0) { + for (JspBeanElement x : jspKit.integerPropertyE) { + producedMaterial += Candies.TABS + + "/** proprietà del bean */" + Candies.LF; + producedMaterial += Candies.TABS + "private " + + x.datumType + " " + x.name + ";" + Candies.LF; + } + } + if (jspKit.longPropertyE.size() > 0) { + for (JspBeanElement x : jspKit.longPropertyE) { + producedMaterial += Candies.TABS + + "/** proprietà del bean */" + Candies.LF; + producedMaterial += Candies.TABS + "private " + + x.datumType + " " + x.name + ";" + Candies.LF; + } + } + if (jspKit.booleanPropertyE.size() > 0) { + for (JspBeanElement x : jspKit.booleanPropertyE) { + producedMaterial += Candies.TABS + + "/** proprietà del bean */" + Candies.LF; + producedMaterial += Candies.TABS + "private " + + x.datumType + " " + x.name + ";" + Candies.LF; + } + } + if (skill.log4jVers != null) { + + producedMaterial += Candies.LF + Candies.TABS + + "/** ordinary logger */" + Candies.LF; + producedMaterial += Candies.TABS + + "@SuppressWarnings(\"unused\")" + Candies.LF; + producedMaterial += Candies.TABS + + "private static final Logger logger = Logger.getLogger(" + + Candies.LF + Candies.TABS + Candies.TABS + + Candies.TABS + Mix.uppercaseFirstChar( + jspKit.fileName) + Cst.PLAINU + ".class);" + + Candies.LF + Candies.LF; + } + for (JspBeanElement jbe : jspKit.stringPropertyE) { + producedMaterial += Candies.TABS + + "/** standard get method */" + Candies.LF; + producedMaterial += Candies.TABS + "public " + jbe.datumType + + " get" + jbe.nameU + "() {" + Candies.LF + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "return this." + jbe.name + ";" + Candies.LF; + producedMaterial += Candies.TABS + "}" + Candies.LF + + Candies.LF; + + producedMaterial += Candies.TABS + + "/** standard set method, argument " + + jbe.datumType + " */" + Candies.LF; + producedMaterial += Candies.TABS + "public void set" + + jbe.nameU + "(" + jbe.datumType + " s) {" + + Candies.LF + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + "this." + + jbe.name + " = s;" + Candies.LF; + producedMaterial += Candies.TABS + "}" + Candies.LF + + Candies.LF; + + producedMaterial += Candies.TABS + + "/** standard set method, argument Integer */" + + Candies.LF; + producedMaterial += Candies.TABS + "public void set" + + jbe.nameU + "(final Integer i) {" + Candies.LF + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + "this." + + jbe.name + " = " + jbe.datumType + ".valueOf(i);" + + Candies.LF; + producedMaterial += Candies.TABS + "}" + Candies.LF + + Candies.LF; + + producedMaterial += Candies.TABS + + "/** set formattato, argomento Integer */" + + Candies.LF; + producedMaterial += Candies.TABS + "public void set" + + jbe.nameU + "(final Integer i, final String f) {" + + Candies.LF + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + "this." + + jbe.name + " = new DecimalFormat(f).format(i);" + + Candies.LF; + producedMaterial += Candies.TABS + "}" + Candies.LF + + Candies.LF; + + producedMaterial += Candies.TABS + + "/** standard set method, argument Short */" + + Candies.LF; + producedMaterial += Candies.TABS + "public void set" + + jbe.nameU + "(final Short i) {" + Candies.LF + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + "this." + + jbe.name + " = " + jbe.datumType + ".valueOf(i);" + + Candies.LF + Candies.LF; + producedMaterial += Candies.TABS + "}" + Candies.LF + + Candies.LF; + + producedMaterial += Candies.TABS + + "/** set formattato, argomento Short */" + + Candies.LF; + producedMaterial += Candies.TABS + "public void set" + + jbe.nameU + "(final Short i, final String f) {" + + Candies.LF + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + "this." + + jbe.name + " = new DecimalFormat(f).format(i);" + + Candies.LF; + producedMaterial += Candies.TABS + "}" + Candies.LF + + Candies.LF; + + producedMaterial += Candies.TABS + + "/** set formattato, argomento Long */" + + Candies.LF; + producedMaterial += Candies.TABS + "public void set" + + jbe.nameU + "(final Long i, final String f) {" + + Candies.LF + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + "this." + + jbe.name + " = new DecimalFormat(f).format(i);" + + Candies.LF; + producedMaterial += Candies.TABS + "}" + Candies.LF + + Candies.LF; + } + for (JspBeanElement jbe : jspKit.integerPropertyE) { + producedMaterial += Candies.TABS + + "/** standard get method */" + Candies.LF; + producedMaterial += Candies.TABS + "public " + jbe.datumType + + " get" + jbe.nameU + "() {" + Candies.LF + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "return this." + jbe.name + ";" + Candies.LF; + producedMaterial += Candies.TABS + "}" + Candies.LF + + Candies.LF; + + producedMaterial += Candies.TABS + + "/** standard set method, argument " + + jbe.datumType + " */" + Candies.LF; + producedMaterial += Candies.TABS + "public void set" + + jbe.nameU + "(" + jbe.datumType + " s) {" + + Candies.LF + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + "this." + + jbe.name + " = s;" + Candies.LF; + producedMaterial += Candies.TABS + "}" + Candies.LF + + Candies.LF; + } + for (JspBeanElement jbe : jspKit.longPropertyE) { + producedMaterial += Candies.TABS + + "/** standard get method */" + Candies.LF; + producedMaterial += Candies.TABS + "public " + jbe.datumType + + " get" + jbe.nameU + "() {" + Candies.LF + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "return this." + jbe.name + ";" + Candies.LF; + producedMaterial += Candies.TABS + "}" + Candies.LF + + Candies.LF; + + producedMaterial += Candies.TABS + + "/** standard set method, argument " + + jbe.datumType + " */" + Candies.LF; + producedMaterial += Candies.TABS + "public void set" + + jbe.nameU + "(final " + jbe.datumType + " s) {" + + Candies.LF + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + "this." + + jbe.name + " = s;" + Candies.LF; + producedMaterial += Candies.TABS + "}" + Candies.LF + + Candies.LF; + } + for (JspBeanElement jbe : jspKit.booleanPropertyE) { + producedMaterial += Candies.TABS + + "/** standard get method */" + Candies.LF; + producedMaterial += Candies.TABS + "public " + jbe.datumType + + " is" + jbe.nameU + "() {" + Candies.LF + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "return this." + jbe.name + ";" + Candies.LF; + producedMaterial += Candies.TABS + "}" + Candies.LF + + Candies.LF; + + producedMaterial += Candies.TABS + + "/** standard set method, argument " + + jbe.datumType + " */" + Candies.LF; + producedMaterial += Candies.TABS + "public void set" + + jbe.nameU + "(" + jbe.datumType + " s) {" + + Candies.LF + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + "this." + + jbe.name + " = s;" + Candies.LF; + producedMaterial += Candies.TABS + "}" + Candies.LF + + Candies.LF; + } + for (JspBeanElement jbe : jspKit.arrayStringPropertyE) { + producedMaterial += Candies.TABS + + "/** standard get method */" + Candies.LF; + producedMaterial += Candies.TABS + "public " + jbe.datumType + + " get" + jbe.nameU + "() {" + Candies.LF + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "return this." + jbe.name + ";" + Candies.LF; + producedMaterial += Candies.TABS + "}" + Candies.LF + + Candies.LF; + + producedMaterial += Candies.TABS + + "/** standard set method, argument " + + jbe.datumType + " */" + Candies.LF; + producedMaterial += Candies.TABS + "public void set" + + jbe.nameU + "(" + jbe.datumType + " s) {" + + Candies.LF + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + "this." + + jbe.name + " = s;" + Candies.LF; + producedMaterial += Candies.TABS + "}" + Candies.LF + + Candies.LF; + } + /* abstract method declaration */ + for (Wagon d : jspKit.methodE) { + producedMaterial += Candies.LF + "/** additional method */" + + Candies.LF; + producedMaterial += Candies.TABS + "abstract public void " + + d.text + "("; + producedMaterial += "HttpServletRequest request"; + if (!skill.methodE.get(d.text).upperArguments.trim() + .isEmpty()) { + producedMaterial += ", "; + } + producedMaterial += skill.methodE.get( + d.text).upperArguments; + for (int cJ = 0; cJ < skill.methodE.get(d.text).classE + .size(); cJ++) { + producedMaterial += ", "; + producedMaterial += skill.methodE.get(d.text).classE + .get(cJ) + " other" + cJ; + } + producedMaterial += ");" + Candies.LF; + } + producedMaterial += Candies.TABS + "/* " + Cst.KNIFE + " */" + + Candies.LF; + producedMaterial += "}" + Candies.LF; + } + + /* written only to comply with the abstract class FileComponent */ + @SuppressWarnings("javadoc") + @Override + /** @param markupE the list of markups + * @param skill together with the characteristics of the application + * @param trash file where the deleted files are moved + * @throws ExactException exception specified by a numeric code */ + public void directory(HashMap markupE) + + throws ExactException { + + skill.javaWebModelY = skill.javaWebY + "/model"; + skill.buildDirectory(skill.javaWebModelY); + skill.javaWebModelBodyY = skill.javaWebModelY + "/" + + jspKit.path; + skill.buildDirectory(skill.javaWebModelBodyY); + } +} \ No newline at end of file diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/Navigation_jsp.java b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/Navigation_jsp.java new file mode 100644 index 0000000..f672779 --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/Navigation_jsp.java @@ -0,0 +1,214 @@ +// +// https://www.ramecera.it/myscrewdriver.html +// e-mail: screwdriver@ramecera.it +// +/* This program and the accompanying materials are made available under + * the terms of the Eclipse Public License v1.0 which accompanies this + * distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html */ +package it.ramecera.screwdriver.component; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.HashMap; +import java.util.List; + +import it.ramecera.salad.everyday.Candies; +import it.ramecera.salad.everyday.ExactException; +import it.ramecera.screwdriver.CandyScrew; +import it.ramecera.screwdriver.Markup; +import it.ramecera.screwdriver.Skill; +import it.ramecera.screwdriver.Train; + +/** @author M. Maglioni */ +final public class Navigation_jsp extends FileComponent { + + /** @param skill application main data + * @param snippetG name of the file containing the snippet */ + public Navigation_jsp(Skill skill, String snippetG) { + super(); + this.skill = skill; + this.snippetG = snippetG; + } + + /** @throws ExactException exception specified by a numeric code */ + @Override + public void synthesis(HashMap markupE, + List trainE, CandyScrew candyScrew) + + throws FileNotFoundException, IOException, ExactException { + + producedMaterial = ""; + producedMaterial += "<%@ page language=\"java\" " + + "pageEncoding=\"UTF-8\" contentType=\"text/html; " + + "charset=UTF-8\" %>" + Candies.LF; + if (skill.springSecurity) { + producedMaterial += "<%@ taglib uri=\"http://www.springframework.org" + + "/security/tags\" prefix=\"sec\"%>" + Candies.LF; + } + producedMaterial += "<%@ taglib prefix=\"c\" uri=\"http://java.sun." + + "com/jsp/jstl/core\" %>" + Candies.LF; + producedMaterial += Candies.TABS + + "
" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "
" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + Candies.TABS + + "
" + Candies.LF; + + /* in the couples array, at least the first couple is needed, + * that is the brand or home */ + if (menuKit.clicE.size() == 0) { + ExactException ee = new ExactException( + "The individual elements of the menu description" + + " are not defined (blabel and burl markups in pair)."); + ee.code = 1100; + ee.datum = ee.getMessage(); + ee.className = this.getClass().getName(); + throw ee; + } + producedMaterial += Candies.TABS + Candies.TABS + Candies.TABS + + Candies.TABS + "" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + Candies.TABS + + Candies.TABS + + "" + + menuKit.clicE.get(0)[0] + "" + Candies.LF; + + producedMaterial += Candies.TABS + Candies.TABS + Candies.TABS + + Candies.TABS + "
" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + "
    " + + Candies.LF; + + /* ordinary couples */ + for (int i = 1; i < menuKit.clicE.size(); i++) { + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + Candies.TABS + + Candies.TABS + "" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + Candies.TABS + + Candies.TABS + "
  • " + menuKit.clicE + .get(i)[0] + "
  • " + Candies.LF; + } + producedMaterial += Candies.TABS + Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + "
" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + Candies.TABS + + Candies.TABS + "
" + Candies.LF; + if (skill.hasUseridPassword) { + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + + "
" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + Candies.TABS + + "
    " + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + Candies.TABS + + Candies.TABS + + "" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + Candies.TABS + + Candies.TABS + "" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + + "" + Candies.LF; + if (skill.authenticationMode.equals("trivial")) { + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + Candies.TABS + + "
  • Welcome \"\"
  • " + + Candies.LF; + } else { + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + Candies.TABS + + "
  • Welcome " + + "
  • " + + Candies.LF; + } + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + Candies.TABS + + "" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + Candies.TABS + + "
  • Logout
  • " + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + "
    " + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + "" + + Candies.LF; + if (skill.signup) { + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + Candies.TABS + + "" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + Candies.TABS + + "
  • Signup
  • " + + Candies.LF; + } + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + Candies.TABS + + "" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + Candies.TABS + + "
  • Login
  • " + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + "
    " + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + Candies.TABS + + Candies.TABS + "
    " + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + Candies.TABS + + "
" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + "
" + + Candies.LF; + } + producedMaterial += Candies.TABS + Candies.TABS + Candies.TABS + + "
" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + "
" + + Candies.LF; + producedMaterial += Candies.TABS + "
" + Candies.LF; + producedMaterial += Candies.TABS + + "
 
" + Candies.LF; + + } + + /* written only to comply with the abstract class FileComponent */ + @SuppressWarnings("javadoc") + @Override + /** @param markupE the list of markups + * @param skill together with the characteristics of the application + * @param trash file where the deleted files are moved + * @throws ExactException exception specified by a numeric code */ + public void directory(HashMap markupE) + + throws ExactException { + + } +} diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/Orm_xml.java b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/Orm_xml.java new file mode 100644 index 0000000..5895cdb --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/Orm_xml.java @@ -0,0 +1,315 @@ +// +// https://www.ramecera.it/myscrewdriver.html +// e-mail: screwdriver@ramecera.it +// +/* This program and the accompanying materials are made available under + * the terms of the Eclipse Public License v1.0 which accompanies this + * distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html */ +package it.ramecera.screwdriver.component; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.HashMap; +import java.util.List; + +import it.ramecera.salad.everyday.Candies; +import it.ramecera.salad.everyday.ExactException; +import it.ramecera.salad.everyday.Mix; +import it.ramecera.salad.everyday.Strings; +import it.ramecera.salad.file.Equipment; +import it.ramecera.screwdriver.CandyScrew; +import it.ramecera.screwdriver.Cst; +import it.ramecera.screwdriver.Markup; +import it.ramecera.screwdriver.Skill; +import it.ramecera.screwdriver.Train; + +/** last update date: 2020-04-09 + * + * @author M. Maglioni */ +final public class Orm_xml extends FileComponent { + + /** @param skill application main data + * @param snippetG name of the file containing the snippet */ + public Orm_xml(Skill skill, String snippetG) { + super(); + this.skill = skill; + this.snippetG = snippetG; + } + + /** @throws ExactException exception specified by a numeric code */ + @Override + public void synthesis(HashMap markupE, + List trainE, CandyScrew candyScrew) + + throws FileNotFoundException, IOException, ExactException { + + skill.springPropertiesG = skill.candies.snippetsYS + snippetG; + Train f = markupE.get("hdefrail").recurrenceE.get(skill.railK); + producedMaterial = Equipment.oneString(skill.springPropertiesG) + + Candies.LF; + producedMaterial += Candies.TABS + "" + + Candies.LF; + if (skill.applicationServer.toLowerCase().startsWith( + "jboss eap 6.4")) { + producedMaterial += Candies.TABS + Candies.TABS + + "" + + Candies.LF; + } else { + producedMaterial += Candies.TABS + Candies.TABS + + "" + + Candies.LF; + } + String g = Mix.dress_C(skill.mainResources) + + "config.properties"; + String configPropertiesS = Equipment.oneString(g); + if (configPropertiesS.indexOf(skill.jndi.toLowerCase()) == -1) { + configPropertiesS = configPropertiesS.replaceAll("#", "# "); + configPropertiesS = Mix.compactingSpaces_A( + configPropertiesS); + if (configPropertiesS.indexOf(Cst.KNIFE) > -1) { + configPropertiesS.replaceFirst(Cst.KNIFE, Cst.UPPER + + Candies.LF + "# " + Cst.LOWER); + } + if (configPropertiesS.indexOf("# " + Cst.LOWER) > -1 + & skill.dbms.equals("Postgres")) { + configPropertiesS = Strings.replaceFirst( + configPropertiesS, "# " + Cst.LOWER, skill.jndi + .toLowerCase() + + ".jndiname=jboss/datasources/" + + skill.jndi + Candies.LF + "# " + + Cst.LOWER); + } else if (configPropertiesS.indexOf("# " + + Cst.LOWER) > -1) { + configPropertiesS = Strings.replaceFirst( + configPropertiesS, "# " + Cst.LOWER, skill.jndi + .toLowerCase() + ".jndiname=" + + skill.jndi + Candies.LF + "# " + + Cst.LOWER); + } + Equipment.scriviFileDaStringa(new File(g), + configPropertiesS); + } + producedMaterial += Candies.TABS + "" + Candies.LF; + if (skill.jpaVersion == 1) { + producedMaterial += Candies.TABS + "" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + "" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + "hibernate.default_schema=" + + skill.dbSchema + Candies.LF; + if (f.wagonE.get("hdbms").text.equalsIgnoreCase( + "postgres")) { + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + + "hibernate.dialect=org.hibernate.dialect." + + "PostgreSQLDialect" + Candies.LF; + } else { + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + + "hibernate.dialect=org.hibernate.dialect." + + f.wagonE.get("hdbms").text + "Dialect" + + Candies.LF; + } + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + + "hibernate.cache.use_second_level_cache=false" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + + "hibernate.cache.use_query_cache=false" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + + "hibernate.cache.provider_class=org.hibernate.cache.NoCacheProvider" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + "hibernate.show_sql=false" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + "hibernate.format_sql=false" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + + "hibernate.query.substitutions true=1, false=0" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + "" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "" + Candies.LF; + producedMaterial += Candies.TABS + "" + Candies.LF; + + producedMaterial += Candies.TABS + "" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + "" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + "true" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "" + Candies.LF; + producedMaterial += Candies.TABS + "" + Candies.LF; + + producedMaterial += Candies.TABS + "" + Candies.LF; + if (skill.springVersion1m < 4) { + producedMaterial += Candies.TABS + Candies.TABS + + "" + Candies.LF; + } else { + producedMaterial += Candies.TABS + Candies.TABS + + "" + Candies.LF; + } + producedMaterial += Candies.TABS + "" + Candies.LF; + } else { + producedMaterial += Candies.TABS + "" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + "" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + + "" + + skill.dbSchema + "" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + + "" + "false" + + "" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + + "" + "false" + + "" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + + "" + + "false" + "" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + + "" + + "false" + "" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + + "" + + "org.hibernate.cache.NoCacheProvider" + "" + + Candies.LF; + if (f.wagonE.get("hdbms").text.equalsIgnoreCase( + "postgres")) { + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + + "org.hibernate.dialect." + + "PostgreSQLDialect" + "" + Candies.LF; + } else { + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + + "org.hibernate.dialect." + + f.wagonE.get("hdbms").text + "Dialect" + + "" + Candies.LF; + + } + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + "" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + + "" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "" + Candies.LF; + producedMaterial += Candies.TABS + "" + Candies.LF; + + producedMaterial += Candies.TABS + "" + Candies.LF; + } + producedMaterial += Candies.TABS + + "" + + Candies.LF; + producedMaterial += Candies.TABS + + "" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "" + + Candies.LF; + producedMaterial += Candies.TABS + "" + + Candies.LF; + producedMaterial += Candies.TABS + + "" + + Candies.LF; + producedMaterial += ""; + } + + /* written only to comply with the abstract class FileComponent */ + @SuppressWarnings("javadoc") + @Override + /** @param markupE the list of markups + * @param skill together with the characteristics of the application + * @param trash file where the deleted files are moved + * @throws ExactException exception specified by a numeric code */ + public void directory(HashMap markupE) + + throws ExactException { + + } +} diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/Pom_properties.java b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/Pom_properties.java new file mode 100644 index 0000000..1c376df --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/Pom_properties.java @@ -0,0 +1,71 @@ +// +// https://www.ramecera.it/myscrewdriver.html +// e-mail: screwdriver@ramecera.it +// +/* This program and the accompanying materials are made available under + * the terms of the Eclipse Public License v1.0 which accompanies this + * distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html */ +package it.ramecera.screwdriver.component; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.HashMap; +import java.util.List; + +import it.ramecera.salad.everyday.Candies; +import it.ramecera.salad.everyday.ExactException; +import it.ramecera.screwdriver.CandyScrew; +import it.ramecera.screwdriver.Markup; +import it.ramecera.screwdriver.Skill; +import it.ramecera.screwdriver.Train; + +/** + *

+ * Class for producing the web.xml file. + *

+ * + * @author M. Maglioni + *

+ * Company: Rameceraâ„¢
+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09
+ *

+ */ +final public class Pom_properties extends FileComponent { + + /** @param skill together with the descriptive data of the + * @param snippetG application */ + public Pom_properties(Skill skill, String snippetG) { + super(); + this.skill = skill; + this.snippetG = snippetG; + } + + /** sysnthesis */ + @Override + public void synthesis(HashMap markupE, + List trainE, CandyScrew candyScrew) + + throws FileNotFoundException, IOException, ExactException { + + producedMaterial = ""; + if (skill.mavenCompiler) { + producedMaterial += "pom.java.version="; + producedMaterial += skill.mavenCompilerVersion + Candies.LF; + } + } + + /* written only to comply with the abstract class FileComponent */ + @SuppressWarnings("javadoc") + @Override + /** @param markupE the list of markups + * @param skill together with the characteristics of the application + * @param trash file where the deleted files are moved + * @throws ExactException exception specified by a numeric code */ + public void directory(HashMap markupE) + + throws ExactException { + + } +} diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/Pom_xml.java b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/Pom_xml.java new file mode 100644 index 0000000..f80e8ee --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/Pom_xml.java @@ -0,0 +1,413 @@ +// +// https://www.ramecera.it/myscrewdriver.html +// e-mail: screwdriver@ramecera.it +// +/* This program and the accompanying materials are made available under + * the terms of the Eclipse Public License v1.0 which accompanies this + * distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html */ +package it.ramecera.screwdriver.component; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.HashMap; +import java.util.List; + +import it.ramecera.salad.everyday.Candies; +import it.ramecera.salad.everyday.ExactException; +import it.ramecera.salad.file.Equipment; +import it.ramecera.screwdriver.CandyScrew; +import it.ramecera.screwdriver.Cst; +import it.ramecera.screwdriver.Markup; +import it.ramecera.screwdriver.Skill; +import it.ramecera.screwdriver.Train; + +/** + *

+ * Class for the production of the pom.xml file. + *

+ * + * @author M. Maglioni + *

+ * Company: Rameceraâ„¢
+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09
+ *

+ */ +final public class Pom_xml extends FileComponent { + + /** @param skill application main data + * @param snippetG name of the file containing the snippet */ + public Pom_xml(Skill skill, String snippetG) { + super(); + this.skill = skill; + this.snippetG = snippetG; + } + + /** @param markupE the list of markups + * @param trainE the list of trains + * @param candyScrew the list of properties + * @throws IOException standard exception + * @throws FileNotFoundException standard exception + * @throws ExactException standard exception */ + public void synthesis(HashMap markupE, + List trainE, CandyScrew candyScrew) + + throws FileNotFoundException, IOException, ExactException { + + producedMaterial = "" + + Candies.LF; + producedMaterial += ""; + producedMaterial = producedMaterial.replaceAll(Candies.SEGNO_A, + skill.mavenModel) + Candies.LF; + producedMaterial += Candies.TABS + "" + + skill.mavenModel + "" + Candies.LF; + producedMaterial += Candies.TABS + "" + + skill.mavenGroupId + "" + Candies.LF; + producedMaterial += Candies.TABS + "" + + skill.applicationNameLower + "" + + Candies.LF; + producedMaterial += Candies.TABS + "" + + skill.mavenVersion + "" + Candies.LF; + producedMaterial += Candies.TABS + "" + + skill.mavenPackage + "" + Candies.LF; + producedMaterial += Candies.TABS + "" + + skill.applicationNameLower + "" + Candies.LF; + producedMaterial += Candies.TABS + "" + Candies.LF; + if (skill.spring) { + producedMaterial += Candies.TABS + Candies.TABS + + "" + skill.springVersion + + "" + Candies.LF; + } + if (skill.springSecurity) { + producedMaterial += Candies.TABS + Candies.TABS + + "" + + skill.springSecurityVersion + + "" + + Candies.LF; + } + if (skill.tiles) { + producedMaterial += Candies.TABS + Candies.TABS + + "" + skill.tilesVersion + + "" + Candies.LF; + } + // if (skill.mavenCompiler) { + // materialProduct + = Candies.TABS + Candies.TABS + // + "" + // + skill.mavenCompilerVersion + // + "" + Candies.LF; + // materialProduct + = Candies.TABS + Candies.TABS + // + "" + // + skill.mavenCompilerVersion + // + "" + Candies.LF; + // } + producedMaterial += Candies.TABS + Candies.TABS + + "" + + skill.charsetSenzaTrattino + + "" + Candies.LF; + if (skill.pomProperties) { + skill.pomPropertiesG = skill.candies.snippetsYS + "pompr" + + "_" + markupE.get("pompr").recurrenceE.get( + 0).locomotor.substance + ".txt"; + producedMaterial += Equipment.oneString( + skill.pomPropertiesG) + Candies.LF; + } + producedMaterial += Candies.TABS + Candies.TABS + + "" + + skill.applicationNameLower + + "" + Candies.LF; + producedMaterial += Candies.TABS + "" + Candies.LF; + if (skill.mavenBuild) { + producedMaterial += Equipment.oneString( + skill.candies.snippetsYS + "pom_build.txt") + + Candies.LF; + } + producedMaterial += Candies.TABS + "" + + Candies.LF; + producedMaterial += Candies.TABS + "" + + Candies.LF; + if (skill.spring) { + producedMaterial += Equipment.oneString( + skill.candies.snippetsYS + "depen_spring_" + + skill.springVersion + ".txt") + + Candies.LF; + } + if (skill.springSecurity) { + producedMaterial += Equipment.oneString( + skill.candies.snippetsYS + "depen_secu_" + + skill.springSecurityReductVersion + + ".txt") + Candies.LF; + } + if (skill.tiles) { + producedMaterial += Equipment.oneString( + skill.candies.snippetsYS + "depen_tiles.txt") + + Candies.LF; + } + if (skill.antiSamy) { + producedMaterial += Equipment.oneString( + skill.candies.snippetsYS + "antisamyDepen.txt") + + Candies.LF; + } + if (skill.ldap) { + producedMaterial += Equipment.oneString( + skill.candies.snippetsYS + "depen_apache_ldap.txt") + + Candies.LF; + } + if (skill.captcha) { + producedMaterial += Equipment.oneString( + skill.candies.snippetsYS + "depen_captcha_" + + skill.captchaVersion + ".txt") + + Candies.LF; + } + if (skill.webFlow) { + producedMaterial += Equipment.oneString( + skill.candies.snippetsYS + "depen_webflow_" + + skill.webflowVersion + ".txt") + + Candies.LF; + } + if (skill.jpaVersion == 2) { + if (skill.jeeVersion == null) { + skill.jeeVersion = "6.0"; + } + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + "" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + + "javax" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + + "javaee-api" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + "" + + skill.jeeVersion + "" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + + "provided" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + "" + Candies.LF + + Candies.LF; + + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + "" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + + "javax.persistence" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + + "persistence-api" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + "" + + "1.0.2" + "" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + "" + Candies.LF + + Candies.LF; + + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + "" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + + "antlr" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + + "antlr" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + "" + + "2.7.7" + "" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + "" + Candies.LF + + Candies.LF; + } + if (skill.dbSchema != null + & skill.versioneArtifactJPA != null) { + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + "" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + "" + + skill.networkDomain + ".ict" + + Candies.LF;// v1.11.1 d2020-04-09 + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + "" + + skill.jndi.toLowerCase() + "-" + skill.dbSchema + + "" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + "" + + skill.versioneArtifactJPA + "" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + "" + Candies.LF + + Candies.LF; + } + if (skill.log4jVers != null && skill.log4jVers.startsWith( + "1")) { + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + "" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + + "log4j" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + + "log4j" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + "" + + skill.log4jVers + "" + Candies.LF; + if (!skill.applicationServer.startsWith("Tomcat")) { + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + + "provided" + Candies.LF; + } + /* log4j is not necessarily contained in the app server */ + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + "" + Candies.LF + + Candies.LF; + } else if (skill.log4jVers != null && skill.log4jVers + .startsWith("2")) { + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + "" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + + "org.apache.logging.log4j" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + + "log4j-api" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + "" + + skill.log4jVers + "" + Candies.LF; + /* log4j is not necessarily contained in the app server */ + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + "" + Candies.LF + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + "" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + + "org.apache.logging.log4j" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + + "log4j-core" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + "" + + skill.log4jVers + "" + Candies.LF; + /* log4j is not necessarily contained in the app server */ + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + "" + Candies.LF + + Candies.LF; + } + if (skill.quartzVers != null) { + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + "" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + + "org.quartz-scheduler" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + + "quartz" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + "" + + skill.quartzVers + "" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + "" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + Candies.TABS + + "" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + Candies.TABS + + Candies.TABS + "org.slf4j" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + Candies.TABS + + Candies.TABS + + "slf4j-api" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + Candies.TABS + + "" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + "" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + "" + Candies.LF + + Candies.LF; + } + if (skill.dependencies) { + producedMaterial += Equipment.oneString(skill.dependenciesG) + + Candies.LF; + } + if (skill.hibernate) { + producedMaterial += Equipment.oneString(skill.depenHiberG) + + Candies.LF; + } + if (skill.jackson) { + producedMaterial += Equipment.oneString(skill.depenJacksonG) + + Candies.LF; + } + if (skill.hiberValid) { + producedMaterial += Equipment.oneString(skill.depenHValidG) + + Candies.LF; + } + if (skill.springValid) { + producedMaterial += Equipment.oneString( + skill.depenValidatorG) + Candies.LF; + } + producedMaterial += Candies.TABS + "" + + Candies.LF; + producedMaterial += Candies.TABS + "" + + Candies.LF; + producedMaterial += ""; + + /* WE COOK EVERYTHING */ + /* x2b is the + sign */ + producedMaterial = producedMaterial.replaceFirst( + "\\x2bfinal.name\\x2b", skill.applicationNameLower); + if (skill.mavenCompilerPlugin) { + producedMaterial = producedMaterial.replaceFirst( + "\\x2bmaven.compiler.plugin\\x2b", + skill.mavenCompilerPluginVersion); + } + if (skill.mavenWarPlugin) { + producedMaterial = producedMaterial.replaceFirst( + "\\x2bmaven.war.plugin\\x2b", + skill.mavenWarPluginVersion); + } + if (skill.mavenCleanPlugin) { + producedMaterial = producedMaterial.replaceFirst( + "\\x2bmaven.clean.plugin\\x2b", + skill.mavenCleanPluginVersion); + } + producedMaterial = producedMaterial.replaceAll( + "\\x2bhvalid\\x2b", skill.hiberValidVersion); + producedMaterial = producedMaterial.replaceAll( + "\\x2bjackson\\x2b", skill.jacksonVersion); + } + + /* written only to comply with the abstract class FileComponent */ + @SuppressWarnings("javadoc") + @Override + /** @param markupE the list of markups + * @param skill together with the characteristics of the application + * @param trash file where the deleted files are moved + * @throws ExactException exception specified by a numeric code */ + public void directory(HashMap markupE) + + throws ExactException { + if (skill.dependencies) { + String dependenciesF = markupE.get("depen").stub + "_" + + ((Train) markupE.get("depen").recurrenceE.get( + 0)).locomotor.substance + ".txt"; + skill.dependenciesG = skill.candies.snippetsYS + + dependenciesF; + } + } +} diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/Quartz_job_xml.java b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/Quartz_job_xml.java new file mode 100644 index 0000000..1920eda --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/Quartz_job_xml.java @@ -0,0 +1,129 @@ +// +// https://www.ramecera.it/myscrewdriver.html +// e-mail: screwdriver@ramecera.it +// +/* This program and the accompanying materials are made available under + * the terms of the Eclipse Public License v1.0 which accompanies this + * distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html */ +package it.ramecera.screwdriver.component; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.HashMap; +import java.util.List; + +import it.ramecera.salad.everyday.Candies; +import it.ramecera.salad.everyday.ExactException; +import it.ramecera.salad.file.Equipment; +import it.ramecera.screwdriver.CandyScrew; +import it.ramecera.screwdriver.Cst; +import it.ramecera.screwdriver.Markup; +import it.ramecera.screwdriver.Skill; +import it.ramecera.screwdriver.Train; +import it.ramecera.screwdriver.outfits.ClockHands; + +/** + *

+ * Class for producing the web.xml file. + *

+ * + * @author M. Maglioni + *

+ * Company: Rameceraâ„¢
+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09
+ *

+ */ +final public class Quartz_job_xml extends FileComponent { + + /** @param skill together with the descriptive data of the + * @param snippetG application */ + public Quartz_job_xml(Skill skill, String snippetG) { + super(); + this.skill = skill; + this.snippetG = snippetG; + } + + /** sysnthesis */ + @Override + public void synthesis(HashMap markupE, + List trainE, CandyScrew candyScrew) + + throws FileNotFoundException, IOException, ExactException { + + String quartz_job_xmlG = skill.candies.snippetsYS + "xml/" + + QUARTZ_JOB_XML_F; + producedMaterial = Equipment.oneString(skill.candies.snippetsYS + + snippetG) + Candies.LF; + producedMaterial += Equipment.oneString(quartz_job_xmlG) + + Candies.LF + Candies.LF; + + for (ClockHands l : skill.handE) { + producedMaterial += Candies.TABS + "" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "" + Candies.LF; + if (l.simple != null) { + // x2c is comma + String[] p = l.simple.split("\\x2c"); + producedMaterial += Candies.TABS + Candies.TABS + + "" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "" + Candies.LF; + } + if (l.cron != null) { + producedMaterial += Candies.TABS + Candies.TABS + + "" + Candies.LF; + } + producedMaterial += Candies.TABS + Candies.TABS + + "" + + Candies.LF; + producedMaterial += Candies.TABS + "" + Candies.LF; + + } + + producedMaterial += "" + Candies.LF; + + /* WE COOK EVERYTHING */ + producedMaterial = producedMaterial.replaceAll( + "\\x2bapplicaz\\x2b", skill.applicationNameLower); + producedMaterial = producedMaterial.replaceAll("\\x2brail\\x2b", + Cst.RAIL + skill.clockHands.rail); + producedMaterial = producedMaterial.replaceAll( + "\\x2bquartztask\\x2b", skill.clockHands.taskName); + producedMaterial = producedMaterial.replaceAll( + "\\x2bQuartztask\\x2b", skill.clockHands.taskNameU); + producedMaterial = producedMaterial.replaceAll( + "\\x2bquartzjob\\x2b", skill.clockHands.jobName); + producedMaterial = producedMaterial.replaceAll( + "\\x2bQuartzjob\\x2b", skill.clockHands.jobNameU); + producedMaterial = producedMaterial.replaceAll( + "\\x2bzoccolo\\x2b", skill.pckg); + } + + /* written only to comply with the abstract class FileComponent */ + @SuppressWarnings("javadoc") + @Override + /** @param markupE the list of markups + * @param skill together with the characteristics of the application + * @param trash file where the deleted files are moved + * @throws ExactException exception specified by a numeric code */ + public void directory(HashMap markupE) + + throws ExactException { + + } +} diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/Screwdriver_css.java b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/Screwdriver_css.java new file mode 100644 index 0000000..964edef --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/Screwdriver_css.java @@ -0,0 +1,84 @@ +// +// https://www.ramecera.it/myscrewdriver.html +// e-mail: screwdriver@ramecera.it +// +/* This program and the accompanying materials are made available under + * the terms of the Eclipse Public License v1.0 which accompanies this + * distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html */ +package it.ramecera.screwdriver.component; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.HashMap; +import java.util.List; + +import it.ramecera.salad.everyday.Candies; +import it.ramecera.salad.everyday.ExactException; +import it.ramecera.salad.file.Equipment; +import it.ramecera.screwdriver.CandyScrew; +import it.ramecera.screwdriver.Markup; +import it.ramecera.screwdriver.Skill; +import it.ramecera.screwdriver.Train; +import it.ramecera.screwdriver.outfits.Costume; + +/** @author M. Maglioni */ +final public class Screwdriver_css extends FileComponent { + + /** @param skill together with the descriptive data of the + * @param snippetG application */ + public Screwdriver_css(Skill skill, String snippetG) { + super(); + this.skill = skill; + this.snippetG = snippetG; + } + + /** @throws ExactException exception specified by a numeric code */ + @Override + public void synthesis(HashMap markupE, + List trainE, CandyScrew candyScrew) + + throws FileNotFoundException, IOException, ExactException { + + String g = skill.candies.snippetsYS + snippetG; + producedMaterial = Equipment.oneString(g) + Candies.LF; + + for (Costume c : skill.costumeE) { + producedMaterial += "." + c.className + " {" + Candies.LF; + producedMaterial += Candies.TABS + "color: " + c.color + + ";" + Candies.LF; + producedMaterial += Candies.TABS + "background-color: " + + c.background_color + ";" + Candies.LF; + producedMaterial += Candies.TABS + "border-color: " + + c.background_color + ";" + Candies.LF; + producedMaterial += Candies.TABS + "padding-top: " + + c.padding_top + "px;" + Candies.LF; + producedMaterial += Candies.TABS + "padding-left: " + + c.padding_left + "px;" + Candies.LF; + producedMaterial += Candies.TABS + "padding-right: " + + c.padding_right + "px;" + Candies.LF; + producedMaterial += Candies.TABS + "padding-bottom: " + + c.padding_bottom + "px;" + Candies.LF; + producedMaterial += Candies.TABS + "font-size: " + + c.font_size + "px;" + Candies.LF; + producedMaterial += Candies.TABS + "margin-top: " + + c.margin_top + "px;" + Candies.LF; + producedMaterial += Candies.TABS + "text-align: " + + c.text_align + ";" + Candies.LF; + producedMaterial += "}" + Candies.LF; + } + } + + /* written only to comply with the abstract class FileComponent */ + @SuppressWarnings("javadoc") + @Override + /** @param markupE the list of markups + * @param skill together with the characteristics of the application + * @param trash file where the deleted files are moved + * @throws ExactException exception specified by a numeric code */ + public void directory(HashMap markupE) + + throws ExactException { + + } +} diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/Screwdriver_cssC.java b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/Screwdriver_cssC.java new file mode 100644 index 0000000..dfa9a94 --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/Screwdriver_cssC.java @@ -0,0 +1,85 @@ +// +// https://www.ramecera.it/myscrewdriver.html +// e-mail: screwdriver@ramecera.it +// +/* This program and the accompanying materials are made available under + * the terms of the Eclipse Public License v1.0 which accompanies this + * distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html */ +package it.ramecera.screwdriver.component; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.HashMap; +import java.util.List; + +import it.ramecera.salad.everyday.Candies; +import it.ramecera.salad.everyday.ExactException; +import it.ramecera.salad.file.Equipment; +import it.ramecera.screwdriver.CandyScrew; +import it.ramecera.screwdriver.Markup; +import it.ramecera.screwdriver.Skill; +import it.ramecera.screwdriver.Train; +import it.ramecera.screwdriver.outfits.Costume; + +/** @author M. Maglioni */ +final public class Screwdriver_cssC extends FileComponent { + + /** @param skill together with the descriptive data of the + * @param snippetG application */ + public Screwdriver_cssC(Skill skill, String snippetG) { + super(); + this.skill = skill; + this.snippetG = snippetG; + } + + /** @throws ExactException exception specified by a numeric code */ + @Override + public void synthesis(HashMap markupE, + List trainE, CandyScrew candyScrew) + + throws FileNotFoundException, IOException, ExactException { + + String g = skill.candies.snippetsYS + snippetG; + producedMaterial = Equipment.oneString(g) + Candies.LF; + + for (Costume c : skill.costumeE) { + producedMaterial += "." + c.className + "C {" + Candies.LF; + producedMaterial += Candies.TABS + "color: " + c.color + ";" + + Candies.LF; + producedMaterial += Candies.TABS + "background-color: " + + c.background_color + ";" + Candies.LF; + producedMaterial += Candies.TABS + "border-color: " + + c.background_color + ";" + Candies.LF; + producedMaterial += Candies.TABS + "padding-top: " + + c.padding_top + "px;" + Candies.LF; + producedMaterial += Candies.TABS + "padding-left: " + + c.padding_left + "px;" + Candies.LF; + producedMaterial += Candies.TABS + "padding-right: " + + c.padding_right + "px;" + Candies.LF; + producedMaterial += Candies.TABS + "padding-bottom: " + + c.padding_bottom + "px;" + Candies.LF; + producedMaterial += Candies.TABS + "font-size: " + Integer + .valueOf(c.font_size) * 1.5 + "px;" + Candies.LF; + producedMaterial += Candies.TABS + "margin-top: " + + c.margin_top + "px;" + Candies.LF; + producedMaterial += Candies.TABS + "text-align: center;" + + Candies.LF; + producedMaterial += "}" + Candies.LF; + } + + } + + /* written only to comply with the abstract class FileComponent */ + @SuppressWarnings("javadoc") + @Override + /** @param markupE the list of markups + * @param skill together with the characteristics of the application + * @param trash file where the deleted files are moved + * @throws ExactException exception specified by a numeric code */ + public void directory(HashMap markupE) + + throws ExactException { + + } +} diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/Service_xml.java b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/Service_xml.java new file mode 100644 index 0000000..12cc1dc --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/Service_xml.java @@ -0,0 +1,73 @@ +// +// https://www.ramecera.it/myscrewdriver.html +// e-mail: screwdriver@ramecera.it +// +/* This program and the accompanying materials are made available under + * the terms of the Eclipse Public License v1.0 which accompanies this + * distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html */ +package it.ramecera.screwdriver.component; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.HashMap; +import java.util.List; + +import it.ramecera.salad.everyday.Candies; +import it.ramecera.salad.everyday.ExactException; +import it.ramecera.salad.file.Equipment; +import it.ramecera.screwdriver.CandyScrew; +import it.ramecera.screwdriver.Cst; +import it.ramecera.screwdriver.Markup; +import it.ramecera.screwdriver.Skill; +import it.ramecera.screwdriver.Train; + +/** @author M. Maglioni */ +final public class Service_xml extends FileComponent { + + /** @param skill application main data + * @param snippetG name of the file containing the snippet */ + public Service_xml(Skill skill, String snippetG) { + super(); + this.skill = skill; + this.snippetG = snippetG; + } + + /** @throws ExactException exception specified by a numeric code */ + @Override + public void synthesis(HashMap markupE, + List trainE, CandyScrew candyScrew) + + throws FileNotFoundException, IOException, ExactException { + + Train t = markupE.get("hdefrail").recurrenceE.get(skill.railK); + skill.springPropertiesG = skill.candies.snippetsYS + snippetG; + producedMaterial = Equipment.oneString( + skill.springPropertiesG) + Candies.LF; + producedMaterial += Candies.TABS + + "" + Candies.LF; + producedMaterial += ""; + } + + /* written only to comply with the abstract class FileComponent */ + @SuppressWarnings("javadoc") + @Override + /** @param markupE the list of markups + * @param skill together with the characteristics of the application + * @param trash file where the deleted files are moved + * @throws ExactException exception specified by a numeric code */ + public void directory(HashMap markupE) + + throws ExactException { + + } +} diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/SpringProperties_xml.java b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/SpringProperties_xml.java new file mode 100644 index 0000000..40d071f --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/SpringProperties_xml.java @@ -0,0 +1,136 @@ +// +// https://www.ramecera.it/myscrewdriver.html +// e-mail: screwdriver@ramecera.it +// +/* This program and the accompanying materials are made available under + * the terms of the Eclipse Public License v1.0 which accompanies this + * distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html */ +package it.ramecera.screwdriver.component; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.HashMap; +import java.util.List; + +import it.ramecera.salad.everyday.Candies; +import it.ramecera.salad.everyday.ExactException; +import it.ramecera.salad.everyday.Mix; +import it.ramecera.salad.everyday.Universal; +import it.ramecera.salad.file.Equipment; +import it.ramecera.screwdriver.CandyScrew; +import it.ramecera.screwdriver.Markup; +import it.ramecera.screwdriver.Skill; +import it.ramecera.screwdriver.Train; + +/** @author M. Maglioni */ +final public class SpringProperties_xml extends FileComponent { + + /** @param skill application main data + * @param snippetG name of the file containing the snippet */ + public SpringProperties_xml(Skill skill, String snippetG) { + super(); + this.skill = skill; + this.snippetG = snippetG; + } + + /** @throws ExactException exception specified by a numeric code */ + @Override + public void synthesis(HashMap markupE, + List trainE, CandyScrew candyScrew) + + throws FileNotFoundException, IOException, ExactException { + + skill.springPropertiesG = skill.candies.snippetsYS + snippetG; + producedMaterial = Equipment.oneString(skill.springPropertiesG) + + Candies.LF; + producedMaterial += Candies.TABS + + "" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + Candies.TABS + + "" + Candies.LF; + String content = "# PROPERTIES LIST" + Candies.LF; + content += "# SPRING SECURITY" + Candies.LF; + content += "AbstractUserDetailsAuthenticationProvider" + + ".badCredentials=Username o password errata" + + Candies.LF; + content += "AbstractUserDetailsAuthenticationProvider" + + ".disabled=Disabled user" + Candies.LF; + content += "AbstractUserDetailsAuthenticationProvider" + + ".expired=Expired account" + Candies.LF; + content += "ConcurrentSessionControllerImpl.exceededAllowed" + + "=This user is already logged in." + Candies.LF; + content += "AbstractAccessDecisionManager.accessDenied" + + "=Denied access" + Candies.LF; + content += "ConcurrentSessionControlStrategy.exceededAllowed" + + "=The maximum number of sessions for this user have been exceeded" + + Candies.LF; + for (int i = 0; i < markupE.get("uintp").recurrenceE + .size(); i++) { + Equipment.scriviFileDaStringa(new File(Mix.dress_C( + skill.mainResources) + markupE.get( + "uintp").recurrenceE.get(i).locomotor.text + + ".properties"), content); + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + "classpath:" + + markupE.get("uintp").recurrenceE.get( + i).locomotor.text + "" + Candies.LF; + } + /* the markup i18n can be present one time, but here I desire + * execute a loop */ + for (int i = 0; i < markupE.get("i18n").recurrenceE + .size(); i++) { + Equipment.scriviFileDaStringa(new File(Mix.dress_C( + skill.mainResources) + markupE.get( + "i18n").recurrenceE.get(i).locomotor.text + + ".properties"), content); + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + "classpath:" + + markupE.get("i18n").recurrenceE.get( + i).locomotor.text + "" + Candies.LF; + for (int j = 0; j < markupE.get("language").recurrenceE + .size(); j++) { + if (!markupE.get("language").recurrenceE.get( + j).locomotor.text.equalsIgnoreCase( + Universal.languageE[skill.defaulan][1])) { + Equipment.scriviFileDaStringa(new File(Mix.dress_C( + skill.mainResources) + markupE.get( + "i18n").recurrenceE.get( + i).locomotor.text + "_" + + markupE.get("language").recurrenceE.get( + j).locomotor.text + ".properties"), + content); + } + } + } + producedMaterial += Candies.TABS + Candies.TABS + Candies.TABS + + "" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + "" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "" + Candies.LF; + producedMaterial += Candies.TABS + "" + Candies.LF; + producedMaterial += ""; + } + + /* written only to comply with the abstract class FileComponent */ + @SuppressWarnings("javadoc") + @Override + /** @param markupE the list of markups + * @param skill together with the characteristics of the application + * @param trash file where the deleted files are moved + * @throws ExactException exception specified by a numeric code */ + public void directory(HashMap markupE) + + throws ExactException { + + } +} diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/SpringSecurity_xml.java b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/SpringSecurity_xml.java new file mode 100644 index 0000000..55f22d6 --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/SpringSecurity_xml.java @@ -0,0 +1,611 @@ +// +// https://www.ramecera.it/myscrewdriver.html +// e-mail: screwdriver@ramecera.it +// +/* This program and the accompanying materials are made available under + * the terms of the Eclipse Public License v1.0 which accompanies this + * distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html */ +package it.ramecera.screwdriver.component; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.HashMap; +import java.util.List; + +import it.ramecera.salad.everyday.Candies; +import it.ramecera.salad.everyday.ExactException; +import it.ramecera.salad.everyday.Mix; +import it.ramecera.salad.file.Equipment; +import it.ramecera.screwdriver.CandyScrew; +import it.ramecera.screwdriver.Cst; +import it.ramecera.screwdriver.Markup; +import it.ramecera.screwdriver.Skill; +import it.ramecera.screwdriver.Train; +import it.ramecera.screwdriver.Wagon; +import it.ramecera.screwdriver.outfits.JspKit; + +/** @author M. Maglioni */ +final public class SpringSecurity_xml extends FileComponent { + + /** @param skill application main data + * @param snippetG name of the file containing the snippet */ + public SpringSecurity_xml(Skill skill, String snippetG) { + super(); + this.skill = skill; + this.snippetG = snippetG; + } + + /** @throws ExactException exception specified by a numeric code */ + @Override + public void synthesis(HashMap markupE, + List trainE, CandyScrew candyScrew) + + throws FileNotFoundException, IOException, ExactException { + + String g = skill.candies.snippetsYS + snippetG; + producedMaterial = Equipment.oneString(g) + Candies.LF; + + producedMaterial += Candies.TABS + + "" + + Candies.LF; + if (skill.authenticationProvider.equals("class") + && skill.authenticationMode != null + && skill.authenticationMode.equals("trivial")) { + producedMaterial += Candies.TABS + + "" + + Candies.LF; + } else if (skill.authenticationProvider.equals("class")) { + producedMaterial += Candies.TABS + + "" + Candies.LF; + } + producedMaterial += Candies.TABS + Candies.TABS + + "" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "" + Candies.LF; + + /* LOOP ON ALL REQUEST MAPS */ + for (int i = 0; i < markupE.get("requmap").recurrenceE + .size(); i++) { + Wagon permitWagon = markupE.get("requmap").recurrenceE.get( + i).wagonE.get("permit"); + Wagon goalWagon = markupE.get("requmap").recurrenceE.get( + i).wagonE.get("goal"); + // Wagon redirectWagon = markupE.get ("requmap"). + // OccurrenceE + // .get (i) .wagonE.get ("redirect"); + int z = 0; + // GOAL CONTROL + List tE = markupE.get("jsp").recurrenceE; + if (goalWagon != null) { + for (z = 0; z < tE.size(); z++) { + if (tE.get(z).locomotor.text.equals( + goalWagon.text)) { + break; + } + } + if (z == tE.size()) { + ExactException ne = new ExactException(); + ne.code = 2300; + ne.datum = "I've not found the JSP " + Mix.dress_A( + goalWagon.text) + + " declared as \"goal\" in " + Mix.dress_A( + "requestmap+" + markupE.get( + "requmap").recurrenceE.get( + i).locomotor.text) + + "."; + ne.className = this.getClass().getName(); + throw ne; + } + } + String[] segmentiE = Mix.separaPath(markupE.get( + "requmap").recurrenceE.get(i).locomotor.text); + JspKit jspKit = (JspKit) tE.get(z).locomotor.substance; + + // TREATMENT OF SECURITY SPRING PERMISSIONS + + if (permitWagon != null && permitWagon.text + .equalsIgnoreCase("all")) { + producedMaterial += Candies.TABS + Candies.TABS + + "" + Candies.LF; + /* both in the case of a crud, but also in the case of a + * simple form (jspType == 1), the permission is the + * same as the mother (the mother is the one without the + * prefix "screw") */ + if (jspKit.crud | jspKit.jspType == 1) { + producedMaterial += Candies.TABS + Candies.TABS + + "" + Candies.LF; + } + } else if (permitWagon != null && permitWagon.text + .equalsIgnoreCase("user")) { + producedMaterial += Candies.TABS + Candies.TABS + + "" + + Candies.LF; + if (jspKit.crud) { + producedMaterial += Candies.TABS + Candies.TABS + + "" + + Candies.LF; + } + } else if (permitWagon != null && permitWagon.text + .equalsIgnoreCase("admin")) { + producedMaterial += Candies.TABS + Candies.TABS + + "" + + Candies.LF; + if (jspKit.crud) { + producedMaterial += Candies.TABS + Candies.TABS + + "" + + Candies.LF; + } + } + } + producedMaterial += Candies.TABS + Candies.TABS + + "" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "" + Candies.LF; + if (skill.authenticationProvider.equals("class") + && skill.authenticationMode != null + && skill.authenticationMode.equals("trivial")) { + producedMaterial += Candies.TABS + Candies.TABS + + "" + + Candies.LF; + } else if (skill.authenticationProvider.equals("class") + && skill.authenticationMode != null + && skill.authenticationMode.equals("domain")) { + producedMaterial += Candies.TABS + Candies.TABS + + "" + + Candies.LF; + } else if (skill.authenticationProvider.equals("class") + && skill.authenticationMode != null + && skill.authenticationMode.equals("simple")) { + producedMaterial += Candies.TABS + Candies.TABS + + "" + + Candies.LF; + } + producedMaterial += Candies.TABS + Candies.TABS + + "" + + Candies.LF; + producedMaterial += Candies.TABS + "" + Candies.LF; + + if (skill.authenticationProvider != null) { + /* let's see what value the xprovider + markup takes */ + switch (skill.authenticationProvider) { + case "ldap": + producedMaterial += Candies.TABS + + "" + + Candies.LF; + } + } + producedMaterial += Candies.TABS + + "" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "" + + Candies.LF; + } + if (skill.ldapPasswordMethod != null) { + switch (skill.ldapPasswordMethod) { + case "password-compare": + producedMaterial += Candies.TABS + + "" + Candies.LF; + break; + case "hash_ssha": + producedMaterial += Candies.TABS + Candies.TABS + + "" + + Candies.LF; + break; + default: + producedMaterial += Candies.TABS + Candies.TABS + + "" + + Candies.LF; + } + } + producedMaterial += Candies.TABS + Candies.TABS + + "" + + Candies.LF; + producedMaterial += Candies.TABS + + "" + Candies.LF; + break; + case "user-service": + producedMaterial += Candies.TABS + + "" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + + "" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + + "" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "" + Candies.LF; + producedMaterial += Candies.TABS + + "" + Candies.LF; + break; + case "jdbc": + Train t = markupE.get("hdefrail").recurrenceE.get( + skill.railK); + producedMaterial += Candies.TABS + + "" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + + "" + + Candies.LF; + } + producedMaterial += Candies.TABS + Candies.TABS + + "" + Candies.LF; + producedMaterial += Candies.TABS + + "" + Candies.LF; + if (skill.passEncoder != null && skill.passEncoder + .equalsIgnoreCase("saltedSHA256")) { + producedMaterial += Candies.TABS + + "" + + Candies.LF; + } + break; + case "class": + if (skill.authenticationMode == null) { + /* non fare nulla */ + } else if (skill.authenticationMode.equals("domain")) { + producedMaterial += Candies.TABS + + "" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "" + + Candies.LF; + producedMaterial += Candies.TABS + + "" + + Candies.LF; + producedMaterial += Candies.TABS + + "" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + + "" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + + "" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + "" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + + "" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + + "" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + "" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "" + Candies.LF; + producedMaterial += Candies.TABS + "" + + Candies.LF; + producedMaterial += Candies.TABS + + "" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "" + + Candies.LF; + producedMaterial += Candies.TABS + "" + + Candies.LF; + } else if (skill.authenticationMode.equals("simple")) { + producedMaterial += Candies.TABS + + "" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "" + + Candies.LF; + producedMaterial += Candies.TABS + + "" + + Candies.LF; + producedMaterial += Candies.TABS + + "" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + + "" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + + "" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + "" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + + "" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + + "" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + "" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "" + Candies.LF; + producedMaterial += Candies.TABS + "" + + Candies.LF; + producedMaterial += Candies.TABS + + "" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "" + + Candies.LF; + producedMaterial += Candies.TABS + "" + + Candies.LF; + } else if (skill.authenticationMode.equals("trivial")) { + if (skill.userTrivialADMIN != null + & skill.passTrivialADMIN == null) { + throw new ExactException("Non è stato" + + " impostato correttamente il markup «uspaformadmin+».", + 1301, this.getClass().getName(), ""); + } + if (skill.userTrivialUSER != null + & skill.passTrivialUSER == null) { + throw new ExactException("Non è stato" + + " impostato correttamente il markup «uspaformuser+».", + 1302, this.getClass().getName(), ""); + } + if (skill.userTrivialUSER == null + & skill.passTrivialUSER == null) { + throw new ExactException("Non sono stati" + + " impostati né il markup " + + "«uspaformuser+» né il markup" + + " «uspaformadmin+».", 1303, this + .getClass().getName(), ""); + } + producedMaterial += Candies.TABS + + "" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + "" + + Candies.LF; + if (skill.userTrivialUSER != null) { + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + + "" + + Candies.LF; + } + if (skill.userTrivialADMIN != null) { + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + + "" + + Candies.LF; + } + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + "" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "" + + Candies.LF; + producedMaterial += Candies.TABS + + "" + + Candies.LF; + } + break; + default: + throw new ExactException("Il valore «" + + skill.authenticationProvider + + "» per il markup xprovider+ non è" + + " tra quelli previsti.", 1300, this.getClass() + .getName(), ""); + } + } else { + producedMaterial += Candies.TABS + + "" + Candies.LF; + } + producedMaterial += ""; + } + + /* scritta solo per ottemperare alla className astratta + * FileComponent */ + @SuppressWarnings("javadoc") + @Override + /** @param markupE l'elenco dei markup + * @param skill insieme delle caratteristiche dell'applicazione + * @param recycleBin file dove sono spostati i file cancellati + * @throws ExactException eccezione precisata da un code numerico */ + public void directory(HashMap markupE) + + throws ExactException { + + } +} diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/Tiles_xml.java b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/Tiles_xml.java new file mode 100644 index 0000000..800e6ea --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/Tiles_xml.java @@ -0,0 +1,73 @@ +// +// https://www.ramecera.it/myscrewdriver.html +// e-mail: screwdriver@ramecera.it +// +/* This program and the accompanying materials are made available under + * the terms of the Eclipse Public License v1.0 which accompanies this + * distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html */ +package it.ramecera.screwdriver.component; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.HashMap; +import java.util.List; + +import it.ramecera.salad.everyday.Candies; +import it.ramecera.salad.everyday.ExactException; +import it.ramecera.salad.file.Equipment; +import it.ramecera.screwdriver.CandyScrew; +import it.ramecera.screwdriver.Markup; +import it.ramecera.screwdriver.Skill; +import it.ramecera.screwdriver.Train; + +/** @author M. Maglioni */ +final public class Tiles_xml extends FileComponent { + + /** @param skill together with the descriptive data of the + * @param snippetG application */ + public Tiles_xml(Skill skill, String snippetG) { + super(); + this.skill = skill; + this.snippetG = snippetG; + } + + /** @throws ExactException exception specified by a numeric code */ + @Override + public void synthesis(HashMap markupE, + List trainE, CandyScrew candyScrew) + + throws FileNotFoundException, IOException, ExactException { + + String[] qualifierE = skill.tilesVersion.split("\\x2e"); + String g = skill.candies.snippetsYS + "testaTiles_" + + qualifierE[0] + ".txt"; + producedMaterial = Equipment.oneString(g) + Candies.LF; + for (int i = 0; i < markupE.get("edefn").recurrenceE + .size(); i++) { + String[] s = (String[]) markupE.get("edefn").recurrenceE + .get(i).locomotor.substance; + producedMaterial += Candies.TABS + "" + Candies.LF; + producedMaterial += Candies.TABS + "" + + Candies.LF; + } + producedMaterial += ""; + } + + /* written only to comply with the abstract class FileComponent */ + @SuppressWarnings("javadoc") + @Override + /** @param markupE the list of markups + * @param skill together with the descriptive data of the + * application + * @param file basket where the deleted files are moved + * @throws ExactException exception specified by a numerical code */ + public void directory(HashMap markupE) + + throws ExactException { + + } +} diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/UserAuthenticationProvider_java.java b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/UserAuthenticationProvider_java.java new file mode 100644 index 0000000..cb85dc3 --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/UserAuthenticationProvider_java.java @@ -0,0 +1,188 @@ +// +// https://www.ramecera.it/myscrewdriver.html +// e-mail: screwdriver@ramecera.it +// +/* This program and the accompanying materials are made available under + * the terms of the Eclipse Public License v1.0 which accompanies this + * distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html */ +package it.ramecera.screwdriver.component; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.HashMap; +import java.util.List; + +import it.ramecera.salad.everyday.Candies; +import it.ramecera.salad.everyday.ExactException; +import it.ramecera.salad.everyday.Mix; +import it.ramecera.salad.everyday.Strings; +import it.ramecera.salad.file.Equipment; +import it.ramecera.screwdriver.CandyScrew; +import it.ramecera.screwdriver.Cst; +import it.ramecera.screwdriver.Markup; +import it.ramecera.screwdriver.Skill; +import it.ramecera.screwdriver.Train; + +/** @author M. Maglioni */ +final public class UserAuthenticationProvider_java extends + FileComponent { + + /** @param skill set of application descriptive data + * @param snippetG path and name of the snippet file (fragment) */ + public UserAuthenticationProvider_java(Skill skill, + String snippetG) { + super(); + this.skill = skill; + this.snippetG = snippetG; + } + + /** @throws ExactException exception specified by a numeric code */ + @Override + public void synthesis(HashMap markupE, + List trainE, CandyScrew candyScrew) + + throws FileNotFoundException, IOException, ExactException { + + skill.applicUserAuthenticationProviderG = skill.candies.snippetsYS + + snippetG; + producedMaterial = Equipment.oneString( + skill.applicUserAuthenticationProviderG) + Candies.LF + + Candies.LF; + producedMaterial = Strings.replaceFirst(producedMaterial, + "package +zoccolo+", "package " + skill.pckg); + producedMaterial = Strings.replaceFirst(producedMaterial, + "+userpass+", Mix.uppercaseFirstChar( + skill.authenticationMode)); + producedMaterial = producedMaterial.replaceAll( + "\\x2bApplicaz\\x2b", Mix.uppercaseFirstChar( + skill.applicationNameLower)); + producedMaterial = producedMaterial.replaceAll( + "import \\x2bzoccolo\\x2b", "import " + skill.pckg); + producedMaterial = producedMaterial.replaceAll( + "\\x2bdomain\\x2b", skill.networkDomain); + producedMaterial = producedMaterial.replaceAll( + "\\x2bdsname\\x2b", skill.tabUser[2].toLowerCase()); + producedMaterial = producedMaterial.replaceAll( + "\\x2bdbschema\\x2b", skill.tabUser[3]); + producedMaterial = producedMaterial.replaceAll( + "\\x2bRail\\x2b", Cst.RAILU + skill.tabUser[1]); + producedMaterial = producedMaterial.replaceAll( + "\\x2brail\\x2b", Cst.RAIL + skill.tabUser[1]); + producedMaterial = producedMaterial.replaceAll( + "\\x2btabuser\\x2b", Mix.uppercaseFirstChar( + skill.tabUser[0])); + producedMaterial += Candies.TABS + "@Override" + Candies.LF; + producedMaterial += Candies.TABS + + "public Authentication authenticate(" + + "Authentication authentication)" + Candies.LF + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + Candies.TABS + + "throws AuthenticationException {" + Candies.LF + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + Mix + .uppercaseFirstChar(skill.authenticationMode) + + "UsernamePasswordAuthenticationToken token" + " = (" + + Mix.uppercaseFirstChar(skill.authenticationMode) + + "UsernamePasswordAuthenticationToken)" + + " authentication;" + Candies.LF; + + producedMaterial += Candies.TABS + Candies.TABS + + "String userName = token.getName();" + Candies.LF; + if (skill.authenticationMode.equals("domain")) { + producedMaterial += Candies.TABS + Candies.TABS + + "String domain = token.getDomain();" + Candies.LF; + } + producedMaterial += Candies.TABS + Candies.TABS + + "Utenti user = null;" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + "try {" + + Candies.LF; + if (skill.jpaVersion == 1) { + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + "user = " + Cst.RAIL + + skill.tabUser[1] + Mix.uppercaseFirstChar( + skill.tabUser[0]) + + ".findById(userName, true);" + Candies.LF; + } else { + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + "user = (" + Mix.uppercaseFirstChar( + skill.tabUser[0]) + ")" + Cst.RAIL + + skill.tabUser[1] + Mix.uppercaseFirstChar( + skill.tabUser[0]) + ".findUniqueById(" + Mix + .uppercaseFirstChar(skill.tabUser[0]) + + ".class, userName);" + Candies.LF; + } + producedMaterial += Candies.TABS + Candies.TABS + + "} catch (DataAccessException e) {" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "} catch (Exception e) {" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + Candies.TABS + + "e.printStackTrace();" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + "}" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "if (user == null) {" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + Candies.TABS + + "throw new UsernameNotFoundException(" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + Candies.TABS + + "\"Invalid username/password\");" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + "}" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "String password = user.get" + Mix.uppercaseFirstChar( + skill.password) + "();" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "if (!password.equals(token.getCredentials())) {" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + Candies.TABS + + "throw new BadCredentialsException(" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + Candies.TABS + + "\"Invalid username/password\");" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + "}" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "Collection authorities" + + " = UserAuthorityUtils.createAuthorities(user);" + + Candies.LF; + if (skill.authenticationMode.equals("domain")) { + producedMaterial += Candies.TABS + Candies.TABS + + "return new" + " " + Mix.uppercaseFirstChar( + skill.authenticationMode) + + "UsernamePasswordAuthenticationToken(user," + + " password, domain, authorities);" + Candies.LF; + } else { + producedMaterial += Candies.TABS + Candies.TABS + + "return new" + " " + Mix.uppercaseFirstChar( + skill.authenticationMode) + + "UsernamePasswordAuthenticationToken(user," + + " password, authorities);" + Candies.LF; + } + producedMaterial += Candies.TABS + "}" + Candies.LF + + Candies.LF; + producedMaterial += Candies.TABS + "@Override" + Candies.LF; + producedMaterial += Candies.TABS + + "public boolean supports(Class authentication) {" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "return true;" + Candies.LF; + producedMaterial += Candies.TABS + "}" + Candies.LF; + + producedMaterial += Candies.TABS + "/* screwdriver_knife */" + + Candies.LF; + producedMaterial += "}" + Candies.LF; + } + + /* written only to comply with the abstract class FileComponent */ + @SuppressWarnings("javadoc") + @Override + /** @param markupE the list of markups + * @param skill together with the descriptive data of the + * application + * @param file basket where the deleted files are moved + * @throws ExactException exception specified by a numerical code */ + public void directory(HashMap markupE) + + throws ExactException { + + } +} diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/UserContextImpl_java.java b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/UserContextImpl_java.java new file mode 100644 index 0000000..6b5429c --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/UserContextImpl_java.java @@ -0,0 +1,301 @@ +// +// https://www.ramecera.it/myscrewdriver.html +// e-mail: screwdriver@ramecera.it +// +/* This program and the accompanying materials are made available under + * the terms of the Eclipse Public License v1.0 which accompanies this + * distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html */ +package it.ramecera.screwdriver.component; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.HashMap; +import java.util.List; + +import it.ramecera.salad.everyday.Candies; +import it.ramecera.salad.everyday.ExactException; +import it.ramecera.salad.everyday.Mix; +import it.ramecera.screwdriver.CandyScrew; +import it.ramecera.screwdriver.Cst; +import it.ramecera.screwdriver.Markup; +import it.ramecera.screwdriver.Skill; +import it.ramecera.screwdriver.Train; + +/** @author M. Maglioni */ +final public class UserContextImpl_java extends FileComponent { + + /** @param skill set of application descriptive data + * @param snippetG path and name of the snippet file (fragment) */ + public UserContextImpl_java(Skill skill, String snippetG) { + super(); + this.skill = skill; + this.snippetG = snippetG; + } + + /** array of 3 positions: 0) annotation of the key; 1) type of key; + * 2) name of the key */ + public String[] utenteChiave; + + /** @throws ExactException exception specified by a numeric code */ + @Override + public void synthesis(HashMap markupE, + List trainE, CandyScrew candyScrew) + + throws FileNotFoundException, IOException, ExactException { + + if (skill.authenticationMode.equals("trivial")) { + producedMaterial = "package " + skill.pckg + + ".web.authentication;" + Candies.LF + Candies.LF; + producedMaterial += "import org.springframework.beans.factory.annotation.Autowired;" + + Candies.LF; + producedMaterial += "import org.springframework.stereotype.Component;" + + Candies.LF; + producedMaterial += "import " + skill.pckg + + ".web.authentication.KingDao;" + Candies.LF; + producedMaterial += "import " + skill.pckg + + ".domain.King;" + Candies.LF; + if (skill.log4jVers != null) { + producedMaterial += "import org.apache.log4j.Logger;" + + Candies.LF + Candies.LF; + } + /* this + * + * @Component is not there in the case of simple and + * domain */ + producedMaterial += "@Component" + Candies.LF; + producedMaterial += "public class UserContextStub implements UserContext {" + + Candies.LF + Candies.LF; + producedMaterial += Candies.TABS + + "private final KingDao userService;" + Candies.LF + + Candies.LF; + producedMaterial += Candies.TABS + + "private String currentUserId = null;" + + Candies.LF + Candies.LF; + if (skill.log4jVers != null) { + producedMaterial += Candies.TABS + + "/** ordinary logger */" + Candies.LF; + producedMaterial += Candies.TABS + + "@SuppressWarnings(\"unused\")" + Candies.LF; + producedMaterial += Candies.TABS + + "private static Logger logger = Logger.getLogger(" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "UserContextStub.class);" + Candies.LF + + Candies.LF; + } + producedMaterial += Candies.TABS + "@Autowired" + + Candies.LF; + producedMaterial += Candies.TABS + + "public UserContextStub(KingDao userService) {" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "if (userService == null) {" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + + "throw new IllegalArgumentException(" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + + "\"userService cannot be null\");" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + "}" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "this.userService = userService;" + Candies.LF; + producedMaterial += Candies.TABS + "}" + Candies.LF + + Candies.LF; + producedMaterial += Candies.TABS + "@Override" + + Candies.LF; + producedMaterial += Candies.TABS + + "public King getCurrentUser() {" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "return userService.getUser(currentUserId);" + + Candies.LF; + producedMaterial += Candies.TABS + "}" + Candies.LF; + + producedMaterial += Candies.TABS + "@Override" + + Candies.LF; + producedMaterial += Candies.TABS + + "public void setCurrentUser(King user) {" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "if (user == null) {" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + + "throw new IllegalArgumentException(\"user cannot be null\");" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + "}" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "String currentId = user.getUserid();" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "if (currentId == null) {" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + + "throw new IllegalArgumentException(" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + + "\"user.getUserid() cannot be null\");" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + "}" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "this.currentUserId = currentId;" + Candies.LF; + producedMaterial += Candies.TABS + "}" + Candies.LF; + producedMaterial += "}"; + } else { + utenteChiave = locateKey(skill.tableDBE.get( + skill.uK)); + producedMaterial = "package " + skill.pckg + + ".web.authentication;" + Candies.LF + Candies.LF; + producedMaterial += "import org.springframework.beans.factory.annotation.Autowired;" + + Candies.LF; + producedMaterial += "import org.springframework.dao.DataAccessException;" + + Candies.LF; + producedMaterial += "import " + skill.pckg + "." + Cst.RAIL + + skill.tabUser[1] + ".dao.I" + Cst.RAILU + Mix + .uppercaseFirstChar(skill.tabUser[1]) + + skill.tabUser[0] + "Dao;" + Candies.LF; + producedMaterial += "import " + (skill.networkDomain + + ".screwdriver." + skill.tabUser[2] + "." + + skill.tabUser[3]).toLowerCase() + "." + + skill.tabUser[0] + ";" + Candies.LF; + + if (skill.log4jVers != null) { + producedMaterial += "import org.apache.log4j.Logger;" + + Candies.LF + Candies.LF; + } + + producedMaterial += "public class UserContextStub implements UserContext {" + + Candies.LF + Candies.LF; + producedMaterial += Candies.TABS + "private final I" + + Cst.RAILU + skill.tabUser[1] + skill.tabUser[0] + + "Dao<" + Mix.uppercaseFirstChar(skill.tabUser[0]) + + "> userService;" + Candies.LF + Candies.LF; + producedMaterial += Candies.TABS + "private " + + utenteChiave[1] + " currentUserId;" + Candies.LF + + Candies.LF; + if (skill.log4jVers != null) { + producedMaterial += Candies.TABS + + "/** ordinary logger */" + Candies.LF; + producedMaterial += Candies.TABS + + "@SuppressWarnings(\"unused\")" + Candies.LF; + producedMaterial += Candies.TABS + + "private static Logger logger = Logger.getLogger(" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "UserContextStub.class);" + Candies.LF + + Candies.LF; + } + producedMaterial += Candies.TABS + "@Autowired" + + Candies.LF; + producedMaterial += Candies.TABS + + "public UserContextStub(I" + Cst.RAILU + + skill.tabUser[1] + skill.tabUser[0] + "Dao<" + Mix + .uppercaseFirstChar(skill.tabUser[0]) + + "> userService) {" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "if (userService == null) {" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + + "throw new IllegalArgumentException(" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + + "\"userService cannot be null\");" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + "}" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "this.userService = userService;" + Candies.LF; + producedMaterial += Candies.TABS + "}" + Candies.LF + + Candies.LF; + producedMaterial += Candies.TABS + "@Override" + + Candies.LF; + producedMaterial += Candies.TABS + "public " + + skill.tabUser[0] + " getCurrentUser() {" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + "try {" + + Candies.LF; + if (skill.jpaVersion == 1) { + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + + "return userService.findById(currentUserId, false);" + + Candies.LF; + } else { + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + "return (" + Mix + .uppercaseFirstChar(skill.tabUser[0]) + + ")userService.findUniqueById(" + Mix + .uppercaseFirstChar(skill.tabUser[0]) + + ".class, currentUserId);" + Candies.LF; + } + producedMaterial += Candies.TABS + Candies.TABS + + "} catch (DataAccessException e) {" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + "e.printStackTrace();" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + "return null;" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "} catch (Exception e) {" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + "e.printStackTrace();" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + "return null;" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + "}" + + Candies.LF; + producedMaterial += Candies.TABS + "}" + Candies.LF; + + producedMaterial += Candies.TABS + "@Override" + + Candies.LF; + producedMaterial += Candies.TABS + + "public void setCurrentUser(" + skill.tabUser[0] + + " user) {" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "if (user == null) {" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + + "throw new IllegalArgumentException(\"user cannot be null\");" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + "}" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + utenteChiave[1] + " currentId = user.get" + Mix + .uppercaseFirstChar(utenteChiave[2]) + "();" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "if (currentId == null) {" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + + "throw new IllegalArgumentException(" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + Candies.TABS + "\"user.get" + Mix + .uppercaseFirstChar(utenteChiave[2]) + + "() cannot be null\");" + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + "}" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "this.currentUserId = currentId;" + Candies.LF; + producedMaterial += Candies.TABS + "}" + Candies.LF; + producedMaterial += "}"; + } + } + + /* written only to comply with the abstract class FileComponent */ + @SuppressWarnings("javadoc") + @Override + /** @param markupE the list of markups + * @param skill together with the descriptive data of the + * application + * @param file basket where the deleted files are moved + * @throws ExactException exception specified by a numerical code */ + public void directory(HashMap markupE) + + throws ExactException { + + } +} diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/Web_xml.java b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/Web_xml.java new file mode 100644 index 0000000..e76cdca --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/Web_xml.java @@ -0,0 +1,253 @@ +// +// https://www.ramecera.it/myscrewdriver.html +// e-mail: screwdriver@ramecera.it +// +/* This program and the accompanying materials are made available under + * the terms of the Eclipse Public License v1.0 which accompanies this + * distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html */ +package it.ramecera.screwdriver.component; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.HashMap; +import java.util.List; + +import it.ramecera.salad.everyday.Candies; +import it.ramecera.salad.everyday.ExactException; +import it.ramecera.salad.everyday.Strings; +import it.ramecera.salad.file.Equipment; +import it.ramecera.screwdriver.CandyScrew; +import it.ramecera.screwdriver.Cst; +import it.ramecera.screwdriver.Markup; +import it.ramecera.screwdriver.Skill; +import it.ramecera.screwdriver.Train; + +/** + *

+ * Class for producing the web.xml file. + *

+ * + * @author M. Maglioni + *

+ * Company: Rameceraâ„¢
+ * Creation date: 2020-04-09
+ * Last updated: 2020-09-29
+ *

+ */ +final public class Web_xml extends FileComponent { + + /** @param skill together with the descriptive data of the + * @param snippetG application */ + public Web_xml(Skill skill, String snippetG) { + super(); + this.skill = skill; + this.snippetG = snippetG; + } + + /** sysnthesis */ + @Override + public void synthesis(HashMap markupE, + List trainE, CandyScrew candyScrew) + + throws FileNotFoundException, IOException, ExactException { + + final String XML_Y = "/WEB-INF/spring/"; + + String web_xmlF = null; + String mimeMappingF = "webmime.txt"; + String errorPageF = "weberror.txt"; + if (skill.spring) { + web_xmlF = "web.xml.spring.txt"; + } else { + web_xmlF = "web.xml.txt"; + } + String web_xmlG = skill.candies.snippetsYS + web_xmlF; + String mimeMappingG = skill.candies.snippetsYS + mimeMappingF; + String errorPageG = skill.candies.snippetsYS + errorPageF; + producedMaterial = "" + + Candies.LF; + switch (skill.applicationServer.toLowerCase()) { + case ("jboss eap 6.4"): + case ("jboss eap 7.1"): + case ("jboss eap 7.1.spring3"): + case ("jboss eap 7.1.uv"): + case ("jboss eap 6.4.uv"): + producedMaterial += "" + + Candies.LF; + break; + case ("jboss eap 5.2"): + case ("jboss eap 5.2.uv"): + producedMaterial += "" + Candies.LF; + break; + case ("tomcat 7.0"): + case ("tomcat 7.0.uv"): + producedMaterial += "" + Candies.LF; + break; + default: + ExactException ne = new ExactException(); + ne.code = 1200; + ne.datum = "The declared application server «" + + skill.applicationServer + + "» version is not expected."; + throw ne; + } + producedMaterial += Candies.LF; + producedMaterial += Candies.TABS + "" + + skill.applicationNameLower.toUpperCase() + + "" + Candies.LF; + producedMaterial += Equipment.oneString(web_xmlG) + Candies.LF + + Candies.LF; + if (skill.mimeMapping) { + producedMaterial += Equipment.oneString(mimeMappingG) + + Candies.LF; + } + if (skill.errorPage) { + producedMaterial += Equipment.oneString(errorPageG) + + Candies.LF; + } + if (skill.captcha) { + producedMaterial += Equipment.oneString( + skill.candies.snippetsYS + "web_captcha.txt") + + Candies.LF + Candies.LF; + } + if (skill.antiSamy) { + producedMaterial += Candies.TABS + "" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "policy_file_path" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "/" + skill.pckg + + "/web/sanitizer/policy.xml" + + Candies.LF; + producedMaterial += Candies.TABS + "" + + Candies.LF; + } + producedMaterial += Candies.TABS + "" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "contextConfigLocation" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + "" + Candies.LF; + if (skill.quartzVers != null) { + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + "/WEB-INF/spring/" + + skill.applicationNameLower + "-" + + FileComponent.QUARTZ_JOB_XML_F + Candies.LF; + } + producedMaterial += Candies.TABS + Candies.TABS + Candies.TABS + + "/WEB-INF/spring/root-context.xml" + Candies.LF; + if (skill.internalProperties | skill.springSecurity | markupE + .get("hdefrail").recurrenceE.size() > 0) { + if (skill.internalProperties) { + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + XML_Y + + skill.applicationNameLower + "-props.xml" + + Candies.LF; + } + if (skill.springSecurity) { + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + XML_Y + + skill.applicationNameLower + "-security.xml" + + Candies.LF; + } + if (markupE.get("hdefrail").recurrenceE.size() > 0) { + for (int i = 0; i < markupE.get("hdefrail").recurrenceE + .size(); i++) { + Train t = markupE.get("hdefrail").recurrenceE.get( + i); + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + XML_Y + Cst.RAIL + + t.locomotor.text + "-orm.xml" + + Candies.LF; + producedMaterial += Candies.TABS + Candies.TABS + + Candies.TABS + XML_Y + Cst.RAIL + + t.locomotor.text + "-service.xml" + + Candies.LF; + } + } + } + producedMaterial += Candies.TABS + Candies.TABS + + "" + Candies.LF; + producedMaterial += Candies.TABS + "" + + Candies.LF + Candies.LF; + producedMaterial += Equipment.oneString(skill.candies.snippetsYS + + "listn_0.txt") + Candies.LF; + if (skill.springSecurity) { + producedMaterial += Equipment.oneString( + skill.candies.snippetsYS + "uvListener.txt") + + Candies.LF; + } + if (skill.antiSamy) { + String listener = Candies.TABS + "" + Candies.LF; + listener += Candies.TABS + Candies.TABS + "" + + skill.pckg + ".web.listener" + + ".AntiSamyListener" + Candies.LF; + listener += Candies.TABS + "" + Candies.LF + + Candies.LF; + producedMaterial += listener; + } + /* secuFilte deve essere il primo di tutti i filtri, e deve + * riportare le clausolE REQUEST e ERROR */ + if (skill.springSecurity) { + producedMaterial += Equipment.oneString( + skill.candies.snippetsYS + "secuFilte.txt") + + Candies.LF; + } + if (skill.filter) { + producedMaterial += Equipment.oneString( + skill.candies.snippetsYS + "filte.txt") + + Candies.LF; + } + /* CUCINIAMO IL TUTTO */ + if (skill.quartzVers == null) { + producedMaterial = Strings.replaceFirst(producedMaterial, + "+startup+", ""); + } else { + producedMaterial = Strings.replaceFirst(producedMaterial, + "+startup+", + "1"); + } + producedMaterial = producedMaterial.replaceAll( + "\\x2bzoccolo\\x2b", skill.pckg); + producedMaterial += ""; + } + + /* scritta solo per ottemperare alla className astratta + * FileComponent */ + @SuppressWarnings("javadoc") + @Override + /** @param markupE l'elenco dei markup + * @param skill insieme delle caratteristiche dell'applicazione + * @param recycleBin file dove sono spostati i file cancellati + * @throws ExactException eccezione precisata da un code numerico */ + public void directory(HashMap markupE) + + throws ExactException { + + } +} diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/Webflow_xml.java b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/Webflow_xml.java new file mode 100644 index 0000000..828fbfc --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/component/Webflow_xml.java @@ -0,0 +1,73 @@ +// +// https://www.ramecera.it/myscrewdriver.html +// e-mail: screwdriver@ramecera.it +// +/* This program and the accompanying materials are made available under + * the terms of the Eclipse Public License v1.0 which accompanies this + * distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html */ +package it.ramecera.screwdriver.component; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.HashMap; +import java.util.List; + +import it.ramecera.salad.everyday.ExactException; +import it.ramecera.salad.file.Equipment; +import it.ramecera.screwdriver.CandyScrew; +import it.ramecera.screwdriver.Markup; +import it.ramecera.screwdriver.Skill; +import it.ramecera.screwdriver.Train; + +/** + *

+ * Class for producing the web.xml file. + *

+ * + * @author M. Maglioni + *

+ * Company: Rameceraâ„¢
+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09
+ *

+ */ +final public class Webflow_xml extends FileComponent { + + /** @param skill together with the descriptive data of the + * @param snippetG application */ + public Webflow_xml(Skill skill, String snippetG) { + super(); + this.skill = skill; + this.snippetG = snippetG; + } + + /** sysnthesis */ + @Override + public void synthesis(HashMap markupE, + List trainE, CandyScrew candyScrew) + + throws FileNotFoundException, IOException, ExactException { + + String webflowG = skill.candies.snippetsYS + snippetG; + producedMaterial = Equipment.oneString(webflowG); + } + + /** @param markupE the list of markups + * @throws ExactException exception specified by a numeric code */ + public void directory(HashMap markupE) + + throws ExactException { + + skill.webFlowY = skill.webInfY + "/flows"; + if (skill.webFlow) { + skill.buildDirectory(skill.webFlowY); + /* I don't want the flow, so the webinf / flows directory + * needs to be cleared */ + } else if (new File(skill.webFlowY).exists()) { + new File(skill.webFlowY).renameTo(new File(recycleBinY + "/" + + skill.webFlowY)); + } + } +} diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/outfits/ClockHands.java b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/outfits/ClockHands.java new file mode 100644 index 0000000..032c65e --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/outfits/ClockHands.java @@ -0,0 +1,87 @@ +// +// https://www.ramecera.it/myscrewdriver.html +// e-mail: screwdriver@ramecera.it +// +/* This program and the accompanying materials are made available under + * the terms of the Eclipse Public License v1.0 which accompanies this + * distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html */ +package it.ramecera.screwdriver.outfits; + +import it.ramecera.salad.everyday.Mix; +import it.ramecera.screwdriver.Wagon; + +/** + *

+ * Elements forming a quartz trigger. + *

+ *

+ * Company: Rameceraâ„¢
+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Modifications:
+ *

+ * + * @author M. Maglioni */ +final public class ClockHands { + + /** elements of a simple trigger */ + public String simple; + /** elements of a cron trigger */ + public String cron; + /** job name, with one or more triggers */ + public String jobName; + /** capitalized job name */ + public String jobNameU; + /** task name, with one or more triggers */ + public String taskName; + /** capitalized job name */ + public String taskNameU; + /** rail number where the DB quartz tables are placed */ + public int rail; + + /** default constructor */ + public ClockHands() { + + } + + /** + *

+ * Classic constructor. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Modifications:
+ *

+ * + * @param simpleV elements of a simple trigger + * @param cronV elements of a cron trigger + * @param jobNameV name of the job + * @param taskNameV name of the task + * @param railV rail where the DB tables for quartz are placed */ + public ClockHands(Wagon simpleV, Wagon cronV, Wagon jobNameV, + Wagon taskNameV, Wagon railV) { + super(); + if (simpleV != null) { + this.simple = simpleV.text.trim(); + } + if (cronV != null) { + this.cron = cronV.text.trim(); + } + if (jobNameV != null) { + this.jobName = jobNameV.text.trim(); + this.taskName = taskNameV.text.trim(); + this.jobNameU = Mix.uppercaseFirstChar(this.jobName); + this.taskNameU = Mix.uppercaseFirstChar(this.taskName); + } + if (railV.text.matches("d+")) { + this.rail = Integer.valueOf(railV.text); + } + } + +} diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/outfits/ControllerBelong.java b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/outfits/ControllerBelong.java new file mode 100644 index 0000000..ad9b995 --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/outfits/ControllerBelong.java @@ -0,0 +1,61 @@ +// +// https://www.ramecera.it/myscrewdriver.html +// e-mail: screwdriver@ramecera.it +// +/* This program and the accompanying materials are made available under + * the terms of the Eclipse Public License v1.0 which accompanies this + * distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html */ +package it.ramecera.screwdriver.outfits; + +import java.util.ArrayList; +import java.util.List; + +import it.ramecera.salad.everyday.Mix; + +/** + *

+ * Elements that go a class of type @Controller. + *

+ *

+ * Company: Rameceraâ„¢
+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Modifications:
+ *

+ * + * @author M. Maglioni */ +final public class ControllerBelong { + + /** the request group gives the class its name */ + public String gruppo; + /** the group with the initial maisucola */ + public String gruppoMaius; + /** the group with the initial minusucola */ + public String gruppoMinus; + /** the list of request-mappings and group-name-of-jsp */ + public List rmE = new ArrayList(); + + /** default constructor */ + public ControllerBelong() { + + } + + /** standard constructor + * + * @param gruppo name of the 1st segment of the mapping + * @param rmE collection of mapping-jsp pairs */ + public ControllerBelong(String gruppo, List rmE) { + super(); + if (gruppo.equals("")) { + this.gruppo = "dummy"; + } else { + this.gruppo = gruppo; + } + this.gruppoMaius = Mix.uppercaseFirstChar(this.gruppo); + this.gruppoMinus = Mix.lowercaseFirstChar(this.gruppo); + this.rmE = rmE; + } +} diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/outfits/Costume.java b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/outfits/Costume.java new file mode 100644 index 0000000..818b861 --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/outfits/Costume.java @@ -0,0 +1,126 @@ +// +// https://www.ramecera.it/myscrewdriver.html +// e-mail: screwdriver@ramecera.it +// +/* This program and the accompanying materials are made available under + * the terms of the Eclipse Public License v1.0 which accompanies this + * distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html */ +package it.ramecera.screwdriver.outfits; + +import it.ramecera.screwdriver.Train; + +/** + *

+ * Elements that go to form a CSS class. + *

+ *

+ * Company: Rameceraâ„¢
+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Modifications:
+ *

+ * + * @author M. Maglioni */ +final public class Costume { + + /** name of the CSS class */ + public String className; + /** CSS element */ + public String color; + /** CSS element */ + public String background_color; + /** CSS element */ + public String border_color; + /** CSS element */ + public String padding_top; + /** CSS element */ + public String padding_bottom; + /** CSS element */ + public String padding_left; + /** CSS element */ + public String padding_right; + /** CSS element */ + public String font_size; + /** CSS element */ + public String margin_top; + /** CSS element */ + public String text_align; + + /** default constructor */ + public Costume() { + + } + + /** + *

+ * Classic constructor. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Modifications:
+ *

+ * + * @param className CSS class name + * @param color CSS element + * @param background_color CSS element + * @param border_color CSS element + * @param padding_top CSS element + * @param padding_bottom CSS element + * @param padding_left CSS element + * @param padding_right CSS element + * @param font_size CSS element + * @param margin_top CSS element + * @param text_align CSS element */ + public Costume(final String className, final String color, + final String background_color, final String border_color, + final String padding_top, final String padding_bottom, + final String padding_left, final String padding_right, + final String font_size, final String margin_top, + final String text_align) { + super(); + this.className = className; + this.color = color; + this.background_color = background_color; + this.border_color = border_color; + this.padding_top = padding_top; + this.padding_bottom = padding_bottom; + this.padding_left = padding_left; + this.padding_right = padding_right; + this.font_size = font_size; + this.margin_top = margin_top; + this.text_align = text_align; + } + + /** + *

+ * Useful constructor. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Modifications:
+ *

+ * + * @param f the sling, with the locomotor and all its wagons */ + public Costume(Train f) { + this.className = f.locomotor.text; + this.color = f.wagonE.get("ocolor").text; + this.background_color = f.wagonE.get("obackcolor").text; + this.border_color = f.wagonE.get("ocolor").text; + this.padding_top = f.wagonE.get("opadding").text; + this.padding_bottom = f.wagonE.get("opadding").text; + this.padding_left = f.wagonE.get("opadding").text; + this.padding_right = f.wagonE.get("opadding").text; + this.font_size = f.wagonE.get("ofontsize").text; + this.margin_top = f.wagonE.get("omargin").text; + this.text_align = f.wagonE.get("oalign").text; + } +} diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/outfits/DBPlaceKit.java b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/outfits/DBPlaceKit.java new file mode 100644 index 0000000..6eb0475 --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/outfits/DBPlaceKit.java @@ -0,0 +1,60 @@ +// +// https://www.ramecera.it/myscrewdriver.html +// e-mail: screwdriver@ramecera.it +// +/* This program and the accompanying materials are made available under + * the terms of the Eclipse Public License v1.0 which accompanies this + * distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html */ +package it.ramecera.screwdriver.outfits; + +/** + *

+ * Elements forming a JSP. + *

+ *

+ * Company: Rameceraâ„¢
+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Modifications:
+ *

+ * + * @author M. Maglioni */ +final public class DBPlaceKit { + + /** the name of the schema DB */ + public String dbSchema; + /** the name of the JNDI */ + public String jndiName; + /** the name of the DBMS */ + public String dbms; + + /** default constructor */ + public DBPlaceKit() { + } + + /** + *

+ * Standard constructor. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Modifications:
+ *

+ * + * @param dbSchema the name of the DB schema + * @param jndiName the name of the JNDI + * @param dbms the name of the DBMS */ + public DBPlaceKit(final String dbSchema, final String jndiName, + final String dbms) { + super(); + this.dbSchema = dbSchema; + this.jndiName = jndiName; + this.dbms = dbms; + } +} diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/outfits/ELEMethod.java b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/outfits/ELEMethod.java new file mode 100644 index 0000000..9e77e7d --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/outfits/ELEMethod.java @@ -0,0 +1,123 @@ +// +// https://www.ramecera.it/myscrewdriver.html +// e-mail: screwdriver@ramecera.it +// +/* This program and the accompanying materials are made available under + * the terms of the Eclipse Public License v1.0 which accompanies this + * distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html */ +package it.ramecera.screwdriver.outfits; + +import java.util.ArrayList; +import java.util.List; + +import it.ramecera.salad.everyday.Candies; + +/** + *

+ * Elements forming a method described in the ele file. + *

+ *

+ * Company: Rameceraâ„¢
+ * Creation date: 2020-04-09
+ * Last updated: 2020-08-03 + *

+ *

+ * Modifications:
+ *

+ * + * @author M. Maglioni */ +final public class ELEMethod { + + /** name of the method */ + public String name; + /** the java source code */ + public String source; + /** method DAO arguments, type + object */ + public String upperArguments; + /** method DAO arguments, object only */ + public String lowerArguments; + + /** the list of DB tables involved in the method */ + public List tableE = new ArrayList(); + + /** the list of classes of the topic objects of the method */ + public List classE = new ArrayList(); + + /** default constructor */ + public ELEMethod() { + + } + + /** + *

+ * Classic constructor. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Modifications:
+ *

+ * + * @param name method name + * @param sorgente java source code + * @param upperArguments method arguments, type + object + * @param lowerArguments method arguments, only object + * @param tableE list of DB tables involved in the method + * @param classE list of types, optional, after the list of DAOs */ + public ELEMethod(final String name, final String sorgente, + final String upperArguments, final String lowerArguments, + List tableE, List classE) { + super(); + this.name = name; + this.source = sorgente; + this.upperArguments = upperArguments; + this.lowerArguments = lowerArguments; + this.tableE = tableE; + this.classE = classE; + } + + /** + *

+ * Classic toString method. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Modifications:
+ *

+ * + * @return the compound string */ + public String toString() { + String s = ""; + s += "********************" + Candies.LF; + s += "Method «" + name + "»" + Candies.LF + Candies.LF; + if (tableE.size() > 0) { + s += "Tables: "; + for (TableOutfit t : tableE) { + s += t.entityName + ", "; + } + /* I cut the last 2 characters */ + s = s.substring(0, s.length() - 2); + s += Candies.LF; + } + if (upperArguments != null) { + s += "Arguments with uppercase char.: " + upperArguments + + Candies.LF; + } + if (lowerArguments != null) { + s += "Arguments with lowercase char.: " + lowerArguments + + Candies.LF; + } + if (source != null) { + s += Candies.LF + "Source code:" + Candies.LF; + s += source + Candies.LF; + } + s += "********************" + Candies.LF; + return s; + } +} diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/outfits/JspBeanElement.java b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/outfits/JspBeanElement.java new file mode 100644 index 0000000..e707f4e --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/outfits/JspBeanElement.java @@ -0,0 +1,234 @@ +// +// https://www.ramecera.it/myscrewdriver.html +// e-mail: screwdriver@ramecera.it +// +/* This program and the accompanying materials are made available under + * the terms of the Eclipse Public License v1.0 which accompanies this + * distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html */ +package it.ramecera.screwdriver.outfits; + +import java.util.ArrayList; +import java.util.List; + +import it.ramecera.salad.everyday.ExactException; +import it.ramecera.salad.everyday.Mix; +import it.ramecera.screwdriver.Cst; +import it.ramecera.screwdriver.Wagon; +import it.ramecera.screwdriver.utilities.ValidConstScrew; + +/** + *

+ * Elements of each control present in a JSP. + *

+ *

+ * Company: Rameceraâ„¢
+ * Creation date: 2020-04-09
+ * Last updated: 2020-10-10 + *

+ *

+ * History: 2020-08-02 implementation of N13; 2020-10-10 implementation + * of N12 + *

+ * + * @author M. Maglioni */ +final public class JspBeanElement { + + /** name of the property */ + public String name; + /** name of the property with uppercase initial character */ + public String nameU; + /** data type: String, int, boolean, etc. */ + public String datumType; + /** if it is a data that participates in the structure of the + * connected JSP (true), or if it is only auxiliary (false); in + * practice, that one indicated by belong; it is auxiliary if it is + * part of the bean but is not directly exposed in the JSP */ + public boolean participate; + /** the label of the graphic control in the form */ + public String label; + /** the sign, that is the string that appears on the list-box when + * it is closed */ + public Wagon cartel; + /** if it has a button that immediately sends the chosen data + * online, the label inside the button; otherwise null */ + public Wagon button_label; + /** based on which side the fill SQL query starts */ + public Wagon dao; + /** the SQL query wagon to fill a dropdown graphic control */ + public Wagon hsqln; + /** the list of tokens to fill a dropdown graphic control */ + public Wagon ftokens; + /** only for radio buttons group, the initially selected element */ + public int startingRadio; + /** type of the control connected to this datum */ + public String controlType; + /** the list of validation constraints */ + public List validConstE = new ArrayList(); + + /** default constructor */ + public JspBeanElement() { + + } + + /** + *

+ * Company: Rameceraâ„¢
+ * Creation date: 2020-04-09
+ * Last updated: 2020-06-20 + *

+ * + * @param name name of the property + * @param datumType data type + * @param participate if it participates in the JSP text (true), or + * if it is only auxiliary (false) + * @param label the label of the graphic control in the form + * @param button_label the label of the button that puts immediately + * the data online + * @param validConstE validation constants + * @param controlType type of the control graphic element + * @author M. Maglioni */ + public JspBeanElement(final String name, final String datumType, + final boolean participate, final String label, + Wagon button_label, List validConstE, + final String controlType) { + super(); + this.name = name; + this.nameU = Mix.uppercaseFirstChar(this.name); + this.datumType = datumType; + this.participate = participate; + this.label = label; + this.button_label = button_label; + this.validConstE = validConstE; + this.controlType = controlType; + } + + /** + *

+ * Company: Rameceraâ„¢
+ * Creation date: 2020-04-09
+ * Last updated: 2020-10-10 + *

+ *

+ * History: 2020-08-02 implementation of N13 (see + * martoraProject.ods); 2020-10-10 implementation of N12 + *

+ * + * @param name name of the property + * @param datumType data type + * @param participate if it participates in the JSP text (true), or + * if it is only auxiliary (false) + * @param label the label of the grafdico control in the form + * @param cartel the cartel, that is the string that appears on the + * list-box when it is closed + * @param button_label the label of the button that puts the + * @param dao data online based on which side the filling SQL query + * @param hsqln the filling SQL query + * @param controlType type of the control element + * @param ftokens the filling list of tokens + * @param startingRadio only for radio buttons group, the element + * initially selected + * @author M. Maglioni + * @throws ExactException standard exception */ + public JspBeanElement(final String name, final String datumType, + final boolean participate, final String label, Wagon cartel, + Wagon button_label, Wagon dao, Wagon hsqln, + final String controlType, Wagon ftokens, + final int startingRadio) + + throws ExactException { + + super(); + this.name = name; + this.nameU = Mix.uppercaseFirstChar(this.name); + this.datumType = datumType; + this.participate = participate; + this.label = label; + this.cartel = cartel; + this.button_label = button_label; + ExactException ee = new ExactException(); + this.dao = dao; + if (dao != null) { + String[][] w = (String[][]) dao.substance; + for (int i = 0; i < w[0].length; i++) { + if (!w[0][i].startsWith(Cst.IRAILU)) { + ee.datum = "The value of markup dao+: " + Mix + .dress_A(w[0][i]) + + " is wrong, it must start with prefix " + + Mix.dress_A(Cst.IRAILU) + "."; + ee.code = 1300; + ee.className = this.getClass().getName(); + ee.method = "constructor of " + ee.className; + throw ee; + } else if (!w[0][i].endsWith("Dao")) { + ee.datum = "The value of markup dao+: " + Mix + .dress_A(w[0][i]) + + " is wrong, it must end with suffix \"Dao\"."; + ee.code = 1301; + ee.className = this.getClass().getName(); + ee.method = "constructor of " + ee.className; + throw ee; + } else if (!w[0][i].matches( + "IRail\\d+\\p{Upper}\\p{Graph}*")) { + ee.datum = "The value of markup dao: " + Mix + .dress_A(w[0][i]) + + " is wrong, it is a bad structured string."; + ee.code = 1302; + ee.className = this.getClass().getName(); + ee.method = "constructor of " + ee.className; + throw ee; + } + w[1][i] = w[0][i].replaceFirst("IR", "r"); + } + this.dao.substance = w; + } + this.hsqln = hsqln; + this.ftokens = ftokens; + this.controlType = controlType; + this.startingRadio = startingRadio; + } + + /** + *

+ * Classic toString method. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Modifications:
+ *

+ * + * @return the compound string + * @author M. Maglioni */ + public String toString() { + String s = ""; + s += "name=" + name; + if (datumType != null) { + s += "; type of datum=" + datumType; + } + s += "; participate=" + participate + "; label=" + label; + if (cartel != null) { + s += "; cartel=" + cartel.text; + } + if (button_label != null) { + s += "; button_label=" + button_label.text; + } + if (hsqln != null) { + s += "; hsqln=" + hsqln; + } + if (controlType != null) { + s += "; control type=" + controlType; + } + if (validConstE != null) { + for (int j = 0; j < validConstE.size(); j++) { + s += "; valid constant" + j + "=" + validConstE.get(j); + } + } + if (dao != null) { + + } + return s; + } +} \ No newline at end of file diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/outfits/JspKit.java b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/outfits/JspKit.java new file mode 100644 index 0000000..87b9293 --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/outfits/JspKit.java @@ -0,0 +1,206 @@ +// +// https://www.ramecera.it/myscrewdriver.html +// e-mail: screwdriver@ramecera.it +// +/* This program and the accompanying materials are made available under + * the terms of the Eclipse Public License v1.0 which accompanies this + * distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html */ +package it.ramecera.screwdriver.outfits; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.log4j.Logger; + +import it.ramecera.salad.everyday.Candies; +import it.ramecera.salad.everyday.Mix; +import it.ramecera.salad.graphic.Placard; +import it.ramecera.screwdriver.Cst; +import it.ramecera.screwdriver.Wagon; + +/** + *

+ * Elements forming a JSP. + *

+ *

+ * Company: Rameceraâ„¢
+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Modifications:
+ *

+ * + * @author M. Maglioni */ +final public class JspKit { + + /** the path, without final slash */ + public String path; + /** the name of the file without extension and without final dot */ + public String fileName; + /** the name of the file without extension and without final dot, + * first character uppercase */ + public String nomeFileU; + /** the extension without the initial dot */ + public String extension; + /** if I want the pragma feature */ + public boolean pragma; + /** when the jsp is form, the list of controls */ + public List controlE = new ArrayList(); + /** together with the request-maps that lead to this JSP through the + * Spring controllers */ + public List requestMapE = new ArrayList(); + /** presence in the JSP of a navigation bar */ + public String navigationBar; + /** navigation bar's Jsp kit */ + public MenuKit menuKit; + /** type of JSP: 0 = plain; 1 = form; 2 = model */ + public int jspType; + /** list of String properties of the JSP bean */ + public List stringPropertyE = new ArrayList(); + /** list of JSP bean ArrayList properties */ + public List arrayStringPropertyE = new ArrayList(); + /** list of Integer properties of the JSP bean */ + public List integerPropertyE = new ArrayList(); + /** list of Long type properties of the JSP bean */ + public List longPropertyE = new ArrayList(); + /** list of Boolean properties of the JSP bean */ + public List booleanPropertyE = new ArrayList(); + /** list of additional methods contained in the jsp bean */ + public List methodE = new ArrayList(); + /** placed in the list of trains */ + public int placeJ; + /** the predominant CSS class in this JSP */ + public String classeCss; + /** JSP refresh period, expressed in seconds */ + public int refresh; + /** title of the page to be placed in the center, clearly visible */ + public String pageTitle; + /** if it is a CRUD JSP, therefore with 4 buttons */ + public boolean crud; + /** if it is a JSP that must be born on a new TAB */ + public boolean blank; + /** legend parameter to show in the JSP */ + public String legend = ""; + + /** ordinary logger */ + private static final Logger logger = Logger.getLogger(JspKit.class); + + /** default constructor */ + public JspKit() { + + } + + /** + *

+ * Standard constructor. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Modifications:
+ *

+ * + * @param path the path, without final slash + * @param fileName the name of the file without extension and + * without final dot + * @param extension the extension without initial dot + * @param pragma if I want the pragma feature + * @param controlE if the jsp contains a form + * @param navigationBar name of the navigation bar to be inserted in + * the JSP + * @param methodE list of methods present as source code java + * @param placeJ place of the JSP markup in the list of trains + * @param classeCss the predominant CSS class in this JSP + * @param refresh refresh period of the JSP, expressed in seconds */ + public JspKit(final String path, final String fileName, + final String extension, final boolean pragma, + List controlE, final String navigationBar, + List methodE, final int placeJ, + final String classeCss, final int refresh) { + super(); + if (path.startsWith("/")) { + String message = "JSP " + path + "/" + fileName + "." + + extension + " path starts with a slash," + + " it will be automatically removed."; + logger.info(message); + new Placard(null, message, "Notice"); + this.path = path.substring(1); + } else { + this.path = path; + } + this.fileName = fileName; + this.nomeFileU = Mix.uppercaseFirstChar(fileName); + this.extension = extension; + this.pragma = pragma; + this.controlE = controlE; + this.navigationBar = navigationBar; + this.methodE = methodE; + this.placeJ = placeJ; + this.classeCss = classeCss; + this.refresh = refresh; + } + + /** + *

+ * Classic toString. + *

+ *

+ * Company: Rameceraâ„¢
+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09
+ *

+ *

+ * Modifications:
+ *

+ * + * @return the compound string */ + public String toString() { + String s = Candies.LF + Cst.CUT3; + s += " * Path and file name=" + path + "/" + fileName + + "." + extension + Candies.LF; + if (classeCss != null) { + s += " * CSS predominant className = " + classeCss + + Candies.LF; + } + if (legend != null && !legend.isEmpty()) { + s += " * legend = " + legend + Candies.LF; + } + if (crud) { + s += " * with CRUD" + Candies.LF; + } else { + s += " * no CRUD" + Candies.LF; + } + if (blank) { + s += " * with blank command" + Candies.LF; + } + if (requestMapE.size() > 0) { + s += " * Request mappings list:" + Candies.LF; + for (int i = 0; i < requestMapE.size(); i++) { + RequestMap rm = requestMapE.get(i); + s += " * " + i + ") " + rm.toString(); + } + s += Cst.CUT3; + } + if (stringPropertyE.size() > 0) { + s += " * Properties list of the linked bean:" + + Candies.LF; + for (int i = 0; i < stringPropertyE.size(); i++) { + JspBeanElement x = stringPropertyE.get(i); + s += " * " + i + ") " + x.toString() + + Candies.LF; + } + for (int i = 0; i < arrayStringPropertyE.size(); i++) { + JspBeanElement x = arrayStringPropertyE.get(i); + s += " * " + i + ") (array)" + x.toString() + + Candies.LF; + } + s += Cst.CUT3; + } + s += Cst.CUT3; + return s; + } +} diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/outfits/MenuKit.java b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/outfits/MenuKit.java new file mode 100644 index 0000000..ea977d6 --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/outfits/MenuKit.java @@ -0,0 +1,40 @@ +// +// https://www.ramecera.it/myscrewdriver.html +// e-mail: screwdriver@ramecera.it +// +/* This program and the accompanying materials are made available under + * the terms of the Eclipse Public License v1.0 which accompanies this + * distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html */ +package it.ramecera.screwdriver.outfits; + +import java.util.ArrayList; +import java.util.List; + +/** + *

+ * Elements forming a JSP menu. + *

+ *

+ * Company: Rameceraâ„¢
+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Modifications:
+ *

+ * + * @author M. Maglioni */ +final public class MenuKit { + + /** the menu items */ + public List clicE = new ArrayList(); + + /** default constructor */ + public MenuKit() { + } + + /** property of the navigation bar */ + public boolean navbarFixedTop; + +} diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/outfits/RequestMap.java b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/outfits/RequestMap.java new file mode 100644 index 0000000..d8fa811 --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/outfits/RequestMap.java @@ -0,0 +1,159 @@ +// +// https://www.ramecera.it/myscrewdriver.html +// e-mail: screwdriver@ramecera.it +// +/* This program and the accompanying materials are made available under + * the terms of the Eclipse Public License v1.0 which accompanies this + * distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html */ +package it.ramecera.screwdriver.outfits; + +import it.ramecera.salad.everyday.Candies; +import it.ramecera.salad.everyday.Mix; +import it.ramecera.screwdriver.Cst; + +/** + *

+ * Elements forming a set of request maps to be grouped in a class of + * jspType @Controller. + *

+ *

+ * Company: Rameceraâ„¢
+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Modifications:
+ *

+ * + * @author M. Maglioni */ +final public class RequestMap { + + /** the complete map */ + public String[] map; + /** the first segment of the map path, which must be cut to be + * shared by all methods, in the class RequestMapping */ + public String firstSegmentPath; + /** the path / jsp where the check ends */ + public String pathJsp; + /** the path / jsp indicated as redirect */ + public String pathRedirect; + /** the name of the jsp */ + public String jsp; + /** the name of the jsp with a capital initial */ + public String jspU; + /** the name of the path */ + public String path; + /** type of JSP requested by the request map: 0 = plain; 1 = form; 2 + * = model */ + public int tipo; + /** type of the JSP requested by the request map, lowercase + * initial */ + public String tipoX; + /** type of the JSP requested by the request map, capital initial */ + public String tipoU; + + /** useful constructor + * + * @param map the complete map + * @param pathJsp the path / jsp where the control ends + * @param pathJspRedirect TODO + * @param tipo JSP type: 0 = plain; 1 = form; 2 = model */ + + public RequestMap(final String map, final String pathJsp, + final String pathJspRedirect, final int tipo) { + super(); + String[] s = map.split("\\x2c"); + this.map = new String[s.length]; + for (int i = 0; i < s.length; i++) { + s[i] = s[i].trim(); + this.map[i] = s[i]; + } + for (int i = 0; i < s.length; i++) { + String[] m = s[i].split("\\x2f"); // x2f is the slash + /* if any of the paths do not have slashes, I give up the + * first segment */ + if (m.length == 1) { + this.firstSegmentPath = ""; + break; + /* if it is the first path, and it is useful, I take + * it */ + } else if (i == 0) { + this.firstSegmentPath = m[0]; + /* if it is a subsequent path, check that the first + * segment is not different; in which case, I give up + * the first segment */ + } else if (!m[0].equals(this.firstSegmentPath)) { + this.firstSegmentPath = ""; + break; + } + } + this.pathJsp = pathJsp; + this.pathRedirect = pathJspRedirect; + String[] p = pathJsp.split("\\x2f"); // x2f is the slash + if (p.length == 1) { + this.path = ""; + } else { + this.path = p[0]; + } + this.jsp = p[p.length - 1]; + this.jspU = Mix.uppercaseFirstChar(this.jsp); + this.tipo = tipo; + this.tipoX = Cst.JX[tipo]; + this.tipoU = Cst.JU[tipo]; + + } + + /** default constructor */ + public RequestMap() { + + } + + /** + *

+ * Classic toString method. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Modifications:
+ *

+ * + * @return the compound string */ + public String toString() { + String s = ""; + s += "map=" + map + "; tipo=" + tipo + "; primoSegmentoPath=" + + firstSegmentPath + Candies.LF; + return s; + + } + + /** + *

+ * Classic clone method. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Modifications:
+ *

+ * + * @return the compound string */ + public RequestMap clone() { + RequestMap x = new RequestMap(); + x.map = map; + x.firstSegmentPath = firstSegmentPath; + x.pathJsp = pathJsp; + x.jsp = jsp; + x.jspU = jspU; + x.path = path; + x.tipo = tipo; + x.tipoX = tipoX; + x.tipoU = tipoU; + return x; + } +} diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/outfits/TableOutfit.java b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/outfits/TableOutfit.java new file mode 100644 index 0000000..bd8f72f --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/outfits/TableOutfit.java @@ -0,0 +1,152 @@ +// +// https://www.ramecera.it/myscrewdriver.html +// e-mail: screwdriver@ramecera.it +// +/* This program and the accompanying materials are made available under + * the terms of the Eclipse Public License v1.0 which accompanies this + * distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html */ +package it.ramecera.screwdriver.outfits; + +import java.io.FileNotFoundException; +import java.io.IOException; + +import it.ramecera.salad.analysis.Flute; +import it.ramecera.salad.analysis.JavaAnnotation; +import it.ramecera.salad.everyday.Candies; +import it.ramecera.salad.everyday.ExactException; +import it.ramecera.salad.everyday.Mix; +import it.ramecera.screwdriver.CandyScrew; +import it.ramecera.screwdriver.Cst; + +/** + *

+ * Elements forming a JSP. + *

+ *

+ * Company: Rameceraâ„¢
+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Modifications:
+ *

+ * + * @author M. Maglioni */ +final public class TableOutfit { + + /** the real name of the table */ + public String tableName; + /** the real name of the table, first character uppercase */ + public String tableNameU; + /** the name of the table in JPA project */ + public String entityName; + /** the name of the table in JPA project, first character + * uppercase */ + public String entityNameU; + /** the path of the entity bean, expressed with points */ + public String pathDots; + /** the path of the entity bean, expressed with slashes */ + public String pathSlash; + /** Java analysis of the entity bean */ + public Flute flute; + /** the DB scheme */ + public String dbSchema; + /** the JNDI */ + public String jndi; + /** the abbreviation rail0, rail1, rail2, etc. which sums up the + * DB-place jndi-dbschema, all in lowercase */ + public String railLowercase; + /** the abbreviation rail0, rail1, rail2, etc. which sums up the + * place-DB jndi-dbschema, capital inial */ + public String railUppercase; + + /** default constructor */ + public TableOutfit() { + + } + + /** + *

+ * Standard constructor. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-06-20 + *

+ *

+ * Modifications:
+ *

+ * + * @param entityName the name of the table + * @param pathDots the path of the entity bean + * @param dbSchema DB schema of the DB table + * @param candies external properties + * @param jndi the JNDI + * @param stub stub of the "rail" markup, then simply the string + * "hdefrail" + * @param text «rail» markup text + * @throws IOException a standard exception + * @throws ExactException a standard exception + * @throws FileNotFoundException a standard exception */ + + public TableOutfit(final String entityName, final String pathDots, + final String dbSchema, CandyScrew candies, + final String jndi, final String stub, final String text) + + throws FileNotFoundException, ExactException, IOException { + + super(); + this.entityName = entityName; + this.entityNameU = Mix.uppercaseFirstChar(entityName); + this.pathDots = pathDots; + this.pathSlash = pathDots.replaceAll("\\x2e", "/"); + this.dbSchema = dbSchema.toLowerCase(); + this.jndi = jndi; + String s = Cst.RAIL + text; + railLowercase = s.toLowerCase(); + railUppercase = Mix.uppercaseFirstChar(railLowercase + .toLowerCase()); + this.flute = new Flute(candies.outputYS + this.jndi + .toLowerCase() + "-" + this.dbSchema + "/src/" + + pathSlash + "/" + entityName + ".java"); + this.flute.analyze(); + for (JavaAnnotation ja : this.flute.fannotationE) { + if (ja.fnome.equals("Table")) { + this.tableName = ja.paramE.get("name"); + this.tableNameU = Mix.uppercaseFirstChar(ja.paramE.get( + "name")); + } + } + } + + /** + *

+ * Classic toString() method. + *

+ *

+ * Company: Rameceraâ„¢
+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09
+ *

+ *

+ * Modifications:
+ *

+ * + * @return the compound string */ + public String toString() { + String s = ""; + s += Candies.LF + "********************" + Candies.LF; + s += "Entity «" + entityName + "»" + Candies.LF; + s += "Table «" + tableName + "»" + Candies.LF + Candies.LF; + s += "PathP = " + pathDots + Candies.LF; + s += "PathS = " + pathSlash + Candies.LF; + s += "DB schema = " + dbSchema + Candies.LF; + s += "JNDI = " + jndi + Candies.LF; + s += "Rail = " + railLowercase + Candies.LF; + s += "********************" + Candies.LF; + return s; + + } + +} diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/utilities/ValidConstScrew.java b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/utilities/ValidConstScrew.java new file mode 100644 index 0000000..470a077 --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/utilities/ValidConstScrew.java @@ -0,0 +1,72 @@ +// +// https://www.ramecera.it/myscrewdriver.html +// e-mail: screwdriver@ramecera.it +// +/* This program and the accompanying materials are made available under + * the terms of the Eclipse Public License v1.0 which accompanies this + * distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html */ +package it.ramecera.screwdriver.utilities; + +import it.ramecera.screwdriver.Wagon; + +/** + *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09
+ *

+ * + * @author M.Maglioni */ +public class ValidConstScrew { + + /** Creation date: 2020-04-09
+ * Last updated: 2020-04-09
+ * + * @author M.Maglioni + * @param valcons constants + * @param valparams parameters + * @param valtag tag */ + public ValidConstScrew(Wagon valcons, Wagon valparams, + Wagon valtag) { + super(); + this.valcons = valcons; + this.valparams = valparams; + this.valtag = valtag; + } + + /** the name of the validation constraint */ + public Wagon valcons; + /** parameters */ + public Wagon valparams; + /** message tag to be produced in case of error */ + public Wagon valtag; + + /** + *

+ * Classic toString method. + *

+ *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09 + *

+ *

+ * Modifications:
+ *

+ * + * @return the compound string + * @author M. Maglioni */ + public String toString() { + String s = ""; + if (valcons != null) { + s += "VC constraint=" + valcons.text; + } + if (valparams != null) { + s += "; VC parametri=" + valparams.text; + } + if (valtag != null) { + s += "; VC tag=" + valtag.text; + } + return s; + } + +} diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/utilities/ValidationLabelScrew.java b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/utilities/ValidationLabelScrew.java new file mode 100644 index 0000000..384a068 --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/utilities/ValidationLabelScrew.java @@ -0,0 +1,77 @@ +// +// https://www.ramecera.it/myscrewdriver.html +// e-mail: screwdriver@ramecera.it +// +/* This program and the accompanying materials are made available under + * the terms of the Eclipse Public License v1.0 which accompanies this + * distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html */ +package it.ramecera.screwdriver.utilities; + +/** + *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09
+ *

+ * + * @author M.Maglioni */ +public class ValidationLabelScrew { + + /** + *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09
+ *

+ * + * @author M.Maglioni + * @param label validation label + * @param languageCodeIndex language code */ + public ValidationLabelScrew(String label, int languageCodeIndex) { + super(); + this.label = label; + this.languageCodeIndex = languageCodeIndex; + } + + /** the message label */ + public String label; + /** index in the list of language codes */ + public int languageCodeIndex; + + /** + *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09
+ *

+ * + * @return the language code index */ + + @Override + public int hashCode() { + return languageCodeIndex; + } + + /** + *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09
+ *

+ * + * @param o object to evaluate + * @return true if equal, false if not equal */ + @Override + public boolean equals(Object o) { + if (o == null) { + return false; + } + if (o == this) { + return true; + } + if (!(o instanceof ValidationLabelScrew)) { + return false; + } + ValidationLabelScrew vl = (ValidationLabelScrew) o; + return vl.label.equals(label) + & vl.languageCodeIndex == languageCodeIndex; + } + +} diff --git a/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/utilities/ValidationMessageScrew.java b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/utilities/ValidationMessageScrew.java new file mode 100644 index 0000000..0474ed2 --- /dev/null +++ b/screwdriver-3.5.6/src/main/java/it/ramecera/screwdriver/utilities/ValidationMessageScrew.java @@ -0,0 +1,38 @@ +// +// https://www.ramecera.it/myscrewdriver.html +// e-mail: screwdriver@ramecera.it +// +/* This program and the accompanying materials are made available under + * the terms of the Eclipse Public License v1.0 which accompanies this + * distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html */ +package it.ramecera.screwdriver.utilities; + +/** + *

+ * Creation date: 2020-04-09
+ * Last updated: 2020-04-09
+ *

+ * + * @author M.Maglioni */ +public class ValidationMessageScrew { + + /** Creation date: 2020-04-09
+ * Last updated: 2020-04-09
+ * + * @author M.Maglioni + * @param vl validation label + * @param message obvious */ + public ValidationMessageScrew(ValidationLabelScrew vl, + final String message) { + super(); + this.vl = vl; + this.message = message.replaceAll("\\x27", "''"); + } + + /** the label + language of the message */ + public ValidationLabelScrew vl; + /** corresponding message */ + public String message; + +} diff --git a/screwdriver-3.5.6/target/classes/META-INF/MANIFEST.MF b/screwdriver-3.5.6/target/classes/META-INF/MANIFEST.MF new file mode 100644 index 0000000..a397208 --- /dev/null +++ b/screwdriver-3.5.6/target/classes/META-INF/MANIFEST.MF @@ -0,0 +1,7 @@ +Manifest-Version: 1.0 +Built-By: siwat +Build-Jdk: 14.0.2 +Class-Path: log4j-1.2.17.jar jsp-api-2.2.jar +Main-Class: it.ramecera.screwdriver.Hammer +Created-By: Maven Integration for Eclipse + diff --git a/screwdriver-3.5.6/target/classes/META-INF/maven/it.ramecera.ict/screwdriver/pom.properties b/screwdriver-3.5.6/target/classes/META-INF/maven/it.ramecera.ict/screwdriver/pom.properties new file mode 100644 index 0000000..a168d17 --- /dev/null +++ b/screwdriver-3.5.6/target/classes/META-INF/maven/it.ramecera.ict/screwdriver/pom.properties @@ -0,0 +1,7 @@ +#Generated by Maven Integration for Eclipse +#Thu Oct 29 15:42:14 ICT 2020 +m2e.projectLocation=C\:\\Users\\siwat\\GitHub\\ise-comprog-after-midterm\\screwdriver-3.5.6 +m2e.projectName=screwdriver-3.5.6 +groupId=it.ramecera.ict +artifactId=screwdriver +version=3.5.6 diff --git a/screwdriver-3.5.6/target/classes/META-INF/maven/it.ramecera.ict/screwdriver/pom.xml b/screwdriver-3.5.6/target/classes/META-INF/maven/it.ramecera.ict/screwdriver/pom.xml new file mode 100644 index 0000000..0f247d6 --- /dev/null +++ b/screwdriver-3.5.6/target/classes/META-INF/maven/it.ramecera.ict/screwdriver/pom.xml @@ -0,0 +1,51 @@ + + 4.0.0 + it.ramecera.ict + screwdriver + 3.5.6 + screwdriver + http://www.ramecera.it + + UTF-8 + + a java source code generator + + + log4j + log4j + 1.2.17 + + + javax.servlet.jsp + jsp-api + 2.2 + + + + src/main/java + + + org.apache.maven.plugins + maven-compiler-plugin + 2.3.2 + + 1.8 + 1.8 + + + + org.apache.maven.plugins + maven-jar-plugin + 3.1.0 + + + + true + it.ramecera.screwdriver.Hammer + + + + + + + \ No newline at end of file diff --git a/versions.properties b/versions.properties new file mode 100644 index 0000000..9d16a80 --- /dev/null +++ b/versions.properties @@ -0,0 +1,13 @@ +4.9=2018-09 +4.8=Photon +4.7=Oxygen +4.6=Neon +4.5=Mars +4.17=2020-09 +4.16=2020-06 +4.15=2020-03 +4.14=2019-12 +4.13=2019-09 +4.12=2019-06 +4.11=2019-03 +4.10=2018-12 \ No newline at end of file diff --git a/waxds-copper/.classpath b/waxds-copper/.classpath new file mode 100644 index 0000000..be86bf9 --- /dev/null +++ b/waxds-copper/.classpath @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/waxds-copper/.project b/waxds-copper/.project new file mode 100644 index 0000000..1ed733f --- /dev/null +++ b/waxds-copper/.project @@ -0,0 +1,34 @@ + + + waxds-copper + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.wst.common.project.facet.core.builder + + + + + org.eclipse.wst.validation.validationbuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.m2e.core.maven2Nature + org.eclipse.wst.common.project.facet.core.nature + org.eclipse.jdt.core.javanature + + diff --git a/waxds-copper/.settings/org.eclipse.jdt.core.prefs b/waxds-copper/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..4e4a3ad --- /dev/null +++ b/waxds-copper/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,9 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.release=disabled +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/waxds-copper/.settings/org.eclipse.jpt.core.prefs b/waxds-copper/.settings/org.eclipse.jpt.core.prefs new file mode 100644 index 0000000..7ff3376 --- /dev/null +++ b/waxds-copper/.settings/org.eclipse.jpt.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +org.eclipse.jpt.core.platform=generic2_1 +org.eclipse.jpt.jpa.core.discoverAnnotatedClasses=true diff --git a/waxds-copper/.settings/org.eclipse.jpt.entitygen.ramecerawax.copper b/waxds-copper/.settings/org.eclipse.jpt.entitygen.ramecerawax.copper new file mode 100644 index 0000000000000000000000000000000000000000..532b3e359f150919d9f8072feaa287e8cc86e3da GIT binary patch literal 1460 zcma)6%We}f6m=d=Uul!RC`Dq|CGiMWNFYI52rZgI)dE6nf;)4YxY*;tcA9AyNPGqh z{(zrAELg*mf8Zauo=KBQiU^TBqxjx??m71{Uw)G*qse`x+Y|!9V*~Uwws;tALqvIG zK}Sr`=ZE`GAlm5~t0cbwz1idfc7cVUN%kugNnwx7$XB2ZS5Xq131|CP2 z+w+kWLtK(*a(g1oIK^Rn`3+fm3n35S;C-O69wj&_O%s@q`Hj+n}W5CPpWc<>5yZ;u$GoAXM6>V z+TM}XJZdB5nta4H1Ws=1=4j9PWKlj%3*I05ad749f8)ajG;oXLfbnQJ-o zp%P%p9UldH{UP&k$nY=^hs?ViGA}34#UR_&9LzYmrOc*5kL6w)82&D`%5!$_%Cc#!Bbp|5K{!i2)Wrw?Z6}OTR>?htxa7dSi zlfBDK2e)8q`q$TQ*WUgpkz$j~3B|%@Du0j6+KvX(Q6fy@2M^PUt@dW{UB^?gWUbZ0 z!lngpwJ42Q@Q$^y!kgSujT;q!X4C{4dZFfLplOdKp`n3_W6+jd9}VX+79b(AxTvcs zORneS^{ymfb@G?pM}lO8+DG hjZxqbPFPpiCfJ~3Nj3jB88o8*ZAiPGw#Yp;l0W2W!_fc$ literal 0 HcmV?d00001 diff --git a/waxds-copper/.settings/org.eclipse.m2e.core.prefs b/waxds-copper/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 0000000..f897a7f --- /dev/null +++ b/waxds-copper/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/waxds-copper/.settings/org.eclipse.wst.common.project.facet.core.prefs.xml b/waxds-copper/.settings/org.eclipse.wst.common.project.facet.core.prefs.xml new file mode 100644 index 0000000..7961132 --- /dev/null +++ b/waxds-copper/.settings/org.eclipse.wst.common.project.facet.core.prefs.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/waxds-copper/.settings/org.eclipse.wst.common.project.facet.core.xml b/waxds-copper/.settings/org.eclipse.wst.common.project.facet.core.xml new file mode 100644 index 0000000..b73a2d9 --- /dev/null +++ b/waxds-copper/.settings/org.eclipse.wst.common.project.facet.core.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/waxds-copper/Eclipse Public License - Version 1.0.html b/waxds-copper/Eclipse Public License - Version 1.0.html new file mode 100644 index 0000000..bdec535 --- /dev/null +++ b/waxds-copper/Eclipse Public License - Version 1.0.html @@ -0,0 +1,259 @@ + + + + +Eclipse Public License - Version 1.0 + + + + + + +

Eclipse Public License - v 1.0

+ +

THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE +PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR +DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS +AGREEMENT.

+ +

1. DEFINITIONS

+ +

"Contribution" means:

+ +

a) in the case of the initial Contributor, the initial +code and documentation distributed under this Agreement, and

+

b) in the case of each subsequent Contributor:

+

i) changes to the Program, and

+

ii) additions to the Program;

+

where such changes and/or additions to the Program +originate from and are distributed by that particular Contributor. A +Contribution 'originates' from a Contributor if it was added to the +Program by such Contributor itself or anyone acting on such +Contributor's behalf. Contributions do not include additions to the +Program which: (i) are separate modules of software distributed in +conjunction with the Program under their own license agreement, and (ii) +are not derivative works of the Program.

+ +

"Contributor" means any person or entity that distributes +the Program.

+ +

"Licensed Patents" mean patent claims licensable by a +Contributor which are necessarily infringed by the use or sale of its +Contribution alone or when combined with the Program.

+ +

"Program" means the Contributions distributed in accordance +with this Agreement.

+ +

"Recipient" means anyone who receives the Program under +this Agreement, including all Contributors.

+ +

2. GRANT OF RIGHTS

+ +

a) Subject to the terms of this Agreement, each +Contributor hereby grants Recipient a non-exclusive, worldwide, +royalty-free copyright license to reproduce, prepare derivative works +of, publicly display, publicly perform, distribute and sublicense the +Contribution of such Contributor, if any, and such derivative works, in +source code and object code form.

+ +

b) Subject to the terms of this Agreement, each +Contributor hereby grants Recipient a non-exclusive, worldwide, +royalty-free patent license under Licensed Patents to make, use, sell, +offer to sell, import and otherwise transfer the Contribution of such +Contributor, if any, in source code and object code form. This patent +license shall apply to the combination of the Contribution and the +Program if, at the time the Contribution is added by the Contributor, +such addition of the Contribution causes such combination to be covered +by the Licensed Patents. The patent license shall not apply to any other +combinations which include the Contribution. No hardware per se is +licensed hereunder.

+ +

c) Recipient understands that although each Contributor +grants the licenses to its Contributions set forth herein, no assurances +are provided by any Contributor that the Program does not infringe the +patent or other intellectual property rights of any other entity. Each +Contributor disclaims any liability to Recipient for claims brought by +any other entity based on infringement of intellectual property rights +or otherwise. As a condition to exercising the rights and licenses +granted hereunder, each Recipient hereby assumes sole responsibility to +secure any other intellectual property rights needed, if any. For +example, if a third party patent license is required to allow Recipient +to distribute the Program, it is Recipient's responsibility to acquire +that license before distributing the Program.

+ +

d) Each Contributor represents that to its knowledge it +has sufficient copyright rights in its Contribution, if any, to grant +the copyright license set forth in this Agreement.

+ +

3. REQUIREMENTS

+ +

A Contributor may choose to distribute the Program in object code +form under its own license agreement, provided that:

+ +

a) it complies with the terms and conditions of this +Agreement; and

+ +

b) its license agreement:

+ +

i) effectively disclaims on behalf of all Contributors +all warranties and conditions, express and implied, including warranties +or conditions of title and non-infringement, and implied warranties or +conditions of merchantability and fitness for a particular purpose;

+ +

ii) effectively excludes on behalf of all Contributors +all liability for damages, including direct, indirect, special, +incidental and consequential damages, such as lost profits;

+ +

iii) states that any provisions which differ from this +Agreement are offered by that Contributor alone and not by any other +party; and

+ +

iv) states that source code for the Program is available +from such Contributor, and informs licensees how to obtain it in a +reasonable manner on or through a medium customarily used for software +exchange.

+ +

When the Program is made available in source code form:

+ +

a) it must be made available under this Agreement; and

+ +

b) a copy of this Agreement must be included with each +copy of the Program.

+ +

Contributors may not remove or alter any copyright notices contained +within the Program.

+ +

Each Contributor must identify itself as the originator of its +Contribution, if any, in a manner that reasonably allows subsequent +Recipients to identify the originator of the Contribution.

+ +

4. COMMERCIAL DISTRIBUTION

+ +

Commercial distributors of software may accept certain +responsibilities with respect to end users, business partners and the +like. While this license is intended to facilitate the commercial use of +the Program, the Contributor who includes the Program in a commercial +product offering should do so in a manner which does not create +potential liability for other Contributors. Therefore, if a Contributor +includes the Program in a commercial product offering, such Contributor +("Commercial Contributor") hereby agrees to defend and +indemnify every other Contributor ("Indemnified Contributor") +against any losses, damages and costs (collectively "Losses") +arising from claims, lawsuits and other legal actions brought by a third +party against the Indemnified Contributor to the extent caused by the +acts or omissions of such Commercial Contributor in connection with its +distribution of the Program in a commercial product offering. The +obligations in this section do not apply to any claims or Losses +relating to any actual or alleged intellectual property infringement. In +order to qualify, an Indemnified Contributor must: a) promptly notify +the Commercial Contributor in writing of such claim, and b) allow the +Commercial Contributor to control, and cooperate with the Commercial +Contributor in, the defense and any related settlement negotiations. The +Indemnified Contributor may participate in any such claim at its own +expense.

+ +

For example, a Contributor might include the Program in a commercial +product offering, Product X. That Contributor is then a Commercial +Contributor. If that Commercial Contributor then makes performance +claims, or offers warranties related to Product X, those performance +claims and warranties are such Commercial Contributor's responsibility +alone. Under this section, the Commercial Contributor would have to +defend claims against the other Contributors related to those +performance claims and warranties, and if a court requires any other +Contributor to pay any damages as a result, the Commercial Contributor +must pay those damages.

+ +

5. NO WARRANTY

+ +

EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS +PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS +OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, +ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY +OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely +responsible for determining the appropriateness of using and +distributing the Program and assumes all risks associated with its +exercise of rights under this Agreement , including but not limited to +the risks and costs of program errors, compliance with applicable laws, +damage to or loss of data, programs or equipment, and unavailability or +interruption of operations.

+ +

6. DISCLAIMER OF LIABILITY

+ +

EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT +NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING +WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR +DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED +HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

+ +

7. GENERAL

+ +

If any provision of this Agreement is invalid or unenforceable under +applicable law, it shall not affect the validity or enforceability of +the remainder of the terms of this Agreement, and without further action +by the parties hereto, such provision shall be reformed to the minimum +extent necessary to make such provision valid and enforceable.

+ +

If Recipient institutes patent litigation against any entity +(including a cross-claim or counterclaim in a lawsuit) alleging that the +Program itself (excluding combinations of the Program with other +software or hardware) infringes such Recipient's patent(s), then such +Recipient's rights granted under Section 2(b) shall terminate as of the +date such litigation is filed.

+ +

All Recipient's rights under this Agreement shall terminate if it +fails to comply with any of the material terms or conditions of this +Agreement and does not cure such failure in a reasonable period of time +after becoming aware of such noncompliance. If all Recipient's rights +under this Agreement terminate, Recipient agrees to cease use and +distribution of the Program as soon as reasonably practicable. However, +Recipient's obligations under this Agreement and any licenses granted by +Recipient relating to the Program shall continue and survive.

+ +

Everyone is permitted to copy and distribute copies of this +Agreement, but in order to avoid inconsistency the Agreement is +copyrighted and may only be modified in the following manner. The +Agreement Steward reserves the right to publish new versions (including +revisions) of this Agreement from time to time. No one other than the +Agreement Steward has the right to modify this Agreement. The Eclipse +Foundation is the initial Agreement Steward. The Eclipse Foundation may +assign the responsibility to serve as the Agreement Steward to a +suitable separate entity. Each new version of the Agreement will be +given a distinguishing version number. The Program (including +Contributions) may always be distributed subject to the version of the +Agreement under which it was received. In addition, after a new version +of the Agreement is published, Contributor may elect to distribute the +Program (including its Contributions) under the new version. Except as +expressly stated in Sections 2(a) and 2(b) above, Recipient receives no +rights or licenses to the intellectual property of any Contributor under +this Agreement, whether expressly, by implication, estoppel or +otherwise. All rights in the Program not expressly granted under this +Agreement are reserved.

+ +

This Agreement is governed by the laws of the State of New York and +the intellectual property laws of the United States of America. No party +to this Agreement will bring a legal action under this Agreement more +than one year after the cause of action arose. Each party waives its +rights to a jury trial in any resulting litigation.

+ + + + \ No newline at end of file diff --git a/waxds-copper/TermsOfUse.txt b/waxds-copper/TermsOfUse.txt new file mode 100644 index 0000000..59a4056 --- /dev/null +++ b/waxds-copper/TermsOfUse.txt @@ -0,0 +1,53 @@ +Definitions +Software: Any software that is made available to you +by plug-in "Drill", by the application "Screwdriver" +and all software associated to it. Your use of the +Software is governed by the terms of the end user +license agreement LGPL which accompanies or is +included with the Software ("License Agreement"). + +DISCLAIMER +THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY +OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT +LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF +COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO +EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY +GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR +CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF +CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE +USE OR INABILITY TO USE THE SOFTWARE OR FROM OTHER +DEALINGS IN THIS SOFTWARE. BEING A CODE GENERATOR, +THIS DECLARATION REFERS NOT ONLY TO THE SOFTWARE +PROVIDED, BUT ALSO TO ALL THE APPLICATIONS THAT WILL +BE GENERATED BY IT. +THE FINAL USER OF "SCREWDRIVER" OWNS THE INTELLECTUAL +PROPERTIES OF THE SOFTWARE HE HAS GENERATED. + +Definizioni +Software: qualsiasi software reso disponibile dal +plug-in "Drill", dall'applicazione "Screwdriver" e da +tutto il software ad esso associato. L'utilizzo del +software è regolato dai termini del contratto di +licenza per l'utente finale LGPL che accompagna o è +incluso nel software ("Contratto di licenza"). + +DECLINAZIONE DI RESPONSABILITA' +QUESTO SOFTWARE È FORNITO "COSÌ COM'È", SENZA ALCUN +TIPO DI GARANZIA, ESPRESSA O IMPLICITA, SENZA ALCUNA +GARANZIA DI COMMERCIABILITÀ, IDONEITÀ A UN +PARTICOLARE SCOPO E SENZA DIRITTO DI COPYRIGHT, +BREVETTO, MARCHIO O ALTRO DIRITTO. IN NESSUN CASO IL +TITOLARE DEL COPYRIGHT SARÀ RESPONSABILE DI QUALSIASI +RECLAMO, DANNO O ALTRA RESPONSABILITÀ, COMPRESO +QUALSIASI DANNO GENERALE, SPECIALE, INDIRETTO, +INCIDENTALE O CONSEQUENZIALE, SIA NELL'AMBITO DI UN +CONTRATTO, SIA DI UNA CONTROVERSIA O ALTRO, DERIVANTE +DALL'UTILIZZO O DALL'IMPOSSIBILITÀ DI UTILIZZARE +QUESTO SOFTWARE. TRATTANDOSI DI UN GENERATORE DI +CODICE, QUESTA DICHIARAZIONE SI RIFERISCE NON SOLO AL +SOFTWARE FORNITO, MA ANCHE A TUTTE LE APPLICAZIONI +CHE SARANNO DA ESSO GENERATE. +L'UTENTE FINALE DI "CACCIAVITE" DETIENE LA PROPRIETÀ +INTELLETTUALE DEL SOFTWARE CHE HA GENERATO. \ No newline at end of file diff --git a/waxds-copper/createSchema.sql b/waxds-copper/createSchema.sql new file mode 100644 index 0000000..d6da558 --- /dev/null +++ b/waxds-copper/createSchema.sql @@ -0,0 +1 @@ +CREATE SCHEMA copper; \ No newline at end of file diff --git a/waxds-copper/dropCreateAll.sql b/waxds-copper/dropCreateAll.sql new file mode 100644 index 0000000..bd95f9c --- /dev/null +++ b/waxds-copper/dropCreateAll.sql @@ -0,0 +1,86 @@ +drop trigger trg_novels on copper.novels; +drop trigger trg_authors on copper.authors; +drop trigger trg_actors on copper.actors; + +ALTER TABLE copper.novels + DROP CONSTRAINT nvl_FK_thrs; +ALTER TABLE copper.novels + DROP CONSTRAINT nvl_FK_ctrs; +ALTER TABLE copper.authors + DROP CONSTRAINT thrs_FK_ctrs; + +drop table copper.novels; +drop table copper.authors; +drop table copper.actors; + +drop sequence copper.novels_star_seq; +drop sequence copper.authors_star_seq; +drop sequence copper.actors_star_seq; + +CREATE SEQUENCE copper.novels_star_seq; +CREATE SEQUENCE copper.authors_star_seq; +CREATE SEQUENCE copper.actors_star_seq; + +CREATE TABLE copper.novels ( + star INTEGER DEFAULT nextval('copper.novels_star_seq') NOT NULL PRIMARY KEY, + title VARCHAR(1023) NOT NULL, + language VARCHAR(255) NOT NULL, + author integer NOT NULL, + modifier integer NOT NULL, + creationDate timestamp NOT NULL DEFAULT now(), + updateDate timestamp +) tablespace waxts; + +CREATE TABLE copper.authors ( + star INTEGER DEFAULT nextval('copper.authors_star_seq') NOT NULL PRIMARY KEY, + name VARCHAR(255) NOT NULL, + surname VARCHAR(255) NOT NULL, + modifier integer NOT NULL, + creationDate timestamp NOT NULL DEFAULT now(), + updateDate timestamp +) tablespace waxts; + +CREATE TABLE copper.actors ( + star INTEGER DEFAULT nextval('copper.actors_star_seq') NOT NULL PRIMARY KEY, + userid VARCHAR(255), + password VARCHAR(255), + lastUpdatePassword timestamp, + firstLogin timestamp, + lastLogin timestamp, + penalities INTEGER, + firstname VARCHAR(255) NOT NULL, + lastname VARCHAR(255) NOT NULL, + rating INTEGER NOT NULL DEFAULT 0, + creationDate timestamp NOT NULL DEFAULT now(), + updateDate timestamp +) tablespace waxts; + +create trigger trg_novels before update +on copper.novels for each row +execute procedure upd_dt(); +create trigger trg_authors before update +on copper.authors for each row +execute procedure upd_dt(); +create trigger trg_actors before update +on copper.actors for each row +execute procedure upd_dt(); + +ALTER TABLE copper.novels + ADD CONSTRAINT nvl_FK_thrs + FOREIGN KEY(author) + REFERENCES copper.authors(star) + ON DELETE CASCADE + ON UPDATE CASCADE; +ALTER TABLE copper.novels + ADD CONSTRAINT nvl_FK_ctrs + FOREIGN KEY(modifier) + REFERENCES copper.actors(star) + ON DELETE CASCADE + ON UPDATE CASCADE; +ALTER TABLE copper.authors + ADD CONSTRAINT thrs_FK_ctrs + FOREIGN KEY(modifier) + REFERENCES copper.actors(star) + ON DELETE CASCADE + ON UPDATE CASCADE; + diff --git a/waxds-copper/function_upd_dt.sql b/waxds-copper/function_upd_dt.sql new file mode 100644 index 0000000..ef30a1d --- /dev/null +++ b/waxds-copper/function_upd_dt.sql @@ -0,0 +1,7 @@ +create or replace function upd_dt() +returns trigger as ' +begin + NEW.updatedate := current_timestamp; + RETURN NEW; +end; +' LANGUAGE plpgsql; \ No newline at end of file diff --git a/waxds-copper/inserts.sql b/waxds-copper/inserts.sql new file mode 100644 index 0000000..b3427ed --- /dev/null +++ b/waxds-copper/inserts.sql @@ -0,0 +1,13 @@ +INSERT INTO copper.actors VALUES (1, NULL, NULL, NULL, NULL, NULL, NULL, 'Thomas', 'Johnson', 0, '2020-06-04 18:00:38.317374', NULL); +INSERT INTO copper.actors VALUES (2, NULL, NULL, NULL, NULL, NULL, NULL, 'Kevin', 'Livingstone', 0, '2020-06-04 18:01:58.164193', NULL); +INSERT INTO copper.actors VALUES (0, NULL, NULL, NULL, NULL, NULL, NULL, 'nobody', 'nobody', 0, '2020-06-25 18:46:32.042848', NULL); +INSERT INTO copper.authors VALUES (2, 'Charles', 'Dickens', 2, '2020-06-04 18:04:14.023161', NULL); +INSERT INTO copper.authors VALUES (3, 'Mark', 'Twain', 2, '2020-06-04 18:06:06.444514', NULL); +INSERT INTO copper.authors VALUES (4, 'Carson', 'McCullers', 1, '2020-06-04 18:11:25.001664', NULL); +INSERT INTO copper.authors VALUES (5, 'Norman', 'Mailer', 2, '2020-06-04 18:11:25.009645', NULL); +INSERT INTO copper.authors VALUES (6, 'Truman', 'Capote', 2, '2020-06-04 18:12:05.758629', NULL); +INSERT INTO copper.novels VALUES (1, 'David Copperfield', 'english', 2, 2, '2020-06-04 18:18:56.673253', NULL); +INSERT INTO copper.novels VALUES (3, 'Oliver Twist', 'english', 2, 1, '2020-06-04 18:20:08.404755', NULL); +INSERT INTO copper.novels VALUES (4, 'A Christmas Carol', 'english', 2, 2, '2020-06-04 18:21:17.88829', NULL); +INSERT INTO copper.novels VALUES (5, 'The Naked and the Dead', 'english', 5, 1, '2020-06-04 18:23:12.513388', NULL); +INSERT INTO copper.novels VALUES (6, 'The Executioner''s Song', 'english', 5, 2, '2020-06-04 18:24:05.237597', NULL); diff --git a/waxds-copper/makeJar.jardesc b/waxds-copper/makeJar.jardesc new file mode 100644 index 0000000..119d6c6 --- /dev/null +++ b/waxds-copper/makeJar.jardesc @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/waxds-copper/pom.xml b/waxds-copper/pom.xml new file mode 100644 index 0000000..19faf41 --- /dev/null +++ b/waxds-copper/pom.xml @@ -0,0 +1,39 @@ + + 4.0.0 + it.ramecera.ict + waxds-copper + 0.2.0 + https://www.ramecera.it + a JPA project for "Hello world" by Screwdriver + + UTF-8 + + + + javax.persistence + persistence-api + 1.0 + + + + src + + + src + + + + + + + + maven-compiler-plugin + 3.7.0 + + 1.8 + 1.8 + + + + + \ No newline at end of file diff --git a/waxds-copper/src/META-INF/persistence.xml b/waxds-copper/src/META-INF/persistence.xml new file mode 100644 index 0000000..a69f0e5 --- /dev/null +++ b/waxds-copper/src/META-INF/persistence.xml @@ -0,0 +1,8 @@ + + + + it.ramecera.screwdriver.waxds.copper.Actor + it.ramecera.screwdriver.waxds.copper.Author + it.ramecera.screwdriver.waxds.copper.Novel + + diff --git a/waxds-copper/src/it/ramecera/screwdriver/waxds/copper/Actor.java b/waxds-copper/src/it/ramecera/screwdriver/waxds/copper/Actor.java new file mode 100644 index 0000000..572eec9 --- /dev/null +++ b/waxds-copper/src/it/ramecera/screwdriver/waxds/copper/Actor.java @@ -0,0 +1,199 @@ +package it.ramecera.screwdriver.waxds.copper; + +import java.io.Serializable; +import java.sql.Timestamp; +import java.util.List; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.NamedQuery; +import javax.persistence.OneToMany; +import javax.persistence.Table; + +/** The persistent class for the actors database table. */ +@Entity +@Table(name = "actors", schema = "copper") +@NamedQuery(name = "Actor.findAll", query = "SELECT a FROM Actor a") +public class Actor implements Serializable { + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Integer star; + + private Timestamp creationdate; + + private Timestamp firstlogin; + + private String firstname; + + private Timestamp lastlogin; + + private String lastname; + + private Timestamp lastupdatepassword; + + private String password; + + private Integer penalities; + + private Integer rating; + + private Timestamp updatedate; + + private String userid; + + // bi-directional many-to-one association to Author + @OneToMany(mappedBy = "actor") + private List authors; + + // bi-directional many-to-one association to Novel + @OneToMany(mappedBy = "actor") + private List novels; + + public Actor() { + } + + public Integer getStar() { + return this.star; + } + + public void setStar(Integer star) { + this.star = star; + } + + public Timestamp getCreationdate() { + return this.creationdate; + } + + public void setCreationdate(Timestamp creationdate) { + this.creationdate = creationdate; + } + + public Timestamp getFirstlogin() { + return this.firstlogin; + } + + public void setFirstlogin(Timestamp firstlogin) { + this.firstlogin = firstlogin; + } + + public String getFirstname() { + return this.firstname; + } + + public void setFirstname(String firstname) { + this.firstname = firstname; + } + + public Timestamp getLastlogin() { + return this.lastlogin; + } + + public void setLastlogin(Timestamp lastlogin) { + this.lastlogin = lastlogin; + } + + public String getLastname() { + return this.lastname; + } + + public void setLastname(String lastname) { + this.lastname = lastname; + } + + public Timestamp getLastupdatepassword() { + return this.lastupdatepassword; + } + + public void setLastupdatepassword(Timestamp lastupdatepassword) { + this.lastupdatepassword = lastupdatepassword; + } + + public String getPassword() { + return this.password; + } + + public void setPassword(String password) { + this.password = password; + } + + public Integer getPenalities() { + return this.penalities; + } + + public void setPenalities(Integer penalities) { + this.penalities = penalities; + } + + public Integer getRating() { + return this.rating; + } + + public void setRating(Integer rating) { + this.rating = rating; + } + + public Timestamp getUpdatedate() { + return this.updatedate; + } + + public void setUpdatedate(Timestamp updatedate) { + this.updatedate = updatedate; + } + + public String getUserid() { + return this.userid; + } + + public void setUserid(String userid) { + this.userid = userid; + } + + public List getAuthors() { + return this.authors; + } + + public void setAuthors(List authors) { + this.authors = authors; + } + + public Author addAuthor(Author author) { + getAuthors().add(author); + author.setActor(this); + + return author; + } + + public Author removeAuthor(Author author) { + getAuthors().remove(author); + author.setActor(null); + + return author; + } + + public List getNovels() { + return this.novels; + } + + public void setNovels(List novels) { + this.novels = novels; + } + + public Novel addNovel(Novel novel) { + getNovels().add(novel); + novel.setActor(this); + + return novel; + } + + public Novel removeNovel(Novel novel) { + getNovels().remove(novel); + novel.setActor(null); + + return novel; + } + +} \ No newline at end of file diff --git a/waxds-copper/src/it/ramecera/screwdriver/waxds/copper/Author.java b/waxds-copper/src/it/ramecera/screwdriver/waxds/copper/Author.java new file mode 100644 index 0000000..d254c24 --- /dev/null +++ b/waxds-copper/src/it/ramecera/screwdriver/waxds/copper/Author.java @@ -0,0 +1,118 @@ +package it.ramecera.screwdriver.waxds.copper; + +import java.io.Serializable; +import java.sql.Timestamp; +import java.util.List; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.NamedQuery; +import javax.persistence.OneToMany; +import javax.persistence.Table; + +/** The persistent class for the authors database table. */ +@Entity +@Table(name = "authors", schema = "copper") +@NamedQuery(name = "Author.findAll", query = "SELECT a FROM Author a") +public class Author implements Serializable { + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Integer star; + + private Timestamp creationdate; + + private String name; + + private String surname; + + private Timestamp updatedate; + + // bi-directional many-to-one association to Actor + @ManyToOne + @JoinColumn(name = "modifier") + private Actor actor; + + // bi-directional many-to-one association to Novel + @OneToMany(mappedBy = "authorBean") + private List novels; + + public Author() { + } + + public Integer getStar() { + return this.star; + } + + public void setStar(Integer star) { + this.star = star; + } + + public Timestamp getCreationdate() { + return this.creationdate; + } + + public void setCreationdate(Timestamp creationdate) { + this.creationdate = creationdate; + } + + public String getName() { + return this.name; + } + + public void setName(String name) { + this.name = name; + } + + public String getSurname() { + return this.surname; + } + + public void setSurname(String surname) { + this.surname = surname; + } + + public Timestamp getUpdatedate() { + return this.updatedate; + } + + public void setUpdatedate(Timestamp updatedate) { + this.updatedate = updatedate; + } + + public Actor getActor() { + return this.actor; + } + + public void setActor(Actor actor) { + this.actor = actor; + } + + public List getNovels() { + return this.novels; + } + + public void setNovels(List novels) { + this.novels = novels; + } + + public Novel addNovel(Novel novel) { + getNovels().add(novel); + novel.setAuthorBean(this); + + return novel; + } + + public Novel removeNovel(Novel novel) { + getNovels().remove(novel); + novel.setAuthorBean(null); + + return novel; + } + +} \ No newline at end of file diff --git a/waxds-copper/src/it/ramecera/screwdriver/waxds/copper/Novel.java b/waxds-copper/src/it/ramecera/screwdriver/waxds/copper/Novel.java new file mode 100644 index 0000000..f73eb48 --- /dev/null +++ b/waxds-copper/src/it/ramecera/screwdriver/waxds/copper/Novel.java @@ -0,0 +1,103 @@ +package it.ramecera.screwdriver.waxds.copper; + +import java.io.Serializable; +import java.sql.Timestamp; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.NamedQuery; +import javax.persistence.Table; + +/** The persistent class for the novels database table. */ +@Entity +@Table(name = "novels", schema = "copper") +@NamedQuery(name = "Novel.findAll", query = "SELECT n FROM Novel n") +public class Novel implements Serializable { + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Integer star; + + private Timestamp creationdate; + + private String language; + + private String title; + + private Timestamp updatedate; + + // bi-directional many-to-one association to Actor + @ManyToOne + @JoinColumn(name = "modifier") + private Actor actor; + + // bi-directional many-to-one association to Author + @ManyToOne + @JoinColumn(name = "author") + private Author authorBean; + + public Novel() { + } + + public Integer getStar() { + return this.star; + } + + public void setStar(Integer star) { + this.star = star; + } + + public Timestamp getCreationdate() { + return this.creationdate; + } + + public void setCreationdate(Timestamp creationdate) { + this.creationdate = creationdate; + } + + public String getLanguage() { + return this.language; + } + + public void setLanguage(String language) { + this.language = language; + } + + public String getTitle() { + return this.title; + } + + public void setTitle(String title) { + this.title = title; + } + + public Timestamp getUpdatedate() { + return this.updatedate; + } + + public void setUpdatedate(Timestamp updatedate) { + this.updatedate = updatedate; + } + + public Actor getActor() { + return this.actor; + } + + public void setActor(Actor actor) { + this.actor = actor; + } + + public Author getAuthorBean() { + return this.authorBean; + } + + public void setAuthorBean(Author authorBean) { + this.authorBean = authorBean; + } + +} \ No newline at end of file diff --git a/waxds-copper/target/classes/META-INF/MANIFEST.MF b/waxds-copper/target/classes/META-INF/MANIFEST.MF new file mode 100644 index 0000000..da8beab --- /dev/null +++ b/waxds-copper/target/classes/META-INF/MANIFEST.MF @@ -0,0 +1,5 @@ +Manifest-Version: 1.0 +Built-By: siwat +Build-Jdk: 14.0.2 +Created-By: Maven Integration for Eclipse + diff --git a/waxds-copper/target/classes/META-INF/maven/it.ramecera.ict/waxds-copper/pom.properties b/waxds-copper/target/classes/META-INF/maven/it.ramecera.ict/waxds-copper/pom.properties new file mode 100644 index 0000000..b2ca369 --- /dev/null +++ b/waxds-copper/target/classes/META-INF/maven/it.ramecera.ict/waxds-copper/pom.properties @@ -0,0 +1,7 @@ +#Generated by Maven Integration for Eclipse +#Thu Oct 29 15:42:21 ICT 2020 +m2e.projectLocation=C\:\\Users\\siwat\\GitHub\\ise-comprog-after-midterm\\waxds-copper +m2e.projectName=waxds-copper +groupId=it.ramecera.ict +artifactId=waxds-copper +version=0.2.0 diff --git a/waxds-copper/target/classes/META-INF/maven/it.ramecera.ict/waxds-copper/pom.xml b/waxds-copper/target/classes/META-INF/maven/it.ramecera.ict/waxds-copper/pom.xml new file mode 100644 index 0000000..19faf41 --- /dev/null +++ b/waxds-copper/target/classes/META-INF/maven/it.ramecera.ict/waxds-copper/pom.xml @@ -0,0 +1,39 @@ + + 4.0.0 + it.ramecera.ict + waxds-copper + 0.2.0 + https://www.ramecera.it + a JPA project for "Hello world" by Screwdriver + + UTF-8 + + + + javax.persistence + persistence-api + 1.0 + + + + src + + + src + + + + + + + + maven-compiler-plugin + 3.7.0 + + 1.8 + 1.8 + + + + + \ No newline at end of file diff --git a/waxds-copper/target/classes/META-INF/persistence.xml b/waxds-copper/target/classes/META-INF/persistence.xml new file mode 100644 index 0000000..a69f0e5 --- /dev/null +++ b/waxds-copper/target/classes/META-INF/persistence.xml @@ -0,0 +1,8 @@ + + + + it.ramecera.screwdriver.waxds.copper.Actor + it.ramecera.screwdriver.waxds.copper.Author + it.ramecera.screwdriver.waxds.copper.Novel + + diff --git a/waxds-copper/target/classes/it/ramecera/screwdriver/waxds/copper/Actor.class b/waxds-copper/target/classes/it/ramecera/screwdriver/waxds/copper/Actor.class new file mode 100644 index 0000000000000000000000000000000000000000..1db24710be1f711c980c8382d56b6020055654f7 GIT binary patch literal 5415 zcmbW3`*RdU5XXB%a!D>50)YfU(TJ#d0OtdI1w)PyAb2DpFCHSYxm%Krm%U?mFAzip zMFm6!MMXsg#qtL&OD%;GORKc}$v?{S+cUeDyUiRXq$)SNGd=0DaV>Jo!AlMXv&QxGubR&;z=*#R8qM{izbXIBbGMo zu~^^egqidzDWcI*(Q9R5gQjB{Y3rCVnl@qViq{d-ajlF!+_Oa^ZHGp+T^ZZ;4BHzq z(mAsNH2kM&RE}Opqa}$MCq1@jj+suoM#~3swr5S6BbIAHJ#O0>&+wq@YSbuZ9F2k1 zwOr4%lV+?Zg-NRv1KUg+i}lQua1Wy@*W>rG>08>v)6jI*gnfB@c&JY!9nlg1DNIHT zB(-}u9UB5BmNJ=zarBVoxL!IlX4x85ix(U5)~LQ<#>CumMaZ{zKy9T^DBhMn+Z@X5H0)`NS4|p7uheD)zQW)X1H7G? zGSh(TxIOQ^JY6`CY_x34>(FRHbIS-ett*oC{SX8r3B%+w9Fvj+)MpOxOBE zCTXNc45Tm;%XOZ3edfMpXw?(_U-bXv~-d47ICqZ;3i)!3|0 zrxom`#y9i5_*TV7hV2J+x|3xaeEVVxso(D(F}B~W(_Mjn&@aQ)pFeVJ_pDAUc{4d& zGb1=qAQ=$nk*%KB>29{FhL!AF z-r~XWt`D}R@PNl>b3?K_~f|La=3(jLmhaq8xDqBeLpiw02(0#`$y1Nz_ysWM2Cl zI=#v3jK~3*mZI#UOm^OGdIfcxv+FILnmM~TvjgGyZKhG6%Q2|J&WLx7_RTSXa{3%o zMH+LaT+rz>O+@K^-tCKX{mSy$Dr~;P=6vNyuc%ydKYWqsU?%4z&8-%Hhebu&tmAam zXoccZ?#7pu$2anF#h^H97%P{xH6m_m>~+LVj+>KEjL5GnHMd}xM)$RMT=4_ zS`=H+qVPfeKJmO-xUYfR`|Muq)*H0;M9G)gPqJ*&&$YruQT*D3^Q4})w`f;>$fDv#K5=xNGYLLz_NIyV!l>p&9V~{S|g5U7gbcaEPlpxz^yFa;TYr4ZAdjPVx1PCWO zgY+mPvLg(#UkQ>>M`TAB&U(^ z$Z;jeesvw$7X~>2kdq}qxY{zvb4ri{VUSZwkb`QF17VQU069|vgv&jH7|I+O4TGFh zf~3?rG8zUs50DEbK={645L1~Whr%Eil_2Bl961yQxdf1pOMvi&#~}FTMfsN(-V3t| zTRIGMSqWrQCNGi|BK>&J-#uvtTOe*OdG%cZ*wqqXd;@DZW5Kl;!H2?Xf$ETpmTPaX zuU_AJoxHYRX{wBNx8eDC+YIkQcqF<;HS{$;9lj~>R-eD=>giQ_O=zDgsr@=@Ybxz; zq5U1SzyBX?d@Sapb7oeE&(0vrYyBr>h|d*-`0d#tJ{u14b%gjv0azrz=!p1+DGqTn zwTLjhL+>g=e7+#W@68JFO@!e$gyHuBZ-pWLfIbx3AC=S&LOfghPiX%I?Z0oST}GF% k)n&+a{$5;#jsFDgr|7xt(r5I!OJC3x`F54Qbm^=A0LXPIM*si- literal 0 HcmV?d00001 diff --git a/waxds-copper/target/classes/it/ramecera/screwdriver/waxds/copper/Actor.java b/waxds-copper/target/classes/it/ramecera/screwdriver/waxds/copper/Actor.java new file mode 100644 index 0000000..572eec9 --- /dev/null +++ b/waxds-copper/target/classes/it/ramecera/screwdriver/waxds/copper/Actor.java @@ -0,0 +1,199 @@ +package it.ramecera.screwdriver.waxds.copper; + +import java.io.Serializable; +import java.sql.Timestamp; +import java.util.List; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.NamedQuery; +import javax.persistence.OneToMany; +import javax.persistence.Table; + +/** The persistent class for the actors database table. */ +@Entity +@Table(name = "actors", schema = "copper") +@NamedQuery(name = "Actor.findAll", query = "SELECT a FROM Actor a") +public class Actor implements Serializable { + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Integer star; + + private Timestamp creationdate; + + private Timestamp firstlogin; + + private String firstname; + + private Timestamp lastlogin; + + private String lastname; + + private Timestamp lastupdatepassword; + + private String password; + + private Integer penalities; + + private Integer rating; + + private Timestamp updatedate; + + private String userid; + + // bi-directional many-to-one association to Author + @OneToMany(mappedBy = "actor") + private List authors; + + // bi-directional many-to-one association to Novel + @OneToMany(mappedBy = "actor") + private List novels; + + public Actor() { + } + + public Integer getStar() { + return this.star; + } + + public void setStar(Integer star) { + this.star = star; + } + + public Timestamp getCreationdate() { + return this.creationdate; + } + + public void setCreationdate(Timestamp creationdate) { + this.creationdate = creationdate; + } + + public Timestamp getFirstlogin() { + return this.firstlogin; + } + + public void setFirstlogin(Timestamp firstlogin) { + this.firstlogin = firstlogin; + } + + public String getFirstname() { + return this.firstname; + } + + public void setFirstname(String firstname) { + this.firstname = firstname; + } + + public Timestamp getLastlogin() { + return this.lastlogin; + } + + public void setLastlogin(Timestamp lastlogin) { + this.lastlogin = lastlogin; + } + + public String getLastname() { + return this.lastname; + } + + public void setLastname(String lastname) { + this.lastname = lastname; + } + + public Timestamp getLastupdatepassword() { + return this.lastupdatepassword; + } + + public void setLastupdatepassword(Timestamp lastupdatepassword) { + this.lastupdatepassword = lastupdatepassword; + } + + public String getPassword() { + return this.password; + } + + public void setPassword(String password) { + this.password = password; + } + + public Integer getPenalities() { + return this.penalities; + } + + public void setPenalities(Integer penalities) { + this.penalities = penalities; + } + + public Integer getRating() { + return this.rating; + } + + public void setRating(Integer rating) { + this.rating = rating; + } + + public Timestamp getUpdatedate() { + return this.updatedate; + } + + public void setUpdatedate(Timestamp updatedate) { + this.updatedate = updatedate; + } + + public String getUserid() { + return this.userid; + } + + public void setUserid(String userid) { + this.userid = userid; + } + + public List getAuthors() { + return this.authors; + } + + public void setAuthors(List authors) { + this.authors = authors; + } + + public Author addAuthor(Author author) { + getAuthors().add(author); + author.setActor(this); + + return author; + } + + public Author removeAuthor(Author author) { + getAuthors().remove(author); + author.setActor(null); + + return author; + } + + public List getNovels() { + return this.novels; + } + + public void setNovels(List novels) { + this.novels = novels; + } + + public Novel addNovel(Novel novel) { + getNovels().add(novel); + novel.setActor(this); + + return novel; + } + + public Novel removeNovel(Novel novel) { + getNovels().remove(novel); + novel.setActor(null); + + return novel; + } + +} \ No newline at end of file diff --git a/waxds-copper/target/classes/it/ramecera/screwdriver/waxds/copper/Author.class b/waxds-copper/target/classes/it/ramecera/screwdriver/waxds/copper/Author.class new file mode 100644 index 0000000000000000000000000000000000000000..18332a4ca0edc168a24b4fbef11399962d71aff6 GIT binary patch literal 3564 zcmb7``&Sc36vyxINH8o9qsC&ZMf&2Qtkha-QEEW2V1Pm{j2(D1IcZ<$rgshI0qyRsA{DIw^xnzdas zFFo6;+CN)cRS9EX4U5wAZP(dcej-S$2pU*$9Y3&~plDSavKKh~PYCM4tS9JF?!?Km z6Ud76W(AFGG@QV$$)fGsP|rG!8(0B!eL)$uck0go$3Z?%V~!ckqqz9+j`SQljAxD-Gcn{fu3+TW|11z;kSTAhs@9Iv4CshIMC zXFC8t7xTOs}#66hg-SMZilU*c0DH6Rm(Xlxa$sM--uaXacyV8tu|^7 z4Ekzr+1|D#TqhiNUsiFl!|jn%_xMB+r@Y{nWs16K(x8v&6G1~c+mUOH+LrVR zIvLYBw`5g|77`Tc6HfL7J2s-c-5Iv715hO^GRUi3y)r(bk3f|~Gg~i^pid1lXn-%d zX`303F=hH8$St%aQ>H1~nog|yg+Z6;3N}Hvb<@>QzjY5gVBR&AhnJheiZ{$emYp*w zLsvDfHobBhH?(B26bG*pmp3jL^bT)Kah%P39)Qi}aZ0ngK`ptaKPi1*~8`Y4buNqY2NE3PKLEQQazcBuh0%^s4wr!`Jts>&yJzhZ;&Yc(Q zP0qw_zKj1`>CJPnW=Dz1so!ZP>i!-M?{lS)(N>{*R@Vn8=pHQ2g4~aSJctE(Kwrjz z+>e4h0?1q&5WXrtfmwPO1M(;el8puViXO*-Jc@!W0%WNT21H#q9Aj`CZXEa%#ML}N1f~+FW zm}Gqx1$hmSH*G+4xeD&}NMv1^&(8pDM1ibWpaN|kixiaziyl|e27`608q`HB0k+)+ zj9Z1E7ucZ-Jb~shh8aQM(#tUHwNO1h`3Jq4`is8rq8C&6du!^1cMu+lZ0e_7G_vX` zZ|UQjP16o6SbMjv_D`%W; novels; + + public Author() { + } + + public Integer getStar() { + return this.star; + } + + public void setStar(Integer star) { + this.star = star; + } + + public Timestamp getCreationdate() { + return this.creationdate; + } + + public void setCreationdate(Timestamp creationdate) { + this.creationdate = creationdate; + } + + public String getName() { + return this.name; + } + + public void setName(String name) { + this.name = name; + } + + public String getSurname() { + return this.surname; + } + + public void setSurname(String surname) { + this.surname = surname; + } + + public Timestamp getUpdatedate() { + return this.updatedate; + } + + public void setUpdatedate(Timestamp updatedate) { + this.updatedate = updatedate; + } + + public Actor getActor() { + return this.actor; + } + + public void setActor(Actor actor) { + this.actor = actor; + } + + public List getNovels() { + return this.novels; + } + + public void setNovels(List novels) { + this.novels = novels; + } + + public Novel addNovel(Novel novel) { + getNovels().add(novel); + novel.setAuthorBean(this); + + return novel; + } + + public Novel removeNovel(Novel novel) { + getNovels().remove(novel); + novel.setAuthorBean(null); + + return novel; + } + +} \ No newline at end of file diff --git a/waxds-copper/target/classes/it/ramecera/screwdriver/waxds/copper/Novel.class b/waxds-copper/target/classes/it/ramecera/screwdriver/waxds/copper/Novel.class new file mode 100644 index 0000000000000000000000000000000000000000..0cedb5eda7f3e53198d8278695b501a164c48a28 GIT binary patch literal 2777 zcmb7^e^V1j7{{N5kRUyZB4DxABKAi>yl-++nzoy`Ma9IFI(ofe5Lb#qt(<1 zNNHFB%uTo|fF zYn>rMu0sxuA~rmUoyuB58Ga0M`L2_nI+5)@d)B?_&;(5)3A)`$7ux#WIlRDoSfKF6 zG!rM{=FYWk!_s#gnxYE`hxBRqWG8kznni~pT4JYh>OF@(;M8HHnnB!2%$MIdkb_no znr8G-1f9;rO2%-47Qprn24&Svhc42G@zQM-H~TIkycvegb@TG$weabS>9t;Dvd?6M`m-YlXFZX-3bi@9l2Sn5Y>|S5S;W z{14GEjwXYzpfh-n2WSNUxE1KXkN!FI#?YQc|D2?8I*$RE+l0c2riHCc3+I>?XWdR8 zL-a=&yM+GbkUmBi^|w#XVj;mV1HPXk=PR@V?a=&R^x5x5IEydy5nZPg-Jm)Aa^fJG zr)%ipoxpf3;G&HM{-A~5FgZXhkT!#h*5pO{qMf{gXkI8if9+3NNG`vG!re3qQ*l&# zc~*~$C+JJF1Kvp|$WjvImKEe{`o;#blmuA@$ag(J_?Wl?x9HopRwu~qB*;B0$TH;P za&}eZb`oS2AZtB9*e49KVg(S(sAP=n|Yxbkb zCqYU8Dfa;3o5CRL^Z?(aM>dimkF6kE^nE+I>u5HTAWs1Dv