Merge branch 'release/2.12'
diff --git a/pom.xml b/pom.xml
index de208de..598ea34 100644
--- a/pom.xml
+++ b/pom.xml
@@ -3,7 +3,7 @@
<groupId>edu.psu.swe.scim</groupId>
<artifactId>scim-parent</artifactId>
- <version>2.11</version>
+ <version>2.12</version>
<packaging>pom</packaging>
<name>SCIM - Parent</name>
<description>Penn State's Open Source JavaEE implmentation of the SCIM version 2.0 specification (RFC7642, RFC7643 and RFC7644)</description>
diff --git a/scim-client/pom.xml b/scim-client/pom.xml
index 550877f..b8b90fc 100644
--- a/scim-client/pom.xml
+++ b/scim-client/pom.xml
@@ -3,7 +3,7 @@
<parent>
<groupId>edu.psu.swe.scim</groupId>
<artifactId>scim-parent</artifactId>
- <version>2.11</version>
+ <version>2.12</version>
</parent>
<artifactId>scim-client</artifactId>
<name>SCIM - Client</name>
diff --git a/scim-common/pom.xml b/scim-common/pom.xml
index d6e9b61..757a853 100644
--- a/scim-common/pom.xml
+++ b/scim-common/pom.xml
@@ -4,7 +4,7 @@
<parent>
<groupId>edu.psu.swe.scim</groupId>
<artifactId>scim-parent</artifactId>
- <version>2.11</version>
+ <version>2.12</version>
</parent>
<artifactId>scim-common</artifactId>
@@ -14,12 +14,12 @@
<dependency>
<groupId>edu.psu.swe.scim</groupId>
<artifactId>scim-spec-protocol</artifactId>
- <version>2.11</version>
+ <version>2.12</version>
</dependency>
<dependency>
<groupId>edu.psu.swe.scim</groupId>
<artifactId>scim-spec-schema</artifactId>
- <version>2.11</version>
+ <version>2.12</version>
</dependency>
</dependencies>
diff --git a/scim-compliance/pom.xml b/scim-compliance/pom.xml
index 722dfca..61bc562 100644
--- a/scim-compliance/pom.xml
+++ b/scim-compliance/pom.xml
@@ -4,7 +4,7 @@
<parent>
<groupId>edu.psu.swe.scim</groupId>
<artifactId>scim-parent</artifactId>
- <version>2.11</version>
+ <version>2.12</version>
</parent>
<artifactId>scim-compliance</artifactId>
diff --git a/scim-compliance/scim-compliance-client/pom.xml b/scim-compliance/scim-compliance-client/pom.xml
index 6228b7a..062be4d 100644
--- a/scim-compliance/scim-compliance-client/pom.xml
+++ b/scim-compliance/scim-compliance-client/pom.xml
@@ -4,7 +4,7 @@
<parent>
<groupId>edu.psu.swe.scim</groupId>
<artifactId>scim-compliance</artifactId>
- <version>2.11</version>
+ <version>2.12</version>
</parent>
<artifactId>scim-compliance-client</artifactId>
diff --git a/scim-compliance/scim-compliance-server/pom.xml b/scim-compliance/scim-compliance-server/pom.xml
index 0fdf570..689043e 100644
--- a/scim-compliance/scim-compliance-server/pom.xml
+++ b/scim-compliance/scim-compliance-server/pom.xml
@@ -4,7 +4,7 @@
<parent>
<groupId>edu.psu.swe.scim</groupId>
<artifactId>scim-compliance</artifactId>
- <version>2.11</version>
+ <version>2.12</version>
</parent>
<artifactId>scim-compliance-server</artifactId>
diff --git a/scim-errai/pom.xml b/scim-errai/pom.xml
index ba6b64e..484130a 100644
--- a/scim-errai/pom.xml
+++ b/scim-errai/pom.xml
@@ -4,7 +4,7 @@
<parent>
<groupId>edu.psu.swe.scim</groupId>
<artifactId>scim-parent</artifactId>
- <version>2.11</version>
+ <version>2.12</version>
</parent>
<artifactId>scim-errai</artifactId>
diff --git a/scim-server/pom.xml b/scim-server/pom.xml
index cde7009..f1b7815 100644
--- a/scim-server/pom.xml
+++ b/scim-server/pom.xml
@@ -4,7 +4,7 @@
<parent>
<groupId>edu.psu.swe.scim</groupId>
<artifactId>scim-parent</artifactId>
- <version>2.11</version>
+ <version>2.12</version>
</parent>
<artifactId>scim-server</artifactId>
diff --git a/scim-server/scim-server-common/pom.xml b/scim-server/scim-server-common/pom.xml
index 552b864..80f9213 100644
--- a/scim-server/scim-server-common/pom.xml
+++ b/scim-server/scim-server-common/pom.xml
@@ -4,7 +4,7 @@
<parent>
<groupId>edu.psu.swe.scim</groupId>
<artifactId>scim-server</artifactId>
- <version>2.11</version>
+ <version>2.12</version>
</parent>
<artifactId>scim-server-common</artifactId>
diff --git a/scim-server/scim-server-common/src/main/java/edu/psu/swe/scim/server/provider/UpdateRequest.java b/scim-server/scim-server-common/src/main/java/edu/psu/swe/scim/server/provider/UpdateRequest.java
index ba902dd..74086df 100644
--- a/scim-server/scim-server-common/src/main/java/edu/psu/swe/scim/server/provider/UpdateRequest.java
+++ b/scim-server/scim-server-common/src/main/java/edu/psu/swe/scim/server/provider/UpdateRequest.java
@@ -1,9 +1,11 @@
package edu.psu.swe.scim.server.provider;
+import java.io.IOException;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
+import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
@@ -18,8 +20,13 @@
import lombok.extern.slf4j.Slf4j;
import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.AnnotationIntrospector;
+import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.ObjectWriter;
+import com.fasterxml.jackson.databind.introspect.AnnotationIntrospectorPair;
+import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.BooleanNode;
import com.fasterxml.jackson.databind.node.DoubleNode;
@@ -29,9 +36,10 @@
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.fasterxml.jackson.databind.node.POJONode;
import com.fasterxml.jackson.databind.node.TextNode;
+import com.fasterxml.jackson.module.jaxb.JaxbAnnotationIntrospector;
+import com.fasterxml.jackson.module.jaxb.JaxbAnnotationModule;
import com.flipkart.zjsonpatch.JsonDiff;
-import edu.psu.swe.scim.server.rest.ObjectMapperContextResolver;
import edu.psu.swe.scim.server.schema.Registry;
import edu.psu.swe.scim.spec.protocol.attribute.AttributeReference;
import edu.psu.swe.scim.spec.protocol.data.PatchOperation;
@@ -53,7 +61,7 @@
@EqualsAndHashCode
@ToString
public class UpdateRequest<T extends ScimResource> {
-
+
private static final String OPERATION = "op";
private static final String PATH = "path";
private static final String VALUE = "value";
@@ -70,6 +78,8 @@
private Registry registry;
+ private Map<Attribute, Integer> addRemoveOffsetMap = new HashMap<>();
+
@Inject
public UpdateRequest(Registry registry) {
this.registry = registry;
@@ -197,7 +207,7 @@
if (node instanceof ObjectNode) {
ObjectNode on = (ObjectNode)node;
for(String name : objectsToDelete) {
- on.remove(name);
+ on.putNull(name);
}
}
}
@@ -219,15 +229,37 @@
sortMultiValuedCollections(entry.getValue(), extSchema);
}
- ObjectMapperContextResolver ctxResolver = new ObjectMapperContextResolver();
- ObjectMapper objMapper = ctxResolver.getContext(null); // TODO is there a
- // better way?
+// ObjectMapperContextResolver ctxResolver = new ObjectMapperContextResolver();
+// ObjectMapper objMapper = ctxResolver.getContext(null); // TODO is there a
+// // better way?
+ ObjectMapper objMapper = new ObjectMapper();
+
+ JaxbAnnotationModule jaxbAnnotationModule = new JaxbAnnotationModule();
+ objMapper.registerModule(jaxbAnnotationModule);
+ objMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+
+ AnnotationIntrospector jaxbIntrospector = new JaxbAnnotationIntrospector(objMapper.getTypeFactory());
+ AnnotationIntrospector jacksonIntrospector = new JacksonAnnotationIntrospector();
+ AnnotationIntrospector pair = new AnnotationIntrospectorPair(jacksonIntrospector, jaxbIntrospector);
+ objMapper.setAnnotationIntrospector(pair);
+
JsonNode node1 = objMapper.valueToTree(original);
nullEmptyLists(node1);
JsonNode node2 = objMapper.valueToTree(resource);
nullEmptyLists(node2);
JsonNode differences = JsonDiff.asJson(node1, node2);
+
+
+ /*
+ Commenting out debug statement to prevent PII from appearing in log
+ ObjectWriter writer = objMapper.writerWithDefaultPrettyPrinter();
+ try {
+ log.debug("Original: "+writer.writeValueAsString(node1));
+ log.debug("Resource: "+writer.writeValueAsString(node2));
+ } catch (IOException e) {
+
+ }*/
try {
log.info("Differences: " + objMapper.writerWithDefaultPrettyPrinter().writeValueAsString(differences));
@@ -286,7 +318,7 @@
if (diffPath == null || diffPath.length() < 1) {
return null;
}
-
+
ParseData parseData = new ParseData(diffPath);
if (parseData.pathParts.isEmpty()) {
@@ -321,7 +353,7 @@
if (done) {
throw new RuntimeException("Path should be done... Attribute not supported by the schema: " + pathPart);
} else if (processingMultiValued) {
- parseData.traverseObjectsInArray(pathPart);
+ parseData.traverseObjectsInArray(pathPart, patchOpType);
if (parseData.isLastIndex(i) && patchOpType == PatchOperation.Type.ADD) {
break;
@@ -331,9 +363,15 @@
TypedAttribute typedAttribute = (TypedAttribute) parseData.originalObject;
String type = typedAttribute.getType();
valueFilterExpression = new AttributeComparisonExpression(new AttributeReference("type"), CompareOperator.EQ, type);
+ } else if (parseData.originalObject instanceof String || parseData.originalObject instanceof Number) {
+ String toString = parseData.originalObject.toString();
+ valueFilterExpression = new AttributeComparisonExpression(new AttributeReference("value"), CompareOperator.EQ, toString);
+ } else if(parseData.originalObject instanceof Enum) {
+ Enum<?> tempEnum = (Enum<?>)parseData.originalObject;
+ valueFilterExpression = new AttributeComparisonExpression(new AttributeReference("value"), CompareOperator.EQ, tempEnum.name());
} else {
- log.warn("Attribute: {} doesn't implement TypedAttribute, can't create ValueFilterExpression", parseData.originalObject.getClass());
- valueFilterExpression = new AttributeComparisonExpression(new AttributeReference("type"), CompareOperator.EQ, "?");
+ log.info("Attribute: {} doesn't implement TypedAttribute, can't create ValueFilterExpression", parseData.originalObject.getClass());
+ valueFilterExpression = new AttributeComparisonExpression(new AttributeReference("value"), CompareOperator.EQ, "?");
}
processingMultiValued = false;
processedMultiValued = true;
@@ -361,6 +399,16 @@
}
++i;
}
+
+ if (patchOpType == Type.REPLACE && parseData.resourceObject == null) {
+ patchOpType = Type.REMOVE;
+ valueNode = null;
+ }
+
+ if (patchOpType == Type.REPLACE && parseData.originalObject == null) {
+ patchOpType = Type.ADD;
+ //valueNode = null;
+ }
PatchOperation operation = new PatchOperation();
operation.setOperation(patchOpType);
@@ -423,6 +471,7 @@
Object resourceObject;
AttributeContainer ac;
String pathUri;
+ int addRemoveOffset = 0;
public ParseData(String diffPath) {
String path = diffPath.substring(1);
@@ -454,11 +503,27 @@
ac = attribute;
}
- public void traverseObjectsInArray(String pathPart) {
+ public void traverseObjectsInArray(String pathPart, Type patchOpType) {
int index = Integer.parseInt(pathPart);
- originalObject = lookupIndexInArray(originalObject, index);
- resourceObject = lookupIndexInArray(resourceObject, index);
+ Attribute attr = (Attribute) ac;
+
+ Integer addRemoveOffset = addRemoveOffsetMap.getOrDefault(attr, 0);
+ switch (patchOpType) {
+ case ADD:
+ addRemoveOffsetMap.put(attr, addRemoveOffset - 1);
+ break;
+ case REMOVE:
+ addRemoveOffsetMap.put(attr, addRemoveOffset + 1);
+ break;
+ case REPLACE:
+ default:
+ // Do Nothing
+ break;
+ }
+
+ originalObject = lookupIndexInArray(originalObject, index + addRemoveOffset);
+ resourceObject = lookupIndexInArray(resourceObject, index + addRemoveOffset);
}
public boolean isLastIndex(int index) {
diff --git a/scim-server/scim-server-common/src/test/java/edu/psu/swe/scim/server/provider/UpdateRequestTest.java b/scim-server/scim-server-common/src/test/java/edu/psu/swe/scim/server/provider/UpdateRequestTest.java
index 02c0420..8d61843 100644
--- a/scim-server/scim-server-common/src/test/java/edu/psu/swe/scim/server/provider/UpdateRequestTest.java
+++ b/scim-server/scim-server-common/src/test/java/edu/psu/swe/scim/server/provider/UpdateRequestTest.java
@@ -48,6 +48,8 @@
private static final String FIRST = "first";
private static final String SECOND = "second";
+ private static final String THIRD = "third";
+ private static final String FOURTH = "fourth";
@Rule
public MockitoRule mockito = MockitoJUnit.rule();
@@ -448,6 +450,183 @@
Assert.assertNull(operation.getValue());
}
+ @Test
+ @Ignore
+ //TODO: do asserts
+ public void testNonTypedAttributeListGetUseablePath() throws Exception {
+ UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>(registry);
+
+ ScimUser user1 = createUser1();
+ ScimUser user2 = copy(user1);
+
+ ExampleObjectExtension ext1 = new ExampleObjectExtension();
+ ext1.setList(Stream.of(FIRST,SECOND,THIRD).collect(Collectors.toList()));
+ user1.addExtension(ext1);
+
+ ExampleObjectExtension ext2 = new ExampleObjectExtension();
+ ext2.setList(Stream.of(FIRST,SECOND,FOURTH).collect(Collectors.toList()));
+ user2.addExtension(ext2);
+
+ updateRequest.initWithResource("1234", user1, user2);
+ List<PatchOperation> operations = updateRequest.getPatchOperations();
+ System.out.println("Number of operations: "+operations.size());
+ operations.stream().forEach(op -> System.out.println(op));
+
+ //TODO: perform assert that proper add and remove paths are correct
+ }
+
+ @Test
+ @Ignore
+ //TODO: do asserts
+ public void testMoveFormatNameToNicknamePart1() throws Exception {
+ UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>(registry);
+
+ ScimUser user1 = createUser1();
+ ScimUser user2 = copy(user1);
+
+ String nickname = "John Xander Anyman";
+ user1.setNickName(nickname);
+
+ user2.getName().setFormatted(nickname);
+
+ updateRequest.initWithResource("1234", user1, user2);
+ List<PatchOperation> operations = updateRequest.getPatchOperations();
+ System.out.println("Number of operations: "+operations.size());
+ operations.stream().forEach(op -> System.out.println(op));
+ }
+
+ @Test
+ @Ignore
+ //TODO: do asserts
+ public void testMoveFormatNameToNicknamePart2() throws Exception {
+ UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>(registry);
+
+ ScimUser user1 = createUser1();
+ ScimUser user2 = copy(user1);
+
+ String nickname = "John Xander Anyman";
+ user1.setNickName(nickname);
+ user2.setNickName("");
+
+ user2.getName().setFormatted(nickname);
+ user1.getName().setFormatted("");
+
+ updateRequest.initWithResource("1234", user1, user2);
+ List<PatchOperation> operations = updateRequest.getPatchOperations();
+ System.out.println("Number of operations: "+operations.size());
+ operations.stream().forEach(op -> System.out.println(op));
+ }
+
+ @Test
+ @Ignore
+ //TODO: do asserts
+ public void testMoveFormatNameToNicknamePart3() throws Exception {
+ UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>(registry);
+
+ ScimUser user1 = createUser1();
+ ScimUser user2 = copy(user1);
+
+ String nickname = "John Xander Anyman";
+ user1.setNickName(nickname);
+ user2.setNickName(null);
+
+ user2.getName().setFormatted(nickname);
+ user1.getName().setFormatted("");
+
+ updateRequest.initWithResource("1234", user1, user2);
+ List<PatchOperation> operations = updateRequest.getPatchOperations();
+ System.out.println("Number of operations: "+operations.size());
+ operations.stream().forEach(op -> System.out.println(op));
+ }
+
+ @Test
+ @Ignore
+ //TODO: do asserts
+ public void testMoveFormatNameToNicknamePart4() throws Exception {
+ UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>(registry);
+
+ ScimUser user1 = createUser1();
+ ScimUser user2 = copy(user1);
+
+ String nickname = "John Xander Anyman";
+ user1.setNickName(nickname);
+ user2.setNickName("");
+
+ user2.getName().setFormatted(nickname);
+ user1.getName().setFormatted(null);
+
+ updateRequest.initWithResource("1234", user1, user2);
+ List<PatchOperation> operations = updateRequest.getPatchOperations();
+ System.out.println("Number of operations: "+operations.size());
+ operations.stream().forEach(op -> System.out.println(op));
+ }
+
+ @Test
+ @Ignore
+ //TODO: do asserts
+ public void testMoveFormatNameToNicknamePart5() throws Exception {
+ UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>(registry);
+
+ ScimUser user1 = createUser1();
+ ScimUser user2 = copy(user1);
+
+ String nickname = "John Xander Anyman";
+ user1.setNickName("");
+ user2.setNickName(nickname);
+
+ user2.getName().setFormatted(null);
+ user1.getName().setFormatted(nickname);
+
+ updateRequest.initWithResource("1234", user1, user2);
+ List<PatchOperation> operations = updateRequest.getPatchOperations();
+ System.out.println("Number of operations: "+operations.size());
+ operations.stream().forEach(op -> System.out.println(op));
+ }
+
+ @Test
+ //TODO: do parameterized test
+ public void offsetTest1() throws Exception {
+ UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>(registry);
+
+ ScimUser user1 = createUser1();
+ ScimUser user2 = copy(user1);
+
+ ExampleObjectExtension ext1 = new ExampleObjectExtension();
+ ext1.setList(Stream.of("D","M","Y","Z","Z","Z","Z","Z").collect(Collectors.toList()));
+ user1.addExtension(ext1);
+
+ ExampleObjectExtension ext2 = new ExampleObjectExtension();
+ //ext2.setList(Stream.of("A","A","B","B","D","F","N","Q","Z").collect(Collectors.toList()));
+ ext2.setList(Stream.of("A","Z").collect(Collectors.toList()));
+ user2.addExtension(ext2);
+
+ updateRequest.initWithResource("1234", user1, user2);
+ List<PatchOperation> operations = updateRequest.getPatchOperations();
+ System.out.println("Number of operations: "+operations.size());
+ operations.stream().forEach(op -> System.out.println(op));
+
+ }
+
+ @Test
+ public void testMoveFormatNameToNicknamePart6() throws Exception {
+ UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>(registry);
+
+ ScimUser user1 = createUser1();
+ ScimUser user2 = copy(user1);
+
+ String nickname = "John Xander Anyman";
+ user1.setNickName(null);
+ user2.setNickName(nickname);
+
+ user2.getName().setFormatted("");
+ user1.getName().setFormatted(nickname);
+
+ updateRequest.initWithResource("1234", user1, user2);
+ List<PatchOperation> operations = updateRequest.getPatchOperations();
+ System.out.println("Number of operations: "+operations.size());
+ operations.stream().forEach(op -> System.out.println(op));
+ }
+
/**
* This is used to test an error condition. In this scenario a user has multiple phone numbers where home is marked primary and work is not. A SCIM update
* is performed in which the new user only contains a work phone number where the type is null. When this happens it should only only be a single DELETE
@@ -464,20 +643,16 @@
// ScimUser user1 = createUser1();
// ScimUser user2 = copy(user1);
// user2.getPhoneNumbers().removeIf(p -> p.getType().equals("home"));
+//
// PhoneNumber workNumber = user2.getPhoneNumbers().stream().filter(p -> p.getType().equals("work")).findFirst().orElse(null);
+// workNumber.setType("home");
// Assert.assertNotNull(workNumber);
-// workNumber.setPrimary(null);
-// workNumber.setPhoneContext(null);
-// workNumber.setNumber(null);
-// workNumber.setExtension(null);
//
// updateRequest.initWithResource("1234", user1, user2);
// List<PatchOperation> operations = updateRequest.getPatchOperations();
// Assert.assertNotNull(operations);
// Assert.assertEquals(expectedNumberOfOperationsWithBug, operations.size());
// Assert.assertNotEquals(expectedNumberOfOperationsWithoutBug, operations.size());
-//
-//
}
private PatchOperation assertSingleResult(List<PatchOperation> result) {
diff --git a/scim-server/scim-server-common/src/test/java/edu/psu/swe/scim/server/utility/ExampleObjectExtension.java b/scim-server/scim-server-common/src/test/java/edu/psu/swe/scim/server/utility/ExampleObjectExtension.java
index 8319564..34a452d 100644
--- a/scim-server/scim-server-common/src/test/java/edu/psu/swe/scim/server/utility/ExampleObjectExtension.java
+++ b/scim-server/scim-server-common/src/test/java/edu/psu/swe/scim/server/utility/ExampleObjectExtension.java
@@ -68,6 +68,10 @@
@ScimAttribute
@XmlElement
+ private List<Order> enumList;
+
+ @ScimAttribute
+ @XmlElement
private Subobject subobject;
@Override
diff --git a/scim-server/scim-server-common/src/test/java/edu/psu/swe/scim/server/utility/Order.java b/scim-server/scim-server-common/src/test/java/edu/psu/swe/scim/server/utility/Order.java
new file mode 100644
index 0000000..92bc50e
--- /dev/null
+++ b/scim-server/scim-server-common/src/test/java/edu/psu/swe/scim/server/utility/Order.java
@@ -0,0 +1,25 @@
+package edu.psu.swe.scim.server.utility;
+
+public enum Order {
+
+ FIRST("first"),
+ SECOND("second"),
+ THIRD("third"),
+ FOURTH("fourth");
+
+ Order(String value) {
+ this.value = value;
+ }
+
+ private final String value;
+
+ public String getValue() {
+ return value;
+ }
+
+ @Override
+ public String toString() {
+ return value;
+ }
+
+}
diff --git a/scim-server/scim-server-example/pom.xml b/scim-server/scim-server-example/pom.xml
index 7c5dd53..f8984ed 100644
--- a/scim-server/scim-server-example/pom.xml
+++ b/scim-server/scim-server-example/pom.xml
@@ -4,7 +4,7 @@
<parent>
<groupId>edu.psu.swe.scim</groupId>
<artifactId>scim-server</artifactId>
- <version>2.11</version>
+ <version>2.12</version>
</parent>
<artifactId>scim-server-examples</artifactId>
diff --git a/scim-server/scim-server-example/scim-server-couchdb/pom.xml b/scim-server/scim-server-example/scim-server-couchdb/pom.xml
index f422905..4664c4c 100644
--- a/scim-server/scim-server-example/scim-server-couchdb/pom.xml
+++ b/scim-server/scim-server-example/scim-server-couchdb/pom.xml
@@ -4,7 +4,7 @@
<parent>
<groupId>edu.psu.swe.scim</groupId>
<artifactId>scim-server-examples</artifactId>
- <version>2.11</version>
+ <version>2.12</version>
</parent>
<artifactId>scim-server-couchdb</artifactId>
diff --git a/scim-server/scim-server-example/scim-server-memory/pom.xml b/scim-server/scim-server-example/scim-server-memory/pom.xml
index bda8c2a..12af38f 100644
--- a/scim-server/scim-server-example/scim-server-memory/pom.xml
+++ b/scim-server/scim-server-example/scim-server-memory/pom.xml
@@ -4,7 +4,7 @@
<parent>
<groupId>edu.psu.swe.scim</groupId>
<artifactId>scim-server-examples</artifactId>
- <version>2.11</version>
+ <version>2.12</version>
</parent>
<artifactId>scim-server-memory</artifactId>
diff --git a/scim-server/scim-server-example/scim-server-rdbms/pom.xml b/scim-server/scim-server-example/scim-server-rdbms/pom.xml
index 0d7e2ec..7f7b5ad 100644
--- a/scim-server/scim-server-example/scim-server-rdbms/pom.xml
+++ b/scim-server/scim-server-example/scim-server-rdbms/pom.xml
@@ -4,7 +4,7 @@
<parent>
<groupId>edu.psu.swe.scim</groupId>
<artifactId>scim-server-examples</artifactId>
- <version>2.11</version>
+ <version>2.12</version>
</parent>
<artifactId>scim-server-rdbms</artifactId>
diff --git a/scim-spec/pom.xml b/scim-spec/pom.xml
index 6222638..fea3f6d 100644
--- a/scim-spec/pom.xml
+++ b/scim-spec/pom.xml
@@ -4,7 +4,7 @@
<parent>
<groupId>edu.psu.swe.scim</groupId>
<artifactId>scim-parent</artifactId>
- <version>2.11</version>
+ <version>2.12</version>
</parent>
<artifactId>scim-spec</artifactId>
diff --git a/scim-spec/scim-spec-protocol/pom.xml b/scim-spec/scim-spec-protocol/pom.xml
index 152967d..57680f6 100644
--- a/scim-spec/scim-spec-protocol/pom.xml
+++ b/scim-spec/scim-spec-protocol/pom.xml
@@ -4,7 +4,7 @@
<parent>
<groupId>edu.psu.swe.scim</groupId>
<artifactId>scim-spec</artifactId>
- <version>2.11</version>
+ <version>2.12</version>
</parent>
<artifactId>scim-spec-protocol</artifactId>
diff --git a/scim-spec/scim-spec-schema/pom.xml b/scim-spec/scim-spec-schema/pom.xml
index c60f79a..8bf9273 100644
--- a/scim-spec/scim-spec-schema/pom.xml
+++ b/scim-spec/scim-spec-schema/pom.xml
@@ -4,7 +4,7 @@
<parent>
<groupId>edu.psu.swe.scim</groupId>
<artifactId>scim-spec</artifactId>
- <version>2.11</version>
+ <version>2.12</version>
</parent>
<artifactId>scim-spec-schema</artifactId>
diff --git a/scim-tools/pom.xml b/scim-tools/pom.xml
index b6a6266..0226036 100644
--- a/scim-tools/pom.xml
+++ b/scim-tools/pom.xml
@@ -4,7 +4,7 @@
<parent>
<groupId>edu.psu.swe.scim</groupId>
<artifactId>scim-parent</artifactId>
- <version>2.11</version>
+ <version>2.12</version>
</parent>
<artifactId>scim-tools</artifactId>
diff --git a/scim-tools/scim-tools-cli/pom.xml b/scim-tools/scim-tools-cli/pom.xml
index 33ac5d4..4721d41 100644
--- a/scim-tools/scim-tools-cli/pom.xml
+++ b/scim-tools/scim-tools-cli/pom.xml
@@ -4,7 +4,7 @@
<parent>
<groupId>edu.psu.swe.scim</groupId>
<artifactId>scim-tools</artifactId>
- <version>2.11</version>
+ <version>2.12</version>
</parent>
<artifactId>scim-tools-cli</artifactId>
diff --git a/scim-tools/scim-tools-common/pom.xml b/scim-tools/scim-tools-common/pom.xml
index dd39348..0eda31a 100644
--- a/scim-tools/scim-tools-common/pom.xml
+++ b/scim-tools/scim-tools-common/pom.xml
@@ -4,7 +4,7 @@
<parent>
<groupId>edu.psu.swe.scim</groupId>
<artifactId>scim-tools</artifactId>
- <version>2.11</version>
+ <version>2.12</version>
</parent>
<artifactId>scim-tools-common</artifactId>
diff --git a/scim-tools/scim-tools-studio/pom.xml b/scim-tools/scim-tools-studio/pom.xml
index 200c1e9..419bd16 100644
--- a/scim-tools/scim-tools-studio/pom.xml
+++ b/scim-tools/scim-tools-studio/pom.xml
@@ -4,7 +4,7 @@
<parent>
<groupId>edu.psu.swe.scim</groupId>
<artifactId>scim-tools</artifactId>
- <version>2.11</version>
+ <version>2.12</version>
</parent>
<artifactId>scim-tools-studio</artifactId>