diff --git a/.gitignore b/.gitignore index 2899decbc..cc2d857cf 100755 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,4 @@ deploy **/.act* git.log +.DS_Store diff --git a/ARCHETYPES.md b/ARCHETYPES.md new file mode 100644 index 000000000..2cfbfff0d --- /dev/null +++ b/ARCHETYPES.md @@ -0,0 +1,87 @@ +# ActFramework Maven Archetypes + +## Hello World App + +A simple app that renders a home page with "Hello World". This application has end to end test cases provided. + +#### Copy/Paste and Go! + +``` +mvn archetype:generate -B \ + -DgroupId=com.mycom.helloworld \ + -DartifactId=helloworld \ + -DarchetypeGroupId=org.actframework \ + -DarchetypeArtifactId=archetype-quickstart \ + -DarchetypeVersion=1.9.1.0 +``` + +#### Create Project interactively + +``` +mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-quickstart -DarchetypeVersion=1.9.1.0 +``` + +## Hello Service + +A Simple RESTful service scaffolding. This application has end to end test cases provided. + +#### Copy/Paste and Go! + +``` +mvn archetype:generate -B \ + -DgroupId=com.mycom.helloworld \ + -DartifactId=helloworld \ + -DarchetypeGroupId=org.actframework \ + -DarchetypeArtifactId=archetype-simple-restful-service \ + -DarchetypeVersion=1.9.1.0 +``` + +#### Create Project interactively + +``` +mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-simple-restful-service -DarchetypeVersion=1.9.1.0 +``` + +## Bookmark + +A full fledged RESTful service that managed bookmarks for multiple users. This app uses +[act-aaa](https://github.com/actframework/act-aaa-plugin) to provide authentication/authorization support. This app also +leverage act-test framework for full covered end to end API level test. + +#### Copy/Paste and Go! + +``` +mvn archetype:generate -B \ + -DgroupId=com.mycom.bookmark \ + -DartifactId=bookmark \ + -DarchetypeGroupId=org.actframework \ + -DarchetypeArtifactId=archetype-bookmark \ + -DarchetypeVersion=1.9.1.0 +``` + +#### Create Project interactively + +``` +mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-bookmark -DarchetypeVersion=1.9.1.0 +``` + +## Chatroom + +A simple chatroom app that built on top of Websocket. This app also demonstrate how to do i18n in an Act application. + +#### Copy/Paste and Go! + +``` +mvn archetype:generate -B \ + -DgroupId=com.mycom.chatroom \ + -DartifactId=chatroom \ + -DarchetypeGroupId=org.actframework \ + -DarchetypeArtifactId=archetype-chatroom \ + -DarchetypeVersion=1.9.1.0 +``` + +#### Create Project interactively + +``` +mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-chatroom -DarchetypeVersion=1.9.1.0 +``` diff --git a/CHANGELOG.md b/CHANGELOG.md index 4b5f68d9f..d199ba896 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,623 @@ # ActFramework Change Log -**1.8.8-RC11** 20/Jun/2018 +**1.9.2** +* Act-test: It shall not prepend url context when specified url starts from `http` #1427 +* 716a67d0 2020-10-13 | Bump junit from 4.11 to 4.13.1 in /legacy-testapp [dependabot[bot]] +* 3231c87e 2021-05-11 | update title of td to make all the paths are consistent [benstone] +* 3745329d 2021-05-10 | fix bug of url.context not show in e404 page [Benstone Zhang] +* ce255015 2021-05-10 | fix #1392: GetTimeTest failed for non-english locale [Benstone Zhang] +* 1b50ebd4 2022-06-17 | Bump fastjson from 1.2.75 to 1.2.83 [dependabot[bot]] +* b922637a 2022-11-25 | Bump undertow-core from 2.1.6.Final to 2.2.19.Final [dependabot[bot]] +* 8d51b646 2022-09-01 | Bump jsoup from 1.14.2 to 1.15.3 [dependabot[bot]] +* 92001dda 2022-09-15 | Bump snakeyaml from 1.26 to 1.31 in /legacy-testapp [dependabot[bot]] +* 686e89ea 2022-09-15 | Bump snakeyaml from 1.26 to 1.31 [dependabot[bot]] +* 0fbe8fc7 2022-11-19 | vuln-fix: Temporary File Information Disclosure [Jonathan Leitschuh] +* 40e0127e 2021-06-04 | Bump snakeyaml from 1.17 to 1.26 in /legacy-testapp [dependabot[bot]] +* 032d4efe 2021-08-24 | Bump undertow-core from 2.1.3.Final to 2.1.6.Final [dependabot[bot]] +* 2581faa1 2021-06-28 | fix index error when process string substitution [benstone] +* f0704ecb 2021-08-23 | Bump jsoup from 1.12.1 to 1.14.2 [dependabot[bot]] +* packaging project stuck when ehcache has been added into project dependency #1399 +* @Before priority BUG #1407 +* Add "The Wall of Coding Wisdoms" into default Zen list #1388 +* Response content type get overridden - case 2 #1387 +* Response content type get overridden #1386 +* Add act version info into API doc page and test report page #1380 +* URL Path parameter binding failure #1379 +* Incorrect Chinese characters found in `@Configuration` variable injected from properties file encoded with UTF-8 #1377 + +**1.9.1** 02/Jan/2021 +* Shutdown app gracefully in Runtime shutdown hook +* Act-Test - support sending request with file array #1375 +* It reports `UNKNOWN` for OS when running act on macOS #1373 +* Hot reload not working for Bundle Resource properties #1372 +* Cannot start ActFramework: port xxxxx is occupied #1370 +* ApacheMultipartParser NullPointerException #1369 +* EhCache raised `ClassCastException` after reload in dev mode #1368 +* act-test: number verification logic error #1361 +* Error encountered requesting `/asset/extjs-all.js` #1359 +* 500 Error but not error stack in console log #1358 +* Support Java 14 Record class #1354 +* Allow the developers to specify ECJ compiler options #1353 +* `null` file object inject from form field into the request handler argument list #1352 +* When it detect error during generating request handler instance it shall mark it as a fatal error #1347 +* Support customised resource bundle encoding #1329 + +**1.9.0a** 28/Jun/2020 +* Add `@Inject` to CliDispatcher constructor - allow it be injected in - e.g. - HelpPage +* The error triggered during rendering response get warned twice #1341 +* Support running act app in Java9 or above #1342 +* SimpleBean bytecode enhancer caused "java.lang.ClassFormatError: Interface cannot have a method named " issue #1344 + +**1.8.33b** 27/Jun/2020 +* Update to osgl-tool 1.25.0 +* Missing fields exporting AdaptiveRecords in csv format #1340 +* In case Route mapping exception occurred, it shall display the relevant source file and highlight the place where mapping failed #1313 +* update fastjson to 1.2.71 +* API doc - URL path variable in POST endpoint info is incorrect #1284 +* Scenario manager - support loading test scenario files from child folders recursively #1337 +* Param value loader framework - allow inject another controller class #1336 +* `EnhancedAdaptiveMap.asMap(EnhancedAdaptiveMap)` generated `Map` shall implement hashCode and equals methods #1333 +* Session cache shall be cleared after app hot reload #1330 - update osgl-http to 1.13.2 +* Improve http cache support #1328 +* Add profile to default session cookie name #1326 +* It needs to expose CORS control headers to all kind of requests #1325 +* Invalid warning msg: "empty index encountered" #1322 +* CLI over HTTP - allow specify big string which require textarea as input #1321 +* Add helper endpoint in dev mode to get Java System Properties #1320 +* FileBinder - When running command from CLI over HTTP, bind to new File #1319 +* Allow app to fetch configuration from a configuration server #1318 +* skip loading "META-INF/versions/9/module-info" class #1288 +* Choose port randomly when running automation test in batch mode #1317 +* wrong file object inject from form field into the controller param #1316 +* API doc - URL path variable in POST endpoint info is incorrect #1284 +* `SampleData.ProvidedBy` is not effective on int type field #1310 + +**1.8.32** 04/Mar/2020 +* ConcurrentModificationException calling eventBus.triggerAsync #1308 +* Allow access CLI over HTTP #1305 +* CLI help message not displayed correctly #1303 +* Act-Test - allow specify collection size when generating List/Set random collection #1301 +* Act-Test create sample data provider for `id` field #1300 +* When it rendering data in HTML table, the column heading does not follow `PropertySpec` specification #1299 +* When requesting data from browser directly render the data using HTML table format if it is an `Iterable` #1298 +* Automatically register all CLI command handler as Get request handler to CLI over HTTP port #1297 +* Render attachment or inline response when request handler return `File` or `ISObject` type based on its content type #1296 +* It respond with 500 error when file not found raised from IStorageService #1295 +* Act-Test - it shall send session header token from last headers automatically #1294 +* Allow it use request parameter to pass session token #1293 +* System boot process crashed when there is problem generating banner image from icon file #1292 +* HTML table view - make table header sticky at the top #1290 +* API Doc - improve sample data generation for `ISObject` type #1289 +* Add jackson into jar black list. Refer: #1288 +* async request handling - render report using cached accept type #1287 +* Exception handling controller with field class without generic parameter specified #1286 +* Async endpoint result page style needs to be updated #1285 +* API doc - URL path variable in POST endpoint info is incorrect #1284 +* File upload generated file name might contains double `.` result in file cannot be accessed #1282 + +**1.8.31** 02/Jan/2020 +* Act-Test - Add `In` verifier #1271 +* Create an API to allow developer generate random data #1270 +* Enable turn off QRCode/BarCode rendering based on Accept header #1269 +* ParamValueBinder - allow bind to ActionContext renderArgs #1267 +* CLI - add shortcut into the command help list #1266 +* Disable WARN message on TopLevelDomainList download error when act is running in a non-internet environment #1265 +* No response on certain error scenario #1264 +* Support JSON path #1262 +* html-table rendering issue with a list of String #1261 +* IE 9 browser,got a strange error! #1260 +* ApiDoc bug: JPA Entity field #1259 +* XML Data bind to JSONObject issue #1258 +* API Doc - sample query data issue with array type #1257 +* JSON Error message should escape `"` #1256 +* Act should log error stack upon `IllegalArgumentException` explicitly and respond 500 status #1254 +* `LoadResource` - error injecting into `C.Map` typed field #1253 +* Param binding - allow specify `now` in `DefaultValue` for Date types #1247 + +**1.8.30a** 24/Nov/2019 +* Fix issue - the upload file not found after moving testing resources to `src/test/resources` + +**1.8.30** 23/Nov/2019 +* App failed to start without error stack #1252 +* Act-Test - Allow it to load test files from src/test/resources folder #1249 +* API Doc - Return sample for array is not correct #1250 +* SimpleRestfulServiceBase - property spec enhancements #1248 +* API doc - DOB sample data generator generates invalid date string #1246 +* Allow it specify particular part of returned data in response using `_jsonPath` parameter #1245 +* Support `htmltable` pseudo Accept type #1244 +* Ehcache 在 热重载时 无法找到 EhCacheServiceProvider 的 _reset 方法。 #1243 +* `__path` param value needs to be sanitized #1241 +* Act-Test - add an `entityId()` function #1240 + +**1.8.29** 03/Nov/2019 +* SimpleRestfulServiceBase - allow developer to inject logic #1237 +* Allow app to specify sample data provider for any field #1236 +* Enable render QRCode using pseudo accept parameter #1235 +* Creating a system self healing mechanism to handle OOM caused by too many dangling connention #1234 +* Add commonly used cron expression constants #1229 +* Ehcache not working in Act since 1.8.27 #1220 +* CORS - update default allowed headers #1228 +* Allow using query parameter `_accept` to overwrite the `Accept` HTTP header #1227 +* SimpleRestfulServiceBase - support filtering/pagingation/sorting #1226 +* ResourceLoader - Error loading Yaml data into List of entities #1225 +* ApiDoc - missing description for classes extends from `SimpleRestfulServiceBase` #1224 +* Markdown response support #1219 +* $$.processStringSubstitution` issue #1223 +* `@LoadResource` mechanism not doing resource filtering even `resource.filtering` is set to `true` #1222 +* `UnexpectedException: type not recognized: ? extends T` - JsonDtoPatch logic issue #1218 +* CLI table view layout broken due to multi-bytes characters #1217 +* Incorrect XML output for iterable type #1216 +* Support output yaml response #1215 +* Create built-in CLI session history mechanism #1214 +* Allow app to configure CLI progress bar style #1212 +* Incorrect message returned by `ActContext.i18n(template, args)` #1211 +* Provide a default HTML page for async controller response #1209 +* Allow it auto refresh when got 409 error during hot-reloading #1207 +* "The response has already been started" error #1208 +* Update FastJSON to 1.2.62 #1205 + +**1.8.28** 21/Sep/2019 +* Session resolve issue for concurrent incoming requests #1204 + +**1.8.27** 15/Sep/2019 +* Hotreload error - Provider has already registered for spec: class act.aaa.AAAService #1201 +* Act-Test - Improve dependency/fixture management #1198 +* Act-Test - dependency order not maintained when setup is true #1195 +* ConcurrentModificationException on detecting file changes #1194 +* Hotreload logic - it shall save ActionContext to local before checking file changes #1193 +* TopLevelDomainList - fix NPE caused when job executing during app hotreload process #1192 +* FastJsonJodaDateCodec - allow it to deserialize timestamp (long) data #1191 +* Act-Test - add randDouble and randFloat function #1190 +* Act-Test - allow run scenarios for specific partition #1189 +* Act-Test - display partition name in the title #1187 +* Update to osgl-tool-1.20.1 and osgl-cache-1.7.1 #1186 +* No need to invoke hotreload listener if app is not running in DEV mode #1185 +* Once add ehcache dependency `maven package` process will never end #1184 +* Command register - it shall not register a command on abstract class #1183 +* CommandBytecodeScanner - it needs to register command by name along with prefix #1182 +* ApiDoc - add syntax highlight for JSON samples #1181 +* ResourceGetter - accessing folder that access is not allowed cause response never close #1180 +* ActionContext not released when `ResourceGetter` is handling request #1179 +* ConcurrentModificationException when output to csv with PropertySpec specified #1178 +* `FixtureLoader` not effective after called #1177 +* Act-Test - NPE encountered when scenario is parsed after scenario depend on it parsed #1176 +* NPE triggered in `requestThrottleExpireScale` after hot reload #1175 +* Change Content-Type header for JSON error response #1173 + +**1.8.26** 21/Jul/2019 +* update osgl-tool to 1.20.0 +* update genie to 1.11.0 +* API doc - allow landing to specific part when open link with hash #1171 +* Act-Test - when dependent scenario is running in a different partition it shall be run anyway even it has been finished before #1169 +* Act-Test download checksum verification might cause NPE #1168 +* Act-Test - circular dependency caused by `setup` #1167 +* View plugin get initialised twice #1166 +* Scenario spec - cannot specify long value for substitution #1164 +* LoadConfig - suppress warning messages #1163 +* Act-Test - list failed scenario names in the splash page #1162 +* Act-Test - fixture clearing issue with multiple level dependencies bug #1161 +* When uploaded an empty file, the parameter injected is `null` #1160 +* Test Scenario - allow specify response spec without type block #1159 +* Test Scenario - allow specify ignore reason #1158 +* Keep field definition order when output entity list into Excel file #1157 +* Make `AppServicePlugin` extends `LogSupport` #1156 +* False alarm caused by render inline template #1155 +* False alarm message about local variable table not found on app start #1154 + +**1.8.25** 2/Jul/2019 + +* Allow inject DbService #1153 +* NPE on creating controller instance #1152 + +**1.8.24** 22/Jun/2019 +* Allows resource filtering in dev mode #1151 +* CSV view - support AdaptiveBeanBase typed data #1149 +* App halt when there are block issue on startup #1148 +* Resource loader - improve Map loading - support different key val types #1147 +* Resource loader - handle comment in files for map loading #1146 +* Downloading a big CSV file the second time failed #1145 +* CLI - Async progress bar reporting eat up CPU #1144 + + +**1.8.23** 16/May/2019 +* CLI Table view - print line interlaced with revert color/bg color #1143 +* Add `@Label` annotation for bean field marking #1142 +* Email validation handler - not able to valid email at `thinking.studio` #1141 +* CLI - session exit immediately #1140 +* Improve async CLI command error reporting #1139 +* `@Every` annotation not working as expected if `@OnAppStart` annotation presented #1138 +* Router - debug routing list missing certain routes #1137 + +**1.8.22** 20/May/2019 +* `route.print` not handle keyword matching routes correctly #1136 +* Allow developer to disable JSON body patch #1134 +* API Doc - treat session variable as a special param #1133 +* API doc - catch field javadoc comment and add it to API doc #1132 +* Enhance AdaptiveBean - better support to inheritance #1131 +* Allow developer to specify property naming convention for JSON output #1130 +* Upload file issue #1128 +* Act-Test add synonyms to cache/assign #1126 +* Act-Test add `startsIgnoreCase` and `endsIgnoreCase` verifier #1125 + +**1.8.21** 26/Apr/2019 +* Update jQuery to 3.4.0 #1123 +* Add String to LocalDate and String to LocalTime type converter #1124 + +**1.8.20** 20/Apr/2019 +* Act-Test - Add alias `assign` to `cache'; improve explicit issueKey handling #1120 +* Request handler - error output when ReturnValueAdvice and PropertySpec presented for Iterable type return #1118 +* `UnexpectedException` triggered executing CLI command in TSCPP project #1117 +* Configurable URL router support #1116 +* Act Test - running duplicated scenarios due to introduce of RefId #1115 +* Act Test - fixture not cleared in certain case #1114 +* Act Test - intelligent scenario name #1113 +* Validation message - remove the logic that wrap user defined message with `{` and `}` #1112 +* Validation message - allow developer to specify not prepend bean/property path #1111 +* Act-Test: Add issueKey to Scenario #1108 +* Improve `~/test` page rendering #1105 +* Mock data function for development #1106 +* Add headerNames() to UndertowRequest #1104 +* Add `-parameters` argument to ECJ #1103 +* Act-Test add containsIgnoreCase verifier #1102 +* Provide mechanism to inspect Job failure #1100 +* request handler - allow bind to a path in JSON body #1099 +* Exception raised before committing to response shall trigger another 500 response #1097 +* OsglConfig.internalCache shall be cleared before DB start init #1098 +* java.lang.LinkageError caused by org.w3c.dom.Document #1096 +* ActFramework hot reload caused Ehcache Classloader Exception #1070 +* `@LoginUser` caused `InjectException` upon hot reload #1071 +* DataPropertyRepository - ClassCastException encountered building property path #1095 +* DataPropertyRepository - StackOverflowError building property path for model with circular reference #1093 +* Error encountered with customised Unique validator when working with JPA #1069 +* Act-Test - add refId property to Scenario #1091 +* Add switch to disable auto hot reload in DEV mode #1090 +* GH 1078 - Log warn message when `@Global` is found on instance method of an abstract class +* API Doc - handle `@inheritDoc` tag #1089 +* ReflectedInvokerHelper treated `Set` as stateless type #1088 +* ParamValueLoaderService - PARAM_TREE not cleared in certain case #1087 +* GH 1072 - improve dao init logic, log warn message when an non-abstract Dao class + cannot be materialized because of missing type param implementation +* API Doc - improve support for endpoints defined in parent class #1086 +* API doc - make it consistent for styling of javadoc code block and sample code block #1085 +* API doc - capture field javadoc comment #1084 +* `ISObject` is not null when no file is uploaded #1083 +* Upload file caused server crash #1082 +* Event bus - simple event key matching logic needs improvement #1077 +* Act-Test - print colourised output when run batch test #1081 +* Act-Test - allow developer specify a model shall not be cleared at fixture loading #1080 +* Error visiting page with IE 8 or below #1079 +* Misleading error stack printed out when loading yml file with `@LoadResource` #1073 +* Act-Test - JSON request array content get dropped #1076 +* Add filter box in API page #1074 +* Act-Test - add `ignore` flag to scenario #1075 +* JPAContext is not readay error when app start asynchronously #1063 +* StackOverflowError caused by JsonDtoPatch #1064 +* Multiple improvements on sys admin command #1068 + + simplified command name aliases for system command: xxx.list + - route.list -> route or routes + - metric.timer.list -> metric.timer + or metric.timers + or metric + or metrics + or timer + or timers + - metric.counter.list -> metric.counter + or metric.counters + or counters + - job.list -> job or jobs + - daemon.list - daemon or daemons + - conf.list + + method/field access error due to different classloader for XxxAdmin and the access type + + uniformed `q` parameter handling for list commands +* Improve metric timer +* envMatches in ControllerByteCodeScanner shall be reset upon scanning new class #1065 +* Act-Test - support post XML encoded body #1062 +* API book - Module name shall include enclosing class #1059 +* API doc - line breaks in param description get removed #1060 +* metric command stop working #1058 + +**1.8.19** 13/Feb/2019 +* Update dependency versions +* Test yaml - variable not evaluated when putting in an array #1055 +* Allow app to configure automate test http request timeout #1051 +* Error enhancing class with `@Data` annotation #1049 +* action method parameter cache #1054 +* Route information missed in API doc for dynamic aliases #1052 +* command `route.print -t` triggers error #1053 +* `@WsEndpoint` annotation now failed to register route #1050 + +**1.8.18** 04/Feb/2019 +* Fix JobContext init logic +* Error enhancing bytecode at com.sun.mail.util.logging.MailHandler::publish() #1048 +* ContextualJob cause JobContext get cleared twice #1046 +* JobContext lost when invoking another job #1044 +* Send out Login and Logout event #1043 +* Support `Keyword` matching for param binding of incoming request #972 +* Allow load route configuration from `route.conf` file #1042 +* Allow keep searching route table even when a terminate node found #1041 +* act test failed in mvn could not see detail information #1040 +* mvn package will throw IllegalStateException #1039 + +**1.8.17** 23/Dec/2018 +* UnexpectedException when submit a `Map` type parameter with value as `null` #1027 +* Support static apibook generation #893 +* Morphia ObjectId not generate in api-book #1033 +* Bad behaviour when Error result returned on Accept excel mime type #1034 +* Test report page improvement #1032 +* Provide a way to handle generic param type loading #1031 +* UnexpectedException when submit a `Map` type parameter with value as `null` #1027 +* Static file handler - the file handle not closed after serviced #1028 +* Configure healthy monitor and report server status #1021 +* Test - json param shall be processed #1025 +* Test - allow it post body for DELETE request #1024 +* Annotations with ValueLoader cannot work if post with json #1016 +* Routing issue with dynamic aliases and keyword matching #1022 +* Make CLI help command default to display application commands #1018 +* CLI - execute `conf.trace-handler -e` trigger `IllegalAccessError` #1019 + +**1.8.16** 09/Dec/2018 +* `StackOverflowError` caused by POJO typed request handler method param circular reference #1015 +* Allow configure XML root element tag #1011 +* Allow load resource from `.xml` file #1012 +* `NullPointerException` caused by sending GET request with `Content-Type=application/xml` header #1008 +* api-book-compile cannot get comments from super class #1003 +* act test failed when check return data exist #1010 +* Calling mailer method asynchronously by eventBus.trigger didn't work #1009 +* @PropertySpec and PropertySpec.current.set cannot always work when object wrapped by GlobalAdvice #1006 +* @PropertySpec and PropertySpec.current.set cannot work when object wrapped by GlobalAdvice #1005 +* Make `TimestampAuditor` defined in act-jpa project be common #1002 +* Make `CommandPrefix` be inheritable #998 +* Request handler argument type with type parameter does not work #1000 + +**1.8.15** 30/Nov/2018 +* Introduce `@CommandPrefix` annotation #982 +* `mi` make it display number in MB by default #996 +* `IllegalAccessError` triggered while running `mi` command #995 +* compile-api-book error when super class has generics #987 +* SimpleRestfulServiceBase 'update' enhancement #976 +* @After @Finally not effect when @Valid failed #988 +* Hot reload in dev mode always fail at the first POST request #989 +* Add method to handle connection close event to `WebSocketConnectionListener` #994 +* websocket connection not released after closed #991 + +**1.8.14** 28/Nov/2018 +* act command throw IllegalStateException: JPAContext is not ready #973 +* java.lang.IllegalStateException: UT000146: HttpServerExchange cannot have both async IO resumed and dispatch() called in the same cycle #974 +* Support generating sample data for `org.osgl.util.Keyword` typed field #986 +* @Before @After not effect when sub class extends from super class #985 +* It shall force marking progress gauge as done once the job is returned #971 +* `DaoLoader` not able to load Dao class without type parameter #979 +* It shall not set `null` to field marked with `@Configuration` if the setting is not configured #984 +* CLI table view does not work properly with `Keyword` typed field #983 +* Drop websocket connection subscribed to listen job progress once job is finished #977 +* Make the `dao` field of `SimpleRestfulServiceBase` be protected #980 +* Push progress only when `ProgressGauge`'s percentage changed #975 + +**1.8.13** 25/Nov/2018 +* Provides a mechanism for accurate routing ws connection event to user defined connection handler #961 +* `NullPointerException` when route path element wrapped with `~` is no the final one #958 +* act.session.ttl=-1 not effect when JWT is enabled #968 +* `App.singleton(Xyz.class)` returns `null` value #967 +* `@CsvView` and `@TableView` not effective when mark on request handler method #966 +* Keep decorator setting of async command/request #965 +* `ProgressGuage.markAsDone` shall not trigger event if progress is already done #963 +* Provide a mechanism to handle async process result #960 +* `WebsocketConnectionRegistry` - provide method to remove key #962 +* Issue with using `WebSocketConnectEvent` to call websocket connection handler #959 + +**1.8.12** 20/Nov/2018 +* Change ws endpoint for job progress status, add GET endpoint for job progress checking #957 +* The `/~/job/progress` ws endpoint does not work #956 +* If interceptor is disabled then it shall not return `404` #955 +* False warning message on DB configuration #953 +* CLI session shall not time out when it is reporting async job progress #952 +* `NullPointerException` invoking `job.list` command #950 +* Allow it to turn on/off handler trace while app is running #949 +* execute `route.list` command causes `NullPointerException` #948 +* `NullPointerException` when calling `$.convert(str).to(DateTime.class)` in Job #947 +* Output enhanced asm code when `java.lang.VerifyError` encountered #945 +* `UnexpectedException` with `Controller.Util.download(URL)` call #944 +* Deadlock issue during app hot reload #941 +* Allow app to do keyword matching on certain route path element #939 +* Missing `Content-Type` header in response servicing static file request #937 +* Hot-reload issue caused by `StackOverflowError` on `AppConfig.loginUrl()` #936 +* Handle `Error` encountered processing incoming request #933 + +**1.8.11** 5/Nov/2018 +* Automate test failure #932 +* update dependencies + - undertow-core: 1.4.26.Final + - snakeyaml: 1.23 + - reflectasm: 1.11.7 + - joda-time: 2.10.1 + - jline: 2.14.6 + +**1.8.9** 4/Nov/2018 +* update jline to 2.14.4 +* CLI - support `@DefaultValue` #929 +* Allow app to customise error response upon invalid request #922 +* `java.lang.IllegalArgumentException` upon starting BSBF project #931 +* Hot reload is broken in R1.8.8 version #921 +* CLI - do not output `null` for options without help message #927 +* API doc - allow fault tolerant when generating sample data #920 +* API doc - it shall support `@Sensitive` annotation #919 +* `UnexpectedClassNotFoundException` raised during restoring plugin classes #923 +* `Unable to find the overwritten method of Xxx` issue on 1.8.8 #925 + +**1.8.8** 30/Oct/2018 +* Cannot add white space for `session.header.payload.prefix` configuration #918 +* `App.getResource(String)` behavior different between dev and prod mode #916 +* Make `Dao` by default be stateless #914 +* Optimize Singleton controller instance infer logic #913 +* `SubClassFinder` and `AnnotatedClassFinder` shall favor `NoAutoRegister` annotation #912 +* Test - enhance ${now()} function #911 +* Test - allow it add `negative` decorator to verifier #910 +* Test - remove generic type parameter from `NamedLogic` #909 +* Test - allow setting precision of ${now()} function #908 +* Interceptor defined in super class now not effective on sub class #907 +* Basic support for xml content-type #905 +* ReflectedHandlerInvoker - try to get Annotation from method in parent class if possible #906 +* JsonView, CsvView etc shall be declared as `@Inherited` #904 +* Test debug page - make failed test display in the beginning of the page #896 +* SimpleRestfulServiceBase - further simplified the usage #898 +* API sample data - add URL category #897 +* `JPAContext` not closed when Error response is generated #895 +* Allow app to delay automate testing #894 +* Add `removeTag`, `reTag` method to `WebSocketContext` #892 +* Stop loading API manager when running in `test` profile or `prod` mode #890 +* Caused by: act.app.CompilationException: TestBase cannot be resolved to a type #889 +* Failed to instantiate abstract class when building interceptor list in a rare scenario #888 +* Route table: support whitespace in URL path #887 +* `context.renderArg(key, val)` not cleared in prod mode #886 +* make jquery extension library process xsrf token cookie automatically #884 +* CSRF - the XSRF token cookie shall not be set as httpOnly #883 +* Test - partition scenarios #877 +* Add `SysEventId.POST_STARTED` #882 +* Support opt-out jars from managed classloader by specifying file name prefix in `act.jar.black.list` #881 +* No need to trigger hotreload when testing file changes #880 +* @PropertySpec could not effect entity in collection #878 +* It randomly found request handler parameters are not enhanced with `@Named` annotation #879 +* Test: add $now() and $today() function #876 +* Intermittent ACT start failure in `GenieModuleScanner` #875 +* Route configured for namedport not effective #874 +* `EntityClassMetaInfo.mergeFromMappedSuperClasses` logic error #873 +* Optimize app code start in dev mode #872 +* Test: evaluation complex expression refer to cached object issue #871 +* Act not return application/json as default when exception #870 +* Test - Allow app to define url context for scenario #869 +* Add jobId to all built-in jobs #868 +* API Doc: generate sample data for interface #867 +* `PropertySpec` specification not working when return value is a list #866 +* Multiple instances issue with request handlers/interceptors happens across class hierarchies #865 +* Support `@Order` in intercepting #864 +* Support using `SessionVariable` annotation and `DbBind` together #862 +* Make `EventBus` and `Job` list favor `Order` annotation #861 +* test resource not refreshed after hot-reload #860 +* Rythm Template error report - source tab issue #859 +* Render automated test report for JSON request #858 +* Provide a way to allow app to specify order of elements in the injected collection #857 +* `@SessionVariable` annotation not working as expected #856 +* Automate testing failure #855 +* `@PropertySpec` not effect when `ReturnValueAdvice` applied #852 +* Allow it to run specific test scenario #851 +* `@PropertySpec` not applied to excel download #848 +* Add code and message support for unauthorizedIf function #847 +* It takes over 20s to bootstrap app in dev mode with large file in resources dir #846 +* Create an annotation to help specify head mapping for `@LoadResource` mechanism #844 +* FastJson exception when serialize ACT error message #841 +* `CacheFor` - make it allow skip `Cache-Control` header #837 +* `ResponseCache` - content disposition shall be cached #838 +* `CacheFor` key shall include `Accept` type #836 +* Provide a mechanism to allow developer advice on return value of request handler method #835 +* Add render image support #834 +* Optimise `LogSupport` for `DestroyableBase` #833 +* Allow app developer to specify download file name #829 +* `ActionContext.allowIgnoreParamNamespace()` overlooked by `MapLoader` #827 +* Use `JSON.toJSONString()` to replace `Object.toString()` whenever it is used to render response body #826 +* Force response status not working when response type is JSON #825 +* Apply new scope for implicit transaction #823 +* When returning String is not a valid JSON, it shall be encapsulated with `result` #821 +* Using generic typed injection in Controller cause `UnexpectedException` when start up #820 +* Extended request handler method's param not enhanced with `@Named` annotation #819 +* maven pom: It shall add `.tag` file into resource filtering list #817 +* `Controller.renderHtml()` method signature error #816 +* `jquery.ext.js` - undefined error checking ajax redirect when there is no content in body #815 +* API doc - support module #814 +* Cannot render Excel when return value is `Map` type #813 +* `java.lang.IllegalStateException`: job already registered: __act_sys__start-delay-1 #812 +* Report error when app's package starts with `act` #811 +* Rename "e2e" to "test" #810 +* Bytecode enhanement error on App start #809 +* e2e - support customised fixture loading logic #808 +* Environment assert - support multiple values #807 +* e2e - allow loading fixtures from JSON file #806 +* e2e: Allow suppress fixture clearing #805 +* Add `Page` data structure for db list operation #804 +* E2E - `NullPointerException` with interdependent scenarios #803 +* JSON request resolving - binding String to class issue #802 +* APIDoc - make sample email matches sample firstname and lastname #801 +* e2e - random model data generation #800 +* e2e function: It generated invalid email #799 +* `@JSONField(format = "yyyy-MM")` setting not work #798 +* JSON output: default format for `java.util.Date` missing time part #797 +* `@PropertySpec` annotation now cause `NullPointerException` on JSON output #796 +* `@CacheFor` annotation cause incomplete response in PROD mode #794 +* Add `renderBinary(byte[])` and `renderBinary(byte[], String)` method to `Controller.Util` #793 +* Attach `PropertySpec` info to `ActionContext` #792 +* Resource loader - allow loading from excel file #790 +* e2e - support email content verification #789 +* e2e - support embed function in string for constant definition #788 +* Empty `scenario.yml` file caused `NullPointerException` #787 +* `@Data` enhancement shall call super by defau lt for Map/AdaptiveMap types #786 +* Add `notEqual` e2e verifier #785 +* `@Data` enhancement error when Model class has no fields #784 +* Add `attachmentName()` method to `ActionContext` #783 +* Extend View framework to support direct rendering of non-text content without template #782 +* `java.util.NoSuchElementException: null` issue when force respond `csv` type #781 +* Allow it specify `private` in `@CacheFor`for `Cache-Control` directive #780 +* Merge act-e2e into act core framework #779 +* Generate etag for `@CacheFor` request handlers #778 +* Upload always failed after the first time #776 +* Support simplified mail template path #774 +* `PasswordSpec` - allow `null` value for password validation #773 +* `@InvokeAfter` does not work #772 +* Support gradle/Java project structure #771 +* Add `PrincipalProvider` mechanism #770 +* Add annotation to mark creator/modifier of an entity #769 +* `AppClassLoader` - return enhanced bytecode for `getResource` call #768 +* Improve Singleton detection for controller instance creation #767 +* JsonDto class generation - support request handler reuse #766 +* API Doc - Support request handler reuse #765 +* Error starting app when `cacheFor.dev` set to `true` #760 +* @DateFormatPattern has no effect on `Date` field #759 +* `ResourceLoader` - load files in directory into `Map` structure #758 +* Enhance `ResourceLoader` #757 +* Missing Chinese message for some validation violations #755 +* `@LoadResource` cannot inject resource content into Map or Properties #753 +* JSON string return issue when Accept is not specified #752 +* It generates 10 controller instances when app starts up #751 +* Remove `undertow-websockets-jsr` dependency #749 +* It shall send back 404 if return File does not exist #748 +* `ActUnauthorized` - source info shall be populated upon each call #745 +* Error page: error highlight line not matched the line triggered the runtime error #744 +* Improve SYSTEM_SCAN_LIST matching performance #743 +* Add `App.wasStarted()` method #742 +* `JobAnnotationProcessor` issue: non static method in abstract class shall not be treated as static #741 +* Compiler error shall print out source code and the line that break compiling in dev mode #735 +* Improve JSON output of String type result #739 +* Support returning JSON response in nonblock mode #738 +* improvement for checking singleton object +* `SampleDataCategory` - make aliases() method be public +* `@Configuration` field shall be stateless for a Controller #734 +* AdaptiveRecord enhancement #733 +* Password enhancement - ignore the case when password is empty #730 +* Register TypeConverter automatically #728 +* Ajax redirect callback not get called when there are parsing error for JSON request #727 +* Add TypeConverter from String to Joda datetime #726 +* Large static resource output failure #725 +* `job already registered` error when multiple job annotation put on the same method #724 +* Make `ClassInfoRepository` injectable #723 +* Provide a mechanism to allow developer easily define global FastJSON serializer and deserializer #722 +* Provide built-in endpoint to fetch Enum i18n strings #721 +* Add API doc to act aaa authentication list #720 +* `PostHandle` event not raised in rare case #719 +* forward shall not raise `PreHandle` event #717 +* API doc `generateSampleData` - `fastJsonPropertyPreFilter` treatment for collection type #716 +* session id not serialized in JWT token #711 +* Act session token still validate even when user has logout #702 +* Act start failed when set session.mapper=act.session.HeaderTokenSessionMapper #701 +* `NullPointerException` encountered when app started with SQL db plugin without model classes #707 +* Allow use app name and version as server header #710 +* API doc - provide a mechanism allow plugin sample data generator #709 +* Create an annotation to force application to add `DisableCircularReferenceDetect` to FastJSON #706 +* Add `DisableCircularReferenceDetect` feature to FastJSON by default #705 +* When `Accept` is not specified or unknown then use JSON as the output content type #704 +* Make `SessionFree`, `NonBlock` and `SkipBuiltInEvents` annotation support at class level #703 +* ACT-1.8.8-RC11 performance issue with Fortunes mustache templates #698 +* Add pass-through mode to wave session resolution #697 +* Allow developer to configure app cache default TTL #696 +* Provide a mechanism to disable CAPTCHA protection #694 +* Allow binding epoch time millis directly to date types #691 * `ActionContext.allowIgnoreParamNamespace` not effective when POJO has collection typed fields #690 * ParamLoader: POJO array or container field shall be initialized even if no request data for them #689 * JWT token expiration is not effect #688 @@ -22,7 +639,7 @@ * It shall ignore Exception raised during app shutdown process #667 * It shall clear OSGL Config's internal cache on app restart #666 * update osgl library dependencies - - osgl-tool to 1.17.0 + - osgl-tool to 1.18.0 - osgl-cache to 1.5.0 - osgl-genie to 1.8.0 - osgl-http to 1.8.0 @@ -589,7 +1206,7 @@ * Update fastjson to 1.2.30 1.0.5 -* * remove version range from pom.xml. See https://issues.apache.org/jira/browse/MNG-3092 +* * remove version range from pom.xml. See 1.0.4 * It shall display the exception stack trace tab on template exception page #109 @@ -647,21 +1264,21 @@ * ActiveRecord -> AdaptiveRecord * Performance tuning: enable nonblocking IO -0.3.0 +**0.3.0** 10/Oct/2016 * Catch up update to osgl-mvc 0.6.0: Bind annotation now support specifying multiple Binder implementations -0.2.0 +**0.2.0** 20/Sep/2016 * Make act be java 1.6 compatible * Big refactoring on * dependency injection now on Genie * param loading mechanism * render arg enhancement now support method call with params, and field -0.1.3 +**0.1.3** 19/Jun/2016 * testapp to implement integration test of ActFramework -0.1.2 +**0.1.2** 11/Apr/2016 * misc bug fixes -0.1.1 +**0.1.1** 21/Feb/2016 * baseline version diff --git a/NEWS.md b/NEWS.md index b86dfe77b..30f6f253b 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,17 +1,75 @@ \ No newline at end of file + diff --git a/README.md b/README.md index e5634c0b6..4fe0c13eb 100644 --- a/README.md +++ b/README.md @@ -1,25 +1,26 @@ # ACT Framework -[![Join the chat at https://gitter.im/actframework/actframework](https://badges.gitter.im/actframework/actframework.svg)](https://gitter.im/actframework/actframework?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![APL v2](https://img.shields.io/badge/license-Apache%202-blue.svg)](http://www.apache.org/licenses/LICENSE-2.0.html) [![Maven Central](https://img.shields.io/maven-central/v/org.actframework/act.svg)](http://search.maven.org/#search%7Cgav%7C1%7Cg%3A%22org.actframework%22%20AND%20a%3A%22act%22) [![Build Status](https://travis-ci.org/actframework/actframework.svg?branch=1.4)](https://travis-ci.org/actframework/actframework) [![Javadocs](http://www.javadoc.io/badge/org.actframework/act.svg?color=blue)](http://www.javadoc.io/doc/org.actframework/act) +[![Join the chat at https://gitter.im/actframework/actframework](https://badges.gitter.im/actframework/actframework.svg)](https://gitter.im/actframework/actframework?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) +[![Get Support on StackOverflow](https://img.shields.io/stackexchange/stackoverflow/t/actframework.svg)](https://stackoverflow.com/questions/tagged/actframework) [![Feature Requests](http://feathub.com/actframework/actframework?format=svg)](http://feathub.com/actframework/actframework) ## Install -Add `act-starter-parent` into into your pom.xml file +Add `act-starter-parent` into your pom.xml file ```xml org.actframework act-starter-parent - 1.8.8.6 + 1.9.2.0 ``` -Or use maven archetype to start an new project: +Or use maven archetype to start a new project: ``` mvn archetype:generate -B \ @@ -27,33 +28,16 @@ mvn archetype:generate -B \ -DartifactId=helloworld \ -DarchetypeGroupId=org.actframework \ -DarchetypeArtifactId=archetype-quickstart \ - -DarchetypeVersion=1.8.8.7 -``` - -To start an new project for RESTful service: - -``` -mvn archetype:generate -B \ - -DgroupId=com.mycom.helloservice \ - -DartifactId=helloservice \ - -DarchetypeGroupId=org.actframework \ - -DarchetypeArtifactId=archetype-simple-restful-service \ - -DarchetypeVersion=1.8.8.7 + -DarchetypeVersion=1.9.2.0 ``` **tips** don't forget replace the `groupId`, `artifactId` and `appName` in the above script, or you can use interactive mode to generate your project: ``` -mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-quickstart -DarchetypeVersion=1.8.8.7 -``` - -Or - -``` -mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-simple-restful-service -DarchetypeVersion=1.8.8.7 +mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-quickstart -DarchetypeVersion=1.9.2.0 ``` -For RESTful service project +**Note** There are more ActFramework application archetypes for use. Please get them [here](ARCHETYPES.md). ## Features @@ -151,6 +135,8 @@ For RESTful service project - **[Powerful view architecture with multiple render engine support](http://actframework.org/doc/templating.md)** +- **[An unbelievable automate testing framework that never presented in any other MVC frameworks](https://www.youtube.com/watch?v=_UyfsdY4pSU&t=783s)** + - **Commonly used tools** - [Sending email](http://actframework.org/doc/email) diff --git a/VERSION_MATRIX.md b/VERSION_MATRIX.md index eb2a274fe..8b75fb2ec 100644 --- a/VERSION_MATRIX.md +++ b/VERSION_MATRIX.md @@ -1,26 +1,26 @@ # Version Matrix -| act | 1.6.x | 1.7.x | 1.8.7 | 1.8.8-RC11 | -| --- | ----: | ----: | ----: | ----: | -| aaa | 1.3.x | 1.4.0 | 1.4.2 | 1.5.1 | -| beetl | 1.2.x | 1.3.x | 1.4.1 | 1.4.4 | -| beetlsql | 1.3.x | 1.4.3 | 1.4.5 | 1.5.2 | -| e2e | | | | 1.0.0 | -| ebean-java7 | 1.3.x | 1.4.x | 1.5.3 | 1.7.2 | -| ebean | 1.2.x, 1.3.x | 1.4.x | 1.6.2 | 1.7.2 | -| eclipselink(java8) | N/A | 1.0.x, 1.1.x | 1.2.3 | 1.5.1 | -| excel | 1.3.x | 1.4.x | 1.4.3 | 1.4.5 | -| freemarker | 1.2.x | 1.3.0 | 1.3.2 | 1.3.5 | -| hibernate | N/A | 1.0.x, 1.1.x | 1.2.3 | 1.5.1 | -| jax-rs(java8) | N/A | 1.0.x | 1.0.2 | 1.0.4 | -| jpa-common | N/A | 1.0.x, 1.1.x | 1.2.3 | 1.5.1 | -| morphia | 1.3.x | 1.4.0 | 1.4.2 | 1.6.1 | -| mustache | 1.3.x | 1.4.0 | 1.4.2 | 1.4.4 | -| social | 0.11.x | 0.12.0 | 0.12.2 | 0.12.4 | -| sql-common | 1.2.x | 1.3.1 | 1.3.3 | 1.4.2 | -| storage | 0.12.x | 0.13.0 | 0.13.2 | 0.13.4 | -| thymeleaf | 1.2.x | 1.3.0 | 1.3.2 | 1.3.4 | -| velocity | 1.2.x | 1.3.0 | 1.3.2 | 1.3.4 | +| act 1.8.28 | 1.8.29 | 1.8.30a | 1.8.31 | 1.8.32 | 1.9.0a | 1.9.1b | +| --- ----: | ----: | -----: | -----: | -----: | -----: | -----: | +| aaa 1.6.1 | 1.7.0 | 1.7.0 | 1.7.3 | 1.8.0 | 1.10.0 | 1.10.0 | +| beetl 1.6.1 | 1.7.0 | 1.7.0 | 1.7.1 | 1.7.2 | 1.8.0 | 1.8.0 | +| beetlsql 1.7.1 | 1.8.0 | 1.8.0 | 1.8.1 | 1.8.2 | 1.8.2 | 1.8.2 | +| ebean-java7 1.7.9 | 1.8.0 | 1.8.0 | 1.8.0 | 1.8.0 | 1.8.0 | 1.8.0 | +| ebean(java8) 1.7.10 | 1.8.0 | 1.8.0 | 1.8.0 | 1.8.0 | 1.8.0 | 1.8.0 | +| eclipselink(java8) 1.6.1 | 1.7.0 | 1.7.0 | 1.7.0 | 1.7.0 | 1.7.0 | 1.7.0 | +| excel-java7 | 1.8.0 | 1.8.0 | 1.8.1 | 1.9.1 | end | end | +| excel 1.7.2 | 1.8.0 | 1.8.0 | 1.8.1 | 1.9.1 | 1.9.2 | 1.9.2 | +| freemarker 1.3.7 | 1.4.0 | 1.4.0 | 1.4.0 | 1.4.0 | 1.4.1 | 1.4.1 | +| hibernate 1.6.1 | 1.7.0 | 1.7.0 | 1.7.0 | 1.7.0 | 1.7.0 | 1.7.0 | +| jax-rs(java8) 1.0.5 | 1.1.0 | 1.1.0 | 1.1.0 | 1.1.0 | 1.1.0 | 1.1.0 | +| jpa-common 1.6.1 | 1.7.0 | 1.7.0 | 1.7.0 | 1.7.0 | 1.7.0 | 1.7.0 | +| morphia 1.7.3 | 1.8.0 | 1.8.1 | 1.8.2 | 1.9.0 | 1.10.0 | 1.10.0 | +| mustache(java8) 1.4.6 | 1.5.0 | 1.5.0 | 1.5.0 | 1.5.0 | 1.5.0 | 1.5.0 | +| social 0.12.6 | 0.13.0 | 0.13.0 | 0.13.0 | 0.13.0 | 0.14.0 | 0.14.0 | +| sql-common 1.5.1 | 1.6.0 | 1.6.0 | 1.6.0 | 1.6.0 | 1.6.0 | 1.6.0 | +| storage(java8) 0.14.0 | 0.15.0 | 0.15.0 | 0.15.0 | 0.16.0 | 0.16.0 | 0.16.0 | +| thymeleaf 1.3.6 | 1.4.0 | 1.4.0 | 1.4.0 | 1.4.0 | 1.4.0 | 1.4.0 | +| velocity 1.3.7 | 1.4.0 | 1.4.0 | 1.4.0 | 1.4.1 | 1.4.1 | 1.4.1 | ## Note diff --git a/doc/img/gh1209a.gif b/doc/img/gh1209a.gif new file mode 100644 index 000000000..df42f2f57 Binary files /dev/null and b/doc/img/gh1209a.gif differ diff --git a/testapp/.gitignore b/legacy-testapp/.gitignore similarity index 100% rename from testapp/.gitignore rename to legacy-testapp/.gitignore diff --git a/testapp/pom.xml b/legacy-testapp/pom.xml similarity index 95% rename from testapp/pom.xml rename to legacy-testapp/pom.xml index e0489d8d3..3f646430e 100644 --- a/testapp/pom.xml +++ b/legacy-testapp/pom.xml @@ -18,6 +18,8 @@ ******************************************** * version history ******************************************** +1.9.0 + - update to ActFramework 1.9.x 1.8.0 - update to ActFramework 1.8.x @@ -59,7 +61,7 @@ org.actframework testapp jar - 1.8 + 1.9 ACT TEST APP Test ActFramework @@ -73,9 +75,9 @@ UTF-8 UTF-8 - 1.8.8-RC12-SNAPSHOT - [0.13.0, 2.0.0) - 1.6.1 + 1.9.2-SNAPSHOT + [0.16.0, 2.0.0) + 1.10.0 testapp.TestApp @@ -176,7 +178,7 @@ junit junit - 4.11 + 4.13.1 test @@ -208,7 +210,7 @@ org.yaml snakeyaml - 1.17 + 1.31 diff --git a/testapp/run.sh b/legacy-testapp/run.sh similarity index 72% rename from testapp/run.sh rename to legacy-testapp/run.sh index aadf7eecf..12820c4b8 100755 --- a/testapp/run.sh +++ b/legacy-testapp/run.sh @@ -1,5 +1,5 @@ #!/bin/sh -mvn2 clean package +mvn -Dmaven.test.skip=true clean package cd target/dist unzip *.zip ./start & diff --git a/testapp/src/assembly/pkg.xml b/legacy-testapp/src/assembly/pkg.xml similarity index 100% rename from testapp/src/assembly/pkg.xml rename to legacy-testapp/src/assembly/pkg.xml diff --git a/testapp/src/main/bin/start b/legacy-testapp/src/main/bin/start similarity index 100% rename from testapp/src/main/bin/start rename to legacy-testapp/src/main/bin/start diff --git a/testapp/src/main/bin/start.bat b/legacy-testapp/src/main/bin/start.bat similarity index 100% rename from testapp/src/main/bin/start.bat rename to legacy-testapp/src/main/bin/start.bat diff --git a/testapp/src/main/java/testapp/FastJson37Issue.java b/legacy-testapp/src/main/java/testapp/FastJson37Issue.java similarity index 100% rename from testapp/src/main/java/testapp/FastJson37Issue.java rename to legacy-testapp/src/main/java/testapp/FastJson37Issue.java diff --git a/testapp/src/main/java/testapp/TestApp.java b/legacy-testapp/src/main/java/testapp/TestApp.java similarity index 79% rename from testapp/src/main/java/testapp/TestApp.java rename to legacy-testapp/src/main/java/testapp/TestApp.java index 7f9355a54..50d6e868a 100644 --- a/testapp/src/main/java/testapp/TestApp.java +++ b/legacy-testapp/src/main/java/testapp/TestApp.java @@ -15,7 +15,8 @@ public class TestApp extends AppConfigurator { public static class GLOBAL_CORS { public static final String ALLOW_ORIGIN = "google.com"; - public static final String ALLOW_EXPOSE_HEADER = "X-Header-One"; + public static final String ALLOW_HEADER = "X-Header-One"; + public static final String EXPOSE_HEADER = "X-Header-Two"; public static final String MAX_AGE = "100"; } @@ -26,11 +27,13 @@ public void configure() { sessionMapper(new CookieAndHeaderSessionMapper(app().config())); cors() .allowOrigin(ALLOW_ORIGIN) - .allowAndExposeHeaders(ALLOW_EXPOSE_HEADER) + .allowHeaders(ALLOW_HEADER) + .exposeHeaders(EXPOSE_HEADER) .maxAge(Integer.parseInt(MAX_AGE)); } public static void main(String[] args) throws Exception { + System.out.println(System.getenv("act_env_gh636_conf")); System.setProperty("act.http.port", "6111"); System.setProperty("act.cli.port", "6222"); System.setProperty("act.i18n", "true"); diff --git a/testapp/src/main/java/testapp/endpoint/Arguments.java b/legacy-testapp/src/main/java/testapp/endpoint/Arguments.java similarity index 96% rename from testapp/src/main/java/testapp/endpoint/Arguments.java rename to legacy-testapp/src/main/java/testapp/endpoint/Arguments.java index d15889bf8..2bebcf0fe 100644 --- a/testapp/src/main/java/testapp/endpoint/Arguments.java +++ b/legacy-testapp/src/main/java/testapp/endpoint/Arguments.java @@ -1,8 +1,8 @@ package testapp.endpoint; import act.cli.Command; -import act.cli.JsonView; import act.cli.Optional; +import act.util.JsonView; import org.osgl.util.C; import java.util.List; diff --git a/testapp/src/main/java/testapp/endpoint/BindingWithAnnotationTestBed.java b/legacy-testapp/src/main/java/testapp/endpoint/BindingWithAnnotationTestBed.java similarity index 91% rename from testapp/src/main/java/testapp/endpoint/BindingWithAnnotationTestBed.java rename to legacy-testapp/src/main/java/testapp/endpoint/BindingWithAnnotationTestBed.java index 6a1026cdd..fb68f5ea9 100644 --- a/testapp/src/main/java/testapp/endpoint/BindingWithAnnotationTestBed.java +++ b/legacy-testapp/src/main/java/testapp/endpoint/BindingWithAnnotationTestBed.java @@ -1,6 +1,6 @@ package testapp.endpoint; -import act.controller.Controller; +import act.controller.annotation.UrlContext; import act.data.annotation.DateFormatPattern; import com.alibaba.fastjson.JSON; import org.joda.time.DateTime; @@ -9,7 +9,7 @@ import java.util.Arrays; import java.util.Map; -@Controller("/bwa") +@UrlContext("/bwa") @SuppressWarnings("unused") public class BindingWithAnnotationTestBed { diff --git a/testapp/src/main/java/testapp/endpoint/CORSTestBed.java b/legacy-testapp/src/main/java/testapp/endpoint/CORSTestBed.java similarity index 90% rename from testapp/src/main/java/testapp/endpoint/CORSTestBed.java rename to legacy-testapp/src/main/java/testapp/endpoint/CORSTestBed.java index ace930929..a7c6aa7de 100644 --- a/testapp/src/main/java/testapp/endpoint/CORSTestBed.java +++ b/legacy-testapp/src/main/java/testapp/endpoint/CORSTestBed.java @@ -1,13 +1,13 @@ package testapp.endpoint; -import act.controller.Controller; +import act.controller.annotation.UrlContext; import act.security.CORS; import org.osgl.mvc.annotation.GetAction; import org.osgl.mvc.annotation.PutAction; @CORS.AllowHeaders(CORSTestBed.ALLOW_HEADERS) @CORS.AllowOrigin(CORSTestBed.ALLOW_ORIGIN) -@Controller("/cors") +@UrlContext("/cors") @SuppressWarnings("unused") public class CORSTestBed { diff --git a/testapp/src/main/java/testapp/endpoint/CSPTestBed.java b/legacy-testapp/src/main/java/testapp/endpoint/CSPTestBed.java similarity index 91% rename from testapp/src/main/java/testapp/endpoint/CSPTestBed.java rename to legacy-testapp/src/main/java/testapp/endpoint/CSPTestBed.java index c72a8bad6..b2ea830a0 100644 --- a/testapp/src/main/java/testapp/endpoint/CSPTestBed.java +++ b/legacy-testapp/src/main/java/testapp/endpoint/CSPTestBed.java @@ -1,10 +1,10 @@ package testapp.endpoint; -import act.controller.Controller; +import act.controller.annotation.UrlContext; import act.security.CSP; import org.osgl.mvc.annotation.GetAction; -@Controller("/csp") +@UrlContext("/csp") @CSP("default-src 'self'; img-src https://*; child-src 'none';") public class CSPTestBed { diff --git a/testapp/src/main/java/testapp/endpoint/CSRFTestBed.java b/legacy-testapp/src/main/java/testapp/endpoint/CSRFTestBed.java similarity index 84% rename from testapp/src/main/java/testapp/endpoint/CSRFTestBed.java rename to legacy-testapp/src/main/java/testapp/endpoint/CSRFTestBed.java index a9c36fb74..43b483094 100644 --- a/testapp/src/main/java/testapp/endpoint/CSRFTestBed.java +++ b/legacy-testapp/src/main/java/testapp/endpoint/CSRFTestBed.java @@ -1,12 +1,12 @@ package testapp.endpoint; -import act.controller.Controller; +import act.controller.annotation.UrlContext; import act.security.CSRF; import org.osgl.mvc.annotation.GetAction; import org.osgl.mvc.annotation.PostAction; @CSRF.Enable -@Controller("/csrf") +@UrlContext("/csrf") public class CSRFTestBed { @GetAction diff --git a/testapp/src/main/java/testapp/endpoint/ChineseGreetingService.java b/legacy-testapp/src/main/java/testapp/endpoint/ChineseGreetingService.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ChineseGreetingService.java rename to legacy-testapp/src/main/java/testapp/endpoint/ChineseGreetingService.java diff --git a/testapp/src/main/java/testapp/endpoint/ContextHierarchiTestBed.java b/legacy-testapp/src/main/java/testapp/endpoint/ContextHierarchiTestBed.java similarity index 84% rename from testapp/src/main/java/testapp/endpoint/ContextHierarchiTestBed.java rename to legacy-testapp/src/main/java/testapp/endpoint/ContextHierarchiTestBed.java index cbbe4316a..22b3548f3 100644 --- a/testapp/src/main/java/testapp/endpoint/ContextHierarchiTestBed.java +++ b/legacy-testapp/src/main/java/testapp/endpoint/ContextHierarchiTestBed.java @@ -1,9 +1,9 @@ package testapp.endpoint; -import act.controller.Controller; +import act.controller.annotation.UrlContext; import org.osgl.mvc.annotation.GetAction; -@Controller("/cht") +@UrlContext("/cht") public class ContextHierarchiTestBed { public static class IntermediateController extends ContextHierarchiTestBed { diff --git a/testapp/src/main/java/testapp/endpoint/CustomBinder.java b/legacy-testapp/src/main/java/testapp/endpoint/CustomBinder.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/CustomBinder.java rename to legacy-testapp/src/main/java/testapp/endpoint/CustomBinder.java diff --git a/testapp/src/main/java/testapp/endpoint/DspTestBed.java b/legacy-testapp/src/main/java/testapp/endpoint/DspTestBed.java similarity index 79% rename from testapp/src/main/java/testapp/endpoint/DspTestBed.java rename to legacy-testapp/src/main/java/testapp/endpoint/DspTestBed.java index d1fa608fd..2cde6916a 100644 --- a/testapp/src/main/java/testapp/endpoint/DspTestBed.java +++ b/legacy-testapp/src/main/java/testapp/endpoint/DspTestBed.java @@ -1,11 +1,11 @@ package testapp.endpoint; -import act.controller.Controller; +import act.controller.annotation.UrlContext; import act.handler.PreventDoubleSubmission; import org.osgl.mvc.annotation.PostAction; // Test double submission protection -@Controller("/dsp") +@UrlContext("/dsp") public class DspTestBed { @PreventDoubleSubmission diff --git a/testapp/src/main/java/testapp/endpoint/ETagTestBed.java b/legacy-testapp/src/main/java/testapp/endpoint/ETagTestBed.java similarity index 82% rename from testapp/src/main/java/testapp/endpoint/ETagTestBed.java rename to legacy-testapp/src/main/java/testapp/endpoint/ETagTestBed.java index 23a50dacb..f884ed90b 100644 --- a/testapp/src/main/java/testapp/endpoint/ETagTestBed.java +++ b/legacy-testapp/src/main/java/testapp/endpoint/ETagTestBed.java @@ -1,10 +1,11 @@ package testapp.endpoint; import act.controller.Controller; +import act.controller.annotation.UrlContext; import org.osgl.mvc.annotation.GetAction; import testapp.model.VersionedModel; -@Controller("/etag") +@UrlContext("/etag") public class ETagTestBed extends Controller.Util { @GetAction("{id}") diff --git a/testapp/src/main/java/testapp/endpoint/EnglishGreetingService.java b/legacy-testapp/src/main/java/testapp/endpoint/EnglishGreetingService.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/EnglishGreetingService.java rename to legacy-testapp/src/main/java/testapp/endpoint/EnglishGreetingService.java diff --git a/testapp/src/main/java/testapp/endpoint/GreetingService.java b/legacy-testapp/src/main/java/testapp/endpoint/GreetingService.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/GreetingService.java rename to legacy-testapp/src/main/java/testapp/endpoint/GreetingService.java diff --git a/testapp/src/main/java/testapp/endpoint/HelloCli.java b/legacy-testapp/src/main/java/testapp/endpoint/HelloCli.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/HelloCli.java rename to legacy-testapp/src/main/java/testapp/endpoint/HelloCli.java diff --git a/testapp/src/main/java/testapp/endpoint/HelloController.java b/legacy-testapp/src/main/java/testapp/endpoint/HelloController.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/HelloController.java rename to legacy-testapp/src/main/java/testapp/endpoint/HelloController.java diff --git a/testapp/src/main/java/testapp/endpoint/I18nTestBed.java b/legacy-testapp/src/main/java/testapp/endpoint/I18nTestBed.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/I18nTestBed.java rename to legacy-testapp/src/main/java/testapp/endpoint/I18nTestBed.java diff --git a/testapp/src/main/java/testapp/endpoint/InheritedOption.java b/legacy-testapp/src/main/java/testapp/endpoint/InheritedOption.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/InheritedOption.java rename to legacy-testapp/src/main/java/testapp/endpoint/InheritedOption.java diff --git a/testapp/src/main/java/testapp/endpoint/InterceptorTestController.java b/legacy-testapp/src/main/java/testapp/endpoint/InterceptorTestController.java similarity index 89% rename from testapp/src/main/java/testapp/endpoint/InterceptorTestController.java rename to legacy-testapp/src/main/java/testapp/endpoint/InterceptorTestController.java index 4decd7ae4..8221cd45a 100644 --- a/testapp/src/main/java/testapp/endpoint/InterceptorTestController.java +++ b/legacy-testapp/src/main/java/testapp/endpoint/InterceptorTestController.java @@ -2,15 +2,13 @@ import act.app.ActionContext; import act.controller.Controller; +import act.controller.annotation.UrlContext; import org.osgl.exception.UnexpectedException; -import org.osgl.mvc.annotation.After; -import org.osgl.mvc.annotation.Before; -import org.osgl.mvc.annotation.Catch; -import org.osgl.mvc.annotation.GetAction; +import org.osgl.mvc.annotation.*; import org.osgl.mvc.result.BadRequest; import org.osgl.mvc.result.Result; -@Controller("/aop") +@UrlContext("/aop") @SuppressWarnings("unused") public class InterceptorTestController extends Controller.Util { diff --git a/testapp/src/main/java/testapp/endpoint/MiscsTestBed.java b/legacy-testapp/src/main/java/testapp/endpoint/MiscsTestBed.java similarity index 93% rename from testapp/src/main/java/testapp/endpoint/MiscsTestBed.java rename to legacy-testapp/src/main/java/testapp/endpoint/MiscsTestBed.java index 7bba7712b..e79906160 100644 --- a/testapp/src/main/java/testapp/endpoint/MiscsTestBed.java +++ b/legacy-testapp/src/main/java/testapp/endpoint/MiscsTestBed.java @@ -2,17 +2,19 @@ import act.cli.Command; import act.controller.Controller; +import act.controller.annotation.UrlContext; import act.data.annotation.ReadContent; import org.osgl.mvc.annotation.PostAction; import org.osgl.storage.impl.SObject; import org.osgl.util.C; import org.osgl.util.IO; -import javax.inject.Named; import java.io.File; -import java.util.*; +import java.util.Collection; +import java.util.List; +import javax.inject.Named; -@Controller("/misc") +@UrlContext("/misc") @SuppressWarnings("unused") public class MiscsTestBed extends Controller.Util { diff --git a/testapp/src/main/java/testapp/endpoint/MorphiaTestBed.java b/legacy-testapp/src/main/java/testapp/endpoint/MorphiaTestBed.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/MorphiaTestBed.java rename to legacy-testapp/src/main/java/testapp/endpoint/MorphiaTestBed.java diff --git a/testapp/src/main/java/testapp/endpoint/OutputRequestParamsTestBed.java b/legacy-testapp/src/main/java/testapp/endpoint/OutputRequestParamsTestBed.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/OutputRequestParamsTestBed.java rename to legacy-testapp/src/main/java/testapp/endpoint/OutputRequestParamsTestBed.java diff --git a/testapp/src/main/java/testapp/endpoint/ParamAndField.java b/legacy-testapp/src/main/java/testapp/endpoint/ParamAndField.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ParamAndField.java rename to legacy-testapp/src/main/java/testapp/endpoint/ParamAndField.java diff --git a/testapp/src/main/java/testapp/endpoint/PojoBinding.java b/legacy-testapp/src/main/java/testapp/endpoint/PojoBinding.java similarity index 87% rename from testapp/src/main/java/testapp/endpoint/PojoBinding.java rename to legacy-testapp/src/main/java/testapp/endpoint/PojoBinding.java index 464a835c5..81f7b710d 100644 --- a/testapp/src/main/java/testapp/endpoint/PojoBinding.java +++ b/legacy-testapp/src/main/java/testapp/endpoint/PojoBinding.java @@ -1,15 +1,11 @@ package testapp.endpoint; -import act.controller.Controller; +import act.controller.annotation.UrlContext; import org.osgl.http.H; import org.osgl.inject.annotation.SessionScoped; -import org.osgl.mvc.annotation.Action; -import org.osgl.mvc.annotation.Before; -import org.osgl.mvc.annotation.SessionFree; +import org.osgl.mvc.annotation.*; import org.osgl.util.C; -import testapp.model.Bar; -import testapp.model.Contact; -import testapp.model.Foo; +import testapp.model.*; import java.util.List; import java.util.Map; @@ -17,7 +13,7 @@ /** * Test binding to a POJO object */ -@Controller("/pojo") +@UrlContext("/pojo") @SuppressWarnings("unused") public class PojoBinding { diff --git a/testapp/src/main/java/testapp/endpoint/SimpleArrayParameterResolver.java b/legacy-testapp/src/main/java/testapp/endpoint/SimpleArrayParameterResolver.java similarity index 97% rename from testapp/src/main/java/testapp/endpoint/SimpleArrayParameterResolver.java rename to legacy-testapp/src/main/java/testapp/endpoint/SimpleArrayParameterResolver.java index c5df85931..451e9eda3 100644 --- a/testapp/src/main/java/testapp/endpoint/SimpleArrayParameterResolver.java +++ b/legacy-testapp/src/main/java/testapp/endpoint/SimpleArrayParameterResolver.java @@ -1,21 +1,19 @@ package testapp.endpoint; import act.controller.Controller; +import act.controller.annotation.UrlContext; import act.util.JsonView; import org.osgl.mvc.annotation.Action; import testapp.model.RGB; import java.math.BigDecimal; import java.math.BigInteger; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.TreeSet; +import java.util.*; /** * Used to test simple array|list|set type parameter resolving */ -@Controller("/sapr") +@UrlContext("/sapr") @SuppressWarnings("unused") public class SimpleArrayParameterResolver extends Controller.Util { @Action("bool_pa") diff --git a/testapp/src/main/java/testapp/endpoint/SimpleBeanTestBed.java b/legacy-testapp/src/main/java/testapp/endpoint/SimpleBeanTestBed.java similarity index 98% rename from testapp/src/main/java/testapp/endpoint/SimpleBeanTestBed.java rename to legacy-testapp/src/main/java/testapp/endpoint/SimpleBeanTestBed.java index 2de83ad1c..d3fe01096 100644 --- a/testapp/src/main/java/testapp/endpoint/SimpleBeanTestBed.java +++ b/legacy-testapp/src/main/java/testapp/endpoint/SimpleBeanTestBed.java @@ -2,6 +2,7 @@ import act.app.App; import act.controller.Controller; +import act.controller.annotation.UrlContext; import org.osgl.$; import org.osgl.exception.UnexpectedException; import org.osgl.exception.UnexpectedNoSuchMethodException; @@ -9,7 +10,7 @@ import org.osgl.mvc.annotation.GetAction; import testapp.sbean.*; -@Controller("/sbean") +@UrlContext("/sbean") public class SimpleBeanTestBed extends Controller.Util { @GetAction("def_const/sbean_no_def_const") diff --git a/testapp/src/main/java/testapp/endpoint/SimpleEventListenerMarkerTestBed.java b/legacy-testapp/src/main/java/testapp/endpoint/SimpleEventListenerMarkerTestBed.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/SimpleEventListenerMarkerTestBed.java rename to legacy-testapp/src/main/java/testapp/endpoint/SimpleEventListenerMarkerTestBed.java diff --git a/testapp/src/main/java/testapp/endpoint/SimpleMapParameterResolver.java b/legacy-testapp/src/main/java/testapp/endpoint/SimpleMapParameterResolver.java similarity index 98% rename from testapp/src/main/java/testapp/endpoint/SimpleMapParameterResolver.java rename to legacy-testapp/src/main/java/testapp/endpoint/SimpleMapParameterResolver.java index 10c2272d0..4279eb505 100644 --- a/testapp/src/main/java/testapp/endpoint/SimpleMapParameterResolver.java +++ b/legacy-testapp/src/main/java/testapp/endpoint/SimpleMapParameterResolver.java @@ -1,6 +1,6 @@ package testapp.endpoint; -import act.controller.Controller; +import act.controller.annotation.UrlContext; import org.osgl.mvc.annotation.Action; import testapp.model.RGB; @@ -10,7 +10,7 @@ /** * Used to verify the parameter binding for Map data */ -@Controller("/smpr") +@UrlContext("/smpr") @SuppressWarnings("unused") public class SimpleMapParameterResolver { diff --git a/testapp/src/main/java/testapp/endpoint/SimpleParameterResolver.java b/legacy-testapp/src/main/java/testapp/endpoint/SimpleParameterResolver.java similarity index 97% rename from testapp/src/main/java/testapp/endpoint/SimpleParameterResolver.java rename to legacy-testapp/src/main/java/testapp/endpoint/SimpleParameterResolver.java index f5ec3b442..1ccc28e7a 100644 --- a/testapp/src/main/java/testapp/endpoint/SimpleParameterResolver.java +++ b/legacy-testapp/src/main/java/testapp/endpoint/SimpleParameterResolver.java @@ -1,17 +1,18 @@ package testapp.endpoint; import act.controller.Controller; +import act.controller.annotation.UrlContext; import org.osgl.mvc.annotation.Action; import testapp.model.RGB; -import javax.validation.constraints.NotNull; import java.math.BigDecimal; import java.math.BigInteger; +import javax.validation.constraints.NotNull; /** * Used to test simple type parameter resolving */ -@Controller("/spr") +@UrlContext("/spr") public class SimpleParameterResolver extends Controller.Util { @Action("bool_p") diff --git a/testapp/src/main/java/testapp/endpoint/SingleOption.java b/legacy-testapp/src/main/java/testapp/endpoint/SingleOption.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/SingleOption.java rename to legacy-testapp/src/main/java/testapp/endpoint/SingleOption.java diff --git a/testapp/src/main/java/testapp/endpoint/StatelessTestBed.java b/legacy-testapp/src/main/java/testapp/endpoint/StatelessTestBed.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/StatelessTestBed.java rename to legacy-testapp/src/main/java/testapp/endpoint/StatelessTestBed.java diff --git a/testapp/src/main/java/testapp/endpoint/SysController.java b/legacy-testapp/src/main/java/testapp/endpoint/SysController.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/SysController.java rename to legacy-testapp/src/main/java/testapp/endpoint/SysController.java diff --git a/testapp/src/main/java/testapp/endpoint/ValidationTestBed.java b/legacy-testapp/src/main/java/testapp/endpoint/ValidationTestBed.java similarity index 68% rename from testapp/src/main/java/testapp/endpoint/ValidationTestBed.java rename to legacy-testapp/src/main/java/testapp/endpoint/ValidationTestBed.java index 8b1a1bb83..86ea42eaf 100644 --- a/testapp/src/main/java/testapp/endpoint/ValidationTestBed.java +++ b/legacy-testapp/src/main/java/testapp/endpoint/ValidationTestBed.java @@ -1,8 +1,9 @@ package testapp.endpoint; import act.controller.Controller; +import act.controller.annotation.UrlContext; -@Controller("validation") +@UrlContext("validation") public class ValidationTestBed extends Controller.Util { public void foo() { diff --git a/testapp/src/main/java/testapp/endpoint/VirtualControllerTestBed.java b/legacy-testapp/src/main/java/testapp/endpoint/VirtualControllerTestBed.java similarity index 83% rename from testapp/src/main/java/testapp/endpoint/VirtualControllerTestBed.java rename to legacy-testapp/src/main/java/testapp/endpoint/VirtualControllerTestBed.java index c40198933..eb792b137 100644 --- a/testapp/src/main/java/testapp/endpoint/VirtualControllerTestBed.java +++ b/legacy-testapp/src/main/java/testapp/endpoint/VirtualControllerTestBed.java @@ -1,12 +1,12 @@ package testapp.endpoint; -import act.controller.Controller; +import static act.controller.Controller.Util.renderText; + +import act.controller.annotation.UrlContext; import act.util.Virtual; import org.osgl.mvc.annotation.GetAction; -import static act.controller.Controller.Util.renderText; - -@Controller("/vc") +@UrlContext("/vc") public class VirtualControllerTestBed { @GetAction("1") @@ -20,10 +20,10 @@ public void handler2() { renderText("2" + getClass().getSimpleName()); } - @Controller("foo") + @UrlContext("foo") public static class Foo extends VirtualControllerTestBed {} - @Controller("bar") + @UrlContext("bar") public static class Bar extends VirtualControllerTestBed {} } diff --git a/testapp/src/main/java/testapp/endpoint/enhancement/Controler20160911.java b/legacy-testapp/src/main/java/testapp/endpoint/enhancement/Controler20160911.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/enhancement/Controler20160911.java rename to legacy-testapp/src/main/java/testapp/endpoint/enhancement/Controler20160911.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GH136.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH136.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/GH136.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH136.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GH136Interceptor.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH136Interceptor.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/GH136Interceptor.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH136Interceptor.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GH152Controller.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH152Controller.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/GH152Controller.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH152Controller.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GH152Interceptor.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH152Interceptor.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/GH152Interceptor.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH152Interceptor.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GH152InterceptorGlobalOnMethod.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH152InterceptorGlobalOnMethod.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/GH152InterceptorGlobalOnMethod.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH152InterceptorGlobalOnMethod.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GH222.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH222.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/GH222.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH222.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GH229.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH229.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/GH229.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH229.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GH232.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH232.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/GH232.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH232.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GH287.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH287.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/GH287.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH287.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GH289.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH289.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/GH289.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH289.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GH295.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH295.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/GH295.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH295.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GH296.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH296.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/GH296.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH296.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GH297.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH297.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/GH297.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH297.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GH301.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH301.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/GH301.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH301.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GH317.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH317.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/GH317.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH317.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GH319.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH319.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/GH319.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH319.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GH325.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH325.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/GH325.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH325.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GH349.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH349.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/GH349.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH349.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GH350.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH350.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/GH350.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH350.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GH352.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH352.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/GH352.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH352.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GH354.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH354.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/GH354.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH354.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GH421.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH421.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/GH421.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH421.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GH449.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH449.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/GH449.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH449.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GH504.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH504.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/GH504.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH504.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GH506.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH506.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/GH506.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH506.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GH518.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH518.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/GH518.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH518.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GH536.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH536.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/GH536.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH536.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GH537.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH537.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/GH537.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH537.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GH538.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH538.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/GH538.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH538.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GH542.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH542.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/GH542.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH542.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GH555.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH555.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/GH555.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH555.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GH562.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH562.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/GH562.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH562.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GH631.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH631.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/GH631.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH631.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GH636.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH636.java similarity index 89% rename from testapp/src/main/java/testapp/endpoint/ghissues/GH636.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH636.java index 1f3581b3e..39b8fcc08 100644 --- a/testapp/src/main/java/testapp/endpoint/ghissues/GH636.java +++ b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH636.java @@ -4,9 +4,6 @@ import org.osgl.inject.annotation.Configuration; import org.osgl.mvc.annotation.GetAction; -/** - * Test `@With` on action methods - */ @UrlContext("636") public class GH636 extends GithubIssueBase { diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GH657.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH657.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/GH657.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH657.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GH671.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH671.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/GH671.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH671.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GH678.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH678.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/GH678.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH678.java diff --git a/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH691.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH691.java new file mode 100644 index 000000000..7af501f46 --- /dev/null +++ b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GH691.java @@ -0,0 +1,18 @@ +package testapp.endpoint.ghissues; + +import org.joda.time.DateTime; +import org.joda.time.LocalDate; +import org.osgl.mvc.annotation.GetAction; + +public class GH691 extends GithubIssueBase { + + @GetAction("691/1") + public DateTime test1(DateTime timestamp) { + return timestamp; + } + + @GetAction("691/2") + public LocalDate test2(LocalDate timestamp) { + return timestamp; + } +} diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/Gh318.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/Gh318.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/Gh318.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/Gh318.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/Gh438.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/Gh438.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/Gh438.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/Gh438.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/GithubIssueBase.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/GithubIssueBase.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/GithubIssueBase.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/GithubIssueBase.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/gh304/Gh304Event.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh304/Gh304Event.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/gh304/Gh304Event.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh304/Gh304Event.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/gh304/Gh304EventListener.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh304/Gh304EventListener.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/gh304/Gh304EventListener.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh304/Gh304EventListener.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/gh310/GH310.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh310/GH310.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/gh310/GH310.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh310/GH310.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/gh310/GH310Model.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh310/GH310Model.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/gh310/GH310Model.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh310/GH310Model.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/gh353/GH353.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh353/GH353.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/gh353/GH353.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh353/GH353.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/gh353/User.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh353/User.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/gh353/User.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh353/User.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/gh417/FastJsonIssue.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh417/FastJsonIssue.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/gh417/FastJsonIssue.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh417/FastJsonIssue.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/gh417/GH417.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh417/GH417.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/gh417/GH417.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh417/GH417.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/gh417/Record.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh417/Record.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/gh417/Record.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh417/Record.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/gh426/GH426.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh426/GH426.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/gh426/GH426.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh426/GH426.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/gh434/ByeService.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh434/ByeService.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/gh434/ByeService.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh434/ByeService.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/gh434/FarewellService.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh434/FarewellService.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/gh434/FarewellService.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh434/FarewellService.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/gh434/GH434.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh434/GH434.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/gh434/GH434.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh434/GH434.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/gh434/GreetingService.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh434/GreetingService.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/gh434/GreetingService.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh434/GreetingService.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/gh434/HelloService.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh434/HelloService.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/gh434/HelloService.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh434/HelloService.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/gh434/NiHaoService.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh434/NiHaoService.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/gh434/NiHaoService.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh434/NiHaoService.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/gh434/Service.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh434/Service.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/gh434/Service.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh434/Service.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/gh434/ZaiJianService.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh434/ZaiJianService.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/gh434/ZaiJianService.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh434/ZaiJianService.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/gh446/DataTable.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh446/DataTable.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/gh446/DataTable.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh446/DataTable.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/gh446/GH446.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh446/GH446.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/gh446/GH446.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh446/GH446.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/gh471/FooEvent.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh471/FooEvent.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/gh471/FooEvent.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh471/FooEvent.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/gh471/GH471.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh471/GH471.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/gh471/GH471.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh471/GH471.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/gh473/Foo.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh473/Foo.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/gh473/Foo.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh473/Foo.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/gh473/GH473.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh473/GH473.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/gh473/GH473.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh473/GH473.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/gh547/DataTable.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh547/DataTable.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/gh547/DataTable.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh547/DataTable.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/gh547/GH547.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh547/GH547.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/gh547/GH547.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh547/GH547.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/gh554/EventListener.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh554/EventListener.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/gh554/EventListener.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh554/EventListener.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/gh554/GH554.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh554/GH554.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/gh554/GH554.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh554/GH554.java diff --git a/testapp/src/main/java/testapp/endpoint/ghissues/gh554/MsgTemplate.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh554/MsgTemplate.java similarity index 100% rename from testapp/src/main/java/testapp/endpoint/ghissues/gh554/MsgTemplate.java rename to legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh554/MsgTemplate.java diff --git a/legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh692/Gh692Service.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh692/Gh692Service.java new file mode 100644 index 000000000..0982e17ab --- /dev/null +++ b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh692/Gh692Service.java @@ -0,0 +1,30 @@ +package testapp.endpoint.ghissues.gh692; + +import act.controller.annotation.UrlContext; +import act.util.Stateless; +import act.util.SubClassFinder; +import org.osgl.mvc.annotation.GetAction; +import testapp.endpoint.ghissues.GithubIssueBase; + +import java.util.ArrayList; +import java.util.List; + +public interface Gh692Service { + String name(); + + @UrlContext("692") + @Stateless + class Manager extends GithubIssueBase { + private List serviceList = new ArrayList<>(); + + @SubClassFinder + public void foundService(Gh692Service svc) { + serviceList.add(svc); + } + + @GetAction + public int count() { + return serviceList.size(); + } + } +} diff --git a/legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh692/HelloService.java b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh692/HelloService.java new file mode 100644 index 000000000..28df60d7e --- /dev/null +++ b/legacy-testapp/src/main/java/testapp/endpoint/ghissues/gh692/HelloService.java @@ -0,0 +1,8 @@ +package testapp.endpoint.ghissues.gh692; + +public class HelloService implements Gh692Service { + @Override + public String name() { + return "Hello"; + } +} diff --git a/testapp/src/main/java/testapp/model/Bar.java b/legacy-testapp/src/main/java/testapp/model/Bar.java similarity index 100% rename from testapp/src/main/java/testapp/model/Bar.java rename to legacy-testapp/src/main/java/testapp/model/Bar.java diff --git a/testapp/src/main/java/testapp/model/Contact.java b/legacy-testapp/src/main/java/testapp/model/Contact.java similarity index 100% rename from testapp/src/main/java/testapp/model/Contact.java rename to legacy-testapp/src/main/java/testapp/model/Contact.java diff --git a/testapp/src/main/java/testapp/model/Foo.java b/legacy-testapp/src/main/java/testapp/model/Foo.java similarity index 100% rename from testapp/src/main/java/testapp/model/Foo.java rename to legacy-testapp/src/main/java/testapp/model/Foo.java diff --git a/testapp/src/main/java/testapp/model/ModelBase.java b/legacy-testapp/src/main/java/testapp/model/ModelBase.java similarity index 100% rename from testapp/src/main/java/testapp/model/ModelBase.java rename to legacy-testapp/src/main/java/testapp/model/ModelBase.java diff --git a/testapp/src/main/java/testapp/model/RGB.java b/legacy-testapp/src/main/java/testapp/model/RGB.java similarity index 100% rename from testapp/src/main/java/testapp/model/RGB.java rename to legacy-testapp/src/main/java/testapp/model/RGB.java diff --git a/testapp/src/main/java/testapp/model/User.java b/legacy-testapp/src/main/java/testapp/model/User.java similarity index 100% rename from testapp/src/main/java/testapp/model/User.java rename to legacy-testapp/src/main/java/testapp/model/User.java diff --git a/testapp/src/main/java/testapp/model/VersionedModel.java b/legacy-testapp/src/main/java/testapp/model/VersionedModel.java similarity index 77% rename from testapp/src/main/java/testapp/model/VersionedModel.java rename to legacy-testapp/src/main/java/testapp/model/VersionedModel.java index a18b76dd7..d4eeb7b33 100644 --- a/testapp/src/main/java/testapp/model/VersionedModel.java +++ b/legacy-testapp/src/main/java/testapp/model/VersionedModel.java @@ -8,19 +8,23 @@ */ public class VersionedModel implements Versioned { - private String id; + private String version; public VersionedModel() { this(S.random()); } public VersionedModel(String id) { - this.id = S.blank(id) ? S.random() : id; + this.version = S.blank(id) ? S.random() : id; + } + + public String getVersion() { + return version; } @Override public String _version() { - return id; + return version; } public static VersionedModel getNew() { diff --git a/testapp/src/main/java/testapp/model/mongo/GH301Model.java b/legacy-testapp/src/main/java/testapp/model/mongo/GH301Model.java similarity index 100% rename from testapp/src/main/java/testapp/model/mongo/GH301Model.java rename to legacy-testapp/src/main/java/testapp/model/mongo/GH301Model.java diff --git a/testapp/src/main/java/testapp/model/mongo/Group.java b/legacy-testapp/src/main/java/testapp/model/mongo/Group.java similarity index 100% rename from testapp/src/main/java/testapp/model/mongo/Group.java rename to legacy-testapp/src/main/java/testapp/model/mongo/Group.java diff --git a/testapp/src/main/java/testapp/model/mongo/KVStoreModel.java b/legacy-testapp/src/main/java/testapp/model/mongo/KVStoreModel.java similarity index 100% rename from testapp/src/main/java/testapp/model/mongo/KVStoreModel.java rename to legacy-testapp/src/main/java/testapp/model/mongo/KVStoreModel.java diff --git a/testapp/src/main/java/testapp/model/mongo/Person.java b/legacy-testapp/src/main/java/testapp/model/mongo/Person.java similarity index 100% rename from testapp/src/main/java/testapp/model/mongo/Person.java rename to legacy-testapp/src/main/java/testapp/model/mongo/Person.java diff --git a/testapp/src/main/java/testapp/sbean/DerivedSimpleBean.java b/legacy-testapp/src/main/java/testapp/sbean/DerivedSimpleBean.java similarity index 100% rename from testapp/src/main/java/testapp/sbean/DerivedSimpleBean.java rename to legacy-testapp/src/main/java/testapp/sbean/DerivedSimpleBean.java diff --git a/testapp/src/main/java/testapp/sbean/NotSimpleBeanWithDefaultConstructor.java b/legacy-testapp/src/main/java/testapp/sbean/NotSimpleBeanWithDefaultConstructor.java similarity index 100% rename from testapp/src/main/java/testapp/sbean/NotSimpleBeanWithDefaultConstructor.java rename to legacy-testapp/src/main/java/testapp/sbean/NotSimpleBeanWithDefaultConstructor.java diff --git a/testapp/src/main/java/testapp/sbean/NotSimpleBeanWithoutDefaultConstructor.java b/legacy-testapp/src/main/java/testapp/sbean/NotSimpleBeanWithoutDefaultConstructor.java similarity index 100% rename from testapp/src/main/java/testapp/sbean/NotSimpleBeanWithoutDefaultConstructor.java rename to legacy-testapp/src/main/java/testapp/sbean/NotSimpleBeanWithoutDefaultConstructor.java diff --git a/testapp/src/main/java/testapp/sbean/SimpleBeanWithDefaultConstructor.java b/legacy-testapp/src/main/java/testapp/sbean/SimpleBeanWithDefaultConstructor.java similarity index 100% rename from testapp/src/main/java/testapp/sbean/SimpleBeanWithDefaultConstructor.java rename to legacy-testapp/src/main/java/testapp/sbean/SimpleBeanWithDefaultConstructor.java diff --git a/testapp/src/main/java/testapp/sbean/SimpleBeanWithoutDefaultConstructor.java b/legacy-testapp/src/main/java/testapp/sbean/SimpleBeanWithoutDefaultConstructor.java similarity index 100% rename from testapp/src/main/java/testapp/sbean/SimpleBeanWithoutDefaultConstructor.java rename to legacy-testapp/src/main/java/testapp/sbean/SimpleBeanWithoutDefaultConstructor.java diff --git a/testapp/src/main/java/testapp/sbean/SimpleModel.java b/legacy-testapp/src/main/java/testapp/sbean/SimpleModel.java similarity index 99% rename from testapp/src/main/java/testapp/sbean/SimpleModel.java rename to legacy-testapp/src/main/java/testapp/sbean/SimpleModel.java index 8fcc28c38..947fc7a09 100644 --- a/testapp/src/main/java/testapp/sbean/SimpleModel.java +++ b/legacy-testapp/src/main/java/testapp/sbean/SimpleModel.java @@ -3,9 +3,7 @@ import act.util.SimpleBean; public interface SimpleModel extends SimpleBean { - class SomeModel implements SimpleModel { public SomeModel(boolean flag) {} } - } diff --git a/testapp/src/main/resources/act.router.macro b/legacy-testapp/src/main/resources/act.router.macro similarity index 100% rename from testapp/src/main/resources/act.router.macro rename to legacy-testapp/src/main/resources/act.router.macro diff --git a/testapp/src/main/resources/app.properties b/legacy-testapp/src/main/resources/app.properties similarity index 95% rename from testapp/src/main/resources/app.properties rename to legacy-testapp/src/main/resources/app.properties index a3d3ea340..eb869f4a7 100644 --- a/testapp/src/main/resources/app.properties +++ b/legacy-testapp/src/main/resources/app.properties @@ -9,3 +9,4 @@ greeting.service.cn.impl=testapp.endpoint.ChineseGreetingService greeting.service.en.impl=testapp.endpoint.EnglishGreetingService foo.bar=567 apidoc=false +api_doc=false \ No newline at end of file diff --git a/testapp/src/main/resources/app.version b/legacy-testapp/src/main/resources/app.version similarity index 100% rename from testapp/src/main/resources/app.version rename to legacy-testapp/src/main/resources/app.version diff --git a/testapp/src/main/resources/bigfile b/legacy-testapp/src/main/resources/bigfile similarity index 100% rename from testapp/src/main/resources/bigfile rename to legacy-testapp/src/main/resources/bigfile diff --git a/testapp/src/main/resources/gh434.properties b/legacy-testapp/src/main/resources/gh434.properties similarity index 100% rename from testapp/src/main/resources/gh434.properties rename to legacy-testapp/src/main/resources/gh434.properties diff --git a/testapp/src/main/resources/gh536.properties b/legacy-testapp/src/main/resources/gh536.properties similarity index 100% rename from testapp/src/main/resources/gh536.properties rename to legacy-testapp/src/main/resources/gh536.properties diff --git a/testapp/src/main/resources/gh631.properties b/legacy-testapp/src/main/resources/gh631.properties similarity index 100% rename from testapp/src/main/resources/gh631.properties rename to legacy-testapp/src/main/resources/gh631.properties diff --git a/testapp/src/main/resources/gh671.properties b/legacy-testapp/src/main/resources/gh671.properties similarity index 100% rename from testapp/src/main/resources/gh671.properties rename to legacy-testapp/src/main/resources/gh671.properties diff --git a/testapp/src/main/resources/logback.xml b/legacy-testapp/src/main/resources/logback.xml similarity index 100% rename from testapp/src/main/resources/logback.xml rename to legacy-testapp/src/main/resources/logback.xml diff --git a/testapp/src/main/resources/messages.properties b/legacy-testapp/src/main/resources/messages.properties similarity index 100% rename from testapp/src/main/resources/messages.properties rename to legacy-testapp/src/main/resources/messages.properties diff --git a/testapp/src/main/resources/messages_en.properties b/legacy-testapp/src/main/resources/messages_en.properties similarity index 100% rename from testapp/src/main/resources/messages_en.properties rename to legacy-testapp/src/main/resources/messages_en.properties diff --git a/testapp/src/main/resources/messages_zh_CN.properties b/legacy-testapp/src/main/resources/messages_zh_CN.properties similarity index 100% rename from testapp/src/main/resources/messages_zh_CN.properties rename to legacy-testapp/src/main/resources/messages_zh_CN.properties diff --git a/testapp/src/main/resources/routes.conf b/legacy-testapp/src/main/resources/routes.conf similarity index 100% rename from testapp/src/main/resources/routes.conf rename to legacy-testapp/src/main/resources/routes.conf diff --git a/testapp/src/main/resources/rythm/gh/287/foo.html b/legacy-testapp/src/main/resources/rythm/gh/287/foo.html similarity index 100% rename from testapp/src/main/resources/rythm/gh/287/foo.html rename to legacy-testapp/src/main/resources/rythm/gh/287/foo.html diff --git a/testapp/src/main/resources/rythm/gh/352/test.html b/legacy-testapp/src/main/resources/rythm/gh/352/test.html similarity index 100% rename from testapp/src/main/resources/rythm/gh/352/test.html rename to legacy-testapp/src/main/resources/rythm/gh/352/test.html diff --git a/testapp/src/main/resources/rythm/gh/354/foo.html b/legacy-testapp/src/main/resources/rythm/gh/354/foo.html similarity index 100% rename from testapp/src/main/resources/rythm/gh/354/foo.html rename to legacy-testapp/src/main/resources/rythm/gh/354/foo.html diff --git a/testapp/src/main/resources/rythm/testapp/endpoint/HelloController/hello5.html b/legacy-testapp/src/main/resources/rythm/testapp/endpoint/HelloController/hello5.html similarity index 100% rename from testapp/src/main/resources/rythm/testapp/endpoint/HelloController/hello5.html rename to legacy-testapp/src/main/resources/rythm/testapp/endpoint/HelloController/hello5.html diff --git a/testapp/src/main/resources/smallfile b/legacy-testapp/src/main/resources/smallfile similarity index 100% rename from testapp/src/main/resources/smallfile rename to legacy-testapp/src/main/resources/smallfile diff --git a/testapp/src/main/resources/testapp/.version b/legacy-testapp/src/main/resources/testapp/.version similarity index 100% rename from testapp/src/main/resources/testapp/.version rename to legacy-testapp/src/main/resources/testapp/.version diff --git a/testapp/src/main/resources/testapp/TestApp.properties b/legacy-testapp/src/main/resources/testapp/TestApp.properties similarity index 100% rename from testapp/src/main/resources/testapp/TestApp.properties rename to legacy-testapp/src/main/resources/testapp/TestApp.properties diff --git a/testapp/src/main/resources/testapp/TestApp_en.properties b/legacy-testapp/src/main/resources/testapp/TestApp_en.properties similarity index 100% rename from testapp/src/main/resources/testapp/TestApp_en.properties rename to legacy-testapp/src/main/resources/testapp/TestApp_en.properties diff --git a/testapp/src/main/resources/testapp/TestApp_zh_CN.properties b/legacy-testapp/src/main/resources/testapp/TestApp_zh_CN.properties similarity index 100% rename from testapp/src/main/resources/testapp/TestApp_zh_CN.properties rename to legacy-testapp/src/main/resources/testapp/TestApp_zh_CN.properties diff --git a/testapp/src/test/java/testapp/TestBase.java b/legacy-testapp/src/test/java/testapp/TestBase.java similarity index 100% rename from testapp/src/test/java/testapp/TestBase.java rename to legacy-testapp/src/test/java/testapp/TestBase.java diff --git a/testapp/src/test/java/testapp/benchmark/CuidBenchmark.java b/legacy-testapp/src/test/java/testapp/benchmark/CuidBenchmark.java similarity index 100% rename from testapp/src/test/java/testapp/benchmark/CuidBenchmark.java rename to legacy-testapp/src/test/java/testapp/benchmark/CuidBenchmark.java diff --git a/testapp/src/test/java/testapp/endpoint/CORSTest.java b/legacy-testapp/src/test/java/testapp/endpoint/CORSTest.java similarity index 84% rename from testapp/src/test/java/testapp/endpoint/CORSTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/CORSTest.java index 603de2b39..66cff7f1d 100644 --- a/testapp/src/test/java/testapp/endpoint/CORSTest.java +++ b/legacy-testapp/src/test/java/testapp/endpoint/CORSTest.java @@ -3,8 +3,7 @@ import org.junit.Test; import static org.osgl.http.H.Header.Names.*; -import static testapp.TestApp.GLOBAL_CORS.ALLOW_EXPOSE_HEADER; -import static testapp.TestApp.GLOBAL_CORS.MAX_AGE; +import static testapp.TestApp.GLOBAL_CORS.*; public class CORSTest extends EndpointTester { @@ -15,7 +14,7 @@ public void testFoo() throws Exception { checkHeader(ACCESS_CONTROL_ALLOW_HEADERS, CORSTestBed.ALLOW_HEADERS); checkHeader(ACCESS_CONTROL_ALLOW_METHODS, "GET"); checkHeader(ACCESS_CONTROL_MAX_AGE, MAX_AGE); - checkHeader(ACCESS_CONTROL_EXPOSE_HEADERS, ALLOW_EXPOSE_HEADER); + checkHeader(ACCESS_CONTROL_EXPOSE_HEADERS, EXPOSE_HEADER); } @Test diff --git a/testapp/src/test/java/testapp/endpoint/CSPTest.java b/legacy-testapp/src/test/java/testapp/endpoint/CSPTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/CSPTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/CSPTest.java diff --git a/testapp/src/test/java/testapp/endpoint/CSRFTest.java b/legacy-testapp/src/test/java/testapp/endpoint/CSRFTest.java similarity index 96% rename from testapp/src/test/java/testapp/endpoint/CSRFTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/CSRFTest.java index a3e3b678e..cb8d35ce0 100644 --- a/testapp/src/test/java/testapp/endpoint/CSRFTest.java +++ b/legacy-testapp/src/test/java/testapp/endpoint/CSRFTest.java @@ -53,7 +53,7 @@ public List retrieveCsrfToken($.Var csrf) throws IOException { List cookies = cookies(); List returnCookies = C.newList(); for (Cookie cookie : cookies) { - if ("act-xsrf-token".equals(cookie.name())) { + if ("xsrf-token".equalsIgnoreCase(cookie.name())) { csrf.set(cookie.value()); } else { returnCookies.add(cookie); diff --git a/testapp/src/test/java/testapp/endpoint/ContextHierarchiTest.java b/legacy-testapp/src/test/java/testapp/endpoint/ContextHierarchiTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/ContextHierarchiTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/ContextHierarchiTest.java diff --git a/testapp/src/test/java/testapp/endpoint/CustomBinderTest.java b/legacy-testapp/src/test/java/testapp/endpoint/CustomBinderTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/CustomBinderTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/CustomBinderTest.java diff --git a/testapp/src/test/java/testapp/endpoint/DspTest.java b/legacy-testapp/src/test/java/testapp/endpoint/DspTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/DspTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/DspTest.java diff --git a/testapp/src/test/java/testapp/endpoint/ETagTest.java b/legacy-testapp/src/test/java/testapp/endpoint/ETagTest.java similarity index 77% rename from testapp/src/test/java/testapp/endpoint/ETagTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/ETagTest.java index ddf08c2f9..e510d765c 100644 --- a/testapp/src/test/java/testapp/endpoint/ETagTest.java +++ b/legacy-testapp/src/test/java/testapp/endpoint/ETagTest.java @@ -1,5 +1,7 @@ package testapp.endpoint; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; import org.junit.Test; import org.osgl.$; import org.osgl.mvc.result.NotModified; @@ -19,7 +21,8 @@ public void itShallReturnNotModifiedIfETagMatches() throws IOException { public String retrieveETag($.Var version) throws IOException { url("/etag"); - version.set(resp().body().string()); + JSONObject obj = JSON.parseObject(resp().body().string()); + version.set(obj.getString("version")); return resp().header("Etag"); } diff --git a/testapp/src/test/java/testapp/endpoint/EndPointTestContext.java b/legacy-testapp/src/test/java/testapp/endpoint/EndPointTestContext.java similarity index 95% rename from testapp/src/test/java/testapp/endpoint/EndPointTestContext.java rename to legacy-testapp/src/test/java/testapp/endpoint/EndPointTestContext.java index 360ec592e..79a7fb0d4 100644 --- a/testapp/src/test/java/testapp/endpoint/EndPointTestContext.java +++ b/legacy-testapp/src/test/java/testapp/endpoint/EndPointTestContext.java @@ -16,7 +16,7 @@ public enum RequestMethod { @Override public void verify(EndpointTester tester, EndPointTestContext context) throws Exception { tester.setup(); - tester.url(context.url).get(context.params); + tester.url(context.url).get(context.params).accept(context.accept); tester.bodyEq(context.expected); } }, @@ -24,7 +24,7 @@ public void verify(EndpointTester tester, EndPointTestContext context) throws Ex @Override public void verify(EndpointTester tester, EndPointTestContext context) throws Exception { tester.setup(); - tester.url(context.url).post(context.params); + tester.url(context.url).accept(context.accept).post(context.params); tester.bodyEq(context.expected); } }, POST_JSON () { diff --git a/testapp/src/test/java/testapp/endpoint/EndpointTester.java b/legacy-testapp/src/test/java/testapp/endpoint/EndpointTester.java similarity index 99% rename from testapp/src/test/java/testapp/endpoint/EndpointTester.java rename to legacy-testapp/src/test/java/testapp/endpoint/EndpointTester.java index 8552e8f8c..7807ce703 100644 --- a/testapp/src/test/java/testapp/endpoint/EndpointTester.java +++ b/legacy-testapp/src/test/java/testapp/endpoint/EndpointTester.java @@ -137,8 +137,8 @@ protected void verifyPostJsonBody(String expected, String url, String key, Objec bodyEq(expected); } - protected ReqBuilder url(String pathTmpl, Object ... args) { - reqBuilder = new ReqBuilder(pathTmpl, args); + public ReqBuilder url(String pathTmpl, Object ... args) { + reqBuilder = new ReqBuilder(pathTmpl, args).header("Accept", "text/html"); return reqBuilder; } diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue136.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue136.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue136.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue136.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue222.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue222.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue222.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue222.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue229.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue229.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue229.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue229.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue232.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue232.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue232.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue232.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue287.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue287.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue287.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue287.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue289.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue289.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue289.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue289.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue295.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue295.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue295.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue295.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue296.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue296.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue296.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue296.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue297.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue297.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue297.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue297.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue301.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue301.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue301.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue301.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue304.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue304.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue304.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue304.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue310.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue310.java similarity index 79% rename from testapp/src/test/java/testapp/endpoint/GHIssue310.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue310.java index 506f37fbf..5a5062966 100644 --- a/testapp/src/test/java/testapp/endpoint/GHIssue310.java +++ b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue310.java @@ -3,7 +3,10 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import org.junit.Test; -import org.osgl.util.S; +import org.osgl.$; +import org.osgl.util.C; + +import java.util.List; public class GHIssue310 extends EndpointTester { @@ -11,9 +14,9 @@ public class GHIssue310 extends EndpointTester { public void test() throws Exception { drop(); System.out.println(1); - create(S.random()); + create(random()); System.out.println(2); - create(S.random()); + create(random()); System.out.println(3); create("foo"); System.out.println(4); @@ -42,4 +45,10 @@ private void create(String name) throws Exception { setup(); } + private static List nameList = C.list("tom1", "betty2", "zama3"); + + private String random() { + return $.random(nameList); + } + } diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue317.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue317.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue317.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue317.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue319.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue319.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue319.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue319.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue325.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue325.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue325.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue325.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue349.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue349.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue349.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue349.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue350.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue350.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue350.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue350.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue352.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue352.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue352.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue352.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue353.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue353.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue353.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue353.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue354.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue354.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue354.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue354.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue421.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue421.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue421.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue421.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue426.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue426.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue426.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue426.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue434.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue434.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue434.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue434.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue438.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue438.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue438.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue438.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue449.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue449.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue449.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue449.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue471.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue471.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue471.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue471.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue473.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue473.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue473.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue473.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue504.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue504.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue504.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue504.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue506.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue506.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue506.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue506.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue518.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue518.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue518.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue518.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue536.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue536.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue536.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue536.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue537.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue537.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue537.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue537.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue538.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue538.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue538.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue538.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue542.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue542.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue542.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue542.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue547.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue547.java similarity index 96% rename from testapp/src/test/java/testapp/endpoint/GHIssue547.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue547.java index 050a6b251..cc63c089a 100644 --- a/testapp/src/test/java/testapp/endpoint/GHIssue547.java +++ b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue547.java @@ -58,7 +58,7 @@ public void test() throws Exception { "table[search][value]", "", "table[search][regex]", false ); - bodyEq("{\"columns\":[{\"data\":\"name\",\"name\":\"name\",\"orderable\":true,\"search\":{\"regex\":false,\"value\":\"\"},\"searchable\":true},{\"data\":\"vip\",\"name\":\"is_vip\",\"orderable\":false,\"search\":{\"regex\":false,\"value\":\"\"},\"searchable\":true},{\"data\":\"vipStartTime\",\"name\":\"vipStartTime\",\"orderable\":false,\"search\":{\"regex\":false,\"value\":\"\"},\"searchable\":true},{\"data\":\"vipEndTime\",\"name\":\"vipEndTime\",\"orderable\":false,\"search\":{\"regex\":false,\"value\":\"\"},\"searchable\":true},{\"data\":\"lastGoodsName\",\"name\":\"lastGoodsName\",\"orderable\":false,\"search\":{\"regex\":false,\"value\":\"\"},\"searchable\":true},{\"data\":\"regTime\",\"name\":\"regTime\",\"orderable\":true,\"search\":{\"regex\":false,\"value\":\"\"},\"searchable\":true},{\"data\":\"id\",\"name\":\"id\",\"orderable\":false,\"search\":{\"regex\":false,\"value\":\"\"},\"searchable\":true}],\"data\":[],\"draw\":1,\"length\":30,\"order\":[{\"column\":0,\"dir\":\"asc\"}],\"orderProperty\":{\"$ref\":\"$.order[0]\"},\"recordsFiltered\":0,\"recordsTotal\":0,\"search\":{\"value\":\"\",\"regex\":\"false\"},\"start\":0}"); + bodyEq("{\"columns\":[{\"data\":\"name\",\"name\":\"name\",\"orderable\":true,\"search\":{\"regex\":false,\"value\":\"\"},\"searchable\":true},{\"data\":\"vip\",\"name\":\"is_vip\",\"orderable\":false,\"search\":{\"regex\":false,\"value\":\"\"},\"searchable\":true},{\"data\":\"vipStartTime\",\"name\":\"vipStartTime\",\"orderable\":false,\"search\":{\"regex\":false,\"value\":\"\"},\"searchable\":true},{\"data\":\"vipEndTime\",\"name\":\"vipEndTime\",\"orderable\":false,\"search\":{\"regex\":false,\"value\":\"\"},\"searchable\":true},{\"data\":\"lastGoodsName\",\"name\":\"lastGoodsName\",\"orderable\":false,\"search\":{\"regex\":false,\"value\":\"\"},\"searchable\":true},{\"data\":\"regTime\",\"name\":\"regTime\",\"orderable\":true,\"search\":{\"regex\":false,\"value\":\"\"},\"searchable\":true},{\"data\":\"id\",\"name\":\"id\",\"orderable\":false,\"search\":{\"regex\":false,\"value\":\"\"},\"searchable\":true}],\"data\":[],\"draw\":1,\"length\":30,\"order\":[{\"column\":0,\"dir\":\"asc\"}],\"orderProperty\":{\"column\":0,\"dir\":\"asc\"},\"recordsFiltered\":0,\"recordsTotal\":0,\"search\":{\"value\":\"\",\"regex\":\"false\"},\"start\":0}"); } } diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue554.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue554.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue554.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue554.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue555.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue555.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue555.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue555.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue562.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue562.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue562.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue562.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue631.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue631.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue631.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue631.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue636.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue636.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue636.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue636.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue657.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue657.java similarity index 50% rename from testapp/src/test/java/testapp/endpoint/GHIssue657.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue657.java index 435a7b982..f6bfa2ac9 100644 --- a/testapp/src/test/java/testapp/endpoint/GHIssue657.java +++ b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue657.java @@ -1,19 +1,27 @@ package testapp.endpoint; +import org.joda.time.DateTime; import org.junit.Test; +import org.osgl.util.S; public class GHIssue657 extends EndpointTester { + private String year; + + public GHIssue657() { + year = S.string(DateTime.now().getYear()); + } + @Test public void testList1() throws Exception { - url("/gh/657/1").header("accept", "application/json").get(); - bodyContains("2018"); + url("/gh/657/1").getJSON(); + bodyContains(year); } @Test public void testList2() throws Exception { url("/gh/657/2").get(); - bodyContains("2018"); + bodyContains(year); } } diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue671.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue671.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue671.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue671.java diff --git a/testapp/src/test/java/testapp/endpoint/GHIssue678.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue678.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/GHIssue678.java rename to legacy-testapp/src/test/java/testapp/endpoint/GHIssue678.java diff --git a/legacy-testapp/src/test/java/testapp/endpoint/GHIssue691.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue691.java new file mode 100644 index 000000000..2c4579fe9 --- /dev/null +++ b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue691.java @@ -0,0 +1,20 @@ +package testapp.endpoint; + +import org.junit.Test; +import org.osgl.mvc.result.BadRequest; + +public class GHIssue691 extends EndpointTester { + + @Test + public void test1() throws Exception { + url("/gh/691/1?timestamp=100000000").get(); + checkRespCode(); + } + + @Test + public void test2() throws Exception { + url("/gh/691/2?timestamp=2500000000").get(); + checkRespCode(); + } + +} diff --git a/legacy-testapp/src/test/java/testapp/endpoint/GHIssue692.java b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue692.java new file mode 100644 index 000000000..1de96cc7b --- /dev/null +++ b/legacy-testapp/src/test/java/testapp/endpoint/GHIssue692.java @@ -0,0 +1,13 @@ +package testapp.endpoint; + +import org.junit.Test; + +public class GHIssue692 extends EndpointTester { + + @Test + public void test() throws Exception { + url("/gh/692").get(); + bodyEq("1"); + } + +} diff --git a/testapp/src/test/java/testapp/endpoint/HelloControllerTest.java b/legacy-testapp/src/test/java/testapp/endpoint/HelloControllerTest.java similarity index 91% rename from testapp/src/test/java/testapp/endpoint/HelloControllerTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/HelloControllerTest.java index 0f5c8d670..22bc47b11 100644 --- a/testapp/src/test/java/testapp/endpoint/HelloControllerTest.java +++ b/legacy-testapp/src/test/java/testapp/endpoint/HelloControllerTest.java @@ -62,8 +62,8 @@ public void testGlobalCORS() throws Exception { private void verifyGlobalCORS() throws Exception { checkHeader(ACCESS_CONTROL_ALLOW_ORIGIN, ALLOW_ORIGIN); if (reqBuilder.method() == H.Method.OPTIONS) { - checkHeader(ACCESS_CONTROL_ALLOW_HEADERS, ALLOW_EXPOSE_HEADER); - checkHeader(ACCESS_CONTROL_EXPOSE_HEADERS, ALLOW_EXPOSE_HEADER); + checkHeader(ACCESS_CONTROL_ALLOW_HEADERS, ALLOW_HEADER); + checkHeader(ACCESS_CONTROL_EXPOSE_HEADERS, EXPOSE_HEADER); checkHeader(ACCESS_CONTROL_MAX_AGE, MAX_AGE); checkHeader(ACCESS_CONTROL_ALLOW_METHODS, "GET"); } diff --git a/testapp/src/test/java/testapp/endpoint/I18nTest.java b/legacy-testapp/src/test/java/testapp/endpoint/I18nTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/I18nTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/I18nTest.java diff --git a/testapp/src/test/java/testapp/endpoint/InterceptorTest.java b/legacy-testapp/src/test/java/testapp/endpoint/InterceptorTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/InterceptorTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/InterceptorTest.java diff --git a/testapp/src/test/java/testapp/endpoint/MorphiaTest.java b/legacy-testapp/src/test/java/testapp/endpoint/MorphiaTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/MorphiaTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/MorphiaTest.java diff --git a/testapp/src/test/java/testapp/endpoint/OutputParamTest.java b/legacy-testapp/src/test/java/testapp/endpoint/OutputParamTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/OutputParamTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/OutputParamTest.java diff --git a/testapp/src/test/java/testapp/endpoint/ParamEncoding.java b/legacy-testapp/src/test/java/testapp/endpoint/ParamEncoding.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/ParamEncoding.java rename to legacy-testapp/src/test/java/testapp/endpoint/ParamEncoding.java diff --git a/testapp/src/test/java/testapp/endpoint/ReqTest.java b/legacy-testapp/src/test/java/testapp/endpoint/ReqTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/ReqTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/ReqTest.java diff --git a/testapp/src/test/java/testapp/endpoint/SimpleBeanTest.java b/legacy-testapp/src/test/java/testapp/endpoint/SimpleBeanTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/SimpleBeanTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/SimpleBeanTest.java diff --git a/testapp/src/test/java/testapp/endpoint/SimpleEventListenerMarkerTest.java b/legacy-testapp/src/test/java/testapp/endpoint/SimpleEventListenerMarkerTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/SimpleEventListenerMarkerTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/SimpleEventListenerMarkerTest.java diff --git a/testapp/src/test/java/testapp/endpoint/StatelessTest.java b/legacy-testapp/src/test/java/testapp/endpoint/StatelessTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/StatelessTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/StatelessTest.java diff --git a/testapp/src/test/java/testapp/endpoint/VirtualHandlerTest.java b/legacy-testapp/src/test/java/testapp/endpoint/VirtualHandlerTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/VirtualHandlerTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/VirtualHandlerTest.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/ActionParameterBindingTestBase.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/ActionParameterBindingTestBase.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/ActionParameterBindingTestBase.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/ActionParameterBindingTestBase.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/BindingWithAnnotationTest.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/BindingWithAnnotationTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/BindingWithAnnotationTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/BindingWithAnnotationTest.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/ParamAndFieldTest.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/ParamAndFieldTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/ParamAndFieldTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/ParamAndFieldTest.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/collection/BigDecimalArrayActionParameterBindingTest.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/collection/BigDecimalArrayActionParameterBindingTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/collection/BigDecimalArrayActionParameterBindingTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/collection/BigDecimalArrayActionParameterBindingTest.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/collection/BigIntegerArrayActionParameterBindingTest.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/collection/BigIntegerArrayActionParameterBindingTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/collection/BigIntegerArrayActionParameterBindingTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/collection/BigIntegerArrayActionParameterBindingTest.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/collection/BooleanArrayActionParameterBindingTest.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/collection/BooleanArrayActionParameterBindingTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/collection/BooleanArrayActionParameterBindingTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/collection/BooleanArrayActionParameterBindingTest.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/collection/ByteArrayActionParameterBindingTest.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/collection/ByteArrayActionParameterBindingTest.java similarity index 99% rename from testapp/src/test/java/testapp/endpoint/binding/collection/ByteArrayActionParameterBindingTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/collection/ByteArrayActionParameterBindingTest.java index 3944b5e3a..297cf8491 100644 --- a/testapp/src/test/java/testapp/endpoint/binding/collection/ByteArrayActionParameterBindingTest.java +++ b/legacy-testapp/src/test/java/testapp/endpoint/binding/collection/ByteArrayActionParameterBindingTest.java @@ -34,4 +34,5 @@ protected List nonEmptyList() { private byte b(int i) { return (byte) i; } + } diff --git a/testapp/src/test/java/testapp/endpoint/binding/collection/CharArrayActionParameterBindingTest.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/collection/CharArrayActionParameterBindingTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/collection/CharArrayActionParameterBindingTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/collection/CharArrayActionParameterBindingTest.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/collection/DoubleArrayActionParameterBindingTest.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/collection/DoubleArrayActionParameterBindingTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/collection/DoubleArrayActionParameterBindingTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/collection/DoubleArrayActionParameterBindingTest.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/collection/EnumArrayActionParameterBindingTest.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/collection/EnumArrayActionParameterBindingTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/collection/EnumArrayActionParameterBindingTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/collection/EnumArrayActionParameterBindingTest.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/collection/FloatArrayActionParameterBindingTest.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/collection/FloatArrayActionParameterBindingTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/collection/FloatArrayActionParameterBindingTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/collection/FloatArrayActionParameterBindingTest.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/collection/IntArrayActionParameterBindingTest.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/collection/IntArrayActionParameterBindingTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/collection/IntArrayActionParameterBindingTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/collection/IntArrayActionParameterBindingTest.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/collection/LongArrayActionParameterBindingTest.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/collection/LongArrayActionParameterBindingTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/collection/LongArrayActionParameterBindingTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/collection/LongArrayActionParameterBindingTest.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/collection/PrimitiveTypeArrayActionParameterBindingTestBase.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/collection/PrimitiveTypeArrayActionParameterBindingTestBase.java similarity index 99% rename from testapp/src/test/java/testapp/endpoint/binding/collection/PrimitiveTypeArrayActionParameterBindingTestBase.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/collection/PrimitiveTypeArrayActionParameterBindingTestBase.java index 5eecba116..0fb1f890d 100644 --- a/testapp/src/test/java/testapp/endpoint/binding/collection/PrimitiveTypeArrayActionParameterBindingTestBase.java +++ b/legacy-testapp/src/test/java/testapp/endpoint/binding/collection/PrimitiveTypeArrayActionParameterBindingTestBase.java @@ -1,6 +1,5 @@ package testapp.endpoint.binding.collection; -import org.junit.Ignore; import org.junit.Test; import org.osgl.util.C; import testapp.endpoint.EndPointTestContext; diff --git a/testapp/src/test/java/testapp/endpoint/binding/collection/ShortArrayActionParameterBindingTest.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/collection/ShortArrayActionParameterBindingTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/collection/ShortArrayActionParameterBindingTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/collection/ShortArrayActionParameterBindingTest.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/collection/SimpleTypeArrayActionParameterBindingTestBase.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/collection/SimpleTypeArrayActionParameterBindingTestBase.java similarity index 98% rename from testapp/src/test/java/testapp/endpoint/binding/collection/SimpleTypeArrayActionParameterBindingTestBase.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/collection/SimpleTypeArrayActionParameterBindingTestBase.java index 9a178c102..0188f39df 100644 --- a/testapp/src/test/java/testapp/endpoint/binding/collection/SimpleTypeArrayActionParameterBindingTestBase.java +++ b/legacy-testapp/src/test/java/testapp/endpoint/binding/collection/SimpleTypeArrayActionParameterBindingTestBase.java @@ -1,17 +1,16 @@ package testapp.endpoint.binding.collection; +import com.alibaba.fastjson.JSON; import org.junit.Test; +import org.osgl.http.H; import org.osgl.util.C; import org.osgl.util.Generics; -import testapp.endpoint.binding.ActionParameterBindingTestBase; import testapp.endpoint.EndPointTestContext.RequestMethod; import testapp.endpoint.ParamEncoding; +import testapp.endpoint.binding.ActionParameterBindingTestBase; import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.List; -import java.util.Set; -import java.util.TreeSet; +import java.util.*; public abstract class SimpleTypeArrayActionParameterBindingTestBase extends ActionParameterBindingTestBase { @@ -42,11 +41,11 @@ public SimpleTypeArrayActionParameterBindingTestBase() { protected abstract List nonEmptyList(); protected String expectedRespForNonEmptyList() { - return nonEmptyList().toString(); + return JSON.toJSONString(nonEmptyList()); } protected String expectedRespForNonEmptySet() { - return new TreeSet(nonEmptyList()).toString(); + return JSON.toJSONString(new TreeSet(nonEmptyList())); } protected final String e() { @@ -89,6 +88,7 @@ protected String urlContext() { protected final void _verify(String expected, String urlPath, List data, ParamEncoding paramEncoding, RequestMethod method) throws Exception { context .expected(expected, e2(), es2()) + .accept(H.Format.JSON) .url(processUrl(urlPath)) .params(paramEncoding.encode(null == data ? "v" : PARAM, null == data ? C.list() : data)) .method(method) diff --git a/testapp/src/test/java/testapp/endpoint/binding/collection/StringArrayActionParameterBindingTest.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/collection/StringArrayActionParameterBindingTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/collection/StringArrayActionParameterBindingTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/collection/StringArrayActionParameterBindingTest.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/collection/package-info.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/collection/package-info.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/collection/package-info.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/collection/package-info.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/map/BooleanTypeMapValBindingTest.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/map/BooleanTypeMapValBindingTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/map/BooleanTypeMapValBindingTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/map/BooleanTypeMapValBindingTest.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/map/ByteTypeMapValBindingTest.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/map/ByteTypeMapValBindingTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/map/ByteTypeMapValBindingTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/map/ByteTypeMapValBindingTest.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/map/CharacterTypeMapValBindingTest.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/map/CharacterTypeMapValBindingTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/map/CharacterTypeMapValBindingTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/map/CharacterTypeMapValBindingTest.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/map/DoubleTypeMapValBindingTest.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/map/DoubleTypeMapValBindingTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/map/DoubleTypeMapValBindingTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/map/DoubleTypeMapValBindingTest.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/map/EnumTypeMapValBindingTest.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/map/EnumTypeMapValBindingTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/map/EnumTypeMapValBindingTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/map/EnumTypeMapValBindingTest.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/map/FloatTypeMapValBindingTest.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/map/FloatTypeMapValBindingTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/map/FloatTypeMapValBindingTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/map/FloatTypeMapValBindingTest.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/map/IntTypeMapValBindingTest.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/map/IntTypeMapValBindingTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/map/IntTypeMapValBindingTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/map/IntTypeMapValBindingTest.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/map/LongTypeMapValBindingTest.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/map/LongTypeMapValBindingTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/map/LongTypeMapValBindingTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/map/LongTypeMapValBindingTest.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/map/ShortTypeMapValBindingTest.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/map/ShortTypeMapValBindingTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/map/ShortTypeMapValBindingTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/map/ShortTypeMapValBindingTest.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/map/SimpleTypeMapValBindingTestBase.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/map/SimpleTypeMapValBindingTestBase.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/map/SimpleTypeMapValBindingTestBase.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/map/SimpleTypeMapValBindingTestBase.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/map/StringTypeMapValBindingTest.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/map/StringTypeMapValBindingTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/map/StringTypeMapValBindingTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/map/StringTypeMapValBindingTest.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/pojo/PojoBindingTest.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/pojo/PojoBindingTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/pojo/PojoBindingTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/pojo/PojoBindingTest.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/pojo/PojoEncoder.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/pojo/PojoEncoder.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/pojo/PojoEncoder.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/pojo/PojoEncoder.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/single/BooleanActionParameterBindingTest.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/single/BooleanActionParameterBindingTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/single/BooleanActionParameterBindingTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/single/BooleanActionParameterBindingTest.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/single/ByteActionParameterBindingTest.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/single/ByteActionParameterBindingTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/single/ByteActionParameterBindingTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/single/ByteActionParameterBindingTest.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/single/CharActionParameterBindingTest.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/single/CharActionParameterBindingTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/single/CharActionParameterBindingTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/single/CharActionParameterBindingTest.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/single/DoubleActionParameterBindingTest.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/single/DoubleActionParameterBindingTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/single/DoubleActionParameterBindingTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/single/DoubleActionParameterBindingTest.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/single/EnumActionParameterBindingTest.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/single/EnumActionParameterBindingTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/single/EnumActionParameterBindingTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/single/EnumActionParameterBindingTest.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/single/FloatActionParameterBindingTest.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/single/FloatActionParameterBindingTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/single/FloatActionParameterBindingTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/single/FloatActionParameterBindingTest.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/single/IntActionParameterBindingTest.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/single/IntActionParameterBindingTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/single/IntActionParameterBindingTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/single/IntActionParameterBindingTest.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/single/LongActionParameterBindingTest.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/single/LongActionParameterBindingTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/single/LongActionParameterBindingTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/single/LongActionParameterBindingTest.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/single/PrimitiveTypeActionParameterBindingTestBase.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/single/PrimitiveTypeActionParameterBindingTestBase.java similarity index 97% rename from testapp/src/test/java/testapp/endpoint/binding/single/PrimitiveTypeActionParameterBindingTestBase.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/single/PrimitiveTypeActionParameterBindingTestBase.java index 2e4a06e84..f343c0f6e 100644 --- a/testapp/src/test/java/testapp/endpoint/binding/single/PrimitiveTypeActionParameterBindingTestBase.java +++ b/legacy-testapp/src/test/java/testapp/endpoint/binding/single/PrimitiveTypeActionParameterBindingTestBase.java @@ -1,10 +1,8 @@ package testapp.endpoint.binding.single; -import org.junit.Ignore; import org.junit.Test; import org.osgl.mvc.result.BadRequest; import testapp.endpoint.EndPointTestContext; -import testapp.endpoint.binding.collection.*; public abstract class PrimitiveTypeActionParameterBindingTestBase extends SimpleTypeActionParameterBindingTestBase { protected String primitiveUrlPath; diff --git a/testapp/src/test/java/testapp/endpoint/binding/single/ShortActionParameterBindingTest.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/single/ShortActionParameterBindingTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/single/ShortActionParameterBindingTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/single/ShortActionParameterBindingTest.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/single/SimpleTypeActionParameterBindingTestBase.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/single/SimpleTypeActionParameterBindingTestBase.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/single/SimpleTypeActionParameterBindingTestBase.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/single/SimpleTypeActionParameterBindingTestBase.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/single/StringActionParameterBindingTest.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/single/StringActionParameterBindingTest.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/single/StringActionParameterBindingTest.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/single/StringActionParameterBindingTest.java diff --git a/testapp/src/test/java/testapp/endpoint/binding/single/package-info.java b/legacy-testapp/src/test/java/testapp/endpoint/binding/single/package-info.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/binding/single/package-info.java rename to legacy-testapp/src/test/java/testapp/endpoint/binding/single/package-info.java diff --git a/testapp/src/test/java/testapp/endpoint/issue/enhancement/Controler20160911.java b/legacy-testapp/src/test/java/testapp/endpoint/issue/enhancement/Controler20160911.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/issue/enhancement/Controler20160911.java rename to legacy-testapp/src/test/java/testapp/endpoint/issue/enhancement/Controler20160911.java diff --git a/testapp/src/test/java/testapp/endpoint/issue/enhancement/GHIssue152.java b/legacy-testapp/src/test/java/testapp/endpoint/issue/enhancement/GHIssue152.java similarity index 100% rename from testapp/src/test/java/testapp/endpoint/issue/enhancement/GHIssue152.java rename to legacy-testapp/src/test/java/testapp/endpoint/issue/enhancement/GHIssue152.java diff --git a/testapp/src/test/resources/photo.jpg b/legacy-testapp/src/test/resources/photo.jpg similarity index 100% rename from testapp/src/test/resources/photo.jpg rename to legacy-testapp/src/test/resources/photo.jpg diff --git a/pom.xml b/pom.xml index 3eb03e7f4..ab3ee4f18 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ org.actframework act jar - 1.8.8-RC12-SNAPSHOT + 1.9.3-SNAPSHOT ACT Framework The ACT full stack MVC framework @@ -31,7 +31,7 @@ org.osgl parent - 1.0.0-BETA-1 + 1.0.0-BETA-5 @@ -46,35 +46,47 @@ 0.7.2 2.0.2-beta - 5.0.5 + 5.0.6 1.2 1.3.3 - 4.6.1 - 1.2.47 + 3.22.0 + 1.2.83 1.1.2 0.7 - 1.16 + 1.18 + + 2.4.0 + 1 1.5.0-b01 0.0.8 - 2.14.3 + 2.14.6 1.0.0.Final - 2.9.9 - 3.10.0 - 1.17.0 - 1.5.0 - 1.8.0 - 1.8.0 - 1.8.0 - 1.7.0 - 1.2.0 - 2.0.0-BETA-1 - 1.11.3 - 1.3.0 + 2.10.6 + 1.15.3 + + 4.7.2 + + 1.30.0 + 1.8.2 + 1.13.2 + 1.13.4 + 1.13.3 + 1.11.1 + 1.5.1 + 0.0.1 + 1.11.9 + 1.3.1 1.1.0.Final - 1.4.25.Final - 3.3.2 + 2.2.19.Final + 1.31 + 3.4.0 + + + 2.3.1 + 1.3.2 + @@ -85,31 +97,6 @@ ${project.artifactId}-${project.version} - - - src/main/resources - true - - **/act.scan.list - **/aaa.authenticate.list - **/*.version - **/*.properties - **/*.xml - **/*.csv - **/*.txt - **/*.css - **/*.js - **/*.png - **/*.jpg - **/*.gif - **/*.json - **/*.html - **/*.tag - rythm/** - *.flf - - - @@ -124,7 +111,7 @@ com.auth0 java-jwt - 3.2.0 + 3.8.0 test @@ -184,6 +171,12 @@ com.google.zxing javase ${zxing.javase.version} + + + com.github.jai-imageio + jai-imageio-core + + @@ -198,6 +191,18 @@ ${jfiglet.version} + + org.jsoup + jsoup + ${jsoup.version} + + + + com.github.bingoohuang + patchca + ${patcha.version} + + org.actframework act-asm @@ -222,12 +227,6 @@ ${undertow.version} - - io.undertow - undertow-websockets-jsr - ${undertow.version} - - com.squareup.okhttp3 okhttp @@ -241,7 +240,7 @@ - org.eclipse.jdt.core.compiler + org.eclipse.jdt ecj ${ecj.version} @@ -264,6 +263,12 @@ ${joda-time.version} + + org.yaml + snakeyaml + ${snakeyaml.version} + + org.osgl genie @@ -310,6 +315,12 @@ org.rythmengine rythm-engine ${rythmengine.version} + + + org.eclipse.jdt.core.compiler + ecj + + @@ -318,6 +329,18 @@ ${jpa.version} + + javax.xml.bind + jaxb-api + ${jaxb.version} + + + + javax.annotation + javax.annotation-api + ${javax.annotation-api.version} + + diff --git a/src/main/java/act/Act.java b/src/main/java/act/Act.java index 358acf9d6..18375256c 100644 --- a/src/main/java/act/Act.java +++ b/src/main/java/act/Act.java @@ -30,14 +30,11 @@ import act.boot.app.FullStackAppBootstrapClassLoader; import act.boot.app.RunApp; import act.conf.*; -import act.controller.meta.ActionMethodMetaInfo; -import act.controller.meta.CatchMethodMetaInfo; -import act.controller.meta.InterceptorMethodMetaInfo; +import act.controller.meta.*; import act.crypto.AppCrypto; import act.db.DbManager; -import act.event.ActEvent; -import act.event.ActEventListener; -import act.event.EventBus; +import act.event.*; +import act.exception.AppStartTerminateException; import act.handler.RequestHandlerBase; import act.handler.SimpleRequestHandler; import act.handler.builtin.controller.*; @@ -47,26 +44,23 @@ import act.job.JobManager; import act.metric.MetricPlugin; import act.metric.SimpleMetricPlugin; -import act.plugin.AppServicePluginManager; -import act.plugin.GenericPluginManager; -import act.plugin.Plugin; -import act.plugin.PluginScanner; +import act.plugin.*; import act.route.RouteSource; import act.sys.Env; -import act.util.AppCodeScannerPluginManager; -import act.util.Banner; -import act.util.ClassInfoRepository; -import act.util.SysProps; +import act.util.*; import act.view.ViewManager; import act.xio.Network; import act.xio.NetworkHandler; import act.xio.undertow.UndertowNetwork; import org.joda.time.*; +import org.joda.time.format.DateTimeFormat; +import org.joda.time.format.ISODateTimeFormat; import org.osgl.$; import org.osgl.cache.CacheService; import org.osgl.exception.NotAppliedException; import org.osgl.exception.UnexpectedException; import org.osgl.http.H; +import org.osgl.inject.Genie; import org.osgl.logging.LogManager; import org.osgl.logging.Logger; import org.osgl.util.*; @@ -74,20 +68,13 @@ import osgl.version.Version; import osgl.version.Versioned; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; +import java.io.*; import java.lang.management.ManagementFactory; import java.lang.management.RuntimeMXBean; import java.lang.reflect.Method; -import java.net.Inet6Address; -import java.net.InetAddress; -import java.net.NetworkInterface; -import java.net.URL; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.net.*; +import java.text.NumberFormat; +import java.util.*; import java.util.jar.Attributes; import java.util.jar.Manifest; @@ -98,7 +85,6 @@ public final class Act { public static final Version VERSION = Version.of(Act.class); - public static final Logger LOGGER = LogManager.get(Act.class); /** @@ -112,11 +98,23 @@ public final class Act { */ private static final String ATTR_APP_JAR = "App-Jar"; + /** + * The runtime mode + */ public enum Mode { + + /** + * PROD mode should be used when app is running in product + * deployment or SIT/UAT testing deployment etc + */ PROD, + /** - * DEV mode is special as Act might load classes - * directly from srccode code when running in this mode + * DEV mode should be used by developer when developing the application. + * + * When Act is started in DEV mode the framework will monitor the + * source/configuration file and do hot reload when source/configuration + * file changes. */ DEV() { @Override @@ -187,6 +185,7 @@ public static Mode valueOfIgnoreCase(String mode) { } } + private static Genie genie; private static ActConfig conf; private static Mode mode = Mode.PROD; private static String nodeGroup = ""; @@ -202,18 +201,40 @@ public static Mode valueOfIgnoreCase(String mode) { private static Map genericPluginRegistry = new HashMap<>(); private static Map, List> listeners = new HashMap<>(); + /** + * Returns the runtime mode of the process. + * + * @return Act process runtime mode + * @see Mode + */ public static Mode mode() { return mode; } + /** + * Check if the Act process is running in {@link Mode#PROD} mode + * @return `true` if Act process is running in prod mode + */ public static boolean isProd() { return mode.isProd(); } + /** + * Check if the Act process is running in {@link Mode#DEV} mode + * @return `true` if Act process is running in dev mode + */ public static boolean isDev() { return mode.isDev(); } + /** + * Check if the Act process is running using `test` profile + * @return `true` if Act process is running using `test` profile + */ + public static boolean isTest() { + return "test".equalsIgnoreCase(profile()); + } + /** * Return the current profile name */ @@ -295,10 +316,12 @@ public static T registeredPlugin(Class type) { } public static void startup(AppDescriptor descriptor) { + long start = descriptor.getStart(); processEnvironment(descriptor); - Banner.print(descriptor); + registerMimeTypes(); registerTypeConverters(); loadConfig(); + Banner.print(descriptor); initMetricPlugin(); initPluginManager(); initAppServicePluginManager(); @@ -308,26 +331,47 @@ public static void startup(AppDescriptor descriptor) { initAppCodeScannerPluginManager(); loadPlugins(); enhancerManager().registered(); // so it can order the enhancers - initNetworkLayer(); + NetworkBootupThread nbt = initNetworkLayer(); initApplicationManager(); LOGGER.info("loading application(s) ..."); - appManager.loadSingleApp(descriptor); - startNetworkLayer(); + try { + appManager.loadSingleApp(descriptor); + } catch (AppStartTerminateException e) { + System.exit(-1); + } + startNetworkLayer(nbt); Thread.currentThread().setContextClassLoader(Act.class.getClassLoader()); App app = app(); if (null == app) { shutdownNetworkLayer(); throw new UnexpectedException("App not found. Please make sure your app start directory is correct"); } - emit(SysEventId.ACT_START); - writePidFile(); int port = httpPort(); String urlContext = appConfig().urlContext(); + CliServer cliServer = app.cliServer(); + if (null != cliServer) { + cliServer.logStart(); + } if (null == urlContext) { - LOGGER.info("app is ready at: http://%s:%s", getLocalIpAddr(), port); + LOGGER.info("app is ready in %sms at: http://%s:%s\n\n", $.ms() - start, getLocalIpAddr(), port); } else { - LOGGER.info("app is ready at: http://%s:%s%s", getLocalIpAddr(), port, urlContext); + LOGGER.info("app is ready in %sms at: http://%s:%s%s\n\n", $.ms() - start, getLocalIpAddr(), port, urlContext); } + writePidFile(); + app.jobManager().post(SysEventId.POST_START, new Runnable() { + @Override + public void run() { + emit(SysEventId.ACT_START); + } + }, true); + } + + public static void shutdown() { + shutdown(app(), 0); + } + + public static void shutdownNow() { + shutdown(app(), 0, false); } public static void shutdown(final App app) { @@ -335,18 +379,35 @@ public static void shutdown(final App app) { } public static void shutdown(final App app, final int exitCode) { + shutdown(app, exitCode, true); + } + + private static void shutdown(final App app, final int exitCode, boolean async) { if (null == appManager) { return; } - new Thread() { - @Override - public void run() { + if (async) { + new Thread() { + @Override + public void run() { + try { + if (!appManager.unload(app)) { + app.destroy(); + } + } finally { + shutdownAct(exitCode); + } + } + }.start(); + } else { + try { if (!appManager.unload(app)) { app.destroy(); } + } finally { shutdownAct(exitCode); } - }.start(); + } } public static RequestServerRestart requestRestart() { @@ -366,7 +427,7 @@ public static void hook(App app) { if (app.config().supportSsl()) { network.register(appConfig().httpsPort(), true, networkHandler); } - List portList = app.config().namedPorts(); + Collection portList = app.config().namedPorts(); for (NamedPort np : portList) { network.register(np.port(), false, new NetworkHandler(app, np)); } @@ -438,7 +499,7 @@ public static Version appVersion() { * * @return the app config */ - public static AppConfig appConfig() { + public static AppConfig appConfig() { return App.instance().config(); } @@ -517,10 +578,18 @@ public static DI injector() { * @param className the class name * @return the class corresponding to the name specified */ - public static Class appClassForName(String className) { + public static Class appClassForName(String className) { return app().classForName(className); } + public static Class classForName(String className) { + App app = app(); + if (null != app) { + return app.classForName(className); + } + return $.classForName(className, Act.class.getClassLoader()); + } + /** * Return an instance with give class name * @@ -529,7 +598,12 @@ public static Class appClassForName(String className) { * @return the instance of the class */ public static T getInstance(String className) { - return app().getInstance(className); + App app = app(); + if (null != app) { + return app.getInstance(className); + } else { + return getInstance(Act.classForName(className)); + } } /** @@ -540,7 +614,8 @@ public static T getInstance(String className) { * @return the instance of the class */ public static T getInstance(Class clz) { - return app().getInstance(clz); + App app = app(); + return null == app ? genie().get(clz) : app.getInstance(clz); } /** @@ -554,7 +629,14 @@ public static T getInstance(Class clz) { * @return the `URL` if found, or `null` if resource not found */ public static URL getResource(String name) { - return app().getResource(name); + App app = app(); + if (null == app) { + if (name.startsWith("/")) { + name = name.substring(1); + } + return Act.class.getClassLoader().getResource(name); + } + return app.getResource(name); } /** @@ -709,7 +791,7 @@ public static void start(String appName, String scanPackage, Version appVersion) bootstrap(AppDescriptor.of(appName, scanPackage, appVersion)); } - static int classCacheSize() { + public static int classCacheSize() { return ((FullStackAppBootstrapClassLoader) Act.class.getClassLoader()).libBCSize(); } @@ -784,6 +866,11 @@ private static void processEnvironment(AppDescriptor descriptor) { } } } + if (mode.isDev()) { + System.setProperty("osgl.version.suppress-var-found-warning", "true"); + } else { + System.clearProperty("osgl.version.suppress-var-found-warning"); + } s = System.getProperty("app.nodeGroup"); if (null != s) { nodeGroup = s; @@ -793,12 +880,106 @@ private static void processEnvironment(AppDescriptor descriptor) { } } + public static void registerMimeTypes() { + registerMimeType(MimeTypeExtensions.HTML_TABLE, "text/x-html-table"); + registerMimeType(MimeTypeExtensions.STRING_LIST, "text/x-string-list"); + } + + private static void registerMimeType(Keyword keyword, String contentType) { + registerMimeType(keyword.javaVariable().toLowerCase(), contentType); + registerMimeType(keyword.javaVariable(), contentType); + registerMimeType(keyword.dashed(), contentType); + registerMimeType(keyword.underscore(), contentType); + } + + private static void registerMimeType(String name, String contentType) { + MimeType.registerMimeType(name, contentType); + } + public static void registerTypeConverters() { TypeConverterRegistry.INSTANCE.register(new $.TypeConverter() { @Override public Long convert(ReadableInstant o) { return o.getMillis(); } + }).register(new $.TypeConverter() { + @Override + public LocalTime convert(String s) { + if (S.isIntOrLong(s)) { + Long l = Long.valueOf(s); + return $.convert(l).to(LocalTime.class); + } + AppConfig config = Act.appConfig(); + String pattern = config.localizedTimePattern(locale()); + return (DateTimeFormat.forPattern(pattern)).parseLocalTime(s); + } + @Override + public LocalTime convert(String s, Object hint) { + if (null == hint) { + return convert(s); + } + if (S.isIntOrLong(s)) { + Long l = Long.valueOf(s); + return $.convert(l).to(LocalTime.class); + } + String pattern = S.string(hint); + if (pattern.toLowerCase().contains("iso")) { + return ISODateTimeFormat.dateTimeParser().parseLocalTime(s); + } + return (DateTimeFormat.forPattern(pattern)).parseLocalTime(s); + } + }).register(new $.TypeConverter() { + @Override + public LocalDate convert(String s) { + if (S.isIntOrLong(s)) { + Long l = Long.valueOf(s); + return $.convert(l).to(LocalDate.class); + } + AppConfig config = Act.appConfig(); + String pattern = config.localizedDatePattern(locale()); + return (DateTimeFormat.forPattern(pattern)).parseLocalDate(s); + } + @Override + public LocalDate convert(String s, Object hint) { + if (null == hint) { + return convert(s); + } + if (S.isIntOrLong(s)) { + Long l = Long.valueOf(s); + return $.convert(l).to(LocalDate.class); + } + String pattern = S.string(hint); + if (pattern.toLowerCase().contains("iso")) { + return ISODateTimeFormat.dateTimeParser().parseLocalDate(s); + } + return (DateTimeFormat.forPattern(pattern)).parseLocalDate(s); + } + }).register(new $.TypeConverter() { + @Override + public DateTime convert(String s) { + if (S.isIntOrLong(s)) { + Long l = Long.valueOf(s); + return $.convert(l).to(DateTime.class); + } + AppConfig config = Act.appConfig(); + String pattern = config.localizedDateTimePattern(locale()); + return (DateTimeFormat.forPattern(pattern)).parseDateTime(s); + } + @Override + public DateTime convert(String s, Object hint) { + if (null == hint) { + return convert(s); + } + if (S.isIntOrLong(s)) { + Long l = Long.valueOf(s); + return $.convert(l).to(DateTime.class); + } + String pattern = S.string(hint); + if (pattern.toLowerCase().contains("iso")) { + return ISODateTimeFormat.dateTimeParser().parseDateTime(s); + } + return (DateTimeFormat.forPattern(pattern)).parseDateTime(s); + } }).register(new $.TypeConverter() { @Override public DateTime convert(Long o) { @@ -823,6 +1004,16 @@ public LocalTime convert(DateTime o) { ; } + private static Locale locale() { + ActContext ctx = ActContext.Base.currentContext(); + if (null != ctx) { + return ctx.locale(true); + } else { + App app = app(); + return null == app ? Locale.getDefault() : app.config().locale(); + } + } + private static void loadConfig() { LOGGER.debug("loading configuration ..."); @@ -842,8 +1033,8 @@ private static void unloadConfig() { private static void loadPlugins() { LOGGER.debug("scanning plugins ..."); long ts = $.ms(); - new PluginScanner().scan(); - LOGGER.debug("plugin scanning finished in %sms", $.ms() - ts); + int count = new PluginScanner().scan(); + LOGGER.debug("%s plugin scanning finished in %sms", count, $.ms() - ts); } private static void unloadPlugins() { @@ -934,9 +1125,31 @@ private static void destroyEnhancerManager() { } } - private static void initNetworkLayer() { + private static class NetworkBootupThread extends Thread { + + Network network; + RuntimeException exception; + + public NetworkBootupThread(Network network) { + this.network = network; + } + + @Override + public void run() { + try { + network.bootUp(); + } catch (RuntimeException e) { + exception = e; + } + } + } + + private static NetworkBootupThread initNetworkLayer() { LOGGER.debug("initializing network layer ..."); network = new UndertowNetwork(); + NetworkBootupThread nbt = new NetworkBootupThread(network); + nbt.start(); + return nbt; } private static void destroyNetworkLayer() { @@ -946,11 +1159,20 @@ private static void destroyNetworkLayer() { } } - private static void startNetworkLayer() { + private static void startNetworkLayer(NetworkBootupThread nbt) { if (network.isDestroyed()) { return; } LOGGER.debug("starting network layer ..."); + try { + nbt.join(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + throw new UnexpectedException(e); + } + if (null != nbt.exception) { + throw nbt.exception; + } network.start(); } @@ -979,7 +1201,6 @@ private static Class getCallerClass() { } private static void bootstrap(AppDescriptor appDescriptor) throws Exception { - long ts = $.ms(); String profile = SysProps.get(AppConfigKey.PROFILE.key()); if (S.blank(profile)) { profile = ""; @@ -998,14 +1219,19 @@ private static void bootstrap(AppDescriptor appDescriptor) throws Exception { Method m = actClass.getDeclaredMethod("startup", byte[].class); m.setAccessible(true); $.invokeStatic(m, appDescriptor.toByteArray()); - LOGGER.info("it takes %sms to start the app\n", $.ms() - ts); + LOGGER.debug("bootstrap application takes: %sms", $.ms() - appDescriptor.getStart()); } public static int httpPort() { return app().config().httpPort(); } + private static boolean shutdownStarted = false; private static void shutdownAct(int exitCode) { + if (shutdownStarted) { + return; + } + shutdownStarted = true; clearPidFile(); shutdownNetworkLayer(); destroyApplicationManager(); @@ -1019,6 +1245,7 @@ private static void shutdownAct(int exitCode) { destroyMetricPlugin(); unloadConfig(); destroyNetworkLayer(); + LOGGER.info("All components shutdown, bye!"); if (0 != exitCode) { System.exit(exitCode); } @@ -1060,6 +1287,7 @@ private static void writePidFile() { @Override public void run() { clearPidFile(); + Act.shutdownNow(); } }); } catch (Exception e) { @@ -1071,7 +1299,7 @@ private static void clearPidFile() { String pidFile = pidFile(); try { File file = new File(pidFile); - if (!file.delete()) { + if (null != file && file.canRead() && !file.delete()) { file.deleteOnExit(); } } catch (Exception e) { @@ -1126,6 +1354,13 @@ public Mode apply() throws NotAppliedException, $.Break { }; } + private static Genie genie() { + if (null == genie) { + genie = Genie.create(); + } + return genie; + } + // debug javadoc generating. // Note if you get `Illegal group reference` issue then make sure // you do not have `$` in the `{@link}` tag @@ -1135,4 +1370,30 @@ public Mode apply() throws NotAppliedException, $.Break { // // run `mvn javadoc:javadoc -Prelease -Ddebug=true` to generate options and packages file // com.sun.tools.javadoc.Main.execute(args); // } + + public static void main(String[] args) throws Exception { + String text = "abc[[UC_FLD_APPLICATIONEFFECTIVEDATE]]xyz\t[[UC_FLD_NDV123985]]dsa[[UC_FLD_NDV123981]]adf"; + String text0 = text; + int pos = text.indexOf("[["); + int pos0 = 0; + StringBuilder buf = new StringBuilder(); + buf.append(text.substring(pos0, pos)); + while (pos >= 0) { + int bpos = text.indexOf("]]", pos); + E.illegalStateIf(bpos < 0, "Invalid template content: " + text0); + String varName = text.substring(pos + 2, bpos); + String varVal = "<<" + S.cut(varName).after("UC_FLD_") + ">>"; + buf.append(varVal); + pos0 = bpos + 2; + pos = text.indexOf("[[", bpos); + if (pos > 0) { + buf.append(text.substring(pos0, pos)); + } else { + buf.append(text.substring(pos0, text.length())); + } + } + System.out.println(text); + System.out.println(buf.toString()); + + } } diff --git a/src/main/java/act/ActResponse.java b/src/main/java/act/ActResponse.java index 3a88985e0..8e4a8c80e 100644 --- a/src/main/java/act/ActResponse.java +++ b/src/main/java/act/ActResponse.java @@ -27,8 +27,13 @@ import org.osgl.mvc.MvcConfig; import org.osgl.mvc.result.Ok; import org.osgl.mvc.result.Redirect; +import org.osgl.storage.impl.SObject; import org.osgl.util.E; +import org.osgl.util.IO; +import org.osgl.util.S; +import java.io.File; +import java.net.URL; import java.util.Locale; public abstract class ActResponse extends H.Response { @@ -62,6 +67,20 @@ public T characterEncoding(String encoding) { return me(); } + public T send(URL url) { + String protocol = url.getProtocol(); + if ("file".equals(protocol)) { + return send(new File(url.getPath())); + } + writeBinary(SObject.of(IO.inputStream(url))); + return me(); + } + + public T send(File file) { + writeBinary(SObject.of(file)); + return me(); + } + @Override public T sendError(int sc, String msg) { throw E.unsupport(); @@ -94,8 +113,9 @@ public void onResult() { this.onResult = true; } - public void commitContentType() { + public T commitContentType() { header(H.Header.Names.CONTENT_TYPE, _getContentType()); + return me(); } @Override @@ -140,19 +160,37 @@ public ActResponse beforeWritingContent() { } public ActResponse afterWritingContent() { - ActionContext ctx = context(); if (committed) { return this; } - committed = true; commit(); + ActionContext ctx = context(); MvcConfig.applyAfterCommitResultHandler(Ok.get(), ctx.req(), this); return this; } + @Override + public final void commit() { + if (isCommitted()) { + return; + } + committed = true; + doCommit(); + } + + protected abstract void doCommit(); + + protected final boolean isCommitted() { + return committed; + } + @Override protected void _setContentType(String type) { + if (S.eq(this.contentType, type)) { + return; + } this.contentType = type; + this.fmt = H.Format.resolve(type); } protected String _getContentType() { diff --git a/src/main/java/act/BytecodeEnhancerManager.java b/src/main/java/act/BytecodeEnhancerManager.java index dcdb3c7a0..088595fa0 100644 --- a/src/main/java/act/BytecodeEnhancerManager.java +++ b/src/main/java/act/BytecodeEnhancerManager.java @@ -20,22 +20,17 @@ * #L% */ +import static act.Destroyable.Util.tryDestroyAll; + import act.app.App; import act.asm.ClassWriter; -import act.util.AppByteCodeEnhancer; -import act.util.AsmByteCodeEnhancer; -import act.util.ByteCodeVisitor; -import act.util.DestroyableBase; +import act.util.*; import org.osgl.$; +import java.util.*; import javax.enterprise.context.ApplicationScoped; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -import static act.Destroyable.Util.tryDestroyAll; -public class BytecodeEnhancerManager extends DestroyableBase { +public class BytecodeEnhancerManager extends LogSupportedDestroyableBase { private List appEnhancers = new ArrayList<>(); private List generalEnhancers = new ArrayList<>(); diff --git a/src/main/java/act/Constants.java b/src/main/java/act/Constants.java index 13a52fca0..84a2386d6 100644 --- a/src/main/java/act/Constants.java +++ b/src/main/java/act/Constants.java @@ -9,9 +9,9 @@ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -27,4 +27,5 @@ public enum Constants { public static final String ASM_PKG = ACT_PKG + ".asm"; public static final String LIST_SEPARATOR = "[\\s,;:]+"; + } diff --git a/src/main/java/act/Info.java b/src/main/java/act/Info.java index 54b999750..77757cad5 100644 --- a/src/main/java/act/Info.java +++ b/src/main/java/act/Info.java @@ -26,24 +26,32 @@ import act.app.ActionContext; import act.app.App; import act.cli.Command; -import act.handler.NonBlock; +import act.conf.AppConfig; +import act.controller.ExpressController; +import act.controller.annotation.Port; import act.inject.param.NoBind; +import act.route.Router; import act.sys.Env; import act.util.Banner; import act.util.JsonView; import com.alibaba.fastjson.JSON; +import org.osgl.$; import org.osgl.http.H; import org.osgl.mvc.annotation.GetAction; import org.osgl.util.C; import org.osgl.util.S; +import org.osgl.util.VM; import java.nio.ByteBuffer; import java.util.Map; +import java.util.Properties; import javax.inject.Inject; import javax.inject.Singleton; @Singleton @SuppressWarnings("unused") +@ExpressController +@Port({Router.PORT_DEFAULT, AppConfig.PORT_SYS}) public class Info { // a unit of information data @@ -92,27 +100,37 @@ public Info(App app) { } @GetAction("info") - @NonBlock @Description("Show application info including version, scan package, base dir and profile") public void show(ActionContext context) { info.applyTo(context); } @GetAction("pid") - @NonBlock @Description("Get process id") public void pid(ActionContext context) { pid.applyTo(context); } - @NonBlock - @JsonView @GetAction("version") @Description("Get version info in JSON format. This include both application version and actframework version.") public void version(ActionContext context) { version.applyTo(context); } + @Env.RequireMode(Act.Mode.DEV) + @GetAction("system/properties") + @Description("Get all System Properties") + public Properties sysProperties() { + return System.getProperties(); + } + + @Env.RequireMode(Act.Mode.DEV) + @GetAction("system/properties/{propName}") + @Description("Get System Property by name") + public String sysProperty(String propName) { + return System.getProperty(propName); + } + @Command(name = "act.version, act.ver", help = "Print app/actframework version") public Map getVersions() { return versionData; @@ -137,7 +155,9 @@ private void initInfoBuffer(App app) { "baseDir", app.base().getAbsoluteFile(), "mode", Act.mode().name(), "profile", Act.profile(), - "group", Act.nodeGroup() + "group", Act.nodeGroup(), + "os", $.OS, + "jdk", S.concat(VM.INFO, " ", VM.SPEC_VERSION) ); this.info = new Unit(map, Banner.cachedBanner()); } diff --git a/src/main/java/act/MimeTypeExtensions.java b/src/main/java/act/MimeTypeExtensions.java new file mode 100644 index 000000000..11df19f0e --- /dev/null +++ b/src/main/java/act/MimeTypeExtensions.java @@ -0,0 +1,29 @@ +package act; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2019 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.util.DataTable; +import org.osgl.util.Keyword; + +public class MimeTypeExtensions { + public static final Keyword HTML_TABLE = DataTable.HTML_TABLE; + public static final Keyword STRING_LIST = Keyword.of("string-list"); +} diff --git a/src/main/java/act/RequestImplBase.java b/src/main/java/act/RequestImplBase.java index 6dd8185b4..0b42f68eb 100644 --- a/src/main/java/act/RequestImplBase.java +++ b/src/main/java/act/RequestImplBase.java @@ -68,7 +68,7 @@ public H.Method method() { // check the method overload String s = header(H.Header.Names.X_HTTP_METHOD_OVERRIDE); if (S.blank(s)) { - s = paramVal("_method"); // Spring use this + s = paramVal("_method"); // Spring convention } if (S.notBlank(s)) { method = H.Method.valueOfIgnoreCase(s); diff --git a/src/main/java/act/SysUtilAdmin.java b/src/main/java/act/SysUtilAdmin.java index 4818bb37c..95ea5f865 100644 --- a/src/main/java/act/SysUtilAdmin.java +++ b/src/main/java/act/SysUtilAdmin.java @@ -20,25 +20,20 @@ * #L% */ +import act.app.SingletonRegistry; +import act.cli.Optional; import act.cli.*; -import act.handler.NonBlock; import act.sys.Env; -import act.util.JsonView; import act.util.PropertySpec; import org.joda.time.LocalDateTime; import org.osgl.$; -import org.osgl.mvc.annotation.GetAction; +import org.osgl.Lang; import org.osgl.storage.impl.SObject; -import org.osgl.util.C; -import org.osgl.util.E; -import org.osgl.util.IO; -import org.osgl.util.S; +import org.osgl.util.*; -import javax.validation.constraints.Min; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; +import java.io.*; import java.util.*; +import javax.validation.constraints.Min; @SuppressWarnings("unused") public class SysUtilAdmin { @@ -57,10 +52,10 @@ public String pid() { @Command(name = "act.meminfo, act.mi", help = "Print memory info") public void memInfo( @act.cli.Optional("monitor memory usage") boolean monitor, - @act.cli.Optional("human readable") boolean human, + @act.cli.Optional(lead = "-b,--bytes", help = "display number in bytes") boolean bytes, CliContext context ) { - final int factor = human ? 1024 * 1024 : 1; + final int factor = bytes ? 1 : 1024 * 1024; Runtime runtime = Runtime.getRuntime(); if (monitor) { @@ -109,6 +104,32 @@ public void memInfo( } } + @Command(name = "act.singleton.list, act.singleton, act.singletons", help = "List all singletons") + public Iterable listSingletons(@Optional("specify singleton filter") final String q) { + SingletonRegistry singletonRegistry = Act.app().singletonRegistry(); + final Iterable iterable = singletonRegistry.typeNames(); + if (S.notBlank(q)) { + return new Iterable() { + @Override + public Iterator iterator() { + return Iterators.filter(iterable.iterator(), new Lang.Predicate() { + @Override + public boolean test(String s) { + return s.toLowerCase().contains(q) || s.matches(q); + } + }); + } + }; + } + return iterable; + } + + @Command(name = "act.singleton.show-property", help = "Show singleton instance property") + public Object showSingletonProperty(@Required String type, @Required String property) { + Object o = Act.app().singleton(Act.classForName(type)); + return $.getProperty(o, property); + } + @Command(name = "act.gc", help = "Run GC") public void gc(CliContext context) { System.gc(); @@ -118,7 +139,7 @@ public void gc(CliContext context) { @Command(name = "act.pwd", help = "Print name of the current working directory") public String pwd() { - return pwd(context).getAbsolutePath(); + return _pwd(context).getAbsolutePath(); } @Command(name = "act.ls, act.dir, act.ll", help = "List files in the current working directory") @@ -225,10 +246,10 @@ private File getFile(String path) { } private File curDir() { - return pwd(context); + return _pwd(context); } - private static File pwd(CliContext context) { + private static File _pwd(CliContext context) { return context.curDir(); } @@ -364,7 +385,7 @@ private static boolean isBinary(InputStream in) { @Command(value = "act.zen", help = "give me the zen words") public static String zen() { - return Zen.wordsOfTheDay(); + return Zen.wordsOfTheDay(false); } diff --git a/src/main/java/act/Zen.java b/src/main/java/act/Zen.java index 654c0e24e..d1410b35b 100644 --- a/src/main/java/act/Zen.java +++ b/src/main/java/act/Zen.java @@ -22,22 +22,31 @@ import act.apidoc.Description; import act.app.ActionContext; -import act.handler.NonBlock; +import act.controller.ExpressController; import org.osgl.$; import org.osgl.mvc.annotation.GetAction; import org.osgl.util.C; import org.osgl.util.IO; -import org.rythmengine.utils.S; +import org.osgl.util.S; import java.net.URL; import java.util.ArrayList; import java.util.List; import javax.inject.Singleton; +/** + * Wisdom quotes about programming. + * + * The list come from: + * * https://phauer.com/2020/wall-coding-wisdoms-quotes/ + * * https://zen-of-python.info/ + */ @Singleton +@ExpressController public final class Zen { - private static final List WORDS = loadWords(); + private static final List WORDS = loadQuotes(false); + private static final List WORDS_FOR_BANNER = loadQuotes(true); private Info.Unit zenInfo; @@ -46,20 +55,19 @@ public Zen() { zenInfo = new Info.Unit("zen", zenTxt); } - public static String wordsOfTheDay() { - return $.random(WORDS); + public static String wordsOfTheDay(boolean forBanner) { + return $.random(forBanner ? WORDS_FOR_BANNER : WORDS); } - @NonBlock @GetAction("zen") @Description("Get my zen words (禅语)") public void zen(ActionContext context) { zenInfo.applyTo(context); } - private static List loadWords() { - URL url = Zen.class.getResource("/act_zen.txt"); - List words = C.newList(defaultWords()); + private static List loadQuotes(boolean forBanner) { + URL url = Act.getResource("act_zen.txt"); + List words = C.newList(defaultQuotes()); if (null != url) { try { List myWords = IO.readLines(url.openStream()); @@ -72,38 +80,89 @@ private static List loadWords() { } List retVal = new ArrayList<>(words.size()); for (String s : words) { - if (s.contains("\n")) { - s = s.replaceAll("\n", "\n "); - } else if (s.contains("\\n")) { - s = s.replaceAll("\\\\n", "\n "); + if (forBanner) { + if (s.contains("\n")) { + s = s.replaceAll("\n", "\n "); + } else if (s.contains("\\n")) { + s = s.replaceAll("\\\\n", "\n "); + } } - retVal.add(s); + retVal.add(S.join("\n", processQuote(s, forBanner))); } return retVal; } - private static List defaultWords() { + private static List processQuote(String quote, boolean forBanner) { + if (quote.indexOf('―') < 0) { + return S.fastSplit(quote, "\n"); + } + S.Pair pair = S.binarySplit(quote, '―'); + String source = pair._2; + S.List lines = S.fastSplit(pair._1, "\n"); + int maxLen = 0; + for (String line: lines) { + maxLen = Math.max(maxLen, line.length()); + } + final int bannerGap = forBanner ? " ".length() : 0; + return lines.append("\n" + S.padLeft("- " + source, Math.max(5, maxLen - source.length() - 3 + bannerGap))); + } + + private static List defaultQuotes() { return C.listOf( - "Beautiful is better than ugly.", - "Explicit is better than implicit.", - "Simple is better than complex.", - "Complex is better than complicated.", - "Flat is better than nested.", - "Sparse is better than dense.", - "Readability counts.", + "Premature optimization is the root of all evil. ― Donald Knuth", + "Rules of optimization: " + + "\n\t1. Don't! " + + "\n\t2. Don't… yet. " + + "\n\t3. Profile before optimizing. ― Michael Jackson", + "As a programmer, never underestimate your ability to come up with ridiculously complex solutions " + + "for simple problems. ― Thomas Fuchs", + "Get your data structures correct first, and the rest of the program will write itself. ― David Jones", + "The #1 rule of distribute computing: " + + "\n\tDon't distribute your computing! " + + "- At least if you can in any way avoid it. ― DHH (David Heinemeier Hanson)", + "Scalability. The #1 problem people don’t actually have but still solve. ― Eberhard Wolff", + "Shared + Mutable = Danger! ― Andrey Breslav", + "Prefer duplication over the wrong abstraction. ― Sandi Metz", + "1. Avoid premature distribution. " + + "\n2. Avoid premature abstraction. " + + "\n\nBoth offer a lure of purity, cleanliness and scalability but add complexity and " + + "operational/cognitive overhead. ― Karl Isenberg", + "Data structures, not algorithms, are central to programming. " + + "― Rob Pike’s 5. Rules of Programming", + "Compassionate Tech Values: \n" + + "\n\tEgo < Humility. " + + "\n\tElitism < Inclusion. " + + "\n\tCompetition < Cooperation. " + + "\n\tBeing Smart < Learning. " + + "\n\tBeing a Rockstar < Being a Mentor. ― April Wensel", + "KISS > DRY ― Philipp Hauer", + "Beautiful is better than ugly. ― Zen of Python", + "Explicit is better than implicit. ― Zen of Python", + "Simple is better than complex. ― Zen of Python", + "Complex is better than complicated. ― Zen of Python", + "Flat is better than nested. ― Zen of Python", + "Sparse is better than dense. ― Zen of Python", + "Readability counts. ― Zen of Python", "Special cases aren't special enough to break the rules. \n" + - "Although practicality beats purity.", - "Errors should never pass silently \n" + - "Unless explicitly silenced.", - "In the face of ambiguity, refuse the temptation to guess.", - "There should be one-- and preferably only one --obvious way to do it.\n" + - "Although that way may not be obvious at first unless you're Dutch.", + "Although practicality beats purity. ― Zen of Python", + "Errors should never pass silently" + + "\nUnless explicitly silenced. ― Zen of Python", + "In the face of ambiguity, refuse the temptation to guess. ― Zen of Python", + "There should be one -- and preferably only one -- obvious way to do it.\n" + + "Although that way may not be obvious at first unless you're Dutch." + + " ― Zen of Python", "Now is better than never. \n" + - "Although never is often better than *right* now.", - "If the implementation is hard to explain, it's a bad idea.", - "If the implementation is easy to explain, it may be a good idea.", - "Namespaces are one honking great idea -- let's do more of those!", - "Simple things should be simple, complex things should be possible." + "Although never is often better than *right* now. ― Zen of Python", + "If the implementation is hard to explain, it's a bad idea. ― Zen of Python", + "If the implementation is easy to explain, it may be a good idea. ― Zen of Python", + "Namespaces are one honking great idea -- let's do more of those! ― Zen of Python", + "Simple things should be simple, complex things should be possible. ― Zen of Python" ); } + + public static void main(String[] args) { + System.out.println(S.join("\n", WORDS)); + System.out.printf(S.repeat('*').times(100)); + System.out.println(S.join("\n", WORDS_FOR_BANNER)); + } } diff --git a/src/main/java/act/act_messages.java b/src/main/java/act/act_messages.java index 25b4adc2e..239830b0e 100644 --- a/src/main/java/act/act_messages.java +++ b/src/main/java/act/act_messages.java @@ -1,4 +1,6 @@ -package act;/*- +package act; + +/*- * #%L * ACT Framework * %% diff --git a/src/main/java/act/annotations/AllowQrCodeRendering.java b/src/main/java/act/annotations/AllowQrCodeRendering.java new file mode 100644 index 000000000..af3b29c73 --- /dev/null +++ b/src/main/java/act/annotations/AllowQrCodeRendering.java @@ -0,0 +1,34 @@ +package act.annotations; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Mark on a request handler that is subject to QR/Bar code rendering. + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) +public @interface AllowQrCodeRendering { +} diff --git a/src/main/java/act/annotations/DownloadFilename.java b/src/main/java/act/annotations/DownloadFilename.java new file mode 100644 index 000000000..56bf49d26 --- /dev/null +++ b/src/main/java/act/annotations/DownloadFilename.java @@ -0,0 +1,37 @@ +package act.annotations; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import java.lang.annotation.*; + +/** + * Mark on a request handler method to specify the download filename. + * + * @see act.app.ActionContext#downloadFileName(String) + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) +public @interface DownloadFilename { + /** + * The download filename without suffix. + */ + String value(); +} diff --git a/src/main/java/act/annotations/Label.java b/src/main/java/act/annotations/Label.java new file mode 100644 index 000000000..228197f44 --- /dev/null +++ b/src/main/java/act/annotations/Label.java @@ -0,0 +1,39 @@ +package act.annotations; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Used to provide label for a field/getter when output to CLI table or Excel/CSV etc. + */ +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.FIELD, ElementType.METHOD}) +public @interface Label { + /** + * Specify the label + * @return the label of the field or getter method + */ + String value(); +} diff --git a/src/main/java/act/annotations/MultiLines.java b/src/main/java/act/annotations/MultiLines.java new file mode 100644 index 000000000..35043808a --- /dev/null +++ b/src/main/java/act/annotations/MultiLines.java @@ -0,0 +1,34 @@ +package act.annotations; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Used to indicate a string typed parameter needs a `",h.noCloneChecked=!!e.cloneNode(!0).lastChild.defaultValue}();var be=r.documentElement,we=/^key/,Te=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ce=/^([^.]*)(?:\.(.+)|)/;function Ee(){return!0}function ke(){return!1}function Se(){try{return r.activeElement}catch(e){}}function De(e,t,n,r,i,o){var a,s;if("object"==typeof t){"string"!=typeof n&&(r=r||n,n=void 0);for(s in t)De(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=ke;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return w().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=w.guid++)),e.each(function(){w.event.add(this,t,i,r,n)})}w.event={global:{},add:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,y=J.get(e);if(y){n.handler&&(n=(o=n).handler,i=o.selector),i&&w.find.matchesSelector(be,i),n.guid||(n.guid=w.guid++),(u=y.events)||(u=y.events={}),(a=y.handle)||(a=y.handle=function(t){return"undefined"!=typeof w&&w.event.triggered!==t.type?w.event.dispatch.apply(e,arguments):void 0}),l=(t=(t||"").match(M)||[""]).length;while(l--)d=g=(s=Ce.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=w.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=w.event.special[d]||{},c=w.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&w.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(e,r,h,a)||e.addEventListener&&e.addEventListener(d,a)),f.add&&(f.add.call(e,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),w.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,y=J.hasData(e)&&J.get(e);if(y&&(u=y.events)){l=(t=(t||"").match(M)||[""]).length;while(l--)if(s=Ce.exec(t[l])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){f=w.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,y.handle)||w.removeEvent(e,d,y.handle),delete u[d])}else for(d in u)w.event.remove(e,d+t[l],n,r,!0);w.isEmptyObject(u)&&J.remove(e,"handle events")}},dispatch:function(e){var t=w.event.fix(e),n,r,i,o,a,s,u=new Array(arguments.length),l=(J.get(this,"events")||{})[t.type]||[],c=w.event.special[t.type]||{};for(u[0]=t,n=1;n=1))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n-1:w.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u\x20\t\r\n\f]*)[^>]*)\/>/gi,Ae=/\s*$/g;function Le(e,t){return N(e,"table")&&N(11!==t.nodeType?t:t.firstChild,"tr")?w(e).children("tbody")[0]||e:e}function He(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Oe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Pe(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(J.hasData(e)&&(o=J.access(e),a=J.set(t,o),l=o.events)){delete a.handle,a.events={};for(i in l)for(n=0,r=l[i].length;n1&&"string"==typeof y&&!h.checkClone&&je.test(y))return e.each(function(i){var o=e.eq(i);v&&(t[0]=y.call(this,i,o.html())),Re(o,t,n,r)});if(p&&(i=xe(t,e[0].ownerDocument,!1,e,r),o=i.firstChild,1===i.childNodes.length&&(i=o),o||r)){for(u=(s=w.map(ye(i,"script"),He)).length;f")},clone:function(e,t,n){var r,i,o,a,s=e.cloneNode(!0),u=w.contains(e.ownerDocument,e);if(!(h.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||w.isXMLDoc(e)))for(a=ye(s),r=0,i=(o=ye(e)).length;r0&&ve(a,!u&&ye(e,"script")),s},cleanData:function(e){for(var t,n,r,i=w.event.special,o=0;void 0!==(n=e[o]);o++)if(Y(n)){if(t=n[J.expando]){if(t.events)for(r in t.events)i[r]?w.event.remove(n,r):w.removeEvent(n,r,t.handle);n[J.expando]=void 0}n[K.expando]&&(n[K.expando]=void 0)}}}),w.fn.extend({detach:function(e){return Ie(this,e,!0)},remove:function(e){return Ie(this,e)},text:function(e){return z(this,function(e){return void 0===e?w.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return Re(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Le(this,e).appendChild(e)})},prepend:function(){return Re(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Le(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return Re(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Re(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(w.cleanData(ye(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return w.clone(this,e,t)})},html:function(e){return z(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Ae.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=w.htmlPrefilter(e);try{for(;n=0&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))),u}function et(e,t,n){var r=$e(e),i=Fe(e,t,r),o="border-box"===w.css(e,"boxSizing",!1,r),a=o;if(We.test(i)){if(!n)return i;i="auto"}return a=a&&(h.boxSizingReliable()||i===e.style[t]),("auto"===i||!parseFloat(i)&&"inline"===w.css(e,"display",!1,r))&&(i=e["offset"+t[0].toUpperCase()+t.slice(1)],a=!0),(i=parseFloat(i)||0)+Ze(e,t,n||(o?"border":"content"),a,r,i)+"px"}w.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Fe(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=G(t),u=Xe.test(t),l=e.style;if(u||(t=Je(s)),a=w.cssHooks[t]||w.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"==(o=typeof n)&&(i=ie.exec(n))&&i[1]&&(n=ue(e,t,i),o="number"),null!=n&&n===n&&("number"===o&&(n+=i&&i[3]||(w.cssNumber[s]?"":"px")),h.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=G(t);return Xe.test(t)||(t=Je(s)),(a=w.cssHooks[t]||w.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=Fe(e,t,r)),"normal"===i&&t in Ve&&(i=Ve[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),w.each(["height","width"],function(e,t){w.cssHooks[t]={get:function(e,n,r){if(n)return!ze.test(w.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?et(e,t,r):se(e,Ue,function(){return et(e,t,r)})},set:function(e,n,r){var i,o=$e(e),a="border-box"===w.css(e,"boxSizing",!1,o),s=r&&Ze(e,t,r,a,o);return a&&h.scrollboxSize()===o.position&&(s-=Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-parseFloat(o[t])-Ze(e,t,"border",!1,o)-.5)),s&&(i=ie.exec(n))&&"px"!==(i[3]||"px")&&(e.style[t]=n,n=w.css(e,t)),Ke(e,n,s)}}}),w.cssHooks.marginLeft=_e(h.reliableMarginLeft,function(e,t){if(t)return(parseFloat(Fe(e,"marginLeft"))||e.getBoundingClientRect().left-se(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),w.each({margin:"",padding:"",border:"Width"},function(e,t){w.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o="string"==typeof n?n.split(" "):[n];r<4;r++)i[e+oe[r]+t]=o[r]||o[r-2]||o[0];return i}},"margin"!==e&&(w.cssHooks[e+t].set=Ke)}),w.fn.extend({css:function(e,t){return z(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=$e(e),i=t.length;a1)}});function tt(e,t,n,r,i){return new tt.prototype.init(e,t,n,r,i)}w.Tween=tt,tt.prototype={constructor:tt,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||w.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(w.cssNumber[n]?"":"px")},cur:function(){var e=tt.propHooks[this.prop];return e&&e.get?e.get(this):tt.propHooks._default.get(this)},run:function(e){var t,n=tt.propHooks[this.prop];return this.options.duration?this.pos=t=w.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):tt.propHooks._default.set(this),this}},tt.prototype.init.prototype=tt.prototype,tt.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=w.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){w.fx.step[e.prop]?w.fx.step[e.prop](e):1!==e.elem.nodeType||null==e.elem.style[w.cssProps[e.prop]]&&!w.cssHooks[e.prop]?e.elem[e.prop]=e.now:w.style(e.elem,e.prop,e.now+e.unit)}}},tt.propHooks.scrollTop=tt.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},w.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},w.fx=tt.prototype.init,w.fx.step={};var nt,rt,it=/^(?:toggle|show|hide)$/,ot=/queueHooks$/;function at(){rt&&(!1===r.hidden&&e.requestAnimationFrame?e.requestAnimationFrame(at):e.setTimeout(at,w.fx.interval),w.fx.tick())}function st(){return e.setTimeout(function(){nt=void 0}),nt=Date.now()}function ut(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=oe[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function lt(e,t,n){for(var r,i=(pt.tweeners[t]||[]).concat(pt.tweeners["*"]),o=0,a=i.length;o1)},removeAttr:function(e){return this.each(function(){w.removeAttr(this,e)})}}),w.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?w.prop(e,t,n):(1===o&&w.isXMLDoc(e)||(i=w.attrHooks[t.toLowerCase()]||(w.expr.match.bool.test(t)?dt:void 0)),void 0!==n?null===n?void w.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=w.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!h.radioValue&&"radio"===t&&N(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(M);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),dt={set:function(e,t,n){return!1===t?w.removeAttr(e,n):e.setAttribute(n,n),n}},w.each(w.expr.match.bool.source.match(/\w+/g),function(e,t){var n=ht[t]||w.find.attr;ht[t]=function(e,t,r){var i,o,a=t.toLowerCase();return r||(o=ht[a],ht[a]=i,i=null!=n(e,t,r)?a:null,ht[a]=o),i}});var gt=/^(?:input|select|textarea|button)$/i,yt=/^(?:a|area)$/i;w.fn.extend({prop:function(e,t){return z(this,w.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[w.propFix[e]||e]})}}),w.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&w.isXMLDoc(e)||(t=w.propFix[t]||t,i=w.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=w.find.attr(e,"tabindex");return t?parseInt(t,10):gt.test(e.nodeName)||yt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),h.optSelected||(w.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),w.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){w.propFix[this.toLowerCase()]=this});function vt(e){return(e.match(M)||[]).join(" ")}function mt(e){return e.getAttribute&&e.getAttribute("class")||""}function xt(e){return Array.isArray(e)?e:"string"==typeof e?e.match(M)||[]:[]}w.fn.extend({addClass:function(e){var t,n,r,i,o,a,s,u=0;if(g(e))return this.each(function(t){w(this).addClass(e.call(this,t,mt(this)))});if((t=xt(e)).length)while(n=this[u++])if(i=mt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=t[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},removeClass:function(e){var t,n,r,i,o,a,s,u=0;if(g(e))return this.each(function(t){w(this).removeClass(e.call(this,t,mt(this)))});if(!arguments.length)return this.attr("class","");if((t=xt(e)).length)while(n=this[u++])if(i=mt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=t[a++])while(r.indexOf(" "+o+" ")>-1)r=r.replace(" "+o+" "," ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},toggleClass:function(e,t){var n=typeof e,r="string"===n||Array.isArray(e);return"boolean"==typeof t&&r?t?this.addClass(e):this.removeClass(e):g(e)?this.each(function(n){w(this).toggleClass(e.call(this,n,mt(this),t),t)}):this.each(function(){var t,i,o,a;if(r){i=0,o=w(this),a=xt(e);while(t=a[i++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else void 0!==e&&"boolean"!==n||((t=mt(this))&&J.set(this,"__className__",t),this.setAttribute&&this.setAttribute("class",t||!1===e?"":J.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&(" "+vt(mt(n))+" ").indexOf(t)>-1)return!0;return!1}});var bt=/\r/g;w.fn.extend({val:function(e){var t,n,r,i=this[0];{if(arguments.length)return r=g(e),this.each(function(n){var i;1===this.nodeType&&(null==(i=r?e.call(this,n,w(this).val()):e)?i="":"number"==typeof i?i+="":Array.isArray(i)&&(i=w.map(i,function(e){return null==e?"":e+""})),(t=w.valHooks[this.type]||w.valHooks[this.nodeName.toLowerCase()])&&"set"in t&&void 0!==t.set(this,i,"value")||(this.value=i))});if(i)return(t=w.valHooks[i.type]||w.valHooks[i.nodeName.toLowerCase()])&&"get"in t&&void 0!==(n=t.get(i,"value"))?n:"string"==typeof(n=i.value)?n.replace(bt,""):null==n?"":n}}}),w.extend({valHooks:{option:{get:function(e){var t=w.find.attr(e,"value");return null!=t?t:vt(w.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r-1)&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),w.each(["radio","checkbox"],function(){w.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=w.inArray(w(e).val(),t)>-1}},h.checkOn||(w.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),h.focusin="onfocusin"in e;var wt=/^(?:focusinfocus|focusoutblur)$/,Tt=function(e){e.stopPropagation()};w.extend(w.event,{trigger:function(t,n,i,o){var a,s,u,l,c,p,d,h,v=[i||r],m=f.call(t,"type")?t.type:t,x=f.call(t,"namespace")?t.namespace.split("."):[];if(s=h=u=i=i||r,3!==i.nodeType&&8!==i.nodeType&&!wt.test(m+w.event.triggered)&&(m.indexOf(".")>-1&&(m=(x=m.split(".")).shift(),x.sort()),c=m.indexOf(":")<0&&"on"+m,t=t[w.expando]?t:new w.Event(m,"object"==typeof t&&t),t.isTrigger=o?2:3,t.namespace=x.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+x.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=i),n=null==n?[t]:w.makeArray(n,[t]),d=w.event.special[m]||{},o||!d.trigger||!1!==d.trigger.apply(i,n))){if(!o&&!d.noBubble&&!y(i)){for(l=d.delegateType||m,wt.test(l+m)||(s=s.parentNode);s;s=s.parentNode)v.push(s),u=s;u===(i.ownerDocument||r)&&v.push(u.defaultView||u.parentWindow||e)}a=0;while((s=v[a++])&&!t.isPropagationStopped())h=s,t.type=a>1?l:d.bindType||m,(p=(J.get(s,"events")||{})[t.type]&&J.get(s,"handle"))&&p.apply(s,n),(p=c&&s[c])&&p.apply&&Y(s)&&(t.result=p.apply(s,n),!1===t.result&&t.preventDefault());return t.type=m,o||t.isDefaultPrevented()||d._default&&!1!==d._default.apply(v.pop(),n)||!Y(i)||c&&g(i[m])&&!y(i)&&((u=i[c])&&(i[c]=null),w.event.triggered=m,t.isPropagationStopped()&&h.addEventListener(m,Tt),i[m](),t.isPropagationStopped()&&h.removeEventListener(m,Tt),w.event.triggered=void 0,u&&(i[c]=u)),t.result}},simulate:function(e,t,n){var r=w.extend(new w.Event,n,{type:e,isSimulated:!0});w.event.trigger(r,null,t)}}),w.fn.extend({trigger:function(e,t){return this.each(function(){w.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return w.event.trigger(e,t,n,!0)}}),h.focusin||w.each({focus:"focusin",blur:"focusout"},function(e,t){var n=function(e){w.event.simulate(t,e.target,w.event.fix(e))};w.event.special[t]={setup:function(){var r=this.ownerDocument||this,i=J.access(r,t);i||r.addEventListener(e,n,!0),J.access(r,t,(i||0)+1)},teardown:function(){var r=this.ownerDocument||this,i=J.access(r,t)-1;i?J.access(r,t,i):(r.removeEventListener(e,n,!0),J.remove(r,t))}}});var Ct=e.location,Et=Date.now(),kt=/\?/;w.parseXML=function(t){var n;if(!t||"string"!=typeof t)return null;try{n=(new e.DOMParser).parseFromString(t,"text/xml")}catch(e){n=void 0}return n&&!n.getElementsByTagName("parsererror").length||w.error("Invalid XML: "+t),n};var St=/\[\]$/,Dt=/\r?\n/g,Nt=/^(?:submit|button|image|reset|file)$/i,At=/^(?:input|select|textarea|keygen)/i;function jt(e,t,n,r){var i;if(Array.isArray(t))w.each(t,function(t,i){n||St.test(e)?r(e,i):jt(e+"["+("object"==typeof i&&null!=i?t:"")+"]",i,n,r)});else if(n||"object"!==x(t))r(e,t);else for(i in t)jt(e+"["+i+"]",t[i],n,r)}w.param=function(e,t){var n,r=[],i=function(e,t){var n=g(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(Array.isArray(e)||e.jquery&&!w.isPlainObject(e))w.each(e,function(){i(this.name,this.value)});else for(n in e)jt(n,e[n],t,i);return r.join("&")},w.fn.extend({serialize:function(){return w.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=w.prop(this,"elements");return e?w.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!w(this).is(":disabled")&&At.test(this.nodeName)&&!Nt.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=w(this).val();return null==n?null:Array.isArray(n)?w.map(n,function(e){return{name:t.name,value:e.replace(Dt,"\r\n")}}):{name:t.name,value:n.replace(Dt,"\r\n")}}).get()}});var qt=/%20/g,Lt=/#.*$/,Ht=/([?&])_=[^&]*/,Ot=/^(.*?):[ \t]*([^\r\n]*)$/gm,Pt=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Mt=/^(?:GET|HEAD)$/,Rt=/^\/\//,It={},Wt={},$t="*/".concat("*"),Bt=r.createElement("a");Bt.href=Ct.href;function Ft(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(M)||[];if(g(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function _t(e,t,n,r){var i={},o=e===Wt;function a(s){var u;return i[s]=!0,w.each(e[s]||[],function(e,s){var l=s(t,n,r);return"string"!=typeof l||o||i[l]?o?!(u=l):void 0:(t.dataTypes.unshift(l),a(l),!1)}),u}return a(t.dataTypes[0])||!i["*"]&&a("*")}function zt(e,t){var n,r,i=w.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&w.extend(!0,e,r),e}function Xt(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}function Ut(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}w.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Ct.href,type:"GET",isLocal:Pt.test(Ct.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":$t,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":w.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?zt(zt(e,w.ajaxSettings),t):zt(w.ajaxSettings,e)},ajaxPrefilter:Ft(It),ajaxTransport:Ft(Wt),ajax:function(t,n){"object"==typeof t&&(n=t,t=void 0),n=n||{};var i,o,a,s,u,l,c,f,p,d,h=w.ajaxSetup({},n),g=h.context||h,y=h.context&&(g.nodeType||g.jquery)?w(g):w.event,v=w.Deferred(),m=w.Callbacks("once memory"),x=h.statusCode||{},b={},T={},C="canceled",E={readyState:0,getResponseHeader:function(e){var t;if(c){if(!s){s={};while(t=Ot.exec(a))s[t[1].toLowerCase()]=t[2]}t=s[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return c?a:null},setRequestHeader:function(e,t){return null==c&&(e=T[e.toLowerCase()]=T[e.toLowerCase()]||e,b[e]=t),this},overrideMimeType:function(e){return null==c&&(h.mimeType=e),this},statusCode:function(e){var t;if(e)if(c)E.always(e[E.status]);else for(t in e)x[t]=[x[t],e[t]];return this},abort:function(e){var t=e||C;return i&&i.abort(t),k(0,t),this}};if(v.promise(E),h.url=((t||h.url||Ct.href)+"").replace(Rt,Ct.protocol+"//"),h.type=n.method||n.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(M)||[""],null==h.crossDomain){l=r.createElement("a");try{l.href=h.url,l.href=l.href,h.crossDomain=Bt.protocol+"//"+Bt.host!=l.protocol+"//"+l.host}catch(e){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=w.param(h.data,h.traditional)),_t(It,h,n,E),c)return E;(f=w.event&&h.global)&&0==w.active++&&w.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!Mt.test(h.type),o=h.url.replace(Lt,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(qt,"+")):(d=h.url.slice(o.length),h.data&&(h.processData||"string"==typeof h.data)&&(o+=(kt.test(o)?"&":"?")+h.data,delete h.data),!1===h.cache&&(o=o.replace(Ht,"$1"),d=(kt.test(o)?"&":"?")+"_="+Et+++d),h.url=o+d),h.ifModified&&(w.lastModified[o]&&E.setRequestHeader("If-Modified-Since",w.lastModified[o]),w.etag[o]&&E.setRequestHeader("If-None-Match",w.etag[o])),(h.data&&h.hasContent&&!1!==h.contentType||n.contentType)&&E.setRequestHeader("Content-Type",h.contentType),E.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+$t+"; q=0.01":""):h.accepts["*"]);for(p in h.headers)E.setRequestHeader(p,h.headers[p]);if(h.beforeSend&&(!1===h.beforeSend.call(g,E,h)||c))return E.abort();if(C="abort",m.add(h.complete),E.done(h.success),E.fail(h.error),i=_t(Wt,h,n,E)){if(E.readyState=1,f&&y.trigger("ajaxSend",[E,h]),c)return E;h.async&&h.timeout>0&&(u=e.setTimeout(function(){E.abort("timeout")},h.timeout));try{c=!1,i.send(b,k)}catch(e){if(c)throw e;k(-1,e)}}else k(-1,"No Transport");function k(t,n,r,s){var l,p,d,b,T,C=n;c||(c=!0,u&&e.clearTimeout(u),i=void 0,a=s||"",E.readyState=t>0?4:0,l=t>=200&&t<300||304===t,r&&(b=Xt(h,E,r)),b=Ut(h,b,E,l),l?(h.ifModified&&((T=E.getResponseHeader("Last-Modified"))&&(w.lastModified[o]=T),(T=E.getResponseHeader("etag"))&&(w.etag[o]=T)),204===t||"HEAD"===h.type?C="nocontent":304===t?C="notmodified":(C=b.state,p=b.data,l=!(d=b.error))):(d=C,!t&&C||(C="error",t<0&&(t=0))),E.status=t,E.statusText=(n||C)+"",l?v.resolveWith(g,[p,C,E]):v.rejectWith(g,[E,C,d]),E.statusCode(x),x=void 0,f&&y.trigger(l?"ajaxSuccess":"ajaxError",[E,h,l?p:d]),m.fireWith(g,[E,C]),f&&(y.trigger("ajaxComplete",[E,h]),--w.active||w.event.trigger("ajaxStop")))}return E},getJSON:function(e,t,n){return w.get(e,t,n,"json")},getScript:function(e,t){return w.get(e,void 0,t,"script")}}),w.each(["get","post"],function(e,t){w[t]=function(e,n,r,i){return g(n)&&(i=i||r,r=n,n=void 0),w.ajax(w.extend({url:e,type:t,dataType:i,data:n,success:r},w.isPlainObject(e)&&e))}}),w._evalUrl=function(e){return w.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},w.fn.extend({wrapAll:function(e){var t;return this[0]&&(g(e)&&(e=e.call(this[0])),t=w(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(e){return g(e)?this.each(function(t){w(this).wrapInner(e.call(this,t))}):this.each(function(){var t=w(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=g(e);return this.each(function(n){w(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(e){return this.parent(e).not("body").each(function(){w(this).replaceWith(this.childNodes)}),this}}),w.expr.pseudos.hidden=function(e){return!w.expr.pseudos.visible(e)},w.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},w.ajaxSettings.xhr=function(){try{return new e.XMLHttpRequest}catch(e){}};var Vt={0:200,1223:204},Gt=w.ajaxSettings.xhr();h.cors=!!Gt&&"withCredentials"in Gt,h.ajax=Gt=!!Gt,w.ajaxTransport(function(t){var n,r;if(h.cors||Gt&&!t.crossDomain)return{send:function(i,o){var a,s=t.xhr();if(s.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(a in t.xhrFields)s[a]=t.xhrFields[a];t.mimeType&&s.overrideMimeType&&s.overrideMimeType(t.mimeType),t.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");for(a in i)s.setRequestHeader(a,i[a]);n=function(e){return function(){n&&(n=r=s.onload=s.onerror=s.onabort=s.ontimeout=s.onreadystatechange=null,"abort"===e?s.abort():"error"===e?"number"!=typeof s.status?o(0,"error"):o(s.status,s.statusText):o(Vt[s.status]||s.status,s.statusText,"text"!==(s.responseType||"text")||"string"!=typeof s.responseText?{binary:s.response}:{text:s.responseText},s.getAllResponseHeaders()))}},s.onload=n(),r=s.onerror=s.ontimeout=n("error"),void 0!==s.onabort?s.onabort=r:s.onreadystatechange=function(){4===s.readyState&&e.setTimeout(function(){n&&r()})},n=n("abort");try{s.send(t.hasContent&&t.data||null)}catch(e){if(n)throw e}},abort:function(){n&&n()}}}),w.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),w.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return w.globalEval(e),e}}}),w.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),w.ajaxTransport("script",function(e){if(e.crossDomain){var t,n;return{send:function(i,o){t=w(" + + + + + +
+
+
processing ...
+
+
+
+
+
+
+
+

Job Result

+
@(_app.name().capFirst())-@(_app.version().getVersion())
+

+
+ + + \ No newline at end of file diff --git a/src/main/resources/rythm/act/base.html b/src/main/resources/rythm/act/base.html index ca956242a..11ba5aaf7 100644 --- a/src/main/resources/rythm/act/base.html +++ b/src/main/resources/rythm/act/base.html @@ -6,7 +6,9 @@ –––––––––––––––––––––––––––––––––––––––––––––––––– --> @title + @if(desc) { + } @@ -14,13 +16,14 @@ - + + @render(moreStyles) diff --git a/src/main/resources/rythm/act/controller/builtin/CliOverHttp/cmdPanel.html b/src/main/resources/rythm/act/controller/builtin/CliOverHttp/cmdPanel.html index 502f38bf7..2d3fc00e5 100644 --- a/src/main/resources/rythm/act/controller/builtin/CliOverHttp/cmdPanel.html +++ b/src/main/resources/rythm/act/controller/builtin/CliOverHttp/cmdPanel.html @@ -21,9 +21,7 @@

@title

- @for ($.Tuple - option: handler.options()) { + @for ($.Tuple option: handler.options()) { } diff --git a/src/main/resources/rythm/act/md_base.html b/src/main/resources/rythm/act/md_base.html new file mode 100644 index 000000000..cbbcd31f0 --- /dev/null +++ b/src/main/resources/rythm/act/md_base.html @@ -0,0 +1,130 @@ + +@** + * The template file for Markdown content rendering + *@ +@args String title, String desc + + + + + + + + @title + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/rythm/error/dev/e404.html b/src/main/resources/rythm/error/dev/e404.html index 74a20bd07..e38875eec 100644 --- a/src/main/resources/rythm/error/dev/e404.html +++ b/src/main/resources/rythm/error/dev/e404.html @@ -53,11 +53,14 @@ @def tr(RouteInfo r, String parity) { @r.method() - + @{ + String path = _action.router().ensureUrlContext(r.path()); + } + @if (r.method() == "GET") { - @r.path() + @path } else { - @r.path() + @path } @r.compactHandler() diff --git a/src/main/resources/rythm/error/dev/e409.html b/src/main/resources/rythm/error/dev/e409.html new file mode 100644 index 000000000..480fdcf1f --- /dev/null +++ b/src/main/resources/rythm/error/dev/e409.html @@ -0,0 +1,14 @@ +@import act.view.HotReloading + +@extends(errorPage) + +@if(_error instanceof HotReloading) { + +@args int delay + +@section(moreStyles){ + +} + + +} \ No newline at end of file diff --git a/src/main/resources/rythm/error/dev/errorPage.html b/src/main/resources/rythm/error/dev/errorPage.html index c9cee0d88..586084420 100644 --- a/src/main/resources/rythm/error/dev/errorPage.html +++ b/src/main/resources/rythm/error/dev/errorPage.html @@ -6,8 +6,22 @@ @ifNot(_error instanceof act.util.ActError) { @section(head){ + @render(moreStyles) } +@if(_error.getLocalizedMessage()) { +
+  @_error.getLocalizedMessage()
+
+} @return } @{ @@ -68,6 +82,7 @@ font-weight: bold; padding-left: 0px; border-bottom: 1px solid #aaa; + color: red; } .source-info.active { background-color: #000; @@ -86,7 +101,8 @@ padding: 4px 15px; } .template-line, .source-line { - padding: 2px 0px; + padding: 0px 0px; + padding-bottom: 2px; } .tabs .tab { display: inline-block; @@ -99,12 +115,17 @@ background: #efefef; color: #333; } + .error-column { + background-color: white; + color: red; + padding: 2px; + } @render(moreStyles) - - - - + + + + }
@@ -173,11 +194,18 @@
   
@for(String line: sourceInfo.lines()) { @{ - String cls = line_index == sourceInfo.lineNumber() ? "error nohighlight" : "" + boolean isErrorLine = line_index == sourceInfo.lineNumber(); + String cls = isErrorLine ? "error nohighlight" : "" }
@line_index - @line.sp2nbsp() + + @ifNot(isErrorLine || sourceInfo.column() < 0) { + @line.escapeHtml().sp2nbsp() + } else { + @line.escapeHtml().errorLine(sourceInfo.column()) + } +
}
diff --git a/src/main/resources/rythm/~cmd_help.html b/src/main/resources/rythm/~cmd_help.html new file mode 100644 index 000000000..7c090ea65 --- /dev/null +++ b/src/main/resources/rythm/~cmd_help.html @@ -0,0 +1,105 @@ + +@import act.cli.* +@args CliCmdInfo cmd + + + CLI Help - @cmd.name + + + + + +

CLI Help - @cmd.name

+
+ @cmd.help +
+

Parameters

+ +
    + @for(String param: cmd.params.keySet()) { +
  • + + @if(cmd.isMultiLines(param)) { + + } else { + + } +
  • + } +
+ +Index +  + +
Result
+ + + + diff --git a/src/main/resources/rythm/~cmd_index.html b/src/main/resources/rythm/~cmd_index.html new file mode 100644 index 000000000..0913eb89b --- /dev/null +++ b/src/main/resources/rythm/~cmd_index.html @@ -0,0 +1,42 @@ + +@import act.cli.* +@args Set appCommands, Set sysCommands + + + CLI Help + + + + +@def listCommands(Set cmds) { + + + + + + + + + + @for(CliCmdInfo cmd: cmds) { + + + + + + } + +
NameShortcutHelp
+ @cmd.name + @cmd.shortcut@cmd.help
+} + +@if(appCommands) { +

App Commands

+@listCommands(appCommands) +} + +

System Commands

+@listCommands(sysCommands) + + diff --git a/src/main/resources/rythm/~table.html b/src/main/resources/rythm/~table.html new file mode 100644 index 000000000..6e9ceb1fc --- /dev/null +++ b/src/main/resources/rythm/~table.html @@ -0,0 +1,70 @@ + +@import act.util.DataTable, org.osgl.Lang, org.osgl.util.S +@args DataTable table + + @if(!table.isTransposed()) { + + + @for(table.heading()) { + + } + + + } + + @def boolean isUrl(Object v) { + if (null == v) {return false;} + if (!(v instanceof String) && !(v instanceof Appendable)) { + return false; + } + String s = v.toString(); + return s.startsWith("http://") || s.startsWith("https://"); + } + @def String addHtmlTableAccept(Object v) { + if (null == v) return ""; + String url = v.toString(); + return url + (url.contains("?") ? "&" : "?") + "_accept=htmltable"; + } + @def String toString(Object v, boolean withPre) { + if (null == v) return ""; + if (!Lang.isSimpleType(v.getClass())) { + String s = com.alibaba.fastjson.JSON.toJSONString(v, true); + s = S.strip(s).of(S.DOUBLE_QUOTES); + return withPre ? "
" + s + "
" : s; + } + return v.toString(); + } + @def String toString(Object v) { + return toString(v, true); + } + @for(Object row: table) { + + @for(String label: table.heading()) { + @{ + Object v = table.val(row, label) + } + + } + + } + +
@(_.equals("_this_") ? "data" : _)
50) { + title="@toString(v, false)" + } + > + @if(isUrl(v)) { + @v + } else if (null == v || "".equals(v.toString().trim())) { +   + } else { + @toString(v).raw() + } +
\ No newline at end of file diff --git a/src/main/resources/rythm/~table_page.html b/src/main/resources/rythm/~table_page.html new file mode 100644 index 000000000..11d7762cb --- /dev/null +++ b/src/main/resources/rythm/~table_page.html @@ -0,0 +1,14 @@ + +@import act.util.DataTable +@args DataTable table, String title + + + @if(title) { + @title + } + + + +@invoke("~table.html", table) + + diff --git a/src/main/resources/rythm/~test.html b/src/main/resources/rythm/~test.html new file mode 100644 index 000000000..d3572f7d5 --- /dev/null +++ b/src/main/resources/rythm/~test.html @@ -0,0 +1,188 @@ + +@import org.osgl.Lang +@import act.test.Scenario +@import act.test.Interaction +@args List result, boolean failure + + + + @ifNot(failure) { + + } else { + + } + + + @render(head) + + +

Test Report

+
@(_app.name())-@(_app.version().getVersion())
+
+@for(Scenario scenario: result) { +

+ @scenario.title() @if(scenario.issueUrl) { +   + + + } + + @if(scenario.ignore) { +
    +
  • - @scenario.getIgnoreReason()
  • +
+ } + + @if(Lang.not(scenario.ignore) && !scenario.status.pass()) { + @if(scenario.source) { + + + + Re-run scenario > + + + } else { +    + + Re-run scenario > + + } + } +

+ + +@if(Lang.not(scenario.ignore) && !scenario.status.pass() && null != scenario.errorMessage && !scenario.errorMessage.contains("Interaction[")) { +
+ [@scenario.status] @scenario.errorMessage + @if(null != scenario.cause && (!(scenario.cause instanceof act.test.util.ErrorMessage))) { +
+@scenario.causeStackTrace()
+  
+ } +
+} + +@ifNot(scenario.ignore) { +
    +@for (Interaction interaction: scenario.interactions) { +
  • + [@interaction.status] @interaction.description.capFirst() + @if(interaction.errorMessage) { +
    - @interaction.errorMessage
    + @if(interaction.cause != null && (!(interaction.cause instanceof act.test.util.ErrorMessage))) { +
    +@interaction.causeStackTrace()
    +
    + } + } +
  • +} +
+} + +} +actframework-@act.Act.VERSION.getVersion() + + + \ No newline at end of file diff --git a/src/main/resources/rythm/~test_async.html b/src/main/resources/rythm/~test_async.html new file mode 100644 index 000000000..c2a664b69 --- /dev/null +++ b/src/main/resources/rythm/~test_async.html @@ -0,0 +1,292 @@ + + +@args String testId, String partition + + + + + + + + + +
+
+
scenario:
+
interaction:
+
+
+
+
+
+
    +
+
+
+

Test Report

+
@(_app.name().capFirst())-@(_app.version().getVersion())
+
+
+actframework-@act.Act.VERSION.getVersion() + + + + \ No newline at end of file diff --git a/src/main/resources/sampledata/~act/companyname.list b/src/main/resources/sampledata/~act/companyname.list new file mode 100644 index 000000000..55e4a9253 --- /dev/null +++ b/src/main/resources/sampledata/~act/companyname.list @@ -0,0 +1,500 @@ +Brandt, Jonathan F Esq +Landrum Temporary Services +Inabinet, Macre Esq +Morris Downing & Sherred +Buelt, David L Esq +Artesian Ice & Cold Storage Co +Midway Hotel +Selsor, Robert J Esq +Vincent J Petti & Co +Prentiss, Paul F Esq +Public Works Department +Prudential Lighting Corp +Wood, J Scott Esq +Swanson Peterson Fnrl Home Inc +Old Cider Mill Grove +Cooper Myers Y Co +Angelo International +Blackley, William J Pa +Phoenix Phototype +Quartzite Processing Inc +Biltmore Textile Co Inc +Gateway Refrigeration +Anchorage Yamaha +Wynns Precision Inc Az Div +Paragon Cable Tv +Eagle Computer Services Inc +Kansas Association Ins Agtts +Di Giacomo, Richard F Esq +Butler, Frank B Esq +Alphagraphics Printshops +Voyager Travel Service +N Amer Plast & Chemls Co Inc +D L Downing General Contr Inc +Community Insurance Agy Inc +House Of Ing +Vei Inc +Hanna, Robert J Esq +Design Rite Homes Inc +State Library +Vista Grande Baptist Church +Poole Publications Inc +Affilated Consulting Group Inc +Northwestern Mutual Life Ins +Barrett Burke Wilson Castl +Helricks Inc +Wynn, Mary Ellen Esq +Mackraft Signs +Ansaring Answering Service +Joiner & Goudeau Law Offices +Cox, J Thomas Jr +Bill, Michael M +A B C Tank Co +Jolley, Mark A Cpa +Melco Embroidery Systems +Witchs Brew +Funding Equity Corp +Saturn Of Delray +Motel 6 +Ultimate In Womens Apparel The +Ballinger, Maria Chan Esq +N E Industrial Distr Inc +Joondeph, Jerome J Esq +Art In Forms +Central Hudson Ent Corp +Marscher, William F Iii +Smith, Sean O Esq +Maverik Country Stores Inc +United Christian Cmnty Crdt Un +Radecker, H Philip Jr +Cullen, Jack J Esq +Kszl Am Radio +Blewett, Yvonne S +Sheraton Inn Atlanta Northwest +Preston, Anne M Esq +A & A Custom Rubber Stamps +Hirsch, Walter W Esq +Jones, Peter B Esq +Sterling Institute +Cross Western Store +Demer Normann Smith Ltd +Ny Stat Trial Lawyers Assn +Mann, Charles E Esq +Airnetics Engineering Co +American Pie Co Inc +Brown Chiropractic +Classic Video Duplication Inc +Mcclier Corp +Gormley Lore Murphy +Thudium Mail Advg Company +Jen E Distributing Co +Re/max Realty Services +Roundys Pole Fence Co +Chadds Ford Winery +Barragar, Anne L Esq +Kvoo Radio +Donovan, William P Esq +Overseas General Business Co +Nilad Machining +Byrne, Beth Hobbs +Dileo, Lucille A Esq +First Express +Elbin Internatl Baskets +Multiform Business Printing +Jin Shin Travel Agency +Electra Gear Divsn Regal +Sparta Home Center +R A C E Enterprises Inc +Jersey Wholesale Fence Co Inc +Ryan, Barry M Esq +Albright, Alexandra W Esq +Gazette Record +Cochnower Pest Control +Als Village Stationers +A B C Pattern & Foundry Co +Gaddis Court Reporting +Howard Johnson +Sunrise Cirby Animal Hospital +Braid Electric Co +Lisko, Roy K Esq +House Of Ing +Hassanein, Nesa E Esq +Frasier Karen L Kolligs +Arc Of Montgomery County Inc +Redington, Thomas P Esq +Milwaukee Courier Inc +Mervis Steel Co +M Sorkin Sanford Associates +Low Country Kitchen & Bath +Spieker Properties +Walker & Brehn Pa +U Stor +Moorhead, Michael D Esq +R M Sloan Co Inc +Star Limousine +Pioneer Telephone Paging +Communication Buildings Amer +Components & Equipment Co +Grand Rapids Right To Life +Martin Nighswander & Mitchell +Barter Systems Inc +W R Grace & Co +Davis, J Mark Esq +Roswell Honda Partners +Era Mclachlan John Morgan Real +Vaughan, James J Esq +Wzyx 1440 Am +Amercn Spdy Printg Ctrs Ocala +A & D Pallet Co +Nationwide Insurance +Gallagher, Owen Esq +Thomas Somerville Co +Unr Rohn +Cath Lea For Relig & Cvl Rgts +Eagles Nest +Epsilon Products Company +Anderson, Julie A Esq +Oakey & Oakey Abstrct Burnett +Pacific Scientific Co +Krausert, Diane D Esq +Blaney Sheet Metal +Goodknight, David R +Sullivan & Associates Ltd +American Board Of Surgery +Vernon Manor Hotel +Keith Altizer & Company Pa +H P Stran & Co +Southern National Bank S Car +American Western Mortgage +Oxner Vallerie +Rochelle Cold Storage +Mail Boxes Etc +Xandex Inc +Hander, Deborah G Esq +Vinco Furniture Inc +Stamp House +Burton & Davis +Maier, Kristine M +J M Edmunds Co Inc +Art Concepts +Richards, Don R Esq +B & B Environmental Inc +Printing Delite +Weil Mclain Co +Jones, Andrew D Esq +South Adams Savings Bank +Universal Granite & Marble Inc +Imagelink +Wrrr Fm +Lord Aeck & Sargent Architects +Dalbec Agency Inc +Reese Press Inc +Stokes, Fred J Esq +Slachter, David Esq +Girling Health Care Inc +Welders Supply Service Inc +Engelbrecht, William H Esq +Nancy Brandon Realtor +Flanagan Lieberman Hoffman +Walter W Lawrence Ink +Ship It Packaging Inc +Malsbary Mfg Co +Independence Marine Corp +Anthonys +L M H Inc +Milgo Industrial Inc +Rogers, Clay M Esq +Usa Asbestos Co +Voils, Otis V +Oaz Communications +Elan Techlgy A Divsn Mansol +Norfolk County Newton Lung +Parker Bush & Lane Pc +Stylecraft Corporation +Bennett, Matthew T Esq +Highland Meadows Golf Club +Nelson, Michael J Esq +Henry, Robert J Esq +Mackraft Signs +Orco State Empl Fed Crdt Un +Johnsen, Robert U Esq +Abe Goldstein Ofc Furn +Roland Ashcroft +Village Meadows +Busada Manufacturing Corp +Air Flow Co Inc +Freitag Pc +Saw Repair & Supply Co +Middendorf Meat Quality Foods +Eagle Plywood & Door Mfrs Inc +Leigh, Lewis R Esq +Bare Bones +Avila, Edward G Esq +Oregon Handling Equip Co +Reynolds, Stephen R Esq +Credit Union Of The Rockies +Sullivan, John M Esq +Henry D Lederman +Burress, S Paige Esq +Dynetics +West Pac Environmental Inc +Progressive Machine Co +Berhanu International Foods +Mcmillan, Regina E Esq +Central Nebraska Home Care +Unicircuit Inc +F H Overseas Export Inc +Musgrave, R Todd Esq +Santek Inc +Springer Industrial Equip Inc +Long, Robert B Jr +Prusax, Maximilian M Esq +Custom Jig Grinding +Senior Village Nursing Home +Mchale, Joseph G Esq +Pestmaster Services Inc +Moorhead Associates Inc +Alb Inc +Atrium Marketing Inc +Machine Design Service Inc +Mcwhirter Realty Corp +National Mortgage Co +Alvis, John W Esq +Community Health Law Project +Highway Rentals Inc +Rapid Reproductions Printing +Autocrat Inc +Venino And Venino +Corporex Companies Inc +Economy Stainless Supl Co Inc +Dgstv Diseases Cnslnts +Broaches Inc +Woods Manufactured Housing +Theos Software Corp +Stanco Metal Products Inc +Xyvision Inc +Carrera Casting Corp +Asian Jewelry +Southwark Corporation +Kdhl Am Radio +Kelly, Charles G Esq +Fennessey Buick Inc +Apex Bottle Co +Shamrock Food Service +Plastic Supply Inc +Gaylord +Bank Of New York Na +Cole, Gary D Esq +Gencheff, Nelson E Do +American General Finance +Feutz, James F Esq +Kwik Kopy Printing & Copying +Borough Clerk +U S Rentals +Katz Brothers Market Inc +Grossman Tuchman & Shah +American Inst Muscl Studies +Joyces Submarine Sandwiches +Domurad, John M Esq +Debbies Golden Touch +Johnston, George M Esq +Chateau Sonesta Hotel +Superior Trading Co +Breathitt Fnrl Home & Mnmt Co +Viking Lodge +Brown Bear Bait Company +Pakzad Advertising +Jean Barbara Ltd +Thurmon, Steven P +Bussard, Vicki L Esq +Stamell Tabacco & Schager +Aztech Controls Inc +Hutchinson Inc +Curtis & Curtis Inc +Roane, Matthew H Esq +Best Western Gloucester Inn +Shine +Schwartz, Seymour I Md +American Express Publshng Corp +Saratoga Land Office +Jaywork, John Terence Esq +Northbros Co Divsn Natl Svc +Psychotherapy Associates +K J N Advertising Inc +Automatic Feed Co +Newton Clerk +Pleasantville Finance Dept +Body Part Connection +Cooper And Raley +H T Communications Group Ltd +Debbie Reynolds Hotel +Crew, Robert B Esq +Reef Encrustaceans +Reporters Inc +Arizona Equipment Trnsprt Inc +Hub Manufacturing Company Inc +Dippin Flavors +Harfred Oil Co +Wilheim, Kari A Esq +Gilardis Frozen Food +Ronald Massingill Pc +Colosi, Darryl J Esq +Tripuraneni, Prabhakar Md +Carlyle Abstract Co +Streator Onized Fed Crdt Un +Valley Hi Bank +Pep Boys Manny Moe & Jack +Knights Inn +Telcom Communication Center +Bell Electric Co +Signs Now +Chieftain Four Inc +South Carolina State Housing F +Lucas Cntrl Systems Prod Deeco +J C S Iron Works Inc +Lsr Pokorny Schwartz Friedman +Branom Instrument Co +Young, Craig C Md +Midwest Marketing Inc +Korolishin, Michael Esq +Perrysburg Animal Care Inc +Hospitality Design Group +Ciba Geigy Corp +Robinson, Michael C Esq +De Woskin, Alan E Esq +Alumi Span Inc +M C Publishing +Phoenix Marketing Rep Inc +Remc South Eastern +Curran, Carol N Esq +Faber Castell Corporation +Palmetto Food Equipment Co Inc +Greater Ky Corp +Kajo 1270 Am Radio +Fried, Monte Esq +Dayer Real Estate Group +On Your Feet +South Side Machine Works Inc +Milner Inn +United Mortgage +Cahill, Steven J Esq +G Whitfield Richards Co +Cuzzo, Michael J Esq +Swanson Travel +Jackson, Brian C +Fables Gallery +Forsyth Steel Co +Lally, Lawrence D Esq +Sassy Lassie Dolls +Performance Consulting Grp Inc +Padrick, Comer W Jr +Analytical Laboratories +Signs Of The Times +Brown, Alan Esq +Biancas La Petite French Bkry +Williams Design Group +Community Communication Servs +Hampton Inn Hotel +Hoffman, Carl Esq +Sonoco Products Co +Brattleboro Printing Inc +Scientific Agrcltl Svc Inc +Booster Farms +Accent Copy Center Inc +Mccaffreys Supermarket +Chemex Labs Ltd +Galaxie Displays Inc +Harris, Eric C Esq +Tarix Printing +Chem Aqua +Kern Valley Printing +American Speedy Printing Ctrs +Doane Products Company +Jerico Group +Mortenson Broadcasting Co +M & M Quality Printing +Georgia Business Machines +Leo, Frank M +S E M A +Arthur Andersen & Co +Triangle Engineering Inc +Schmidt, Charles E Jr +Emess Professional Svces +White, Mark A Cpa +Vicon Corporation +Turl Engineering Works +Deep Creek Pharmacy +Mister Bagel +Howard Winig Realty Assocs Inc +Jordan, Mark D Esq +Marin Sun Printing +Verde, Louis J Esq +Convum Internatl Corp +Thomas Torto Constr Corp +Astromatic +Kuhio Photo +Lehigh Furn Divsn Lehigh +Okon Inc +Postlewaite, Jack A Esq +Regent Consultants Corp +Hinkson Cooper Weaver Inc +Spclty Fastening Systems Inc +Rudolph, William S Cpa +Choo Choo Caboose At Jade Bbq +Anthony & Langford +Shapiro Bag Company +Lescure Company Inc +Higgins, Daniel B Esq +Dot Pitch Electronics +Henri D Kahn Insurance +Test Tools Inc +Rachmel & Company Cpa Pa +Hermann Assocs Inc Safe Mart +Palmer Publications Inc +Southern Imperial Inc +United Water Resources Inc +Burke, Jonathan H Esq +Nurses Ofr Newborns +Para Laboratories +New Orleans Credit Service Inc +Signs By Berry +Saum, Scott J Esq +Ulrich, Lawrence M Esq +Stewart Levine & Davis +Bark Eater Inn +Reich, Richard J Esq +Kappus Co +Terri, Teresa Hutchens Esq +Hong Iwai Hulbert & Kawano +Fraser Dante Ltd +Die Craft Stamping +Sako, Bradley T Esq +Country Comfort +Amberley Suite Hotels +Warren Leadership +Alexander, David T Esq +Fairfield Inn By Marriott +Skyline Lodge & Restaurant +Aviation Design +Malmon, Alvin S Esq +Transit Cargo Services Inc +Comfort Inn Of Revere +Duncan & Associates +Philip Kingsley Trichological +Burlington Homes Of Maine +Carson, Scott W Esq +Dewitt Cnty Fed Svngs & Ln +Art Material Services Inc +Consolidated Manufacturing Inc +Reliance Credit Union +Sinclair Machine Products Inc +Kent, Wendy M Esq +Dixon, Eric D Esq +Wood Sign & Banner Co +Adkins, Russell Esq +Danform Shoe Stores +Antietam Cable Television +Lombardi Bros Inc +Nathaniel Electronics +Rodriguez, Joseph A Esq +Stilling, William J Esq \ No newline at end of file diff --git a/src/main/resources/sampledata/~act/firstname.list b/src/main/resources/sampledata/~act/firstname.list new file mode 100644 index 000000000..f8805d7ee --- /dev/null +++ b/src/main/resources/sampledata/~act/firstname.list @@ -0,0 +1,500 @@ +Rebbecca +Stevie +Mariko +Gerardo +Mayra +Idella +Sherill +Ena +Vince +Theron +Amira +Marica +Shawna +Paulina +Rose +Reita +Maybelle +Camellia +Roy +Albert +Hayley +Norah +Rosina +Royal +Barrie +Linsey +Laura +Fanny +Kristian +Gwen +Ben +Trina +Emelda +Zana +Shaun +Oren +Catherin +Pearlene +Kathryn +Suzan +Sommer +Keena +Rupert +Aleta +Jamal +Luz +Janessa +Lavonne +Honey +Jean +Katlyn +Cassie +Rolf +Darnell +Cherilyn +Lynda +Leigha +Delfina +Carlota +Alida +Donte +Lou +Dortha +Genevive +Alease +Veda +Craig +Lauran +Aaron +Francene +Zena +Brigette +Jeniffer +Selma +Elenora +Nadine +Kristin +Melinda +Kirby +Kent +Dan +Millie +Moira +Reta +Brittney +Leandro +Edison +Breana +Jarvis +Felicitas +Geraldine +Alfred +Leatha +Jacquelyne +Jonelle +Rosamond +Johnson +Elliot +Gerri +Rosendo +Eveline +Laurene +Tegan +Tracie +Mertie +Clare +Rebeca +Nilsa +Samuel +Ivette +Merrilee +Gianna +Hyman +Buck +Kenny +Tabetha +Alonso +Alonzo +Son +Jesusita +Annice +Delila +Iraida +Alona +Lajuana +Madelyn +Louann +William +Corazon +Fairy +Lashawn +Ronald +Shizue +Nida +Amos +Dexter +Ludivina +Ariel +Haley +Raelene +Micaela +Alpha +Zack +Wilford +Carman +Carylon +Gladys +Matilda +Jacklyn +Tashia +Dorian +Jesus +Brandee +Edda +Felix +Ben +Mickie +Phung +Lashonda +Patria +Nidia +Skye +Kanisha +Hector +Stefan +Francoise +Lindy +Arthur +Nicholle +Tijuana +Lorenza +Iola +Sang +Leonor +Silvana +Anthony +Wenona +Isadora +Mose +Marci +Michel +Stephania +Charolette +Katie +Inocencia +Nikita +Malcolm +Desiree +Holley +Maryann +Ling +Hailey +Farrah +Candra +Reuben +Anglea +Paris +Latricia +Jeffrey +Dean +Deane +Edelmira +Andrew +Miesha +Javier +Kizzy +Sharan +Novella +German +Robt +Rossana +Henriette +Buffy +Christiane +Annamae +Vanesa +Gennie +Tamra +Tien +Malcom +Claudia +Page +Lorita +Annita +Eliseo +Tyisha +Colene +Francis +Hester +Susana +Dahlia +Osvaldo +Armando +Torie +Tamie +Lettie +Chaya +Terina +Lisbeth +Lillian +Corrina +Dylan +Jerrod +Gracie +Barabara +Delsie +Cassie +Tamekia +Johanna +Sharita +Gerald +Ardella +Jackie +Mabelle +Jonell +Linwood +Samira +Julieta +Serita +Tori +Nancey +Wilbert +Werner +Sunny +Keva +Mary +Huey +Antonio +Quinn +Carin +Jill +Sanjuana +Elin +Charlena +Annette +Alexis +Princess +Ashton +Elmer +Aliza +Ora +Brent +Tora +Hildred +Dante +Emmanuel +Keshia +Sherman +Lore +Shawn +Karima +Francesco +King +Mica +Lamonica +Curtis +Sabrina +Denae +Anastacia +Irving +Elenor +Mary +Crista +Lawana +Maryrose +Lindsey +Lynelle +Brice +Laine +Rachael +Della +Thomasena +Frederic +Halina +Ryann +Shawn +Leah +Ira +Paris +Shayne +Ernestine +Eleonore +Misty +Na +Juan +Gerald +Desmond +Tommy +Adrianna +Adaline +Tammi +Virgilio +Emeline +Marcos +Yuonne +Gladis +Muriel +Juliann +Reiko +Verdell +Arleen +Launa +Casandra +Julio +Alica +Karol +Wava +Felicitas +Jamie +Fidelia +Kris +Lashawna +Lachelle +Katy +Bettyann +Valda +Lynette +Victor +Pa +Dorathy +Rodrigo +Stanford +Michael +Ines +Dorinda +Clarence +Omer +Winifred +Theresia +Daisy +Aretha +Bettina +Omega +Dana +Naomi +Luis +Dominga +Isreal +Myrtie +Jodi +Pearly +Aileen +Glory +Kathrine +Domingo +Julian +Marylou +Louis +Ellsworth +Wilburn +Arlie +Alysa +Marilynn +Scot +Adelaide +Jackie +Carli +Coletta +Katheryn +Santos +Kimberely +Earlean +Dannette +Odelia +Lina +Fredric +Alfreda +Bernadine +Ming +Gracia +Yuette +Yuriko +Hyman +Linette +Jospeh +Anna +Shawnta +Ettie +Chara +Lauran +Pansy +Georgeanna +Jesus +Jamey +Alberta +Ronald +Tamala +Gerry +Isaiah +Magnolia +Ngoc +Julene +Magda +Shantell +Audria +Nickole +Grover +Rocco +Ethan +Glynda +Yolande +Twanna +Rosenda +Lacey +Cordie +Annalee +Dana +Wai +Johana +Tomas +Karon +Delbert +Ashleigh +Nenita +Micah +Stefany +Rene +Cary +Micheal +Frederick +Burma +Cherry +Gabriele +Clement +Beckie +Catrice +Richelle +Cherri +Dorethea +Barb +Bettye +Sherrell +Ruth +Alva +Carri +Onita +Jessenia +Tricia +Stephaine +Florinda +Marsha +Josefa +Deeann +Jeannetta +Desmond +Trina +Ramonita +Temeka +Bea +Soledad +Margurite +Artie +Major +Veronika +Christene +Miles +Julio +Aide +Noelia +Lenora \ No newline at end of file diff --git a/src/main/resources/sampledata/~act/host.list b/src/main/resources/sampledata/~act/host.list new file mode 100644 index 000000000..bcc40b790 --- /dev/null +++ b/src/main/resources/sampledata/~act/host.list @@ -0,0 +1,495 @@ +didio.com.au +hotmail.com +gmail.com +hotmail.com +desjardiws.com.au +yahoo.com +chudej.net.au +albrough.com.au +maker.net.au +jebb.net.au +hotmail.com +yahoo.com +gmail.com +nybo.net.au +gmail.com +taghon.net.au +daleo.net.au +gmail.com +costeira.com.au +nicley.com.au +gedman.net.au +yahoo.com +hotmail.com +yahoo.com +hotmail.com +hotmail.com +oto.com.au +gmail.com +ploszaj.net.au +rael.com.au +hotmail.com +gmail.com +boudrie.net.au +yahoo.com +gmail.com +agar.net.au +rebich.net.au +hinkson.net.au +gmail.com +gmail.com +hotmail.com +yahoo.com +yahoo.com +lymaster.net.au +gmail.com +hotmail.com +gmail.com +gene.com.au +yahoo.com +fraize.net.au +gmail.com +capelli.com.au +binnie.net.au +gephardt.com.au +helger.com.au +yahoo.com +hotmail.com +vrieze.net.au +hotmail.com +strawbridge.com.au +mishkin.com.au +yahoo.com +tovmasyan.net.au +kloska.net.au +skursky.net.au +gmail.com +breckenstein.com.au +gmail.com +elm.net.au +yahoo.com +okojie.com.au +hotmail.com +fellhauer.com.au +hotmail.com +yahoo.com +hotmail.com +gmail.com +gmail.com +yahoo.com +lolley.net.au +hotmail.com +sumera.net.au +yahoo.com +gmail.com +orlinski.com.au +gmail.com +pacleb.net.au +gmail.com +yahoo.com +hotmail.com +gmail.com +gmail.com +hotmail.com +yahoo.com +hotmail.com +yahoo.com +gmail.com +hotmail.com +gmail.com +kazeck.com.au +hotmail.com +hotmail.com +pawell.net.au +arellanes.net.au +servantes.com.au +fajen.net.au +yahoo.com +yahoo.com +yahoo.com +leicht.com.au +gmail.com +hotmail.com +polek.net.au +magnotta.net.au +druck.net.au +kunich.net.au +hotmail.com +yahoo.com +hotmail.com +yahoo.com +yahoo.com +yahoo.com +devol.net.au +gmail.com +burket.com.au +yahoo.com +hotmail.com +gmail.com +hotmail.com +limberg.com.au +prosienski.net.au +yahoo.com +stavely.com.au +vaughn.net.au +gmail.com +shiflett.com.au +hotmail.com +gmail.com +pata.net.au +hotmail.com +gmail.com +schmale.net.au +hotmail.com +hotmail.com +charney.net.au +gmail.com +merkt.net.au +svoboda.net.au +yahoo.com +bumby.com.au +kellman.net.au +yahoo.com +yahoo.com +langanke.net.au +gmail.com +gmail.com +hotmail.com +yahoo.com +barras.com.au +mongolo.net.au +hotmail.com +vandermeer.com.au +gmail.com +hulme.com.au +gmail.com +schoenleber.com.au +baird.net.au +gmail.com +prez.com.au +yahoo.com +hotmail.com +gmail.com +hotmail.com +hotmail.com +hotmail.com +hoyne.com.au +connon.com.au +yahoo.com +gmail.com +angeron.net.au +novosel.net.au +yahoo.com +gmail.com +hotmail.com +yahoo.com +yahoo.com +kopet.com.au +malboeuf.com.au +deritis.net.au +yahoo.com +andrion.com.au +hotmail.com +hotmail.com +yahoo.com +vollstedt.com.au +hotmail.com +hotmail.com +gmail.com +decelles.net.au +osmer.com.au +yahoo.com +wodicka.net.au +fritch.com.au +gmail.com +yahoo.com +biler.net.au +gish.net.au +stitely.com.au +gmail.com +hotmail.com +glockner.com.au +gmail.com +kenfield.com.au +kinney.com.au +leja.com.au +gmail.com +entzi.net.au +roches.net.au +lek.net.au +mikovec.com.au +yahoo.com +tolbent.net.au +gmail.com +gmail.com +yahoo.com +gmail.com +yahoo.com +yahoo.com +yahoo.com +hollimon.com.au +hessenthaler.net.au +muhlbauer.net.au +wildeboer.com.au +agney.net.au +hotmail.com +gmail.com +hotmail.com +luening.com.au +hotmail.com +amedro.net.au +hotmail.com +digregorio.net.au +yahoo.com +yahoo.com +gmail.com +chrusciel.net.au +yahoo.com +kellebrew.com.au +ramero.net.au +biasi.net.au +hotmail.com +yahoo.com +yahoo.com +gmail.com +tepley.net.au +whal.net.au +hotmail.com +hermens.net.au +catton.com.au +moehring.net.au +gmail.com +hotmail.com +yahoo.com +weissbrodt.com.au +gmail.com +davoren.net.au +goodness.net.au +koerner.com.au +gmail.com +hotmail.com +morguson.com.au +hotmail.com +gmail.com +hotmail.com +yahoo.com +gmail.com +ahlborn.com.au +telch.net.au +eilbeck.net.au +freiman.net.au +yahoo.com +wasp.net.au +mahmud.com.au +hotmail.com +hotmail.com +hotmail.com +kloos.com.au +hotmail.com +gmail.com +hotmail.com +ware.net.au +hotmail.com +hotmail.com +yahoo.com +hotmail.com +yahoo.com +gmail.com +gmail.com +yuasa.net.au +hotmail.com +rathmann.com.au +koury.net.au +hotmail.com +gmail.com +gmail.com +gmail.com +gmail.com +schimke.com.au +dellen.com.au +hotmail.com +vugteveen.net.au +milsap.com.au +yahoo.com +gmail.com +gmail.com +paavola.com.au +hotmail.com +yahoo.com +hotmail.com +gmail.com +yahoo.com +hotmail.com +hotmail.com +poncio.com.au +galagher.com.au +hotmail.com +phay.com.au +gmail.com +gmail.com +carabajal.com.au +kazemi.net.au +hotmail.com +gmail.com +dejarme.net.au +yahoo.com +hotmail.com +gmail.com +gordis.com.au +gmail.com +alerte.com.au +yahoo.com +gmail.com +gong.com.au +kushnir.net.au +gmail.com +hotmail.com +filan.net.au +andrzejewski.com.au +yahoo.com +fernades.com.au +levay.net.au +hotmail.com +laroia.net.au +badgero.com.au +gmail.com +gmail.com +waganer.net.au +gmail.com +tokich.net.au +hotmail.com +gmail.com +radel.net.au +yahoo.com +gmail.com +yahoo.com +hotmail.com +diciano.com.au +hotmail.com +yahoo.com +yahoo.com +hotmail.com +hotmail.com +gmail.com +hotmail.com +hotmail.com +gmail.com +menez.net.au +gmail.com +yahoo.com +mckale.net.au +laprade.net.au +lofts.com.au +brueck.net.au +hotmail.com +lary.net.au +gmail.com +hotmail.com +herrera.net.au +jarva.com.au +gmail.com +hotmail.com +yahoo.com +thro.net.au +gmail.com +wisenbaker.net.au +weyman.com.au +suffern.net.au +gmail.com +hutchin.com.au +yahoo.com +hotmail.com +yahoo.com +yahoo.com +gmail.com +hotmail.com +metevelis.net.au +gmail.com +hotmail.com +hotmail.com +couzens.com.au +hotmail.com +woodhams.com.au +yahoo.com +gmail.com +huntsberger.net.au +gmail.com +silverstone.net.au +hotmail.com +gmail.com +hotmail.com +yahoo.com +yahoo.com +mohrmann.net.au +kueter.com.au +overbough.com.au +hotmail.com +gmail.com +yahoo.com +gmail.com +gmail.com +hotmail.com +gmail.com +yahoo.com +quintero.com.au +sanzenbacher.com.au +yahoo.com +yahoo.com +gmail.com +francis.net.au +hotmail.com +hotmail.com +ladeau.net.au +raddle.com.au +conquest.net.au +fults.net.au +hotmail.com +hotmail.com +hotmail.com +yahoo.com +hotmail.com +figueras.net.au +burnsworth.net.au +hotmail.com +ocken.net.au +hotmail.com +gmail.com +yahoo.com +gmail.com +hotmail.com +gmail.com +hotmail.com +remillard.net.au +gmail.com +taketa.net.au +hotmail.com +yahoo.com +hotmail.com +hotmail.com +gmail.com +palaspas.net.au +milbrandt.com.au +hotmail.com +yahoo.com +yahoo.com +gudgel.com.au +farnham.com.au +oakland.com.au +gmail.com +gmail.com +hotmail.com +bakey.com.au +yahoo.com +gmail.com +iida.net.au +yahoo.com +hotmail.com +yahoo.com +gmail.com +buchauer.net.au +hotmail.com +hotmail.com +mikel.net.au +ghera.com.au +brackett.net.au +delacruz.net.au \ No newline at end of file diff --git a/src/main/resources/sampledata/~act/lastname.list b/src/main/resources/sampledata/~act/lastname.list new file mode 100644 index 000000000..4921f63f0 --- /dev/null +++ b/src/main/resources/sampledata/~act/lastname.list @@ -0,0 +1,500 @@ +Didio +Hallo +Stayer +Woodka +Bena +Scotland +Klar +Desjardiws +Siena +Jarding +Chudej +Tarbor +Albrough +Maker +Jebb +Tabar +Bewley +Pylant +Nybo +Sonier +Taghon +Daleo +Sidhu +Costeira +Nicley +Gedman +Bourbonnais +Stoneking +Ellerbusch +Julye +Majorga +Oto +Geffers +Ploszaj +Rael +Lobosco +Aguele +Boudrie +Bonalumi +Landa +Agar +Rebich +Hinkson +Poarch +Korczynski +Broccoli +Ruthers +Esco +Lymaster +Cecchinato +Flitcroft +Soros +Gene +Moothart +Fraize +Lazzaro +Capelli +Binnie +Gephardt +Helger +Resureccion +Kriner +Vrieze +Sanborn +Strawbridge +Mishkin +Vandersloot +Tovmasyan +Kloska +Skursky +Daria +Breckenstein +Jezek +Elm +Handler +Okojie +Shiflet +Fellhauer +Litherland +Ivans +Platz +Pirkl +Qadir +Qazi +Lolley +Bolka +Sumera +Cassi +Nicols +Orlinski +Neisius +Pacleb +Block +Rosso +Epps +Amlin +Mcenery +Scatton +Perra +Jelsma +Brickhouse +Bennett +Ebershoff +Huro +Kazeck +Bortignon +Baley +Pawell +Arellanes +Servantes +Fajen +Eilers +Phinazee +Pascucci +Leicht +Bai +Popper +Polek +Magnotta +Druck +Kunich +Buchman +Sionesini +Driesenga +Vonderahe +Maestri +Susmilch +Devol +Grafenstein +Burket +Urion +Gayner +Hayduk +Fitz +Limberg +Prosienski +Calamarino +Stavely +Vaughn +Legeyt +Shiflett +Prudhomme +Warman +Pata +Robasciotti +Bayot +Schmale +Peleg +Wojnar +Charney +Eischens +Merkt +Svoboda +Mcquaide +Bumby +Kellman +Upton +Krome +Langanke +Popa +Horr +Culcasi +Reyelts +Barras +Mongolo +Byon +Vandermeer +Diniz +Hulme +Mesch +Schoenleber +Baird +Weigner +Prez +Whelpley +Stever +Carmel +Yurick +Vonseggern +Aveline +Hoyne +Connon +Turk +Magro +Angeron +Novosel +Gohlke +Englund +Worland +Tates +Dibello +Kopet +Malboeuf +Deritis +Hegland +Andrion +Tuccio +Schmoyer +Leuenberger +Vollstedt +Haag +Pedregon +Keks +Decelles +Osmer +Stangle +Wodicka +Fritch +Dones +Blanck +Biler +Gish +Stitely +Osmanski +Lothridge +Glockner +Pastorino +Kenfield +Kinney +Leja +Gawrych +Entzi +Roches +Lek +Mikovec +Layland +Tolbent +Senters +Dollins +Baumgarter +Tummons +Falvey +Barkley +Deras +Hollimon +Hessenthaler +Muhlbauer +Wildeboer +Agney +Dominique +Lindblom +Chaleun +Luening +Vicente +Amedro +Ducos +Digregorio +Kajder +Saffer +Kruk +Chrusciel +Dieterich +Kellebrew +Ramero +Biasi +Wessner +Heninger +Cropsey +Barthlow +Tepley +Whal +Beckes +Hermens +Catton +Moehring +Dingler +Bukovac +Eighmy +Weissbrodt +Georgiades +Davoren +Goodness +Koerner +Decamp +Breyer +Morguson +Saffo +Sutherburg +Redlon +Akiyama +Handrick +Ahlborn +Telch +Eilbeck +Freiman +Avera +Wasp +Mahmud +Brothers +Weibe +Cheever +Kloos +Picton +Simco +Princiotta +Ware +Rabena +Saeteun +Carranzo +Plocica +Siefken +Irene +Padua +Yuasa +Cove +Rathmann +Koury +Bogacz +Killean +Crawley +Selestewa +Graziosi +Schimke +Dellen +Riston +Vugteveen +Milsap +Zihal +Kinnison +Sundahl +Paavola +Everline +Leriche +Hodges +Knudtson +Kloepper +Tarkowski +Gennusa +Poncio +Galagher +Schiavi +Phay +Sotelo +Seniff +Carabajal +Kazemi +Drozdowski +Dammeyer +Dejarme +Garness +Kane +Vanauken +Gordis +Puccini +Alerte +Sarkissian +Ochs +Gong +Kushnir +Dampier +Medich +Filan +Andrzejewski +Saltourides +Fernades +Levay +Beaureguard +Laroia +Badgero +Miskelly +Schuh +Waganer +Orehek +Tokich +Markoff +Gabbert +Radel +Kingshott +Salomone +Kearsey +Bodle +Diciano +Mangino +Vock +Tuamoheloa +Yerry +Barchacky +Calizo +Korba +Naifeh +Hedstrom +Menez +Carlo +Francoise +Mckale +Laprade +Lofts +Brueck +Guenther +Lary +Borra +Lehoux +Herrera +Jarva +Ender +Borchelt +Bame +Thro +Lamers +Wisenbaker +Weyman +Suffern +Heimbaugh +Hutchin +Schwiebert +Johanningmeie +Delsoin +Elamin +Thaxton +Pecot +Metevelis +Kazarian +Hegeman +Summerfield +Couzens +Ovit +Woodhams +Luckenbach +Leveston +Huntsberger +Todesco +Silverstone +Liversedge +Tetter +Motter +Grube +Hickie +Mohrmann +Kueter +Overbough +Guglielmina +Lauretta +Lindbeck +Lizama +Piccinich +Derenzis +Reynolds +Bergstrom +Quintero +Sanzenbacher +Scrimsher +Sieber +Petteway +Francis +Meikle +Graleski +Ladeau +Raddle +Conquest +Fults +Etzler +Houben +Rimmer +Mckenna +Shear +Figueras +Burnsworth +Orazine +Ocken +Tamburello +Noa +Roh +Frabotta +Chee +Apodace +Fowlkes +Remillard +Miccio +Taketa +Latina +Meray +Sprowl +Niglio +Shoulders +Palaspas +Milbrandt +Sarp +Peressini +Manin +Gudgel +Farnham +Oakland +Nicklous +Vonstaden +Amuso +Bakey +Picotte +Bodine +Iida +Mockus +Okon +Saine +Studwell +Buchauer +Cisney +Feldner +Mikel +Ghera +Brackett +Delacruz \ No newline at end of file diff --git a/src/main/resources/sampledata/~act/mobile.list b/src/main/resources/sampledata/~act/mobile.list new file mode 100644 index 000000000..41ae1da3d --- /dev/null +++ b/src/main/resources/sampledata/~act/mobile.list @@ -0,0 +1,500 @@ +0458-665-290 +0497-622-620 +0427-885-282 +0443-795-912 +0453-666-885 +0451-966-921 +0427-991-688 +0415-961-606 +0411-732-965 +0461-862-457 +0478-867-289 +0494-982-617 +0441-255-802 +0420-123-282 +0496-441-929 +0431-669-863 +0448-221-640 +0423-446-913 +0416-394-795 +0420-575-355 +0491-976-291 +0462-327-613 +0458-753-924 +0480-443-612 +0455-270-505 +0433-965-131 +0491-455-112 +0465-778-983 +0442-982-316 +0465-547-766 +0462-648-621 +0460-377-727 +0454-643-433 +0430-656-502 +0498-627-281 +0495-838-492 +0444-150-950 +0462-627-260 +0455-699-311 +0471-251-939 +0486-599-199 +0468-708-802 +0489-430-358 +0419-138-629 +0427-970-674 +0416-525-908 +0410-358-989 +0444-359-546 +0411-717-109 +0448-530-536 +0465-519-356 +0423-281-356 +0482-882-653 +0419-656-117 +0468-743-337 +0472-315-303 +0432-580-634 +0460-951-322 +0415-230-654 +0412-699-567 +0478-459-448 +0496-387-592 +0430-222-319 +0431-413-930 +0497-868-525 +0474-823-917 +0492-408-109 +0459-680-488 +0473-600-733 +0485-944-417 +0466-820-981 +0462-308-800 +0493-644-827 +0418-581-770 +0481-367-908 +0424-801-736 +0488-223-788 +0493-258-647 +0480-676-186 +0429-746-524 +0441-978-907 +0410-688-713 +0471-106-909 +0446-105-779 +0451-120-660 +0413-530-467 +0463-377-181 +0495-644-883 +0436-246-951 +0444-326-506 +0440-707-817 +0453-896-533 +0445-211-162 +0464-763-350 +0461-339-731 +0438-251-615 +0446-721-262 +0481-878-290 +0416-887-937 +0477-239-199 +0463-242-525 +0468-234-875 +0499-760-910 +0494-620-234 +0446-422-535 +0423-874-910 +0486-736-129 +0486-504-582 +0446-710-661 +0488-109-742 +0489-493-308 +0418-994-884 +0446-460-955 +0453-818-566 +0486-712-822 +0438-141-107 +0448-235-525 +0419-100-429 +0446-520-807 +0424-741-530 +0449-775-616 +0454-544-286 +0490-625-307 +0428-176-191 +0430-111-686 +0413-115-438 +0489-594-290 +0485-183-917 +0481-500-964 +0472-806-350 +0436-337-750 +0499-737-220 +0456-480-906 +0473-495-435 +0492-444-651 +0472-707-132 +0482-267-844 +0441-579-823 +0430-736-276 +0463-745-755 +0451-514-152 +0464-687-686 +0414-749-850 +0445-797-121 +0420-704-683 +0475-926-458 +0410-812-931 +0481-222-272 +0434-382-805 +0450-769-383 +0428-946-162 +0492-739-675 +0419-644-936 +0416-330-811 +0485-718-212 +0441-733-809 +0499-576-666 +0417-815-258 +0491-793-730 +0493-319-728 +0437-170-488 +0451-601-420 +0423-358-965 +0438-431-666 +0495-777-435 +0430-357-187 +0417-325-352 +0429-206-122 +0476-915-729 +0444-393-673 +0445-830-408 +0482-635-206 +0419-565-485 +0466-155-348 +0489-343-254 +0495-801-419 +0439-849-209 +0412-855-847 +0467-531-601 +0447-443-927 +0481-466-206 +0416-443-185 +0430-400-899 +0439-832-641 +0482-712-669 +0470-886-805 +0450-887-422 +0414-731-630 +0469-808-491 +0479-474-917 +0444-175-406 +0443-979-875 +0472-511-112 +0439-769-439 +0489-476-500 +0442-946-694 +0417-281-870 +0459-945-995 +0436-612-609 +0492-559-630 +0453-828-758 +0454-458-365 +0499-155-325 +0440-277-657 +0489-202-570 +0474-218-755 +0413-129-424 +0458-731-791 +0495-882-447 +0415-690-961 +0461-569-843 +0413-952-396 +0451-121-905 +0418-813-310 +0495-759-817 +0496-610-278 +0425-685-933 +0438-378-139 +0468-244-186 +0412-417-394 +0465-885-293 +0497-335-342 +0436-530-773 +0426-888-203 +0497-955-472 +0490-478-206 +0466-541-467 +0463-965-946 +0473-268-319 +0491-209-954 +0430-768-907 +0437-545-265 +0465-254-471 +0426-991-115 +0423-870-900 +0454-956-810 +0469-609-289 +0438-810-326 +0449-675-754 +0490-548-561 +0463-118-373 +0412-631-864 +0451-857-511 +0420-776-847 +0467-209-469 +0458-548-827 +0433-677-495 +0418-218-423 +0477-424-229 +0442-976-132 +0426-833-750 +0426-488-593 +0448-206-407 +0427-579-588 +0486-778-453 +0487-913-509 +0443-539-658 +0420-286-404 +0493-703-129 +0449-807-281 +0426-612-418 +0455-947-547 +0462-625-869 +0450-440-670 +0448-465-944 +0452-920-972 +0486-924-555 +0438-100-197 +0432-253-912 +0475-701-279 +0468-451-905 +0436-444-424 +0472-281-671 +0469-445-592 +0484-806-405 +0475-760-952 +0467-758-219 +0427-327-492 +0463-757-229 +0445-609-538 +0411-111-689 +0492-994-709 +0429-419-390 +0463-881-817 +0432-682-937 +0498-489-459 +0439-885-729 +0468-488-918 +0449-337-116 +0456-595-946 +0416-963-557 +0420-185-206 +0468-322-703 +0471-169-302 +0425-628-359 +0484-331-585 +0486-768-529 +0410-539-386 +0481-193-115 +0465-434-187 +0419-509-353 +0411-620-740 +0471-602-916 +0456-330-756 +0440-811-454 +0499-741-651 +0462-987-152 +0467-821-930 +0411-276-383 +0459-738-842 +0456-162-659 +0434-497-618 +0435-982-307 +0478-235-293 +0423-341-752 +0480-561-819 +0452-193-155 +0466-603-340 +0454-257-906 +0443-386-213 +0414-354-955 +0497-442-813 +0414-661-490 +0444-777-459 +0474-730-764 +0437-819-518 +0445-121-372 +0498-290-826 +0432-130-553 +0416-156-336 +0425-809-254 +0460-368-567 +0451-790-704 +0464-786-310 +0470-345-731 +0444-157-156 +0473-213-595 +0492-961-209 +0414-715-583 +0474-367-875 +0430-271-168 +0423-125-880 +0418-327-906 +0452-766-262 +0423-831-803 +0419-430-467 +0445-285-375 +0470-655-661 +0426-830-817 +0478-179-538 +0469-243-477 +0488-276-458 +0453-493-910 +0481-278-876 +0427-971-504 +0434-637-971 +0417-544-301 +0421-987-667 +0480-433-145 +0432-706-521 +0430-503-397 +0479-127-500 +0482-613-598 +0481-799-605 +0412-153-776 +0486-302-652 +0439-808-753 +0471-558-187 +0437-687-429 +0455-503-406 +0481-452-729 +0472-631-448 +0422-968-757 +0411-398-917 +0430-962-223 +0490-571-461 +0412-225-824 +0455-472-994 +0412-679-832 +0488-646-644 +0460-335-582 +0495-852-298 +0490-570-424 +0449-461-650 +0418-290-707 +0419-587-898 +0473-727-909 +0471-229-188 +0442-173-327 +0431-743-155 +0423-740-512 +0475-366-466 +0474-199-825 +0445-480-672 +0473-505-816 +0423-545-966 +0499-207-236 +0444-915-799 +0497-455-126 +0411-294-588 +0441-151-810 +0452-941-575 +0422-884-614 +0472-399-247 +0487-835-113 +0425-214-447 +0419-246-570 +0448-195-542 +0486-557-304 +0472-903-534 +0483-854-984 +0476-877-991 +0413-650-821 +0453-580-611 +0452-605-630 +0459-496-184 +0410-116-435 +0424-568-217 +0415-341-310 +0476-605-889 +0467-468-894 +0436-793-916 +0467-331-796 +0481-690-589 +0491-832-907 +0457-126-909 +0432-182-830 +0490-947-955 +0494-282-122 +0488-624-111 +0490-128-503 +0451-946-241 +0451-383-562 +0459-937-449 +0426-175-813 +0480-120-597 +0447-228-633 +0457-212-114 +0488-425-192 +0451-639-283 +0472-691-355 +0451-406-157 +0438-478-951 +0415-135-989 +0441-386-796 +0447-563-450 +0480-125-331 +0494-517-582 +0442-561-392 +0473-757-584 +0432-184-936 +0417-833-905 +0467-120-854 +0419-730-349 +0432-703-516 +0474-975-307 +0422-183-541 +0419-720-227 +0449-668-295 +0466-921-460 +0448-770-746 +0476-917-926 +0460-834-526 +0485-660-179 +0469-490-273 +0418-429-485 +0416-611-806 +0476-736-800 +0436-606-487 +0443-657-148 +0420-742-142 +0417-795-558 +0428-843-553 +0471-940-163 +0499-165-889 +0485-105-744 +0422-775-760 +0484-192-990 +0438-847-885 +0444-376-606 +0470-386-894 +0493-826-469 +0440-980-784 +0435-530-318 +0427-106-677 +0495-376-112 +0479-654-997 +0452-835-388 +0493-653-304 +0444-126-746 +0442-360-982 +0433-550-202 +0426-784-480 +0434-402-895 +0451-465-174 +0475-337-188 +0464-594-316 +0443-448-467 +0454-135-614 +0454-434-110 \ No newline at end of file diff --git a/src/main/resources/sampledata/~act/phone.list b/src/main/resources/sampledata/~act/phone.list new file mode 100644 index 000000000..d35c657c3 --- /dev/null +++ b/src/main/resources/sampledata/~act/phone.list @@ -0,0 +1,500 @@ +03-8174-9123 +07-9997-3366 +08-5558-9019 +02-6044-4682 +02-1455-6085 +08-7868-1355 +08-6522-8931 +02-5226-9402 +07-3184-9989 +08-6890-4661 +07-8135-3271 +03-1174-6817 +07-7977-6039 +08-8344-8929 +07-4941-9471 +02-3518-7078 +07-9387-7293 +02-5171-4345 +02-5311-7778 +07-9354-2612 +02-1638-4380 +02-5322-6127 +07-6460-4488 +07-5338-6357 +03-6443-2786 +07-4785-3781 +03-6543-6688 +07-3721-9123 +08-2748-1250 +03-7063-6734 +02-8171-9051 +07-1153-8567 +08-7097-3947 +07-7991-8880 +03-8998-5485 +02-5046-1307 +07-6476-1399 +07-4463-7223 +08-3071-2258 +07-1576-1412 +08-9130-3372 +02-4972-3570 +02-7160-2066 +03-2691-1298 +02-3877-9654 +07-2679-1774 +02-2367-6845 +03-3474-2120 +07-8087-2603 +08-5263-2786 +07-1778-9968 +08-2666-6390 +02-4458-2810 +02-3996-9188 +02-4873-1914 +03-4933-4205 +07-4823-9785 +08-3692-5784 +02-5078-4389 +07-1642-3251 +07-2373-6048 +02-7328-3350 +03-1981-6209 +02-6246-5711 +07-3760-1546 +07-6034-2422 +02-5487-7528 +02-2546-5344 +07-9896-4827 +02-5941-3178 +03-2822-8156 +03-5722-3451 +03-3268-5102 +03-9183-9493 +08-5671-3318 +08-9746-2341 +03-4529-7210 +03-4387-3800 +07-5284-3845 +07-8661-4016 +07-4306-1623 +03-6023-2680 +08-7687-4883 +03-1974-9948 +03-4072-7094 +03-8157-4609 +08-9114-1763 +03-2305-8627 +08-2117-5217 +03-2451-1896 +03-8243-2999 +08-9450-7978 +08-7635-8350 +02-4565-6425 +07-8085-8351 +02-8007-5034 +02-1718-4983 +02-3647-9507 +07-6019-7861 +08-7712-4785 +03-9517-9800 +08-2969-2908 +02-6604-9720 +07-1951-6787 +08-5475-6162 +08-9256-6135 +02-7049-7728 +07-8997-8513 +02-7995-6787 +03-9801-9429 +07-9104-1459 +03-4328-5253 +08-5756-9456 +08-9279-1731 +03-6240-8274 +07-6813-6477 +03-7036-7071 +03-2403-7167 +02-2376-7653 +08-3605-3943 +02-6769-6153 +08-1791-7668 +03-4812-5654 +08-6777-4159 +03-5661-2424 +02-2129-8131 +07-5035-4889 +07-4963-5297 +08-1624-7236 +08-9159-7562 +02-4794-6673 +03-7734-9557 +03-2297-9891 +07-7445-2572 +03-4539-9131 +03-2454-6523 +07-5378-4498 +03-6510-4788 +03-7035-6484 +03-4878-1766 +08-8856-8589 +07-9053-8045 +08-9948-2940 +07-7445-2538 +03-1570-9956 +03-8858-7088 +08-4564-2338 +03-1130-5685 +02-6287-8787 +07-7659-5711 +02-7739-6600 +03-9341-9757 +08-3614-5966 +03-1465-8645 +03-1431-3996 +02-7968-9243 +07-7647-5420 +03-9617-5392 +03-9838-7533 +02-6522-3993 +07-8441-8214 +03-9075-3104 +03-2921-8418 +03-3017-8394 +08-4563-6214 +08-3914-9404 +07-9407-9202 +03-2517-3453 +07-7144-4719 +07-1415-9307 +08-8081-7779 +08-2325-5905 +03-8912-5755 +02-7463-8776 +03-5175-6193 +07-7092-8542 +02-2832-1545 +07-9595-6042 +07-5769-8004 +08-3342-3889 +08-6183-9260 +02-5725-5992 +08-4735-5054 +02-7265-9702 +03-6268-2647 +03-5716-1053 +07-9826-3950 +08-5289-4594 +02-9885-9593 +08-1520-4093 +07-1330-6750 +07-3799-1667 +03-7139-6376 +03-4231-3633 +02-1402-5215 +07-3239-2830 +08-8868-2010 +08-5444-3296 +08-1267-4421 +03-6776-1146 +02-9718-2944 +08-8484-3223 +03-5251-3153 +03-5185-6258 +03-8369-6924 +08-1937-3980 +08-4712-2157 +02-2612-1455 +02-2393-3289 +03-6517-9318 +08-9855-2125 +03-9935-5135 +03-1600-5230 +08-9693-9052 +02-1919-3941 +07-7052-4547 +08-4753-2870 +08-5614-9153 +03-7767-6169 +03-2477-9133 +02-4246-3092 +03-2484-5500 +08-2358-3115 +08-3384-3181 +02-9829-2371 +08-2158-6758 +02-4376-1104 +03-5933-7288 +02-1622-6412 +02-5410-5137 +03-8216-8640 +07-4854-5045 +08-8161-8201 +07-8371-4719 +08-7046-5484 +03-5855-5156 +08-5943-4352 +03-9107-7349 +08-1184-4145 +07-3594-6592 +08-7915-5110 +07-2319-2889 +02-9554-9632 +03-2444-8291 +02-3449-6894 +03-1361-8465 +02-7922-5417 +02-7498-8576 +02-5970-1748 +02-7386-4544 +07-7446-6315 +07-3581-9462 +07-9840-6419 +07-8857-6463 +02-5095-2983 +03-6053-2447 +07-9512-2457 +07-4217-6258 +08-2941-7378 +02-2493-1870 +02-3248-3283 +07-9178-6430 +03-9085-5714 +07-1217-9907 +02-9187-4769 +07-3963-4469 +08-5236-2143 +03-6144-7318 +02-7239-9923 +08-8343-3550 +07-1698-9047 +02-2208-2711 +08-5221-9700 +08-7615-2416 +07-5417-9612 +08-1895-1457 +02-2656-6234 +03-9215-3224 +02-1075-4690 +02-9324-7803 +03-8357-4617 +08-4563-9520 +08-8808-8104 +08-2922-4115 +07-1964-4238 +02-1987-8525 +08-1683-9243 +02-2621-3361 +03-8780-3473 +03-9480-9611 +02-5977-8561 +08-1687-4873 +08-7605-2080 +07-1037-3391 +08-5227-2620 +08-6278-9532 +03-5662-3542 +03-2802-7434 +02-6078-3417 +03-9050-2741 +07-5085-8138 +08-8012-6469 +02-9472-5814 +03-2324-3472 +02-8010-8344 +08-1269-1489 +03-5213-8219 +08-5203-2193 +03-2813-6426 +08-2089-8553 +02-4885-8382 +08-4849-4417 +03-4829-5695 +08-6742-2308 +07-9920-3550 +07-3103-8372 +08-4040-9192 +07-4724-9987 +07-4518-4450 +08-8587-1196 +08-1140-6357 +03-5355-5505 +07-5486-1002 +08-8215-1588 +03-9173-6140 +07-4297-4607 +07-6793-5954 +02-5444-1961 +07-6113-9653 +02-3225-1954 +08-9707-2679 +08-8147-9584 +07-7240-6480 +03-6340-5010 +08-7432-4632 +07-6444-3666 +07-5686-8088 +08-3562-8644 +08-3733-5261 +02-6291-7620 +07-3476-2066 +08-9808-2647 +02-5808-6388 +02-5632-9914 +02-6974-7785 +02-3490-2407 +02-1222-7812 +07-8516-6453 +02-4623-8120 +02-8035-9997 +03-6589-2556 +08-6937-4366 +02-3416-9617 +02-3003-1369 +08-2901-3421 +08-2401-5672 +07-6679-3722 +02-8156-6969 +03-1861-5074 +03-6340-9772 +02-3869-4096 +08-3200-1670 +02-1919-1709 +07-5017-7337 +02-6529-9317 +02-4776-1384 +08-9919-9540 +02-5318-1342 +07-8250-2277 +08-2127-5977 +08-7385-2716 +02-3566-7608 +03-6623-5501 +02-6689-1150 +08-6137-1726 +03-4492-4927 +08-3087-9658 +02-3494-3282 +08-3174-2706 +02-6193-5184 +08-3412-6699 +08-1196-2822 +07-9265-7183 +03-8791-9436 +08-9919-7850 +07-2627-9976 +03-1765-4584 +08-5228-3628 +03-2749-1381 +08-1042-4275 +02-1211-3823 +02-1385-3480 +03-1447-7041 +02-9676-4462 +07-7538-5504 +03-8055-8668 +07-5354-7251 +08-1991-6947 +02-4885-1611 +02-2957-4812 +02-7091-8948 +02-9653-2199 +07-8738-4205 +08-9895-1954 +03-3608-5660 +02-1827-1736 +07-7369-8849 +02-1815-8700 +03-4010-1900 +02-8081-3883 +08-4700-8894 +08-1109-5346 +08-9280-9177 +07-7489-7577 +03-8451-7537 +02-4649-5341 +02-5770-8546 +08-9378-7021 +03-2574-8915 +08-2704-3706 +03-3233-4255 +03-7416-6750 +02-4418-5927 +07-6073-5039 +03-1248-8221 +08-3305-5436 +03-3695-2399 +08-1399-2471 +03-3725-6290 +02-7947-2980 +08-2264-5559 +03-1036-9594 +02-3713-3646 +07-5346-5917 +08-9757-2379 +02-5573-6627 +08-7785-3040 +08-3987-7521 +08-8280-9492 +03-1051-7865 +08-2136-2433 +07-5235-7319 +03-9599-4122 +07-4119-3981 +02-8727-4906 +02-6118-8773 +07-3511-9233 +03-4811-3832 +08-6579-7569 +07-1536-4805 +03-6698-8416 +03-1560-6800 +03-5354-9557 +02-5059-2649 +08-6270-6829 +08-2209-8647 +08-8222-3171 +08-7718-8495 +02-9828-4921 +03-4800-7102 +03-6438-4586 +08-5175-3585 +03-2689-6049 +03-2775-4083 +02-5630-3114 +07-9032-5149 +08-6831-6370 +07-5626-7937 +07-2209-2731 +08-8506-7259 +03-9424-2956 +02-4074-4461 +07-5128-8956 +08-8329-4211 +08-6069-1579 +02-1157-3829 +08-8878-5994 +08-4326-1560 +07-2031-6566 +02-2501-8301 +02-5402-8024 +07-5404-6221 +07-6382-5073 +02-8222-9319 +02-1706-8506 +07-5922-1983 +02-4360-8467 +02-2581-7479 +07-6984-9278 +02-1291-8182 +03-9721-7313 +03-3457-2524 +07-1377-6898 +02-4202-5191 +03-3630-2467 +07-8561-5894 +02-6995-9902 +02-3738-7508 +08-3773-3770 +02-7862-5151 \ No newline at end of file diff --git a/src/main/resources/sampledata/~act/postcode.list b/src/main/resources/sampledata/~act/postcode.list new file mode 100644 index 000000000..5f33c9eb5 --- /dev/null +++ b/src/main/resources/sampledata/~act/postcode.list @@ -0,0 +1,500 @@ +7315 +4613 +6215 +2640 +1595 +6316 +6258 +2803 +4356 +5357 +4343 +7140 +4343 +6931 +4030 +2820 +4560 +2259 +2603 +4610 +2806 +2289 +4505 +4879 +3959 +4816 +7264 +4411 +810 +3249 +2429 +4343 +6909 +4066 +3357 +2083 +4605 +4311 +6532 +4721 +5554 +2452 +2250 +3557 +2261 +4719 +2372 +3002 +4068 +6733 +4552 +6280 +2529 +2257 +2030 +3971 +4350 +6472 +2441 +4741 +4887 +2092 +7258 +2446 +4359 +4053 +2669 +2284 +4816 +2675 +3079 +3630 +3341 +3995 +6311 +6352 +3927 +7140 +4740 +4520 +4800 +3350 +5603 +3860 +7315 +7172 +5374 +3221 +6355 +3782 +3640 +5172 +6037 +2710 +4741 +2340 +2448 +2333 +4350 +6953 +3124 +6906 +2470 +4703 +6935 +6210 +2665 +4670 +1595 +3073 +4055 +3885 +5730 +5062 +7112 +4122 +7321 +3888 +2650 +5115 +2481 +6286 +3240 +6338 +7330 +2155 +4489 +4860 +6521 +5126 +2300 +7005 +3072 +4075 +7310 +3987 +4871 +7260 +3765 +3046 +5083 +4615 +5068 +4214 +3701 +3714 +5661 +7252 +2287 +4128 +2786 +3858 +6460 +3155 +3670 +2159 +4703 +7301 +3465 +2429 +4816 +3688 +7275 +3889 +5015 +5087 +4710 +3032 +4387 +4570 +836 +6330 +3081 +2017 +3392 +4555 +1220 +4564 +4493 +6056 +5113 +2652 +5485 +2035 +3697 +3215 +4350 +6535 +2262 +6420 +4659 +4481 +3134 +7004 +2538 +4871 +5025 +5011 +5171 +3462 +1235 +6450 +3494 +3095 +3109 +6477 +6008 +2145 +2232 +7120 +810 +3691 +7116 +6430 +2608 +4680 +5244 +6280 +3420 +3809 +2229 +7255 +6061 +812 +2483 +5063 +2422 +3081 +2474 +2703 +3284 +4820 +6407 +4703 +6320 +3241 +6207 +3011 +6462 +4823 +6152 +4344 +2324 +3678 +2530 +3314 +2877 +2340 +2194 +2160 +4813 +4615 +4311 +4551 +2795 +7186 +4702 +4610 +6522 +2329 +2484 +4615 +3167 +4871 +2317 +4670 +5213 +3084 +2381 +5158 +4626 +2765 +5034 +6285 +4860 +5573 +1835 +7004 +2871 +2798 +3401 +5046 +5120 +5153 +4227 +2560 +846 +2150 +3791 +7316 +2322 +6397 +6215 +4412 +6503 +6030 +3981 +3194 +2298 +3496 +4870 +6405 +2443 +3995 +2166 +5291 +3309 +5353 +3019 +6302 +2321 +6031 +3934 +5480 +4064 +4858 +5131 +4621 +4305 +5204 +6409 +3631 +4871 +6336 +3370 +4355 +4740 +2138 +4205 +3644 +6155 +6056 +4516 +3782 +6394 +4227 +4454 +6210 +6983 +2322 +4009 +5301 +2008 +2263 +2474 +2469 +2539 +4497 +2901 +2083 +7030 +6302 +2126 +2663 +6532 +5236 +4494 +2447 +3810 +7140 +2540 +6532 +2000 +4405 +2304 +2440 +6521 +2420 +4217 +6112 +5220 +2820 +3260 +2600 +6225 +7250 +5495 +2580 +6320 +2330 +6308 +6258 +4051 +3223 +5724 +4718 +3128 +820 +3008 +6041 +2700 +2666 +3697 +2550 +4120 +3216 +4221 +6159 +2609 +2425 +2208 +2463 +4825 +6556 +3501 +2477 +4356 +2024 +3236 +2620 +6237 +6472 +5042 +4355 +3265 +2669 +2761 +6210 +3465 +6155 +3551 +3775 +2481 +4670 +3207 +5159 +3900 +6701 +3468 +2750 +5642 +7304 +2456 +4207 +5723 +2082 +6018 +6514 +6608 +3757 +6155 +4570 +3023 +4555 +2259 +2793 +4741 +3442 +6076 +4754 +7190 +3701 +7321 +1455 +6447 +5240 +5416 +5483 +2323 +7150 +3185 +6445 +3895 +3451 +2068 +4001 +6452 +4740 +4313 +820 +7163 +2529 +4455 +6106 +6532 +2650 +6320 +6623 +4562 +2311 +2745 +4856 +4615 +2850 +2429 +4712 +2326 +2480 +4401 +2600 +7275 +3814 +4362 +2339 +3038 +4490 +2388 +2138 +6450 +2850 \ No newline at end of file diff --git a/src/main/resources/sampledata/~act/state.list b/src/main/resources/sampledata/~act/state.list new file mode 100644 index 000000000..7ff3c2b34 --- /dev/null +++ b/src/main/resources/sampledata/~act/state.list @@ -0,0 +1,7 @@ +NSW +QLD +WA +NT +TA +ACT +VIC \ No newline at end of file diff --git a/src/main/resources/sampledata/~act/street.list b/src/main/resources/sampledata/~act/street.list new file mode 100644 index 000000000..e4fb795af --- /dev/null +++ b/src/main/resources/sampledata/~act/street.list @@ -0,0 +1,500 @@ +171 E 24th St +22222 Acoma St +534 Schoenborn St #51 +69206 Jackson Ave +808 Glen Cove Ave +373 Lafayette St +87 Sylvan Ave +60562 Ky Rt 321 +70 S 18th Pl +8839 Ventura Blvd +3684 N Wacker Dr +68828 S 32nd St #6 +43157 Cypress St +6 S Hanover Ave +27916 Tarrytown Rd +79620 Timber Dr +387 Airway Cir #62 +570 W Pine St +823 Fishers Ln +4 Brookcrest Dr #7786 +72 Wyoming Ave +754 Sammis Ave +660 N Green St +970 Waterloo Rd +4129 Abbott Dr +1529 Prince Rodgers Ave +2 N Valley Mills Dr +50968 Kurtz St #45 +71585 S Ayon Ave #9 +8 Old County Rd #3 +13904 S 35th St +6149 Kapiolani Blvd #6 +95431 34th Ave #62 +25 Swift Ave +14304 Old Alexandria Ferry Rd +1585 Salem Church Rd #59 +75962 E Drinker St +8978 W Henrietta Rd +86 Worth St #272 +15 Campville Rd #191 +3 N Ridge Ave +3713 Poway Rd +1 E 17th St +5 Liberty Ave +404 Broxton Ave +4 S Main St #285 +1255 W Passaic St #1553 +377 Excalibur Dr +7 Wilshire Blvd +7 Hugh Wallis Rd +7177 E 14th St +67765 W 11th St +99968 Merced St #79 +40 E 19th Ave +84826 Plaza Dr +20214 W Main St +8039 Howard Ave +8 Austin Bluffs Pky +96605 Pioneer Rd +6 Hope Rd #10 +65898 E St Nw +39 Broad St +654 Seguine Ave +78 31st St +35673 Annapolis Rd #190 +98247 Russell Blvd +3 S Willow St #82 +199 Maple Ave +423 S Navajo St #56 +5 30w W #3083 +57245 W Union Blvd #25 +971 Northwest Blvd +1089 Pacific Coast Hwy +6787 Emerson St +8 Middletown Blvd #708 +56 Tank Farm Rd +503 Fulford Ave +8275 Calle De Industrias +92 South St +56710 Euclid Ave +5210 E Airy St #2 +31 Schuyler Ave +661 Plummer St #963 +1351 Simpson St +2391 Pacific Blvd +1886 2nd Ave +52404 S Clinton Ave +405 W Lee St +5656 N Fiesta Blvd +9 Beverly Rd #5 +96 Armitage Ave +523 N Prince St +6926 Orange Ave +6940 Prospect Pl +52347 San Fernando Rd +5399 Mcwhorter Rd +7 Hall St +5 W Allen St +15126 Goldenwest St +94 I 55s S +288 N 168th Ave #266 +5 Richmond Ct +28 Aaronwood Ave Ne +39701 6th Ave #1485 +35662 S University Blvd +73 Dennison St #70 +9591 Bayshore Rd #637 +57 N Weinbach Ave +286 Santa Rosa Ave +446 Woodward Ave #1 +1 Jenks Ave +7 Valley Blvd +42741 Anania Dr +5 Shakespeare Ave +245 5th Ave +2 Gateway Ctr +3175 Northwestern Hwy +8 S Plaza Dr +8 Collins Ave +9526 Lincoln St +406 E 4th St +361 Via Colinas +94 S Jefferson Rd +8961 S Central Expy +7 Wiley Post Way +60 S 4th St +6 Lafayette St #3034 +35 Jefferson Ave +3492 88th St +20 Sw 28th Ter +6 Argyle Rd +438 E Reynolds Rd #239 +47 Hall St +17720 Beach Blvd +8 2nd St +490 Court St +1456 Hill Rd +6 7th St +29 Nottingham Way #926 +8818 Century Park E #33 +4 Commerce Center Dr +979 S La Cienega Blvd #627 +9181 E 26th St +8855 North Ave +4 Spinning Wheel Ln +5905 S 32nd St +514 Glenn Way +708 S Wilson Way +16949 Harristown Rd +9 13th Ave S +1 Rock Island Rd #8 +1554 Bracken Crk +7 10th St W +9 Cron Hill Dr +82 Tremont St #4 +30024 Whipple Ave Nw +900 W Wood St +847 Norristown Rd +667 S Highland Dr #4 +21 W 2nd St +2 W Henrietta Rd #6 +82655 Shawnee Mission Pky #5798 +9 Taylor Ave +62 J St #450 +2 Pennington St +5496 Ne Columbia Blvd +4244 Lucas Creek Rd +79819 Palmetto Ave +7 N Glenn Rd +61 Center St #8 +562 Nw Cornell Rd +48 General George Patton Dr #8611 +9 W Passaic St +968 Delaware Ave +548 Charmonie Ln +91114 Grand Ave +44 Bush St +6 Mahler Rd +1 E Main St +58 State St #998 +11408 Green St +297 8th Ave S #9 +1 Wyckoff Ave +8 E North Ave +13386 Tamarco Dr #20 +70 W Market St #20 +53247 Montgomery St #36 +9495 Central Hwy #66 +2 Route 9 +75700 Academy Rd +6 Monte Ave +5 France Ave S +803 Tupper Ln +43 Nolan St +6 W 39th St +910 21st St +2677 S Jackson St +6 Central Ave #4 +564 Almeria Ave #7474 +4 Grand St +9 Hamilton Blvd #299 +50638 Northwest Blvd +51 Bridge Ave +457 St Sebastian Way #189 +6 Ackerman Rd +8 W Lake St #1 +8454 6 17 M At Bradleys +5 Ellestad Dr +9 N Nevada Ave +790 E Wisconsin Ave +60481 N Clark St +43 E Main St +5 Madison St #4651 +85 Nw Frontage Rd +584 Meridian St #997 +28220 Park Avenue W +5 Austin Ave +481 925n N #959 +9 9th St #4 +56232 Hohman Ave +3 Wall St #26 +63154 Artesia Blvd +32 E Poythress St +86274 Howell Mill Rd Nw +25488 Brickell Ave +270 5th Ave +891 Union Pacific Ave #8463 +4562 Aurora Ave N +4864 N 168th Ave +7 Elm Ave +6508 Adams St #32 +6434 Westchester Ave #28 +70680 S Rider Trl +700 Factory Ave #5649 +3 Cherokee St +76542 W Bijou St +44009 W 63rd #269 +462 Morris Ave +1 El Camino Real #603 +92417 Arbuckle Ct +1 Westpark Dr +5 Montana Ave +6629 Main St +4 W 18th St +95412 16th St #6 +17 Kamehameha Hwy +8650 S Valley View Bld #6941 +16 Talmadge Rd +750 Lancaster Ave +8808 Northern Blvd +76596 Pleasant Hill Rd +94 Delta Fair Blvd #2702 +25 Sw End Blvd #609 +15258 W Charleston Blvd +75 Ryan Dr #70 +9634 South St +40490 Morrow St +9 Commerce Cir +190 34th St #8 +1036 Malone Rd +398 Fort Campbell Blvd #923 +2799 Cajon Blvd +302 N 10th St #3896 +79346 Firestone Blvd +37564 Grace Ln +470 W Irving Park Rd +6 Jefferson St +1758 Park Pl +7659 Market St +95830 Webster Dr +26 Old William Penn Hwy +343 E Main St +8 Cabot Rd +8 Allied Dr +26921 Vassar St +9 Old York Rd #418 +12398 Duluth St +960 S Arroyo Pkwy +53 Euclid Ave +700 Wilmson Rd +466 Hillsdale Ave +86351 Pine Ave +6139 Contractors Dr #450 +83 Longhurst Rd +76 Daylight Way #7 +3883 N Central Ave +75 E Main +9 Memorial Pky Nw +70086 Division St #3 +4 Middletown Blvd #33 +20907 65s S +82136 Post Rd +3 W Pioneer Dr +5610 Holliday Rd +29133 Hammond Dr #1 +51 Greenwood Ave +327 Ward Pky +52680 W Hwy 55 #59 +654 Se 29th St +65 Clayton Rd +136 2nd Ave N +3 N Michigan Ave +1607 Laurel St +77818 Prince Drew Rd +1 Vogel Rd +5 Main St +7696 Carey Ave +76 San Pablo Ave +767 9th Ave Sw +82 Hopkins Plz +64 Prairie Ave +5 Jackson St +705 Stanwix St +3318 Buckelew Ave +38494 Port Reading Ave +81 Us Highway 9 +45 Mountain View Ave +6 W Meadow St +2 Old Corlies Ave +5614 Public Sq +6 E Gloria Switch Rd #96 +1 Us Highway 206 +5289 Ramblewood Dr +5 Aquarium Pl #1 +466 Lincoln Blvd +42 United Dr +5920 E Arapahoe Rd +2 New Brooklyn Rd +9 34th Ave #69 +32716 N Michigan Ave #82 +78 Sw Beaverton Hillsdale H +8494 E 57th St +46 Broadway St +228 S Tyler St +2714 Beach Blvd +3266 Welsh Rd +1 S Maryland Pky +6 De Belier Rue +57869 Alemany Blvd +39 Plummer St +78717 Graves Ln +30338 S Dunworth St +6 Walnut St +2244 Franquette Ave +9892 Hernando W +9296 Prince Rodgers Ave +9 Chandler Ave #355 +173 Howard Ave +3216 W Wabansia Ave +947 W Harrison St #640 +94843 Trabold Rd #59 +8 Lincoln Way W #6698 +262 Montauk Blvd +5040 Teague Rd #65 +54648 Hylan Blvd #883 +7463 Elmwood Park Blvd +630 E Plano Pky +166 N Maple Dr +20 Meadow Ln +73 Robert S +512 E Idaho St +98021 Harwin Dr +892 Sw Broadway #8 +192 N Sheffield Ave +5 Columbia Pike +35983 Daubert St +678 S Main St +532 Saint Marks Ct +1337 N 26th St +556 Bernardo Cent +9561 Chartres St +11999 Main St +495 Distribution Dr #996 +49 Walnut St +85 S Washington Ave +72984 W 1st St +3 Ridge Rd W #949 +2 Landmeier Rd +82 W Market St +89 N Himes Ave +62296 S Elliott Rd #2 +8 S Main St +50808 A Pamalee Dr +30691 Poplar Ave #4 +80968 Armitage Ave +5 Pittsburg St +812 Berry Blvd #96 +73 12th St +27730 American Ave +72 Park Ave +59215 W 80th St +186 Geary Blvd #923 +717 Midway Pl +68 Camden Rd +175 N Central Ave +80896 South Ave +6584 S Bascom Ave #371 +64865 Main St +62171 E 6th Ave +67729 180th St +7721 Harrison St +5351 E Thousand Oaks Blvd +5 Carpenter Ave +374 Sunrise Ave +68538 N Bentz St #1451 +23 S Orange Ave #55 +4373 Washington St +61550 S Figueroa St +8 N Town East Blvd +2452 Bango Rd +8219 Roswell Rd Ne +3 Davis Blvd +1 S Marginal Rd +78 S Robson +2749 Van Nuys Blvd +722 E Liberty St +9 Gunnison St +2902 Edison Dr #278 +72 N Buckeye Ave +41 E Jackson St +684 William St +185 W Guadalupe Rd +18514 E 4th St #8 +28 Standiford Ave #6 +33108 S Yosemite Ct +73778 Battery St +351 Crooks Rd +8 Glenn Way #3 +8 W Virginia St +65484 Bainbridge Rd +156 Morris St +1881 Market St +6 Kings St #4790 +9787 Dunksferry Rd +13 Blanchard St #996 +2 Pompton Ave +2867 Industrial Way +850 Warwick Blvd #58 +2 Ellis Rd +80 Monroe St +71089 Queens Blvd +66094 Pioneer Rd +66 Congress St +44 105th Ave +40809 Rockburn Hill Rd +9 Green Rd #5877 +63 W 41st Ave #93 +2 Stirrup Dr #4907 +19 Court St +3 Hwy 61 #2491 +97539 Connecticut Ave Nw #3586 +59 Murray Hill Pky +15 W 11mile Rd +709 New Market St +324 Shawnee Mission Pky +37 Saint Louis Ave #292 +80289 Victory Ave #9 +16 Governors Dr Sw +4 E Aven #284 +262 8th St +79 State Route 35 +75 Blackington Ave +6 Abbott Rd +5159 Saint Ann St +26 Ripley St #5444 +39828 Abbott Rd +2495 Beach Blvd #557 +3 Bustleton Ave +7 N 4th St +1 National Plac #6619 +248 Academy Rd +2 State Hwy +6 W Cornelia Ave +461 S Fannin Ave +51255 Tea Town Rd #9 +93 Bloomfield Ave #829 +5775 Mechanic St #517 +3 Industrial Blvd +8202 Cornwall Rd +53597 W Clarendon Ave +577 Cleveland Ave +259 1st Ave +79 Mechanic St +269 Executive Dr +79 Runamuck Pl +31 Guilford Rd #7904 +504 Steve Dr +407 E 57th Ave +72 W Ripley Ave +75 Elm Rd #1190 +32 Broadway St +41 Washington Blvd +5 Buford Hwy Ne #3 +6 Flex Ave +21058 Massillon Rd +28465 Downey Ave #4238 +2803 N Catalina Ave +22 Livingston Ave +403 Conn Valley Rd +5400 Market St \ No newline at end of file diff --git a/src/main/resources/sampledata/~act/suburb.list b/src/main/resources/sampledata/~act/suburb.list new file mode 100644 index 000000000..b779cafb6 --- /dev/null +++ b/src/main/resources/sampledata/~act/suburb.list @@ -0,0 +1,500 @@ +Leith +Proston +Hamel +Talmalmo +Lane Cove +Cartmeticup +Nyamup +Bendick Murrell +Purrawunda +Blanchetown +Rockside +Rosegarland +Ringwood +Maylands +Wooloowin +Arthurville +Mapleton +Tuggerawong +Red Hill +Inverlaw +Eugowra +Kotara Fair +Burpengary +Ellis Beach +Fish Creek +Kennedy +Cape Portland +Warra +Wanguri +Alvie +Wherrol Flat +Placid Hills +Nedlands +Auchenflower +Buninyong +Dangar Island +Sunny Nook +Minden +Tibradden +Clermont +Kadina +Sawtell +East Gosford +Fosterville +Bateau Bay +Glenmoral +Bolivia +East Melbourne +Taringa +Koolan Island +Maleny +Yelverton +Flinders +Empire Bay +Rose Bay North +Macks Creek +East Toowoomba +Bimbijy +Kundabung +Pinnacle +Watsonville +Seaforth +White Hills +Bellangry +Ascot +Stafford Heights +Bygalorie +Boolaroo +Brookhill +Hillston +Ivanhoe East +Caniambo +Myrniong +Woolamai +Wardering +Kukerin +Somers +Wayatinah +Alligator Creek +Camp Mountain +Brandy Creek +Sovereign Hill +Arno Bay +Maffra +Ulverstone +Wattle Hill +Bower +Stonehaven +East Newdegate +Emerald +Katunga +Willunga +Two Rocks +Caldwell +Coppabella +Calala +Nambucca Heads +Mccullys Gap +Toowoomba South +Applecross +Camberwell West +North Perth +Coombell +Pacific Heights +Guildford +Herron +Mirrool +Bundaberg West +Lane Cove +Reservoir +Upper Kedron +Buchan +Beltana +Kingswood +Nicholls Rivulet +Upper Mount Gravatt +Ridgley +Tubbut +Collingullie +Munno Para +Tyagarah +Redgate +Modewarre +Stirling Range National Park +Trowutta +Rouse Hill +Wyandra +Goondi Hill +Hill River +Fairview Park +Bar Beach +University Of Tasmania +Regent West +Oxley +Don +Nyora +Croydon +Scottsdale +Montrose +Oak Park +Nailsworth +Tarong +Kensington Park +Ashmore +Granya +Alexandra +Wirrulla +Weymouth +Summer Hill +Shailer Park +Bell +Licola +Walyormouring +Boronia +Baddaginnie +Berrilee +Barmaryee +Longford +Simson +Killabakh +Paluma +Barnawartha +Holwell +Combienbar +Port Adelaide +Klemzig +Emu Park +Travancore +Whetstone +Corella +Humpty Doo +Goode Beach +Heidelberg Rgh +Waterloo +Minyip +Hunchy +Grosvenor Place +Pacific Paradise +Hungerford +Boya +Elizabeth West +Gumly Gumly +Wilmington +Pagewood +Tawonga +Hamlyn Heights +Southtown +East Bowes +Blue Haven +Cramphorne +Beelbi Creek +Tanbar +Ringwood +Battery Point +Milton +Laura +Kidman Park +Woodville +Pedler Creek +Muckleford South +Sydney South +Bandy Creek +Carwarp +Eltham +Doncaster East +Welbungin +Shenton Park +Girraween +Woronora +Woodbury +Lee Point +Baranduda +Police Point +Williamstown +Civic Square +Taragoola +Charleston +Kealy +Lillimur +Officer +Lilli Pilli +Blue Rocks +Westminster +Karama +Ocean Shores +Eastwood +Gloucester +Heidelberg Rgh +The Risk +Yanco +Port Fairy +Queenton +Watercarrin +Yeppoon +Bobalong +Wurdiboluc +North Dandalup +Seddon +Hindmarsh +Julia Creek +Salter Point +Lilydale +Tea Gardens +Oxley +Yallah +Cavendish +Condobolin +West Tamworth +Campsie +Merrylands +Townsville Milpo +Runnymede +Coominya +Aroona +Duramana +Saltwater River +Bluff +Kingaroy +Nangetty +Uarbry +Cudgera Creek +East Nanango +Oakleigh South +Gununa +Salamander Bay +Bundaberg North +Middleton +Eaglemont +Premer +Trott Park +Boynewood +Maraylya +Wayville +Burnside +Daradgee +Weetulta +Auburn +South Hobart +Forbes +Forest Reefs +Rocklands +Oaklands Park +Buckland Park +Longwood +Varsity Lakes +Appin +Adelaide River +Harris Park +Kallista +Camena +Woodberry +Rocky Gully +Preston Beach +Brigalow +Beermullah +Ridgewood +Bayles +Moorabbin Airport +Waratah West +Cullulleraine +Cairns City +Warding East +North Haven +Cape Paterson +Cabramatta +Kongorong +Digby +Sedan +Braybrook +Inkpen +Gillieston Heights +Neerabup +Mount Martha +Appila +Milton +Etty Bay +Lower Hermitage +Degilbo +Eastern Heights +Normanville +Yorkrakine +Kialla East +Glen Boughton +Ongerup +Clunes +Pierces Creek +Andergrove +Concord West +Bethania +Barooga +Willetton +Stratton +Elimbah +Emerald +Changerup +Varsity Lakes +Durham Downs +Bouvard +Bentley Dc +Thornton +Eagle Farm +Peake +Chippendale +Gorokan +Grevillia +Chatsworth +Bawley Point +Weengallon +Tuggeranong Dc +Dangar Island +Shannon +Greenhills +Cherrybrook +Junee +Tibradden +Tungkillo +Tarawera +Scotts Head +Pakenham Upper +Westerway +Burrier +East Nabawa +Millers Point +Bunya Mountains +Mayfield East +Verges Creek +Hill River +Marshdale +Bundall +Mount Nasura +Parndana +Dripstone +Gnotuk +Yarralumla +Muja +Summerhill +Port Flinders +Wombeyan Caves +Dartnall +Dural +Wandering +Manjimup +Grange +Indented Head +Marla +Mungabunda +Houston +Larrakeyah +Docklands +Gabbadah +Morundah +Trungley Hall +Tawonga +Kingswood +Greenslopes +Grovedale +Elanora +North Fremantle +Fyshwick +Allworth +Kingsway West +Woodford +Breakaway +Gorrie +Koorlong +Wardell +Bongeen +Waverley +Forrest +Gundaroo +North Boyanup +Mouroubra +Flinders University +Crows Nest +Panmure +Bygalorie +Oakhurst +Mandurah East +Daisy Hill +Willetton +Tarnagulla +Steels Creek +Broken Head +Bundaberg West +Port Melbourne +Happy Valley +Benambra +Brockman +Amphitheatre +Penrith +Darke Peak +Mole Creek +Emerald Beach +Logan Village +Coober Pedy +Berowra Heights +Innaloo +Leeman +East Damboring +Kinglake West +Canning Vale +Upper Glastonbury +Caroline Springs +Hunchy +Hamlyn Terrace +Darbys Falls +Pinnacle +Carlsruhe +Paulls Valley +Mirani +Buckland +Mitta Mitta +Boat Harbour Beach +Botany +Scaddan +Lenswood +Farrell Flat +Melrose +Freemans Waterhole +Simpsons Bay +Ripponlea +North Cascade +Ensay +Golden Point +Middle Cove +Waterfront Place +Buraminya +Balnagowan +Lower Cressbrook +Larrakeyah +Middleton +Oak Flats +Orange Hill +Welshpool +Minnenooka +Wagga Wagga South +Wansbrough +Pintharuka +Eumundi +Halton +Glenmore Park +Mccutcheon +Pimpimbudgee +Ilford +Caparra +Duaringa +Weston +Clunes +Oakey +Barton +Lanena +Cora Lynn +Allora +Willow Tree +Keilor Downs +Barringun +Pilliga +Rhodes +Castletown +Turill \ No newline at end of file diff --git a/src/main/resources/tld.list b/src/main/resources/tld.list new file mode 100644 index 000000000..a11fd2da8 --- /dev/null +++ b/src/main/resources/tld.list @@ -0,0 +1,1531 @@ +# Version 2019061500, Last Updated Sat Jun 15 07:07:01 2019 UTC +AAA +AARP +ABARTH +ABB +ABBOTT +ABBVIE +ABC +ABLE +ABOGADO +ABUDHABI +AC +ACADEMY +ACCENTURE +ACCOUNTANT +ACCOUNTANTS +ACO +ACTOR +AD +ADAC +ADS +ADULT +AE +AEG +AERO +AETNA +AF +AFAMILYCOMPANY +AFL +AFRICA +AG +AGAKHAN +AGENCY +AI +AIG +AIGO +AIRBUS +AIRFORCE +AIRTEL +AKDN +AL +ALFAROMEO +ALIBABA +ALIPAY +ALLFINANZ +ALLSTATE +ALLY +ALSACE +ALSTOM +AM +AMERICANEXPRESS +AMERICANFAMILY +AMEX +AMFAM +AMICA +AMSTERDAM +ANALYTICS +ANDROID +ANQUAN +ANZ +AO +AOL +APARTMENTS +APP +APPLE +AQ +AQUARELLE +AR +ARAB +ARAMCO +ARCHI +ARMY +ARPA +ART +ARTE +AS +ASDA +ASIA +ASSOCIATES +AT +ATHLETA +ATTORNEY +AU +AUCTION +AUDI +AUDIBLE +AUDIO +AUSPOST +AUTHOR +AUTO +AUTOS +AVIANCA +AW +AWS +AX +AXA +AZ +AZURE +BA +BABY +BAIDU +BANAMEX +BANANAREPUBLIC +BAND +BANK +BAR +BARCELONA +BARCLAYCARD +BARCLAYS +BAREFOOT +BARGAINS +BASEBALL +BASKETBALL +BAUHAUS +BAYERN +BB +BBC +BBT +BBVA +BCG +BCN +BD +BE +BEATS +BEAUTY +BEER +BENTLEY +BERLIN +BEST +BESTBUY +BET +BF +BG +BH +BHARTI +BI +BIBLE +BID +BIKE +BING +BINGO +BIO +BIZ +BJ +BLACK +BLACKFRIDAY +BLOCKBUSTER +BLOG +BLOOMBERG +BLUE +BM +BMS +BMW +BN +BNL +BNPPARIBAS +BO +BOATS +BOEHRINGER +BOFA +BOM +BOND +BOO +BOOK +BOOKING +BOSCH +BOSTIK +BOSTON +BOT +BOUTIQUE +BOX +BR +BRADESCO +BRIDGESTONE +BROADWAY +BROKER +BROTHER +BRUSSELS +BS +BT +BUDAPEST +BUGATTI +BUILD +BUILDERS +BUSINESS +BUY +BUZZ +BV +BW +BY +BZ +BZH +CA +CAB +CAFE +CAL +CALL +CALVINKLEIN +CAM +CAMERA +CAMP +CANCERRESEARCH +CANON +CAPETOWN +CAPITAL +CAPITALONE +CAR +CARAVAN +CARDS +CARE +CAREER +CAREERS +CARS +CARTIER +CASA +CASE +CASEIH +CASH +CASINO +CAT +CATERING +CATHOLIC +CBA +CBN +CBRE +CBS +CC +CD +CEB +CENTER +CEO +CERN +CF +CFA +CFD +CG +CH +CHANEL +CHANNEL +CHARITY +CHASE +CHAT +CHEAP +CHINTAI +CHRISTMAS +CHROME +CHRYSLER +CHURCH +CI +CIPRIANI +CIRCLE +CISCO +CITADEL +CITI +CITIC +CITY +CITYEATS +CK +CL +CLAIMS +CLEANING +CLICK +CLINIC +CLINIQUE +CLOTHING +CLOUD +CLUB +CLUBMED +CM +CN +CO +COACH +CODES +COFFEE +COLLEGE +COLOGNE +COM +COMCAST +COMMBANK +COMMUNITY +COMPANY +COMPARE +COMPUTER +COMSEC +CONDOS +CONSTRUCTION +CONSULTING +CONTACT +CONTRACTORS +COOKING +COOKINGCHANNEL +COOL +COOP +CORSICA +COUNTRY +COUPON +COUPONS +COURSES +CR +CREDIT +CREDITCARD +CREDITUNION +CRICKET +CROWN +CRS +CRUISE +CRUISES +CSC +CU +CUISINELLA +CV +CW +CX +CY +CYMRU +CYOU +CZ +DABUR +DAD +DANCE +DATA +DATE +DATING +DATSUN +DAY +DCLK +DDS +DE +DEAL +DEALER +DEALS +DEGREE +DELIVERY +DELL +DELOITTE +DELTA +DEMOCRAT +DENTAL +DENTIST +DESI +DESIGN +DEV +DHL +DIAMONDS +DIET +DIGITAL +DIRECT +DIRECTORY +DISCOUNT +DISCOVER +DISH +DIY +DJ +DK +DM +DNP +DO +DOCS +DOCTOR +DODGE +DOG +DOMAINS +DOT +DOWNLOAD +DRIVE +DTV +DUBAI +DUCK +DUNLOP +DUNS +DUPONT +DURBAN +DVAG +DVR +DZ +EARTH +EAT +EC +ECO +EDEKA +EDU +EDUCATION +EE +EG +EMAIL +EMERCK +ENERGY +ENGINEER +ENGINEERING +ENTERPRISES +EPSON +EQUIPMENT +ER +ERICSSON +ERNI +ES +ESQ +ESTATE +ESURANCE +ET +ETISALAT +EU +EUROVISION +EUS +EVENTS +EVERBANK +EXCHANGE +EXPERT +EXPOSED +EXPRESS +EXTRASPACE +FAGE +FAIL +FAIRWINDS +FAITH +FAMILY +FAN +FANS +FARM +FARMERS +FASHION +FAST +FEDEX +FEEDBACK +FERRARI +FERRERO +FI +FIAT +FIDELITY +FIDO +FILM +FINAL +FINANCE +FINANCIAL +FIRE +FIRESTONE +FIRMDALE +FISH +FISHING +FIT +FITNESS +FJ +FK +FLICKR +FLIGHTS +FLIR +FLORIST +FLOWERS +FLY +FM +FO +FOO +FOOD +FOODNETWORK +FOOTBALL +FORD +FOREX +FORSALE +FORUM +FOUNDATION +FOX +FR +FREE +FRESENIUS +FRL +FROGANS +FRONTDOOR +FRONTIER +FTR +FUJITSU +FUJIXEROX +FUN +FUND +FURNITURE +FUTBOL +FYI +GA +GAL +GALLERY +GALLO +GALLUP +GAME +GAMES +GAP +GARDEN +GB +GBIZ +GD +GDN +GE +GEA +GENT +GENTING +GEORGE +GF +GG +GGEE +GH +GI +GIFT +GIFTS +GIVES +GIVING +GL +GLADE +GLASS +GLE +GLOBAL +GLOBO +GM +GMAIL +GMBH +GMO +GMX +GN +GODADDY +GOLD +GOLDPOINT +GOLF +GOO +GOODYEAR +GOOG +GOOGLE +GOP +GOT +GOV +GP +GQ +GR +GRAINGER +GRAPHICS +GRATIS +GREEN +GRIPE +GROCERY +GROUP +GS +GT +GU +GUARDIAN +GUCCI +GUGE +GUIDE +GUITARS +GURU +GW +GY +HAIR +HAMBURG +HANGOUT +HAUS +HBO +HDFC +HDFCBANK +HEALTH +HEALTHCARE +HELP +HELSINKI +HERE +HERMES +HGTV +HIPHOP +HISAMITSU +HITACHI +HIV +HK +HKT +HM +HN +HOCKEY +HOLDINGS +HOLIDAY +HOMEDEPOT +HOMEGOODS +HOMES +HOMESENSE +HONDA +HORSE +HOSPITAL +HOST +HOSTING +HOT +HOTELES +HOTELS +HOTMAIL +HOUSE +HOW +HR +HSBC +HT +HU +HUGHES +HYATT +HYUNDAI +IBM +ICBC +ICE +ICU +ID +IE +IEEE +IFM +IKANO +IL +IM +IMAMAT +IMDB +IMMO +IMMOBILIEN +IN +INC +INDUSTRIES +INFINITI +INFO +ING +INK +INSTITUTE +INSURANCE +INSURE +INT +INTEL +INTERNATIONAL +INTUIT +INVESTMENTS +IO +IPIRANGA +IQ +IR +IRISH +IS +ISELECT +ISMAILI +IST +ISTANBUL +IT +ITAU +ITV +IVECO +JAGUAR +JAVA +JCB +JCP +JE +JEEP +JETZT +JEWELRY +JIO +JLL +JM +JMP +JNJ +JO +JOBS +JOBURG +JOT +JOY +JP +JPMORGAN +JPRS +JUEGOS +JUNIPER +KAUFEN +KDDI +KE +KERRYHOTELS +KERRYLOGISTICS +KERRYPROPERTIES +KFH +KG +KH +KI +KIA +KIM +KINDER +KINDLE +KITCHEN +KIWI +KM +KN +KOELN +KOMATSU +KOSHER +KP +KPMG +KPN +KR +KRD +KRED +KUOKGROUP +KW +KY +KYOTO +KZ +LA +LACAIXA +LADBROKES +LAMBORGHINI +LAMER +LANCASTER +LANCIA +LANCOME +LAND +LANDROVER +LANXESS +LASALLE +LAT +LATINO +LATROBE +LAW +LAWYER +LB +LC +LDS +LEASE +LECLERC +LEFRAK +LEGAL +LEGO +LEXUS +LGBT +LI +LIAISON +LIDL +LIFE +LIFEINSURANCE +LIFESTYLE +LIGHTING +LIKE +LILLY +LIMITED +LIMO +LINCOLN +LINDE +LINK +LIPSY +LIVE +LIVING +LIXIL +LK +LLC +LOAN +LOANS +LOCKER +LOCUS +LOFT +LOL +LONDON +LOTTE +LOTTO +LOVE +LPL +LPLFINANCIAL +LR +LS +LT +LTD +LTDA +LU +LUNDBECK +LUPIN +LUXE +LUXURY +LV +LY +MA +MACYS +MADRID +MAIF +MAISON +MAKEUP +MAN +MANAGEMENT +MANGO +MAP +MARKET +MARKETING +MARKETS +MARRIOTT +MARSHALLS +MASERATI +MATTEL +MBA +MC +MCKINSEY +MD +ME +MED +MEDIA +MEET +MELBOURNE +MEME +MEMORIAL +MEN +MENU +MERCKMSD +METLIFE +MG +MH +MIAMI +MICROSOFT +MIL +MINI +MINT +MIT +MITSUBISHI +MK +ML +MLB +MLS +MM +MMA +MN +MO +MOBI +MOBILE +MOBILY +MODA +MOE +MOI +MOM +MONASH +MONEY +MONSTER +MOPAR +MORMON +MORTGAGE +MOSCOW +MOTO +MOTORCYCLES +MOV +MOVIE +MOVISTAR +MP +MQ +MR +MS +MSD +MT +MTN +MTR +MU +MUSEUM +MUTUAL +MV +MW +MX +MY +MZ +NA +NAB +NADEX +NAGOYA +NAME +NATIONWIDE +NATURA +NAVY +NBA +NC +NE +NEC +NET +NETBANK +NETFLIX +NETWORK +NEUSTAR +NEW +NEWHOLLAND +NEWS +NEXT +NEXTDIRECT +NEXUS +NF +NFL +NG +NGO +NHK +NI +NICO +NIKE +NIKON +NINJA +NISSAN +NISSAY +NL +NO +NOKIA +NORTHWESTERNMUTUAL +NORTON +NOW +NOWRUZ +NOWTV +NP +NR +NRA +NRW +NTT +NU +NYC +NZ +OBI +OBSERVER +OFF +OFFICE +OKINAWA +OLAYAN +OLAYANGROUP +OLDNAVY +OLLO +OM +OMEGA +ONE +ONG +ONL +ONLINE +ONYOURSIDE +OOO +OPEN +ORACLE +ORANGE +ORG +ORGANIC +ORIGINS +OSAKA +OTSUKA +OTT +OVH +PA +PAGE +PANASONIC +PARIS +PARS +PARTNERS +PARTS +PARTY +PASSAGENS +PAY +PCCW +PE +PET +PF +PFIZER +PG +PH +PHARMACY +PHD +PHILIPS +PHONE +PHOTO +PHOTOGRAPHY +PHOTOS +PHYSIO +PIAGET +PICS +PICTET +PICTURES +PID +PIN +PING +PINK +PIONEER +PIZZA +PK +PL +PLACE +PLAY +PLAYSTATION +PLUMBING +PLUS +PM +PN +PNC +POHL +POKER +POLITIE +PORN +POST +PR +PRAMERICA +PRAXI +PRESS +PRIME +PRO +PROD +PRODUCTIONS +PROF +PROGRESSIVE +PROMO +PROPERTIES +PROPERTY +PROTECTION +PRU +PRUDENTIAL +PS +PT +PUB +PW +PWC +PY +QA +QPON +QUEBEC +QUEST +QVC +RACING +RADIO +RAID +RE +READ +REALESTATE +REALTOR +REALTY +RECIPES +RED +REDSTONE +REDUMBRELLA +REHAB +REISE +REISEN +REIT +RELIANCE +REN +RENT +RENTALS +REPAIR +REPORT +REPUBLICAN +REST +RESTAURANT +REVIEW +REVIEWS +REXROTH +RICH +RICHARDLI +RICOH +RIGHTATHOME +RIL +RIO +RIP +RMIT +RO +ROCHER +ROCKS +RODEO +ROGERS +ROOM +RS +RSVP +RU +RUGBY +RUHR +RUN +RW +RWE +RYUKYU +SA +SAARLAND +SAFE +SAFETY +SAKURA +SALE +SALON +SAMSCLUB +SAMSUNG +SANDVIK +SANDVIKCOROMANT +SANOFI +SAP +SARL +SAS +SAVE +SAXO +SB +SBI +SBS +SC +SCA +SCB +SCHAEFFLER +SCHMIDT +SCHOLARSHIPS +SCHOOL +SCHULE +SCHWARZ +SCIENCE +SCJOHNSON +SCOR +SCOT +SD +SE +SEARCH +SEAT +SECURE +SECURITY +SEEK +SELECT +SENER +SERVICES +SES +SEVEN +SEW +SEX +SEXY +SFR +SG +SH +SHANGRILA +SHARP +SHAW +SHELL +SHIA +SHIKSHA +SHOES +SHOP +SHOPPING +SHOUJI +SHOW +SHOWTIME +SHRIRAM +SI +SILK +SINA +SINGLES +SITE +SJ +SK +SKI +SKIN +SKY +SKYPE +SL +SLING +SM +SMART +SMILE +SN +SNCF +SO +SOCCER +SOCIAL +SOFTBANK +SOFTWARE +SOHU +SOLAR +SOLUTIONS +SONG +SONY +SOY +SPACE +SPORT +SPOT +SPREADBETTING +SR +SRL +SRT +SS +ST +STADA +STAPLES +STAR +STARHUB +STATEBANK +STATEFARM +STC +STCGROUP +STOCKHOLM +STORAGE +STORE +STREAM +STUDIO +STUDY +STYLE +SU +SUCKS +SUPPLIES +SUPPLY +SUPPORT +SURF +SURGERY +SUZUKI +SV +SWATCH +SWIFTCOVER +SWISS +SX +SY +SYDNEY +SYMANTEC +SYSTEMS +SZ +TAB +TAIPEI +TALK +TAOBAO +TARGET +TATAMOTORS +TATAR +TATTOO +TAX +TAXI +TC +TCI +TD +TDK +TEAM +TECH +TECHNOLOGY +TEL +TELEFONICA +TEMASEK +TENNIS +TEVA +TF +TG +TH +THD +THEATER +THEATRE +TIAA +TICKETS +TIENDA +TIFFANY +TIPS +TIRES +TIROL +TJ +TJMAXX +TJX +TK +TKMAXX +TL +TM +TMALL +TN +TO +TODAY +TOKYO +TOOLS +TOP +TORAY +TOSHIBA +TOTAL +TOURS +TOWN +TOYOTA +TOYS +TR +TRADE +TRADING +TRAINING +TRAVEL +TRAVELCHANNEL +TRAVELERS +TRAVELERSINSURANCE +TRUST +TRV +TT +TUBE +TUI +TUNES +TUSHU +TV +TVS +TW +TZ +UA +UBANK +UBS +UCONNECT +UG +UK +UNICOM +UNIVERSITY +UNO +UOL +UPS +US +UY +UZ +VA +VACATIONS +VANA +VANGUARD +VC +VE +VEGAS +VENTURES +VERISIGN +VERSICHERUNG +VET +VG +VI +VIAJES +VIDEO +VIG +VIKING +VILLAS +VIN +VIP +VIRGIN +VISA +VISION +VISTAPRINT +VIVA +VIVO +VLAANDEREN +VN +VODKA +VOLKSWAGEN +VOLVO +VOTE +VOTING +VOTO +VOYAGE +VU +VUELOS +WALES +WALMART +WALTER +WANG +WANGGOU +WARMAN +WATCH +WATCHES +WEATHER +WEATHERCHANNEL +WEBCAM +WEBER +WEBSITE +WED +WEDDING +WEIBO +WEIR +WF +WHOSWHO +WIEN +WIKI +WILLIAMHILL +WIN +WINDOWS +WINE +WINNERS +WME +WOLTERSKLUWER +WOODSIDE +WORK +WORKS +WORLD +WOW +WS +WTC +WTF +XBOX +XEROX +XFINITY +XIHUAN +XIN +XN--11B4C3D +XN--1CK2E1B +XN--1QQW23A +XN--2SCRJ9C +XN--30RR7Y +XN--3BST00M +XN--3DS443G +XN--3E0B707E +XN--3HCRJ9C +XN--3OQ18VL8PN36A +XN--3PXU8K +XN--42C2D9A +XN--45BR5CYL +XN--45BRJ9C +XN--45Q11C +XN--4GBRIM +XN--54B7FTA0CC +XN--55QW42G +XN--55QX5D +XN--5SU34J936BGSG +XN--5TZM5G +XN--6FRZ82G +XN--6QQ986B3XL +XN--80ADXHKS +XN--80AO21A +XN--80AQECDR1A +XN--80ASEHDB +XN--80ASWG +XN--8Y0A063A +XN--90A3AC +XN--90AE +XN--90AIS +XN--9DBQ2A +XN--9ET52U +XN--9KRT00A +XN--B4W605FERD +XN--BCK1B9A5DRE4C +XN--C1AVG +XN--C2BR7G +XN--CCK2B3B +XN--CG4BKI +XN--CLCHC0EA0B2G2A9GCD +XN--CZR694B +XN--CZRS0T +XN--CZRU2D +XN--D1ACJ3B +XN--D1ALF +XN--E1A4C +XN--ECKVDTC9D +XN--EFVY88H +XN--ESTV75G +XN--FCT429K +XN--FHBEI +XN--FIQ228C5HS +XN--FIQ64B +XN--FIQS8S +XN--FIQZ9S +XN--FJQ720A +XN--FLW351E +XN--FPCRJ9C3D +XN--FZC2C9E2C +XN--FZYS8D69UVGM +XN--G2XX48C +XN--GCKR3F0F +XN--GECRJ9C +XN--GK3AT1E +XN--H2BREG3EVE +XN--H2BRJ9C +XN--H2BRJ9C8C +XN--HXT814E +XN--I1B6B1A6A2E +XN--IMR513N +XN--IO0A7I +XN--J1AEF +XN--J1AMH +XN--J6W193G +XN--JLQ61U9W7B +XN--JVR189M +XN--KCRX77D1X4A +XN--KPRW13D +XN--KPRY57D +XN--KPU716F +XN--KPUT3I +XN--L1ACC +XN--LGBBAT1AD8J +XN--MGB9AWBF +XN--MGBA3A3EJT +XN--MGBA3A4F16A +XN--MGBA7C0BBN0A +XN--MGBAAKC7DVF +XN--MGBAAM7A8H +XN--MGBAB2BD +XN--MGBAH1A3HJKRD +XN--MGBAI9AZGQP6J +XN--MGBAYH7GPA +XN--MGBB9FBPOB +XN--MGBBH1A +XN--MGBBH1A71E +XN--MGBC0A9AZCG +XN--MGBCA7DZDO +XN--MGBERP4A5D4AR +XN--MGBGU82A +XN--MGBI4ECEXP +XN--MGBPL2FH +XN--MGBT3DHD +XN--MGBTX2B +XN--MGBX4CD0AB +XN--MIX891F +XN--MK1BU44C +XN--MXTQ1M +XN--NGBC5AZD +XN--NGBE9E0A +XN--NGBRX +XN--NODE +XN--NQV7F +XN--NQV7FS00EMA +XN--NYQY26A +XN--O3CW4H +XN--OGBPF8FL +XN--OTU796D +XN--P1ACF +XN--P1AI +XN--PBT977C +XN--PGBS0DH +XN--PSSY2U +XN--Q9JYB4C +XN--QCKA1PMC +XN--QXAM +XN--RHQV96G +XN--ROVU88B +XN--RVC1E0AM3E +XN--S9BRJ9C +XN--SES554G +XN--T60B56A +XN--TCKWE +XN--TIQ49XQYJ +XN--UNUP4Y +XN--VERMGENSBERATER-CTB +XN--VERMGENSBERATUNG-PWB +XN--VHQUV +XN--VUQ861B +XN--W4R85EL8FHU5DNRA +XN--W4RS40L +XN--WGBH1C +XN--WGBL6A +XN--XHQ521B +XN--XKC2AL3HYE2A +XN--XKC2DL3A5EE0H +XN--Y9A3AQ +XN--YFRO4I67O +XN--YGBI2AMMX +XN--ZFR164B +XXX +XYZ +YACHTS +YAHOO +YAMAXUN +YANDEX +YE +YODOBASHI +YOGA +YOKOHAMA +YOU +YOUTUBE +YT +YUN +ZA +ZAPPOS +ZARA +ZERO +ZIP +ZM +ZONE +ZUERICH +ZW diff --git a/src/test/java/act/ActTestBase.java b/src/test/java/act/ActTestBase.java index d3bb90239..ca02b897b 100644 --- a/src/test/java/act/ActTestBase.java +++ b/src/test/java/act/ActTestBase.java @@ -20,6 +20,11 @@ * #L% */ +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.argThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + import act.app.ActionContext; import act.app.App; import act.app.SingletonRegistry; @@ -30,6 +35,7 @@ import act.route.Router; import act.session.SessionManager; import act.util.ClassNames; +import act.util.IdGenerator; import org.junit.Ignore; import org.junit.runner.JUnitCore; import org.mockito.Matchers; @@ -37,6 +43,7 @@ import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; import org.osgl.$; +import org.osgl.cache.CacheService; import org.osgl.http.H; import org.osgl.util.FastStr; import org.osgl.util.IO; @@ -47,11 +54,6 @@ import java.io.InputStream; import java.lang.reflect.Field; -import static org.mockito.Matchers.any; -import static org.mockito.Matchers.argThat; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - @Ignore public class ActTestBase extends TestBase { @@ -87,9 +89,12 @@ public static File root() { protected EventBus mockEventBus; protected H.Request mockReq; protected ActResponse mockResp; + protected CacheService mockCacheService; + protected IdGenerator idGenerator; protected void setup() throws Exception { initActMetricPlugin(); + idGenerator = new IdGenerator(); mockApp = mock(App.class); Field f = App.class.getDeclaredField("INST"); f.setAccessible(true); @@ -109,13 +114,15 @@ protected void setup() throws Exception { when(mockApp.config()).thenReturn(mockAppConfig); when(mockApp.router()).thenReturn(mockRouter); when(mockApp.router(Matchers.same(""))).thenReturn(mockRouter); + when(mockApp.cuid()).thenReturn(idGenerator.genId()); + mockCacheService = mock(CacheService.class); when(mockApp.getInstance(any(Class.class))).thenAnswer(new Answer() { @Override public Object answer(InvocationOnMock invocation) throws Throwable { Object[] args = invocation.getArguments(); Class cls = (Class) args[0]; if (SessionManager.class == cls) { - return new SessionManager(mockAppConfig); + return new SessionManager(mockAppConfig, mockCacheService); } return $.newInstance((Class)args[0]); } diff --git a/src/test/java/act/MockRequest.java b/src/test/java/act/MockRequest.java index dacf6d101..e42d91079 100644 --- a/src/test/java/act/MockRequest.java +++ b/src/test/java/act/MockRequest.java @@ -50,6 +50,11 @@ public Iterable headers(String name) { return null; } + @Override + public Iterable headerNames() { + return null; + } + @Override public H.Format accept() { return super.accept(); diff --git a/src/test/java/act/MockResponse.java b/src/test/java/act/MockResponse.java index c71d4b68e..c788dc98f 100644 --- a/src/test/java/act/MockResponse.java +++ b/src/test/java/act/MockResponse.java @@ -84,7 +84,7 @@ public MockResponse writeContent(ByteBuffer byteBuffer) { } @Override - public void commit() { + protected void doCommit() { } diff --git a/src/test/java/act/TestServerBootstrapClassLoader.java b/src/test/java/act/TestServerBootstrapClassLoader.java index 32d6cb650..427adda1b 100644 --- a/src/test/java/act/TestServerBootstrapClassLoader.java +++ b/src/test/java/act/TestServerBootstrapClassLoader.java @@ -51,6 +51,10 @@ protected byte[] tryLoadResource(String name) { @Override protected URL findResource(String name) { - return Thread.currentThread().getContextClassLoader().getResource(name); + ClassLoader cl = Thread.currentThread().getContextClassLoader(); + if (cl == this) { + cl = Act.class.getClassLoader(); + } + return cl.getResource(name); } } diff --git a/src/test/java/act/conf/AutoConfigPluginTest.java b/src/test/java/act/conf/AutoConfigPluginTest.java index 820d46a55..82072df1b 100644 --- a/src/test/java/act/conf/AutoConfigPluginTest.java +++ b/src/test/java/act/conf/AutoConfigPluginTest.java @@ -69,6 +69,7 @@ public void before() throws Exception { resolverManager = new StringValueResolverManager(mockApp); when(mockApp.resolverManager()).thenReturn(resolverManager); injector = new GenieInjector(mockApp); + injector.unlock(); when(mockApp.injector()).thenReturn(injector); GenericPluginManager pluginManager = mock(GenericPluginManager.class); diff --git a/src/test/java/act/conf/ConfigKeyHelperTest.java b/src/test/java/act/conf/ConfigKeyHelperTest.java index 5fd443226..ca39dde2e 100644 --- a/src/test/java/act/conf/ConfigKeyHelperTest.java +++ b/src/test/java/act/conf/ConfigKeyHelperTest.java @@ -110,11 +110,11 @@ public void fetchFromSysEnv() { } @Test - public void testVariableEvaluaation() { + public void testVariableEvaluation() { put("foo.bar", "123"); put("xyz", "aaa"); - put("p1", "abc${foo.bar}/xyz/${xyz}/ddd"); - eq("abc123/xyz/aaa/ddd", helper.getConfiguration("p1", null, conf)); + put("p", "abc${foo.bar}/xyz/${xyz}/ddd"); + eq("abc123/xyz/aaa/ddd", helper.getConfiguration("p", null, conf)); } @Test diff --git a/src/test/java/act/controller/bytecode/ControllerByteCodeScannerTest.java b/src/test/java/act/controller/bytecode/ControllerByteCodeScannerTest.java index 997f8393c..368c91981 100644 --- a/src/test/java/act/controller/bytecode/ControllerByteCodeScannerTest.java +++ b/src/test/java/act/controller/bytecode/ControllerByteCodeScannerTest.java @@ -20,10 +20,13 @@ * #L% */ +import static act.route.RouteSource.ACTION_ANNOTATION; +import static org.mockito.Matchers.anyString; +import static org.mockito.Mockito.*; +import static org.osgl.http.H.Method.*; + import act.ActTestBase; -import act.app.AppByteCodeScanner; -import act.app.AppCodeScannerManager; -import act.app.TestingAppClassLoader; +import act.app.*; import act.asm.Type; import act.controller.meta.*; import act.event.EventBus; @@ -33,15 +36,11 @@ import act.route.RouteSource; import act.util.ClassInfoRepository; import act.util.Files; -import org.junit.Before; -import org.junit.Ignore; -import org.junit.Test; +import org.junit.*; import org.mockito.internal.verification.Times; import org.osgl.$; import org.osgl.http.H; -import org.osgl.util.C; -import org.osgl.util.E; -import org.osgl.util.S; +import org.osgl.util.*; import playground.EmailBinder; import testapp.controller.*; import testapp.model.ModelController; @@ -50,11 +49,6 @@ import java.io.File; import java.util.List; -import static act.route.RouteSource.ACTION_ANNOTATION; -import static org.mockito.Matchers.anyString; -import static org.mockito.Mockito.*; -import static org.osgl.http.H.Method.*; - public class ControllerByteCodeScannerTest extends ActTestBase { private ControllerClassMetaInfoManager infoSrc; @@ -117,6 +111,7 @@ public void testNotRoutedActionScan() { @Test public void testRoutedActionScan() { when(mockRouter.isActionMethod("testapp.controller.WithAppContext", "foo")).thenReturn(true); + when(mockApp.isRoutedActionMethod("testapp.controller.WithAppContext", "foo")).thenReturn(true); scan(WithAppContext.class); ActionMethodMetaInfo action = action("WithAppContext", "foo"); assertNotNull(action); diff --git a/src/test/java/act/data/DataPropertyRepositoryTest.java b/src/test/java/act/data/DataPropertyRepositoryTest.java index 8209416cb..1c4c41220 100644 --- a/src/test/java/act/data/DataPropertyRepositoryTest.java +++ b/src/test/java/act/data/DataPropertyRepositoryTest.java @@ -23,6 +23,7 @@ import act.ActTestBase; import org.junit.Before; import org.junit.Test; +import org.osgl.util.S; import testapp.model.Person; import java.util.List; @@ -38,13 +39,33 @@ public void prepare() throws Exception { @Test public void test() { - List ls = repo.propertyListOf(Person.class); - yes(ls.contains("firstName")); - yes(ls.contains("lastName")); - yes(ls.contains("age")); - yes(ls.contains("address.streetNo")); - yes(ls.contains("address.streetName")); - yes(ls.contains("address.city")); + List ls = repo.propertyListOf(Person.class); + yes(containsField(ls, "firstName")); + yes(containsLabel(ls, "First name")); + yes(containsField(ls, "lastName")); + no(containsLabel(ls, "Last name")); + yes(containsField(ls, "age")); + yes(containsField(ls, "address.streetNo")); + yes(containsField(ls, "address.streetName")); + yes(containsField(ls, "address.city")); + } + + private boolean containsLabel(List pairs, String field) { + for (S.Pair pair : pairs) { + if (S.eq(pair._2, field)) { + return true; + } + } + return false; + } + + private boolean containsField(List pairs, String field) { + for (S.Pair pair : pairs) { + if (S.eq(pair._1, field)) { + return true; + } + } + return false; } } diff --git a/src/test/java/act/handler/builtin/StaticFileGetterTest.java b/src/test/java/act/handler/builtin/StaticFileGetterTest.java index d69b0a515..493456ad5 100644 --- a/src/test/java/act/handler/builtin/StaticFileGetterTest.java +++ b/src/test/java/act/handler/builtin/StaticFileGetterTest.java @@ -39,6 +39,7 @@ import static org.mockito.Mockito.when; public class StaticFileGetterTest extends ActTestBase { + RequestImplBase req; ActionContext ctx; MockResponse resp; FileGetter pathHandler; @@ -57,17 +58,18 @@ public File answer(InvocationOnMock invocation) throws Throwable { } }); when(mockAppConfig.errorTemplatePathResolver()).thenCallRealMethod(); - RequestImplBase req = mock(RequestImplBase.class); + req = mock(RequestImplBase.class); when(req.method()).thenReturn(H.Method.GET); ctx = ActionContext.create(mockApp, req, resp); when(req.context()).thenReturn(ctx); + when(req.accept()).thenReturn(H.Format.HTML); pathHandler = new FileGetter("/public", mockApp); fileHandler = new FileGetter("/public/foo/bar.txt", mockApp); + ctx.saveLocal(); } @Test public void invokePathHandlerOnNonExistingResource() { - when(ctx.accept()).thenReturn(H.Format.HTML); ctx.param(ParamNames.PATH, "/some/where/non_exists.txt"); pathHandler.handle(ctx); eq(resp.status, 404); diff --git a/src/test/java/act/inject/util/LoadResourceTest.java b/src/test/java/act/inject/util/LoadResourceTest.java index 02aba32e5..02bd479f5 100644 --- a/src/test/java/act/inject/util/LoadResourceTest.java +++ b/src/test/java/act/inject/util/LoadResourceTest.java @@ -24,10 +24,12 @@ import org.junit.Test; import org.osgl.inject.Genie; import org.osgl.util.C; +import org.osgl.util.Keyword; import osgl.ut.TestBase; import java.nio.ByteBuffer; import java.util.List; +import java.util.Map; public class LoadResourceTest extends TestBase { @@ -48,6 +50,18 @@ public static class TestBed { @LoadResource("public/foo/foo.list") private byte[] ba; + @LoadResource("public/foo/matrix.txt") + private int[][] intMatrix; + + @LoadResource("public/foo/str_matrix.txt") + private String[][] strMatrix; + + @LoadResource("tags") + private Map tagsByString; + + @LoadResource("tags") + private Map tagsByKeyword; + } Genie genie = Genie.createWithoutPlugins(); @@ -83,5 +97,25 @@ public void testByteArray() { eq("line1\nline2", new String(testBed.ba)); } + @Test + public void testIntMatrix() { + eq(4, testBed.intMatrix[1][1]); + } + + @Test + public void testStrMatrix() { + eq("yesterday", testBed.strMatrix[1][1]); + } + @Test + public void testTagsByString() { + eq("foo_tag", testBed.tagsByString.get("foo")); + eq("bar_tag", testBed.tagsByString.get("bar")); + } + + @Test + public void testTagsByKeyword() { + eq("foo_tag", testBed.tagsByKeyword.get(Keyword.of("foo"))); + eq("bar_tag", testBed.tagsByKeyword.get(Keyword.of("bar"))); + } } diff --git a/src/test/java/act/route/MockRequest.java b/src/test/java/act/route/MockRequest.java index bc2d526ff..60bb97f04 100644 --- a/src/test/java/act/route/MockRequest.java +++ b/src/test/java/act/route/MockRequest.java @@ -57,6 +57,11 @@ public Iterable headers(String name) { return null; } + @Override + public Iterable headerNames() { + return null; + } + @Override public String path() { return url; diff --git a/src/test/java/act/route/MockResponse.java b/src/test/java/act/route/MockResponse.java index 5e34562af..19197e26b 100644 --- a/src/test/java/act/route/MockResponse.java +++ b/src/test/java/act/route/MockResponse.java @@ -89,7 +89,7 @@ public MockResponse writeContent(ByteBuffer buffer) { } @Override - public void commit() { + protected void doCommit() { } diff --git a/src/test/java/act/route/RouterTest.java b/src/test/java/act/route/RouterTest.java index f46765f00..bbccb7093 100644 --- a/src/test/java/act/route/RouterTest.java +++ b/src/test/java/act/route/RouterTest.java @@ -104,6 +104,27 @@ public void testGH561_extended3() { router.addMapping(GET, "/foo/{<[0-9]{4}>y}/b", "Foo.foo", RouteSource.ACTION_ANNOTATION); } + @Test + public void testGH939_1() { + router.addMapping(GET, "/foo/~FooBar~", controller, RouteSource.ACTION_ANNOTATION); + router.getInvoker(GET, "/foo/foo-bar", ctx).handle(ctx); + controllerInvoked(); + } + + @Test + public void testGH939_2() { + router.addMapping(GET, "/foo/~FooBar~/{x}", controller, RouteSource.ACTION_ANNOTATION); + router.getInvoker(GET, "/foo/foo-bar/xyz", ctx).handle(ctx); + controllerInvoked(); + } + + @Test + public void testGH958() { + router.addMapping(GET, "/foo/~FooBar~/x", controller, RouteSource.ACTION_ANNOTATION); + router.getInvoker(GET, "/foo/foo-bar/x", ctx).handle(ctx); + controllerInvoked(); + } + @Test public void searchRoot() { router.addMapping(GET, "/", controller); @@ -237,7 +258,7 @@ public void searchPartialUrl() { router.addMapping(GET, "/public", staticDirHandler); router.getInvoker(GET, "/public/foo/bar.txt", ctx).handle(ctx); verify(staticDirHandler).handle(ctx); - verify(ctx).param(ParamNames.PATH, "/foo/bar.txt"); + verify(ctx).param(ParamNames.PATH, "foo/bar.txt"); } @Test diff --git a/src/test/java/act/route/RouterTestBase.java b/src/test/java/act/route/RouterTestBase.java index d4fdedbe1..d62ec6909 100644 --- a/src/test/java/act/route/RouterTestBase.java +++ b/src/test/java/act/route/RouterTestBase.java @@ -32,6 +32,7 @@ import org.junit.BeforeClass; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; +import org.osgl.util.S; import java.io.File; import java.lang.reflect.Field; @@ -50,6 +51,7 @@ public static void prepareClass() throws Exception { AppConfig config = appConfig(); app = mock(App.class); when(app.config()).thenReturn(config); + when(app.cuid()).thenReturn(S.random()); when(app.file(anyString())).thenAnswer(new Answer() { @Override public File answer(InvocationOnMock invocation) throws Throwable { diff --git a/src/test/java/act/test/controller/CourseService.java b/src/test/java/act/test/controller/CourseService.java new file mode 100644 index 000000000..3fb313d80 --- /dev/null +++ b/src/test/java/act/test/controller/CourseService.java @@ -0,0 +1,39 @@ +package act.test.controller; + +/*- + * #%L + * ACT E2E Plugin + * %% + * Copyright (C) 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.controller.annotation.UrlContext; +import act.test.model.Course; +import org.osgl.mvc.annotation.PostAction; +import org.osgl.util.N; + +import javax.validation.Valid; + +@UrlContext("courses") +public class CourseService { + + @PostAction + public Course create(@Valid Course course) { + course.id = N.randInt(); + return course; + } + +} diff --git a/src/test/java/act/test/model/Course.java b/src/test/java/act/test/model/Course.java new file mode 100644 index 000000000..9cba434b6 --- /dev/null +++ b/src/test/java/act/test/model/Course.java @@ -0,0 +1,35 @@ +package act.test.model; + +/*- + * #%L + * ACT E2E Plugin + * %% + * Copyright (C) 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.data.annotation.Data; +import act.util.SimpleBean; +import act.validation.NotBlank; + +@Data +public class Course implements SimpleBean { + + public int id; + + @NotBlank + public String name; + +} diff --git a/src/test/java/act/test/model/User.java b/src/test/java/act/test/model/User.java new file mode 100644 index 000000000..1e26b7356 --- /dev/null +++ b/src/test/java/act/test/model/User.java @@ -0,0 +1,40 @@ +package act.test.model; + +/*- + * #%L + * ACT E2E Plugin + * %% + * Copyright (C) 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.data.annotation.Data; +import act.util.SimpleBean; +import org.joda.time.DateTime; + +import java.util.List; + +@Data +public class User implements SimpleBean { + + public int id; + + public String name; + + public DateTime birthday; + + public List courses; + +} diff --git a/src/test/java/act/test/util/AssertTest.java b/src/test/java/act/test/util/AssertTest.java new file mode 100644 index 000000000..e96513cf3 --- /dev/null +++ b/src/test/java/act/test/util/AssertTest.java @@ -0,0 +1,40 @@ +package act.test.util; + +/*- + * #%L + * ACT E2E Plugin + * %% + * Copyright (C) 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.test.verifier.Eq; +import org.junit.Test; +import org.osgl.$; +import org.rythmengine.utils.S; +import osgl.ut.TestBase; + +public class AssertTest extends TestBase { + + @Test + public void cloneShallNotBeIdenticalToOrigin() { + Eq eq = new Eq(); + eq.init(S.random()); + Eq clone = $.cloneOf(eq); + notSame(eq, clone); + eq(eq, clone); + } + +} diff --git a/src/test/java/act/test/util/CompareTypeTest.java b/src/test/java/act/test/util/CompareTypeTest.java new file mode 100644 index 000000000..593208f55 --- /dev/null +++ b/src/test/java/act/test/util/CompareTypeTest.java @@ -0,0 +1,67 @@ +package act.test.util; + +/*- + * #%L + * ACT E2E Plugin + * %% + * Copyright (C) 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import static act.test.verifier.Compare.Type.*; + +import org.junit.Test; +import osgl.ut.TestBase; + +public class CompareTypeTest extends TestBase { + + @Test + public void testGT() { + yes(GT.applyTo(1, 5)); + yes(GT.applyTo("a", "z")); + no(GT.applyTo(1, 1)); + no(GT.applyTo("a", "a")); + } + + @Test + public void testGTE() { + yes(GTE.applyTo(1, 5)); + yes(GTE.applyTo("a", "z")); + yes(GTE.applyTo(1, 1)); + yes(GTE.applyTo("a", "a")); + no(GTE.applyTo(10, 1)); + no(GTE.applyTo("z", "a")); + } + + + @Test + public void testLT() { + yes(LT.applyTo(5, 1)); + yes(LT.applyTo("z", "a")); + no(LT.applyTo(1, 1)); + no(LT.applyTo("a", "a")); + } + + @Test + public void testLTE() { + yes(LTE.applyTo(5, 1)); + yes(LTE.applyTo("z", "a")); + yes(LTE.applyTo(1, 1)); + yes(LTE.applyTo("a", "a")); + no(LTE.applyTo(1, 5)); + no(LTE.applyTo("a", "z")); + } + +} diff --git a/src/test/java/act/test/util/ExistsTest.java b/src/test/java/act/test/util/ExistsTest.java new file mode 100644 index 000000000..2a180e97e --- /dev/null +++ b/src/test/java/act/test/util/ExistsTest.java @@ -0,0 +1,65 @@ +package act.test.util; + +/*- + * #%L + * ACT E2E Plugin + * %% + * Copyright (C) 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.test.verifier.Exists; +import org.junit.Test; +import osgl.ut.TestBase; + +public class ExistsTest extends TestBase { + + @Test + public void nonNullObjectShallExists() { + Exists e = new Exists(); + e.init(true); + yes(e.verify(new Object())); + e.init(false); + no(e.verify(new Object())); + } + + @Test + public void nullObjectShallNotExists() { + Exists e = new Exists(); + e.init("true"); + no(e.verify(null)); + e.init("false"); + yes(e.verify(null)); + } + + @Test + public void nonEmptyStringIsExist() { + Exists e = new Exists(); + e.init("true"); + yes(e.verify(" ")); + e.init("false"); + no(e.verify(" ")); + } + + @Test + public void emptyStringShallNotExists() { + Exists e = new Exists(); + e.init("true"); + no(e.verify("")); + e.init("false"); + yes(e.verify("")); + } + +} diff --git a/src/test/java/act/test/util/FuncTest.java b/src/test/java/act/test/util/FuncTest.java new file mode 100644 index 000000000..f31801455 --- /dev/null +++ b/src/test/java/act/test/util/FuncTest.java @@ -0,0 +1,227 @@ +package act.test.util; + +/*- + * #%L + * ACT E2E Plugin + * %% + * Copyright (C) 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.test.func.Func; +import org.joda.time.DateTime; +import org.joda.time.LocalDate; +import org.junit.Test; +import org.osgl.util.C; +import org.osgl.util.S; +import osgl.ut.TestBase; + +public class FuncTest extends TestBase { + + @Test + public void randOf() { + Func func = new Func.RandomOf(); + func.init(C.list("foo", "bar")); + Object o = func.apply(); + yes(C.setOf("foo", "bar").contains(o)); + } + + @Test + public void randStrWithoutInitVal() { + Func func = new Func.RandomStr(); + Object o = func.apply(); + notNull(o); + yes(o instanceof String); + int len = S.string(o).length(); + yes(len >= 5); + yes(len < 15); + } + + @Test + public void randStrWithValidInitVal() { + Func func = new Func.RandomStr(); + func.init(10); + Object o = func.apply(); + notNull(o); + yes(o instanceof String); + eq(10, S.string(o).length()); + } + + @Test + public void randIntWithoutInitVal() { + Func func = new Func.RandomInt(); + Object o = func.apply(); + notNull(o); + yes(o instanceof Integer); + int i = (Integer) o; + yes(i >= 0); + yes(i < 100); + } + + @Test + public void randIntWithSingleInitVal() { + Func func = new Func.RandomInt(); + func.init(3); + Object o = func.apply(); + notNull(o); + yes(o instanceof Integer); + int i = (Integer) o; + yes(i >= 0); + yes(i < 3); + } + + @Test + public void randIntWithSingleInitVal2() { + Func func = new Func.RandomInt(); + func.init(-3); + Object o = func.apply(); + notNull(o); + yes(o instanceof Integer); + int i = (Integer) o; + yes(i <= 0); + yes(i > -3); + } + + @Test + public void randIntWithTwoInitVals() { + Func func = new Func.RandomInt(); + func.init(C.list("10", "14")); + Object o = func.apply(); + notNull(o); + yes(o instanceof Integer); + int i = (Integer) o; + yes(i >= 10); + yes(i < 14); + } + + @Test + public void randIntWithTwoInitVals2() { + Func func = new Func.RandomInt(); + func.init(C.list("-10", "-14")); + Object o = func.apply(); + notNull(o); + yes(o instanceof Integer); + int i = (Integer) o; + yes(i <= -10); + yes(i > -14); + } + + + @Test + public void randLongWithoutInitVal() { + Func func = new Func.RandomLong(); + Object o = func.apply(); + notNull(o); + yes(o instanceof Long); + long i = (Long) o; + yes(i >= 0); + yes(i < 100000L); + } + + @Test + public void RandLongWithSingleInitVal() { + Func func = new Func.RandomLong(); + func.init(3); + Object o = func.apply(); + notNull(o); + yes(o instanceof Long); + long i = (Long) o; + yes(i >= 0); + yes(i < 3); + } + + @Test + public void RandLongWithSingleInitVal2() { + Func func = new Func.RandomLong(); + func.init(-3); + Object o = func.apply(); + notNull(o); + yes(o instanceof Long); + long i = (Long) o; + yes(i <= 0); + yes(i > -3); + } + + @Test + public void RandLongWithTwoInitVals() { + Func func = new Func.RandomLong(); + func.init(C.list("10", "14")); + Object o = func.apply(); + notNull(o); + yes(o instanceof Long); + long i = (Long) o; + yes(i >= 10); + yes(i < 14); + } + + @Test + public void RandLongWithTwoInitVals2() { + Func func = new Func.RandomLong(); + func.init(C.list("-10", "-14")); + Object o = func.apply(); + notNull(o); + yes(o instanceof Long); + long i = (Long) o; + yes(i <= -10); + yes(i > -14); + } + + @Test + public void testToday() { + Func.Today func = new Func.Today(); + Object obj = func.apply(); + yes(obj instanceof LocalDate); + LocalDate funcToday = (LocalDate) obj; + eq(LocalDate.now(), funcToday); + } + + @Test + public void testTomorrow() { + Func.Tomorrow func = new Func.Tomorrow(); + Object obj = func.apply(); + yes(obj instanceof LocalDate); + LocalDate funcToday = (LocalDate) obj; + eq(LocalDate.now().plusDays(1), funcToday); + } + + @Test + public void testNow() { + Func.Now func = new Func.Now(); + Object obj = func.apply(); + yes(obj instanceof DateTime); + DateTime funcNow = (DateTime) obj; + yes((DateTime.now().getMillis() - funcNow.getMillis()) < 2000); + } + + @Test + public void testNextMinute() { + Func.NextMinute func = new Func.NextMinute(); + Object obj = func.apply(); + yes(obj instanceof DateTime); + DateTime funcNow = (DateTime) obj; + yes((DateTime.now().plusMinutes(1).getMillis() - funcNow.getMillis()) < 2000); + } + + + @Test + public void testNextHour() { + Func.NextHour func = new Func.NextHour(); + Object obj = func.apply(); + yes(obj instanceof DateTime); + DateTime funcNow = (DateTime) obj; + yes((DateTime.now().plusHours(1).getMillis() - funcNow.getMillis()) < 2000); + } + +} diff --git a/src/test/java/act/test/util/GetTimeTest.java b/src/test/java/act/test/util/GetTimeTest.java new file mode 100644 index 000000000..752da7a76 --- /dev/null +++ b/src/test/java/act/test/util/GetTimeTest.java @@ -0,0 +1,105 @@ +package act.test.util; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.test.func.Func; +import org.joda.time.DateTime; +import org.joda.time.format.DateTimeFormat; +import org.joda.time.format.DateTimeFormatter; +import org.junit.Test; +import org.osgl.util.C; +import osgl.ut.TestBase; + +public class GetTimeTest extends TestBase { + + Func.GetTime func; + DateTimeFormatter fmt = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss"); + + @Test + public void testDateTimeAsOneParam() { + init("1986-12-11"); + verifyDate("1986-12-11"); + + init("1/Nov/2012"); + verifyDate("2012-11-1"); + + init("1985-02-02 03:22:11"); + verifyTime("1985-02-02 03:22:11"); + + init("19940723 12:33:10"); + verifyTime("1994-07-23 12:33:10"); + } + + @Test + public void testDeltaAsOneParam() { + init("30s"); + verifyDelta(30); + + init("1min"); + verifyDelta(60); + + init("-3s"); + verifyDelta(-3); + + init("+1h"); + verifyDelta(60 * 60); + } + + @Test + public void testDeltaBeforeDate() { + init("30s", "1986-01-01 11:10:00"); + DateTime dt = fmt.parseDateTime("1986-01-01 11:10:00"); + eq(dt.plusSeconds(30), get()); + } + + @Test + public void testDetalAfterDate() { + init("1986-01-01 11:10:00", "30s"); + DateTime dt = fmt.parseDateTime("1986-01-01 11:10:00"); + eq(dt.plusSeconds(30), get()); + } + + private void init(String ... args) { + func = new Func.GetTime(); + func.init(C.listOf(args)); + } + + private DateTime get() { + return (DateTime) func.apply(); + } + + private void verifyDate(String dateTime) { + DateTimeFormatter fmt = DateTimeFormat.forPattern("yyyy-MM-dd"); + DateTime dt = fmt.parseDateTime(dateTime); + eq(dt, get()); + } + + private void verifyTime(String dateTime) { + DateTime dt = fmt.parseDateTime(dateTime); + yes(1000 > (dt.getMillis() - get().getMillis())); + } + + private void verifyDelta(int seconds) { + DateTime now = DateTime.now().plusSeconds(seconds); + yes((now.getMillis() - get().getMillis()) < 1000); + } + +} diff --git a/src/test/java/act/test/util/JSONTraverserTest.java b/src/test/java/act/test/util/JSONTraverserTest.java new file mode 100644 index 000000000..b8ba517af --- /dev/null +++ b/src/test/java/act/test/util/JSONTraverserTest.java @@ -0,0 +1,81 @@ +package act.test.util; + +/*- + * #%L + * ACT E2E Plugin + * %% + * Copyright (C) 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import static act.test.util.JSONTraverser.traverse; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import org.junit.Before; +import org.junit.Test; +import osgl.ut.TestBase; + +public class JSONTraverserTest extends TestBase { + + public JSONObject simpleObj; + public JSONArray simpleArray; + + public JSONObject fooBar; + public JSONArray complexArray; + + @Before + public void prepare() { + simpleObj = new JSONObject(); + simpleObj.put("foo", "bar"); + simpleObj.put("bar", 10); + + simpleArray = new JSONArray(); + simpleArray.add("foo"); + simpleArray.add(10); + + fooBar = new JSONObject(); + JSONArray bar = new JSONArray(); + bar.add(0, simpleObj); + fooBar.put("bar", bar); + fooBar.put("foo", simpleArray); + complexArray = new JSONArray(); + complexArray.add(0, fooBar); + } + + @Test + public void testSimpleObj() { + eq("bar", traverse(simpleObj, "foo")); + eq(10, traverse(simpleObj, "bar")); + } + + @Test(expected = IllegalArgumentException.class) + public void testSimpleObjFail() { + traverse(simpleObj, "foo.bar"); + } + + @Test + public void testSimpleArray() { + eq("foo", traverse(simpleArray, "0")); + eq(10, traverse(simpleArray, "1")); + } + + @Test + public void testComplexCase() { + eq("foo", traverse(complexArray, "0.foo[0]")); + eq("bar", traverse(complexArray, "[0][bar][0][foo]")); + eq(10, traverse(complexArray, "0.bar.0.bar")); + } +} diff --git a/src/test/java/act/test/util/RequestTemplateManagerTest.java b/src/test/java/act/test/util/RequestTemplateManagerTest.java new file mode 100644 index 000000000..cc2f1ac6e --- /dev/null +++ b/src/test/java/act/test/util/RequestTemplateManagerTest.java @@ -0,0 +1,44 @@ +package act.test.util; + +/*- + * #%L + * ACT E2E Plugin + * %% + * Copyright (C) 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.test.RequestSpec; +import org.junit.Test; + +public class RequestTemplateManagerTest extends TestTestBase { + + @Test + public void test() { + RequestTemplateManager manager = new RequestTemplateManager(); + manager.load(); + RequestSpec spec = manager.getTemplate("global"); + notNull(spec); + eq("last|", spec.headers.get("Authorization")); + isNull(spec.ajax); + isNull(spec.json); + spec = manager.getTemplate("ajax"); + notNull(spec); + eq("last|", spec.headers.get("Authorization")); + yes(spec.ajax); + eq("json", spec.accept); + } + +} diff --git a/src/test/java/act/test/util/ScenarioManagerTest.java b/src/test/java/act/test/util/ScenarioManagerTest.java new file mode 100644 index 000000000..8daf7d3d0 --- /dev/null +++ b/src/test/java/act/test/util/ScenarioManagerTest.java @@ -0,0 +1,98 @@ +package act.test.util; + +/*- + * #%L + * ACT E2E Plugin + * %% + * Copyright (C) 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.Act; +import act.metric.MetricPlugin; +import act.test.*; +import act.test.macro.Macro; +import act.test.req_modifier.RequestModifier; +import act.test.verifier.*; +import org.junit.BeforeClass; +import org.junit.Ignore; +import org.mockito.Mockito; +import org.osgl.$; +import org.osgl.http.H; + +import java.util.Map; + +public class ScenarioManagerTest extends TestTestBase { + + private ScenarioManager loader = new ScenarioManager("act.test.model"); + + @BeforeClass + public static void prepare() { + new Contains().register(); + new Eq().register(); + new Exists().register(); + new Gt().register(); + Test.registerTypeConverters(); + RequestModifier.registerModifiers(); + Macro.registerActions(); + MetricPlugin metricPlugin = Mockito.mock(MetricPlugin.class); + $.setField("metricPlugin", Act.class, metricPlugin); + } + + @org.junit.Test + @Ignore // ResponseSpec now extends from AdaptiveBeanBase which require ActFramework to run up + public void test() { + Map map = loader.load(); + no(map.isEmpty()); + Scenario createTask = map.get("create-task"); + verifyCreateTask(createTask); + String s = createTask.depends.get(0); + Scenario signIn = loader.get(s); + notNull(signIn); + s = signIn.depends.get(0); + Scenario signUp = loader.get(s); + verifySignUp(signUp); + } + + private void verifySignUp(Scenario signUp) { + notNull(signUp); + eq(1, signUp.fixtures.size()); + String fixture = signUp.fixtures.get(0); + eq("init-data.yml", fixture); + eq(1, signUp.interactions.size()); + Interaction interaction = signUp.interactions.get(0); + notNull(interaction); + RequestSpec req = interaction.request; + eq(2, req.modifiers.size()); + RequestModifier json = req.modifiers.get(0); + eq("accept-json", json.toString()); + RequestModifier ip = req.modifiers.get(1); + eq("remote-address: 127.0.0.2", ip.toString()); + eq(H.Method.POST, req.method); + eq("/sign_up", req.url); + eq(3, req.params.size()); + Map params = req.params; + eq("test@123.com", params.get("email")); + eq("abc", params.get("password")); + eq(1, params.get("value")); + ResponseSpec resp = interaction.response; + eq(H.Status.CREATED, resp.status); + } + + private void verifyCreateTask(Scenario createTask) { + notNull(createTask); + } + +} diff --git a/src/test/java/act/test/util/TestTestBase.java b/src/test/java/act/test/util/TestTestBase.java new file mode 100644 index 000000000..7d60647ae --- /dev/null +++ b/src/test/java/act/test/util/TestTestBase.java @@ -0,0 +1,36 @@ +package act.test.util; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.app.App; +import org.junit.BeforeClass; +import org.osgl.$; +import osgl.ut.TestBase; + +public class TestTestBase extends TestBase { + + @BeforeClass + public static void clearActMockup() { + $.setFieldValue("INST", App.class, null); + Thread.currentThread().setContextClassLoader(TestTestBase.class.getClassLoader()); + } + +} diff --git a/src/test/java/act/test/util/YamlLoaderTest.java b/src/test/java/act/test/util/YamlLoaderTest.java new file mode 100644 index 000000000..f9a14b916 --- /dev/null +++ b/src/test/java/act/test/util/YamlLoaderTest.java @@ -0,0 +1,91 @@ +package act.test.util; + +/*- + * #%L + * ACT E2E Plugin + * %% + * Copyright (C) 2018 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import act.Act; +import act.app.DaoLocator; +import act.db.Dao; +import act.test.model.User; +import org.joda.time.DateTime; +import org.junit.Before; +import org.junit.Ignore; +import org.junit.Test; + +import java.util.Map; + +public class YamlLoaderTest extends TestTestBase { + + YamlLoader loader; + DaoLocator daoLocator; + + @Before + public void prepareLoader() { + Act.registerTypeConverters(); + loader = new YamlLoader("act.test.model"); + } + + @Before + public void prepareDaoLocator() { + daoLocator = new DaoLocator() { + @Override + public Dao dao(Class aClass) { + return null; + } + }; + } + + @Test + public void testLoad() { + Map data = loader.loadFixture("init-data.yml", daoLocator); + eq(5, data.size()); + User user = (User) data.get("green"); + notNull(user); + eq("Green Luo", user.name); + eq(1, user.courses.size()); + eq("Maths", user.courses.get(0).name); + assertDate(user.birthday, 1919, 1, 1); + + user = (User) data.get("black"); + notNull(user); + eq("Black Smith", user.name); + eq(2, user.courses.size()); + eq("Maths", user.courses.get(0).name); + eq("History", user.courses.get(1).name); + assertDate(user.birthday, 1818, 2, 2); + + user = (User) data.get("john"); + notNull(user); + eq("John Brad", user.name); + eq(3, user.id); + isNull(user.birthday); + eq(2, user.courses.size()); + eq("Physics", user.courses.get(0).name); + eq("Science", user.courses.get(1).name); + eq(4, user.courses.get(1).id); + } + + private void assertDate(DateTime dt, int y, int m, int d) { + eq(y, dt.getYear()); + eq(m, dt.getMonthOfYear()); + eq(d, dt.getDayOfMonth()); + } + +} diff --git a/src/test/java/act/util/DataTableTest.java b/src/test/java/act/util/DataTableTest.java new file mode 100644 index 000000000..56f739ae8 --- /dev/null +++ b/src/test/java/act/util/DataTableTest.java @@ -0,0 +1,66 @@ +package act.util; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2019 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import org.junit.Test; +import org.osgl.util.N; +import org.osgl.util.S; +import osgl.ut.TestBase; + +public class DataTableTest extends TestBase { + + public static class Foo { + public String name; + public int count; + + public Foo(String name, int count) { + this.name = name; + this.count = count; + } + } + + private static Foo randomFoo() { + String name = S.random(); + int count = N.randInt(); + return new Foo(name, count); + } + + @Test + public void testPojoDataTable() { + Foo foo = randomFoo(); + DataTable fooTable = new DataTable(foo); + eq(2, fooTable.colCount()); + eq(1, fooTable.rowCount()); + Object row = fooTable.iterator().next(); + eq(foo.name, fooTable.val(row, 1)); + eq(foo.count, fooTable.val(row, 0)); + eq(foo.name, fooTable.val(row, "name")); + eq(foo.count, fooTable.val(row, "count")); + + DataTable oofTable = fooTable.transpose(); + eq(2, oofTable.colCount()); + eq(2, oofTable.rowCount()); + row = oofTable.iterator().next(); + eq("count", oofTable.val(row, 0)); + eq(foo.count, oofTable.val(row, "_r0")); + } + +} diff --git a/src/test/java/act/util/FastJsonPropertyPreFilterTest.java b/src/test/java/act/util/FastJsonPropertyPreFilterTest.java index 4a50db1a4..ec369fa3b 100644 --- a/src/test/java/act/util/FastJsonPropertyPreFilterTest.java +++ b/src/test/java/act/util/FastJsonPropertyPreFilterTest.java @@ -27,6 +27,7 @@ import org.junit.BeforeClass; import org.junit.Test; import org.osgl.util.C; +import org.osgl.util.S; import java.util.ArrayList; import java.util.Iterator; @@ -38,7 +39,7 @@ public class FastJsonPropertyPreFilterTest extends ActTestBase { private Foo foo; private Foo foo2; private DataPropertyRepository repo; - private List fooProps; + private List fooProps; @BeforeClass public static void classInit() { @@ -59,7 +60,11 @@ public void prepare() throws Exception { JsonUtilConfig.configure(mockApp); repo = new DataPropertyRepository(mockApp); fooProps = repo.propertyListOf(Foo.class); - filter.setFullPaths(fooProps); + List ls = new ArrayList<>(); + for (S.Pair pair : fooProps) { + ls.add(pair._1); + } + filter.setFullPaths(ls); } @Test @@ -132,7 +137,7 @@ public void remove() { }; } }; - List list = new ArrayList(); + List list = new ArrayList<>(); for (Person p : iterable) { list.add(p); } diff --git a/src/test/java/act/util/StringUtilsTest.java b/src/test/java/act/util/StringUtilsTest.java new file mode 100644 index 000000000..2291dade1 --- /dev/null +++ b/src/test/java/act/util/StringUtilsTest.java @@ -0,0 +1,61 @@ +package act.util; + +/*- + * #%L + * ACT Framework + * %% + * Copyright (C) 2014 - 2019 ActFramework + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import org.junit.BeforeClass; +import org.junit.Test; +import org.osgl.util.S; +import osgl.ut.TestBase; + +public class StringUtilsTest extends TestBase { + + @Test + public void testGH1223() { + String s = "a${f}b${f}c"; + eq("abc", process(s)); + } + + @Test + public void test() { + String s = "${foo}"; + eq("", process(s)); + + s = "abc${foo}"; + eq("abc", process(s)); + + s = "abc${foo}xyz${foo}ijk"; + eq("abcxyzijk", process(s)); + + s = "abc${foo}xyz"; + eq("abcxyz", process(s)); + + s = " + + + +

GH991 - websocket connection not released after closed

+

+ Once the page is load it will create new websocket connection and then display the number of websocket connections established in the app backend. +

+

+ Pres F5 to refresh the page will cause previous websocket connection get closed and new connection established. +

+

+ So try keep pressing f5 to monitor if the connection number keep increasing +

+ + + diff --git a/testapps/GH991/src/main/resources/test/.version b/testapps/GH991/src/main/resources/test/.version new file mode 100644 index 000000000..ea0c26126 --- /dev/null +++ b/testapps/GH991/src/main/resources/test/.version @@ -0,0 +1,3 @@ +artifact=${project.artifactId} +version=${project.version} +build=${buildNumber} \ No newline at end of file diff --git a/testapps/GH991/src/main/resources/test/logback.xml b/testapps/GH991/src/main/resources/test/logback.xml new file mode 100644 index 000000000..ba406ef43 --- /dev/null +++ b/testapps/GH991/src/main/resources/test/logback.xml @@ -0,0 +1,115 @@ + + + + + + + + + true + + %date %highlight(%-5level) %cyan(%logger{5}@[%-4.30thread]) - %msg%n + + + + + + + true + + %msg%n + + + + + + act.log + + %d{yyyy-MM-dd_HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + /act.%i.log.zip + 1 + 10 + + + + 2MB + + + + + + test.log + + %msg%n + + + + + act-db.log + + %d{yyyy-MM-dd_HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + /act-db.%i.log.zip + 1 + 10 + + + + 2MB + + + + + act-metric.log + + %d{yyyy-MM-dd_HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + /act-metric.%i.log.zip + 1 + 10 + + + + 2MB + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/testapps/GH991/src/main/resources/test/scenarios.yml b/testapps/GH991/src/main/resources/test/scenarios.yml new file mode 100644 index 000000000..ccbfc55d6 --- /dev/null +++ b/testapps/GH991/src/main/resources/test/scenarios.yml @@ -0,0 +1,23 @@ +Scenario(Hello World): + description: a web page says Hello + interactions: + - description: send request to the app without parameter + request: + method: GET + url: / + response: + html: + h1: Hello World + head title: + - contains: Hello World + - contains: ActFramework + p: + : + - contains: Powered by ActFramework + - description: send request to the app with [who = ActFramework] + request: + method: GET + url: /?who=ActFramework + response: + html: + h1: Hello ActFramework \ No newline at end of file diff --git a/testapps/GH991/test b/testapps/GH991/test new file mode 100755 index 000000000..e32ec2e85 --- /dev/null +++ b/testapps/GH991/test @@ -0,0 +1,3 @@ +#!/bin/sh +echo building ... +mvn -q compile act:test \ No newline at end of file diff --git a/testapps/GH991/test.bat b/testapps/GH991/test.bat new file mode 100644 index 000000000..a324f34a0 --- /dev/null +++ b/testapps/GH991/test.bat @@ -0,0 +1,2 @@ +echo building ... +mvn -q compile act:test \ No newline at end of file diff --git a/testapps/GHIssues/.gitignore b/testapps/GHIssues/.gitignore new file mode 100644 index 000000000..0577ee63e --- /dev/null +++ b/testapps/GHIssues/.gitignore @@ -0,0 +1,20 @@ +*.iml +target +.idea +classes +*.log +*.DS_Store +*all.sql +tmp/ +**/.act* +**/.classpath +**/.settings +**/.project +**/.settings/ +store1/ +test.mv.db +test.trace.db +act.pid +.workspace +*.geany +upload* \ No newline at end of file diff --git a/testapps/GHIssues/pom.xml b/testapps/GHIssues/pom.xml new file mode 100644 index 000000000..d9ba8cb88 --- /dev/null +++ b/testapps/GHIssues/pom.xml @@ -0,0 +1,100 @@ + + + 4.0.0 + + act-ghissues + 1.9.1-SNAPSHOT + + ActFramework Github Issue Reproduce App + + + org.actframework + act-starter-parent + 1.9.0.2 + + + + + + ghissues.AppEntry + + + + + org.actframework + act + 1.9.2-SNAPSHOT + + + org.actframework + act-excel + + + com.zaxxer + HikariCP + + + + + + + + org.actframework + act-hibernate + + + org.actframework + act-storage + + + + cn.hutool + hutool-all + 5.5.4 + + + org.actframework + act-aaa + 1.10.1 + + + org.actframework + act-ebean + + + org.actframework + act-sql-common + 1.6.1-SNAPSHOT + + + + com.warrenstrange + googleauth + 1.5.0 + + + + + + + diff --git a/testapps/GHIssues/run_dev b/testapps/GHIssues/run_dev new file mode 100755 index 000000000..56d7f76cd --- /dev/null +++ b/testapps/GHIssues/run_dev @@ -0,0 +1,3 @@ +#!/bin/sh +echo building ... +mvn -q compile act:run \ No newline at end of file diff --git a/testapps/GHIssues/run_dev.bat b/testapps/GHIssues/run_dev.bat new file mode 100755 index 000000000..28b0270e1 --- /dev/null +++ b/testapps/GHIssues/run_dev.bat @@ -0,0 +1,2 @@ +echo building ... +mvn -q compile act:run \ No newline at end of file diff --git a/testapps/GHIssues/run_prod b/testapps/GHIssues/run_prod new file mode 100755 index 000000000..006c86ed4 --- /dev/null +++ b/testapps/GHIssues/run_prod @@ -0,0 +1,10 @@ +#!/bin/sh +if [ ! -f target/dist/start ]; then + echo building ... + mvn -q clean package + cd target/dist + tar xzf *.tar.gz +else + cd target/dist +fi +./run $* \ No newline at end of file diff --git a/testapps/GHIssues/src/main/java/ghissues/AppEntry.java b/testapps/GHIssues/src/main/java/ghissues/AppEntry.java new file mode 100644 index 000000000..b13fb96dd --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/AppEntry.java @@ -0,0 +1,18 @@ +package ghissues; + +import act.Act; +import act.apidoc.ApiManager; + +@SuppressWarnings("unused") +public class AppEntry { + + private static void enableApiManager() { + System.setProperty(ApiManager.SYS_PROP_ENABLE_API_MANAGER_ON_TEST_MODE, "true"); + } + + public static void main(String[] args) throws Exception { + enableApiManager(); + Act.start(); + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/BaseController.java b/testapps/GHIssues/src/main/java/ghissues/BaseController.java new file mode 100644 index 000000000..8c46c9e92 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/BaseController.java @@ -0,0 +1,10 @@ +package ghissues; + +import act.handler.NoReturnValueAdvice; +import act.util.LogSupport; +import org.osgl.aaa.NoAuthentication; + +@NoReturnValueAdvice +@NoAuthentication +public class BaseController extends LogSupport { +} diff --git a/testapps/GHIssues/src/main/java/ghissues/DeleteCookieTest.java b/testapps/GHIssues/src/main/java/ghissues/DeleteCookieTest.java new file mode 100644 index 000000000..b53e02282 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/DeleteCookieTest.java @@ -0,0 +1,33 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import org.osgl.http.H; +import org.osgl.mvc.annotation.DeleteAction; +import org.osgl.mvc.annotation.GetAction; +import org.osgl.mvc.annotation.PostAction; + +import static act.controller.Controller.Util.redirect; +import static act.controller.Controller.Util.renderTemplate; + +@UrlContext("cookies") +public class DeleteCookieTest extends BaseController { + + @GetAction + public void home() { + renderTemplate("/cookie_home.html"); + } + + @PostAction + public void add(String cookieName, String cookieValue, H.Response resp) { + H.Cookie cookie = new H.Cookie(cookieName, cookieValue).httpOnly(false); + resp.addCookie(cookie); + redirect("/cookies"); + } + + @DeleteAction + public void delete(String cookieName, H.Response resp) { + resp.removeCookie(cookieName); + redirect("/cookies"); + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1001.java b/testapps/GHIssues/src/main/java/ghissues/Gh1001.java new file mode 100644 index 000000000..98449f1a4 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1001.java @@ -0,0 +1,19 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import org.osgl.mvc.annotation.GetAction; + +@UrlContext("1001") +public class Gh1001 extends BaseController { + + public static class Foo { + public int id; + public String name; + } + + @GetAction + public Foo test(Foo foo) { + return foo; + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1005.java b/testapps/GHIssues/src/main/java/ghissues/Gh1005.java new file mode 100644 index 000000000..b64c40a77 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1005.java @@ -0,0 +1,24 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import act.util.PropertySpec; +import org.osgl.aaa.NoAuthentication; +import org.osgl.mvc.annotation.PostAction; + +@UrlContext("1005") +@NoAuthentication +public class Gh1005 { + + public static class Foo { + public int id; + public boolean flag; + public String name; + } + + @PostAction + public Foo create(Foo foo, String fields) { + PropertySpec.current.set(fields); + return foo; + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1015.java b/testapps/GHIssues/src/main/java/ghissues/Gh1015.java new file mode 100644 index 000000000..f7fb72701 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1015.java @@ -0,0 +1,29 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import org.osgl.mvc.annotation.PostAction; + +import javax.persistence.Transient; +import javax.validation.constraints.*; + +@UrlContext("1015") +public class Gh1015 extends BaseController { + public static class User { + + @NotNull + @Size(min = 3, max = 20) + public String name; + + @Min(18) + @Max(60) + public Integer age = 0; + + @Transient + public User invitor; + } + + @PostAction + public User create(User user) { + return user; + } +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1016.java b/testapps/GHIssues/src/main/java/ghissues/Gh1016.java new file mode 100644 index 000000000..af1231ca6 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1016.java @@ -0,0 +1,66 @@ +package ghissues; + +import act.app.ActionContext; +import act.controller.annotation.UrlContext; +import act.data.annotation.Data; +import act.data.annotation.ParamBindingAnnotation; +import act.util.SimpleBean; +import org.osgl.inject.BeanSpec; +import org.osgl.inject.ValueLoader; +import org.osgl.inject.annotation.InjectTag; +import org.osgl.inject.annotation.LoadValue; +import org.osgl.mvc.annotation.PostAction; +import org.osgl.util.E; + +import java.lang.annotation.*; +import java.util.Map; + +@UrlContext("1016") +public class Gh1016 extends BaseController { + + public static class IpLoader implements ValueLoader { + @Override + public void init(Map options, BeanSpec spec) { + } + + @Override + public String get() { + ActionContext context = ActionContext.current(); + E.illegalStateIf(null == context); + return context.req().ip(); + } + } + + + @LoadValue(IpLoader.class) + @Retention(RetentionPolicy.RUNTIME) + @Target({ElementType.PARAMETER, ElementType.FIELD}) + @ParamBindingAnnotation + @InjectTag + public @interface FillIp { + } + + @Data + public static class Foo implements SimpleBean { + public int id; + @FillIp + public String ip; + } + + @Data + public static class Bar implements SimpleBean { + public Foo foo; + } + + + @PostAction + public Foo create(Foo foo) { + return foo; + } + + @PostAction("embedded") + public Bar createEmbedded(Bar bar) { + return bar; + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1022.java b/testapps/GHIssues/src/main/java/ghissues/Gh1022.java new file mode 100644 index 000000000..83673c69a --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1022.java @@ -0,0 +1,30 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import org.osgl.mvc.annotation.GetAction; +import org.osgl.util.S; + +@UrlContext("1022") +public class Gh1022 extends BaseController { + + public static class Foo { + public String name = S.random(); + } + + @GetAction("foo/{id}") + public Foo foo(int id) { + if (1 == id) { + return new Foo(); + } + return null; + } + + @GetAction("foo/{fooId}/~foo-name~") + public String fooName(int fooId) { + if (1 == fooId) { + return new Foo().name; + } + return null; + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1026.java b/testapps/GHIssues/src/main/java/ghissues/Gh1026.java new file mode 100644 index 000000000..5f0f9bb03 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1026.java @@ -0,0 +1,32 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import com.google.common.collect.ArrayListMultimap; +import com.google.common.collect.Multimap; +import org.osgl.mvc.annotation.GetAction; +import org.osgl.mvc.annotation.PostAction; + +@UrlContext("1026") +public class Gh1026 extends BaseController { + + public static class Foo { + public Multimap permissions = ArrayListMultimap.create(); + } + + @PostAction + public Foo test(Foo foo) { + return foo; + } + + @GetAction + public Foo get() { + Foo foo = new Foo(); + foo.permissions.put("admin", "admin.create"); + foo.permissions.put("admin", "admin.update"); + foo.permissions.put("admin", "admin.delete"); + foo.permissions.put("user", "user.create"); + foo.permissions.put("user", "user.delete"); + return foo; + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1058.java b/testapps/GHIssues/src/main/java/ghissues/Gh1058.java new file mode 100644 index 000000000..e24e24a96 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1058.java @@ -0,0 +1,20 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import act.metric.MetricAdmin; +import org.osgl.mvc.annotation.GetAction; + +import javax.inject.Inject; + +@UrlContext("1058") +public class Gh1058 extends BaseController { + + @Inject + MetricAdmin metricAdmin; + + @GetAction + public Object metric() { + return metricAdmin.getTimers(1, false, 2, null, false); + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1061.java b/testapps/GHIssues/src/main/java/ghissues/Gh1061.java new file mode 100644 index 000000000..cd46e5bee --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1061.java @@ -0,0 +1,18 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import org.osgl.mvc.annotation.PostAction; + +@UrlContext("1061") +public class Gh1061 extends BaseController { + + public static class Foo { + public String name; + } + + @PostAction + public Foo test(Foo foo) { + return foo; + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1073.java b/testapps/GHIssues/src/main/java/ghissues/Gh1073.java new file mode 100644 index 000000000..69207ab61 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1073.java @@ -0,0 +1,37 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import act.data.annotation.Data; +import act.inject.util.LoadResource; +import act.util.AdaptiveBean; +import act.util.SimpleBean; +import org.osgl.mvc.annotation.GetAction; + +import java.util.List; + +@UrlContext("1073") +public class Gh1073 extends BaseController { + + @Data + public static class Config extends AdaptiveBean { + + @Data + public static class Component implements SimpleBean { + public int id; + public String kind; + } + + public String id; + public String name; + public List nameComponents; + } + + @LoadResource("1073.yml") + private List configs; + + @GetAction + public List configs() { + return configs; + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1083.java b/testapps/GHIssues/src/main/java/ghissues/Gh1083.java new file mode 100644 index 000000000..9736d29c1 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1083.java @@ -0,0 +1,20 @@ +package ghissues; + +import act.controller.annotation.TemplateContext; +import act.controller.annotation.UrlContext; +import org.osgl.mvc.annotation.GetAction; +import org.osgl.mvc.annotation.PostAction; +import org.osgl.storage.ISObject; + +@UrlContext("1083") +@TemplateContext("1083") +public class Gh1083 extends BaseController { + @GetAction + public void form() { + } + + @PostAction + public boolean handleUpload(ISObject file, String fileName) { + return null == file; + } +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1104.java b/testapps/GHIssues/src/main/java/ghissues/Gh1104.java new file mode 100644 index 000000000..a02aad872 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1104.java @@ -0,0 +1,31 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import act.util.JsonView; +import act.util.PropertySpec; +import org.osgl.http.H; +import org.osgl.mvc.annotation.GetAction; +import org.osgl.util.N; +import org.osgl.util.S; + +import java.util.HashMap; +import java.util.Map; + +@UrlContext("1104") +@SuppressWarnings("unused") +public class Gh1104 extends BaseController { + + @GetAction + public Iterable test(H.Request req) { + return req.headerNames(); + } + + @GetAction("all") + public Map> allHeaders(H.Request req) { + Map> map = new HashMap<>(); + for (String name : req.headerNames()) { + map.put(name, req.headers(name)); + } + return map; + } +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1116.java b/testapps/GHIssues/src/main/java/ghissues/Gh1116.java new file mode 100644 index 000000000..276f239a8 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1116.java @@ -0,0 +1,12 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import org.osgl.mvc.annotation.GetAction; + +@UrlContext("1116/${api.version}") +public class Gh1116 extends BaseController { + @GetAction + public String test() { + return "1116"; + } +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1117.java b/testapps/GHIssues/src/main/java/ghissues/Gh1117.java new file mode 100644 index 000000000..5ad73d670 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1117.java @@ -0,0 +1,30 @@ +package ghissues; + +import act.cli.Command; +import act.controller.annotation.UrlContext; +import act.data.annotation.Data; +import act.util.PropertySpec; +import act.util.SimpleBean; +import org.osgl.mvc.annotation.GetAction; +import org.osgl.util.C; + +@UrlContext("1117") +public class Gh1117 extends BaseController { + + @Data + public static class Foo implements SimpleBean { + public static final String TAG = "tag"; + public String name = "foo"; + public String bar = "bar"; + } + + /** + * Note the issue only occur when executing CLI command and it has to be manually verified. + */ + @GetAction + @PropertySpec("-bar") + @Command("gh1117") + public Iterable test() { + return C.list(new Foo()); + } +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1118.java b/testapps/GHIssues/src/main/java/ghissues/Gh1118.java new file mode 100644 index 000000000..1ffffa523 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1118.java @@ -0,0 +1,38 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import act.data.annotation.Data; +import act.util.PropertySpec; +import act.util.SimpleBean; +import org.osgl.aaa.NoAuthentication; +import org.osgl.mvc.annotation.GetAction; +import org.osgl.util.C; + +@UrlContext("1118") +@NoAuthentication +public class Gh1118 { + + public static class Employee { + public String email = "jen@abc.com"; + } + + @Data + public static class Bar implements SimpleBean { + public int id = 3; + public Employee employee = new Employee(); + } + + @Data + public static class Foo implements SimpleBean { + public static final String TAG = "tag"; + public String name = "foo"; + public int count = 110; + public Bar bar = new Bar(); + } + + @GetAction + @PropertySpec("count, bar") + public Iterable test() { + return C.list(new Foo()); + } +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1127.java b/testapps/GHIssues/src/main/java/ghissues/Gh1127.java new file mode 100644 index 000000000..10455dd8f --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1127.java @@ -0,0 +1,19 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import org.osgl.mvc.annotation.PostAction; + +@UrlContext("1127") +public class Gh1127 extends BaseController { + + public static class Foo { + public int n; + public float f; + } + + @PostAction + public Foo test(Foo foo) { + return foo; + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1128.java b/testapps/GHIssues/src/main/java/ghissues/Gh1128.java new file mode 100644 index 000000000..fb023c4e1 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1128.java @@ -0,0 +1,21 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import act.storage.StorageServiceManager; +import com.alibaba.fastjson.JSONObject; +import org.osgl.mvc.annotation.PostAction; +import org.osgl.storage.ISObject; +import org.osgl.storage.IStorageService; + +@UrlContext("1128") +public class Gh1128 extends BaseController { + + @PostAction + public void upload(ISObject file, StorageServiceManager ssMgr) { + IStorageService ss = ssMgr.storageService("1128_upload"); + String key = ss.getKey(); + file.getAttribute(ISObject.ATTR_FILE_NAME); + file = ss.put(key, file); + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1130.java b/testapps/GHIssues/src/main/java/ghissues/Gh1130.java new file mode 100644 index 000000000..c68a4a584 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1130.java @@ -0,0 +1,21 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import act.util.FastJsonPropertyNamingStrategy; +import com.alibaba.fastjson.PropertyNamingStrategy; +import org.osgl.mvc.annotation.GetAction; + +@UrlContext("1130") +public class Gh1130 extends BaseController { + + public static class Gh1130Model { + public int fooBar = 1; + } + + @GetAction + @FastJsonPropertyNamingStrategy(PropertyNamingStrategy.SnakeCase) + public Gh1130Model test() { + return new Gh1130Model(); + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1138.java b/testapps/GHIssues/src/main/java/ghissues/Gh1138.java new file mode 100644 index 000000000..9ca3e0e3d --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1138.java @@ -0,0 +1,34 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import act.job.Every; +import act.job.OnAppStart; +import act.util.JsonView; +import com.alibaba.fastjson.JSONObject; +import org.osgl.mvc.annotation.GetAction; +import org.osgl.util.C; + +import javax.inject.Singleton; +import java.util.Date; +import java.util.List; + +import static act.controller.Controller.Util.renderJson; + +@UrlContext("1138") +@Singleton +public class Gh1138 extends BaseController { + + private int n; + + @OnAppStart + @Every(value = "1s", startImmediately = false) + public void incr() { + n++; + } + + @GetAction + public int get() { + return n; + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1141.java b/testapps/GHIssues/src/main/java/ghissues/Gh1141.java new file mode 100644 index 000000000..0560441ed --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1141.java @@ -0,0 +1,29 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import act.inject.param.NoBind; +import act.job.Every; +import act.job.OnAppStart; +import act.validation.EmailHandler; +import org.osgl.mvc.annotation.GetAction; + +import javax.inject.Inject; +import javax.inject.Singleton; + +@UrlContext("1141") +public class Gh1141 extends BaseController { + + @NoBind + EmailHandler emailHandler; + + public Gh1141() { + emailHandler = new EmailHandler(); + emailHandler.initialize(null); + } + + @GetAction + public boolean isValid() { + return emailHandler.isValid("green@thinking.studio", null); + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1145.java b/testapps/GHIssues/src/main/java/ghissues/Gh1145.java new file mode 100644 index 000000000..09596a40d --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1145.java @@ -0,0 +1,81 @@ +package ghissues; + +import act.app.ActionContext; +import act.controller.annotation.UrlContext; +import act.inject.param.NoBind; +import act.job.OnAppStart; +import act.util.AdaptiveBeanBase; +import act.util.PropertySpec; +import org.osgl.mvc.annotation.GetAction; +import org.osgl.util.IO; +import org.osgl.util.S; + +import javax.inject.Singleton; +import java.util.ArrayList; +import java.util.List; + +@UrlContext("1145") +@Singleton +public class Gh1145 extends BaseController { + + public static class Data extends AdaptiveBeanBase { + } + + @NoBind + public List list = new ArrayList<>(); + + private String checksum; + + @OnAppStart + public void generateRandomData() { + // populate data list + for (int i = 0; i < 10000; ++i) { + Data data = new Data(); + for (int j = 0; j < 30; ++j) { + String key = "key" + j; + data.putValue(key, "1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"); + } + list.add(data); + } + + // try get csv file checksum + String content = csvContent(); + checksum = IO.checksum(content.getBytes()); + } + + private String csvContent() { + List list = new ArrayList<>(); + for (int j = 0; j < 100; ++j) { + list.add("key" + j); + } + String headline = S.join(",", list); + List dataLines = new ArrayList<>(); + dataLines.add(headline); + for (Data data : this.list) { + List cell = new ArrayList<>(); + for (int j = 0; j < 100; ++j) { + String key = "key" + j; + cell.add((String) data.getValue(key)); + } + dataLines.add(S.join(",", cell)); + } + return S.join("\n", dataLines); + } + + @GetAction("checksum") + public String checksum() { + return checksum; + } + + @GetAction + public List get(ActionContext context) { + List list = new ArrayList<>(); + for (int j = 0; j < 100; ++j) { + list.add("key" + j); + } + String propSpec = S.join(",", list); + PropertySpec.current.set(propSpec); + return this.list; + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1146.java b/testapps/GHIssues/src/main/java/ghissues/Gh1146.java new file mode 100644 index 000000000..ff03fb4b2 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1146.java @@ -0,0 +1,22 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import act.inject.util.LoadResource; +import org.osgl.mvc.annotation.GetAction; + +import java.util.Map; + +import static act.controller.Controller.Util.notFoundIfNull; + +@UrlContext("1146") +public class Gh1146 extends BaseController { + + @LoadResource("1146.map") + private Map map; + + @GetAction + public Map makeDouble() { + return map; + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1147.java b/testapps/GHIssues/src/main/java/ghissues/Gh1147.java new file mode 100644 index 000000000..bc6b4565a --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1147.java @@ -0,0 +1,30 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import act.inject.util.LoadResource; +import act.util.JsonView; +import com.alibaba.fastjson.JSONObject; +import org.osgl.mvc.annotation.GetAction; +import org.osgl.util.C; + +import java.util.Date; +import java.util.List; +import java.util.Map; + +import static act.controller.Controller.Util.notFoundIfNull; +import static act.controller.Controller.Util.renderJson; + +@UrlContext("1147") +public class Gh1147 extends BaseController { + + @LoadResource("1147.map") + private Map map; + + @GetAction + public Integer makeDouble(String key) { + Integer I = map.get(key); + notFoundIfNull(I); + return I * 2; + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1161.java b/testapps/GHIssues/src/main/java/ghissues/Gh1161.java new file mode 100644 index 000000000..b9d100a42 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1161.java @@ -0,0 +1,45 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import act.db.jpa.JPADao; +import act.util.JsonView; +import com.alibaba.fastjson.JSONObject; +import org.osgl.mvc.annotation.GetAction; +import org.osgl.mvc.annotation.PostAction; +import org.osgl.util.C; + +import javax.inject.Inject; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import java.util.Date; +import java.util.List; + +import static act.controller.Controller.Util.renderJson; + +@UrlContext("1161") +public class Gh1161 extends BaseController { + @Entity(name = "m1161") + public static class ModelB { + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Id + public Integer id; + public String name; + } + + public static class Dao extends JPADao { + + } + + @Inject + private Dao dao; + + @GetAction("{name}") + public ModelB get(String name) { + return dao.findOneBy("name", name); + } + + @PostAction("nil") + public void doNothing() {} +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1206.java b/testapps/GHIssues/src/main/java/ghissues/Gh1206.java new file mode 100644 index 000000000..b5905ae29 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1206.java @@ -0,0 +1,21 @@ +package ghissues; + +import act.app.event.SysEventId; +import act.event.EventBus; +import act.job.OnSysEvent; + +public class Gh1206 { + + /** + * See https://github.com/actframework/actframework/issues/1206 + * + * Gocha:DO NOT declare event listener using OnSysEvent + * annotation before SINGLETON_PROVISIONED which is raised + * after DEPENDENCY_INJECTOR_PROVISIONED event + */ + @OnSysEvent(SysEventId.SINGLETON_PROVISIONED) + public void on(EventBus eventBus) { + + assert eventBus != null; + } +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1211.java b/testapps/GHIssues/src/main/java/ghissues/Gh1211.java new file mode 100644 index 000000000..d9f7cbb1a --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1211.java @@ -0,0 +1,20 @@ +package ghissues; + +import act.app.ActionContext; +import act.controller.annotation.UrlContext; +import org.osgl.mvc.annotation.GetAction; + +@UrlContext("1211") +public class Gh1211 extends BaseController { + + @GetAction + public String test(ActionContext context) { + return context.i18n("hello %s", "world"); + } + + @GetAction("2") + public String test2(ActionContext context) { + return context.i18n("hello {0}", "world"); + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1232.java b/testapps/GHIssues/src/main/java/ghissues/Gh1232.java new file mode 100644 index 000000000..9b221c9cf --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1232.java @@ -0,0 +1,36 @@ +package ghissues; + +import act.controller.ExpressController; +import act.controller.annotation.UrlContext; +import act.handler.NonBlock; +import act.util.JsonView; +import com.alibaba.fastjson.JSONObject; +import org.osgl.mvc.annotation.GetAction; +import org.osgl.util.C; +import org.osgl.util.S; + +import java.util.Date; +import java.util.List; +import java.util.Map; + +import static act.controller.Controller.Util.renderJson; + +@UrlContext("1232") +@ExpressController +public class Gh1232 extends BaseController { + + public static class Foo { + public String name; + + public Foo(String name) { + this.name = name; + } + } + + @GetAction + @NonBlock + public Foo test() { + return new Foo(S.repeat("bar").x(1000 * 100)); + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1236.java b/testapps/GHIssues/src/main/java/ghissues/Gh1236.java new file mode 100644 index 000000000..6c8b66ce7 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1236.java @@ -0,0 +1,57 @@ +package ghissues; + +import act.apidoc.SampleData; +import act.apidoc.SampleDataProvider; +import act.controller.ExpressController; +import act.controller.annotation.UrlContext; +import act.handler.NonBlock; +import org.osgl.$; +import org.osgl.mvc.annotation.GetAction; +import org.osgl.mvc.annotation.PostAction; +import org.osgl.util.S; + +import javax.inject.Provider; + +/** + * Note there is no automate test for this issue. + * + * One must go to http://localhost:15460/~/api to check if the API + * sample data has been generated correctly + */ +@UrlContext("1236") +public class Gh1236 extends BaseController { + + private static class FooNameProvider implements Provider { + @Override + public String get() { + return $.random("foo", "bar", "zee"); + } + } + + public static class Foo { + @SampleData.ProvidedBy(FooNameProvider.class) + public String name; + + @SampleData.StringList({"a", "b", "c"}) + public String s; + + @SampleData.IntList({1, 2, 3}) + public int i; + + @SampleData.DoubleList({13.0d, 23.7d, 37.3d}) + public double d; + } + + /** + * Return `Foo` + */ + @PostAction + public Foo test( + Foo foo, + @SampleData.ProvidedBy(FooNameProvider.class) String bar, + @SampleData.IntList({1, 2, 3, 5, 8}) int n + ) { + return foo; + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1240.java b/testapps/GHIssues/src/main/java/ghissues/Gh1240.java new file mode 100644 index 000000000..938eef525 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1240.java @@ -0,0 +1,29 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import act.util.SimpleBean; +import org.osgl.$; +import org.osgl.mvc.annotation.PostAction; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; + +@UrlContext("1240") +public class Gh1240 extends BaseController { + + @Entity(name = "foo1240") + @Table(name = "foo1240") + public static class Foo implements SimpleBean { + @Id + public int id; + + public String name; + } + + @PostAction + public Foo create(Foo foo) { + return foo; + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1241.java b/testapps/GHIssues/src/main/java/ghissues/Gh1241.java new file mode 100644 index 000000000..ed7111610 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1241.java @@ -0,0 +1,21 @@ +package ghissues; + +import act.Act; +import act.app.ActionContext; +import act.controller.annotation.UrlContext; +import act.handler.builtin.FileGetter; +import act.util.Stateless; +import org.osgl.mvc.annotation.GetAction; + +@UrlContext("1241") +@Stateless +public class Gh1241 extends BaseController { + + private FileGetter fileGetter = new FileGetter("/", Act.app()); + + @GetAction + public void load(ActionContext context) { + fileGetter.handle(context); + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1247.java b/testapps/GHIssues/src/main/java/ghissues/Gh1247.java new file mode 100644 index 000000000..240dc4600 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1247.java @@ -0,0 +1,30 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import act.data.annotation.Data; +import act.inject.DefaultValue; +import org.joda.time.DateTime; +import org.joda.time.LocalDate; +import org.osgl.mvc.annotation.GetAction; + +import java.util.Date; + +@UrlContext("1247") +public class Gh1247 extends BaseController { + + @GetAction("joda-localdate") + public LocalDate testLocalDate(@DefaultValue("now") LocalDate date) { + return date; + } + + @GetAction("joda-datetime") + public DateTime testDateTime(@DefaultValue("now") DateTime dateTime) { + return dateTime; + } + + @GetAction("jdk-date") + public Date testDate(@DefaultValue("now") Date date) { + return date; + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1253.java b/testapps/GHIssues/src/main/java/ghissues/Gh1253.java new file mode 100644 index 000000000..b465543b3 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1253.java @@ -0,0 +1,19 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import act.inject.util.LoadResource; +import org.osgl.mvc.annotation.GetAction; +import org.osgl.util.C; + +@UrlContext("1253") +public class Gh1253 extends BaseController { + + @LoadResource("1253.mapping") + private C.Map mapping; + + @GetAction + public C.Map get() { + return mapping; + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1254.java b/testapps/GHIssues/src/main/java/ghissues/Gh1254.java new file mode 100644 index 000000000..d513c4dab --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1254.java @@ -0,0 +1,16 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import act.inject.util.LoadResource; +import org.osgl.mvc.annotation.GetAction; +import org.osgl.util.C; + +@UrlContext("1254") +public class Gh1254 extends BaseController { + + @GetAction + public String get() { + throw new IllegalArgumentException(); + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1257.java b/testapps/GHIssues/src/main/java/ghissues/Gh1257.java new file mode 100644 index 000000000..bc5d241d1 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1257.java @@ -0,0 +1,11 @@ +package ghissues; + +import org.osgl.mvc.annotation.GetAction; + +public class Gh1257 extends BaseController { + + @GetAction("1257") + public void test(int[] data) { + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1260.java b/testapps/GHIssues/src/main/java/ghissues/Gh1260.java new file mode 100644 index 000000000..2278a39ec --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1260.java @@ -0,0 +1,19 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import org.osgl.mvc.annotation.GetAction; + +@UrlContext("1260") +public class Gh1260 extends BaseController { + + @GetAction + public String test() { + return "Hello World"; + } + + @GetAction("2") + public String test2() { + return "

Hello World

"; + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1261.java b/testapps/GHIssues/src/main/java/ghissues/Gh1261.java new file mode 100644 index 000000000..2f629006c --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1261.java @@ -0,0 +1,15 @@ +package ghissues; + +import act.apidoc.SampleData; +import org.osgl.mvc.annotation.GetAction; + +import java.util.List; + +public class Gh1261 extends BaseController { + + @GetAction("1261") + public List test() { + return SampleData.generateList(String.class); + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1262.java b/testapps/GHIssues/src/main/java/ghissues/Gh1262.java new file mode 100644 index 000000000..fb764938d --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1262.java @@ -0,0 +1,49 @@ +package ghissues; + +import act.apidoc.SampleData; +import act.apidoc.SampleDataCategory; +import act.controller.annotation.UrlContext; +import act.util.Stateless; +import org.osgl.mvc.annotation.GetAction; + +import javax.inject.Singleton; +import java.util.List; + +@UrlContext("1262") +@Stateless +public class Gh1262 extends BaseController { + + public static class Address { + public String street; + public String postcode; + } + + public static class Permission { + public String name; + } + + public static class Privilege { + public int level; + } + + public static class Role { + public String name; + public List permissions; + public Privilege privilege; + } + + public static class User { + @SampleData.Category(SampleDataCategory.USERNAME) + public String name; + public Address address; + public List roles; + } + + private User user = SampleData.generate(User.class, "user"); + + @GetAction + public User get() { + return user; + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1267.java b/testapps/GHIssues/src/main/java/ghissues/Gh1267.java new file mode 100644 index 000000000..1a1581955 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1267.java @@ -0,0 +1,23 @@ +package ghissues; + +import act.annotations.AllowQrCodeRendering; +import act.app.ActionContext; +import act.controller.annotation.UrlContext; +import org.osgl.mvc.annotation.Before; +import org.osgl.mvc.annotation.GetAction; +import org.osgl.util.S; + +@UrlContext("1267") +public class Gh1267 extends BaseController { + + @Before + public void before(String name, String host, ActionContext context) { + context.renderArg("email", S.pathConcat(name, '@', host)); + } + + @GetAction + public String checkBind(String email) { + return email; + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1269.java b/testapps/GHIssues/src/main/java/ghissues/Gh1269.java new file mode 100644 index 000000000..5adac9fe7 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1269.java @@ -0,0 +1,21 @@ +package ghissues; + +import act.annotations.AllowQrCodeRendering; +import act.controller.annotation.UrlContext; +import org.osgl.mvc.annotation.GetAction; + +@UrlContext("1269") +public class Gh1269 extends BaseController { + + @GetAction("allowQrCode") + @AllowQrCodeRendering + public String allowQrCode() { + return "gh1269"; + } + + @GetAction("notAllowQrCode") + public String notAllowQrCode() { + return "gh1269"; + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1284.java b/testapps/GHIssues/src/main/java/ghissues/Gh1284.java new file mode 100644 index 000000000..025369166 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1284.java @@ -0,0 +1,11 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import org.osgl.mvc.annotation.PostAction; + +@UrlContext("1284") +public class Gh1284 extends BaseController { + @PostAction("{id}") + public void testPost(String id) { + } +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1286.java b/testapps/GHIssues/src/main/java/ghissues/Gh1286.java new file mode 100644 index 000000000..99b19f41f --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1286.java @@ -0,0 +1,28 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import org.osgl.mvc.annotation.GetAction; + +/** + * Run app and check if there are exception stack during API doc generation + */ +@UrlContext("1286") +public class Gh1286 extends BaseController { + public static class TestResp { + public Integer code; + public T result; + + public TestResp(Integer code, T result) { + this.code = code; + this.result = result; + } + } + + public TestResp resp = new TestResp(1, "Hello"); + + @GetAction + public TestResp test() { + return resp; + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1316.java b/testapps/GHIssues/src/main/java/ghissues/Gh1316.java new file mode 100644 index 000000000..38c573987 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1316.java @@ -0,0 +1,30 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import act.util.PropertySpec; +import org.osgl.mvc.annotation.GetAction; +import org.osgl.mvc.annotation.PostAction; +import org.osgl.util.N; +import org.osgl.util.S; + +import java.io.File; + +import static act.controller.Controller.Util.renderTemplate; + +@UrlContext("1316") +public class Gh1316 extends BaseController { + + @GetAction + public void form() { + renderTemplate("/1316.html"); + } + + @PostAction() + public String filetest(File[] files1, File[] files2) { + if (files1.length == 0 && files2.length == 0) { + return null; + } + return "found"; + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1322.java b/testapps/GHIssues/src/main/java/ghissues/Gh1322.java new file mode 100644 index 000000000..75b829f35 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1322.java @@ -0,0 +1,22 @@ +package ghissues; + +import act.controller.annotation.TemplateContext; +import act.controller.annotation.UrlContext; +import org.osgl.mvc.annotation.GetAction; +import org.osgl.mvc.annotation.PostAction; + +@UrlContext("1322") +@TemplateContext("1322") +public class Gh1322 extends BaseController { + + public static class Foo { + public int bar; + } + + @GetAction + public void form() { + } + + @PostAction + public Foo test(Foo foo) {return foo;} +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1340.java b/testapps/GHIssues/src/main/java/ghissues/Gh1340.java new file mode 100644 index 000000000..bebb12fac --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1340.java @@ -0,0 +1,43 @@ +package ghissues; + +import act.data.annotation.Data; +import act.util.AdaptiveBeanBase; +import com.alibaba.fastjson.JSONObject; +import org.osgl.mvc.annotation.GetAction; + +import java.util.ArrayList; +import java.util.List; + +public class Gh1340 extends BaseController { + + public static class MyData extends AdaptiveBeanBase { + static MyData of(String key, Object val) { + MyData myData = new MyData(); + myData.putValue(key, val); + return myData; + } + } + + @GetAction("1340/adaptiveMap") + public List test() { + List list = new ArrayList<>(); + list.add(MyData.of("name", "foo").putValue("num", 2)); + list.add(MyData.of("name", "bar").putValue("num", 3)); + return list; + } + + @GetAction("1340/map") + public List testMap() { + List list = new ArrayList<>(); + JSONObject json = new JSONObject(); + json.put("name", "foo"); + json.put("num", 3); + list.add(json); + json = new JSONObject(); + json.put("name", "bar"); + json.put("num", 2); + list.add(json); + return list; + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1352.java b/testapps/GHIssues/src/main/java/ghissues/Gh1352.java new file mode 100644 index 000000000..aff8da620 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1352.java @@ -0,0 +1,23 @@ +package ghissues; + +import static act.controller.Controller.Util.renderJson; + +import act.controller.annotation.UrlContext; +import act.util.JsonView; +import com.alibaba.fastjson.JSONObject; +import org.osgl.mvc.annotation.PostAction; +import org.osgl.util.C; + +import java.io.File; +import java.util.Date; +import java.util.List; + +@UrlContext("1352") +public class Gh1352 extends BaseController { + + @PostAction + public boolean test(String[] selectValues, File file, File[] files) { + return null != file; + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1355.java b/testapps/GHIssues/src/main/java/ghissues/Gh1355.java new file mode 100644 index 000000000..e1dc49087 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1355.java @@ -0,0 +1,23 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import act.util.JsonView; +import com.alibaba.fastjson.JSONObject; +import org.osgl.mvc.annotation.GetAction; +import org.osgl.mvc.annotation.PostAction; +import org.osgl.util.C; + +import java.util.Date; +import java.util.List; + +import static act.controller.Controller.Util.renderJson; + +@UrlContext("1355") +public class Gh1355 extends BaseController { + + @PostAction + public JSONObject test(Long com_id, JSONObject data) { + data.put("_id", com_id); + return data; + } +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1361.java b/testapps/GHIssues/src/main/java/ghissues/Gh1361.java new file mode 100644 index 000000000..25446a0bf --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1361.java @@ -0,0 +1,26 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import act.inject.util.LoadResource; +import act.util.JsonView; +import com.alibaba.fastjson.JSONObject; +import org.osgl.mvc.annotation.GetAction; +import org.osgl.util.C; + +import java.util.Date; +import java.util.List; + +import static act.controller.Controller.Util.renderJson; + +@UrlContext("1361") +public class Gh1361 extends BaseController { + + @LoadResource("1361.json") + private JSONObject json; + + @GetAction + public JSONObject get() { + return json; + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1369.java b/testapps/GHIssues/src/main/java/ghissues/Gh1369.java new file mode 100644 index 000000000..2fe542ab6 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1369.java @@ -0,0 +1,20 @@ +package ghissues; + +import act.controller.Controller; +import org.osgl.mvc.annotation.GetAction; +import org.osgl.mvc.annotation.PostAction; +import org.osgl.storage.impl.SObject; + +public class Gh1369 extends BaseController { + + @GetAction("1369") + public void form() { + Controller.Util.renderTemplate("/1369.html"); + } + + @PostAction("1369") + public String test(SObject file, String name) { + return name + ": " + (null == file ? "null object" : file.asString()); + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1379.java b/testapps/GHIssues/src/main/java/ghissues/Gh1379.java new file mode 100644 index 000000000..d8e5d884f --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1379.java @@ -0,0 +1,33 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import act.util.JsonView; +import com.alibaba.fastjson.JSONObject; +import org.osgl.mvc.annotation.GetAction; +import org.osgl.util.C; +import org.osgl.util.S; + +import java.util.Date; +import java.util.List; + +import static act.controller.Controller.Util.renderJson; + +@UrlContext("1379") +public class Gh1379 extends BaseController { + + @GetAction("{foo}/{bar}") + public String test(String foo, String bar) { + return S.fmt("%s-%s", foo, bar); + } + + @GetAction("2/{foo}-{bar}") + public String test2(String foo, String bar) { + return test(foo, bar); + } + + @GetAction("3/{foo}/at/{bar}") + public String test3(String foo, String bar) { + return test(foo, bar); + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh1407.java b/testapps/GHIssues/src/main/java/ghissues/Gh1407.java new file mode 100644 index 000000000..2c34df78e --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh1407.java @@ -0,0 +1,30 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import org.osgl.mvc.annotation.Before; +import org.osgl.mvc.annotation.GetAction; + +@UrlContext("1407") +public class Gh1407 extends BaseController { + + @Before + public String before0() { + return "before0"; + } + + @Before(priority = -1) + public String before1() { + return "before1"; + } + + @Before(priority = 1) + public String before2() { + return "before2"; + } + + @GetAction + public String service() { + return "service"; + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh657.java b/testapps/GHIssues/src/main/java/ghissues/Gh657.java new file mode 100644 index 000000000..08deb7e0d --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh657.java @@ -0,0 +1,31 @@ +package ghissues; + +import static act.controller.Controller.Util.renderJson; + +import act.controller.annotation.UrlContext; +import act.util.JsonView; +import com.alibaba.fastjson.JSONObject; +import org.osgl.mvc.annotation.GetAction; +import org.osgl.util.C; + +import java.util.Date; +import java.util.List; + +@UrlContext("657") +public class Gh657 extends BaseController { + + @GetAction("list") + @JsonView + public List list() { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("date", new Date()); + return C.list(jsonObject); + } + + @GetAction("list1") + public void list1() { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("date", new Date()); + renderJson(C.list(jsonObject)); + } +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh784.java b/testapps/GHIssues/src/main/java/ghissues/Gh784.java new file mode 100644 index 000000000..ecf25a47d --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh784.java @@ -0,0 +1,16 @@ +package ghissues; + +import act.data.annotation.Data; +import org.osgl.mvc.annotation.GetAction; + +public class Gh784 extends BaseController { + + @Data + public static class Foo {} + + @GetAction("784") + public int test() { + return new Foo().hashCode(); + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh786.java b/testapps/GHIssues/src/main/java/ghissues/Gh786.java new file mode 100644 index 000000000..c2c914c8b --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh786.java @@ -0,0 +1,46 @@ +package ghissues; + +import act.data.annotation.Data; +import act.util.AdaptiveBean; +import org.osgl.mvc.annotation.GetAction; + +public class Gh786 extends BaseController { + + @Data + public static class FooBase { + public int n = 10; + } + + @Data + public static class BarBase { + public int n = -9; + } + + @Data(callSuper = true) + public static class Foo extends FooBase { + } + + @Data(callSuper = true) + public static class Bar extends BarBase { + } + + @GetAction("786/a") + public boolean testA() { + Foo foo = new Foo(); + Bar bar = new Bar(); + return foo.hashCode() == bar.hashCode(); + } + + @Data + public static class MyRecord extends AdaptiveBean {} + + @GetAction("786/b") + public boolean testB() { + MyRecord r1 = new MyRecord(); + r1.putValue("foo", 1); + MyRecord r2 = new MyRecord(); + r2.putValue("foo", 2); + return r1.hashCode() == r2.hashCode(); + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh790.java b/testapps/GHIssues/src/main/java/ghissues/Gh790.java new file mode 100644 index 000000000..c9a99d1c5 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh790.java @@ -0,0 +1,39 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import act.data.annotation.Data; +import act.inject.util.LoadResource; +import act.util.*; +import org.osgl.mvc.annotation.GetAction; + +import java.util.List; +import java.util.Map; + +@UrlContext("790") +@JsonView +public class Gh790 extends BaseController { + + @Data + public static class Student implements SimpleBean { + public String firstName; + public String lastName; + public String grade; + } + + @LoadResource("students.xls") + public List students; + + @LoadResource("students.xls") + public Map> studentByClass; + + @GetAction("students") + public List all() { + return students; + } + + @GetAction("info/classNumber") + public int classNumber() { + return studentByClass.keySet().size(); + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh796.java b/testapps/GHIssues/src/main/java/ghissues/Gh796.java new file mode 100644 index 000000000..589387c53 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh796.java @@ -0,0 +1,24 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import act.util.*; +import org.osgl.mvc.annotation.GetAction; +import org.osgl.util.N; +import org.osgl.util.S; + +@UrlContext("796") +@JsonView +public class Gh796 extends BaseController { + + public static class Foo { + public String text = S.random(); + public int id = N.randInt(); + } + + @GetAction + @PropertySpec("-id") + public Foo foo() { + return new Foo(); + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh797.java b/testapps/GHIssues/src/main/java/ghissues/Gh797.java new file mode 100644 index 000000000..50b00d95a --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh797.java @@ -0,0 +1,22 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import act.util.JsonView; +import org.osgl.mvc.annotation.GetAction; + +import java.util.Date; + +@UrlContext("797") +@JsonView +public class Gh797 extends BaseController { + + public static class Foo { + public Date date = new Date(); + } + + @GetAction + public Foo foo() { + return new Foo(); + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh798.java b/testapps/GHIssues/src/main/java/ghissues/Gh798.java new file mode 100644 index 000000000..9390cbeff --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh798.java @@ -0,0 +1,24 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import act.util.JsonView; +import com.alibaba.fastjson.annotation.JSONField; +import org.osgl.mvc.annotation.GetAction; + +import java.util.Date; + +@UrlContext("798") +@JsonView +public class Gh798 extends BaseController { + + public static class Foo { + @JSONField(format = "yyyy-MM") + public Date date = new Date(); + } + + @GetAction + public Foo foo() { + return new Foo(); + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh809.java b/testapps/GHIssues/src/main/java/ghissues/Gh809.java new file mode 100644 index 000000000..845b51d8a --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh809.java @@ -0,0 +1,16 @@ +package ghissues; + +import static act.controller.Controller.Util.template; + +import act.controller.annotation.UrlContext; +import org.osgl.mvc.annotation.GetAction; + +@UrlContext("809") +public class Gh809 extends BaseController { + + @GetAction + public void index() { + template(); + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh819.java b/testapps/GHIssues/src/main/java/ghissues/Gh819.java new file mode 100644 index 000000000..17a74669d --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh819.java @@ -0,0 +1,30 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import act.util.JsonView; +import org.osgl.mvc.annotation.PostAction; + +public abstract class Gh819 extends BaseController { + + public static class Foo { + public String name; + } + + @PostAction + public Foo test(Foo foo) { + return foo; + } + + @UrlContext("819") + public static class Extended extends Gh819 { + + @JsonView + @Override + public Foo test(Foo foo) { + foo.name = "[extended]" + foo.name; + return foo; + } + } + + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh820.java b/testapps/GHIssues/src/main/java/ghissues/Gh820.java new file mode 100644 index 000000000..8cae69d99 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh820.java @@ -0,0 +1,18 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import ghissues.gh820.Gh820BaseController; +import ghissues.gh820.IntegerService; +import org.osgl.mvc.annotation.GetAction; + +import java.util.List; + +@UrlContext("820") +public class Gh820 extends Gh820BaseController { + + @GetAction + public List get() { + return service().produceList(); + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh821.java b/testapps/GHIssues/src/main/java/ghissues/Gh821.java new file mode 100644 index 000000000..eaed718b2 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh821.java @@ -0,0 +1,19 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import org.osgl.mvc.annotation.GetAction; + +@UrlContext("821") +public class Gh821 extends BaseController { + + @GetAction("invalid_json") + public String getInvalidJSON() { + return "abc"; + } + + @GetAction("valid_json") + public String getValidJSON() { + return "{\"foo\": 123}"; + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh823.java b/testapps/GHIssues/src/main/java/ghissues/Gh823.java new file mode 100644 index 000000000..227e67961 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh823.java @@ -0,0 +1,56 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import act.db.DbBind; +import act.db.jpa.JPADao; +import act.db.sql.tx.Transactional; +import act.util.PropertySpec; +import ghissues.gh823.Gh823User; +import org.osgl.$; +import org.osgl.mvc.annotation.*; + +import javax.inject.Inject; + +@UrlContext("823") +public class Gh823 extends BaseController { + + @Inject + private JPADao userDao; + + @GetAction("users") + public Iterable list() { + return userDao.findAll(); + } + + @GetAction("users/{user}") + public Gh823User get(@DbBind Gh823User user) { + return user; + } + + @PostAction("users") + @PropertySpec("id") + public Gh823User createUser(Gh823User user) { + return userDao.save(user); + } + + @PostAction("users2") + @PropertySpec("id") + @Transactional + public Gh823User createUser2(Gh823User user) { + return userDao.save(user); + } + + @PutAction("users/{user}") + public Gh823User update(@DbBind Gh823User user, Gh823User data) { + $.merge(data).to(user); + return userDao.save(user); + } + + @PutAction("users2/{user}") + @Transactional + public Gh823User updateWithExplicitTransaction(@DbBind Gh823User user, Gh823User data) { + $.merge(data).to(user); + return userDao.save(user); + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh829.java b/testapps/GHIssues/src/main/java/ghissues/Gh829.java new file mode 100644 index 000000000..65f752d56 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh829.java @@ -0,0 +1,41 @@ +package ghissues; + +import act.annotations.DownloadFilename; +import act.app.ActionContext; +import act.controller.annotation.UrlContext; +import act.job.OnAppStart; +import act.util.Global; +import org.osgl.mvc.annotation.GetAction; +import org.osgl.util.S; + +import java.util.ArrayList; +import java.util.List; + +@UrlContext("829") +public class Gh829 extends BaseController { + + public static class Foo { + public String name = S.random(); + } + + @Global + private List foos; + + @OnAppStart + public void prepareData() { + foos = new ArrayList<>(); + for (int i = 0; i < 10; ++i) { + foos.add(new Foo()); + } + } + + @GetAction + @DownloadFilename("foo") + public List testStatic(ActionContext context, String nonce) { + if (S.notBlank(nonce)) { + context.downloadFileName("foo-" + nonce); + } + return foos; + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh832.java b/testapps/GHIssues/src/main/java/ghissues/Gh832.java new file mode 100644 index 000000000..ca5065fe0 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh832.java @@ -0,0 +1,14 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import org.osgl.mvc.annotation.GetAction; + +@UrlContext("832") +public class Gh832 extends BaseController { + + @GetAction("/post/{cityId}") + public int action(int cityId) { + return cityId; + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh834.java b/testapps/GHIssues/src/main/java/ghissues/Gh834.java new file mode 100644 index 000000000..c63da9064 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh834.java @@ -0,0 +1,20 @@ +package ghissues; + +import static act.controller.Controller.Util.renderImage; + +import act.controller.annotation.UrlContext; +import org.osgl.mvc.annotation.GetAction; +import org.osgl.util.Img; + +import java.awt.image.BufferedImage; + +@UrlContext("834") +public class Gh834 extends BaseController { + + @GetAction + public void test() { + BufferedImage image = Img.source(Img.F.randomPixels(600, 480)).get(); + renderImage(image); + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh835.java b/testapps/GHIssues/src/main/java/ghissues/Gh835.java new file mode 100644 index 000000000..c3b608329 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh835.java @@ -0,0 +1,41 @@ +package ghissues; + +import act.app.ActionContext; +import act.controller.Controller; +import act.controller.annotation.UrlContext; +import act.handler.ReturnValueAdvice; +import act.handler.ReturnValueAdvisor; +import org.osgl.aaa.NoAuthentication; +import org.osgl.mvc.annotation.GetAction; +import org.osgl.util.C; + +@UrlContext("835") +@NoAuthentication +public class Gh835 extends Controller.Util { + + public static class GenkoAdvice implements ReturnValueAdvice { + @Override + public Object applyTo(Object o, ActionContext actionContext) { + return C.Map("code", 0, "data", o); + } + } + + public static class GlobalAdvice implements ReturnValueAdvice { + @Override + public Object applyTo(Object o, ActionContext actionContext) { + return C.Map("code", 1, "data", o); + } + } + + @GetAction("withSpecificAdvice") + @ReturnValueAdvisor(GenkoAdvice.class) + public String test1() { + return "Hello Genko!"; + } + + @GetAction("withGlobalAdvice") + public Integer test2() { + return 5; + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh835a.java b/testapps/GHIssues/src/main/java/ghissues/Gh835a.java new file mode 100644 index 000000000..ef2bb76ee --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh835a.java @@ -0,0 +1,21 @@ +package ghissues; + +import act.controller.Controller; +import act.controller.annotation.UrlContext; +import act.handler.NoReturnValueAdvice; +import act.handler.ReturnValueAdvisor; +import org.osgl.aaa.NoAuthentication; +import org.osgl.mvc.annotation.GetAction; + +@UrlContext("835a") +@ReturnValueAdvisor(Gh835.GenkoAdvice.class) +@NoAuthentication +public class Gh835a extends Controller.Util { + + @NoReturnValueAdvice + @GetAction + public Integer test() { + return 5; + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh841.java b/testapps/GHIssues/src/main/java/ghissues/Gh841.java new file mode 100644 index 000000000..65b48abd2 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh841.java @@ -0,0 +1,22 @@ +package ghissues; + +import act.controller.Controller; +import act.controller.annotation.UrlContext; +import act.util.LogSupport; +import org.osgl.aaa.NoAuthentication; +import org.osgl.mvc.annotation.GetAction; +import org.osgl.util.C; + +import java.util.Map; + +@UrlContext("841") +@NoAuthentication +public class Gh841 extends LogSupport { + + @GetAction + public Map test(boolean fail) { + Controller.Util.unauthorizedIf(fail); + return C.Map("token", "aaa"); + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh844.java b/testapps/GHIssues/src/main/java/ghissues/Gh844.java new file mode 100644 index 000000000..09652829d --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh844.java @@ -0,0 +1,28 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import act.inject.util.LoadResource; +import act.util.HeaderMapping; +import org.osgl.mvc.annotation.GetAction; + +import java.util.List; + +@UrlContext("844") +public class Gh844 extends BaseController { + + public static class Country { + public Integer no; + public String code; + public String name; + } + + @LoadResource("countries.csv") + @HeaderMapping("country as name") + private List countryList; + + @GetAction + public List test() { + return countryList; + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh852.java b/testapps/GHIssues/src/main/java/ghissues/Gh852.java new file mode 100644 index 000000000..cff94ebb0 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh852.java @@ -0,0 +1,25 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import act.util.PropertySpec; +import org.osgl.aaa.NoAuthentication; +import org.osgl.mvc.annotation.GetAction; +import org.osgl.util.N; +import org.osgl.util.S; + +@UrlContext("852") +@NoAuthentication +public class Gh852 { + + public static class Foo { + public String id = S.random(); + public int number = N.randInt(); + } + + @GetAction + @PropertySpec("-id") + public Foo test() { + return new Foo(); + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh857.java b/testapps/GHIssues/src/main/java/ghissues/Gh857.java new file mode 100644 index 000000000..5c592e881 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh857.java @@ -0,0 +1,60 @@ +package ghissues; + +import act.annotations.Order; +import act.annotations.Sorted; +import act.controller.annotation.UrlContext; +import org.osgl.$; +import org.osgl.inject.annotation.TypeOf; +import org.osgl.mvc.annotation.GetAction; +import org.osgl.util.C; + +import java.util.List; + +@UrlContext("857") +public class Gh857 extends BaseController { + + public interface Service857 { + String name(); + } + + @Order(2) + public static class BarService implements Service857 { + @Override + public String name() { + return "bar"; + } + } + + @Order(11) + public static class FooService implements Service857 { + @Override + public String name() { + return "foo"; + } + + } + + @Order(3) + public static class ZooService implements Service857 { + @Override + public String name() { + return "zoo"; + } + } + + + @TypeOf + @Sorted + private List services; + + @GetAction + public List test() { + return C.list(services).map(new $.Transformer() { + @Override + public String transform(Service857 service857) { + return service857.name(); + } + }); + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh860.java b/testapps/GHIssues/src/main/java/ghissues/Gh860.java new file mode 100644 index 000000000..36c7310c5 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh860.java @@ -0,0 +1,14 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import org.osgl.mvc.annotation.GetAction; + +@UrlContext("860") +public class Gh860 extends BaseController { + + @GetAction + public String test(String content) { + return content; + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh862.java b/testapps/GHIssues/src/main/java/ghissues/Gh862.java new file mode 100644 index 000000000..8b28b0cec --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh862.java @@ -0,0 +1,53 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import act.db.DbBind; +import act.db.jpa.JPADao; +import act.inject.SessionVariable; +import org.osgl.http.H; +import org.osgl.mvc.annotation.*; + +import javax.inject.Inject; +import javax.persistence.*; + +@UrlContext("862") +public class Gh862 extends BaseController { + + @Entity(name = "foo862") + public static class Gh862Foo { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + public Integer id; + + public String name; + } + + @Inject + private JPADao dao; + + @SessionVariable + @DbBind + private Gh862Foo foo; + + @PostAction + public Gh862Foo create(final Gh862Foo foo) { + return dao.save(foo); + } + + @GetAction + public Iterable list() { + return dao.findAll(); + } + + + @PutAction("current/{target}") + public Gh862Foo select(@DbBind Gh862Foo target, H.Session session) { + session.put("foo", target.id); + return target; + } + + @GetAction("current") + public Gh862Foo current() { + return foo; + } +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh866.java b/testapps/GHIssues/src/main/java/ghissues/Gh866.java new file mode 100644 index 000000000..3d8cb7750 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh866.java @@ -0,0 +1,22 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import act.util.PropertySpec; +import org.osgl.mvc.annotation.GetAction; +import org.osgl.util.*; + +@UrlContext("866") +public class Gh866 extends BaseController { + + public static class Foo { + public String name = S.random(); + public int number = N.randInt(); + } + + @GetAction + @PropertySpec("name") + public Iterable list() { + return C.list(new Foo()); + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh869.java b/testapps/GHIssues/src/main/java/ghissues/Gh869.java new file mode 100644 index 000000000..546910e6e --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh869.java @@ -0,0 +1,12 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import org.osgl.mvc.annotation.GetAction; + +@UrlContext("api/v1/869") +public class Gh869 extends BaseController { + + @GetAction + public void test() {} + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh870.java b/testapps/GHIssues/src/main/java/ghissues/Gh870.java new file mode 100644 index 000000000..d86a0c909 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh870.java @@ -0,0 +1,15 @@ +package ghissues; + +import act.controller.Controller; +import act.controller.annotation.UrlContext; +import org.osgl.mvc.annotation.GetAction; + +@UrlContext("870") +public class Gh870 extends BaseController { + + @GetAction + public void test() { + Controller.Util.badRequest(101, "missing key"); + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh871.java b/testapps/GHIssues/src/main/java/ghissues/Gh871.java new file mode 100644 index 000000000..25d4bf9ce --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh871.java @@ -0,0 +1,36 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import act.inject.param.NoBind; +import org.osgl.mvc.annotation.GetAction; +import org.osgl.util.N; + +import javax.inject.Singleton; + +@UrlContext("871") +@Singleton +public class Gh871 extends BaseController { + + public static class Foo { + public Bar bar = new Bar(); + } + + public static class Bar { + public int id = N.randInt(); + } + + @NoBind + private Foo foo; + + @GetAction("setup") + public Foo setup() { + foo = new Foo(); + return foo; + } + + @GetAction + public Foo test() { + return foo; + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh878.java b/testapps/GHIssues/src/main/java/ghissues/Gh878.java new file mode 100644 index 000000000..b2d39137c --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh878.java @@ -0,0 +1,46 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import act.util.PropertySpec; +import act.util.SimpleBean; +import org.osgl.aaa.NoAuthentication; +import org.osgl.mvc.annotation.GetAction; +import org.osgl.util.*; + +@UrlContext("878") +@NoAuthentication +public class Gh878 { + + public static class Foo implements SimpleBean{ + public Bar bar; + public Integer id; + + public Foo(Bar bar, Integer id) { + this.bar = bar; + this.id = id; + } + } + + public static class Bar implements SimpleBean { + public Integer id; + public String name; + + public Bar(Integer id, String name) { + this.id = id; + this.name = name; + } + } + + @GetAction("list") + @PropertySpec("-bar.id") + public Iterable test() { + return C.list(new Foo(new Bar(1, "a"), 1), new Foo(new Bar(2, "b"), 2)); + } + + @GetAction + @PropertySpec("-bar.id,-id") + public Foo test2() { + return new Foo(new Bar(1, "a"), 1); + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh905.java b/testapps/GHIssues/src/main/java/ghissues/Gh905.java new file mode 100644 index 000000000..7342e7a87 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh905.java @@ -0,0 +1,20 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import act.util.SimpleBean; +import org.osgl.mvc.annotation.PostAction; + +@UrlContext("905") +public class Gh905 extends BaseController { + + public static class Foo implements SimpleBean { + public int id; + public String name; + } + + @PostAction + public Foo create(Foo foo) { + return foo; + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh906.java b/testapps/GHIssues/src/main/java/ghissues/Gh906.java new file mode 100644 index 000000000..a8a26022f --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh906.java @@ -0,0 +1,40 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import act.util.PropertySpec; +import act.util.SimpleBean; +import org.osgl.http.H; +import org.osgl.mvc.annotation.GetAction; +import org.osgl.mvc.annotation.ResponseContentType; +import org.osgl.util.S; + +public class Gh906 { + + public static class Foo implements SimpleBean { + public int id; + public String name; + + public Foo(int id, String name) { + this.id = id; + this.name = name; + } + + @Override + public String toString() { + return S.string(id); + } + } + + public abstract static class Super extends BaseController { + @GetAction + @ResponseContentType(H.MediaType.TXT) + @PropertySpec("id") + public Foo getFoo(int id, String name) { + return new Foo(id, name); + } + } + + @UrlContext("906") + public static class Child extends Super {} + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh907.java b/testapps/GHIssues/src/main/java/ghissues/Gh907.java new file mode 100644 index 000000000..0e31cd8d0 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh907.java @@ -0,0 +1,26 @@ +package ghissues; + +import static act.controller.Controller.Util.notFound; + +import act.controller.annotation.UrlContext; +import org.osgl.mvc.annotation.Before; +import org.osgl.mvc.annotation.GetAction; + +public class Gh907 { + + public static class Super extends BaseController { + @Before + public void before() { + notFound(); + } + } + + @UrlContext("907") + public static class Child extends Super { + @GetAction + public String test() { + return "oops"; + } + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh908.java b/testapps/GHIssues/src/main/java/ghissues/Gh908.java new file mode 100644 index 000000000..520a6ca31 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh908.java @@ -0,0 +1,13 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import org.joda.time.DateTime; +import org.osgl.mvc.annotation.GetAction; + +@UrlContext("908") +public class Gh908 extends BaseController { + @GetAction + public DateTime test() { + return DateTime.now().withMillisOfSecond(0); + } +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh911.java b/testapps/GHIssues/src/main/java/ghissues/Gh911.java new file mode 100644 index 000000000..bfeaca664 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh911.java @@ -0,0 +1,36 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import org.joda.time.DateTime; +import org.osgl.mvc.annotation.GetAction; +import org.osgl.util.S; +import org.rythmengine.utils.Time; + +@UrlContext("911") +public class Gh911 extends BaseController { + + @GetAction + public DateTime getTime(String delta) { + DateTime now = DateTime.now(); + int seconds; + if (null != delta) { + if (S.isInt(delta)) { + seconds = Integer.parseInt(delta); + } else { + boolean negative = false; + if (delta.startsWith("+")) { + delta = delta.substring(1); + } else if (delta.startsWith("-")) { + delta = delta.substring(1); + negative = true; + } else { + throw new IllegalArgumentException("Unknown delta: " + delta); + } + seconds = Time.parseDuration(delta); + } + now = now.plusSeconds(seconds); + } + return now; + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh922.java b/testapps/GHIssues/src/main/java/ghissues/Gh922.java new file mode 100644 index 000000000..eef43b769 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh922.java @@ -0,0 +1,51 @@ +package ghissues; + +import act.app.ActionContext; +import act.controller.annotation.UrlContext; +import act.handler.ValidateViolationAdvice; +import act.handler.ValidateViolationAdvisor; +import com.alibaba.fastjson.JSONObject; +import org.osgl.aaa.NoAuthentication; +import org.osgl.mvc.annotation.GetAction; +import org.osgl.mvc.result.RenderJSON; +import org.osgl.util.C; + +import java.util.Map; +import javax.validation.ConstraintViolation; +import javax.validation.constraints.Max; +import javax.validation.constraints.NotNull; + +@UrlContext("922") +@NoAuthentication +public class Gh922 { + + public static class GenkoAdvice implements ValidateViolationAdvice { + @Override + public Object onValidateViolation(Map violations, ActionContext context) { + throw new RenderJSON(violations); + } + } + + public static class GlobalAdvice implements ValidateViolationAdvice { + @Override + public Object onValidateViolation(Map violations, ActionContext context) { + JSONObject json = new JSONObject(); + json.put("code", 1); + json.put("msg", "xxx"); + json.put("count", 180); + json.put("data", C.Map("item", new int[]{1, 2, 3})); + return json; + } + } + + + @GetAction("global") + public void global(@NotNull String x, @Max(100) int n) { + } + + @GetAction("specific") + @ValidateViolationAdvisor(GenkoAdvice.class) + public void specific(@NotNull String x, @Max(100) int n) { + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh925.java b/testapps/GHIssues/src/main/java/ghissues/Gh925.java new file mode 100644 index 000000000..39aefde09 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh925.java @@ -0,0 +1,15 @@ +package ghissues; + +public class Gh925 { + + public static class Super extends BaseController {} + + public static class Sub extends Super { + + public String test(String who) { + return who; + } + + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh946.java b/testapps/GHIssues/src/main/java/ghissues/Gh946.java new file mode 100644 index 000000000..89df92a39 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh946.java @@ -0,0 +1,20 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import org.osgl.inject.annotation.Configuration; +import org.osgl.mvc.annotation.GetAction; + +import java.util.Map; + +@UrlContext("946") +public class Gh946 extends BaseController { + + @Configuration("map.field") + private Map map; + + @GetAction + public Map test() { + return map; + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh958.java b/testapps/GHIssues/src/main/java/ghissues/Gh958.java new file mode 100644 index 000000000..4043d47c8 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh958.java @@ -0,0 +1,20 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import org.osgl.mvc.annotation.GetAction; + +@UrlContext("958") +public class Gh958 extends BaseController { + + @UrlContext("~fooBar~") + public static class Tester extends Gh958 { + + @GetAction + public String test() { + return "ok"; + } + + } + + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh976.java b/testapps/GHIssues/src/main/java/ghissues/Gh976.java new file mode 100644 index 000000000..ef1da4d40 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh976.java @@ -0,0 +1,13 @@ +package ghissues; + +import act.app.util.SimpleRestfulServiceBase; +import act.controller.annotation.UrlContext; +import act.handler.NoReturnValueAdvice; +import ghissues.gh976.Foo; +import org.osgl.aaa.NoAuthentication; + +@UrlContext("976") +@NoReturnValueAdvice +@NoAuthentication +public class Gh976 extends SimpleRestfulServiceBase { +} diff --git a/testapps/GHIssues/src/main/java/ghissues/Gh990.java b/testapps/GHIssues/src/main/java/ghissues/Gh990.java new file mode 100644 index 000000000..64b942e25 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/Gh990.java @@ -0,0 +1,46 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import org.osgl.mvc.annotation.GetAction; + +import javax.inject.Inject; +import javax.inject.Named; + +@UrlContext("990") +public class Gh990 extends BaseController { + + @Inject + @Named("a") + private P p; + + @GetAction + public String say(){ + return p.say(); + } + + public interface P { + String say(); + } + + @Named("a") + public static class A implements P{ + public String say(){ + return (this.getClass().getSimpleName()); + } + } + + @Named("b") + public static class B implements P{ + public String say(){ + return (this.getClass().getSimpleName()); + } + } + + public static class Module extends org.osgl.inject.Module { + @Override + protected void configure() { + bind(P.class).to(A.class).named("a"); + } + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/OsglTool181.java b/testapps/GHIssues/src/main/java/ghissues/OsglTool181.java new file mode 100644 index 000000000..002ecf6dd --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/OsglTool181.java @@ -0,0 +1,27 @@ +package ghissues; + +import act.controller.annotation.UrlContext; +import act.util.AdaptiveBean; +import com.alibaba.fastjson.JSONObject; +import org.osgl.$; +import org.osgl.mvc.annotation.GetAction; + +// for https://github.com/osglworks/java-tool/issues/181 +@UrlContext("osgl-tool/181") +public class OsglTool181 extends BaseController { + public static class Kit extends AdaptiveBean { + } + + @GetAction + public Kit test181() { + Kit kit = new Kit(); + kit.putValue("DisplayName", "Primary Kit - kids aged 5-9 (unavailable - restock due 2019)"); + + JSONObject newData = new JSONObject(); + newData.put("DisplayName", "Primary Kit - kids aged 5-9"); + $.merge(newData).to(kit); + + return kit; + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/User.java b/testapps/GHIssues/src/main/java/ghissues/User.java new file mode 100644 index 000000000..6c3c12f7d --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/User.java @@ -0,0 +1,13 @@ +package ghissues; + +import act.aaa.model.UserBase; + +import javax.persistence.*; + +@Entity(name = "user0") +@Table(name = "user0") +public class User extends UserBase { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + public Integer id; +} diff --git a/testapps/GHIssues/src/main/java/ghissues/gh1049/Policy.java b/testapps/GHIssues/src/main/java/ghissues/gh1049/Policy.java new file mode 100644 index 000000000..b805817d5 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh1049/Policy.java @@ -0,0 +1,41 @@ +package ghissues.gh1049; + +import com.alibaba.fastjson.JSONObject; +import org.joda.time.DateTime; +import org.joda.time.format.DateTimeFormat; +import org.joda.time.format.DateTimeFormatter; +import org.osgl.$; + +public class Policy { + public Integer policyId; + public Integer clientId; + public Integer productId; + public String effectiveDate; + public JSONObject needs; + + public DateTime effectiveDate() { + if (null == effectiveDate) { + return null; + } + DateTimeFormatter fmt = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSS"); + return fmt.parseDateTime(effectiveDate); + } + + @Override + public int hashCode() { + return $.hc(getClass(), policyId); + } + + @Override + public boolean equals(Object obj) { + if (obj == this) { + return true; + } + if (obj instanceof Policy) { + Policy that = $.cast(obj); + return $.eq(that.policyId, this.policyId); + } + return false; + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/gh1049/QuotePolicyBase.java b/testapps/GHIssues/src/main/java/ghissues/gh1049/QuotePolicyBase.java new file mode 100644 index 000000000..d056abb6c --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh1049/QuotePolicyBase.java @@ -0,0 +1,12 @@ +package ghissues.gh1049; + +import act.data.annotation.Data; + +@Data(callSuper = false) +public class QuotePolicyBase extends UcModelBase { + public Integer clientId; + public Integer productId; + public String clientName; + public String effectiveDate; + public String needs; +} \ No newline at end of file diff --git a/testapps/GHIssues/src/main/java/ghissues/gh1049/Test.java b/testapps/GHIssues/src/main/java/ghissues/gh1049/Test.java new file mode 100644 index 000000000..a6154d7c4 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh1049/Test.java @@ -0,0 +1,15 @@ +package ghissues.gh1049; + +import act.controller.annotation.UrlContext; +import ghissues.BaseController; +import org.osgl.mvc.annotation.PostAction; + +@UrlContext("1049") +public class Test extends BaseController { + + @PostAction + public Policy post(Policy policy) { + return policy; + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/gh1049/UcModelBase.java b/testapps/GHIssues/src/main/java/ghissues/gh1049/UcModelBase.java new file mode 100644 index 000000000..b53104fd2 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh1049/UcModelBase.java @@ -0,0 +1,21 @@ +package ghissues.gh1049; + +import act.util.AdaptiveBean; + +public class UcModelBase extends AdaptiveBean { + @Override + public int hashCode() { + return asMap().hashCode(); + } + + @Override + public boolean equals(Object obj) { + if (obj == this) { + return false; + } + if (obj.getClass().equals(getClass())) { + return ((UcModelBase) obj).asMap().equals(asMap()); + } + return false; + } +} diff --git a/testapps/GHIssues/src/main/java/ghissues/gh1064/Department.java b/testapps/GHIssues/src/main/java/ghissues/gh1064/Department.java new file mode 100644 index 000000000..b853fbf00 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh1064/Department.java @@ -0,0 +1,21 @@ +package ghissues.gh1064; + +import act.data.annotation.Data; +import act.util.SimpleBean; + +import java.util.List; + +@Data +public class Department implements SimpleBean { + + public Long id; + + public String name; + + public Department parent; + + public List children; + + public List users; + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/gh1064/Gh1064.java b/testapps/GHIssues/src/main/java/ghissues/gh1064/Gh1064.java new file mode 100644 index 000000000..c643ad532 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh1064/Gh1064.java @@ -0,0 +1,20 @@ +package ghissues.gh1064; + +import act.controller.annotation.UrlContext; +import ghissues.BaseController; +import org.osgl.mvc.annotation.PostAction; + +@UrlContext("1064") +public class Gh1064 extends BaseController { + + @PostAction("departments") + public Department createDepartment(Department department) { + return department; + } + + @PostAction("users") + public User createUser(User user) { + return user; + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/gh1064/User.java b/testapps/GHIssues/src/main/java/ghissues/gh1064/User.java new file mode 100644 index 000000000..371f78a65 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh1064/User.java @@ -0,0 +1,13 @@ +package ghissues.gh1064; + +import act.data.annotation.Data; +import act.util.SimpleBean; + +@Data +public class User implements SimpleBean { + + public Long id; + + + public Department department; +} diff --git a/testapps/GHIssues/src/main/java/ghissues/gh1069/Gh1069User.java b/testapps/GHIssues/src/main/java/ghissues/gh1069/Gh1069User.java new file mode 100644 index 000000000..449d1366c --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh1069/Gh1069User.java @@ -0,0 +1,21 @@ +package ghissues.gh1069; + +import act.db.jpa.JPADao; + +import javax.persistence.*; + +@Entity +public class Gh1069User { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + public Integer id; + + @Unique(entity = Gh1069User.class, field = "name") + public String name; + + public static class Dao extends JPADao { + } + + +} \ No newline at end of file diff --git a/testapps/GHIssues/src/main/java/ghissues/gh1069/Gh1069_Service.java b/testapps/GHIssues/src/main/java/ghissues/gh1069/Gh1069_Service.java new file mode 100644 index 000000000..91dd0dbf0 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh1069/Gh1069_Service.java @@ -0,0 +1,19 @@ +package ghissues.gh1069; + +import act.controller.annotation.UrlContext; +import ghissues.BaseController; +import org.osgl.mvc.annotation.PostAction; + +import javax.inject.Inject; + +@UrlContext("1069") +public class Gh1069_Service extends BaseController { + @Inject + Gh1069User.Dao dao; + + @PostAction + public void test(Gh1069User user) { + dao.save(user); + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/gh1069/Unique.java b/testapps/GHIssues/src/main/java/ghissues/gh1069/Unique.java new file mode 100644 index 000000000..d638ad088 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh1069/Unique.java @@ -0,0 +1,21 @@ +package ghissues.gh1069; + +import java.lang.annotation.*; +import javax.validation.*; + +@ReportAsSingleViolation +@Constraint(validatedBy = UniqueValidator.class) +@Target({ElementType.FIELD, ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +public @interface Unique { + + String message() default "{org.hibernate.validator.constraints.Length.message}"; + + Class entity(); + + String field(); + + Class[] groups() default { }; + + Class[] payload() default { }; +} \ No newline at end of file diff --git a/testapps/GHIssues/src/main/java/ghissues/gh1069/UniqueValidator.java b/testapps/GHIssues/src/main/java/ghissues/gh1069/UniqueValidator.java new file mode 100644 index 000000000..4682fc0da --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh1069/UniqueValidator.java @@ -0,0 +1,32 @@ +package ghissues.gh1069; + +import act.app.App; +import act.db.Dao; +import org.apache.bval.jsr.ConstraintValidatorContextImpl; + +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; + +public class UniqueValidator implements ConstraintValidator { + + private Dao dao; + private String field; + + @Override + public void initialize(Unique parameters) { + Class cls = parameters.entity(); + dao = App.instance().dbServiceManager().dao(cls); + field = parameters.field(); + } + + @Override + public boolean isValid(Object value, ConstraintValidatorContext context) { + if (value == null) { + return true; + } + if (dao != null && context instanceof ConstraintValidatorContextImpl) { + return dao.countBy(field, value) <= 0; + } + return false; + } +} \ No newline at end of file diff --git a/testapps/GHIssues/src/main/java/ghissues/gh1072/BaseModel.java b/testapps/GHIssues/src/main/java/ghissues/gh1072/BaseModel.java new file mode 100644 index 000000000..cc466fc0a --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh1072/BaseModel.java @@ -0,0 +1,20 @@ +package ghissues.gh1072; + +import act.controller.annotation.UrlContext; +import act.db.jpa.JPADao; +import act.util.SimpleBean; + +import javax.persistence.*; + +@MappedSuperclass +public class BaseModel implements SimpleBean { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + public Long id; + + public String name; + + @UrlContext("1072") + public static class Dao extends JPADao { + } +} diff --git a/testapps/GHIssues/src/main/java/ghissues/gh1072/SupportInfo.java b/testapps/GHIssues/src/main/java/ghissues/gh1072/SupportInfo.java new file mode 100644 index 000000000..28258f7a4 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh1072/SupportInfo.java @@ -0,0 +1,23 @@ +package ghissues.gh1072; + +import act.controller.annotation.UrlContext; +import org.osgl.mvc.annotation.GetAction; + +import javax.persistence.Entity; + +@Entity +public class SupportInfo extends BaseModel { + + public boolean supported; + + @UrlContext("support") + public static class Dao extends BaseModel.Dao { + + @GetAction + public String test() { + return "1072"; + } + + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/gh1078/Gh1078_Base.java b/testapps/GHIssues/src/main/java/ghissues/gh1078/Gh1078_Base.java new file mode 100644 index 000000000..e1d7afa0e --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh1078/Gh1078_Base.java @@ -0,0 +1,15 @@ +package ghissues.gh1078; + +import ghissues.BaseController; +import org.osgl.mvc.annotation.After; +import org.osgl.mvc.result.RenderJSON; +import org.osgl.util.C; + +public abstract class Gh1078_Base extends BaseController { + + @After + public void after() { + throw new RenderJSON(C.Map("result", "intercepted")); + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/gh1078/Gh1078_Service.java b/testapps/GHIssues/src/main/java/ghissues/gh1078/Gh1078_Service.java new file mode 100644 index 000000000..58dbc008f --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh1078/Gh1078_Service.java @@ -0,0 +1,14 @@ +package ghissues.gh1078; + +import act.controller.annotation.UrlContext; +import org.osgl.mvc.annotation.GetAction; + +@UrlContext("1078") +public class Gh1078_Service extends Gh1078_Base { + + @GetAction + public String test() { + return "okay"; + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/gh1093/Gh1093Department.java b/testapps/GHIssues/src/main/java/ghissues/gh1093/Gh1093Department.java new file mode 100644 index 000000000..a6129cbdd --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh1093/Gh1093Department.java @@ -0,0 +1,9 @@ +package ghissues.gh1093; + +import java.util.ArrayList; +import java.util.List; + +public class Gh1093Department { + public String name; + public List users = new ArrayList<>(); +} diff --git a/testapps/GHIssues/src/main/java/ghissues/gh1093/Gh1093Service.java b/testapps/GHIssues/src/main/java/ghissues/gh1093/Gh1093Service.java new file mode 100644 index 000000000..a782e53d1 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh1093/Gh1093Service.java @@ -0,0 +1,28 @@ +package ghissues.gh1093; + +import act.cli.Command; +import act.controller.annotation.UrlContext; +import ghissues.BaseController; +import org.osgl.mvc.annotation.GetAction; + +import java.util.ArrayList; +import java.util.List; + +@UrlContext("1093") +public class Gh1093Service extends BaseController { + + @GetAction("users") + @Command("1092.users") + public List listUsers() { + List list = new ArrayList<>(); + Gh1093Department dep = new Gh1093Department(); + dep.name = "RD"; + Gh1093User green = new Gh1093User(); + list.add(green); + green.name = "green"; + green.department = dep; + dep.users.add(green); + return list; + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/gh1093/Gh1093User.java b/testapps/GHIssues/src/main/java/ghissues/gh1093/Gh1093User.java new file mode 100644 index 000000000..12ca9e51e --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh1093/Gh1093User.java @@ -0,0 +1,6 @@ +package ghissues.gh1093; + +public class Gh1093User { + public String name; + public Gh1093Department department; +} diff --git a/testapps/GHIssues/src/main/java/ghissues/gh1095/GH1095Base.java b/testapps/GHIssues/src/main/java/ghissues/gh1095/GH1095Base.java new file mode 100644 index 000000000..878c6ed6a --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh1095/GH1095Base.java @@ -0,0 +1,10 @@ +package ghissues.gh1095; + +import act.util.SimpleBean; + +import java.util.ArrayList; +import java.util.List; + +public class GH1095Base implements SimpleBean { + public List children = new ArrayList<>(); +} diff --git a/testapps/GHIssues/src/main/java/ghissues/gh1095/GH1095Department.java b/testapps/GHIssues/src/main/java/ghissues/gh1095/GH1095Department.java new file mode 100644 index 000000000..3d050f87e --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh1095/GH1095Department.java @@ -0,0 +1,9 @@ +package ghissues.gh1095; + +public class GH1095Department extends GH1095Base { + public String name; + + public GH1095Department(String name) { + this.name = name; + } +} diff --git a/testapps/GHIssues/src/main/java/ghissues/gh1095/Gh1095TestBed.java b/testapps/GHIssues/src/main/java/ghissues/gh1095/Gh1095TestBed.java new file mode 100644 index 000000000..0324e4fba --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh1095/Gh1095TestBed.java @@ -0,0 +1,26 @@ +package ghissues.gh1095; + +import act.cli.Command; +import act.controller.annotation.UrlContext; +import act.util.JsonView; +import act.util.PropertySpec; +import ghissues.BaseController; +import org.osgl.mvc.annotation.GetAction; + +@UrlContext("1095") +public class Gh1095TestBed extends BaseController { + + @Command("1095.test") + @JsonView + @PropertySpec("name,children.*") + @GetAction + public GH1095Department test() { + GH1095Department c1 = new GH1095Department("c1"); + GH1095Department c2 = new GH1095Department("c2"); + GH1095Department p = new GH1095Department("p"); + p.children.add(c1); + p.children.add(c2); + return p; + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/gh1378/Category.java b/testapps/GHIssues/src/main/java/ghissues/gh1378/Category.java new file mode 100644 index 000000000..0a3a685e3 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh1378/Category.java @@ -0,0 +1,16 @@ +package ghissues.gh1378; + +import act.data.annotation.Data; +import act.db.DB; +import act.util.SimpleBean; + +import javax.persistence.Entity; +import javax.persistence.Id; + +@Entity +@DB("ebean") +public class Category implements SimpleBean { + @Id + public int id; + public String name; +} diff --git a/testapps/GHIssues/src/main/java/ghissues/gh1378/Gh1378.java b/testapps/GHIssues/src/main/java/ghissues/gh1378/Gh1378.java new file mode 100644 index 000000000..57dedd8a9 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh1378/Gh1378.java @@ -0,0 +1,34 @@ +package ghissues.gh1378; + +import act.controller.annotation.UrlContext; +import act.db.DbBind; +import act.db.ebean.EbeanDao; +import ghissues.BaseController; +import org.osgl.$; +import org.osgl.mvc.annotation.GetAction; +import org.osgl.mvc.annotation.PutAction; + +import javax.inject.Inject; +import javax.validation.constraints.NotNull; + +import static act.controller.Controller.Util.notFoundIfNull; + +@UrlContext("1378") +public class Gh1378 extends BaseController { + + @Inject + private EbeanDao dao; + + @PutAction("{id}") + public void update(@DbBind("id") @NotNull Category cate, Category category) { + notFoundIfNull(cate); + //$.merge(category).filter("-id").to(cate); + cate.name = category.name; + dao.save(cate); + } + + @GetAction("{id}") + public Category findById(int id) { + return dao.findById(id); + } +} diff --git a/testapps/GHIssues/src/main/java/ghissues/gh532/Foo.java b/testapps/GHIssues/src/main/java/ghissues/gh532/Foo.java new file mode 100644 index 000000000..29bf8b152 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh532/Foo.java @@ -0,0 +1,7 @@ +package ghissues.gh532; + +import java.util.List; + +public class Foo { + public List items; +} diff --git a/testapps/GHIssues/src/main/java/ghissues/gh532/FooService.java b/testapps/GHIssues/src/main/java/ghissues/gh532/FooService.java new file mode 100644 index 000000000..27be2f294 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh532/FooService.java @@ -0,0 +1,12 @@ +package ghissues.gh532; + +import act.controller.annotation.UrlContext; +import ghissues.BaseController; +import org.osgl.mvc.annotation.GetAction; + +@UrlContext("532") +public class FooService extends BaseController { + @GetAction + public void test(Foo foo) { + } +} diff --git a/testapps/GHIssues/src/main/java/ghissues/gh820/BaseService.java b/testapps/GHIssues/src/main/java/ghissues/gh820/BaseService.java new file mode 100644 index 000000000..54d0f7f9b --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh820/BaseService.java @@ -0,0 +1,7 @@ +package ghissues.gh820; + +import java.util.List; + +public interface BaseService { + List produceList(); +} diff --git a/testapps/GHIssues/src/main/java/ghissues/gh820/Gh820BaseController.java b/testapps/GHIssues/src/main/java/ghissues/gh820/Gh820BaseController.java new file mode 100644 index 000000000..25cdd3cac --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh820/Gh820BaseController.java @@ -0,0 +1,14 @@ +package ghissues.gh820; + +import ghissues.BaseController; + +import javax.inject.Inject; + +public class Gh820BaseController> extends BaseController { + @Inject + private SERVICE service; + + protected SERVICE service() { + return service; + } +} diff --git a/testapps/GHIssues/src/main/java/ghissues/gh820/IntegerService.java b/testapps/GHIssues/src/main/java/ghissues/gh820/IntegerService.java new file mode 100644 index 000000000..baafcda6c --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh820/IntegerService.java @@ -0,0 +1,12 @@ +package ghissues.gh820; + +import org.osgl.util.C; + +import java.util.List; + +public class IntegerService implements BaseService { + @Override + public List produceList() { + return C.list(1, 2, 3); + } +} diff --git a/testapps/GHIssues/src/main/java/ghissues/gh823/Gh823User.java b/testapps/GHIssues/src/main/java/ghissues/gh823/Gh823User.java new file mode 100644 index 000000000..c77a326f6 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh823/Gh823User.java @@ -0,0 +1,14 @@ +package ghissues.gh823; + +import act.util.SimpleBean; + +import javax.persistence.*; + +@Entity(name = "user_823") +public class Gh823User implements SimpleBean { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + public Integer id; + + public String name; +} diff --git a/testapps/GHIssues/src/main/java/ghissues/gh928/BaseModel.java b/testapps/GHIssues/src/main/java/ghissues/gh928/BaseModel.java new file mode 100644 index 000000000..ce5abac75 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh928/BaseModel.java @@ -0,0 +1,14 @@ +package ghissues.gh928; + +import act.util.SimpleBean; + +import javax.persistence.*; + +@MappedSuperclass +public abstract class BaseModel implements SimpleBean { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + public Integer id; + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/gh928/Department.java b/testapps/GHIssues/src/main/java/ghissues/gh928/Department.java new file mode 100644 index 000000000..c65632a14 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh928/Department.java @@ -0,0 +1,10 @@ +package ghissues.gh928; + +import javax.persistence.Entity; + +@Entity +public class Department extends BaseModel { + + public String name; + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/gh928/DepartmentService.java b/testapps/GHIssues/src/main/java/ghissues/gh928/DepartmentService.java new file mode 100644 index 000000000..d7a84133a --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh928/DepartmentService.java @@ -0,0 +1,21 @@ +package ghissues.gh928; + +import act.controller.annotation.UrlContext; +import act.db.jpa.JPADao; +import ghissues.BaseController; +import org.osgl.mvc.annotation.GetAction; + +import javax.inject.Inject; + +@UrlContext("928/departments") +public class DepartmentService extends BaseController { + + @Inject + private JPADao dao; + + @GetAction + public Iterable list() { + return dao.findAll(); + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/gh928/User.java b/testapps/GHIssues/src/main/java/ghissues/gh928/User.java new file mode 100644 index 000000000..cd17f48c8 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh928/User.java @@ -0,0 +1,10 @@ +package ghissues.gh928; + +import javax.persistence.Entity; + +@Entity +public class User extends BaseModel { + + public String fullName; + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/gh928/UserService.java b/testapps/GHIssues/src/main/java/ghissues/gh928/UserService.java new file mode 100644 index 000000000..a0f84d7e3 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh928/UserService.java @@ -0,0 +1,21 @@ +package ghissues.gh928; + +import act.controller.annotation.UrlContext; +import act.db.jpa.JPADao; +import ghissues.BaseController; +import org.osgl.mvc.annotation.GetAction; + +import javax.inject.Inject; + +@UrlContext("928/users") +public class UserService extends BaseController { + + @Inject + private JPADao dao; + + @GetAction + public Iterable list() { + return dao.findAll(); + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/gh967/Test.java b/testapps/GHIssues/src/main/java/ghissues/gh967/Test.java new file mode 100644 index 000000000..593d62f91 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh967/Test.java @@ -0,0 +1,16 @@ +package ghissues.gh967; + +import act.controller.annotation.UrlContext; +import ghissues.BaseController; +import org.osgl.mvc.annotation.GetAction; + +@UrlContext("967") +public class Test extends BaseController { + + @GetAction + public String test() { + XyzService svc = XyzService.instance(); + return svc.doService(); + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/gh967/XyzService.java b/testapps/GHIssues/src/main/java/ghissues/gh967/XyzService.java new file mode 100644 index 000000000..a8b0d34de --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh967/XyzService.java @@ -0,0 +1,11 @@ +package ghissues.gh967; + +import act.util.SingletonBase; + +public class XyzService extends SingletonBase { + + public String doService() { + return "xyz"; + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/gh976/Foo.java b/testapps/GHIssues/src/main/java/ghissues/gh976/Foo.java new file mode 100644 index 000000000..ee4641235 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh976/Foo.java @@ -0,0 +1,19 @@ +package ghissues.gh976; + +import act.db.jpa.JPADao; +import act.util.SimpleBean; + +import javax.persistence.*; + +@Entity(name = "foo976") +public class Foo implements SimpleBean { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + public Integer id; + + public String name; + + public static class Dao extends JPADao { + } + +} diff --git a/testapps/GHIssues/src/main/java/ghissues/gh985/Crud.java b/testapps/GHIssues/src/main/java/ghissues/gh985/Crud.java new file mode 100644 index 000000000..389cab27e --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh985/Crud.java @@ -0,0 +1,24 @@ +package ghissues.gh985; + +import act.app.ActionContext; +import act.controller.annotation.UrlContext; +import ghissues.BaseController; +import org.osgl.mvc.annotation.Before; +import org.osgl.mvc.annotation.GetAction; +import org.osgl.util.C; + +import java.util.Map; + +public abstract class Crud extends BaseController { + @Before + public void init(ActionContext context) { + context.renderArg("superInit", true); + } + + @GetAction + public Map test(ActionContext context) { + Boolean superInit = context.renderArg("superInit"); + Boolean subInit = context.renderArg("subInit"); + return C.Map("superInit", superInit, "subInit", subInit); + } +} diff --git a/testapps/GHIssues/src/main/java/ghissues/gh985/Sub.java b/testapps/GHIssues/src/main/java/ghissues/gh985/Sub.java new file mode 100644 index 000000000..543429054 --- /dev/null +++ b/testapps/GHIssues/src/main/java/ghissues/gh985/Sub.java @@ -0,0 +1,13 @@ +package ghissues.gh985; + +import act.app.ActionContext; +import act.controller.annotation.UrlContext; +import org.osgl.mvc.annotation.Before; + +@UrlContext("985") +public class Sub extends Crud { + @Before + public void initial(ActionContext context) { + context.renderArg("subInit", true); + } +} \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/1073.yml b/testapps/GHIssues/src/main/resources/1073.yml new file mode 100644 index 000000000..e846daadd --- /dev/null +++ b/testapps/GHIssues/src/main/resources/1073.yml @@ -0,0 +1,14 @@ +- id: u31.csg + name: 网管 + type: corba + provider: zz + adapter: Adapter + ip: 127.0.0.1 + port: 8080 + nameService: NameService + userName: user + password: aaa + howmany: 100 + nameComponents: + - id: 123 + kind: ems \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/1146.map b/testapps/GHIssues/src/main/resources/1146.map new file mode 100644 index 000000000..2a5453acd --- /dev/null +++ b/testapps/GHIssues/src/main/resources/1146.map @@ -0,0 +1,2 @@ +#comment +foo=bar #inline comment \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/1147.map b/testapps/GHIssues/src/main/resources/1147.map new file mode 100644 index 000000000..88af89c13 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/1147.map @@ -0,0 +1,2 @@ +one=1 +two=2 \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/1253.mapping b/testapps/GHIssues/src/main/resources/1253.mapping new file mode 100644 index 000000000..c9f0304f6 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/1253.mapping @@ -0,0 +1 @@ +foo=bar \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/1361.json b/testapps/GHIssues/src/main/resources/1361.json new file mode 100644 index 000000000..de6abb6d4 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/1361.json @@ -0,0 +1,44 @@ +{ + "remark": "", + "shOrder": { + "actualtotalprice": 149957, + "copId": 1, + "createTime": 1597915313613, + "id": 97, + "mobile": "", + "openid": "", + "out_trade_no": "1597915313617WXSPJS97", + "staffId": 1, + "stationId": 1, + "status": "Daizhifu", + "totalprice": 149957, + "type": "0", + "updateTime": 1597915313613, + "userId": 1, + "zhifumethod": "WEIXIN_FUWUSHANG_H5SCAN" + }, + "shOrderDetailList": [ + { + "actualTotalPrice": 249987, + "copId": 1, + "createTime": 1597915313619, + "giftId": 56, + "num": 1, + "orderId": 97, + "price": 249987, + "staffAProfit": 1100, + "staffAProfitPrice": 27498, + "staffAProfitType": "1", + "staffId": 1, + "stationId": 1, + "stationProfit": 100000, + "stationProfitPrice": 100000, + "stationProfitType": "2", + "status": "Daizhifu", + "totalPrice": 300000, + "type": 0, + "updateTime": 1597915313619 + } + ], + "succ": true +} \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/860.txt b/testapps/GHIssues/src/main/resources/860.txt new file mode 100644 index 000000000..fc80254b6 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/860.txt @@ -0,0 +1 @@ +pass \ No newline at end of file diff --git a/testapps/GHIssues/src/main/resources/asset/1151.json b/testapps/GHIssues/src/main/resources/asset/1151.json new file mode 100644 index 000000000..1c0acf6bf --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/1151.json @@ -0,0 +1,4 @@ +{ + "buildNumber": "${1151.buildNumber}", +} + diff --git a/testapps/GHIssues/src/main/resources/asset/changelog.txt b/testapps/GHIssues/src/main/resources/asset/changelog.txt new file mode 100755 index 000000000..d06e2fba7 --- /dev/null +++ b/testapps/GHIssues/src/main/resources/asset/changelog.txt @@ -0,0 +1,630 @@ +Version 1.5.5.x +--------------- +* Bug + * maskedbox: The component does not accept numeric keypad. fixed. + * combogrid: When selecting multiple records, the datagrid will scroll to the last checked record. fixed. +* Improvement + * Compatible with jQuery 3.x. + * tabs: The 'toolPosition' property can accept 'top' and 'bottom' values. + * textbox: The textbox label has the animating feature when focus or blur on it. + * tooltip: Add 'valign' property. + * tree: The node class can be initialized by setting the 'nodeCls' in the data. + +Version 1.5.5 +------------- +* Bug + * tabs: The selecting history has wrong order when the title contains complex elements. fixed. + * combo: The drop-down panel may not be hidden if a bigger 'delay' value is set. fixed. + * layout: The expanding panel does not collapse when move mouse quickly away from it. fixed. + * tagbox: The tagbox and the label don't stay in the same line. fixed. +* Improvement + * combo: The 'blur' event handler is attached to the 'inputEvents' property. + * numberbox: The 'cloneFrom' method is available. + * slider: The 'step' property can be set with a floating number. + * menu: The 'findItem' method allows the user to find menu item by any parameters. + * menubutton: Add 'showEvent' and 'hideEvent' properties. +* New Plugins + * maskedbox: The maskedbox enforces its structure as the user types. + +Version 1.5.4 +------------- +* Bug + * combotreegrid: The 'onChange' event does not fire when entering values on the inputing box. fixed. + * combobox: Clicking on the drop-down panel will jump to the bottom of body on win10 IE11. fixed. + * datebox: Clicking on the 'Today' button doesn't trigger the 'onSelect' event. fixed. + * propertygrid: The 'getChanges' method doesn't work after editing the only one row. fixed. +* Improvement + * combo: Add the 'panelEvents' property. + * combo: Attach the default 'mousedown' event handler. + * combobox: The 'setValues' method can be called to initialize the displaying text. + * combotreegrid: Press ENTER key to select the highlighted rows. + * panel: Improve the resizing performance. + * filebox: The 'files' method allows the user to get the selected file list. + * searchbox: Improvent the 'selectName' method. + +Version 1.5.3 +------------- +* Bug + * combobox: The 'iconCls' property can not be parsed from the