Repository: syncope Updated Branches: refs/heads/2_0_X f9b03e82f -> a60e4bcb6 refs/heads/master e7e8e92da -> 9722c9218
http://git-wip-us.apache.org/repos/asf/syncope/blob/a60e4bcb/fit/core-reference/src/test/resources/rest/DeleteScript.groovy ---------------------------------------------------------------------- diff --git a/fit/core-reference/src/test/resources/rest/DeleteScript.groovy b/fit/core-reference/src/test/resources/rest/DeleteScript.groovy new file mode 100644 index 0000000..7cf805a --- /dev/null +++ b/fit/core-reference/src/test/resources/rest/DeleteScript.groovy @@ -0,0 +1,44 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import org.apache.cxf.jaxrs.client.WebClient + +// Parameters: +// The connector sends the following: +// client : CXF WebClient +// action: a string describing the action ("DELETE" here) +// log: a handler to the Log facility +// objectClass: a String describing the Object class (__ACCOUNT__ / __GROUP__ / other) +// options: a handler to the OperationOptions Map +// uid: String for the unique id that specifies the object to delete + +log.info("Entering " + action + " Script"); + +WebClient webClient = client; + +assert uid != null + +switch ( objectClass ) { +case "__ACCOUNT__": + webClient.path("/users/" + uid); + webClient.delete(); + break + +default: + break +} http://git-wip-us.apache.org/repos/asf/syncope/blob/a60e4bcb/fit/core-reference/src/test/resources/rest/SchemaScript.groovy ---------------------------------------------------------------------- diff --git a/fit/core-reference/src/test/resources/rest/SchemaScript.groovy b/fit/core-reference/src/test/resources/rest/SchemaScript.groovy new file mode 100644 index 0000000..ecf7080 --- /dev/null +++ b/fit/core-reference/src/test/resources/rest/SchemaScript.groovy @@ -0,0 +1,51 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import org.identityconnectors.common.security.GuardedString +import org.identityconnectors.framework.common.objects.AttributeInfo +import org.identityconnectors.framework.common.objects.AttributeInfo.Flags +import org.identityconnectors.framework.common.objects.AttributeInfoBuilder +import org.identityconnectors.framework.common.objects.ObjectClassInfo +import org.identityconnectors.framework.common.objects.ObjectClassInfoBuilder + +// Parameters: +// The connector sends the following: +// action: a string describing the action ("SCHEMA" here) +// log: a handler to the Log facility +// builder: SchemaBuilder instance for the connector +// +// The connector will make the final call to builder.build() +// so the scipt just need to declare the different object types. + +log.info("Entering " + action + " Script"); + +idAIB = new AttributeInfoBuilder("key", String.class); +idAIB.setRequired(true); + +orgAttrsInfo = new HashSet<AttributeInfo>(); +orgAttrsInfo.add(idAIB.build()); +orgAttrsInfo.add(AttributeInfoBuilder.build("username", String.class)); +orgAttrsInfo.add(AttributeInfoBuilder.build("password", GuardedString.class)); +orgAttrsInfo.add(AttributeInfoBuilder.build("firstName", String.class)); +orgAttrsInfo.add(AttributeInfoBuilder.build("surname", String.class)); +orgAttrsInfo.add(AttributeInfoBuilder.build("email", String.class)); + +ObjectClassInfo oci = new ObjectClassInfoBuilder().setType("__ACCOUNT__").addAllAttributeInfo(orgAttrsInfo).build(); +builder.defineObjectClass(oci); + +log.info(action + " script done"); \ No newline at end of file http://git-wip-us.apache.org/repos/asf/syncope/blob/a60e4bcb/fit/core-reference/src/test/resources/rest/SearchScript.groovy ---------------------------------------------------------------------- diff --git a/fit/core-reference/src/test/resources/rest/SearchScript.groovy b/fit/core-reference/src/test/resources/rest/SearchScript.groovy new file mode 100644 index 0000000..c4fe900 --- /dev/null +++ b/fit/core-reference/src/test/resources/rest/SearchScript.groovy @@ -0,0 +1,100 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import com.fasterxml.jackson.databind.ObjectMapper +import com.fasterxml.jackson.databind.node.ArrayNode +import com.fasterxml.jackson.databind.node.ObjectNode +import javax.ws.rs.core.Response +import org.apache.cxf.jaxrs.client.WebClient +import org.identityconnectors.common.security.GuardedString + +// Parameters: +// The connector sends the following: +// client : CXF WebClient +// objectClass: a String describing the Object class (__ACCOUNT__ / __GROUP__ / other) +// action: a string describing the action ("SEARCH" here) +// log: a handler to the Log facility +// options: a handler to the OperationOptions Map +// query: a handler to the Query Map +// +// The Query map describes the filter used (via FIQL's ConditionType): +// +// query = [ operation: "EQUALS", left: attribute, right: "value" ] +// query = [ operation: "GREATER_THAN", left: attribute, right: "value" ] +// query = [ operation: "GREATER_OR_EQUALS", left: attribute, right: "value" ] +// query = [ operation: "LESS_THAN", left: attribute, right: "value" ] +// query = [ operation: "LESS_OR_EQUALS", left: attribute, right: "value" ] +// query = null : then we assume we fetch everything +// +// AND and OR filter just embed a left/right couple of queries. +// query = [ operation: "AND", left: query1, right: query2 ] +// query = [ operation: "OR", left: query1, right: query2 ] +// +// Returns: A list of Maps. Each map describing one row. +// !!!! Each Map must contain a '__UID__' and '__NAME__' attribute. +// This is required to build a ConnectorObject. + +def buildConnectorObject(node) { + return [ + __UID__:node.get("key").textValue(), + __NAME__:node.get("key").textValue(), + username:node.get("username").textValue(), + password:node.has("password") && node.get("password").textValue() != null + ? new GuardedString(node.get("password").textValue().toCharArray()) + : null, + firstName:node.get("firstName").textValue(), + surname:node.get("surname").textValue(), + email:node.get("email").textValue() + ]; +} + +log.info("Entering " + action + " Script"); + +WebClient webClient = client; +ObjectMapper mapper = new ObjectMapper(); + +def result = [] + +switch (objectClass) { +case "__ACCOUNT__": + if (query == null || (!query.get("left").equals("__UID__") && !query.get("conditionType").equals("EQUALS"))) { + webClient.path("/users"); + Response response = webClient.get(); + ArrayNode node = mapper.readTree(response.getEntity()); + + for (i = 0; i < node.size(); i++) { + result.add(buildConnectorObject(node.get(i))); + } + } else { + webClient.path("/users/" + query.get("right")); + Response response = webClient.get(); + if (response.getStatus() == 200) { + ObjectNode node = mapper.readTree(response.getEntity()); + result.add(buildConnectorObject(node)); + } else { + log.warn("Could not read object {0}", query.get("right")); + } + } + + break + +default: + result; +} + +return result; http://git-wip-us.apache.org/repos/asf/syncope/blob/a60e4bcb/fit/core-reference/src/test/resources/rest/SyncScript.groovy ---------------------------------------------------------------------- diff --git a/fit/core-reference/src/test/resources/rest/SyncScript.groovy b/fit/core-reference/src/test/resources/rest/SyncScript.groovy new file mode 100644 index 0000000..a15636c --- /dev/null +++ b/fit/core-reference/src/test/resources/rest/SyncScript.groovy @@ -0,0 +1,106 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import com.fasterxml.jackson.databind.ObjectMapper +import com.fasterxml.jackson.databind.node.ArrayNode +import java.util.Date; +import javax.ws.rs.core.Response +import org.apache.cxf.jaxrs.client.WebClient +import org.identityconnectors.common.security.GuardedString + +// Parameters: +// The connector sends the following: +// client : CXF WebClient +// objectClass: a String describing the Object class (__ACCOUNT__ / __GROUP__ / other) +// action: a string describing the action ("SYNC" or "GET_LATEST_SYNC_TOKEN" here) +// log: a handler to the Log facility +// options: a handler to the OperationOptions Map (null if action = "GET_LATEST_SYNC_TOKEN") +// token: a handler to an Object representing the sync token (null if action = "GET_LATEST_SYNC_TOKEN") +// +// +// Returns: +// if action = "GET_LATEST_SYNC_TOKEN", it must return an object representing the last known +// sync token for the corresponding ObjectClass +// +// if action = "SYNC": +// A list of Maps . Each map describing one update: +// Map should look like the following: +// +// [ +// "token": <Object> token object (could be Integer, Date, String) , [!! could be null] +// "operation":<String> ("CREATE_OR_UPDATE"|"DELETE") will always default to CREATE_OR_DELETE , +// "uid":<String> uid (uid of the entry) , +// "previousUid":<String> prevuid (This is for rename ops) , +// "password":<String> password (optional... allows to pass clear text password if needed), +// "attributes":Map<String,List> of attributes name/values +// ] + +def buildConnectorObject(node) { + return [ + __UID__:node.get("key").textValue(), + __NAME__:node.get("key").textValue(), + username:node.get("username").textValue(), + password:new GuardedString(node.get("password").textValue().toCharArray()), + firstName:node.get("firstName").textValue(), + surname:node.get("surname").textValue(), + email:node.get("email").textValue() + ]; +} + +log.info("Entering " + action + " Script"); + +WebClient webClient = client; +ObjectMapper mapper = new ObjectMapper(); + +if (action.equalsIgnoreCase("GET_LATEST_SYNC_TOKEN")) { + switch (objectClass) { + case "__ACCOUNT__": + latestToken = new Date().getTime(); + break; + + default: + latestToken = null; + } + + return latestToken; +} else if (action.equalsIgnoreCase("SYNC")) { + def result = []; + + switch (objectClass) { + case "__ACCOUNT__": + webClient.path("/users"); + Response response = webClient.get(); + ArrayNode node = mapper.readTree(response.getEntity()); + + for (i = 0; i < node.size(); i++) { + result.add([ + operation:"CREATE_OR_UPDATE", + uid:node.get(i).get("key").textValue(), + token:new Date().getTime(), + attributes:buildConnectorObject(node.get(i)) + ]); + } + break; + } + + log.ok("Sync script: found " + result.size() + " events to sync"); + return result; +} else { + log.error("Sync script: action '" + action + "' is not implemented in this script"); + return null; +} http://git-wip-us.apache.org/repos/asf/syncope/blob/a60e4bcb/fit/core-reference/src/test/resources/rest/TestScript.groovy ---------------------------------------------------------------------- diff --git a/fit/core-reference/src/test/resources/rest/TestScript.groovy b/fit/core-reference/src/test/resources/rest/TestScript.groovy new file mode 100644 index 0000000..c27ddee --- /dev/null +++ b/fit/core-reference/src/test/resources/rest/TestScript.groovy @@ -0,0 +1,35 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import com.fasterxml.jackson.databind.ObjectMapper +import org.apache.cxf.jaxrs.client.WebClient + +// Parameters: +// The connector sends the following: +// client : CXF WebClient +// action: a string describing the action ("TEST" here) +// log: a handler to the Log facility + +log.info("Entering " + action + " Script"); + +WebClient webClient = client; +ObjectMapper mapper = new ObjectMapper(); + + webClient.path("/users", false); + webClient.get(); + \ No newline at end of file http://git-wip-us.apache.org/repos/asf/syncope/blob/a60e4bcb/fit/core-reference/src/test/resources/rest/UpdateScript.groovy ---------------------------------------------------------------------- diff --git a/fit/core-reference/src/test/resources/rest/UpdateScript.groovy b/fit/core-reference/src/test/resources/rest/UpdateScript.groovy new file mode 100644 index 0000000..37371a7 --- /dev/null +++ b/fit/core-reference/src/test/resources/rest/UpdateScript.groovy @@ -0,0 +1,98 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import com.fasterxml.jackson.databind.ObjectMapper +import com.fasterxml.jackson.databind.node.ObjectNode +import org.apache.cxf.jaxrs.client.WebClient + +// Parameters: +// The connector sends us the following: +// client : CXF WebClient +// +// action: String correponding to the action (UPDATE/ADD_ATTRIBUTE_VALUES/REMOVE_ATTRIBUTE_VALUES) +// - UPDATE : For each input attribute, replace all of the current values of that attribute +// in the target object with the values of that attribute. +// - ADD_ATTRIBUTE_VALUES: For each attribute that the input set contains, add to the current values +// of that attribute in the target object all of the values of that attribute in the input set. +// - REMOVE_ATTRIBUTE_VALUES: For each attribute that the input set contains, remove from the current values +// of that attribute in the target object any value that matches one of the values of the attribute from the input set. + +// log: a handler to the Log facility +// +// objectClass: a String describing the Object class (__ACCOUNT__ / __GROUP__ / other) +// +// uid: a String representing the entry uid +// +// attributes: an Attribute Map, containg the <String> attribute name as a key +// and the <List> attribute value(s) as value. +// +// password: password string, clear text (only for UPDATE) +// +// options: a handler to the OperationOptions Map + +log.info("Entering " + action + " Script"); + +WebClient webClient = client; +ObjectMapper mapper = new ObjectMapper(); + +assert uid != null + +switch (action) { +case "UPDATE": + switch (objectClass) { + case "__ACCOUNT__": + ObjectNode node = mapper.createObjectNode(); + node.set("key", node.textNode(uid)); + if (attributes.containsKey("__NAME__")) { + node.set("username", node.textNode(attributes.get("__NAME__").get(0))); + } + if (attributes.containsKey("username")) { + node.set("username", node.textNode(attributes.get("username").get(0))); + } + if (password != null) { + node.set("password", node.textNode(password)); + } + if (attributes.containsKey("firstName")) { + node.set("firstName", node.textNode(attributes.get("firstName").get(0))); + } + if (attributes.containsKey("surname")) { + node.set("surname", node.textNode(attributes.get("surname").get(0))); + } + if (attributes.containsKey("email")) { + node.set("email", node.textNode(attributes.get("email").get(0))); + } + + String payload = mapper.writeValueAsString(node); + + webClient.path("/users/" + uid); + webClient.put(payload); + + default: + break + } + + return uid; + break + +case "ADD_ATTRIBUTE_VALUES": + break + + +default: + break +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/syncope/blob/a60e4bcb/fit/enduser-reference/pom.xml ---------------------------------------------------------------------- diff --git a/fit/enduser-reference/pom.xml b/fit/enduser-reference/pom.xml index 1db2aad..a350315 100644 --- a/fit/enduser-reference/pom.xml +++ b/fit/enduser-reference/pom.xml @@ -103,12 +103,6 @@ under the License. <scope>test</scope> </dependency> <dependency> - <groupId>net.tirasa.connid.bundles.soap</groupId> - <artifactId>wssample</artifactId> - <type>war</type> - <scope>test</scope> - </dependency> - <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>test</scope> @@ -304,14 +298,6 @@ under the License. </configuration> <deployables> <deployable> - <groupId>net.tirasa.connid.bundles.soap</groupId> - <artifactId>wssample</artifactId> - <type>war</type> - <properties> - <context>wssample</context> - </properties> - </deployable> - <deployable> <groupId>org.apache.syncope.fit</groupId> <artifactId>syncope-fit-build-tools</artifactId> <type>war</type> http://git-wip-us.apache.org/repos/asf/syncope/blob/a60e4bcb/pom.xml ---------------------------------------------------------------------- diff --git a/pom.xml b/pom.xml index df53d4b..e6f1852 100644 --- a/pom.xml +++ b/pom.xml @@ -351,6 +351,7 @@ under the License. <connid.version>1.4.2.0</connid.version> <connid.soap.version>1.4.1</connid.soap.version> + <connid.rest.version>1.0.1</connid.rest.version> <connid.database.version>2.2.4</connid.database.version> <connid.csvdir.version>0.8.5</connid.csvdir.version> <connid.ldap.version>1.5.1</connid.ldap.version> @@ -1348,13 +1349,6 @@ under the License. <scope>test</scope> </dependency> <dependency> - <groupId>net.tirasa.connid.bundles.soap</groupId> - <artifactId>wssample</artifactId> - <version>${connid.soap.version}</version> - <type>war</type> - <scope>test</scope> - </dependency> - <dependency> <groupId>com.icegreen</groupId> <artifactId>greenmail</artifactId> <version>1.5.2</version> @@ -1460,6 +1454,11 @@ under the License. </artifactItem> <artifactItem> <groupId>net.tirasa.connid.bundles</groupId> + <artifactId>net.tirasa.connid.bundles.rest</artifactId> + <version>${connid.rest.version}</version> + </artifactItem> + <artifactItem> + <groupId>net.tirasa.connid.bundles</groupId> <artifactId>net.tirasa.connid.bundles.csvdir</artifactId> <version>${connid.csvdir.version}</version> </artifactItem> http://git-wip-us.apache.org/repos/asf/syncope/blob/a60e4bcb/src/main/asciidoc/getting-started/obtain.adoc ---------------------------------------------------------------------- diff --git a/src/main/asciidoc/getting-started/obtain.adoc b/src/main/asciidoc/getting-started/obtain.adoc index 056d14b..f480a7b 100644 --- a/src/main/asciidoc/getting-started/obtain.adoc +++ b/src/main/asciidoc/getting-started/obtain.adoc @@ -451,9 +451,10 @@ You can configure any LDAP client (such as http://jxplorer.org/[JXplorer^], for bind password: `secret` | External resource: SOAP -| An example SOAP server is available at http://localhost:9080/wssample/services + - + - You can check its internal data by visiting http://localhost:9080/wssample/exploredb.jsp +| An example SOAP service is available at http://localhost:9080/syncope-fit-build-tools/cxf/soap + +| External resource: REST +| An example REST service is available at http://localhost:9080/syncope-fit-build-tools/cxf/rest | External resource: database | http://www.h2database.com/[H2^] TCP database is available. + http://git-wip-us.apache.org/repos/asf/syncope/blob/a60e4bcb/standalone/pom.xml ---------------------------------------------------------------------- diff --git a/standalone/pom.xml b/standalone/pom.xml index cf3e4d1..e4817af 100644 --- a/standalone/pom.xml +++ b/standalone/pom.xml @@ -46,12 +46,6 @@ under the License. <dependencies> <dependency> - <groupId>net.tirasa.connid.bundles.soap</groupId> - <artifactId>wssample</artifactId> - <type>war</type> - <scope>test</scope> - </dependency> - <dependency> <groupId>org.apache.syncope.fit</groupId> <artifactId>syncope-fit-build-tools</artifactId> <version>${project.version}</version> @@ -168,18 +162,15 @@ under the License. <mkdir dir="${work.dir}/apache-tomcat-${tomcat.version}/${test.csvdir.path}" /> <copy file="../fit/core-reference/src/test/resources/test.csv" todir="${work.dir}/apache-tomcat-${tomcat.version}/${test.csvdir.path}" /> - <!-- ConnId's SOAP wssample (provides endpoint for SOAP resources) --> - <copy file="${settings.localRepository}/net/tirasa/connid/bundles/soap/wssample/${connid.soap.version}/wssample-${connid.soap.version}.war" tofile="${work.dir}/apache-tomcat-${tomcat.version}/webapps/wssample.war" /> - - <!-- Syncope build tools (provide H2 and Apache DS resources + ConnId connector server) --> - <copy todir="${work.dir}/apache-tomcat-${tomcat.version}/webapps/syncope-build-tools"> + <!-- Syncope build tools (provide H2, Apache DS and REST / SOAP resources + ConnId connector server) --> + <copy todir="${work.dir}/apache-tomcat-${tomcat.version}/webapps/syncope-fit-build-tools"> <fileset dir="../fit/build-tools/target/syncope-fit-build-tools-${project.version}" includes="**/*" /> </copy> - <copy todir="${work.dir}/apache-tomcat-${tomcat.version}/webapps/syncope-build-tools/WEB-INF/lib"> + <copy todir="${work.dir}/apache-tomcat-${tomcat.version}/webapps/syncope-fit-build-tools/WEB-INF/lib"> <fileset dir="../fit/core-reference/target/bundles/" includes="**/*" /> </copy> - <zip destfile="${work.dir}/apache-tomcat-${tomcat.version}/webapps/syncope-build-tools.war" basedir="${work.dir}/apache-tomcat-${tomcat.version}/webapps/syncope-build-tools" /> - <delete dir="${work.dir}/apache-tomcat-${tomcat.version}/webapps/syncope-build-tools" /> + <zip destfile="${work.dir}/apache-tomcat-${tomcat.version}/webapps/syncope-fit-build-tools.war" basedir="${work.dir}/apache-tomcat-${tomcat.version}/webapps/syncope-fit-build-tools" /> + <delete dir="${work.dir}/apache-tomcat-${tomcat.version}/webapps/syncope-fit-build-tools" /> <!-- Tomcat shared libraries: H2, groovy, StAX2 API, Woodstox --> <copy file="${settings.localRepository}/com/h2database/h2/${h2.version}/h2-${h2.version}.jar" todir="${work.dir}/apache-tomcat-${tomcat.version}/lib" /> @@ -265,6 +256,11 @@ under the License. <targetPath>core/scriptedsql</targetPath> <filtering>true</filtering> </resource> + <resource> + <directory>../fit/core-reference/src/test/resources/rest</directory> + <targetPath>core/rest</targetPath> + <filtering>true</filtering> + </resource> <resource> <directory>../fit/console-reference/src/main/resources</directory>