From f381f19ce5db09edb4076213cd7482acc4872acd Mon Sep 17 00:00:00 2001 From: Eric Wittmann Date: Tue, 23 Dec 2014 08:02:02 -0500 Subject: [PATCH] automated the process of creating the quickstart/distro h2 database --- distro/db/pom.xml | 48 ++++++++++ .../distro/db/CreateH2DatabaseTest.java | 61 ++++++++++++ .../data/gateways/000_gateway.resttest | 0 .../data/idm/001_create-org-owner.resttest | 0 .../data/idm/002_create-app-dev.resttest | 0 .../data/idm/003_create-service-dev.resttest | 0 .../data/idm/004_create-admin.resttest | 0 .../000_whitelist-policydef.resttest | 0 .../001_blacklist-policydef.resttest | 0 .../002_basicauth-policydef.resttest | 0 .../003_ratelimiting-policydef.resttest | 0 .../04_ignoredresources-policydef.resttest | 22 +++++ .../scripts/api-manager-init-testPlan.xml | 1 + distro/pom.xml | 1 + distro/wildfly8/pom.xml | 6 +- distro/wildfly8/src/main/assembly/overlay.xml | 21 ++++- .../data/h2/apiman-manager-api.h2.db | Bin 2107392 -> 0 bytes .../data/h2/apiman-manager-api.lock.db | 4 - .../data/h2/apiman-manager-api.trace.db | 89 ------------------ gateway/platforms/vertx/pom.xml | 5 - gateway/test/pom.xml | 4 - .../test/server/ManagerApiTestServer.java | 25 ++++- .../test/util/AbstractTestPlanTest.java | 1 + pom.xml | 5 + test/suite/pom.xml | 4 + .../io/apiman/test/suite/FullTestSuite.java | 1 - 26 files changed, 191 insertions(+), 107 deletions(-) create mode 100644 distro/db/pom.xml create mode 100644 distro/db/src/test/java/io/apiman/distro/db/CreateH2DatabaseTest.java rename {test/suite/src/main => distro/db/src/test}/resources/data/gateways/000_gateway.resttest (100%) rename {test/suite/src/main => distro/db/src/test}/resources/data/idm/001_create-org-owner.resttest (100%) rename {test/suite/src/main => distro/db/src/test}/resources/data/idm/002_create-app-dev.resttest (100%) rename {test/suite/src/main => distro/db/src/test}/resources/data/idm/003_create-service-dev.resttest (100%) rename {test/suite/src/main => distro/db/src/test}/resources/data/idm/004_create-admin.resttest (100%) rename {test/suite/src/main => distro/db/src/test}/resources/data/policyDefs/000_whitelist-policydef.resttest (100%) rename {test/suite/src/main => distro/db/src/test}/resources/data/policyDefs/001_blacklist-policydef.resttest (100%) rename {test/suite/src/main => distro/db/src/test}/resources/data/policyDefs/002_basicauth-policydef.resttest (100%) rename {test/suite/src/main => distro/db/src/test}/resources/data/policyDefs/003_ratelimiting-policydef.resttest (100%) create mode 100644 distro/db/src/test/resources/data/policyDefs/04_ignoredresources-policydef.resttest rename {test/suite/src/main => distro/db/src/test}/resources/scripts/api-manager-init-testPlan.xml (90%) delete mode 100644 distro/wildfly8/src/main/resources/overlay/standalone/data/h2/apiman-manager-api.h2.db delete mode 100644 distro/wildfly8/src/main/resources/overlay/standalone/data/h2/apiman-manager-api.lock.db delete mode 100644 distro/wildfly8/src/main/resources/overlay/standalone/data/h2/apiman-manager-api.trace.db diff --git a/distro/db/pom.xml b/distro/db/pom.xml new file mode 100644 index 0000000000..e964abc2cf --- /dev/null +++ b/distro/db/pom.xml @@ -0,0 +1,48 @@ + + 4.0.0 + + io.apiman + apiman-distro + 1.0.1-SNAPSHOT + + apiman-distro-db + apiman-distro-db + + + + + ${project.groupId} + apiman-test-common + + + ${project.groupId} + apiman-manager-test-api + + + + + org.apache.httpcomponents + httpclient + + + org.slf4j + slf4j-api + + + slf4j-log4j12 + org.slf4j + + + org.codehaus.jackson + jackson-core-asl + + + org.codehaus.jackson + jackson-mapper-asl + + + commons-io + commons-io + + + \ No newline at end of file diff --git a/distro/db/src/test/java/io/apiman/distro/db/CreateH2DatabaseTest.java b/distro/db/src/test/java/io/apiman/distro/db/CreateH2DatabaseTest.java new file mode 100644 index 0000000000..04b4756c3e --- /dev/null +++ b/distro/db/src/test/java/io/apiman/distro/db/CreateH2DatabaseTest.java @@ -0,0 +1,61 @@ +/* + * Copyright 2014 JBoss Inc + * + * 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. + */ +package io.apiman.distro.db; + +import io.apiman.manager.test.util.AbstractTestPlanTest; + +import java.io.File; + +import org.junit.BeforeClass; +import org.junit.Test; + +/** + * Unit test that creates an H2 database file by firing up the API Manager and sending a + * bunch of REST requests to configure it. When this test is complete there should be a + * valid H2 database located in target/classes (and thus be included in the JAR). + * + * @author eric.wittmann@redhat.com + */ +@SuppressWarnings("nls") +public class CreateH2DatabaseTest extends AbstractTestPlanTest { + + @BeforeClass + public static void setup() throws Exception { + File targetClassesDir = new File("target/classes").getAbsoluteFile(); + if (!targetClassesDir.exists()) { + targetClassesDir.mkdirs(); + } + + System.out.println("------------------------------------------------"); + System.out.println("Setting H2 db output path: " + targetClassesDir.toString()); + System.out.println("------------------------------------------------"); + + System.setProperty("apiman.test.h2-output-dir", targetClassesDir.toString()); + AbstractTestPlanTest.setup(); + } + + @Test + public void test() { + try { + System.setProperty("apiman.suite.api-username", "admin"); + System.setProperty("apiman.suite.api-password", "admin"); + runTestPlan("scripts/api-manager-init-testPlan.xml", CreateH2DatabaseTest.class.getClassLoader()); + } finally { + System.clearProperty("apiman.test.h2-output-dir"); + } + } + +} diff --git a/test/suite/src/main/resources/data/gateways/000_gateway.resttest b/distro/db/src/test/resources/data/gateways/000_gateway.resttest similarity index 100% rename from test/suite/src/main/resources/data/gateways/000_gateway.resttest rename to distro/db/src/test/resources/data/gateways/000_gateway.resttest diff --git a/test/suite/src/main/resources/data/idm/001_create-org-owner.resttest b/distro/db/src/test/resources/data/idm/001_create-org-owner.resttest similarity index 100% rename from test/suite/src/main/resources/data/idm/001_create-org-owner.resttest rename to distro/db/src/test/resources/data/idm/001_create-org-owner.resttest diff --git a/test/suite/src/main/resources/data/idm/002_create-app-dev.resttest b/distro/db/src/test/resources/data/idm/002_create-app-dev.resttest similarity index 100% rename from test/suite/src/main/resources/data/idm/002_create-app-dev.resttest rename to distro/db/src/test/resources/data/idm/002_create-app-dev.resttest diff --git a/test/suite/src/main/resources/data/idm/003_create-service-dev.resttest b/distro/db/src/test/resources/data/idm/003_create-service-dev.resttest similarity index 100% rename from test/suite/src/main/resources/data/idm/003_create-service-dev.resttest rename to distro/db/src/test/resources/data/idm/003_create-service-dev.resttest diff --git a/test/suite/src/main/resources/data/idm/004_create-admin.resttest b/distro/db/src/test/resources/data/idm/004_create-admin.resttest similarity index 100% rename from test/suite/src/main/resources/data/idm/004_create-admin.resttest rename to distro/db/src/test/resources/data/idm/004_create-admin.resttest diff --git a/test/suite/src/main/resources/data/policyDefs/000_whitelist-policydef.resttest b/distro/db/src/test/resources/data/policyDefs/000_whitelist-policydef.resttest similarity index 100% rename from test/suite/src/main/resources/data/policyDefs/000_whitelist-policydef.resttest rename to distro/db/src/test/resources/data/policyDefs/000_whitelist-policydef.resttest diff --git a/test/suite/src/main/resources/data/policyDefs/001_blacklist-policydef.resttest b/distro/db/src/test/resources/data/policyDefs/001_blacklist-policydef.resttest similarity index 100% rename from test/suite/src/main/resources/data/policyDefs/001_blacklist-policydef.resttest rename to distro/db/src/test/resources/data/policyDefs/001_blacklist-policydef.resttest diff --git a/test/suite/src/main/resources/data/policyDefs/002_basicauth-policydef.resttest b/distro/db/src/test/resources/data/policyDefs/002_basicauth-policydef.resttest similarity index 100% rename from test/suite/src/main/resources/data/policyDefs/002_basicauth-policydef.resttest rename to distro/db/src/test/resources/data/policyDefs/002_basicauth-policydef.resttest diff --git a/test/suite/src/main/resources/data/policyDefs/003_ratelimiting-policydef.resttest b/distro/db/src/test/resources/data/policyDefs/003_ratelimiting-policydef.resttest similarity index 100% rename from test/suite/src/main/resources/data/policyDefs/003_ratelimiting-policydef.resttest rename to distro/db/src/test/resources/data/policyDefs/003_ratelimiting-policydef.resttest diff --git a/distro/db/src/test/resources/data/policyDefs/04_ignoredresources-policydef.resttest b/distro/db/src/test/resources/data/policyDefs/04_ignoredresources-policydef.resttest new file mode 100644 index 0000000000..975bfd5999 --- /dev/null +++ b/distro/db/src/test/resources/data/policyDefs/04_ignoredresources-policydef.resttest @@ -0,0 +1,22 @@ +POST /policyDefs ${apiman.suite.api-username}/${apiman.suite.api-password} +Content-Type: application/json + +{ + "name" : "Ignored Resources Policy", + "description" : "Requests satisfying the provided regular expression will be ignored.", + "policyImpl" : "class:io.apiman.gateway.engine.policies.IgnoredResourcesPolicy", + "icon" : "eye-slash", + "templates" : [ + { + "language" : null, + "template" : "Requests matching any of the @{pathsToIgnore.size()} regular expressions provided will receive a 404 error code." + } + ] +} +---- +200 +Content-Type: application/json + +{ + "id" : "IgnoredResourcesPolicy" +} diff --git a/test/suite/src/main/resources/scripts/api-manager-init-testPlan.xml b/distro/db/src/test/resources/scripts/api-manager-init-testPlan.xml similarity index 90% rename from test/suite/src/main/resources/scripts/api-manager-init-testPlan.xml rename to distro/db/src/test/resources/scripts/api-manager-init-testPlan.xml index 757f8d516d..ece6a031d4 100644 --- a/test/suite/src/main/resources/scripts/api-manager-init-testPlan.xml +++ b/distro/db/src/test/resources/scripts/api-manager-init-testPlan.xml @@ -15,6 +15,7 @@ data/policyDefs/001_blacklist-policydef.resttest data/policyDefs/002_basicauth-policydef.resttest data/policyDefs/003_ratelimiting-policydef.resttest + data/policyDefs/04_ignoredresources-policydef.resttest diff --git a/distro/pom.xml b/distro/pom.xml index 0f734310fb..2bee187459 100644 --- a/distro/pom.xml +++ b/distro/pom.xml @@ -12,6 +12,7 @@ data + db wildfly8 \ No newline at end of file diff --git a/distro/wildfly8/pom.xml b/distro/wildfly8/pom.xml index 416f7b05fd..3791b23e3c 100644 --- a/distro/wildfly8/pom.xml +++ b/distro/wildfly8/pom.xml @@ -38,12 +38,14 @@ apiman-gateway-platforms-war-wildfly8-modules zip - - ${project.groupId} apiman-distro-data + + ${project.groupId} + apiman-distro-db + diff --git a/distro/wildfly8/src/main/assembly/overlay.xml b/distro/wildfly8/src/main/assembly/overlay.xml index 47da31e0f5..d00001835d 100644 --- a/distro/wildfly8/src/main/assembly/overlay.xml +++ b/distro/wildfly8/src/main/assembly/overlay.xml @@ -76,7 +76,26 @@ 0755 true - + + + standalone/data/h2 + + io.apiman:apiman-distro-db:jar + + false + false + false + false + 0755 + 0755 + true + + + **/META-INF/** + + + + apiman diff --git a/distro/wildfly8/src/main/resources/overlay/standalone/data/h2/apiman-manager-api.h2.db b/distro/wildfly8/src/main/resources/overlay/standalone/data/h2/apiman-manager-api.h2.db deleted file mode 100644 index bc2a636e0ce65e1440a0d5ef4476c74d7bc0c45c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2107392 zcmeI)2Yg*;eK&ARJ`pBh2m~?-xpIc>L~$%xmZd#oZTwPm($*?xUb=DO=L=SG(O|21pYty#NvjeiIbAV7csf&ak*AL?HGNTK;j z{MisWC(=~-nLh{+AV7csf&Ya9*8l&7gQ`me2oNAZfB*pk1PBlyK!5-N0t5&UAn^aa zz{@*9EE^^<d3~(rpV^VHIZv0Es^UY zTO!v-wnkbbZINw}_Q>`~M`TB&Gtw2gA@YdGBO^CP9u;|XWM`y1(i7>8^hNq31ChbV zP$U~kg?2}VBO{T~$XH}NvL`YTnT$+DrXzbJGm(9f{gIm@kBK}sa&zRC$brbMk=e+> z$f3yL$Xw(|^KV5P4zbMUfXr zUJ`j}tPB z?~1%T@}9_hBkzm6Kk|Xd2O}Sfd^qxv$VVd|i+nutiO44-pNf1s@|nnIBcF@>WaRUa zpNjl+R{Cwm~kza^>Ir5drFGhYT^3}*MM}8&pwaBkVz8?9t$gf9! zBl4S(-->)A^4pQ$iTrNl_aeU^`Gd$GM!p&OqsSje{v`6P$e%|3Eb`}(zli*0UX zZ6t}D6KRUvC$cVb-^jU<`$g^_Ss!^ol3~=EyaXYa=a@>mpks*GINSS|e?dZISlK z_DDx$N2D{-6}chuh{z)&H%1;6d30oFq&w0R>5cS7`Xd98!N^b~8`%}v9T|>{L`EZH zk@3i$$V6l^G8LJQ?2XJs_C@wbZi+l6^4Q4Dky|1MBDY3nBL^dgB8MY$kt31YB1a?h zk;g@Dj~t5}kDQ1sL{3H?A2}6SjGT^~iQEynGxCJUU6Ch7?vDIO^F8A9+FKg^?FUUL1KzUf$Xg8@|Tgniu`rt+mXMC{B7j#B7YzG zhsZxh{wea$k$;K&YvkV|--&!T^6!!V6ZwzG_hPkQ6aTDxYiQ-y|Aw^<4NplL8j{U% zRNop?L?#aNrd!YbgYT`W@$b9S6NYmdz8C*Iu;H?%OeT{&CD}7JFwnBKrKRP_?6JkU z-CJ8)TiRN-ozoEWK+>GKdf#OKRHk>Lzk90xK+kk`xG&SXV_TebJT+-3>}l<#O&c;B zlBZVfDVy6aKibwiHXR%C z+w(sz?0W&8U2M;nVxPA+J=qIpARqR{oj`M&pWjn=L`l3bB#UVm$$t>Y8f zk?x88nce;SS8i(I#RuZW2ih`YqjkHJ?b{q5mAt+oxiWLr`d2h`4^Q<^6hUeeWV-wM zGQDG?lT#DjDZz?vXI~p_DeK0j`0!|0U;n;Z&8z4_4D-`U!`yUX(^btIlBZP-bAMa( z_Cj~f&5S{1D1Qi=4j8;OYOPO;--zwS0~S?>fT^Fn>GjJGpixnThhb*zNeGT0eRvFt=#D6 zfxhmk?zD_oub(D38!00_T$kCf{wc*F zot}*Ozj8{S?9NQax{%qp_27~Ag9mqP-_h23_(Rq%T^-xIX4^X2+O}?;J<@rwt?l5!t!?eCovm}*4jnu+cetx#u5;Vr zc=g=&j?USQajcGHV|{FRc9dmf?gZh1Elpc8Tass2mE}#P`L$(xOGnF&md=*0me#Ee z&xx~;A5Y)B<^j)Nn{0`CedgN2=vS=w z`!jpHCwhmvCpNWh-@du(RG{#pSV^X`BmI+8-6P{wuNWEY%MN7wSJ+SSRm3J74 zUEjQ=#sS;7=7HnM^>M)Ns&T*;My&kIAh&ERHwH0 z3NI}?lc`)6&YsECYGY$#!*fg3{NO8^k_Tmy2PMy~s^_t?dX6SP=sy~gcwuJ!KNk

eU@P)Fr6PHE`!MUY$Bdeal8+@(?f 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 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5;&|Cs{+ E7pPQ4^#A|> diff --git a/distro/wildfly8/src/main/resources/overlay/standalone/data/h2/apiman-manager-api.lock.db b/distro/wildfly8/src/main/resources/overlay/standalone/data/h2/apiman-manager-api.lock.db deleted file mode 100644 index 75390c8faf..0000000000 --- a/distro/wildfly8/src/main/resources/overlay/standalone/data/h2/apiman-manager-api.lock.db +++ /dev/null @@ -1,4 +0,0 @@ -#FileLock -#Wed Dec 17 12:03:35 EST 2014 -id=14a59346cac5140cf3631f016ba537df94e67c13fec -method=file diff --git a/distro/wildfly8/src/main/resources/overlay/standalone/data/h2/apiman-manager-api.trace.db b/distro/wildfly8/src/main/resources/overlay/standalone/data/h2/apiman-manager-api.trace.db deleted file mode 100644 index fd610ae512..0000000000 --- a/distro/wildfly8/src/main/resources/overlay/standalone/data/h2/apiman-manager-api.trace.db +++ /dev/null @@ -1,89 +0,0 @@ -12-17 12:03:50 jdbc[2]: exception -org.h2.jdbc.JdbcSQLException: Feature not supported: "isWrapperFor" [50100-173] - at org.h2.message.DbException.getJdbcSQLException(DbException.java:331) - at org.h2.message.DbException.get(DbException.java:171) - at org.h2.message.DbException.get(DbException.java:148) - at org.h2.message.DbException.getUnsupportedException(DbException.java:206) - at org.h2.message.TraceObject.unsupported(TraceObject.java:391) - at org.h2.jdbc.JdbcStatement.isWrapperFor(JdbcStatement.java:1067) - at org.jboss.jca.adapters.jdbc.JBossWrapper.unwrapInnerMost(JBossWrapper.java:119) - at org.jboss.jca.adapters.jdbc.JBossWrapper.isWrapperFor(JBossWrapper.java:61) - at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.isTypeOf(ResultSetReturnImpl.java:99) - at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:70) - at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.getResultSet(AbstractLoadPlanBasedLoader.java:449) - at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeQueryStatement(AbstractLoadPlanBasedLoader.java:202) - at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeLoad(AbstractLoadPlanBasedLoader.java:137) - at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeLoad(AbstractLoadPlanBasedLoader.java:102) - at org.hibernate.loader.entity.plan.AbstractLoadPlanBasedEntityLoader.load(AbstractLoadPlanBasedEntityLoader.java:186) - at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:4126) - at org.hibernate.event.internal.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:503) - at org.hibernate.event.internal.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:468) - at org.hibernate.event.internal.DefaultLoadEventListener.load(DefaultLoadEventListener.java:213) - at org.hibernate.event.internal.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:275) - at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:151) - at org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:1070) - at org.hibernate.internal.SessionImpl.access$2000(SessionImpl.java:176) - at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.load(SessionImpl.java:2551) - at org.hibernate.internal.SessionImpl.get(SessionImpl.java:955) - at org.hibernate.jpa.spi.AbstractEntityManagerImpl.find(AbstractEntityManagerImpl.java:1110) - at org.hibernate.jpa.spi.AbstractEntityManagerImpl.find(AbstractEntityManagerImpl.java:1068) - at io.apiman.manager.api.jpa.AbstractJpaStorage.get(AbstractJpaStorage.java:242) - at io.apiman.manager.api.jpa.roles.JpaIdmStorage.getUser(JpaIdmStorage.java:89) - at io.apiman.manager.api.rest.impl.CurrentUserResourceImpl.getInfo(CurrentUserResourceImpl.java:72) - at io.apiman.manager.api.rest.impl.CurrentUserResourceImpl$Proxy$_$$_WeldClientProxy.getInfo(Unknown Source) - at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) - at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) - at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) - at java.lang.reflect.Method.invoke(Method.java:606) - at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:137) - at org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTarget(ResourceMethodInvoker.java:296) - at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:250) - at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:237) - at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:356) - at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:179) - at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:220) - at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:56) - at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:51) - at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) - at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:85) - at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:130) - at io.apiman.manager.api.security.impl.DefaultSecurityContextFilter.doFilter(DefaultSecurityContextFilter.java:56) - at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:60) - at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:132) - at org.overlord.commons.gwt.server.filters.SimpleCorsFilter.doFilter(SimpleCorsFilter.java:71) - at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:60) - at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:132) - at org.overlord.commons.i18n.server.filters.LocaleFilter.doFilter(LocaleFilter.java:61) - at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:60) - at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:132) - at io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:85) - at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:61) - at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36) - at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78) - at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) - at org.keycloak.adapters.undertow.UndertowAuthenticatedActionsHandler.handleRequest(UndertowAuthenticatedActionsHandler.java:66) - at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:131) - at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:56) - at io.undertow.server.handlers.DisableCacheHandler.handleRequest(DisableCacheHandler.java:33) - at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) - at io.undertow.security.handlers.AuthenticationConstraintHandler.handleRequest(AuthenticationConstraintHandler.java:51) - at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:45) - at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:63) - at io.undertow.servlet.handlers.security.ServletSecurityConstraintHandler.handleRequest(ServletSecurityConstraintHandler.java:56) - at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:58) - at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:70) - at io.undertow.security.handlers.SecurityInitialHandler.handleRequest(SecurityInitialHandler.java:76) - at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) - at org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61) - at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) - at org.keycloak.adapters.undertow.ServletPreAuthActionsHandler.handleRequest(ServletPreAuthActionsHandler.java:69) - at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) - at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:261) - at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:247) - at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:76) - at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:166) - at io.undertow.server.Connectors.executeRootHandler(Connectors.java:197) - at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:759) - at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) - at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) - at java.lang.Thread.run(Thread.java:744) diff --git a/gateway/platforms/vertx/pom.xml b/gateway/platforms/vertx/pom.xml index 101319b274..bf8a1941b1 100644 --- a/gateway/platforms/vertx/pom.xml +++ b/gateway/platforms/vertx/pom.xml @@ -49,11 +49,6 @@ - - junit - junit - test - io.vertx testtools diff --git a/gateway/test/pom.xml b/gateway/test/pom.xml index a5936ca80e..ef7d3c211d 100644 --- a/gateway/test/pom.xml +++ b/gateway/test/pom.xml @@ -113,10 +113,6 @@ org.jboss.logging jboss-logging - - junit - junit - \ No newline at end of file diff --git a/manager/test/api/src/main/java/io/apiman/manager/test/server/ManagerApiTestServer.java b/manager/test/api/src/main/java/io/apiman/manager/test/server/ManagerApiTestServer.java index 814260480b..7c9838d91d 100644 --- a/manager/test/api/src/main/java/io/apiman/manager/test/server/ManagerApiTestServer.java +++ b/manager/test/api/src/main/java/io/apiman/manager/test/server/ManagerApiTestServer.java @@ -18,6 +18,7 @@ import io.apiman.common.servlet.AuthenticationFilter; import io.apiman.manager.api.security.impl.DefaultSecurityContextFilter; +import java.io.File; import java.sql.Connection; import java.sql.Driver; import java.sql.SQLException; @@ -110,7 +111,12 @@ protected void preStart() { InitialContext ctx = new InitialContext(); ensureCtx(ctx, "java:/comp/env"); //$NON-NLS-1$ ensureCtx(ctx, "java:/comp/env/jdbc"); //$NON-NLS-1$ - ds = createInMemoryDatasource(); + String dbOutputPath = System.getProperty("apiman.test.h2-output-dir", null); //$NON-NLS-1$ + if (dbOutputPath != null) { + ds = createFileDatasource(new File(dbOutputPath)); + } else { + ds = createInMemoryDatasource(); + } ctx.bind("java:/comp/env/jdbc/ApiManagerDS", ds); //$NON-NLS-1$ } catch (Exception e) { throw new RuntimeException(e); @@ -148,6 +154,23 @@ private static BasicDataSource createInMemoryDatasource() throws SQLException { return ds; } + /** + * Creates an h2 file based datasource. + * @throws SQLException + */ + private static BasicDataSource createFileDatasource(File outputDirectory) throws SQLException { + System.setProperty("hibernate.dialect", "org.hibernate.dialect.H2Dialect"); //$NON-NLS-1$ //$NON-NLS-2$ + BasicDataSource ds = new BasicDataSource(); + ds.setDriverClassName(Driver.class.getName()); + ds.setUsername("sa"); //$NON-NLS-1$ + ds.setPassword(""); //$NON-NLS-1$ + ds.setUrl("jdbc:h2:" + outputDirectory.toString() + "/apiman-manager-api;MVCC=true"); //$NON-NLS-1$ //$NON-NLS-2$ + Connection connection = ds.getConnection(); + connection.close(); + System.out.println("DataSource created and bound to JNDI."); //$NON-NLS-1$ + return ds; + } + /** * Configure the web application(s). * @param handlers diff --git a/manager/test/api/src/main/java/io/apiman/manager/test/util/AbstractTestPlanTest.java b/manager/test/api/src/main/java/io/apiman/manager/test/util/AbstractTestPlanTest.java index 60b4144f9d..54b42d883a 100644 --- a/manager/test/api/src/main/java/io/apiman/manager/test/util/AbstractTestPlanTest.java +++ b/manager/test/api/src/main/java/io/apiman/manager/test/util/AbstractTestPlanTest.java @@ -37,6 +37,7 @@ public abstract class AbstractTestPlanTest { @BeforeClass public static void setup() throws Exception { + System.out.println("AbstractTestPlanTest::setup()"); if (!"true".equals(System.getProperty("apiman.junit.no-server", "false"))) { testServer.start(); } else { diff --git a/pom.xml b/pom.xml index 7021096cf9..12c684b78a 100644 --- a/pom.xml +++ b/pom.xml @@ -398,6 +398,11 @@ apiman-distro-data ${project.version} + + ${project.groupId} + apiman-distro-db + ${project.version} + ${project.groupId} apiman-distro-wildfly8 diff --git a/test/suite/pom.xml b/test/suite/pom.xml index f877d6d071..26a3d24f5b 100644 --- a/test/suite/pom.xml +++ b/test/suite/pom.xml @@ -14,6 +14,10 @@ ${project.groupId} apiman-test-common + + ${project.groupId} + apiman-distro-db + diff --git a/test/suite/src/main/java/io/apiman/test/suite/FullTestSuite.java b/test/suite/src/main/java/io/apiman/test/suite/FullTestSuite.java index 060d354119..af57037616 100644 --- a/test/suite/src/main/java/io/apiman/test/suite/FullTestSuite.java +++ b/test/suite/src/main/java/io/apiman/test/suite/FullTestSuite.java @@ -69,7 +69,6 @@ public static void main(String [] args) throws Exception { param("apiman.suite.echo-endpoint", "Echo Service Endpoint", "http://localhost:8080/services/echo"); TestPlanRunner runner = new TestPlanRunner(apiEndpoint); -// runner.runTestPlan("scripts/api-manager-init-testPlan.xml", FullTestSuite.class.getClassLoader()); runner.runTestPlan("scripts/api-manager-testPlan.xml", FullTestSuite.class.getClassLoader()); runner = new TestPlanRunner(gatewayEndpoint); runner.runTestPlan("scripts/api-gateway-testPlan.xml", FullTestSuite.class.getClassLoader());