From 60c9747e536b39dfd6ff24cb31b776b3e6120c0f Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Mon, 26 Sep 2016 08:52:11 +0200 Subject: [PATCH 01/74] First "no namespace" tests. --- .../prism/parser/json/QNameDeserializer.java | 2 +- .../midpoint/prism/PrismInternalTestUtil.java | 4 +- .../midpoint/prism/TestPrismParsing.java | 51 +++---- .../prism/parser/AbstractParserTest.java | 2 + .../common/json/user-jack-no-ns.json | 94 +++++++++++++ .../resources/common/xml/user-jack-no-ns.xml | 126 ++++++++++++++++++ .../resources/common/yaml/resource-rum.yaml | 12 +- .../common/yaml/user-jack-no-ns.yaml | 74 ++++++++++ 8 files changed, 330 insertions(+), 35 deletions(-) create mode 100644 infra/prism/src/test/resources/common/json/user-jack-no-ns.json create mode 100644 infra/prism/src/test/resources/common/xml/user-jack-no-ns.xml create mode 100644 infra/prism/src/test/resources/common/yaml/user-jack-no-ns.yaml diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/QNameDeserializer.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/QNameDeserializer.java index 52302337df3..2710532036d 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/QNameDeserializer.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/QNameDeserializer.java @@ -67,7 +67,7 @@ private QName deserializeFromObject(JsonNode node){ private QName deserializeFromString(JsonNode node){ String qnameUri = node.asText(); - return QNameUtil.uriToQName(qnameUri); + return QNameUtil.uriToQName(qnameUri, true); // return new QName(node.asText()); } diff --git a/infra/prism/src/test/java/com/evolveum/midpoint/prism/PrismInternalTestUtil.java b/infra/prism/src/test/java/com/evolveum/midpoint/prism/PrismInternalTestUtil.java index 7fd70f8422d..68a4acda66b 100644 --- a/infra/prism/src/test/java/com/evolveum/midpoint/prism/PrismInternalTestUtil.java +++ b/infra/prism/src/test/java/com/evolveum/midpoint/prism/PrismInternalTestUtil.java @@ -74,7 +74,9 @@ public class PrismInternalTestUtil implements PrismContextFactory { // User: jack public static final String USER_JACK_FILE_BASENAME = "user-jack"; public static final File USER_JACK_FILE_XML = new File(COMMON_DIR_XML, USER_JACK_FILE_BASENAME+".xml"); - + + public static final String USER_JACK_NO_NS_BASENAME = "user-jack-no-ns"; + public static final String USER_JACK_OBJECT_BASENAME = "user-jack-object"; public static final File USER_JACK_OBJECT_FILE = new File(COMMON_DIR_XML, "user-jack-object.xml"); diff --git a/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestPrismParsing.java b/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestPrismParsing.java index 5dbc0754884..9c86387ea91 100644 --- a/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestPrismParsing.java +++ b/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestPrismParsing.java @@ -15,38 +15,7 @@ */ package com.evolveum.midpoint.prism; -import static com.evolveum.midpoint.prism.PrismInternalTestUtil.COMMON_DIR_PATH; -import static com.evolveum.midpoint.prism.PrismInternalTestUtil.DEFAULT_NAMESPACE_PREFIX; -import static com.evolveum.midpoint.prism.PrismInternalTestUtil.EXTENSION_BAR_ELEMENT; -import static com.evolveum.midpoint.prism.PrismInternalTestUtil.EXTENSION_DATE_TYPE_ELEMENT; -import static com.evolveum.midpoint.prism.PrismInternalTestUtil.EXTENSION_DOUBLE_TYPE_ELEMENT; -import static com.evolveum.midpoint.prism.PrismInternalTestUtil.EXTENSION_DURATION_TYPE_ELEMENT; -import static com.evolveum.midpoint.prism.PrismInternalTestUtil.EXTENSION_IGNORED_TYPE_ELEMENT; -import static com.evolveum.midpoint.prism.PrismInternalTestUtil.EXTENSION_INDEXED_STRING_TYPE_ELEMENT; -import static com.evolveum.midpoint.prism.PrismInternalTestUtil.EXTENSION_INTEGER_TYPE_ELEMENT; -import static com.evolveum.midpoint.prism.PrismInternalTestUtil.EXTENSION_INT_TYPE_ELEMENT; -import static com.evolveum.midpoint.prism.PrismInternalTestUtil.EXTENSION_LOCATIONS_ELEMENT; -import static com.evolveum.midpoint.prism.PrismInternalTestUtil.EXTENSION_LOCATIONS_TYPE_QNAME; -import static com.evolveum.midpoint.prism.PrismInternalTestUtil.EXTENSION_LONG_TYPE_ELEMENT; -import static com.evolveum.midpoint.prism.PrismInternalTestUtil.EXTENSION_MELEE_CONTEXT_ELEMENT; -import static com.evolveum.midpoint.prism.PrismInternalTestUtil.EXTENSION_MELEE_CONTEXT_OPPONENT_ELEMENT; -import static com.evolveum.midpoint.prism.PrismInternalTestUtil.EXTENSION_MELEE_CONTEXT_OPPONENT_REF_ELEMENT; -import static com.evolveum.midpoint.prism.PrismInternalTestUtil.EXTENSION_MULTI_ELEMENT; -import static com.evolveum.midpoint.prism.PrismInternalTestUtil.EXTENSION_NUM_ELEMENT; -import static com.evolveum.midpoint.prism.PrismInternalTestUtil.EXTENSION_SINGLE_STRING_TYPE_ELEMENT; -import static com.evolveum.midpoint.prism.PrismInternalTestUtil.EXTENSION_STRING_TYPE_ELEMENT; -import static com.evolveum.midpoint.prism.PrismInternalTestUtil.NS_FOO; -import static com.evolveum.midpoint.prism.PrismInternalTestUtil.USER_ADHOC_BOTTLES_ELEMENT; -import static com.evolveum.midpoint.prism.PrismInternalTestUtil.USER_BARBOSSA_FILE_BASENAME; -import static com.evolveum.midpoint.prism.PrismInternalTestUtil.USER_JACK_ADHOC_BASENAME; -import static com.evolveum.midpoint.prism.PrismInternalTestUtil.USER_JACK_FILE_BASENAME; -import static com.evolveum.midpoint.prism.PrismInternalTestUtil.USER_JACK_OBJECT_BASENAME; -import static com.evolveum.midpoint.prism.PrismInternalTestUtil.USER_WILL_FILE_BASENAME; -import static com.evolveum.midpoint.prism.PrismInternalTestUtil.assertContainerDefinition; -import static com.evolveum.midpoint.prism.PrismInternalTestUtil.assertUserJack; -import static com.evolveum.midpoint.prism.PrismInternalTestUtil.assertUserJackContent; -import static com.evolveum.midpoint.prism.PrismInternalTestUtil.assertVisitor; -import static com.evolveum.midpoint.prism.PrismInternalTestUtil.constructInitializedPrismContext; +import static com.evolveum.midpoint.prism.PrismInternalTestUtil.*; import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertNotNull; import static org.testng.AssertJUnit.assertNull; @@ -120,6 +89,24 @@ public void testPrismParseFile() throws Exception { assertUserJack(user); } + @Test + public void testPrismParseFileNoNs() throws Exception { + final String TEST_NAME = "testPrismParseFileNoNs"; + PrismInternalTestUtil.displayTestTitle(TEST_NAME); + // GIVEN + PrismContext prismContext = constructInitializedPrismContext(); + + // WHEN + PrismObject user = prismContext.parseObject(getFile(USER_JACK_NO_NS_BASENAME)); + + // THEN + System.out.println("User:"); + System.out.println(user.debugDump()); + assertNotNull(user); + + assertUserJack(user); + } + @Test public void testPrismParseFileObject() throws Exception { final String TEST_NAME = "testPrismParseFileObject"; diff --git a/infra/prism/src/test/java/com/evolveum/midpoint/prism/parser/AbstractParserTest.java b/infra/prism/src/test/java/com/evolveum/midpoint/prism/parser/AbstractParserTest.java index 5a91f7182ab..f20de7eafb2 100644 --- a/infra/prism/src/test/java/com/evolveum/midpoint/prism/parser/AbstractParserTest.java +++ b/infra/prism/src/test/java/com/evolveum/midpoint/prism/parser/AbstractParserTest.java @@ -321,6 +321,8 @@ private void assertResourceRum(PrismObject resource) throws Schema assertEquals("Bad schema element name", DOMUtil.XSD_SCHEMA_ELEMENT, DOMUtil.getQName(schemaElement)); Element complexTypeElement = DOMUtil.getChildElement(schemaElement, XSD_COMPLEX_TYPE_ELEMENT_NAME); assertNotNull("No complexType element in schema element in schema property in resource", complexTypeElement); + String complexTypeName = complexTypeElement.getAttribute("name"); + assertEquals("Wrong name of complex type", "BarrelType", complexTypeName); } private PrismObject findObjectFromAccountRef(PrismObject user) { diff --git a/infra/prism/src/test/resources/common/json/user-jack-no-ns.json b/infra/prism/src/test/resources/common/json/user-jack-no-ns.json new file mode 100644 index 00000000000..84229ec51e2 --- /dev/null +++ b/infra/prism/src/test/resources/common/json/user-jack-no-ns.json @@ -0,0 +1,94 @@ +{ + "user" : { + "oid" : "c0c010c0-d34d-b33f-f00d-111111111111", + "version" : "42", + "name" : "jack", + "description" : "This must be the best pirate the world has ever seen", + "extension" : { + "singleStringType" : "foobar", + "indexedString" : [ "alpha", "bravo" ], + "bar" : [ { + "@typeDef" : "http://www.w3.org/2001/XMLSchema#string", + "@value" : "BAR" + } ], + "num" : [ { + "@typeDef" : "http://www.w3.org/2001/XMLSchema#int", + "@value" : 42 + } ], + "multi" : [ { + "@typeDef" : "http://www.w3.org/2001/XMLSchema#string", + "@value" : "raz" + }, { + "@typeDef" : "http://www.w3.org/2001/XMLSchema#string", + "@value" : "dva" + }, { + "@typeDef" : "http://www.w3.org/2001/XMLSchema#string", + "@value" : "tri" + } ] + }, + "fullName" : "cpt. Jack Sparrow", + "givenName" : "Jack", + "familyName" : "Sparrow", + "additionalNames" : [ "Captain", "Jackie" ], + "polyName" : "Džek Sperou", + "assignment" : [ { + "id" : 1111, + "description" : "Assignment 1" + }, { + "id" : 1112, + "description" : "Assignment 2", + "accountConstruction" : { + "howto" : "Just do it", + "when" : 1330080532000, + "value" : [ "ABC", { "fullName" : "Nobody" } ] + } + } ], + "activation" : { + "enabled" : true, + "validFrom" : 170717400000 + }, + "password" : { + "encryptedData" : { + "encryptionMethod" : { + "algorithm" : "http://www.w3.org/2001/04/xmlenc#aes256-cbc" + }, + "keyInfo" : { + "keyName" : "HF6JRsNMeJt6alihT44CXKgpe0c=" + }, + "cipherData" : { + "cipherValue" : "blc5OXO2Z4vJW7o/XXhqZzg/rkwsIOwRBK7KLgMqwcrVcYpeZZOjxzgRgFiNw4IB" + } + } + }, + "accountRef" : [ { + "oid" : "c0c010c0-d34d-b33f-f00d-aaaaaaaa1113", + "type" : "AccountType", + "object" : { + "oid" : "c0c010c0-d34d-b33f-f00d-aaaaaaaa1113", + "name" : "jsparrow" + } + }, { + "oid" : "c0c010c0-d34d-b33f-f00d-aaaaaaaa1111" + }, { + "oid" : "c0c010c0-d34d-b33f-f00d-aaaaaaaa1112", + "type" : "AccountType", + "description" : "This is a reference with a filter", + "filter" : { + "equal" : { + "path" : "name", + "value" : [ "captain" ] + } + } + } ], + "special" : "got it!", + + "singleActivation" : { }, + "multiActivation" : { }, + "multiActivationCopy" : [ { }, { "enabled" : "true" } ], + + "singleConstruction" : { }, + "multiConstruction" : [ { } ], + "multiConstructionCopy" : [ { }, { "howto" : "abc" } ] + + } +} diff --git a/infra/prism/src/test/resources/common/xml/user-jack-no-ns.xml b/infra/prism/src/test/resources/common/xml/user-jack-no-ns.xml new file mode 100644 index 00000000000..876a95cbb7e --- /dev/null +++ b/infra/prism/src/test/resources/common/xml/user-jack-no-ns.xml @@ -0,0 +1,126 @@ + + + + jack + This must be the best pirate the world has ever seen + + + + foobar + + + alpha + bravo + + + BAR + + + 42 + + + raz + dva + tri + + + + cpt. Jack Sparrow + Jack + Sparrow + Captain + Jackie + + Džek Sperou + dzek sperou + + + + Assignment 1 + + + + Assignment 2 + + Just do it + 2012-02-24T10:48:52.000Z + ABC + + Nobody + + + + + + true + 1975-05-30T21:30:00.000Z + + + + + + http://www.w3.org/2001/04/xmlenc#aes256-cbc + + + HF6JRsNMeJt6alihT44CXKgpe0c= + + + blc5OXO2Z4vJW7o/XXhqZzg/rkwsIOwRBK7KLgMqwcrVcYpeZZOjxzgRgFiNw4IB + + + + + + + jsparrow + + + + + + + + This is a reference with a filter + + + name + captain + + + + + got it! + + + + + + true + + + + + + + abc + + + diff --git a/infra/prism/src/test/resources/common/yaml/resource-rum.yaml b/infra/prism/src/test/resources/common/yaml/resource-rum.yaml index 840a4f0c66e..c4f036a3453 100644 --- a/infra/prism/src/test/resources/common/yaml/resource-rum.yaml +++ b/infra/prism/src/test/resources/common/yaml/resource-rum.yaml @@ -7,4 +7,14 @@ resource: description: "Where's the rum?" schema: '@ns': "http://www.w3.org/2001/XMLSchema" - schema : "\n\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t" \ No newline at end of file + schema : | + + + + + + + + + + \ No newline at end of file diff --git a/infra/prism/src/test/resources/common/yaml/user-jack-no-ns.yaml b/infra/prism/src/test/resources/common/yaml/user-jack-no-ns.yaml new file mode 100644 index 00000000000..f72e2ca49e1 --- /dev/null +++ b/infra/prism/src/test/resources/common/yaml/user-jack-no-ns.yaml @@ -0,0 +1,74 @@ +--- +user: + oid: "c0c010c0-d34d-b33f-f00d-111111111111" + version: "42" + name: "jack" + description: "This must be the best pirate the world has ever seen" + extension: + singleStringType: "foobar" + indexedString: + - "alpha" + - "bravo" + bar: + - !http://www.w3.org/2001/XMLSchema/string "BAR" + num: + - !http://www.w3.org/2001/XMLSchema/int 42 + multi: + - !http://www.w3.org/2001/XMLSchema/string "raz" + - !http://www.w3.org/2001/XMLSchema/string "dva" + - !http://www.w3.org/2001/XMLSchema/string "tri" + fullName: "cpt. Jack Sparrow" + givenName: "Jack" + familyName: "Sparrow" + additionalNames: + - "Captain" + - "Jackie" + polyName: "Džek Sperou" + assignment: + - id: 1111 + description: "Assignment 1" + - id: 1112 + description: "Assignment 2" + accountConstruction: + howto: "Just do it" + when: 1330080532000 + value: + - ABC + - fullName : Nobody + activation: + enabled: true + validFrom: 170717400000 + password: + encryptedData: + encryptionMethod: + algorithm: "http://www.w3.org/2001/04/xmlenc#aes256-cbc" + keyInfo: + keyName: "HF6JRsNMeJt6alihT44CXKgpe0c=" + cipherData: + cipherValue: "blc5OXO2Z4vJW7o/XXhqZzg/rkwsIOwRBK7KLgMqwcrVcYpeZZOjxzgRgFiNw4IB" + accountRef: + - oid: "c0c010c0-d34d-b33f-f00d-aaaaaaaa1113" + type: "AccountType" + object: + oid: "c0c010c0-d34d-b33f-f00d-aaaaaaaa1113" + name: "jsparrow" + - oid: "c0c010c0-d34d-b33f-f00d-aaaaaaaa1111" # deliberately without specifying the type, as it should be taken from the definition + - oid: "c0c010c0-d34d-b33f-f00d-aaaaaaaa1112" + type: "AccountType" + description: "This is a reference with a filter" + filter: + equal: + path: name + value: + - "captain" + special: "got it!" + singleActivation: + multiActivation: + multiActivationCopy: + - + - enabled: true + singleConstruction: + multiConstruction: + multiConstructionCopy: + - + - howto: abc \ No newline at end of file From 9b2b3bcbe1bdead98d35f375c7cdba15577b1ce0 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Mon, 26 Sep 2016 14:58:35 +0200 Subject: [PATCH 02/74] Upgraded jackson to current version (2.8.3) + minor cleanups --- build-system/pom.xml | 8 ++- infra/prism/pom.xml | 4 ++ .../midpoint/prism/parser/AbstractParser.java | 14 ++--- .../midpoint/prism/parser/JsonParser.java | 13 +---- .../midpoint/prism/parser/YamlParser.java | 21 +++----- .../prism/parser/json/JsonValueParser.java | 14 ++--- .../parser/yaml/MidpoinYAMLGenerator.java | 52 ------------------ .../parser/yaml/MidpointYAMLFactory.java | 54 ++++++++----------- .../parser/yaml/MidpointYAMLGenerator.java | 41 ++++++++++++++ .../prism/parser/yaml/MidpointYAMLParser.java | 6 +-- .../common/yaml/user-jack-adhoc.yaml | 13 ++--- .../common/yaml/user-jack-modified.yaml | 13 ++--- .../common/yaml/user-jack-no-ns.yaml | 13 ++--- .../common/yaml/user-jack-object.yaml | 13 ++--- .../test/resources/common/yaml/user-jack.yaml | 13 ++--- 15 files changed, 135 insertions(+), 157 deletions(-) delete mode 100644 infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/yaml/MidpoinYAMLGenerator.java create mode 100644 infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/yaml/MidpointYAMLGenerator.java diff --git a/build-system/pom.xml b/build-system/pom.xml index 6e8edfbb3d7..91cdb0cfe36 100644 --- a/build-system/pom.xml +++ b/build-system/pom.xml @@ -84,7 +84,8 @@ 6.1.1 10.11.1.1 1.8.0 - 2.3.3 + 2.8.3 + 1.15 2.19.1 @@ -902,6 +903,11 @@ jackson-annotations ${jackson.version} + + org.yaml + snakeyaml + ${snakeyaml.version} + com.fasterxml.jackson.core jackson-databind diff --git a/infra/prism/pom.xml b/infra/prism/pom.xml index bbe17ffa94d..e509e21331d 100644 --- a/infra/prism/pom.xml +++ b/infra/prism/pom.xml @@ -83,6 +83,10 @@ com.fasterxml.jackson.core jackson-annotations + + org.yaml + snakeyaml + org.springframework spring-core diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/AbstractParser.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/AbstractParser.java index 43363cf43c3..4da739d7f01 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/AbstractParser.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/AbstractParser.java @@ -1,9 +1,6 @@ package com.evolveum.midpoint.prism.parser; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.io.StringWriter; +import java.io.*; import java.util.Collection; import java.util.Iterator; import java.util.ListIterator; @@ -56,10 +53,13 @@ public abstract class AbstractParser implements Parser { protected static final String TYPE_DEFINITION = "@typeDef"; protected static final String VALUE_FIELD = "@value"; - - protected abstract JsonParser createParser(String dataString) throws SchemaException; + protected abstract JsonParser createParser(String dataString) throws SchemaException; protected abstract JsonParser createParser(InputStream stream) throws SchemaException, IOException; - protected abstract JsonParser createParser(File file) throws SchemaException, IOException; + + protected JsonParser createParser(File file) throws SchemaException, IOException { + return createParser(new FileInputStream(file)); + } + public abstract JsonGenerator createGenerator(StringWriter out) throws SchemaException; @Override diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/JsonParser.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/JsonParser.java index 0676a418c1d..8ee5fde6e92 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/JsonParser.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/JsonParser.java @@ -29,13 +29,7 @@ import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.module.jaxb.JaxbAnnotationIntrospector; -public class JsonParser extends AbstractParser{ - -// private static final String PROP_NAMESPACE = "@ns"; -// private static final String TYPE_DEFINITION = "@typeDef"; -// private static final String VALUE_FIELD = "@value"; -// -// +public class JsonParser extends AbstractParser { @Override public boolean canParse(File file) throws IOException { @@ -53,11 +47,6 @@ public boolean canParse(String dataString) { return dataString.startsWith("{"); } - @Override - protected com.fasterxml.jackson.core.JsonParser createParser(File file) throws SchemaException, IOException { - return createParser(new FileInputStream(file)); - } - @Override protected com.fasterxml.jackson.core.JsonParser createParser(InputStream stream) throws SchemaException, IOException { JsonFactory factory = new JsonFactory(); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/YamlParser.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/YamlParser.java index da68571cf4b..de85a41bc39 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/YamlParser.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/YamlParser.java @@ -16,14 +16,13 @@ import com.evolveum.midpoint.prism.parser.json.PolyStringSerializer; import com.evolveum.midpoint.prism.parser.json.QNameSerializer; import com.evolveum.midpoint.prism.parser.json.XmlGregorialCalendarSerializer; -import com.evolveum.midpoint.prism.parser.yaml.MidpoinYAMLGenerator; +import com.evolveum.midpoint.prism.parser.yaml.MidpointYAMLGenerator; import com.evolveum.midpoint.prism.parser.yaml.MidpointYAMLFactory; import com.evolveum.midpoint.prism.parser.yaml.MidpointYAMLParser; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.prism.xnode.PrimitiveXNode; import com.evolveum.midpoint.util.DOMUtil; -import com.evolveum.midpoint.util.QNameUtil; import com.evolveum.midpoint.util.exception.SchemaException; import com.fasterxml.jackson.annotation.JsonTypeInfo.As; import com.fasterxml.jackson.core.JsonGenerationException; @@ -39,7 +38,7 @@ import com.fasterxml.jackson.dataformat.yaml.YAMLParser; //import com.fasterxml.jackson.core.YAMLGenerator; -public class YamlParser extends AbstractParser{ +public class YamlParser extends AbstractParser { //------------------------END OF METHODS FOR SERIALIZATION ------------------------------- @@ -63,13 +62,13 @@ public boolean canParse(String dataString) { public YAMLGenerator createGenerator(StringWriter out) throws SchemaException{ try { MidpointYAMLFactory factory = new MidpointYAMLFactory(); - MidpoinYAMLGenerator generator = (MidpoinYAMLGenerator) factory.createGenerator(out); + MidpointYAMLGenerator generator = (MidpointYAMLGenerator) factory.createGenerator(out); generator.setPrettyPrinter(new DefaultPrettyPrinter()); generator.setCodec(configureMapperForSerialization()); -// MidpoinYAMLGenerator myg = new MidpoinYAMLGenerator(generator., jsonFeatures, yamlFeatures, codec, out, version) +// MidpointYAMLGenerator myg = new MidpointYAMLGenerator(generator., jsonFeatures, yamlFeatures, codec, out, version) // generator. generator.configure(com.fasterxml.jackson.dataformat.yaml.YAMLGenerator.Feature.CANONICAL_OUTPUT, false); - YAMLParser parser = factory.createParser(out.toString()); +// YAMLParser parser = factory.createParser(out.toString()); // parser. return generator; } catch (IOException ex){ @@ -88,7 +87,7 @@ private ObjectMapper configureMapperForSerialization(){ mapper.registerModule(createSerializerModule()); mapper.enableDefaultTyping(DefaultTyping.NON_CONCRETE_AND_ARRAYS); mapper.enableDefaultTyping(DefaultTyping.NON_FINAL, As.EXISTING_PROPERTY); - mapper.enableDefaultTyping(DefaultTyping.NON_FINAL, As.EXTERNAL_PROPERTY); + //mapper.enableDefaultTyping(DefaultTyping.NON_FINAL, As.EXTERNAL_PROPERTY); mapper.enableDefaultTyping(DefaultTyping.NON_FINAL, As.PROPERTY); return mapper; @@ -105,19 +104,13 @@ private Module createSerializerModule(){ return module; } - @Override - protected MidpointYAMLParser createParser(File file) throws SchemaException, IOException { - return createParser(new FileInputStream(file)); - } - @Override protected MidpointYAMLParser createParser(InputStream stream) throws SchemaException, IOException { MidpointYAMLFactory factory = new MidpointYAMLFactory(); try { MidpointYAMLParser p = (MidpointYAMLParser) factory.createParser(stream); // p.enable(Feature.BOGUS); - String oid = p.getObjectId(); - p.enable(com.fasterxml.jackson.core.JsonParser.Feature.ALLOW_YAML_COMMENTS); +// String oid = p.getObjectId(); return p; } catch (IOException e) { throw e; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/JsonValueParser.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/JsonValueParser.java index 1f565f8ee7c..dd5713d0ccc 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/JsonValueParser.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/JsonValueParser.java @@ -14,18 +14,19 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectReader; import org.apache.commons.lang.StringUtils; +import org.jetbrains.annotations.NotNull; public class JsonValueParser implements ValueParser { - private final JsonParser parser; + @NotNull private final JsonParser parser; private JsonNode node; - public JsonValueParser(JsonParser parser, JsonNode node) { + public JsonValueParser(@NotNull JsonParser parser, JsonNode node) { this.parser = parser; this.node = node; } - public JsonValueParser(final JsonParser parser) { + public JsonValueParser(@NotNull JsonParser parser) { this.parser = parser; } @@ -37,7 +38,7 @@ public T parse(QName typeName, XNodeProcessorEvaluationMode mode) throws SchemaE ObjectMapper mapper = (ObjectMapper) parser.getCodec(); Class clazz = XsdTypeMapper.toJavaType(typeName); - ObjectReader r = mapper.reader(clazz); + ObjectReader r = mapper.readerFor(clazz); try { // if (parser.getCurrentToken() == null){ // JsonToken t = parser.nextToken(); @@ -55,13 +56,12 @@ public T parse(QName typeName, XNodeProcessorEvaluationMode mode) throws SchemaE @Override public boolean isEmpty() { - return node == null || parser == null || - StringUtils.isBlank(node.asText()); // to be consistent with PrimitiveXNode.isEmpty for parsed values + return node == null || StringUtils.isBlank(node.asText()); // to be consistent with PrimitiveXNode.isEmpty for parsed values } @Override public String getStringValue() { - if (node == null){ + if (node == null) { return null; } return node.asText(); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/yaml/MidpoinYAMLGenerator.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/yaml/MidpoinYAMLGenerator.java deleted file mode 100644 index 40cfaedf5f6..00000000000 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/yaml/MidpoinYAMLGenerator.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.evolveum.midpoint.prism.parser.yaml; - -import java.io.IOException; -import java.io.Writer; - -import com.fasterxml.jackson.core.ObjectCodec; -import com.fasterxml.jackson.core.io.IOContext; -import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; -import com.fasterxml.jackson.dataformat.yaml.YAMLGenerator; -import com.fasterxml.jackson.dataformat.yaml.snakeyaml.DumperOptions.Version; -import com.fasterxml.jackson.dataformat.yaml.snakeyaml.events.ImplicitTuple; -import com.fasterxml.jackson.dataformat.yaml.snakeyaml.events.ScalarEvent; - -public class MidpoinYAMLGenerator extends YAMLGenerator{ - - public MidpoinYAMLGenerator(IOContext ctxt, int jsonFeatures, int yamlFeatures, ObjectCodec codec, - Writer out, Version version) throws IOException { - super(ctxt, jsonFeatures, yamlFeatures, codec, out, version); - // TODO Auto-generated constructor stub - } - -// public MidpoinYAMLGenerator(YAMLGenerator generator, YAMLFactory factory) throws IOException { -// super. -// super(ctxt, jsonFeatures, yamlFeatures, codec, out, version); - // TODO Auto-generated constructor stub -// } - - @Override - protected void _writeScalar(String value, String type, Character style) throws IOException - { - _emitter.emit(_scalarEvent(value, style)); - } - - @Override - protected ScalarEvent _scalarEvent(String value, Character style) - { - ImplicitTuple implicitTuple = new ImplicitTuple(true, false); - String yamlTag = _typeId; - if (yamlTag == null) { - // to avid of writing default "!" when typing is not needed - implicitTuple = new ImplicitTuple(true, true); -// yamlTag = "ADDEDSPECIAL"; -// _typeId = null; - } - String anchor = _objectId; - if (anchor != null) { -// _objectId = null; - } - return new ScalarEvent(anchor, yamlTag, implicitTuple, value, - null, null, style); - } -} diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/yaml/MidpointYAMLFactory.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/yaml/MidpointYAMLFactory.java index f4ce6fe2d25..7cdf26a726f 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/yaml/MidpointYAMLFactory.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/yaml/MidpointYAMLFactory.java @@ -5,40 +5,32 @@ import java.io.Reader; import java.io.Writer; +import com.fasterxml.jackson.core.JsonParser; + import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.core.io.IOContext; import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; -import com.fasterxml.jackson.dataformat.yaml.YAMLGenerator; -import com.fasterxml.jackson.dataformat.yaml.YAMLParser; -public class MidpointYAMLFactory extends YAMLFactory{ +public class MidpointYAMLFactory extends YAMLFactory { + + @Override + protected MidpointYAMLGenerator _createGenerator(Writer out, IOContext ctxt) throws IOException { + int feats = _yamlGeneratorFeatures; + MidpointYAMLGenerator gen = new MidpointYAMLGenerator(ctxt, _generatorFeatures, feats, _objectCodec, out, _version); + // any other initializations? No? + return gen; + } + + @SuppressWarnings("resource") + @Override + protected MidpointYAMLParser _createParser(InputStream in, IOContext ctxt) throws IOException, JsonParseException { + return _createParser(_createReader(in, null, ctxt), ctxt); + } - @Override - protected MidpoinYAMLGenerator _createGenerator(Writer out, IOContext ctxt) - throws IOException - { - int feats = _yamlGeneratorFeatures; - MidpoinYAMLGenerator gen = new MidpoinYAMLGenerator(ctxt, _generatorFeatures, feats, - _objectCodec, out, _version); - // any other initializations? No? - return gen; - } - - @SuppressWarnings("resource") - @Override - protected MidpointYAMLParser _createParser(InputStream in, IOContext ctxt) - throws IOException, JsonParseException - { - Reader r = _createReader(in, null, ctxt); - return new MidpointYAMLParser(ctxt, _getBufferRecycler(), _parserFeatures, _yamlParserFeatures, - _objectCodec, r); - } - - @Override - protected MidpointYAMLParser _createParser(Reader r, IOContext ctxt) - throws IOException, JsonParseException - { - return new MidpointYAMLParser(ctxt, _getBufferRecycler(), _parserFeatures, _yamlParserFeatures, - _objectCodec, r); - } + @Override + protected MidpointYAMLParser _createParser(Reader r, IOContext ctxt) throws IOException, JsonParseException { + MidpointYAMLParser p = new MidpointYAMLParser(ctxt, _getBufferRecycler(), _parserFeatures, _yamlParserFeatures, _objectCodec, r); + p.enable(JsonParser.Feature.ALLOW_YAML_COMMENTS); + return p; + } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/yaml/MidpointYAMLGenerator.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/yaml/MidpointYAMLGenerator.java new file mode 100644 index 00000000000..426ac008904 --- /dev/null +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/yaml/MidpointYAMLGenerator.java @@ -0,0 +1,41 @@ +package com.evolveum.midpoint.prism.parser.yaml; + +import com.fasterxml.jackson.core.ObjectCodec; +import com.fasterxml.jackson.core.io.IOContext; +import com.fasterxml.jackson.dataformat.yaml.YAMLGenerator; +import org.yaml.snakeyaml.DumperOptions; +import org.yaml.snakeyaml.events.ImplicitTuple; +import org.yaml.snakeyaml.events.ScalarEvent; + +import java.io.IOException; +import java.io.Writer; + +public class MidpointYAMLGenerator extends YAMLGenerator { + + public MidpointYAMLGenerator(IOContext ctxt, int jsonFeatures, int yamlFeatures, ObjectCodec codec, + Writer out, DumperOptions.Version version) throws IOException { + super(ctxt, jsonFeatures, yamlFeatures, codec, out, version); + } + + @Override + protected void _writeScalar(String value, String type, Character style) throws IOException { + _emitter.emit(_scalarEvent(value, style)); + } + + @Override + protected ScalarEvent _scalarEvent(String value, Character style) { + ImplicitTuple implicitTuple = new ImplicitTuple(true, false); + String yamlTag = _typeId; + if (yamlTag == null) { + // to avoid of writing default "!" when typing is not needed + implicitTuple = new ImplicitTuple(true, true); + // yamlTag = "ADDEDSPECIAL"; + // _typeId = null; + } + String anchor = _objectId; + if (anchor != null) { + // _objectId = null; + } + return new ScalarEvent(anchor, yamlTag, implicitTuple, value, null, null, style); + } +} diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/yaml/MidpointYAMLParser.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/yaml/MidpointYAMLParser.java index d08c9737b9a..4d33bea196e 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/yaml/MidpointYAMLParser.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/yaml/MidpointYAMLParser.java @@ -12,10 +12,10 @@ import com.fasterxml.jackson.core.io.IOContext; import com.fasterxml.jackson.core.util.BufferRecycler; import com.fasterxml.jackson.dataformat.yaml.YAMLParser; -import com.fasterxml.jackson.dataformat.yaml.snakeyaml.events.CollectionStartEvent; -import com.fasterxml.jackson.dataformat.yaml.snakeyaml.events.ScalarEvent; +import org.yaml.snakeyaml.events.CollectionStartEvent; +import org.yaml.snakeyaml.events.ScalarEvent; -public class MidpointYAMLParser extends YAMLParser{ +public class MidpointYAMLParser extends YAMLParser { public MidpointYAMLParser(IOContext ctxt, BufferRecycler br, int parserFeatures, int csvFeatures, ObjectCodec codec, Reader reader) { diff --git a/infra/prism/src/test/resources/common/yaml/user-jack-adhoc.yaml b/infra/prism/src/test/resources/common/yaml/user-jack-adhoc.yaml index d96b37209d3..3cd6c7d106c 100644 --- a/infra/prism/src/test/resources/common/yaml/user-jack-adhoc.yaml +++ b/infra/prism/src/test/resources/common/yaml/user-jack-adhoc.yaml @@ -54,13 +54,14 @@ user: - oid: "c0c010c0-d34d-b33f-f00d-aaaaaaaa1113" type: "http://midpoint.evolveum.com/xml/ns/test/foo-1.xsd#AccountType" special: "got it!" - singleActivation: - multiActivation: + # TODO fix this test + singleActivation: { } + multiActivation: { } multiActivationCopy: - - + - { } - enabled: true - singleConstruction: - multiConstruction: + singleConstruction: { } + multiConstruction: [ { } ] multiConstructionCopy: - - + - { } - howto: abc \ No newline at end of file diff --git a/infra/prism/src/test/resources/common/yaml/user-jack-modified.yaml b/infra/prism/src/test/resources/common/yaml/user-jack-modified.yaml index 880dc061b44..0718e202348 100644 --- a/infra/prism/src/test/resources/common/yaml/user-jack-modified.yaml +++ b/infra/prism/src/test/resources/common/yaml/user-jack-modified.yaml @@ -66,13 +66,14 @@ user: - oid: "c0c010c0-d34d-b33f-f00d-aaaaaaaa1113" type: "http://midpoint.evolveum.com/xml/ns/test/foo-1.xsd#AccountType" special: "got it!" - singleActivation: - multiActivation: + # TODO fix this test + singleActivation: { } + multiActivation: { } multiActivationCopy: - - + - { } - enabled: true - singleConstruction: - multiConstruction: + singleConstruction: { } + multiConstruction: [ { } ] multiConstructionCopy: - - + - { } - howto: abc \ No newline at end of file diff --git a/infra/prism/src/test/resources/common/yaml/user-jack-no-ns.yaml b/infra/prism/src/test/resources/common/yaml/user-jack-no-ns.yaml index f72e2ca49e1..30a98f68fee 100644 --- a/infra/prism/src/test/resources/common/yaml/user-jack-no-ns.yaml +++ b/infra/prism/src/test/resources/common/yaml/user-jack-no-ns.yaml @@ -62,13 +62,14 @@ user: value: - "captain" special: "got it!" - singleActivation: - multiActivation: + # TODO fix this test + singleActivation: { } + multiActivation: { } multiActivationCopy: - - + - { } - enabled: true - singleConstruction: - multiConstruction: + singleConstruction: { } + multiConstruction: [ { } ] multiConstructionCopy: - - + - { } - howto: abc \ No newline at end of file diff --git a/infra/prism/src/test/resources/common/yaml/user-jack-object.yaml b/infra/prism/src/test/resources/common/yaml/user-jack-object.yaml index 49f61f6dbcf..b8715b7366e 100644 --- a/infra/prism/src/test/resources/common/yaml/user-jack-object.yaml +++ b/infra/prism/src/test/resources/common/yaml/user-jack-object.yaml @@ -66,13 +66,14 @@ object: - oid: "c0c010c0-d34d-b33f-f00d-aaaaaaaa1113" type: "http://midpoint.evolveum.com/xml/ns/test/foo-1.xsd#AccountType" special: "got it!" - singleActivation: - multiActivation: + # TODO fix this test + singleActivation: { } + multiActivation: { } multiActivationCopy: - - + - { } - enabled: true - singleConstruction: - multiConstruction: + singleConstruction: { } + multiConstruction: [ { } ] multiConstructionCopy: - - + - { } - howto: abc \ No newline at end of file diff --git a/infra/prism/src/test/resources/common/yaml/user-jack.yaml b/infra/prism/src/test/resources/common/yaml/user-jack.yaml index 4feb9a08495..90fb747d7ca 100644 --- a/infra/prism/src/test/resources/common/yaml/user-jack.yaml +++ b/infra/prism/src/test/resources/common/yaml/user-jack.yaml @@ -67,13 +67,14 @@ user: value: - "captain" special: "got it!" - singleActivation: - multiActivation: + # TODO fix this test + singleActivation: { } + multiActivation: { } multiActivationCopy: - - + - { } - enabled: true - singleConstruction: - multiConstruction: + singleConstruction: { } + multiConstruction: [ { } ] multiConstructionCopy: - - + - { } - howto: abc \ No newline at end of file From 5a7a8b296b5f2d64c6aec7d95e861c222ea1725c Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Mon, 26 Sep 2016 15:34:14 +0200 Subject: [PATCH 03/74] Separating marshalling/unmarshalling from lower-level parsing/serialization. --- .../midpoint/web/component/search/Search.java | 2 +- .../dto/CertCaseOrDecisionDto.java | 3 - .../certification/dto/CertDefinitionDto.java | 2 +- .../configuration/PageRepositoryQuery.java | 2 +- .../admin/resources/PageResourceEdit.java | 2 +- .../midpoint/common/StaticExpressionUtil.java | 5 +- .../com/evolveum/midpoint/common/Utils.java | 19 +- .../RefinedObjectClassDefinition.java | 4 +- .../midpoint/prism/ParsingContext.java | 2 +- .../midpoint/prism/PrismContainerValue.java | 4 +- .../evolveum/midpoint/prism/PrismContext.java | 1 + .../midpoint/prism/PrismPropertyValue.java | 2 +- .../midpoint/prism/delta/ItemDelta.java | 3 +- .../{parser => marshaller}/JaxbDomHack.java | 5 +- .../PrismBeanConverter.java | 6 +- .../PrismBeanInspector.java | 6 +- .../QueryConvertor.java | 1828 ++++++++--------- .../TrivialXPathParser.java | 4 +- .../XNodeProcessor.java | 4 +- .../XNodeProcessorEvaluationMode.java | 6 +- .../XNodeProcessorUtil.java | 18 +- .../XNodeSerializer.java | 5 +- .../{parser => marshaller}/XPathHolder.java | 4 +- .../{parser => marshaller}/XPathSegment.java | 4 +- .../midpoint/prism/parser/DomParser.java | 2 + .../midpoint/prism/parser/DomSerializer.java | 9 +- .../parser/json/ItemPathDeserializer.java | 6 +- .../prism/parser/json/ItemPathSerializer.java | 2 +- .../parser/json/ItemPathTypeDeserializer.java | 2 +- .../prism/parser/json/JsonValueParser.java | 2 +- .../midpoint/prism/query/ObjectFilter.java | 5 +- .../midpoint/prism/query/PagingConvertor.java | 4 - .../prism/query/QueryJaxbConvertor.java | 2 +- .../midpoint/prism/util/PrismUtil.java | 7 +- .../midpoint/prism/util/RawTypeUtil.java | 15 - .../prism/util/ValueSerializationUtil.java | 2 +- .../midpoint/prism/xjc/PrismForJAXBUtil.java | 7 - .../midpoint/prism/xml/XmlTypeConverter.java | 6 +- .../midpoint/prism/xnode/PrimitiveXNode.java | 2 +- .../midpoint/prism/xnode/ValueParser.java | 2 +- .../ns/_public/query_3/SearchFilterType.java | 2 +- .../xml/ns/_public/types_3/ItemPathType.java | 15 +- .../prism/xml/ns/_public/types_3/RawType.java | 2 +- .../midpoint/prism/TestUnknownItems.java | 2 +- .../midpoint/prism/TestXmlSerialization.java | 8 - .../prism/parser/AbstractParserTest.java | 1 + .../prism/parser/TestProtectedString.java | 2 +- .../midpoint/schema/DeltaConvertor.java | 3 +- .../midpoint/schema/PagingTypeFactory.java | 4 +- .../schema/constants/SchemaConstants.java | 2 +- .../midpoint/schema/util/MiscSchemaUtil.java | 4 - .../midpoint/schema/util/ObjectTypeUtil.java | 4 +- .../midpoint/schema/util/SchemaDebugUtil.java | 4 +- .../midpoint/schema/TestJaxbConstruction.java | 7 - .../midpoint/schema/TestParseResource.java | 4 +- .../midpoint/schema/TestQueryConvertor.java | 2 - .../midpoint/schema/test/XPathTest.java | 6 +- .../impl/AccCertCaseOperationsHelper.java | 2 +- .../evaluator/PathExpressionEvaluator.java | 20 - .../xpath/XPathExpressionCodeHolder.java | 7 +- .../common/expression/TestExpressionUtil.java | 2 +- .../impl/expr/MidpointFunctionsImpl.java | 5 +- .../model/impl/lens/AssignmentEvaluator.java | 7 +- .../midpoint/model/impl/lens/Clockwork.java | 3 +- .../model/impl/lens/Construction.java | 12 +- .../ScriptingExpressionEvaluator.java | 2 +- .../expressions/SearchEvaluator.java | 2 +- .../midpoint/model/impl/util/Utils.java | 2 +- .../negative/TestModelWebServiceNegative.java | 2 +- .../report/impl/ReportServiceImpl.java | 2 +- .../report/impl/ReportWebService.java | 16 - .../midpoint/repo/cache/QueryKey.java | 6 - .../repo/sql/SqlAuditServiceImpl.java | 2 +- .../sql/data/common/any/RAnyConverter.java | 2 +- .../repo/sql/helpers/ObjectRetriever.java | 2 +- .../midpoint/testing/sanity/TestSanity.java | 3 +- .../testing/sanity/TestSanityLegacy.java | 3 +- 77 files changed, 1019 insertions(+), 1171 deletions(-) rename infra/prism/src/main/java/com/evolveum/midpoint/prism/{parser => marshaller}/JaxbDomHack.java (99%) rename infra/prism/src/main/java/com/evolveum/midpoint/prism/{parser => marshaller}/PrismBeanConverter.java (99%) rename infra/prism/src/main/java/com/evolveum/midpoint/prism/{parser => marshaller}/PrismBeanInspector.java (99%) rename infra/prism/src/main/java/com/evolveum/midpoint/prism/{parser => marshaller}/QueryConvertor.java (97%) rename infra/prism/src/main/java/com/evolveum/midpoint/prism/{parser => marshaller}/TrivialXPathParser.java (97%) rename infra/prism/src/main/java/com/evolveum/midpoint/prism/{parser => marshaller}/XNodeProcessor.java (99%) rename infra/prism/src/main/java/com/evolveum/midpoint/prism/{parser => marshaller}/XNodeProcessorEvaluationMode.java (91%) rename infra/prism/src/main/java/com/evolveum/midpoint/prism/{parser/util => marshaller}/XNodeProcessorUtil.java (90%) rename infra/prism/src/main/java/com/evolveum/midpoint/prism/{parser => marshaller}/XNodeSerializer.java (99%) rename infra/prism/src/main/java/com/evolveum/midpoint/prism/{parser => marshaller}/XPathHolder.java (99%) rename infra/prism/src/main/java/com/evolveum/midpoint/prism/{parser => marshaller}/XPathSegment.java (98%) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/Search.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/Search.java index eafe34d8ec1..edb7adb36ba 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/Search.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/Search.java @@ -19,7 +19,7 @@ import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.match.PolyStringNormMatchingRule; import com.evolveum.midpoint.prism.match.StringIgnoreCaseMatchingRule; -import com.evolveum.midpoint.prism.parser.QueryConvertor; +import com.evolveum.midpoint.prism.marshaller.QueryConvertor; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.polystring.PolyStringNormalizer; import com.evolveum.midpoint.prism.query.*; diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/certification/dto/CertCaseOrDecisionDto.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/certification/dto/CertCaseOrDecisionDto.java index e21b843095e..70534813ed2 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/certification/dto/CertCaseOrDecisionDto.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/certification/dto/CertCaseOrDecisionDto.java @@ -17,7 +17,6 @@ package com.evolveum.midpoint.web.page.admin.certification.dto; import com.evolveum.midpoint.gui.api.page.PageBase; -import com.evolveum.midpoint.prism.parser.XNodeSerializer; import com.evolveum.midpoint.prism.xml.XmlTypeConverter; import com.evolveum.midpoint.schema.util.CertCampaignTypeUtil; import com.evolveum.midpoint.web.component.util.Selectable; @@ -27,8 +26,6 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; import org.apache.commons.lang.time.DurationFormatUtils; import org.apache.commons.lang3.Validate; -import org.apache.wicket.migrate.StringResourceModelMigration; -import org.apache.wicket.model.StringResourceModel; import javax.xml.datatype.XMLGregorianCalendar; import javax.xml.namespace.QName; diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/certification/dto/CertDefinitionDto.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/certification/dto/CertDefinitionDto.java index fd843fd93c8..49e2106ab22 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/certification/dto/CertDefinitionDto.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/certification/dto/CertDefinitionDto.java @@ -21,7 +21,7 @@ import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.PrismReferenceValue; -import com.evolveum.midpoint.prism.parser.QueryConvertor; +import com.evolveum.midpoint.prism.marshaller.QueryConvertor; import com.evolveum.midpoint.prism.xml.XmlTypeConverter; import com.evolveum.midpoint.schema.constants.ObjectTypes; import com.evolveum.midpoint.schema.util.CertCampaignTypeUtil; diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageRepositoryQuery.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageRepositoryQuery.java index 1e29303882a..b993f1656ad 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageRepositoryQuery.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageRepositoryQuery.java @@ -23,7 +23,7 @@ import com.evolveum.midpoint.model.common.expression.ExpressionUtil; import com.evolveum.midpoint.model.common.expression.ExpressionVariables; import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.parser.QueryConvertor; +import com.evolveum.midpoint.prism.marshaller.QueryConvertor; import com.evolveum.midpoint.prism.query.ObjectFilter; import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.prism.query.QueryJaxbConvertor; diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/PageResourceEdit.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/PageResourceEdit.java index ca74f7f0c5f..e4afafd2d28 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/PageResourceEdit.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/PageResourceEdit.java @@ -25,7 +25,7 @@ import com.evolveum.midpoint.prism.PrismReference; import com.evolveum.midpoint.prism.PrismReferenceValue; import com.evolveum.midpoint.prism.delta.ObjectDelta; -import com.evolveum.midpoint.prism.parser.QueryConvertor; +import com.evolveum.midpoint.prism.marshaller.QueryConvertor; import com.evolveum.midpoint.prism.query.ObjectFilter; import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.prism.schema.SchemaRegistry; diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/StaticExpressionUtil.java b/infra/common/src/main/java/com/evolveum/midpoint/common/StaticExpressionUtil.java index 967debb1b5d..28501c09c88 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/StaticExpressionUtil.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/StaticExpressionUtil.java @@ -22,18 +22,15 @@ import javax.xml.bind.JAXBElement; import javax.xml.namespace.QName; -import org.w3c.dom.Element; - import com.evolveum.midpoint.prism.Item; import com.evolveum.midpoint.prism.ItemDefinition; import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismProperty; import com.evolveum.midpoint.prism.PrismPropertyDefinition; import com.evolveum.midpoint.prism.PrismValue; -import com.evolveum.midpoint.prism.parser.XNodeProcessor; +import com.evolveum.midpoint.prism.marshaller.XNodeProcessor; import com.evolveum.midpoint.prism.xnode.XNode; import com.evolveum.midpoint.schema.constants.SchemaConstants; -import com.evolveum.midpoint.util.DOMUtil; import com.evolveum.midpoint.util.JAXBUtil; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.xml.ns._public.common.common_3.ExpressionReturnMultiplicityType; diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/Utils.java b/infra/common/src/main/java/com/evolveum/midpoint/common/Utils.java index 85b58fe26ee..8184360aae2 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/Utils.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/Utils.java @@ -16,28 +16,13 @@ package com.evolveum.midpoint.common; -import java.lang.reflect.Field; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.lang.reflect.ParameterizedType; -import java.util.Collection; -import java.util.List; - -import org.apache.commons.beanutils.BeanUtils; import org.apache.commons.lang.StringUtils; -import org.springframework.util.CollectionUtils; import org.w3c.dom.Element; -import org.w3c.dom.Node; -import com.evolveum.midpoint.prism.parser.XPathHolder; -import com.evolveum.midpoint.prism.parser.XPathSegment; -import com.evolveum.midpoint.prism.path.ItemPath; +import com.evolveum.midpoint.prism.marshaller.XPathHolder; import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; -import com.evolveum.midpoint.xml.ns._public.common.api_types_3.PropertyReferenceListType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; /** * @@ -57,7 +42,7 @@ public static String getPropertyName(String name) { } public static Element fillPropertyReference(String resolve) { - com.evolveum.midpoint.prism.parser.XPathHolder xpath = new com.evolveum.midpoint.prism.parser.XPathHolder( + XPathHolder xpath = new XPathHolder( Utils.getPropertyName(resolve)); return xpath.toElement(SchemaConstants.NS_C, "property"); } diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedObjectClassDefinition.java b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedObjectClassDefinition.java index c47d34ef188..9fa745f3189 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedObjectClassDefinition.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedObjectClassDefinition.java @@ -20,12 +20,11 @@ import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.PrismObjectDefinition; -import com.evolveum.midpoint.prism.parser.QueryConvertor; +import com.evolveum.midpoint.prism.marshaller.QueryConvertor; import com.evolveum.midpoint.prism.query.ObjectFilter; import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.prism.util.ItemPathUtil; import com.evolveum.midpoint.schema.ResourceShadowDiscriminator; -import com.evolveum.midpoint.schema.constants.MidPointConstants; import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.processor.*; import com.evolveum.midpoint.schema.util.ResourceTypeUtil; @@ -36,7 +35,6 @@ import com.evolveum.midpoint.util.MiscUtil; import com.evolveum.midpoint.util.PrettyPrinter; import com.evolveum.midpoint.util.QNameUtil; -import com.evolveum.midpoint.util.exception.ConfigurationException; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.util.exception.SystemException; import com.evolveum.midpoint.util.logging.Trace; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/ParsingContext.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/ParsingContext.java index be5f31f3a4b..0e6ac271f16 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/ParsingContext.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/ParsingContext.java @@ -16,7 +16,7 @@ package com.evolveum.midpoint.prism; -import com.evolveum.midpoint.prism.parser.XNodeProcessorEvaluationMode; +import com.evolveum.midpoint.prism.marshaller.XNodeProcessorEvaluationMode; import com.evolveum.midpoint.util.logging.Trace; import java.util.ArrayList; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerValue.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerValue.java index b4dd94e90eb..df01ee12e25 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerValue.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerValue.java @@ -26,8 +26,8 @@ import javax.xml.namespace.QName; import com.evolveum.midpoint.prism.delta.ItemDelta; -import com.evolveum.midpoint.prism.parser.JaxbDomHack; -import com.evolveum.midpoint.prism.parser.XNodeProcessor; +import com.evolveum.midpoint.prism.marshaller.JaxbDomHack; +import com.evolveum.midpoint.prism.marshaller.XNodeProcessor; import com.evolveum.midpoint.prism.path.IdItemPathSegment; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.path.ItemPathSegment; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java index 405161f89da..3d3fcfdb52d 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java @@ -17,6 +17,7 @@ import com.evolveum.midpoint.prism.crypto.Protector; import com.evolveum.midpoint.prism.delta.ObjectDelta; +import com.evolveum.midpoint.prism.marshaller.*; import com.evolveum.midpoint.prism.parser.*; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.polystring.PolyStringNormalizer; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyValue.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyValue.java index 9caf074810c..84af7170615 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyValue.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyValue.java @@ -18,7 +18,7 @@ import com.evolveum.midpoint.prism.match.MatchingRule; -import com.evolveum.midpoint.prism.parser.XNodeProcessor; +import com.evolveum.midpoint.prism.marshaller.XNodeProcessor; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.prism.polystring.PolyStringNormalizer; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/ItemDelta.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/ItemDelta.java index 2209e343ca6..518b4f70b90 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/ItemDelta.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/ItemDelta.java @@ -26,9 +26,8 @@ import javax.xml.namespace.QName; import com.evolveum.midpoint.prism.*; -import com.evolveum.midpoint.prism.parser.XPathHolder; +import com.evolveum.midpoint.prism.marshaller.XPathHolder; import com.evolveum.midpoint.prism.path.IdItemPathSegment; -import com.evolveum.midpoint.prism.path.IdentifierPathSegment; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.path.ItemPath.CompareResult; import com.evolveum.midpoint.prism.path.ItemPathSegment; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/JaxbDomHack.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/JaxbDomHack.java similarity index 99% rename from infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/JaxbDomHack.java rename to infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/JaxbDomHack.java index ada0f6dc4f5..c5f0812380a 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/JaxbDomHack.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/JaxbDomHack.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014 Evolveum + * Copyright (c) 2010-2016 Evolveum * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.evolveum.midpoint.prism.parser; +package com.evolveum.midpoint.prism.marshaller; import java.util.List; @@ -21,6 +21,7 @@ import javax.xml.namespace.QName; import com.evolveum.midpoint.prism.*; +import com.evolveum.midpoint.prism.parser.DomParser; import com.evolveum.midpoint.util.logging.LoggingUtils; import org.apache.commons.lang.StringUtils; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/PrismBeanConverter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismBeanConverter.java similarity index 99% rename from infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/PrismBeanConverter.java rename to infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismBeanConverter.java index 2b5efae5d10..3a0e47adcdc 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/PrismBeanConverter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismBeanConverter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014 Evolveum + * Copyright (c) 2010-2016 Evolveum * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,10 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.evolveum.midpoint.prism.parser; +package com.evolveum.midpoint.prism.marshaller; import com.evolveum.midpoint.prism.*; -import com.evolveum.midpoint.prism.parser.util.XNodeProcessorUtil; +import com.evolveum.midpoint.prism.parser.DomParser; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.prism.schema.SchemaRegistry; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/PrismBeanInspector.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismBeanInspector.java similarity index 99% rename from infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/PrismBeanInspector.java rename to infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismBeanInspector.java index 5f1fbdb4946..1070e203840 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/PrismBeanInspector.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismBeanInspector.java @@ -1,11 +1,11 @@ /* - * Copyright (c) 2010-2015 Evolveum + * Copyright (c) 2010-2016 Evolveum * * 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 + * 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, @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.evolveum.midpoint.prism.parser; +package com.evolveum.midpoint.prism.marshaller; import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.schema.PrismSchema; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/QueryConvertor.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/QueryConvertor.java similarity index 97% rename from infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/QueryConvertor.java rename to infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/QueryConvertor.java index de895b311cc..d0f06bd14be 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/QueryConvertor.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/QueryConvertor.java @@ -1,914 +1,914 @@ -/* - * Copyright (c) 2010-2016 Evolveum - * - * 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 com.evolveum.midpoint.prism.parser; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Map.Entry; - -import javax.xml.namespace.QName; - -import com.evolveum.midpoint.prism.*; -import com.evolveum.midpoint.prism.query.*; -import com.evolveum.prism.xml.ns._public.query_3.SearchFilterType; - -import com.evolveum.prism.xml.ns._public.types_3.ObjectReferenceType; -import org.apache.commons.lang.StringUtils; -import org.apache.commons.lang.Validate; - -import com.evolveum.midpoint.prism.path.ItemPath; -import com.evolveum.midpoint.prism.query.OrgFilter.Scope; -import com.evolveum.midpoint.prism.util.PrismUtil; -import com.evolveum.midpoint.prism.xnode.ListXNode; -import com.evolveum.midpoint.prism.xnode.MapXNode; -import com.evolveum.midpoint.prism.xnode.PrimitiveXNode; -import com.evolveum.midpoint.prism.xnode.XNode; -import com.evolveum.midpoint.util.DOMUtil; -import com.evolveum.midpoint.util.QNameUtil; -import com.evolveum.midpoint.util.exception.SchemaException; -import com.evolveum.midpoint.util.logging.Trace; -import com.evolveum.midpoint.util.logging.TraceManager; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -/** - * Note that expressions are not serialized yet. - */ -public class QueryConvertor { - - private static final Trace LOGGER = TraceManager.getTrace(QueryConvertor.class); - - public static final String NS_QUERY = "http://prism.evolveum.com/xml/ns/public/query-3"; - - // TODO removed unused constants eventually - public static final QName FILTER_ELEMENT_NAME = new QName(NS_QUERY, "filter"); - public static QName KEY_FILTER = new QName(NS_QUERY, "filter"); - public static QName KEY_PAGING = new QName(NS_QUERY, "paging"); - public static QName KEY_CONDITION = new QName(NS_QUERY, "condition"); - - // please keep the order of filter clause symbols synchronized with query-3.xsd - - private static final QName CLAUSE_ALL = new QName(NS_QUERY, "all"); - private static final QName CLAUSE_NONE = new QName(NS_QUERY, "none"); - private static final QName CLAUSE_UNDEFINED = new QName(NS_QUERY, "undefined"); - - private static final QName CLAUSE_EQUAL = new QName(NS_QUERY, "equal"); - private static final QName CLAUSE_GREATER = new QName(NS_QUERY, "greater"); - private static final QName CLAUSE_GREATER_OR_EQUAL = new QName(NS_QUERY, "greaterOrEqual"); - private static final QName CLAUSE_LESS = new QName(NS_QUERY, "less"); - private static final QName CLAUSE_LESS_OR_EQUAL = new QName(NS_QUERY, "lessOrEqual"); - private static final QName CLAUSE_SUBSTRING = new QName(NS_QUERY, "substring"); - - private static final QName CLAUSE_REF = new QName(NS_QUERY, "ref"); - private static final QName CLAUSE_ORG = new QName(NS_QUERY, "org"); - private static final QName CLAUSE_IN_OID = new QName(NS_QUERY, "inOid"); - - private static final QName CLAUSE_AND = new QName(NS_QUERY, "and"); - private static final QName CLAUSE_OR = new QName(NS_QUERY, "or"); - private static final QName CLAUSE_NOT = new QName(NS_QUERY, "not"); - - private static final QName CLAUSE_TYPE = new QName(NS_QUERY, "type"); - private static final QName CLAUSE_EXISTS = new QName(NS_QUERY, "exists"); - - // common elements - private static final QName ELEMENT_PATH = new QName(NS_QUERY, "path"); - private static final QName ELEMENT_MATCHING = new QName(NS_QUERY, "matching"); - private static final QName ELEMENT_VALUE = new QName(NS_QUERY, "value"); - private static final QName ELEMENT_RIGHT_HAND_SIDE_PATH = new QName(NS_QUERY, "rightHandSidePath"); - - // substring - private static final QName ELEMENT_ANCHOR_START = new QName(NS_QUERY, "anchorStart"); - private static final QName ELEMENT_ANCHOR_END = new QName(NS_QUERY, "anchorEnd"); - - // org - private static final QName ELEMENT_ORG_REF = new QName(NS_QUERY, "orgRef"); - private static final QName ELEMENT_SCOPE = new QName(NS_QUERY, "scope"); - private static final QName ELEMENT_IS_ROOT = new QName(NS_QUERY, "isRoot"); - - // inOid - private static final QName ELEMENT_OID = new QName(NS_QUERY, "oid"); - private static final QName ELEMENT_CONSIDER_OWNER = new QName(NS_QUERY, "considerOwner"); - - // type and exists - public static final QName ELEMENT_TYPE = new QName(NS_QUERY, "type"); - private static final QName ELEMENT_FILTER = new QName(NS_QUERY, "filter"); - - /** - * Used by XNodeProcessor and similar code that does not have complete schema for the filter - */ - public static ObjectFilter parseFilter(XNode xnode, PrismContext prismContext) throws SchemaException { - Validate.notNull(prismContext); - MapXNode xmap = toMap(xnode); - return parseFilterInternal(xmap, null, false, prismContext); - } - - public static ObjectFilter parseFilter(MapXNode xmap, PrismContainerDefinition objDef) throws SchemaException { - Validate.notNull(objDef); - if (xmap == null) { - return null; - } - return parseFilterInternal(xmap, objDef, false, objDef.getPrismContext()); - } - - public static ObjectFilter parseFilter(SearchFilterType filter, Class clazz, PrismContext prismContext) throws SchemaException { - PrismObjectDefinition objDef = prismContext.getSchemaRegistry().findObjectDefinitionByCompileTimeClass(clazz); - if (objDef == null) { - throw new SchemaException("Cannot find obj definition for "+clazz); - } - return parseFilter(filter, objDef); - } - - public static ObjectFilter parseFilter(SearchFilterType filter, PrismObjectDefinition objDef) throws SchemaException { - Validate.notNull(objDef); - return parseFilter(filter.getFilterClauseXNode(), objDef); - } - - private static ObjectFilter parseFilterInternal( - @NotNull MapXNode filterXMap, - @Nullable PrismContainerDefinition pcd, - boolean preliminaryParsingOnly, - @NotNull PrismContext prismContext) throws SchemaException { - - Validate.notNull(prismContext); - Entry clauseEntry = filterXMap.getSingleEntryThatDoesNotMatch(SearchFilterType.F_DESCRIPTION); - QName clauseQName = clauseEntry.getKey(); - XNode clauseContent = clauseEntry.getValue(); - return parseFilterInternal(clauseContent, clauseQName, pcd, preliminaryParsingOnly, prismContext); - } - - private static ObjectFilter parseFilterInternal(XNode clauseContent, QName clauseQName, - PrismContainerDefinition pcd, boolean preliminaryParsingOnly, PrismContext prismContext) throws SchemaException { - - // trivial filters - if (QNameUtil.match(clauseQName, CLAUSE_ALL)) { - return new AllFilter(); - } else if (QNameUtil.match(clauseQName, CLAUSE_NONE)) { - return new NoneFilter(); - } else if (QNameUtil.match(clauseQName, CLAUSE_UNDEFINED)) { - return new UndefinedFilter(); - } - - // primitive filters - MapXNode clauseXMap = toMap(clauseContent); - - if (QNameUtil.match(clauseQName, CLAUSE_EQUAL) - || QNameUtil.match(clauseQName, CLAUSE_GREATER) - || QNameUtil.match(clauseQName, CLAUSE_GREATER_OR_EQUAL) - || QNameUtil.match(clauseQName, CLAUSE_LESS) - || QNameUtil.match(clauseQName, CLAUSE_LESS_OR_EQUAL)) { - return parseComparisonFilter(clauseQName, clauseXMap, pcd, preliminaryParsingOnly, prismContext); - } else if (QNameUtil.match(clauseQName, CLAUSE_SUBSTRING)) { - return parseSubstringFilter(clauseXMap, pcd, preliminaryParsingOnly, prismContext); - } else if (QNameUtil.match(clauseQName, CLAUSE_REF)) { - return parseRefFilter(clauseXMap, pcd, preliminaryParsingOnly, prismContext); - } else if (QNameUtil.match(clauseQName, CLAUSE_ORG)) { - return parseOrgFilter(clauseXMap, pcd, preliminaryParsingOnly, prismContext); - } else if (QNameUtil.match(clauseQName, CLAUSE_IN_OID)) { - return parseInOidFilter(clauseXMap, pcd, preliminaryParsingOnly, prismContext); - } - - // logical filters - - if (QNameUtil.match(clauseQName, CLAUSE_AND)) { - return parseAndFilter(clauseXMap, pcd, preliminaryParsingOnly, prismContext); - } else if (QNameUtil.match(clauseQName, CLAUSE_OR)) { - return parseOrFilter(clauseXMap, pcd, preliminaryParsingOnly, prismContext); - } else if (QNameUtil.match(clauseQName, CLAUSE_NOT)) { - return parseNotFilter(clauseXMap, pcd, preliminaryParsingOnly, prismContext); - } - - // other complex filters - - if (QNameUtil.match(clauseQName, CLAUSE_TYPE)) { - return parseTypeFilter(clauseXMap, pcd, preliminaryParsingOnly, prismContext); - } else if (QNameUtil.match(clauseQName, CLAUSE_EXISTS)) { - return parseExistsFilter(clauseXMap, pcd, preliminaryParsingOnly, prismContext); - } - - throw new UnsupportedOperationException("Unsupported query filter " + clauseQName); - - } - - private static AndFilter parseAndFilter(MapXNode clauseXMap, PrismContainerDefinition pcd, - boolean preliminaryParsingOnly, PrismContext prismContext) throws SchemaException { - List subfilters = parseLogicalFilter(clauseXMap, pcd, preliminaryParsingOnly, prismContext); - if (preliminaryParsingOnly) { - return null; - } else { - return AndFilter.createAnd(subfilters); - } - } - - private static List parseLogicalFilter(MapXNode clauseXMap, - PrismContainerDefinition pcd, boolean preliminaryParsingOnly, PrismContext prismContext) throws SchemaException { - List subfilters = new ArrayList(); - for (Entry entry : clauseXMap.entrySet()) { - if (entry.getValue() instanceof ListXNode){ - Iterator subNodes = ((ListXNode) entry.getValue()).iterator(); - while (subNodes.hasNext()){ - ObjectFilter subFilter = parseFilterInternal(subNodes.next(), entry.getKey(), pcd, preliminaryParsingOnly, prismContext); - if (!preliminaryParsingOnly) { - subfilters.add(subFilter); - } - } - } else{ - ObjectFilter subfilter = parseFilterInternal(entry.getValue(), entry.getKey(), pcd, preliminaryParsingOnly, prismContext); - if (!preliminaryParsingOnly) { - subfilters.add(subfilter); - } - } - } - return subfilters; - } - - private static OrFilter parseOrFilter(MapXNode clauseXMap, PrismContainerDefinition pcd, - boolean preliminaryParsingOnly, PrismContext prismContext) throws SchemaException { - List subfilters = parseLogicalFilter(clauseXMap, pcd, preliminaryParsingOnly, prismContext); - if (preliminaryParsingOnly) { - return null; - } else { - return OrFilter.createOr(subfilters); - } - } - - private static NotFilter parseNotFilter(MapXNode clauseXMap, PrismContainerDefinition pcd, - boolean preliminaryParsingOnly, PrismContext prismContext) throws SchemaException { - Entry entry = singleSubEntry(clauseXMap, "not"); - ObjectFilter subfilter = parseFilterInternal(entry.getValue(), entry.getKey(), pcd, preliminaryParsingOnly, prismContext); - if (preliminaryParsingOnly) { - return null; - } else { - return NotFilter.createNot(subfilter); - } - } - - private static ObjectFilter parseComparisonFilter(QName clauseQName, MapXNode clauseXMap, - PrismContainerDefinition pcd, boolean preliminaryParsingOnly, PrismContext prismContext) throws SchemaException { - - boolean isEq = QNameUtil.match(clauseQName, CLAUSE_EQUAL); - boolean isGt = QNameUtil.match(clauseQName, CLAUSE_GREATER); - boolean isGtEq = QNameUtil.match(clauseQName, CLAUSE_GREATER_OR_EQUAL); - boolean isLt = QNameUtil.match(clauseQName, CLAUSE_LESS); - boolean isLtEq = QNameUtil.match(clauseQName, CLAUSE_LESS_OR_EQUAL); - - ItemPath itemPath = getPath(clauseXMap); - if (itemPath == null || itemPath.isEmpty()){ - throw new SchemaException("Could not convert query, because query does not contain item path."); - } - QName itemName = ItemPath.getName(itemPath.last()); - - QName matchingRule = getMatchingRule(clauseXMap); - - XNode valueXnode = clauseXMap.get(ELEMENT_VALUE); - ItemPath rightSidePath = getPath(clauseXMap, ELEMENT_RIGHT_HAND_SIDE_PATH); - - ItemDefinition itemDefinition = locateItemDefinition(valueXnode, itemPath, pcd, prismContext); - if (itemDefinition != null){ - itemName = itemDefinition.getName(); - } - - if (valueXnode != null) { - Item item = parseItem(valueXnode, itemName, itemDefinition, prismContext); - if (!isEq && item.getValues().size() != 1) { - throw new SchemaException("Expected exactly one value, got " + item.getValues().size() + " instead"); - } - if (preliminaryParsingOnly) { - return null; - } else { - if (isEq) { - List> values = item.getValues(); - PrismValue.clearParent(values); - return EqualFilter.createEqual(itemPath, - (PrismPropertyDefinition)item.getDefinition(), matchingRule, values); - } - PrismPropertyValue propertyValue = (PrismPropertyValue) item.getValue(0); - propertyValue.clearParent(); - if (isGt || isGtEq) { - return GreaterFilter.createGreater(itemPath, pcd, propertyValue, isGtEq); - } else { - return LessFilter.createLess(itemPath, pcd, propertyValue, isLtEq); - } - } - } else if (rightSidePath != null) { - if (preliminaryParsingOnly) { - return null; - } else { - ItemDefinition rightSideDefinition = pcd != null ? pcd.findItemDefinition(rightSidePath) : null; - if (isEq) { - return EqualFilter.createEqual(itemPath, (PrismPropertyDefinition) itemDefinition, matchingRule, rightSidePath, rightSideDefinition); - } else if (isGt || isGtEq) { - return GreaterFilter.createGreater(itemPath, (PrismPropertyDefinition) itemDefinition, rightSidePath, rightSideDefinition, isGtEq); - } else { - return LessFilter.createLess(itemPath, (PrismPropertyDefinition) itemDefinition, rightSidePath, rightSideDefinition, isLtEq); - } - } - } else { - Entry expressionEntry = clauseXMap.getSingleEntryThatDoesNotMatch( - ELEMENT_VALUE, ELEMENT_MATCHING, ELEMENT_PATH); - if (expressionEntry != null) { - PrismPropertyValue expressionPropertyValue = prismContext.getXnodeProcessor().parsePrismPropertyFromGlobalXNodeValue( - expressionEntry, ParsingContext.createDefault()); - if (preliminaryParsingOnly) { - return null; - } else { - ExpressionWrapper expressionWrapper = new ExpressionWrapper(); - expressionWrapper.setExpression(expressionPropertyValue.getValue()); - if (isEq) { - return EqualFilter.createEqual(itemPath, (PrismPropertyDefinition) itemDefinition, matchingRule, expressionWrapper); - } else if (isGt || isGtEq) { - return GreaterFilter.createGreater(itemPath, (PrismPropertyDefinition) itemDefinition, expressionWrapper, isGtEq); - } else { - return LessFilter.createLess(itemPath, (PrismPropertyDefinition) itemDefinition, expressionWrapper, isLtEq); - } - } - } else { - if (!isEq) { - throw new SchemaException("Comparison filter (greater, less) requires at least one value expression."); - } - if (preliminaryParsingOnly) { - return null; - } else { - return EqualFilter.createNullEqual(itemPath, (PrismPropertyDefinition) itemDefinition, matchingRule); - } - } - } - } - - private static InOidFilter parseInOidFilter(MapXNode clauseXMap, PrismContainerDefinition pcd, boolean preliminaryParsingOnly, PrismContext prismContext) throws SchemaException{ - - boolean considerOwner = Boolean.TRUE.equals(clauseXMap.getParsedPrimitiveValue(ELEMENT_CONSIDER_OWNER, DOMUtil.XSD_BOOLEAN)); - - XNode valueXnode = clauseXMap.get(ELEMENT_VALUE); - if (valueXnode != null) { - List oids = new ArrayList<>(); - if (valueXnode instanceof ListXNode) { - for (XNode subnode : (ListXNode) valueXnode) { - if (subnode instanceof PrimitiveXNode) { - oids.add(((PrimitiveXNode) subnode).getParsedValue(DOMUtil.XSD_STRING)); - } else { - throw new SchemaException("The OID was expected to be present as primitive XNode, instead it is: " + subnode); - } - } - } else if (valueXnode instanceof PrimitiveXNode) { - oids.add(((PrimitiveXNode) valueXnode).getParsedValue(DOMUtil.XSD_STRING)); - } else { - throw new SchemaException("The OID was expected to be present as primitive or list XNode, instead it is: " + valueXnode); - } - return InOidFilter.createInOid(considerOwner, oids); - } else { - ExpressionWrapper expression = parseExpression(clauseXMap, prismContext); - if (expression != null) { - return InOidFilter.createInOid(considerOwner, expression); - } else { - throw new SchemaException("InOid filter with no values nor expression"); - } - } - } - - private static TypeFilter parseTypeFilter(MapXNode clauseXMap, PrismContainerDefinition pcd, boolean preliminaryParsingOnly, PrismContext prismContext) throws SchemaException{ - QName type = clauseXMap.getParsedPrimitiveValue(ELEMENT_TYPE, DOMUtil.XSD_QNAME); - - XNode subXFilter = clauseXMap.get(ELEMENT_FILTER); - PrismObjectDefinition def = prismContext.getSchemaRegistry().findObjectDefinitionByType(type); - ObjectFilter subFilter = null; - if (subXFilter != null && subXFilter instanceof MapXNode) { - subFilter = parseFilterInternal((MapXNode) subXFilter, def, preliminaryParsingOnly, prismContext); - } - if (preliminaryParsingOnly) { - return null; - } else { - return new TypeFilter(type, subFilter); - } - } - - private static ExistsFilter parseExistsFilter(MapXNode clauseXMap, PrismContainerDefinition pcd, boolean preliminaryParsingOnly, PrismContext prismContext) throws SchemaException{ - ItemPath path = getPath(clauseXMap); - - XNode subXFilter = clauseXMap.get(ELEMENT_FILTER); - ObjectFilter subFilter = null; - PrismContainerDefinition subPcd = pcd != null ? pcd.findContainerDefinition(path) : null; - if (subXFilter != null && subXFilter instanceof MapXNode) { - subFilter = parseFilterInternal((MapXNode) subXFilter, subPcd, preliminaryParsingOnly, prismContext); - } - if (preliminaryParsingOnly) { - return null; - } else { - return ExistsFilter.createExists(path, pcd, subFilter); - } - } - - private static RefFilter parseRefFilter(MapXNode clauseXMap, PrismContainerDefinition pcd, boolean preliminaryParsingOnly, PrismContext prismContext) throws SchemaException{ - ItemPath itemPath = getPath(clauseXMap); - - if (itemPath == null || itemPath.isEmpty()){ - throw new SchemaException("Cannot convert query, because query does not contain property path."); - } - QName itemName = ItemPath.getName(itemPath.last()); - - ItemDefinition itemDefinition = null; - if (pcd != null) { - itemDefinition = pcd != null ? pcd.findItemDefinition(itemPath) : null; - if (itemDefinition == null && !preliminaryParsingOnly) { - throw new SchemaException("No definition for item "+itemPath+" in "+pcd); - } - } - - XNode valueXnode = clauseXMap.get(ELEMENT_VALUE); - if (valueXnode != null) { - Item item = prismContext.getXnodeProcessor().parseItem(valueXnode, itemName, itemDefinition, - ParsingContext.allowMissingRefTypes()); - if (preliminaryParsingOnly) { - return null; - } - PrismReference ref = (PrismReference)item; - if (item.getValues().size() < 1) { - throw new IllegalStateException("No values to search specified for item " + itemName); - } - return RefFilter.createReferenceEqual(itemPath, ref, null); - } else { - ExpressionWrapper expressionWrapper = parseExpression(clauseXMap, prismContext); - if (expressionWrapper != null) { - if (preliminaryParsingOnly) { - return null; - } else { - return RefFilter.createReferenceEqual(itemPath, - (PrismReferenceDefinition) itemDefinition, expressionWrapper); - } - } else { - if (preliminaryParsingOnly) { - return null; - } else { - return RefFilter.createReferenceEqual(itemPath, - (PrismReferenceDefinition) itemDefinition, expressionWrapper); - } - } - } - } - - private static ExpressionWrapper parseExpression(MapXNode xmap, PrismContext prismContext) throws SchemaException { - Entry expressionEntry = xmap.getSingleEntryThatDoesNotMatch( - - ELEMENT_VALUE, ELEMENT_MATCHING, ELEMENT_PATH); - if (expressionEntry != null) { - PrismPropertyValue expressionPropertyValue = prismContext.getXnodeProcessor() - .parsePrismPropertyFromGlobalXNodeValue(expressionEntry, ParsingContext.createDefault()); - ExpressionWrapper expressionWrapper = new ExpressionWrapper(); - expressionWrapper.setExpression(expressionPropertyValue.getValue()); - return expressionWrapper; - } - - return null; - - } - - private static SubstringFilter parseSubstringFilter(MapXNode clauseXMap, PrismContainerDefinition pcd, boolean preliminaryParsingOnly, PrismContext prismContext) - throws SchemaException { - ItemPath itemPath = getPath(clauseXMap); - - if (itemPath == null || itemPath.isEmpty()){ - throw new SchemaException("Could not convert query, because query does not contain item path."); - } - QName itemName = ItemPath.getName(itemPath.last()); - QName matchingRule = getMatchingRule(clauseXMap); - - XNode valueXnode = clauseXMap.get(ELEMENT_VALUE); - - ItemDefinition itemDefinition = locateItemDefinition(valueXnode, itemPath, pcd, prismContext); - - Item item = parseItem(valueXnode, itemName, itemDefinition, prismContext); - - Boolean anchorStart = clauseXMap.getParsedPrimitiveValue(ELEMENT_ANCHOR_START, DOMUtil.XSD_BOOLEAN); - if (anchorStart == null) { - anchorStart = false; - } - - Boolean anchorEnd = clauseXMap.getParsedPrimitiveValue(ELEMENT_ANCHOR_END, DOMUtil.XSD_BOOLEAN); - if (anchorEnd == null) { - anchorEnd = false; - } - - if (preliminaryParsingOnly) { - return null; - } else { - return SubstringFilter.createSubstring(itemPath, (PrismProperty) item, matchingRule, anchorStart, anchorEnd); - } - } - - private static OrgFilter parseOrgFilter(MapXNode clauseXMap, PrismContainerDefinition pcd, boolean preliminaryParsingOnly, PrismContext prismContext) throws SchemaException { - if (Boolean.TRUE.equals(clauseXMap.getParsedPrimitiveValue(ELEMENT_IS_ROOT, DOMUtil.XSD_BOOLEAN))) { - // TODO check if other content is present - if (preliminaryParsingOnly) { - return null; - } else { - return OrgFilter.createRootOrg(); - } - } - - XNode xorgrefnode = clauseXMap.get(ELEMENT_ORG_REF); - if (xorgrefnode == null) { - throw new SchemaException("No organization reference defined in the search query."); - } - MapXNode xorgrefmap = toMap(xorgrefnode); - String orgOid = xorgrefmap.getParsedPrimitiveValue(ELEMENT_OID, DOMUtil.XSD_STRING); - if (orgOid == null || StringUtils.isBlank(orgOid)) { - throw new SchemaException("No oid attribute defined in the organization reference element."); - } - - String scopeString = xorgrefmap.getParsedPrimitiveValue(ELEMENT_SCOPE, DOMUtil.XSD_STRING); // original (in my opinion incorrect) place - if (scopeString == null) { - scopeString = clauseXMap.getParsedPrimitiveValue(ELEMENT_SCOPE, DOMUtil.XSD_STRING); // here it is placed by the serializer - } - Scope scope = scopeString != null ? Scope.valueOf(scopeString) : null; - - if (preliminaryParsingOnly) { - return null; - } else { - return OrgFilter.createOrg(orgOid, scope); - } - } - - private static Entry singleSubEntry(MapXNode xmap, String filterName) throws SchemaException { - if (xmap == null || xmap.isEmpty()) { - return null; - } - return xmap.getSingleSubEntry("search filter "+filterName); - } - - private static MapXNode toMap(XNode xnode) throws SchemaException { - if (!(xnode instanceof MapXNode)) { - throw new SchemaException("Cannot parse filter from "+xnode); - } - return (MapXNode)xnode; - } - - private static PrimitiveXNode toPrimitive(XNode xnode, XNode context) throws SchemaException { - if (!(xnode instanceof PrimitiveXNode)) { - throw new SchemaException("Cannot parse filter from "+context+ ": This should be a primitive: "+xnode); - } - return (PrimitiveXNode)xnode; - } - - private static ItemPath getPath(MapXNode clauseXMap) throws SchemaException { - return getPath(clauseXMap, ELEMENT_PATH); - } - - private static ItemPath getPath(MapXNode clauseXMap, QName key) throws SchemaException { - XNode xnode = clauseXMap.get(key); - if (xnode == null) { - return null; - } - if (!(xnode instanceof PrimitiveXNode)) { - throw new SchemaException("Expected that field "+key+" will be primitive, but it is "+xnode.getDesc()); - } - return clauseXMap.getParsedPrimitiveValue(key, ItemPath.XSD_TYPE); - } - - private static QName getMatchingRule(MapXNode xmap) throws SchemaException{ - String matchingRuleString = xmap.getParsedPrimitiveValue(ELEMENT_MATCHING, DOMUtil.XSD_STRING); - if (StringUtils.isNotBlank(matchingRuleString)){ - if (QNameUtil.isUri(matchingRuleString)) { - return QNameUtil.uriToQName(matchingRuleString); - } else { - return new QName(PrismConstants.NS_MATCHING_RULE, matchingRuleString); - } - } else { - return null; - } - } - - private static Item parseItem(XNode valueXnode, QName itemName, ItemDefinition itemDefinition, PrismContext prismContext) throws SchemaException{ - Item item; - if (prismContext == null) { - item = (Item)XNodeProcessor.parsePrismPropertyRaw(valueXnode, itemName, null); - } else { - item = prismContext.getXnodeProcessor().parseItem(valueXnode, itemName, itemDefinition, ParsingContext.allowMissingRefTypes()); - } - - if (item.getValues().size() < 1 ) { - throw new IllegalStateException("No values to search specified for item " + itemName); - } - - return item; - } - - private static ItemDefinition locateItemDefinition(XNode valueXnode, ItemPath itemPath, PrismContainerDefinition pcd, PrismContext prismContext) throws SchemaException{ - ItemDefinition itemDefinition = null; - if (pcd != null) { - itemDefinition = pcd.findItemDefinition(itemPath); - if (itemDefinition == null) { - ItemPath rest = itemPath.tail(); - QName first = ItemPath.getName(itemPath.first()); - itemDefinition = prismContext.getXnodeProcessor().locateItemDefinition(pcd, first, valueXnode); - if (rest.isEmpty()) { - return itemDefinition; - } else{ - if (itemDefinition != null && itemDefinition instanceof PrismContainerDefinition){ - return locateItemDefinition(valueXnode, rest, (PrismContainerDefinition) itemDefinition, prismContext); - } - } - } - } - return itemDefinition; - } - - public static SearchFilterType createSearchFilterType(ObjectFilter filter, PrismContext prismContext) throws SchemaException { - MapXNode xnode = serializeFilter(filter, prismContext); - return SearchFilterType.createFromXNode(xnode, prismContext); - } - - public static MapXNode serializeFilter(ObjectFilter filter, PrismContext prismContext) throws SchemaException{ - return serializeFilter(filter, PrismUtil.getXnodeProcessor(prismContext).createSerializer()); - } - - private static MapXNode serializeFilter(ObjectFilter filter, XNodeSerializer xnodeSerializer) throws SchemaException{ - // null or primitive filters - if (filter == null) { - return null; - } else if (filter instanceof AllFilter) { - return serializeAllFilter(); - } else if (filter instanceof NoneFilter) { - return serializeNoneFilter(); - } else if (filter instanceof UndefinedFilter) { - return serializeUndefinedFilter(); - } else if (filter instanceof EqualFilter - || filter instanceof GreaterFilter - || filter instanceof LessFilter) { - return serializeComparisonFilter((PropertyValueFilter) filter, xnodeSerializer); - } else if (filter instanceof SubstringFilter) { - return serializeSubstringFilter((SubstringFilter) filter, xnodeSerializer); - } else if (filter instanceof RefFilter) { - return serializeRefFilter((RefFilter) filter, xnodeSerializer); - } else if (filter instanceof OrgFilter) { - return serializeOrgFilter((OrgFilter) filter, xnodeSerializer); - } else if (filter instanceof InOidFilter) { - return serializeInOidFilter((InOidFilter) filter, xnodeSerializer); - } - - // complex filters - if (filter instanceof AndFilter) { - return serializeAndFilter((AndFilter) filter, xnodeSerializer); - } else if (filter instanceof OrFilter) { - return serializeOrFilter((OrFilter) filter, xnodeSerializer); - } else if (filter instanceof NotFilter) { - return serializeNotFilter((NotFilter) filter, xnodeSerializer); - } - - if (filter instanceof TypeFilter) { - return serializeTypeFilter((TypeFilter) filter, xnodeSerializer); - } else if (filter instanceof ExistsFilter) { - return serializeExistsFilter((ExistsFilter) filter, xnodeSerializer); - } - - throw new UnsupportedOperationException("Unsupported filter type: " + filter); - } - - - private static MapXNode serializeAndFilter(AndFilter filter, XNodeSerializer xnodeSerilizer) throws SchemaException{ - return createFilter(CLAUSE_AND, serializeNaryLogicalSubfilters(filter.getConditions(), xnodeSerilizer)); - } - - private static MapXNode serializeOrFilter(OrFilter filter, XNodeSerializer xnodeSerilizer) throws SchemaException{ - MapXNode map = createFilter(CLAUSE_OR, serializeNaryLogicalSubfilters(filter.getConditions(), xnodeSerilizer)); - return map; - } - - private static MapXNode serializeNaryLogicalSubfilters(List objectFilters, XNodeSerializer xnodeSerilizer) throws SchemaException{ - MapXNode filters = new MapXNode(); - for (ObjectFilter of : objectFilters) { - MapXNode subFilter = serializeFilter(of, xnodeSerilizer); - filters.merge(subFilter); - } - return filters; - } - - private static MapXNode serializeNotFilter(NotFilter filter, XNodeSerializer xnodeSerializer) throws SchemaException{ - return createFilter(CLAUSE_NOT, serializeFilter(filter.getFilter(), xnodeSerializer)); - } - - @NotNull - private static MapXNode createFilter(QName clauseNot, MapXNode value) { - MapXNode map = new MapXNode(); - map.put(clauseNot, value); - return map; - } - - private static MapXNode serializeInOidFilter(InOidFilter filter, XNodeSerializer xnodeSerializer) throws SchemaException { - MapXNode clauseMap = new MapXNode(); - if (filter.getOids() != null && !filter.getOids().isEmpty()) { - ListXNode valuesNode = new ListXNode(); - for (String oid : filter.getOids()) { - XNode val = createPrimitiveXNode(oid, DOMUtil.XSD_STRING); - valuesNode.add(val); - } - clauseMap.put(ELEMENT_VALUE, valuesNode); - } else if (filter.getExpression() != null) { - // TODO serialize expression - } else { - throw new SchemaException("InOid filter with no values nor expression"); - } - if (filter.isConsiderOwner()) { - clauseMap.put(ELEMENT_CONSIDER_OWNER, new PrimitiveXNode<>(true)); - } - - return createFilter(CLAUSE_IN_OID, clauseMap); - } - - private static MapXNode serializeComparisonFilter(PropertyValueFilter filter, XNodeSerializer xnodeSerializer) throws SchemaException{ - MapXNode map = new MapXNode(); - QName clause; - if (filter instanceof EqualFilter) { - clause = CLAUSE_EQUAL; - } else if (filter instanceof GreaterFilter) { - clause = ((GreaterFilter) filter).isEquals() ? CLAUSE_GREATER_OR_EQUAL : CLAUSE_GREATER; - } else if (filter instanceof LessFilter) { - clause = ((LessFilter) filter).isEquals() ? CLAUSE_LESS_OR_EQUAL : CLAUSE_LESS; - } else { - throw new IllegalStateException(); - } - map.put(clause, serializeValueFilter(filter, xnodeSerializer)); - return map; - } - - private static MapXNode serializeValueFilter(PropertyValueFilter filter, XNodeSerializer xnodeSerializer) throws SchemaException { - MapXNode map = new MapXNode(); - serializeMatchingRule(filter, map); - serializePath(map, filter.getFullPath(), filter); - - List values = filter.getValues(); - if (values != null) { - ListXNode valuesNode = new ListXNode(); - for (T val : values) { - if (val.getParent() == null) { - val.setParent(filter); - } - XNode valNode = xnodeSerializer.serializeItemValue(val, filter.getDefinition()); - if (filter instanceof RefFilter) { // TODO shouldn't we do this in all cases? - valNode.setExplicitTypeDeclaration(true); - if (valNode.getTypeQName() == null) { - valNode.setTypeQName(ObjectReferenceType.COMPLEX_TYPE); - } - } - valuesNode.add(valNode); - } - map.put(ELEMENT_VALUE, valuesNode); - } - if (filter.getRightHandSidePath() != null) { - map.put(ELEMENT_RIGHT_HAND_SIDE_PATH, createPrimitiveXNode(filter.getRightHandSidePath(), ItemPath.XSD_TYPE)); - } - - ExpressionWrapper xexpression = filter.getExpression(); - if (xexpression != null) { - //map.merge(xexpression); - //TODO serialize expression - } - - return map; - } - - private static MapXNode serializeRefFilter(RefFilter filter, XNodeSerializer xnodeSerializer) throws SchemaException { - MapXNode map = createFilter(CLAUSE_REF, serializeValueFilter(filter, xnodeSerializer)); - return map; - } - - private static MapXNode serializeSubstringFilter(SubstringFilter filter, XNodeSerializer xnodeSerializer) throws SchemaException{ - MapXNode map = new MapXNode(); - MapXNode content = serializeValueFilter(filter, xnodeSerializer); - if (filter.isAnchorStart()) { - content.put(ELEMENT_ANCHOR_START, new PrimitiveXNode<>(true)); - } - if (filter.isAnchorEnd()) { - content.put(ELEMENT_ANCHOR_END, new PrimitiveXNode<>(true)); - } - map.put(CLAUSE_SUBSTRING, content); - return map; - } - - private static MapXNode serializeTypeFilter(TypeFilter filter, XNodeSerializer xnodeSerializer) throws SchemaException{ - MapXNode content = new MapXNode(); - content.put(ELEMENT_TYPE, createPrimitiveXNode(filter.getType(), DOMUtil.XSD_QNAME)); - if (filter.getFilter() != null){ - content.put(ELEMENT_FILTER, serializeFilter(filter.getFilter(), xnodeSerializer)); - } - return createFilter(CLAUSE_TYPE, content); - } - - private static MapXNode serializeExistsFilter(ExistsFilter filter, XNodeSerializer xnodeSerializer) throws SchemaException{ - MapXNode content = new MapXNode(); - serializePath(content, filter.getFullPath(), filter); - if (filter.getFilter() != null){ - content.put(ELEMENT_FILTER, serializeFilter(filter.getFilter(), xnodeSerializer)); - } - return createFilter(CLAUSE_EXISTS, content); - } - - private static MapXNode serializeOrgFilter(OrgFilter filter, XNodeSerializer xnodeSerializer) { - MapXNode map = new MapXNode(); - - if (filter.getOrgRef() != null) { - MapXNode orgRefMap = new MapXNode(); - orgRefMap.put(ELEMENT_OID, createPrimitiveXNode(filter.getOrgRef().getOid(), DOMUtil.XSD_STRING)); - map.put(ELEMENT_ORG_REF, orgRefMap); - } - if (filter.getScope() != null) { - map.put(ELEMENT_SCOPE, createPrimitiveXNode(filter.getScope().name(), DOMUtil.XSD_STRING)); - } - if (filter.isRoot()) { - map.put(ELEMENT_IS_ROOT, createPrimitiveXNode(Boolean.TRUE, DOMUtil.XSD_BOOLEAN)); - } - - return createFilter(CLAUSE_ORG, map); - } - - private static MapXNode serializeAllFilter() { - return createFilter(CLAUSE_ALL, new MapXNode()); - } - - private static MapXNode serializeNoneFilter() { - return createFilter(CLAUSE_NONE, new MapXNode()); - } - - private static MapXNode serializeUndefinedFilter() { - return createFilter(CLAUSE_UNDEFINED, new MapXNode()); - } - - private static void serializeMatchingRule(ValueFilter filter, MapXNode map) { - if (filter.getMatchingRule() != null){ - PrimitiveXNode matchingNode = createPrimitiveXNode(filter.getMatchingRule().getLocalPart(), DOMUtil.XSD_STRING); - map.put(ELEMENT_MATCHING, matchingNode); - } - } - - private static void serializePath(MapXNode map, ItemPath path, ObjectFilter filter) { - if (path == null) { - throw new IllegalStateException("Cannot serialize filter " + filter + " because it does not contain path"); - } - map.put(ELEMENT_PATH, createPrimitiveXNode(path, ItemPath.XSD_TYPE)); - } - - private static XNode serializePropertyValue(PrismPropertyValue value, PrismPropertyDefinition definition, PrismBeanConverter beanConverter) throws SchemaException { - QName typeQName = definition.getTypeName(); - T realValue = value.getValue(); - if (beanConverter.canProcess(typeQName)) { - return beanConverter.marshall(realValue); - } else { - // primitive value - return createPrimitiveXNode(realValue, typeQName); - } - } - - private static PrimitiveXNode createPrimitiveXNode(T val, QName type) { - PrimitiveXNode xprim = new PrimitiveXNode<>(); - xprim.setValue(val, type); - return xprim; - } - - - // TODO what with this? [med] - public static void revive (ObjectFilter filter, final PrismContext prismContext) throws SchemaException { -// Visitor visitor = new Visitor() { -// @Override -// public void visit(ObjectFilter filter) { -// if (filter instanceof PropertyValueFilter) { -// try { -// parseExpression((PropertyValueFilter)filter, prismContext); -// } catch (SchemaException e) { -// throw new TunnelException(e); -// } -// } -// } -// }; -// try { -// filter.accept(visitor); -// } catch (TunnelException te) { -// SchemaException e = (SchemaException) te.getCause(); -// throw e; -// } - } - - /** - * Tries to parse as much from filter as possible, without knowing the definition of object(s) to which the - * filter will be applied. It is used mainly to parse path specifications, in order to avoid namespace loss - * when serializing raw (unparsed) paths and QNames - see MID-1969. - * - * @param xfilter - * @param prismContext - */ - public static void parseFilterPreliminarily(MapXNode xfilter, PrismContext prismContext) throws SchemaException { - parseFilterInternal(xfilter, null, true, prismContext); - } -} +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.prism.marshaller; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Map.Entry; + +import javax.xml.namespace.QName; + +import com.evolveum.midpoint.prism.*; +import com.evolveum.midpoint.prism.query.*; +import com.evolveum.prism.xml.ns._public.query_3.SearchFilterType; + +import com.evolveum.prism.xml.ns._public.types_3.ObjectReferenceType; +import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang.Validate; + +import com.evolveum.midpoint.prism.path.ItemPath; +import com.evolveum.midpoint.prism.query.OrgFilter.Scope; +import com.evolveum.midpoint.prism.util.PrismUtil; +import com.evolveum.midpoint.prism.xnode.ListXNode; +import com.evolveum.midpoint.prism.xnode.MapXNode; +import com.evolveum.midpoint.prism.xnode.PrimitiveXNode; +import com.evolveum.midpoint.prism.xnode.XNode; +import com.evolveum.midpoint.util.DOMUtil; +import com.evolveum.midpoint.util.QNameUtil; +import com.evolveum.midpoint.util.exception.SchemaException; +import com.evolveum.midpoint.util.logging.Trace; +import com.evolveum.midpoint.util.logging.TraceManager; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * Note that expressions are not serialized yet. + */ +public class QueryConvertor { + + private static final Trace LOGGER = TraceManager.getTrace(QueryConvertor.class); + + public static final String NS_QUERY = "http://prism.evolveum.com/xml/ns/public/query-3"; + + // TODO removed unused constants eventually + public static final QName FILTER_ELEMENT_NAME = new QName(NS_QUERY, "filter"); + public static QName KEY_FILTER = new QName(NS_QUERY, "filter"); + public static QName KEY_PAGING = new QName(NS_QUERY, "paging"); + public static QName KEY_CONDITION = new QName(NS_QUERY, "condition"); + + // please keep the order of filter clause symbols synchronized with query-3.xsd + + private static final QName CLAUSE_ALL = new QName(NS_QUERY, "all"); + private static final QName CLAUSE_NONE = new QName(NS_QUERY, "none"); + private static final QName CLAUSE_UNDEFINED = new QName(NS_QUERY, "undefined"); + + private static final QName CLAUSE_EQUAL = new QName(NS_QUERY, "equal"); + private static final QName CLAUSE_GREATER = new QName(NS_QUERY, "greater"); + private static final QName CLAUSE_GREATER_OR_EQUAL = new QName(NS_QUERY, "greaterOrEqual"); + private static final QName CLAUSE_LESS = new QName(NS_QUERY, "less"); + private static final QName CLAUSE_LESS_OR_EQUAL = new QName(NS_QUERY, "lessOrEqual"); + private static final QName CLAUSE_SUBSTRING = new QName(NS_QUERY, "substring"); + + private static final QName CLAUSE_REF = new QName(NS_QUERY, "ref"); + private static final QName CLAUSE_ORG = new QName(NS_QUERY, "org"); + private static final QName CLAUSE_IN_OID = new QName(NS_QUERY, "inOid"); + + private static final QName CLAUSE_AND = new QName(NS_QUERY, "and"); + private static final QName CLAUSE_OR = new QName(NS_QUERY, "or"); + private static final QName CLAUSE_NOT = new QName(NS_QUERY, "not"); + + private static final QName CLAUSE_TYPE = new QName(NS_QUERY, "type"); + private static final QName CLAUSE_EXISTS = new QName(NS_QUERY, "exists"); + + // common elements + private static final QName ELEMENT_PATH = new QName(NS_QUERY, "path"); + private static final QName ELEMENT_MATCHING = new QName(NS_QUERY, "matching"); + private static final QName ELEMENT_VALUE = new QName(NS_QUERY, "value"); + private static final QName ELEMENT_RIGHT_HAND_SIDE_PATH = new QName(NS_QUERY, "rightHandSidePath"); + + // substring + private static final QName ELEMENT_ANCHOR_START = new QName(NS_QUERY, "anchorStart"); + private static final QName ELEMENT_ANCHOR_END = new QName(NS_QUERY, "anchorEnd"); + + // org + private static final QName ELEMENT_ORG_REF = new QName(NS_QUERY, "orgRef"); + private static final QName ELEMENT_SCOPE = new QName(NS_QUERY, "scope"); + private static final QName ELEMENT_IS_ROOT = new QName(NS_QUERY, "isRoot"); + + // inOid + private static final QName ELEMENT_OID = new QName(NS_QUERY, "oid"); + private static final QName ELEMENT_CONSIDER_OWNER = new QName(NS_QUERY, "considerOwner"); + + // type and exists + public static final QName ELEMENT_TYPE = new QName(NS_QUERY, "type"); + private static final QName ELEMENT_FILTER = new QName(NS_QUERY, "filter"); + + /** + * Used by XNodeProcessor and similar code that does not have complete schema for the filter + */ + public static ObjectFilter parseFilter(XNode xnode, PrismContext prismContext) throws SchemaException { + Validate.notNull(prismContext); + MapXNode xmap = toMap(xnode); + return parseFilterInternal(xmap, null, false, prismContext); + } + + public static ObjectFilter parseFilter(MapXNode xmap, PrismContainerDefinition objDef) throws SchemaException { + Validate.notNull(objDef); + if (xmap == null) { + return null; + } + return parseFilterInternal(xmap, objDef, false, objDef.getPrismContext()); + } + + public static ObjectFilter parseFilter(SearchFilterType filter, Class clazz, PrismContext prismContext) throws SchemaException { + PrismObjectDefinition objDef = prismContext.getSchemaRegistry().findObjectDefinitionByCompileTimeClass(clazz); + if (objDef == null) { + throw new SchemaException("Cannot find obj definition for "+clazz); + } + return parseFilter(filter, objDef); + } + + public static ObjectFilter parseFilter(SearchFilterType filter, PrismObjectDefinition objDef) throws SchemaException { + Validate.notNull(objDef); + return parseFilter(filter.getFilterClauseXNode(), objDef); + } + + private static ObjectFilter parseFilterInternal( + @NotNull MapXNode filterXMap, + @Nullable PrismContainerDefinition pcd, + boolean preliminaryParsingOnly, + @NotNull PrismContext prismContext) throws SchemaException { + + Validate.notNull(prismContext); + Entry clauseEntry = filterXMap.getSingleEntryThatDoesNotMatch(SearchFilterType.F_DESCRIPTION); + QName clauseQName = clauseEntry.getKey(); + XNode clauseContent = clauseEntry.getValue(); + return parseFilterInternal(clauseContent, clauseQName, pcd, preliminaryParsingOnly, prismContext); + } + + private static ObjectFilter parseFilterInternal(XNode clauseContent, QName clauseQName, + PrismContainerDefinition pcd, boolean preliminaryParsingOnly, PrismContext prismContext) throws SchemaException { + + // trivial filters + if (QNameUtil.match(clauseQName, CLAUSE_ALL)) { + return new AllFilter(); + } else if (QNameUtil.match(clauseQName, CLAUSE_NONE)) { + return new NoneFilter(); + } else if (QNameUtil.match(clauseQName, CLAUSE_UNDEFINED)) { + return new UndefinedFilter(); + } + + // primitive filters + MapXNode clauseXMap = toMap(clauseContent); + + if (QNameUtil.match(clauseQName, CLAUSE_EQUAL) + || QNameUtil.match(clauseQName, CLAUSE_GREATER) + || QNameUtil.match(clauseQName, CLAUSE_GREATER_OR_EQUAL) + || QNameUtil.match(clauseQName, CLAUSE_LESS) + || QNameUtil.match(clauseQName, CLAUSE_LESS_OR_EQUAL)) { + return parseComparisonFilter(clauseQName, clauseXMap, pcd, preliminaryParsingOnly, prismContext); + } else if (QNameUtil.match(clauseQName, CLAUSE_SUBSTRING)) { + return parseSubstringFilter(clauseXMap, pcd, preliminaryParsingOnly, prismContext); + } else if (QNameUtil.match(clauseQName, CLAUSE_REF)) { + return parseRefFilter(clauseXMap, pcd, preliminaryParsingOnly, prismContext); + } else if (QNameUtil.match(clauseQName, CLAUSE_ORG)) { + return parseOrgFilter(clauseXMap, pcd, preliminaryParsingOnly, prismContext); + } else if (QNameUtil.match(clauseQName, CLAUSE_IN_OID)) { + return parseInOidFilter(clauseXMap, pcd, preliminaryParsingOnly, prismContext); + } + + // logical filters + + if (QNameUtil.match(clauseQName, CLAUSE_AND)) { + return parseAndFilter(clauseXMap, pcd, preliminaryParsingOnly, prismContext); + } else if (QNameUtil.match(clauseQName, CLAUSE_OR)) { + return parseOrFilter(clauseXMap, pcd, preliminaryParsingOnly, prismContext); + } else if (QNameUtil.match(clauseQName, CLAUSE_NOT)) { + return parseNotFilter(clauseXMap, pcd, preliminaryParsingOnly, prismContext); + } + + // other complex filters + + if (QNameUtil.match(clauseQName, CLAUSE_TYPE)) { + return parseTypeFilter(clauseXMap, pcd, preliminaryParsingOnly, prismContext); + } else if (QNameUtil.match(clauseQName, CLAUSE_EXISTS)) { + return parseExistsFilter(clauseXMap, pcd, preliminaryParsingOnly, prismContext); + } + + throw new UnsupportedOperationException("Unsupported query filter " + clauseQName); + + } + + private static AndFilter parseAndFilter(MapXNode clauseXMap, PrismContainerDefinition pcd, + boolean preliminaryParsingOnly, PrismContext prismContext) throws SchemaException { + List subfilters = parseLogicalFilter(clauseXMap, pcd, preliminaryParsingOnly, prismContext); + if (preliminaryParsingOnly) { + return null; + } else { + return AndFilter.createAnd(subfilters); + } + } + + private static List parseLogicalFilter(MapXNode clauseXMap, + PrismContainerDefinition pcd, boolean preliminaryParsingOnly, PrismContext prismContext) throws SchemaException { + List subfilters = new ArrayList(); + for (Entry entry : clauseXMap.entrySet()) { + if (entry.getValue() instanceof ListXNode){ + Iterator subNodes = ((ListXNode) entry.getValue()).iterator(); + while (subNodes.hasNext()){ + ObjectFilter subFilter = parseFilterInternal(subNodes.next(), entry.getKey(), pcd, preliminaryParsingOnly, prismContext); + if (!preliminaryParsingOnly) { + subfilters.add(subFilter); + } + } + } else{ + ObjectFilter subfilter = parseFilterInternal(entry.getValue(), entry.getKey(), pcd, preliminaryParsingOnly, prismContext); + if (!preliminaryParsingOnly) { + subfilters.add(subfilter); + } + } + } + return subfilters; + } + + private static OrFilter parseOrFilter(MapXNode clauseXMap, PrismContainerDefinition pcd, + boolean preliminaryParsingOnly, PrismContext prismContext) throws SchemaException { + List subfilters = parseLogicalFilter(clauseXMap, pcd, preliminaryParsingOnly, prismContext); + if (preliminaryParsingOnly) { + return null; + } else { + return OrFilter.createOr(subfilters); + } + } + + private static NotFilter parseNotFilter(MapXNode clauseXMap, PrismContainerDefinition pcd, + boolean preliminaryParsingOnly, PrismContext prismContext) throws SchemaException { + Entry entry = singleSubEntry(clauseXMap, "not"); + ObjectFilter subfilter = parseFilterInternal(entry.getValue(), entry.getKey(), pcd, preliminaryParsingOnly, prismContext); + if (preliminaryParsingOnly) { + return null; + } else { + return NotFilter.createNot(subfilter); + } + } + + private static ObjectFilter parseComparisonFilter(QName clauseQName, MapXNode clauseXMap, + PrismContainerDefinition pcd, boolean preliminaryParsingOnly, PrismContext prismContext) throws SchemaException { + + boolean isEq = QNameUtil.match(clauseQName, CLAUSE_EQUAL); + boolean isGt = QNameUtil.match(clauseQName, CLAUSE_GREATER); + boolean isGtEq = QNameUtil.match(clauseQName, CLAUSE_GREATER_OR_EQUAL); + boolean isLt = QNameUtil.match(clauseQName, CLAUSE_LESS); + boolean isLtEq = QNameUtil.match(clauseQName, CLAUSE_LESS_OR_EQUAL); + + ItemPath itemPath = getPath(clauseXMap); + if (itemPath == null || itemPath.isEmpty()){ + throw new SchemaException("Could not convert query, because query does not contain item path."); + } + QName itemName = ItemPath.getName(itemPath.last()); + + QName matchingRule = getMatchingRule(clauseXMap); + + XNode valueXnode = clauseXMap.get(ELEMENT_VALUE); + ItemPath rightSidePath = getPath(clauseXMap, ELEMENT_RIGHT_HAND_SIDE_PATH); + + ItemDefinition itemDefinition = locateItemDefinition(valueXnode, itemPath, pcd, prismContext); + if (itemDefinition != null){ + itemName = itemDefinition.getName(); + } + + if (valueXnode != null) { + Item item = parseItem(valueXnode, itemName, itemDefinition, prismContext); + if (!isEq && item.getValues().size() != 1) { + throw new SchemaException("Expected exactly one value, got " + item.getValues().size() + " instead"); + } + if (preliminaryParsingOnly) { + return null; + } else { + if (isEq) { + List> values = item.getValues(); + PrismValue.clearParent(values); + return EqualFilter.createEqual(itemPath, + (PrismPropertyDefinition)item.getDefinition(), matchingRule, values); + } + PrismPropertyValue propertyValue = (PrismPropertyValue) item.getValue(0); + propertyValue.clearParent(); + if (isGt || isGtEq) { + return GreaterFilter.createGreater(itemPath, pcd, propertyValue, isGtEq); + } else { + return LessFilter.createLess(itemPath, pcd, propertyValue, isLtEq); + } + } + } else if (rightSidePath != null) { + if (preliminaryParsingOnly) { + return null; + } else { + ItemDefinition rightSideDefinition = pcd != null ? pcd.findItemDefinition(rightSidePath) : null; + if (isEq) { + return EqualFilter.createEqual(itemPath, (PrismPropertyDefinition) itemDefinition, matchingRule, rightSidePath, rightSideDefinition); + } else if (isGt || isGtEq) { + return GreaterFilter.createGreater(itemPath, (PrismPropertyDefinition) itemDefinition, rightSidePath, rightSideDefinition, isGtEq); + } else { + return LessFilter.createLess(itemPath, (PrismPropertyDefinition) itemDefinition, rightSidePath, rightSideDefinition, isLtEq); + } + } + } else { + Entry expressionEntry = clauseXMap.getSingleEntryThatDoesNotMatch( + ELEMENT_VALUE, ELEMENT_MATCHING, ELEMENT_PATH); + if (expressionEntry != null) { + PrismPropertyValue expressionPropertyValue = prismContext.getXnodeProcessor().parsePrismPropertyFromGlobalXNodeValue( + expressionEntry, ParsingContext.createDefault()); + if (preliminaryParsingOnly) { + return null; + } else { + ExpressionWrapper expressionWrapper = new ExpressionWrapper(); + expressionWrapper.setExpression(expressionPropertyValue.getValue()); + if (isEq) { + return EqualFilter.createEqual(itemPath, (PrismPropertyDefinition) itemDefinition, matchingRule, expressionWrapper); + } else if (isGt || isGtEq) { + return GreaterFilter.createGreater(itemPath, (PrismPropertyDefinition) itemDefinition, expressionWrapper, isGtEq); + } else { + return LessFilter.createLess(itemPath, (PrismPropertyDefinition) itemDefinition, expressionWrapper, isLtEq); + } + } + } else { + if (!isEq) { + throw new SchemaException("Comparison filter (greater, less) requires at least one value expression."); + } + if (preliminaryParsingOnly) { + return null; + } else { + return EqualFilter.createNullEqual(itemPath, (PrismPropertyDefinition) itemDefinition, matchingRule); + } + } + } + } + + private static InOidFilter parseInOidFilter(MapXNode clauseXMap, PrismContainerDefinition pcd, boolean preliminaryParsingOnly, PrismContext prismContext) throws SchemaException{ + + boolean considerOwner = Boolean.TRUE.equals(clauseXMap.getParsedPrimitiveValue(ELEMENT_CONSIDER_OWNER, DOMUtil.XSD_BOOLEAN)); + + XNode valueXnode = clauseXMap.get(ELEMENT_VALUE); + if (valueXnode != null) { + List oids = new ArrayList<>(); + if (valueXnode instanceof ListXNode) { + for (XNode subnode : (ListXNode) valueXnode) { + if (subnode instanceof PrimitiveXNode) { + oids.add(((PrimitiveXNode) subnode).getParsedValue(DOMUtil.XSD_STRING)); + } else { + throw new SchemaException("The OID was expected to be present as primitive XNode, instead it is: " + subnode); + } + } + } else if (valueXnode instanceof PrimitiveXNode) { + oids.add(((PrimitiveXNode) valueXnode).getParsedValue(DOMUtil.XSD_STRING)); + } else { + throw new SchemaException("The OID was expected to be present as primitive or list XNode, instead it is: " + valueXnode); + } + return InOidFilter.createInOid(considerOwner, oids); + } else { + ExpressionWrapper expression = parseExpression(clauseXMap, prismContext); + if (expression != null) { + return InOidFilter.createInOid(considerOwner, expression); + } else { + throw new SchemaException("InOid filter with no values nor expression"); + } + } + } + + private static TypeFilter parseTypeFilter(MapXNode clauseXMap, PrismContainerDefinition pcd, boolean preliminaryParsingOnly, PrismContext prismContext) throws SchemaException{ + QName type = clauseXMap.getParsedPrimitiveValue(ELEMENT_TYPE, DOMUtil.XSD_QNAME); + + XNode subXFilter = clauseXMap.get(ELEMENT_FILTER); + PrismObjectDefinition def = prismContext.getSchemaRegistry().findObjectDefinitionByType(type); + ObjectFilter subFilter = null; + if (subXFilter != null && subXFilter instanceof MapXNode) { + subFilter = parseFilterInternal((MapXNode) subXFilter, def, preliminaryParsingOnly, prismContext); + } + if (preliminaryParsingOnly) { + return null; + } else { + return new TypeFilter(type, subFilter); + } + } + + private static ExistsFilter parseExistsFilter(MapXNode clauseXMap, PrismContainerDefinition pcd, boolean preliminaryParsingOnly, PrismContext prismContext) throws SchemaException{ + ItemPath path = getPath(clauseXMap); + + XNode subXFilter = clauseXMap.get(ELEMENT_FILTER); + ObjectFilter subFilter = null; + PrismContainerDefinition subPcd = pcd != null ? pcd.findContainerDefinition(path) : null; + if (subXFilter != null && subXFilter instanceof MapXNode) { + subFilter = parseFilterInternal((MapXNode) subXFilter, subPcd, preliminaryParsingOnly, prismContext); + } + if (preliminaryParsingOnly) { + return null; + } else { + return ExistsFilter.createExists(path, pcd, subFilter); + } + } + + private static RefFilter parseRefFilter(MapXNode clauseXMap, PrismContainerDefinition pcd, boolean preliminaryParsingOnly, PrismContext prismContext) throws SchemaException{ + ItemPath itemPath = getPath(clauseXMap); + + if (itemPath == null || itemPath.isEmpty()){ + throw new SchemaException("Cannot convert query, because query does not contain property path."); + } + QName itemName = ItemPath.getName(itemPath.last()); + + ItemDefinition itemDefinition = null; + if (pcd != null) { + itemDefinition = pcd != null ? pcd.findItemDefinition(itemPath) : null; + if (itemDefinition == null && !preliminaryParsingOnly) { + throw new SchemaException("No definition for item "+itemPath+" in "+pcd); + } + } + + XNode valueXnode = clauseXMap.get(ELEMENT_VALUE); + if (valueXnode != null) { + Item item = prismContext.getXnodeProcessor().parseItem(valueXnode, itemName, itemDefinition, + ParsingContext.allowMissingRefTypes()); + if (preliminaryParsingOnly) { + return null; + } + PrismReference ref = (PrismReference)item; + if (item.getValues().size() < 1) { + throw new IllegalStateException("No values to search specified for item " + itemName); + } + return RefFilter.createReferenceEqual(itemPath, ref, null); + } else { + ExpressionWrapper expressionWrapper = parseExpression(clauseXMap, prismContext); + if (expressionWrapper != null) { + if (preliminaryParsingOnly) { + return null; + } else { + return RefFilter.createReferenceEqual(itemPath, + (PrismReferenceDefinition) itemDefinition, expressionWrapper); + } + } else { + if (preliminaryParsingOnly) { + return null; + } else { + return RefFilter.createReferenceEqual(itemPath, + (PrismReferenceDefinition) itemDefinition, expressionWrapper); + } + } + } + } + + private static ExpressionWrapper parseExpression(MapXNode xmap, PrismContext prismContext) throws SchemaException { + Entry expressionEntry = xmap.getSingleEntryThatDoesNotMatch( + + ELEMENT_VALUE, ELEMENT_MATCHING, ELEMENT_PATH); + if (expressionEntry != null) { + PrismPropertyValue expressionPropertyValue = prismContext.getXnodeProcessor() + .parsePrismPropertyFromGlobalXNodeValue(expressionEntry, ParsingContext.createDefault()); + ExpressionWrapper expressionWrapper = new ExpressionWrapper(); + expressionWrapper.setExpression(expressionPropertyValue.getValue()); + return expressionWrapper; + } + + return null; + + } + + private static SubstringFilter parseSubstringFilter(MapXNode clauseXMap, PrismContainerDefinition pcd, boolean preliminaryParsingOnly, PrismContext prismContext) + throws SchemaException { + ItemPath itemPath = getPath(clauseXMap); + + if (itemPath == null || itemPath.isEmpty()){ + throw new SchemaException("Could not convert query, because query does not contain item path."); + } + QName itemName = ItemPath.getName(itemPath.last()); + QName matchingRule = getMatchingRule(clauseXMap); + + XNode valueXnode = clauseXMap.get(ELEMENT_VALUE); + + ItemDefinition itemDefinition = locateItemDefinition(valueXnode, itemPath, pcd, prismContext); + + Item item = parseItem(valueXnode, itemName, itemDefinition, prismContext); + + Boolean anchorStart = clauseXMap.getParsedPrimitiveValue(ELEMENT_ANCHOR_START, DOMUtil.XSD_BOOLEAN); + if (anchorStart == null) { + anchorStart = false; + } + + Boolean anchorEnd = clauseXMap.getParsedPrimitiveValue(ELEMENT_ANCHOR_END, DOMUtil.XSD_BOOLEAN); + if (anchorEnd == null) { + anchorEnd = false; + } + + if (preliminaryParsingOnly) { + return null; + } else { + return SubstringFilter.createSubstring(itemPath, (PrismProperty) item, matchingRule, anchorStart, anchorEnd); + } + } + + private static OrgFilter parseOrgFilter(MapXNode clauseXMap, PrismContainerDefinition pcd, boolean preliminaryParsingOnly, PrismContext prismContext) throws SchemaException { + if (Boolean.TRUE.equals(clauseXMap.getParsedPrimitiveValue(ELEMENT_IS_ROOT, DOMUtil.XSD_BOOLEAN))) { + // TODO check if other content is present + if (preliminaryParsingOnly) { + return null; + } else { + return OrgFilter.createRootOrg(); + } + } + + XNode xorgrefnode = clauseXMap.get(ELEMENT_ORG_REF); + if (xorgrefnode == null) { + throw new SchemaException("No organization reference defined in the search query."); + } + MapXNode xorgrefmap = toMap(xorgrefnode); + String orgOid = xorgrefmap.getParsedPrimitiveValue(ELEMENT_OID, DOMUtil.XSD_STRING); + if (orgOid == null || StringUtils.isBlank(orgOid)) { + throw new SchemaException("No oid attribute defined in the organization reference element."); + } + + String scopeString = xorgrefmap.getParsedPrimitiveValue(ELEMENT_SCOPE, DOMUtil.XSD_STRING); // original (in my opinion incorrect) place + if (scopeString == null) { + scopeString = clauseXMap.getParsedPrimitiveValue(ELEMENT_SCOPE, DOMUtil.XSD_STRING); // here it is placed by the serializer + } + Scope scope = scopeString != null ? Scope.valueOf(scopeString) : null; + + if (preliminaryParsingOnly) { + return null; + } else { + return OrgFilter.createOrg(orgOid, scope); + } + } + + private static Entry singleSubEntry(MapXNode xmap, String filterName) throws SchemaException { + if (xmap == null || xmap.isEmpty()) { + return null; + } + return xmap.getSingleSubEntry("search filter "+filterName); + } + + private static MapXNode toMap(XNode xnode) throws SchemaException { + if (!(xnode instanceof MapXNode)) { + throw new SchemaException("Cannot parse filter from "+xnode); + } + return (MapXNode)xnode; + } + + private static PrimitiveXNode toPrimitive(XNode xnode, XNode context) throws SchemaException { + if (!(xnode instanceof PrimitiveXNode)) { + throw new SchemaException("Cannot parse filter from "+context+ ": This should be a primitive: "+xnode); + } + return (PrimitiveXNode)xnode; + } + + private static ItemPath getPath(MapXNode clauseXMap) throws SchemaException { + return getPath(clauseXMap, ELEMENT_PATH); + } + + private static ItemPath getPath(MapXNode clauseXMap, QName key) throws SchemaException { + XNode xnode = clauseXMap.get(key); + if (xnode == null) { + return null; + } + if (!(xnode instanceof PrimitiveXNode)) { + throw new SchemaException("Expected that field "+key+" will be primitive, but it is "+xnode.getDesc()); + } + return clauseXMap.getParsedPrimitiveValue(key, ItemPath.XSD_TYPE); + } + + private static QName getMatchingRule(MapXNode xmap) throws SchemaException{ + String matchingRuleString = xmap.getParsedPrimitiveValue(ELEMENT_MATCHING, DOMUtil.XSD_STRING); + if (StringUtils.isNotBlank(matchingRuleString)){ + if (QNameUtil.isUri(matchingRuleString)) { + return QNameUtil.uriToQName(matchingRuleString); + } else { + return new QName(PrismConstants.NS_MATCHING_RULE, matchingRuleString); + } + } else { + return null; + } + } + + private static Item parseItem(XNode valueXnode, QName itemName, ItemDefinition itemDefinition, PrismContext prismContext) throws SchemaException{ + Item item; + if (prismContext == null) { + item = (Item) XNodeProcessor.parsePrismPropertyRaw(valueXnode, itemName, null); + } else { + item = prismContext.getXnodeProcessor().parseItem(valueXnode, itemName, itemDefinition, ParsingContext.allowMissingRefTypes()); + } + + if (item.getValues().size() < 1 ) { + throw new IllegalStateException("No values to search specified for item " + itemName); + } + + return item; + } + + private static ItemDefinition locateItemDefinition(XNode valueXnode, ItemPath itemPath, PrismContainerDefinition pcd, PrismContext prismContext) throws SchemaException{ + ItemDefinition itemDefinition = null; + if (pcd != null) { + itemDefinition = pcd.findItemDefinition(itemPath); + if (itemDefinition == null) { + ItemPath rest = itemPath.tail(); + QName first = ItemPath.getName(itemPath.first()); + itemDefinition = prismContext.getXnodeProcessor().locateItemDefinition(pcd, first, valueXnode); + if (rest.isEmpty()) { + return itemDefinition; + } else{ + if (itemDefinition != null && itemDefinition instanceof PrismContainerDefinition){ + return locateItemDefinition(valueXnode, rest, (PrismContainerDefinition) itemDefinition, prismContext); + } + } + } + } + return itemDefinition; + } + + public static SearchFilterType createSearchFilterType(ObjectFilter filter, PrismContext prismContext) throws SchemaException { + MapXNode xnode = serializeFilter(filter, prismContext); + return SearchFilterType.createFromXNode(xnode, prismContext); + } + + public static MapXNode serializeFilter(ObjectFilter filter, PrismContext prismContext) throws SchemaException{ + return serializeFilter(filter, PrismUtil.getXnodeProcessor(prismContext).createSerializer()); + } + + private static MapXNode serializeFilter(ObjectFilter filter, XNodeSerializer xnodeSerializer) throws SchemaException{ + // null or primitive filters + if (filter == null) { + return null; + } else if (filter instanceof AllFilter) { + return serializeAllFilter(); + } else if (filter instanceof NoneFilter) { + return serializeNoneFilter(); + } else if (filter instanceof UndefinedFilter) { + return serializeUndefinedFilter(); + } else if (filter instanceof EqualFilter + || filter instanceof GreaterFilter + || filter instanceof LessFilter) { + return serializeComparisonFilter((PropertyValueFilter) filter, xnodeSerializer); + } else if (filter instanceof SubstringFilter) { + return serializeSubstringFilter((SubstringFilter) filter, xnodeSerializer); + } else if (filter instanceof RefFilter) { + return serializeRefFilter((RefFilter) filter, xnodeSerializer); + } else if (filter instanceof OrgFilter) { + return serializeOrgFilter((OrgFilter) filter, xnodeSerializer); + } else if (filter instanceof InOidFilter) { + return serializeInOidFilter((InOidFilter) filter, xnodeSerializer); + } + + // complex filters + if (filter instanceof AndFilter) { + return serializeAndFilter((AndFilter) filter, xnodeSerializer); + } else if (filter instanceof OrFilter) { + return serializeOrFilter((OrFilter) filter, xnodeSerializer); + } else if (filter instanceof NotFilter) { + return serializeNotFilter((NotFilter) filter, xnodeSerializer); + } + + if (filter instanceof TypeFilter) { + return serializeTypeFilter((TypeFilter) filter, xnodeSerializer); + } else if (filter instanceof ExistsFilter) { + return serializeExistsFilter((ExistsFilter) filter, xnodeSerializer); + } + + throw new UnsupportedOperationException("Unsupported filter type: " + filter); + } + + + private static MapXNode serializeAndFilter(AndFilter filter, XNodeSerializer xnodeSerilizer) throws SchemaException{ + return createFilter(CLAUSE_AND, serializeNaryLogicalSubfilters(filter.getConditions(), xnodeSerilizer)); + } + + private static MapXNode serializeOrFilter(OrFilter filter, XNodeSerializer xnodeSerilizer) throws SchemaException{ + MapXNode map = createFilter(CLAUSE_OR, serializeNaryLogicalSubfilters(filter.getConditions(), xnodeSerilizer)); + return map; + } + + private static MapXNode serializeNaryLogicalSubfilters(List objectFilters, XNodeSerializer xnodeSerilizer) throws SchemaException{ + MapXNode filters = new MapXNode(); + for (ObjectFilter of : objectFilters) { + MapXNode subFilter = serializeFilter(of, xnodeSerilizer); + filters.merge(subFilter); + } + return filters; + } + + private static MapXNode serializeNotFilter(NotFilter filter, XNodeSerializer xnodeSerializer) throws SchemaException{ + return createFilter(CLAUSE_NOT, serializeFilter(filter.getFilter(), xnodeSerializer)); + } + + @NotNull + private static MapXNode createFilter(QName clauseNot, MapXNode value) { + MapXNode map = new MapXNode(); + map.put(clauseNot, value); + return map; + } + + private static MapXNode serializeInOidFilter(InOidFilter filter, XNodeSerializer xnodeSerializer) throws SchemaException { + MapXNode clauseMap = new MapXNode(); + if (filter.getOids() != null && !filter.getOids().isEmpty()) { + ListXNode valuesNode = new ListXNode(); + for (String oid : filter.getOids()) { + XNode val = createPrimitiveXNode(oid, DOMUtil.XSD_STRING); + valuesNode.add(val); + } + clauseMap.put(ELEMENT_VALUE, valuesNode); + } else if (filter.getExpression() != null) { + // TODO serialize expression + } else { + throw new SchemaException("InOid filter with no values nor expression"); + } + if (filter.isConsiderOwner()) { + clauseMap.put(ELEMENT_CONSIDER_OWNER, new PrimitiveXNode<>(true)); + } + + return createFilter(CLAUSE_IN_OID, clauseMap); + } + + private static MapXNode serializeComparisonFilter(PropertyValueFilter filter, XNodeSerializer xnodeSerializer) throws SchemaException{ + MapXNode map = new MapXNode(); + QName clause; + if (filter instanceof EqualFilter) { + clause = CLAUSE_EQUAL; + } else if (filter instanceof GreaterFilter) { + clause = ((GreaterFilter) filter).isEquals() ? CLAUSE_GREATER_OR_EQUAL : CLAUSE_GREATER; + } else if (filter instanceof LessFilter) { + clause = ((LessFilter) filter).isEquals() ? CLAUSE_LESS_OR_EQUAL : CLAUSE_LESS; + } else { + throw new IllegalStateException(); + } + map.put(clause, serializeValueFilter(filter, xnodeSerializer)); + return map; + } + + private static MapXNode serializeValueFilter(PropertyValueFilter filter, XNodeSerializer xnodeSerializer) throws SchemaException { + MapXNode map = new MapXNode(); + serializeMatchingRule(filter, map); + serializePath(map, filter.getFullPath(), filter); + + List values = filter.getValues(); + if (values != null) { + ListXNode valuesNode = new ListXNode(); + for (T val : values) { + if (val.getParent() == null) { + val.setParent(filter); + } + XNode valNode = xnodeSerializer.serializeItemValue(val, filter.getDefinition()); + if (filter instanceof RefFilter) { // TODO shouldn't we do this in all cases? + valNode.setExplicitTypeDeclaration(true); + if (valNode.getTypeQName() == null) { + valNode.setTypeQName(ObjectReferenceType.COMPLEX_TYPE); + } + } + valuesNode.add(valNode); + } + map.put(ELEMENT_VALUE, valuesNode); + } + if (filter.getRightHandSidePath() != null) { + map.put(ELEMENT_RIGHT_HAND_SIDE_PATH, createPrimitiveXNode(filter.getRightHandSidePath(), ItemPath.XSD_TYPE)); + } + + ExpressionWrapper xexpression = filter.getExpression(); + if (xexpression != null) { + //map.merge(xexpression); + //TODO serialize expression + } + + return map; + } + + private static MapXNode serializeRefFilter(RefFilter filter, XNodeSerializer xnodeSerializer) throws SchemaException { + MapXNode map = createFilter(CLAUSE_REF, serializeValueFilter(filter, xnodeSerializer)); + return map; + } + + private static MapXNode serializeSubstringFilter(SubstringFilter filter, XNodeSerializer xnodeSerializer) throws SchemaException{ + MapXNode map = new MapXNode(); + MapXNode content = serializeValueFilter(filter, xnodeSerializer); + if (filter.isAnchorStart()) { + content.put(ELEMENT_ANCHOR_START, new PrimitiveXNode<>(true)); + } + if (filter.isAnchorEnd()) { + content.put(ELEMENT_ANCHOR_END, new PrimitiveXNode<>(true)); + } + map.put(CLAUSE_SUBSTRING, content); + return map; + } + + private static MapXNode serializeTypeFilter(TypeFilter filter, XNodeSerializer xnodeSerializer) throws SchemaException{ + MapXNode content = new MapXNode(); + content.put(ELEMENT_TYPE, createPrimitiveXNode(filter.getType(), DOMUtil.XSD_QNAME)); + if (filter.getFilter() != null){ + content.put(ELEMENT_FILTER, serializeFilter(filter.getFilter(), xnodeSerializer)); + } + return createFilter(CLAUSE_TYPE, content); + } + + private static MapXNode serializeExistsFilter(ExistsFilter filter, XNodeSerializer xnodeSerializer) throws SchemaException{ + MapXNode content = new MapXNode(); + serializePath(content, filter.getFullPath(), filter); + if (filter.getFilter() != null){ + content.put(ELEMENT_FILTER, serializeFilter(filter.getFilter(), xnodeSerializer)); + } + return createFilter(CLAUSE_EXISTS, content); + } + + private static MapXNode serializeOrgFilter(OrgFilter filter, XNodeSerializer xnodeSerializer) { + MapXNode map = new MapXNode(); + + if (filter.getOrgRef() != null) { + MapXNode orgRefMap = new MapXNode(); + orgRefMap.put(ELEMENT_OID, createPrimitiveXNode(filter.getOrgRef().getOid(), DOMUtil.XSD_STRING)); + map.put(ELEMENT_ORG_REF, orgRefMap); + } + if (filter.getScope() != null) { + map.put(ELEMENT_SCOPE, createPrimitiveXNode(filter.getScope().name(), DOMUtil.XSD_STRING)); + } + if (filter.isRoot()) { + map.put(ELEMENT_IS_ROOT, createPrimitiveXNode(Boolean.TRUE, DOMUtil.XSD_BOOLEAN)); + } + + return createFilter(CLAUSE_ORG, map); + } + + private static MapXNode serializeAllFilter() { + return createFilter(CLAUSE_ALL, new MapXNode()); + } + + private static MapXNode serializeNoneFilter() { + return createFilter(CLAUSE_NONE, new MapXNode()); + } + + private static MapXNode serializeUndefinedFilter() { + return createFilter(CLAUSE_UNDEFINED, new MapXNode()); + } + + private static void serializeMatchingRule(ValueFilter filter, MapXNode map) { + if (filter.getMatchingRule() != null){ + PrimitiveXNode matchingNode = createPrimitiveXNode(filter.getMatchingRule().getLocalPart(), DOMUtil.XSD_STRING); + map.put(ELEMENT_MATCHING, matchingNode); + } + } + + private static void serializePath(MapXNode map, ItemPath path, ObjectFilter filter) { + if (path == null) { + throw new IllegalStateException("Cannot serialize filter " + filter + " because it does not contain path"); + } + map.put(ELEMENT_PATH, createPrimitiveXNode(path, ItemPath.XSD_TYPE)); + } + + private static XNode serializePropertyValue(PrismPropertyValue value, PrismPropertyDefinition definition, PrismBeanConverter beanConverter) throws SchemaException { + QName typeQName = definition.getTypeName(); + T realValue = value.getValue(); + if (beanConverter.canProcess(typeQName)) { + return beanConverter.marshall(realValue); + } else { + // primitive value + return createPrimitiveXNode(realValue, typeQName); + } + } + + private static PrimitiveXNode createPrimitiveXNode(T val, QName type) { + PrimitiveXNode xprim = new PrimitiveXNode<>(); + xprim.setValue(val, type); + return xprim; + } + + + // TODO what with this? [med] + public static void revive (ObjectFilter filter, final PrismContext prismContext) throws SchemaException { +// Visitor visitor = new Visitor() { +// @Override +// public void visit(ObjectFilter filter) { +// if (filter instanceof PropertyValueFilter) { +// try { +// parseExpression((PropertyValueFilter)filter, prismContext); +// } catch (SchemaException e) { +// throw new TunnelException(e); +// } +// } +// } +// }; +// try { +// filter.accept(visitor); +// } catch (TunnelException te) { +// SchemaException e = (SchemaException) te.getCause(); +// throw e; +// } + } + + /** + * Tries to parse as much from filter as possible, without knowing the definition of object(s) to which the + * filter will be applied. It is used mainly to parse path specifications, in order to avoid namespace loss + * when serializing raw (unparsed) paths and QNames - see MID-1969. + * + * @param xfilter + * @param prismContext + */ + public static void parseFilterPreliminarily(MapXNode xfilter, PrismContext prismContext) throws SchemaException { + parseFilterInternal(xfilter, null, true, prismContext); + } +} diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/TrivialXPathParser.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/TrivialXPathParser.java similarity index 97% rename from infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/TrivialXPathParser.java rename to infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/TrivialXPathParser.java index e990cb9ff65..0fffc227113 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/TrivialXPathParser.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/TrivialXPathParser.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2013 Evolveum + * Copyright (c) 2010-2016 Evolveum * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.evolveum.midpoint.prism.parser; +package com.evolveum.midpoint.prism.marshaller; import java.util.HashMap; import java.util.Map; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/XNodeProcessor.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/XNodeProcessor.java similarity index 99% rename from infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/XNodeProcessor.java rename to infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/XNodeProcessor.java index 12f0abd66c6..3a654b276a2 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/XNodeProcessor.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/XNodeProcessor.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014-2015 Evolveum + * Copyright (c) 2010-2016 Evolveum * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.evolveum.midpoint.prism.parser; +package com.evolveum.midpoint.prism.marshaller; import java.util.Collection; import java.util.Map.Entry; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/XNodeProcessorEvaluationMode.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/XNodeProcessorEvaluationMode.java similarity index 91% rename from infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/XNodeProcessorEvaluationMode.java rename to infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/XNodeProcessorEvaluationMode.java index 6887ea7cbd8..6f039d14859 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/XNodeProcessorEvaluationMode.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/XNodeProcessorEvaluationMode.java @@ -1,5 +1,5 @@ -/** - * Copyright (c) 2015 Evolveum +/* + * Copyright (c) 2010-2016 Evolveum * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.evolveum.midpoint.prism.parser; +package com.evolveum.midpoint.prism.marshaller; /** * @author semancik diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/util/XNodeProcessorUtil.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/XNodeProcessorUtil.java similarity index 90% rename from infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/util/XNodeProcessorUtil.java rename to infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/XNodeProcessorUtil.java index 869b05671fc..3b91dead7cb 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/util/XNodeProcessorUtil.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/XNodeProcessorUtil.java @@ -1,4 +1,20 @@ -package com.evolveum.midpoint.prism.parser.util; +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.prism.marshaller; import java.lang.reflect.Field; import java.security.CryptoPrimitive; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/XNodeSerializer.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/XNodeSerializer.java similarity index 99% rename from infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/XNodeSerializer.java rename to infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/XNodeSerializer.java index cdbe4c20b2d..b479860ea21 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/XNodeSerializer.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/XNodeSerializer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 Evolveum + * Copyright (c) 2010-2016 Evolveum * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.evolveum.midpoint.prism.parser; +package com.evolveum.midpoint.prism.marshaller; import java.util.ArrayList; import java.util.Collection; @@ -23,6 +23,7 @@ import com.evolveum.midpoint.prism.SerializationContext; import com.evolveum.midpoint.prism.SerializationOptions; +import com.evolveum.midpoint.prism.marshaller.PrismBeanConverter; import com.evolveum.prism.xml.ns._public.query_3.SearchFilterType; import org.apache.commons.lang.StringUtils; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/XPathHolder.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/XPathHolder.java similarity index 99% rename from infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/XPathHolder.java rename to infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/XPathHolder.java index 5e20711dce9..87c7fcd6074 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/XPathHolder.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/XPathHolder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2013 Evolveum + * Copyright (c) 2010-2016 Evolveum * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.evolveum.midpoint.prism.parser; +package com.evolveum.midpoint.prism.marshaller; import java.util.ArrayList; import java.util.Collections; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/XPathSegment.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/XPathSegment.java similarity index 98% rename from infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/XPathSegment.java rename to infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/XPathSegment.java index eced442c7cb..4c47e1e71f4 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/XPathSegment.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/XPathSegment.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2013 Evolveum + * Copyright (c) 2010-2016 Evolveum * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.evolveum.midpoint.prism.parser; +package com.evolveum.midpoint.prism.marshaller; import org.apache.commons.lang.StringUtils; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/DomParser.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/DomParser.java index 866b29e3654..b55e6764cbb 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/DomParser.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/DomParser.java @@ -29,6 +29,8 @@ import javax.xml.namespace.QName; +import com.evolveum.midpoint.prism.marshaller.XNodeProcessorEvaluationMode; +import com.evolveum.midpoint.prism.marshaller.XPathHolder; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; import org.apache.commons.lang.StringUtils; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/DomSerializer.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/DomSerializer.java index 3a7dfd09500..7b3cd4f414d 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/DomSerializer.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/DomSerializer.java @@ -15,6 +15,7 @@ */ package com.evolveum.midpoint.prism.parser; +import com.evolveum.midpoint.prism.marshaller.XPathHolder; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.schema.SchemaRegistry; import com.evolveum.midpoint.prism.xml.DynamicNamespacePrefixMapper; @@ -27,20 +28,12 @@ import com.evolveum.midpoint.prism.xnode.XNode; import com.evolveum.midpoint.util.DOMUtil; import com.evolveum.midpoint.util.exception.SchemaException; -import com.ibm.wsdl.extensions.schema.SchemaConstants; -import com.sun.org.apache.xml.internal.utils.XMLChar; import org.apache.commons.lang.StringUtils; -import org.w3c.dom.Comment; import org.w3c.dom.DOMException; import org.w3c.dom.Document; import org.w3c.dom.Element; -import org.w3c.dom.Node; import javax.xml.namespace.QName; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; import java.util.Map.Entry; /** diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/ItemPathDeserializer.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/ItemPathDeserializer.java index 88d0a13b2dd..104a110e84f 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/ItemPathDeserializer.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/ItemPathDeserializer.java @@ -2,14 +2,10 @@ import java.io.IOException; -import javax.xml.namespace.QName; - import org.apache.commons.lang.StringUtils; -import com.evolveum.midpoint.prism.parser.TrivialXPathParser; -import com.evolveum.midpoint.prism.parser.XPathHolder; +import com.evolveum.midpoint.prism.marshaller.XPathHolder; import com.evolveum.midpoint.prism.path.ItemPath; -import com.evolveum.midpoint.util.QNameUtil; import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonProcessingException; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/ItemPathSerializer.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/ItemPathSerializer.java index 2500f3851db..e67dc889a9b 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/ItemPathSerializer.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/ItemPathSerializer.java @@ -2,7 +2,7 @@ import java.io.IOException; -import com.evolveum.midpoint.prism.parser.XPathHolder; +import com.evolveum.midpoint.prism.marshaller.XPathHolder; import com.evolveum.midpoint.prism.path.ItemPath; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonProcessingException; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/ItemPathTypeDeserializer.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/ItemPathTypeDeserializer.java index 7cb49c211b0..519a8c22d77 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/ItemPathTypeDeserializer.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/ItemPathTypeDeserializer.java @@ -4,7 +4,7 @@ import org.apache.commons.lang.StringUtils; -import com.evolveum.midpoint.prism.parser.XPathHolder; +import com.evolveum.midpoint.prism.marshaller.XPathHolder; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.prism.xml.ns._public.types_3.ItemPathType; import com.fasterxml.jackson.core.JsonParseException; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/JsonValueParser.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/JsonValueParser.java index dd5713d0ccc..b63fd3f177d 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/JsonValueParser.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/JsonValueParser.java @@ -5,7 +5,7 @@ import javax.xml.namespace.QName; -import com.evolveum.midpoint.prism.parser.XNodeProcessorEvaluationMode; +import com.evolveum.midpoint.prism.marshaller.XNodeProcessorEvaluationMode; import com.evolveum.midpoint.prism.xml.XsdTypeMapper; import com.evolveum.midpoint.prism.xnode.ValueParser; import com.evolveum.midpoint.util.exception.SchemaException; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/ObjectFilter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/ObjectFilter.java index e406c0a8b79..7e2a4351056 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/ObjectFilter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/ObjectFilter.java @@ -18,14 +18,11 @@ import java.io.Serializable; -import com.evolveum.midpoint.prism.Containerable; -import com.evolveum.midpoint.prism.Objectable; import com.evolveum.midpoint.prism.PrismContainerValue; import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.Revivable; import com.evolveum.midpoint.prism.match.MatchingRuleRegistry; -import com.evolveum.midpoint.prism.parser.QueryConvertor; +import com.evolveum.midpoint.prism.marshaller.QueryConvertor; import com.evolveum.midpoint.util.DebugDumpable; import com.evolveum.midpoint.util.exception.SchemaException; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/PagingConvertor.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/PagingConvertor.java index a1e2d201851..9ac1ef31998 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/PagingConvertor.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/PagingConvertor.java @@ -19,12 +19,8 @@ import javax.xml.namespace.QName; import com.evolveum.prism.xml.ns._public.types_3.ItemPathType; -import org.w3c.dom.Element; -import com.evolveum.midpoint.prism.PrismConstants; -import com.evolveum.midpoint.prism.parser.XPathHolder; import com.evolveum.midpoint.prism.path.ItemPath; -import com.evolveum.midpoint.util.DOMUtil; import com.evolveum.prism.xml.ns._public.query_3.OrderDirectionType; import com.evolveum.prism.xml.ns._public.query_3.PagingType; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/QueryJaxbConvertor.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/QueryJaxbConvertor.java index 4953ae4df06..2e04aa407b7 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/QueryJaxbConvertor.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/QueryJaxbConvertor.java @@ -19,7 +19,7 @@ import javax.xml.namespace.QName; import com.evolveum.midpoint.prism.*; -import com.evolveum.midpoint.prism.parser.QueryConvertor; +import com.evolveum.midpoint.prism.marshaller.QueryConvertor; import com.evolveum.midpoint.prism.xnode.MapXNode; import com.evolveum.midpoint.util.DOMUtil; import com.evolveum.midpoint.util.exception.SchemaException; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/PrismUtil.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/PrismUtil.java index 80ab47ad32c..1aa010b0448 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/PrismUtil.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/PrismUtil.java @@ -15,12 +15,10 @@ */ package com.evolveum.midpoint.prism.util; -import com.evolveum.midpoint.prism.ComplexTypeDefinition; import com.evolveum.midpoint.prism.Item; import com.evolveum.midpoint.prism.ItemDefinition; import com.evolveum.midpoint.prism.Objectable; import com.evolveum.midpoint.prism.PrismConstants; -import com.evolveum.midpoint.prism.PrismContainerDefinition; import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.PrismProperty; @@ -29,8 +27,8 @@ import com.evolveum.midpoint.prism.PrismValue; import com.evolveum.midpoint.prism.delta.ItemDelta; import com.evolveum.midpoint.prism.parser.DomParser; -import com.evolveum.midpoint.prism.parser.PrismBeanConverter; -import com.evolveum.midpoint.prism.parser.XNodeProcessor; +import com.evolveum.midpoint.prism.marshaller.PrismBeanConverter; +import com.evolveum.midpoint.prism.marshaller.XNodeProcessor; import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.prism.polystring.PolyStringNormalizer; import com.evolveum.midpoint.prism.xml.XsdTypeMapper; @@ -46,7 +44,6 @@ import java.util.Collection; import java.util.HashMap; -import java.util.List; import java.util.Map; import java.util.Map.Entry; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/RawTypeUtil.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/RawTypeUtil.java index 6099f6beccc..ef96e3e52fc 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/RawTypeUtil.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/RawTypeUtil.java @@ -19,16 +19,10 @@ import java.util.ArrayList; import java.util.List; -import javax.xml.bind.JAXBElement; import javax.xml.namespace.QName; -import org.w3c.dom.Document; -import org.w3c.dom.Element; - -import com.evolveum.midpoint.prism.Containerable; import com.evolveum.midpoint.prism.Item; import com.evolveum.midpoint.prism.ItemDefinition; -import com.evolveum.midpoint.prism.Objectable; import com.evolveum.midpoint.prism.PrismContainer; import com.evolveum.midpoint.prism.PrismContainerDefinition; import com.evolveum.midpoint.prism.PrismContainerValue; @@ -40,16 +34,7 @@ import com.evolveum.midpoint.prism.PrismReferenceDefinition; import com.evolveum.midpoint.prism.PrismReferenceValue; import com.evolveum.midpoint.prism.PrismValue; -import com.evolveum.midpoint.prism.Referencable; -import com.evolveum.midpoint.prism.parser.DomParser; -import com.evolveum.midpoint.prism.parser.util.XNodeProcessorUtil; -import com.evolveum.midpoint.prism.polystring.PolyString; -import com.evolveum.midpoint.prism.xml.XmlTypeConverter; -import com.evolveum.midpoint.prism.xnode.MapXNode; -import com.evolveum.midpoint.prism.xnode.PrimitiveXNode; -import com.evolveum.midpoint.util.DOMUtil; import com.evolveum.midpoint.util.exception.SchemaException; -import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; import com.evolveum.prism.xml.ns._public.types_3.RawType; public class RawTypeUtil { diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/ValueSerializationUtil.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/ValueSerializationUtil.java index 0497001895e..2d99963758e 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/ValueSerializationUtil.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/ValueSerializationUtil.java @@ -15,7 +15,7 @@ import com.evolveum.midpoint.prism.PrismPropertyValue; import com.evolveum.midpoint.prism.PrismValue; import com.evolveum.midpoint.prism.Referencable; -import com.evolveum.midpoint.prism.parser.XNodeSerializer; +import com.evolveum.midpoint.prism.marshaller.XNodeSerializer; import com.evolveum.midpoint.prism.xnode.ListXNode; import com.evolveum.midpoint.prism.xnode.MapXNode; import com.evolveum.midpoint.prism.xnode.XNode; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xjc/PrismForJAXBUtil.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xjc/PrismForJAXBUtil.java index 34e2822aa2c..c0cb3c2a2f4 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xjc/PrismForJAXBUtil.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xjc/PrismForJAXBUtil.java @@ -18,13 +18,8 @@ import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.parser.DomParser; -import com.evolveum.midpoint.prism.parser.QueryConvertor; import com.evolveum.midpoint.prism.polystring.PolyString; -import com.evolveum.midpoint.prism.query.ObjectFilter; -import com.evolveum.midpoint.prism.schema.SchemaRegistry; import com.evolveum.midpoint.prism.xnode.MapXNode; -import com.evolveum.midpoint.prism.xnode.XNode; -import com.evolveum.midpoint.util.DOMUtil; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.util.exception.SystemException; import com.evolveum.prism.xml.ns._public.query_3.SearchFilterType; @@ -38,10 +33,8 @@ import javax.xml.namespace.QName; import java.lang.reflect.Field; -import java.util.ArrayList; import java.util.Collection; import java.util.List; -import java.util.Map.Entry; /** * @author lazyman diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xml/XmlTypeConverter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xml/XmlTypeConverter.java index d260cf2814a..b817a30fc0a 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xml/XmlTypeConverter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xml/XmlTypeConverter.java @@ -16,16 +16,14 @@ package com.evolveum.midpoint.prism.xml; import com.evolveum.midpoint.prism.PrismConstants; -import com.evolveum.midpoint.prism.parser.XPathHolder; +import com.evolveum.midpoint.prism.marshaller.XPathHolder; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.polystring.PolyString; -import com.evolveum.midpoint.util.ClassPathUtil; import com.evolveum.midpoint.util.DOMUtil; import com.evolveum.midpoint.util.JAXBUtil; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; -import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; import org.apache.commons.codec.binary.Base64; import org.w3c.dom.Document; @@ -33,7 +31,6 @@ import org.w3c.dom.Node; import org.w3c.dom.NodeList; -import javax.xml.XMLConstants; import javax.xml.bind.annotation.XmlEnumValue; import javax.xml.datatype.DatatypeConfigurationException; import javax.xml.datatype.DatatypeFactory; @@ -42,7 +39,6 @@ import javax.xml.namespace.QName; import java.io.File; -import java.io.IOException; import java.lang.reflect.Field; import java.math.BigDecimal; import java.math.BigInteger; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/PrimitiveXNode.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/PrimitiveXNode.java index 516b7d5da03..8d6512e0590 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/PrimitiveXNode.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/PrimitiveXNode.java @@ -21,7 +21,7 @@ import javax.xml.namespace.QName; -import com.evolveum.midpoint.prism.parser.XNodeProcessorEvaluationMode; +import com.evolveum.midpoint.prism.marshaller.XNodeProcessorEvaluationMode; import com.evolveum.midpoint.prism.util.CloneUtil; import com.evolveum.midpoint.prism.xml.XsdTypeMapper; import com.evolveum.midpoint.util.logging.Trace; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/ValueParser.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/ValueParser.java index fceeb32d828..cf948d0fe37 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/ValueParser.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/ValueParser.java @@ -17,7 +17,7 @@ import javax.xml.namespace.QName; -import com.evolveum.midpoint.prism.parser.XNodeProcessorEvaluationMode; +import com.evolveum.midpoint.prism.marshaller.XNodeProcessorEvaluationMode; import com.evolveum.midpoint.util.exception.SchemaException; import java.util.Map; diff --git a/infra/prism/src/main/java/com/evolveum/prism/xml/ns/_public/query_3/SearchFilterType.java b/infra/prism/src/main/java/com/evolveum/prism/xml/ns/_public/query_3/SearchFilterType.java index a8869c4a2cb..2158493fd77 100644 --- a/infra/prism/src/main/java/com/evolveum/prism/xml/ns/_public/query_3/SearchFilterType.java +++ b/infra/prism/src/main/java/com/evolveum/prism/xml/ns/_public/query_3/SearchFilterType.java @@ -42,7 +42,7 @@ import com.evolveum.midpoint.prism.PrismConstants; import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.parser.DomParser; -import com.evolveum.midpoint.prism.parser.QueryConvertor; +import com.evolveum.midpoint.prism.marshaller.QueryConvertor; import com.evolveum.midpoint.prism.util.PrismUtil; import com.evolveum.midpoint.prism.xnode.MapXNode; import com.evolveum.midpoint.prism.xnode.PrimitiveXNode; diff --git a/infra/prism/src/main/java/com/evolveum/prism/xml/ns/_public/types_3/ItemPathType.java b/infra/prism/src/main/java/com/evolveum/prism/xml/ns/_public/types_3/ItemPathType.java index d2a2e62176f..1226329f090 100644 --- a/infra/prism/src/main/java/com/evolveum/prism/xml/ns/_public/types_3/ItemPathType.java +++ b/infra/prism/src/main/java/com/evolveum/prism/xml/ns/_public/types_3/ItemPathType.java @@ -17,33 +17,20 @@ package com.evolveum.prism.xml.ns._public.types_3; import java.io.Serializable; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Iterator; -import java.util.List; -import java.util.ListIterator; -import javax.xml.bind.JAXBElement; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlAnyElement; -import javax.xml.bind.annotation.XmlElementRef; -import javax.xml.bind.annotation.XmlMixed; import javax.xml.bind.annotation.XmlTransient; import javax.xml.bind.annotation.XmlType; import javax.xml.namespace.QName; import org.jvnet.jaxb2_commons.lang.Equals; import org.jvnet.jaxb2_commons.lang.EqualsStrategy; -import org.jvnet.jaxb2_commons.lang.HashCode; -import org.jvnet.jaxb2_commons.lang.HashCodeStrategy; import org.jvnet.jaxb2_commons.locator.ObjectLocator; -import com.evolveum.midpoint.prism.parser.XPathHolder; +import com.evolveum.midpoint.prism.marshaller.XPathHolder; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.util.xml.DomAwareEqualsStrategy; -import org.w3c.dom.Element; - /** * diff --git a/infra/prism/src/main/java/com/evolveum/prism/xml/ns/_public/types_3/RawType.java b/infra/prism/src/main/java/com/evolveum/prism/xml/ns/_public/types_3/RawType.java index 3d231c4b8bd..1d9f29050d1 100644 --- a/infra/prism/src/main/java/com/evolveum/prism/xml/ns/_public/types_3/RawType.java +++ b/infra/prism/src/main/java/com/evolveum/prism/xml/ns/_public/types_3/RawType.java @@ -1,7 +1,7 @@ package com.evolveum.prism.xml.ns._public.types_3; import com.evolveum.midpoint.prism.*; -import com.evolveum.midpoint.prism.parser.XNodeProcessor; +import com.evolveum.midpoint.prism.marshaller.XNodeProcessor; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.util.PrismUtil; import com.evolveum.midpoint.prism.xnode.PrimitiveXNode; diff --git a/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestUnknownItems.java b/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestUnknownItems.java index efb8ca8a027..80d1a15cf59 100644 --- a/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestUnknownItems.java +++ b/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestUnknownItems.java @@ -16,7 +16,7 @@ package com.evolveum.midpoint.prism; import com.evolveum.midpoint.prism.foo.UserType; -import com.evolveum.midpoint.prism.parser.XNodeProcessorEvaluationMode; +import com.evolveum.midpoint.prism.marshaller.XNodeProcessorEvaluationMode; import com.evolveum.midpoint.util.PrettyPrinter; import com.evolveum.midpoint.util.exception.SchemaException; import org.testng.annotations.BeforeSuite; diff --git a/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestXmlSerialization.java b/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestXmlSerialization.java index 84a2f4f4b09..16256cd94d2 100644 --- a/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestXmlSerialization.java +++ b/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestXmlSerialization.java @@ -16,18 +16,10 @@ package com.evolveum.midpoint.prism; -import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.PrismInternalTestUtil; -import com.evolveum.midpoint.prism.crypto.Protector; -import com.evolveum.midpoint.prism.crypto.TestProtector; -import com.evolveum.midpoint.prism.parser.util.XNodeProcessorUtil; import com.evolveum.midpoint.prism.util.PrismTestUtil; -import com.evolveum.midpoint.prism.xnode.MapXNode; import com.evolveum.midpoint.prism.xnode.PrimitiveXNode; import com.evolveum.midpoint.util.PrettyPrinter; import com.evolveum.midpoint.util.exception.SchemaException; -import com.evolveum.prism.xml.ns._public.types_3.ProtectedStringType; -import org.apache.xml.security.encryption.XMLCipher; import org.testng.annotations.BeforeSuite; import org.testng.annotations.Test; import org.xml.sax.SAXException; diff --git a/infra/prism/src/test/java/com/evolveum/midpoint/prism/parser/AbstractParserTest.java b/infra/prism/src/test/java/com/evolveum/midpoint/prism/parser/AbstractParserTest.java index f20de7eafb2..533112eeecb 100644 --- a/infra/prism/src/test/java/com/evolveum/midpoint/prism/parser/AbstractParserTest.java +++ b/infra/prism/src/test/java/com/evolveum/midpoint/prism/parser/AbstractParserTest.java @@ -33,6 +33,7 @@ import com.evolveum.midpoint.prism.delta.*; import com.evolveum.midpoint.prism.foo.EventHandlerChainType; import com.evolveum.midpoint.prism.foo.EventHandlerType; +import com.evolveum.midpoint.prism.marshaller.XNodeProcessor; import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; import com.evolveum.prism.xml.ns._public.types_3.SchemaDefinitionType; diff --git a/infra/prism/src/test/java/com/evolveum/midpoint/prism/parser/TestProtectedString.java b/infra/prism/src/test/java/com/evolveum/midpoint/prism/parser/TestProtectedString.java index a51757b4f49..00d2cf78429 100644 --- a/infra/prism/src/test/java/com/evolveum/midpoint/prism/parser/TestProtectedString.java +++ b/infra/prism/src/test/java/com/evolveum/midpoint/prism/parser/TestProtectedString.java @@ -20,7 +20,7 @@ import com.evolveum.midpoint.prism.PrismInternalTestUtil; import com.evolveum.midpoint.prism.crypto.Protector; import com.evolveum.midpoint.prism.crypto.TestProtector; -import com.evolveum.midpoint.prism.parser.util.XNodeProcessorUtil; +import com.evolveum.midpoint.prism.marshaller.XNodeProcessorUtil; import com.evolveum.midpoint.prism.util.PrismTestUtil; import com.evolveum.midpoint.prism.xnode.MapXNode; import com.evolveum.midpoint.util.PrettyPrinter; diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/DeltaConvertor.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/DeltaConvertor.java index 027cc9243a0..cb662c1df84 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/DeltaConvertor.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/DeltaConvertor.java @@ -22,7 +22,6 @@ import javax.xml.bind.JAXBException; import javax.xml.namespace.QName; -import com.evolveum.midpoint.prism.SerializationContext; import com.evolveum.midpoint.prism.SerializationOptions; import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; import org.apache.commons.lang.Validate; @@ -39,7 +38,7 @@ import com.evolveum.midpoint.prism.delta.ChangeType; import com.evolveum.midpoint.prism.delta.ItemDelta; import com.evolveum.midpoint.prism.delta.ObjectDelta; -import com.evolveum.midpoint.prism.parser.XNodeSerializer; +import com.evolveum.midpoint.prism.marshaller.XNodeSerializer; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.util.RawTypeUtil; import com.evolveum.midpoint.prism.xnode.XNode; diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/PagingTypeFactory.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/PagingTypeFactory.java index 0dfea75f62a..32680f848b3 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/PagingTypeFactory.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/PagingTypeFactory.java @@ -17,10 +17,8 @@ import com.evolveum.prism.xml.ns._public.types_3.ItemPathType; import org.apache.commons.lang.StringUtils; -import org.w3c.dom.Element; -import com.evolveum.midpoint.prism.parser.XPathHolder; -import com.evolveum.midpoint.schema.constants.SchemaConstants; +import com.evolveum.midpoint.prism.marshaller.XPathHolder; import com.evolveum.prism.xml.ns._public.query_3.OrderDirectionType; import com.evolveum.prism.xml.ns._public.query_3.PagingType; diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/constants/SchemaConstants.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/constants/SchemaConstants.java index 0f1b7abadd3..047b2e838a1 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/constants/SchemaConstants.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/constants/SchemaConstants.java @@ -22,7 +22,7 @@ import javax.xml.namespace.QName; import com.evolveum.midpoint.prism.PrismConstants; -import com.evolveum.midpoint.prism.parser.QueryConvertor; +import com.evolveum.midpoint.prism.marshaller.QueryConvertor; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.schema.SchemaConstantsGenerated; import com.evolveum.midpoint.util.QNameUtil; diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/MiscSchemaUtil.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/MiscSchemaUtil.java index c6b0b3639bc..31c2cfa9a17 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/MiscSchemaUtil.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/MiscSchemaUtil.java @@ -28,14 +28,11 @@ import com.evolveum.midpoint.schema.RetrieveOption; -import org.w3c.dom.Element; - import com.evolveum.midpoint.prism.PrismConstants; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.PrismReferenceValue; import com.evolveum.midpoint.prism.delta.ItemDelta; import com.evolveum.midpoint.prism.delta.ObjectDelta; -import com.evolveum.midpoint.prism.parser.XPathHolder; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.xml.XmlTypeConverter; import com.evolveum.midpoint.schema.GetOperationOptions; @@ -64,7 +61,6 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.ProjectionPolicyType; import com.evolveum.midpoint.xml.ns._public.common.common_3.PropertyLimitationsType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowKindType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; import com.evolveum.prism.xml.ns._public.types_3.ItemPathType; import com.evolveum.prism.xml.ns._public.types_3.ProtectedStringType; diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ObjectTypeUtil.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ObjectTypeUtil.java index 9b2b01245b0..8e1a0f1b527 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ObjectTypeUtil.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ObjectTypeUtil.java @@ -18,8 +18,8 @@ import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.delta.ObjectDelta; -import com.evolveum.midpoint.prism.parser.XPathHolder; -import com.evolveum.midpoint.prism.parser.XPathSegment; +import com.evolveum.midpoint.prism.marshaller.XPathHolder; +import com.evolveum.midpoint.prism.marshaller.XPathSegment; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.prism.util.ItemPathUtil; diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/SchemaDebugUtil.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/SchemaDebugUtil.java index 11e97b844fb..680514b2364 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/SchemaDebugUtil.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/SchemaDebugUtil.java @@ -35,7 +35,7 @@ import org.w3c.dom.NodeList; import org.w3c.dom.Text; -import com.evolveum.midpoint.prism.parser.XPathHolder; +import com.evolveum.midpoint.prism.marshaller.XPathHolder; import com.evolveum.midpoint.prism.query.ObjectFilter; import com.evolveum.midpoint.prism.query.ObjectPaging; import com.evolveum.midpoint.prism.query.ObjectQuery; @@ -56,8 +56,6 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.SynchronizationSituationDescriptionType; import com.evolveum.midpoint.xml.ns._public.common.common_3.UnknownJavaObjectType; import com.evolveum.prism.xml.ns._public.query_3.PagingType; -import com.evolveum.prism.xml.ns._public.query_3.QueryType; -import com.evolveum.prism.xml.ns._public.query_3.SearchFilterType; import com.evolveum.prism.xml.ns._public.types_3.ItemDeltaType; import com.evolveum.prism.xml.ns._public.types_3.ItemPathType; import com.evolveum.prism.xml.ns._public.types_3.ProtectedStringType; diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestJaxbConstruction.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestJaxbConstruction.java index bf1cab24c3a..215a7e1f265 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestJaxbConstruction.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestJaxbConstruction.java @@ -36,23 +36,16 @@ import org.testng.AssertJUnit; import org.testng.annotations.BeforeSuite; import org.testng.annotations.Test; -import org.w3c.dom.Document; import org.w3c.dom.Element; import org.xml.sax.SAXException; -import com.evolveum.midpoint.prism.parser.QueryConvertor; import com.evolveum.midpoint.prism.polystring.PolyString; -import com.evolveum.midpoint.prism.query.EqualFilter; -import com.evolveum.midpoint.prism.query.ObjectFilter; -import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.prism.util.PrismAsserts; import com.evolveum.midpoint.prism.util.PrismTestUtil; import com.evolveum.midpoint.schema.constants.MidPointConstants; -import com.evolveum.midpoint.schema.util.JAXBUtilTest; import com.evolveum.midpoint.schema.util.SchemaTestConstants; import com.evolveum.midpoint.schema.util.SchemaTestUtil; import com.evolveum.midpoint.util.DOMUtil; -import com.evolveum.midpoint.util.JAXBUtil; import com.evolveum.midpoint.util.PrettyPrinter; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentType; diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseResource.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseResource.java index 53fc4dc74b4..f22dd888341 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseResource.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseResource.java @@ -22,8 +22,8 @@ import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.delta.ObjectDelta; import com.evolveum.midpoint.prism.parser.DomParser; -import com.evolveum.midpoint.prism.parser.QueryConvertor; -import com.evolveum.midpoint.prism.parser.XNodeProcessor; +import com.evolveum.midpoint.prism.marshaller.QueryConvertor; +import com.evolveum.midpoint.prism.marshaller.XNodeProcessor; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.path.NameItemPathSegment; import com.evolveum.midpoint.prism.query.EqualFilter; diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestQueryConvertor.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestQueryConvertor.java index c1616baaf06..f928cb5309f 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestQueryConvertor.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestQueryConvertor.java @@ -17,9 +17,7 @@ package com.evolveum.midpoint.schema; import com.evolveum.midpoint.prism.*; -import com.evolveum.midpoint.prism.parser.QueryConvertor; import com.evolveum.midpoint.prism.path.ItemPath; -import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.prism.query.*; import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import com.evolveum.midpoint.prism.util.PrismAsserts; diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/test/XPathTest.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/test/XPathTest.java index f25726d16da..e485662a531 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/test/XPathTest.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/test/XPathTest.java @@ -25,9 +25,9 @@ import org.testng.annotations.Test; import org.testng.AssertJUnit; -import com.evolveum.midpoint.prism.parser.TrivialXPathParser; -import com.evolveum.midpoint.prism.parser.XPathHolder; -import com.evolveum.midpoint.prism.parser.XPathSegment; +import com.evolveum.midpoint.prism.marshaller.TrivialXPathParser; +import com.evolveum.midpoint.prism.marshaller.XPathHolder; +import com.evolveum.midpoint.prism.marshaller.XPathSegment; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.util.PrismTestUtil; import com.evolveum.midpoint.schema.MidPointPrismContextFactory; diff --git a/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccCertCaseOperationsHelper.java b/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccCertCaseOperationsHelper.java index d4236ae4b2d..4dcf172e4a4 100644 --- a/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccCertCaseOperationsHelper.java +++ b/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccCertCaseOperationsHelper.java @@ -26,7 +26,7 @@ import com.evolveum.midpoint.prism.delta.PropertyDelta; import com.evolveum.midpoint.prism.delta.ReferenceDelta; import com.evolveum.midpoint.prism.delta.builder.DeltaBuilder; -import com.evolveum.midpoint.prism.parser.QueryConvertor; +import com.evolveum.midpoint.prism.marshaller.QueryConvertor; import com.evolveum.midpoint.prism.path.IdItemPathSegment; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.path.NameItemPathSegment; diff --git a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/PathExpressionEvaluator.java b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/PathExpressionEvaluator.java index bad7193a320..755b2b79542 100644 --- a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/PathExpressionEvaluator.java +++ b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/PathExpressionEvaluator.java @@ -15,52 +15,32 @@ */ package com.evolveum.midpoint.model.common.expression.evaluator; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; -import javax.xml.bind.JAXBElement; import javax.xml.namespace.QName; -import org.w3c.dom.Element; - import com.evolveum.midpoint.model.common.expression.ExpressionEvaluationContext; import com.evolveum.midpoint.model.common.expression.ExpressionEvaluator; import com.evolveum.midpoint.model.common.expression.ExpressionUtil; import com.evolveum.midpoint.model.common.expression.ItemDeltaItem; -import com.evolveum.midpoint.model.common.expression.ObjectDeltaObject; import com.evolveum.midpoint.model.common.expression.Source; import com.evolveum.midpoint.prism.Item; import com.evolveum.midpoint.prism.ItemDefinition; -import com.evolveum.midpoint.prism.PrismContainer; -import com.evolveum.midpoint.prism.PrismContainerValue; import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.PrismObject; -import com.evolveum.midpoint.prism.PrismProperty; import com.evolveum.midpoint.prism.PrismPropertyDefinition; import com.evolveum.midpoint.prism.PrismPropertyValue; import com.evolveum.midpoint.prism.PrismValue; import com.evolveum.midpoint.prism.crypto.Protector; -import com.evolveum.midpoint.prism.delta.ObjectDelta; import com.evolveum.midpoint.prism.delta.PrismValueDeltaSetTriple; import com.evolveum.midpoint.prism.delta.ItemDelta; -import com.evolveum.midpoint.prism.parser.XPathHolder; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.path.ItemPathSegment; import com.evolveum.midpoint.prism.path.NameItemPathSegment; -import com.evolveum.midpoint.prism.xml.XmlTypeConverter; -import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.ObjectResolver; -import com.evolveum.midpoint.util.DebugUtil; import com.evolveum.midpoint.util.QNameUtil; import com.evolveum.midpoint.util.exception.ExpressionEvaluationException; import com.evolveum.midpoint.util.exception.ObjectNotFoundException; import com.evolveum.midpoint.util.exception.SchemaException; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; /** * @author Radovan Semancik diff --git a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/script/xpath/XPathExpressionCodeHolder.java b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/script/xpath/XPathExpressionCodeHolder.java index 4c48109acd0..a4e55f1f3e7 100644 --- a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/script/xpath/XPathExpressionCodeHolder.java +++ b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/script/xpath/XPathExpressionCodeHolder.java @@ -17,12 +17,7 @@ import java.util.Map; -import org.w3c.dom.Element; -import org.w3c.dom.NamedNodeMap; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; - -import com.evolveum.midpoint.prism.parser.TrivialXPathParser; +import com.evolveum.midpoint.prism.marshaller.TrivialXPathParser; /** * @author Radovan Semancik diff --git a/model/model-common/src/test/java/com/evolveum/midpoint/model/common/expression/TestExpressionUtil.java b/model/model-common/src/test/java/com/evolveum/midpoint/model/common/expression/TestExpressionUtil.java index 3295f33984d..f1fbdf70248 100644 --- a/model/model-common/src/test/java/com/evolveum/midpoint/model/common/expression/TestExpressionUtil.java +++ b/model/model-common/src/test/java/com/evolveum/midpoint/model/common/expression/TestExpressionUtil.java @@ -35,7 +35,7 @@ import com.evolveum.midpoint.prism.PrismPropertyDefinition; import com.evolveum.midpoint.prism.PrismPropertyValue; import com.evolveum.midpoint.prism.delta.ObjectDelta; -import com.evolveum.midpoint.prism.parser.XPathHolder; +import com.evolveum.midpoint.prism.marshaller.XPathHolder; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.prism.util.PrismTestUtil; diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/expr/MidpointFunctionsImpl.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/expr/MidpointFunctionsImpl.java index 0c805a913ce..ec61e473f3d 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/expr/MidpointFunctionsImpl.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/expr/MidpointFunctionsImpl.java @@ -28,7 +28,7 @@ import com.evolveum.midpoint.prism.delta.ObjectDelta; import com.evolveum.midpoint.prism.match.DefaultMatchingRule; import com.evolveum.midpoint.prism.match.PolyStringOrigMatchingRule; -import com.evolveum.midpoint.prism.parser.XPathHolder; +import com.evolveum.midpoint.prism.marshaller.XPathHolder; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.prism.query.AndFilter; @@ -42,7 +42,6 @@ import com.evolveum.midpoint.schema.ResourceShadowDiscriminator; import com.evolveum.midpoint.schema.ResultHandler; import com.evolveum.midpoint.schema.SelectorOptions; -import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.MiscSchemaUtil; import com.evolveum.midpoint.schema.util.ObjectQueryUtil; @@ -50,7 +49,6 @@ import com.evolveum.midpoint.schema.util.ShadowUtil; import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.util.Holder; -import com.evolveum.midpoint.util.QNameUtil; import com.evolveum.midpoint.util.exception.CommunicationException; import com.evolveum.midpoint.util.exception.ConfigurationException; import com.evolveum.midpoint.util.exception.ExpressionEvaluationException; @@ -58,7 +56,6 @@ import com.evolveum.midpoint.util.exception.ObjectNotFoundException; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.util.exception.SecurityViolationException; -import com.evolveum.midpoint.util.exception.SystemException; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/AssignmentEvaluator.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/AssignmentEvaluator.java index f5ff743d8e0..695cb6df69c 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/AssignmentEvaluator.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/AssignmentEvaluator.java @@ -47,7 +47,7 @@ import com.evolveum.midpoint.prism.PrismReferenceValue; import com.evolveum.midpoint.prism.delta.PlusMinusZero; import com.evolveum.midpoint.prism.delta.PrismValueDeltaSetTriple; -import com.evolveum.midpoint.prism.parser.QueryConvertor; +import com.evolveum.midpoint.prism.marshaller.QueryConvertor; import com.evolveum.midpoint.prism.query.ObjectFilter; import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.repo.api.RepositoryService; @@ -70,7 +70,6 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentType; import com.evolveum.midpoint.xml.ns._public.common.common_3.AuthorizationType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ConstructionType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ExpressionVariableDefinitionType; import com.evolveum.midpoint.xml.ns._public.common.common_3.FocusType; import com.evolveum.midpoint.xml.ns._public.common.common_3.MappingType; import com.evolveum.midpoint.xml.ns._public.common.common_3.MappingsType; @@ -278,10 +277,10 @@ private void evaluateAssignmentWithResolvedTarget(Evaluat if (target.getOid().equals(source.getOid())) { throw new PolicyViolationException("The "+source+" refers to itself in assignment/inducement"); } - + LOGGER.trace("Checking for role cycle, comparing actual order {} with evaluation order {}", assignmentPathSegment.getEvaluationOrder(), assignmentPath.getEvaluationOrder()); if (assignmentPath.containsTarget((ObjectType) target.asObjectable()) && assignmentPathSegment.getEvaluationOrder() == assignmentPath.getEvaluationOrder()) { - + throw new PolicyViolationException("Attempt to assign "+target+" creates a role cycle"); } } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/Clockwork.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/Clockwork.java index bc0381c0eac..652d809ad34 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/Clockwork.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/Clockwork.java @@ -53,7 +53,7 @@ import com.evolveum.midpoint.prism.delta.DeltaSetTriple; import com.evolveum.midpoint.prism.delta.ItemDelta; import com.evolveum.midpoint.prism.delta.ObjectDelta; -import com.evolveum.midpoint.prism.parser.QueryConvertor; +import com.evolveum.midpoint.prism.marshaller.QueryConvertor; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.query.ObjectFilter; import com.evolveum.midpoint.prism.query.RefFilter; @@ -117,7 +117,6 @@ import java.util.ArrayList; import java.util.Collection; -import java.util.List; import java.util.Map; import java.util.Map.Entry; diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/Construction.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/Construction.java index c868aa580a8..1251389a9ab 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/Construction.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/Construction.java @@ -18,7 +18,6 @@ import java.io.Serializable; import java.util.ArrayList; import java.util.Collection; -import java.util.Iterator; import java.util.List; import javax.xml.namespace.QName; @@ -32,14 +31,9 @@ import com.evolveum.midpoint.model.common.expression.ObjectDeltaObject; import com.evolveum.midpoint.model.common.mapping.Mapping; import com.evolveum.midpoint.model.common.mapping.MappingFactory; -import com.evolveum.midpoint.model.common.mapping.PrismValueDeltaSetTripleProducer; import com.evolveum.midpoint.model.impl.lens.projector.MappingEvaluator; import com.evolveum.midpoint.model.impl.util.Utils; -import com.evolveum.midpoint.prism.Containerable; -import com.evolveum.midpoint.prism.Definition; -import com.evolveum.midpoint.prism.Item; import com.evolveum.midpoint.prism.ItemDefinition; -import com.evolveum.midpoint.prism.PrismContainer; import com.evolveum.midpoint.prism.PrismContainerDefinition; import com.evolveum.midpoint.prism.PrismContainerValue; import com.evolveum.midpoint.prism.PrismContext; @@ -50,12 +44,11 @@ import com.evolveum.midpoint.prism.OriginType; import com.evolveum.midpoint.prism.PrismValue; import com.evolveum.midpoint.prism.delta.PrismValueDeltaSetTriple; -import com.evolveum.midpoint.prism.parser.QueryConvertor; +import com.evolveum.midpoint.prism.marshaller.QueryConvertor; import com.evolveum.midpoint.prism.query.ObjectFilter; import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.prism.util.ItemPathUtil; import com.evolveum.midpoint.schema.ResultHandler; -import com.evolveum.midpoint.schema.SearchResultList; import com.evolveum.midpoint.schema.constants.ExpressionConstants; import com.evolveum.midpoint.schema.processor.ResourceAttributeDefinition; import com.evolveum.midpoint.schema.result.OperationResult; @@ -74,8 +67,6 @@ import com.evolveum.midpoint.util.exception.SystemException; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; -import com.evolveum.midpoint.xml.ns._public.common.common_3.AbstractRoleType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ConstructionStrengthType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ConstructionType; import com.evolveum.midpoint.xml.ns._public.common.common_3.FocusType; @@ -89,7 +80,6 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowKindType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; import com.evolveum.midpoint.xml.ns._public.common.common_3.SystemConfigurationType; -import com.evolveum.prism.xml.ns._public.query_3.SearchFilterType; /** * Live class that contains "construction" - a definition how to construct a diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/ScriptingExpressionEvaluator.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/ScriptingExpressionEvaluator.java index 581f0c2d2c7..6d38129b65f 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/ScriptingExpressionEvaluator.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/ScriptingExpressionEvaluator.java @@ -23,7 +23,7 @@ import com.evolveum.midpoint.prism.Item; import com.evolveum.midpoint.prism.ParsingContext; import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.parser.QueryConvertor; +import com.evolveum.midpoint.prism.marshaller.QueryConvertor; import com.evolveum.midpoint.prism.query.ObjectFilter; import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.result.OperationResult; diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/expressions/SearchEvaluator.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/expressions/SearchEvaluator.java index 05e7850da65..d6182cb0c04 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/expressions/SearchEvaluator.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/expressions/SearchEvaluator.java @@ -22,7 +22,7 @@ import com.evolveum.midpoint.model.impl.scripting.helpers.ExpressionHelper; import com.evolveum.midpoint.model.impl.scripting.helpers.OperationsHelper; import com.evolveum.midpoint.prism.PrismObject; -import com.evolveum.midpoint.prism.parser.QueryConvertor; +import com.evolveum.midpoint.prism.marshaller.QueryConvertor; import com.evolveum.midpoint.prism.query.ObjectFilter; import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.schema.ResultHandler; diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/util/Utils.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/util/Utils.java index e64e24c18dc..04831fd1d45 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/util/Utils.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/util/Utils.java @@ -36,7 +36,7 @@ import com.evolveum.midpoint.prism.crypto.Protector; import com.evolveum.midpoint.prism.delta.ItemDelta; import com.evolveum.midpoint.prism.delta.ObjectDelta; -import com.evolveum.midpoint.prism.parser.QueryConvertor; +import com.evolveum.midpoint.prism.marshaller.QueryConvertor; import com.evolveum.midpoint.prism.query.*; import com.evolveum.midpoint.repo.api.RepositoryService; import com.evolveum.midpoint.schema.GetOperationOptions; diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/negative/TestModelWebServiceNegative.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/negative/TestModelWebServiceNegative.java index d66826cfb78..50f196746d5 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/negative/TestModelWebServiceNegative.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/negative/TestModelWebServiceNegative.java @@ -24,7 +24,7 @@ import javax.xml.namespace.QName; -import com.evolveum.midpoint.prism.parser.XNodeProcessorEvaluationMode; +import com.evolveum.midpoint.prism.marshaller.XNodeProcessorEvaluationMode; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.annotation.DirtiesContext.ClassMode; import org.springframework.test.context.ContextConfiguration; diff --git a/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportServiceImpl.java b/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportServiceImpl.java index 87f4b183d58..a5ec02b7250 100644 --- a/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportServiceImpl.java +++ b/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportServiceImpl.java @@ -44,7 +44,7 @@ import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.PrismPropertyValue; -import com.evolveum.midpoint.prism.parser.QueryConvertor; +import com.evolveum.midpoint.prism.marshaller.QueryConvertor; import com.evolveum.midpoint.prism.query.ObjectFilter; import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.prism.query.TypeFilter; diff --git a/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportWebService.java b/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportWebService.java index 8b275349772..0961ed38735 100644 --- a/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportWebService.java +++ b/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportWebService.java @@ -5,7 +5,6 @@ import java.util.List; import java.util.Map; -import javax.xml.bind.JAXBElement; import javax.xml.namespace.QName; import org.apache.cxf.interceptor.Fault; @@ -13,22 +12,13 @@ import org.springframework.stereotype.Service; import com.evolveum.midpoint.audit.api.AuditEventRecord; -import com.evolveum.midpoint.prism.Item; -import com.evolveum.midpoint.prism.PrismContainer; -import com.evolveum.midpoint.prism.PrismContainerValue; import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismObject; -import com.evolveum.midpoint.prism.PrismProperty; -import com.evolveum.midpoint.prism.PrismReference; -import com.evolveum.midpoint.prism.PrismReferenceValue; -import com.evolveum.midpoint.prism.parser.QueryConvertor; import com.evolveum.midpoint.prism.query.ObjectQuery; -import com.evolveum.midpoint.prism.query.QueryJaxbConvertor; import com.evolveum.midpoint.report.api.ReportPort; import com.evolveum.midpoint.report.api.ReportService; import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.util.MiscSchemaUtil; -import com.evolveum.midpoint.util.QNameUtil; import com.evolveum.midpoint.util.exception.CommunicationException; import com.evolveum.midpoint.util.exception.ConfigurationException; import com.evolveum.midpoint.util.exception.ExpressionEvaluationException; @@ -40,17 +30,11 @@ import com.evolveum.midpoint.xml.ns._public.common.api_types_3.ObjectListType; import com.evolveum.midpoint.xml.ns._public.common.api_types_3.SelectorQualifiedGetOptionsType; import com.evolveum.midpoint.xml.ns._public.common.audit_3.AuditEventRecordListType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ReportParameterType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ReportType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; import com.evolveum.midpoint.xml.ns._public.report.report_3.RemoteReportParameterType; import com.evolveum.midpoint.xml.ns._public.report.report_3.RemoteReportParametersType; import com.evolveum.midpoint.xml.ns._public.report.report_3.ReportPortType; -import com.evolveum.prism.xml.ns._public.query_3.QueryType; -import com.evolveum.prism.xml.ns._public.query_3.SearchFilterType; -import com.evolveum.prism.xml.ns._public.types_3.RawType; @Service public class ReportWebService implements ReportPortType, ReportPort { diff --git a/repo/repo-cache/src/main/java/com/evolveum/midpoint/repo/cache/QueryKey.java b/repo/repo-cache/src/main/java/com/evolveum/midpoint/repo/cache/QueryKey.java index dc4001fd5db..9e306ae9444 100644 --- a/repo/repo-cache/src/main/java/com/evolveum/midpoint/repo/cache/QueryKey.java +++ b/repo/repo-cache/src/main/java/com/evolveum/midpoint/repo/cache/QueryKey.java @@ -17,19 +17,13 @@ package com.evolveum.midpoint.repo.cache; import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.parser.QueryConvertor; import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.prism.query.QueryJaxbConvertor; -import com.evolveum.midpoint.schema.GetOperationOptions; -import com.evolveum.midpoint.schema.SelectorOptions; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.util.exception.SystemException; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; import com.evolveum.prism.xml.ns._public.query_3.QueryType; -import java.util.Collection; -import java.util.HashSet; - /** * @author Pavol Mederly */ diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/SqlAuditServiceImpl.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/SqlAuditServiceImpl.java index abc20d1c689..59e9a72cf23 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/SqlAuditServiceImpl.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/SqlAuditServiceImpl.java @@ -20,7 +20,7 @@ import com.evolveum.midpoint.audit.api.AuditEventType; import com.evolveum.midpoint.audit.api.AuditService; import com.evolveum.midpoint.prism.PrismObject; -import com.evolveum.midpoint.prism.parser.XNodeProcessorEvaluationMode; +import com.evolveum.midpoint.prism.marshaller.XNodeProcessorEvaluationMode; import com.evolveum.midpoint.repo.sql.data.audit.RAuditEventRecord; import com.evolveum.midpoint.repo.sql.data.audit.RAuditEventStage; import com.evolveum.midpoint.repo.sql.data.audit.RAuditEventType; diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/any/RAnyConverter.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/any/RAnyConverter.java index 54fef132e6f..1f78e65102e 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/any/RAnyConverter.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/any/RAnyConverter.java @@ -17,7 +17,7 @@ package com.evolveum.midpoint.repo.sql.data.common.any; import com.evolveum.midpoint.prism.*; -import com.evolveum.midpoint.prism.parser.PrismBeanInspector; +import com.evolveum.midpoint.prism.marshaller.PrismBeanInspector; import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.prism.xml.XmlTypeConverter; import com.evolveum.midpoint.repo.sql.query.QueryException; diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/ObjectRetriever.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/ObjectRetriever.java index 109a4738340..4d0e8579dab 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/ObjectRetriever.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/ObjectRetriever.java @@ -19,7 +19,7 @@ import com.evolveum.midpoint.common.InternalsConfig; import com.evolveum.midpoint.common.crypto.CryptoUtil; import com.evolveum.midpoint.prism.*; -import com.evolveum.midpoint.prism.parser.XNodeProcessorEvaluationMode; +import com.evolveum.midpoint.prism.marshaller.XNodeProcessorEvaluationMode; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.query.ExistsFilter; import com.evolveum.midpoint.prism.query.ObjectFilter; diff --git a/testing/sanity/src/test/java/com/evolveum/midpoint/testing/sanity/TestSanity.java b/testing/sanity/src/test/java/com/evolveum/midpoint/testing/sanity/TestSanity.java index a710f7ae43d..68ad79a6ca1 100644 --- a/testing/sanity/src/test/java/com/evolveum/midpoint/testing/sanity/TestSanity.java +++ b/testing/sanity/src/test/java/com/evolveum/midpoint/testing/sanity/TestSanity.java @@ -64,7 +64,6 @@ import org.opends.server.types.ModificationType; import org.opends.server.types.RawModification; import org.opends.server.types.ResultCode; -import org.opends.server.types.Entry; import org.opends.server.types.SearchScope; import org.opends.server.util.ChangeRecordEntry; import org.springframework.beans.factory.annotation.Autowired; @@ -97,7 +96,7 @@ import com.evolveum.midpoint.prism.match.MatchingRule; import com.evolveum.midpoint.prism.match.MatchingRuleRegistry; import com.evolveum.midpoint.prism.match.StringIgnoreCaseMatchingRule; -import com.evolveum.midpoint.prism.parser.util.XNodeProcessorUtil; +import com.evolveum.midpoint.prism.marshaller.XNodeProcessorUtil; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.prism.query.QueryJaxbConvertor; diff --git a/testing/sanity/src/test/java/com/evolveum/midpoint/testing/sanity/TestSanityLegacy.java b/testing/sanity/src/test/java/com/evolveum/midpoint/testing/sanity/TestSanityLegacy.java index 145815c9159..4a78714a564 100644 --- a/testing/sanity/src/test/java/com/evolveum/midpoint/testing/sanity/TestSanityLegacy.java +++ b/testing/sanity/src/test/java/com/evolveum/midpoint/testing/sanity/TestSanityLegacy.java @@ -59,7 +59,6 @@ import org.opends.server.types.ModificationType; import org.opends.server.types.RawModification; import org.opends.server.types.ResultCode; -import org.opends.server.types.Entry; import org.opends.server.types.SearchScope; import org.opends.server.util.ChangeRecordEntry; import org.springframework.beans.factory.annotation.Autowired; @@ -92,7 +91,7 @@ import com.evolveum.midpoint.prism.match.MatchingRule; import com.evolveum.midpoint.prism.match.MatchingRuleRegistry; import com.evolveum.midpoint.prism.match.StringIgnoreCaseMatchingRule; -import com.evolveum.midpoint.prism.parser.util.XNodeProcessorUtil; +import com.evolveum.midpoint.prism.marshaller.XNodeProcessorUtil; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.prism.query.QueryJaxbConvertor; From eecd3b75d5994b01b88d1b3aced0418f6cab892c Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Mon, 26 Sep 2016 15:45:07 +0200 Subject: [PATCH 04/74] Restructuring parsing-related classes. --- .../evolveum/midpoint/prism/PrismContext.java | 3 ++ .../midpoint/prism/json/AbstractParser.java | 2 -- .../prism/json/PrismJasonProcessor.java | 10 ------- .../prism/marshaller/JaxbDomHack.java | 2 +- .../prism/marshaller/PrismBeanConverter.java | 2 +- .../prism/parser/{ => dom}/DomParser.java | 5 ++-- .../prism/parser/{ => dom}/DomSerializer.java | 5 ++-- .../parser/{ => json}/AbstractParser.java | 24 +++++++++++---- .../prism/parser/{ => json}/JsonParser.java | 22 ++++++++++---- .../prism/parser/json/QNameDeserializer.java | 4 --- .../prism/parser/{ => json}/YamlParser.java | 29 ++++++++++++------- .../{ => json}/yaml/MidpointYAMLFactory.java | 2 +- .../yaml/MidpointYAMLGenerator.java | 2 +- .../{ => json}/yaml/MidpointYAMLParser.java | 2 +- .../midpoint/prism/util/PrismUtil.java | 2 +- .../midpoint/prism/xjc/PrismForJAXBUtil.java | 2 +- .../ns/_public/query_3/SearchFilterType.java | 2 +- .../midpoint/prism/parser/TestDomParser.java | 5 +--- .../midpoint/prism/parser/TestJsonParser.java | 3 +- .../midpoint/prism/parser/TestYamlParser.java | 1 + .../midpoint/schema/TestParseResource.java | 2 +- .../midpoint/schema/TestParseUser.java | 4 --- .../xpath/LazyXPathVariableResolver.java | 2 +- .../midpoint/tools/ninja/ExportObjects.java | 6 ---- 24 files changed, 75 insertions(+), 68 deletions(-) rename infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/{ => dom}/DomParser.java (99%) rename infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/{ => dom}/DomSerializer.java (99%) rename infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/{ => json}/AbstractParser.java (96%) rename infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/{ => json}/JsonParser.java (86%) rename infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/{ => json}/YamlParser.java (88%) rename infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/{ => json}/yaml/MidpointYAMLFactory.java (95%) rename infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/{ => json}/yaml/MidpointYAMLGenerator.java (96%) rename infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/{ => json}/yaml/MidpointYAMLParser.java (96%) diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java index 3d3fcfdb52d..693c22ea026 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java @@ -19,6 +19,9 @@ import com.evolveum.midpoint.prism.delta.ObjectDelta; import com.evolveum.midpoint.prism.marshaller.*; import com.evolveum.midpoint.prism.parser.*; +import com.evolveum.midpoint.prism.parser.dom.DomParser; +import com.evolveum.midpoint.prism.parser.json.JsonParser; +import com.evolveum.midpoint.prism.parser.json.YamlParser; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.polystring.PolyStringNormalizer; import com.evolveum.midpoint.prism.polystring.PrismDefaultPolyStringNormalizer; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/json/AbstractParser.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/json/AbstractParser.java index 99ba08c0aab..8bf137eb1af 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/json/AbstractParser.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/json/AbstractParser.java @@ -34,8 +34,6 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectReader; import com.fasterxml.jackson.databind.module.SimpleModule; -import com.fasterxml.jackson.databind.util.TokenBuffer; -import com.fasterxml.jackson.dataformat.yaml.YAMLParser; public abstract class AbstractParser implements Parser { diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/json/PrismJasonProcessor.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/json/PrismJasonProcessor.java index e3c37fe5cb5..66d4d10ab25 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/json/PrismJasonProcessor.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/json/PrismJasonProcessor.java @@ -27,8 +27,6 @@ import java.util.List; import java.util.Map.Entry; -import javax.activation.DataHandler; -import javax.xml.bind.JAXBElement; import javax.xml.namespace.QName; import org.w3c.dom.Element; @@ -68,30 +66,22 @@ import com.fasterxml.jackson.core.JsonFactory; import com.fasterxml.jackson.core.JsonGenerationException; import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.core.JsonGenerator.Feature; import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.PrettyPrinter; import com.fasterxml.jackson.core.Version; import com.fasterxml.jackson.core.util.DefaultPrettyPrinter; -import com.fasterxml.jackson.databind.AnnotationIntrospector.ReferenceProperty.Type; -import com.fasterxml.jackson.databind.Module.SetupContext; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.MapperFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectReader; import com.fasterxml.jackson.databind.ObjectWriter; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.module.SimpleModule; -import com.fasterxml.jackson.databind.type.TypeFactory; import com.fasterxml.jackson.module.jaxb.JaxbAnnotationIntrospector; -import com.fasterxml.jackson.module.jaxb.JaxbAnnotationModule; import com.fasterxml.jackson.module.jaxb.deser.DomElementJsonDeserializer; -import com.fasterxml.jackson.module.jaxb.ser.DataHandlerJsonSerializer; -import com.fasterxml.jackson.module.jaxb.ser.DomElementJsonSerializer; public class PrismJasonProcessor { diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/JaxbDomHack.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/JaxbDomHack.java index c5f0812380a..73ed5ccddb8 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/JaxbDomHack.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/JaxbDomHack.java @@ -21,7 +21,7 @@ import javax.xml.namespace.QName; import com.evolveum.midpoint.prism.*; -import com.evolveum.midpoint.prism.parser.DomParser; +import com.evolveum.midpoint.prism.parser.dom.DomParser; import com.evolveum.midpoint.util.logging.LoggingUtils; import org.apache.commons.lang.StringUtils; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismBeanConverter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismBeanConverter.java index 3a0e47adcdc..accb2ae09e0 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismBeanConverter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismBeanConverter.java @@ -16,7 +16,7 @@ package com.evolveum.midpoint.prism.marshaller; import com.evolveum.midpoint.prism.*; -import com.evolveum.midpoint.prism.parser.DomParser; +import com.evolveum.midpoint.prism.parser.dom.DomParser; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.prism.schema.SchemaRegistry; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/DomParser.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/dom/DomParser.java similarity index 99% rename from infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/DomParser.java rename to infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/dom/DomParser.java index b55e6764cbb..c306e21d12f 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/DomParser.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/dom/DomParser.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014 Evolveum + * Copyright (c) 2010-2016 Evolveum * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.evolveum.midpoint.prism.parser; +package com.evolveum.midpoint.prism.parser.dom; import java.io.File; import java.io.IOException; @@ -31,6 +31,7 @@ import com.evolveum.midpoint.prism.marshaller.XNodeProcessorEvaluationMode; import com.evolveum.midpoint.prism.marshaller.XPathHolder; +import com.evolveum.midpoint.prism.parser.Parser; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; import org.apache.commons.lang.StringUtils; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/DomSerializer.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/dom/DomSerializer.java similarity index 99% rename from infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/DomSerializer.java rename to infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/dom/DomSerializer.java index 7b3cd4f414d..1928ce2ded2 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/DomSerializer.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/dom/DomSerializer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 Evolveum + * Copyright (c) 2010-2016 Evolveum * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,9 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.evolveum.midpoint.prism.parser; +package com.evolveum.midpoint.prism.parser.dom; import com.evolveum.midpoint.prism.marshaller.XPathHolder; +import com.evolveum.midpoint.prism.parser.dom.DomParser; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.schema.SchemaRegistry; import com.evolveum.midpoint.prism.xml.DynamicNamespacePrefixMapper; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/AbstractParser.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/AbstractParser.java similarity index 96% rename from infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/AbstractParser.java rename to infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/AbstractParser.java index 4da739d7f01..9dde4a0106c 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/AbstractParser.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/AbstractParser.java @@ -1,4 +1,20 @@ -package com.evolveum.midpoint.prism.parser; +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.prism.parser.json; import java.io.*; import java.util.Collection; @@ -8,6 +24,7 @@ import javax.xml.namespace.QName; +import com.evolveum.midpoint.prism.parser.Parser; import com.evolveum.midpoint.util.logging.LoggingUtils; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; @@ -16,11 +33,6 @@ import org.w3c.dom.Element; import org.w3c.dom.Node; -import com.evolveum.midpoint.prism.parser.json.ItemPathDeserializer; -import com.evolveum.midpoint.prism.parser.json.ItemPathTypeDeserializer; -import com.evolveum.midpoint.prism.parser.json.JsonValueParser; -import com.evolveum.midpoint.prism.parser.json.PolyStringDeserializer; -import com.evolveum.midpoint.prism.parser.json.QNameDeserializer; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.prism.xnode.ListXNode; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/JsonParser.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/JsonParser.java similarity index 86% rename from infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/JsonParser.java rename to infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/JsonParser.java index 8ee5fde6e92..cdc1aef0aeb 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/JsonParser.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/JsonParser.java @@ -1,16 +1,28 @@ -package com.evolveum.midpoint.prism.parser; +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.prism.parser.json; import java.io.File; -import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.StringWriter; import javax.xml.namespace.QName; -import com.evolveum.midpoint.prism.parser.json.ItemPathSerializer; -import com.evolveum.midpoint.prism.parser.json.PolyStringSerializer; -import com.evolveum.midpoint.prism.parser.json.QNameSerializer; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.prism.xnode.PrimitiveXNode; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/QNameDeserializer.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/QNameDeserializer.java index 2710532036d..bc451da193f 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/QNameDeserializer.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/QNameDeserializer.java @@ -1,21 +1,17 @@ package com.evolveum.midpoint.prism.parser.json; import java.io.IOException; -import java.util.Iterator; -import java.util.Map.Entry; import javax.xml.namespace.QName; import com.evolveum.midpoint.util.QNameUtil; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.core.JsonToken; import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.JsonDeserializer; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.jsontype.TypeDeserializer; -import com.fasterxml.jackson.databind.node.TreeTraversingParser; public class QNameDeserializer extends JsonDeserializer{ diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/YamlParser.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/YamlParser.java similarity index 88% rename from infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/YamlParser.java rename to infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/YamlParser.java index de85a41bc39..443a9096665 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/YamlParser.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/YamlParser.java @@ -1,7 +1,23 @@ -package com.evolveum.midpoint.prism.parser; +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.prism.parser.json; + +import com.evolveum.midpoint.prism.parser.json.yaml.*; import java.io.File; -import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.StringWriter; @@ -11,14 +27,6 @@ import org.w3c.dom.Element; -import com.evolveum.midpoint.prism.parser.json.DomElementSerializer; -import com.evolveum.midpoint.prism.parser.json.ItemPathSerializer; -import com.evolveum.midpoint.prism.parser.json.PolyStringSerializer; -import com.evolveum.midpoint.prism.parser.json.QNameSerializer; -import com.evolveum.midpoint.prism.parser.json.XmlGregorialCalendarSerializer; -import com.evolveum.midpoint.prism.parser.yaml.MidpointYAMLGenerator; -import com.evolveum.midpoint.prism.parser.yaml.MidpointYAMLFactory; -import com.evolveum.midpoint.prism.parser.yaml.MidpointYAMLParser; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.prism.xnode.PrimitiveXNode; @@ -35,7 +43,6 @@ import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.dataformat.yaml.YAMLGenerator; -import com.fasterxml.jackson.dataformat.yaml.YAMLParser; //import com.fasterxml.jackson.core.YAMLGenerator; public class YamlParser extends AbstractParser { diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/yaml/MidpointYAMLFactory.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/yaml/MidpointYAMLFactory.java similarity index 95% rename from infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/yaml/MidpointYAMLFactory.java rename to infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/yaml/MidpointYAMLFactory.java index 7cdf26a726f..36e5706b039 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/yaml/MidpointYAMLFactory.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/yaml/MidpointYAMLFactory.java @@ -1,4 +1,4 @@ -package com.evolveum.midpoint.prism.parser.yaml; +package com.evolveum.midpoint.prism.parser.json.yaml; import java.io.IOException; import java.io.InputStream; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/yaml/MidpointYAMLGenerator.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/yaml/MidpointYAMLGenerator.java similarity index 96% rename from infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/yaml/MidpointYAMLGenerator.java rename to infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/yaml/MidpointYAMLGenerator.java index 426ac008904..858d2477e8a 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/yaml/MidpointYAMLGenerator.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/yaml/MidpointYAMLGenerator.java @@ -1,4 +1,4 @@ -package com.evolveum.midpoint.prism.parser.yaml; +package com.evolveum.midpoint.prism.parser.json.yaml; import com.fasterxml.jackson.core.ObjectCodec; import com.fasterxml.jackson.core.io.IOContext; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/yaml/MidpointYAMLParser.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/yaml/MidpointYAMLParser.java similarity index 96% rename from infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/yaml/MidpointYAMLParser.java rename to infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/yaml/MidpointYAMLParser.java index 4d33bea196e..95ca0425de1 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/yaml/MidpointYAMLParser.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/yaml/MidpointYAMLParser.java @@ -1,4 +1,4 @@ -package com.evolveum.midpoint.prism.parser.yaml; +package com.evolveum.midpoint.prism.parser.json.yaml; import java.io.IOException; import java.io.Reader; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/PrismUtil.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/PrismUtil.java index 1aa010b0448..e2d65896131 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/PrismUtil.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/PrismUtil.java @@ -26,7 +26,7 @@ import com.evolveum.midpoint.prism.PrismPropertyValue; import com.evolveum.midpoint.prism.PrismValue; import com.evolveum.midpoint.prism.delta.ItemDelta; -import com.evolveum.midpoint.prism.parser.DomParser; +import com.evolveum.midpoint.prism.parser.dom.DomParser; import com.evolveum.midpoint.prism.marshaller.PrismBeanConverter; import com.evolveum.midpoint.prism.marshaller.XNodeProcessor; import com.evolveum.midpoint.prism.polystring.PolyString; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xjc/PrismForJAXBUtil.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xjc/PrismForJAXBUtil.java index c0cb3c2a2f4..e953d7d8046 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xjc/PrismForJAXBUtil.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xjc/PrismForJAXBUtil.java @@ -17,7 +17,7 @@ package com.evolveum.midpoint.prism.xjc; import com.evolveum.midpoint.prism.*; -import com.evolveum.midpoint.prism.parser.DomParser; +import com.evolveum.midpoint.prism.parser.dom.DomParser; import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.prism.xnode.MapXNode; import com.evolveum.midpoint.util.exception.SchemaException; diff --git a/infra/prism/src/main/java/com/evolveum/prism/xml/ns/_public/query_3/SearchFilterType.java b/infra/prism/src/main/java/com/evolveum/prism/xml/ns/_public/query_3/SearchFilterType.java index 2158493fd77..e0d286d6bae 100644 --- a/infra/prism/src/main/java/com/evolveum/prism/xml/ns/_public/query_3/SearchFilterType.java +++ b/infra/prism/src/main/java/com/evolveum/prism/xml/ns/_public/query_3/SearchFilterType.java @@ -41,7 +41,7 @@ import com.evolveum.midpoint.prism.PrismConstants; import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.parser.DomParser; +import com.evolveum.midpoint.prism.parser.dom.DomParser; import com.evolveum.midpoint.prism.marshaller.QueryConvertor; import com.evolveum.midpoint.prism.util.PrismUtil; import com.evolveum.midpoint.prism.xnode.MapXNode; diff --git a/infra/prism/src/test/java/com/evolveum/midpoint/prism/parser/TestDomParser.java b/infra/prism/src/test/java/com/evolveum/midpoint/prism/parser/TestDomParser.java index ca97176e2be..664c0c64fa1 100644 --- a/infra/prism/src/test/java/com/evolveum/midpoint/prism/parser/TestDomParser.java +++ b/infra/prism/src/test/java/com/evolveum/midpoint/prism/parser/TestDomParser.java @@ -20,16 +20,13 @@ import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertTrue; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; import java.io.IOException; -import javax.xml.namespace.QName; import javax.xml.transform.dom.DOMSource; import javax.xml.validation.Schema; import javax.xml.validation.Validator; +import com.evolveum.midpoint.prism.parser.dom.DomParser; import org.testng.annotations.Test; import org.w3c.dom.Document; import org.xml.sax.SAXException; diff --git a/infra/prism/src/test/java/com/evolveum/midpoint/prism/parser/TestJsonParser.java b/infra/prism/src/test/java/com/evolveum/midpoint/prism/parser/TestJsonParser.java index 75d40aae1f0..18f95a19ebd 100644 --- a/infra/prism/src/test/java/com/evolveum/midpoint/prism/parser/TestJsonParser.java +++ b/infra/prism/src/test/java/com/evolveum/midpoint/prism/parser/TestJsonParser.java @@ -1,9 +1,8 @@ package com.evolveum.midpoint.prism.parser; +import com.evolveum.midpoint.prism.parser.json.JsonParser; import org.testng.annotations.Test; -import com.evolveum.midpoint.prism.util.PrismTestUtil; - public class TestJsonParser extends AbstractParserTest { @Override diff --git a/infra/prism/src/test/java/com/evolveum/midpoint/prism/parser/TestYamlParser.java b/infra/prism/src/test/java/com/evolveum/midpoint/prism/parser/TestYamlParser.java index fda6d14a069..765b5ace091 100644 --- a/infra/prism/src/test/java/com/evolveum/midpoint/prism/parser/TestYamlParser.java +++ b/infra/prism/src/test/java/com/evolveum/midpoint/prism/parser/TestYamlParser.java @@ -1,5 +1,6 @@ package com.evolveum.midpoint.prism.parser; +import com.evolveum.midpoint.prism.parser.json.YamlParser; import org.testng.annotations.Test; public class TestYamlParser extends AbstractParserTest{ diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseResource.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseResource.java index f22dd888341..ff5ec7a8bd8 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseResource.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseResource.java @@ -21,7 +21,7 @@ import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.delta.ObjectDelta; -import com.evolveum.midpoint.prism.parser.DomParser; +import com.evolveum.midpoint.prism.parser.dom.DomParser; import com.evolveum.midpoint.prism.marshaller.QueryConvertor; import com.evolveum.midpoint.prism.marshaller.XNodeProcessor; import com.evolveum.midpoint.prism.path.ItemPath; diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseUser.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseUser.java index fb8bf2c4b9b..cf69ab64f26 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseUser.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseUser.java @@ -26,9 +26,6 @@ import javax.xml.namespace.QName; -import com.evolveum.midpoint.prism.parser.DomParser; -import com.evolveum.midpoint.prism.util.PrismUtil; -import com.evolveum.midpoint.prism.xnode.MapXNode; import org.testng.annotations.BeforeSuite; import org.testng.annotations.Test; import org.w3c.dom.Element; @@ -49,7 +46,6 @@ import com.evolveum.midpoint.prism.delta.ObjectDelta; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.polystring.PolyString; -import com.evolveum.midpoint.prism.query.ObjectFilter; import com.evolveum.midpoint.prism.util.PrismAsserts; import com.evolveum.midpoint.prism.util.PrismTestUtil; import com.evolveum.midpoint.schema.constants.MidPointConstants; diff --git a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/script/xpath/LazyXPathVariableResolver.java b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/script/xpath/LazyXPathVariableResolver.java index 1376d22e79d..851fb7e7416 100644 --- a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/script/xpath/LazyXPathVariableResolver.java +++ b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/script/xpath/LazyXPathVariableResolver.java @@ -22,7 +22,7 @@ import javax.xml.namespace.QName; import javax.xml.xpath.XPathVariableResolver; -import com.evolveum.midpoint.prism.parser.DomParser; +import com.evolveum.midpoint.prism.parser.dom.DomParser; import org.w3c.dom.Element; import org.w3c.dom.Node; diff --git a/tools/repo-ninja/src/main/java/com/evolveum/midpoint/tools/ninja/ExportObjects.java b/tools/repo-ninja/src/main/java/com/evolveum/midpoint/tools/ninja/ExportObjects.java index 8aafabffa81..f058a6a3cbd 100644 --- a/tools/repo-ninja/src/main/java/com/evolveum/midpoint/tools/ninja/ExportObjects.java +++ b/tools/repo-ninja/src/main/java/com/evolveum/midpoint/tools/ninja/ExportObjects.java @@ -3,28 +3,22 @@ import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.PrismProperty; -import com.evolveum.midpoint.prism.parser.DomSerializer; import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.repo.api.RepositoryService; import com.evolveum.midpoint.schema.ResultHandler; import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.SchemaConstantsGenerated; import com.evolveum.midpoint.schema.result.OperationResult; -import com.evolveum.midpoint.util.DOMUtil; -import com.evolveum.midpoint.util.logging.LoggingUtils; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; import org.apache.commons.io.IOUtils; import org.springframework.context.support.ClassPathXmlApplicationContext; -import org.w3c.dom.Element; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; -import java.util.ArrayList; -import java.util.List; /** * @author lazyman From 97bab623aa7b87619243b8eb7a54a754337da96e Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Tue, 27 Sep 2016 10:43:10 +0200 Subject: [PATCH 05/74] First attempt at "immutable" flag in prism structures. --- .../com/evolveum/midpoint/prism/Item.java | 60 ++++- .../midpoint/prism/PrismContainer.java | 15 +- .../midpoint/prism/PrismContainerValue.java | 35 ++- .../evolveum/midpoint/prism/PrismObject.java | 2 + .../midpoint/prism/PrismProperty.java | 16 +- .../midpoint/prism/PrismPropertyValue.java | 4 +- .../midpoint/prism/PrismReferenceValue.java | 11 +- .../evolveum/midpoint/prism/PrismValue.java | 25 +- .../midpoint/schema/TestImmutable.java | 239 ++++++++++++++++++ 9 files changed, 374 insertions(+), 33 deletions(-) create mode 100644 infra/schema/src/test/java/com/evolveum/midpoint/schema/TestImmutable.java diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/Item.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/Item.java index 79be40a3c87..482a1127a21 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/Item.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/Item.java @@ -29,14 +29,7 @@ import java.io.Serializable; import java.lang.reflect.Constructor; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Comparator; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - +import java.util.*; /** * Item is a common abstraction of Property and PropertyContainer. @@ -60,6 +53,8 @@ public abstract class Item imple protected D definition; private List values = new ArrayList(); private transient Map userData = new HashMap<>();; + + protected boolean immutable; protected transient PrismContext prismContext; // beware, this one can easily be null @@ -134,9 +129,10 @@ public QName getElementName() { *

* The name is the QName of XML element in the XML representation. * - * @param name the name to set + * @param elementName the name to set */ public void setElementName(QName elementName) { + checkMutability(); this.elementName = elementName; } @@ -146,6 +142,7 @@ public void setElementName(QName elementName) { * @param definition the definition to set */ public void setDefinition(D definition) { + checkMutability(); checkDefinition(definition); this.definition = definition; } @@ -201,6 +198,8 @@ public void setParent(PrismValue parentValue) { if (this.parent != null && parentValue != null && this.parent != parentValue) { throw new IllegalStateException("Attempt to reset parent of item "+this+" from "+this.parent+" to "+parentValue); } + // Immutability check can be skipped, as setting the parent doesn't alter this object. + // However, if existing parent itself is immutable, adding/removing its child item will cause the exception. this.parent = parentValue; } @@ -215,14 +214,20 @@ public Map getUserData() { if (userData == null) { userData = new HashMap<>(); } - return userData; + if (immutable) { + return Collections.unmodifiableMap(userData); // TODO beware, objects in userData themselves are mutable + } else { + return userData; + } } public Object getUserData(String key) { + // TODO make returned data immutable (?) return getUserData().get(key); } public void setUserData(String key, Object value) { + checkMutability(); getUserData().put(key, value); } @@ -370,6 +375,7 @@ public int size() { } public boolean addAll(Collection newValues) throws SchemaException { + checkMutability(); // TODO consider weaker condition, like testing if there's a real change boolean changed = false; for (V val: newValues) { if (add(val)) { @@ -384,6 +390,7 @@ public boolean add(V newValue) throws SchemaException { } public boolean add(V newValue, boolean checkUniqueness) throws SchemaException { + checkMutability(); newValue.setParent(this); if (checkUniqueness && containsEquivalentValue(newValue)) { return false; @@ -395,6 +402,7 @@ public boolean add(V newValue, boolean checkUniqueness) throws SchemaException { } public boolean removeAll(Collection newValues) { + checkMutability(); // TODO consider if there is real change boolean changed = false; for (V val: newValues) { if (remove(val)) { @@ -405,6 +413,7 @@ public boolean removeAll(Collection newValues) { } public boolean remove(V newValue) { + checkMutability(); // TODO consider if there is real change boolean changed = false; Iterator iterator = values.iterator(); while (iterator.hasNext()) { @@ -418,26 +427,31 @@ public boolean remove(V newValue) { } public V remove(int index) { + checkMutability(); // TODO consider if there is real change return values.remove(index); } public void replaceAll(Collection newValues) throws SchemaException { + checkMutability(); // TODO consider if there is real change values.clear(); addAll(newValues); } public void replace(V newValue) { + checkMutability(); // TODO consider if there is real change values.clear(); newValue.setParent(this); values.add(newValue); } public void clear() { - values.clear(); + checkMutability(); // TODO consider if there is real change + values.clear(); } public void normalize() { - Iterator iterator = values.iterator(); + checkMutability(); // TODO consider if there is real change + Iterator iterator = values.iterator(); while (iterator.hasNext()) { V value = iterator.next(); value.normalize(); @@ -570,6 +584,7 @@ public void applyDefinition(D definition) throws SchemaException { } public void applyDefinition(D definition, boolean force) throws SchemaException { + checkMutability(); // TODO consider if there is real change if (definition != null) { checkDefinition(definition); } @@ -607,6 +622,7 @@ protected void copyValues(Item clone) { // another item clone.parent = null; clone.userData = MiscUtil.cloneMap(this.userData); + // Also do not copy 'immutable' flag so the clone is free to be modified } protected void propagateDeepCloneDefinition(boolean ultraDeep, D clonedDefinition) { @@ -887,11 +903,27 @@ public String debugDump(int indent) { return sb.toString(); } - /** + /** * Return a human readable name of this class suitable for logs. */ protected String getDebugDumpClassName() { return "Item"; } - + + public boolean isImmutable() { + return immutable; + } + + public void setImmutable(boolean immutable) { + this.immutable = immutable; + for (V value : getValues()) { + value.setImmutable(immutable); + } + } + + protected void checkMutability() { + if (immutable) { + throw new IllegalStateException("An attempt to modify an immutable item: " + toString()); + } + } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainer.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainer.java index 3ab0566ab94..a2cd0c5b281 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainer.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainer.java @@ -170,6 +170,7 @@ public PrismContainerValue getValue() { } public void setValue(PrismContainerValue value) throws SchemaException { + checkMutability(); if (getDefinition() != null) { if (getDefinition().isSingleValue()) { clear(); @@ -185,6 +186,7 @@ public void setValue(PrismContainerValue value) throws SchemaException { @Override public boolean add(PrismContainerValue newValue, boolean checkUniqueness) throws SchemaException { + checkMutability(); // when a context-less item is added to a contextful container, it is automatically adopted if (newValue.getPrismContext() == null && this.prismContext != null) { prismContext.adopt(newValue); @@ -232,6 +234,7 @@ public PrismContainerValue getValue(Long id) { } public void setPropertyRealValue(QName propertyName, Object realValue) throws SchemaException { + checkMutability(); PrismProperty property = findOrCreateProperty(propertyName); property.setRealValue(realValue); } @@ -252,10 +255,12 @@ public T getPropertyRealValue(ItemPath propertyPath, Class type) { * Convenience method. Works only on single-valued containers. */ public void add(Item item) throws SchemaException { + checkMutability(); getValue().add(item); } public PrismContainerValue createNewValue() { + checkMutability(); PrismContainerValue pValue = new PrismContainerValue(prismContext); try { // No need to check uniqueness, we know that this value is new and therefore @@ -281,6 +286,7 @@ public void mergeValues(Collection> otherValues) throws S } public void mergeValue(PrismContainerValue otherValue) throws SchemaException { + checkMutability(); Iterator> iterator = getValues().iterator(); while (iterator.hasNext()) { PrismContainerValue thisValue = iterator.next(); @@ -304,10 +310,11 @@ public void mergeValue(PrismContainerValue otherValue) throws SchemaException * Remove all empty values */ public void trim() { - Iterator> iterator = getValues().iterator(); + Iterator> iterator = getValues().iterator(); while (iterator.hasNext()) { PrismContainerValue pval = iterator.next(); if (pval.isEmpty()) { + checkMutability(); iterator.remove(); } } @@ -331,11 +338,13 @@ public PrismContainerDefinition getDefinition() { * @param definition the definition to set */ public void setDefinition(PrismContainerDefinition definition) { - this.definition = definition; + checkMutability(); + this.definition = definition; } @Override public void applyDefinition(PrismContainerDefinition definition) throws SchemaException { + checkMutability(); if (definition == null) { return; } @@ -840,7 +849,7 @@ public String debugDump(int indent) { sb.append(")"); } } - Iterator> i = getValues().iterator(); + Iterator> i = getValues().iterator(); if (i.hasNext()) { sb.append("\n"); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerValue.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerValue.java index b4dd94e90eb..be8c49803d6 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerValue.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerValue.java @@ -205,6 +205,7 @@ public Long getId() { } public void setId(Long id) { + checkMutability(); this.id = id; } @@ -347,6 +348,7 @@ public boolean add(Item * @throws IllegalArgumentException an attempt to add value that already exists */ public boolean add(Item item, boolean checkUniquness) throws SchemaException { + checkMutability(); if (item.getElementName() == null) { throw new IllegalArgumentException("Cannot add item without a name to value of container "+getParent()); } @@ -372,6 +374,7 @@ public boolean add(Item * Returns true if new item or value was added. */ public boolean merge(Item item) throws SchemaException { + checkMutability(); Item exisingItem = findItem(item.getElementName(), Item.class); if (exisingItem == null) { return add(item); @@ -387,11 +390,12 @@ public boolean merge(Item boolean substract(Item item) throws SchemaException { + checkMutability(); Item exisingItem = findItem(item.getElementName(), Item.class); if (exisingItem == null) { return false; @@ -412,6 +416,7 @@ public boolean substract(Item< * @param item item to add. */ public void addReplaceExisting(Item item) throws SchemaException { + checkMutability(); if (item == null){ return; } @@ -425,6 +430,7 @@ public void addReplaceExisting public void remove(Item item) { Validate.notNull(item, "Item must not be null."); + checkMutability(); Item existingItem = findItem(item.getElementName(), Item.class); if (existingItem != null && items != null) { @@ -434,6 +440,7 @@ public void remove(Item } public void removeAll() { + checkMutability(); if (items == null){ return; } @@ -463,6 +470,7 @@ public void addAll(Collection> itemsToAdd) throws SchemaExce * @param itemsToAdd items to add */ public void addAllReplaceExisting(Collection> itemsToAdd) throws SchemaException { + checkMutability(); // Check for conflicts, remove conflicting values for (Item item : itemsToAdd) { Item existingItem = findItem(item.getElementName(), Item.class); @@ -494,6 +502,7 @@ public void replace(Item Item findItemBy } private > I createSubItem(QName name, Class type, ID itemDefinition) throws SchemaException { + checkMutability(); // the item with specified name does not exist, create it now I newItem = null; @@ -815,6 +825,7 @@ public PrismProperty findOrCreateProperty(PrismPropertyDefinition propert // } public PrismContainer createContainer(QName containerName) throws SchemaException { + checkMutability(); if (getActualDefinition() == null) { throw new IllegalStateException("No definition of container "+containerName); } @@ -828,6 +839,7 @@ public PrismContainer createContainer(QName contain } public PrismProperty createProperty(QName propertyName) throws SchemaException { + checkMutability(); PrismPropertyDefinition propertyDefinition = null; if (getActualDefinition() != null) { propertyDefinition = getActualDefinition().findPropertyDefinition(propertyName); @@ -885,6 +897,7 @@ public void removeReference(ItemPath path) { // Expects that "self" path is NOT present in propPath > void removeItem(ItemPath propPath, Class itemType) { + checkMutability(); if (items == null){ return; } @@ -914,6 +927,7 @@ > void rem } public void setPropertyRealValue(QName propertyName, Object realValue, PrismContext prismContext) throws SchemaException { + checkMutability(); PrismProperty property = findOrCreateProperty(propertyName); property.setRealValue(realValue); if (property.getPrismContext() == null) { @@ -1059,6 +1073,7 @@ public List getRawElements() { } public boolean addRawElement(Object element) throws SchemaException { + checkMutability(); PrismContainerDefinition definition = getDefinition(); if (definition == null) { // We cannot do much better. We do not even have prism context here. @@ -1077,6 +1092,7 @@ public boolean addRawElement(Object element) throws SchemaException { } public boolean deleteRawElement(Object element) throws SchemaException { + checkMutability(); PrismContainerDefinition definition = getDefinition(); if (definition == null) { // We cannot do much better. We do not even have prism context here. @@ -1093,6 +1109,7 @@ public boolean deleteRawElement(Object element) throws SchemaException { public boolean removeRawElement(Object element) { + checkMutability(); return rawElements.remove(element); } @@ -1162,6 +1179,7 @@ protected PrismContainerDefinition getDefinition() { @Override public void applyDefinition(ItemDefinition definition, boolean force) throws SchemaException { + checkMutability(); if (!(definition instanceof PrismContainerDefinition)) { throw new IllegalArgumentException("Cannot apply "+definition+" to container " + this); } @@ -1169,6 +1187,7 @@ public void applyDefinition(ItemDefinition definition, boolean force) throws Sch } public void applyDefinition(PrismContainerDefinition containerDef, boolean force) throws SchemaException { + checkMutability(); PrismContainerDefinition valueDefinition = getConcreteTypeDefinition(); if (valueDefinition == null) { valueDefinition = containerDef; @@ -1256,6 +1275,7 @@ public boolean isEmpty() { @Override public void normalize() { + checkMutability(); if (items != null) { Iterator> iterator = items.iterator(); while (iterator.hasNext()) { @@ -1469,7 +1489,7 @@ public String debugDump(int indent) { sb.append("id=").append(PrettyPrinter.prettyPrint(getId())); } appendOriginDump(sb); - List> items = getItems(); + List> items = getItems(); if (items != null) { Iterator> i = getItems().iterator(); if (wasIndent && i.hasNext()) { @@ -1582,5 +1602,14 @@ public static List> toPcvList(L } return rv; } - + + @Override + public void setImmutable(boolean immutable) { + super.setImmutable(immutable); + if (items != null) { + for (Item item : items) { + item.setImmutable(immutable); + } + } + } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismObject.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismObject.java index b056c102378..b6b183efbf6 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismObject.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismObject.java @@ -84,6 +84,7 @@ public String getOid() { } public void setOid(String oid) { + checkMutability(); this.oid = oid; } @@ -92,6 +93,7 @@ public String getVersion() { } public void setVersion(String version) { + checkMutability(); this.version = version; } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismProperty.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismProperty.java index 8105fbb3c8d..917b7a63015 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismProperty.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismProperty.java @@ -24,8 +24,6 @@ import com.evolveum.midpoint.util.DebugUtil; import com.evolveum.midpoint.util.MiscUtil; import com.evolveum.midpoint.util.PrettyPrinter; -import com.evolveum.midpoint.util.exception.SchemaException; -import com.evolveum.midpoint.util.exception.SystemException; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; @@ -96,6 +94,7 @@ public PrismPropertyDefinition getDefinition() { * @param definition the definition to set */ public void setDefinition(PrismPropertyDefinition definition) { + checkMutability(); this.definition = definition; } @@ -230,7 +229,7 @@ public PrismPropertyValue getValue(Class type) { * Will remove all existing values. */ public void setValue(PrismPropertyValue value) { - getValues().clear(); + clear(); addValue(value); } @@ -253,7 +252,8 @@ public void addValues(Collection> pValuesToAdd) { } public void addValue(PrismPropertyValue pValueToAdd) { - pValueToAdd.checkValue(); + checkMutability(); + pValueToAdd.checkValue(); Iterator> iterator = getValues().iterator(); while (iterator.hasNext()) { PrismPropertyValue pValue = iterator.next(); @@ -273,7 +273,8 @@ public void addRealValue(T valueToAdd) { } public boolean deleteValues(Collection> pValuesToDelete) { - boolean changed = false; + checkMutability(); + boolean changed = false; for (PrismPropertyValue pValue: pValuesToDelete) { if (!changed) { changed = deleteValue(pValue); @@ -285,7 +286,8 @@ public boolean deleteValues(Collection> pValuesToDelete) { } public boolean deleteValue(PrismPropertyValue pValueToDelete) { - Iterator> iterator = getValues().iterator(); + checkMutability(); + Iterator> iterator = getValues().iterator(); boolean found = false; while (iterator.hasNext()) { PrismPropertyValue pValue = iterator.next(); @@ -303,7 +305,7 @@ public boolean deleteValue(PrismPropertyValue pValueToDelete) { } public void replaceValues(Collection> valuesToReplace) { - getValues().clear(); + clear(); addValues(valuesToReplace); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyValue.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyValue.java index 9caf074810c..45f9970af1f 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyValue.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyValue.java @@ -94,11 +94,12 @@ public static PrismPropertyValue createRaw(XNode rawElement) { public void setValue(T value) { + checkMutability(); this.value = value; checkValue(); } - public T getValue() { + public T getValue() { if (rawElement != null) { ItemDefinition def = null; Itemable parent = getParent(); @@ -196,6 +197,7 @@ public void recompute(PrismContext prismContext) { if (realValue == null) { return; } + checkMutability(); // TODO reconsider this PrismUtil.recomputeRealValue(realValue, prismContext); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismReferenceValue.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismReferenceValue.java index 268f1413a93..30b86d6a8b7 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismReferenceValue.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismReferenceValue.java @@ -20,7 +20,6 @@ import com.evolveum.midpoint.prism.path.ItemPathSegment; import com.evolveum.midpoint.prism.path.NameItemPathSegment; import com.evolveum.midpoint.prism.polystring.PolyString; -import com.evolveum.midpoint.prism.query.ObjectFilter; import com.evolveum.midpoint.util.DOMUtil; import com.evolveum.midpoint.util.DebugDumpable; import com.evolveum.midpoint.util.DebugUtil; @@ -36,7 +35,6 @@ import com.evolveum.prism.xml.ns._public.query_3.SearchFilterType; import com.evolveum.prism.xml.ns._public.types_3.EvaluationTimeType; import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; -import org.w3c.dom.Element; /** * @author Radovan Semancik @@ -95,6 +93,7 @@ public String getOid() { } public void setOid(String oid) { + checkMutability(); this.oid = oid; } @@ -103,6 +102,7 @@ public PrismObject getObject() { } public void setObject(PrismObject object) { + checkMutability(); this.object = object; } @@ -133,6 +133,7 @@ public void setTargetType(QName targetType) { * @param allowEmptyNamespace This is an ugly hack. See comment in DOMUtil.validateNonEmptyQName. */ public void setTargetType(QName targetType, boolean allowEmptyNamespace) { + checkMutability(); // Null value is OK if (targetType != null) { // But non-empty is not .. @@ -162,10 +163,12 @@ public PolyString getTargetName() { } public void setTargetName(PolyString name) { + checkMutability(); this.targetName = name; } public void setTargetName(PolyStringType name) { + checkMutability(); if (name == null) { this.targetName = null; } else { @@ -187,6 +190,7 @@ public QName getRelation() { } public void setRelation(QName relation) { + checkMutability(); this.relation = relation; } @@ -195,6 +199,7 @@ public String getDescription() { } public void setDescription(String description) { + checkMutability(); this.description = description; } @@ -203,6 +208,7 @@ public SearchFilterType getFilter() { } public void setFilter(SearchFilterType filter) { + checkMutability(); this.filter = filter; } @@ -211,6 +217,7 @@ public EvaluationTimeType getResolutionTime() { } public void setResolutionTime(EvaluationTimeType resolutionTime) { + checkMutability(); this.resolutionTime = resolutionTime; } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismValue.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismValue.java index 0275b824559..ead8b7656a1 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismValue.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismValue.java @@ -20,7 +20,6 @@ import com.evolveum.midpoint.util.DebugDumpable; import com.evolveum.midpoint.util.DebugUtil; import com.evolveum.midpoint.util.MiscUtil; -import com.evolveum.midpoint.util.PrettyPrinter; import com.evolveum.midpoint.util.exception.SchemaException; import org.w3c.dom.Element; @@ -45,7 +44,8 @@ public abstract class PrismValue implements Visitable, PathVisitable, Serializab private Objectable originObject; private Itemable parent; protected Element domElement = null; - private transient Map userData = new HashMap<>();; + private transient Map userData = new HashMap<>(); + protected boolean immutable; PrismValue() { super(); @@ -145,10 +145,12 @@ protected ItemDefinition getDefinition() { } public void applyDefinition(ItemDefinition definition) throws SchemaException { + checkMutability(); // TODO reconsider applyDefinition(definition, true); } public void applyDefinition(ItemDefinition definition, boolean force) throws SchemaException { + checkMutability(); // TODO reconsider // Do nothing by default } @@ -239,7 +241,7 @@ public static Collection cloneValues(Collection val } return clonedCollection; } - + public abstract PrismValue clone(); protected void copyValues(PrismValue clone) { @@ -248,6 +250,7 @@ protected void copyValues(PrismValue clone) { // Do not clone parent. The clone will most likely go to a different prism // and setting the parent will make it difficult to add it there. clone.parent = null; + // Do not clone immutable flag. } public static Collection cloneCollection(Collection values) { @@ -281,6 +284,7 @@ public int hashCode() { public boolean equalsComplex(PrismValue other, boolean ignoreMetadata, boolean isLiteral) { // parent is not considered at all. it is not relevant. + // neither the immutable flag if (!ignoreMetadata) { if (originObject == null) { if (other.originObject != null) @@ -382,4 +386,19 @@ public static Set getRealValuesOfCollection(Collection displayNamePPD = prismContext.getSchemaRegistry().findPropertyDefinitionByElementName(SchemaConstantsGenerated.C_DISPLAY_NAME); + PrismProperty displayNamePP = displayNamePPD.instantiate(); + displayNamePP.setRealValue("Big red ball"); + displayNamePP.setImmutable(true); + + // THEN + try { + displayNamePP.setRealValue("Small black cube"); + AssertJUnit.fail("Value was changed when immutable!"); + } catch (RuntimeException e) { + System.out.println("Got (expected) exception of " + e); + } + + try { + displayNamePP.getValue().setValue("Green point"); + AssertJUnit.fail("Value was changed when immutable!"); + } catch (RuntimeException e) { + System.out.println("Got (expected) exception of " + e); + } + + // WHEN + displayNamePP.setImmutable(false); + + // THEN + displayNamePP.setRealValue("Small black cube"); + assertEquals("Real value was not changed", "Small black cube", displayNamePP.getAnyRealValue()); + displayNamePP.getAnyValue().setValue("Green point"); + assertEquals("Real value was not changed", "Green point", displayNamePP.getAnyRealValue()); + } + + @Test + public void test020DateProperty() throws Exception { + System.out.println("===[ test020DateProperty ]==="); + + // GIVEN + PrismContext prismContext = PrismTestUtil.getPrismContext(); + + // WHEN + PrismPropertyDefinition datePPD = new PrismPropertyDefinition<>(new QName(SchemaConstants.NS_C, "dateTime"), DOMUtil.XSD_DATETIME, prismContext); + PrismProperty datePP = datePPD.instantiate(); + Date now = new Date(); + Date yesterday = new Date(now.getTime()-86400000L); + datePP.setRealValue(XmlTypeConverter.createXMLGregorianCalendar(now)); + datePP.setImmutable(true); + + // THEN + try { + datePP.setRealValue(yesterday); + AssertJUnit.fail("Value was changed when immutable!"); + } catch (RuntimeException e) { + System.out.println("Got (expected) exception of " + e); + } + + try { + datePP.getValue().setValue(XmlTypeConverter.createXMLGregorianCalendar(yesterday)); + AssertJUnit.fail("Value was changed when immutable!"); + } catch (RuntimeException e) { + System.out.println("Got (expected) exception of " + e); + } + + // Testing that returned objects are in fact clones (disabled as not implemented yet) +// XMLGregorianCalendar realValue = datePP.getAnyRealValue(); +// int hourPlus1 = (realValue.getHour() + 1) % 24; +// realValue.setHour(hourPlus1); +// assertEquals("Date was changed even if it should not", XmlTypeConverter.createXMLGregorianCalendar(now), datePP.getAnyRealValue()); + } + + @Test + public void test030Reference() throws Exception { + System.out.println("===[ test030Reference ]==="); + + // GIVEN + PrismContext prismContext = PrismTestUtil.getPrismContext(); + + // WHEN + PrismReferenceDefinition refPRD = new PrismReferenceDefinition(new QName(SchemaConstants.NS_C, "ref"), ObjectReferenceType.COMPLEX_TYPE, prismContext); + PrismReference refPR = refPRD.instantiate(); + refPR.add(ObjectTypeUtil.createObjectRef("oid1", ObjectTypes.USER).asReferenceValue()); + refPR.setImmutable(true); + + // THEN + try { + refPR.replace(ObjectTypeUtil.createObjectRef("oid2", ObjectTypes.USER).asReferenceValue()); + AssertJUnit.fail("Value was changed when immutable!"); + } catch (RuntimeException e) { + System.out.println("Got (expected) exception of " + e); + } + + try { + refPR.getValue().setOid("oid2"); + AssertJUnit.fail("Value was changed when immutable!"); + } catch (RuntimeException e) { + System.out.println("Got (expected) exception of " + e); + } + + // WHEN + refPR.setImmutable(false); + + // THEN + refPR.replace(ObjectTypeUtil.createObjectRef("oid2", ObjectTypes.USER).asReferenceValue()); + assertEquals("OID was not changed", "oid2", refPR.getOid()); + refPR.getValue().setOid("oid3"); + assertEquals("Real value was not changed", "oid3", refPR.getOid()); + } + + @Test + public void test100Resource() throws Exception { + System.out.println("===[ test100Resource ]==="); + + // GIVEN + PrismContext prismContext = PrismTestUtil.getPrismContext(); + + // WHEN + PrismObject resource = prismContext.createObject(ResourceType.class); + resource.setOid("oid1"); + resource.asObjectable().setName(PolyStringType.fromOrig("resource1")); + + SchemaHandlingType schemaHandling = new SchemaHandlingType(prismContext); + ResourceObjectTypeDefinitionType objectTypeDef = new ResourceObjectTypeDefinitionType(prismContext); + objectTypeDef.setDefault(true); + IterationSpecificationType iterationSpecificationType = new IterationSpecificationType(); + iterationSpecificationType.setMaxIterations(100); + objectTypeDef.setIteration(iterationSpecificationType); + schemaHandling.getObjectType().add(objectTypeDef); + resource.asObjectable().setSchemaHandling(schemaHandling); + + ResourceBusinessConfigurationType businessConfiguration = new ResourceBusinessConfigurationType(prismContext); + businessConfiguration.setAdministrativeState(ResourceAdministrativeStateType.ENABLED); + resource.asObjectable().setBusiness(businessConfiguration); + + resource.setImmutable(true); + + System.out.println("Resource: " + resource.debugDump()); + + // THEN + + // standard property + try { + resource.asObjectable().setName(PolyStringType.fromOrig("resource2")); + AssertJUnit.fail("Value of name was changed when immutable!"); + } catch (RuntimeException e) { + System.out.println("Got (expected) exception of " + e); + } + + // OID + try { + resource.setOid("oid2"); + AssertJUnit.fail("Value of OID was changed when immutable!"); + } catch (RuntimeException e) { + System.out.println("Got (expected) exception of " + e); + } + + // values in sub-container + try { + resource.asObjectable().getBusiness().setAdministrativeState(ResourceAdministrativeStateType.DISABLED); + AssertJUnit.fail("Value of resource administrative status was changed when immutable!"); + } catch (RuntimeException e) { + System.out.println("Got (expected) exception of " + e); + } + + try { + resource.asObjectable().getSchemaHandling().getObjectType().get(0).setDefault(false); + AssertJUnit.fail("Value of schemaHandling/[1]/default was changed when immutable!"); + } catch (RuntimeException e) { + System.out.println("Got (expected) exception of " + e); + } + + // value in a bean (not implemented yet) +// try { +// resource.asObjectable().getSchemaHandling().getObjectType().get(0).getIteration().setMaxIterations(500); +// AssertJUnit.fail("Value of maxIterations was changed when immutable!"); +// } catch (RuntimeException e) { +// System.out.println("Got (expected) exception of " + e); +// } + } + + +} From 529533a310c31e740f1a3943446c761279c0926e Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Tue, 27 Sep 2016 18:49:58 +0200 Subject: [PATCH 06/74] Some more tests. --- .../midpoint/prism/PrismInternalTestUtil.java | 9 ++- .../midpoint/prism/TestPrismParsing.java | 68 ++++++++++++++++++- .../midpoint/prism/parser/TestYamlParser.java | 5 +- .../resources/common/yaml/user-elisabeth.yaml | 14 ++++ .../resources/schema/extension-secondary.xsd | 37 ++++++++++ 5 files changed, 127 insertions(+), 6 deletions(-) create mode 100644 infra/prism/src/test/resources/common/yaml/user-elisabeth.yaml create mode 100644 infra/prism/src/test/resources/schema/extension-secondary.xsd diff --git a/infra/prism/src/test/java/com/evolveum/midpoint/prism/PrismInternalTestUtil.java b/infra/prism/src/test/java/com/evolveum/midpoint/prism/PrismInternalTestUtil.java index 68a4acda66b..3f5e3b72330 100644 --- a/infra/prism/src/test/java/com/evolveum/midpoint/prism/PrismInternalTestUtil.java +++ b/infra/prism/src/test/java/com/evolveum/midpoint/prism/PrismInternalTestUtil.java @@ -100,6 +100,8 @@ public class PrismInternalTestUtil implements PrismContextFactory { public static final String USER_WILL_FILE_BASENAME = "user-will"; public static final File USER_WILL_FILE = new File(COMMON_DIR_XML, "user-will.xml"); + public static final String USER_ELISABETH_FILE_BASENAME = "user-elisabeth"; + public static final String RESOURCE_RUM_FILE_BASENAME = "resource-rum"; public static final String RESOURCE_RUM_OID = "c0c010c0-d34d-b33f-f00d-222222220001"; @@ -110,6 +112,7 @@ public class PrismInternalTestUtil implements PrismContextFactory { public static final String NS_USER_EXT = "http://example.com/xml/ns/user-extension"; public static final String NS_ROOT = "http://example.com/xml/ns/test/root.xsd"; public static final String NS_EXTENSION = "http://midpoint.evolveum.com/xml/ns/test/extension"; + public static final String NS_EXTENSION_SECONDARY = "http://midpoint.evolveum.com/xml/ns/test/extension/secondary"; public static final String NS_ADHOC = "http://midpoint.evolveum.com/xml/ns/test/adhoc-1.xsd"; public static final String NS_WEAPONS = "http://midpoint.evolveum.com/xml/ns/test/weapons"; public static final String NS_WEAPONS_PREFIX = "w"; @@ -185,7 +188,11 @@ public class PrismInternalTestUtil implements PrismContextFactory { public static final QName EXTENSION_MELEE_CONTEXT_TYPE_QNAME = new QName(NS_EXTENSION, "MeleeContextType"); public static final QName EXTENSION_MELEE_CONTEXT_OPPONENT_REF_ELEMENT = new QName(NS_EXTENSION, "opponentRef"); public static final QName EXTENSION_MELEE_CONTEXT_OPPONENT_ELEMENT = new QName(NS_EXTENSION, "opponent"); - + + // extension-secondary.xsd + public static final QName EXTENSION_SECONDARY_STRING_TYPE_ELEMENT = new QName(NS_EXTENSION_SECONDARY, "stringType"); + public static final QName EXTENSION_SECONDARY_SECONDARY_STRING_TYPE_ELEMENT = new QName(NS_EXTENSION_SECONDARY, "secondaryStringType"); + // These are NOT in the extension.xsd but are used as dynamic elements public static final QName EXTENSION_BAR_ELEMENT = new QName(NS_EXTENSION, "bar"); public static final QName EXTENSION_FOOBAR_ELEMENT = new QName(NS_EXTENSION, "foobar"); diff --git a/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestPrismParsing.java b/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestPrismParsing.java index 9c86387ea91..5f1317656e4 100644 --- a/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestPrismParsing.java +++ b/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestPrismParsing.java @@ -365,6 +365,44 @@ public void testUserWillRoundTrip() throws Exception { } + @Test + public void testUserElisabethRoundTrip() throws Exception { + final String TEST_NAME = "testUserElisabethRoundTrip"; + PrismInternalTestUtil.displayTestTitle(TEST_NAME); + + // GIVEN + PrismContext prismContext = constructInitializedPrismContext(); + + // WHEN + PrismObject user = prismContext.parseObject(getFile(USER_ELISABETH_FILE_BASENAME)); + + // THEN + System.out.println("User:"); + System.out.println(user.debugDump()); + assertNotNull(user); + + assertUserElisabeth(user); + + // WHEN + String serialized = prismContext.serializeObjectToString(user, getOutputFormat()); + + // THEN + assertNotNull(serialized); + System.out.println("Serialized user:"); + System.out.println(serialized); + + // WHEN + PrismObject reparsedUser = prismContext.parseObject(serialized); + + // THEN + System.out.println("Re-parsed user:"); + System.out.println(reparsedUser.debugDump()); + assertNotNull(reparsedUser); + + assertUserElisabeth(reparsedUser); + + } + protected void assertUserAdhoc(PrismObject user) throws SchemaException { user.checkConsistence(); assertUserJackContent(user); @@ -493,7 +531,35 @@ private void assertUserWillExtension(PrismObject user) { assertEquals("Multi",3,multiPVals.size()); } - + + private void assertUserElisabeth(PrismObject user) throws SchemaException { + user.checkConsistence(); + user.assertDefinitions("test"); + assertUserElisabethExtension(user); + //assertVisitor(user,55); + } + + private void assertUserElisabethExtension(PrismObject user) { + + PrismContainer extension = user.getExtension(); + assertContainerDefinition(extension, "extension", DOMUtil.XSD_ANY, 0, 1); + PrismContainerValue extensionValue = extension.getValue(); + assertTrue("Extension parent", extensionValue.getParent() == extension); + assertNull("Extension ID", extensionValue.getId()); + +// PrismProperty stringType = extension.findProperty(EXTENSION_STRING_TYPE_ELEMENT); +// PrismAsserts.assertPropertyValue(stringType, "BARbar", "FOObar"); +// PrismPropertyDefinition stringTypePropertyDef = stringType.getDefinition(); +// PrismAsserts.assertDefinition(stringTypePropertyDef, EXTENSION_STRING_TYPE_ELEMENT, DOMUtil.XSD_STRING, 0, -1); +// assertNull("'Indexed' attribute on 'stringType' property is not null", stringTypePropertyDef.isIndexed()); + + PrismProperty secondaryStringType = extension.findProperty(EXTENSION_SECONDARY_SECONDARY_STRING_TYPE_ELEMENT); + PrismAsserts.assertPropertyValue(secondaryStringType, "string1"); + PrismPropertyDefinition secondaryStringTypePropertyDef = secondaryStringType.getDefinition(); + PrismAsserts.assertDefinition(secondaryStringTypePropertyDef, EXTENSION_SINGLE_STRING_TYPE_ELEMENT, DOMUtil.XSD_STRING, 0, -1); + assertNull("'Indexed' attribute on 'secondaryStringType' property is not null", secondaryStringTypePropertyDef.isIndexed()); + } + protected void validateXml(String xmlString, PrismContext prismContext) throws SAXException, IOException { } diff --git a/infra/prism/src/test/java/com/evolveum/midpoint/prism/parser/TestYamlParser.java b/infra/prism/src/test/java/com/evolveum/midpoint/prism/parser/TestYamlParser.java index 765b5ace091..9ec7d1ab3d2 100644 --- a/infra/prism/src/test/java/com/evolveum/midpoint/prism/parser/TestYamlParser.java +++ b/infra/prism/src/test/java/com/evolveum/midpoint/prism/parser/TestYamlParser.java @@ -3,7 +3,7 @@ import com.evolveum.midpoint.prism.parser.json.YamlParser; import org.testng.annotations.Test; -public class TestYamlParser extends AbstractParserTest{ +public class TestYamlParser extends AbstractParserTest { @Override @@ -21,7 +21,4 @@ protected YamlParser createParser() { return new YamlParser(); } - @Test - public void f() { - } } diff --git a/infra/prism/src/test/resources/common/yaml/user-elisabeth.yaml b/infra/prism/src/test/resources/common/yaml/user-elisabeth.yaml new file mode 100644 index 00000000000..da4b48ead5a --- /dev/null +++ b/infra/prism/src/test/resources/common/yaml/user-elisabeth.yaml @@ -0,0 +1,14 @@ +--- +user: + oid: "c0c010c0-d34d-b33f-f00d-111111114444" + name: "elisabeth" + extension: + http://midpoint.evolveum.com/xml/ns/test/extension#stringType: + - "string" + secondaryStringType: + - "string1" + intType: + - 142 + fullName: "Elisabeth Turner" + givenName: "Elisabeth" + familyName: "Turner" diff --git a/infra/prism/src/test/resources/schema/extension-secondary.xsd b/infra/prism/src/test/resources/schema/extension-secondary.xsd new file mode 100644 index 00000000000..e6c37b8e1ce --- /dev/null +++ b/infra/prism/src/test/resources/schema/extension-secondary.xsd @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + From f9184f87945abbb8ec05188cf687120622776008 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Wed, 28 Sep 2016 09:56:59 +0200 Subject: [PATCH 07/74] Started refactoring JSON/YAML support. --- ...ser.java => AbstractParserDeprecated.java} | 3 +- ...ava => PrismJasonProcessorDeprecated.java} | 3 +- .../midpoint/prism/parser/ParserUtils.java | 40 ++++ .../midpoint/prism/parser/dom/DomParser.java | 19 +- .../prism/parser/json/AbstractParser.java | 195 +++++++++--------- .../prism/parser/json/JsonParser.java | 6 +- .../prism/parser/json/YamlParser.java | 6 +- .../midpoint/schema/TestJsonParsing.java | 13 +- infra/schema/testng-unit.xml | 2 +- 9 files changed, 156 insertions(+), 131 deletions(-) rename infra/prism/src/main/java/com/evolveum/midpoint/prism/json/{AbstractParser.java => AbstractParserDeprecated.java} (99%) rename infra/prism/src/main/java/com/evolveum/midpoint/prism/json/{PrismJasonProcessor.java => PrismJasonProcessorDeprecated.java} (99%) create mode 100644 infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/ParserUtils.java diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/json/AbstractParser.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/json/AbstractParserDeprecated.java similarity index 99% rename from infra/prism/src/main/java/com/evolveum/midpoint/prism/json/AbstractParser.java rename to infra/prism/src/main/java/com/evolveum/midpoint/prism/json/AbstractParserDeprecated.java index 8bf137eb1af..4e32eab770d 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/json/AbstractParser.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/json/AbstractParserDeprecated.java @@ -35,7 +35,8 @@ import com.fasterxml.jackson.databind.ObjectReader; import com.fasterxml.jackson.databind.module.SimpleModule; -public abstract class AbstractParser implements Parser { +@Deprecated +public abstract class AbstractParserDeprecated implements Parser { private static final String PROP_NAMESPACE = "@ns"; private static final String TYPE_DEFINITION = "@typeDef"; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/json/PrismJasonProcessor.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/json/PrismJasonProcessorDeprecated.java similarity index 99% rename from infra/prism/src/main/java/com/evolveum/midpoint/prism/json/PrismJasonProcessor.java rename to infra/prism/src/main/java/com/evolveum/midpoint/prism/json/PrismJasonProcessorDeprecated.java index 66d4d10ab25..a42a2ad50ad 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/json/PrismJasonProcessor.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/json/PrismJasonProcessorDeprecated.java @@ -83,7 +83,8 @@ import com.fasterxml.jackson.module.jaxb.JaxbAnnotationIntrospector; import com.fasterxml.jackson.module.jaxb.deser.DomElementJsonDeserializer; -public class PrismJasonProcessor { +@Deprecated +public class PrismJasonProcessorDeprecated { private SchemaRegistry schemaRegistry; private PrismContext prismContext; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/ParserUtils.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/ParserUtils.java new file mode 100644 index 00000000000..a1a7c4b8199 --- /dev/null +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/ParserUtils.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.prism.parser; + +import com.evolveum.midpoint.prism.xnode.RootXNode; +import com.evolveum.midpoint.prism.xnode.XNode; +import org.jetbrains.annotations.NotNull; + +import javax.xml.namespace.QName; + +/** + * @author mederly + */ +public class ParserUtils { + + @NotNull + public static RootXNode createRootXNode(XNode xnode, QName rootElementName) { + if (xnode instanceof RootXNode) { + return (RootXNode) xnode; + } else { + RootXNode xroot = new RootXNode(rootElementName); + xroot.setSubnode(xnode); + return xroot; + } + } +} diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/dom/DomParser.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/dom/DomParser.java index c306e21d12f..6e3f24fe326 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/dom/DomParser.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/dom/DomParser.java @@ -32,6 +32,7 @@ import com.evolveum.midpoint.prism.marshaller.XNodeProcessorEvaluationMode; import com.evolveum.midpoint.prism.marshaller.XPathHolder; import com.evolveum.midpoint.prism.parser.Parser; +import com.evolveum.midpoint.prism.parser.ParserUtils; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; import org.apache.commons.lang.StringUtils; @@ -424,17 +425,11 @@ public boolean canParse(String dataString) { @Override public String serializeToString(XNode xnode, QName rootElementName) throws SchemaException { DomSerializer serializer = new DomSerializer(this, schemaRegistry); - RootXNode xroot; - if (xnode instanceof RootXNode) { - xroot = (RootXNode) xnode; - } else { - xroot = new RootXNode(rootElementName); - xroot.setSubnode(xnode); - } + RootXNode xroot = ParserUtils.createRootXNode(xnode, rootElementName); Element element = serializer.serialize(xroot); return DOMUtil.serializeDOMToString(element); } - + @Override public String serializeToString(RootXNode xnode) throws SchemaException { DomSerializer serializer = new DomSerializer(this, schemaRegistry); @@ -444,13 +439,7 @@ public String serializeToString(RootXNode xnode) throws SchemaException { public Element serializeUnderElement(XNode xnode, QName rootElementName, Element parentElement) throws SchemaException { DomSerializer serializer = new DomSerializer(this, schemaRegistry); - RootXNode xroot; - if (xnode instanceof RootXNode) { - xroot = (RootXNode) xnode; - } else { - xroot = new RootXNode(rootElementName); - xroot.setSubnode(xnode); - } + RootXNode xroot = ParserUtils.createRootXNode(xnode, rootElementName); return serializer.serializeUnderElement(xroot, parentElement); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/AbstractParser.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/AbstractParser.java index 9dde4a0106c..fe747822ed5 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/AbstractParser.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/AbstractParser.java @@ -25,6 +25,7 @@ import javax.xml.namespace.QName; import com.evolveum.midpoint.prism.parser.Parser; +import com.evolveum.midpoint.prism.parser.ParserUtils; import com.evolveum.midpoint.util.logging.LoggingUtils; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; @@ -52,7 +53,6 @@ import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonToken; -import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.module.SimpleModule; @@ -64,57 +64,47 @@ public abstract class AbstractParser implements Parser { private static final String PROP_NAMESPACE = "@ns"; protected static final String TYPE_DEFINITION = "@typeDef"; protected static final String VALUE_FIELD = "@value"; - - protected abstract JsonParser createParser(String dataString) throws SchemaException; - protected abstract JsonParser createParser(InputStream stream) throws SchemaException, IOException; - protected JsonParser createParser(File file) throws SchemaException, IOException { - return createParser(new FileInputStream(file)); - } + // Public interface - public abstract JsonGenerator createGenerator(StringWriter out) throws SchemaException; - @Override - public Collection parseCollection(File file) throws SchemaException, IOException { - throw new UnsupportedOperationException("Parse objects not supported for json and yaml."); + public XNode parse(File file) throws SchemaException, IOException { + try (FileInputStream fis = new FileInputStream(file)) { + JsonParser parser = createJacksonParser(fis); + return parse(parser); + } } - + @Override - public Collection parseCollection(String dataString) throws SchemaException { - throw new UnsupportedOperationException("Parse objects not supported for json and yaml."); + public XNode parse(InputStream stream) throws SchemaException, IOException { + JsonParser parser = createJacksonParser(stream); + return parse(parser); } - + @Override - public Collection parseCollection(InputStream stream) throws SchemaException, IOException { - // TODO Auto-generated method stub - return null; + public XNode parse(String dataString) throws SchemaException { + JsonParser parser = createJacksonParser(dataString); + return parse(parser); } - + @Override - public XNode parse(File file) throws SchemaException, IOException { - JsonParser parser = createParser(file); - return parseObject(parser); + public Collection parseCollection(File file) throws SchemaException, IOException { + throw new UnsupportedOperationException("Parse objects not supported for json and yaml."); // why? } - @Override - public XNode parse(InputStream stream) throws SchemaException, IOException { - JsonParser parser = createParser(stream); - return parseObject(parser); - } + @Override + public Collection parseCollection(InputStream stream) throws SchemaException, IOException { + throw new UnsupportedOperationException("Parse objects not supported for json and yaml."); // why? + } - @Override - public XNode parse(String dataString) throws SchemaException { - JsonParser parser = createParser(dataString); - return parseObject(parser); + @Override + public Collection parseCollection(String dataString) throws SchemaException { + throw new UnsupportedOperationException("Parse objects not supported for json and yaml."); // why? } - private boolean root = true; @Override public String serializeToString(XNode xnode, QName rootElementName) throws SchemaException { - if (xnode instanceof RootXNode){ - xnode = ((RootXNode) xnode).getSubnode(); - } - return serialize(xnode, null, rootElementName); + return serializeToString(ParserUtils.createRootXNode(xnode, rootElementName)); } @Override @@ -123,7 +113,72 @@ public String serializeToString(RootXNode xnode) throws SchemaException { QName explicitType = xnode.getTypeQName(); return serialize(xnode.getSubnode(), explicitType, rootElementName); } - + + // Parsing implementation + + protected abstract JsonParser createJacksonParser(String dataString) throws SchemaException; + protected abstract JsonParser createJacksonParser(InputStream stream) throws SchemaException, IOException; + + private XNode parse(JsonParser parser) throws SchemaException { + try { + configureParser(parser); + JsonToken t = parser.currentToken(); + if (t == null) { + parser.nextToken(); + } + RootXNode rootXNode = new RootXNode(); + while (parser.nextToken() != null) { + parse(rootXNode, null, parser); + } + return rootXNode; + } catch (IOException e) { + throw new SchemaException("Cannot parse from JSON: " + e.getMessage(), e); + } + } + + private void parse(XNode xnode, QName propertyName, JsonParser parser) throws SchemaException { + try{ + JsonToken token = parser.getCurrentToken(); + + if (token == null){ + return; + } + propertyName = parseFieldName(xnode, propertyName, parser); + + switch (parser.getCurrentToken()){ + case START_OBJECT: + parseToMap(propertyName, xnode, parser); + break; + case START_ARRAY: + parseToList(propertyName, xnode, parser); + break; + case VALUE_STRING: + case VALUE_TRUE: + case VALUE_FALSE: + case VALUE_NUMBER_FLOAT: + case VALUE_NUMBER_INT: + parseToPrimitive(propertyName, xnode, parser); + break; + default: + // System.out.println("DEFAULT SWICH NODE"); + break; + + } + } catch (Exception e){ + //TODO: + throw new SchemaException("Error ", e); + } + } + + + // Serialization implementation + + protected abstract JsonGenerator createJacksonGenerator(StringWriter out) throws SchemaException; + + + + private boolean root = true; + protected abstract void writeExplicitType(QName explicitType, JsonGenerator generator) throws JsonGenerationException, IOException; // ------------------- METHODS FOR SERIALIZATION ------------------------------ @@ -132,7 +187,7 @@ public String serialize(XNode node, QName explicitType, QName rootElement) throw StringWriter out = new StringWriter(); try { - generator = createGenerator(out); + generator = createJacksonGenerator(out); generator.writeStartObject(); generator.writeStringField(PROP_NAMESPACE, rootElement.getNamespaceURI()); @@ -324,36 +379,7 @@ private void configureParser(JsonParser parser){ } //------------------------ METHODS FOR PARSING ------------------------------------------- - public XNode parseObject(JsonParser parser) throws SchemaException{ - - try { - configureParser(parser); - JsonToken t = parser.getCurrentToken(); - if (t == null){ - t = parser.nextToken(); - } - - if (t == null){ - t = parser.nextToken(); - } - - RootXNode xmap = new RootXNode(); -// xmap. - - while (parser.nextToken() != null){ - parse(xmap, null, parser); - } - return xmap; - } catch (JsonParseException e) { - throw new SchemaException("Cannot parse from JSON: " + e.getMessage(), e); - } catch (JsonMappingException e) { - throw new SchemaException("Cannot parse from JSON: " + e.getMessage(), e); - } catch (IOException e) { - throw new SchemaException("Cannot parse from JSON: " + e.getMessage(), e); - } - } - private QName parseFieldName(XNode xnode, QName propertyName, JsonParser parser) throws JsonParseException, IOException{ JsonToken token = parser.getCurrentToken(); @@ -382,40 +408,7 @@ private QName parseFieldName(XNode xnode, QName propertyName, JsonParser parser) } - private void parse(XNode xmap, QName propertyName, JsonParser parser) throws SchemaException { - try{ - JsonToken token = parser.getCurrentToken(); - - if (token == null){ - return; - } - propertyName = parseFieldName(xmap, propertyName, parser); - - switch (parser.getCurrentToken()){ - case START_OBJECT: - parseToMap(propertyName, xmap, parser); - break; - case START_ARRAY: - parseToList(propertyName, xmap, parser); - break; - case VALUE_STRING: - case VALUE_TRUE: - case VALUE_FALSE: - case VALUE_NUMBER_FLOAT: - case VALUE_NUMBER_INT: - parseToPrimitive(propertyName, xmap, parser); - break; - default: -// System.out.println("DEFAULT SWICH NODE"); - break; - - } - } catch (Exception e){ - //TODO: - throw new SchemaException("Error ", e); - } - } - + private void parseToMap(QName propertyName, XNode parent, JsonParser parser) throws SchemaException, JsonParseException, IOException{ // System.out.println("parseToMap - propertyName " + propertyName); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/JsonParser.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/JsonParser.java index cdc1aef0aeb..1559ce73f64 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/JsonParser.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/JsonParser.java @@ -60,7 +60,7 @@ public boolean canParse(String dataString) { } @Override - protected com.fasterxml.jackson.core.JsonParser createParser(InputStream stream) throws SchemaException, IOException { + protected com.fasterxml.jackson.core.JsonParser createJacksonParser(InputStream stream) throws SchemaException, IOException { JsonFactory factory = new JsonFactory(); try { return factory.createParser(stream); @@ -70,7 +70,7 @@ protected com.fasterxml.jackson.core.JsonParser createParser(InputStream stream) } @Override - protected com.fasterxml.jackson.core.JsonParser createParser(String dataString) throws SchemaException { + protected com.fasterxml.jackson.core.JsonParser createJacksonParser(String dataString) throws SchemaException { JsonFactory factory = new JsonFactory(); try { return factory.createParser(dataString); @@ -79,7 +79,7 @@ protected com.fasterxml.jackson.core.JsonParser createParser(String dataString) } } - public JsonGenerator createGenerator(StringWriter out) throws SchemaException{ + public JsonGenerator createJacksonGenerator(StringWriter out) throws SchemaException{ return createJsonGenerator(out); } private JsonGenerator createJsonGenerator(StringWriter out) throws SchemaException{ diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/YamlParser.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/YamlParser.java index 443a9096665..4845a693294 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/YamlParser.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/YamlParser.java @@ -66,7 +66,7 @@ public boolean canParse(String dataString) { return dataString.startsWith("---"); } - public YAMLGenerator createGenerator(StringWriter out) throws SchemaException{ + public YAMLGenerator createJacksonGenerator(StringWriter out) throws SchemaException{ try { MidpointYAMLFactory factory = new MidpointYAMLFactory(); MidpointYAMLGenerator generator = (MidpointYAMLGenerator) factory.createGenerator(out); @@ -112,7 +112,7 @@ private Module createSerializerModule(){ } @Override - protected MidpointYAMLParser createParser(InputStream stream) throws SchemaException, IOException { + protected MidpointYAMLParser createJacksonParser(InputStream stream) throws SchemaException, IOException { MidpointYAMLFactory factory = new MidpointYAMLFactory(); try { MidpointYAMLParser p = (MidpointYAMLParser) factory.createParser(stream); @@ -125,7 +125,7 @@ protected MidpointYAMLParser createParser(InputStream stream) throws SchemaExcep } @Override - protected MidpointYAMLParser createParser(String dataString) throws SchemaException { + protected MidpointYAMLParser createJacksonParser(String dataString) throws SchemaException { MidpointYAMLFactory factory = new MidpointYAMLFactory(); try { return (MidpointYAMLParser) factory.createParser(dataString); diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestJsonParsing.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestJsonParsing.java index 7eff1e64c0d..2b45869de05 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestJsonParsing.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestJsonParsing.java @@ -10,6 +10,7 @@ import javax.xml.namespace.QName; +import com.evolveum.midpoint.prism.json.PrismJasonProcessorDeprecated; import org.testng.annotations.Test; import org.w3c.dom.Element; @@ -21,7 +22,6 @@ import com.evolveum.midpoint.prism.PrismObjectDefinition; import com.evolveum.midpoint.prism.PrismProperty; import com.evolveum.midpoint.prism.PrismReference; -import com.evolveum.midpoint.prism.json.PrismJasonProcessor; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.prism.util.PrismAsserts; @@ -32,16 +32,17 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; +@Deprecated public class TestJsonParsing { - // private PrismJasonProcessor jsonProcessor; + // private PrismJasonProcessorDeprecated jsonProcessor; @Test(enabled = false) public void test000SerializeUserJson() throws Exception { System.out.println("===[ testParseUserJson ]==="); // PrismContext prismContext = PrismInternalTestUtil.constructInitializedPrismContext(); - PrismJasonProcessor jsonProcessor = new PrismJasonProcessor(); + PrismJasonProcessorDeprecated jsonProcessor = new PrismJasonProcessorDeprecated(); PrismContext prismContext = MidPointPrismContextFactory.FACTORY .createInitializedPrismContext(); // prismContext.initialize(); @@ -74,7 +75,7 @@ public void test000SerializeUserJson() throws Exception { @Test(enabled = false) public void test001ParseUserJson() throws Exception { System.out.println("===[ testParseUserJson ]==="); - PrismJasonProcessor jsonProcessor = new PrismJasonProcessor(); + PrismJasonProcessorDeprecated jsonProcessor = new PrismJasonProcessorDeprecated(); PrismContext prismContext = MidPointPrismContextFactory.FACTORY .createInitializedPrismContext(); prismContext.initialize(); @@ -115,7 +116,7 @@ public void test001ParseUserJson() throws Exception { @Test(enabled = false) public void test002ParseResourceJson() throws Exception { System.out.println("===[ test002ParseResourceJson ]==="); - PrismJasonProcessor jsonProcessor = new PrismJasonProcessor(); + PrismJasonProcessorDeprecated jsonProcessor = new PrismJasonProcessorDeprecated(); PrismContext prismContext = MidPointPrismContextFactory.FACTORY .createInitializedPrismContext(); jsonProcessor.setPrismContext(prismContext); @@ -156,7 +157,7 @@ public void test002ParseResourceJson() throws Exception { @Test(enabled = false) public void test003ParseResourceJson() throws Exception { System.out.println("===[ testParseUserJson ]==="); - PrismJasonProcessor jsonProcessor = new PrismJasonProcessor(); + PrismJasonProcessorDeprecated jsonProcessor = new PrismJasonProcessorDeprecated(); PrismContext prismContext = MidPointPrismContextFactory.FACTORY .createInitializedPrismContext(); prismContext.initialize(); diff --git a/infra/schema/testng-unit.xml b/infra/schema/testng-unit.xml index 2f7f07eba46..e35b4f4a3b1 100644 --- a/infra/schema/testng-unit.xml +++ b/infra/schema/testng-unit.xml @@ -43,7 +43,7 @@ - + From d40e4058ca94f335df7cf694a95f833da5187077 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Wed, 28 Sep 2016 12:44:22 +0200 Subject: [PATCH 08/74] Interim commit. --- .../prism/parser/json/AbstractParser.java | 111 ++++++++---------- 1 file changed, 52 insertions(+), 59 deletions(-) diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/AbstractParser.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/AbstractParser.java index fe747822ed5..23f7c353e5f 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/AbstractParser.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/AbstractParser.java @@ -65,26 +65,27 @@ public abstract class AbstractParser implements Parser { protected static final String TYPE_DEFINITION = "@typeDef"; protected static final String VALUE_FIELD = "@value"; - // Public interface + + //region Parsing implementation @Override public XNode parse(File file) throws SchemaException, IOException { try (FileInputStream fis = new FileInputStream(file)) { - JsonParser parser = createJacksonParser(fis); - return parse(parser); + JsonParser parser = configureParser(createJacksonParser(fis)); + return parseJsonObject(parser); } } @Override public XNode parse(InputStream stream) throws SchemaException, IOException { - JsonParser parser = createJacksonParser(stream); - return parse(parser); + JsonParser parser = configureParser(createJacksonParser(stream)); + return parseJsonObject(parser); } @Override public XNode parse(String dataString) throws SchemaException { - JsonParser parser = createJacksonParser(dataString); - return parse(parser); + JsonParser parser = configureParser(createJacksonParser(dataString)); + return parseJsonObject(parser); } @Override @@ -102,26 +103,11 @@ public Collection parseCollection(String dataString) throws SchemaExcepti throw new UnsupportedOperationException("Parse objects not supported for json and yaml."); // why? } - @Override - public String serializeToString(XNode xnode, QName rootElementName) throws SchemaException { - return serializeToString(ParserUtils.createRootXNode(xnode, rootElementName)); - } - - @Override - public String serializeToString(RootXNode xnode) throws SchemaException { - QName rootElementName = xnode.getRootElementName(); - QName explicitType = xnode.getTypeQName(); - return serialize(xnode.getSubnode(), explicitType, rootElementName); - } - - // Parsing implementation - protected abstract JsonParser createJacksonParser(String dataString) throws SchemaException; protected abstract JsonParser createJacksonParser(InputStream stream) throws SchemaException, IOException; - private XNode parse(JsonParser parser) throws SchemaException { + private RootXNode parseJsonObject(JsonParser parser) throws SchemaException { try { - configureParser(parser); JsonToken t = parser.currentToken(); if (t == null) { parser.nextToken(); @@ -132,46 +118,52 @@ private XNode parse(JsonParser parser) throws SchemaException { } return rootXNode; } catch (IOException e) { - throw new SchemaException("Cannot parse from JSON: " + e.getMessage(), e); + throw new SchemaException("Cannot parseJsonObject from JSON: " + e.getMessage(), e); } } - private void parse(XNode xnode, QName propertyName, JsonParser parser) throws SchemaException { - try{ - JsonToken token = parser.getCurrentToken(); + private void parse(XNode xnode, QName propertyName, JsonParser parser) throws IOException, SchemaException { + JsonToken token = parser.currentToken(); + if (token == null) { + return; + } + propertyName = parseFieldName(xnode, propertyName, parser); - if (token == null){ - return; - } - propertyName = parseFieldName(xnode, propertyName, parser); - - switch (parser.getCurrentToken()){ - case START_OBJECT: - parseToMap(propertyName, xnode, parser); - break; - case START_ARRAY: - parseToList(propertyName, xnode, parser); - break; - case VALUE_STRING: - case VALUE_TRUE: - case VALUE_FALSE: - case VALUE_NUMBER_FLOAT: - case VALUE_NUMBER_INT: - parseToPrimitive(propertyName, xnode, parser); - break; - default: - // System.out.println("DEFAULT SWICH NODE"); - break; + switch (parser.getCurrentToken()) { + case START_OBJECT: + parseToMap(propertyName, xnode, parser); + break; + case START_ARRAY: + parseToList(propertyName, xnode, parser); + break; + case VALUE_STRING: + case VALUE_TRUE: + case VALUE_FALSE: + case VALUE_NUMBER_FLOAT: + case VALUE_NUMBER_INT: + parseToPrimitive(propertyName, xnode, parser); + break; + default: + // System.out.println("DEFAULT SWICH NODE"); + break; - } - } catch (Exception e){ - //TODO: - throw new SchemaException("Error ", e); } } + //endregion + //region Serialization implementation - // Serialization implementation + @Override + public String serializeToString(XNode xnode, QName rootElementName) throws SchemaException { + return serializeToString(ParserUtils.createRootXNode(xnode, rootElementName)); + } + + @Override + public String serializeToString(RootXNode xnode) throws SchemaException { + QName rootElementName = xnode.getRootElementName(); + QName explicitType = xnode.getTypeQName(); + return serialize(xnode.getSubnode(), explicitType, rootElementName); + } protected abstract JsonGenerator createJacksonGenerator(StringWriter out) throws SchemaException; @@ -366,7 +358,7 @@ private String serializeNsIfNeeded(QName subNodeName, String globalNamespace, Js } //------------------------END OF METHODS FOR SERIALIZATION ------------------------------- - private void configureParser(JsonParser parser){ + private JsonParser configureParser(JsonParser parser){ ObjectMapper mapper = new ObjectMapper(); SimpleModule sm = new SimpleModule(); sm.addDeserializer(QName.class, new QNameDeserializer()); @@ -376,6 +368,7 @@ private void configureParser(JsonParser parser){ mapper.registerModule(sm); parser.setCodec(mapper); + return parser; } //------------------------ METHODS FOR PARSING ------------------------------------------- @@ -418,7 +411,7 @@ private void parseToMap(QName propertyName, XNode parent, JsonParser parser) thr // parseSpecial(parent, propertyName, parser); // return; // } -// parse(parent, propertyName, parser); +// parseJsonObject(parent, propertyName, parser); // } if (parser.getCurrentToken() == null){ return; @@ -495,7 +488,7 @@ private String processNamespace(XNode xnode, JsonParser parser) throws SchemaExc // return ns; // } else if (node.get("@type") != null){ // JsonValueParser vp = new JsonValueParser(parser, node.get("@type")); -// QName type = vp.parse(DOMUtil.XSD_QNAME); +// QName type = vp.parseJsonObject(DOMUtil.XSD_QNAME); // xnode.setExplicitTypeDeclaration(true); // xnode.setTypeQName(type); // return null; @@ -606,9 +599,9 @@ private void parseSpecial(XNode xmap, QName propertyName, JsonParser parser) parser.nextToken(); } } catch (JsonParseException e){ - throw new SchemaException("Cannot parse special element: " + e.getMessage(), e); + throw new SchemaException("Cannot parseJsonObject special element: " + e.getMessage(), e); } catch (IOException e){ - throw new SchemaException("Cannot parse special element: " + e.getMessage(), e); + throw new SchemaException("Cannot parseJsonObject special element: " + e.getMessage(), e); } } From 930e1d78ae80b4d8ffcf74e63f9fe343c075bdbb Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Thu, 29 Sep 2016 12:25:13 +0200 Subject: [PATCH 09/74] Interim commit. --- infra/prism/pom.xml | 4 + .../prism/parser/json/AbstractParser.java | 198 ++++++++++++++++-- .../midpoint/prism/xnode/MapXNode.java | 20 +- 3 files changed, 207 insertions(+), 15 deletions(-) diff --git a/infra/prism/pom.xml b/infra/prism/pom.xml index e509e21331d..2385a2c1d35 100644 --- a/infra/prism/pom.xml +++ b/infra/prism/pom.xml @@ -51,6 +51,10 @@ commons-lang commons-lang + + org.apache.commons + commons-lang3 + org.apache.santuario xmlsec diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/AbstractParser.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/AbstractParser.java index 23f7c353e5f..52e4c3e7eb0 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/AbstractParser.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/AbstractParser.java @@ -17,9 +17,7 @@ package com.evolveum.midpoint.prism.parser.json; import java.io.*; -import java.util.Collection; -import java.util.Iterator; -import java.util.ListIterator; +import java.util.*; import java.util.Map.Entry; import javax.xml.namespace.QName; @@ -30,6 +28,9 @@ import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.Validate; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; @@ -62,6 +63,7 @@ public abstract class AbstractParser implements Parser { private static final Trace LOGGER = TraceManager.getTrace(AbstractParser.class); private static final String PROP_NAMESPACE = "@ns"; + private static final String PROP_TYPE = "@type"; protected static final String TYPE_DEFINITION = "@typeDef"; protected static final String VALUE_FIELD = "@value"; @@ -69,23 +71,23 @@ public abstract class AbstractParser implements Parser { //region Parsing implementation @Override - public XNode parse(File file) throws SchemaException, IOException { + public RootXNode parse(File file) throws SchemaException, IOException { try (FileInputStream fis = new FileInputStream(file)) { - JsonParser parser = configureParser(createJacksonParser(fis)); - return parseJsonObject(parser); + JsonParser parser = createJacksonParser(fis); + return parseFromStart(parser); } } @Override - public XNode parse(InputStream stream) throws SchemaException, IOException { - JsonParser parser = configureParser(createJacksonParser(stream)); - return parseJsonObject(parser); + public RootXNode parse(InputStream stream) throws SchemaException, IOException { + JsonParser parser = createJacksonParser(stream); + return parseFromStart(parser); } @Override - public XNode parse(String dataString) throws SchemaException { - JsonParser parser = configureParser(createJacksonParser(dataString)); - return parseJsonObject(parser); + public RootXNode parse(String dataString) throws SchemaException { + JsonParser parser = createJacksonParser(dataString); + return parseFromStart(parser); } @Override @@ -106,6 +108,174 @@ public Collection parseCollection(String dataString) throws SchemaExcepti protected abstract JsonParser createJacksonParser(String dataString) throws SchemaException; protected abstract JsonParser createJacksonParser(InputStream stream) throws SchemaException, IOException; + private class ParsingContext { + @NotNull final JsonParser parser; + @NotNull final Map defaultNamespaces = new HashMap<>(); + ParsingContext(@NotNull JsonParser parser) { + this.parser = parser; + } + } + + @NotNull + private RootXNode parseFromStart(JsonParser unconfiguredParser) throws SchemaException { + try { + JsonParser parser = configureParser(unconfiguredParser); + parser.nextToken(); + if (parser.currentToken() == null) { + throw new SchemaException("Nothing to parse: the input is empty."); + } + ParsingContext ctx = new ParsingContext(parser); + XNode xnode = parseValue(ctx); + if (!(xnode instanceof MapXNode) || ((MapXNode) xnode).size() != 1) { + throw new SchemaException("Expected MapXNode with a single key; got " + xnode + " instead."); + } + processDefaultNamespaces(xnode, null, ctx); + Entry entry = ((MapXNode) xnode).entrySet().iterator().next(); + RootXNode root = new RootXNode(entry.getKey(), entry.getValue()); + if (entry.getValue() != null) { + root.setTypeQName(entry.getValue().getTypeQName()); // TODO - ok ???? + } + return root; + } catch (IOException e) { + throw new SchemaException("Cannot parse JSON/YAML object: " + e.getMessage(), e); + } + } + + private void processDefaultNamespaces(XNode xnode, String parentDefault, ParsingContext ctx) { + if (xnode instanceof MapXNode) { + MapXNode map = (MapXNode) xnode; + final String currentDefault = ctx.defaultNamespaces.containsKey(map) ? ctx.defaultNamespaces.get(map) : parentDefault; + for (Entry entry : map.entrySet()) { + QName fieldName = entry.getKey(); + XNode subnode = entry.getValue(); + if (StringUtils.isNotEmpty(currentDefault) && StringUtils.isEmpty(fieldName.getNamespaceURI())) { + map.qualifyKey(fieldName, currentDefault); + } + processDefaultNamespaces(subnode, currentDefault, ctx); + } + } else if (xnode instanceof ListXNode) { + for (XNode item : (ListXNode) xnode) { + processDefaultNamespaces(item, parentDefault, ctx); + } + } + } + + @Nullable // TODO: ok? + private XNode parseValue(ParsingContext ctx) throws IOException, SchemaException { + Validate.notNull(ctx.parser.currentToken()); + + switch (ctx.parser.currentToken()) { + case START_OBJECT: + return parseToMap(ctx); + case START_ARRAY: + return parseToList(ctx); + case VALUE_STRING: + case VALUE_TRUE: + case VALUE_FALSE: + case VALUE_NUMBER_FLOAT: + case VALUE_NUMBER_INT: + return parseToPrimitive(ctx); + case VALUE_NULL: + return null; // TODO... + default: + throw new SchemaException("Unexpected current token: " + ctx.parser.currentToken()); + } + } + + @NotNull + private MapXNode parseToMap(ParsingContext ctx) throws SchemaException, IOException { + Validate.notNull(ctx.parser.currentToken()); + + final MapXNode map = new MapXNode(); + boolean defaultNamespaceDefined = false; + QName currentFieldName = null; + for (;;) { + JsonToken token = ctx.parser.nextToken(); + if (token == null) { + throw new SchemaException("Unexpected end of data while parsing a map structure"); + } else if (token == JsonToken.END_OBJECT) { + break; + } else if (token == JsonToken.FIELD_NAME) { + String newFieldName = ctx.parser.getCurrentName(); + if (currentFieldName != null) { + throw new SchemaException("Two field names in succession: " + currentFieldName + " and " + newFieldName); + } + currentFieldName = QNameUtil.uriToQName(newFieldName, true); + } else { + XNode valueXNode = parseValue(ctx); + if (new QName(PROP_NAMESPACE).equals(currentFieldName)) { + if (valueXNode instanceof PrimitiveXNode) { + ctx.defaultNamespaces.put(map, ((PrimitiveXNode) valueXNode).getStringValue()); + if (defaultNamespaceDefined) { + throw new SchemaException("Default namespace defined more than once at " + getPositionSuffix(ctx)); + } + } else { + throw new SchemaException("Value of '" + PROP_NAMESPACE + "' attribute must be a primitive one. It is " + valueXNode + " instead."); + } + } else if (new QName(PROP_TYPE).equals(currentFieldName)) { + if (valueXNode instanceof PrimitiveXNode) { + if (map.getTypeQName() != null) { + throw new SchemaException("Value type defined more than once at " + getPositionSuffix(ctx)); + } + map.setTypeQName(QNameUtil.uriToQName(((PrimitiveXNode) valueXNode).getStringValue(), true)); + } else { + throw new SchemaException("Value of '" + PROP_TYPE + "' attribute must be a primitive one. It is " + valueXNode + " instead."); + } + } else { + map.put(currentFieldName, valueXNode); + } + currentFieldName = null; + } + } + return map; + } + + private String getPositionSuffix(ParsingContext ctx) { + return String.valueOf(ctx.parser.getCurrentLocation()); + } + + private ListXNode parseToList(ParsingContext ctx) throws SchemaException, IOException { + Validate.notNull(ctx.parser.currentToken()); + + ListXNode list = new ListXNode(); + for (;;) { + JsonToken token = ctx.parser.nextToken(); + if (token == null) { + throw new SchemaException("Unexpected end of data while parsing a list structure"); + } else if (token == JsonToken.END_ARRAY) { + return list; + } else { + list.add(parseValue(ctx)); + } + } + } + + private PrimitiveXNode parseToPrimitive(ParsingContext ctx) throws IOException { + PrimitiveXNode primitive = createPrimitiveXNode(ctx.parser, null); + return primitive; + } + + private PrimitiveXNode createPrimitiveXNode(JsonParser parser, QName typeDefinition) throws IOException { + PrimitiveXNode primitive = new PrimitiveXNode(); + Object tid = parser.getTypeId(); + if (tid != null) { + if (tid.equals("http://www.w3.org/2001/XMLSchema/string")) { + typeDefinition = DOMUtil.XSD_STRING; + } else if (tid.equals("http://www.w3.org/2001/XMLSchema/int")) { + typeDefinition = DOMUtil.XSD_INT; + } + } + if (typeDefinition != null) { + primitive.setExplicitTypeDeclaration(true); + primitive.setTypeQName(typeDefinition); + } + JsonNode jn = parser.readValueAs(JsonNode.class); + ValueParser vp = new JsonValueParser(parser, jn); + primitive.setValueParser(vp); + + return primitive; + } + private RootXNode parseJsonObject(JsonParser parser) throws SchemaException { try { JsonToken t = parser.currentToken(); @@ -594,7 +764,7 @@ private void parseSpecial(XNode xmap, QName propertyName, JsonParser parser) parser.nextToken(); } - PrimitiveXNode primitive = createPrimitiveXNode(parser, typeDefinition); + PrimitiveXNode primitive = createPrimitiveXNode1(parser, typeDefinition); addXNode(propertyName, xmap, primitive); parser.nextToken(); } @@ -612,7 +782,7 @@ private PrimitiveXNode createPrimitiveXNode(final JsonParser parser) thro return createPrimitiveXNode(parser, null); } - private PrimitiveXNode createPrimitiveXNode(final JsonParser parser, QName typeDefinition) throws JsonProcessingException, IOException{ + private PrimitiveXNode createPrimitiveXNode1(final JsonParser parser, QName typeDefinition) throws JsonProcessingException, IOException{ PrimitiveXNode primitive = new PrimitiveXNode(); Object tid = parser.getTypeId(); // System.out.println("tag: " + tid); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/MapXNode.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/MapXNode.java index b0058355708..cd9707a70d3 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/MapXNode.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/MapXNode.java @@ -34,6 +34,8 @@ import com.evolveum.midpoint.util.PrettyPrinter; import com.evolveum.midpoint.util.QNameUtil; import com.evolveum.midpoint.util.exception.SchemaException; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.Validate; public class MapXNode extends XNode implements Map, Serializable { @@ -342,6 +344,14 @@ public String dumpKeyNames() { } return sb.toString(); } + + public void qualifyKey(QName key, String newNamespace) { + for (Entry entry : subnodes) { + if (key.equals(entry.getKey())) { + entry.qualifyKey(newNamespace); + } + } + } private class Entry implements Map.Entry, Serializable { @@ -359,6 +369,14 @@ public Entry(QName key, XNode value) { this.value = value; } + public void qualifyKey(String newNamespace) { + Validate.notNull(key, "Key is null"); + if (StringUtils.isNotEmpty(key.getNamespaceURI())) { + throw new IllegalStateException("Cannot qualify already qualified key: " + key); + } + key = new QName(newNamespace, key.getLocalPart()); + } + @Override public QName getKey() { return key; @@ -408,7 +426,7 @@ public boolean equals(Object o) { @Override public int hashCode() { - int result = key != null ? key.hashCode() : 0; + int result = key != null && key.getLocalPart() != null ? key.getLocalPart().hashCode() : 0; result = 31 * result + (value != null ? value.hashCode() : 0); return result; } From 2910511154b4e49b58cff2d8b26c22a55bfc662f Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Mon, 3 Oct 2016 11:59:14 +0200 Subject: [PATCH 10/74] Refactored parsing/generation to/from xnodes. Prism tests pass. --- .../certification/dto/DefinitionScopeDto.java | 2 +- .../prism/NameQualificationStrategy.java | 27 + .../midpoint/prism/ParsingContext.java | 10 + .../evolveum/midpoint/prism/PrismContext.java | 174 ++-- .../midpoint/prism/SerializationOptions.java | 36 + .../prism/json/AbstractParserDeprecated.java | 10 +- .../prism/marshaller/PrismBeanConverter.java | 6 +- .../midpoint/prism/parser/Parser.java | 18 +- .../midpoint/prism/parser/ParsingMode.java | 26 + .../midpoint/prism/parser/dom/DomParser.java | 18 +- .../prism/parser/json/AbstractJsonParser.java | 520 +++++++++++ .../prism/parser/json/AbstractParser.java | 822 ------------------ .../prism/parser/json/JsonParser.java | 40 +- .../prism/parser/json/JsonValueParser.java | 24 +- .../prism/parser/json/YamlParser.java | 90 +- .../json/yaml/MidpointYAMLGenerator.java | 26 +- .../parser/json/yaml/MidpointYAMLParser.java | 48 +- .../midpoint/prism/schema/SchemaRegistry.java | 4 + .../midpoint/prism/util/PrismAsserts.java | 9 + .../prism/util/ValueSerializationUtil.java | 14 +- .../midpoint/prism/xml/XsdTypeMapper.java | 12 +- .../midpoint/prism/xnode/MapXNode.java | 2 + .../midpoint/prism/xnode/RootXNode.java | 22 +- .../evolveum/midpoint/prism/xnode/XNode.java | 6 +- .../src/main/resources/xml/ns/test/foo-1.xsd | 2 +- .../midpoint/prism/PrismInternalTestUtil.java | 4 +- .../midpoint/prism/TestPrismParsing.java | 95 +- .../midpoint/prism/TestXmlSerialization.java | 4 +- .../prism/parser/AbstractParserTest.java | 18 +- .../midpoint/prism/parser/TestDomParser.java | 3 +- .../midpoint/prism/parser/TestJsonParser.java | 4 - .../resources/common/json/user-elisabeth.json | 14 + .../common/json/user-jack-adhoc.json | 2 +- .../common/json/user-jack-modified.json | 10 +- .../common/json/user-jack-no-ns.json | 10 +- .../common/json/user-jack-object.json | 10 +- .../resources/common/json/user-jack-old.json | 10 +- .../test/resources/common/json/user-jack.json | 10 +- .../test/resources/common/json/user-will.json | 10 +- .../resources/common/xml/user-elisabeth.xml | 12 + .../resources/common/xml/user-jack-no-ns.xml | 10 +- .../test/resources/common/yaml/user-jack.yaml | 16 +- .../src/test/resources/json/user-jack.json | 6 - .../midpoint/schema/TestParseResource.java | 2 +- .../com/evolveum/midpoint/util/QNameUtil.java | 15 +- 45 files changed, 1079 insertions(+), 1154 deletions(-) create mode 100644 infra/prism/src/main/java/com/evolveum/midpoint/prism/NameQualificationStrategy.java create mode 100644 infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/ParsingMode.java create mode 100644 infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/AbstractJsonParser.java delete mode 100644 infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/AbstractParser.java create mode 100644 infra/prism/src/test/resources/common/json/user-elisabeth.json create mode 100644 infra/prism/src/test/resources/common/xml/user-elisabeth.xml delete mode 100644 infra/prism/src/test/resources/json/user-jack.json diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/certification/dto/DefinitionScopeDto.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/certification/dto/DefinitionScopeDto.java index 53308118c6c..85fb2aa8125 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/certification/dto/DefinitionScopeDto.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/certification/dto/DefinitionScopeDto.java @@ -60,7 +60,7 @@ public SearchFilterType getParsedSearchFilter(PrismContext context) { SearchFilterType rv = new SearchFilterType(); RootXNode filterClauseNode; try { - filterClauseNode = (RootXNode) context.parseToXNode(searchFilterText, PrismContext.LANG_XML); + filterClauseNode = (RootXNode) context.parseToXNode(searchFilterText, PrismContext.LANG_XML, null); } catch (SchemaException e) { throw new SystemException("Cannot parse search filter " + searchFilterText + ": " + e.getMessage(), e); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/NameQualificationStrategy.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/NameQualificationStrategy.java new file mode 100644 index 00000000000..30a42d5823d --- /dev/null +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/NameQualificationStrategy.java @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.prism; + +/** + * @author mederly + */ +public enum NameQualificationStrategy { + + ALWAYS, + ONLY_IF_NOT_COMMON, + ONLY_IF_AMBIGUOUS; +} diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/ParsingContext.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/ParsingContext.java index 0e6ac271f16..b7bf7854181 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/ParsingContext.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/ParsingContext.java @@ -17,6 +17,7 @@ package com.evolveum.midpoint.prism; import com.evolveum.midpoint.prism.marshaller.XNodeProcessorEvaluationMode; +import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.util.logging.Trace; import java.util.ArrayList; @@ -79,6 +80,15 @@ public void warn(Trace logger, String message) { warn(message); } + public void warnOrThrow(Trace logger, String message) throws SchemaException { + if (isCompat()) { + logger.warn("{}", message); + warn(message); + } else { + throw new SchemaException(message); + } + } + public void warn(String message) { warnings.add(message); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java index 719c15638b5..a70c2fd1b1b 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java @@ -212,13 +212,14 @@ public void setMonitor(PrismMonitor monitor) { */ public PrismObject parseObject(File file) throws SchemaException, IOException { Parser parser = findParser(file); - XNode xnode = parser.parse(file); - return xnodeProcessor.parseObject(xnode, newParsingContext()); + ParsingContext pc = newParsingContext(); + XNode xnode = parser.parse(file, pc); + return xnodeProcessor.parseObject(xnode, pc); } public PrismObject parseObject(File file, ParsingContext context) throws SchemaException, IOException { Parser parser = findParser(file); - XNode xnode = parser.parse(file); + XNode xnode = parser.parse(file, context); return xnodeProcessor.parseObject(xnode, context); } @@ -226,16 +227,18 @@ public PrismObject parseObject(File file, ParsingConte * Parses a file and creates a prism from it. */ public PrismObject parseObject(File file, String language) throws SchemaException, IOException { - XNode xnode = parseToXNode(file, language); - return xnodeProcessor.parseObject(xnode, newParsingContext()); + ParsingContext pc = newParsingContext(); + XNode xnode = parseToXNode(file, language, pc); + return xnodeProcessor.parseObject(xnode, pc); } /** * Parses data from an input stream and creates a prism from it. */ public PrismObject parseObject(InputStream stream, String language) throws SchemaException, IOException { - XNode xnode = parseToXNode(stream, language); - return xnodeProcessor.parseObject(xnode, newParsingContext()); + ParsingContext pc = newParsingContext(); + XNode xnode = parseToXNode(stream, language, pc); + return xnodeProcessor.parseObject(xnode, pc); } /** @@ -244,8 +247,9 @@ public PrismObject parseObject(InputStream stream, Str */ public PrismObject parseObject(String dataString) throws SchemaException { Parser parser = findParser(dataString); - XNode xnode = parser.parse(dataString); - return xnodeProcessor.parseObject(xnode, newParsingContext()); + ParsingContext pc = newParsingContext(); + XNode xnode = parser.parse(dataString, pc); + return xnodeProcessor.parseObject(xnode, pc); } /** @@ -254,14 +258,15 @@ public PrismObject parseObject(String dataString) thro */ public PrismObject parseObject(String dataString, XNodeProcessorEvaluationMode mode) throws SchemaException { Parser parser = findParser(dataString); - XNode xnode = parser.parse(dataString); + ParsingContext pc = ParsingContext.forMode(mode); + XNode xnode = parser.parse(dataString, pc); XNodeProcessor myXnodeProcessor = new XNodeProcessor(this); - return myXnodeProcessor.parseObject(xnode, ParsingContext.forMode(mode)); + return myXnodeProcessor.parseObject(xnode, pc); } public PrismObject parseObject(String dataString, ParsingContext parsingContext) throws SchemaException { Parser parser = findParser(dataString); - XNode xnode = parser.parse(dataString); + XNode xnode = parser.parse(dataString, parsingContext); XNodeProcessor myXnodeProcessor = new XNodeProcessor(this); return myXnodeProcessor.parseObject(xnode, parsingContext); } @@ -270,8 +275,9 @@ public PrismObject parseObject(String dataString, Pars * Parses a string and creates a prism from it. Used mostly for testing, but can also be used for built-in editors, etc. */ public PrismObject parseObject(String dataString, String language) throws SchemaException { - XNode xnode = parseToXNode(dataString, language); - return xnodeProcessor.parseObject(xnode, newParsingContext()); + ParsingContext pc = newParsingContext(); + XNode xnode = parseToXNode(dataString, language, pc); + return xnodeProcessor.parseObject(xnode, pc); } /** @@ -279,18 +285,20 @@ public PrismObject parseObject(String dataString, Stri */ @Deprecated public PrismObject parseObject(Element objectElement) throws SchemaException { + ParsingContext pc = newParsingContext(); RootXNode xroot = parserDom.parseElementAsRoot(objectElement); - return xnodeProcessor.parseObject(xroot, newParsingContext()); + return xnodeProcessor.parseObject(xroot, pc); } public List> parseObjects(File file) throws SchemaException, IOException { - Parser parser = findParser(file); - Collection nodes = parser.parseCollection(file); + ParsingContext pc = newParsingContext(); + Parser parser = findParser(file); + Collection nodes = parser.parseCollection(file, pc); Iterator nodesIterator = nodes.iterator(); List> objects = new ArrayList<>(); while (nodesIterator.hasNext()){ XNode node = nodesIterator.next(); - PrismObject object = xnodeProcessor.parseObject(node, newParsingContext()); + PrismObject object = xnodeProcessor.parseObject(node, pc); objects.add(object); } return objects; @@ -298,38 +306,34 @@ public List> parseObjects(File file) throws Sc public Collection parseObjects(InputStream stream, String language) throws SchemaException, IOException { Parser parser = getParserNotNull(language); - Collection nodes = parser.parseCollection(stream); + Collection nodes = parser.parseCollection(stream, ParsingContext.createDefault()); return nodes; -// Iterator nodesIterator = nodes.iterator(); -// List> objects = new ArrayList>(); -// while (nodesIterator.hasNext()){ -// XNode node = nodesIterator.next(); -// PrismObject object = xnodeProcessor.parseObject(node); -// objects.add(object); -// } -// return objects; } //endregion //region Parsing prism containers public PrismContainer parseContainer(File file, Class type, String language) throws SchemaException, IOException { - XNode xnode = parseToXNode(file, language); - return xnodeProcessor.parseContainer(xnode, type, newParsingContext()); + ParsingContext pc = newParsingContext(); + XNode xnode = parseToXNode(file, language, pc); + return xnodeProcessor.parseContainer(xnode, type, pc); } public PrismContainer parseContainer(File file, PrismContainerDefinition containerDef, String language) throws SchemaException, IOException { - XNode xnode = parseToXNode(file, language); - return xnodeProcessor.parseContainer(xnode, containerDef, newParsingContext()); + ParsingContext pc = newParsingContext(); + XNode xnode = parseToXNode(file, language, pc); + return xnodeProcessor.parseContainer(xnode, containerDef, pc); } public PrismContainer parseContainer(String dataString, Class type, String language) throws SchemaException { - XNode xnode = parseToXNode(dataString, language); - return xnodeProcessor.parseContainer(xnode, type, newParsingContext()); + ParsingContext pc = newParsingContext(); + XNode xnode = parseToXNode(dataString, language, pc); + return xnodeProcessor.parseContainer(xnode, type, pc); } public PrismContainer parseContainer(String dataString, PrismContainerDefinition containerDef, String language) throws SchemaException { - XNode xnode = parseToXNode(dataString, language); - return xnodeProcessor.parseContainer(xnode, containerDef, newParsingContext()); + ParsingContext pc = newParsingContext(); + XNode xnode = parseToXNode(dataString, language, pc); + return xnodeProcessor.parseContainer(xnode, containerDef, pc); } /** @@ -341,9 +345,9 @@ public PrismContainer parseContainer(String dataStr * @return * @throws SchemaException */ - public PrismContainer parseContainer(String dataString, String language) throws SchemaException { - XNode xnode = parseToXNode(dataString, language); - return xnodeProcessor.parseContainer(xnode, newParsingContext()); + public PrismContainer parseContainer(String dataString, String language, ParsingContext pc) throws SchemaException { + XNode xnode = parseToXNode(dataString, language, pc); + return xnodeProcessor.parseContainer(xnode, pc); } //endregion @@ -352,23 +356,27 @@ public PrismContainer parseContainer(String dataStr * Parses an atomic value - i.e. something that could present a property value, if such a property would exist. */ public T parseAtomicValue(String dataString, QName typeName, String language) throws SchemaException { - XNode xnode = parseToXNode(dataString, language); - return xnodeProcessor.parseAtomicValue(xnode, typeName, newParsingContext()); + ParsingContext pc = newParsingContext(); + XNode xnode = parseToXNode(dataString, language, pc); + return xnodeProcessor.parseAtomicValue(xnode, typeName, pc); } public T parseAtomicValue(String dataString, QName typeName) throws SchemaException { - XNode xnode = parseToXNode(dataString); - return xnodeProcessor.parseAtomicValue(xnode, typeName, newParsingContext()); + ParsingContext pc = newParsingContext(); + XNode xnode = parseToXNode(dataString, pc); + return xnodeProcessor.parseAtomicValue(xnode, typeName, pc); } public T parseAtomicValue(File file, QName typeName, String language) throws SchemaException, IOException { - XNode xnode = parseToXNode(file, language); - return xnodeProcessor.parseAtomicValue(xnode, typeName, newParsingContext()); + ParsingContext pc = newParsingContext(); + XNode xnode = parseToXNode(file, language, pc); + return xnodeProcessor.parseAtomicValue(xnode, typeName, pc); } public T parseAtomicValue(File file, QName typeName) throws SchemaException, IOException { - XNode xnode = parseToXNode(file); - return xnodeProcessor.parseAtomicValue(xnode, typeName, newParsingContext()); + ParsingContext pc = newParsingContext(); + XNode xnode = parseToXNode(file, pc); + return xnodeProcessor.parseAtomicValue(xnode, typeName, pc); } //endregion @@ -385,13 +393,15 @@ public T parseAtomicValue(File file, QName typeName) throws SchemaException, * @throws SchemaException */ public Object parseAnyData(String dataString, String language) throws SchemaException { - XNode xnode = parseToXNode(dataString, language); - return xnodeProcessor.parseAnyData(xnode, newParsingContext()); + ParsingContext pc = newParsingContext(); + XNode xnode = parseToXNode(dataString, language, pc); + return xnodeProcessor.parseAnyData(xnode, pc); } public Object parseAnyData(File file) throws SchemaException, IOException { - XNode xnode = parseToXNode(file); - return xnodeProcessor.parseAnyData(xnode, newParsingContext()); + ParsingContext pc = newParsingContext(); + XNode xnode = parseToXNode(file, pc); + return xnodeProcessor.parseAnyData(xnode, pc); } /** * Emulates JAXB unmarshal method. @@ -402,65 +412,70 @@ public Object parseAnyData(File file) throws SchemaException, IOException { * @throws SchemaException */ public T parseAnyValue(File file) throws SchemaException, IOException { - XNode xnode = parseToXNode(file); - return xnodeProcessor.parseAnyValue(xnode, newParsingContext()); + ParsingContext pc = newParsingContext(); + XNode xnode = parseToXNode(file, pc); + return xnodeProcessor.parseAnyValue(xnode, pc); } public T parseAnyValue(Element element) throws SchemaException { - XNode xnode = parseToXNode(element); - return xnodeProcessor.parseAnyValue(xnode, newParsingContext()); + ParsingContext pc = newParsingContext(); + XNode xnode = parseToXNode(element, pc); + return xnodeProcessor.parseAnyValue(xnode, pc); } public T parseAnyValue(InputStream inputStream, String language) throws SchemaException, IOException { - XNode xnode = parseToXNode(inputStream, language); - return xnodeProcessor.parseAnyValue(xnode, newParsingContext()); + ParsingContext pc = newParsingContext(); + XNode xnode = parseToXNode(inputStream, language, pc); + return xnodeProcessor.parseAnyValue(xnode, pc); } public T parseAnyValue(String dataString, String language) throws SchemaException { - XNode xnode = parseToXNode(dataString, language); - return xnodeProcessor.parseAnyValue(xnode, newParsingContext()); + ParsingContext pc = newParsingContext(); + XNode xnode = parseToXNode(dataString, language, pc); + return xnodeProcessor.parseAnyValue(xnode, pc); } // experimental! public JAXBElement parseAnyValueAsJAXBElement(String dataString, String language) throws SchemaException { - XNode xnode = parseToXNode(dataString, language); - return xnodeProcessor.parseAnyValueAsJAXBElement(xnode, newParsingContext()); + ParsingContext pc = newParsingContext(); + XNode xnode = parseToXNode(dataString, language, pc); + return xnodeProcessor.parseAnyValueAsJAXBElement(xnode, pc); } //endregion //region Parsing to XNode - private XNode parseToXNode(String dataString) throws SchemaException { + private XNode parseToXNode(String dataString, ParsingContext pc) throws SchemaException { Parser parser = findParser(dataString); - return parser.parse(dataString); + return parser.parse(dataString, pc); } - public XNode parseToXNode(String dataString, String language) throws SchemaException { + public XNode parseToXNode(String dataString, String language, ParsingContext pc) throws SchemaException { Parser parser = getParserNotNull(language); - return parser.parse(dataString); + return parser.parse(dataString, pc); } - private XNode parseToXNode(File file) throws SchemaException, IOException { + private XNode parseToXNode(File file, ParsingContext pc) throws SchemaException, IOException { Parser parser = findParser(file); - return parser.parse(file); + return parser.parse(file, pc); } - private XNode parseToXNode(File file, String language) throws SchemaException, IOException { + private XNode parseToXNode(File file, String language, ParsingContext parsingContext) throws SchemaException, IOException { Parser parser = getParserNotNull(language); - return parser.parse(file); + return parser.parse(file, parsingContext); } - private XNode parseToXNode(InputStream stream, String language) throws SchemaException, IOException { + private XNode parseToXNode(InputStream stream, String language, ParsingContext pc) throws SchemaException, IOException { Parser parser = getParserNotNull(language); - return parser.parse(stream); + return parser.parse(stream, pc); } - private XNode parseToXNode(Element domElement) throws SchemaException { + private XNode parseToXNode(Element domElement, ParsingContext pc) throws SchemaException { return parserDom.parse(domElement); } public String serializeXNodeToString(RootXNode xroot, String language) throws SchemaException { Parser parser = getParserNotNull(language); - return parser.serializeToString(xroot); + return parser.serializeToString(xroot, null); } private Parser findParser(File file) throws IOException{ @@ -544,7 +559,7 @@ public void adopt(PrismContainer public String serializeObjectToString(PrismObject object, String language) throws SchemaException { Parser parser = getParserNotNull(language); RootXNode xroot = xnodeProcessor.serializeObject(object); - return parser.serializeToString(xroot); + return parser.serializeToString(xroot, null); } public String serializeContainerValueToString(PrismContainerValue cval, QName elementName, String language) throws SchemaException { @@ -552,7 +567,7 @@ public String serializeContainerValueToString(PrismCon RootXNode xroot = xnodeProcessor.serializeItemValueAsRoot(cval, elementName); //System.out.println("serialized to xnode: " + xroot.debugDump()); - return parser.serializeToString(xroot); + return parser.serializeToString(xroot, null); } /** @@ -573,14 +588,15 @@ public String serializeAtomicValue(Object value, QName elementName, String langu public String serializeAtomicValue(Object value, QName elementName, String language, SerializationOptions serializationOptions) throws SchemaException { Parser parser = getParserNotNull(language); - RootXNode xnode = xnodeProcessor.serializeAtomicValue(value, elementName, new SerializationContext(serializationOptions)); - return parser.serializeToString(xnode); + SerializationContext sc = new SerializationContext(serializationOptions); + RootXNode xnode = xnodeProcessor.serializeAtomicValue(value, elementName, sc); + return parser.serializeToString(xnode, sc); } public String serializeAtomicValue(JAXBElement element, String language) throws SchemaException { Parser parser = getParserNotNull(language); RootXNode xnode = xnodeProcessor.serializeAtomicValue(element); - return parser.serializeToString(xnode); + return parser.serializeToString(xnode, null, null); } @@ -597,13 +613,13 @@ public String serializeAtomicValue(JAXBElement element, String language) thro public String serializeAnyData(Object object, String language) throws SchemaException { Parser parser = getParserNotNull(language); RootXNode xnode = xnodeProcessor.serializeAnyData(object, null); - return parser.serializeToString(xnode); + return parser.serializeToString(xnode, null); } public String serializeAnyData(Object object, QName defaultRootElementName, String language) throws SchemaException { Parser parser = getParserNotNull(language); RootXNode xnode = xnodeProcessor.serializeAnyData(object, defaultRootElementName, null); - return parser.serializeToString(xnode); + return parser.serializeToString(xnode, null); } public Element serializeAnyDataToElement(Object object, QName defaultRootElementName) throws SchemaException { diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializationOptions.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializationOptions.java index e4d3620ffe8..07532f4ad03 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializationOptions.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializationOptions.java @@ -22,6 +22,10 @@ public class SerializationOptions { private boolean serializeReferenceNames; + private NameQualificationStrategy itemNameQualificationStrategy; + private NameQualificationStrategy itemTypeQualificationStrategy; + private NameQualificationStrategy itemPathQualificationStrategy; + private NameQualificationStrategy genericQualificationStrategy; public boolean isSerializeReferenceNames() { return serializeReferenceNames; @@ -40,4 +44,36 @@ public static SerializationOptions createSerializeReferenceNames(){ public static boolean isSerializeReferenceNames(SerializationOptions options) { return options != null && options.isSerializeReferenceNames(); } + + public NameQualificationStrategy getItemNameQualificationStrategy() { + return itemNameQualificationStrategy; + } + + public void setItemNameQualificationStrategy(NameQualificationStrategy itemNameQualificationStrategy) { + this.itemNameQualificationStrategy = itemNameQualificationStrategy; + } + + public NameQualificationStrategy getItemTypeQualificationStrategy() { + return itemTypeQualificationStrategy; + } + + public void setItemTypeQualificationStrategy(NameQualificationStrategy itemTypeQualificationStrategy) { + this.itemTypeQualificationStrategy = itemTypeQualificationStrategy; + } + + public NameQualificationStrategy getItemPathQualificationStrategy() { + return itemPathQualificationStrategy; + } + + public void setItemPathQualificationStrategy(NameQualificationStrategy itemPathQualificationStrategy) { + this.itemPathQualificationStrategy = itemPathQualificationStrategy; + } + + public NameQualificationStrategy getGenericQualificationStrategy() { + return genericQualificationStrategy; + } + + public void setGenericQualificationStrategy(NameQualificationStrategy genericQualificationStrategy) { + this.genericQualificationStrategy = genericQualificationStrategy; + } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/json/AbstractParserDeprecated.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/json/AbstractParserDeprecated.java index 4e32eab770d..a08bedc3942 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/json/AbstractParserDeprecated.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/json/AbstractParserDeprecated.java @@ -9,6 +9,8 @@ import javax.xml.namespace.QName; +import com.evolveum.midpoint.prism.ParsingContext; +import com.evolveum.midpoint.prism.SerializationContext; import org.apache.commons.lang.StringUtils; import com.evolveum.midpoint.prism.parser.Parser; @@ -44,7 +46,7 @@ public abstract class AbstractParserDeprecated implements Parser { @Override - public XNode parse(File file) throws SchemaException, IOException { + public XNode parse(File file, ParsingContext parsingContext) throws SchemaException, IOException { JsonParser parser = createParser(file); return parseObject(parser); } @@ -53,7 +55,7 @@ public XNode parse(File file) throws SchemaException, IOException { protected abstract JsonParser createParser(File file) throws SchemaException, IOException ; @Override - public XNode parse(String dataString) throws SchemaException { + public XNode parse(String dataString, ParsingContext parsingContext) throws SchemaException { // JsonFactory factory = new JsonFactory(); // JsonParser parser = null; // try { @@ -82,7 +84,7 @@ public boolean canParse(String dataString) { } @Override - public String serializeToString(XNode xnode, QName rootElementName) throws SchemaException { + public String serializeToString(XNode xnode, QName rootElementName, SerializationContext serializationContext) throws SchemaException { if (xnode instanceof RootXNode){ xnode = ((RootXNode) xnode).getSubnode(); } @@ -90,7 +92,7 @@ public String serializeToString(XNode xnode, QName rootElementName) throws Schem } @Override - public String serializeToString(RootXNode xnode) throws SchemaException { + public String serializeToString(RootXNode xnode, SerializationContext serializationContext) throws SchemaException { QName rootElementName = xnode.getRootElementName(); return serializeToJson(xnode.getSubnode(), rootElementName); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismBeanConverter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismBeanConverter.java index accb2ae09e0..632b392c945 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismBeanConverter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismBeanConverter.java @@ -158,7 +158,7 @@ public T unmarshall(MapXNode xnode, Class beanClass, ParsingContext pc) t } else { Map.Entry entry = xnode.entrySet().iterator().next(); DomParser domParser = prismContext.getParserDom(); - String value = domParser.serializeToString(entry.getValue(), entry.getKey()); + String value = domParser.serializeToString(entry.getValue(), entry.getKey(), null); return (T) new XmlAsStringType(value); } } @@ -443,8 +443,10 @@ public T unmarshall(MapXNode xnode, Class beanClass, ParsingContext pc) t } if (setter != null) { + Object value = null; try { - setter.invoke(bean, prepareValueToBeStored(propValue, wrapInJaxbElement, objectFactory, elementMethod, propName, beanClass, pc)); + value = prepareValueToBeStored(propValue, wrapInJaxbElement, objectFactory, elementMethod, propName, beanClass, pc); + setter.invoke(bean, value); } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { throw new SystemException("Cannot invoke setter "+setter+" on bean of type "+beanClass+": "+e.getMessage(), e); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/Parser.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/Parser.java index b3fdaff3740..2d37c6fa52a 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/Parser.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/Parser.java @@ -22,6 +22,8 @@ import javax.xml.namespace.QName; +import com.evolveum.midpoint.prism.ParsingContext; +import com.evolveum.midpoint.prism.SerializationContext; import com.evolveum.midpoint.prism.xnode.RootXNode; import com.evolveum.midpoint.prism.xnode.XNode; import com.evolveum.midpoint.util.exception.SchemaException; @@ -32,24 +34,24 @@ */ public interface Parser { - XNode parse(File file) throws SchemaException, IOException; + XNode parse(File file, ParsingContext parsingContext) throws SchemaException, IOException; - XNode parse(InputStream stream) throws SchemaException, IOException; + XNode parse(InputStream stream, ParsingContext parsingContext) throws SchemaException, IOException; - XNode parse(String dataString) throws SchemaException; + XNode parse(String dataString, ParsingContext parsingContext) throws SchemaException; - Collection parseCollection(File file) throws SchemaException, IOException; + Collection parseCollection(File file, ParsingContext parsingContext) throws SchemaException, IOException; - Collection parseCollection(InputStream stream) throws SchemaException, IOException; + Collection parseCollection(InputStream stream, ParsingContext parsingContext) throws SchemaException, IOException; - Collection parseCollection(String dataString) throws SchemaException; + Collection parseCollection(String dataString, ParsingContext parsingContext) throws SchemaException; boolean canParse(File file) throws IOException; boolean canParse(String dataString); - String serializeToString(XNode xnode, QName rootElementName) throws SchemaException; + String serializeToString(XNode xnode, QName rootElementName, SerializationContext serializationContext) throws SchemaException; - String serializeToString(RootXNode xnode) throws SchemaException; + String serializeToString(RootXNode xnode, SerializationContext serializationContext) throws SchemaException; } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/ParsingMode.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/ParsingMode.java new file mode 100644 index 00000000000..925738b4d56 --- /dev/null +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/ParsingMode.java @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.prism.parser; + +/** + * @author mederly + */ +public enum ParsingMode { + + // TODO documentation + STRICT, LAX; +} diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/dom/DomParser.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/dom/DomParser.java index 6e3f24fe326..73a2d66644d 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/dom/DomParser.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/dom/DomParser.java @@ -29,6 +29,8 @@ import javax.xml.namespace.QName; +import com.evolveum.midpoint.prism.ParsingContext; +import com.evolveum.midpoint.prism.SerializationContext; import com.evolveum.midpoint.prism.marshaller.XNodeProcessorEvaluationMode; import com.evolveum.midpoint.prism.marshaller.XPathHolder; import com.evolveum.midpoint.prism.parser.Parser; @@ -70,13 +72,13 @@ public DomParser(SchemaRegistry schemaRegistry) { } @Override - public Collection parseCollection(File file) throws SchemaException, IOException { + public Collection parseCollection(File file, ParsingContext parsingContext) throws SchemaException, IOException { Document document = DOMUtil.parseFile(file); return parseCollection(document); } @Override - public Collection parseCollection(InputStream stream) throws SchemaException, IOException { + public Collection parseCollection(InputStream stream, ParsingContext parsingContext) throws SchemaException, IOException { Document document = DOMUtil.parse(stream); return parseCollection(document); } @@ -94,25 +96,25 @@ private Collection parseCollection(Document document) throws SchemaExcept } @Override - public Collection parseCollection(String dataString) throws SchemaException { + public Collection parseCollection(String dataString, ParsingContext parsingContext) throws SchemaException { throw new UnsupportedOperationException(); } @Override - public XNode parse(File file) throws SchemaException { + public XNode parse(File file, ParsingContext parsingContext) throws SchemaException { Document document = DOMUtil.parseFile(file); return parse(document); } @Override - public XNode parse(InputStream stream) throws SchemaException, IOException { + public XNode parse(InputStream stream, ParsingContext parsingContext) throws SchemaException, IOException { Document document = DOMUtil.parse(stream); return parse(document); } @Override - public XNode parse(String dataString) throws SchemaException { + public XNode parse(String dataString, ParsingContext parsingContext) throws SchemaException { Document document = DOMUtil.parseDocument(dataString); return parse(document); } @@ -423,7 +425,7 @@ public boolean canParse(String dataString) { } @Override - public String serializeToString(XNode xnode, QName rootElementName) throws SchemaException { + public String serializeToString(XNode xnode, QName rootElementName, SerializationContext serializationContext) throws SchemaException { DomSerializer serializer = new DomSerializer(this, schemaRegistry); RootXNode xroot = ParserUtils.createRootXNode(xnode, rootElementName); Element element = serializer.serialize(xroot); @@ -431,7 +433,7 @@ public String serializeToString(XNode xnode, QName rootElementName) throws Schem } @Override - public String serializeToString(RootXNode xnode) throws SchemaException { + public String serializeToString(RootXNode xnode, SerializationContext serializationContext) throws SchemaException { DomSerializer serializer = new DomSerializer(this, schemaRegistry); Element element = serializer.serialize(xnode); return DOMUtil.serializeDOMToString(element); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/AbstractJsonParser.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/AbstractJsonParser.java new file mode 100644 index 00000000000..db8f5cb2ce3 --- /dev/null +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/AbstractJsonParser.java @@ -0,0 +1,520 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.prism.parser.json; + +import java.io.*; +import java.util.*; +import java.util.Map.Entry; + +import javax.xml.namespace.QName; + +import com.evolveum.midpoint.prism.ParsingContext; +import com.evolveum.midpoint.prism.SerializationContext; +import com.evolveum.midpoint.prism.parser.Parser; +import com.evolveum.midpoint.prism.parser.ParserUtils; +import com.evolveum.midpoint.util.logging.Trace; +import com.evolveum.midpoint.util.logging.TraceManager; +import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.Validate; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import com.evolveum.midpoint.prism.path.ItemPath; +import com.evolveum.midpoint.prism.polystring.PolyString; +import com.evolveum.midpoint.prism.xnode.ListXNode; +import com.evolveum.midpoint.prism.xnode.MapXNode; +import com.evolveum.midpoint.prism.xnode.PrimitiveXNode; +import com.evolveum.midpoint.prism.xnode.RootXNode; +import com.evolveum.midpoint.prism.xnode.SchemaXNode; +import com.evolveum.midpoint.prism.xnode.ValueParser; +import com.evolveum.midpoint.prism.xnode.XNode; +import com.evolveum.midpoint.util.DOMUtil; +import com.evolveum.midpoint.util.QNameUtil; +import com.evolveum.midpoint.util.exception.SchemaException; +import com.evolveum.prism.xml.ns._public.types_3.ItemPathType; +import com.fasterxml.jackson.core.JsonGenerationException; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.JsonToken; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.module.SimpleModule; + +public abstract class AbstractJsonParser implements Parser { + + private static final Trace LOGGER = TraceManager.getTrace(AbstractJsonParser.class); + + static final String PROP_NAMESPACE = "@ns"; + static final String PROP_TYPE = "@type"; + static final String PROP_VALUE = "@value"; + + //region Parsing implementation + + @Override + public RootXNode parse(File file, ParsingContext parsingContext) throws SchemaException, IOException { + try (FileInputStream fis = new FileInputStream(file)) { + JsonParser parser = createJacksonParser(fis); + return parseFromStart(parser, parsingContext); + } + } + + @Override + public RootXNode parse(InputStream stream, ParsingContext parsingContext) throws SchemaException, IOException { + JsonParser parser = createJacksonParser(stream); + return parseFromStart(parser, parsingContext); + } + + @Override + public RootXNode parse(String dataString, ParsingContext parsingContext) throws SchemaException { + JsonParser parser = createJacksonParser(dataString); + return parseFromStart(parser, parsingContext); + } + + @Override + public Collection parseCollection(File file, ParsingContext parsingContext) throws SchemaException, IOException { + throw new UnsupportedOperationException("Parse objects not supported for json and yaml."); // why? + } + + @Override + public Collection parseCollection(InputStream stream, ParsingContext parsingContext) throws SchemaException, IOException { + throw new UnsupportedOperationException("Parse objects not supported for json and yaml."); // why? + } + + @Override + public Collection parseCollection(String dataString, ParsingContext parsingContext) throws SchemaException { + throw new UnsupportedOperationException("Parse objects not supported for json and yaml."); // why? + } + + protected abstract JsonParser createJacksonParser(String dataString) throws SchemaException; + protected abstract JsonParser createJacksonParser(InputStream stream) throws SchemaException, IOException; + + class JsonParsingContext { + @NotNull final JsonParser parser; + @NotNull final ParsingContext prismParsingContext; + @NotNull final IdentityHashMap defaultNamespaces = new IdentityHashMap<>(); + JsonParsingContext(@NotNull JsonParser parser, @NotNull ParsingContext prismParsingContext) { + this.parser = parser; + this.prismParsingContext = prismParsingContext; + } + } + + @NotNull + private RootXNode parseFromStart(JsonParser unconfiguredParser, ParsingContext parsingContext) throws SchemaException { + JsonParsingContext ctx = null; + try { + JsonParser parser = configureParser(unconfiguredParser); + parser.nextToken(); + if (parser.currentToken() == null) { + throw new SchemaException("Nothing to parse: the input is empty."); + } + ctx = new JsonParsingContext(parser, parsingContext); + XNode xnode = parseValue(ctx); + if (!(xnode instanceof MapXNode) || ((MapXNode) xnode).size() != 1) { + throw new SchemaException("Expected MapXNode with a single key; got " + xnode + " instead. At " + getPositionSuffix(ctx)); + } + processDefaultNamespaces(xnode, null, ctx); + processSchemaNodes(xnode); + Entry entry = ((MapXNode) xnode).entrySet().iterator().next(); + RootXNode root = new RootXNode(entry.getKey(), entry.getValue()); + if (entry.getValue() != null) { + root.setTypeQName(entry.getValue().getTypeQName()); // TODO - ok ???? + } + return root; + } catch (IOException e) { + throw new SchemaException("Cannot parse JSON/YAML object: " + e.getMessage() + + (ctx != null ? " At: " + getPositionSuffix(ctx) : ""), + e); + } + } + + // Default namespaces (@ns properties) are processed in the second pass, because they might be present within an object + // at any place, even at the end. + private void processDefaultNamespaces(XNode xnode, String parentDefault, JsonParsingContext ctx) { + if (xnode instanceof MapXNode) { + MapXNode map = (MapXNode) xnode; + final String currentDefault = ctx.defaultNamespaces.containsKey(map) ? ctx.defaultNamespaces.get(map) : parentDefault; + for (Entry entry : map.entrySet()) { + QName fieldName = entry.getKey(); + XNode subnode = entry.getValue(); + if (StringUtils.isNotEmpty(currentDefault) && StringUtils.isEmpty(fieldName.getNamespaceURI())) { + map.qualifyKey(fieldName, currentDefault); + } + processDefaultNamespaces(subnode, currentDefault, ctx); + } + } else if (xnode instanceof ListXNode) { + for (XNode item : (ListXNode) xnode) { + processDefaultNamespaces(item, parentDefault, ctx); + } + } + } + + // Schema nodes can be detected only after namespaces are resolved. + // We simply convert primitive nodes to schema ones. + private void processSchemaNodes(XNode xnode) throws SchemaException, IOException { + if (xnode instanceof MapXNode) { + MapXNode map = (MapXNode) xnode; + XNode schemaNode = null; + for (Entry entry : map.entrySet()) { + QName fieldName = entry.getKey(); + XNode subnode = entry.getValue(); + if (DOMUtil.XSD_SCHEMA_ELEMENT.equals(fieldName)) { + schemaNode = subnode; + } else { + processSchemaNodes(subnode); + } + } + if (schemaNode != null) { + if (schemaNode instanceof PrimitiveXNode) { + PrimitiveXNode primitiveXNode = (PrimitiveXNode) schemaNode ; + if (primitiveXNode.isParsed()) { + throw new SchemaException("Cannot convert from PrimitiveXNode to SchemaXNode: node is already parsed: " + primitiveXNode); + } + SchemaXNode schemaXNode = new SchemaXNode(); + map.replace(DOMUtil.XSD_SCHEMA_ELEMENT, schemaXNode); + schemaXNode.setSchemaElement(((JsonValueParser) primitiveXNode.getValueParser()).asDomElement()); + } else { + throw new SchemaException("Cannot convert 'schema' field to SchemaXNode: not a PrimitiveNode but " + schemaNode); + } + } + } else if (xnode instanceof ListXNode) { + for (XNode item : (ListXNode) xnode) { + processSchemaNodes(item); + } + } + } + + @Nullable // TODO: ok? + private XNode parseValue(JsonParsingContext ctx) throws IOException, SchemaException { + Validate.notNull(ctx.parser.currentToken()); + + switch (ctx.parser.currentToken()) { + case START_OBJECT: + return parseJsonObject(ctx); + case START_ARRAY: + return parseToList(ctx); + case VALUE_STRING: + case VALUE_TRUE: + case VALUE_FALSE: + case VALUE_NUMBER_FLOAT: + case VALUE_NUMBER_INT: + return parseToPrimitive(ctx); + case VALUE_NULL: + return null; // TODO... + default: + throw new SchemaException("Unexpected current token: " + ctx.parser.currentToken()); + } + } + + /** + * Normally returns a MapXNode. However, JSON primitives can be simulated by two-member object (@type + @value); in these cases we return PrimitiveXNode. + */ + @NotNull + private XNode parseJsonObject(JsonParsingContext ctx) throws SchemaException, IOException { + Validate.notNull(ctx.parser.currentToken()); + + final MapXNode map = new MapXNode(); + QName typeName = null; + PrimitiveXNode primitiveValue = null; + boolean defaultNamespaceDefined = false; + QName currentFieldName = null; + for (;;) { + JsonToken token = ctx.parser.nextToken(); + if (token == null) { + ctx.prismParsingContext.warnOrThrow(LOGGER, "Unexpected end of data while parsing a map structure at " + getPositionSuffix(ctx)); + break; + } else if (token == JsonToken.END_OBJECT) { + break; + } else if (token == JsonToken.FIELD_NAME) { + String newFieldName = ctx.parser.getCurrentName(); + if (currentFieldName != null) { + ctx.prismParsingContext.warnOrThrow(LOGGER, "Two field names in succession: " + currentFieldName + " and " + newFieldName); + } + currentFieldName = QNameUtil.uriToQName(newFieldName, true); + } else { + XNode valueXNode = parseValue(ctx); + if (isSpecial(currentFieldName)) { + String stringValue; + if (!(valueXNode instanceof PrimitiveXNode)) { + ctx.prismParsingContext.warnOrThrow(LOGGER, "Value of '" + currentFieldName + "' attribute must be a primitive one. It is " + valueXNode + " instead. At " + getPositionSuffix(ctx)); + stringValue = ""; + } else { + stringValue = ((PrimitiveXNode) valueXNode).getStringValue(); + } + + if (isNamespaceDeclaration(currentFieldName)) { + if (defaultNamespaceDefined) { + ctx.prismParsingContext.warnOrThrow(LOGGER, "Default namespace defined more than once at " + getPositionSuffix(ctx)); + } + ctx.defaultNamespaces.put(map, stringValue); + defaultNamespaceDefined = true; + } else if (isTypeDeclaration(currentFieldName)) { + if (typeName != null) { + ctx.prismParsingContext.warnOrThrow(LOGGER, "Value type defined more than once at " + getPositionSuffix(ctx)); + } + typeName = QNameUtil.uriToQName(stringValue, true); + } else if (isValue(currentFieldName)) { + if (primitiveValue != null) { + ctx.prismParsingContext.warnOrThrow(LOGGER, "Primitive value ('" + PROP_VALUE + "') defined more than once at " + getPositionSuffix(ctx)); + } + if (valueXNode instanceof PrimitiveXNode) { + primitiveValue = (PrimitiveXNode) valueXNode; + } + } + } else { + map.put(currentFieldName, valueXNode); + } + currentFieldName = null; + } + } + // Return either map or primitive value (in case of @type/@value) + XNode rv; + if (primitiveValue != null) { + if (!map.isEmpty()) { + ctx.prismParsingContext.warnOrThrow(LOGGER, "Both '" + PROP_VALUE + "' and regular content present at " + getPositionSuffix(ctx)); + rv = map; + } else { + rv = primitiveValue; + } + } else { + rv = map; + } + rv.setTypeQName(typeName); + return rv; + } + + private boolean isSpecial(QName fieldName) { + return isTypeDeclaration(fieldName) || isNamespaceDeclaration(fieldName) || isValue(fieldName); + } + + private boolean isTypeDeclaration(QName fieldName) { + return new QName(PROP_TYPE).equals(fieldName); + } + + private boolean isNamespaceDeclaration(QName fieldName) { + return new QName(PROP_NAMESPACE).equals(fieldName); + } + + private boolean isValue(QName fieldName) { + return new QName(PROP_VALUE).equals(fieldName); + } + + private String getPositionSuffix(JsonParsingContext ctx) { + return String.valueOf(ctx.parser.getCurrentLocation()); + } + + private ListXNode parseToList(JsonParsingContext ctx) throws SchemaException, IOException { + Validate.notNull(ctx.parser.currentToken()); + + ListXNode list = new ListXNode(); + for (;;) { + JsonToken token = ctx.parser.nextToken(); + if (token == null) { + ctx.prismParsingContext.warnOrThrow(LOGGER, "Unexpected end of data while parsing a list structure at " + getPositionSuffix(ctx)); + return list; + } else if (token == JsonToken.END_ARRAY) { + return list; + } else { + list.add(parseValue(ctx)); + } + } + } + + private PrimitiveXNode parseToPrimitive(JsonParsingContext ctx) throws IOException, SchemaException { + PrimitiveXNode primitive = new PrimitiveXNode(); + + Object tid = ctx.parser.getTypeId(); + if (tid != null) { + System.out.println("tid = '" + tid + "' for " + ctx.parser.getText()); + QName typeName = tagToTypeName(tid, ctx); + primitive.setTypeQName(typeName); + primitive.setExplicitTypeDeclaration(true); + } else { + // We don't try to determine XNode type from the implicit JSON/YAML type (integer, number, ...), + // because XNode type prescribes interpretation in midPoint. E.g. YAML string type would be interpreted + // as xsd:string, even if the schema would expect e.g. timestamp. + } + + JsonNode jn = ctx.parser.readValueAs(JsonNode.class); + ValueParser vp = new JsonValueParser(ctx.parser, jn); + primitive.setValueParser(vp); + + return primitive; + } + + // TODO remove if not needed + private QName getCurrentTypeName(JsonParsingContext ctx) throws IOException, SchemaException { + switch (ctx.parser.currentToken()) { + case VALUE_NUMBER_INT: + case VALUE_NUMBER_FLOAT: + return determineNumberType(ctx.parser.getNumberType()); + case VALUE_FALSE: + case VALUE_TRUE: + return DOMUtil.XSD_BOOLEAN; + case VALUE_STRING: + return DOMUtil.XSD_STRING; + case VALUE_NULL: + return null; // TODO? + default: + throw new SchemaException("Unexpected current token type: " + ctx.parser.currentToken() + "/" + ctx.parser.getText() + " at " + getPositionSuffix(ctx)); + } + } + + QName determineNumberType(JsonParser.NumberType numberType) throws SchemaException { + switch (numberType) { + case BIG_DECIMAL: + return DOMUtil.XSD_DECIMAL; + case BIG_INTEGER: + return DOMUtil.XSD_INTEGER; + case LONG: + return DOMUtil.XSD_LONG; + case INT: + return DOMUtil.XSD_INT; + case FLOAT: + return DOMUtil.XSD_FLOAT; + case DOUBLE: + return DOMUtil.XSD_DOUBLE; + default: + throw new SchemaException("Unsupported number type: " + numberType); + } + } + + protected abstract QName tagToTypeName(Object tid, JsonParsingContext ctx) throws IOException, SchemaException; + + private JsonParser configureParser(JsonParser parser) { + ObjectMapper mapper = new ObjectMapper(); + SimpleModule sm = new SimpleModule(); + sm.addDeserializer(QName.class, new QNameDeserializer()); + sm.addDeserializer(ItemPath.class, new ItemPathDeserializer()); + sm.addDeserializer(PolyString.class, new PolyStringDeserializer()); + sm.addDeserializer(ItemPathType.class, new ItemPathTypeDeserializer()); + + mapper.registerModule(sm); + parser.setCodec(mapper); + return parser; + } + + //endregion + + //region Serialization implementation + + class JsonSerializationContext { + @NotNull final JsonGenerator generator; + @NotNull private final SerializationContext prismSerializationContext; + private String currentNamespace; + + private JsonSerializationContext(@NotNull JsonGenerator generator, @Nullable SerializationContext prismSerializationContext) { + this.generator = generator; + this.prismSerializationContext = prismSerializationContext != null ? + prismSerializationContext : + new SerializationContext(null); + } + } + @Override + public String serializeToString(XNode xnode, QName rootElementName, SerializationContext serializationContext) throws SchemaException { + return serializeToString(ParserUtils.createRootXNode(xnode, rootElementName), serializationContext); + } + + protected abstract JsonGenerator createJacksonGenerator(StringWriter out) throws SchemaException; + + protected abstract void writeExplicitType(QName explicitType, JsonGenerator generator) throws IOException; + + @Override + public String serializeToString(RootXNode root, SerializationContext prismSerializationContext) throws SchemaException { + StringWriter out = new StringWriter(); + try ( JsonGenerator generator = createJacksonGenerator(out) ) { + JsonSerializationContext ctx = new JsonSerializationContext(generator, prismSerializationContext); + serialize(root.asMapXNode(), ctx); // TODO default namespace + } catch (IOException ex) { + throw new SchemaException("Error during serializing to JSON/YAML: " + ex.getMessage(), ex); + } + return out.toString(); + } + + private void serialize(XNode xnode, JsonSerializationContext ctx) throws IOException { + if (xnode instanceof MapXNode) { + serializeFromMap((MapXNode) xnode, ctx); + } else if (xnode instanceof ListXNode) { + serializeFromList((ListXNode) xnode, ctx); + } else if (xnode instanceof PrimitiveXNode) { + serializeFromPrimitive((PrimitiveXNode) xnode, ctx); + } else if (xnode instanceof SchemaXNode) { + serializeFromSchema((SchemaXNode) xnode, ctx); + } else if (xnode == null) { + // nothing to serialize + } else { + throw new UnsupportedOperationException("Cannot serialize from " + xnode); + } + } + + private void serializeFromMap(MapXNode map, JsonSerializationContext ctx) throws IOException { + ctx.generator.writeStartObject(); + QName explicitType = getExplicitType(map); + if (explicitType != null) { + writeExplicitType(explicitType, ctx.generator); + } + for (Entry entry : map.entrySet()) { + ctx.generator.writeFieldName(QNameUtil.qNameToUri(entry.getKey(), false)); + serialize(entry.getValue(), ctx); + } + ctx.generator.writeEndObject(); + } + + private void serializeFromList(ListXNode list, JsonSerializationContext ctx) throws IOException { + ctx.generator.writeStartArray(); + for (XNode item : list) { + serialize(item, ctx); + } + ctx.generator.writeEndArray(); + } + + protected abstract void serializeFromPrimitive(PrimitiveXNode primitive, JsonSerializationContext ctx) throws IOException; + + private void serializeFromSchema(SchemaXNode node, JsonSerializationContext ctx) throws IOException { + ctx.generator.writeObject(node.getSchemaElement()); + } + + + void serializePrimitiveTypeLessValue(PrimitiveXNode primitive, JsonSerializationContext ctx) throws IOException { + if (primitive.isParsed()) { + ctx.generator.writeObject(primitive.getValue()); + } else { + ctx.generator.writeObject(primitive.getStringValue()); + } + } + + protected QName getExplicitType(XNode xnode) { + return xnode.isExplicitTypeDeclaration() ? xnode.getTypeQName() : null; + } + + private String serializeNsIfNeeded(QName subNodeName, String globalNamespace, JsonGenerator generator) throws JsonGenerationException, IOException{ + if (subNodeName == null){ + return globalNamespace; + } + String subNodeNs = subNodeName.getNamespaceURI(); + if (StringUtils.isNotBlank(subNodeNs)){ + if (!subNodeNs.equals(globalNamespace)){ + globalNamespace = subNodeNs; + generator.writeStringField(PROP_NAMESPACE, globalNamespace); + + } + } + return globalNamespace; + } + //endregion + +} diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/AbstractParser.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/AbstractParser.java deleted file mode 100644 index 52e4c3e7eb0..00000000000 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/AbstractParser.java +++ /dev/null @@ -1,822 +0,0 @@ -/* - * Copyright (c) 2010-2016 Evolveum - * - * 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 com.evolveum.midpoint.prism.parser.json; - -import java.io.*; -import java.util.*; -import java.util.Map.Entry; - -import javax.xml.namespace.QName; - -import com.evolveum.midpoint.prism.parser.Parser; -import com.evolveum.midpoint.prism.parser.ParserUtils; -import com.evolveum.midpoint.util.logging.LoggingUtils; -import com.evolveum.midpoint.util.logging.Trace; -import com.evolveum.midpoint.util.logging.TraceManager; -import org.apache.commons.lang.StringUtils; -import org.apache.commons.lang3.Validate; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.w3c.dom.Document; -import org.w3c.dom.Element; -import org.w3c.dom.Node; - -import com.evolveum.midpoint.prism.path.ItemPath; -import com.evolveum.midpoint.prism.polystring.PolyString; -import com.evolveum.midpoint.prism.xnode.ListXNode; -import com.evolveum.midpoint.prism.xnode.MapXNode; -import com.evolveum.midpoint.prism.xnode.PrimitiveXNode; -import com.evolveum.midpoint.prism.xnode.RootXNode; -import com.evolveum.midpoint.prism.xnode.SchemaXNode; -import com.evolveum.midpoint.prism.xnode.ValueParser; -import com.evolveum.midpoint.prism.xnode.XNode; -import com.evolveum.midpoint.util.DOMUtil; -import com.evolveum.midpoint.util.QNameUtil; -import com.evolveum.midpoint.util.exception.SchemaException; -import com.evolveum.prism.xml.ns._public.types_3.ItemPathType; -import com.fasterxml.jackson.core.JsonGenerationException; -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.core.JsonParseException; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.core.JsonToken; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.module.SimpleModule; - -public abstract class AbstractParser implements Parser { - - private static final Trace LOGGER = TraceManager.getTrace(AbstractParser.class); - - private static final String PROP_NAMESPACE = "@ns"; - private static final String PROP_TYPE = "@type"; - protected static final String TYPE_DEFINITION = "@typeDef"; - protected static final String VALUE_FIELD = "@value"; - - - //region Parsing implementation - - @Override - public RootXNode parse(File file) throws SchemaException, IOException { - try (FileInputStream fis = new FileInputStream(file)) { - JsonParser parser = createJacksonParser(fis); - return parseFromStart(parser); - } - } - - @Override - public RootXNode parse(InputStream stream) throws SchemaException, IOException { - JsonParser parser = createJacksonParser(stream); - return parseFromStart(parser); - } - - @Override - public RootXNode parse(String dataString) throws SchemaException { - JsonParser parser = createJacksonParser(dataString); - return parseFromStart(parser); - } - - @Override - public Collection parseCollection(File file) throws SchemaException, IOException { - throw new UnsupportedOperationException("Parse objects not supported for json and yaml."); // why? - } - - @Override - public Collection parseCollection(InputStream stream) throws SchemaException, IOException { - throw new UnsupportedOperationException("Parse objects not supported for json and yaml."); // why? - } - - @Override - public Collection parseCollection(String dataString) throws SchemaException { - throw new UnsupportedOperationException("Parse objects not supported for json and yaml."); // why? - } - - protected abstract JsonParser createJacksonParser(String dataString) throws SchemaException; - protected abstract JsonParser createJacksonParser(InputStream stream) throws SchemaException, IOException; - - private class ParsingContext { - @NotNull final JsonParser parser; - @NotNull final Map defaultNamespaces = new HashMap<>(); - ParsingContext(@NotNull JsonParser parser) { - this.parser = parser; - } - } - - @NotNull - private RootXNode parseFromStart(JsonParser unconfiguredParser) throws SchemaException { - try { - JsonParser parser = configureParser(unconfiguredParser); - parser.nextToken(); - if (parser.currentToken() == null) { - throw new SchemaException("Nothing to parse: the input is empty."); - } - ParsingContext ctx = new ParsingContext(parser); - XNode xnode = parseValue(ctx); - if (!(xnode instanceof MapXNode) || ((MapXNode) xnode).size() != 1) { - throw new SchemaException("Expected MapXNode with a single key; got " + xnode + " instead."); - } - processDefaultNamespaces(xnode, null, ctx); - Entry entry = ((MapXNode) xnode).entrySet().iterator().next(); - RootXNode root = new RootXNode(entry.getKey(), entry.getValue()); - if (entry.getValue() != null) { - root.setTypeQName(entry.getValue().getTypeQName()); // TODO - ok ???? - } - return root; - } catch (IOException e) { - throw new SchemaException("Cannot parse JSON/YAML object: " + e.getMessage(), e); - } - } - - private void processDefaultNamespaces(XNode xnode, String parentDefault, ParsingContext ctx) { - if (xnode instanceof MapXNode) { - MapXNode map = (MapXNode) xnode; - final String currentDefault = ctx.defaultNamespaces.containsKey(map) ? ctx.defaultNamespaces.get(map) : parentDefault; - for (Entry entry : map.entrySet()) { - QName fieldName = entry.getKey(); - XNode subnode = entry.getValue(); - if (StringUtils.isNotEmpty(currentDefault) && StringUtils.isEmpty(fieldName.getNamespaceURI())) { - map.qualifyKey(fieldName, currentDefault); - } - processDefaultNamespaces(subnode, currentDefault, ctx); - } - } else if (xnode instanceof ListXNode) { - for (XNode item : (ListXNode) xnode) { - processDefaultNamespaces(item, parentDefault, ctx); - } - } - } - - @Nullable // TODO: ok? - private XNode parseValue(ParsingContext ctx) throws IOException, SchemaException { - Validate.notNull(ctx.parser.currentToken()); - - switch (ctx.parser.currentToken()) { - case START_OBJECT: - return parseToMap(ctx); - case START_ARRAY: - return parseToList(ctx); - case VALUE_STRING: - case VALUE_TRUE: - case VALUE_FALSE: - case VALUE_NUMBER_FLOAT: - case VALUE_NUMBER_INT: - return parseToPrimitive(ctx); - case VALUE_NULL: - return null; // TODO... - default: - throw new SchemaException("Unexpected current token: " + ctx.parser.currentToken()); - } - } - - @NotNull - private MapXNode parseToMap(ParsingContext ctx) throws SchemaException, IOException { - Validate.notNull(ctx.parser.currentToken()); - - final MapXNode map = new MapXNode(); - boolean defaultNamespaceDefined = false; - QName currentFieldName = null; - for (;;) { - JsonToken token = ctx.parser.nextToken(); - if (token == null) { - throw new SchemaException("Unexpected end of data while parsing a map structure"); - } else if (token == JsonToken.END_OBJECT) { - break; - } else if (token == JsonToken.FIELD_NAME) { - String newFieldName = ctx.parser.getCurrentName(); - if (currentFieldName != null) { - throw new SchemaException("Two field names in succession: " + currentFieldName + " and " + newFieldName); - } - currentFieldName = QNameUtil.uriToQName(newFieldName, true); - } else { - XNode valueXNode = parseValue(ctx); - if (new QName(PROP_NAMESPACE).equals(currentFieldName)) { - if (valueXNode instanceof PrimitiveXNode) { - ctx.defaultNamespaces.put(map, ((PrimitiveXNode) valueXNode).getStringValue()); - if (defaultNamespaceDefined) { - throw new SchemaException("Default namespace defined more than once at " + getPositionSuffix(ctx)); - } - } else { - throw new SchemaException("Value of '" + PROP_NAMESPACE + "' attribute must be a primitive one. It is " + valueXNode + " instead."); - } - } else if (new QName(PROP_TYPE).equals(currentFieldName)) { - if (valueXNode instanceof PrimitiveXNode) { - if (map.getTypeQName() != null) { - throw new SchemaException("Value type defined more than once at " + getPositionSuffix(ctx)); - } - map.setTypeQName(QNameUtil.uriToQName(((PrimitiveXNode) valueXNode).getStringValue(), true)); - } else { - throw new SchemaException("Value of '" + PROP_TYPE + "' attribute must be a primitive one. It is " + valueXNode + " instead."); - } - } else { - map.put(currentFieldName, valueXNode); - } - currentFieldName = null; - } - } - return map; - } - - private String getPositionSuffix(ParsingContext ctx) { - return String.valueOf(ctx.parser.getCurrentLocation()); - } - - private ListXNode parseToList(ParsingContext ctx) throws SchemaException, IOException { - Validate.notNull(ctx.parser.currentToken()); - - ListXNode list = new ListXNode(); - for (;;) { - JsonToken token = ctx.parser.nextToken(); - if (token == null) { - throw new SchemaException("Unexpected end of data while parsing a list structure"); - } else if (token == JsonToken.END_ARRAY) { - return list; - } else { - list.add(parseValue(ctx)); - } - } - } - - private PrimitiveXNode parseToPrimitive(ParsingContext ctx) throws IOException { - PrimitiveXNode primitive = createPrimitiveXNode(ctx.parser, null); - return primitive; - } - - private PrimitiveXNode createPrimitiveXNode(JsonParser parser, QName typeDefinition) throws IOException { - PrimitiveXNode primitive = new PrimitiveXNode(); - Object tid = parser.getTypeId(); - if (tid != null) { - if (tid.equals("http://www.w3.org/2001/XMLSchema/string")) { - typeDefinition = DOMUtil.XSD_STRING; - } else if (tid.equals("http://www.w3.org/2001/XMLSchema/int")) { - typeDefinition = DOMUtil.XSD_INT; - } - } - if (typeDefinition != null) { - primitive.setExplicitTypeDeclaration(true); - primitive.setTypeQName(typeDefinition); - } - JsonNode jn = parser.readValueAs(JsonNode.class); - ValueParser vp = new JsonValueParser(parser, jn); - primitive.setValueParser(vp); - - return primitive; - } - - private RootXNode parseJsonObject(JsonParser parser) throws SchemaException { - try { - JsonToken t = parser.currentToken(); - if (t == null) { - parser.nextToken(); - } - RootXNode rootXNode = new RootXNode(); - while (parser.nextToken() != null) { - parse(rootXNode, null, parser); - } - return rootXNode; - } catch (IOException e) { - throw new SchemaException("Cannot parseJsonObject from JSON: " + e.getMessage(), e); - } - } - - private void parse(XNode xnode, QName propertyName, JsonParser parser) throws IOException, SchemaException { - JsonToken token = parser.currentToken(); - if (token == null) { - return; - } - propertyName = parseFieldName(xnode, propertyName, parser); - - switch (parser.getCurrentToken()) { - case START_OBJECT: - parseToMap(propertyName, xnode, parser); - break; - case START_ARRAY: - parseToList(propertyName, xnode, parser); - break; - case VALUE_STRING: - case VALUE_TRUE: - case VALUE_FALSE: - case VALUE_NUMBER_FLOAT: - case VALUE_NUMBER_INT: - parseToPrimitive(propertyName, xnode, parser); - break; - default: - // System.out.println("DEFAULT SWICH NODE"); - break; - - } - } - //endregion - - //region Serialization implementation - - @Override - public String serializeToString(XNode xnode, QName rootElementName) throws SchemaException { - return serializeToString(ParserUtils.createRootXNode(xnode, rootElementName)); - } - - @Override - public String serializeToString(RootXNode xnode) throws SchemaException { - QName rootElementName = xnode.getRootElementName(); - QName explicitType = xnode.getTypeQName(); - return serialize(xnode.getSubnode(), explicitType, rootElementName); - } - - protected abstract JsonGenerator createJacksonGenerator(StringWriter out) throws SchemaException; - - - - private boolean root = true; - - protected abstract void writeExplicitType(QName explicitType, JsonGenerator generator) throws JsonGenerationException, IOException; - - // ------------------- METHODS FOR SERIALIZATION ------------------------------ - public String serialize(XNode node, QName explicitType, QName rootElement) throws SchemaException{ - JsonGenerator generator = null; - StringWriter out = new StringWriter(); - try { - - generator = createJacksonGenerator(out); - - generator.writeStartObject(); - generator.writeStringField(PROP_NAMESPACE, rootElement.getNamespaceURI()); - generator.writeObjectFieldStart(rootElement.getLocalPart()); - if (hasExplicitTypeDeclaration(rootElement)){ - writeExplicitType(explicitType, generator); - } - serialize(node, rootElement, rootElement.getNamespaceURI(), generator); - generator.writeEndObject(); - - - } catch (IOException ex){ - throw new SchemaException("Schema error during serializing to JSON.", ex); - } catch (RuntimeException e) { - LoggingUtils.logException(LOGGER, "Unexpected exception while serializing", e); - System.out.println("Unexpected exception while serializing: " + e); - e.printStackTrace(); - } finally { - if (generator != null) { - try { - generator.flush(); - generator.close(); - } catch (IOException e) { - throw new SchemaException(e.getMessage(), e); - } // beware, this code can throw any exception, masking the original one - - } - - } - return out.toString(); - - } - - private boolean hasExplicitTypeDeclaration(QName elementName){ - return elementName.getLocalPart().equals("object"); - } - private void serialize(XNode node, QName nodeName, String globalNamespace, JsonGenerator generator) throws JsonGenerationException, IOException{ - - if (node instanceof MapXNode){ - serializeFromMap((MapXNode) node, nodeName, globalNamespace, generator); - } else if (node instanceof ListXNode){ - serializeFromList((ListXNode) node, nodeName, globalNamespace, generator); - } else if (node instanceof PrimitiveXNode){ - serializeFromPrimitive((PrimitiveXNode) node, nodeName, generator); - } else if (node instanceof SchemaXNode){ - serializeFromSchema((SchemaXNode) node, nodeName, generator); - } else if (node == null) { - serializeFromNull(nodeName, generator); - } else { - throw new IllegalStateException("Unsupported node type: " + node.getClass().getSimpleName()); - } - } - - private void writeObjectStart(QName nodeName, String globalNamespace, JsonGenerator generator) throws JsonGenerationException, IOException{ - if (nodeName == null) { - generator.writeStartObject(); - } else { - if (!globalNamespace.equals(nodeName.getNamespaceURI()) && StringUtils.isNotBlank(nodeName.getNamespaceURI())){ - generator.writeStringField(PROP_NAMESPACE, nodeName.getNamespaceURI()); - globalNamespace = nodeName.getNamespaceURI(); - } - generator.writeObjectFieldStart(nodeName.getLocalPart()); - } - } - - private void serializeFromMap(MapXNode map, QName nodeName, String globalNamespace, JsonGenerator generator) throws JsonGenerationException, IOException{ - - if (root) { - root = false; - } else { - writeObjectStart(nodeName, globalNamespace, generator); - } - -// Iterator> subnodes = map.entrySet().iterator(); - Iterator> subnodes = getMapIterator(map); - - while (subnodes.hasNext()){ - Entry subNode = subnodes.next(); - XNode subNodeValue = subNode.getValue(); - if (subNodeValue instanceof PrimitiveXNode && ((PrimitiveXNode) subNodeValue).isAttribute()){ - continue; - } -// if (subNode.getKey().getLocalPart().equals("oid") || subNode.getKey().getLocalPart().equals("version")){ -// continue; -// } - globalNamespace = serializeNsIfNeeded(subNode.getKey(), globalNamespace, generator); - break; - } - - subnodes = getMapIterator(map); - - while (subnodes.hasNext()){ - Entry subNode = subnodes.next(); - globalNamespace = serializeNsIfNeeded(subNode.getKey(), globalNamespace, generator); - serialize(subNode.getValue(), subNode. getKey(), globalNamespace, generator); - } - generator.writeEndObject(); - - } - - private Iterator> getMapIterator(MapXNode map){ - if (map.entrySet() == null){ - throw new IllegalStateException("Strange thing happened. No entries in xmap"); - } - return map.entrySet().iterator(); - } - - private void serializeFromList(ListXNode list, QName nodeName, String globalNamespace, JsonGenerator generator) throws JsonGenerationException, IOException{ - ListIterator sublist = list.listIterator(); - generator.writeArrayFieldStart(nodeName.getLocalPart()); - while (sublist.hasNext()){ - serialize(sublist.next(), null, globalNamespace, generator); - } - generator.writeEndArray(); - } - - protected abstract boolean serializeExplicitType(PrimitiveXNode primitive, QName explicitType, JsonGenerator generator) throws JsonGenerationException, IOException ; - - protected QName getExplicitType(PrimitiveXNode primitive){ - QName explicit = null; - if (primitive.isExplicitTypeDeclaration()) { - explicit = primitive.getTypeQName(); - } - return explicit; - } - - @SuppressWarnings("unchecked") - private void serializeFromPrimitive(PrimitiveXNode primitive, QName nodeName, JsonGenerator generator) throws JsonGenerationException, IOException{ - - QName explicitType = getExplicitType(primitive); - if (serializeExplicitType(primitive, explicitType, generator)){ - return; - } - - T value = primitive.getValue(); - if (value == null) { - value = (T) primitive.getStringValue(); - // TODO write also namespace declarations! - } - if (nodeName == null) { - generator.writeObject(value); - } else { - - generator.writeObjectField(nodeName.getLocalPart(), value); - } - } - - @SuppressWarnings("unchecked") - private void serializeFromNull(QName nodeName, JsonGenerator generator) throws JsonGenerationException, IOException{ - if (nodeName == null) { - generator.writeObject(""); // is this reasonable? - } else { - generator.writeObjectField(nodeName.getLocalPart(), ""); - //generator.writeFieldName(nodeName.getLocalPart()); // todo how to write empty objects? - } - } - - private void serializeFromSchema(SchemaXNode node, QName nodeName, JsonGenerator generator) throws JsonProcessingException, IOException { - generator.writeObjectField(nodeName.getLocalPart(), node.getSchemaElement()); - - } - - private String serializeNsIfNeeded(QName subNodeName, String globalNamespace, JsonGenerator generator) throws JsonGenerationException, IOException{ - if (subNodeName == null){ - return globalNamespace; - } - String subNodeNs = subNodeName.getNamespaceURI(); - if (StringUtils.isNotBlank(subNodeNs)){ - if (!subNodeNs.equals(globalNamespace)){ - globalNamespace = subNodeNs; - generator.writeStringField(PROP_NAMESPACE, globalNamespace); - - } - } - return globalNamespace; - } - //------------------------END OF METHODS FOR SERIALIZATION ------------------------------- - - private JsonParser configureParser(JsonParser parser){ - ObjectMapper mapper = new ObjectMapper(); - SimpleModule sm = new SimpleModule(); - sm.addDeserializer(QName.class, new QNameDeserializer()); - sm.addDeserializer(ItemPath.class, new ItemPathDeserializer()); - sm.addDeserializer(PolyString.class, new PolyStringDeserializer()); - sm.addDeserializer(ItemPathType.class, new ItemPathTypeDeserializer()); - - mapper.registerModule(sm); - parser.setCodec(mapper); - return parser; - } - - //------------------------ METHODS FOR PARSING ------------------------------------------- - - private QName parseFieldName(XNode xnode, QName propertyName, JsonParser parser) throws JsonParseException, IOException{ - - JsonToken token = parser.getCurrentToken(); - String ns = null; - if (propertyName != null){ - ns = propertyName.getNamespaceURI(); - } - if (token == JsonToken.FIELD_NAME) { - String fieldName = parser.getText(); - if (fieldName.startsWith(PROP_NAMESPACE)) { - ns = parser.nextTextValue(); - propertyName = new QName(ns, fieldName); - - token = parser.nextToken(); - if (token == JsonToken.FIELD_NAME) { - fieldName = parser.getText(); - propertyName = new QName(ns, fieldName); - } - } else { - propertyName = new QName(ns, fieldName); - } - token = parser.nextToken(); - - } - return propertyName; - - } - - - private void parseToMap(QName propertyName, XNode parent, JsonParser parser) throws SchemaException, JsonParseException, IOException{ - -// System.out.println("parseToMap - propertyName " + propertyName); - QName parentPropertyName = propertyName; -// if (parser.getCurrentToken() == JsonToken.FIELD_NAME){ -// if (parser.getCurrentName().equals(TYPE_DEFINITION)) { -// parseSpecial(parent, propertyName, parser); -// return; -// } -// parseJsonObject(parent, propertyName, parser); -// } - if (parser.getCurrentToken() == null){ - return; - } - MapXNode subMap = new MapXNode(); - - String ns = processNamespace(parent, parser); - - boolean specialFound = false; - boolean iterate = false; - while (moveNext(parser, iterate)) { - if (processSpecialIfNeeded(parser, parent, propertyName)) { - specialFound = true; - break; - } - if (ns != null) { - propertyName = new QName(ns, propertyName.getLocalPart()); - } - parse(subMap, propertyName, parser); - // step(parser); -// parser.nextToken(); - iterate = true; - - } - - //DO not add to the parent, if the map does not contain any values.. - // and a primitive value was found - if (specialFound && subMap.isEmpty()) { - return; - } -// System.out.println("CURRENT TOKEN: " + parser.getCurrentToken()); -// System.out.println("SUB MAP creation"); - if (parent instanceof RootXNode){ -// System.out.println("SETTING SUBMAP FOR PARENT"); - ((RootXNode) parent).setRootElementName(parentPropertyName); - ((RootXNode) parent).setSubnode(subMap); - } else { -// System.out.println("ADDING submap"); - addXNode(parentPropertyName, parent, subMap); - } - } - - private boolean processSpecialIfNeeded(JsonParser parser, XNode xmap, QName propertyName) throws SchemaException{ - try { - if (parser.getCurrentToken() == JsonToken.FIELD_NAME - && (parser.getCurrentName().equals(TYPE_DEFINITION) )) { - parseSpecial(xmap, propertyName, parser); - return true; - } - } catch (JsonParseException e) { - throw new SchemaException("Can't process namespace: " + e.getMessage(), e); - } catch (IOException e) { - throw new SchemaException("Can't process namespace: " + e.getMessage(), e); - } - return false; - } - - private String processNamespace(XNode xnode, JsonParser parser) throws SchemaException{ - JsonToken t; - try { - t = parser.nextToken(); -// ObjectMapper m = new ObjectMapper(); -// m. -// -// ObjectMapper c = (ObjectMapper) parser.getCodec(); -// ObjectReader r = c.reader(JsonNode.class); -// MappingIterator nodes = r.readValues(parser); //Tree(jp)dValue(parser); //readValue(parser, JsonNode.class); -// while (nodes.hasNext()){ -// JsonNode node = nodes.next(); -// if (node.get(PROP_NAMESPACE) != null){ -// String ns = node.get(PROP_NAMESPACE).asText(); -//// parser.nextToken(); -//// parser.nextValue(); -// return ns; -// } else if (node.get("@type") != null){ -// JsonValueParser vp = new JsonValueParser(parser, node.get("@type")); -// QName type = vp.parseJsonObject(DOMUtil.XSD_QNAME); -// xnode.setExplicitTypeDeclaration(true); -// xnode.setTypeQName(type); -// return null; -// } -// } -// JsonNode node = parser.readValueAs(JsonNode.class); - -// System.out.println("MOVE NEXT : " + t +" NAME: " + parser.getCurrentName()); - if (t == JsonToken.FIELD_NAME) { - if (parser.getCurrentName().startsWith(PROP_NAMESPACE)) { - - // System.out.println("ano ano ano"); - // System.out.println(parser.getCurrentName()); - String ns = parser.nextTextValue(); - parser.nextToken(); - return ns; - } else if (parser.getCurrentName().equals("@type")) { - parser.nextToken(); - - QName type = parser.readValueAs(QName.class); - // propertyName = new QName(ns, fieldName); - xnode.setExplicitTypeDeclaration(true); - xnode.setTypeQName(type); - parser.nextToken(); - - } - - } - return null; - } catch (JsonParseException e) { - throw new SchemaException("Can't process namespace: " + e.getMessage(), e); - } catch (IOException e) { - throw new SchemaException("Can't process namespace: " + e.getMessage(), e); - } - - } - private boolean moveNext(JsonParser parser, boolean iterate) throws SchemaException, JsonParseException, IOException{ - - if (iterate){ - parser.nextToken(); - } - - JsonToken t = parser.getCurrentToken(); - return (t != null && t != JsonToken.END_ARRAY && t != JsonToken.END_OBJECT); - } - - private void parseToList(QName propertyName, XNode parent, JsonParser parser) throws SchemaException, JsonParseException, IOException{ - - if (parser.getCurrentToken() == null){ - return; - } - -// System.out.println("CURRENT LIST TOKEN: " + parser.getCurrentToken()); - ListXNode listNode = new ListXNode(); -// System.out.println("LIST NODE CREATED, ADDING TO PARENT"); - addXNode(propertyName, parent, listNode); - -// step(parser); - while (moveNext(parser, true)){ - if (processSpecialIfNeeded(parser, listNode, propertyName)){ - continue; - } -// System.out.println("LIST HAS NEXT, proeprtyName " + propertyName); - parse(listNode, propertyName, parser); -// step(parser); - } - - } - - private void parseToPrimitive(QName propertyName, XNode parent, JsonParser parser) throws JsonProcessingException, IOException{ -// System.out.println("PROMITIVE CURRENT TOKEN : " + parser.getCurrentToken()); - if (propertyName != null){ - if (propertyName.getLocalPart().equals(PROP_NAMESPACE)){ - return; - } else if (propertyName.equals(DOMUtil.XSD_SCHEMA_ELEMENT)){ - SchemaXNode schemaNode = new SchemaXNode(); - Node node = parser.readValueAs(Node.class); - Element e = null; - if (node instanceof Document){ - e = ((Document)node).getDocumentElement(); - } - - schemaNode.setSchemaElement(e); - addXNode(DOMUtil.XSD_SCHEMA_ELEMENT, parent, schemaNode); - return; - } - } - PrimitiveXNode primitive = createPrimitiveXNode(parser); - addXNode(propertyName, parent, primitive); - } - - private void parseSpecial(XNode xmap, QName propertyName, JsonParser parser) throws SchemaException{ - // System.out.println("special"); - try { - QName typeDefinition = null; - if (parser.getCurrentToken() == JsonToken.FIELD_NAME - && parser.getCurrentName().equals(TYPE_DEFINITION)) { - - String uri = parser.nextTextValue(); - typeDefinition = QNameUtil.uriToQName(uri); - - if (parser.nextToken() == JsonToken.FIELD_NAME && parser.getCurrentName().equals(VALUE_FIELD)) { - parser.nextToken(); - } - - PrimitiveXNode primitive = createPrimitiveXNode1(parser, typeDefinition); - addXNode(propertyName, xmap, primitive); - parser.nextToken(); - } - } catch (JsonParseException e){ - throw new SchemaException("Cannot parseJsonObject special element: " + e.getMessage(), e); - } catch (IOException e){ - throw new SchemaException("Cannot parseJsonObject special element: " + e.getMessage(), e); - } - } - - //---------------------------END OF METHODS FOR PARSING ---------------------------------------- - - //------------------------------ HELPER METHODS ------------------------------------------------ - private PrimitiveXNode createPrimitiveXNode(final JsonParser parser) throws JsonProcessingException, IOException{ - return createPrimitiveXNode(parser, null); - } - - private PrimitiveXNode createPrimitiveXNode1(final JsonParser parser, QName typeDefinition) throws JsonProcessingException, IOException{ - PrimitiveXNode primitive = new PrimitiveXNode(); - Object tid = parser.getTypeId(); -// System.out.println("tag: " + tid); - if (tid != null){ - if (tid.equals("http://www.w3.org/2001/XMLSchema/string")){ -// System.out.println("Setting explicit definition"); - typeDefinition = DOMUtil.XSD_STRING; - } else if (tid.equals("http://www.w3.org/2001/XMLSchema/int")){ -// System.out.println("Setting explicit definition"); - typeDefinition = DOMUtil.XSD_INT; - } - } -// System.out.println("explicit definition " + typeDefinition); - if (typeDefinition != null){ - - primitive.setExplicitTypeDeclaration(true); - primitive.setTypeQName(typeDefinition); - } - JsonNode jn = parser.readValueAs(JsonNode.class); - ValueParser vp = new JsonValueParser(parser, jn); - primitive.setValueParser(vp); - - return primitive; - } - - - private void addXNode(QName fieldName, XNode parent, XNode children) { - if (parent instanceof MapXNode) { - ((MapXNode) parent).put(fieldName, children); - } else if (parent instanceof ListXNode) { - ((ListXNode) parent).add(children); - } - } - - - -} diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/JsonParser.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/JsonParser.java index 1559ce73f64..cad2a48118d 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/JsonParser.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/JsonParser.java @@ -16,13 +16,6 @@ package com.evolveum.midpoint.prism.parser.json; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.io.StringWriter; - -import javax.xml.namespace.QName; - import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.prism.xnode.PrimitiveXNode; @@ -30,7 +23,6 @@ import com.evolveum.midpoint.util.exception.SchemaException; import com.fasterxml.jackson.annotation.JsonInclude.Include; import com.fasterxml.jackson.core.JsonFactory; -import com.fasterxml.jackson.core.JsonGenerationException; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.Version; @@ -41,7 +33,13 @@ import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.module.jaxb.JaxbAnnotationIntrospector; -public class JsonParser extends AbstractParser { +import javax.xml.namespace.QName; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.StringWriter; + +public class JsonParser extends AbstractJsonParser { @Override public boolean canParse(File file) throws IOException { @@ -116,15 +114,16 @@ private Module createSerializerModule(){ } @Override - protected boolean serializeExplicitType(PrimitiveXNode primitive, QName explicitType, JsonGenerator generator) throws JsonGenerationException, IOException { + protected void serializeFromPrimitive(PrimitiveXNode primitive, AbstractJsonParser.JsonSerializationContext ctx) throws IOException { + QName explicitType = getExplicitType(primitive); if (explicitType != null) { - generator.writeStartObject(); - generator.writeStringField(TYPE_DEFINITION, QNameUtil.qNameToUri(primitive.getTypeQName())); - generator.writeObjectField(VALUE_FIELD, primitive.getValue()); - generator.writeEndObject(); - return true; - } - return false; + ctx.generator.writeStartObject(); + ctx.generator.writeStringField(PROP_TYPE, QNameUtil.qNameToUri(primitive.getTypeQName())); + ctx.generator.writeObjectField(PROP_VALUE, primitive.getValue()); + ctx.generator.writeEndObject(); + } else { + serializePrimitiveTypeLessValue(primitive, ctx); + } } @Override @@ -132,7 +131,8 @@ protected void writeExplicitType(QName explicitType, JsonGenerator generator) th generator.writeObjectField("@type", explicitType); } - - - + @Override + protected QName tagToTypeName(Object tid, AbstractJsonParser.JsonParsingContext ctx) { + return null; + } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/JsonValueParser.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/JsonValueParser.java index b63fd3f177d..2032bb63e7f 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/JsonValueParser.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/JsonValueParser.java @@ -15,6 +15,8 @@ import com.fasterxml.jackson.databind.ObjectReader; import org.apache.commons.lang.StringUtils; import org.jetbrains.annotations.NotNull; +import org.w3c.dom.Document; +import org.w3c.dom.Element; public class JsonValueParser implements ValueParser { @@ -26,30 +28,24 @@ public JsonValueParser(@NotNull JsonParser parser, JsonNode node) { this.node = node; } - public JsonValueParser(@NotNull JsonParser parser) { - this.parser = parser; - } - + @NotNull public JsonParser getParser() { return parser; } + @Override public T parse(QName typeName, XNodeProcessorEvaluationMode mode) throws SchemaException { ObjectMapper mapper = (ObjectMapper) parser.getCodec(); Class clazz = XsdTypeMapper.toJavaType(typeName); + if (clazz == null) { + throw new SchemaException("Unsupported type " + typeName); + } ObjectReader r = mapper.readerFor(clazz); try { -// if (parser.getCurrentToken() == null){ -// JsonToken t = parser.nextToken(); -// if (t == null){ -// t = parser.nextToken(); -// } -// } return r.readValue(node); // TODO implement COMPAT mode } catch (IOException e) { - // TODO Auto-generated catch block throw new SchemaException("Cannot parse value: " + e.getMessage(), e); } } @@ -76,4 +72,10 @@ public String toString() { public Map getPotentiallyRelevantNamespaces() { return null; // TODO implement } + + Element asDomElement() throws IOException { + ObjectMapper mapper = (ObjectMapper) parser.getCodec(); + ObjectReader r = mapper.readerFor(Document.class); + return ((Document) r.readValue(node)).getDocumentElement(); + } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/YamlParser.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/YamlParser.java index 4845a693294..9f4e483c98d 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/YamlParser.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/YamlParser.java @@ -16,21 +16,14 @@ package com.evolveum.midpoint.prism.parser.json; -import com.evolveum.midpoint.prism.parser.json.yaml.*; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.io.StringWriter; - -import javax.xml.datatype.XMLGregorianCalendar; -import javax.xml.namespace.QName; - -import org.w3c.dom.Element; - +import com.evolveum.midpoint.prism.parser.json.yaml.MidpointYAMLFactory; +import com.evolveum.midpoint.prism.parser.json.yaml.MidpointYAMLGenerator; +import com.evolveum.midpoint.prism.parser.json.yaml.MidpointYAMLParser; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.prism.xnode.PrimitiveXNode; import com.evolveum.midpoint.util.DOMUtil; +import com.evolveum.midpoint.util.QNameUtil; import com.evolveum.midpoint.util.exception.SchemaException; import com.fasterxml.jackson.annotation.JsonTypeInfo.As; import com.fasterxml.jackson.core.JsonGenerationException; @@ -43,11 +36,25 @@ import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.dataformat.yaml.YAMLGenerator; +import org.w3c.dom.Element; + +import javax.xml.datatype.XMLGregorianCalendar; +import javax.xml.namespace.QName; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.StringWriter; //import com.fasterxml.jackson.core.YAMLGenerator; -public class YamlParser extends AbstractParser { - - +public class YamlParser extends AbstractJsonParser { + + private static final String YAML = "tag:yaml.org,2002:"; + private static final String TAG_STRING = YAML + "str"; + private static final String TAG_INT = YAML + "int"; + private static final String TAG_BOOL = YAML + "bool"; + private static final String TAG_FLOAT = YAML + "float"; + private static final String TAG_NULL = YAML + "null"; + //------------------------END OF METHODS FOR SERIALIZATION ------------------------------- @Override @@ -72,11 +79,6 @@ public YAMLGenerator createJacksonGenerator(StringWriter out) throws SchemaExcep MidpointYAMLGenerator generator = (MidpointYAMLGenerator) factory.createGenerator(out); generator.setPrettyPrinter(new DefaultPrettyPrinter()); generator.setCodec(configureMapperForSerialization()); -// MidpointYAMLGenerator myg = new MidpointYAMLGenerator(generator., jsonFeatures, yamlFeatures, codec, out, version) -// generator. - generator.configure(com.fasterxml.jackson.dataformat.yaml.YAMLGenerator.Feature.CANONICAL_OUTPUT, false); -// YAMLParser parser = factory.createParser(out.toString()); -// parser. return generator; } catch (IOException ex){ throw new SchemaException("Schema error during serializing to JSON.", ex); @@ -124,7 +126,39 @@ protected MidpointYAMLParser createJacksonParser(InputStream stream) throws Sche } } - @Override + @Override + protected QName tagToTypeName(Object tag, AbstractJsonParser.JsonParsingContext ctx) throws IOException, SchemaException { + if (tag == null) { + return null; + } if (TAG_STRING.equals(tag)) { + return DOMUtil.XSD_STRING; + } else if (TAG_BOOL.equals(tag)) { + return DOMUtil.XSD_BOOLEAN; + } else if (TAG_NULL.equals(tag)) { + return null; // ??? + } else if (TAG_INT.equals(tag)) { + QName type = determineNumberType(ctx.parser.getNumberType()); + if (DOMUtil.XSD_INT.equals(type) || DOMUtil.XSD_INTEGER.equals(type)) { + return type; + } else { + return DOMUtil.XSD_INT; // suspicious + } + } else if (TAG_FLOAT.equals(tag)) { + QName type = determineNumberType(ctx.parser.getNumberType()); + if (DOMUtil.XSD_FLOAT.equals(type) || DOMUtil.XSD_DOUBLE.equals(type) || DOMUtil.XSD_DECIMAL.equals(type)) { + return type; + } else { + return DOMUtil.XSD_FLOAT; // suspicious + } + } else if (tag instanceof String) { + return QNameUtil.uriToQName((String) tag, true); + } else { + // TODO issue a warning? + return null; + } + } + + @Override protected MidpointYAMLParser createJacksonParser(String dataString) throws SchemaException { MidpointYAMLFactory factory = new MidpointYAMLFactory(); try { @@ -136,20 +170,12 @@ protected MidpointYAMLParser createJacksonParser(String dataString) throws Schem } @Override - protected boolean serializeExplicitType(PrimitiveXNode primitive, QName explicitType, JsonGenerator generator) throws JsonGenerationException, IOException { + protected void serializeFromPrimitive(PrimitiveXNode primitive, AbstractJsonParser.JsonSerializationContext ctx) throws IOException { + QName explicitType = getExplicitType(primitive); if (explicitType != null) { - if (generator.canWriteTypeId()) { - if (explicitType.equals(DOMUtil.XSD_STRING)) { - generator.writeTypeId("http://www.w3.org/2001/XMLSchema/string"); - } else if (explicitType.equals(DOMUtil.XSD_INT)) { - generator.writeTypeId("http://www.w3.org/2001/XMLSchema/int"); - generator.writeString(String.valueOf(primitive.getValue())); - return true; - } - } + ctx.generator.writeTypeId(QNameUtil.qNameToUri(explicitType, false, '/')); } - return false; - + serializePrimitiveTypeLessValue(primitive, ctx); } @Override diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/yaml/MidpointYAMLGenerator.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/yaml/MidpointYAMLGenerator.java index 858d2477e8a..3af92537538 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/yaml/MidpointYAMLGenerator.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/yaml/MidpointYAMLGenerator.java @@ -17,25 +17,25 @@ public MidpointYAMLGenerator(IOContext ctxt, int jsonFeatures, int yamlFeatures, super(ctxt, jsonFeatures, yamlFeatures, codec, out, version); } - @Override - protected void _writeScalar(String value, String type, Character style) throws IOException { - _emitter.emit(_scalarEvent(value, style)); - } - @Override protected ScalarEvent _scalarEvent(String value, Character style) { - ImplicitTuple implicitTuple = new ImplicitTuple(true, false); + if (value.contains("\n")) { + style = Character.valueOf('|'); + } + + ImplicitTuple implicit; String yamlTag = _typeId; - if (yamlTag == null) { - // to avoid of writing default "!" when typing is not needed - implicitTuple = new ImplicitTuple(true, true); - // yamlTag = "ADDEDSPECIAL"; - // _typeId = null; + if (yamlTag != null) { + _typeId = null; + implicit = new ImplicitTuple(false, false); // we want to always preserve the tags (if they are present) + } else { + implicit = new ImplicitTuple(true, true); } String anchor = _objectId; if (anchor != null) { - // _objectId = null; + _objectId = null; } - return new ScalarEvent(anchor, yamlTag, implicitTuple, value, null, null, style); + return new ScalarEvent(anchor, yamlTag, implicit, value, null, null, style); } + } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/yaml/MidpointYAMLParser.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/yaml/MidpointYAMLParser.java index 95ca0425de1..85d77611ecd 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/yaml/MidpointYAMLParser.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/yaml/MidpointYAMLParser.java @@ -23,29 +23,29 @@ public MidpointYAMLParser(IOContext ctxt, BufferRecycler br, int parserFeatures, // TODO Auto-generated constructor stub } - @Override - public String getTypeId() throws IOException, JsonGenerationException - { - String tag = null; - if (_lastEvent instanceof CollectionStartEvent) { - tag = ((CollectionStartEvent) _lastEvent).getTag(); - } else if (_lastEvent instanceof ScalarEvent){ - tag = ((ScalarEvent) _lastEvent).getTag(); - } - - - if (tag != null) { - /* 04-Aug-2013, tatu: Looks like YAML parser's expose these in... - * somewhat exotic ways sometimes. So let's prepare to peel off - * some wrappings: - */ - while (tag.startsWith("!")) { - tag = tag.substring(1); - } - return tag; - } - - return null; - } +// @Override +// public String getTypeId() throws IOException, JsonGenerationException +// { +// String tag = null; +// if (_lastEvent instanceof CollectionStartEvent) { +// tag = ((CollectionStartEvent) _lastEvent).getTag(); +// } else if (_lastEvent instanceof ScalarEvent){ +// tag = ((ScalarEvent) _lastEvent).getTag(); +// } +// +// +// if (tag != null) { +// /* 04-Aug-2013, tatu: Looks like YAML parser's expose these in... +// * somewhat exotic ways sometimes. So let's prepare to peel off +// * some wrappings: +// */ +// while (tag.startsWith("!")) { +// tag = tag.substring(1); +// } +// return tag; +// } +// +// return null; +// } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistry.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistry.java index 204a2d34f28..e85aae0e992 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistry.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistry.java @@ -834,6 +834,10 @@ public Class determineCompileTimeClass(ComplexTypeDefinition complexTypeDefin public Class determineCompileTimeClass(QName typeName) { if (StringUtils.isEmpty(typeName.getNamespaceURI())) { ComplexTypeDefinition ctd = resolveGlobalTypeDefinitionWithoutNamespace(typeName.getLocalPart()); + if (ctd == null) { + return null; +// throw new IllegalArgumentException("Cannot find type definition for type " + typeName); + } return (Class) ctd.getCompileTimeClass(); } SchemaDescription desc = findSchemaDescriptionByNamespace(typeName.getNamespaceURI()); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/PrismAsserts.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/PrismAsserts.java index a185112ce6c..0139542f0ca 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/PrismAsserts.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/PrismAsserts.java @@ -32,6 +32,7 @@ import com.evolveum.midpoint.prism.path.ItemPathSegment; import com.evolveum.midpoint.prism.path.NameItemPathSegment; +import com.evolveum.midpoint.util.QNameUtil; import org.w3c.dom.Element; import org.w3c.dom.Node; @@ -269,6 +270,14 @@ public static void assertDefinition(ItemDefinition definition, QName itemName, Q assertEquals("Wrong definition minOccurs for "+itemName, minOccurs, definition.getMinOccurs()); assertEquals("Wrong definition maxOccurs for "+itemName, maxOccurs, definition.getMaxOccurs()); } + + public static void assertDefinitionTypeLoose(ItemDefinition definition, QName itemName, QName type, int minOccurs, int maxOccurs) { + assertNotNull("No definition for "+itemName, definition); + assertTrue("Wrong definition type for "+itemName+": expected: " + type + ", real: " + definition.getTypeName(), + QNameUtil.match(type, definition.getTypeName())); + assertEquals("Wrong definition minOccurs for "+itemName, minOccurs, definition.getMinOccurs()); + assertEquals("Wrong definition maxOccurs for "+itemName, maxOccurs, definition.getMaxOccurs()); + } public static void assertIndexed(PrismContainerDefinition containerDef, QName itemQName, Boolean expected) { diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/ValueSerializationUtil.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/ValueSerializationUtil.java index 2d99963758e..7b5290ed63d 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/ValueSerializationUtil.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/ValueSerializationUtil.java @@ -57,14 +57,14 @@ public static String serializeValue(T value, ItemDefinition def, QName itemN throw new IllegalArgumentException("must be a map"); } - String s = prismContext.getParserDom().serializeToString(sub, parentName); + String s = prismContext.getParserDom().serializeToString(sub, parentName, null); // System.out.println("serialized: " + s); return s; }else{ MapXNode xmap = new MapXNode(); xmap.put(itemName, xList); - String s = prismContext.getParserDom().serializeToString(xmap, parentName); + String s = prismContext.getParserDom().serializeToString(xmap, parentName, null); // System.out.println("serialized: " + s); return s; // throw new IllegalArgumentException("Check your data."); @@ -74,7 +74,7 @@ public static String serializeValue(T value, ItemDefinition def, QName itemN // xmap.put(def.getName(), xList); } - String s = prismContext.getParserDom().serializeToString(node, def.getName()); + String s = prismContext.getParserDom().serializeToString(node, def.getName(), null); // System.out.println("serialized: " + s); return s; } else if (def instanceof PrismContainerDefinition){ @@ -89,11 +89,11 @@ public static String serializeValue(T value, ItemDefinition def, QName itemN ListXNode xList = (ListXNode) node; MapXNode xmap = new MapXNode(); xmap.put(def.getName(), xList); - String s = prismContext.getParserDom().serializeToString(xmap, parentName); + String s = prismContext.getParserDom().serializeToString(xmap, parentName, null); // System.out.println("serialized: " + s); return s; } - String s = prismContext.getParserDom().serializeToString(node, def.getName()); + String s = prismContext.getParserDom().serializeToString(node, def.getName(), null); // System.out.println("serialized: " + s); return s; } @@ -122,7 +122,7 @@ public static String serializeValue(T value, ItemDefinition def, QName itemN XNode node = serializer.serializeItemValue(pVal, def); - String s = prismContext.getParserDom().serializeToString(node, itemName); + String s = prismContext.getParserDom().serializeToString(node, itemName, null); // System.out.println("serialized: " + s); return s; // throw new UnsupportedOperationException("need to be implemented"); @@ -155,7 +155,7 @@ public static String serializeValue(T value, QName itemName, PrismContext pr } XNode node = serializer.serializeItemValue(pVal, null); - String s = prismContext.getParserDom().serializeToString(node, itemName); + String s = prismContext.getParserDom().serializeToString(node, itemName, null); // System.out.println("serialized: " + s); return s; // throw new UnsupportedOperationException("need to be implemented"); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xml/XsdTypeMapper.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xml/XsdTypeMapper.java index 140257516e7..ed952941dae 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xml/XsdTypeMapper.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xml/XsdTypeMapper.java @@ -98,8 +98,7 @@ private static void initTypeMap() throws IOException, ClassNotFoundException { } private static void addMapping(Class javaClass, QName xsdType, boolean both) { - LOGGER.trace("Adding XSD type mapping {} {} {} ", new Object[]{javaClass, both ? "<->" : " ->", - xsdType}); + LOGGER.trace("Adding XSD type mapping {} {} {} ", javaClass, both ? "<->" : " ->", xsdType); javaToXsdTypeMap.put(javaClass, xsdType); if (both) { xsdToJavaTypeMap.put(xsdType, javaClass); @@ -179,6 +178,15 @@ public static Class toJavaTypeIfKnown(QName xsdType) { private static Class toJavaType(QName xsdType, boolean errorIfNoMapping) { Class javaType = xsdToJavaTypeMap.get(xsdType); + if (javaType == null && xsdType != null && StringUtils.isEmpty(xsdType.getNamespaceURI())) { + // TODO check uniqueness w.r.t. other types... + for (Map.Entry entry : xsdToJavaTypeMap.entrySet()) { + if (QNameUtil.match(entry.getKey(), xsdType)) { + javaType = entry.getValue(); + break; + } + } + } if (javaType == null) { if (errorIfNoMapping && xsdType.getNamespaceURI().equals(XMLConstants.W3C_XML_SCHEMA_NS_URI)) { throw new IllegalArgumentException("No type mapping for XSD type " + xsdType); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/MapXNode.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/MapXNode.java index cd9707a70d3..7da8a3de3dc 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/MapXNode.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/MapXNode.java @@ -36,6 +36,7 @@ import com.evolveum.midpoint.util.exception.SchemaException; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.Validate; +import org.jetbrains.annotations.NotNull; public class MapXNode extends XNode implements Map, Serializable { @@ -147,6 +148,7 @@ public Entry getSingleEntryThatDoesNotMatch(QName... excludedKeys) throws Schema return found; } + @NotNull public Set> entrySet() { Set> entries = new Set>() { diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/RootXNode.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/RootXNode.java index 340429cddb0..02085875787 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/RootXNode.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/RootXNode.java @@ -40,8 +40,19 @@ public RootXNode(QName rootElementName, XNode subnode) { this.subnode = subnode; } + // TODO consider if this is clean enough... The whole concept of root node (as child of XNode) has to be thought out + @Override + public QName getTypeQName() { + if (typeQName != null) { + return typeQName; + } else if (subnode != null) { + return subnode.getTypeQName(); + } else { + return null; + } + } - public QName getRootElementName() { + public QName getRootElementName() { return rootElementName; } @@ -118,4 +129,13 @@ public int hashCode() { result = 31 * result + (subnode != null ? subnode.hashCode() : 0); return result; } + + public MapXNode asMapXNode() { + MapXNode map = new MapXNode(); + map.put(rootElementName, subnode); + if (subnode.getTypeQName() == null) { + subnode.setTypeQName(getTypeQName()); + } + return map; + } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/XNode.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/XNode.java index b15d62e8340..ada00fc1f34 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/XNode.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/XNode.java @@ -48,7 +48,7 @@ public abstract class XNode implements DebugDumpable, Visitable, Cloneable, Seri public static final QName KEY_REFERENCE_OBJECT = new QName(null, "object"); // Common fields - private XNode parent; + protected XNode parent; /** * If set to true that the element came from the explicit type definition @@ -65,8 +65,8 @@ public abstract class XNode implements DebugDumpable, Visitable, Cloneable, Seri // These may be detected in parsed file and // are also used for serialization - private QName typeQName; - private Integer maxOccurs; + protected QName typeQName; + protected Integer maxOccurs; // a comment that could be stored into formats that support these (e.g. XML or YAML) private String comment; diff --git a/infra/prism/src/main/resources/xml/ns/test/foo-1.xsd b/infra/prism/src/main/resources/xml/ns/test/foo-1.xsd index 7a63fd62fa4..6e5577be8ee 100644 --- a/infra/prism/src/main/resources/xml/ns/test/foo-1.xsd +++ b/infra/prism/src/main/resources/xml/ns/test/foo-1.xsd @@ -81,7 +81,7 @@ - + diff --git a/infra/prism/src/test/java/com/evolveum/midpoint/prism/PrismInternalTestUtil.java b/infra/prism/src/test/java/com/evolveum/midpoint/prism/PrismInternalTestUtil.java index 3f5e3b72330..ab58d573ffb 100644 --- a/infra/prism/src/test/java/com/evolveum/midpoint/prism/PrismInternalTestUtil.java +++ b/infra/prism/src/test/java/com/evolveum/midpoint/prism/PrismInternalTestUtil.java @@ -449,12 +449,12 @@ private static void assertUserJackExtension(PrismObject user) { PrismAsserts.assertPropertyValue(barProperty, "BAR"); PrismPropertyDefinition barPropertyDef = barProperty.getDefinition(); assertNotNull("No definition for bar", barPropertyDef); - PrismAsserts.assertDefinition(barPropertyDef, EXTENSION_BAR_ELEMENT, DOMUtil.XSD_STRING, 1, -1); + PrismAsserts.assertDefinitionTypeLoose(barPropertyDef, EXTENSION_BAR_ELEMENT, DOMUtil.XSD_STRING, 1, -1); assertNull("'Indexed' attribute on 'bar' property is not null", barPropertyDef.isIndexed()); PrismProperty multi = extension.findProperty(EXTENSION_MULTI_ELEMENT); PrismPropertyDefinition multiPropertyDef = multi.getDefinition(); - PrismAsserts.assertDefinition(multiPropertyDef, EXTENSION_MULTI_ELEMENT, DOMUtil.XSD_STRING, 1, -1); + PrismAsserts.assertDefinitionTypeLoose(multiPropertyDef, EXTENSION_MULTI_ELEMENT, DOMUtil.XSD_STRING, 1, -1); assertNull("'Indexed' attribute on 'multi' property is not null", multiPropertyDef.isIndexed()); } diff --git a/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestPrismParsing.java b/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestPrismParsing.java index 5f1317656e4..c301ad2dd84 100644 --- a/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestPrismParsing.java +++ b/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestPrismParsing.java @@ -50,8 +50,7 @@ * */ public abstract class TestPrismParsing { - - + protected abstract String getSubdirName(); protected abstract String getFilenameSuffix(); @@ -72,8 +71,8 @@ public void setupDebug() { protected abstract String getOutputFormat(); @Test - public void testPrismParseFile() throws Exception { - final String TEST_NAME = "testPrismParseFile"; + public void test100PrismParseFile() throws Exception { + final String TEST_NAME = "test100PrismParseFile"; PrismInternalTestUtil.displayTestTitle(TEST_NAME); // GIVEN PrismContext prismContext = constructInitializedPrismContext(); @@ -90,8 +89,8 @@ public void testPrismParseFile() throws Exception { } @Test - public void testPrismParseFileNoNs() throws Exception { - final String TEST_NAME = "testPrismParseFileNoNs"; + public void test110PrismParseFileNoNs() throws Exception { + final String TEST_NAME = "test110PrismParseFileNoNs"; PrismInternalTestUtil.displayTestTitle(TEST_NAME); // GIVEN PrismContext prismContext = constructInitializedPrismContext(); @@ -108,8 +107,8 @@ public void testPrismParseFileNoNs() throws Exception { } @Test - public void testPrismParseFileObject() throws Exception { - final String TEST_NAME = "testPrismParseFileObject"; + public void test120PrismParseFileObject() throws Exception { + final String TEST_NAME = "test120PrismParseFileObject"; PrismInternalTestUtil.displayTestTitle(TEST_NAME); // GIVEN @@ -125,24 +124,51 @@ public void testPrismParseFileObject() throws Exception { assertUserJack(user); } - - + + @Test + public void test130PrismParseFileAdhoc() throws Exception { + final String TEST_NAME = "test130PrismParseFileAdhoc"; + PrismInternalTestUtil.displayTestTitle(TEST_NAME); + + // GIVEN + PrismContext prismContext = constructInitializedPrismContext(); + + // WHEN + PrismObject user = prismContext.parseObject(getFile(USER_JACK_ADHOC_BASENAME)); + + // THEN + System.out.println("User:"); + System.out.println(user.debugDump()); + assertNotNull(user); + + assertUserAdhoc(user); + } + @Test - public void testRoundTrip() throws Exception { - final String TEST_NAME = "testRoundTrip"; + public void test200RoundTrip() throws Exception { + final String TEST_NAME = "test200RoundTrip"; PrismInternalTestUtil.displayTestTitle(TEST_NAME); roundTrip(getFile(USER_JACK_FILE_BASENAME)); } @Test - public void testRoundTripObject() throws Exception { - final String TEST_NAME = "testRoundTripObject"; + public void test210RoundTripNoNs() throws Exception { + final String TEST_NAME = "test210RoundTripNoNs"; + PrismInternalTestUtil.displayTestTitle(TEST_NAME); + + roundTrip(getFile(USER_JACK_NO_NS_BASENAME)); + } + + @Test + public void test220RoundTripObject() throws Exception { + final String TEST_NAME = "test220RoundTripObject"; PrismInternalTestUtil.displayTestTitle(TEST_NAME); roundTrip(getFile(USER_JACK_OBJECT_BASENAME)); } + private void roundTrip(File file) throws SchemaException, SAXException, IOException { // GIVEN @@ -184,29 +210,10 @@ private void roundTrip(File file) throws SchemaException, SAXException, IOExcept assertTrue("Users not equal", originalUser.equals(parsedUser)); } + @Test - public void testPrismParseFileAdhoc() throws Exception { - final String TEST_NAME = "testPrismParseFileAdhoc"; - PrismInternalTestUtil.displayTestTitle(TEST_NAME); - - // GIVEN - PrismContext prismContext = constructInitializedPrismContext(); - - // WHEN - PrismObject user = prismContext.parseObject(getFile(USER_JACK_ADHOC_BASENAME)); - - // THEN - System.out.println("User:"); - System.out.println(user.debugDump()); - assertNotNull(user); - - assertUserAdhoc(user); - } - - - @Test - public void testRoundTripAdhoc() throws Exception { - final String TEST_NAME = "testRoundTripAdhoc"; + public void test230RoundTripAdhoc() throws Exception { + final String TEST_NAME = "test230RoundTripAdhoc"; PrismInternalTestUtil.displayTestTitle(TEST_NAME); roundTripAdhoc(getFile(USER_JACK_ADHOC_BASENAME)); @@ -248,8 +255,8 @@ private void roundTripAdhoc(File file) throws SchemaException, SAXException, IOE @Test - public void testMeleeContext() throws Exception { - final String TEST_NAME = "testMeleeContext"; + public void test300MeleeContext() throws Exception { + final String TEST_NAME = "test300MeleeContext"; PrismInternalTestUtil.displayTestTitle(TEST_NAME); // GIVEN @@ -309,8 +316,8 @@ public void testMeleeContext() throws Exception { } @Test - public void testUserWill() throws Exception { - final String TEST_NAME = "testUserWill"; + public void test400UserWill() throws Exception { + final String TEST_NAME = "test400UserWill"; PrismInternalTestUtil.displayTestTitle(TEST_NAME); // GIVEN @@ -328,8 +335,8 @@ public void testUserWill() throws Exception { } @Test - public void testUserWillRoundTrip() throws Exception { - final String TEST_NAME = "testUserWillRoundTrip"; + public void test410UserWillRoundTrip() throws Exception { + final String TEST_NAME = "test410UserWillRoundTrip"; PrismInternalTestUtil.displayTestTitle(TEST_NAME); // GIVEN @@ -366,8 +373,8 @@ public void testUserWillRoundTrip() throws Exception { } @Test - public void testUserElisabethRoundTrip() throws Exception { - final String TEST_NAME = "testUserElisabethRoundTrip"; + public void test500UserElisabethRoundTrip() throws Exception { + final String TEST_NAME = "test500UserElisabethRoundTrip"; PrismInternalTestUtil.displayTestTitle(TEST_NAME); // GIVEN diff --git a/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestXmlSerialization.java b/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestXmlSerialization.java index 16256cd94d2..6fc1f9b9d0a 100644 --- a/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestXmlSerialization.java +++ b/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestXmlSerialization.java @@ -60,12 +60,12 @@ public void testHandlingInvalidChars() throws Exception { // THEN - String ok = prismContext.getParserDom().serializeToString(valOkNode, new QName("ok")); + String ok = prismContext.getParserDom().serializeToString(valOkNode, new QName("ok"), null); System.out.println("correct value serialized to: " + ok); assertEquals("Wrong serialization", "abcdef", ok.trim()); // todo make this less brittle with regards to serialization style try { - String wrong = prismContext.getParserDom().serializeToString(valWrongNode, new QName("wrong")); + String wrong = prismContext.getParserDom().serializeToString(valWrongNode, new QName("wrong"), null); System.out.println("wrong value serialized to: " + wrong); assert false : "Wrong value serialization had to fail but it didn't!"; } catch (RuntimeException e) { diff --git a/infra/prism/src/test/java/com/evolveum/midpoint/prism/parser/AbstractParserTest.java b/infra/prism/src/test/java/com/evolveum/midpoint/prism/parser/AbstractParserTest.java index 533112eeecb..9c4ffa7731c 100644 --- a/infra/prism/src/test/java/com/evolveum/midpoint/prism/parser/AbstractParserTest.java +++ b/infra/prism/src/test/java/com/evolveum/midpoint/prism/parser/AbstractParserTest.java @@ -97,7 +97,7 @@ public void testParseUserToPrism() throws Exception { XNodeProcessor processor = new XNodeProcessor(prismContext); // WHEN (parse to xnode) - XNode xnode = parser.parse(getFile(USER_JACK_FILE_BASENAME)); + XNode xnode = parser.parse(getFile(USER_JACK_FILE_BASENAME), ParsingContext.createDefault()); System.out.println("XNode after parsing:"); System.out.println(xnode.debugDump()); @@ -125,7 +125,7 @@ public void testParseUserRoundTrip() throws Exception { XNodeProcessor processor = new XNodeProcessor(prismContext); // WHEN (parse) - XNode xnode = parser.parse(getFile(USER_JACK_FILE_BASENAME)); + XNode xnode = parser.parse(getFile(USER_JACK_FILE_BASENAME), ParsingContext.createDefault()); System.out.println("\nParsed xnode:"); System.out.println(xnode.debugDump()); PrismObject user = processor.parseObject(xnode, ParsingContext.createDefault()); @@ -138,7 +138,7 @@ public void testParseUserRoundTrip() throws Exception { // WHEN (re-serialize to XNode) XNode serializedXNode = processor.serializeObject(user, true); - String serializedString = parser.serializeToString(serializedXNode, new QName(NS_FOO, "user")); + String serializedString = parser.serializeToString(serializedXNode, new QName(NS_FOO, "user"), null); // THEN System.out.println("\nXNode after re-serialization:"); @@ -171,7 +171,7 @@ public void testParseUserRoundTrip() throws Exception { validateUserSchema(serializedString, prismContext); // WHEN (re-parse) - XNode reparsedXnode = parser.parse(serializedString); + XNode reparsedXnode = parser.parse(serializedString, ParsingContext.createDefault()); PrismObject reparsedUser = processor.parseObject(reparsedXnode, ParsingContext.createDefault()); // THEN @@ -209,7 +209,7 @@ public void testParseResourceRumToPrism() throws Exception { XNodeProcessor processor = new XNodeProcessor(prismContext); // WHEN (parse to xnode) - XNode xnode = parser.parse(getFile(RESOURCE_RUM_FILE_BASENAME)); + XNode xnode = parser.parse(getFile(RESOURCE_RUM_FILE_BASENAME), ParsingContext.createDefault()); System.out.println("XNode after parsing:"); System.out.println(xnode.debugDump()); @@ -235,7 +235,7 @@ public void testParseResourceRoundTrip() throws Exception { XNodeProcessor processor = new XNodeProcessor(prismContext); // WHEN (parse) - XNode xnode = parser.parse(getFile(RESOURCE_RUM_FILE_BASENAME)); + XNode xnode = parser.parse(getFile(RESOURCE_RUM_FILE_BASENAME), ParsingContext.createDefault()); PrismObject resource = processor.parseObject(xnode, ParsingContext.createDefault()); // THEN @@ -246,7 +246,7 @@ public void testParseResourceRoundTrip() throws Exception { // WHEN (re-serialize to XNode) XNode serializedXNode = processor.serializeObject(resource, true); - String serializedString = parser.serializeToString(serializedXNode, new QName(NS_FOO, "resource")); + String serializedString = parser.serializeToString(serializedXNode, new QName(NS_FOO, "resource"), null); // THEN System.out.println("\nXNode after re-serialization:"); @@ -280,7 +280,7 @@ public void testParseResourceRoundTrip() throws Exception { validateResourceSchema(serializedString, prismContext); // WHEN (re-parse) - XNode reparsedXnode = parser.parse(serializedString); + XNode reparsedXnode = parser.parse(serializedString, ParsingContext.createDefault()); PrismObject reparsedResource = processor.parseObject(reparsedXnode, ParsingContext.createDefault()); // THEN @@ -387,7 +387,7 @@ public void testParseEventHandler() throws Exception { XNodeProcessor processor = new XNodeProcessor(prismContext); // WHEN (parse to xnode) - RootXNode xnode = (RootXNode) parser.parse(getFile(EVENT_HANDLER_FILE_BASENAME)); + RootXNode xnode = (RootXNode) parser.parse(getFile(EVENT_HANDLER_FILE_BASENAME), ParsingContext.createDefault()); System.out.println("XNode after parsing:"); System.out.println(xnode.debugDump()); diff --git a/infra/prism/src/test/java/com/evolveum/midpoint/prism/parser/TestDomParser.java b/infra/prism/src/test/java/com/evolveum/midpoint/prism/parser/TestDomParser.java index 664c0c64fa1..b890daee499 100644 --- a/infra/prism/src/test/java/com/evolveum/midpoint/prism/parser/TestDomParser.java +++ b/infra/prism/src/test/java/com/evolveum/midpoint/prism/parser/TestDomParser.java @@ -26,6 +26,7 @@ import javax.xml.validation.Schema; import javax.xml.validation.Validator; +import com.evolveum.midpoint.prism.ParsingContext; import com.evolveum.midpoint.prism.parser.dom.DomParser; import org.testng.annotations.Test; import org.w3c.dom.Document; @@ -71,7 +72,7 @@ public void testParseUserToXNode() throws Exception { DomParser parser = createParser(); // WHEN - XNode xnode = parser.parse(getFile(USER_JACK_FILE_BASENAME)); + XNode xnode = parser.parse(getFile(USER_JACK_FILE_BASENAME), ParsingContext.createDefault()); // THEN System.out.println("Parsed XNode:"); diff --git a/infra/prism/src/test/java/com/evolveum/midpoint/prism/parser/TestJsonParser.java b/infra/prism/src/test/java/com/evolveum/midpoint/prism/parser/TestJsonParser.java index 18f95a19ebd..68e79bb085e 100644 --- a/infra/prism/src/test/java/com/evolveum/midpoint/prism/parser/TestJsonParser.java +++ b/infra/prism/src/test/java/com/evolveum/midpoint/prism/parser/TestJsonParser.java @@ -20,8 +20,4 @@ protected JsonParser createParser() { return new JsonParser(); } - @Test - public void test(){ - - } } diff --git a/infra/prism/src/test/resources/common/json/user-elisabeth.json b/infra/prism/src/test/resources/common/json/user-elisabeth.json new file mode 100644 index 00000000000..12bad0dba50 --- /dev/null +++ b/infra/prism/src/test/resources/common/json/user-elisabeth.json @@ -0,0 +1,14 @@ +{ + "user" : { + "oid": "c0c010c0-d34d-b33f-f00d-111111114444", + "name": "elisabeth", + "extension": { + "http://midpoint.evolveum.com/xml/ns/test/extension#stringType": "string", + "secondaryStringType": "string1", + "intType": 142 + }, + "fullName": "Elisabeth Turner", + "givenName": "Elisabeth", + "familyName": "Turner" + } +} \ No newline at end of file diff --git a/infra/prism/src/test/resources/common/json/user-jack-adhoc.json b/infra/prism/src/test/resources/common/json/user-jack-adhoc.json index e34021857d2..799b8526789 100644 --- a/infra/prism/src/test/resources/common/json/user-jack-adhoc.json +++ b/infra/prism/src/test/resources/common/json/user-jack-adhoc.json @@ -8,7 +8,7 @@ "extension" : { "@ns" : "http://midpoint.evolveum.com/xml/ns/test/adhoc-1.xsd", "bottles" : [ { - "@typeDef" : "http://www.w3.org/2001/XMLSchema#int", + "@type" : "http://www.w3.org/2001/XMLSchema#int", "@value" : 20 } ] }, diff --git a/infra/prism/src/test/resources/common/json/user-jack-modified.json b/infra/prism/src/test/resources/common/json/user-jack-modified.json index 0beb633f455..c37e90eb158 100644 --- a/infra/prism/src/test/resources/common/json/user-jack-modified.json +++ b/infra/prism/src/test/resources/common/json/user-jack-modified.json @@ -11,21 +11,21 @@ "singleStringType" : "foobar", "indexedString" : [ "alpha", "bravo" ], "bar" : [ { - "@typeDef" : "http://www.w3.org/2001/XMLSchema#string", + "@type" : "http://www.w3.org/2001/XMLSchema#string", "@value" : "bar" } ], "num" : [ { - "@typeDef" : "http://www.w3.org/2001/XMLSchema#int", + "@type" : "http://www.w3.org/2001/XMLSchema#int", "@value" : 42 } ], "multi" : [ { - "@typeDef" : "http://www.w3.org/2001/XMLSchema#string", + "@type" : "http://www.w3.org/2001/XMLSchema#string", "@value" : "raz" }, { - "@typeDef" : "http://www.w3.org/2001/XMLSchema#string", + "@type" : "http://www.w3.org/2001/XMLSchema#string", "@value" : "tri" }, { - "@typeDef" : "http://www.w3.org/2001/XMLSchema#string", + "@type" : "http://www.w3.org/2001/XMLSchema#string", "@value" : "osem" } ] }, diff --git a/infra/prism/src/test/resources/common/json/user-jack-no-ns.json b/infra/prism/src/test/resources/common/json/user-jack-no-ns.json index 84229ec51e2..0b111dd8c76 100644 --- a/infra/prism/src/test/resources/common/json/user-jack-no-ns.json +++ b/infra/prism/src/test/resources/common/json/user-jack-no-ns.json @@ -8,21 +8,21 @@ "singleStringType" : "foobar", "indexedString" : [ "alpha", "bravo" ], "bar" : [ { - "@typeDef" : "http://www.w3.org/2001/XMLSchema#string", + "@type" : "string", "@value" : "BAR" } ], "num" : [ { - "@typeDef" : "http://www.w3.org/2001/XMLSchema#int", + "@type" : "int", "@value" : 42 } ], "multi" : [ { - "@typeDef" : "http://www.w3.org/2001/XMLSchema#string", + "@type" : "string", "@value" : "raz" }, { - "@typeDef" : "http://www.w3.org/2001/XMLSchema#string", + "@type" : "string", "@value" : "dva" }, { - "@typeDef" : "http://www.w3.org/2001/XMLSchema#string", + "@type" : "string", "@value" : "tri" } ] }, diff --git a/infra/prism/src/test/resources/common/json/user-jack-object.json b/infra/prism/src/test/resources/common/json/user-jack-object.json index c38eaa08f8b..8140af0e2f7 100644 --- a/infra/prism/src/test/resources/common/json/user-jack-object.json +++ b/infra/prism/src/test/resources/common/json/user-jack-object.json @@ -12,21 +12,21 @@ "singleStringType" : "foobar", "indexedString" : [ "alpha", "bravo" ], "bar" : [ { - "@typeDef" : "http://www.w3.org/2001/XMLSchema#string", + "@type" : "http://www.w3.org/2001/XMLSchema#string", "@value" : "BAR" }, "BAR" ], "num" : [ { - "@typeDef" : "http://www.w3.org/2001/XMLSchema#int", + "@type" : "http://www.w3.org/2001/XMLSchema#int", "@value" : 42 }, 42 ], "multi" : [ { - "@typeDef" : "http://www.w3.org/2001/XMLSchema#string", + "@type" : "http://www.w3.org/2001/XMLSchema#string", "@value" : "raz" }, "raz", { - "@typeDef" : "http://www.w3.org/2001/XMLSchema#string", + "@type" : "http://www.w3.org/2001/XMLSchema#string", "@value" : "dva" }, "dva", { - "@typeDef" : "http://www.w3.org/2001/XMLSchema#string", + "@type" : "http://www.w3.org/2001/XMLSchema#string", "@value" : "tri" }, "tri" ] }, diff --git a/infra/prism/src/test/resources/common/json/user-jack-old.json b/infra/prism/src/test/resources/common/json/user-jack-old.json index 4179f066fdc..adaacb7a22a 100644 --- a/infra/prism/src/test/resources/common/json/user-jack-old.json +++ b/infra/prism/src/test/resources/common/json/user-jack-old.json @@ -10,27 +10,27 @@ "indexedString" : [ "alpha", "bravo" ], "num" : [ { - "@typeDef" : "http://www.w3.org/2001/XMLSchema#int", + "@type" : "http://www.w3.org/2001/XMLSchema#int", "@value" : 42 } ], "singleStringType" : "foobar", "multi" : [ { - "@typeDef" : "http://www.w3.org/2001/XMLSchema#string", + "@type" : "http://www.w3.org/2001/XMLSchema#string", "@value" : "raz" }, { - "@typeDef" : "http://www.w3.org/2001/XMLSchema#string", + "@type" : "http://www.w3.org/2001/XMLSchema#string", "@value" : "dva" }, { - "@typeDef" : "http://www.w3.org/2001/XMLSchema#string", + "@type" : "http://www.w3.org/2001/XMLSchema#string", "@value" : "tri" } ], "bar" : [ { - "@typeDef" : "http://www.w3.org/2001/XMLSchema#string", + "@type" : "http://www.w3.org/2001/XMLSchema#string", "@value" : "BAR" } ] diff --git a/infra/prism/src/test/resources/common/json/user-jack.json b/infra/prism/src/test/resources/common/json/user-jack.json index 18b6f960a81..7e75398e018 100644 --- a/infra/prism/src/test/resources/common/json/user-jack.json +++ b/infra/prism/src/test/resources/common/json/user-jack.json @@ -11,21 +11,21 @@ "singleStringType" : "foobar", "indexedString" : [ "alpha", "bravo" ], "bar" : [ { - "@typeDef" : "http://www.w3.org/2001/XMLSchema#string", + "@type" : "http://www.w3.org/2001/XMLSchema#string", "@value" : "BAR" } ], "num" : [ { - "@typeDef" : "http://www.w3.org/2001/XMLSchema#int", + "@type" : "int", "@value" : 42 } ], "multi" : [ { - "@typeDef" : "http://www.w3.org/2001/XMLSchema#string", + "@type" : "string", "@value" : "raz" }, { - "@typeDef" : "http://www.w3.org/2001/XMLSchema#string", + "@type" : "string", "@value" : "dva" }, { - "@typeDef" : "http://www.w3.org/2001/XMLSchema#string", + "@type" : "http://www.w3.org/2001/XMLSchema#string", "@value" : "tri" } ] }, diff --git a/infra/prism/src/test/resources/common/json/user-will.json b/infra/prism/src/test/resources/common/json/user-will.json index 209e480ade3..094c9ff3297 100644 --- a/infra/prism/src/test/resources/common/json/user-will.json +++ b/infra/prism/src/test/resources/common/json/user-will.json @@ -26,21 +26,21 @@ "ignoredType" : [ "this is just a fiction" ], "indexedString" : [ "alpha", "bravo" ], "bar" : [ { - "@typeDef" : "http://www.w3.org/2001/XMLSchema#string", + "@type" : "http://www.w3.org/2001/XMLSchema#string", "@value" : "BAR" } ], "num" : [ { - "@typeDef" : "http://www.w3.org/2001/XMLSchema#int", + "@type" : "http://www.w3.org/2001/XMLSchema#int", "@value" : 42 } ], "multi" : [ { - "@typeDef" : "http://www.w3.org/2001/XMLSchema#string", + "@type" : "http://www.w3.org/2001/XMLSchema#string", "@value" : "raz" }, { - "@typeDef" : "http://www.w3.org/2001/XMLSchema#string", + "@type" : "http://www.w3.org/2001/XMLSchema#string", "@value" : "dva" }, { - "@typeDef" : "http://www.w3.org/2001/XMLSchema#string", + "@type" : "http://www.w3.org/2001/XMLSchema#string", "@value" : "tri" } ] }, diff --git a/infra/prism/src/test/resources/common/xml/user-elisabeth.xml b/infra/prism/src/test/resources/common/xml/user-elisabeth.xml new file mode 100644 index 00000000000..e2948c1546b --- /dev/null +++ b/infra/prism/src/test/resources/common/xml/user-elisabeth.xml @@ -0,0 +1,12 @@ + + + elisabeth + + string + string1 + 142 + + Elisabeth Turner + Elisabeth + Turner + diff --git a/infra/prism/src/test/resources/common/xml/user-jack-no-ns.xml b/infra/prism/src/test/resources/common/xml/user-jack-no-ns.xml index 876a95cbb7e..19457765ec9 100644 --- a/infra/prism/src/test/resources/common/xml/user-jack-no-ns.xml +++ b/infra/prism/src/test/resources/common/xml/user-jack-no-ns.xml @@ -29,15 +29,15 @@ bravo - BAR + BAR - 42 + 42 - raz - dva - tri + raz + dva + tri + + + + + + + Embedded Test OpenDJ + + + + com.evolveum.midpoint.provisioning.api.ProvisioningService.getObject + success + + + + my.class + my.value + + + + + + + + + ...a filter description... + + extension/extConnType + org.identityconnectors.ldap.LdapConnector + + + import + Reference to the ICF LDAP connector. + + + + + + + + + 10389 + localhost + dc=example,dc=com + cn=directory manager + + secret + + uid + ds-pwp-account-disabled + + + + + + 120000 + 1 + 10 + 10 + 150000 + + + 100 + + + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + + + + http://midpoint.evolveum.com/xml/ns/public/resource/instance/ef2bc95b-76e0-59e2-86d6-3d4f02d3ffff + + + + + + + + + + + + icfs:uid + icfs:name + icfs:name + __GROUP__ + + + + + + + + + + + + + + + + + + + + + icfs:uid + icfs:name + icfs:name + __ACCOUNT__ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + default + + Default Account + + true + + + AccountObjectClass + + + + name + + + Distinguished Name + + + + + + + true + true + + + + + + weak + + $user/name + + + + + + + + + + + + + declare namespace icfs="http://midpoint.evolveum.com/xml/ns/public/connector/icf-1/resource-schema-3"; icfs:uid + + + Entry UUID + + + + + + + + true + + + + + + + + + + + + + + + cn + Common Name + + + + + + true + true + true + + + + + + + + + $user/fullName + + + + + $user/fullName + + + + + + + + sn + + Surname + + + true + true + true + + + + + + + familyName + + + + + + familyName + + + + + + + givenName + Given Name + + + + true + true + true + + + + + + + + + + $user/givenName + + + + + $user/givenName + + + + + + + declare namespace ri="http://midpoint.evolveum.com/xml/ns/public/resource/instance/ef2bc95b-76e0-59e2-86d6-3d4f02d3ffff"; ri:uid + Login Name + stringIgnoreCase + + weak + + Source may have description + $user/name + + + + + Targets may have description + $user/name + + + + + + + description + + + + weak + + Expression that assigns a fixed value + Created by IDM + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + employeeType + Employee Type + false + + + $user/employeeType + + + + + departmentNumber + Department Number + true + + + $user/extension/dept + + + + + + + + + l + false + + + + + + defaultLocation + middle of nowhere + + + + + + + + + + + + + + + weak + + + + + + + + + + + + weak + + + + + + + + + uid=idm,ou=Administrators,dc=example,dc=com + + + + + + + + + + + + + + + + ds-pwp-account-disabled + + true + + + + false + + + + + + + + + true + + + + + ... + + + name + + + $account/attributes/yyy + + + + + true + + + + + + + + linked + true + + + deleted + + unlinkAccount + + + + unlinked + + + + unmatched + + + + + + + + + + diff --git a/infra/schema/src/test/resources/common/xml/no-ns/user-jack.xml b/infra/schema/src/test/resources/common/xml/no-ns/user-jack.xml new file mode 100644 index 00000000000..bdd44b69a4e --- /dev/null +++ b/infra/schema/src/test/resources/common/xml/no-ns/user-jack.xml @@ -0,0 +1,104 @@ + + + + + jack + + + BAR + 42 + raz + dva + tri + + openS3zam3 + + + + + + jsparrow + + AccountObjectClass + + + + + captain + + Rum Supply System + + + http://midpoint.evolveum.com/xml/ns/public/resource/instance/2f9b9299-5555-5555-5555-000000002222 + + AccountObjectClass + + + + + This is third accountRef + + + + connectorType + org.identityconnectors.ldap.LdapConnector + + + + + + + 42 + + + + + + + + enabled + + + Jack Sparrow + Jack + Sparrow + Cpt. + + Brethren of the Coast + Davie Jones' Locker + + + + + + + + http://www.w3.org/2001/04/xmlenc#aes256-cbc + + + HF6JRsNMeJt6alihT44CXKgpe0c= + + + blc5OXO2Z4vJW7o/XXhqZzg/rkwsIOwRBK7KLgMqwcrVcYpeZZOjxzgRgFiNw4IB + + + + + + + diff --git a/infra/schema/src/test/resources/common/xml/ns/resource-opendj-simple.xml b/infra/schema/src/test/resources/common/xml/ns/resource-opendj-simple.xml new file mode 100644 index 00000000000..3209731be38 --- /dev/null +++ b/infra/schema/src/test/resources/common/xml/ns/resource-opendj-simple.xml @@ -0,0 +1,70 @@ + + + + + + + + + + Embedded Test OpenDJ + embedded test opendj + + + + + + + connectorType + org.identityconnectors.ldap.LdapConnector + + + run + + + + + + + + + 10389 + localhost + dc=example,dc=com + cn=directory manager + + secret + + + uid + ds-pwp-account-disabled + + + + + \ No newline at end of file diff --git a/infra/schema/src/test/resources/common/resource-opendj.xml b/infra/schema/src/test/resources/common/xml/ns/resource-opendj.xml similarity index 99% rename from infra/schema/src/test/resources/common/resource-opendj.xml rename to infra/schema/src/test/resources/common/xml/ns/resource-opendj.xml index 5955651bc6a..957935b5a70 100644 --- a/infra/schema/src/test/resources/common/resource-opendj.xml +++ b/infra/schema/src/test/resources/common/xml/ns/resource-opendj.xml @@ -35,10 +35,7 @@ xmlns:mr="http://midpoint.evolveum.com/xml/ns/public/common/matching-rule-3"> - - Embedded Test OpenDJ - embedded test opendj - + Embedded Test OpenDJ diff --git a/infra/schema/src/test/resources/common/xml/user-jack.xml b/infra/schema/src/test/resources/common/xml/ns/user-jack.xml similarity index 83% rename from infra/schema/src/test/resources/common/xml/user-jack.xml rename to infra/schema/src/test/resources/common/xml/ns/user-jack.xml index ad70cdaf5cd..4cc59396759 100644 --- a/infra/schema/src/test/resources/common/xml/user-jack.xml +++ b/infra/schema/src/test/resources/common/xml/ns/user-jack.xml @@ -28,10 +28,7 @@ xmlns:foo="http://www.example.com/foo" xmlns:t="http://prism.evolveum.com/xml/ns/public/types-3" xmlns:ext="http://midpoint.evolveum.com/xml/ns/test/extension"> - - jack - jack - + jack BAR @@ -73,7 +70,7 @@ connectorType - >org.identityconnectors.ldap.LdapConnector + org.identityconnectors.ldap.LdapConnector @@ -91,31 +88,13 @@ enabled - - Jack Sparrow - jack sparrow - - - Jack - jack - - - Sparrow - sparrow - - - Cpt. - cpt - + Jack Sparrow + Jack + Sparrow + Cpt. - - Brethren of the Coast - brethren of the coast - - - Davie Jones' Locker - davie jones locker - + Brethren of the Coast + Davie Jones' Locker diff --git a/infra/schema/src/test/resources/common/yaml/no-ns/user-jack.yaml b/infra/schema/src/test/resources/common/yaml/no-ns/user-jack.yaml new file mode 100644 index 00000000000..eadd7aac909 --- /dev/null +++ b/infra/schema/src/test/resources/common/yaml/no-ns/user-jack.yaml @@ -0,0 +1,65 @@ +--- +object: !UserType + oid: 2f9b9299-6f45-498f-bc8e-8d17c6b93b20 + name: jack + extension: + bar : !string BAR + num : !int 42 + multi: + - !string raz + - !string dva + - !string tri + password: !ProtectedStringType + clearValue: "openS3zam3" + link: + - + oid: 2f9b9299-6f45-498f-aaaa-000000001111 + name: jsparrow + resourceRef: + oid: 2f9b9299-5555-5555-5555-000000001111 + objectClass: AccountObjectClass + - + oid: 2f9b9299-6f45-498f-aaaa-000000002222 + name: captain + resource: + oid: 2f9b9299-5555-5555-5555-000000001111 + name: Rum Supply System + connectorRef: + oid: 2f9b9299-cccc-cccc-cccc-000000002222 + connectorConfiguration: { } + namespace: "http://midpoint.evolveum.com/xml/ns/public/resource/instance/2f9b9299-5555-5555-5555-000000002222" + objectClass: AccountObjectClass + linkRef: + oid: 2f9b9299-6f45-498f-aaaa-000000003333 + type: "ShadowType" + description: This is third accountRef + filter: + equal: + path: connectorType + value: org.identityconnectors.ldap.LdapConnector + assignment: + id: 111 + extension: + intType: 42 + construction: + resourceRef: + oid: 2f9b9299-5555-5555-5555-000000001111 + activation: + administrativeStatus: enabled + fullName: Jack Sparrow + givenName: Jack + familyName: Sparrow + honorificPrefix: Cpt. + emailAddress: + organizationalUnit: [ "Brethren of the Coast", "Davie Jones' Locker" ] + locality: "" + credentials: + password: + value: + encryptedData: + encryptionMethod: + algorithm: "http://www.w3.org/2001/04/xmlenc#aes256-cbc" + keyInfo: + keyName: "HF6JRsNMeJt6alihT44CXKgpe0c=" + cipherData: + cipherValue: "blc5OXO2Z4vJW7o/XXhqZzg/rkwsIOwRBK7KLgMqwcrVcYpeZZOjxzgRgFiNw4IB" \ No newline at end of file diff --git a/infra/schema/src/test/resources/common/yaml/ns/user-jack.yaml b/infra/schema/src/test/resources/common/yaml/ns/user-jack.yaml new file mode 100644 index 00000000000..7a6842884bd --- /dev/null +++ b/infra/schema/src/test/resources/common/yaml/ns/user-jack.yaml @@ -0,0 +1,68 @@ +--- +'@ns' : 'http://midpoint.evolveum.com/xml/ns/public/common/common-3' +object: !http://midpoint.evolveum.com/xml/ns/public/common/common-3/UserType + oid: 2f9b9299-6f45-498f-bc8e-8d17c6b93b20 + name: jack + extension: + "@ns" : "http://www.example.com/foo" + bar : !http://www.w3.org/2001/XMLSchema/string BAR + num : !http://www.w3.org/2001/XMLSchema/int 42 + multi: + - !http://www.w3.org/2001/XMLSchema/string raz + - !http://www.w3.org/2001/XMLSchema/string dva + - !http://www.w3.org/2001/XMLSchema/string tri + password: !http://prism.evolveum.com/xml/ns/public/types-3/ProtectedStringType + "http://prism.evolveum.com/xml/ns/public/types-3#clearValue": "openS3zam3" + link: + - + oid: 2f9b9299-6f45-498f-aaaa-000000001111 + name: jsparrow + resourceRef: { "oid" : "2f9b9299-5555-5555-5555-000000001111" } + objectClass: AccountObjectClass + - + oid: 2f9b9299-6f45-498f-aaaa-000000002222 + name: captain + resource: + oid: 2f9b9299-5555-5555-5555-000000001111 + name: Rum Supply System + connectorRef: { "oid" : "2f9b9299-cccc-cccc-cccc-000000002222" } + connectorConfiguration: { } + namespace: "http://midpoint.evolveum.com/xml/ns/public/resource/instance/2f9b9299-5555-5555-5555-000000002222" + objectClass: AccountObjectClass + linkRef: + oid: 2f9b9299-6f45-498f-aaaa-000000003333 + type: "http://midpoint.evolveum.com/xml/ns/public/common/common-3#ShadowType" + description: This is third accountRef + filter: + "@ns": "http://prism.evolveum.com/xml/ns/public/query-3" + equal: + path: connectorType + value: org.identityconnectors.ldap.LdapConnector + assignment: + id: 111 + extension: + "@ns": "http://midpoint.evolveum.com/xml/ns/test/extension" + intType: 42 + construction: + resourceRef: + oid: 2f9b9299-5555-5555-5555-000000001111 + activation: + administrativeStatus: enabled + fullName: Jack Sparrow + givenName: Jack + familyName: Sparrow + honorificPrefix: Cpt. + emailAddress: + organizationalUnit: [ "Brethren of the Coast", "Davie Jones' Locker" ] + locality: "" + credentials: + password: + value: + "@ns" : "http://prism.evolveum.com/xml/ns/public/types-3" + encryptedData: + encryptionMethod: + algorithm: "http://www.w3.org/2001/04/xmlenc#aes256-cbc" + keyInfo: + keyName: "HF6JRsNMeJt6alihT44CXKgpe0c=" + cipherData: + cipherValue: "blc5OXO2Z4vJW7o/XXhqZzg/rkwsIOwRBK7KLgMqwcrVcYpeZZOjxzgRgFiNw4IB" \ No newline at end of file From 35ca7a5d44f4e1752533302730330c0a85d854d6 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Tue, 4 Oct 2016 15:20:01 +0200 Subject: [PATCH 13/74] Interim commit. --- .../prism/ItemNameQualificationStrategy.java | 28 +++++++++++++++++++ .../prism/NameQualificationStrategy.java | 5 ++-- .../prism/PrismContainerDefinition.java | 14 ++++++++-- .../evolveum/midpoint/prism/PrismContext.java | 8 +++++- .../midpoint/prism/SerializationContext.java | 4 +++ .../midpoint/prism/SerializationOptions.java | 23 +++++++++++++-- .../prism/parser/json/AbstractJsonParser.java | 17 +++++++---- .../midpoint/prism/schema/SchemaRegistry.java | 9 +++--- .../midpoint/prism/TestPrismParsing.java | 2 +- .../midpoint/prism/TestPrismParsingYaml.java | 21 -------------- 10 files changed, 89 insertions(+), 42 deletions(-) create mode 100644 infra/prism/src/main/java/com/evolveum/midpoint/prism/ItemNameQualificationStrategy.java diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/ItemNameQualificationStrategy.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/ItemNameQualificationStrategy.java new file mode 100644 index 00000000000..e1c60c04c8e --- /dev/null +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/ItemNameQualificationStrategy.java @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.prism; + +/** + * @author mederly + */ +public enum ItemNameQualificationStrategy { + + ALWAYS_USE_FULL_URI, + USE_NS_PROPERTY + //UNQUALIFIED_IF_NOT_AMBIGUOUS + +} diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/NameQualificationStrategy.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/NameQualificationStrategy.java index 30a42d5823d..ca495670a23 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/NameQualificationStrategy.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/NameQualificationStrategy.java @@ -20,8 +20,7 @@ * @author mederly */ public enum NameQualificationStrategy { - ALWAYS, - ONLY_IF_NOT_COMMON, - ONLY_IF_AMBIGUOUS; + IF_AMBIGUOUS, + IF_NOT_COMMON_OR_AMBIGUOUS; } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerDefinition.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerDefinition.java index 1a597d9b9b2..d28632afc1d 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerDefinition.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerDefinition.java @@ -193,17 +193,25 @@ public D findItemDefinition(QName name, Class claz return itemDefinition; } + public String getDefaultNamespace() { + return complexTypeDefinition != null ? complexTypeDefinition.getDefaultNamespace() : null; + } + + public List getIgnoredNamespaces() { + return complexTypeDefinition != null ? complexTypeDefinition.getIgnoredNamespaces() : null; + } + private D findRuntimeItemDefinition(QName firstName, ItemPath rest, Class clazz) { if (prismContext == null) { return null; // should not occur } ItemDefinition definition = null; - if (StringUtils.isEmpty(firstName.getNamespaceURI()) && StringUtils.isNotEmpty(complexTypeDefinition.getDefaultNamespace())) { + if (StringUtils.isEmpty(firstName.getNamespaceURI()) && StringUtils.isNotEmpty(getDefaultNamespace())) { definition = prismContext.getSchemaRegistry().findItemDefinitionByElementName( - new QName(complexTypeDefinition.getDefaultNamespace(), firstName.getLocalPart())); + new QName(getDefaultNamespace(), firstName.getLocalPart())); } if (definition == null) { - definition = prismContext.getSchemaRegistry().findItemDefinitionByElementName(firstName, complexTypeDefinition.getIgnoredNamespaces()); + definition = prismContext.getSchemaRegistry().findItemDefinitionByElementName(firstName, getIgnoredNamespaces()); } if (definition == null) { return null; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java index a70c2fd1b1b..1eb6e044ba5 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java @@ -561,7 +561,13 @@ public String serializeObjectToString(PrismObject obje RootXNode xroot = xnodeProcessor.serializeObject(object); return parser.serializeToString(xroot, null); } - + + public String serializeObjectToString(PrismObject object, String language, SerializationOptions options) throws SchemaException { + Parser parser = getParserNotNull(language); + RootXNode xroot = xnodeProcessor.serializeObject(object); + return parser.serializeToString(xroot, SerializationContext.forOptions(options)); + } + public String serializeContainerValueToString(PrismContainerValue cval, QName elementName, String language) throws SchemaException { Parser parser = getParserNotNull(language); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializationContext.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializationContext.java index 44be5428e28..49bf4524ee0 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializationContext.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializationContext.java @@ -41,4 +41,8 @@ public void setOptions(SerializationOptions options) { public static boolean isSerializeReferenceNames(SerializationContext ctx) { return ctx != null && SerializationOptions.isSerializeReferenceNames(ctx.getOptions()); } + + public static SerializationContext forOptions(SerializationOptions options) { + return new SerializationContext(options); + } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializationOptions.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializationOptions.java index 07532f4ad03..1e3bfaf85f4 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializationOptions.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializationOptions.java @@ -22,7 +22,7 @@ public class SerializationOptions { private boolean serializeReferenceNames; - private NameQualificationStrategy itemNameQualificationStrategy; + private ItemNameQualificationStrategy itemNameQualificationStrategy; private NameQualificationStrategy itemTypeQualificationStrategy; private NameQualificationStrategy itemPathQualificationStrategy; private NameQualificationStrategy genericQualificationStrategy; @@ -45,11 +45,11 @@ public static boolean isSerializeReferenceNames(SerializationOptions options) { return options != null && options.isSerializeReferenceNames(); } - public NameQualificationStrategy getItemNameQualificationStrategy() { + public ItemNameQualificationStrategy getItemNameQualificationStrategy() { return itemNameQualificationStrategy; } - public void setItemNameQualificationStrategy(NameQualificationStrategy itemNameQualificationStrategy) { + public void setItemNameQualificationStrategy(ItemNameQualificationStrategy itemNameQualificationStrategy) { this.itemNameQualificationStrategy = itemNameQualificationStrategy; } @@ -76,4 +76,21 @@ public NameQualificationStrategy getGenericQualificationStrategy() { public void setGenericQualificationStrategy(NameQualificationStrategy genericQualificationStrategy) { this.genericQualificationStrategy = genericQualificationStrategy; } + + public static SerializationOptions createQualifiedNames() { + SerializationOptions opts = new SerializationOptions(); + opts.itemNameQualificationStrategy = ItemNameQualificationStrategy.ALWAYS_USE_FULL_URI; + opts.itemPathQualificationStrategy = NameQualificationStrategy.ALWAYS; + opts.itemTypeQualificationStrategy = NameQualificationStrategy.ALWAYS; + opts.genericQualificationStrategy = NameQualificationStrategy.ALWAYS; + return opts; + } + + public static boolean isFullItemNameUris(SerializationOptions opts) { + return opts != null && opts.itemNameQualificationStrategy != ItemNameQualificationStrategy.ALWAYS_USE_FULL_URI; + } + + public static boolean isUseNsProperty(SerializationOptions opts) { + return opts == null || opts.itemNameQualificationStrategy == null || opts.itemNameQualificationStrategy == ItemNameQualificationStrategy.USE_NS_PROPERTY; + } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/AbstractJsonParser.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/AbstractJsonParser.java index 185103411e9..9ff13785bef 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/AbstractJsonParser.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/AbstractJsonParser.java @@ -24,10 +24,13 @@ import com.evolveum.midpoint.prism.ParsingContext; import com.evolveum.midpoint.prism.SerializationContext; +import com.evolveum.midpoint.prism.SerializationOptions; import com.evolveum.midpoint.prism.parser.Parser; import com.evolveum.midpoint.prism.parser.ParserUtils; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; +import com.fasterxml.jackson.core.*; +import com.fasterxml.jackson.core.JsonParser; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang3.Validate; import org.jetbrains.annotations.NotNull; @@ -46,11 +49,6 @@ import com.evolveum.midpoint.util.QNameUtil; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.prism.xml.ns._public.types_3.ItemPathType; -import com.fasterxml.jackson.core.JsonGenerationException; -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.core.JsonToken; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.module.SimpleModule; @@ -482,12 +480,19 @@ private void serializeFromMap(MapXNode map, JsonSerializationContext ctx) throws writeExplicitType(explicitType, ctx.generator); } for (Entry entry : map.entrySet()) { - ctx.generator.writeFieldName(QNameUtil.qNameToUri(entry.getKey(), false)); + ctx.generator.writeFieldName(createKeyUri(entry.getKey(), ctx)); serialize(entry.getValue(), ctx); } ctx.generator.writeEndObject(); } + private String createKeyUri(QName key, JsonSerializationContext ctx) { + final SerializationOptions opts = ctx.prismSerializationContext.getOptions(); + if (SerializationOptions.isFullItemNameUris(opts)) { + return QNameUtil.qNameToUri(key, false); + } + } + private void serializeFromList(ListXNode list, JsonSerializationContext ctx) throws IOException { ctx.generator.writeStartArray(); for (XNode item : list) { diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistry.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistry.java index 0436c076a42..fedabdbdad1 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistry.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistry.java @@ -47,6 +47,7 @@ import org.apache.xml.resolver.CatalogManager; import org.apache.xml.resolver.tools.CatalogResolver; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.springframework.beans.factory.annotation.Autowired; import org.w3c.dom.Element; import org.w3c.dom.Node; @@ -1032,7 +1033,7 @@ public ItemDefinition findItemDefinitionByElementName(QName elementName) { return findItemDefinitionByElementName(elementName, null); } - public ItemDefinition findItemDefinitionByElementName(QName elementName, List ignoredNamespaces) { + public ItemDefinition findItemDefinitionByElementName(QName elementName, @Nullable List ignoredNamespaces) { if (StringUtils.isEmpty(elementName.getNamespaceURI())) { return resolveGlobalItemDefinitionWithoutNamespace(elementName.getLocalPart(), ItemDefinition.class, true, ignoredNamespaces); } @@ -1195,7 +1196,7 @@ public ItemDefinition resolveGlobalItemDefinition(QName elementQName, PrismConta String elementNamespace = elementQName.getNamespaceURI(); if (StringUtils.isEmpty(elementNamespace)) { List ignoredNamespaces = containerDefinition != null ? - containerDefinition.getComplexTypeDefinition().getIgnoredNamespaces() : + containerDefinition.getIgnoredNamespaces() : null; return resolveGlobalItemDefinitionWithoutNamespace(elementQName.getLocalPart(), ItemDefinition.class, true, ignoredNamespaces); } @@ -1211,7 +1212,7 @@ private T resolveGlobalItemDefinitionWithoutNamespace return resolveGlobalItemDefinitionWithoutNamespace(localPart, definitionClass, true, null); } - private T resolveGlobalItemDefinitionWithoutNamespace(String localPart, Class definitionClass, boolean exceptionIfAmbiguous, List ignoredNamespaces) { + private T resolveGlobalItemDefinitionWithoutNamespace(String localPart, Class definitionClass, boolean exceptionIfAmbiguous, @Nullable List ignoredNamespaces) { ItemDefinition found = null; for (SchemaDescription schemaDescription : parsedSchemas.values()) { PrismSchema schema = schemaDescription.getSchema(); @@ -1238,7 +1239,7 @@ private T resolveGlobalItemDefinitionWithoutNamespace return (T) found; } - private boolean namespaceMatches(String namespace, List ignoredNamespaces) { + private boolean namespaceMatches(String namespace, @Nullable List ignoredNamespaces) { if (ignoredNamespaces == null) { return false; } diff --git a/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestPrismParsing.java b/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestPrismParsing.java index c301ad2dd84..f608ca25fcf 100644 --- a/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestPrismParsing.java +++ b/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestPrismParsing.java @@ -184,7 +184,7 @@ private void roundTrip(File file) throws SchemaException, SAXException, IOExcept // WHEN // We need to serialize with composite objects during roundtrip, otherwise the result will not be equal - String userXml = prismContext.serializeObjectToString(originalUser, getOutputFormat()); + String userXml = prismContext.serializeObjectToString(originalUser, getOutputFormat(), SerializationOptions.createQualifiedNames()); // THEN System.out.println("Serialized user:"); diff --git a/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestPrismParsingYaml.java b/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestPrismParsingYaml.java index 2b7a5663de8..9114e1b219f 100644 --- a/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestPrismParsingYaml.java +++ b/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestPrismParsingYaml.java @@ -26,26 +26,5 @@ protected String getFilenameSuffix() { protected String getOutputFormat() { return PrismContext.LANG_YAML; } - - @Test - public void test() throws Exception{ -// File[] files = new File[]{USER_JACK_ADHOC_FILE}; -// PrismContext prismContext = constructInitializedPrismContext(); -// for (File f : files){ -// System.out.println("parsing file" + f.getName()); -// PrismObject o = prismContext.parseObject(f); -//// -// String s = prismContext.serializeObjectToString(o, PrismContext.LANG_YAML); -// System.out.println("parsed: " + s); -// String fname = f.getName(); -// fname = fname.replace(".xml", "123.yaml"); -// -// FileOutputStream bos = (new FileOutputStream(new File("src/test/resources/common/yaml/"+fname))); -// byte[] bytes = s.getBytes(); -// bos.write(bytes); -// bos.flush(); -// bos.close(); -// } - } } From 0385315011e94e9ee972b7aeb4ff9cb5434fe290 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Tue, 4 Oct 2016 17:47:00 +0200 Subject: [PATCH 14/74] Returning back more intelligent serialization of JSON/YAML. Correctly parsing "explicit no-NS" nodes. --- .../prism/parser/json/AbstractJsonParser.java | 100 ++++++++++++++---- .../midpoint/prism/xnode/MapXNode.java | 19 +++- .../midpoint/prism/TestPrismParsing.java | 2 +- infra/util/pom.xml | 4 + .../com/evolveum/midpoint/util/QNameUtil.java | 26 +++-- 5 files changed, 123 insertions(+), 28 deletions(-) diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/AbstractJsonParser.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/AbstractJsonParser.java index 9ff13785bef..21ea290ebb4 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/AbstractJsonParser.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/AbstractJsonParser.java @@ -104,7 +104,11 @@ public Collection parseCollection(String dataString, ParsingContext parsi class JsonParsingContext { @NotNull final JsonParser parser; @NotNull final ParsingContext prismParsingContext; + // Definitions of namespaces ('@ns') within maps; to be applied after parsing. @NotNull final IdentityHashMap defaultNamespaces = new IdentityHashMap<>(); + // Entries that should be skipped when filling-in default namespaces - those that are explicitly set with no-NS ('#name'). + // (Values for these entries are not important. Only key presence is relevant.) + @NotNull final IdentityHashMap, Object> noNamespaceEntries = new IdentityHashMap<>(); JsonParsingContext(@NotNull JsonParser parser, @NotNull ParsingContext prismParsingContext) { this.parser = parser; this.prismParsingContext = prismParsingContext; @@ -149,7 +153,9 @@ private void processDefaultNamespaces(XNode xnode, String parentDefault, JsonPar for (Entry entry : map.entrySet()) { QName fieldName = entry.getKey(); XNode subnode = entry.getValue(); - if (StringUtils.isNotEmpty(currentDefault) && StringUtils.isEmpty(fieldName.getNamespaceURI())) { + if (StringUtils.isNotEmpty(currentDefault) + && StringUtils.isEmpty(fieldName.getNamespaceURI()) + && !ctx.noNamespaceEntries.containsKey(entry)) { map.qualifyKey(fieldName, currentDefault); } processDefaultNamespaces(subnode, currentDefault, ctx); @@ -229,14 +235,13 @@ private XNode parseJsonObject(JsonParsingContext ctx) throws SchemaException, IO Object tid = ctx.parser.getTypeId(); if (tid != null) { -// System.out.println("tid for object = '" + tid + "' for " + ctx.parser.getText()); typeName = tagToTypeName(tid, ctx); } final MapXNode map = new MapXNode(); PrimitiveXNode primitiveValue = null; boolean defaultNamespaceDefined = false; - QName currentFieldName = null; + QNameUtil.QNameInfo currentFieldNameInfo = null; for (;;) { JsonToken token = ctx.parser.nextToken(); if (token == null) { @@ -246,33 +251,33 @@ private XNode parseJsonObject(JsonParsingContext ctx) throws SchemaException, IO break; } else if (token == JsonToken.FIELD_NAME) { String newFieldName = ctx.parser.getCurrentName(); - if (currentFieldName != null) { - ctx.prismParsingContext.warnOrThrow(LOGGER, "Two field names in succession: " + currentFieldName + " and " + newFieldName); + if (currentFieldNameInfo != null) { + ctx.prismParsingContext.warnOrThrow(LOGGER, "Two field names in succession: " + currentFieldNameInfo + " and " + newFieldName); } - currentFieldName = QNameUtil.uriToQName(newFieldName, true); + currentFieldNameInfo = QNameUtil.uriToQNameInfo(newFieldName, true); } else { XNode valueXNode = parseValue(ctx); - if (isSpecial(currentFieldName)) { + if (isSpecial(currentFieldNameInfo.name)) { String stringValue; if (!(valueXNode instanceof PrimitiveXNode)) { - ctx.prismParsingContext.warnOrThrow(LOGGER, "Value of '" + currentFieldName + "' attribute must be a primitive one. It is " + valueXNode + " instead. At " + getPositionSuffix(ctx)); + ctx.prismParsingContext.warnOrThrow(LOGGER, "Value of '" + currentFieldNameInfo + "' attribute must be a primitive one. It is " + valueXNode + " instead. At " + getPositionSuffix(ctx)); stringValue = ""; } else { stringValue = ((PrimitiveXNode) valueXNode).getStringValue(); } - if (isNamespaceDeclaration(currentFieldName)) { + if (isNamespaceDeclaration(currentFieldNameInfo.name)) { if (defaultNamespaceDefined) { ctx.prismParsingContext.warnOrThrow(LOGGER, "Default namespace defined more than once at " + getPositionSuffix(ctx)); } ctx.defaultNamespaces.put(map, stringValue); defaultNamespaceDefined = true; - } else if (isTypeDeclaration(currentFieldName)) { + } else if (isTypeDeclaration(currentFieldNameInfo.name)) { if (typeName != null) { ctx.prismParsingContext.warnOrThrow(LOGGER, "Value type defined more than once at " + getPositionSuffix(ctx)); } typeName = QNameUtil.uriToQName(stringValue, true); - } else if (isValue(currentFieldName)) { + } else if (isValue(currentFieldNameInfo.name)) { if (primitiveValue != null) { ctx.prismParsingContext.warnOrThrow(LOGGER, "Primitive value ('" + PROP_VALUE + "') defined more than once at " + getPositionSuffix(ctx)); } @@ -281,9 +286,12 @@ private XNode parseJsonObject(JsonParsingContext ctx) throws SchemaException, IO } } } else { - map.put(currentFieldName, valueXNode); + Map.Entry entry = map.putReturningEntry(currentFieldNameInfo.name, valueXNode); + if (currentFieldNameInfo.explicitEmptyNamespace) { + ctx.noNamespaceEntries.put(entry, null); + } } - currentFieldName = null; + currentFieldNameInfo = null; } } // Return either map or primitive value (in case of @type/@value) @@ -347,7 +355,6 @@ private PrimitiveXNode parseToPrimitive(JsonParsingContext ctx) throws IO Object tid = ctx.parser.getTypeId(); if (tid != null) { -// System.out.println("tid = '" + tid + "' for " + ctx.parser.getText()); QName typeName = tagToTypeName(tid, ctx); primitive.setTypeQName(typeName); primitive.setExplicitTypeDeclaration(true); @@ -479,17 +486,72 @@ private void serializeFromMap(MapXNode map, JsonSerializationContext ctx) throws if (explicitType != null) { writeExplicitType(explicitType, ctx.generator); } + String oldDefaultNamespace = ctx.currentNamespace; + generateNsDeclarationIfNeeded(map, ctx); for (Entry entry : map.entrySet()) { - ctx.generator.writeFieldName(createKeyUri(entry.getKey(), ctx)); + ctx.generator.writeFieldName(createKeyUri(entry, ctx)); serialize(entry.getValue(), ctx); } ctx.generator.writeEndObject(); + ctx.currentNamespace = oldDefaultNamespace; + } + + private void generateNsDeclarationIfNeeded(MapXNode map, JsonSerializationContext ctx) throws IOException { + SerializationOptions opts = ctx.prismSerializationContext.getOptions(); + if (!SerializationOptions.isUseNsProperty(opts) || map.isEmpty()) { + return; + } + String namespace = determineNewCurrentNamespace(map, ctx); + if (namespace != null && !StringUtils.equals(namespace, ctx.currentNamespace)) { + ctx.currentNamespace = namespace; + ctx.generator.writeFieldName(PROP_NAMESPACE); + ctx.generator.writeString(namespace); + } } - private String createKeyUri(QName key, JsonSerializationContext ctx) { - final SerializationOptions opts = ctx.prismSerializationContext.getOptions(); - if (SerializationOptions.isFullItemNameUris(opts)) { - return QNameUtil.qNameToUri(key, false); + private String determineNewCurrentNamespace(MapXNode map, JsonSerializationContext ctx) { + Map counts = new HashMap<>(); + for (QName childName : map.keySet()) { + String childNs = childName.getNamespaceURI(); + if (StringUtils.isEmpty(childNs)) { + continue; + } + if (childNs.equals(ctx.currentNamespace)) { + return ctx.currentNamespace; // found existing => continue with it + } + Integer c = counts.get(childNs); + counts.put(childNs, c != null ? c+1 : 1); + } + // otherwise, take the URI that occurs the most in the map + Entry max = null; + for (Entry count : counts.entrySet()) { + if (max == null || count.getValue() > max.getValue()) { + max = count; + } + } + return max != null ? max.getKey() : null; + } + + private String createKeyUri(Entry entry, JsonSerializationContext ctx) { + QName key = entry.getKey(); + if (namespaceMatch(ctx.currentNamespace, key.getNamespaceURI())) { + return key.getLocalPart(); + } else if (StringUtils.isNotEmpty(ctx.currentNamespace) && !isAttribute(entry.getValue())) { + return QNameUtil.qNameToUri(key, true); // items with no namespace should be written as such (starting with '#') + } else { + return QNameUtil.qNameToUri(key, false); // items with no namespace can be written in plain + } + } + + private boolean isAttribute(XNode node) { + return node instanceof PrimitiveXNode && ((PrimitiveXNode) node).isAttribute(); + } + + private boolean namespaceMatch(String currentNamespace, String itemNamespace) { + if (StringUtils.isEmpty(currentNamespace)) { + return StringUtils.isEmpty(itemNamespace); + } else { + return currentNamespace.equals(itemNamespace); } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/MapXNode.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/MapXNode.java index 7da8a3de3dc..a421d0d7997 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/MapXNode.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/MapXNode.java @@ -86,6 +86,13 @@ public XNode put(QName key, XNode value) { return value; } + public Entry putReturningEntry(QName key, XNode value) { + removeEntry(key); + Entry e = new Entry(key, value); + subnodes.add(e); + return e; + } + public XNode remove(Object key) { if (!(key instanceof QName)) { throw new IllegalArgumentException("Key must be QName, but it is "+key); @@ -354,7 +361,17 @@ public void qualifyKey(QName key, String newNamespace) { } } } - + + public void replace(QName key, XNode value) { + for (Entry entry : subnodes) { + if (entry.getKey().equals(key)) { + entry.setValue(value); + return; + } + } + put(key, value); + } + private class Entry implements Map.Entry, Serializable { private QName key; diff --git a/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestPrismParsing.java b/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestPrismParsing.java index f608ca25fcf..54fed080609 100644 --- a/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestPrismParsing.java +++ b/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestPrismParsing.java @@ -184,7 +184,7 @@ private void roundTrip(File file) throws SchemaException, SAXException, IOExcept // WHEN // We need to serialize with composite objects during roundtrip, otherwise the result will not be equal - String userXml = prismContext.serializeObjectToString(originalUser, getOutputFormat(), SerializationOptions.createQualifiedNames()); + String userXml = prismContext.serializeObjectToString(originalUser, getOutputFormat(), null); // THEN System.out.println("Serialized user:"); diff --git a/infra/util/pom.xml b/infra/util/pom.xml index c36776a3d49..23bee7e75f6 100644 --- a/infra/util/pom.xml +++ b/infra/util/pom.xml @@ -88,6 +88,10 @@ aopalliance aopalliance + + org.jetbrains + annotations-java5 + org.testng diff --git a/infra/util/src/main/java/com/evolveum/midpoint/util/QNameUtil.java b/infra/util/src/main/java/com/evolveum/midpoint/util/QNameUtil.java index 70ddde25516..9c2f494ea05 100644 --- a/infra/util/src/main/java/com/evolveum/midpoint/util/QNameUtil.java +++ b/infra/util/src/main/java/com/evolveum/midpoint/util/QNameUtil.java @@ -18,7 +18,6 @@ import java.util.Arrays; import java.util.Collection; -import java.util.Set; import javax.xml.namespace.QName; @@ -26,6 +25,8 @@ import com.evolveum.midpoint.util.logging.TraceManager; import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang.Validate; +import org.jetbrains.annotations.NotNull; import org.w3c.dom.Node; /** @@ -83,16 +84,27 @@ public static QName uriToQName(String uri) { return uriToQName(uri, false); } + public static class QNameInfo { + @NotNull public final QName name; + public final boolean explicitEmptyNamespace; + public QNameInfo(@NotNull QName name, boolean explicitEmptyNamespace) { + this.name = name; + this.explicitEmptyNamespace = explicitEmptyNamespace; + } + } + public static QName uriToQName(String uri, boolean allowUnqualified) { + return uriToQNameInfo(uri, allowUnqualified).name; + } - if (uri == null) { - throw new IllegalArgumentException("URI is null"); - } + @NotNull + public static QNameInfo uriToQNameInfo(@NotNull String uri, boolean allowUnqualified) { + Validate.notNull(uri); int index = uri.lastIndexOf("#"); if (index != -1) { String ns = uri.substring(0, index); String name = uri.substring(index+1); - return new QName(ns,name); + return new QNameInfo(new QName(ns, name), "".equals(ns)); } index = uri.lastIndexOf("/"); // TODO check if this is still in the path section, e.g. @@ -101,10 +113,10 @@ public static QName uriToQName(String uri, boolean allowUnqualified) { if (index != -1) { String ns = uri.substring(0, index); String name = uri.substring(index+1); - return new QName(ns,name); + return new QNameInfo(new QName(ns, name), "".equals(ns)); } if (allowUnqualified) { - return new QName(uri); + return new QNameInfo(new QName(uri), false); } else { throw new IllegalArgumentException("The URI (" + uri + ") does not contain slash character"); } From a9bd2333b70a035438d2c6183f91c2a6ba489bcc Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Tue, 4 Oct 2016 17:59:38 +0200 Subject: [PATCH 15/74] Fixed compilation errors and minor bugs. --- .../prism/parser/json/QNameSerializer.java | 29 +++---------------- .../midpoint/prism/xnode/MapXNode.java | 11 +++---- 2 files changed, 10 insertions(+), 30 deletions(-) diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/QNameSerializer.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/QNameSerializer.java index a97020286bf..f48e8a58992 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/QNameSerializer.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/QNameSerializer.java @@ -11,38 +11,17 @@ import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.jsontype.TypeSerializer; -public class QNameSerializer extends JsonSerializer{ +public class QNameSerializer extends JsonSerializer { @Override - public void serialize(QName value, JsonGenerator jgen, SerializerProvider provider) throws IOException, - JsonProcessingException { - //System.out.println("wualaaa QName serialization"); - jgen.writeString(QNameUtil.qNameToUri(value)); -// jgen.writeString(value.toString()); -// jgen.writeStartObject(); -// jgen.writeStringField("@namespace", value.getNamespaceURI()); -// jgen.writeStringField("@localPart", value.getLocalPart()); -// jgen.writeEndObject(); + public void serialize(QName value, JsonGenerator jgen, SerializerProvider provider) throws IOException { + jgen.writeString(QNameUtil.qNameToUri(value, false)); } @Override public void serializeWithType(QName value, JsonGenerator jgen, SerializerProvider provider, - TypeSerializer typeSer) throws IOException, JsonProcessingException { - // TODO Auto-generated method stub - //System.out.println("QName serialization with type"); - -// jgen.writeStartObject(); -// typeSer.writeCustomTypePrefixForObject(value, jgen, "qname"); -// typeSer.writeCustomTypePrefixForArray(value, jgen, "qname"); -// typeSer.writeCustomTypePrefixForScalar(value, jgen, "qname"); + TypeSerializer typeSer) throws IOException { serialize(value, jgen, provider); -// typeSer.writeCustomTypeSuffixForScalar(value, jgen, "tra"); -// typeSer.writeCustomTypeSuffixForArray(value, jgen, "qname"); -// typeSer.writeCustomTypeSuffixForObject(value, jgen, "bla"); -// jgen.writeTypeId("http://qname"); -// jgen.writeObject(value.toString()); -// jgen.writeEndObject(); - } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/MapXNode.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/MapXNode.java index a421d0d7997..c1f4a73c89d 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/MapXNode.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/MapXNode.java @@ -81,9 +81,9 @@ public XNode put(Map.Entry entry) { } public XNode put(QName key, XNode value) { - removeEntry(key); + XNode previous = removeEntry(key); subnodes.add(new Entry(key, value)); - return value; + return previous; } public Entry putReturningEntry(QName key, XNode value) { @@ -362,14 +362,15 @@ public void qualifyKey(QName key, String newNamespace) { } } - public void replace(QName key, XNode value) { + public XNode replace(QName key, XNode value) { for (Entry entry : subnodes) { if (entry.getKey().equals(key)) { + XNode previous = entry.getValue(); entry.setValue(value); - return; + return previous; } } - put(key, value); + return put(key, value); } private class Entry implements Map.Entry, Serializable { From b38eec8d113494b85851bcda85c7e3bd1ac3d9f1 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Tue, 4 Oct 2016 21:43:07 +0200 Subject: [PATCH 16/74] Parsing user+resource in schema tests works (xml, json, yaml, ns/no-ns). --- .../prism/marshaller/PrismBeanConverter.java | 6 +- .../prism/parser/json/AbstractJsonParser.java | 13 +- .../parser/json/JsonNullValueParser.java | 67 ++++ .../midpoint/prism/util/PrismAsserts.java | 6 +- .../midpoint/schema/TestConstants.java | 2 +- .../midpoint/schema/TestJaxbConstruction.java | 3 +- .../midpoint/schema/TestParseUserJson.java | 30 -- .../midpoint/schema/TestParseUserXml.java | 26 -- .../resource}/TestParseResource.java | 10 +- .../resource/TestParseResourceJson.java | 33 ++ .../resource/TestParseResourceJsonNoNs.java | 30 ++ .../resource/TestParseResourceJsonNs.java | 30 ++ .../resource}/TestParseResourceXml.java | 3 +- .../resource}/TestParseResourceXmlNoNs.java | 14 +- .../resource}/TestParseResourceXmlNs.java | 14 +- .../resource/TestParseResourceYaml.java | 33 ++ .../resource/TestParseResourceYamlNoNs.java | 30 ++ .../resource/TestParseResourceYamlNs.java | 30 ++ .../{ => parser/user}/TestParseUser.java | 6 +- .../schema/parser/user/TestParseUserJson.java | 42 ++ .../user}/TestParseUserJsonNoNs.java | 2 +- .../schema/parser/user/TestParseUserXml.java | 42 ++ .../user}/TestParseUserXmlNoNs.java | 2 +- .../{ => parser/user}/TestParseUserYaml.java | 2 +- .../user}/TestParseUserYamlNoNs.java | 2 +- .../schema/processor/TestResourceSchema.java | 4 +- .../json/no-ns/resource-opendj-simple.json | 34 ++ .../common/json/no-ns/resource-opendj.json | 324 ++++++++++++++++ .../json/ns/resource-opendj-simple.json | 39 ++ .../common/json/ns/resource-opendj.json | 331 ++++++++++++++++ .../common/xml/ns/resource-opendj.xml | 3 +- .../yaml/no-ns/resource-opendj-simple.yaml | 25 ++ .../common/yaml/no-ns/resource-opendj.yaml | 349 +++++++++++++++++ .../yaml/ns/resource-opendj-simple.yaml | 30 ++ .../common/yaml/ns/resource-opendj.yaml | 360 ++++++++++++++++++ infra/schema/testng-unit.xml | 18 +- 36 files changed, 1885 insertions(+), 110 deletions(-) create mode 100644 infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/JsonNullValueParser.java delete mode 100644 infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseUserJson.java delete mode 100644 infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseUserXml.java rename infra/schema/src/test/java/com/evolveum/midpoint/schema/{ => parser/resource}/TestParseResource.java (98%) create mode 100644 infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceJson.java create mode 100644 infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceJsonNoNs.java create mode 100644 infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceJsonNs.java rename infra/schema/src/test/java/com/evolveum/midpoint/schema/{ => parser/resource}/TestParseResourceXml.java (96%) rename infra/schema/src/test/java/com/evolveum/midpoint/schema/{ => parser/resource}/TestParseResourceXmlNoNs.java (59%) rename infra/schema/src/test/java/com/evolveum/midpoint/schema/{ => parser/resource}/TestParseResourceXmlNs.java (59%) create mode 100644 infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceYaml.java create mode 100644 infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceYamlNoNs.java create mode 100644 infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceYamlNs.java rename infra/schema/src/test/java/com/evolveum/midpoint/schema/{ => parser/user}/TestParseUser.java (98%) create mode 100644 infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/user/TestParseUserJson.java rename infra/schema/src/test/java/com/evolveum/midpoint/schema/{ => parser/user}/TestParseUserJsonNoNs.java (95%) create mode 100644 infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/user/TestParseUserXml.java rename infra/schema/src/test/java/com/evolveum/midpoint/schema/{ => parser/user}/TestParseUserXmlNoNs.java (95%) rename infra/schema/src/test/java/com/evolveum/midpoint/schema/{ => parser/user}/TestParseUserYaml.java (95%) rename infra/schema/src/test/java/com/evolveum/midpoint/schema/{ => parser/user}/TestParseUserYamlNoNs.java (95%) create mode 100644 infra/schema/src/test/resources/common/json/no-ns/resource-opendj-simple.json create mode 100644 infra/schema/src/test/resources/common/json/no-ns/resource-opendj.json create mode 100644 infra/schema/src/test/resources/common/json/ns/resource-opendj-simple.json create mode 100644 infra/schema/src/test/resources/common/json/ns/resource-opendj.json create mode 100644 infra/schema/src/test/resources/common/yaml/no-ns/resource-opendj-simple.yaml create mode 100644 infra/schema/src/test/resources/common/yaml/no-ns/resource-opendj.yaml create mode 100644 infra/schema/src/test/resources/common/yaml/ns/resource-opendj-simple.yaml create mode 100644 infra/schema/src/test/resources/common/yaml/ns/resource-opendj.yaml diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismBeanConverter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismBeanConverter.java index 632b392c945..ea6bde548af 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismBeanConverter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismBeanConverter.java @@ -393,7 +393,7 @@ public T unmarshall(MapXNode xnode, Class beanClass, ParsingContext pc) t } //check for subclasses??? - if (!storeAsRawType && xsubnode.getTypeQName() != null) { + if (!storeAsRawType && xsubnode != null && xsubnode.getTypeQName() != null) { Class explicitParamType = getSchemaRegistry().determineCompileTimeClass(xsubnode.getTypeQName()); if (explicitParamType == null){ explicitParamType = XsdTypeMapper.toJavaTypeIfKnown(xsubnode.getTypeQName()); @@ -650,7 +650,9 @@ private Object prepareValueToBeStored(Object propVal, boolean wrapInJaxbElem private Object convertSinglePropValue(XNode xsubnode, String fieldName, Class paramType, boolean storeAsRawType, Class classType, String schemaNamespace, ParsingContext pc) throws SchemaException { Object propValue; - if (paramType.equals(XNode.class)) { + if (xsubnode == null) { + return null; + } else if (paramType.equals(XNode.class)) { propValue = xsubnode; } else if (storeAsRawType || paramType.equals(RawType.class)) { propValue = new RawType(xsubnode, prismContext); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/AbstractJsonParser.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/AbstractJsonParser.java index 21ea290ebb4..bf2f7ea2f16 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/AbstractJsonParser.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/AbstractJsonParser.java @@ -202,7 +202,7 @@ private void processSchemaNodes(XNode xnode) throws SchemaException, IOException } } - @Nullable // TODO: ok? + @NotNull private XNode parseValue(JsonParsingContext ctx) throws IOException, SchemaException { Validate.notNull(ctx.parser.currentToken()); @@ -218,7 +218,7 @@ private XNode parseValue(JsonParsingContext ctx) throws IOException, SchemaExcep case VALUE_NUMBER_INT: return parseToPrimitive(ctx); case VALUE_NULL: - return null; // TODO... + return parseToEmptyPrimitive(); default: throw new SchemaException("Unexpected current token: " + ctx.parser.currentToken()); } @@ -371,6 +371,12 @@ private PrimitiveXNode parseToPrimitive(JsonParsingContext ctx) throws IO return primitive; } + private PrimitiveXNode parseToEmptyPrimitive() throws IOException, SchemaException { + PrimitiveXNode primitive = new PrimitiveXNode(); + primitive.setValueParser(new JsonNullValueParser()); + return primitive; + } + // TODO remove if not needed private QName getCurrentTypeName(JsonParsingContext ctx) throws IOException, SchemaException { switch (ctx.parser.currentToken()) { @@ -489,6 +495,9 @@ private void serializeFromMap(MapXNode map, JsonSerializationContext ctx) throws String oldDefaultNamespace = ctx.currentNamespace; generateNsDeclarationIfNeeded(map, ctx); for (Entry entry : map.entrySet()) { + if (entry.getValue() == null) { + continue; + } ctx.generator.writeFieldName(createKeyUri(entry, ctx)); serialize(entry.getValue(), ctx); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/JsonNullValueParser.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/JsonNullValueParser.java new file mode 100644 index 00000000000..cabbcd49853 --- /dev/null +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/JsonNullValueParser.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.prism.parser.json; + +import com.evolveum.midpoint.prism.marshaller.XNodeProcessorEvaluationMode; +import com.evolveum.midpoint.prism.util.JavaTypeConverter; +import com.evolveum.midpoint.prism.xml.XsdTypeMapper; +import com.evolveum.midpoint.prism.xnode.ValueParser; +import com.evolveum.midpoint.util.exception.SchemaException; +import org.w3c.dom.Element; + +import javax.xml.namespace.QName; +import java.io.IOException; +import java.util.Map; + +public class JsonNullValueParser implements ValueParser { + + public JsonNullValueParser() { + } + + @Override + public T parse(QName typeName, XNodeProcessorEvaluationMode mode) throws SchemaException { + Class clazz = XsdTypeMapper.toJavaType(typeName); + if (clazz == null) { + throw new SchemaException("Unsupported type " + typeName); + } + return (T) JavaTypeConverter.convert(clazz, ""); + } + + @Override + public boolean isEmpty() { + return true; + } + + @Override + public String getStringValue() { + return ""; + } + + @Override + public String toString() { + return "JsonNullValueParser"; + } + + @Override + public Map getPotentiallyRelevantNamespaces() { + return null; // TODO implement + } + + Element asDomElement() throws IOException { + return null; + } +} diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/PrismAsserts.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/PrismAsserts.java index 0139542f0ca..d9902026418 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/PrismAsserts.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/PrismAsserts.java @@ -1029,8 +1029,10 @@ public static void assertPathEqualsExceptForPrefixes(String message, ItemPath ex ItemPathSegment expectedSegment = expected.getSegments().get(i); ItemPathSegment actualSegment = actual.getSegments().get(i); if (expectedSegment instanceof NameItemPathSegment) { - assertEquals(message + ": wrong path segment #" + (i+1), ((NameItemPathSegment) expectedSegment).getName(), - ((NameItemPathSegment) actualSegment).getName()); + QName qnameExpected = ((NameItemPathSegment) expectedSegment).getName(); + QName qnameActual = ((NameItemPathSegment) actualSegment).getName(); + assertEquals(message + ": wrong NS in path segment #" + (i+1), qnameExpected.getNamespaceURI(), qnameActual.getNamespaceURI()); + assertEquals(message + ": wrong local part in path segment #" + (i+1), qnameExpected.getLocalPart(), qnameActual.getLocalPart()); } else { assertEquals(message + ": wrong path segment #" + (i+1), expectedSegment, actualSegment); } diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestConstants.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestConstants.java index 322a541ea79..992bea3a1aa 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestConstants.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestConstants.java @@ -50,7 +50,7 @@ public class TestConstants { public static final String RESOURCE_FILE_BASENAME = "resource-opendj"; public static final String RESOURCE_FILE_SIMPLE_BASENAME = "resource-opendj-simple"; - public static final File RESOURCE_FILE = new File(TestConstants.COMMON_DIR, "resource-opendj.xml"); + public static final File RESOURCE_FILE = new File(TestConstants.COMMON_DIR, "xml/ns/resource-opendj.xml"); public static final String RESOURCE_OID = "ef2bc95b-76e0-59e2-86d6-3d4f02d3ffff"; public static final String RESOURCE_NAMESPACE = "http://midpoint.evolveum.com/xml/ns/public/resource/instance/ef2bc95b-76e0-59e2-86d6-3d4f02d3ffff"; diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestJaxbConstruction.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestJaxbConstruction.java index 215a7e1f265..34f924ed021 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestJaxbConstruction.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestJaxbConstruction.java @@ -530,7 +530,8 @@ private void checkExtension(ExtensionType extension, String sourceDescription) t private MapXNode createFilter(){ MapXNode filter = new MapXNode(); - MapXNode equalsElement = (MapXNode) filter.put(new QName(SchemaConstantsGenerated.NS_QUERY, "equal"), new MapXNode()); + MapXNode equalsElement = new MapXNode(); + filter.put(new QName(SchemaConstantsGenerated.NS_QUERY, "equal"), equalsElement); PrimitiveXNode pathElement = new PrimitiveXNode<>(new ItemPathType(new ItemPath(new QName("name")))); equalsElement.put(new QName(SchemaConstantsGenerated.NS_QUERY, "path"), pathElement); diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseUserJson.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseUserJson.java deleted file mode 100644 index 2a9edc2e6cb..00000000000 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseUserJson.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.evolveum.midpoint.schema; - -import java.io.File; - -import org.testng.annotations.Test; - -import com.evolveum.midpoint.prism.PrismContext; - -public class TestParseUserJson extends TestParseUser { - - @Override - protected String getSubdirName() { - return "json/ns"; - } - - @Override - protected String getLanguage() { - return PrismContext.LANG_JSON; - } - - @Override - protected String getFilenameSuffix() { - return "json"; - } - - @Override - protected boolean hasNamespaces() { - return true; - } -} diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseUserXml.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseUserXml.java deleted file mode 100644 index beaeca3ff3a..00000000000 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseUserXml.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.evolveum.midpoint.schema; - -import com.evolveum.midpoint.prism.PrismContext; - -public class TestParseUserXml extends TestParseUser { - - @Override - protected String getSubdirName() { - return "xml/ns"; - } - - @Override - protected String getLanguage() { - return PrismContext.LANG_XML; - } - - @Override - protected String getFilenameSuffix() { - return "xml"; - } - - @Override - protected boolean hasNamespaces() { - return true; - } -} diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseResource.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResource.java similarity index 98% rename from infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseResource.java rename to infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResource.java index a518d8b7981..e650acbbb06 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseResource.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResource.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2015 Evolveum + * Copyright (c) 2010-2016 Evolveum * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.evolveum.midpoint.schema; +package com.evolveum.midpoint.schema.parser.resource; import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.delta.ObjectDelta; @@ -30,6 +30,9 @@ import com.evolveum.midpoint.prism.util.PrismTestUtil; import com.evolveum.midpoint.prism.xnode.MapXNode; import com.evolveum.midpoint.prism.xnode.RootXNode; +import com.evolveum.midpoint.schema.MidPointPrismContextFactory; +import com.evolveum.midpoint.schema.SchemaConstantsGenerated; +import com.evolveum.midpoint.schema.TestConstants; import com.evolveum.midpoint.schema.constants.MidPointConstants; import com.evolveum.midpoint.schema.processor.ResourceSchema; import com.evolveum.midpoint.schema.util.ResourceTypeUtil; @@ -40,6 +43,7 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; import com.evolveum.prism.xml.ns._public.query_3.SearchFilterType; import com.evolveum.prism.xml.ns._public.types_3.*; +import org.testng.AssertJUnit; import org.testng.annotations.BeforeSuite; import org.testng.annotations.Test; import org.w3c.dom.Element; @@ -237,7 +241,7 @@ private void assertResourcePrism(PrismObject resource, boolean isS PrismContext prismContext = PrismTestUtil.getPrismContext(); - assertEquals("Wrong oid (prism)", TestConstants.RESOURCE_OID, resource.getOid()); + AssertJUnit.assertEquals("Wrong oid (prism)", TestConstants.RESOURCE_OID, resource.getOid()); // assertEquals("Wrong version", "42", resource.getVersion()); PrismObjectDefinition resourceDefinition = resource.getDefinition(); assertNotNull("No resource definition", resourceDefinition); diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceJson.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceJson.java new file mode 100644 index 00000000000..061443b93f0 --- /dev/null +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceJson.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.schema.parser.resource; + +import com.evolveum.midpoint.prism.PrismContext; + +public abstract class TestParseResourceJson extends TestParseResource { + + @Override + protected String getLanguage() { + return PrismContext.LANG_JSON; + } + + @Override + protected String getFilenameSuffix() { + return "json"; + } + +} diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceJsonNoNs.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceJsonNoNs.java new file mode 100644 index 00000000000..7574638fd44 --- /dev/null +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceJsonNoNs.java @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.schema.parser.resource; + +public class TestParseResourceJsonNoNs extends TestParseResourceJson { + + @Override + protected String getSubdirName() { + return "json/no-ns"; + } + + @Override + protected boolean hasNamespaces() { + return false; + } +} diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceJsonNs.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceJsonNs.java new file mode 100644 index 00000000000..ae7fbbf88f0 --- /dev/null +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceJsonNs.java @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.schema.parser.resource; + +public class TestParseResourceJsonNs extends TestParseResourceJson { + + @Override + protected String getSubdirName() { + return "json/ns"; + } + + @Override + protected boolean hasNamespaces() { + return true; + } +} diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseResourceXml.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceXml.java similarity index 96% rename from infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseResourceXml.java rename to infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceXml.java index 172ce69e3ff..4d2955fdd2d 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseResourceXml.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceXml.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.evolveum.midpoint.schema; +package com.evolveum.midpoint.schema.parser.resource; import com.evolveum.midpoint.prism.ParsingContext; import com.evolveum.midpoint.prism.PrismContext; @@ -22,6 +22,7 @@ import com.evolveum.midpoint.prism.parser.dom.DomParser; import com.evolveum.midpoint.prism.util.PrismTestUtil; import com.evolveum.midpoint.prism.xnode.XNode; +import com.evolveum.midpoint.schema.TestConstants; import com.evolveum.midpoint.util.DOMUtil; import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType; import org.testng.annotations.Test; diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseResourceXmlNoNs.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceXmlNoNs.java similarity index 59% rename from infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseResourceXmlNoNs.java rename to infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceXmlNoNs.java index d2afa0569c6..69584d07546 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseResourceXmlNoNs.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceXmlNoNs.java @@ -14,19 +14,7 @@ * limitations under the License. */ -package com.evolveum.midpoint.schema; - -import com.evolveum.midpoint.prism.ParsingContext; -import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.PrismObject; -import com.evolveum.midpoint.prism.parser.dom.DomParser; -import com.evolveum.midpoint.prism.util.PrismTestUtil; -import com.evolveum.midpoint.prism.xnode.XNode; -import com.evolveum.midpoint.util.DOMUtil; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType; -import org.testng.annotations.Test; -import org.w3c.dom.Document; -import org.w3c.dom.Element; +package com.evolveum.midpoint.schema.parser.resource; public class TestParseResourceXmlNoNs extends TestParseResourceXml { diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseResourceXmlNs.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceXmlNs.java similarity index 59% rename from infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseResourceXmlNs.java rename to infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceXmlNs.java index d4615574005..19b623670e6 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseResourceXmlNs.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceXmlNs.java @@ -14,19 +14,7 @@ * limitations under the License. */ -package com.evolveum.midpoint.schema; - -import com.evolveum.midpoint.prism.ParsingContext; -import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.PrismObject; -import com.evolveum.midpoint.prism.parser.dom.DomParser; -import com.evolveum.midpoint.prism.util.PrismTestUtil; -import com.evolveum.midpoint.prism.xnode.XNode; -import com.evolveum.midpoint.util.DOMUtil; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType; -import org.testng.annotations.Test; -import org.w3c.dom.Document; -import org.w3c.dom.Element; +package com.evolveum.midpoint.schema.parser.resource; public class TestParseResourceXmlNs extends TestParseResourceXml { diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceYaml.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceYaml.java new file mode 100644 index 00000000000..7ef01fd90b2 --- /dev/null +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceYaml.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.schema.parser.resource; + +import com.evolveum.midpoint.prism.PrismContext; + +public abstract class TestParseResourceYaml extends TestParseResource { + + @Override + protected String getLanguage() { + return PrismContext.LANG_YAML; + } + + @Override + protected String getFilenameSuffix() { + return "yaml"; + } + +} diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceYamlNoNs.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceYamlNoNs.java new file mode 100644 index 00000000000..211c52e0fcb --- /dev/null +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceYamlNoNs.java @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.schema.parser.resource; + +public class TestParseResourceYamlNoNs extends TestParseResourceYaml { + + @Override + protected String getSubdirName() { + return "yaml/no-ns"; + } + + @Override + protected boolean hasNamespaces() { + return false; + } +} diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceYamlNs.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceYamlNs.java new file mode 100644 index 00000000000..8ca303e125e --- /dev/null +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceYamlNs.java @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.schema.parser.resource; + +public class TestParseResourceYamlNs extends TestParseResourceYaml { + + @Override + protected String getSubdirName() { + return "yaml/ns"; + } + + @Override + protected boolean hasNamespaces() { + return true; + } +} diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseUser.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/user/TestParseUser.java similarity index 98% rename from infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseUser.java rename to infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/user/TestParseUser.java index 501975c8785..4044c7556e8 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseUser.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/user/TestParseUser.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2013 Evolveum + * Copyright (c) 2010-2016 Evolveum * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.evolveum.midpoint.schema; +package com.evolveum.midpoint.schema.parser.user; import static com.evolveum.midpoint.schema.TestConstants.*; import static org.testng.AssertJUnit.assertEquals; @@ -26,6 +26,8 @@ import javax.xml.namespace.QName; +import com.evolveum.midpoint.schema.MidPointPrismContextFactory; +import com.evolveum.midpoint.schema.SchemaConstantsGenerated; import org.testng.annotations.BeforeSuite; import org.testng.annotations.Test; import org.w3c.dom.Element; diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/user/TestParseUserJson.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/user/TestParseUserJson.java new file mode 100644 index 00000000000..36bc776c70b --- /dev/null +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/user/TestParseUserJson.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.schema.parser.user; + +import com.evolveum.midpoint.prism.PrismContext; + +public class TestParseUserJson extends TestParseUser { + + @Override + protected String getSubdirName() { + return "json/ns"; + } + + @Override + protected String getLanguage() { + return PrismContext.LANG_JSON; + } + + @Override + protected String getFilenameSuffix() { + return "json"; + } + + @Override + protected boolean hasNamespaces() { + return true; + } +} diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseUserJsonNoNs.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/user/TestParseUserJsonNoNs.java similarity index 95% rename from infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseUserJsonNoNs.java rename to infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/user/TestParseUserJsonNoNs.java index ff935b902ad..98d05cdc1b0 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseUserJsonNoNs.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/user/TestParseUserJsonNoNs.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.evolveum.midpoint.schema; +package com.evolveum.midpoint.schema.parser.user; import com.evolveum.midpoint.prism.PrismContext; diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/user/TestParseUserXml.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/user/TestParseUserXml.java new file mode 100644 index 00000000000..80e36b265bb --- /dev/null +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/user/TestParseUserXml.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.schema.parser.user; + +import com.evolveum.midpoint.prism.PrismContext; + +public class TestParseUserXml extends TestParseUser { + + @Override + protected String getSubdirName() { + return "xml/ns"; + } + + @Override + protected String getLanguage() { + return PrismContext.LANG_XML; + } + + @Override + protected String getFilenameSuffix() { + return "xml"; + } + + @Override + protected boolean hasNamespaces() { + return true; + } +} diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseUserXmlNoNs.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/user/TestParseUserXmlNoNs.java similarity index 95% rename from infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseUserXmlNoNs.java rename to infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/user/TestParseUserXmlNoNs.java index cb954f74dbe..6f1039c8689 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseUserXmlNoNs.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/user/TestParseUserXmlNoNs.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.evolveum.midpoint.schema; +package com.evolveum.midpoint.schema.parser.user; import com.evolveum.midpoint.prism.PrismContext; diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseUserYaml.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/user/TestParseUserYaml.java similarity index 95% rename from infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseUserYaml.java rename to infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/user/TestParseUserYaml.java index e651a8b60eb..cc5a61d268c 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseUserYaml.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/user/TestParseUserYaml.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.evolveum.midpoint.schema; +package com.evolveum.midpoint.schema.parser.user; import com.evolveum.midpoint.prism.PrismContext; diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseUserYamlNoNs.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/user/TestParseUserYamlNoNs.java similarity index 95% rename from infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseUserYamlNoNs.java rename to infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/user/TestParseUserYamlNoNs.java index e097278c884..c0b3b74d645 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseUserYamlNoNs.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/user/TestParseUserYamlNoNs.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.evolveum.midpoint.schema; +package com.evolveum.midpoint.schema.parser.user; import com.evolveum.midpoint.prism.PrismContext; diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/processor/TestResourceSchema.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/processor/TestResourceSchema.java index 049331fdc50..8c79d075dd9 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/processor/TestResourceSchema.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/processor/TestResourceSchema.java @@ -362,7 +362,7 @@ private void assertPrefix(String expectedPrefix, Element element) { public void testParseResource() throws Exception { System.out.println("===[ testParseResource ]==="); // WHEN - PrismObject resource = PrismTestUtil.parseObject(new File("src/test/resources/common/resource-opendj.xml")); + PrismObject resource = PrismTestUtil.parseObject(new File("src/test/resources/common/xml/ns/resource-opendj.xml")); // THEN assertCapabilities(resource.asObjectable()); @@ -372,7 +372,7 @@ public void testParseResource() throws Exception { public void testUnmarshallResource() throws Exception { System.out.println("===[ testUnmarshallResource ]==="); // WHEN - ResourceType resourceType = (ResourceType) PrismTestUtil.parseObject(new File("src/test/resources/common/resource-opendj.xml")).asObjectable(); + ResourceType resourceType = (ResourceType) PrismTestUtil.parseObject(new File("src/test/resources/common/xml/ns/resource-opendj.xml")).asObjectable(); // THEN assertCapabilities(resourceType); diff --git a/infra/schema/src/test/resources/common/json/no-ns/resource-opendj-simple.json b/infra/schema/src/test/resources/common/json/no-ns/resource-opendj-simple.json new file mode 100644 index 00000000000..b8be1d217a3 --- /dev/null +++ b/infra/schema/src/test/resources/common/json/no-ns/resource-opendj-simple.json @@ -0,0 +1,34 @@ +{ + "resource": { + "oid": "ef2bc95b-76e0-59e2-86d6-3d4f02d3ffff", + "name": { + "orig": "Embedded Test OpenDJ", + "norm": "embedded test opendj" + }, + "connectorRef": { + "type": "ConnectorType", + "filter": { + "description": "...a filter description...", + "equal": { + "path": "extension/extConnType", + "value": "org.identityconnectors.ldap.LdapConnector" + } + }, + "resolutionTime": "run" + }, + "connectorConfiguration": { + "configurationProperties": { + "port": "10389", + "host": "localhost", + "baseContexts": "dc=example,dc=com", + "principal": "cn=directory manager", + "credentials": { + "@ns": "http://prism.evolveum.com/xml/ns/public/types-3", + "clearValue": "secret" + }, + "vlvSortAttribute": "uid", + "accountOperationalAttributes": "ds-pwp-account-disabled" + } + } + } +} diff --git a/infra/schema/src/test/resources/common/json/no-ns/resource-opendj.json b/infra/schema/src/test/resources/common/json/no-ns/resource-opendj.json new file mode 100644 index 00000000000..0bc0dc42a82 --- /dev/null +++ b/infra/schema/src/test/resources/common/json/no-ns/resource-opendj.json @@ -0,0 +1,324 @@ +{ + "resource" : { + "oid" : "ef2bc95b-76e0-59e2-86d6-3d4f02d3ffff", + "name" : "Embedded Test OpenDJ", + "fetchResult" : { + "operation" : "com.evolveum.midpoint.provisioning.api.ProvisioningService.getObject", + "status" : "success", + "params" : { + "entry" : [ { + "unknownJavaObject" : { + "class" : "my.class", + "toString" : "my.value" + }, + "key" : "a-key" + } ] + } + }, + "connectorRef" : { + "type" : "ConnectorType", + "description" : "Reference to the ICF LDAP connector.", + "filter" : { + "description" : "...a filter description...", + "equal" : { + "path" : "extension/extConnType", + "value" : "org.identityconnectors.ldap.LdapConnector" + } + }, + "resolutionTime" : "import" + }, + "connectorConfiguration" : { + "configurationProperties" : { + "port" : "10389", + "host" : "localhost", + "baseContexts" : "dc=example,dc=com", + "principal" : "cn=directory manager", + "credentials" : { + "@ns" : "http://prism.evolveum.com/xml/ns/public/types-3", + "clearValue" : "secret" + }, + "vlvSortAttribute" : "uid", + "accountOperationalAttributes" : "ds-pwp-account-disabled" + }, + "connectorPoolConfiguration" : { + "minEvictableIdleTimeMillis" : 120000, + "minIdle" : 1, + "maxIdle" : 10, + "maxObjects" : 10, + "maxWait" : 150000 + }, + "producerBufferSize" : 100, + "timeouts" : { + "create" : -1, + "get" : -1, + "update" : -1, + "delete" : -1, + "test" : -1, + "scriptOnConnector" : -1, + "scriptOnResource" : -1, + "authentication" : -1, + "search" : -1, + "validate" : -1, + "sync" : -1, + "schema" : -1 + } + }, + "namespace" : "http://midpoint.evolveum.com/xml/ns/public/resource/instance/ef2bc95b-76e0-59e2-86d6-3d4f02d3ffff", + "schema" : { + "definition" : { + "@ns" : "http://www.w3.org/2001/XMLSchema", + "schema" : "\n\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t icfs:uid\n\t\t\t icfs:name\n\t\t\t icfs:name\n\t\t\t __GROUP__\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t \n\t\t\t icfs:uid\n\t\t\t icfs:name\n\t\t\t icfs:name\n\t\t\t __ACCOUNT__\n\t\t\t \n\t\t\t \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t" + } + }, + "schemaHandling" : { + "objectType" : [ { + "intent" : "default", + "displayName" : "Default Account", + "default" : true, + "objectClass" : "AccountObjectClass", + "attribute" : [ { + "ref" : "name", + "displayName" : "Distinguished Name", + "limitations" : [ { + "access" : { + "read" : true, + "add" : true + } + } ], + "outbound" : { + "strength" : "weak", + "source" : [ { + "path" : "$user/name" + } ], + "expression" : { + "script" : [ { + "code" : "'uid=' +name+ ',ou=people,dc=example,dc=com'" + } ] + } + } + }, { + "ref" : "declare namespace icfs='http://midpoint.evolveum.com/xml/ns/public/connector/icf-1/resource-schema-3'; icfs:uid", + "displayName" : "Entry UUID", + "limitations" : [ { + "access" : { + "read" : true + } + } ] + }, { + "ref" : "cn", + "displayName" : "Common Name", + "limitations" : [ { + "access" : { + "read" : true, + "add" : true, + "modify" : true + } + } ], + "outbound" : { + "source" : [ { + "path" : "$user/fullName" + } ] + }, + "inbound" : [ { + "target" : { + "path" : "$user/fullName" + } + } ] + }, { + "ref" : "sn", + "displayName" : "Surname", + "limitations" : [ { + "access" : { + "read" : true, + "add" : true, + "modify" : true + } + } ], + "outbound" : { + "source" : [ { + "path" : "familyName" + } ] + }, + "inbound" : [ { + "target" : { + "path" : "familyName" + } + } ] + }, { + "ref" : "givenName", + "displayName" : "Given Name", + "limitations" : [ { + "access" : { + "read" : true, + "add" : true, + "modify" : true + } + } ], + "outbound" : { + "source" : [ { + "path" : "$user/givenName" + } ] + }, + "inbound" : [ { + "target" : { + "path" : "$user/givenName" + } + } ] + }, { + "ref" : "declare namespace ri='http://midpoint.evolveum.com/xml/ns/public/resource/instance/ef2bc95b-76e0-59e2-86d6-3d4f02d3ffff'; ri:uid", + "displayName" : "Login Name", + "matchingRule" : "stringIgnoreCase", + "outbound" : { + "strength" : "weak", + "source" : [ { + "description" : "Source may have description", + "path" : "$user/name" + } ] + }, + "inbound" : [ { + "target" : { + "description" : "Targets may have description", + "path" : "$user/name" + } + } ] + }, { + "ref" : "description", + "outbound" : { + "strength" : "weak", + "expression" : { + "description" : "Expression that assigns a fixed value", + "value" : [ "Created by IDM" ] + } + } + }, { + "ref" : "employeeType", + "displayName" : "Employee Type", + "tolerant" : false, + "outbound" : { + "source" : [ { + "path" : "$user/employeeType" + } ] + } + }, { + "ref" : "departmentNumber", + "displayName" : "Department Number", + "tolerant" : true, + "outbound" : { + "source" : [ { + "path" : "$user/extension/dept" + } ] + } + }, { + "ref" : "l", + "tolerant" : false, + "outbound" : { + "expression" : { + "variable" : [ { + "name" : "defaultLocation", + "value" : { + "@type" : "string", + "@value" : "middle of nowhere" + } + } ], + "script" : [ { + "description" : "XPath expression that is using a variable declared above", + "language" : "http://www.w3.org/TR/xpath/", + "returnType" : "scalar", + "code" : "$defaultLocation" + } ] + } + } + } ], + "protected" : [ { + "name" : "uid=idm,ou=Administrators,dc=example,dc=com" + } ], + "activation" : { + "administrativeStatus" : { + "outbound" : [ { } ], + "inbound" : [ { + "strength" : "weak", + "expression" : { + "asIs" : [ { } ] + } + } ] + } + }, + "credentials" : { + "password" : { + "outbound" : { + "expression" : { + "asIs" : null + } + }, + "inbound" : [ { + "strength" : "weak", + "expression" : { + "generate" : { } + } + } ] + } + } + } ] + }, + "capabilities" : { + "native" : { + "credentials" : [ { + "password" : null + } ], + "liveSync" : null, + "testConnection" : null + }, + "configured" : { + "activation" : [ { + "status" : { + "attribute" : "ds-pwp-account-disabled", + "enableValue" : "", + "disableValue" : "true" + } + } ], + "liveSync" : [ { + "enabled" : false + } ] + } + }, + "synchronization" : { + "objectSynchronization" : [ { + "enabled" : true, + "correlation" : [ { + "http://prism.evolveum.com/xml/ns/public/query-3#description" : "\n ...\n ", + "http://prism.evolveum.com/xml/ns/public/query-3#equal" : { + "http://prism.evolveum.com/xml/ns/public/query-3#path" : "name", + "expression" : { + "path" : "$account/attributes/yyy" + } + }, + "condition" : { + "value" : [ "true" ] + } + } ], + "reaction" : [ { + "situation" : "linked", + "synchronize" : true + }, { + "situation" : "deleted", + "action" : [ { + "handlerUri" : "unlinkAccount" + } ] + }, { + "situation" : "unlinked", + "action" : [ { + "ref" : "linkAccount" + } ] + }, { + "situation" : "unmatched", + "action" : [ { + "userTemplateRef" : { + "oid" : "c0c010c0-d34d-b33f-f00d-777111111111" + }, + "ref" : "addUser" + } ] + } ] + } ] + } + } +} diff --git a/infra/schema/src/test/resources/common/json/ns/resource-opendj-simple.json b/infra/schema/src/test/resources/common/json/ns/resource-opendj-simple.json new file mode 100644 index 00000000000..48e8311f3f5 --- /dev/null +++ b/infra/schema/src/test/resources/common/json/ns/resource-opendj-simple.json @@ -0,0 +1,39 @@ +{ + "@ns": "http://midpoint.evolveum.com/xml/ns/public/common/common-3", + "resource": { + "oid": "ef2bc95b-76e0-59e2-86d6-3d4f02d3ffff", + "name": { + "@ns": "http://prism.evolveum.com/xml/ns/public/types-3", + "orig": "Embedded Test OpenDJ", + "norm": "embedded test opendj" + }, + "connectorRef": { + "type": "http://midpoint.evolveum.com/xml/ns/public/common/common-3#ConnectorType", + "filter": { + "@ns": "http://prism.evolveum.com/xml/ns/public/query-3", + "description": "...a filter description...", + "equal": { + "path": "declare namespace x='http://x/'; extension/x:extConnType", + "value": "org.identityconnectors.ldap.LdapConnector" + } + }, + "resolutionTime": "run" + }, + "connectorConfiguration": { + "@ns": "http://midpoint.evolveum.com/xml/ns/public/connector/icf-1/connector-schema-3", + "configurationProperties": { + "@ns": "http://midpoint.evolveum.com/xml/ns/public/connector/icf-1/bundle/org.forgerock.openicf.connectors.ldap.ldap/org.identityconnectors.ldap.LdapConnector", + "port": "10389", + "host": "localhost", + "baseContexts": "dc=example,dc=com", + "principal": "cn=directory manager", + "credentials": { + "@ns": "http://prism.evolveum.com/xml/ns/public/types-3", + "clearValue": "secret" + }, + "vlvSortAttribute": "uid", + "accountOperationalAttributes": "ds-pwp-account-disabled" + } + } + } +} diff --git a/infra/schema/src/test/resources/common/json/ns/resource-opendj.json b/infra/schema/src/test/resources/common/json/ns/resource-opendj.json new file mode 100644 index 00000000000..76a54b7ac1d --- /dev/null +++ b/infra/schema/src/test/resources/common/json/ns/resource-opendj.json @@ -0,0 +1,331 @@ +{ + "@ns" : "http://midpoint.evolveum.com/xml/ns/public/common/common-3", + "resource" : { + "oid" : "ef2bc95b-76e0-59e2-86d6-3d4f02d3ffff", + "name" : "Embedded Test OpenDJ", + "fetchResult" : { + "operation" : "com.evolveum.midpoint.provisioning.api.ProvisioningService.getObject", + "status" : "success", + "params" : { + "entry" : [ { + "unknownJavaObject" : { + "class" : "my.class", + "toString" : "my.value" + }, + "key" : "a-key" + } ] + } + }, + "connectorRef" : { + "type" : "http://midpoint.evolveum.com/xml/ns/public/common/common-3#ConnectorType", + "description" : "Reference to the ICF LDAP connector.", + "filter" : { + "@ns" : "http://prism.evolveum.com/xml/ns/public/query-3", + "description" : "...a filter description...", + "equal" : { + "path" : "declare namespace x='http://x/'; extension/x:extConnType", + "value" : "org.identityconnectors.ldap.LdapConnector" + } + }, + "resolutionTime" : "import" + }, + "connectorConfiguration" : { + "@ns" : "http://midpoint.evolveum.com/xml/ns/public/connector/icf-1/connector-schema-3", + "configurationProperties" : { + "@ns" : "http://midpoint.evolveum.com/xml/ns/public/connector/icf-1/bundle/org.forgerock.openicf.connectors.ldap.ldap/org.identityconnectors.ldap.LdapConnector", + "port" : "10389", + "host" : "localhost", + "baseContexts" : "dc=example,dc=com", + "principal" : "cn=directory manager", + "credentials" : { + "@ns" : "http://prism.evolveum.com/xml/ns/public/types-3", + "clearValue" : "secret" + }, + "vlvSortAttribute" : "uid", + "accountOperationalAttributes" : "ds-pwp-account-disabled" + }, + "connectorPoolConfiguration" : { + "minEvictableIdleTimeMillis" : 120000, + "minIdle" : 1, + "maxIdle" : 10, + "maxObjects" : 10, + "maxWait" : 150000 + }, + "producerBufferSize" : 100, + "timeouts" : { + "create" : -1, + "get" : -1, + "update" : -1, + "delete" : -1, + "test" : -1, + "scriptOnConnector" : -1, + "scriptOnResource" : -1, + "authentication" : -1, + "search" : -1, + "validate" : -1, + "sync" : -1, + "schema" : -1 + } + }, + "namespace" : "http://midpoint.evolveum.com/xml/ns/public/resource/instance/ef2bc95b-76e0-59e2-86d6-3d4f02d3ffff", + "schema" : { + "definition" : { + "@ns" : "http://www.w3.org/2001/XMLSchema", + "schema" : "\n\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t icfs:uid\n\t\t\t icfs:name\n\t\t\t icfs:name\n\t\t\t __GROUP__\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t \n\t\t\t icfs:uid\n\t\t\t icfs:name\n\t\t\t icfs:name\n\t\t\t __ACCOUNT__\n\t\t\t \n\t\t\t \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t" + } + }, + "schemaHandling" : { + "objectType" : [ { + "intent" : "default", + "displayName" : "Default Account", + "default" : true, + "objectClass" : "http://midpoint.evolveum.com/xml/ns/public/resource/instance/ef2bc95b-76e0-59e2-86d6-3d4f02d3ffff#AccountObjectClass", + "attribute" : [ { + "ref" : "declare namespace icfs='http://midpoint.evolveum.com/xml/ns/public/connector/icf-1/resource-schema-3'; icfs:name", + "displayName" : "Distinguished Name", + "limitations" : [ { + "access" : { + "read" : true, + "add" : true + } + } ], + "outbound" : { + "strength" : "weak", + "source" : [ { + "path" : "$user/name" + } ], + "expression" : { + "script" : [ { + "code" : "'uid=' +name+ ',ou=people,dc=example,dc=com'" + } ] + } + } + }, { + "ref" : "declare namespace icfs='http://midpoint.evolveum.com/xml/ns/public/connector/icf-1/resource-schema-3'; icfs:uid", + "displayName" : "Entry UUID", + "limitations" : [ { + "access" : { + "read" : true + } + } ] + }, { + "ref" : "declare namespace ri='http://midpoint.evolveum.com/xml/ns/public/resource/instance/ef2bc95b-76e0-59e2-86d6-3d4f02d3ffff'; ri:cn", + "displayName" : "Common Name", + "limitations" : [ { + "access" : { + "read" : true, + "add" : true, + "modify" : true + } + } ], + "outbound" : { + "source" : [ { + "path" : "$user/fullName" + } ] + }, + "inbound" : [ { + "target" : { + "path" : "$user/fullName" + } + } ] + }, { + "ref" : "declare namespace ri='http://midpoint.evolveum.com/xml/ns/public/resource/instance/ef2bc95b-76e0-59e2-86d6-3d4f02d3ffff'; ri:sn", + "displayName" : "Surname", + "limitations" : [ { + "access" : { + "read" : true, + "add" : true, + "modify" : true + } + } ], + "outbound" : { + "source" : [ { + "path" : "familyName" + } ] + }, + "inbound" : [ { + "target" : { + "path" : "familyName" + } + } ] + }, { + "ref" : "declare namespace ri='http://midpoint.evolveum.com/xml/ns/public/resource/instance/ef2bc95b-76e0-59e2-86d6-3d4f02d3ffff'; ri:givenName", + "displayName" : "Given Name", + "limitations" : [ { + "access" : { + "read" : true, + "add" : true, + "modify" : true + } + } ], + "outbound" : { + "source" : [ { + "path" : "$user/givenName" + } ] + }, + "inbound" : [ { + "target" : { + "path" : "$user/givenName" + } + } ] + }, { + "ref" : "declare namespace ri='http://midpoint.evolveum.com/xml/ns/public/resource/instance/ef2bc95b-76e0-59e2-86d6-3d4f02d3ffff'; ri:uid", + "displayName" : "Login Name", + "matchingRule" : "http://midpoint.evolveum.com/xml/ns/public/common/matching-rule-3#stringIgnoreCase", + "outbound" : { + "strength" : "weak", + "source" : [ { + "description" : "Source may have description", + "path" : "$user/name" + } ] + }, + "inbound" : [ { + "target" : { + "description" : "Targets may have description", + "path" : "$user/name" + } + } ] + }, { + "ref" : "declare namespace ri='http://midpoint.evolveum.com/xml/ns/public/resource/instance/ef2bc95b-76e0-59e2-86d6-3d4f02d3ffff'; ri:description", + "outbound" : { + "strength" : "weak", + "expression" : { + "description" : "Expression that assigns a fixed value", + "value" : [ "Created by IDM" ] + } + } + }, { + "ref" : "declare namespace ri='http://midpoint.evolveum.com/xml/ns/public/resource/instance/ef2bc95b-76e0-59e2-86d6-3d4f02d3ffff'; ri:employeeType", + "displayName" : "Employee Type", + "tolerant" : false, + "outbound" : { + "source" : [ { + "path" : "$user/employeeType" + } ] + } + }, { + "ref" : "declare namespace ri='http://midpoint.evolveum.com/xml/ns/public/resource/instance/ef2bc95b-76e0-59e2-86d6-3d4f02d3ffff'; ri:departmentNumber", + "displayName" : "Department Number", + "tolerant" : true, + "outbound" : { + "source" : [ { + "path" : "declare namespace z='http://z/'; $user/extension/z:dept" + } ] + } + }, { + "ref" : "declare namespace ri='http://midpoint.evolveum.com/xml/ns/public/resource/instance/ef2bc95b-76e0-59e2-86d6-3d4f02d3ffff'; ri:l", + "tolerant" : false, + "outbound" : { + "expression" : { + "variable" : [ { + "name" : "http://whatever.com/my#defaultLocation", + "value" : { + "@type" : "http://www.w3.org/2001/XMLSchema#string", + "@value" : "middle of nowhere" + } + } ], + "script" : [ { + "description" : "XPath expression that is using a variable declared above", + "language" : "http://www.w3.org/TR/xpath/", + "returnType" : "scalar", + "code" : "\n\t\t\t\t\t\t\t\t\t$my:defaultLocation\n\t\t\t\t\t\t\t" + } ] + } + } + } ], + "protected" : [ { + "@ns" : "http://midpoint.evolveum.com/xml/ns/public/connector/icf-1/resource-schema-3", + "name" : "uid=idm,ou=Administrators,dc=example,dc=com" + } ], + "activation" : { + "administrativeStatus" : { + "outbound" : [ { } ], + "inbound" : [ { + "strength" : "weak", + "expression" : { + "asIs" : [ { } ] + } + } ] + } + }, + "credentials" : { + "password" : { + "outbound" : { + "expression" : { + "asIs" : null + } + }, + "inbound" : [ { + "strength" : "weak", + "expression" : { + "generate" : { } + } + } ] + } + } + } ] + }, + "capabilities" : { + "native" : { + "@ns" : "http://midpoint.evolveum.com/xml/ns/public/resource/capabilities-3", + "credentials" : [ { + "password" : null + } ], + "liveSync" : null, + "testConnection" : null + }, + "configured" : { + "@ns" : "http://midpoint.evolveum.com/xml/ns/public/resource/capabilities-3", + "activation" : [ { + "status" : { + "attribute" : "http://midpoint.evolveum.com/xml/ns/public/resource/instance/ef2bc95b-76e0-59e2-86d6-3d4f02d3ffff#ds-pwp-account-disabled", + "enableValue" : "", + "disableValue" : "true" + } + } ], + "liveSync" : [ { + "enabled" : false + } ] + } + }, + "synchronization" : { + "objectSynchronization" : [ { + "enabled" : true, + "correlation" : [ { + "http://prism.evolveum.com/xml/ns/public/query-3#description" : "\n ...\n ", + "http://prism.evolveum.com/xml/ns/public/query-3#equal" : { + "http://prism.evolveum.com/xml/ns/public/query-3#path" : "name", + "expression" : { + "path" : "declare namespace my='http://myself.me/schemas/whatever'; declare namespace c='http://midpoint.evolveum.com/xml/ns/public/common/common-3'; $account/c:attributes/my:yyy" + } + }, + "condition" : { + "value" : [ "true" ] + } + } ], + "reaction" : [ { + "situation" : "linked", + "synchronize" : true + }, { + "situation" : "deleted", + "action" : [ { + "handlerUri" : "http://midpoint.evolveum.com/xml/ns/public/model/action-3#unlinkAccount" + } ] + }, { + "situation" : "unlinked", + "action" : [ { + "ref" : "http://midpoint.evolveum.com/xml/ns/public/model/action-3#linkAccount" + } ] + }, { + "situation" : "unmatched", + "action" : [ { + "userTemplateRef" : { + "oid" : "c0c010c0-d34d-b33f-f00d-777111111111" + }, + "ref" : "http://midpoint.evolveum.com/xml/ns/public/model/action-3#addUser" + } ] + } ] + } ] + } + } +} diff --git a/infra/schema/src/test/resources/common/xml/ns/resource-opendj.xml b/infra/schema/src/test/resources/common/xml/ns/resource-opendj.xml index 957935b5a70..bfd42d829f0 100644 --- a/infra/schema/src/test/resources/common/xml/ns/resource-opendj.xml +++ b/infra/schema/src/test/resources/common/xml/ns/resource-opendj.xml @@ -80,8 +80,7 @@ dc=example,dc=com cn=directory manager - secret - + secret uid ds-pwp-account-disabled diff --git a/infra/schema/src/test/resources/common/yaml/no-ns/resource-opendj-simple.yaml b/infra/schema/src/test/resources/common/yaml/no-ns/resource-opendj-simple.yaml new file mode 100644 index 00000000000..8c8eadd92c5 --- /dev/null +++ b/infra/schema/src/test/resources/common/yaml/no-ns/resource-opendj-simple.yaml @@ -0,0 +1,25 @@ +--- +resource: + oid: "ef2bc95b-76e0-59e2-86d6-3d4f02d3ffff" + name: + orig: "Embedded Test OpenDJ" + norm: "embedded test opendj" + connectorRef: + type: "ConnectorType" + filter: + description: "...a filter description..." + equal: + path: "connectorType" + value: "org.identityconnectors.ldap.LdapConnector" + resolutionTime: run + connectorConfiguration: + configurationProperties: + port: "10389" + host: "localhost" + baseContexts: "dc=example,dc=com" + principal: "cn=directory manager" + credentials: + '@ns': "http://prism.evolveum.com/xml/ns/public/types-3" + clearValue: "secret" + vlvSortAttribute: "uid" + accountOperationalAttributes: "ds-pwp-account-disabled" diff --git a/infra/schema/src/test/resources/common/yaml/no-ns/resource-opendj.yaml b/infra/schema/src/test/resources/common/yaml/no-ns/resource-opendj.yaml new file mode 100644 index 00000000000..d00e010c279 --- /dev/null +++ b/infra/schema/src/test/resources/common/yaml/no-ns/resource-opendj.yaml @@ -0,0 +1,349 @@ +--- +resource: + oid: "ef2bc95b-76e0-59e2-86d6-3d4f02d3ffff" + name: "Embedded Test OpenDJ" + fetchResult: + operation: "com.evolveum.midpoint.provisioning.api.ProvisioningService.getObject" + status: "success" + params: + entry: + - unknownJavaObject: + class: "my.class" + toString: "my.value" + key: "a-key" + connectorRef: + type: "ConnectorType" + description: "Reference to the ICF LDAP connector." + filter: + description: "...a filter description..." + equal: + path: "extension/extConnType" + value: "org.identityconnectors.ldap.LdapConnector" + resolutionTime: "import" + connectorConfiguration: + configurationProperties: + port: "10389" + host: "localhost" + baseContexts: "dc=example,dc=com" + principal: "cn=directory manager" + credentials: + clearValue: "secret" + vlvSortAttribute: "uid" + accountOperationalAttributes: "ds-pwp-account-disabled" + connectorPoolConfiguration: + minEvictableIdleTimeMillis: 120000 + minIdle: 1 + maxIdle: 10 + maxObjects: 10 + maxWait: 150000 + producerBufferSize: 100 + timeouts: + create: -1 + get: -1 + update: -1 + delete: -1 + test: -1 + scriptOnConnector: -1 + scriptOnResource: -1 + authentication: -1 + search: -1 + validate: -1 + sync: -1 + schema: -1 + namespace: "http://midpoint.evolveum.com/xml/ns/public/resource/instance/ef2bc95b-76e0-59e2-86d6-3d4f02d3ffff" + schema: + definition: + '@ns': "http://www.w3.org/2001/XMLSchema" + schema: "\n\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\ + \t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\ + \t icfs:uid\n\t\t\t icfs:name\n\t\t\t icfs:name\n\t\t\t __GROUP__\n\t\t\t\t\t\t\t\n\t\t\t\t\t\ + \t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\ + \t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\ + \n\t\t\t\t\t\t\n\ + \t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t \n\t\t\ + \t icfs:uid\n\t\t\t icfs:name\n\t\t\t icfs:name\n\t\t\t __ACCOUNT__\n\t\t\t \n\t\t\t \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\ + \t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\ + \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\ + \t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\ + \t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\ + \t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\ + \t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\ + \t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\ + \t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\ + \t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\ + \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\ + \t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\ + \t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\ + \t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\ + \t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t" + schemaHandling: + objectType: + - intent: "default" + displayName: "Default Account" + default: true + objectClass: "AccountObjectClass" + attribute: + - ref: "name" + displayName: "Distinguished Name" + limitations: + - access: + read: true + add: true + outbound: + strength: "weak" + source: + - path: "$user/name" + expression: + script: + - code: "'uid=' +name+ ',ou=people,dc=example,dc=com'" + - ref: "declare namespace icfs='http://midpoint.evolveum.com/xml/ns/public/connector/icf-1/resource-schema-3'; icfs:uid" + displayName: "Entry UUID" + limitations: + - access: + read: true + - ref: "cn" + displayName: "Common Name" + limitations: + - access: + read: true + add: true + modify: true + outbound: + source: + - path: "$user/fullName" + inbound: + - target: + path: "$user/fullName" + - ref: "sn" + displayName: "Surname" + limitations: + - access: + read: true + add: true + modify: true + outbound: + source: + - path: "familyName" + inbound: + - target: + path: "familyName" + - ref: "givenName" + displayName: "Given Name" + limitations: + - access: + read: true + add: true + modify: true + outbound: + source: + - path: "$user/givenName" + inbound: + - target: + path: "$user/givenName" + - ref: "declare namespace ri='http://midpoint.evolveum.com/xml/ns/public/resource/instance/ef2bc95b-76e0-59e2-86d6-3d4f02d3ffff'; ri:uid" + displayName: "Login Name" + matchingRule: "stringIgnoreCase" + outbound: + strength: "weak" + source: + - description: "Source may have description" + path: "$user/name" + inbound: + - target: + description: "Targets may have description" + path: "$user/name" + - ref: "description" + outbound: + strength: "weak" + expression: + description: "Expression that assigns a fixed value" + value: + - "Created by IDM" + - ref: "employeeType" + displayName: "Employee Type" + tolerant: false + outbound: + source: + - path: "$user/employeeType" + - ref: "departmentNumber" + displayName: "Department Number" + tolerant: true + outbound: + source: + - path: "$user/extension/dept" + - ref: "l" + tolerant: false + outbound: + expression: + variable: + - name: "defaultLocation" + value: !string "middle of nowhere" + script: + - description: "XPath expression that is using a variable declared above" + language: "http://www.w3.org/TR/xpath/" + returnType: "scalar" + code: "$defaultLocation" + protected: + name: "uid=idm,ou=Administrators,dc=example,dc=com" + activation: + administrativeStatus: + outbound: + inbound: + - strength: "weak" + expression: + asIs: + credentials: + password: + outbound: + expression: + asIs: + inbound: + - strength: "weak" + expression: + generate: + capabilities: + native: + credentials: + password: + liveSync: + testConnection: + configured: + activation: + - status: + attribute: "ds-pwp-account-disabled" + enableValue: + - "" + disableValue: + - "true" + liveSync: + - enabled: false + synchronization: + objectSynchronization: + - enabled: true + correlation: + - http://prism.evolveum.com/xml/ns/public/query-3#description: "\n \ + \ ...\n " + http://prism.evolveum.com/xml/ns/public/query-3#equal: + http://prism.evolveum.com/xml/ns/public/query-3#path: "name" + expression: + path: | + $account/attributes/yyy + condition: + value: true + reaction: + - situation: "linked" + synchronize: true + - situation: "deleted" + action: + - handlerUri: "unlinkAccount" + - situation: "unlinked" + action: + - ref: "linkAccount" + - situation: "unmatched" + action: + - userTemplateRef: + oid: "c0c010c0-d34d-b33f-f00d-777111111111" + ref: "addUser" \ No newline at end of file diff --git a/infra/schema/src/test/resources/common/yaml/ns/resource-opendj-simple.yaml b/infra/schema/src/test/resources/common/yaml/ns/resource-opendj-simple.yaml new file mode 100644 index 00000000000..bf7c4c8f426 --- /dev/null +++ b/infra/schema/src/test/resources/common/yaml/ns/resource-opendj-simple.yaml @@ -0,0 +1,30 @@ +--- +'@ns': "http://midpoint.evolveum.com/xml/ns/public/common/common-3" +resource: + oid: "ef2bc95b-76e0-59e2-86d6-3d4f02d3ffff" + name: + '@ns': "http://prism.evolveum.com/xml/ns/public/types-3" + orig: "Embedded Test OpenDJ" + norm: "embedded test opendj" + connectorRef: + type: "ConnectorType" + filter: + '@ns': "http://prism.evolveum.com/xml/ns/public/query-3" + description: "...a filter description..." + equal: + path: "connectorType" + value: "org.identityconnectors.ldap.LdapConnector" + resolutionTime: run + connectorConfiguration: + '@ns': "http://midpoint.evolveum.com/xml/ns/public/connector/icf-1/connector-schema-3" + configurationProperties: + '@ns': "http://midpoint.evolveum.com/xml/ns/public/connector/icf-1/bundle/org.forgerock.openicf.connectors.ldap.ldap/org.identityconnectors.ldap.LdapConnector" + port: "10389" + host: "localhost" + baseContexts: "dc=example,dc=com" + principal: "cn=directory manager" + credentials: + '@ns': "http://prism.evolveum.com/xml/ns/public/types-3" + clearValue: "secret" + vlvSortAttribute: "uid" + accountOperationalAttributes: "ds-pwp-account-disabled" diff --git a/infra/schema/src/test/resources/common/yaml/ns/resource-opendj.yaml b/infra/schema/src/test/resources/common/yaml/ns/resource-opendj.yaml new file mode 100644 index 00000000000..271d39e5302 --- /dev/null +++ b/infra/schema/src/test/resources/common/yaml/ns/resource-opendj.yaml @@ -0,0 +1,360 @@ +--- +'@ns': "http://midpoint.evolveum.com/xml/ns/public/common/common-3" +resource: + oid: "ef2bc95b-76e0-59e2-86d6-3d4f02d3ffff" + name: "Embedded Test OpenDJ" + fetchResult: + operation: "com.evolveum.midpoint.provisioning.api.ProvisioningService.getObject" + status: "success" + params: + entry: + - unknownJavaObject: + class: "my.class" + toString: "my.value" + key: "a-key" + connectorRef: + type: "http://midpoint.evolveum.com/xml/ns/public/common/common-3#ConnectorType" + description: "Reference to the ICF LDAP connector." + filter: + '@ns': "http://prism.evolveum.com/xml/ns/public/query-3" + description: "...a filter description..." + equal: + path: "declare namespace x='http://x/'; extension/x:extConnType" + value: "org.identityconnectors.ldap.LdapConnector" + resolutionTime: "import" + connectorConfiguration: + '@ns': "http://midpoint.evolveum.com/xml/ns/public/connector/icf-1/connector-schema-3" + configurationProperties: + '@ns': "http://midpoint.evolveum.com/xml/ns/public/connector/icf-1/bundle/org.forgerock.openicf.connectors.ldap.ldap/org.identityconnectors.ldap.LdapConnector" + port: "10389" + host: "localhost" + baseContexts: "dc=example,dc=com" + principal: "cn=directory manager" + credentials: + '@ns': "http://prism.evolveum.com/xml/ns/public/types-3" + clearValue: "secret" + vlvSortAttribute: "uid" + accountOperationalAttributes: "ds-pwp-account-disabled" + connectorPoolConfiguration: + minEvictableIdleTimeMillis: 120000 + minIdle: 1 + maxIdle: 10 + maxObjects: 10 + maxWait: 150000 + producerBufferSize: 100 + timeouts: + create: -1 + get: -1 + update: -1 + delete: -1 + test: -1 + scriptOnConnector: -1 + scriptOnResource: -1 + authentication: -1 + search: -1 + validate: -1 + sync: -1 + schema: -1 + namespace: "http://midpoint.evolveum.com/xml/ns/public/resource/instance/ef2bc95b-76e0-59e2-86d6-3d4f02d3ffff" + schema: + definition: + '@ns': "http://www.w3.org/2001/XMLSchema" + schema: "\n\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\ + \t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\ + \t icfs:uid\n\t\t\t icfs:name\n\t\t\t icfs:name\n\t\t\t __GROUP__\n\t\t\t\t\t\t\t\n\t\t\t\t\t\ + \t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\ + \t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\ + \n\t\t\t\t\t\t\n\ + \t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t \n\t\t\ + \t icfs:uid\n\t\t\t icfs:name\n\t\t\t icfs:name\n\t\t\t __ACCOUNT__\n\t\t\t \n\t\t\t \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\ + \t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\ + \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\ + \t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\ + \t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\ + \t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\ + \t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\ + \t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\ + \t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\ + \t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\ + \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\ + \t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\ + \t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\ + \t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\ + \t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t" + schemaHandling: + objectType: + - intent: "default" + displayName: "Default Account" + default: true + objectClass: "http://midpoint.evolveum.com/xml/ns/public/resource/instance/ef2bc95b-76e0-59e2-86d6-3d4f02d3ffff#AccountObjectClass" + attribute: + - ref: "declare namespace icfs='http://midpoint.evolveum.com/xml/ns/public/connector/icf-1/resource-schema-3'; icfs:name" + displayName: "Distinguished Name" + limitations: + - access: + read: true + add: true + outbound: + strength: "weak" + source: + - path: "$user/name" + expression: + script: + - code: "'uid=' +name+ ',ou=people,dc=example,dc=com'" + - ref: "declare namespace icfs='http://midpoint.evolveum.com/xml/ns/public/connector/icf-1/resource-schema-3'; icfs:uid" + displayName: "Entry UUID" + limitations: + - access: + read: true + - ref: "declare namespace ri='http://midpoint.evolveum.com/xml/ns/public/resource/instance/ef2bc95b-76e0-59e2-86d6-3d4f02d3ffff'; ri:cn" + displayName: "Common Name" + limitations: + - access: + read: true + add: true + modify: true + outbound: + source: + - path: "$user/fullName" + inbound: + - target: + path: "$user/fullName" + - ref: "declare namespace ri='http://midpoint.evolveum.com/xml/ns/public/resource/instance/ef2bc95b-76e0-59e2-86d6-3d4f02d3ffff'; ri:sn" + displayName: "Surname" + limitations: + - access: + read: true + add: true + modify: true + outbound: + source: + - path: "familyName" + inbound: + - target: + path: "familyName" + - ref: "declare namespace ri='http://midpoint.evolveum.com/xml/ns/public/resource/instance/ef2bc95b-76e0-59e2-86d6-3d4f02d3ffff'; ri:givenName" + displayName: "Given Name" + limitations: + - access: + read: true + add: true + modify: true + outbound: + source: + - path: "$user/givenName" + inbound: + - target: + path: "$user/givenName" + - ref: "declare namespace ri='http://midpoint.evolveum.com/xml/ns/public/resource/instance/ef2bc95b-76e0-59e2-86d6-3d4f02d3ffff'; ri:uid" + displayName: "Login Name" + matchingRule: "http://midpoint.evolveum.com/xml/ns/public/common/matching-rule-3#stringIgnoreCase" + outbound: + strength: "weak" + source: + - description: "Source may have description" + path: "$user/name" + inbound: + - target: + description: "Targets may have description" + path: "$user/name" + - ref: "declare namespace ri='http://midpoint.evolveum.com/xml/ns/public/resource/instance/ef2bc95b-76e0-59e2-86d6-3d4f02d3ffff'; ri:description" + outbound: + strength: "weak" + expression: + description: "Expression that assigns a fixed value" + value: + - "Created by IDM" + - ref: "declare namespace ri='http://midpoint.evolveum.com/xml/ns/public/resource/instance/ef2bc95b-76e0-59e2-86d6-3d4f02d3ffff'; ri:employeeType" + displayName: "Employee Type" + tolerant: false + outbound: + source: + - path: "$user/employeeType" + - ref: "declare namespace ri='http://midpoint.evolveum.com/xml/ns/public/resource/instance/ef2bc95b-76e0-59e2-86d6-3d4f02d3ffff'; ri:departmentNumber" + displayName: "Department Number" + tolerant: true + outbound: + source: + - path: "declare namespace z='http://z/'; $user/extension/z:dept" + - ref: "declare namespace ri='http://midpoint.evolveum.com/xml/ns/public/resource/instance/ef2bc95b-76e0-59e2-86d6-3d4f02d3ffff'; ri:l" + tolerant: false + outbound: + expression: + variable: + - name: "http://whatever.com/my#defaultLocation" + value: ! "middle of nowhere" + script: + - description: "XPath expression that is using a variable declared above" + language: "http://www.w3.org/TR/xpath/" + returnType: "scalar" + code: "\n\t\t\t\t\t\t\t\t\t$my:defaultLocation\n\t\t\t\t\t\t\t" + protected: + - '@ns': "http://midpoint.evolveum.com/xml/ns/public/connector/icf-1/resource-schema-3" + name: "uid=idm,ou=Administrators,dc=example,dc=com" + activation: + administrativeStatus: + outbound: + inbound: + - strength: "weak" + expression: + asIs: + credentials: + password: + outbound: + expression: + asIs: + inbound: + - strength: "weak" + expression: + generate: + capabilities: + native: + '@ns': "http://midpoint.evolveum.com/xml/ns/public/resource/capabilities-3" + credentials: + password: + liveSync: + testConnection: + configured: + '@ns': "http://midpoint.evolveum.com/xml/ns/public/resource/capabilities-3" + activation: + - status: + attribute: "http://midpoint.evolveum.com/xml/ns/public/resource/instance/ef2bc95b-76e0-59e2-86d6-3d4f02d3ffff#ds-pwp-account-disabled" + enableValue: + - "" + disableValue: + - "true" + liveSync: + - enabled: false + synchronization: + objectSynchronization: + - enabled: true + correlation: + - http://prism.evolveum.com/xml/ns/public/query-3#description: "\n \ + \ ...\n " + http://prism.evolveum.com/xml/ns/public/query-3#equal: + http://prism.evolveum.com/xml/ns/public/query-3#path: "name" + expression: + path: | + declare namespace my='http://myself.me/schemas/whatever'; + declare namespace c='http://midpoint.evolveum.com/xml/ns/public/common/common-3'; + $account/c:attributes/my:yyy + condition: + value: + - "true" + reaction: + - situation: "linked" + synchronize: true + - situation: "deleted" + action: + - handlerUri: "http://midpoint.evolveum.com/xml/ns/public/model/action-3#unlinkAccount" + - situation: "unlinked" + action: + - ref: "http://midpoint.evolveum.com/xml/ns/public/model/action-3#linkAccount" + - situation: "unmatched" + action: + - userTemplateRef: + oid: "c0c010c0-d34d-b33f-f00d-777111111111" + ref: "http://midpoint.evolveum.com/xml/ns/public/model/action-3#addUser" \ No newline at end of file diff --git a/infra/schema/testng-unit.xml b/infra/schema/testng-unit.xml index e35b4f4a3b1..6c771b38000 100644 --- a/infra/schema/testng-unit.xml +++ b/infra/schema/testng-unit.xml @@ -20,9 +20,18 @@ - - - + + + + + + + + + + + + @@ -33,9 +42,7 @@ - - @@ -43,7 +50,6 @@ - From 26ed6ee3e91375c0e6dbbff2bdcaa1fba4d8c4bf Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Wed, 5 Oct 2016 12:39:16 +0200 Subject: [PATCH 17/74] Separated PrimContext from PrismContextImpl. Parsing functionality factored out from PrismContext into PrismParser. --- .../component/input/SearchFilterPanel.java | 2 +- .../midpoint/web/component/search/Search.java | 2 +- .../certification/dto/DefinitionScopeDto.java | 2 +- .../admin/configuration/PageBulkAction.java | 2 +- .../configuration/PageEvaluateMapping.java | 5 +- .../configuration/PageRepositoryQuery.java | 2 +- .../midpoint/web/util/ExpressionUtil.java | 2 +- .../midpoint/common/validator/Validator.java | 2 +- .../midpoint/prism/maven/SchemaDocMojo.java | 3 +- .../midpoint/prism/ParserElementSource.java | 54 ++ .../midpoint/prism/ParserFileSource.java | 53 ++ .../prism/ParserInputStreamSource.java | 45 + .../evolveum/midpoint/prism/ParserSource.java | 32 + .../midpoint/prism/ParserStringSource.java | 53 ++ .../midpoint/prism/ParsingContext.java | 25 +- .../evolveum/midpoint/prism/PrismContext.java | 772 +++------------- .../midpoint/prism/PrismContextImpl.java | 474 ++++++++++ .../evolveum/midpoint/prism/PrismParser.java | 81 ++ .../midpoint/prism/PrismParserImpl.java | 156 ++++ .../midpoint/prism/PrismParserImplIO.java | 81 ++ .../midpoint/prism/PrismParserImplNoIO.java | 155 ++++ .../midpoint/prism/PrismParserNoIO.java | 56 ++ .../midpoint/prism/PrismPropertyValue.java | 2 +- .../prism/json/AbstractParserDeprecated.java | 497 ----------- .../json/PrismJasonProcessorDeprecated.java | 837 ------------------ .../prism/marshaller/XNodeProcessor.java | 3 + .../midpoint/prism/parser/Parser.java | 15 +- .../midpoint/prism/parser/ParserHelpers.java | 36 + .../midpoint/prism/parser/ParserRegistry.java | 98 ++ .../midpoint/prism/parser/dom/DomParser.java | 112 ++- .../prism/parser/dom/DomSerializer.java | 2 +- .../prism/parser/json/AbstractJsonParser.java | 37 +- .../midpoint/prism/util/PrismTestUtil.java | 12 +- .../midpoint/prism/util/RawTypeUtil.java | 16 +- .../midpoint/prism/PrismInternalTestUtil.java | 2 +- .../midpoint/prism/TestExtraSchema.java | 2 +- .../midpoint/prism/TestPrismParsingXml.java | 4 +- .../midpoint/prism/TestUnknownItems.java | 4 +- .../prism/parser/AbstractParserTest.java | 18 +- .../schema/MidPointPrismContextFactory.java | 5 +- .../midpoint/schema/TestJaxbParsing.java | 6 +- .../midpoint/schema/TestJsonParsing.java | 297 ------- .../midpoint/schema/TestParseFilter.java | 4 +- .../schema/TestParseGenericObject.java | 4 +- .../midpoint/schema/TestParseLookupTable.java | 2 +- .../schema/TestParseModelContext.java | 3 +- .../schema/TestParsePasswordPolicy.java | 2 +- .../midpoint/schema/TestParseTask.java | 4 +- .../schema/TestParseTaskBulkAction.java | 2 +- .../parser/resource/TestParseResource.java | 14 +- .../parser/resource/TestParseResourceXml.java | 2 +- .../evolveum/midpoint/util/QNameUtilTest.java | 2 +- .../midpoint/model/impl/ModelWebService.java | 2 +- .../model/impl/ModelWebServiceRaw.java | 2 +- .../model/impl/rest/MidpointXmlProvider.java | 4 +- .../model/impl/lens/TestClockwork.java | 4 +- .../intest/scripting/TestScriptingBasic.java | 48 +- .../midpoint/report/impl/ReportFunctions.java | 2 +- .../report/impl/ReportServiceImpl.java | 3 +- .../report/impl/ReportWebServiceRaw.java | 2 +- .../midpoint/wf/impl/util/MiscDataUtil.java | 16 +- ...gleItemSerializationSafeContainerImpl.java | 2 +- .../general/TestGeneralChangeProcessor.java | 2 +- .../midpoint/repo/sql/AddGetObjectTest.java | 14 +- .../midpoint/repo/sql/AddOverwriteTest.java | 4 +- .../midpoint/repo/sql/DeleteTest.java | 5 +- .../repo/sql/ListAccountShadowOwnerTest.java | 2 +- .../midpoint/repo/sql/OrgStructTest.java | 6 +- .../midpoint/repo/sql/PerformanceTest.java | 2 +- .../repo/sql/QueryInterpreter2Test.java | 6 +- .../repo/sql/QueryInterpreterTest.java | 6 +- .../repo/sql/SearchShadowOwnerTest.java | 2 +- .../midpoint/repo/sql/SearchTest.java | 4 +- .../repo/sql/SqlAuditServiceImpl.java | 2 +- .../sql/data/audit/RObjectDeltaOperation.java | 4 +- .../container/RAccessCertificationCase.java | 3 +- .../repo/sql/helpers/ObjectRetriever.java | 2 +- .../midpoint/task/quartzimpl/CleanupTest.java | 8 +- 78 files changed, 1716 insertions(+), 2544 deletions(-) create mode 100644 infra/prism/src/main/java/com/evolveum/midpoint/prism/ParserElementSource.java create mode 100644 infra/prism/src/main/java/com/evolveum/midpoint/prism/ParserFileSource.java create mode 100644 infra/prism/src/main/java/com/evolveum/midpoint/prism/ParserInputStreamSource.java create mode 100644 infra/prism/src/main/java/com/evolveum/midpoint/prism/ParserSource.java create mode 100644 infra/prism/src/main/java/com/evolveum/midpoint/prism/ParserStringSource.java create mode 100644 infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContextImpl.java create mode 100644 infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParser.java create mode 100644 infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserImpl.java create mode 100644 infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserImplIO.java create mode 100644 infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserImplNoIO.java create mode 100644 infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserNoIO.java delete mode 100644 infra/prism/src/main/java/com/evolveum/midpoint/prism/json/AbstractParserDeprecated.java delete mode 100644 infra/prism/src/main/java/com/evolveum/midpoint/prism/json/PrismJasonProcessorDeprecated.java create mode 100644 infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/ParserHelpers.java create mode 100644 infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/ParserRegistry.java delete mode 100644 infra/schema/src/test/java/com/evolveum/midpoint/schema/TestJsonParsing.java diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/input/SearchFilterPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/input/SearchFilterPanel.java index ca9754d4f84..b370973288f 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/input/SearchFilterPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/input/SearchFilterPanel.java @@ -127,7 +127,7 @@ private void updateFilterClause(PrismContext context) throws SchemaException { final String clauseString = clauseStringModel.getObject(); if (StringUtils.isNotEmpty(clauseString)) { LOGGER.trace("Filter Clause to serialize: {}", clauseString); - RootXNode filterClauseNode = (RootXNode) context.parseToXNode(clauseString, PrismContext.LANG_XML, null); + RootXNode filterClauseNode = (RootXNode) context.parserFor(clauseString).xml().parseToXNode(); getModelObject().setFilterClauseXNode(filterClauseNode); } else { if (getModelObject() != null) { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/Search.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/Search.java index edb7adb36ba..dbaae7d34a7 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/Search.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/Search.java @@ -268,7 +268,7 @@ private ObjectFilter createAdvancedObjectFilter(PrismContext ctx) throws SchemaE return null; } - SearchFilterType search = ctx.parseAtomicValue(advancedQuery, SearchFilterType.COMPLEX_TYPE); + SearchFilterType search = ctx.parserFor(advancedQuery).parseAtomicValue(SearchFilterType.COMPLEX_TYPE); return QueryConvertor.parseFilter(search, type, ctx); } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/certification/dto/DefinitionScopeDto.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/certification/dto/DefinitionScopeDto.java index 85fb2aa8125..cc87e271035 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/certification/dto/DefinitionScopeDto.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/certification/dto/DefinitionScopeDto.java @@ -60,7 +60,7 @@ public SearchFilterType getParsedSearchFilter(PrismContext context) { SearchFilterType rv = new SearchFilterType(); RootXNode filterClauseNode; try { - filterClauseNode = (RootXNode) context.parseToXNode(searchFilterText, PrismContext.LANG_XML, null); + filterClauseNode = (RootXNode) context.parserFor(searchFilterText).xml().parseToXNode(); } catch (SchemaException e) { throw new SystemException("Cannot parse search filter " + searchFilterText + ": " + e.getMessage(), e); } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageBulkAction.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageBulkAction.java index 9ebf7c427c9..8dc59bf018d 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageBulkAction.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageBulkAction.java @@ -110,7 +110,7 @@ private void startPerformed(AjaxRequestTarget target) { ScriptingExpressionType expression = null; try { - Object parsed = getPrismContext().parseAnyValue(bulkActionDto.getScript(), PrismContext.LANG_XML); + Object parsed = getPrismContext().parserFor(bulkActionDto.getScript()).xml().parseAnyValue(); if (parsed == null) { result.recordFatalError("No bulk action object was provided."); } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageEvaluateMapping.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageEvaluateMapping.java index 73cce6d12c9..dbfb9aff93d 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageEvaluateMapping.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageEvaluateMapping.java @@ -183,14 +183,13 @@ private void executeMappingPerformed(AjaxRequestTarget target) { try { MappingEvaluationRequestType request; if (StringUtils.isNotBlank(dto.getRequest())) { - request = getPrismContext().parseAtomicValue(dto.getRequest(), MappingEvaluationRequestType.COMPLEX_TYPE, PrismContext.LANG_XML); + request = getPrismContext().parserFor(dto.getRequest()).xml().parseAtomicValue(MappingEvaluationRequestType.COMPLEX_TYPE); } else { request = new MappingEvaluationRequestType(); } if (StringUtils.isNotBlank(dto.getMapping())) { - request.setMapping((MappingType) getPrismContext() - .parseAtomicValue(dto.getMapping(), MappingType.COMPLEX_TYPE, PrismContext.LANG_XML)); + request.setMapping((MappingType) getPrismContext().parserFor(dto.getMapping()).xml().parseAtomicValue(MappingType.COMPLEX_TYPE)); } MappingEvaluationResponseType response = getModelDiagnosticService().evaluateMapping(request, task, result); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageRepositoryQuery.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageRepositoryQuery.java index b993f1656ad..a785e7efef3 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageRepositoryQuery.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageRepositoryQuery.java @@ -507,7 +507,7 @@ private void updateRequestWithMidpointQuery(RepositoryQueryDiagRequest request, if (clazz == null) { throw new SchemaException("Couldn't find compile-time class for object type of " + objectType); } - QueryType queryType = prismContext.parseAtomicValue(queryText, QueryType.COMPLEX_TYPE, PrismContext.LANG_XML); + QueryType queryType = prismContext.parserFor(queryText).xml().parseAtomicValue(QueryType.COMPLEX_TYPE); request.setType(clazz); ObjectQuery objectQuery = QueryJaxbConvertor.createObjectQuery(clazz, queryType, prismContext); ObjectQuery queryWithExprEvaluated = ExpressionUtil.evaluateQueryExpressions(objectQuery, new ExpressionVariables(), diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/util/ExpressionUtil.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/util/ExpressionUtil.java index abf8f36eac3..64fd46bb7d3 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/util/ExpressionUtil.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/util/ExpressionUtil.java @@ -246,7 +246,7 @@ public static void parseExpressionEvaluators(String xml, ExpressionType expressi if (xml != null && StringUtils.isNotBlank(xml)) { xml = WebXmlUtil.wrapInElement("expression", xml); LOGGER.info("Expression to serialize: {}", xml); - JAXBElement newElement = context.parseAnyValueAsJAXBElement(xml, PrismContext.LANG_XML); + JAXBElement newElement = context.parserFor(xml).xml().parseAnyValueAsJAXBElement(); expressionObject.getExpressionEvaluator().addAll(((ExpressionType) (newElement.getValue())).getExpressionEvaluator()); } } diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/validator/Validator.java b/infra/common/src/main/java/com/evolveum/midpoint/common/validator/Validator.java index 66a992d5914..e3e0bb170cc 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/validator/Validator.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/validator/Validator.java @@ -359,7 +359,7 @@ private EventResult validateObjectInternal(Element objectElement, OperationResul return EventResult.skipObject(); } - PrismObject object = prismContext.parseObject(objectElement); + PrismObject object = prismContext.parserFor(objectElement).parse(); try { object.checkConsistence(); diff --git a/infra/prism-maven-plugin/src/main/java/com/evolveum/midpoint/prism/maven/SchemaDocMojo.java b/infra/prism-maven-plugin/src/main/java/com/evolveum/midpoint/prism/maven/SchemaDocMojo.java index 507b88f6f97..bd306bbfc81 100644 --- a/infra/prism-maven-plugin/src/main/java/com/evolveum/midpoint/prism/maven/SchemaDocMojo.java +++ b/infra/prism-maven-plugin/src/main/java/com/evolveum/midpoint/prism/maven/SchemaDocMojo.java @@ -18,6 +18,7 @@ import com.evolveum.midpoint.prism.ComplexTypeDefinition; import com.evolveum.midpoint.prism.PrismContext; +import com.evolveum.midpoint.prism.PrismContextImpl; import com.evolveum.midpoint.prism.PrismObjectDefinition; import com.evolveum.midpoint.prism.schema.PrismSchema; import com.evolveum.midpoint.prism.schema.SchemaDefinitionFactory; @@ -261,7 +262,7 @@ private PrismContext createInitializedPrismContext() throws MojoFailureException schemaRegistry.setCatalogFiles(catalogFiles); } - PrismContext context = PrismContext.create(schemaRegistry); + PrismContextImpl context = PrismContextImpl.create(schemaRegistry); context.setDefinitionFactory(new SchemaDefinitionFactory()); context.initialize(); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/ParserElementSource.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/ParserElementSource.java new file mode 100644 index 00000000000..814744a69f3 --- /dev/null +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/ParserElementSource.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.prism; + +import org.w3c.dom.Element; + +import java.io.IOException; +import java.io.InputStream; + +/** + * @author mederly + */ +@Deprecated +public class ParserElementSource implements ParserSource { + + private final Element element; + + public ParserElementSource(Element element) { + this.element = element; + } + + public Element getElement() { + return element; + } + + @Override + public InputStream getInputStream() throws IOException { + throw new UnsupportedOperationException(); + } + + @Override + public boolean closeAfterParsing() { + return true; + } + + @Override + public boolean isIO() { + return false; + } +} diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/ParserFileSource.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/ParserFileSource.java new file mode 100644 index 00000000000..04ff1c7cdd8 --- /dev/null +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/ParserFileSource.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.prism; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.InputStream; + +/** + * @author mederly + */ +public class ParserFileSource implements ParserSource { + + private final File file; + + public ParserFileSource(File file) { + this.file = file; + } + + public File getFile() { + return file; + } + + @Override + public InputStream getInputStream() throws FileNotFoundException { + return new FileInputStream(file); + } + + @Override + public boolean closeAfterParsing() { + return true; + } + + @Override + public boolean isIO() { + return true; + } +} diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/ParserInputStreamSource.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/ParserInputStreamSource.java new file mode 100644 index 00000000000..6e16345becf --- /dev/null +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/ParserInputStreamSource.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.prism; + +import java.io.InputStream; + +/** + * @author mederly + */ +public class ParserInputStreamSource implements ParserSource { + + private final InputStream inputStream; + + public ParserInputStreamSource(InputStream inputStream) { + this.inputStream = inputStream; + } + + public InputStream getInputStream() { + return inputStream; + } + + @Override + public boolean closeAfterParsing() { + return false; // TODO eventually make configurable + } + + @Override + public boolean isIO() { + return true; + } +} diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/ParserSource.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/ParserSource.java new file mode 100644 index 00000000000..5583fe2e180 --- /dev/null +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/ParserSource.java @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.prism; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; + +/** + * @author mederly + */ +public interface ParserSource { + InputStream getInputStream() throws IOException; + + boolean closeAfterParsing(); + + boolean isIO(); +} diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/ParserStringSource.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/ParserStringSource.java new file mode 100644 index 00000000000..39f8b4ea65e --- /dev/null +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/ParserStringSource.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.prism; + +import org.apache.commons.io.IOUtils; + +import java.io.IOException; +import java.io.InputStream; + +/** + * @author mederly + */ +public class ParserStringSource implements ParserSource { + + private final String data; + + public ParserStringSource(String data) { + this.data = data; + } + + public String getData() { + return data; + } + + @Override + public InputStream getInputStream() throws IOException { + return IOUtils.toInputStream(data, "utf-8"); + } + + @Override + public boolean closeAfterParsing() { + return true; + } + + @Override + public boolean isIO() { + return false; + } +} diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/ParsingContext.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/ParsingContext.java index b7bf7854181..536686a9359 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/ParsingContext.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/ParsingContext.java @@ -26,7 +26,7 @@ /** * @author mederly */ -public class ParsingContext { +public class ParsingContext implements Cloneable { private XNodeProcessorEvaluationMode evaluationMode = XNodeProcessorEvaluationMode.STRICT; private boolean allowMissingRefTypes; @@ -100,4 +100,27 @@ public List getWarnings() { public boolean hasWarnings() { return !warnings.isEmpty(); } + + public ParsingContext clone() { + ParsingContext clone; + try { + clone = (ParsingContext) super.clone(); + } catch (CloneNotSupportedException e) { + throw new IllegalStateException(e); + } + clone.evaluationMode = evaluationMode; + clone.allowMissingRefTypes = allowMissingRefTypes; + clone.warnings.addAll(warnings); + return clone; + } + + public ParsingContext strict() { + this.setEvaluationMode(XNodeProcessorEvaluationMode.STRICT); + return this; + } + + public ParsingContext compat() { + this.setEvaluationMode(XNodeProcessorEvaluationMode.COMPAT); + return this; + } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java index 1eb6e044ba5..c1a5685b685 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java @@ -13,30 +13,23 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package com.evolveum.midpoint.prism; import com.evolveum.midpoint.prism.crypto.Protector; import com.evolveum.midpoint.prism.delta.ObjectDelta; -import com.evolveum.midpoint.prism.marshaller.*; -import com.evolveum.midpoint.prism.parser.*; +import com.evolveum.midpoint.prism.marshaller.JaxbDomHack; +import com.evolveum.midpoint.prism.marshaller.PrismBeanConverter; +import com.evolveum.midpoint.prism.marshaller.XNodeProcessor; import com.evolveum.midpoint.prism.parser.dom.DomParser; -import com.evolveum.midpoint.prism.parser.json.JsonParser; -import com.evolveum.midpoint.prism.parser.json.YamlParser; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.polystring.PolyStringNormalizer; -import com.evolveum.midpoint.prism.polystring.PrismDefaultPolyStringNormalizer; import com.evolveum.midpoint.prism.schema.SchemaDefinitionFactory; import com.evolveum.midpoint.prism.schema.SchemaRegistry; import com.evolveum.midpoint.prism.util.PrismMonitor; import com.evolveum.midpoint.prism.xnode.RootXNode; -import com.evolveum.midpoint.prism.xnode.XNode; -import com.evolveum.midpoint.util.DebugUtil; import com.evolveum.midpoint.util.exception.SchemaException; -import com.evolveum.midpoint.util.exception.SystemException; -import com.evolveum.midpoint.util.logging.Trace; -import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.prism.xml.ns._public.types_3.RawType; -import org.springframework.beans.factory.annotation.Autowired; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.xml.sax.SAXException; @@ -46,661 +39,112 @@ import java.io.File; import java.io.IOException; import java.io.InputStream; -import java.util.*; -import java.util.Map.Entry; /** - * @author semancik * + * @author semancik + * @author mederly */ -public class PrismContext { - - public static final String LANG_XML = "xml"; - public static final String LANG_JSON = "json"; - public static final String LANG_YAML = "yaml"; - - private static final Trace LOGGER = TraceManager.getTrace(PrismContext.class); - - private static boolean allowSchemalessSerialization = true; - - private SchemaRegistry schemaRegistry; - private XNodeProcessor xnodeProcessor; - private PrismBeanConverter beanConverter; - private SchemaDefinitionFactory definitionFactory; - private PolyStringNormalizer defaultPolyStringNormalizer; - private Map parserMap; - private PrismMonitor monitor = null; - - @Autowired - private Protector defaultProtector; - - // We need to keep this because of deprecated methods and various hacks - private DomParser parserDom; - private JaxbDomHack jaxbDomHack; - - //region Standard overhead - private PrismContext() { - // empty - } - - public static PrismContext create(SchemaRegistry schemaRegistry) { - PrismContext prismContext = new PrismContext(); - prismContext.schemaRegistry = schemaRegistry; - schemaRegistry.setPrismContext(prismContext); - - prismContext.xnodeProcessor = new XNodeProcessor(prismContext); - PrismBeanInspector inspector = new PrismBeanInspector(prismContext); - prismContext.beanConverter = new PrismBeanConverter(prismContext, inspector); - - prismContext.parserMap = new HashMap(); - DomParser parserDom = new DomParser(schemaRegistry); - prismContext.parserMap.put(LANG_XML, parserDom); - JsonParser parserJson = new JsonParser(); - prismContext.parserMap.put(LANG_JSON, parserJson); - YamlParser parserYaml = new YamlParser(); - prismContext.parserMap.put(LANG_YAML, parserYaml); - prismContext.parserDom = parserDom; - - prismContext.jaxbDomHack = new JaxbDomHack(parserDom, prismContext); - - return prismContext; - } - - public static PrismContext createEmptyContext(SchemaRegistry schemaRegistry){ - PrismContext prismContext = new PrismContext(); - prismContext.schemaRegistry = schemaRegistry; - schemaRegistry.setPrismContext(prismContext); - - return prismContext; - } - - public void initialize() throws SchemaException, SAXException, IOException { - schemaRegistry.initialize(); - if (defaultPolyStringNormalizer == null) { - defaultPolyStringNormalizer = new PrismDefaultPolyStringNormalizer(); - } - } - - public static boolean isAllowSchemalessSerialization() { - return allowSchemalessSerialization; - } - - public static void setAllowSchemalessSerialization(boolean allowSchemalessSerialization) { - PrismContext.allowSchemalessSerialization = allowSchemalessSerialization; - } - - public SchemaRegistry getSchemaRegistry() { - return schemaRegistry; - } - - public void setSchemaRegistry(SchemaRegistry schemaRegistry) { - this.schemaRegistry = schemaRegistry; - } - - public XNodeProcessor getXnodeProcessor() { - return xnodeProcessor; - } - - /** - * WARNING! This is not really public method. It should NOT not used outside the prism implementation. - */ - public DomParser getParserDom() { - return parserDom; - } - - public PrismBeanConverter getBeanConverter() { - return beanConverter; - } - - public JaxbDomHack getJaxbDomHack() { - return jaxbDomHack; - } - - public SchemaDefinitionFactory getDefinitionFactory() { - if (definitionFactory == null) { - definitionFactory = new SchemaDefinitionFactory(); - } - return definitionFactory; - } - - public void setDefinitionFactory(SchemaDefinitionFactory definitionFactory) { - this.definitionFactory = definitionFactory; - } - - public PolyStringNormalizer getDefaultPolyStringNormalizer() { - return defaultPolyStringNormalizer; - } - - public void setDefaultPolyStringNormalizer(PolyStringNormalizer defaultPolyStringNormalizer) { - this.defaultPolyStringNormalizer = defaultPolyStringNormalizer; - } - - private Parser getParser(String language) { - return parserMap.get(language); - } - - private Parser getParserNotNull(String language) { - Parser parser = getParser(language); - if (parser == null) { - throw new SystemException("No parser for language '"+language+"'"); - } - return parser; - } - - public Protector getDefaultProtector() { - return defaultProtector; - } - - public void setDefaultProtector(Protector defaultProtector) { - this.defaultProtector = defaultProtector; - } - - public PrismMonitor getMonitor() { - return monitor; - } - - public void setMonitor(PrismMonitor monitor) { - this.monitor = monitor; - } - - //endregion - - //region Parsing Prism objects - /** - * Parses a file and creates a prism from it. Autodetect language. - * @throws IOException - */ - public PrismObject parseObject(File file) throws SchemaException, IOException { - Parser parser = findParser(file); - ParsingContext pc = newParsingContext(); - XNode xnode = parser.parse(file, pc); - return xnodeProcessor.parseObject(xnode, pc); - } - - public PrismObject parseObject(File file, ParsingContext context) throws SchemaException, IOException { - Parser parser = findParser(file); - XNode xnode = parser.parse(file, context); - return xnodeProcessor.parseObject(xnode, context); - } - - /** - * Parses a file and creates a prism from it. - */ - public PrismObject parseObject(File file, String language) throws SchemaException, IOException { - ParsingContext pc = newParsingContext(); - XNode xnode = parseToXNode(file, language, pc); - return xnodeProcessor.parseObject(xnode, pc); - } - - /** - * Parses data from an input stream and creates a prism from it. - */ - public PrismObject parseObject(InputStream stream, String language) throws SchemaException, IOException { - ParsingContext pc = newParsingContext(); - XNode xnode = parseToXNode(stream, language, pc); - return xnodeProcessor.parseObject(xnode, pc); - } - - /** - * Parses a string and creates a prism from it. Autodetect language. - * Used mostly for testing, but can also be used for built-in editors, etc. - */ - public PrismObject parseObject(String dataString) throws SchemaException { - Parser parser = findParser(dataString); - ParsingContext pc = newParsingContext(); - XNode xnode = parser.parse(dataString, pc); - return xnodeProcessor.parseObject(xnode, pc); - } - - /** - * Parses a string and creates a prism from it. Autodetect language. - * Used mostly for testing, but can also be used for built-in editors, etc. - */ - public PrismObject parseObject(String dataString, XNodeProcessorEvaluationMode mode) throws SchemaException { - Parser parser = findParser(dataString); - ParsingContext pc = ParsingContext.forMode(mode); - XNode xnode = parser.parse(dataString, pc); - XNodeProcessor myXnodeProcessor = new XNodeProcessor(this); - return myXnodeProcessor.parseObject(xnode, pc); - } - - public PrismObject parseObject(String dataString, ParsingContext parsingContext) throws SchemaException { - Parser parser = findParser(dataString); - XNode xnode = parser.parse(dataString, parsingContext); - XNodeProcessor myXnodeProcessor = new XNodeProcessor(this); - return myXnodeProcessor.parseObject(xnode, parsingContext); - } - - /** - * Parses a string and creates a prism from it. Used mostly for testing, but can also be used for built-in editors, etc. - */ - public PrismObject parseObject(String dataString, String language) throws SchemaException { - ParsingContext pc = newParsingContext(); - XNode xnode = parseToXNode(dataString, language, pc); - return xnodeProcessor.parseObject(xnode, pc); - } - - /** - * Parses a DOM object and creates a prism from it. - */ - @Deprecated - public PrismObject parseObject(Element objectElement) throws SchemaException { - ParsingContext pc = newParsingContext(); - RootXNode xroot = parserDom.parseElementAsRoot(objectElement); - return xnodeProcessor.parseObject(xroot, pc); - } - - public List> parseObjects(File file) throws SchemaException, IOException { - ParsingContext pc = newParsingContext(); - Parser parser = findParser(file); - Collection nodes = parser.parseCollection(file, pc); - Iterator nodesIterator = nodes.iterator(); - List> objects = new ArrayList<>(); - while (nodesIterator.hasNext()){ - XNode node = nodesIterator.next(); - PrismObject object = xnodeProcessor.parseObject(node, pc); - objects.add(object); - } - return objects; - } - - public Collection parseObjects(InputStream stream, String language) throws SchemaException, IOException { - Parser parser = getParserNotNull(language); - Collection nodes = parser.parseCollection(stream, ParsingContext.createDefault()); - return nodes; - } - //endregion - - //region Parsing prism containers - public PrismContainer parseContainer(File file, Class type, String language) throws SchemaException, IOException { - ParsingContext pc = newParsingContext(); - XNode xnode = parseToXNode(file, language, pc); - return xnodeProcessor.parseContainer(xnode, type, pc); - } - - public PrismContainer parseContainer(File file, PrismContainerDefinition containerDef, String language) throws SchemaException, IOException { - ParsingContext pc = newParsingContext(); - XNode xnode = parseToXNode(file, language, pc); - return xnodeProcessor.parseContainer(xnode, containerDef, pc); - } - - public PrismContainer parseContainer(String dataString, Class type, String language) throws SchemaException { - ParsingContext pc = newParsingContext(); - XNode xnode = parseToXNode(dataString, language, pc); - return xnodeProcessor.parseContainer(xnode, type, pc); - } - - public PrismContainer parseContainer(String dataString, PrismContainerDefinition containerDef, String language) throws SchemaException { - ParsingContext pc = newParsingContext(); - XNode xnode = parseToXNode(dataString, language, pc); - return xnodeProcessor.parseContainer(xnode, containerDef, pc); - } - - /** - * Parses prism container, trying to autodetect the definition from the root node name (if present) or from node type. - * Both single and multivalued containers are supported. - * - * @param dataString String to be parsed. - * @param language Language to be used. - * @return - * @throws SchemaException - */ - public PrismContainer parseContainer(String dataString, String language, ParsingContext pc) throws SchemaException { - XNode xnode = parseToXNode(dataString, language, pc); - return xnodeProcessor.parseContainer(xnode, pc); - } - //endregion - - //region Parsing atomic values (properties values) - /** - * Parses an atomic value - i.e. something that could present a property value, if such a property would exist. - */ - public T parseAtomicValue(String dataString, QName typeName, String language) throws SchemaException { - ParsingContext pc = newParsingContext(); - XNode xnode = parseToXNode(dataString, language, pc); - return xnodeProcessor.parseAtomicValue(xnode, typeName, pc); - } - - public T parseAtomicValue(String dataString, QName typeName) throws SchemaException { - ParsingContext pc = newParsingContext(); - XNode xnode = parseToXNode(dataString, pc); - return xnodeProcessor.parseAtomicValue(xnode, typeName, pc); - } - - public T parseAtomicValue(File file, QName typeName, String language) throws SchemaException, IOException { - ParsingContext pc = newParsingContext(); - XNode xnode = parseToXNode(file, language, pc); - return xnodeProcessor.parseAtomicValue(xnode, typeName, pc); - } - - public T parseAtomicValue(File file, QName typeName) throws SchemaException, IOException { - ParsingContext pc = newParsingContext(); - XNode xnode = parseToXNode(file, pc); - return xnodeProcessor.parseAtomicValue(xnode, typeName, pc); - } - - //endregion - - //region Parsing anything (without knowing the definition up-front) - /** - * Parses (almost) anything: either an item with a definition, or an atomic (i.e. property-like) value. - * Does not care for schemaless items! - * - * CAUTION: EXPERIMENTAL - Avoid using this method if at all possible. - * Its result is not well defined, namely, whether it returns Item or a value. - * - * @return either Item or an unmarshalled bean value - * @throws SchemaException - */ - public Object parseAnyData(String dataString, String language) throws SchemaException { - ParsingContext pc = newParsingContext(); - XNode xnode = parseToXNode(dataString, language, pc); - return xnodeProcessor.parseAnyData(xnode, pc); - } - - public Object parseAnyData(File file) throws SchemaException, IOException { - ParsingContext pc = newParsingContext(); - XNode xnode = parseToXNode(file, pc); - return xnodeProcessor.parseAnyData(xnode, pc); - } - /** - * Emulates JAXB unmarshal method. - * - * TODO - * - * @return - * @throws SchemaException - */ - public T parseAnyValue(File file) throws SchemaException, IOException { - ParsingContext pc = newParsingContext(); - XNode xnode = parseToXNode(file, pc); - return xnodeProcessor.parseAnyValue(xnode, pc); - } - - public T parseAnyValue(Element element) throws SchemaException { - ParsingContext pc = newParsingContext(); - XNode xnode = parseToXNode(element, pc); - return xnodeProcessor.parseAnyValue(xnode, pc); - } - - public T parseAnyValue(InputStream inputStream, String language) throws SchemaException, IOException { - ParsingContext pc = newParsingContext(); - XNode xnode = parseToXNode(inputStream, language, pc); - return xnodeProcessor.parseAnyValue(xnode, pc); - } - - public T parseAnyValue(String dataString, String language) throws SchemaException { - ParsingContext pc = newParsingContext(); - XNode xnode = parseToXNode(dataString, language, pc); - return xnodeProcessor.parseAnyValue(xnode, pc); - } - - // experimental! - public JAXBElement parseAnyValueAsJAXBElement(String dataString, String language) throws SchemaException { - ParsingContext pc = newParsingContext(); - XNode xnode = parseToXNode(dataString, language, pc); - return xnodeProcessor.parseAnyValueAsJAXBElement(xnode, pc); - } - //endregion - - //region Parsing to XNode - private XNode parseToXNode(String dataString, ParsingContext pc) throws SchemaException { - Parser parser = findParser(dataString); - return parser.parse(dataString, pc); - } - - public XNode parseToXNode(String dataString, String language, ParsingContext pc) throws SchemaException { - Parser parser = getParserNotNull(language); - return parser.parse(dataString, pc); - } - - private XNode parseToXNode(File file, ParsingContext pc) throws SchemaException, IOException { - Parser parser = findParser(file); - return parser.parse(file, pc); - } - - private XNode parseToXNode(File file, String language, ParsingContext parsingContext) throws SchemaException, IOException { - Parser parser = getParserNotNull(language); - return parser.parse(file, parsingContext); - } - - private XNode parseToXNode(InputStream stream, String language, ParsingContext pc) throws SchemaException, IOException { - Parser parser = getParserNotNull(language); - return parser.parse(stream, pc); - } - - private XNode parseToXNode(Element domElement, ParsingContext pc) throws SchemaException { - return parserDom.parse(domElement); - } - - public String serializeXNodeToString(RootXNode xroot, String language) throws SchemaException { - Parser parser = getParserNotNull(language); - return parser.serializeToString(xroot, null); - } - - private Parser findParser(File file) throws IOException{ - Parser parser = null; - for (Entry entry: parserMap.entrySet()) { - Parser aParser = entry.getValue(); - if (aParser.canParse(file)) { - parser = aParser; - break; - } - } - if (parser == null) { - throw new SystemException("No parser for file '"+file+"' (autodetect)"); - } - return parser; - } - - private Parser findParser(String data){ - Parser parser = null; - for (Entry entry: parserMap.entrySet()) { - Parser aParser = entry.getValue(); - if (aParser.canParse(data)) { - parser = aParser; - break; - } - } - if (parser == null) { - throw new SystemException("No parser for data '"+DebugUtil.excerpt(data,16)+"' (autodetect)"); - } - return parser; - } - //endregion - - //region adopt(...) methods - /** - * Set up the specified object with prism context instance and schema definition. - */ - public void adopt(PrismObject object, Class declaredType) throws SchemaException { - object.revive(this); - getSchemaRegistry().applyDefinition(object, declaredType, false); - } - - public void adopt(PrismObject object) throws SchemaException { - adopt(object, object.getCompileTimeClass()); - } - - public void adopt(Objectable objectable) throws SchemaException { - adopt(objectable.asPrismObject(), objectable.getClass()); - } - - public void adopt(Containerable containerable) throws SchemaException { - containerable.asPrismContainerValue().revive(this); - } - - public void adopt(PrismContainerValue value) throws SchemaException { - value.revive(this); - } - - public void adopt(ObjectDelta delta) throws SchemaException { - delta.revive(this); - getSchemaRegistry().applyDefinition(delta, delta.getObjectTypeClass(), false); - } - - public void adopt(C containerable, Class type, ItemPath path) throws SchemaException { - PrismContainerValue prismContainerValue = containerable.asPrismContainerValue(); - adopt(prismContainerValue, type, path); - } - - public void adopt(PrismContainerValue prismContainerValue, Class type, ItemPath path) throws SchemaException { - prismContainerValue.revive(this); - getSchemaRegistry().applyDefinition(prismContainerValue, type, path, false); - } - - public void adopt(PrismContainerValue prismContainerValue, QName typeName, ItemPath path) throws SchemaException { - prismContainerValue.revive(this); - getSchemaRegistry().applyDefinition(prismContainerValue, typeName, path, false); - } - //endregion - - //region Serializing objects, containers, atomic values (properties) - public String serializeObjectToString(PrismObject object, String language) throws SchemaException { - Parser parser = getParserNotNull(language); - RootXNode xroot = xnodeProcessor.serializeObject(object); - return parser.serializeToString(xroot, null); - } - - public String serializeObjectToString(PrismObject object, String language, SerializationOptions options) throws SchemaException { - Parser parser = getParserNotNull(language); - RootXNode xroot = xnodeProcessor.serializeObject(object); - return parser.serializeToString(xroot, SerializationContext.forOptions(options)); - } - - public String serializeContainerValueToString(PrismContainerValue cval, QName elementName, String language) throws SchemaException { - Parser parser = getParserNotNull(language); - - RootXNode xroot = xnodeProcessor.serializeItemValueAsRoot(cval, elementName); - //System.out.println("serialized to xnode: " + xroot.debugDump()); - return parser.serializeToString(xroot, null); - } - - /** - * Serializes an atomic value - i.e. something that fits into a prism property (if such a property would exist). - * - * @param value Value to be serialized. - * @param elementName Element name to be used. - * @param language - * @return - * @throws SchemaException - * - * BEWARE, currently works only for values that can be processed via PrismBeanConvertor - i.e. not for special - * cases like PolyStringType, ProtectedStringType, etc. - */ - public String serializeAtomicValue(Object value, QName elementName, String language) throws SchemaException { - return serializeAtomicValue(value, elementName, language, null); - } - - public String serializeAtomicValue(Object value, QName elementName, String language, SerializationOptions serializationOptions) throws SchemaException { - Parser parser = getParserNotNull(language); - SerializationContext sc = new SerializationContext(serializationOptions); - RootXNode xnode = xnodeProcessor.serializeAtomicValue(value, elementName, sc); - return parser.serializeToString(xnode, sc); - } - - public String serializeAtomicValue(JAXBElement element, String language) throws SchemaException { - Parser parser = getParserNotNull(language); - RootXNode xnode = xnodeProcessor.serializeAtomicValue(element); - return parser.serializeToString(xnode, null, null); - } - - - /** - * Serializes any data - i.e. either Item or an atomic value. - * Does not support PrismValues: TODO: implement that! - * - * @param object - * @param language - * @return - * @throws SchemaException - */ - - public String serializeAnyData(Object object, String language) throws SchemaException { - Parser parser = getParserNotNull(language); - RootXNode xnode = xnodeProcessor.serializeAnyData(object, null); - return parser.serializeToString(xnode, null); - } - - public String serializeAnyData(Object object, QName defaultRootElementName, String language) throws SchemaException { - Parser parser = getParserNotNull(language); - RootXNode xnode = xnodeProcessor.serializeAnyData(object, defaultRootElementName, null); - return parser.serializeToString(xnode, null); - } - - public Element serializeAnyDataToElement(Object object, QName defaultRootElementName) throws SchemaException { - RootXNode xnode = xnodeProcessor.serializeAnyData(object, defaultRootElementName, null); - return parserDom.serializeXRootToElement(xnode); - } - - public Element serializeAnyDataToElement(Object object, QName defaultRootElementName, SerializationContext ctx) throws SchemaException { - RootXNode xnode = xnodeProcessor.serializeAnyData(object, defaultRootElementName, ctx); - return parserDom.serializeXRootToElement(xnode); - } - - public boolean canSerialize(Object value) { - return xnodeProcessor.canSerialize(value); - } - - -// public String serializeAtomicValues(QName elementName, String language, T... values) throws SchemaException { -// Parser parser = getParserNotNull(language); -// PrismPropertyDefinition definition = schemaRegistry.findPropertyDefinitionByElementName(elementName); -// if (definition == null) { -// throw new SchemaException("Prism property with name " + elementName + " couldn't be found"); -// } -// PrismProperty property = definition.instantiate(); -// for (T value : values) { -// property.addRealValue(value); -// } -// RootXNode xroot = xnodeProcessor.serializeItemAsRoot(property); -// return parser.serializeToString(xroot); -// } - - @Deprecated - public Element serializeToDom(PrismObject object) throws SchemaException { - RootXNode xroot = xnodeProcessor.serializeObject(object); - return parserDom.serializeXRootToElement(xroot); - } - - @Deprecated - public Element serializeValueToDom(PrismValue pval, QName elementName) throws SchemaException { - RootXNode xroot = xnodeProcessor.serializeItemValueAsRoot(pval, elementName); - return parserDom.serializeXRootToElement(xroot); - } - - @Deprecated - public Element serializeValueToDom(PrismValue pval, QName elementName, Document document) throws SchemaException { - RootXNode xroot = xnodeProcessor.serializeItemValueAsRoot(pval, elementName); - return parserDom.serializeXRootToElement(xroot, document); - } - - - //endregion - - /** - * A bit of hack: serializes any Item into a RawType. - * Currently used for serializing script output, until a better method is devised. - * @return - */ - public RawType toRawType(Item item) throws SchemaException { - RootXNode rootXNode = xnodeProcessor.serializeItemAsRoot(item); - return new RawType(rootXNode, this); - } - - public PrismObject createObject(Class clazz) throws SchemaException { - PrismObjectDefinition definition = schemaRegistry.findObjectDefinitionByCompileTimeClass(clazz); - if (definition == null) { - throw new SchemaException("Definition for prism object holding " + clazz + " couldn't be found"); - } - return definition.instantiate(); - } - - public T createObjectable(Class clazz) throws SchemaException { - return createObject(clazz).asObjectable(); - } - - protected ParsingContext newParsingContext() { - return ParsingContext.createDefault(); - } +public interface PrismContext { + + String LANG_XML = "xml"; + String LANG_JSON = "json"; + String LANG_YAML = "yaml"; + + void initialize() throws SchemaException, SAXException, IOException; + + SchemaRegistry getSchemaRegistry(); + + XNodeProcessor getXnodeProcessor(); + + DomParser getParserDom(); + + PrismBeanConverter getBeanConverter(); + + JaxbDomHack getJaxbDomHack(); + + SchemaDefinitionFactory getDefinitionFactory(); + + PolyStringNormalizer getDefaultPolyStringNormalizer(); + + Protector getDefaultProtector(); + + PrismMonitor getMonitor(); + + void setMonitor(PrismMonitor monitor); + + PrismParser parserFor(File file); + PrismParser parserFor(InputStream stream); + PrismParserNoIO parserFor(String data); + + @Deprecated + PrismParserNoIO parserFor(Element element); + + @Deprecated // user parserFor + parse instead + PrismObject parseObject(File file) throws SchemaException, IOException; + + @Deprecated // user parserFor + parse instead + PrismObject parseObject(String dataString) throws SchemaException; + + void adopt(PrismObject object, Class declaredType) throws SchemaException; + + void adopt(PrismObject object) throws SchemaException; + + void adopt(Objectable objectable) throws SchemaException; + + void adopt(Containerable containerable) throws SchemaException; + + void adopt(PrismContainerValue value) throws SchemaException; + + void adopt(ObjectDelta delta) throws SchemaException; + + void adopt(C containerable, Class type, ItemPath path) throws SchemaException; + + void adopt(PrismContainerValue prismContainerValue, Class type, + ItemPath path) throws SchemaException; + + void adopt(PrismContainerValue prismContainerValue, QName typeName, + ItemPath path) throws SchemaException; + + //region Serializing objects, containers, atomic values (properties) + String serializeObjectToString(PrismObject object, String language) throws SchemaException; + + String serializeObjectToString(PrismObject object, String language, SerializationOptions options) throws SchemaException; + + String serializeContainerValueToString(PrismContainerValue cval, QName elementName, + String language) throws SchemaException; + + String serializeAtomicValue(Object value, QName elementName, String language) throws SchemaException; + + String serializeAtomicValue(Object value, QName elementName, String language, SerializationOptions serializationOptions) throws SchemaException; + + String serializeAtomicValue(JAXBElement element, String language) throws SchemaException; + + String serializeAnyData(Object object, String language) throws SchemaException; + + String serializeAnyData(Object object, QName defaultRootElementName, String language) throws SchemaException; + + Element serializeAnyDataToElement(Object object, QName defaultRootElementName) throws SchemaException; + + Element serializeAnyDataToElement(Object object, QName defaultRootElementName, SerializationContext ctx) throws SchemaException; + + boolean canSerialize(Object value); + + @Deprecated + Element serializeToDom(PrismObject object) throws SchemaException; + + @Deprecated + Element serializeValueToDom(PrismValue pval, QName elementName) throws SchemaException; + + @Deprecated + Element serializeValueToDom(PrismValue pval, QName elementName, Document document) throws SchemaException; + + RawType toRawType(Item item) throws SchemaException; + + PrismObject createObject(Class clazz) throws SchemaException; + + T createObjectable(Class clazz) throws SchemaException; + + @Deprecated + String serializeXNodeToString(RootXNode query, String langXml) throws SchemaException; } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContextImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContextImpl.java new file mode 100644 index 00000000000..cbff9db5a95 --- /dev/null +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContextImpl.java @@ -0,0 +1,474 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.prism; + +import com.evolveum.midpoint.prism.crypto.Protector; +import com.evolveum.midpoint.prism.delta.ObjectDelta; +import com.evolveum.midpoint.prism.marshaller.JaxbDomHack; +import com.evolveum.midpoint.prism.marshaller.PrismBeanConverter; +import com.evolveum.midpoint.prism.marshaller.PrismBeanInspector; +import com.evolveum.midpoint.prism.marshaller.XNodeProcessor; +import com.evolveum.midpoint.prism.parser.Parser; +import com.evolveum.midpoint.prism.parser.ParserHelpers; +import com.evolveum.midpoint.prism.parser.ParserRegistry; +import com.evolveum.midpoint.prism.parser.dom.DomParser; +import com.evolveum.midpoint.prism.path.ItemPath; +import com.evolveum.midpoint.prism.polystring.PolyStringNormalizer; +import com.evolveum.midpoint.prism.polystring.PrismDefaultPolyStringNormalizer; +import com.evolveum.midpoint.prism.schema.SchemaDefinitionFactory; +import com.evolveum.midpoint.prism.schema.SchemaRegistry; +import com.evolveum.midpoint.prism.util.PrismMonitor; +import com.evolveum.midpoint.prism.xnode.RootXNode; +import com.evolveum.midpoint.util.exception.SchemaException; +import com.evolveum.midpoint.util.exception.SystemException; +import com.evolveum.midpoint.util.logging.Trace; +import com.evolveum.midpoint.util.logging.TraceManager; +import com.evolveum.prism.xml.ns._public.types_3.RawType; +import org.springframework.beans.factory.annotation.Autowired; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.xml.sax.SAXException; + +import javax.xml.bind.JAXBElement; +import javax.xml.namespace.QName; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; + +/** + * @author semancik + * + */ +public class PrismContextImpl implements PrismContext { + + private static final Trace LOGGER = TraceManager.getTrace(PrismContextImpl.class); + + private static boolean allowSchemalessSerialization = true; + + private SchemaRegistry schemaRegistry; + private XNodeProcessor xnodeProcessor; + private PrismBeanConverter beanConverter; + private SchemaDefinitionFactory definitionFactory; + private PolyStringNormalizer defaultPolyStringNormalizer; + private ParserRegistry parserRegistry; + private ParserHelpers parserHelpers; + private PrismMonitor monitor = null; + + @Autowired + private Protector defaultProtector; + + // We need to keep this because of deprecated methods and various hacks + private JaxbDomHack jaxbDomHack; + + //region Standard overhead + private PrismContextImpl() { + // empty + } + + public static PrismContextImpl create(SchemaRegistry schemaRegistry) { + PrismContextImpl prismContext = new PrismContextImpl(); + prismContext.schemaRegistry = schemaRegistry; + schemaRegistry.setPrismContext(prismContext); + + prismContext.xnodeProcessor = new XNodeProcessor(prismContext); + PrismBeanInspector inspector = new PrismBeanInspector(prismContext); + prismContext.beanConverter = new PrismBeanConverter(prismContext, inspector); + + prismContext.parserRegistry = new ParserRegistry(schemaRegistry); + prismContext.jaxbDomHack = new JaxbDomHack((DomParser) prismContext.parserRegistry.parserFor(PrismContext.LANG_XML), prismContext); + + prismContext.parserHelpers = new ParserHelpers(prismContext.parserRegistry, prismContext.xnodeProcessor, prismContext.beanConverter); + + return prismContext; + } + + public static PrismContextImpl createEmptyContext(SchemaRegistry schemaRegistry){ + PrismContextImpl prismContext = new PrismContextImpl(); + prismContext.schemaRegistry = schemaRegistry; + schemaRegistry.setPrismContext(prismContext); + + return prismContext; + } + + @Override + public void initialize() throws SchemaException, SAXException, IOException { + schemaRegistry.initialize(); + if (defaultPolyStringNormalizer == null) { + defaultPolyStringNormalizer = new PrismDefaultPolyStringNormalizer(); + } + } + + public static boolean isAllowSchemalessSerialization() { + return allowSchemalessSerialization; + } + + public static void setAllowSchemalessSerialization(boolean allowSchemalessSerialization) { + PrismContextImpl.allowSchemalessSerialization = allowSchemalessSerialization; + } + + @Override + public SchemaRegistry getSchemaRegistry() { + return schemaRegistry; + } + + public void setSchemaRegistry(SchemaRegistry schemaRegistry) { + this.schemaRegistry = schemaRegistry; + } + + @Override + public XNodeProcessor getXnodeProcessor() { + return xnodeProcessor; + } + + /** + * WARNING! This is not really public method. It should NOT not used outside the prism implementation. + */ + @Override + public DomParser getParserDom() { + return (DomParser) parserHelpers.parserRegistry.parserFor(LANG_XML); + } + + @Override + public PrismBeanConverter getBeanConverter() { + return beanConverter; + } + + @Override + public JaxbDomHack getJaxbDomHack() { + return jaxbDomHack; + } + + @Override + public SchemaDefinitionFactory getDefinitionFactory() { + if (definitionFactory == null) { + definitionFactory = new SchemaDefinitionFactory(); + } + return definitionFactory; + } + + public void setDefinitionFactory(SchemaDefinitionFactory definitionFactory) { + this.definitionFactory = definitionFactory; + } + + @Override + public PolyStringNormalizer getDefaultPolyStringNormalizer() { + return defaultPolyStringNormalizer; + } + + public void setDefaultPolyStringNormalizer(PolyStringNormalizer defaultPolyStringNormalizer) { + this.defaultPolyStringNormalizer = defaultPolyStringNormalizer; + } + + private Parser getParser(String language) { + return parserRegistry.parserFor(language); + } + + private Parser getParserNotNull(String language) { + Parser parser = getParser(language); + if (parser == null) { + throw new SystemException("No parser for language '"+language+"'"); + } + return parser; + } + + @Override + public Protector getDefaultProtector() { + return defaultProtector; + } + + public void setDefaultProtector(Protector defaultProtector) { + this.defaultProtector = defaultProtector; + } + + @Override + public PrismMonitor getMonitor() { + return monitor; + } + + @Override + public void setMonitor(PrismMonitor monitor) { + this.monitor = monitor; + } + + //endregion + + //region Parsing + @Override + public PrismParser parserFor(File file) { + return new PrismParserImplIO(new ParserFileSource(file), null, ParsingContext.createDefault(), parserHelpers); + } + + @Override + public PrismParser parserFor(InputStream stream) { + return new PrismParserImplIO(new ParserInputStreamSource(stream), null, ParsingContext.createDefault(), parserHelpers); + } + + @Override + public PrismParserNoIO parserFor(String data) { + return new PrismParserImplNoIO(new ParserStringSource(data), null, ParsingContext.createDefault(), parserHelpers); + } + + @Deprecated + @Override + public PrismParserNoIO parserFor(Element data) { + return new PrismParserImplNoIO(new ParserElementSource(data), null, ParsingContext.createDefault(), parserHelpers); + } + + @Deprecated + @Override + public PrismObject parseObject(File file) throws SchemaException, IOException { + return parserFor(file).parse(); + } + + @Deprecated + @Override + public PrismObject parseObject(String dataString) throws SchemaException { + return parserFor(dataString).parse(); + } + //endregion + + //region adopt(...) methods + /** + * Set up the specified object with prism context instance and schema definition. + */ + @Override + public void adopt(PrismObject object, Class declaredType) throws SchemaException { + object.revive(this); + getSchemaRegistry().applyDefinition(object, declaredType, false); + } + + @Override + public void adopt(PrismObject object) throws SchemaException { + adopt(object, object.getCompileTimeClass()); + } + + @Override + public void adopt(Objectable objectable) throws SchemaException { + adopt(objectable.asPrismObject(), objectable.getClass()); + } + + @Override + public void adopt(Containerable containerable) throws SchemaException { + containerable.asPrismContainerValue().revive(this); + } + + @Override + public void adopt(PrismContainerValue value) throws SchemaException { + value.revive(this); + } + + @Override + public void adopt(ObjectDelta delta) throws SchemaException { + delta.revive(this); + getSchemaRegistry().applyDefinition(delta, delta.getObjectTypeClass(), false); + } + + @Override + public void adopt(C containerable, Class type, ItemPath path) throws SchemaException { + PrismContainerValue prismContainerValue = containerable.asPrismContainerValue(); + adopt(prismContainerValue, type, path); + } + + @Override + public void adopt(PrismContainerValue prismContainerValue, Class type, + ItemPath path) throws SchemaException { + prismContainerValue.revive(this); + getSchemaRegistry().applyDefinition(prismContainerValue, type, path, false); + } + + @Override + public void adopt(PrismContainerValue prismContainerValue, QName typeName, + ItemPath path) throws SchemaException { + prismContainerValue.revive(this); + getSchemaRegistry().applyDefinition(prismContainerValue, typeName, path, false); + } + //endregion + + //region Serializing objects, containers, atomic values (properties) + @Override + public String serializeObjectToString(PrismObject object, String language) throws SchemaException { + Parser parser = getParserNotNull(language); + RootXNode xroot = xnodeProcessor.serializeObject(object); + return parser.serializeToString(xroot, null); + } + + @Override + public String serializeObjectToString(PrismObject object, String language, + SerializationOptions options) throws SchemaException { + Parser parser = getParserNotNull(language); + RootXNode xroot = xnodeProcessor.serializeObject(object); + return parser.serializeToString(xroot, SerializationContext.forOptions(options)); + } + + @Override + public String serializeContainerValueToString(PrismContainerValue cval, QName elementName, + String language) throws SchemaException { + Parser parser = getParserNotNull(language); + + RootXNode xroot = xnodeProcessor.serializeItemValueAsRoot(cval, elementName); + //System.out.println("serialized to xnode: " + xroot.debugDump()); + return parser.serializeToString(xroot, null); + } + + @Override + public String serializeXNodeToString(RootXNode root, String language) throws SchemaException { + Parser parser = getParserNotNull(language); + return parser.serializeToString(root, null); + } + + /** + * Serializes an atomic value - i.e. something that fits into a prism property (if such a property would exist). + * + * @param value Value to be serialized. + * @param elementName Element name to be used. + * @param language + * @return + * @throws SchemaException + * + * BEWARE, currently works only for values that can be processed via PrismBeanConvertor - i.e. not for special + * cases like PolyStringType, ProtectedStringType, etc. + */ + @Override + public String serializeAtomicValue(Object value, QName elementName, String language) throws SchemaException { + return serializeAtomicValue(value, elementName, language, null); + } + + @Override + public String serializeAtomicValue(Object value, QName elementName, String language, + SerializationOptions serializationOptions) throws SchemaException { + Parser parser = getParserNotNull(language); + SerializationContext sc = new SerializationContext(serializationOptions); + RootXNode xnode = xnodeProcessor.serializeAtomicValue(value, elementName, sc); + return parser.serializeToString(xnode, sc); + } + + @Override + public String serializeAtomicValue(JAXBElement element, String language) throws SchemaException { + Parser parser = getParserNotNull(language); + RootXNode xnode = xnodeProcessor.serializeAtomicValue(element); + return parser.serializeToString(xnode, null, null); + } + + + /** + * Serializes any data - i.e. either Item or an atomic value. + * Does not support PrismValues: TODO: implement that! + * + * @param object + * @param language + * @return + * @throws SchemaException + */ + + @Override + public String serializeAnyData(Object object, String language) throws SchemaException { + Parser parser = getParserNotNull(language); + RootXNode xnode = xnodeProcessor.serializeAnyData(object, null); + return parser.serializeToString(xnode, null); + } + + @Override + public String serializeAnyData(Object object, QName defaultRootElementName, String language) throws SchemaException { + Parser parser = getParserNotNull(language); + RootXNode xnode = xnodeProcessor.serializeAnyData(object, defaultRootElementName, null); + return parser.serializeToString(xnode, null); + } + + @Override + public Element serializeAnyDataToElement(Object object, QName defaultRootElementName) throws SchemaException { + RootXNode xnode = xnodeProcessor.serializeAnyData(object, defaultRootElementName, null); + return getParserDom().serializeXRootToElement(xnode); + } + + @Override + public Element serializeAnyDataToElement(Object object, QName defaultRootElementName, SerializationContext ctx) throws SchemaException { + RootXNode xnode = xnodeProcessor.serializeAnyData(object, defaultRootElementName, ctx); + return getParserDom().serializeXRootToElement(xnode); + } + + @Override + public boolean canSerialize(Object value) { + return xnodeProcessor.canSerialize(value); + } + + +// public String serializeAtomicValues(QName elementName, String language, T... values) throws SchemaException { +// Parser parser = getParserNotNull(language); +// PrismPropertyDefinition definition = schemaRegistry.findPropertyDefinitionByElementName(elementName); +// if (definition == null) { +// throw new SchemaException("Prism property with name " + elementName + " couldn't be found"); +// } +// PrismProperty property = definition.instantiate(); +// for (T value : values) { +// property.addRealValue(value); +// } +// RootXNode xroot = xnodeProcessor.serializeItemAsRoot(property); +// return parser.serializeToString(xroot); +// } + + @Override + @Deprecated + public Element serializeToDom(PrismObject object) throws SchemaException { + RootXNode xroot = xnodeProcessor.serializeObject(object); + return getParserDom().serializeXRootToElement(xroot); + } + + @Override + @Deprecated + public Element serializeValueToDom(PrismValue pval, QName elementName) throws SchemaException { + RootXNode xroot = xnodeProcessor.serializeItemValueAsRoot(pval, elementName); + return getParserDom().serializeXRootToElement(xroot); + } + + @Override + @Deprecated + public Element serializeValueToDom(PrismValue pval, QName elementName, Document document) throws SchemaException { + RootXNode xroot = xnodeProcessor.serializeItemValueAsRoot(pval, elementName); + return getParserDom().serializeXRootToElement(xroot, document); + } + + + //endregion + + /** + * A bit of hack: serializes any Item into a RawType. + * Currently used for serializing script output, until a better method is devised. + * @return + */ + @Override + public RawType toRawType(Item item) throws SchemaException { + RootXNode rootXNode = xnodeProcessor.serializeItemAsRoot(item); + return new RawType(rootXNode, this); + } + + @Override + public PrismObject createObject(Class clazz) throws SchemaException { + PrismObjectDefinition definition = schemaRegistry.findObjectDefinitionByCompileTimeClass(clazz); + if (definition == null) { + throw new SchemaException("Definition for prism object holding " + clazz + " couldn't be found"); + } + return definition.instantiate(); + } + + @Override + public T createObjectable(Class clazz) throws SchemaException { + return createObject(clazz).asObjectable(); + } + + protected ParsingContext newParsingContext() { + return ParsingContext.createDefault(); + } +} diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParser.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParser.java new file mode 100644 index 00000000000..b3af3a40ab2 --- /dev/null +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParser.java @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.prism; + +import com.evolveum.midpoint.prism.xnode.XNode; +import com.evolveum.midpoint.util.exception.SchemaException; +import org.jetbrains.annotations.NotNull; +import org.w3c.dom.Element; + +import javax.xml.bind.JAXBElement; +import javax.xml.namespace.QName; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.util.List; + +/** + * @author mederly + */ +public interface PrismParser { + + PrismParser language(String language); + PrismParser xml(); + PrismParser json(); + PrismParser yaml(); + PrismParser context(@NotNull ParsingContext context); + PrismParser strict(); + PrismParser compat(); + + PrismObject parse() throws SchemaException, IOException; + List> parseObjects() throws SchemaException, IOException; + PrismContainer parseContainer(Class clazz) throws SchemaException, IOException; + PrismContainer parseContainer(PrismContainerDefinition definition) throws SchemaException, IOException; + + /** + * Parses an atomic value - i.e. something that could present a property + * value, if such a property would exist. + */ + T parseAtomicValue(QName typeName) throws IOException, SchemaException; + + /** + * Parses (almost) anything: either an item with a definition, or an atomic (i.e. property-like) value. + * Does not care for schemaless items! + * + * CAUTION: EXPERIMENTAL - Avoid using this method if at all possible. + * Its result is not well defined, namely, whether it returns Item or a value. + * + * @return either Item or an unmarshalled bean value + * @throws SchemaException + */ + Object parseAnyData() throws IOException, SchemaException; + + /** + * Emulates JAXB unmarshal method. + * + * TODO + * + * @return + * @throws SchemaException + */ + T parseAnyValue() throws IOException, SchemaException; + + // experimental! + JAXBElement parseAnyValueAsJAXBElement() throws IOException, SchemaException; + + XNode parseToXNode() throws IOException, SchemaException; +} diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserImpl.java new file mode 100644 index 00000000000..3314b61f906 --- /dev/null +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserImpl.java @@ -0,0 +1,156 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.prism; + +import com.evolveum.midpoint.prism.parser.Parser; +import com.evolveum.midpoint.prism.parser.ParserHelpers; +import com.evolveum.midpoint.prism.xnode.XNode; +import com.evolveum.midpoint.util.exception.SchemaException; +import org.jetbrains.annotations.NotNull; + +import javax.xml.bind.JAXBElement; +import javax.xml.namespace.QName; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +/** + * @author mederly + */ +public abstract class PrismParserImpl implements PrismParser { + + private final ParserSource source; + private final String language; + @NotNull private final ParsingContext context; + private final ParserHelpers helpers; + + public PrismParserImpl(ParserSource source, String language, @NotNull ParsingContext context, ParserHelpers helpers) { + this.source = source; + this.language = language; + this.context = context; + this.helpers = helpers; + } + + private PrismParser create(ParserSource source, String language, @NotNull ParsingContext context, ParserHelpers helpers) { + return source.isIO() ? + new PrismParserImplIO(source, language, context, helpers) : + new PrismParserImplNoIO(source, language, context, helpers); + } + + @Override + public PrismParser language(String language) { + return create(this.source, language, this.context, this.helpers); + } + + @Override + public PrismParser xml() { + return language(PrismContext.LANG_XML); + } + + @Override + public PrismParser json() { + return language(PrismContext.LANG_JSON); + } + + @Override + public PrismParser yaml() { + return language(PrismContext.LANG_YAML); + } + + @Override + public PrismParser context(@NotNull ParsingContext context) { + return create(this.source, this.language, context, this.helpers); + } + + @Override + public PrismParser strict() { + return create(this.source, this.language, context.clone().strict(), this.helpers); + } + + @Override + public PrismParser compat() { + return create(this.source, this.language, context.clone().compat(), this.helpers); + } + + protected PrismObject doParse() throws SchemaException, IOException { + Parser parser = getParser(); + XNode xnode = parser.parse(source, context); + return helpers.xnodeProcessor.parseObject(xnode, context); + } + + private Parser getParser() throws IOException { + Parser parser; + if (language != null) { + parser = helpers.parserRegistry.parserFor(language); + } else { + parser = helpers.parserRegistry.findParser(source); + } + return parser; + } + + protected List> doParseObjects() throws IOException, SchemaException { + Parser parser = getParser(); + Collection xnodes = parser.parseCollection(source, context); + List> objects = new ArrayList<>(); + for (XNode xnode : xnodes) { + PrismObject object = helpers.xnodeProcessor.parseObject(xnode, context); + objects.add(object); + } + return objects; + } + + protected PrismContainer doParseContainer(Class clazz) throws SchemaException, IOException { + Parser parser = getParser(); + XNode xnode = parser.parse(source, context); + return helpers.xnodeProcessor.parseContainer(xnode, clazz, context); + } + + protected PrismContainer doParseContainer(PrismContainerDefinition definition) throws SchemaException, IOException { + Parser parser = getParser(); + XNode xnode = parser.parse(source, context); + return helpers.xnodeProcessor.parseContainer(xnode, definition, context); + } + + protected T doParseAtomicValue(QName typeName) throws IOException, SchemaException { + Parser parser = getParser(); + XNode xnode = parser.parse(source, context); + return helpers.xnodeProcessor.parseAtomicValue(xnode, typeName, context); + } + + protected Object doParseAnyData() throws IOException, SchemaException { + Parser parser = getParser(); + XNode xnode = parser.parse(source, context); + return helpers.xnodeProcessor.parseAnyData(xnode, context); + } + + protected T doParseAnyValue() throws IOException, SchemaException { + Parser parser = getParser(); + XNode xnode = parser.parse(source, context); + return helpers.xnodeProcessor.parseAnyValue(xnode, context); + } + + protected JAXBElement doParseAnyValueAsJAXBElement() throws IOException, SchemaException { + Parser parser = getParser(); + XNode xnode = parser.parse(source, context); + return helpers.xnodeProcessor.parseAnyValueAsJAXBElement(xnode, context); + } + + protected XNode doParseToXNode() throws IOException, SchemaException { + return getParser().parse(source, context); + } +} diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserImplIO.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserImplIO.java new file mode 100644 index 00000000000..3ef42832ad0 --- /dev/null +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserImplIO.java @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.prism; + +import com.evolveum.midpoint.prism.parser.ParserHelpers; +import com.evolveum.midpoint.prism.xnode.XNode; +import com.evolveum.midpoint.util.exception.SchemaException; + +import javax.xml.bind.JAXBElement; +import javax.xml.namespace.QName; +import java.io.IOException; +import java.util.List; + +/** + * @author mederly + */ +public class PrismParserImplIO extends PrismParserImpl { + + public PrismParserImplIO(ParserSource source, String language, ParsingContext context, ParserHelpers helpers) { + super(source, language, context, helpers); + } + + @Override + public PrismObject parse() throws SchemaException, IOException { + return doParse(); + } + + @Override + public List> parseObjects() throws SchemaException, IOException { + return doParseObjects(); + } + + @Override + public PrismContainer parseContainer(Class clazz) throws SchemaException, IOException { + return doParseContainer(clazz); + } + + @Override + public PrismContainer parseContainer(PrismContainerDefinition definition) throws SchemaException, IOException { + return doParseContainer(definition); + } + + @Override + public T parseAtomicValue(QName typeName) throws IOException, SchemaException { + return doParseAtomicValue(typeName); + } + + @Override + public Object parseAnyData() throws IOException, SchemaException { + return doParseAnyData(); + } + + @Override + public T parseAnyValue() throws IOException, SchemaException { + return doParseAnyValue(); + } + + @Override + public JAXBElement parseAnyValueAsJAXBElement() throws IOException, SchemaException { + return doParseAnyValueAsJAXBElement(); + } + + @Override + public XNode parseToXNode() throws IOException, SchemaException { + return doParseToXNode(); + } +} diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserImplNoIO.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserImplNoIO.java new file mode 100644 index 00000000000..4c34f49f3c8 --- /dev/null +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserImplNoIO.java @@ -0,0 +1,155 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.prism; + +import com.evolveum.midpoint.prism.parser.ParserHelpers; +import com.evolveum.midpoint.prism.xnode.XNode; +import com.evolveum.midpoint.util.exception.SchemaException; +import org.jetbrains.annotations.NotNull; + +import javax.xml.bind.JAXBElement; +import javax.xml.namespace.QName; +import java.io.IOException; +import java.util.List; + +/** + * @author mederly + */ +public class PrismParserImplNoIO extends PrismParserImpl implements PrismParserNoIO { + + public PrismParserImplNoIO(ParserSource source, String language, ParsingContext context, + ParserHelpers helpers) { + super(source, language, context, helpers); + } + + @Override + public PrismParserNoIO language(String language) { + return (PrismParserNoIO) super.language(language); + } + + @Override + public PrismParserNoIO xml() { + return (PrismParserNoIO) super.xml(); + } + + @Override + public PrismParserNoIO json() { + return (PrismParserNoIO) super.json(); + } + + @Override + public PrismParserNoIO yaml() { + return (PrismParserNoIO) super.yaml(); + } + + @Override + public PrismParserNoIO context(@NotNull ParsingContext context) { + return (PrismParserNoIO) super.context(context); + } + + @Override + public PrismParserNoIO strict() { + return (PrismParserNoIO) super.strict(); + } + + @Override + public PrismParserNoIO compat() { + return (PrismParserNoIO) super.compat(); + } + + @Override + public PrismObject parse() throws SchemaException { + try { + return doParse(); + } catch (IOException e) { + throw new IllegalStateException(e); + } + } + + @Override + public List> parseObjects() throws SchemaException { + try { + return doParseObjects(); + } catch (IOException e) { + throw new IllegalStateException(e); + } + } + + @Override + public PrismContainer parseContainer(Class clazz) throws SchemaException { + try { + return doParseContainer(clazz); + } catch (IOException e) { + throw new IllegalStateException(e); + } + } + + @Override + public PrismContainer parseContainer(PrismContainerDefinition definition) + throws SchemaException { + try { + return doParseContainer(definition); + } catch (IOException e) { + throw new IllegalStateException(e); + } + } + + @Override + public T parseAtomicValue(QName typeName) throws SchemaException { + try { + return doParseAtomicValue(typeName); + } catch (IOException e) { + throw new IllegalStateException(e); + } + } + + @Override + public Object parseAnyData() throws SchemaException { + try { + return doParseAnyData(); + } catch (IOException e) { + throw new IllegalStateException(e); + } + } + + @Override + public T parseAnyValue() throws SchemaException { + try { + return doParseAnyValue(); + } catch (IOException e) { + throw new IllegalStateException(e); + } + } + + @Override + public JAXBElement parseAnyValueAsJAXBElement() throws SchemaException { + try { + return doParseAnyValueAsJAXBElement(); + } catch (IOException e) { + throw new IllegalStateException(e); + } + } + + @Override + public XNode parseToXNode() throws SchemaException { + try { + return doParseToXNode(); + } catch (IOException e) { + throw new IllegalStateException(e); + } + } +} diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserNoIO.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserNoIO.java new file mode 100644 index 00000000000..b5edbfe8442 --- /dev/null +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserNoIO.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.prism; + +import com.evolveum.midpoint.prism.xnode.XNode; +import com.evolveum.midpoint.util.exception.SchemaException; +import org.jetbrains.annotations.NotNull; + +import javax.xml.bind.JAXBElement; +import javax.xml.namespace.QName; +import java.io.IOException; +import java.util.List; + +/** + * The same as PrismParser but has no IOException on parseXYZ methods. It is used when parsing from strings + * where no IOExceptions could occur. + * + * For methods' descriptions please see PrismParser interface. + * + * @author mederly + */ +public interface PrismParserNoIO extends PrismParser { + + PrismParserNoIO language(String language); + PrismParserNoIO xml(); + PrismParserNoIO json(); + PrismParserNoIO yaml(); + PrismParserNoIO context(@NotNull ParsingContext context); + PrismParserNoIO strict(); + PrismParserNoIO compat(); + + PrismObject parse() throws SchemaException; + List> parseObjects() throws SchemaException; + PrismContainer parseContainer(Class clazz) throws SchemaException; + PrismContainer parseContainer(PrismContainerDefinition definition) throws SchemaException; + T parseAtomicValue(QName typeName) throws SchemaException; + Object parseAnyData() throws SchemaException; + T parseAnyValue() throws SchemaException; + JAXBElement parseAnyValueAsJAXBElement() throws SchemaException; + + XNode parseToXNode() throws SchemaException; +} diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyValue.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyValue.java index 42df220a6bf..f1093b3369e 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyValue.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyValue.java @@ -112,7 +112,7 @@ public T getValue() { // throw new IllegalStateException("Attempt to get value withot a type from raw value of property "+getParent()); if (parent != null && parent.getPrismContext() != null) { def = SchemaRegistry.createDefaultItemDefinition(parent.getElementName(), parent.getPrismContext()); - } else if (PrismContext.isAllowSchemalessSerialization()) { + } else if (PrismContextImpl.isAllowSchemalessSerialization()) { if (rawElement instanceof Element) { // Do the most stupid thing possible. Assume string value. And there will be no definition. value = (T) ((Element)rawElement).getTextContent(); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/json/AbstractParserDeprecated.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/json/AbstractParserDeprecated.java deleted file mode 100644 index a08bedc3942..00000000000 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/json/AbstractParserDeprecated.java +++ /dev/null @@ -1,497 +0,0 @@ -package com.evolveum.midpoint.prism.json; - -import java.io.File; -import java.io.IOException; -import java.io.StringWriter; -import java.util.Iterator; -import java.util.ListIterator; -import java.util.Map.Entry; - -import javax.xml.namespace.QName; - -import com.evolveum.midpoint.prism.ParsingContext; -import com.evolveum.midpoint.prism.SerializationContext; -import org.apache.commons.lang.StringUtils; - -import com.evolveum.midpoint.prism.parser.Parser; -import com.evolveum.midpoint.prism.parser.json.ItemPathDeserializer; -import com.evolveum.midpoint.prism.parser.json.JsonValueParser; -import com.evolveum.midpoint.prism.parser.json.QNameDeserializer; -import com.evolveum.midpoint.prism.path.ItemPath; -import com.evolveum.midpoint.prism.xnode.ListXNode; -import com.evolveum.midpoint.prism.xnode.MapXNode; -import com.evolveum.midpoint.prism.xnode.PrimitiveXNode; -import com.evolveum.midpoint.prism.xnode.RootXNode; -import com.evolveum.midpoint.prism.xnode.ValueParser; -import com.evolveum.midpoint.prism.xnode.XNode; -import com.evolveum.midpoint.util.exception.SchemaException; -import com.fasterxml.jackson.core.JsonGenerationException; -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.core.JsonParseException; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.core.JsonToken; -import com.fasterxml.jackson.core.JsonTokenId; -import com.fasterxml.jackson.databind.JsonMappingException; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.ObjectReader; -import com.fasterxml.jackson.databind.module.SimpleModule; - -@Deprecated -public abstract class AbstractParserDeprecated implements Parser { - - private static final String PROP_NAMESPACE = "@ns"; - private static final String TYPE_DEFINITION = "@typeDef"; - private static final String VALUE_FIELD = "@value"; - - - @Override - public XNode parse(File file, ParsingContext parsingContext) throws SchemaException, IOException { - JsonParser parser = createParser(file); - return parseObject(parser); - } - - protected abstract JsonParser createParser(String dataString) throws SchemaException; - protected abstract JsonParser createParser(File file) throws SchemaException, IOException ; - - @Override - public XNode parse(String dataString, ParsingContext parsingContext) throws SchemaException { -// JsonFactory factory = new JsonFactory(); -// JsonParser parser = null; -// try { -// parser = factory.createParser(dataString); -// } catch (IOException e) { -// throw new SchemaException("Cannot create JSON parser: " + e.getMessage(), e); -// } - JsonParser parser = createParser(dataString); - return parseObject(parser); - } - - @Override - public boolean canParse(File file) throws IOException { - if (file == null) { - return false; - } - return file.getName().endsWith(".json"); - } - - @Override - public boolean canParse(String dataString) { - if (dataString == null) { - return false; - } - return dataString.startsWith("{"); - } - - @Override - public String serializeToString(XNode xnode, QName rootElementName, SerializationContext serializationContext) throws SchemaException { - if (xnode instanceof RootXNode){ - xnode = ((RootXNode) xnode).getSubnode(); - } - return serializeToJson(xnode, rootElementName); - } - - @Override - public String serializeToString(RootXNode xnode, SerializationContext serializationContext) throws SchemaException { - QName rootElementName = xnode.getRootElementName(); - return serializeToJson(xnode.getSubnode(), rootElementName); - } - - - // ------------------- METHODS FOR SERIALIZATION ------------------------------ -// String globalNamespace = null; - public String serializeToJson(XNode node, QName rootElement) throws SchemaException{ - try { -// globalNamespace = rootElement.getNamespaceURI(); - StringWriter out = new StringWriter(); - JsonGenerator generator = createGenerator(out); - return writeObject(node, rootElement, generator, out); - } catch (IOException ex){ - throw new SchemaException("Schema error during serializing to JSON.", ex); - } - - } - - private String writeObject(XNode node, QName rootElement, JsonGenerator generator, StringWriter out) throws JsonGenerationException, IOException{ - generator.writeStartObject(); - generator.writeStringField(PROP_NAMESPACE, rootElement.getNamespaceURI()); - serializeToJson(node, rootElement, rootElement.getNamespaceURI(), generator); - generator.writeEndObject(); - generator.flush(); - generator.close(); - return out.toString(); - } - - - String objectNs = null; - private void serializeToJson(XNode node, QName nodeName, String globalNamespace, JsonGenerator generator) throws JsonGenerationException, IOException{ - - if (node instanceof MapXNode){ - serializerFromMap((MapXNode) node, nodeName, globalNamespace, generator); - } else if (node instanceof ListXNode){ - serializeFromList((ListXNode) node, nodeName, globalNamespace, generator); - } else if (node instanceof PrimitiveXNode){ - serializeFromPrimitive((PrimitiveXNode) node, nodeName, generator); - } - } - - - private void serializerFromMap(MapXNode map, QName nodeName, String globalNamespace, JsonGenerator generator) throws JsonGenerationException, IOException{ - if (nodeName == null){ - generator.writeStartObject(); - } else{ - generator.writeObjectFieldStart(nodeName.getLocalPart()); - } - - // this is used only by first iteration..we need to set namespace right after the root element - if (StringUtils.isBlank(globalNamespace)){ - globalNamespace = nodeName.getNamespaceURI(); - generator.writeStringField(PROP_NAMESPACE, globalNamespace); - } - - - - Iterator> subnodes = map.entrySet().iterator(); - while (subnodes.hasNext()){ - Entry subNode = subnodes.next(); - globalNamespace = serializeNsIfNeeded(subNode.getKey(), globalNamespace, generator); - serializeToJson(subNode.getValue(), subNode. getKey(), globalNamespace, generator); - } - generator.writeEndObject(); - } - - private void serializeFromList(ListXNode list, QName nodeName, String globalNamespace, JsonGenerator generator) throws JsonGenerationException, IOException{ - ListIterator sublist = list.listIterator(); - generator.writeArrayFieldStart(nodeName.getLocalPart()); - while (sublist.hasNext()){ - serializeToJson(sublist.next(), null, globalNamespace, generator); - } - generator.writeEndArray(); - } - - private void serializeFromPrimitive(PrimitiveXNode primitive, QName nodeName, JsonGenerator generator) throws JsonGenerationException, IOException{ - - if (primitive.isExplicitTypeDeclaration()) { - generator.writeStartObject(); - generator.writeFieldName(TYPE_DEFINITION); - generator.writeObject(primitive.getTypeQName()); - - generator.writeObjectField(VALUE_FIELD, primitive.getValue()); - generator.writeEndObject(); - } else { - - if (nodeName == null) { - generator.writeObject(primitive.getValue()); - } else { -// if (StringUtils.isNotBlank(nodeName.getNamespaceURI()) -// && !nodeName.getNamespaceURI().equals(objectNs)) { -// objectNs = nodeName.getNamespaceURI(); -// } - generator.writeObjectField(nodeName.getLocalPart(), primitive.getValue()); - } - } - } - - private String serializeNsIfNeeded(QName subNodeName, String globalNamespace, JsonGenerator generator) throws JsonGenerationException, IOException{ - if (subNodeName == null){ - return globalNamespace; - } - String subNodeNs = subNodeName.getNamespaceURI(); - if (StringUtils.isNotEmpty(subNodeNs)){ - if (!subNodeNs.equals(globalNamespace)){ - globalNamespace = subNodeNs; - generator.writeStringField(PROP_NAMESPACE, globalNamespace); - - } - } - return globalNamespace; - } - //------------------------END OF METHODS FOR SERIALIZATION ------------------------------- - - //------------------------ METHODS FOR PARSING ------------------------------------------- - public XNode parseObject(JsonParser parser) throws SchemaException{ - - ObjectMapper mapper = new ObjectMapper(); - SimpleModule sm = new SimpleModule(); - sm.addDeserializer(QName.class, new QNameDeserializer()); - sm.addDeserializer(ItemPath.class, new ItemPathDeserializer()); - - mapper.registerModule(sm); - - JsonNode obj = null; - try { -// String globalNs = (String) parser.getObjectId(); - parser.setCodec(mapper); - -// TokenBuffer tb = parser.readValueAs(TokenBuffer.class); -// JsonParser p = tb.asParser(); -// System.out.println("======================== " + p.getObjectId()); -// System.out.println("======================== " + p.getTypeId()); -// tb. -// tb.firstToken().asParser().getCurrentTokenId(); -// JsonToken. -// YAMLFactory f = new YAMLFactory(); -// f. - - int i = parser.getCurrentTokenId(); - //System.out.println("id token : " + i); -// Object o =parser.readValueAsTree(); - - System.out.println("id: " + JsonTokenId.ID_START_OBJECT); - JsonToken t = parser.getCurrentToken(); - //System.out.println("cuurent: " + t); - - JsonToken nt = parser.nextToken(); - //System.out.println("cuurent: " + nt); - -// JsonToken t = parser.getCurrentToken(); -// System.out.println("cuurent: " + t); -// mapper.readTree(jp) -// obj = ((YAMLParser)parser).readValueAs(JsonNode.class); - - - - RootXNode xmap = new RootXNode(); - -// Iterator> fields = obj.fields(); -// obj. - -// nt. -// while (fields.hasNext()){ -// Entry field = fields.next(); -// String fieldName = field.getKey(); -// -// JsonNode globalNsNode = field.getValue().get(PROP_NAMESPACE); -// if (globalNsNode == null){ -// throw new SchemaException("No global ns"); -// } -// String globalNs = globalNsNode.asText(); -// -// if (fieldName == null){ -// throw new SchemaException("cannot obtain type"); -// } -// - QName rootElement = new QName("http://midpoint.evolveum.com/xml/ns/test/foo-1.xsd", "user"); -// ((RootXNode) xmap).setRootElementName(rootElement); - - parseJsonObject(xmap, rootElement, null, parser); - -// } - return xmap; - } catch (JsonParseException e) { - throw new SchemaException("Cannot parse from JSON: " + e.getMessage(), e); - } catch (JsonMappingException e) { - throw new SchemaException("Cannot parse from JSON: " + e.getMessage(), e); - } catch (IOException e) { - throw new SchemaException("Cannot parse from JSON: " + e.getMessage(), e); - } - } - - private void parseJsonObject(XNode xmap, QName propertyName, final JsonNode obj, final JsonParser parser) throws SchemaException { - try{ - JsonToken token = parser.nextToken(); - //System.out.println("token " + token); - JsonToken current = parser.getCurrentToken(); - //System.out.println("current " + current); - JsonToken value = parser.nextValue(); - //System.out.println("value " + value); - if (token == null){ - token = parser.nextToken(); - } - switch (token){ - case START_OBJECT: - parseToMap(obj, propertyName, xmap, parser); - break; - case START_ARRAY: - parseToList(obj, propertyName, xmap, parser); - break; - default: - parseToPrimitive(obj, propertyName, xmap, parser); - } - } catch (Exception e){ - //TODO: - throw new SchemaException("Error ", e); - } -// switch (obj.getNodeType()){ -// case OBJECT: -// parseToMap(obj, propertyName, xmap, parser); -// break; -// case ARRAY: -// parseToList(obj, propertyName, xmap, parser); -// break; -// default: -// parseToPrimitive(obj, propertyName, xmap, parser); -// } - - } - - private void parseToMap(JsonNode node, QName propertyName, XNode parent, JsonParser parser) throws SchemaException{ - Iterator> fields = node.fields(); - String nsToUse = getNamespace(node, propertyName.getNamespaceURI()); - - MapXNode subMap = new MapXNode(); - if (parent instanceof RootXNode){ - ((RootXNode) parent).setSubnode(subMap); - } else { - addXNode(propertyName, parent, subMap); - } - - while (fields.hasNext()){ - Entry field = fields.next(); - QName childrenName = new QName(nsToUse, field.getKey()); - if (isSpecial(field.getValue())){ - parseSpecial(subMap, childrenName, field.getValue(), parser); - continue; - } - parseJsonObject(subMap, childrenName, field.getValue(), parser); - } - } - - private void parseToList(JsonNode node, QName propertyName, XNode parent, JsonParser parser) throws SchemaException{ - Iterator elements = node.elements(); - ListXNode listNode = new ListXNode(); - addXNode(propertyName, parent, listNode); - while (elements.hasNext()){ - JsonNode element = elements.next(); - if (isSpecial(element)){ - parseSpecial(listNode, propertyName, element, parser); - continue; - } - parseJsonObject(listNode, propertyName, element, parser); - } - } - - private void parseToPrimitive(JsonNode node, QName propertyName, XNode parent, JsonParser parser){ - if (propertyName.getLocalPart().equals(PROP_NAMESPACE)){ - return; - } - PrimitiveXNode primitive = createPrimitiveXNode(node, parser); - addXNode(propertyName, parent, primitive); - } - - private void parseSpecial(XNode xmap, QName propertyName, JsonNode obj, final JsonParser parser) throws SchemaException{ - //System.out.println("special"); - QName typeDefinition = extractTypeName(obj, parser); - - if (typeDefinition != null){ - obj = obj.get(VALUE_FIELD); - } - - PrimitiveXNode primitive = createPrimitiveXNode(obj, parser, typeDefinition); - addXNode(propertyName, xmap, primitive); - } - - //---------------------------END OF METHODS FOR PARSING ---------------------------------------- - - //------------------------------ HELPER METHODS ------------------------------------------------ - private PrimitiveXNode createPrimitiveXNode(JsonNode node, JsonParser parser){ - return createPrimitiveXNode(node, parser, null); - } - - private PrimitiveXNode createPrimitiveXNode(JsonNode node, JsonParser parser, QName typeDefinition){ - PrimitiveXNode primitive = new PrimitiveXNode(); - boolean f = parser.canReadObjectId(); - //System.out.println("can read obj id: " + f); - //try{ - //System.out.println("obj id: " + parser.getObjectId()); - //System.out.println("type id: " + parser.getTypeId()); - // - //} catch (Exception e){ - // throw new IllegalStateException(e); - //} - ValueParser vp = new JsonValueParser(parser, node); - primitive.setValueParser(vp); - if (typeDefinition != null){ - primitive.setExplicitTypeDeclaration(true); - primitive.setTypeQName(typeDefinition); - } - return primitive; - } - - private String getNamespace(JsonNode obj, String ns){ - JsonNode objNsNode = obj.get(PROP_NAMESPACE); - - if (objNsNode == null){ - return ns; - } - - String objNs = objNsNode.asText(); - - if (!objNs.equals(ns)){ - return objNs; - } - return ns; - } - - private boolean isSpecial(JsonNode next){ - if (next.isObject()) { - Iterator nextFields = next.fieldNames(); - while (nextFields.hasNext()) { - String str = nextFields.next(); - if (str.startsWith("@") && !str.equals(PROP_NAMESPACE)) { - return true; - } - } - } - return false; - } - - private QName extractTypeName(JsonNode node, JsonParser parser) throws SchemaException{ - if (node.has(TYPE_DEFINITION)){ - //System.out.println("has type def"); - JsonNode typeDef = node.get(TYPE_DEFINITION); - ObjectMapper m = (ObjectMapper) parser.getCodec(); - ObjectReader r = m.reader(QName.class); - - try { - return r.readValue(typeDef); - } catch (IOException e) { - throw new SchemaException("Cannot extract type definition " + e.getMessage(), e); - } - } - return null; - } - - - private void addXNode(QName fieldName, XNode parent, XNode children) { - if (parent instanceof MapXNode) { - ((MapXNode) parent).put(fieldName, children); - } else if (parent instanceof ListXNode) { - ((ListXNode) parent).add(children); - } - } - - public abstract JsonGenerator createGenerator(StringWriter out) throws SchemaException; -// private JsonGenerator createJsonGenerator(StringWriter out) throws SchemaException{ -// try { -// JsonFactory factory = new JsonFactory(); -// JsonGenerator generator = factory.createGenerator(out); -// generator.setPrettyPrinter(new DefaultPrettyPrinter()); -// generator.setCodec(configureMapperForSerialization()); -// return generator; -// } catch (IOException ex){ -// throw new SchemaException("Schema error during serializing to JSON.", ex); -// } -// -// } -// -// private ObjectMapper configureMapperForSerialization(){ -// ObjectMapper mapper = new ObjectMapper(); -// mapper.configure(SerializationFeature.WRITE_NULL_MAP_VALUES, false); -// mapper.setSerializationInclusion(Include.NON_NULL); -// mapper.registerModule(createSerializerModule()); -// return mapper; -// } -// -// private Module createSerializerModule(){ -// SimpleModule module = new SimpleModule("MidpointModule", new Version(0, 0, 0, "aa")); -// module.addSerializer(QName.class, new QNameSerializer()); -// module.addSerializer(PolyString.class, new PolyStringSerializer()); -// module.addSerializer(ItemPath.class, new ItemPathSerializer()); -// module.addSerializer(JAXBElement.class, new JaxbElementSerializer()); -// return module; -// } - - - -} diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/json/PrismJasonProcessorDeprecated.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/json/PrismJasonProcessorDeprecated.java deleted file mode 100644 index a42a2ad50ad..00000000000 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/json/PrismJasonProcessorDeprecated.java +++ /dev/null @@ -1,837 +0,0 @@ -/* - * Copyright (c) 2013-2015 Evolveum - * - * 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 com.evolveum.midpoint.prism.json; - -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.lang.reflect.Field; -import java.util.Collection; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map.Entry; - -import javax.xml.namespace.QName; - -import org.w3c.dom.Element; - -import com.evolveum.midpoint.prism.Containerable; -import com.evolveum.midpoint.prism.Item; -import com.evolveum.midpoint.prism.ItemDefinition; -import com.evolveum.midpoint.prism.Objectable; -import com.evolveum.midpoint.prism.PrismContainer; -import com.evolveum.midpoint.prism.PrismContainerDefinition; -import com.evolveum.midpoint.prism.PrismContainerValue; -import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.PrismObject; -import com.evolveum.midpoint.prism.PrismObjectDefinition; -import com.evolveum.midpoint.prism.PrismProperty; -import com.evolveum.midpoint.prism.PrismPropertyDefinition; -import com.evolveum.midpoint.prism.PrismPropertyValue; -import com.evolveum.midpoint.prism.PrismReference; -import com.evolveum.midpoint.prism.PrismReferenceDefinition; -import com.evolveum.midpoint.prism.PrismReferenceValue; -import com.evolveum.midpoint.prism.PrismValue; -import com.evolveum.midpoint.prism.parser.json.PolyStringSerializer; -import com.evolveum.midpoint.prism.parser.json.QNameDeserializer; -import com.evolveum.midpoint.prism.parser.json.QNameSerializer; -import com.evolveum.midpoint.prism.path.ItemPath; -import com.evolveum.midpoint.prism.polystring.PolyString; -import com.evolveum.midpoint.prism.schema.PrismSchema; -import com.evolveum.midpoint.prism.schema.SchemaRegistry; -import com.evolveum.midpoint.prism.util.JavaTypeConverter; -import com.evolveum.midpoint.prism.util.PrismUtil; -import com.evolveum.midpoint.prism.xml.XsdTypeMapper; -import com.evolveum.midpoint.util.DOMUtil; -import com.evolveum.midpoint.util.exception.SchemaException; -import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.fasterxml.jackson.core.JsonEncoding; -import com.fasterxml.jackson.core.JsonFactory; -import com.fasterxml.jackson.core.JsonGenerationException; -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.core.JsonParseException; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.core.PrettyPrinter; -import com.fasterxml.jackson.core.Version; -import com.fasterxml.jackson.core.util.DefaultPrettyPrinter; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.JsonMappingException; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.ObjectReader; -import com.fasterxml.jackson.databind.ObjectWriter; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.databind.module.SimpleModule; -import com.fasterxml.jackson.module.jaxb.JaxbAnnotationIntrospector; -import com.fasterxml.jackson.module.jaxb.deser.DomElementJsonDeserializer; - -@Deprecated -public class PrismJasonProcessorDeprecated { - - private SchemaRegistry schemaRegistry; - private PrismContext prismContext; -// private PrismSchema prismSchema; - - - public PrismSchema getPrismSchema(Class clazz) { - - return schemaRegistry.findSchemaByCompileTimeClass(clazz); -// -// return prismSchema; - } - - public PrismContext getPrismContext() { - return prismContext; - } - - public void setPrismContext(PrismContext prismContext) { - this.prismContext = prismContext; - } - - public void setSchemaRegistry(SchemaRegistry schemaRegistry) { - this.schemaRegistry = schemaRegistry; - } - - public SchemaRegistry getSchemaRegistry() { - return schemaRegistry; - } - - private PrismSchema prismSchema = null; - - public PrismObject parseObject(File file, Class valueType) throws IOException, SchemaException{ - ObjectMapper mapper = new ObjectMapper(); -// mapper.configure(Feature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT, false); - -// SimpleModule module = new SimpleModule("MidpointModule", new Version(0, 0, 0, "aa")); -// module.addDeserializer(QName.class, new QNameDeserializer()); -// module.addSerializer(PolyString.class, new PolyStringSerializer()); -//// module.addSerializer(Node.class, new DOMSerializer()); -// module.addSerializer(Element.class, new DOMSerializer()); -// mapper.registerModule(module); - -// mapper.configure(Feature.UNWRAP_ROOT_VALUE, true); - ObjectReader reader = mapper.reader(valueType); - - JsonFactory factory = new JsonFactory(); - factory.createJsonParser(file); -// reader. - - T object = reader.readValue(file); - PrismObjectDefinition def = schemaRegistry.findObjectDefinitionByCompileTimeClass(valueType); - - PrismObject prismObj = object.asPrismObject(); -// prismObj.setDefinition(def); -// prismObj.applyDefinition(def); -// prismContext.adopt(prismObj.asObjectable()); - - //System.out.println("object: \n" + prismObj.debugDump()); - - return prismObj; - } - - private void serializeToJson(PrismContainerValue val, JsonGenerator generator) throws JsonGenerationException, IOException{ -// generator.writeStartObject(); -// if (val != null && val.getPath() != null && val.getPath().last() != null){ -//// generator.writeFieldName(ItemPath.getName(val.getPath().last()).getLocalPart()); -// -// }else{ -// generator.writeFieldName(val.getContainer().getCompileTimeClass().getSimpleName()); -// } - generator.writeStartObject(); - - for (Item item : val.getItems()){ -// generator.writeFieldName(item.getElementName().getLocalPart()); - - if (item.isEmpty()){ - continue; - } - generator.writeFieldName(item.getElementName().getLocalPart()); - -// PrismConstants. - if (item.getValues().size() > 1){ - generator.writeStartArray(); - for (PrismValue v : item.getValues()){ - serializeValue(v, generator); - } - generator.writeEndArray(); - continue; - } -// - serializeValue(item.getValues().iterator().next(), generator); - -// } -// generator.writeEndArray(); - } - generator.writeEndObject(); - } - - private void serializeValue(PrismValue v, JsonGenerator generator) throws JsonProcessingException, IOException{ - if (v instanceof PrismPropertyValue){ - Object o = ((PrismPropertyValue) v).getValue(); - serializeProperty(o, generator); -// generator.writeObject(o); -// generator.writeString("\n"); - } - if (v instanceof PrismReferenceValue){ - generator.writeStartObject(); - String oid = ((PrismReferenceValue) v).getOid(); - generator.writeFieldName("oid"); - generator.writeString(oid); -// generator.writeString("\n"); - QName qname = ((PrismReferenceValue) v).getTargetType(); - if (qname != null){ - generator.writeFieldName("taretType"); - generator.writeString(qname.toString()); - - } - generator.writeEndObject(); -// generator.writeString("\n"); - } - if (v instanceof PrismContainerValue){ -// generator.writeString("\n"); - serializeToJson((PrismContainerValue) v, generator); -// generator.writeEndObject(); - } - } - - private void serializeProperty(Object o, JsonGenerator generator) throws JsonGenerationException, IOException{ -// if (o instanceof PolyString){ -// generator.writeStartObject(); -// generator.writeStringField("orig", ((PolyString) o).getOrig()); -// generator.writeStringField("norm", ((PolyString) o).getNorm()); -// generator.writeEndObject(); -// } else if (o instanceof Element){ -// serializeElementProperty(o, generator); -// } else if (o instanceof QName){ -// generator.writeStartObject(); -// generator.writeStringField("namespace", ((QName) o).getNamespaceURI()); -// generator.writeStringField("localPart", ((QName) o).getLocalPart()); -// generator.writeEndObject(); -// } else{ -//// TypeVariable[] typeVariable = o.getClass().getTypeParameters(); -// if (containsElement(o)){ -// -// } else{ - generator.writeObject(o); -// } -// } - } - - private boolean containsElement(Object o){ - Field[] fields = o.getClass().getFields(); - for (int i = 0; i < fields.length; i++){ - Field field = fields[i]; - if (Element.class.isAssignableFrom(field.getType())){ - return true; - } - } - return false; - } - - private void serializeElementProperty(Object o, JsonGenerator generator) throws JsonGenerationException, IOException { - Element rootNode = (Element) o; - QName root = DOMUtil.getQName(rootNode); - -// generator.writeFieldName(root.getLocalPart()); - generator.writeStartObject(); - List children = DOMUtil.getChildElements(rootNode, root); - for (Element child : children){ -// Node child = children.item(i); - - if (DOMUtil.hasChildElements(child)){ - serializeElementProperty(child, generator); - } else{ - QName childName = DOMUtil.getQName(child); -// if (child.getNodeType() != Node.ATTRIBUTE_NODE){ - generator.writeStringField(childName.getLocalPart(), child.getTextContent()); -// } - } - - } - generator.writeEndObject(); - - } - - public void serializeToJson(PrismObject object, OutputStream out) throws IOException, SchemaException{ - ObjectMapper mapper = new ObjectMapper(); - SimpleModule module = new SimpleModule("MidpointModule", new Version(0, 0, 0, "aa")); -// JaxbAnnotationModule module = new JaxbAnnotationModule(); -// SetupContext ctx = -// module.setupModule(mapper); - module.addSerializer(QName.class, new QNameSerializer()); - module.addSerializer(PolyString.class, new PolyStringSerializer()); -// module.addSerializer(Node.class, new DOMSerializer()); -// module.addSerializer(Element.class, new DOMSerializer()); - -// JaxbElementSerializer jaxbSerializer = new JaxbElementSerializer(); -// module.addSerializer(JAXBElement.class, jaxbSerializer); -// module.addSerializer(DataHandler.class, new DataHandlerJsonSerializer()); -// module.addSerializer(Element.class, new DomElementJsonSerializer()); - mapper.registerModule(module); - -// jaxbModule.addSerializer(new DataHandlerJsonSerializer()); -// jaxbModule.addSerializer(Element.class, new DomElementJsonSerializer()); -// JaxbAnnotationIntrospector introspector = new JaxbAnnotationIntrospector(); -// mapper.getSerializationConfig().setAnnotationIntrospector(introspector); - mapper.setAnnotationIntrospector(new JaxbAnnotationIntrospector()); -// mapper.registerModule(jaxbModule); -// mapper.configure(com.fasterxml.jackson.c, state) -// Feature. - mapper.configure(SerializationFeature.WRITE_NULL_MAP_VALUES, false); - mapper.setSerializationInclusion(Include.NON_NULL); -// mapper.configure(SerializationFeature.WRITE_NULL_PROPERTIES, false); -// mapper.configure(org.codehaus.jackson.map.SerializationConfig.Feature.WRITE_EMPTY_JSON_ARRAYS, false); -// mapper.configure(org.codehaus.jackson.map.SerializationConfig.Feature.WRITE_ENUMS_USING_TO_STRING, true); - - ObjectWriter writer = mapper.writer(); -// JsonGenerator jsonGenerator = new J - JsonFactory factory = new JsonFactory(); -// mapper.configure(org.codehaus.jackson.JsonGenerator.Feature.FLUSH_PASSED_TO_STREAM, true); - JsonGenerator generator = factory.createGenerator(out , JsonEncoding.UTF8); - - PrettyPrinter pp = new DefaultPrettyPrinter(); -// pp. - generator.setPrettyPrinter(pp); - generator.setCodec(mapper); -// generator.writeObject(object.asObjectable()); - - -for (PrismContainerValue pcv : object.getValues()){ - - -serializeToJson(pcv, generator); - - } -generator.flush(); -generator.close(); - } - - JsonParser parser = null; - public PrismObject parseObject(InputStream inputStream, Class valueType) throws IOException, SchemaException{ - - ObjectMapper mapper = new ObjectMapper(); - JsonNode obj = null; - try { - - JsonFactory facotry = new JsonFactory(); - parser = facotry.createJsonParser(inputStream); - parser.setCodec(mapper); - - obj = parser.readValueAs(JsonNode.class); - - PrismSchema schema = getPrismSchema(valueType); - - prismSchema = schema; - if (schema == null) { - throw new SchemaException("No schema for namespace " + valueType); - } - - JsonNode type = obj.get("_type"); - String typeValue = null; - - PrismObjectDefinition objectDefinition = null; - if (type != null){ - typeValue = type.asText(); -// QName objQname = new QName(defaultNamespace, typeValue); -// objectDefinition = schema.findObjectDefinitionByElementName(valueType); - } else { - objectDefinition = schema.findObjectDefinitionByCompileTimeClass(valueType); - } - - -// if (objectDefinition == null) { -// throw new SchemaException("No definition found for type " + new QName(defaultNamespace, typeValue) + " (as defined by xsi:type)"); -// } - PrismObject object = parseObject(obj, objectDefinition.getName(), objectDefinition.getNamespace(), objectDefinition); - return object; - } catch (JsonParseException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - throw e; - } catch (JsonMappingException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - throw e; - } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - throw e; - } - -// return null; - - } - - private PrismObject parseObject(JsonNode jsonObject, QName itemName, String defaultNamespace, - PrismObjectDefinition objectDefinition) throws SchemaException, JsonParseException, JsonMappingException, IOException { - - PrismObject object = (PrismObject) parsePrismContainer(jsonObject, itemName, defaultNamespace, objectDefinition); - - if (jsonObject.findValue("_oid") != null){ - String oid = jsonObject.findValue("_oid").asText(); - object.setOid(oid); - } - - if (jsonObject.findValue("_version") != null){ - - String version = jsonObject.findValue("_version").asText(); - object.setVersion(version); - - } - return object; - } - - private PrismContainer parsePrismContainer(JsonNode jsonObject, QName itemName, String defaultNamespace, PrismContainerDefinition containerDefinition) throws SchemaException, JsonParseException, JsonMappingException, IOException { - PrismContainer container = containerDefinition.instantiate(itemName); - - PrismContainerValue pval = new PrismContainerValue(null, null, container, null, null, prismContext); // TODO set concreteType (if this code would be really used) - - Collection newContainerItems = parsePrismContainerItems(jsonObject, - containerDefinition, defaultNamespace); - addValuesToContainerValue(pval, newContainerItems); - container.add(pval); - - return container; - } - - private void addValuesToContainerValue(PrismContainerValue containerValue, - Collection newContainerItems) throws SchemaException { - for (Item newItem : newContainerItems) { - if (newItem == null){ - //System.out.println("new item name null"); - continue; - } - Item existingItem = containerValue.findItem(newItem.getElementName()); - if (existingItem == null) { - containerValue.add(newItem); - } else { - for (PrismValue newPVal : newItem.getValues()) { - existingItem.add(newPVal.clone()); - } - } - } - } - - protected Collection> parsePrismContainerItems(JsonNode jsonObject, - PrismContainerDefinition containerDefinition, String defaultNamespace) - throws SchemaException, JsonParseException, JsonMappingException, IOException { - - // TODO: more robustness in handling schema violations (min/max - // constraints, etc.) - - Collection> props = new HashSet<>(); - - // Iterate over all the XML elements there. Each element is - // an item value. - Iterator> items = jsonObject.fields(); - -// String namespace = null; -// JsonNode defaultNs = jsonObject.findValue("_ns"); -// if (defaultNs != null){ -// defaultNamespace = defaultNs.getTextValue(); -// } - while (items.hasNext()){ - Entry item = items.next(); - - //not items, will be handled differently -// if (item.getKey() != null && item.getKey().startsWith("_")){ -// continue; -// } -// -// JsonNode ns = item.getValue().findValue("_ns"); -// JsonNode nsw = item.getValue().get("_ns"); -// -// if (nsw != null){ -// defaultNamespace = nsw.getTextValue(); -// } -// -// PrismSchema schema = getPrismSchema(containerDefinition.get); -// ItemDefinition def = prismSchema.findItemDefinition(item.getKey(), containerDefinition.getTypeClass()); - - - if (item.getKey().equals("id") || item.getKey().equals("any")){ - continue; - } - QName itemQName = new QName(defaultNamespace, item.getKey()); - - ItemDefinition def = locateItemDefinition(containerDefinition, itemQName); - - if (def == null) { - if (containerDefinition.isRuntimeSchema()) { - // No definition for item, but the schema is runtime. the - // definition may come later. - // Null is OK here. - } else { -// continue; -// throw new SchemaException("Item " + itemQName + " has no definition", itemQName); - } -// continue; - } - - -// if (item.getValue().isObject()){ -// parsePrismContainerItems(item.getValue(), containerDefinition, defaultNamespace); -// } else{ - Item parsedItem = parseItem(item.getValue(), itemQName, defaultNamespace, def); - props.add(parsedItem); -// } - } - - return props; - } - - - private ItemDefinition locateItemDefinition( - PrismContainerDefinition containerDefinition, QName itemQname) - throws SchemaException { - ItemDefinition def = containerDefinition.findItemDefinition(itemQname); - if (def != null) { - return def; - } - -// if (containerDefinition.isRuntimeSchema()) { -// // Try to locate global definition in any of the schemas -// def = getPrismContext().getSchemaRegistry().resolveGlobalItemDefinition(itemQname); -// } - return def; - } - - private ItemDefinition locateItemDefinition( - PrismContainerDefinition containerDefinition, ItemPath itemQname) - throws SchemaException { - ItemDefinition def = containerDefinition.findItemDefinition(itemQname); - if (def != null) { - return def; - } - -// if (containerDefinition.isRuntimeSchema()) { -// // Try to locate global definition in any of the schemas -// def = getPrismContext().getSchemaRegistry().resolveGlobalItemDefinition(itemQname); -// } - return def; - } - - public Item parseItem(JsonNode values, QName itemName, String defaultNamespace, ItemDefinition def) - throws SchemaException, JsonParseException, JsonMappingException, IOException { - if (def == null) { - // Assume property in a container with runtime definition - return (Item) parsePrismPropertyRaw(values, itemName); - } - if (def instanceof PrismContainerDefinition) { - return (Item) parsePrismContainer(values, itemName, defaultNamespace, (PrismContainerDefinition) def); - } else if (def instanceof PrismPropertyDefinition) { - return (Item) parsePrismProperty(values, itemName, (PrismPropertyDefinition) def); - } - if (def instanceof PrismReferenceDefinition) { - return (Item) parsePrismReference(values, itemName, (PrismReferenceDefinition) def); - } else { - throw new IllegalArgumentException("Attempt to parse unknown definition type " + def.getClass().getName()); - } - } - - private PrismProperty parsePrismPropertyRaw(JsonNode values, QName itemName) - throws SchemaException { - return null; - } - - public PrismProperty parsePrismProperty(JsonNode values, QName propName, - PrismPropertyDefinition propertyDefinition) throws SchemaException, JsonParseException, JsonMappingException, IOException { - if (values.isNull()) { - return null; - } - PrismProperty prop = propertyDefinition.instantiate(propName); - - if (!propertyDefinition.isMultiValue() && values.isArray()) { - throw new SchemaException("Attempt to store multiple values in single-valued property " + propName); - } - if (values.isArray()){ - Iterator vals = values.elements(); - while (vals.hasNext()){ - JsonNode val = vals.next(); - if (val != null){ - T realValue = parsePrismPropertyRealValue(val, propertyDefinition); - if (realValue != null) { - prop.add(new PrismPropertyValue(realValue)); - } - } - } -// } else if (values.isObject()){ -// Iterator> vals = values.getFields(); -// while (vals.hasNext()){ -// Entry val = vals.next(); -// -// if (val != null){ -// if (val.getValue().isObject()){ -// QName itemQName = new QName(propertyDefinition.getNamespace(), val.getKey()); -// ItemDefinition def = locateItemDefinition(containerDefinition, new ItemPath(prop.getElementName(), itemQName)); -// T realValue = parseAtomicValue(val.getValue(), (PrismPropertyDefinition) def); -// if (realValue != null) { -// prop.add(new PrismPropertyValue(realValue)); -// } -// }else{ -// T realValue = parseAtomicValue(values, propertyDefinition); -// if (realValue != null) { -// prop.add(new PrismPropertyValue(realValue)); -// } -// } -// } -// } - } else { - if (values != null){ - T realValue = parsePrismPropertyRealValue(values, propertyDefinition); - if (realValue != null) { - prop.add(new PrismPropertyValue(realValue)); - } - } - } - - return prop; - } - - public T parsePrismPropertyRealValue(JsonNode valueElement, PrismPropertyDefinition propertyDefinition) - throws SchemaException, JsonParseException, JsonMappingException, IOException { - QName typeName = propertyDefinition.getTypeName(); -// PrismJaxbProcessor jaxbProcessor = getPrismContext().getPrismJaxbProcessor(); - Object realValue = null; - - if (propertyDefinition.getTypeName().getLocalPart().equals("any")){ - return null; - } - - Class expectedJavaType = XsdTypeMapper.toJavaType(propertyDefinition.getTypeName()); - if (expectedJavaType == null) { - expectedJavaType = (Class) schemaRegistry.determineCompileTimeClass(propertyDefinition.getTypeName()); - } - - - Object value = null; - ObjectMapper mapper = new ObjectMapper(); - SimpleModule module = new SimpleModule("asd", new Version(0, 0, 0, "vvv")); - module.addDeserializer(QName.class, new QNameDeserializer()); - module.addDeserializer(Element.class, new DomElementJsonDeserializer()); -// module.addDeserializer(, deser) -// JaxbElementDeserializer jaxbDeserializer = new JaxbElementDeserializer(); -// jaxbDeserializer.setExpectedClass(expectedJavaType); -// jaxbDeserializer.setNode(valueElement); -// jaxbDeserializer.setPrismSchema(prismSchema); -// module.addDeserializer(JAXBElement.class, jaxbDeserializer); -// module.addDeserializer(Element.class, new DOMDeserializer()); - mapper.setAnnotationIntrospector(new JaxbAnnotationIntrospector()); - mapper.registerModule(module); -// JaxbAnnotationModule jaxbModule = new JaxbAnnotationModule(); -// mapper.registerModule(jaxbModule); -// mapper. -// module. - mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); - mapper.configure(DeserializationFeature.READ_ENUMS_USING_TO_STRING, false); -// mapper.configure(Feature.USE_GETTERS_AS_SETTERS, true); - - //System.out.println("expected java type: " + expectedJavaType.getSimpleName()); -// PrismJaxbProcessor jaxbProcessor = prismContext.getPrismJaxbProcessor(); - -// mapper.getTypeFactory(). - - - -// if (jaxbProcessor.canConvert(expectedJavaType)){ -// ObjectReader r = mapper.reader(JAXBElement.class); -// value = r.readValue(valueElement); -// JAXBElement e = new JAXBElement(typeName, expectedJavaType, value); -// System.out.println("cal convert"); -// value = r.readValue(valueElement); -// } else - if (typeName.equals(PolyStringType.COMPLEX_TYPE)) { - ObjectReader r = mapper.reader(PolyStringType.class); - - value = r.readValue(valueElement); -// } -// else if (Element.class.isAssignableFrom(expectedJavaType)){ -// Document doc = DOMUtil.getDocument(); -// readElementValue(doc, valueElement, null); - } else{ - ObjectReader r = mapper.reader(expectedJavaType); - value = r.readValue(valueElement); - } -// Object value = null; -// if (expectedJavaType.equals(PolyString.class)){ -// if (valueElement.isObject()){ -// JsonNode orig = valueElement.get("orig"); -// JsonNode norm = valueElement.get("norm"); -// value = new PolyString(orig.asText(), norm.asText()); -// System.out.println("orig: " + orig.asText() +" norm: " + norm.asText()); -// } -// -// } -// - realValue = JavaTypeConverter.convert(expectedJavaType, value); - - postProcessPropertyRealValue((T) realValue); - return (T) realValue; - } - -// private void readElementValue(Document doc, JsonNode valueElement, Element root) { -// Iterator> elements = valueElement.getFields(); -// while (elements.hasNext()){ -// Entry element = elements.next(); -// Element e = doc.createElement(element.getKey()); -// if (root != null){ -// root.appendChild(e); -// } -// if (element.getValue().isObject()){ -// readElementValue(doc, element.getValue(), e); -// } else{ -// e.setTextContent(valueElement.asText()); -// } -// -// } -// -// } - - private void postProcessPropertyRealValue(T realValue) { - if (realValue == null) { - return; - } - PrismUtil.recomputeRealValue(realValue, getPrismContext()); - } - - public PrismReference parsePrismReference(JsonNode values, QName propName, - PrismReferenceDefinition referenceDefinition) throws SchemaException, JsonParseException, JsonMappingException, IOException { - if (values == null) { - return null; - } - PrismReference ref = referenceDefinition.instantiate(); - - if (!referenceDefinition.isMultiValue() && values.isArray()) { - throw new SchemaException("Attempt to store multiple values in single-valued property " + propName); - } - - if (propName.equals(referenceDefinition.getName())) { - // This is "real" reference (oid type and nothing more) - ref.add(parseReferenceValue(values, referenceDefinition.getNamespace())); - } else { - // This is a composite object (complete object stored inside - // reference) - ref.add(parseReferenceAsCompositeObject(values, referenceDefinition)); - } - return ref; - } - - public PrismReferenceValue parseReferenceValue(JsonNode value, String defaultNs) { - String oid = null; - if (value.get("_oid") != null){ - oid = value.get("_oid").asText(); - } - - - QName type = null; - if (value.get("_type") != null){ - type = new QName(defaultNs, value.get("_type").asText()); - } -// if (type != null) { -// DOMUtil.validateNonEmptyQName(type, " in reference type in " + DOMUtil.getQName(element)); -// } - PrismReferenceValue refVal = new PrismReferenceValue(oid); - refVal.setTargetType(type); - - String description = null; - if (value.get("description") != null){ - description = value.get("description").asText(); - } - - refVal.setDescription(description); -// QName relationAttribute = DOMUtil.getQNameAttribute(element, PrismConstants.ATTRIBUTE_RELATION_LOCAL_NAME); -// if (relationAttribute != null) { -// DOMUtil.validateNonEmptyQName(relationAttribute, " in reference type in " + DOMUtil.getQName(element)); -// } -// refVal.setRelation(relationAttribute); - -// Element descriptionElement = DOMUtil.getChildElement(element, PrismConstants.ELEMENT_DESCRIPTION_LOCAL_NAME); -// if (descriptionElement != null) { -// refVal.setDescription(descriptionElement.getTextContent()); -// } -// Element filterElement = DOMUtil.getChildElement(element, PrismConstants.ELEMENT_FILTER_LOCAL_NAME); -// if (filterElement != null) { -// refVal.setFilter(DOMUtil.getFirstChildElement(filterElement)); -// } - - return refVal; - } - - private PrismReferenceValue parseReferenceAsCompositeObject(JsonNode valueElement, - PrismReferenceDefinition referenceDefinition) throws SchemaException, JsonParseException, JsonMappingException, IOException { - QName targetTypeName = referenceDefinition.getTargetTypeName(); - PrismObjectDefinition schemaObjectDefinition = null; - if (targetTypeName != null) { - schemaObjectDefinition = getPrismContext().getSchemaRegistry().findObjectDefinitionByType(targetTypeName); - } - - PrismObject compositeObject = null; - try { -// if (valueElement instanceof Element) { -// Element valueDomElement = (Element) valueElement; - - JsonNode type = valueElement.get("_type"); - String typeVal = null; - if (type != null){ - typeVal = type.asText(); - } - - if (typeVal != null){ - QName itemName = new QName(referenceDefinition.getNamespace(), typeVal); - PrismObjectDefinition schemaObjectDefinitionFromXsiType = schemaRegistry.findObjectDefinitionByElementName(new QName(referenceDefinition.getNamespace(), typeVal)); - if (schemaObjectDefinitionFromXsiType != null) { - schemaObjectDefinition = schemaObjectDefinitionFromXsiType; - } - } - -// if (schemaObjectDefinition == null) { -// compositeObject = parseObject(valueElement); -// } else { - compositeObject = parseObject(valueElement, targetTypeName, referenceDefinition.getNamespace(), schemaObjectDefinition); -// } -// } else if (valueElement instanceof JAXBElement) { -// // This must be complete JAXB object -// JAXBElement jaxbElement = (JAXBElement) valueElement; -// Objectable objectable = jaxbElement.getValue(); -// compositeObject = objectable.asPrismObject(); -// -// PrismObjectDefinition schemaObjectDefinitionFromJaxbType = findDefinitionFromJaxbType(jaxbElement); -// if (schemaObjectDefinitionFromJaxbType != null) { -// schemaObjectDefinition = schemaObjectDefinitionFromJaxbType; -// } -// -// if (schemaObjectDefinition == null) { -// getPrismContext().adopt(objectable); -// } else { -// compositeObject.revive(getPrismContext()); -// compositeObject.applyDefinition(schemaObjectDefinition); -// } -// } - } catch (SchemaException e) { - throw new SchemaException(e.getMessage() + " while parsing composite object in reference element " - + referenceDefinition.getCompositeObjectElementName(), e); - } - - PrismReferenceValue refVal = new PrismReferenceValue(); - refVal.setObject(compositeObject); - return refVal; - } -} diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/XNodeProcessor.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/XNodeProcessor.java index 4d8ecf07913..6396d6af11b 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/XNodeProcessor.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/XNodeProcessor.java @@ -451,6 +451,9 @@ private T parseAtomicValueFromPrimitive(PrimitiveXNode xprim, QName typeN } private T parseAtomicValueFromPrimitive(PrimitiveXNode xprim, PrismPropertyDefinition def, QName typeName, ParsingContext pc) throws SchemaException { + if (xprim == null) { + throw new IllegalArgumentException("XNode is null while parsing def=" + def + ", type=" + typeName); + } T realValue = null; if (QNameUtil.match(ItemPathType.COMPLEX_TYPE, typeName)) { return (T) parseItemPathType(xprim, pc); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/Parser.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/Parser.java index 2d37c6fa52a..9411e62374e 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/Parser.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/Parser.java @@ -22,6 +22,7 @@ import javax.xml.namespace.QName; +import com.evolveum.midpoint.prism.ParserSource; import com.evolveum.midpoint.prism.ParsingContext; import com.evolveum.midpoint.prism.SerializationContext; import com.evolveum.midpoint.prism.xnode.RootXNode; @@ -33,18 +34,10 @@ * */ public interface Parser { - - XNode parse(File file, ParsingContext parsingContext) throws SchemaException, IOException; - XNode parse(InputStream stream, ParsingContext parsingContext) throws SchemaException, IOException; - - XNode parse(String dataString, ParsingContext parsingContext) throws SchemaException; - - Collection parseCollection(File file, ParsingContext parsingContext) throws SchemaException, IOException; - - Collection parseCollection(InputStream stream, ParsingContext parsingContext) throws SchemaException, IOException; - - Collection parseCollection(String dataString, ParsingContext parsingContext) throws SchemaException; + XNode parse(ParserSource source, ParsingContext parsingContext) throws SchemaException, IOException; + + Collection parseCollection(ParserSource source, ParsingContext parsingContext) throws SchemaException, IOException; boolean canParse(File file) throws IOException; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/ParserHelpers.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/ParserHelpers.java new file mode 100644 index 00000000000..2bcbd00fcae --- /dev/null +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/ParserHelpers.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.prism.parser; + +import com.evolveum.midpoint.prism.marshaller.PrismBeanConverter; +import com.evolveum.midpoint.prism.marshaller.XNodeProcessor; + +/** + * @author mederly + */ +public class ParserHelpers { + + public final ParserRegistry parserRegistry; + public final XNodeProcessor xnodeProcessor; + public final PrismBeanConverter beanConverter; + + public ParserHelpers(ParserRegistry parserRegistry, XNodeProcessor xnodeProcessor, PrismBeanConverter beanConverter) { + this.parserRegistry = parserRegistry; + this.xnodeProcessor = xnodeProcessor; + this.beanConverter = beanConverter; + } +} diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/ParserRegistry.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/ParserRegistry.java new file mode 100644 index 00000000000..c24282c642f --- /dev/null +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/ParserRegistry.java @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.prism.parser; + +import com.evolveum.midpoint.prism.ParserElementSource; +import com.evolveum.midpoint.prism.ParserFileSource; +import com.evolveum.midpoint.prism.ParserSource; +import com.evolveum.midpoint.prism.ParserStringSource; +import com.evolveum.midpoint.prism.parser.dom.DomParser; +import com.evolveum.midpoint.prism.parser.json.JsonParser; +import com.evolveum.midpoint.prism.parser.json.YamlParser; +import com.evolveum.midpoint.prism.schema.SchemaRegistry; +import com.evolveum.midpoint.util.DebugUtil; +import com.evolveum.midpoint.util.exception.SystemException; +import org.jetbrains.annotations.NotNull; + +import java.io.File; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +import static com.evolveum.midpoint.prism.PrismContext.LANG_JSON; +import static com.evolveum.midpoint.prism.PrismContext.LANG_XML; +import static com.evolveum.midpoint.prism.PrismContext.LANG_YAML; + +/** + * @author mederly + */ +public class ParserRegistry { + + private final Map parserMap; + + public ParserRegistry(SchemaRegistry schemaRegistry) { + parserMap = new HashMap<>(); + DomParser parserDom = new DomParser(schemaRegistry); + parserMap.put(LANG_XML, parserDom); + JsonParser parserJson = new JsonParser(); + parserMap.put(LANG_JSON, parserJson); + YamlParser parserYaml = new YamlParser(); + parserMap.put(LANG_YAML, parserYaml); + } + + @NotNull + public Parser findParser(File file) throws IOException { + for (Map.Entry entry: parserMap.entrySet()) { + Parser aParser = entry.getValue(); + if (aParser.canParse(file)) { + return aParser; + } + } + throw new SystemException("No parser for file '"+file+"' (autodetect)"); + } + + @NotNull + public Parser findParser(String data){ + for (Map.Entry entry: parserMap.entrySet()) { + Parser aParser = entry.getValue(); + if (aParser.canParse(data)) { + return aParser; + } + } + throw new SystemException("No parser for data '"+ DebugUtil.excerpt(data,16)+"' (autodetect)"); + } + + public Parser parserFor(String language) { + Parser parser = parserMap.get(language); + if (parser == null) { + throw new SystemException("No parser for language '"+language+"'"); + } + return parser; + } + + public Parser findParser(@NotNull ParserSource source) throws IOException { + if (source instanceof ParserElementSource) { + return parserFor(LANG_XML); + } else if (source instanceof ParserFileSource) { + return findParser(((ParserFileSource) source).getFile()); + } else if (source instanceof ParserStringSource) { + return findParser(((ParserStringSource) source).getData()); + } else { + throw new IllegalArgumentException("Cannot determine source from " + source.getClass()); + } + } +} diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/dom/DomParser.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/dom/DomParser.java index 73a2d66644d..8a198282032 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/dom/DomParser.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/dom/DomParser.java @@ -15,48 +15,39 @@ */ package com.evolveum.midpoint.prism.parser.dom; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.io.Serializable; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import javax.xml.namespace.QName; - -import com.evolveum.midpoint.prism.ParsingContext; -import com.evolveum.midpoint.prism.SerializationContext; +import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.marshaller.XNodeProcessorEvaluationMode; import com.evolveum.midpoint.prism.marshaller.XPathHolder; import com.evolveum.midpoint.prism.parser.Parser; import com.evolveum.midpoint.prism.parser.ParserUtils; +import com.evolveum.midpoint.prism.path.ItemPath; +import com.evolveum.midpoint.prism.schema.SchemaRegistry; +import com.evolveum.midpoint.prism.xml.XmlTypeConverter; +import com.evolveum.midpoint.prism.xnode.*; +import com.evolveum.midpoint.util.DOMUtil; +import com.evolveum.midpoint.util.PrettyPrinter; +import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; +import org.apache.commons.io.IOUtils; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.Validate; import org.w3c.dom.Attr; import org.w3c.dom.Document; import org.w3c.dom.Element; -import com.evolveum.midpoint.prism.PrismConstants; -import com.evolveum.midpoint.prism.path.ItemPath; -import com.evolveum.midpoint.prism.schema.SchemaRegistry; -import com.evolveum.midpoint.prism.xml.XmlTypeConverter; -import com.evolveum.midpoint.prism.xnode.ListXNode; -import com.evolveum.midpoint.prism.xnode.MapXNode; -import com.evolveum.midpoint.prism.xnode.PrimitiveXNode; -import com.evolveum.midpoint.prism.xnode.RootXNode; -import com.evolveum.midpoint.prism.xnode.SchemaXNode; -import com.evolveum.midpoint.prism.xnode.ValueParser; -import com.evolveum.midpoint.prism.xnode.XNode; -import com.evolveum.midpoint.util.DOMUtil; -import com.evolveum.midpoint.util.PrettyPrinter; -import com.evolveum.midpoint.util.exception.SchemaException; +import javax.xml.namespace.QName; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.regex.Matcher; +import java.util.regex.Pattern; public class DomParser implements Parser { @@ -71,18 +62,41 @@ public DomParser(SchemaRegistry schemaRegistry) { this.schemaRegistry = schemaRegistry; } + @Deprecated + public XNode parse(File file, ParsingContext parsingContext) throws SchemaException, IOException { + return parse(new ParserFileSource(file), parsingContext); + } + @Override - public Collection parseCollection(File file, ParsingContext parsingContext) throws SchemaException, IOException { - Document document = DOMUtil.parseFile(file); - return parseCollection(document); + public XNode parse(ParserSource source, ParsingContext parsingContext) throws SchemaException, IOException { + if (source instanceof ParserElementSource) { + return parse(((ParserElementSource) source).getElement()); + } + + InputStream is = source.getInputStream(); + try { + Document document = DOMUtil.parse(is); + return parse(document); + } finally { + if (source.closeAfterParsing()) { + IOUtils.closeQuietly(is); + } + } } @Override - public Collection parseCollection(InputStream stream, ParsingContext parsingContext) throws SchemaException, IOException { - Document document = DOMUtil.parse(stream); - return parseCollection(document); + public Collection parseCollection(ParserSource source, ParsingContext parsingContext) throws SchemaException, IOException { + InputStream is = source.getInputStream(); + try { + Document document = DOMUtil.parse(is); + return parseCollection(document); + } finally { + if (source.closeAfterParsing()) { + IOUtils.closeQuietly(is); + } + } } - + private Collection parseCollection(Document document) throws SchemaException{ Element root = DOMUtil.getFirstChildElement(document); // TODO: maybe some check if this is a collection of other objects??? @@ -94,30 +108,6 @@ private Collection parseCollection(Document document) throws SchemaExcept } return nodes; } - - @Override - public Collection parseCollection(String dataString, ParsingContext parsingContext) throws SchemaException { - throw new UnsupportedOperationException(); - } - - @Override - public XNode parse(File file, ParsingContext parsingContext) throws SchemaException { - Document document = DOMUtil.parseFile(file); - return parse(document); - } - - @Override - public XNode parse(InputStream stream, ParsingContext parsingContext) throws SchemaException, IOException { - Document document = DOMUtil.parse(stream); - return parse(document); - } - - - @Override - public XNode parse(String dataString, ParsingContext parsingContext) throws SchemaException { - Document document = DOMUtil.parseDocument(dataString); - return parse(document); - } public RootXNode parse(Document document) throws SchemaException { Element rootElement = DOMUtil.getFirstChildElement(document); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/dom/DomSerializer.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/dom/DomSerializer.java index 1928ce2ded2..8db37322f60 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/dom/DomSerializer.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/dom/DomSerializer.java @@ -203,7 +203,7 @@ private void serializePrimitiveElementOrAttribute(PrimitiveXNode xprim, Eleme } if (typeQName == null) { // this means that either xprim is unparsed or it is empty - if (com.evolveum.midpoint.prism.PrismContext.isAllowSchemalessSerialization()) { + if (com.evolveum.midpoint.prism.PrismContextImpl.isAllowSchemalessSerialization()) { // We cannot correctly serialize without a type. But this is needed // sometimes. So just default to string String stringValue = xprim.getStringValue(); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/AbstractJsonParser.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/AbstractJsonParser.java index bf2f7ea2f16..3cb8550b265 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/AbstractJsonParser.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/AbstractJsonParser.java @@ -22,6 +22,7 @@ import javax.xml.namespace.QName; +import com.evolveum.midpoint.prism.ParserSource; import com.evolveum.midpoint.prism.ParsingContext; import com.evolveum.midpoint.prism.SerializationContext; import com.evolveum.midpoint.prism.SerializationOptions; @@ -31,6 +32,7 @@ import com.evolveum.midpoint.util.logging.TraceManager; import com.fasterxml.jackson.core.*; import com.fasterxml.jackson.core.JsonParser; +import org.apache.commons.io.IOUtils; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang3.Validate; import org.jetbrains.annotations.NotNull; @@ -64,37 +66,20 @@ public abstract class AbstractJsonParser implements Parser { //region Parsing implementation @Override - public RootXNode parse(File file, ParsingContext parsingContext) throws SchemaException, IOException { - try (FileInputStream fis = new FileInputStream(file)) { - JsonParser parser = createJacksonParser(fis); + public RootXNode parse(ParserSource source, ParsingContext parsingContext) throws SchemaException, IOException { + InputStream is = source.getInputStream(); + try { + JsonParser parser = createJacksonParser(is); return parseFromStart(parser, parsingContext); + } finally { + if (source.closeAfterParsing()) { + IOUtils.closeQuietly(is); + } } } @Override - public RootXNode parse(InputStream stream, ParsingContext parsingContext) throws SchemaException, IOException { - JsonParser parser = createJacksonParser(stream); - return parseFromStart(parser, parsingContext); - } - - @Override - public RootXNode parse(String dataString, ParsingContext parsingContext) throws SchemaException { - JsonParser parser = createJacksonParser(dataString); - return parseFromStart(parser, parsingContext); - } - - @Override - public Collection parseCollection(File file, ParsingContext parsingContext) throws SchemaException, IOException { - throw new UnsupportedOperationException("Parse objects not supported for json and yaml."); // why? - } - - @Override - public Collection parseCollection(InputStream stream, ParsingContext parsingContext) throws SchemaException, IOException { - throw new UnsupportedOperationException("Parse objects not supported for json and yaml."); // why? - } - - @Override - public Collection parseCollection(String dataString, ParsingContext parsingContext) throws SchemaException { + public Collection parseCollection(ParserSource source, ParsingContext parsingContext) throws SchemaException, IOException { throw new UnsupportedOperationException("Parse objects not supported for json and yaml."); // why? } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/PrismTestUtil.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/PrismTestUtil.java index 5fce52527af..d6e284d0ffb 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/PrismTestUtil.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/PrismTestUtil.java @@ -119,7 +119,7 @@ public static PrismObject parseObject(String xmlString @Deprecated public static PrismObject parseObject(Element element) throws SchemaException { - return getPrismContext().parseObject(element); + return getPrismContext().parserFor(element).parse(); } public static T parseObjectable(File file, Class clazz) throws SchemaException, IOException { @@ -128,7 +128,7 @@ public static T parseObjectable(File file, Class clazz public static List> parseObjects(File file) throws SchemaException, IOException { - return getPrismContext().parseObjects(file); + return getPrismContext().parserFor(file).parseObjects(); } // ========================== @@ -166,15 +166,15 @@ public static String serializeAnyDataWrapped(Object o) throws SchemaException { // ========================== public static T parseAtomicValue(File file, QName type) throws SchemaException, IOException { - return getPrismContext().parseAtomicValue(file, type); + return getPrismContext().parserFor(file).parseAtomicValue(type); } public static T parseAtomicValue(String data, QName type) throws SchemaException { - return getPrismContext().parseAtomicValue(data, type); + return getPrismContext().parserFor(data).parseAtomicValue(type); } public static T parseAnyValue(File file) throws SchemaException, IOException { - return getPrismContext().parseAnyValue(file); + return getPrismContext().parserFor(file).parseAnyValue(); } public static PrismObjectDefinition getObjectDefinition(Class compileTimeClass) { @@ -205,7 +205,7 @@ public static void displayTestTitle(String testName) { } public static SearchFilterType unmarshalFilter(File file) throws Exception { - return prismContext.parseAtomicValue(file, SearchFilterType.COMPLEX_TYPE); + return prismContext.parserFor(file).parseAtomicValue(SearchFilterType.COMPLEX_TYPE); } public static ObjectFilter getFilterCondition(ObjectFilter filter, int index) { diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/RawTypeUtil.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/RawTypeUtil.java index ef96e3e52fc..73e1a8c59d3 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/RawTypeUtil.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/RawTypeUtil.java @@ -21,19 +21,7 @@ import javax.xml.namespace.QName; -import com.evolveum.midpoint.prism.Item; -import com.evolveum.midpoint.prism.ItemDefinition; -import com.evolveum.midpoint.prism.PrismContainer; -import com.evolveum.midpoint.prism.PrismContainerDefinition; -import com.evolveum.midpoint.prism.PrismContainerValue; -import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.PrismProperty; -import com.evolveum.midpoint.prism.PrismPropertyDefinition; -import com.evolveum.midpoint.prism.PrismPropertyValue; -import com.evolveum.midpoint.prism.PrismReference; -import com.evolveum.midpoint.prism.PrismReferenceDefinition; -import com.evolveum.midpoint.prism.PrismReferenceValue; -import com.evolveum.midpoint.prism.PrismValue; +import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.prism.xml.ns._public.types_3.RawType; @@ -47,7 +35,7 @@ public static Item getP List parsedValues = new ArrayList(); for (RawType rawValue : values){ if (itemDefinition == null && containerDef != null){ - itemDefinition = (ID) containerDef.getPrismContext().getXnodeProcessor().locateItemDefinition(containerDef, elementQName, rawValue.getXnode()); + itemDefinition = (ID) ((PrismContextImpl) containerDef.getPrismContext()).getXnodeProcessor().locateItemDefinition(containerDef, elementQName, rawValue.getXnode()); } IV parsed = rawValue.getParsedValue(itemDefinition, elementQName); if (parsed != null){ diff --git a/infra/prism/src/test/java/com/evolveum/midpoint/prism/PrismInternalTestUtil.java b/infra/prism/src/test/java/com/evolveum/midpoint/prism/PrismInternalTestUtil.java index ab58d573ffb..9d496819ce0 100644 --- a/infra/prism/src/test/java/com/evolveum/midpoint/prism/PrismInternalTestUtil.java +++ b/infra/prism/src/test/java/com/evolveum/midpoint/prism/PrismInternalTestUtil.java @@ -244,7 +244,7 @@ public static PrismContext constructPrismContext(File extraSchema) throws Schema } prefixMapper.registerPrefix(PrismConstants.NS_ANNOTATION, PrismConstants.PREFIX_NS_ANNOTATION, false); prefixMapper.registerPrefix(PrismInternalTestUtil.NS_WEAPONS, PrismInternalTestUtil.NS_WEAPONS_PREFIX, false); - PrismContext context = PrismContext.create(schemaRegistry); + PrismContext context = PrismContextImpl.create(schemaRegistry); return context; } diff --git a/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestExtraSchema.java b/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestExtraSchema.java index 17b48f07ea6..a550a5effec 100644 --- a/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestExtraSchema.java +++ b/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestExtraSchema.java @@ -123,7 +123,7 @@ public void testUserExtensionSchemaParseUser() throws SAXException, IOException, context.initialize(); // Parsing user - PrismObject user = context.parseObject(DOMUtil.getFirstChildElement(dataDoc)); + PrismObject user = context.parserFor(DOMUtil.getFirstChildElement(dataDoc)).parse(); assertNotNull("No definition for user", user.getDefinition()); System.out.println("Parsed root object:"); diff --git a/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestPrismParsingXml.java b/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestPrismParsingXml.java index 91c0e1217fe..fd43e4b1b11 100644 --- a/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestPrismParsingXml.java +++ b/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestPrismParsingXml.java @@ -47,7 +47,7 @@ public void testPrismParseDom() throws Exception { PrismContext prismContext = constructInitializedPrismContext(); // WHEN - PrismObject user = prismContext.parseObject(userElement); + PrismObject user = prismContext.parserFor(userElement).parse(); // THEN System.out.println("User:"); @@ -69,7 +69,7 @@ public void testPrismParseDomAdhoc() throws Exception { PrismContext prismContext = constructInitializedPrismContext(); // WHEN - PrismObject user = prismContext.parseObject(userElement); + PrismObject user = prismContext.parserFor(userElement).parse(); // THEN System.out.println("User:"); diff --git a/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestUnknownItems.java b/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestUnknownItems.java index 80d1a15cf59..7fc2a6808b8 100644 --- a/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestUnknownItems.java +++ b/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestUnknownItems.java @@ -69,7 +69,7 @@ public void test020ParseWrongItemCompat() throws Exception { PrismContext prismContext = constructInitializedPrismContext(); // WHEN - PrismObject user = prismContext.parseObject(WRONG_ITEM_FILE, ParsingContext.forMode(XNodeProcessorEvaluationMode.COMPAT)); + PrismObject user = prismContext.parserFor(WRONG_ITEM_FILE).compat().parse(); // THEN System.out.println("User:"); @@ -103,7 +103,7 @@ public void test120ParseWrongNamespaceCompat() throws Exception { PrismContext prismContext = constructInitializedPrismContext(); // WHEN - PrismObject user = prismContext.parseObject(WRONG_NAMESPACE_FILE, ParsingContext.forMode(XNodeProcessorEvaluationMode.COMPAT)); + PrismObject user = prismContext.parserFor(WRONG_NAMESPACE_FILE).compat().parse(); // THEN System.out.println("User:"); diff --git a/infra/prism/src/test/java/com/evolveum/midpoint/prism/parser/AbstractParserTest.java b/infra/prism/src/test/java/com/evolveum/midpoint/prism/parser/AbstractParserTest.java index 9c4ffa7731c..e4b6ea43786 100644 --- a/infra/prism/src/test/java/com/evolveum/midpoint/prism/parser/AbstractParserTest.java +++ b/infra/prism/src/test/java/com/evolveum/midpoint/prism/parser/AbstractParserTest.java @@ -97,7 +97,7 @@ public void testParseUserToPrism() throws Exception { XNodeProcessor processor = new XNodeProcessor(prismContext); // WHEN (parse to xnode) - XNode xnode = parser.parse(getFile(USER_JACK_FILE_BASENAME), ParsingContext.createDefault()); + XNode xnode = parser.parse(getFileSource(USER_JACK_FILE_BASENAME), ParsingContext.createDefault()); System.out.println("XNode after parsing:"); System.out.println(xnode.debugDump()); @@ -114,6 +114,10 @@ public void testParseUserToPrism() throws Exception { } + private ParserSource getFileSource(String basename) { + return new ParserFileSource(getFile(basename)); + } + @Test public void testParseUserRoundTrip() throws Exception { final String TEST_NAME = "testParseUserRoundTrip"; @@ -125,7 +129,7 @@ public void testParseUserRoundTrip() throws Exception { XNodeProcessor processor = new XNodeProcessor(prismContext); // WHEN (parse) - XNode xnode = parser.parse(getFile(USER_JACK_FILE_BASENAME), ParsingContext.createDefault()); + XNode xnode = parser.parse(getFileSource(USER_JACK_FILE_BASENAME), ParsingContext.createDefault()); System.out.println("\nParsed xnode:"); System.out.println(xnode.debugDump()); PrismObject user = processor.parseObject(xnode, ParsingContext.createDefault()); @@ -171,7 +175,7 @@ public void testParseUserRoundTrip() throws Exception { validateUserSchema(serializedString, prismContext); // WHEN (re-parse) - XNode reparsedXnode = parser.parse(serializedString, ParsingContext.createDefault()); + XNode reparsedXnode = parser.parse(new ParserStringSource(serializedString), ParsingContext.createDefault()); PrismObject reparsedUser = processor.parseObject(reparsedXnode, ParsingContext.createDefault()); // THEN @@ -209,7 +213,7 @@ public void testParseResourceRumToPrism() throws Exception { XNodeProcessor processor = new XNodeProcessor(prismContext); // WHEN (parse to xnode) - XNode xnode = parser.parse(getFile(RESOURCE_RUM_FILE_BASENAME), ParsingContext.createDefault()); + XNode xnode = parser.parse(getFileSource(RESOURCE_RUM_FILE_BASENAME), ParsingContext.createDefault()); System.out.println("XNode after parsing:"); System.out.println(xnode.debugDump()); @@ -235,7 +239,7 @@ public void testParseResourceRoundTrip() throws Exception { XNodeProcessor processor = new XNodeProcessor(prismContext); // WHEN (parse) - XNode xnode = parser.parse(getFile(RESOURCE_RUM_FILE_BASENAME), ParsingContext.createDefault()); + XNode xnode = parser.parse(getFileSource(RESOURCE_RUM_FILE_BASENAME), ParsingContext.createDefault()); PrismObject resource = processor.parseObject(xnode, ParsingContext.createDefault()); // THEN @@ -280,7 +284,7 @@ public void testParseResourceRoundTrip() throws Exception { validateResourceSchema(serializedString, prismContext); // WHEN (re-parse) - XNode reparsedXnode = parser.parse(serializedString, ParsingContext.createDefault()); + XNode reparsedXnode = parser.parse(new ParserStringSource(serializedString), ParsingContext.createDefault()); PrismObject reparsedResource = processor.parseObject(reparsedXnode, ParsingContext.createDefault()); // THEN @@ -387,7 +391,7 @@ public void testParseEventHandler() throws Exception { XNodeProcessor processor = new XNodeProcessor(prismContext); // WHEN (parse to xnode) - RootXNode xnode = (RootXNode) parser.parse(getFile(EVENT_HANDLER_FILE_BASENAME), ParsingContext.createDefault()); + RootXNode xnode = (RootXNode) parser.parse(getFileSource(EVENT_HANDLER_FILE_BASENAME), ParsingContext.createDefault()); System.out.println("XNode after parsing:"); System.out.println(xnode.debugDump()); diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/MidPointPrismContextFactory.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/MidPointPrismContextFactory.java index 6cf2c103a5f..80846f85d0c 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/MidPointPrismContextFactory.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/MidPointPrismContextFactory.java @@ -22,6 +22,7 @@ import java.io.IOException; import java.util.Arrays; +import com.evolveum.midpoint.prism.PrismContextImpl; import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.internals.InternalMonitor; import com.evolveum.midpoint.schema.internals.InternalsConfig; @@ -61,7 +62,7 @@ public MidPointPrismContextFactory(File extraSchemaDir) { @Override public PrismContext createPrismContext() throws SchemaException, FileNotFoundException { SchemaRegistry schemaRegistry = createSchemaRegistry(); - PrismContext context = PrismContext.create(schemaRegistry); + PrismContextImpl context = PrismContextImpl.create(schemaRegistry); context.setDefinitionFactory(createDefinitionFactory()); if (InternalsConfig.isPrismMonitoring()) { @@ -73,7 +74,7 @@ public PrismContext createPrismContext() throws SchemaException, FileNotFoundExc public PrismContext createEmptyPrismContext() throws SchemaException, FileNotFoundException { SchemaRegistry schemaRegistry = createSchemaRegistry(); - PrismContext context = PrismContext.createEmptyContext(schemaRegistry); + PrismContextImpl context = PrismContextImpl.createEmptyContext(schemaRegistry); context.setDefinitionFactory(createDefinitionFactory()); return context; } diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestJaxbParsing.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestJaxbParsing.java index ebadf69c038..0ea8c0d8b88 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestJaxbParsing.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestJaxbParsing.java @@ -241,11 +241,11 @@ public void testParseAnyValue() throws Exception { // THEN - Object oAsIs = prismContext.parseAnyValueAsJAXBElement(dataAsIs, PrismContext.LANG_XML); + Object oAsIs = prismContext.parserFor(dataAsIs).xml().parseAnyValueAsJAXBElement(); System.out.println("Parsed expression evaluator: " + dataAsIs + " as " + oAsIs); AssertJUnit.assertTrue("result is of wrong class (not JAXBElement): " + oAsIs.getClass(), oAsIs instanceof JAXBElement); - Object oValue = prismContext.parseAnyValueAsJAXBElement(dataValue, PrismContext.LANG_XML); + Object oValue = prismContext.parserFor(dataValue).xml().parseAnyValueAsJAXBElement(); System.out.println("Parsed expression evaluator: " + dataValue + " as " + oValue); AssertJUnit.assertTrue("result is of wrong class (not JAXBElement): " + oValue.getClass(), oValue instanceof JAXBElement); } @@ -260,7 +260,7 @@ public void testParseValueFilterWithAny() throws Exception { // WHEN - Object parsedObject = prismContext.parseAnyValue(rootElement); + Object parsedObject = prismContext.parserFor(rootElement).parseAnyValue(); // THEN System.out.println("Parsed object: " + parsedObject); diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestJsonParsing.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestJsonParsing.java deleted file mode 100644 index 2b45869de05..00000000000 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestJsonParsing.java +++ /dev/null @@ -1,297 +0,0 @@ -package com.evolveum.midpoint.schema; - - -import static org.testng.AssertJUnit.assertEquals; -import static org.testng.AssertJUnit.assertNotNull; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; - -import javax.xml.namespace.QName; - -import com.evolveum.midpoint.prism.json.PrismJasonProcessorDeprecated; -import org.testng.annotations.Test; -import org.w3c.dom.Element; - -import com.evolveum.midpoint.prism.PrismConstants; -import com.evolveum.midpoint.prism.PrismContainer; -import com.evolveum.midpoint.prism.PrismContext; -//import com.evolveum.midpoint.prism.PrismInternalTestUtil; -import com.evolveum.midpoint.prism.PrismObject; -import com.evolveum.midpoint.prism.PrismObjectDefinition; -import com.evolveum.midpoint.prism.PrismProperty; -import com.evolveum.midpoint.prism.PrismReference; -import com.evolveum.midpoint.prism.path.ItemPath; -import com.evolveum.midpoint.prism.polystring.PolyString; -import com.evolveum.midpoint.prism.util.PrismAsserts; -import com.evolveum.midpoint.schema.constants.SchemaConstants; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ActivationStatusType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ActivationType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; -import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; - -@Deprecated -public class TestJsonParsing { - - // private PrismJasonProcessorDeprecated jsonProcessor; - - - @Test(enabled = false) - public void test000SerializeUserJson() throws Exception { - System.out.println("===[ testParseUserJson ]==="); -// PrismContext prismContext = PrismInternalTestUtil.constructInitializedPrismContext(); - PrismJasonProcessorDeprecated jsonProcessor = new PrismJasonProcessorDeprecated(); - PrismContext prismContext = MidPointPrismContextFactory.FACTORY - .createInitializedPrismContext(); -// prismContext.initialize(); - jsonProcessor.setPrismContext(prismContext); - jsonProcessor.setSchemaRegistry(prismContext.getSchemaRegistry()); - // PrismTestUtil.setFactory(MidPointPrismContextFactory.FACTORY); - // PrismContext prismContext = PrismTestUtil.createPrismContext(); - // jsonProcessor.setPrismContext(prismContext); - - PrismObject userType = prismContext.parseObject(new File("src/test/resources/common/user-jack.xml")); - - System.out.println("parsed"); - - FileOutputStream fos = new FileOutputStream(new File("D:/file"+userType.asObjectable().getName()+"3.json")); - try{ - jsonProcessor.serializeToJson(userType, fos); - }catch (Exception ex){ - System.out.println("exception: " + ex); - throw ex; - } - - - fos.close(); -// PrismObject user = userType.asPrismObject(); -// System.out.println("object"); -// System.out.println(userType.dump()); -// assertUserPrism(userType); - } - - @Test(enabled = false) - public void test001ParseUserJson() throws Exception { - System.out.println("===[ testParseUserJson ]==="); - PrismJasonProcessorDeprecated jsonProcessor = new PrismJasonProcessorDeprecated(); - PrismContext prismContext = MidPointPrismContextFactory.FACTORY - .createInitializedPrismContext(); - prismContext.initialize(); - jsonProcessor.setPrismContext(prismContext); - jsonProcessor.setSchemaRegistry(prismContext.getSchemaRegistry()); - // PrismTestUtil.setFactory(MidPointPrismContextFactory.FACTORY); - // PrismContext prismContext = PrismTestUtil.createPrismContext(); - // jsonProcessor.setPrismContext(prismContext); -// PrismObject userType = jsonProcessor.parseObject(new File("src/test/resources/common/json/user-jack.json"), -// UserType.class); -// PrismObject userType = jsonProcessor.parseObject(new File("D:/filejack.json"), -// UserType.class); -// - try{ - PrismObject userType = jsonProcessor.parseObject(new FileInputStream(new File("D:/filejack3.json")), - UserType.class); - - System.out.println("parsed"); - -// PrismObject user = userType.asPrismObject(); - System.out.println("object"); - System.out.println(userType.debugDump()); - - -// System.out.println("DOM: " + prismContext.getPrismDomProcessor().serializeObjectToString(userType)); -// System.out.println("JAXB:" + SchemaDebugUtil.dumpJaxbObject(userType.asObjectable(), "user", prismContext)); - - - assertUserPrism(userType); - } catch (Exception ex){ - System.out.println("exception " + ex); - throw ex; - } - } - - String resourceFileName = null; - - @Test(enabled = false) - public void test002ParseResourceJson() throws Exception { - System.out.println("===[ test002ParseResourceJson ]==="); - PrismJasonProcessorDeprecated jsonProcessor = new PrismJasonProcessorDeprecated(); - PrismContext prismContext = MidPointPrismContextFactory.FACTORY - .createInitializedPrismContext(); - jsonProcessor.setPrismContext(prismContext); - jsonProcessor.setSchemaRegistry(prismContext.getSchemaRegistry()); - // PrismTestUtil.setFactory(MidPointPrismContextFactory.FACTORY); - // PrismContext prismContext = PrismTestUtil.createPrismContext(); - // jsonProcessor.setPrismContext(prismContext); -// PrismObject userType = jsonProcessor.parseObject( -// new File("src/test/resources/common/json/resource-opendj.json"), -// UserType.class); - -PrismObject resourceType = prismContext.parseObject(new File("src/test/resources/common/resource-opendj.xml")); - -System.out.println("=====================objectTYPE"); -//resourceType.asObjectable().getSchemaHandling().getObjectType(); -//System.out.println(SchemaDebugUtil.dumpJaxbObject(resourceType.asObjectable(), "resource", prismContext)); -//System.out.println(prismContext.getPrismDomProcessor().serializeObjectToString(resourceType)); - - System.out.println("parsed"); - System.out.println(resourceType.debugDump()); - resourceFileName = "D:/file"+resourceType.asObjectable().getName()+"3.json"; - FileOutputStream fos = new FileOutputStream(new File(resourceFileName)); - - jsonProcessor.serializeToJson(resourceType, fos); - - - - fos.close(); - - System.out.println("parsed"); - -// PrismObject user = userType.asPrismObject(); - System.out.println("object"); - System.out.println(resourceType.debugDump()); -// assertUserPrism(userType); - } - - @Test(enabled = false) - public void test003ParseResourceJson() throws Exception { - System.out.println("===[ testParseUserJson ]==="); - PrismJasonProcessorDeprecated jsonProcessor = new PrismJasonProcessorDeprecated(); - PrismContext prismContext = MidPointPrismContextFactory.FACTORY - .createInitializedPrismContext(); - prismContext.initialize(); - jsonProcessor.setPrismContext(prismContext); - jsonProcessor.setSchemaRegistry(prismContext.getSchemaRegistry()); - // PrismTestUtil.setFactory(MidPointPrismContextFactory.FACTORY); - // PrismContext prismContext = PrismTestUtil.createPrismContext(); - // jsonProcessor.setPrismContext(prismContext); -// PrismObject userType = jsonProcessor.parseObject(new File("src/test/resources/common/json/user-jack.json"), -// UserType.class); -// PrismObject userType = jsonProcessor.parseObject(new File("D:/filejack.json"), -// UserType.class); -// - try{ - PrismObject resourceType = jsonProcessor.parseObject(new FileInputStream(new File("D:/fileEmbedded Test OpenDJ3.json")), - ResourceType.class); - - System.out.println("parsed"); - -// PrismObject user = userType.asPrismObject(); - System.out.println("object"); - System.out.println(resourceType.debugDump()); - - - System.out.println("=====================objectTYPE"); -// resourceType.asObjectable().getSchemaHandling().getObjectType(); -// System.out.println(SchemaDebugUtil.dumpJaxbObject(resourceType.asObjectable(), "resource", prismContext)); -// System.out.println(prismContext.getPrismDomProcessor().serializeObjectToString(resourceType)); - } catch (Exception ex){ - System.out.println("exception " + ex); - throw ex; - } - -// assertUserPrism(resourceType); - } - -private void assertUserPrism(PrismObject user) { - -// assertEquals("Wrong oid", "2f9b9299-6f45-498f-bc8e-8d17c6b93b20", user.getOid()); -// assertEquals("Wrong version", "42", user.getVersion()); - PrismObjectDefinition usedDefinition = user.getDefinition(); - assertNotNull("No user definition", usedDefinition); - PrismAsserts.assertObjectDefinition(usedDefinition, new QName(SchemaConstantsGenerated.NS_COMMON, "user"), - UserType.COMPLEX_TYPE, UserType.class); - assertEquals("Wrong class in user", UserType.class, user.getCompileTimeClass()); - UserType userType = user.asObjectable(); - assertNotNull("asObjectable resulted in null", userType); - -// assertPropertyValue(user, "name", PrismTestUtil.createPolyString("jack")); -// assertPropertyDefinition(user, "name", PolyStringType.COMPLEX_TYPE, 0, 1); -// assertPropertyValue(user, "fullName", new PolyString("Jack Sparrow", "jack sparrow")); -// assertPropertyDefinition(user, "fullName", PolyStringType.COMPLEX_TYPE, 0, 1); -// assertPropertyValue(user, "givenName", new PolyString("Jack", "jack")); -// assertPropertyDefinition(user, "givenName", PolyStringType.COMPLEX_TYPE, 0, 1); -// assertPropertyValue(user, "familyName", new PolyString("Sparrow", "sparrow")); -// assertPropertyDefinition(user, "familyName", PolyStringType.COMPLEX_TYPE, 0, 1); - - assertPropertyDefinition(user, "organizationalUnit", PolyStringType.COMPLEX_TYPE, 0, -1); - assertPropertyValues(user, "organizationalUnit", - new PolyString("Brethren of the Coast", "brethren of the coast"), - new PolyString("Davie Jones' Locker", "davie jones locker")); - -// PrismContainer extension = user.getExtension(); -// assertContainerDefinition(extension, "extension", DOMUtil.XSD_ANY, 0, 1); -// PrismContainerValue extensionValue = extension.getValue(); -// assertTrue("Extension parent", extensionValue.getParent() == extension); -// assertNull("Extension ID", extensionValue.getId()); - - ItemPath admStatusPath = new ItemPath(UserType.F_ACTIVATION, ActivationType.F_ADMINISTRATIVE_STATUS); - PrismProperty admStatusProperty1 = user.findProperty(admStatusPath); - PrismAsserts.assertDefinition(admStatusProperty1.getDefinition(), ActivationType.F_ADMINISTRATIVE_STATUS, SchemaConstants.C_ACTIVATION_STATUS_TYPE, 0, 1); - assertNotNull("Property "+admStatusPath+" not found", admStatusProperty1); - PrismAsserts.assertPropertyValue(admStatusProperty1, ActivationStatusType.ENABLED); - -// PrismProperty validFromProperty = user.findProperty(new PropertyPath(UserType.F_ACTIVATION, ActivationType.F_VALID_FROM)); -// assertNotNull("Property "+ActivationType.F_VALID_FROM+" not found", validFromProperty); -// PrismAsserts.assertPropertyValue(validFromProperty, USER_JACK_VALID_FROM); -// -// PrismContainer assignmentContainer = user.findContainer(UserType.F_ASSIGNMENT); -// PrismAsserts.assertDefinition(assignmentContainer.getDefinition(), UserType.F_ASSIGNMENT, AssignmentType.COMPLEX_TYPE, 0, -1); -// assertEquals("Wrong number of assignment values", 1, assignmentContainer.getValues().size()); -// PrismContainerValue firstAssignmentValue = assignmentContainer.getValues().iterator().next(); -// -// PrismContainer assignmentExtensionContainer = firstAssignmentValue.findContainer(AssignmentType.F_EXTENSION); -// PrismAsserts.assertDefinition(assignmentExtensionContainer.getDefinition(), AssignmentType.F_EXTENSION, ExtensionType.COMPLEX_TYPE, 0, 1); -// List> assignmentExtensionItems = assignmentExtensionContainer.getValue().getItems(); -// assertEquals("Wrong number of assignment extension items", 1, assignmentExtensionItems.size()); -// PrismProperty firstAssignmentExtensionItem = (PrismProperty) assignmentExtensionItems.get(0); -// PrismAsserts.assertDefinition(firstAssignmentExtensionItem.getDefinition(), EXTENSION_INT_TYPE_ELEMENT, DOMUtil.XSD_INT, 0, -1); -// PrismPropertyValue firstValueOfFirstAssignmentExtensionItem = firstAssignmentExtensionItem.getValues().get(0); -// assertEquals("Wrong value of "+EXTENSION_INT_TYPE_ELEMENT+" in assignment extension", 42, firstValueOfFirstAssignmentExtensionItem.getValue()); -// - // TODO: check accountConstruction - - PrismReference accountRef = user.findReference(UserType.F_LINK_REF); - assertEquals("Wrong number of accountRef values", 2, accountRef.getValues().size()); -// PrismAsserts.assertReferenceValue(accountRef, USER_ACCOUNT_REF_1_OID); -// PrismAsserts.assertReferenceValue(accountRef, USER_ACCOUNT_REF_2_OID); -// PrismAsserts.assertReferenceValue(accountRef, USER_ACCOUNT_REF_3_OID); - -// PrismReferenceValue accountRef1Val = accountRef.findValueByOid(USER_ACCOUNT_REF_2_OID); -// assertNotNull("No object in ref1 (prism)", accountRef1Val.getObject()); -// assertNotNull("No object definition in ref1 (prism)", accountRef1Val.getObject().getDefinition()); -// assertEquals("Wrong ref1 oid (prism)", USER_ACCOUNT_REF_2_OID, accountRef1Val.getOid()); -// assertEquals("Wrong ref1 type (prism)", ShadowType.COMPLEX_TYPE, accountRef1Val.getTargetType()); - -// PrismReferenceValue accountRef3Val = accountRef.findValueByOid(USER_ACCOUNT_REF_3_OID); -// assertEquals("Wrong ref3 oid (prism)", USER_ACCOUNT_REF_3_OID, accountRef3Val.getOid()); -// assertEquals("Wrong ref3 type (prism)", ShadowType.COMPLEX_TYPE, accountRef3Val.getTargetType()); -// assertEquals("Wrong ref3 description (prism)", "This is third accountRef", accountRef3Val.getDescription()); -// Element accountRef3ValFilterElement = accountRef3Val.getFilter(); -// assertFilter("ref3", accountRef3ValFilterElement); - } - -private void assertPropertyDefinition(PrismContainer container, String propName, QName xsdType, int minOccurs, - int maxOccurs) { - QName propQName = new QName(SchemaConstantsGenerated.NS_COMMON, propName); - PrismAsserts.assertPropertyDefinition(container, propQName, xsdType, minOccurs, maxOccurs); -} - -public static void assertPropertyValue(PrismContainer container, String propName, Object propValue) { - QName propQName = new QName(SchemaConstantsGenerated.NS_COMMON, propName); - PrismAsserts.assertPropertyValue(container, propQName, propValue); -} - -public static void assertPropertyValues(PrismContainer container, String propName, T... expectedValues) { - QName propQName = new QName(SchemaConstantsGenerated.NS_COMMON, propName); - PrismAsserts.assertPropertyValue(container, propQName, expectedValues); -} - -private void assertFilter(String message, Element filterElement) { - assertNotNull("No "+message+" filter", filterElement); - assertEquals("Wrong "+message+" filter namespace", PrismConstants.NS_QUERY, filterElement.getNamespaceURI()); - assertEquals("Wrong "+message+" filter localName", "equal", filterElement.getLocalName()); -} - -} diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseFilter.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseFilter.java index ef7ccbb6671..0bcd12c5796 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseFilter.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseFilter.java @@ -59,7 +59,7 @@ public void testParseFilterFile() throws Exception { PrismContext prismContext = PrismTestUtil.getPrismContext(); // WHEN - SearchFilterType filter = prismContext.parseAtomicValue(FILTER_FILE, SearchFilterType.COMPLEX_TYPE); + SearchFilterType filter = prismContext.parserFor(FILTER_FILE).parseAtomicValue(SearchFilterType.COMPLEX_TYPE); // THEN System.out.println("Parsed filter:"); @@ -71,7 +71,7 @@ public void testParseFilterFile() throws Exception { // WHEN2 - SearchFilterType filter2 = prismContext.parseAtomicValue(serialized, SearchFilterType.COMPLEX_TYPE); + SearchFilterType filter2 = prismContext.parserFor(serialized).parseAtomicValue(SearchFilterType.COMPLEX_TYPE); System.out.println("Reparsed filter:"); System.out.println(filter2.debugDump()); diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseGenericObject.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseGenericObject.java index 9afce2012d3..e88bf0cf70e 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseGenericObject.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseGenericObject.java @@ -78,7 +78,7 @@ public void testParseGenericFile() throws Exception { PrismContext prismContext = PrismTestUtil.getPrismContext(); // WHEN - PrismObject generic = prismContext.parseObject(GENERIC_FILE, PrismContext.LANG_XML); + PrismObject generic = prismContext.parserFor(GENERIC_FILE).xml().parse(); // THEN System.out.println("Parsed generic object:"); @@ -98,7 +98,7 @@ public void testParseGenericDom() throws SchemaException, DatatypeConfigurationE Element resourceElement = DOMUtil.getFirstChildElement(document); // WHEN - PrismObject generic = prismContext.parseObject(resourceElement); + PrismObject generic = prismContext.parserFor(resourceElement).parse(); // THEN System.out.println("Parsed generic object:"); diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseLookupTable.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseLookupTable.java index 5b3e4ba72f9..6b9febddc29 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseLookupTable.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseLookupTable.java @@ -48,7 +48,7 @@ public void testParseTableFileRoundTrip() throws Exception { PrismContext prismContext = PrismTestUtil.getPrismContext(); // WHEN - PrismObject table = prismContext.parseObject(LOOKUP_TABLE_FILE, PrismContext.LANG_XML); + PrismObject table = prismContext.parserFor(LOOKUP_TABLE_FILE).xml().parse(); // THEN System.out.println("Parsed table:"); diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseModelContext.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseModelContext.java index aeb6dc75905..75c99df85e5 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseModelContext.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseModelContext.java @@ -75,8 +75,7 @@ public void testParseModelContextPrism() throws Exception { PrismContext prismContext = PrismTestUtil.getPrismContext(); // WHEN - PrismContainer lensContextType = prismContext.parseContainer(MODEL_CONTEXT_FILE, - LensContextType.class, PrismContext.LANG_XML); + PrismContainer lensContextType = prismContext.parserFor(MODEL_CONTEXT_FILE).xml().parseContainer(LensContextType.class); // THEN System.out.println("Parsed LensContextType: " + lensContextType.getValue().asContainerable()); diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParsePasswordPolicy.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParsePasswordPolicy.java index f3e7d7bde79..c3d4b4b58e5 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParsePasswordPolicy.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParsePasswordPolicy.java @@ -73,7 +73,7 @@ public void testParsePasswordPolicyFile() throws Exception { PrismContext prismContext = PrismTestUtil.getPrismContext(); // WHEN - PrismObject policy = prismContext.parseObject(FILE, PrismContext.LANG_XML); + PrismObject policy = prismContext.parserFor(FILE).xml().parse(); // THEN System.out.println("Parsed policy:"); diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseTask.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseTask.java index 456688ff0b1..378ef80de5b 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseTask.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseTask.java @@ -68,7 +68,7 @@ public void testParseTaskFile() throws Exception { PrismContext prismContext = PrismTestUtil.getPrismContext(); // WHEN - PrismObject task = prismContext.parseObject(TASK_FILE, PrismContext.LANG_XML); + PrismObject task = prismContext.parserFor(TASK_FILE).xml().parse(); // THEN System.out.println("Parsed task:"); @@ -88,7 +88,7 @@ public void testParseTaskDom() throws SchemaException { Element taskElement = DOMUtil.getFirstChildElement(document); // WHEN - PrismObject task = prismContext.parseObject(taskElement); + PrismObject task = prismContext.parserFor(taskElement).parse(); // THEN System.out.println("Parsed task:"); diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseTaskBulkAction.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseTaskBulkAction.java index 7fc8870e154..6c0aaf5bd34 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseTaskBulkAction.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseTaskBulkAction.java @@ -70,7 +70,7 @@ public void testParseTaskFile() throws Exception { PrismContext prismContext = PrismTestUtil.getPrismContext(); // WHEN - PrismObject task = prismContext.parseObject(TASK_FILE, PrismContext.LANG_XML); + PrismObject task = prismContext.parserFor(TASK_FILE).xml().parse(); // THEN System.out.println("Parsed task:"); diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResource.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResource.java index e650acbbb06..0657df324cb 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResource.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResource.java @@ -203,7 +203,7 @@ public void testSchemaRoundtrip() throws Exception { System.out.println(serializesSchema); // RE-PARSE - PrismContainer reparsedSchemaContainer = prismContext.parseContainer(serializesSchema, schemaContainer.getDefinition(), getLanguage()); + PrismContainer reparsedSchemaContainer = prismContext.parserFor(serializesSchema).language(getLanguage()).parseContainer(schemaContainer.getDefinition()); System.out.println("Re-parsed schema container:"); System.out.println(reparsedSchemaContainer.debugDump()); @@ -232,7 +232,7 @@ protected void assertResource(PrismObject resource, boolean checkC assertResourceJaxb(resource.asObjectable(), isSimple); if (checkJaxb) { - serializeDom(resource); +// serializeDom(resource); //serializeJaxb(resource); } } @@ -441,11 +441,11 @@ private void assertResourceJaxb(ResourceType resourceType, boolean isSimple) thr // Try to serialize it to DOM using just DOM processor. See if it does not fail. private void serializeDom(PrismObject resource) throws SchemaException { - DomParser domParser = PrismTestUtil.getPrismContext().getParserDom(); - XNodeProcessor xnodeProcessor = PrismTestUtil.getPrismContext().getXnodeProcessor(); - RootXNode xnode = xnodeProcessor.serializeObject(resource); - Element domElement = domParser.serializeXRootToElement(xnode); - assertNotNull("Null resulting DOM element after DOM serialization", domElement); +// DomParser domParser = PrismTestUtil.getPrismContext().getParserDom(); +// XNodeProcessor xnodeProcessor = PrismTestUtil.getPrismContext().getXnodeProcessor(); +// RootXNode xnode = xnodeProcessor.serializeObject(resource); +// Element domElement = domParser.serializeXRootToElement(xnode); +// assertNotNull("Null resulting DOM element after DOM serialization", domElement); } private void assertPropertyDefinition(PrismContainer container, String propName, QName xsdType, int minOccurs, diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceXml.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceXml.java index 4d2955fdd2d..005b038565c 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceXml.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceXml.java @@ -72,7 +72,7 @@ public void testParseResourceDomSimple() throws Exception { Element resourceElement = DOMUtil.getFirstChildElement(document); // WHEN - PrismObject resource = prismContext.parseObject(resourceElement); + PrismObject resource = prismContext.parserFor(resourceElement).parse(); // THEN System.out.println("Parsed resource:"); diff --git a/infra/util/src/test/java/com/evolveum/midpoint/util/QNameUtilTest.java b/infra/util/src/test/java/com/evolveum/midpoint/util/QNameUtilTest.java index faf4601807b..b315c8f5061 100644 --- a/infra/util/src/test/java/com/evolveum/midpoint/util/QNameUtilTest.java +++ b/infra/util/src/test/java/com/evolveum/midpoint/util/QNameUtilTest.java @@ -57,7 +57,7 @@ public void uriToQName2() { // Then - AssertJUnit.assertEquals(new QName("http://foo.com/bar/","baz"), qname); + AssertJUnit.assertEquals(new QName("http://foo.com/bar","baz"), qname); } @Test diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/ModelWebService.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/ModelWebService.java index a56050637c1..e374969c63f 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/ModelWebService.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/ModelWebService.java @@ -234,7 +234,7 @@ private List> parseScripts(ExecuteScriptsType parameters) throws // here comes MSL script decoding (however with a quick hack to allow passing XML as text here) String scriptsAsString = parameters.getMslScripts(); if (scriptsAsString.startsWith(" type, Type genericType, try { if (type.isAssignableFrom(PrismObject.class)){ - object = (T) prismContext.parseObject(entityStream, PrismContext.LANG_XML); + object = (T) prismContext.parserFor(entityStream).xml().parse(); } else { - object = prismContext.parseAnyValue(entityStream, PrismContext.LANG_XML); + object = prismContext.parserFor(entityStream).xml().parseAnyValue(); //object = (T) prismContext.getJaxbDomHack().unmarshalObject(entityStream); } diff --git a/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/lens/TestClockwork.java b/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/lens/TestClockwork.java index 549fb11e42a..44ec9847f3c 100644 --- a/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/lens/TestClockwork.java +++ b/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/lens/TestClockwork.java @@ -134,7 +134,7 @@ public void test010SerializeAddUserBarbossa() throws Exception { System.out.println("Serialized form = " + xml); - PrismContainer unmarshalledContainer = prismContext.parseContainer(xml, LensContextType.class, PrismContext.LANG_XML); + PrismContainer unmarshalledContainer = prismContext.parserFor(xml).xml().parseContainer(LensContextType.class); LensContext context2 = LensContext.fromLensContextType(unmarshalledContainer.getValue().asContainerable(), context.getPrismContext(), provisioningService, result); System.out.println("Context after deserialization = " + context.debugDump()); @@ -316,7 +316,7 @@ private void assignAccountToJackAsync(String testName, boolean serialize) throws System.out.println("Serialized form = " + xml); - PrismContainer unmarshalledContainer = prismContext.parseContainer(xml, LensContextType.class, PrismContext.LANG_XML); + PrismContainer unmarshalledContainer = prismContext.parserFor(xml).xml().parseContainer(LensContextType.class); context = LensContext.fromLensContextType(unmarshalledContainer.getValue().asContainerable(), context.getPrismContext(), provisioningService, result); System.out.println("Context after deserialization = " + context.debugDump()); diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/scripting/TestScriptingBasic.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/scripting/TestScriptingBasic.java index 963cf8412c5..f8e43d89fa5 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/scripting/TestScriptingBasic.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/scripting/TestScriptingBasic.java @@ -31,6 +31,7 @@ import com.evolveum.midpoint.test.IntegrationTestTools; import com.evolveum.midpoint.test.util.LogfileTestTailer; import com.evolveum.midpoint.test.util.TestUtil; +import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; @@ -43,6 +44,7 @@ import org.testng.collections.Sets; import java.io.File; +import java.io.IOException; import java.util.Arrays; import java.util.HashSet; import java.util.List; @@ -140,7 +142,7 @@ public void test120Log() throws Exception { // GIVEN OperationResult result = new OperationResult(DOT_CLASS + TEST_NAME); - PrismProperty logAction = (PrismProperty) prismContext.parseAnyData(LOG_FILE); + PrismProperty logAction = parseAnyData(LOG_FILE); LogfileTestTailer tailer = new LogfileTestTailer(LoggingConfigurationManager.AUDIT_LOGGER_NAME); tailer.tail(); @@ -157,6 +159,10 @@ public void test120Log() throws Exception { tailer.assertExpectedMessage(); } + private PrismProperty parseAnyData(File file) throws IOException, SchemaException { + return (PrismProperty) prismContext.parserFor(file).parseAnyData(); + } + @Test public void test200SearchUser() throws Exception { final String TEST_NAME = "test200SearchUser"; @@ -164,7 +170,7 @@ public void test200SearchUser() throws Exception { // GIVEN OperationResult result = new OperationResult(DOT_CLASS + TEST_NAME); - PrismProperty expression = (PrismProperty) prismContext.parseAnyData(SEARCH_FOR_USERS_FILE); + PrismProperty expression = parseAnyData(SEARCH_FOR_USERS_FILE); // WHEN Data output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), result).getFinalOutput(); @@ -184,7 +190,7 @@ public void test205SearchForResources() throws Exception { // GIVEN OperationResult result = new OperationResult(DOT_CLASS + TEST_NAME); - PrismProperty expression = (PrismProperty) prismContext.parseAnyData(SEARCH_FOR_RESOURCES_FILE); + PrismProperty expression = parseAnyData(SEARCH_FOR_RESOURCES_FILE); // WHEN Data output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), result).getFinalOutput(); @@ -203,7 +209,7 @@ public void test206SearchForRoles() throws Exception { // GIVEN OperationResult result = new OperationResult(DOT_CLASS + TEST_NAME); - PrismProperty expression = (PrismProperty) prismContext.parseAnyData(SEARCH_FOR_ROLES_FILE); + PrismProperty expression = parseAnyData(SEARCH_FOR_ROLES_FILE); // WHEN Data output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), result).getFinalOutput(); @@ -222,7 +228,7 @@ public void test210SearchForShadows() throws Exception { // GIVEN OperationResult result = new OperationResult(DOT_CLASS + TEST_NAME); - PrismProperty expression = (PrismProperty) prismContext.parseAnyData(SEARCH_FOR_SHADOWS_FILE); + PrismProperty expression = parseAnyData(SEARCH_FOR_SHADOWS_FILE); // WHEN Data output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), result).getFinalOutput(); @@ -242,7 +248,7 @@ public void test215SearchForShadowsNoFetch() throws Exception { // GIVEN OperationResult result = new OperationResult(DOT_CLASS + TEST_NAME); - PrismProperty expression = (PrismProperty) prismContext.parseAnyData(SEARCH_FOR_SHADOWS_NOFETCH_FILE); + PrismProperty expression = parseAnyData(SEARCH_FOR_SHADOWS_NOFETCH_FILE); // WHEN Data output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), result).getFinalOutput(); @@ -262,7 +268,7 @@ public void test220SearchForUsersAccounts() throws Exception { // GIVEN OperationResult result = new OperationResult(DOT_CLASS + TEST_NAME); - PrismProperty expression = (PrismProperty) prismContext.parseAnyData(SEARCH_FOR_USERS_ACCOUNTS_FILE); + PrismProperty expression = parseAnyData(SEARCH_FOR_USERS_ACCOUNTS_FILE); // WHEN Data output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), result).getFinalOutput(); @@ -282,7 +288,7 @@ public void test225SearchForUsersAccountsNoFetch() throws Exception { // GIVEN OperationResult result = new OperationResult(DOT_CLASS + TEST_NAME); - PrismProperty expression = (PrismProperty) prismContext.parseAnyData(SEARCH_FOR_USERS_ACCOUNTS_NOFETCH_FILE); + PrismProperty expression = parseAnyData(SEARCH_FOR_USERS_ACCOUNTS_NOFETCH_FILE); // WHEN Data output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), result).getFinalOutput(); @@ -302,7 +308,7 @@ public void test300DisableJack() throws Exception { // GIVEN OperationResult result = new OperationResult(DOT_CLASS + TEST_NAME); - PrismProperty expression = (PrismProperty) prismContext.parseAnyData(DISABLE_JACK_FILE); + PrismProperty expression = parseAnyData(DISABLE_JACK_FILE); // WHEN ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), result); @@ -323,7 +329,7 @@ public void test310EnableJack() throws Exception { // GIVEN OperationResult result = new OperationResult(DOT_CLASS + TEST_NAME); - PrismProperty expression = (PrismProperty) prismContext.parseAnyData(ENABLE_JACK_FILE); + PrismProperty expression = parseAnyData(ENABLE_JACK_FILE); // WHEN ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), result); @@ -344,7 +350,7 @@ public void test320DeleteAndAddJack() throws Exception { // GIVEN OperationResult result = new OperationResult(DOT_CLASS + TEST_NAME); - PrismProperty expression = (PrismProperty) prismContext.parseAnyData(DELETE_AND_ADD_JACK_FILE); + PrismProperty expression = parseAnyData(DELETE_AND_ADD_JACK_FILE); // WHEN ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), result); @@ -365,7 +371,7 @@ public void test330ModifyJack() throws Exception { // GIVEN OperationResult result = new OperationResult(DOT_CLASS + TEST_NAME); - PrismProperty expression = (PrismProperty) prismContext.parseAnyData(MODIFY_JACK_FILE); + PrismProperty expression = parseAnyData(MODIFY_JACK_FILE); // WHEN ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), result); @@ -387,7 +393,7 @@ public void test340ModifyJackBack() throws Exception { // GIVEN OperationResult result = new OperationResult(DOT_CLASS + TEST_NAME); - PrismProperty expression = (PrismProperty) prismContext.parseAnyData(MODIFY_JACK_BACK_FILE); + PrismProperty expression = parseAnyData(MODIFY_JACK_BACK_FILE); // WHEN ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), result); @@ -409,7 +415,7 @@ public void test350RecomputeJack() throws Exception { // GIVEN OperationResult result = new OperationResult(DOT_CLASS + TEST_NAME); - PrismProperty expression = (PrismProperty) prismContext.parseAnyData(RECOMPUTE_JACK_FILE); + PrismProperty expression = parseAnyData(RECOMPUTE_JACK_FILE); // WHEN ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), result); @@ -430,7 +436,7 @@ public void test360AssignToJack() throws Exception { // GIVEN OperationResult result = new OperationResult(DOT_CLASS + TEST_NAME); - PrismProperty expression = (PrismProperty) prismContext.parseAnyData(ASSIGN_TO_JACK_FILE); + PrismProperty expression = parseAnyData(ASSIGN_TO_JACK_FILE); // WHEN ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), result); @@ -455,7 +461,7 @@ public void test370AssignToJackInBackground() throws Exception { // GIVEN OperationResult result = new OperationResult(DOT_CLASS + TEST_NAME); - PrismProperty expression = (PrismProperty) prismContext.parseAnyData(ASSIGN_TO_JACK_2_FILE); + PrismProperty expression = parseAnyData(ASSIGN_TO_JACK_2_FILE); // WHEN Task task = taskManager.createTaskInstance(); @@ -506,7 +512,7 @@ public void test400PurgeSchema() throws Exception { // GIVEN OperationResult result = new OperationResult(DOT_CLASS + TEST_NAME); Task task = taskManager.createTaskInstance(); - PrismProperty expression = (PrismProperty) prismContext.parseAnyData(PURGE_DUMMY_BLACK_SCHEMA_FILE); + PrismProperty expression = parseAnyData(PURGE_DUMMY_BLACK_SCHEMA_FILE); // ResourceType dummy = modelService.getObject(ResourceType.class, RESOURCE_DUMMY_BLACK_OID, null, task, result).asObjectable(); // IntegrationTestTools.display("dummy resource before purge schema", dummy.asPrismObject()); @@ -542,7 +548,7 @@ public void test410TestResource() throws Exception { // GIVEN OperationResult result = new OperationResult(DOT_CLASS + TEST_NAME); - PrismProperty expression = (PrismProperty) prismContext.parseAnyData(TEST_DUMMY_RESOURCE_FILE); + PrismProperty expression = parseAnyData(TEST_DUMMY_RESOURCE_FILE); // WHEN ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), result); @@ -566,7 +572,7 @@ public void test420NotificationAboutJack() throws Exception { // GIVEN OperationResult result = new OperationResult(DOT_CLASS + TEST_NAME); - PrismProperty expression = (PrismProperty) prismContext.parseAnyData(NOTIFICATION_ABOUT_JACK_FILE); + PrismProperty expression = parseAnyData(NOTIFICATION_ABOUT_JACK_FILE); prepareNotifications(); // WHEN @@ -594,7 +600,7 @@ public void test430NotificationAboutJackType2() throws Exception { // GIVEN OperationResult result = new OperationResult(DOT_CLASS + TEST_NAME); - PrismProperty expression = (PrismProperty) prismContext.parseAnyData(NOTIFICATION_ABOUT_JACK_TYPE2_FILE); + PrismProperty expression = parseAnyData(NOTIFICATION_ABOUT_JACK_TYPE2_FILE); prepareNotifications(); // WHEN @@ -627,7 +633,7 @@ public void test500ScriptingUsers() throws Exception { // GIVEN OperationResult result = new OperationResult(DOT_CLASS + TEST_NAME); - PrismProperty expression = (PrismProperty) prismContext.parseAnyData(SCRIPTING_USERS_FILE); + PrismProperty expression = parseAnyData(SCRIPTING_USERS_FILE); // WHEN ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), result); diff --git a/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportFunctions.java b/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportFunctions.java index dcfbeb8a336..9eaf068756a 100644 --- a/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportFunctions.java +++ b/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportFunctions.java @@ -297,7 +297,7 @@ RefFilter createReferenceEqualFilter(ItemPath property } Object parseObjectFromXML (String xml) throws SchemaException { - return prismContext.parseAnyData(xml, PrismContext.LANG_XML); + return prismContext.parserFor(xml).xml().parseAnyData(); } /** diff --git a/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportServiceImpl.java b/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportServiceImpl.java index a5ec02b7250..a678e30586a 100644 --- a/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportServiceImpl.java +++ b/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportServiceImpl.java @@ -111,8 +111,7 @@ public ObjectQuery parseQuery(String query, Map parameters) throw Task task = taskManager.createTaskInstance(); ModelExpressionThreadLocalHolder.pushCurrentResult(task.getResult()); ModelExpressionThreadLocalHolder.pushCurrentTask(task); - SearchFilterType filter = (SearchFilterType) prismContext.parseAtomicValue(query, - SearchFilterType.COMPLEX_TYPE); + SearchFilterType filter = (SearchFilterType) prismContext.parserFor(query).parseAtomicValue(SearchFilterType.COMPLEX_TYPE); LOGGER.trace("filter {}", filter); ObjectFilter f = QueryConvertor.parseFilter(filter, UserType.class, prismContext); LOGGER.trace("f {}", f.debugDump()); diff --git a/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportWebServiceRaw.java b/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportWebServiceRaw.java index 298f068b124..c2ef47955d6 100644 --- a/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportWebServiceRaw.java +++ b/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportWebServiceRaw.java @@ -99,7 +99,7 @@ public DOMSource invokeAllowingFaults(DOMSource request) throws FaultMessage { Object requestObject; try { - requestObject = prismContext.parseAnyValue(rootElement); + requestObject = prismContext.parserFor(rootElement).parseAnyValue(); } catch (SchemaException e) { throw new FaultMessage("Couldn't parse SOAP request body because of schema exception: " + e.getMessage()); // throw ws.createIllegalArgumentFault("Couldn't parse SOAP request body because of schema exception: " + e.getMessage()); diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/util/MiscDataUtil.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/util/MiscDataUtil.java index 7cb140f2aa2..93ce57aa6ff 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/util/MiscDataUtil.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/util/MiscDataUtil.java @@ -192,19 +192,19 @@ public static String serializeContainerableToXml(Containerable containerable, Pr public static ObjectType deserializeObjectFromXml(String xml, PrismContext prismContext) { try { - return (ObjectType) prismContext.parseObject(xml, PrismContext.LANG_XML).asObjectable(); + return (ObjectType) prismContext.parserFor(xml).xml().parse().asObjectable(); } catch (SchemaException e) { throw new SystemException("Couldn't deserialize a PrismObject from XML", e); } } - public static PrismContainer deserializeContainerFromXml(String xml, PrismContext prismContext) { - try { - return prismContext.parseContainer(xml, (Class) null, PrismContext.LANG_XML); - } catch (SchemaException e) { - throw new SystemException("Couldn't deserialize a Containerable from XML", e); - } - } +// public static PrismContainer deserializeContainerFromXml(String xml, PrismContext prismContext) { +// try { +// return prismContext.parserFor(xml).xml().parseContainer(null); // TODO will 'null' work? +// } catch (SchemaException e) { +// throw new SystemException("Couldn't deserialize a Containerable from XML", e); +// } +// } public void resolveAssignmentTargetReferences(PrismObject object, OperationResult result) { for (AssignmentType assignmentType : object.asObjectable().getAssignment()) { diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/util/SingleItemSerializationSafeContainerImpl.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/util/SingleItemSerializationSafeContainerImpl.java index ff21915bcb6..90c2b85a124 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/util/SingleItemSerializationSafeContainerImpl.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/util/SingleItemSerializationSafeContainerImpl.java @@ -115,7 +115,7 @@ public T getValue() { if (encodingScheme == EncodingScheme.PRISM) { try { - actualValue = (T) prismContext.parseAnyData(valueForStorageWhenEncoded, PrismContext.LANG_XML); + actualValue = (T) prismContext.parserFor(valueForStorageWhenEncoded).xml().parseAnyData(); if (actualValue instanceof Item) { Item item = (Item) actualValue; if (item.isEmpty()) { diff --git a/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/general/TestGeneralChangeProcessor.java b/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/general/TestGeneralChangeProcessor.java index 7c829d9aedc..47474bab60b 100644 --- a/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/general/TestGeneralChangeProcessor.java +++ b/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/general/TestGeneralChangeProcessor.java @@ -352,7 +352,7 @@ public void test000LoadContext() throws Exception { OperationResult result = new OperationResult("test000LoadContext"); - LensContextType lensContextType = prismContext.parseContainer(new File("src/test/resources/model-contexts/context-dummy-resource.xml"), LensContextType.class, PrismContext.LANG_XML).getValues().get(0).asContainerable(); + LensContextType lensContextType = prismContext.parserFor(new File("src/test/resources/model-contexts/context-dummy-resource.xml")).xml().parseContainer(LensContextType.class).getValues().get(0).asContainerable(); display("LensContextType", lensContextType); LensContext lensContext = LensContext.fromLensContextType(lensContextType, prismContext, provisioningService, result); display("LensContext", lensContext); diff --git a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/AddGetObjectTest.java b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/AddGetObjectTest.java index 31d9516ae28..6950a6f1dda 100644 --- a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/AddGetObjectTest.java +++ b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/AddGetObjectTest.java @@ -98,8 +98,7 @@ public void perfTest() throws Exception { stats.setStatisticsEnabled(true); final File OBJECTS_FILE = new File("./src/test/resources/10k-users.xml"); - List> elements = prismContext.parseObjects( - OBJECTS_FILE); + List> elements = prismContext.parserFor(OBJECTS_FILE).parseObjects(); long previousCycle = 0; long time = System.currentTimeMillis(); @@ -160,7 +159,7 @@ public void simpleAddGetTest() throws Exception { } private void addGetCompare(File file) throws Exception { - List> elements = prismContext.parseObjects(file); + List> elements = prismContext.parserFor(file).parseObjects(); List oids = new ArrayList(); OperationResult result = new OperationResult("Simple Add Get Test"); @@ -175,7 +174,7 @@ private void addGetCompare(File file) throws Exception { (System.currentTimeMillis() - time),}); int count = 0; - elements = prismContext.parseObjects(file); + elements = prismContext.parserFor(file).parseObjects(); for (int i = 0; i < elements.size(); i++) { try { PrismObject object = elements.get(i); @@ -311,13 +310,12 @@ private void checkContainersSize(PrismContainer newContainer, PrismContainer old public void addUserWithAssignmentExtension() throws Exception { LOGGER.info("===[ addUserWithAssignmentExtension ]==="); File file = new File(FOLDER_BASIC, "user-assignment-extension.xml"); - List> elements = prismContext.parseObjects(file); + List> elements = prismContext.parserFor(file).parseObjects(); OperationResult result = new OperationResult("ADD"); String oid = repositoryService.addObject((PrismObject) elements.get(0), null, result); - PrismObject fileUser = (PrismObject) prismContext.parseObjects(file) - .get(0); + PrismObject fileUser = (PrismObject) prismContext.parserFor(file).parseObjects().get(0); long id = 1; for (AssignmentType assignment : fileUser.asObjectable().getAssignment()) { assignment.setId(id); @@ -501,7 +499,7 @@ private String testIterationToken(String token) throws Exception { @Test(enabled = false) public void deltaOperationSerializationPerformanceTest() throws Exception { List> elements = - prismContext.parseObjects(new File(FOLDER_BASIC, "objects.xml")); + prismContext.parserFor(new File(FOLDER_BASIC, "objects.xml")).parseObjects(); //get user from objects.xml ObjectDelta delta = ObjectDelta.createAddDelta(elements.get(0)); diff --git a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/AddOverwriteTest.java b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/AddOverwriteTest.java index 977574bf4eb..2ad7753af98 100644 --- a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/AddOverwriteTest.java +++ b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/AddOverwriteTest.java @@ -88,7 +88,7 @@ public void setup() throws SchemaException, SAXException, IOException { @Test public void addWithOverwrite() throws Exception { - List> objects = prismContext.parseObjects(new File(ORG_STRUCT_OBJECTS)); + List> objects = prismContext.parserFor(new File(ORG_STRUCT_OBJECTS)).parseObjects(); OperationResult opResult = new OperationResult("Import file"); @@ -109,7 +109,7 @@ public void addWithOverwrite() throws Exception { AssertJUnit.assertNotNull(oid); //reimport carla, oid should stay the same, version must be incremented - objects = prismContext.parseObjects(new File(IMPORT_OVERWRITE)); + objects = prismContext.parserFor(new File(IMPORT_OVERWRITE)).parseObjects(); PrismObject newCarla = objects.get(0); newCarla.setOid(oid); diff --git a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/DeleteTest.java b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/DeleteTest.java index 3a9fef1030d..c1ab65307f3 100644 --- a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/DeleteTest.java +++ b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/DeleteTest.java @@ -54,7 +54,7 @@ public void delete001() throws Exception { return; } - List> elements = prismContext.parseObjects(file); + List> elements = prismContext.parserFor(file).parseObjects(); List oids = new ArrayList(); OperationResult result = new OperationResult("Delete Test"); @@ -115,8 +115,7 @@ public void delete0003() throws Exception { @Test public void test100DeleteObjects() throws Exception { // PrismDomProcessor domProcessor = prismContext.getPrismDomProcessor(); - List> objects = prismContext.parseObjects( - new File(FOLDER_BASIC, "objects.xml")); + List> objects = prismContext.parserFor(new File(FOLDER_BASIC, "objects.xml")).parseObjects(); OperationResult result = new OperationResult("add objects"); List oids = new ArrayList<>(); diff --git a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/ListAccountShadowOwnerTest.java b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/ListAccountShadowOwnerTest.java index 03074ce74ec..67df219d6bf 100644 --- a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/ListAccountShadowOwnerTest.java +++ b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/ListAccountShadowOwnerTest.java @@ -70,7 +70,7 @@ public void listExistingOwner() throws Exception { //insert sample data final File OBJECTS_FILE = new File(FOLDER_BASIC, "objects.xml"); - List> elements = prismContext.parseObjects(OBJECTS_FILE); + List> elements = prismContext.parserFor(OBJECTS_FILE).parseObjects(); for (int i = 0; i < elements.size(); i++) { PrismObject object = elements.get(i); repositoryService.addObject(object, null, result); diff --git a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/OrgStructTest.java b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/OrgStructTest.java index b172bfbf620..00851b27ab6 100644 --- a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/OrgStructTest.java +++ b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/OrgStructTest.java @@ -113,7 +113,7 @@ public class OrgStructTest extends BaseSQLRepoTest { @Test public void test001addOrgStructObjects() throws Exception { OperationResult opResult = new OperationResult("test001addOrgStructObjects"); - List> orgStruct = prismContext.parseObjects(new File(ORG_STRUCT_OBJECTS)); + List> orgStruct = prismContext.parserFor(new File(ORG_STRUCT_OBJECTS)).parseObjects(); for (PrismObject o : orgStruct) { repositoryService.addObject((PrismObject) o, null, opResult); @@ -238,8 +238,8 @@ private void assertSubordinate(boolean expected, String upperOrgOid, String... l public void test001addOrgStructObjectsIncorrect() throws Exception { OperationResult opResult = new OperationResult("test001addOrgStructObjectsIncorrect"); - List> orgStructIncorrect = prismContext.parseObjects( - new File(ORG_STRUCT_OBJECTS_INCORRECT)); + List> orgStructIncorrect = prismContext.parserFor( + new File(ORG_STRUCT_OBJECTS_INCORRECT)).parseObjects(); for (PrismObject o : orgStructIncorrect) { repositoryService.addObject((PrismObject) o, null, opResult); diff --git a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/PerformanceTest.java b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/PerformanceTest.java index 372f8220f57..7659e2ed491 100644 --- a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/PerformanceTest.java +++ b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/PerformanceTest.java @@ -51,7 +51,7 @@ public void test100Parsing() throws Exception { int COUNT = 1000; for (int i = 0; i < COUNT; i++) { - List> elements = prismContext.parseObjects(new File(FOLDER_BASIC, "objects.xml")); + List> elements = prismContext.parserFor(new File(FOLDER_BASIC, "objects.xml")).parseObjects(); for (PrismObject obj : elements) { prismContext.serializeObjectToString(obj, PrismContext.LANG_XML); } diff --git a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/QueryInterpreter2Test.java b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/QueryInterpreter2Test.java index 0476603a088..e3e42d9cb1c 100644 --- a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/QueryInterpreter2Test.java +++ b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/QueryInterpreter2Test.java @@ -146,8 +146,8 @@ public void beforeClass() throws Exception { PrismTestUtil.resetPrismContext(MidPointPrismContextFactory.FACTORY); - List> objects = prismContext.parseObjects( - new File(FOLDER_BASIC, "objects.xml")); + List> objects = prismContext.parserFor( + new File(FOLDER_BASIC, "objects.xml")).parseObjects(); OperationResult result = new OperationResult("add objects"); for (PrismObject object : objects) { repositoryService.addObject(object, null, result); @@ -2004,7 +2004,7 @@ public void test415ActivationQueryCorrect() throws Exception { public void test500OrgQuery() throws Exception { File objects = new File("src/test/resources/orgstruct/org-monkey-island.xml"); OperationResult opResult = new OperationResult("test500OrgQuery"); - List> orgStruct = prismContext.parseObjects(objects); + List> orgStruct = prismContext.parserFor(objects).parseObjects(); for (PrismObject o : orgStruct) { repositoryService.addObject((PrismObject) o, null, opResult); diff --git a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/QueryInterpreterTest.java b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/QueryInterpreterTest.java index 582bbb2b47a..47a4836cfd5 100644 --- a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/QueryInterpreterTest.java +++ b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/QueryInterpreterTest.java @@ -93,8 +93,8 @@ public void beforeClass() throws Exception { PrismTestUtil.resetPrismContext(MidPointPrismContextFactory.FACTORY); - List> objects = prismContext.parseObjects( - new File(FOLDER_BASIC, "objects.xml")); + List> objects = prismContext.parserFor( + new File(FOLDER_BASIC, "objects.xml")).parseObjects(); OperationResult result = new OperationResult("add objects"); for (PrismObject object : objects) { repositoryService.addObject(object, null, result); @@ -1184,7 +1184,7 @@ public void test200ActivationQuery() throws Exception { public void test300OrgQuery() throws Exception { File objects = new File("src/test/resources/orgstruct/org-monkey-island.xml"); OperationResult opResult = new OperationResult("test300OrgQuery"); - List> orgStruct = prismContext.parseObjects(objects); + List> orgStruct = prismContext.parserFor(objects).parseObjects(); for (PrismObject o : orgStruct) { repositoryService.addObject((PrismObject) o, null, opResult); diff --git a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/SearchShadowOwnerTest.java b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/SearchShadowOwnerTest.java index 6c93c3716a5..e9a7c092cef 100644 --- a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/SearchShadowOwnerTest.java +++ b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/SearchShadowOwnerTest.java @@ -73,7 +73,7 @@ public void initSystem() throws Exception { //insert sample data final File OBJECTS_FILE = new File(FOLDER_BASIC, "objects.xml"); - List> elements = prismContext.parseObjects(OBJECTS_FILE); + List> elements = prismContext.parserFor(OBJECTS_FILE).parseObjects(); for (int i = 0; i < elements.size(); i++) { PrismObject object = elements.get(i); repositoryService.addObject(object, null, result); diff --git a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/SearchTest.java b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/SearchTest.java index a7f01268188..c5d2b0a0b53 100644 --- a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/SearchTest.java +++ b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/SearchTest.java @@ -76,8 +76,8 @@ public void beforeClass() throws Exception { PrismTestUtil.resetPrismContext(MidPointPrismContextFactory.FACTORY); - List> objects = prismContext.parseObjects(new File(FOLDER_BASIC, "objects.xml")); - objects.addAll(prismContext.parseObjects(new File(FOLDER_BASIC, "objects-2.xml"))); + List> objects = prismContext.parserFor(new File(FOLDER_BASIC, "objects.xml")).parseObjects(); + objects.addAll(prismContext.parserFor(new File(FOLDER_BASIC, "objects-2.xml")).parseObjects()); OperationResult result = new OperationResult("add objects"); for (PrismObject object : objects) { diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/SqlAuditServiceImpl.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/SqlAuditServiceImpl.java index 59e9a72cf23..dce336ca81f 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/SqlAuditServiceImpl.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/SqlAuditServiceImpl.java @@ -175,7 +175,7 @@ private PrismObject resolve(Session session, String oid) throws SchemaException PrismObject result = null; if (object != null) { String xml = RUtil.getXmlFromByteArray(object.getFullObject(), getConfiguration().isUseZip()); - result = getPrismContext().parseObject(xml, XNodeProcessorEvaluationMode.COMPAT); + result = getPrismContext().parserFor(xml).compat().parse(); } return result; diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/audit/RObjectDeltaOperation.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/audit/RObjectDeltaOperation.java index fe4d34a8229..8fbc8291a19 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/audit/RObjectDeltaOperation.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/audit/RObjectDeltaOperation.java @@ -284,11 +284,11 @@ public static ObjectDeltaOperation fromRepo(RObjectDeltaOperation operation, Pri ObjectDeltaOperation odo = new ObjectDeltaOperation(); try { if (operation.getDelta() != null) { - ObjectDeltaType delta = prismContext.parseAtomicValue(operation.getDelta(), ObjectDeltaType.COMPLEX_TYPE); + ObjectDeltaType delta = prismContext.parserFor(operation.getDelta()).parseAtomicValue(ObjectDeltaType.COMPLEX_TYPE); odo.setObjectDelta(DeltaConvertor.createObjectDelta(delta, prismContext)); } if (operation.getFullResult() != null) { - OperationResultType resultType = prismContext.parseAtomicValue(operation.getFullResult(), OperationResultType.COMPLEX_TYPE); + OperationResultType resultType = prismContext.parserFor(operation.getFullResult()).parseAtomicValue(OperationResultType.COMPLEX_TYPE); odo.setExecutionResult(OperationResult.createOperationResult(resultType)); } odo.setObjectName(RPolyString.fromRepo(operation.getObjectName())); diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RAccessCertificationCase.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RAccessCertificationCase.java index 48b87c441e4..e2ecbeec23f 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RAccessCertificationCase.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RAccessCertificationCase.java @@ -415,8 +415,7 @@ public static AccessCertificationCaseType createJaxb(byte[] fullObject, PrismCon String xml = RUtil.getXmlFromByteArray(fullObject, false); PrismContainer caseContainer; try { - // TODO tolerant mode - caseContainer = prismContext.parseContainer(xml, AccessCertificationCaseType.class, PrismContext.LANG_XML); + caseContainer = prismContext.parserFor(xml).xml().compat().parseContainer(AccessCertificationCaseType.class); } catch (SchemaException e) { LOGGER.debug("Couldn't parse certification case because of schema exception ({}):\nData: {}", e, xml); throw e; diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/ObjectRetriever.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/ObjectRetriever.java index 5792893f372..c04bd9a8241 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/ObjectRetriever.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/ObjectRetriever.java @@ -452,7 +452,7 @@ private PrismObject updateLoadedObject(GetObjectResult try { // "Postel mode": be tolerant what you read. We need this to tolerate (custom) schema changes ParsingContext parsingContext = ParsingContext.forMode(XNodeProcessorEvaluationMode.COMPAT); - prismObject = prismContext.parseObject(xml, parsingContext); + prismObject = prismContext.parserFor(xml).context(parsingContext).parse(); // TODO enable if needed // if (parsingContext.hasWarnings()) { // for (String warning : parsingContext.getWarnings()) { diff --git a/repo/task-quartz-impl/src/test/java/com/evolveum/midpoint/task/quartzimpl/CleanupTest.java b/repo/task-quartz-impl/src/test/java/com/evolveum/midpoint/task/quartzimpl/CleanupTest.java index 2639dd9ad76..ec46da53a3c 100644 --- a/repo/task-quartz-impl/src/test/java/com/evolveum/midpoint/task/quartzimpl/CleanupTest.java +++ b/repo/task-quartz-impl/src/test/java/com/evolveum/midpoint/task/quartzimpl/CleanupTest.java @@ -77,13 +77,11 @@ public void testTasksCleanup() throws Exception { // GIVEN final File file = new File(FOLDER_REPO, "tasks-for-cleanup.xml"); - List> elements = prismContext.parseObjects(file); + List> elements = prismContext.parserFor(file).parseObjects(); OperationResult result = new OperationResult("tasks cleanup"); - for (int i = 0; i < elements.size(); i++) { - PrismObject object = elements.get(i); - - String oid = repositoryService.addObject(object, null, result); + for (PrismObject object : elements) { + String oid = repositoryService.addObject((PrismObject) object, null, result); AssertJUnit.assertTrue(StringUtils.isNotEmpty(oid)); } From 4de0bfa9360d37326361857b62368355e2e8a0d0 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Wed, 5 Oct 2016 14:36:27 +0200 Subject: [PATCH 18/74] Refactoring serialization. Interim commit. --- .../component/wizard/resource/SchemaStep.java | 4 +- .../admin/configuration/PageAccounts.java | 2 +- .../configuration/PageRepositoryQuery.java | 2 +- .../handlers/dto/ReportCreateHandlerDto.java | 2 +- .../evolveum/midpoint/prism/PrismContext.java | 38 +++++-- .../midpoint/prism/PrismContextImpl.java | 60 +++++------ .../prism/PrismDomSerializerImpl.java | 27 +++++ .../midpoint/prism/PrismParserImpl.java | 6 +- .../midpoint/prism/PrismSerializer.java | 37 +++++++ .../midpoint/prism/PrismSerializerImpl.java | 99 +++++++++++++++++++ .../prism/PrismXNodeSerializerImpl.java | 27 +++++ .../midpoint/prism/SerializationContext.java | 16 ++- .../midpoint/prism/SerializationOptions.java | 89 ++++++++++------- .../prism/marshaller/JaxbDomHack.java | 3 +- .../midpoint/prism/util/PrismTestUtil.java | 2 +- .../prism/util/ValueSerializationUtil.java | 7 +- .../midpoint/prism/TestPrismParsing.java | 2 +- .../midpoint/schema/DeltaConvertor.java | 2 +- .../midpoint/schema/ObjectTreeDeltas.java | 4 +- .../midpoint/schema/TestQueryConvertor.java | 2 +- .../parser/resource/TestParseResource.java | 2 +- .../model/impl/lens/TestClockwork.java | 4 +- .../midpoint/wf/impl/util/MiscDataUtil.java | 2 +- .../midpoint/repo/sql/AddGetObjectTest.java | 6 +- .../container/RAccessCertificationCase.java | 2 +- 25 files changed, 340 insertions(+), 107 deletions(-) create mode 100644 infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismDomSerializerImpl.java create mode 100644 infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismSerializer.java create mode 100644 infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismSerializerImpl.java create mode 100644 infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismXNodeSerializerImpl.java diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/SchemaStep.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/SchemaStep.java index d7290ca0f23..23281427fe0 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/SchemaStep.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/SchemaStep.java @@ -21,7 +21,6 @@ import com.evolveum.midpoint.gui.api.util.WebComponentUtil; import com.evolveum.midpoint.model.api.util.ResourceUtils; import com.evolveum.midpoint.prism.PrismContainer; -import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.schema.SchemaConstantsGenerated; import com.evolveum.midpoint.schema.result.OperationResult; @@ -43,7 +42,6 @@ import org.apache.wicket.extensions.markup.html.tabs.AbstractTab; import org.apache.wicket.extensions.markup.html.tabs.ITab; import org.apache.wicket.markup.html.WebMarkupContainer; -import org.apache.wicket.model.AbstractReadOnlyModel; import org.apache.wicket.model.IModel; import org.jetbrains.annotations.NotNull; @@ -115,7 +113,7 @@ public String getObject() { PageBase page = (PageBase) SchemaStep.this.getPage(); try { - return page.getPrismContext().serializeContainerValueToString(xmlSchema.getValue(), SchemaConstantsGenerated.C_SCHEMA, PrismContext.LANG_XML); + return page.getPrismContext().xmlSerializer().root(SchemaConstantsGenerated.C_SCHEMA).serialize(xmlSchema.getValue()); } catch (SchemaException|RuntimeException ex) { LoggingUtils.logUnexpectedException(LOGGER, "Couldn't serialize resource schema", ex); return WebComponentUtil.exceptionToString("Couldn't serialize resource schema", ex); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageAccounts.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageAccounts.java index f84a16e3d55..8dc68956164 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageAccounts.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageAccounts.java @@ -700,7 +700,7 @@ private void showShadowResult(AjaxRequestTarget target, IModel r try { - xml = getPrismContext().serializeAtomicValue(result, ShadowType.F_RESULT, PrismContext.LANG_XML); + xml = getPrismContext().xmlSerializer().root(ShadowType.F_RESULT).serializeAtomicValue(result); aceEditor.updateModel(new Model(xml)); } catch (SchemaException e) { LoggingUtils.logUnexpectedException(LOGGER, "Couldn't parse result", e); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageRepositoryQuery.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageRepositoryQuery.java index a785e7efef3..9c3878cccb7 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageRepositoryQuery.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageRepositoryQuery.java @@ -370,7 +370,7 @@ private void useInObjectListPerformed(AjaxRequestTarget target) { String filterAsString; if (parsedFilter != null) { SearchFilterType filterType = QueryConvertor.createSearchFilterType(parsedFilter, getPrismContext()); - filterAsString = getPrismContext().serializeAtomicValue(filterType, SchemaConstantsGenerated.Q_FILTER, PrismContext.LANG_XML); + filterAsString = getPrismContext().xmlSerializer().root(SchemaConstantsGenerated.Q_FILTER).serializeAtomicValue(filterType); // TODO remove extra xmlns from serialized value } else { filterAsString = ""; diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/handlers/dto/ReportCreateHandlerDto.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/handlers/dto/ReportCreateHandlerDto.java index aa86eb9eebd..3597a558df8 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/handlers/dto/ReportCreateHandlerDto.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/handlers/dto/ReportCreateHandlerDto.java @@ -57,7 +57,7 @@ public String getReportParams() { PrismContext prismContext = ((MidPointApplication) Application.get()).getPrismContext(); try { return WebXmlUtil.stripNamespaceDeclarations( - prismContext.serializeContainerValueToString(pcv, ReportConstants.REPORT_PARAMS_PROPERTY_NAME, PrismContext.LANG_XML)); + prismContext.xmlSerializer().root(ReportConstants.REPORT_PARAMS_PROPERTY_NAME).serialize(pcv)); } catch (SchemaException e) { throw new SystemException("Couldn't serialize report parameters: " + e.getMessage(), e); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java index c1a5685b685..d3adbb509f5 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java @@ -28,6 +28,7 @@ import com.evolveum.midpoint.prism.schema.SchemaRegistry; import com.evolveum.midpoint.prism.util.PrismMonitor; import com.evolveum.midpoint.prism.xnode.RootXNode; +import com.evolveum.midpoint.prism.xnode.XNode; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.prism.xml.ns._public.types_3.RawType; import org.w3c.dom.Document; @@ -73,19 +74,20 @@ public interface PrismContext { void setMonitor(PrismMonitor monitor); + //region Parsing PrismParser parserFor(File file); PrismParser parserFor(InputStream stream); PrismParserNoIO parserFor(String data); - - @Deprecated - PrismParserNoIO parserFor(Element element); + @Deprecated PrismParserNoIO parserFor(Element element); @Deprecated // user parserFor + parse instead PrismObject parseObject(File file) throws SchemaException, IOException; @Deprecated // user parserFor + parse instead PrismObject parseObject(String dataString) throws SchemaException; + //endregion + //region Adopt methods void adopt(PrismObject object, Class declaredType) throws SchemaException; void adopt(PrismObject object) throws SchemaException; @@ -105,16 +107,31 @@ void adopt(PrismContainerValue void adopt(PrismContainerValue prismContainerValue, QName typeName, ItemPath path) throws SchemaException; + //endregion //region Serializing objects, containers, atomic values (properties) - String serializeObjectToString(PrismObject object, String language) throws SchemaException; - String serializeObjectToString(PrismObject object, String language, SerializationOptions options) throws SchemaException; + PrismSerializer serializerFor(String language); + PrismSerializer xmlSerializer(); + PrismSerializer jsonSerializer(); + PrismSerializer yamlSerializer(); + PrismSerializer domSerializer(); + PrismSerializer xnodeSerializer(); - String serializeContainerValueToString(PrismContainerValue cval, QName elementName, - String language) throws SchemaException; + String serializeObjectToString(PrismObject object, String language) throws SchemaException; - String serializeAtomicValue(Object value, QName elementName, String language) throws SchemaException; + /** + * Serializes an atomic value - i.e. something that fits into a prism property (if such a property would exist). + * + * @param value Value to be serialized. + * @param elementName Element name to be used. + * @param language + * @return + * @throws SchemaException + * + * BEWARE, currently works only for values that can be processed via PrismBeanConvertor - i.e. not for special + * cases like PolyStringType, ProtectedStringType, etc. + */ String serializeAtomicValue(Object value, QName elementName, String language, SerializationOptions serializationOptions) throws SchemaException; @@ -139,12 +156,13 @@ String serializeContainerValueToString(PrismContainerV @Deprecated Element serializeValueToDom(PrismValue pval, QName elementName, Document document) throws SchemaException; + @Deprecated + String serializeXNodeToString(RootXNode query, String langXml) throws SchemaException; + RawType toRawType(Item item) throws SchemaException; PrismObject createObject(Class clazz) throws SchemaException; T createObjectable(Class clazz) throws SchemaException; - @Deprecated - String serializeXNodeToString(RootXNode query, String langXml) throws SchemaException; } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContextImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContextImpl.java index cbff9db5a95..43d17bdc5be 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContextImpl.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContextImpl.java @@ -32,6 +32,7 @@ import com.evolveum.midpoint.prism.schema.SchemaRegistry; import com.evolveum.midpoint.prism.util.PrismMonitor; import com.evolveum.midpoint.prism.xnode.RootXNode; +import com.evolveum.midpoint.prism.xnode.XNode; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.util.exception.SystemException; import com.evolveum.midpoint.util.logging.Trace; @@ -300,9 +301,37 @@ public void adopt(PrismContainer //region Serializing objects, containers, atomic values (properties) @Override public String serializeObjectToString(PrismObject object, String language) throws SchemaException { - Parser parser = getParserNotNull(language); - RootXNode xroot = xnodeProcessor.serializeObject(object); - return parser.serializeToString(xroot, null); + return serializerFor(language).serialize(object); + } + + @Override + public PrismSerializer serializerFor(String language) { + return new PrismSerializerImpl(parserHelpers, language); + } + + @Override + public PrismSerializer xmlSerializer() { + return serializerFor(LANG_XML); + } + + @Override + public PrismSerializer jsonSerializer() { + return serializerFor(LANG_JSON); + } + + @Override + public PrismSerializer yamlSerializer() { + return serializerFor(LANG_YAML); + } + + @Override + public PrismSerializer domSerializer() { + return new PrismDomSerializerImpl(); + } + + @Override + public PrismSerializer xnodeSerializer() { + return new PrismXNodeSerializerImpl(); } @Override @@ -313,15 +342,6 @@ public String serializeObjectToString(PrismObject obje return parser.serializeToString(xroot, SerializationContext.forOptions(options)); } - @Override - public String serializeContainerValueToString(PrismContainerValue cval, QName elementName, - String language) throws SchemaException { - Parser parser = getParserNotNull(language); - - RootXNode xroot = xnodeProcessor.serializeItemValueAsRoot(cval, elementName); - //System.out.println("serialized to xnode: " + xroot.debugDump()); - return parser.serializeToString(xroot, null); - } @Override public String serializeXNodeToString(RootXNode root, String language) throws SchemaException { @@ -329,22 +349,6 @@ public String serializeXNodeToString(RootXNode root, String language) throws Sch return parser.serializeToString(root, null); } - /** - * Serializes an atomic value - i.e. something that fits into a prism property (if such a property would exist). - * - * @param value Value to be serialized. - * @param elementName Element name to be used. - * @param language - * @return - * @throws SchemaException - * - * BEWARE, currently works only for values that can be processed via PrismBeanConvertor - i.e. not for special - * cases like PolyStringType, ProtectedStringType, etc. - */ - @Override - public String serializeAtomicValue(Object value, QName elementName, String language) throws SchemaException { - return serializeAtomicValue(value, elementName, language, null); - } @Override public String serializeAtomicValue(Object value, QName elementName, String language, diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismDomSerializerImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismDomSerializerImpl.java new file mode 100644 index 00000000000..785f0e2f238 --- /dev/null +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismDomSerializerImpl.java @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.prism; + +import org.jetbrains.annotations.NotNull; +import org.w3c.dom.Element; + +/** + * @author mederly + */ +public class PrismDomSerializerImpl implements PrismSerializer { + +} diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserImpl.java index 3314b61f906..1cc17888f86 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserImpl.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserImpl.java @@ -34,12 +34,12 @@ */ public abstract class PrismParserImpl implements PrismParser { - private final ParserSource source; + @NotNull private final ParserSource source; private final String language; @NotNull private final ParsingContext context; - private final ParserHelpers helpers; + @NotNull private final ParserHelpers helpers; - public PrismParserImpl(ParserSource source, String language, @NotNull ParsingContext context, ParserHelpers helpers) { + public PrismParserImpl(@NotNull ParserSource source, String language, @NotNull ParsingContext context, @NotNull ParserHelpers helpers) { this.source = source; this.language = language; this.context = context; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismSerializer.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismSerializer.java new file mode 100644 index 00000000000..2f0fb166847 --- /dev/null +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismSerializer.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.prism; + +import com.evolveum.midpoint.util.exception.SchemaException; +import org.jetbrains.annotations.NotNull; + +import javax.xml.namespace.QName; + +/** + * @author mederly + */ +public interface PrismSerializer { + + PrismSerializer context(SerializationContext context); + PrismSerializer root(QName elementName); + PrismSerializer options(SerializationOptions options); + + T serialize(PrismObject object) throws SchemaException; + T serialize(PrismContainerValue pcv) throws SchemaException; + T serializeAtomicValue(Object value) throws SchemaException; + T serializeAnyData(Object value) throws SchemaException; +} diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismSerializerImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismSerializerImpl.java new file mode 100644 index 00000000000..01b2ffabb2e --- /dev/null +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismSerializerImpl.java @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.prism; + +import com.evolveum.midpoint.prism.parser.Parser; +import com.evolveum.midpoint.prism.parser.ParserHelpers; +import com.evolveum.midpoint.prism.xnode.RootXNode; +import com.evolveum.midpoint.util.exception.SchemaException; +import org.jetbrains.annotations.NotNull; + +import javax.xml.namespace.QName; + +/** + * TODO eliminate code duplication within three implementations of PrismSerializer + * + * @author mederly + */ +public class PrismSerializerImpl implements PrismSerializer { + + @NotNull private final ParserHelpers parserHelpers; + @NotNull private final String language; + private final QName elementName; + private final SerializationContext context; + + public PrismSerializerImpl(@NotNull ParserHelpers parserHelpers, @NotNull String language, QName elementName, SerializationContext context) { + this.parserHelpers = parserHelpers; + this.language = language; + this.elementName = elementName; + this.context = context; + } + + @NotNull + public String getLanguage() { + return language; + } + + @Override + public PrismSerializerImpl context(SerializationContext context) { + return new PrismSerializerImpl(this.parserHelpers, this.language, elementName, context); + } + + @Override + public PrismSerializerImpl root(QName elementName) { + return new PrismSerializerImpl(this.parserHelpers, this.language, elementName, this.context); + } + + @Override + public PrismSerializerImpl options(SerializationOptions options) { + SerializationContext context; + if (this.context != null) { + context = this.context.clone(); + context.setOptions(options); + } else { + context = new SerializationContext(options); + } + return new PrismSerializerImpl(this.parserHelpers, this.language, this.elementName, context); + } + + @Override + public String serialize(PrismObject object) throws SchemaException { + RootXNode xroot = parserHelpers.xnodeProcessor.serializeObject(object, false, context); // TODO serialize composite objects? + if (elementName != null) { + xroot.setRootElementName(elementName); // TODO what about the type? + } + return getParser().serializeToString(xroot, context); + } + + private Parser getParser() { + return parserHelpers.parserRegistry.parserFor(language); + } + + @Override + public String serialize(PrismContainerValue cval) throws SchemaException { + RootXNode xroot = parserHelpers.xnodeProcessor.serializeItemValueAsRoot(cval, elementName); // TODO context + return getParser().serializeToString(xroot, context); + } + + @Override + public String serializeAtomicValue(Object value) throws SchemaException { + RootXNode xroot = parserHelpers.xnodeProcessor.serializeAtomicValue(value, elementName, context); + return getParser().serializeToString(xroot, context); + } + + +} diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismXNodeSerializerImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismXNodeSerializerImpl.java new file mode 100644 index 00000000000..caaf2c11ebd --- /dev/null +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismXNodeSerializerImpl.java @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.prism; + +import com.evolveum.midpoint.prism.xnode.XNode; +import org.w3c.dom.Element; + +/** + * @author mederly + */ +public class PrismXNodeSerializerImpl implements PrismSerializer { + +} diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializationContext.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializationContext.java index 49bf4524ee0..8fe08d7411f 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializationContext.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializationContext.java @@ -22,7 +22,7 @@ * * @author Pavol Mederly */ -public class SerializationContext { +public class SerializationContext implements Cloneable { private SerializationOptions options; @@ -45,4 +45,18 @@ public static boolean isSerializeReferenceNames(SerializationContext ctx) { public static SerializationContext forOptions(SerializationOptions options) { return new SerializationContext(options); } + + @Override + protected SerializationContext clone() { + SerializationContext clone = null; + try { + clone = (SerializationContext) super.clone(); + } catch (CloneNotSupportedException e) { + throw new IllegalStateException(e); + } + if (options != null) { + clone.options = options.clone(); + } + return clone; + } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializationOptions.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializationOptions.java index 1e3bfaf85f4..35ef65dc84a 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializationOptions.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializationOptions.java @@ -19,13 +19,13 @@ /** * @author Pavol Mederly */ -public class SerializationOptions { +public class SerializationOptions implements Cloneable { private boolean serializeReferenceNames; private ItemNameQualificationStrategy itemNameQualificationStrategy; - private NameQualificationStrategy itemTypeQualificationStrategy; - private NameQualificationStrategy itemPathQualificationStrategy; - private NameQualificationStrategy genericQualificationStrategy; +// private NameQualificationStrategy itemTypeQualificationStrategy; +// private NameQualificationStrategy itemPathQualificationStrategy; +// private NameQualificationStrategy genericQualificationStrategy; public boolean isSerializeReferenceNames() { return serializeReferenceNames; @@ -45,44 +45,44 @@ public static boolean isSerializeReferenceNames(SerializationOptions options) { return options != null && options.isSerializeReferenceNames(); } - public ItemNameQualificationStrategy getItemNameQualificationStrategy() { - return itemNameQualificationStrategy; - } - - public void setItemNameQualificationStrategy(ItemNameQualificationStrategy itemNameQualificationStrategy) { - this.itemNameQualificationStrategy = itemNameQualificationStrategy; - } - - public NameQualificationStrategy getItemTypeQualificationStrategy() { - return itemTypeQualificationStrategy; - } - - public void setItemTypeQualificationStrategy(NameQualificationStrategy itemTypeQualificationStrategy) { - this.itemTypeQualificationStrategy = itemTypeQualificationStrategy; - } - - public NameQualificationStrategy getItemPathQualificationStrategy() { - return itemPathQualificationStrategy; - } - - public void setItemPathQualificationStrategy(NameQualificationStrategy itemPathQualificationStrategy) { - this.itemPathQualificationStrategy = itemPathQualificationStrategy; - } - - public NameQualificationStrategy getGenericQualificationStrategy() { - return genericQualificationStrategy; - } - - public void setGenericQualificationStrategy(NameQualificationStrategy genericQualificationStrategy) { - this.genericQualificationStrategy = genericQualificationStrategy; - } +// public ItemNameQualificationStrategy getItemNameQualificationStrategy() { +// return itemNameQualificationStrategy; +// } +// +// public void setItemNameQualificationStrategy(ItemNameQualificationStrategy itemNameQualificationStrategy) { +// this.itemNameQualificationStrategy = itemNameQualificationStrategy; +// } +// +// public NameQualificationStrategy getItemTypeQualificationStrategy() { +// return itemTypeQualificationStrategy; +// } +// +// public void setItemTypeQualificationStrategy(NameQualificationStrategy itemTypeQualificationStrategy) { +// this.itemTypeQualificationStrategy = itemTypeQualificationStrategy; +// } +// +// public NameQualificationStrategy getItemPathQualificationStrategy() { +// return itemPathQualificationStrategy; +// } +// +// public void setItemPathQualificationStrategy(NameQualificationStrategy itemPathQualificationStrategy) { +// this.itemPathQualificationStrategy = itemPathQualificationStrategy; +// } +// +// public NameQualificationStrategy getGenericQualificationStrategy() { +// return genericQualificationStrategy; +// } +// +// public void setGenericQualificationStrategy(NameQualificationStrategy genericQualificationStrategy) { +// this.genericQualificationStrategy = genericQualificationStrategy; +// } public static SerializationOptions createQualifiedNames() { SerializationOptions opts = new SerializationOptions(); opts.itemNameQualificationStrategy = ItemNameQualificationStrategy.ALWAYS_USE_FULL_URI; - opts.itemPathQualificationStrategy = NameQualificationStrategy.ALWAYS; - opts.itemTypeQualificationStrategy = NameQualificationStrategy.ALWAYS; - opts.genericQualificationStrategy = NameQualificationStrategy.ALWAYS; +// opts.itemPathQualificationStrategy = NameQualificationStrategy.ALWAYS; +// opts.itemTypeQualificationStrategy = NameQualificationStrategy.ALWAYS; +// opts.genericQualificationStrategy = NameQualificationStrategy.ALWAYS; return opts; } @@ -93,4 +93,17 @@ public static boolean isFullItemNameUris(SerializationOptions opts) { public static boolean isUseNsProperty(SerializationOptions opts) { return opts == null || opts.itemNameQualificationStrategy == null || opts.itemNameQualificationStrategy == ItemNameQualificationStrategy.USE_NS_PROPERTY; } + + @Override + protected SerializationOptions clone() { + SerializationOptions clone = null; + try { + clone = (SerializationOptions) super.clone(); + } catch (CloneNotSupportedException e) { + e.printStackTrace(); + } + clone.serializeReferenceNames = this.serializeReferenceNames; + clone.itemNameQualificationStrategy = itemNameQualificationStrategy; + return clone; + } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/JaxbDomHack.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/JaxbDomHack.java index 57154680fe4..8017e2214e7 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/JaxbDomHack.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/JaxbDomHack.java @@ -424,8 +424,7 @@ public String silentMarshalObject(Object object, Trace logger) { if (object instanceof Objectable) { xml = prismContext.serializeObjectToString(((Objectable) object).asPrismObject(), PrismContext.LANG_XML); } else if (object instanceof Containerable) { - xml = prismContext.serializeContainerValueToString(((Containerable) object).asPrismContainerValue(), - fakeQName, PrismContext.LANG_XML); + xml = prismContext.xmlSerializer().root(fakeQName).serialize(((Containerable) object).asPrismContainerValue()); } else { xml = prismContext.serializeAnyData(object, fakeQName, PrismContext.LANG_XML); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/PrismTestUtil.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/PrismTestUtil.java index d6e284d0ffb..8cfc223573f 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/PrismTestUtil.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/PrismTestUtil.java @@ -144,7 +144,7 @@ public static String serializeObjectToString(PrismObject o } public static String serializeAtomicValue(Object object, QName elementName) throws SchemaException { - return getPrismContext().serializeAtomicValue(object, elementName, PrismContext.LANG_XML); + return getPrismContext().xmlSerializer().root(elementName).serializeAtomicValue(object); } public static String serializeAnyData(Object o, QName defaultRootElementName) throws SchemaException { diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/ValueSerializationUtil.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/ValueSerializationUtil.java index 7b5290ed63d..39f78d4bbd6 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/ValueSerializationUtil.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/ValueSerializationUtil.java @@ -21,14 +21,11 @@ import com.evolveum.midpoint.prism.xnode.XNode; import com.evolveum.midpoint.util.exception.SchemaException; +@Deprecated public class ValueSerializationUtil { - public static String serializeValue(T value, ItemDefinition def, QName itemName, PrismContext prismContext, String language) throws SchemaException{ - return serializeValue(value, def, itemName, null, prismContext, language); - } - + public static String serializeValue(T value, ItemDefinition def, QName itemName, QName parentName, PrismContext prismContext, String language) throws SchemaException{ -// System.out.println("value serialization"); if (value == null){ return null; } diff --git a/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestPrismParsing.java b/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestPrismParsing.java index 54fed080609..4e21ec67b11 100644 --- a/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestPrismParsing.java +++ b/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestPrismParsing.java @@ -184,7 +184,7 @@ private void roundTrip(File file) throws SchemaException, SAXException, IOExcept // WHEN // We need to serialize with composite objects during roundtrip, otherwise the result will not be equal - String userXml = prismContext.serializeObjectToString(originalUser, getOutputFormat(), null); + String userXml = prismContext.serializerFor(getOutputFormat()).serialize(originalUser); // THEN System.out.println("Serialized user:"); diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/DeltaConvertor.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/DeltaConvertor.java index cb662c1df84..993be4f6908 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/DeltaConvertor.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/DeltaConvertor.java @@ -248,7 +248,7 @@ public static String toObjectDeltaTypeXml(ObjectDelta delt ObjectDeltaType objectDeltaType = toObjectDeltaType(delta, options); SerializationOptions serializationOptions = new SerializationOptions(); serializationOptions.setSerializeReferenceNames(DeltaConversionOptions.isSerializeReferenceNames(options)); - return delta.getPrismContext().serializeAtomicValue(objectDeltaType, SchemaConstants.T_OBJECT_DELTA, PrismContext.LANG_XML, serializationOptions); + return delta.getPrismContext().xmlSerializer().root(SchemaConstants.T_OBJECT_DELTA).options(serializationOptions).serializeAtomicValue(objectDeltaType); } diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/ObjectTreeDeltas.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/ObjectTreeDeltas.java index 0fe1b491311..ac43fd5b241 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/ObjectTreeDeltas.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/ObjectTreeDeltas.java @@ -118,7 +118,7 @@ public Set lensContextType = context.toPrismContainer(); - String xml = prismContext.serializeContainerValueToString(lensContextType.getValue(), lensContextType.getElementName(), PrismContext.LANG_XML); + String xml = prismContext.xmlSerializer().root(lensContextType.getElementName()).serialize(lensContextType.getValue()); System.out.println("Serialized form = " + xml); @@ -312,7 +312,7 @@ private void assignAccountToJackAsync(String testName, boolean serialize) throws System.out.println("Context before serialization = " + context.debugDump()); PrismContainer lensContextType = context.toPrismContainer(); - String xml = prismContext.serializeContainerValueToString(lensContextType.getValue(), lensContextType.getElementName(), PrismContext.LANG_XML); + String xml = prismContext.xmlSerializer().root(lensContextType.getElementName()).serialize(lensContextType.getValue()); System.out.println("Serialized form = " + xml); diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/util/MiscDataUtil.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/util/MiscDataUtil.java index 93ce57aa6ff..b226728fd0c 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/util/MiscDataUtil.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/util/MiscDataUtil.java @@ -184,7 +184,7 @@ public static String serializeObjectToXml(PrismObject obje public static String serializeContainerableToXml(Containerable containerable, PrismContext prismContext) { try { PrismContainerValue value = containerable.asPrismContainerValue(); - return prismContext.serializeContainerValueToString(value, value.getContainer().getElementName(), PrismContext.LANG_XML); + return prismContext.xmlSerializer().root(value.getContainer().getElementName()).serialize(value); } catch (SchemaException e) { throw new SystemException("Couldn't serialize a Containerable " + containerable + " into XML", e); } diff --git a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/AddGetObjectTest.java b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/AddGetObjectTest.java index 6950a6f1dda..980132d4fe2 100644 --- a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/AddGetObjectTest.java +++ b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/AddGetObjectTest.java @@ -541,9 +541,9 @@ private String toRepo(T value, PrismContext prismContext) if (value instanceof Containerable) { // TODO: createFakeParentElement??? why we don't use the real // name??? - return prismContext.serializeContainerValueToString( - ((Containerable) value).asPrismContainerValue(), - QNameUtil.getNodeQName(RUtil.createFakeParentElement()), prismContext.LANG_XML); + return prismContext.xmlSerializer() + .root(QNameUtil.getNodeQName(RUtil.createFakeParentElement())) + .serialize(((Containerable) value).asPrismContainerValue()); } diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RAccessCertificationCase.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RAccessCertificationCase.java index e2ecbeec23f..157c4a64f32 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RAccessCertificationCase.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RAccessCertificationCase.java @@ -396,7 +396,7 @@ private static RAccessCertificationCase toRepo(AccessCertificationCaseType case1 PrismContainerValue cvalue = case1.asPrismContainerValue(); String xml; try { - xml = prismContext.serializeContainerValueToString(cvalue, new QName("value"), PrismContext.LANG_XML); + xml = prismContext.xmlSerializer().root(new QName("value")).serialize(cvalue); } catch (SchemaException e) { throw new IllegalStateException("Couldn't serialize certification case to string", e); } From dde2deb243799f2ec9df9334742b1fad0909a11f Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Wed, 5 Oct 2016 17:41:27 +0200 Subject: [PATCH 19/74] Interim commit (cleaning-up serialization). --- .../gui/api/component/result/OpResult.java | 2 +- .../component/input/SearchFilterPanel.java | 2 +- .../input/dto/ExpressionTypeDto.java | 4 +- .../web/component/prism/PrismValuePanel.java | 2 +- .../component/wizard/resource/SchemaStep.java | 2 +- .../dto/IterationSpecificationTypeDto.java | 4 +- .../certification/dto/DefinitionScopeDto.java | 2 +- .../admin/configuration/PageAccounts.java | 2 +- .../configuration/PageRepositoryQuery.java | 2 +- .../web/page/admin/server/dto/TaskDto.java | 4 +- .../dto/ExecuteChangesHandlerDto.java | 2 +- .../handlers/dto/QueryBasedHandlerDto.java | 2 +- .../handlers/dto/ReportCreateHandlerDto.java | 2 +- .../dto/ScriptExecutionHandlerDto.java | 2 +- .../midpoint/web/util/ExpressionUtil.java | 4 +- .../evolveum/midpoint/prism/PrismContext.java | 34 ------- .../midpoint/prism/PrismContextImpl.java | 89 +------------------ .../prism/PrismDomSerializerImpl.java | 27 ------ .../midpoint/prism/PrismSerializer.java | 27 +++++- .../midpoint/prism/PrismSerializerImpl.java | 82 ++++++++++------- .../prism/PrismXNodeSerializerImpl.java | 27 ------ .../midpoint/prism/SerializerDomTarget.java | 22 +++++ .../prism/SerializerStringTarget.java | 27 ++++++ .../midpoint/prism/SerializerTarget.java | 20 +++++ .../midpoint/prism/SerializerXNodeTarget.java | 22 +++++ .../prism/marshaller/JaxbDomHack.java | 4 +- .../midpoint/prism/parser/ParserRegistry.java | 10 ++- .../midpoint/prism/util/PrismTestUtil.java | 6 +- .../midpoint/schema/DeltaConvertor.java | 2 +- .../midpoint/schema/ObjectTreeDeltas.java | 4 +- .../midpoint/schema/TestQueryConvertor.java | 2 +- .../parser/resource/TestParseResource.java | 2 +- .../xpath/LazyXPathVariableResolver.java | 6 +- .../midpoint/model/impl/ModelWebService.java | 2 +- .../model/impl/ModelWebServiceRaw.java | 16 ++-- .../model/impl/lens/TestClockwork.java | 4 +- .../report/impl/CustomDataWriter.java | 2 +- .../report/impl/ReportWebServiceRaw.java | 6 +- .../midpoint/wf/impl/util/MiscDataUtil.java | 2 +- ...gleItemSerializationSafeContainerImpl.java | 2 +- .../midpoint/repo/sql/AddGetObjectTest.java | 4 +- .../container/RAccessCertificationCase.java | 2 +- .../midpoint/repo/sql/util/RUtil.java | 11 +-- 43 files changed, 228 insertions(+), 274 deletions(-) delete mode 100644 infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismDomSerializerImpl.java delete mode 100644 infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismXNodeSerializerImpl.java create mode 100644 infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializerDomTarget.java create mode 100644 infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializerStringTarget.java create mode 100644 infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializerTarget.java create mode 100644 infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializerXNodeTarget.java diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/result/OpResult.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/result/OpResult.java index 29fbb2d7587..2bcf91231bd 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/result/OpResult.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/result/OpResult.java @@ -142,7 +142,7 @@ public static OpResult getOpResult(PageBase page, OperationResult result){ try { OperationResultType resultType = result.createOperationResultType(); ObjectFactory of = new ObjectFactory(); - opResult.xml = page.getPrismContext().serializeAtomicValue(of.createOperationResult(resultType), PrismContext.LANG_XML); + opResult.xml = page.getPrismContext().xmlSerializer().serializeAtomicValue(of.createOperationResult(resultType)); } catch (SchemaException|RuntimeException ex) { String m = "Can't create xml: " + ex; // error(m); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/input/SearchFilterPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/input/SearchFilterPanel.java index b370973288f..4ee67bf54e2 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/input/SearchFilterPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/input/SearchFilterPanel.java @@ -71,7 +71,7 @@ private String loadFilterClause(PrismContext prismContext) { T filter = getModelObject(); if (filter.containsFilterClause()) { RootXNode clause = filter.getFilterClauseAsRootXNode(); - String xml = prismContext.serializeXNodeToString(clause, PrismContext.LANG_XML); + String xml = prismContext.xmlSerializer().serialize(clause); return WebXmlUtil.stripNamespaceDeclarations(xml); } else { return null; diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/input/dto/ExpressionTypeDto.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/input/dto/ExpressionTypeDto.java index 27b9d3a6c98..03d5e0b2f94 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/input/dto/ExpressionTypeDto.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/input/dto/ExpressionTypeDto.java @@ -63,12 +63,12 @@ public ExpressionTypeDto(@Nullable ExpressionType expression, @NotNull PrismCont private void loadExpression(PrismContext context) { try { if (expressionObject.getExpressionEvaluator().size() == 1) { - expression = context.serializeAtomicValue(expressionObject.getExpressionEvaluator().get(0), PrismContext.LANG_XML); + expression = context.xmlSerializer().serializeAtomicValue(expressionObject.getExpressionEvaluator().get(0)); } else { StringBuilder sb = new StringBuilder(); for (JAXBElement element: expressionObject.getExpressionEvaluator()) { - String subElement = context.serializeAtomicValue(element, PrismContext.LANG_XML); + String subElement = context.xmlSerializer().serializeAtomicValue(element); sb.append(subElement).append("\n"); } expression = sb.toString(); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/PrismValuePanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/PrismValuePanel.java index cb11417763b..521f8682b4d 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/PrismValuePanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/PrismValuePanel.java @@ -587,7 +587,7 @@ public Object getObject() { } PrismContext prismContext = ((PageBase) getPage()).getPrismContext(); try { - return prismContext.serializeAnyData(ppv.getValue(), name, PrismContext.LANG_XML); + return prismContext.xmlSerializer().serializeAnyData(ppv.getValue(), name); } catch (SchemaException e) { throw new SystemException("Couldn't serialize property value of type: " + valueType + ": " + e.getMessage(), e); } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/SchemaStep.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/SchemaStep.java index 23281427fe0..d4cd5ce49e7 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/SchemaStep.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/SchemaStep.java @@ -113,7 +113,7 @@ public String getObject() { PageBase page = (PageBase) SchemaStep.this.getPage(); try { - return page.getPrismContext().xmlSerializer().root(SchemaConstantsGenerated.C_SCHEMA).serialize(xmlSchema.getValue()); + return page.getPrismContext().xmlSerializer().serialize(xmlSchema.getValue(), SchemaConstantsGenerated.C_SCHEMA); } catch (SchemaException|RuntimeException ex) { LoggingUtils.logUnexpectedException(LOGGER, "Couldn't serialize resource schema", ex); return WebComponentUtil.exceptionToString("Couldn't serialize resource schema", ex); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/dto/IterationSpecificationTypeDto.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/dto/IterationSpecificationTypeDto.java index 52f44f2d0b9..733b5093d23 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/dto/IterationSpecificationTypeDto.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/dto/IterationSpecificationTypeDto.java @@ -89,11 +89,11 @@ private void loadExpression(String expression, ExpressionUtil.ExpressionEvaluato try{ if(expressionType.getExpressionEvaluator().size() == 1){ - expression = prismContext.serializeAtomicValue(expressionType.getExpressionEvaluator().get(0), PrismContext.LANG_XML); + expression = prismContext.xmlSerializer().serializeAtomicValue(expressionType.getExpressionEvaluator().get(0)); } else { StringBuilder sb = new StringBuilder(); for(JAXBElement element: expressionType.getExpressionEvaluator()){ - String subElement = prismContext.serializeAtomicValue(element, PrismContext.LANG_XML); + String subElement = prismContext.xmlSerializer().serializeAtomicValue(element); sb.append(subElement).append("\n"); } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/certification/dto/DefinitionScopeDto.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/certification/dto/DefinitionScopeDto.java index cc87e271035..dfaa4ac99d2 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/certification/dto/DefinitionScopeDto.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/certification/dto/DefinitionScopeDto.java @@ -46,7 +46,7 @@ public void loadSearchFilter(SearchFilterType searchFilterType, PrismContext pri try { RootXNode clause = searchFilterType.getFilterClauseAsRootXNode(); - searchFilterText = prismContext.serializeXNodeToString(clause, PrismContext.LANG_XML); + searchFilterText = prismContext.xmlSerializer().serialize(clause); } catch (SchemaException e) { throw new SystemException("Cannot serialize search filter " + searchFilterType + ": " + e.getMessage(), e); } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageAccounts.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageAccounts.java index 8dc68956164..3204556970e 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageAccounts.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageAccounts.java @@ -700,7 +700,7 @@ private void showShadowResult(AjaxRequestTarget target, IModel r try { - xml = getPrismContext().xmlSerializer().root(ShadowType.F_RESULT).serializeAtomicValue(result); + xml = getPrismContext().xmlSerializer().serializeAtomicValue(result, ShadowType.F_RESULT); aceEditor.updateModel(new Model(xml)); } catch (SchemaException e) { LoggingUtils.logUnexpectedException(LOGGER, "Couldn't parse result", e); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageRepositoryQuery.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageRepositoryQuery.java index 9c3878cccb7..1b2d119ea6b 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageRepositoryQuery.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageRepositoryQuery.java @@ -370,7 +370,7 @@ private void useInObjectListPerformed(AjaxRequestTarget target) { String filterAsString; if (parsedFilter != null) { SearchFilterType filterType = QueryConvertor.createSearchFilterType(parsedFilter, getPrismContext()); - filterAsString = getPrismContext().xmlSerializer().root(SchemaConstantsGenerated.Q_FILTER).serializeAtomicValue(filterType); + filterAsString = getPrismContext().xmlSerializer().serializeAtomicValue(filterType, SchemaConstantsGenerated.Q_FILTER); // TODO remove extra xmlns from serialized value } else { filterAsString = ""; diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/dto/TaskDto.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/dto/TaskDto.java index fa63a9618e2..8d425de4cc6 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/dto/TaskDto.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/dto/TaskDto.java @@ -788,7 +788,7 @@ public String getObjectQuery() { QueryType queryType = getExtensionPropertyRealValue(SchemaConstants.MODEL_EXTENSION_OBJECT_QUERY, QueryType.class); PrismContext prismContext = ((MidPointApplication) Application.get()).getPrismContext(); try { - return prismContext.serializeAnyData(queryType, SchemaConstants.MODEL_EXTENSION_OBJECT_QUERY, PrismContext.LANG_XML); + return prismContext.xmlSerializer().serializeAnyData(queryType, SchemaConstants.MODEL_EXTENSION_OBJECT_QUERY); } catch (SchemaException e) { throw new SystemException("Couldn't serialize query: " + e.getMessage(), e); } @@ -798,7 +798,7 @@ public String getObjectDelta() { ObjectDeltaType objectDeltaType = getExtensionPropertyRealValue(SchemaConstants.MODEL_EXTENSION_OBJECT_DELTA, ObjectDeltaType.class); PrismContext prismContext = ((MidPointApplication) Application.get()).getPrismContext(); try { - return prismContext.serializeAnyData(objectDeltaType, SchemaConstants.MODEL_EXTENSION_OBJECT_DELTA, PrismContext.LANG_XML); + return prismContext.xmlSerializer().serializeAnyData(objectDeltaType, SchemaConstants.MODEL_EXTENSION_OBJECT_DELTA); } catch (SchemaException e) { throw new SystemException("Couldn't serialize delta: " + e.getMessage(), e); } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/handlers/dto/ExecuteChangesHandlerDto.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/handlers/dto/ExecuteChangesHandlerDto.java index 26f09ab69ba..f7f488db2e8 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/handlers/dto/ExecuteChangesHandlerDto.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/handlers/dto/ExecuteChangesHandlerDto.java @@ -45,7 +45,7 @@ public String getObjectDeltaXml() { PrismContext prismContext = ((MidPointApplication) Application.get()).getPrismContext(); try { return WebXmlUtil.stripNamespaceDeclarations( - prismContext.serializeAnyData(objectDeltaType, SchemaConstants.MODEL_EXTENSION_OBJECT_DELTA, PrismContext.LANG_XML)); + prismContext.xmlSerializer().serializeAnyData(objectDeltaType, SchemaConstants.MODEL_EXTENSION_OBJECT_DELTA)); } catch (SchemaException e) { throw new SystemException("Couldn't serialize object delta: " + e.getMessage(), e); } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/handlers/dto/QueryBasedHandlerDto.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/handlers/dto/QueryBasedHandlerDto.java index d6286ac89ef..718837f1664 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/handlers/dto/QueryBasedHandlerDto.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/handlers/dto/QueryBasedHandlerDto.java @@ -58,7 +58,7 @@ public String getObjectQuery() { PrismContext prismContext = ((MidPointApplication) Application.get()).getPrismContext(); try { return WebXmlUtil.stripNamespaceDeclarations( - prismContext.serializeAnyData(query, SchemaConstants.MODEL_EXTENSION_OBJECT_QUERY, PrismContext.LANG_XML)); + prismContext.xmlSerializer().serializeAnyData(query, SchemaConstants.MODEL_EXTENSION_OBJECT_QUERY)); } catch (SchemaException e) { throw new SystemException("Couldn't serialize query: " + e.getMessage(), e); } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/handlers/dto/ReportCreateHandlerDto.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/handlers/dto/ReportCreateHandlerDto.java index 3597a558df8..0e368554860 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/handlers/dto/ReportCreateHandlerDto.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/handlers/dto/ReportCreateHandlerDto.java @@ -57,7 +57,7 @@ public String getReportParams() { PrismContext prismContext = ((MidPointApplication) Application.get()).getPrismContext(); try { return WebXmlUtil.stripNamespaceDeclarations( - prismContext.xmlSerializer().root(ReportConstants.REPORT_PARAMS_PROPERTY_NAME).serialize(pcv)); + prismContext.xmlSerializer().serialize(pcv, ReportConstants.REPORT_PARAMS_PROPERTY_NAME)); } catch (SchemaException e) { throw new SystemException("Couldn't serialize report parameters: " + e.getMessage(), e); } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/handlers/dto/ScriptExecutionHandlerDto.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/handlers/dto/ScriptExecutionHandlerDto.java index 9f3094c72bb..41495447555 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/handlers/dto/ScriptExecutionHandlerDto.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/handlers/dto/ScriptExecutionHandlerDto.java @@ -45,7 +45,7 @@ public String getScript() { PrismContext prismContext = ((MidPointApplication) Application.get()).getPrismContext(); try { return WebXmlUtil.stripNamespaceDeclarations( - prismContext.serializeAnyData(script, SchemaConstants.SE_EXECUTE_SCRIPT, PrismContext.LANG_XML)); + prismContext.xmlSerializer().serializeAnyData(script, SchemaConstants.SE_EXECUTE_SCRIPT)); } catch (SchemaException e) { throw new SystemException("Couldn't serialize script: " + e.getMessage(), e); } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/util/ExpressionUtil.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/util/ExpressionUtil.java index 64fd46bb7d3..eaeaed5f253 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/util/ExpressionUtil.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/util/ExpressionUtil.java @@ -230,9 +230,9 @@ private static String serialize(JAXBElement element, PrismContext prismContex if (element.getValue() instanceof RawType) { RawType raw = (RawType) element.getValue(); RootXNode rootNode = new RootXNode(element.getName(), raw.serializeToXNode()); - xml = prismContext.serializeXNodeToString(rootNode, PrismContext.LANG_XML); + xml = prismContext.xmlSerializer().serialize(rootNode); } else { - xml = prismContext.serializeAtomicValue(element, PrismContext.LANG_XML); + xml = prismContext.xmlSerializer().serializeAtomicValue(element); } return WebXmlUtil.stripNamespaceDeclarations(xml); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java index d3adbb509f5..3ccd1a6b466 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java @@ -120,45 +120,11 @@ void adopt(PrismContainerValue String serializeObjectToString(PrismObject object, String language) throws SchemaException; - /** - * Serializes an atomic value - i.e. something that fits into a prism property (if such a property would exist). - * - * @param value Value to be serialized. - * @param elementName Element name to be used. - * @param language - * @return - * @throws SchemaException - * - * BEWARE, currently works only for values that can be processed via PrismBeanConvertor - i.e. not for special - * cases like PolyStringType, ProtectedStringType, etc. - */ - - String serializeAtomicValue(Object value, QName elementName, String language, SerializationOptions serializationOptions) throws SchemaException; - - String serializeAtomicValue(JAXBElement element, String language) throws SchemaException; - - String serializeAnyData(Object object, String language) throws SchemaException; - - String serializeAnyData(Object object, QName defaultRootElementName, String language) throws SchemaException; - - Element serializeAnyDataToElement(Object object, QName defaultRootElementName) throws SchemaException; - - Element serializeAnyDataToElement(Object object, QName defaultRootElementName, SerializationContext ctx) throws SchemaException; - boolean canSerialize(Object value); - @Deprecated - Element serializeToDom(PrismObject object) throws SchemaException; - - @Deprecated - Element serializeValueToDom(PrismValue pval, QName elementName) throws SchemaException; - @Deprecated Element serializeValueToDom(PrismValue pval, QName elementName, Document document) throws SchemaException; - @Deprecated - String serializeXNodeToString(RootXNode query, String langXml) throws SchemaException; - RawType toRawType(Item item) throws SchemaException; PrismObject createObject(Class clazz) throws SchemaException; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContextImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContextImpl.java index 43d17bdc5be..166f7614a29 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContextImpl.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContextImpl.java @@ -306,7 +306,7 @@ public String serializeObjectToString(PrismObject obje @Override public PrismSerializer serializerFor(String language) { - return new PrismSerializerImpl(parserHelpers, language); + return new PrismSerializerImpl<>(new SerializerStringTarget(parserHelpers, language), null, null); } @Override @@ -326,83 +326,14 @@ public PrismSerializer yamlSerializer() { @Override public PrismSerializer domSerializer() { - return new PrismDomSerializerImpl(); + return new PrismSerializerImpl<>(new SerializerDomTarget(parserHelpers), null, null); } @Override public PrismSerializer xnodeSerializer() { - return new PrismXNodeSerializerImpl(); + return new PrismSerializerImpl<>(new SerializerXNodeTarget(parserHelpers), null, null); } - @Override - public String serializeObjectToString(PrismObject object, String language, - SerializationOptions options) throws SchemaException { - Parser parser = getParserNotNull(language); - RootXNode xroot = xnodeProcessor.serializeObject(object); - return parser.serializeToString(xroot, SerializationContext.forOptions(options)); - } - - - @Override - public String serializeXNodeToString(RootXNode root, String language) throws SchemaException { - Parser parser = getParserNotNull(language); - return parser.serializeToString(root, null); - } - - - @Override - public String serializeAtomicValue(Object value, QName elementName, String language, - SerializationOptions serializationOptions) throws SchemaException { - Parser parser = getParserNotNull(language); - SerializationContext sc = new SerializationContext(serializationOptions); - RootXNode xnode = xnodeProcessor.serializeAtomicValue(value, elementName, sc); - return parser.serializeToString(xnode, sc); - } - - @Override - public String serializeAtomicValue(JAXBElement element, String language) throws SchemaException { - Parser parser = getParserNotNull(language); - RootXNode xnode = xnodeProcessor.serializeAtomicValue(element); - return parser.serializeToString(xnode, null, null); - } - - - /** - * Serializes any data - i.e. either Item or an atomic value. - * Does not support PrismValues: TODO: implement that! - * - * @param object - * @param language - * @return - * @throws SchemaException - */ - - @Override - public String serializeAnyData(Object object, String language) throws SchemaException { - Parser parser = getParserNotNull(language); - RootXNode xnode = xnodeProcessor.serializeAnyData(object, null); - return parser.serializeToString(xnode, null); - } - - @Override - public String serializeAnyData(Object object, QName defaultRootElementName, String language) throws SchemaException { - Parser parser = getParserNotNull(language); - RootXNode xnode = xnodeProcessor.serializeAnyData(object, defaultRootElementName, null); - return parser.serializeToString(xnode, null); - } - - @Override - public Element serializeAnyDataToElement(Object object, QName defaultRootElementName) throws SchemaException { - RootXNode xnode = xnodeProcessor.serializeAnyData(object, defaultRootElementName, null); - return getParserDom().serializeXRootToElement(xnode); - } - - @Override - public Element serializeAnyDataToElement(Object object, QName defaultRootElementName, SerializationContext ctx) throws SchemaException { - RootXNode xnode = xnodeProcessor.serializeAnyData(object, defaultRootElementName, ctx); - return getParserDom().serializeXRootToElement(xnode); - } - @Override public boolean canSerialize(Object value) { return xnodeProcessor.canSerialize(value); @@ -423,20 +354,6 @@ public boolean canSerialize(Object value) { // return parser.serializeToString(xroot); // } - @Override - @Deprecated - public Element serializeToDom(PrismObject object) throws SchemaException { - RootXNode xroot = xnodeProcessor.serializeObject(object); - return getParserDom().serializeXRootToElement(xroot); - } - - @Override - @Deprecated - public Element serializeValueToDom(PrismValue pval, QName elementName) throws SchemaException { - RootXNode xroot = xnodeProcessor.serializeItemValueAsRoot(pval, elementName); - return getParserDom().serializeXRootToElement(xroot); - } - @Override @Deprecated public Element serializeValueToDom(PrismValue pval, QName elementName, Document document) throws SchemaException { diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismDomSerializerImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismDomSerializerImpl.java deleted file mode 100644 index 785f0e2f238..00000000000 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismDomSerializerImpl.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright (c) 2010-2016 Evolveum - * - * 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 com.evolveum.midpoint.prism; - -import org.jetbrains.annotations.NotNull; -import org.w3c.dom.Element; - -/** - * @author mederly - */ -public class PrismDomSerializerImpl implements PrismSerializer { - -} diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismSerializer.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismSerializer.java index 2f0fb166847..ce853b50fa8 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismSerializer.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismSerializer.java @@ -16,9 +16,12 @@ package com.evolveum.midpoint.prism; +import com.evolveum.midpoint.prism.xnode.RootXNode; +import com.evolveum.midpoint.prism.xnode.XNode; import com.evolveum.midpoint.util.exception.SchemaException; import org.jetbrains.annotations.NotNull; +import javax.xml.bind.JAXBElement; import javax.xml.namespace.QName; /** @@ -31,7 +34,25 @@ public interface PrismSerializer { PrismSerializer options(SerializationOptions options); T serialize(PrismObject object) throws SchemaException; - T serialize(PrismContainerValue pcv) throws SchemaException; - T serializeAtomicValue(Object value) throws SchemaException; - T serializeAnyData(Object value) throws SchemaException; + T serialize(PrismValue value) throws SchemaException; + T serialize(PrismValue value, QName rootName) throws SchemaException; + + @Deprecated + T serialize(RootXNode xnode) throws SchemaException; + + /** + * Serializes an atomic value - i.e. something that fits into a prism property (if such a property would exist). + * + * value Value to be serialized. + * elementName Element name to be used. + * + * BEWARE, currently works only for values that can be processed via PrismBeanConvertor - i.e. not for special + * cases like PolyStringType, ProtectedStringType, etc. + */ + + T serializeAtomicValue(JAXBElement value) throws SchemaException; + T serializeAtomicValue(Object value) throws SchemaException; + T serializeAtomicValue(Object value, QName rootName) throws SchemaException; + T serializeAnyData(Object value) throws SchemaException; + T serializeAnyData(Object value, QName rootName) throws SchemaException; } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismSerializerImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismSerializerImpl.java index 01b2ffabb2e..dac90aa9c04 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismSerializerImpl.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismSerializerImpl.java @@ -16,50 +16,40 @@ package com.evolveum.midpoint.prism; -import com.evolveum.midpoint.prism.parser.Parser; -import com.evolveum.midpoint.prism.parser.ParserHelpers; import com.evolveum.midpoint.prism.xnode.RootXNode; import com.evolveum.midpoint.util.exception.SchemaException; import org.jetbrains.annotations.NotNull; +import javax.xml.bind.JAXBElement; import javax.xml.namespace.QName; /** - * TODO eliminate code duplication within three implementations of PrismSerializer - * * @author mederly */ -public class PrismSerializerImpl implements PrismSerializer { +public class PrismSerializerImpl implements PrismSerializer { - @NotNull private final ParserHelpers parserHelpers; - @NotNull private final String language; + @NotNull private final SerializerTarget target; private final QName elementName; private final SerializationContext context; - public PrismSerializerImpl(@NotNull ParserHelpers parserHelpers, @NotNull String language, QName elementName, SerializationContext context) { - this.parserHelpers = parserHelpers; - this.language = language; + public PrismSerializerImpl(@NotNull SerializerTarget target, QName elementName, SerializationContext context) { + this.target = target; this.elementName = elementName; this.context = context; } - @NotNull - public String getLanguage() { - return language; - } - @Override - public PrismSerializerImpl context(SerializationContext context) { - return new PrismSerializerImpl(this.parserHelpers, this.language, elementName, context); + public PrismSerializerImpl context(SerializationContext context) { + return new PrismSerializerImpl<>(this.target, elementName, context); } @Override - public PrismSerializerImpl root(QName elementName) { - return new PrismSerializerImpl(this.parserHelpers, this.language, elementName, this.context); + public PrismSerializerImpl root(QName elementName) { + return new PrismSerializerImpl<>(this.target, elementName, this.context); } @Override - public PrismSerializerImpl options(SerializationOptions options) { + public PrismSerializerImpl options(SerializationOptions options) { SerializationContext context; if (this.context != null) { context = this.context.clone(); @@ -67,32 +57,60 @@ public PrismSerializerImpl options(SerializationOptions options) { } else { context = new SerializationContext(options); } - return new PrismSerializerImpl(this.parserHelpers, this.language, this.elementName, context); + return new PrismSerializerImpl<>(this.target, this.elementName, context); } @Override - public String serialize(PrismObject object) throws SchemaException { - RootXNode xroot = parserHelpers.xnodeProcessor.serializeObject(object, false, context); // TODO serialize composite objects? + public T serialize(PrismObject object) throws SchemaException { + RootXNode xroot = target.parserHelpers.xnodeProcessor.serializeObject(object, false, context); // TODO serialize composite objects? if (elementName != null) { xroot.setRootElementName(elementName); // TODO what about the type? } - return getParser().serializeToString(xroot, context); + return target.serialize(xroot, context); + } + + @Override + public T serialize(PrismValue value) throws SchemaException { + return serialize(value, elementName); } - private Parser getParser() { - return parserHelpers.parserRegistry.parserFor(language); + @Override + public T serialize(PrismValue value, QName rootElementName) throws SchemaException { + RootXNode xroot = target.parserHelpers.xnodeProcessor.serializeItemValueAsRoot(value, elementName); // TODO context + return target.serialize(xroot, context); + } + + @Override + public T serialize(RootXNode xnode) throws SchemaException { + return target.serialize(xnode, context); + } + + @Override + public T serializeAtomicValue(Object value) throws SchemaException { + return serializeAtomicValue(value, elementName); + } + + @Override + public T serializeAtomicValue(Object value, QName rootElementName) throws SchemaException { + RootXNode xnode = target.parserHelpers.xnodeProcessor.serializeAtomicValue(value, rootElementName, context); + return target.serialize(xnode, context); + } + + @Override + public T serializeAtomicValue(JAXBElement value) throws SchemaException { + RootXNode xnode = target.parserHelpers.xnodeProcessor.serializeAtomicValue(value); // TODO context + return target.serialize(xnode, context); } @Override - public String serialize(PrismContainerValue cval) throws SchemaException { - RootXNode xroot = parserHelpers.xnodeProcessor.serializeItemValueAsRoot(cval, elementName); // TODO context - return getParser().serializeToString(xroot, context); + public T serializeAnyData(Object value) throws SchemaException { + return serializeAnyData(value, elementName); } @Override - public String serializeAtomicValue(Object value) throws SchemaException { - RootXNode xroot = parserHelpers.xnodeProcessor.serializeAtomicValue(value, elementName, context); - return getParser().serializeToString(xroot, context); + public T serializeAnyData(Object value, QName rootName) throws SchemaException { + RootXNode xnode = target.parserHelpers.xnodeProcessor.serializeAnyData(value, rootName, context); + return target.serialize(xnode, context); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismXNodeSerializerImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismXNodeSerializerImpl.java deleted file mode 100644 index caaf2c11ebd..00000000000 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismXNodeSerializerImpl.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright (c) 2010-2016 Evolveum - * - * 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 com.evolveum.midpoint.prism; - -import com.evolveum.midpoint.prism.xnode.XNode; -import org.w3c.dom.Element; - -/** - * @author mederly - */ -public class PrismXNodeSerializerImpl implements PrismSerializer { - -} diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializerDomTarget.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializerDomTarget.java new file mode 100644 index 00000000000..bae9211ce69 --- /dev/null +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializerDomTarget.java @@ -0,0 +1,22 @@ +package com.evolveum.midpoint.prism; + +import com.evolveum.midpoint.prism.parser.ParserHelpers; +import com.evolveum.midpoint.prism.xnode.RootXNode; +import com.evolveum.midpoint.util.exception.SchemaException; +import org.jetbrains.annotations.NotNull; +import org.w3c.dom.Element; + +/** + * @author mederly + */ +public class SerializerDomTarget extends SerializerTarget { + + public SerializerDomTarget(@NotNull ParserHelpers parserHelpers) { + super(parserHelpers); + } + + @Override + public Element serialize(RootXNode xroot, SerializationContext context) throws SchemaException { + return parserHelpers.parserRegistry.domParser().serializeXRootToElement(xroot); + } +} diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializerStringTarget.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializerStringTarget.java new file mode 100644 index 00000000000..d21f58a7b16 --- /dev/null +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializerStringTarget.java @@ -0,0 +1,27 @@ +package com.evolveum.midpoint.prism; + +import com.evolveum.midpoint.prism.SerializationContext; +import com.evolveum.midpoint.prism.SerializerTarget; +import com.evolveum.midpoint.prism.marshaller.XNodeProcessor; +import com.evolveum.midpoint.prism.parser.ParserHelpers; +import com.evolveum.midpoint.prism.xnode.RootXNode; +import com.evolveum.midpoint.util.exception.SchemaException; +import org.jetbrains.annotations.NotNull; + +/** + * @author mederly + */ +public class SerializerStringTarget extends SerializerTarget { + + @NotNull private final String language; + + public SerializerStringTarget(@NotNull ParserHelpers parserHelpers, @NotNull String language) { + super(parserHelpers); + this.language = language; + } + + @Override + public String serialize(RootXNode xroot, SerializationContext context) throws SchemaException { + return parserHelpers.parserRegistry.parserFor(language).serializeToString(xroot, context); + } +} diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializerTarget.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializerTarget.java new file mode 100644 index 00000000000..c36a1b572ae --- /dev/null +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializerTarget.java @@ -0,0 +1,20 @@ +package com.evolveum.midpoint.prism; + +import com.evolveum.midpoint.prism.parser.ParserHelpers; +import com.evolveum.midpoint.prism.xnode.RootXNode; +import com.evolveum.midpoint.util.exception.SchemaException; +import org.jetbrains.annotations.NotNull; + +/** + * @author mederly + */ +public abstract class SerializerTarget { + + @NotNull final ParserHelpers parserHelpers; + + protected SerializerTarget(@NotNull ParserHelpers parserHelpers) { + this.parserHelpers = parserHelpers; + } + + abstract public T serialize(RootXNode xroot, SerializationContext context) throws SchemaException; +} diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializerXNodeTarget.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializerXNodeTarget.java new file mode 100644 index 00000000000..9cedde15b55 --- /dev/null +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializerXNodeTarget.java @@ -0,0 +1,22 @@ +package com.evolveum.midpoint.prism; + +import com.evolveum.midpoint.prism.parser.ParserHelpers; +import com.evolveum.midpoint.prism.xnode.RootXNode; +import com.evolveum.midpoint.prism.xnode.XNode; +import com.evolveum.midpoint.util.exception.SchemaException; +import org.jetbrains.annotations.NotNull; + +/** + * @author mederly + */ +public class SerializerXNodeTarget extends SerializerTarget { + + public SerializerXNodeTarget(@NotNull ParserHelpers parserHelpers) { + super(parserHelpers); + } + + @Override + public XNode serialize(RootXNode xroot, SerializationContext context) throws SchemaException { + return xroot; + } +} diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/JaxbDomHack.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/JaxbDomHack.java index 8017e2214e7..0ddddfa1ca1 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/JaxbDomHack.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/JaxbDomHack.java @@ -424,9 +424,9 @@ public String silentMarshalObject(Object object, Trace logger) { if (object instanceof Objectable) { xml = prismContext.serializeObjectToString(((Objectable) object).asPrismObject(), PrismContext.LANG_XML); } else if (object instanceof Containerable) { - xml = prismContext.xmlSerializer().root(fakeQName).serialize(((Containerable) object).asPrismContainerValue()); + xml = prismContext.xmlSerializer().serialize(((Containerable) object).asPrismContainerValue(), fakeQName); } else { - xml = prismContext.serializeAnyData(object, fakeQName, PrismContext.LANG_XML); + xml = prismContext.xmlSerializer().serializeAnyData(object, fakeQName); } } catch (Exception ex) { Trace log = logger != null ? logger : LOGGER; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/ParserRegistry.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/ParserRegistry.java index c24282c642f..9907f4267a9 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/ParserRegistry.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/ParserRegistry.java @@ -16,10 +16,7 @@ package com.evolveum.midpoint.prism.parser; -import com.evolveum.midpoint.prism.ParserElementSource; -import com.evolveum.midpoint.prism.ParserFileSource; -import com.evolveum.midpoint.prism.ParserSource; -import com.evolveum.midpoint.prism.ParserStringSource; +import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.parser.dom.DomParser; import com.evolveum.midpoint.prism.parser.json.JsonParser; import com.evolveum.midpoint.prism.parser.json.YamlParser; @@ -76,6 +73,11 @@ public Parser findParser(String data){ throw new SystemException("No parser for data '"+ DebugUtil.excerpt(data,16)+"' (autodetect)"); } + @NotNull + public DomParser domParser() { + return (DomParser) parserFor(PrismContext.LANG_XML); + } + public Parser parserFor(String language) { Parser parser = parserMap.get(language); if (parser == null) { diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/PrismTestUtil.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/PrismTestUtil.java index 8cfc223573f..0fdbde5c30f 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/PrismTestUtil.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/PrismTestUtil.java @@ -144,11 +144,11 @@ public static String serializeObjectToString(PrismObject o } public static String serializeAtomicValue(Object object, QName elementName) throws SchemaException { - return getPrismContext().xmlSerializer().root(elementName).serializeAtomicValue(object); + return getPrismContext().xmlSerializer().serializeAtomicValue(object, elementName); } public static String serializeAnyData(Object o, QName defaultRootElementName) throws SchemaException { - return getPrismContext().serializeAnyData(o, defaultRootElementName, PrismContext.LANG_XML); + return getPrismContext().xmlSerializer().serializeAnyData(o, defaultRootElementName); } public static String serializeJaxbElementToString(JAXBElement element) throws SchemaException { @@ -245,7 +245,7 @@ public static void displaySearchFilterType(SearchFilterType filterType) throws S LOGGER.info(dumpX); System.out.println(dumpX); - String dumpXml = prismContext.serializeXNodeToString(new RootXNode(new QName("query"), mapXNode), PrismContext.LANG_XML); + String dumpXml = prismContext.xmlSerializer().serialize(new RootXNode(new QName("query"), mapXNode)); System.out.println(dumpXml); } } diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/DeltaConvertor.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/DeltaConvertor.java index 993be4f6908..34be98f0a40 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/DeltaConvertor.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/DeltaConvertor.java @@ -248,7 +248,7 @@ public static String toObjectDeltaTypeXml(ObjectDelta delt ObjectDeltaType objectDeltaType = toObjectDeltaType(delta, options); SerializationOptions serializationOptions = new SerializationOptions(); serializationOptions.setSerializeReferenceNames(DeltaConversionOptions.isSerializeReferenceNames(options)); - return delta.getPrismContext().xmlSerializer().root(SchemaConstants.T_OBJECT_DELTA).options(serializationOptions).serializeAtomicValue(objectDeltaType); + return delta.getPrismContext().xmlSerializer().options(serializationOptions).serializeAtomicValue(objectDeltaType, SchemaConstants.T_OBJECT_DELTA); } diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/ObjectTreeDeltas.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/ObjectTreeDeltas.java index ac43fd5b241..f70bbd66f1b 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/ObjectTreeDeltas.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/ObjectTreeDeltas.java @@ -118,7 +118,7 @@ public Set prismObject = (PrismObject)variableValue; - variableValue = prismObject.getPrismContext().serializeToDom(prismObject); + variableValue = prismObject.getPrismContext().domSerializer().serialize(prismObject); } else if (variableValue instanceof PrismProperty) { PrismProperty prismProperty = (PrismProperty)variableValue; DomParser domProcessor = prismProperty.getPrismContext().getParserDom(); final List elementList = new ArrayList(); for (PrismPropertyValue value: prismProperty.getValues()) { - Element valueElement = prismContext.serializeValueToDom(value, prismProperty.getElementName()); + Element valueElement = prismContext.domSerializer().serialize(value, prismProperty.getElementName()); elementList.add(valueElement); } NodeList nodeList = new NodeList() { @@ -188,7 +188,7 @@ public ItemDefinition getDefinition() { } }); } - variableValue = prismContext.serializeValueToDom(pval, variableName); + variableValue = prismContext.domSerializer().serialize(pval, variableName); } if (!((variableValue instanceof Node)||variableValue instanceof NodeList) diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/ModelWebService.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/ModelWebService.java index e374969c63f..f0f522aab14 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/ModelWebService.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/ModelWebService.java @@ -268,7 +268,7 @@ private ExecuteScriptsResponseType doExecuteScripts(List> scripts } else { // temporarily we send serialized XML in the case of MSL output ItemListType jaxbOutput = prepareXmlData(executionResult.getDataOutput()); - output.setMslData(prismContext.serializeAnyData(jaxbOutput, SchemaConstants.C_VALUE, PrismContext.LANG_XML)); + output.setMslData(prismContext.xmlSerializer().serializeAnyData(jaxbOutput, SchemaConstants.C_VALUE)); } } result.computeStatusIfUnknown(); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/ModelWebServiceRaw.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/ModelWebServiceRaw.java index d5993b08392..ac1360e4a2a 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/ModelWebServiceRaw.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/ModelWebServiceRaw.java @@ -147,7 +147,7 @@ public DOMSource invokeAllowingFaults(DOMSource request) throws FaultMessage { GetObjectResponseType gr = new GetObjectResponseType(); gr.setObject(objectTypeHolder.value); gr.setResult(operationResultTypeHolder.value); - response = prismContext.serializeAnyDataToElement(gr, ModelPort.GET_OBJECT_RESPONSE); + response = prismContext.domSerializer().serializeAnyData(gr, ModelPort.GET_OBJECT_RESPONSE); } else if (requestObject instanceof SearchObjectsType) { SearchObjectsType s = (SearchObjectsType) requestObject; Holder objectListTypeHolder = new Holder<>(); @@ -155,13 +155,13 @@ public DOMSource invokeAllowingFaults(DOMSource request) throws FaultMessage { SearchObjectsResponseType sr = new SearchObjectsResponseType(); sr.setObjectList(objectListTypeHolder.value); sr.setResult(operationResultTypeHolder.value); - response = prismContext.serializeAnyDataToElement(sr, ModelPort.SEARCH_OBJECTS_RESPONSE); + response = prismContext.domSerializer().serializeAnyData(sr, ModelPort.SEARCH_OBJECTS_RESPONSE); } else if (requestObject instanceof ExecuteChangesType) { ExecuteChangesType e = (ExecuteChangesType) requestObject; ObjectDeltaOperationListType objectDeltaOperationListType = ws.executeChanges(e.getDeltaList(), e.getOptions()); ExecuteChangesResponseType er = new ExecuteChangesResponseType(); er.setDeltaOperationList(objectDeltaOperationListType); - response = prismContext.serializeAnyDataToElement(er, ModelPort.EXECUTE_CHANGES_RESPONSE); + response = prismContext.domSerializer().serializeAnyData(er, ModelPort.EXECUTE_CHANGES_RESPONSE); } else if (requestObject instanceof FindShadowOwnerType) { FindShadowOwnerType f = (FindShadowOwnerType) requestObject; Holder userTypeHolder = new Holder<>(); @@ -169,29 +169,29 @@ public DOMSource invokeAllowingFaults(DOMSource request) throws FaultMessage { FindShadowOwnerResponseType fsr = new FindShadowOwnerResponseType(); fsr.setUser(userTypeHolder.value); fsr.setResult(operationResultTypeHolder.value); - response = prismContext.serializeAnyDataToElement(fsr, ModelPort.FIND_SHADOW_OWNER_RESPONSE); + response = prismContext.domSerializer().serializeAnyData(fsr, ModelPort.FIND_SHADOW_OWNER_RESPONSE); } else if (requestObject instanceof TestResourceType) { TestResourceType tr = (TestResourceType) requestObject; OperationResultType operationResultType = ws.testResource(tr.getResourceOid()); TestResourceResponseType trr = new TestResourceResponseType(); trr.setResult(operationResultType); - response = prismContext.serializeAnyDataToElement(trr, ModelPort.TEST_RESOURCE_RESPONSE); + response = prismContext.domSerializer().serializeAnyData(trr, ModelPort.TEST_RESOURCE_RESPONSE); } else if (requestObject instanceof ExecuteScriptsType) { ExecuteScriptsType es = (ExecuteScriptsType) requestObject; ExecuteScriptsResponseType esr = ws.executeScripts(es); - response = prismContext.serializeAnyDataToElement(esr, ModelPort.EXECUTE_SCRIPTS_RESPONSE); + response = prismContext.domSerializer().serializeAnyData(esr, ModelPort.EXECUTE_SCRIPTS_RESPONSE); } else if (requestObject instanceof ImportFromResourceType) { ImportFromResourceType ifr = (ImportFromResourceType) requestObject; TaskType taskType = ws.importFromResource(ifr.getResourceOid(), ifr.getObjectClass()); ImportFromResourceResponseType ifrr = new ImportFromResourceResponseType(); ifrr.setTask(taskType); - response = prismContext.serializeAnyDataToElement(ifrr, ModelPort.IMPORT_FROM_RESOURCE_RESPONSE); + response = prismContext.domSerializer().serializeAnyData(ifrr, ModelPort.IMPORT_FROM_RESOURCE_RESPONSE); } else if (requestObject instanceof NotifyChangeType) { NotifyChangeType nc = (NotifyChangeType) requestObject; TaskType taskType = ws.notifyChange(nc.getChangeDescription()); NotifyChangeResponseType ncr = new NotifyChangeResponseType(); ncr.setTask(taskType); - response = prismContext.serializeAnyDataToElement(ncr, ModelPort.NOTIFY_CHANGE_RESPONSE); + response = prismContext.domSerializer().serializeAnyData(ncr, ModelPort.NOTIFY_CHANGE_RESPONSE); } else { throw ws.createIllegalArgumentFault("Unsupported request type: " + requestObject); } diff --git a/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/lens/TestClockwork.java b/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/lens/TestClockwork.java index d2cf6b1256d..f0efe70c021 100644 --- a/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/lens/TestClockwork.java +++ b/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/lens/TestClockwork.java @@ -130,7 +130,7 @@ public void test010SerializeAddUserBarbossa() throws Exception { System.out.println("Context before serialization = " + context.debugDump()); PrismContainer lensContextType = context.toPrismContainer(); - String xml = prismContext.xmlSerializer().root(lensContextType.getElementName()).serialize(lensContextType.getValue()); + String xml = prismContext.xmlSerializer().serialize(lensContextType.getValue(), lensContextType.getElementName()); System.out.println("Serialized form = " + xml); @@ -312,7 +312,7 @@ private void assignAccountToJackAsync(String testName, boolean serialize) throws System.out.println("Context before serialization = " + context.debugDump()); PrismContainer lensContextType = context.toPrismContainer(); - String xml = prismContext.xmlSerializer().root(lensContextType.getElementName()).serialize(lensContextType.getValue()); + String xml = prismContext.xmlSerializer().serialize(lensContextType.getValue(), lensContextType.getElementName()); System.out.println("Serialized form = " + xml); diff --git a/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/CustomDataWriter.java b/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/CustomDataWriter.java index c29b4319e53..b76118458eb 100644 --- a/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/CustomDataWriter.java +++ b/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/CustomDataWriter.java @@ -47,7 +47,7 @@ public void write(Object obj, MessagePartInfo part, XMLStreamWriter output) { QName rootElement = part.getElementQName(); Element serialized; try { - serialized = prismContex.serializeAnyDataToElement(obj, rootElement); + serialized = prismContex.domSerializer().serializeAnyData(obj, rootElement); StaxUtils.copy(serialized, output); // output.writeCharacters(serialized); } catch (SchemaException | XMLStreamException e) { diff --git a/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportWebServiceRaw.java b/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportWebServiceRaw.java index c2ef47955d6..28e5cade868 100644 --- a/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportWebServiceRaw.java +++ b/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportWebServiceRaw.java @@ -114,19 +114,19 @@ public DOMSource invokeAllowingFaults(DOMSource request) throws FaultMessage { ObjectListType olt = reportService.evaluateScript(s.getScript(), s.getParameters()); EvaluateScriptResponseType sr = new EvaluateScriptResponseType(); sr.setObjectList(olt); - response = prismContext.serializeAnyDataToElement(sr, ReportPort.EVALUATE_SCRIPT_RESPONSE, ctx); + response = prismContext.domSerializer().context(ctx).serializeAnyData(sr, ReportPort.EVALUATE_SCRIPT_RESPONSE); } else if (requestObject instanceof EvaluateAuditScriptType){ EvaluateAuditScriptType s = (EvaluateAuditScriptType) requestObject; AuditEventRecordListType olt = reportService.evaluateAuditScript(s.getScript(), s.getParameters()); EvaluateAuditScriptResponseType sr = new EvaluateAuditScriptResponseType(); sr.setObjectList(olt); - response = prismContext.serializeAnyDataToElement(sr, ReportPort.EVALUATE_AUDIT_SCRIPT_RESPONSE, ctx); + response = prismContext.domSerializer().context(ctx).serializeAnyData(sr, ReportPort.EVALUATE_AUDIT_SCRIPT_RESPONSE); } else if (requestObject instanceof ProcessReportType){ ProcessReportType p = (ProcessReportType) requestObject; ObjectListType olt = reportService.processReport(p.getQuery(), p.getParameters(), p.getOptions()); ProcessReportResponseType pr = new ProcessReportResponseType(); pr.setObjectList(olt); - response = prismContext.serializeAnyDataToElement(pr, ReportPort.PROCESS_REPORT_RESPONSE, ctx); + response = prismContext.domSerializer().context(ctx).serializeAnyData(pr, ReportPort.PROCESS_REPORT_RESPONSE); } else { throw new FaultMessage("Unsupported request type: " + requestObject); } diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/util/MiscDataUtil.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/util/MiscDataUtil.java index b226728fd0c..c0d05b7cfc8 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/util/MiscDataUtil.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/util/MiscDataUtil.java @@ -184,7 +184,7 @@ public static String serializeObjectToXml(PrismObject obje public static String serializeContainerableToXml(Containerable containerable, PrismContext prismContext) { try { PrismContainerValue value = containerable.asPrismContainerValue(); - return prismContext.xmlSerializer().root(value.getContainer().getElementName()).serialize(value); + return prismContext.xmlSerializer().serialize(value, value.getContainer().getElementName()); } catch (SchemaException e) { throw new SystemException("Couldn't serialize a Containerable " + containerable + " into XML", e); } diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/util/SingleItemSerializationSafeContainerImpl.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/util/SingleItemSerializationSafeContainerImpl.java index 90c2b85a124..3d4ee71f5fa 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/util/SingleItemSerializationSafeContainerImpl.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/util/SingleItemSerializationSafeContainerImpl.java @@ -74,7 +74,7 @@ public void setValue(T value) { checkPrismContext(); if (value != null && prismContext.canSerialize(value)) { try { - this.valueForStorageWhenEncoded = prismContext.serializeAnyData(value, new QName("value"), PrismContext.LANG_XML); + this.valueForStorageWhenEncoded = prismContext.xmlSerializer().serializeAnyData(value, new QName("value")); } catch (SchemaException e) { throw new SystemException("Couldn't serialize value of type " + value.getClass() + ": " + e.getMessage(), e); } diff --git a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/AddGetObjectTest.java b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/AddGetObjectTest.java index 980132d4fe2..9b64c90cf29 100644 --- a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/AddGetObjectTest.java +++ b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/AddGetObjectTest.java @@ -542,8 +542,8 @@ private String toRepo(T value, PrismContext prismContext) // TODO: createFakeParentElement??? why we don't use the real // name??? return prismContext.xmlSerializer() - .root(QNameUtil.getNodeQName(RUtil.createFakeParentElement())) - .serialize(((Containerable) value).asPrismContainerValue()); + .serialize(((Containerable) value).asPrismContainerValue(), + QNameUtil.getNodeQName(RUtil.createFakeParentElement())); } diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RAccessCertificationCase.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RAccessCertificationCase.java index 157c4a64f32..9dc6b3e115b 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RAccessCertificationCase.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RAccessCertificationCase.java @@ -396,7 +396,7 @@ private static RAccessCertificationCase toRepo(AccessCertificationCaseType case1 PrismContainerValue cvalue = case1.asPrismContainerValue(); String xml; try { - xml = prismContext.xmlSerializer().root(new QName("value")).serialize(cvalue); + xml = prismContext.xmlSerializer().serialize(cvalue, new QName("value")); } catch (SchemaException e) { throw new IllegalStateException("Couldn't serialize certification case to string", e); } diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/util/RUtil.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/util/RUtil.java index 02cfdf2bed4..90c50da2233 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/util/RUtil.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/util/RUtil.java @@ -57,6 +57,7 @@ import org.hibernate.persister.entity.AbstractEntityPersister; import org.hibernate.tuple.IdentifierProperty; import org.hibernate.tuple.entity.EntityMetamodel; +import org.jetbrains.annotations.NotNull; import org.w3c.dom.Element; import javax.persistence.Table; @@ -122,16 +123,8 @@ public static void revive(Objectable object, PrismContext } } - public static String toRepo(ItemDefinition parentDefinition, QName itemName, T value, + public static String toRepo(ItemDefinition parentDefinition, QName itemName, @NotNull OperationResultType value, PrismContext prismContext) throws SchemaException, JAXBException { - if (value == null) { - return null; - } - - if (value instanceof Objectable) { - return prismContext.serializeObjectToString(((Objectable) value).asPrismObject(), - PrismContext.LANG_XML); - } ItemDefinition definition = null; if (parentDefinition instanceof PrismContainerDefinition) { From 02fb711b672282b8492fec41869ce3d853fe782c Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Wed, 5 Oct 2016 18:44:17 +0200 Subject: [PATCH 20/74] More serialization cleanup. --- .../midpoint/prism/PrismSerializerImpl.java | 2 +- .../prism/util/ValueSerializationUtil.java | 325 ------------------ .../midpoint/repo/sql/AddGetObjectTest.java | 83 ++--- repo/repo-sql-impl/pom.xml | 8 +- .../midpoint/repo/sql/util/RUtil.java | 20 +- 5 files changed, 36 insertions(+), 402 deletions(-) delete mode 100644 infra/prism/src/main/java/com/evolveum/midpoint/prism/util/ValueSerializationUtil.java diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismSerializerImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismSerializerImpl.java index dac90aa9c04..e6b8b76cc42 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismSerializerImpl.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismSerializerImpl.java @@ -76,7 +76,7 @@ public T serialize(PrismValue value) throws SchemaException { @Override public T serialize(PrismValue value, QName rootElementName) throws SchemaException { - RootXNode xroot = target.parserHelpers.xnodeProcessor.serializeItemValueAsRoot(value, elementName); // TODO context + RootXNode xroot = target.parserHelpers.xnodeProcessor.serializeItemValueAsRoot(value, rootElementName); // TODO context return target.serialize(xroot, context); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/ValueSerializationUtil.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/ValueSerializationUtil.java deleted file mode 100644 index 39f78d4bbd6..00000000000 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/ValueSerializationUtil.java +++ /dev/null @@ -1,325 +0,0 @@ -package com.evolveum.midpoint.prism.util; - -import java.util.List; - -import javax.xml.namespace.QName; - -import com.evolveum.midpoint.prism.Containerable; -import com.evolveum.midpoint.prism.ItemDefinition; -import com.evolveum.midpoint.prism.PrismContainer; -import com.evolveum.midpoint.prism.PrismContainerDefinition; -import com.evolveum.midpoint.prism.PrismContainerValue; -import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.PrismProperty; -import com.evolveum.midpoint.prism.PrismPropertyDefinition; -import com.evolveum.midpoint.prism.PrismPropertyValue; -import com.evolveum.midpoint.prism.PrismValue; -import com.evolveum.midpoint.prism.Referencable; -import com.evolveum.midpoint.prism.marshaller.XNodeSerializer; -import com.evolveum.midpoint.prism.xnode.ListXNode; -import com.evolveum.midpoint.prism.xnode.MapXNode; -import com.evolveum.midpoint.prism.xnode.XNode; -import com.evolveum.midpoint.util.exception.SchemaException; - -@Deprecated -public class ValueSerializationUtil { - - - public static String serializeValue(T value, ItemDefinition def, QName itemName, QName parentName, PrismContext prismContext, String language) throws SchemaException{ - if (value == null){ - return null; - } - - XNodeSerializer serializer = prismContext.getXnodeProcessor().createSerializer(); - - if (value instanceof List){ - List values = (List) value; - if (values.isEmpty()){ - return null; - } - - if (def instanceof PrismPropertyDefinition){ - PrismProperty prop = (PrismProperty) def.instantiate(itemName); - for (T val : values){ - PrismPropertyValue pValue = new PrismPropertyValue(val); - prop.add(pValue); - } - - XNode node = serializer.serializeItem(prop); - if (node instanceof ListXNode){ - ListXNode xList = (ListXNode) node; - if (xList.size() == 1){ - XNode sub = xList.iterator().next(); - if (!(sub instanceof MapXNode)){ - throw new IllegalArgumentException("must be a map"); - } - - String s = prismContext.getParserDom().serializeToString(sub, parentName, null); -// System.out.println("serialized: " + s); - return s; - - }else{ - MapXNode xmap = new MapXNode(); - xmap.put(itemName, xList); - String s = prismContext.getParserDom().serializeToString(xmap, parentName, null); -// System.out.println("serialized: " + s); - return s; -// throw new IllegalArgumentException("Check your data."); - } - -// MapXNode xmap = xList.new MapXNode(); -// xmap.put(def.getName(), xList); - - } - String s = prismContext.getParserDom().serializeToString(node, def.getName(), null); -// System.out.println("serialized: " + s); - return s; - } else if (def instanceof PrismContainerDefinition){ - PrismContainer pc = (PrismContainer) def.instantiate(); - for (T val : values){ -// PrismContainerValue pcVal = new PrismContainerValue((Containerable) val); - PrismContainerValue pcVal = ((Containerable) val).asPrismContainerValue(); - pc.add(pcVal.clone()); - } - XNode node = serializer.serializeItem(pc); - if (node instanceof ListXNode){ - ListXNode xList = (ListXNode) node; - MapXNode xmap = new MapXNode(); - xmap.put(def.getName(), xList); - String s = prismContext.getParserDom().serializeToString(xmap, parentName, null); -// System.out.println("serialized: " + s); - return s; - } - String s = prismContext.getParserDom().serializeToString(node, def.getName(), null); -// System.out.println("serialized: " + s); - return s; - } - - } - - PrismValue pVal = null; - - if (value instanceof Containerable){ - pVal = ((Containerable) value).asPrismContainerValue(); - } else if (value instanceof Referencable){ - pVal = ((Referencable) value).asReferenceValue(); - } else { - pVal = new PrismPropertyValue(value); - } - -// Class clazz = prismContext.getSchemaRegistry().determineCompileTimeClass(itemName); -// PrismContainerDefinition def = prismContext.getSchemaRegistry().determineDefinitionFromClass(clazz); -// -// ItemDefinition def = prismContext.getSchemaRegistry().findItemDefinitionByElementName(itemName); - -// QName itemName = null; - if (def != null){ - itemName = def.getName(); - } - - - XNode node = serializer.serializeItemValue(pVal, def); - String s = prismContext.getParserDom().serializeToString(node, itemName, null); -// System.out.println("serialized: " + s); - return s; -// throw new UnsupportedOperationException("need to be implemented"); - } - - public static String serializeValue(T value, QName itemName, PrismContext prismContext, String language) throws SchemaException{ -// System.out.println("value serialization"); - if (value == null){ - return null; - } - - XNodeSerializer serializer = prismContext.getXnodeProcessor().createSerializer(); - - if (value instanceof List){ - List values = (List) value; - if (values.isEmpty()){ - return null; - } - throw new UnsupportedOperationException("take your chance."); - } - - PrismValue pVal = null; - - if (value instanceof Containerable){ - pVal = ((Containerable) value).asPrismContainerValue(); - } else if (value instanceof Referencable){ - pVal = ((Referencable) value).asReferenceValue(); - } else { - pVal = new PrismPropertyValue(value); - } - - XNode node = serializer.serializeItemValue(pVal, null); - String s = prismContext.getParserDom().serializeToString(node, itemName, null); -// System.out.println("serialized: " + s); - return s; -// throw new UnsupportedOperationException("need to be implemented"); - } - -// public static String serializeItemValue(QName itemName, ItemDefinition def, PrismValue value, PrismContext prismContext, String language) throws SchemaException{ -// XNodeSerializer serializer = prismContext.getXnodeProcessor().createSerializer(); -// XNode node = serializer.serializeItemValue(value, def); -// String s = prismContext.getParserDom().serializeToString(node, itemName); -// //System.out.println("serialized ITEM VALUE: " + s); -// return s; -// } - -// public static String serializeFilter(SearchFilterType query, PrismContext prismContext, String language){ -// //System.out.println("query serialization"); -// throw new UnsupportedOperationException("need to be implemented"); -// } - -// public static T deserializeValue(String value, Class clazz, QName itemName, ItemDefinition itemDef, PrismContext prismContext, String language) throws SchemaException{ -// //System.out.println("item value deserialization"); -// -// XNode xnode = prismContext.getParserDom().parse(value); -// -//// System.out.println("xnode: " + xnode.debugDump()); -// -// XNode xmap = null; -// if (xnode instanceof RootXNode){ -// xmap = ((RootXNode) xnode).getSubnode(); -// } -// -//// System.out.println("xmap: " + xmap); -//// else if (xnode instanceof MapXNode){ -//// xmap = (MapXNode) xnode; -//// } else if (xnode instanceof PrimitiveXNode){ -//// xmap = new MapXNode(); -//// xmap.put(itemName, xnode); -//// } -// -// Item item = prismContext.getXnodeProcessor().parseItem(xmap, itemName, itemDef); -// -//// System.out.println("item: " + item.debugDump()); -// -// if (item instanceof PrismProperty){ -// PrismProperty prop = (PrismProperty) item; -// -// if (prop.isSingleValue()){ -// return (T) prop.getRealValue(); -// } -// return (T) prop.getRealValues(); -// } else if (item instanceof PrismContainer){ -// PrismContainer cont = (PrismContainer) item; -// return (T) cont.getValue().asContainerable(); -// } else if (item instanceof PrismReference){ -// PrismReference ref = (PrismReference) item; -// return (T) ref.getValue(); -// } -// if (item != null){ -// return (T) item.getValue(0); -// } -//// if (prismContext.getBeanConverter().canConvert(clazz)){ -//// prismContext.getBeanConverter().unmarshall(xmap, clazz); -//// } else{ -//// prismContext.getXnodeProcessor().parseContainer(xnode, clazz); -//// } -// -// throw new UnsupportedOperationException("need to be implemented"); -// } - -// public static Collection deserializeItemValues(String value, Item item, String language) throws SchemaException{ -// //System.out.println("item value deserialization"); -// PrismContext prismContext = item.getPrismContext(); -// XNode xnode = prismContext.getParserDom().parse(value); -// if (xnode instanceof RootXNode){ -// xnode = ((RootXNode) xnode).getSubnode(); -// } -// //System.out.println("value: " + value); -// Item parsedItem = prismContext.getXnodeProcessor().parseItem(xnode, item.getElementName(), item.getDefinition()); -// return parsedItem.getValues(); -//// throw new UnsupportedOperationException("need to be implemented"); -// } - -// public static SearchFilterType deserializeFilter(String query, String language){ -// //System.out.println("query deserialization"); -// throw new UnsupportedOperationException("need to be implemented"); -// } - -// public static String serializeValue(T value, PrismPropertyDefinition def, -// QName itemName, PrismContext prismContext, String langXml) throws SchemaException{ -//// System.out.println("value serialization"); -// if (value == null){ -// return null; -// } -// -// XNodeSerializer serializer = prismContext.getXnodeProcessor().createSerializer(); -// -// if (value instanceof List){ -// List values = (List) value; -// if (values.isEmpty()){ -// return null; -// } -// -// if (def instanceof PrismPropertyDefinition){ -// PrismProperty prop = (PrismProperty) def.instantiate(); -// for (T val : values){ -// PrismPropertyValue pValue = new PrismPropertyValue(val); -// prop.add(pValue); -// } -// XNode node = serializer.serializeItem(prop); -// if (node instanceof ListXNode){ -// ListXNode xList = (ListXNode) node; -// MapXNode xmap = new MapXNode(); -// xmap.put(def.getName(), xList); -// String s = prismContext.getParserDom().serializeToString(xmap, def.getName()); -//// System.out.println("serialized: " + s); -// return s; -// } -// String s = prismContext.getParserDom().serializeToString(node, def.getName()); -//// System.out.println("serialized: " + s); -// return s; -// } -// -// } -// -// PrismValue pVal = null; -// -// if (value instanceof Containerable){ -// pVal = ((Containerable) value).asPrismContainerValue(); -// } else if (value instanceof Referencable){ -// pVal = ((Referencable) value).asReferenceValue(); -// } else { -// PrismProperty pp = def.instantiate(); -// pVal = new PrismPropertyValue(value); -// pp.add(pVal); -// XNode xnode = serializer.serializeItemValue(pVal, def); -// if (xnode == null){ -// throw new IllegalArgumentException("null node after serialization"); -// } -// MapXNode xmap = null; -// if (xnode instanceof RootXNode){ -// XNode sub = ((RootXNode) xnode).getSubnode(); -// if (!(sub instanceof MapXNode)){ -// throw new IllegalArgumentException("not uspported yet"); -// } -// xmap = (MapXNode) sub; -// } else if (xnode instanceof MapXNode){ -// xmap = (MapXNode) xnode; -// } else if (xnode instanceof PrimitiveXNode){ -// String s = ((PrimitiveXNode) xnode).getStringValue(); -// return s; -//// -// } else{ -// throw new IllegalStateException("hmmm"); -// } -// -// XNode node = xmap.get(itemName); -// String s = prismContext.getParserDom().serializeToString(node, itemName); -// } -// -// -// -// XNode node = serializer.serializeItemValue(pVal, def); -// String s = prismContext.getParserDom().serializeToString(node, itemName); -//// System.out.println("serialized: " + s); -// return s; -//// throw new UnsupportedOperationException("need to be implemented"); -// -// } - - -} diff --git a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/AddGetObjectTest.java b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/AddGetObjectTest.java index 9b64c90cf29..320b32b7c8c 100644 --- a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/AddGetObjectTest.java +++ b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/AddGetObjectTest.java @@ -49,7 +49,6 @@ import com.evolveum.midpoint.prism.delta.ObjectDelta; import com.evolveum.midpoint.prism.delta.ReferenceDelta; import com.evolveum.midpoint.prism.util.PrismTestUtil; -import com.evolveum.midpoint.prism.util.ValueSerializationUtil; import com.evolveum.midpoint.repo.sql.type.XMLGregorianCalendarType; import com.evolveum.midpoint.repo.sql.util.RUtil; import com.evolveum.midpoint.schema.DeltaConvertor; @@ -496,60 +495,36 @@ private String testIterationToken(String token) throws Exception { return token; } - @Test(enabled = false) - public void deltaOperationSerializationPerformanceTest() throws Exception { - List> elements = - prismContext.parserFor(new File(FOLDER_BASIC, "objects.xml")).parseObjects(); - - //get user from objects.xml - ObjectDelta delta = ObjectDelta.createAddDelta(elements.get(0)); - - final int COUNT = 10000; - //first conversion option - System.out.println(DeltaConvertor.toObjectDeltaTypeXml(delta)); - //second conversion option - System.out.println("\n" + toRepo(DeltaConvertor.toObjectDeltaType(delta), prismContext)); - - long time = System.currentTimeMillis(); - for (int i = 0; i < COUNT; i++) { - String xml = DeltaConvertor.toObjectDeltaTypeXml(delta); - } - time = System.currentTimeMillis() - time; - System.out.println(">>> " + time); - - time = System.currentTimeMillis(); - for (int i = 0; i < COUNT; i++) { - ObjectDeltaType type = DeltaConvertor.toObjectDeltaType(delta); - String xml = toRepo(type, prismContext); - } - time = System.currentTimeMillis() - time; - System.out.println(">>> " + time); - } - - private String toRepo(T value, PrismContext prismContext) - throws SchemaException, JAXBException { - if (value == null) { - return null; - } - - // PrismDomProcessor domProcessor = prismContext.getPrismDomProcessor(); - if (value instanceof Objectable) { - return prismContext.serializeObjectToString(((Objectable) value).asPrismObject(), - PrismContext.LANG_XML); - } +// @Test(enabled = false) +// public void deltaOperationSerializationPerformanceTest() throws Exception { +// List> elements = +// prismContext.parserFor(new File(FOLDER_BASIC, "objects.xml")).parseObjects(); +// +// //get user from objects.xml +// ObjectDelta delta = ObjectDelta.createAddDelta(elements.get(0)); +// +// final int COUNT = 10000; +// //first conversion option +// System.out.println(DeltaConvertor.toObjectDeltaTypeXml(delta)); +// //second conversion option +// //System.out.println("\n" + toRepo(DeltaConvertor.toObjectDeltaType(delta), prismContext)); +// +// long time = System.currentTimeMillis(); +// for (int i = 0; i < COUNT; i++) { +// String xml = DeltaConvertor.toObjectDeltaTypeXml(delta); +// } +// time = System.currentTimeMillis() - time; +// System.out.println(">>> " + time); +// +// time = System.currentTimeMillis(); +// for (int i = 0; i < COUNT; i++) { +// ObjectDeltaType type = DeltaConvertor.toObjectDeltaType(delta); +// String xml = toRepo(type, prismContext); +// } +// time = System.currentTimeMillis() - time; +// System.out.println(">>> " + time); +// } - if (value instanceof Containerable) { - // TODO: createFakeParentElement??? why we don't use the real - // name??? - return prismContext.xmlSerializer() - .serialize(((Containerable) value).asPrismContainerValue(), - QNameUtil.getNodeQName(RUtil.createFakeParentElement())); - } - - - return ValueSerializationUtil.serializeValue(value, new QName("fake"), prismContext, PrismContext.LANG_XML); - - } @Test public void test() throws Exception { diff --git a/repo/repo-sql-impl/pom.xml b/repo/repo-sql-impl/pom.xml index daa82dcca64..6d07d748385 100644 --- a/repo/repo-sql-impl/pom.xml +++ b/repo/repo-sql-impl/pom.xml @@ -93,10 +93,10 @@ xml-apis xml-apis - - javax.xml.bind - jaxb-api - + + + + diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/util/RUtil.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/util/RUtil.java index 90c50da2233..fea48cd3ac6 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/util/RUtil.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/util/RUtil.java @@ -24,7 +24,6 @@ import com.evolveum.midpoint.prism.query.ObjectFilter; import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.prism.query.OrgFilter; -import com.evolveum.midpoint.prism.util.ValueSerializationUtil; import com.evolveum.midpoint.repo.sql.data.audit.RObjectDeltaOperation; import com.evolveum.midpoint.repo.sql.data.common.*; import com.evolveum.midpoint.repo.sql.data.common.any.*; @@ -123,22 +122,6 @@ public static void revive(Objectable object, PrismContext } } - public static String toRepo(ItemDefinition parentDefinition, QName itemName, @NotNull OperationResultType value, - PrismContext prismContext) throws SchemaException, JAXBException { - - ItemDefinition definition = null; - if (parentDefinition instanceof PrismContainerDefinition) { - definition = ((PrismContainerDefinition) parentDefinition).findItemDefinition(itemName); - if (definition == null) { - definition = parentDefinition; - } - } else { - definition = parentDefinition; - } - - return ValueSerializationUtil.serializeValue(value, definition, itemName, parentDefinition.getName(), prismContext, PrismContext.LANG_XML); - } - public static Element createFakeParentElement() { return DOMUtil.createElement(DOMUtil.getDocument(), CUSTOM_OBJECT); } @@ -305,7 +288,8 @@ public static void copyResultFromJAXB(ItemDefinition parentDef, QName itemName, repo.setStatus(getRepoEnumValue(jaxb.getStatus(), ROperationResultStatus.class)); if (repo instanceof OperationResultFull) { try { - ((OperationResultFull) repo).setFullResult(RUtil.toRepo(parentDef, itemName, jaxb, prismContext)); + String full = prismContext.xmlSerializer().serializeAtomicValue(jaxb, itemName); + ((OperationResultFull) repo).setFullResult(full); } catch (Exception ex) { throw new DtoTranslationException(ex.getMessage(), ex); } From cab6e151e79e8f33dd88b566be2a84333927df87 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Wed, 5 Oct 2016 19:22:22 +0200 Subject: [PATCH 21/74] Deleted parts from JaxbDomHack --- .../prism/marshaller/JaxbDomHack.java | 198 ------------------ .../model/impl/rest/MidpointXmlProvider.java | 35 ++-- 2 files changed, 19 insertions(+), 214 deletions(-) diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/JaxbDomHack.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/JaxbDomHack.java index 0ddddfa1ca1..583fcb3e9bf 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/JaxbDomHack.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/JaxbDomHack.java @@ -54,37 +54,13 @@ public class JaxbDomHack { private PrismContext prismContext; private DomParser domParser; -// private JAXBContext jaxbContext; public JaxbDomHack(DomParser domParser, PrismContext prismContext) { super(); this.domParser = domParser; this.prismContext = prismContext; -// initializeJaxbContext(); } -// private void initializeJaxbContext() { -// StringBuilder sb = new StringBuilder(); -// Iterator iterator = prismContext.getSchemaRegistry().getCompileTimePackages().iterator(); -// while (iterator.hasNext()) { -// Package jaxbPackage = iterator.next(); -// sb.append(jaxbPackage.getName()); -// if (iterator.hasNext()) { -// sb.append(":"); -// } -// } -// String jaxbPaths = sb.toString(); -// if (jaxbPaths.isEmpty()) { -// LOGGER.debug("No JAXB paths, skipping creation of JAXB context"); -// } else { -// try { -// jaxbContext = JAXBContext.newInstance(jaxbPaths); -// } catch (JAXBException ex) { -// throw new SystemException("Couldn't create JAXBContext for: " + jaxbPaths, ex); -// } -// } -// } - private ItemDefinition locateItemDefinition( PrismContainerDefinition containerDefinition, QName elementQName, Object valueElements) throws SchemaException { @@ -237,24 +213,6 @@ public return subItem; } -// public Collection> fromAny(List anyObjects, PrismContainerDefinition definition) throws SchemaException { -// Collection> items = new ArrayList<>(); -// for (Object anyObject: anyObjects) { -// Item newItem = parseRawElement(anyObject, definition); -// boolean merged = false; -// for (Item existingItem: items) { -// if (newItem.getElementName().equals(existingItem.getElementName())) { -// existingItem.merge(newItem); -// merged = true; -// break; -// } -// } -// if (!merged) { -// items.add(newItem); -// } -// } -// return items; -// } /** * Serializes prism value to JAXB "any" format as returned by JAXB getAny() methods. @@ -312,162 +270,6 @@ public Object toAny(PrismValue value) throws SchemaException { return xmlValue; } -// public PrismObject parseObjectFromJaxb(Object objectElement) throws SchemaException { -// if (objectElement instanceof Element) { -// // DOM -// XNode objectXNode = domParser.parseElementContent((Element)objectElement); -// return prismContext.getXnodeProcessor().parseObject(objectXNode); -// } else if (objectElement instanceof JAXBElement) { -// O jaxbValue = ((JAXBElement)objectElement).getValue(); -// prismContext.adopt(jaxbValue); -// return jaxbValue.asPrismObject(); -// } else { -// throw new IllegalArgumentException("Unknown element type "+objectElement.getClass()); -// } -// } - -// public Element serializeObjectToJaxb(PrismObject object) throws SchemaException { -// RootXNode xroot = prismContext.getXnodeProcessor().serializeObject(object); -// return domParser.serializeXRootToElement(xroot); -// } - -// public Element marshalJaxbObjectToDom(T jaxbObject, QName elementQName) throws JAXBException { -// return marshalJaxbObjectToDom(jaxbObject, elementQName, (Document) null); -// } - -// public Element marshalJaxbObjectToDom(T jaxbObject, QName elementQName, Document doc) throws JAXBException { -// if (doc == null) { -// doc = DOMUtil.getDocument(); -// } -// -// JAXBElement jaxbElement = new JAXBElement(elementQName, (Class) jaxbObject.getClass(), -// jaxbObject); -// Element element = doc.createElementNS(elementQName.getNamespaceURI(), elementQName.getLocalPart()); -// marshalElementToDom(jaxbElement, element); -// -// return (Element) element.getFirstChild(); -// } - -// private void marshalElementToDom(JAXBElement jaxbElement, Node parentNode) throws JAXBException { -// createMarshaller(null).marshal(jaxbElement, parentNode); -// } - -// private Marshaller createMarshaller(Map jaxbProperties) throws JAXBException { -// Marshaller marshaller = jaxbContext.createMarshaller(); -// // set default properties -// marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8"); -// marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); -// DynamicNamespacePrefixMapper namespacePrefixMapper = prismContext.getSchemaRegistry().getNamespacePrefixMapper().clone(); -// namespacePrefixMapper.setAlwaysExplicit(true); -// marshaller.setProperty("com.sun.xml.bind.namespacePrefixMapper", namespacePrefixMapper); -// // set custom properties -// if (jaxbProperties != null) { -// for (Entry property : jaxbProperties.entrySet()) { -// marshaller.setProperty(property.getKey(), property.getValue()); -// } -// } -// -// return marshaller; -// } - -// public T toJavaValue(Element element, Class typeClass) throws JAXBException { -// QName type = JAXBUtil.getTypeQName(typeClass); -// return (T) toJavaValue(element, type); -// } - - /** - * Used to convert property values from DOM - */ -// private Object toJavaValue(Element element, QName xsdType) throws JAXBException { -// Class declaredType = prismContext.getSchemaRegistry().getCompileTimeClass(xsdType); -// if (declaredType == null) { -// // This may happen if the schema is runtime and there is no associated compile-time class -// throw new SystemException("Cannot determine Java type for "+xsdType); -// } -// JAXBElement jaxbElement = createUnmarshaller().unmarshal(element, declaredType); -// Object object = jaxbElement.getValue(); -// return object; -// } - -// private Unmarshaller createUnmarshaller() throws JAXBException { -// return jaxbContext.createUnmarshaller(); -// } - -// public JAXBElement unmarshalJaxbElement(File input) throws JAXBException, IOException { -// return (JAXBElement) createUnmarshaller().unmarshal(input); -// } - -// public T unmarshalObject(InputStream input) throws JAXBException, SchemaException { -// Object object = createUnmarshaller().unmarshal(input); -// JAXBElement jaxbElement = (JAXBElement) object; -// adopt(jaxbElement); -// -// if (jaxbElement == null) { -// return null; -// } else { -// return jaxbElement.getValue(); -// } -// } - -// private void adopt(Object object) throws SchemaException { -// if (object instanceof JAXBElement) { -// adopt(((JAXBElement)object).getValue()); -// } else if (object instanceof Objectable) { -// prismContext.adopt(((Objectable) (object))); -// } -// } - - public String silentMarshalObject(Object object, Trace logger) { - String xml = null; - try { - QName fakeQName=new QName(PrismConstants.NS_PREFIX + "debug", "debugPrintObject"); - if (object instanceof Objectable) { - xml = prismContext.serializeObjectToString(((Objectable) object).asPrismObject(), PrismContext.LANG_XML); - } else if (object instanceof Containerable) { - xml = prismContext.xmlSerializer().serialize(((Containerable) object).asPrismContainerValue(), fakeQName); - } else { - xml = prismContext.xmlSerializer().serializeAnyData(object, fakeQName); - } - } catch (Exception ex) { - Trace log = logger != null ? logger : LOGGER; - LoggingUtils.logException(log, "Couldn't marshal element to string {}", ex, object); - } - return xml; - } - -// public String marshalElementToString(JAXBElement jaxbElement) throws JAXBException { -// return marshalElementToString(jaxbElement, new HashMap()); -// } - -// public String marshalElementToString(JAXBElement jaxbElement, Map properties) throws JAXBException { -// StringWriter writer = new StringWriter(); -// Marshaller marshaller = createMarshaller(null); -// for (Entry entry : properties.entrySet()) { -// marshaller.setProperty(entry.getKey(), entry.getValue()); -// } -// marshaller.marshal(jaxbElement, writer); -// return writer.getBuffer().toString(); -// } - -// public boolean isJaxbClass(Class clazz) { -// if (clazz == null) { -// throw new IllegalArgumentException("No class, no fun"); -// } -// if (clazz.getPackage() == null) { -// // No package: this is most likely a primitive type and definitely -// // not a JAXB class -// return false; -// } -// for (Package jaxbPackage: prismContext.getSchemaRegistry().getCompileTimePackages()) { -// if (jaxbPackage.equals(clazz.getPackage())) { -// return true; -// } -// } -// return false; -// } -// public boolean canConvert(Class clazz) { -// return isJaxbClass(clazz); -// } } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/rest/MidpointXmlProvider.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/rest/MidpointXmlProvider.java index 2195275cc05..d9c7886ec3c 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/rest/MidpointXmlProvider.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/rest/MidpointXmlProvider.java @@ -17,14 +17,15 @@ import javax.ws.rs.ext.MessageBodyWriter; import javax.ws.rs.ext.Provider; import javax.xml.bind.JAXBException; +import javax.xml.namespace.QName; +import com.evolveum.midpoint.prism.*; +import com.evolveum.midpoint.util.logging.LoggingUtils; import org.apache.cxf.jaxrs.model.ClassResourceInfo; import org.apache.cxf.jaxrs.provider.AbstractConfigurableProvider; import org.apache.cxf.jaxrs.provider.JAXBElementProvider; import org.springframework.beans.factory.annotation.Autowired; -import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.delta.ItemDelta; import com.evolveum.midpoint.schema.DeltaConvertor; import com.evolveum.midpoint.schema.result.OperationResult; @@ -73,21 +74,23 @@ public void writeTo(T object, Class type, Type genericType, MultivaluedMap httpHeaders, OutputStream entityStream) throws IOException, WebApplicationException { - - String marhaledObj = null; - - if (object instanceof PrismObject){ - marhaledObj = prismContext.getJaxbDomHack().silentMarshalObject(((PrismObject) object).asObjectable(), LOGGER); - } else if (object instanceof OperationResult){ - OperationResultType operationResultType = ((OperationResult) object).createOperationResultType(); - marhaledObj = prismContext.getJaxbDomHack().silentMarshalObject(operationResultType, LOGGER); - } else{ - marhaledObj = prismContext.getJaxbDomHack().silentMarshalObject(object, LOGGER); + + // TODO implement in the standard serializer; also change root name + QName fakeQName = new QName(PrismConstants.NS_PREFIX + "debug", "debugPrintObject"); + String xml; + try { + if (object instanceof PrismObject) { + xml = prismContext.xmlSerializer().serialize((PrismObject) object); + } else if (object instanceof OperationResult) { + OperationResultType operationResultType = ((OperationResult) object).createOperationResultType(); + xml = prismContext.xmlSerializer().serializeAnyData(operationResultType, fakeQName); + } else { + xml = prismContext.xmlSerializer().serializeAnyData(object, fakeQName); + } + entityStream.write(xml.getBytes("utf-8")); + } catch (SchemaException | RuntimeException e) { + LoggingUtils.logException(LOGGER, "Couldn't marshal element to string: {}", e, object); } - - entityStream.write(marhaledObj.getBytes("utf-8")); - - } @Override From 226acfe5bc98bc6bd8b742b77346d45b53c9fe14 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Mon, 10 Oct 2016 11:27:13 +0200 Subject: [PATCH 22/74] Introducing names related to lexical processing. --- .../evolveum/midpoint/prism/PrismContext.java | 6 +-- .../midpoint/prism/PrismContextImpl.java | 49 +++++++++-------- .../midpoint/prism/PrismParserImpl.java | 52 +++++++++--------- .../midpoint/prism/PrismParserImplIO.java | 4 +- .../midpoint/prism/PrismParserImplNoIO.java | 4 +- .../midpoint/prism/PrismSerializerImpl.java | 10 ++-- .../midpoint/prism/SerializationContext.java | 2 +- .../midpoint/prism/SerializerDomTarget.java | 8 +-- .../prism/SerializerStringTarget.java | 11 ++-- .../midpoint/prism/SerializerTarget.java | 8 +-- .../midpoint/prism/SerializerXNodeTarget.java | 6 +-- .../LexicalHelpers.java} | 10 ++-- .../LexicalParsingMode.java} | 4 +- .../Parser.java => lex/LexicalProcessor.java} | 5 +- .../LexicalProcessorRegistry.java} | 54 +++++++++---------- .../LexicalUtils.java} | 4 +- .../dom/DomLexicalProcessor.java} | 30 +++++------ .../dom/DomLexicalWriter.java} | 7 ++- .../json/AbstractJsonLexicalProcessor.java} | 12 ++--- .../json/DomElementSerializer.java | 4 +- .../json/ItemPathDeserializer.java | 2 +- .../json/ItemPathSerializer.java | 2 +- .../json/ItemPathTypeDeserializer.java | 2 +- .../json/JsonLexicalProcessor.java} | 8 +-- .../json/JsonNullValueParser.java | 2 +- .../{parser => lex}/json/JsonValueParser.java | 2 +- .../json/PolyStringDeserializer.java | 2 +- .../json/PolyStringSerializer.java | 2 +- .../json/QNameDeserializer.java | 2 +- .../{parser => lex}/json/QNameSerializer.java | 3 +- .../json/XmlGregorialCalendarSerializer.java | 2 +- .../json/YamlLexicalProcessor.java} | 14 ++--- .../json/yaml/MidpointYAMLFactory.java | 2 +- .../json/yaml/MidpointYAMLGenerator.java | 2 +- .../json/yaml/MidpointYAMLParser.java | 8 +-- .../prism/marshaller/JaxbDomHack.java | 9 ++-- .../prism/marshaller/PrismBeanConverter.java | 4 +- .../midpoint/prism/util/PrismUtil.java | 6 +-- .../midpoint/prism/xjc/PrismForJAXBUtil.java | 6 +-- .../ns/_public/query_3/SearchFilterType.java | 4 +- .../AbstractLexicalProcessorTest.java} | 34 ++++++------ .../prism/{parser => lex}/TestDomParser.java | 12 ++--- .../midpoint/prism/lex/TestJsonParser.java | 22 ++++++++ .../{parser => lex}/TestProtectedString.java | 2 +- .../midpoint/prism/lex/TestYamlParser.java | 23 ++++++++ .../midpoint/prism/parser/TestJsonParser.java | 23 -------- .../midpoint/prism/parser/TestYamlParser.java | 24 --------- infra/prism/testng-unit.xml | 6 +-- .../parser/resource/TestParseResource.java | 3 -- .../parser/resource/TestParseResourceXml.java | 4 +- .../xpath/LazyXPathVariableResolver.java | 6 +-- 51 files changed, 256 insertions(+), 277 deletions(-) rename infra/prism/src/main/java/com/evolveum/midpoint/prism/{parser/ParserHelpers.java => lex/LexicalHelpers.java} (73%) rename infra/prism/src/main/java/com/evolveum/midpoint/prism/{parser/ParsingMode.java => lex/LexicalParsingMode.java} (90%) rename infra/prism/src/main/java/com/evolveum/midpoint/prism/{parser/Parser.java => lex/LexicalProcessor.java} (94%) rename infra/prism/src/main/java/com/evolveum/midpoint/prism/{parser/ParserRegistry.java => lex/LexicalProcessorRegistry.java} (57%) rename infra/prism/src/main/java/com/evolveum/midpoint/prism/{parser/ParserUtils.java => lex/LexicalUtils.java} (93%) rename infra/prism/src/main/java/com/evolveum/midpoint/prism/{parser/dom/DomParser.java => lex/dom/DomLexicalProcessor.java} (93%) rename infra/prism/src/main/java/com/evolveum/midpoint/prism/{parser/dom/DomSerializer.java => lex/dom/DomLexicalWriter.java} (98%) rename infra/prism/src/main/java/com/evolveum/midpoint/prism/{parser/json/AbstractJsonParser.java => lex/json/AbstractJsonLexicalProcessor.java} (98%) rename infra/prism/src/main/java/com/evolveum/midpoint/prism/{parser => lex}/json/DomElementSerializer.java (84%) rename infra/prism/src/main/java/com/evolveum/midpoint/prism/{parser => lex}/json/ItemPathDeserializer.java (97%) rename infra/prism/src/main/java/com/evolveum/midpoint/prism/{parser => lex}/json/ItemPathSerializer.java (95%) rename infra/prism/src/main/java/com/evolveum/midpoint/prism/{parser => lex}/json/ItemPathTypeDeserializer.java (97%) rename infra/prism/src/main/java/com/evolveum/midpoint/prism/{parser/json/JsonParser.java => lex/json/JsonLexicalProcessor.java} (93%) rename infra/prism/src/main/java/com/evolveum/midpoint/prism/{parser => lex}/json/JsonNullValueParser.java (97%) rename infra/prism/src/main/java/com/evolveum/midpoint/prism/{parser => lex}/json/JsonValueParser.java (97%) rename infra/prism/src/main/java/com/evolveum/midpoint/prism/{parser => lex}/json/PolyStringDeserializer.java (94%) rename infra/prism/src/main/java/com/evolveum/midpoint/prism/{parser => lex}/json/PolyStringSerializer.java (96%) rename infra/prism/src/main/java/com/evolveum/midpoint/prism/{parser => lex}/json/QNameDeserializer.java (97%) rename infra/prism/src/main/java/com/evolveum/midpoint/prism/{parser => lex}/json/QNameSerializer.java (87%) rename infra/prism/src/main/java/com/evolveum/midpoint/prism/{parser => lex}/json/XmlGregorialCalendarSerializer.java (93%) rename infra/prism/src/main/java/com/evolveum/midpoint/prism/{parser/json/YamlParser.java => lex/json/YamlLexicalProcessor.java} (92%) rename infra/prism/src/main/java/com/evolveum/midpoint/prism/{parser => lex}/json/yaml/MidpointYAMLFactory.java (95%) rename infra/prism/src/main/java/com/evolveum/midpoint/prism/{parser => lex}/json/yaml/MidpointYAMLGenerator.java (95%) rename infra/prism/src/main/java/com/evolveum/midpoint/prism/{parser => lex}/json/yaml/MidpointYAMLParser.java (85%) rename infra/prism/src/test/java/com/evolveum/midpoint/prism/{parser/AbstractParserTest.java => lex/AbstractLexicalProcessorTest.java} (90%) rename infra/prism/src/test/java/com/evolveum/midpoint/prism/{parser => lex}/TestDomParser.java (91%) create mode 100644 infra/prism/src/test/java/com/evolveum/midpoint/prism/lex/TestJsonParser.java rename infra/prism/src/test/java/com/evolveum/midpoint/prism/{parser => lex}/TestProtectedString.java (98%) create mode 100644 infra/prism/src/test/java/com/evolveum/midpoint/prism/lex/TestYamlParser.java delete mode 100644 infra/prism/src/test/java/com/evolveum/midpoint/prism/parser/TestJsonParser.java delete mode 100644 infra/prism/src/test/java/com/evolveum/midpoint/prism/parser/TestYamlParser.java diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java index 3ccd1a6b466..0e3a01b28b1 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java @@ -21,13 +21,12 @@ import com.evolveum.midpoint.prism.marshaller.JaxbDomHack; import com.evolveum.midpoint.prism.marshaller.PrismBeanConverter; import com.evolveum.midpoint.prism.marshaller.XNodeProcessor; -import com.evolveum.midpoint.prism.parser.dom.DomParser; +import com.evolveum.midpoint.prism.lex.dom.DomLexicalProcessor; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.polystring.PolyStringNormalizer; import com.evolveum.midpoint.prism.schema.SchemaDefinitionFactory; import com.evolveum.midpoint.prism.schema.SchemaRegistry; import com.evolveum.midpoint.prism.util.PrismMonitor; -import com.evolveum.midpoint.prism.xnode.RootXNode; import com.evolveum.midpoint.prism.xnode.XNode; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.prism.xml.ns._public.types_3.RawType; @@ -35,7 +34,6 @@ import org.w3c.dom.Element; import org.xml.sax.SAXException; -import javax.xml.bind.JAXBElement; import javax.xml.namespace.QName; import java.io.File; import java.io.IOException; @@ -58,7 +56,7 @@ public interface PrismContext { XNodeProcessor getXnodeProcessor(); - DomParser getParserDom(); + DomLexicalProcessor getParserDom(); PrismBeanConverter getBeanConverter(); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContextImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContextImpl.java index 166f7614a29..087de4ab1c7 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContextImpl.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContextImpl.java @@ -21,10 +21,10 @@ import com.evolveum.midpoint.prism.marshaller.PrismBeanConverter; import com.evolveum.midpoint.prism.marshaller.PrismBeanInspector; import com.evolveum.midpoint.prism.marshaller.XNodeProcessor; -import com.evolveum.midpoint.prism.parser.Parser; -import com.evolveum.midpoint.prism.parser.ParserHelpers; -import com.evolveum.midpoint.prism.parser.ParserRegistry; -import com.evolveum.midpoint.prism.parser.dom.DomParser; +import com.evolveum.midpoint.prism.lex.LexicalProcessor; +import com.evolveum.midpoint.prism.lex.LexicalHelpers; +import com.evolveum.midpoint.prism.lex.LexicalProcessorRegistry; +import com.evolveum.midpoint.prism.lex.dom.DomLexicalProcessor; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.polystring.PolyStringNormalizer; import com.evolveum.midpoint.prism.polystring.PrismDefaultPolyStringNormalizer; @@ -43,7 +43,6 @@ import org.w3c.dom.Element; import org.xml.sax.SAXException; -import javax.xml.bind.JAXBElement; import javax.xml.namespace.QName; import java.io.File; import java.io.IOException; @@ -64,8 +63,8 @@ public class PrismContextImpl implements PrismContext { private PrismBeanConverter beanConverter; private SchemaDefinitionFactory definitionFactory; private PolyStringNormalizer defaultPolyStringNormalizer; - private ParserRegistry parserRegistry; - private ParserHelpers parserHelpers; + private LexicalProcessorRegistry lexicalProcessorRegistry; + private LexicalHelpers lexicalHelpers; private PrismMonitor monitor = null; @Autowired @@ -88,10 +87,10 @@ public static PrismContextImpl create(SchemaRegistry schemaRegistry) { PrismBeanInspector inspector = new PrismBeanInspector(prismContext); prismContext.beanConverter = new PrismBeanConverter(prismContext, inspector); - prismContext.parserRegistry = new ParserRegistry(schemaRegistry); - prismContext.jaxbDomHack = new JaxbDomHack((DomParser) prismContext.parserRegistry.parserFor(PrismContext.LANG_XML), prismContext); + prismContext.lexicalProcessorRegistry = new LexicalProcessorRegistry(schemaRegistry); + prismContext.jaxbDomHack = new JaxbDomHack((DomLexicalProcessor) prismContext.lexicalProcessorRegistry.parserFor(PrismContext.LANG_XML), prismContext); - prismContext.parserHelpers = new ParserHelpers(prismContext.parserRegistry, prismContext.xnodeProcessor, prismContext.beanConverter); + prismContext.lexicalHelpers = new LexicalHelpers(prismContext.lexicalProcessorRegistry, prismContext.xnodeProcessor, prismContext.beanConverter); return prismContext; } @@ -138,8 +137,8 @@ public XNodeProcessor getXnodeProcessor() { * WARNING! This is not really public method. It should NOT not used outside the prism implementation. */ @Override - public DomParser getParserDom() { - return (DomParser) parserHelpers.parserRegistry.parserFor(LANG_XML); + public DomLexicalProcessor getParserDom() { + return (DomLexicalProcessor) lexicalHelpers.lexicalProcessorRegistry.parserFor(LANG_XML); } @Override @@ -173,16 +172,16 @@ public void setDefaultPolyStringNormalizer(PolyStringNormalizer defaultPolyStrin this.defaultPolyStringNormalizer = defaultPolyStringNormalizer; } - private Parser getParser(String language) { - return parserRegistry.parserFor(language); + private LexicalProcessor getParser(String language) { + return lexicalProcessorRegistry.parserFor(language); } - private Parser getParserNotNull(String language) { - Parser parser = getParser(language); - if (parser == null) { + private LexicalProcessor getParserNotNull(String language) { + LexicalProcessor lexicalProcessor = getParser(language); + if (lexicalProcessor == null) { throw new SystemException("No parser for language '"+language+"'"); } - return parser; + return lexicalProcessor; } @Override @@ -209,23 +208,23 @@ public void setMonitor(PrismMonitor monitor) { //region Parsing @Override public PrismParser parserFor(File file) { - return new PrismParserImplIO(new ParserFileSource(file), null, ParsingContext.createDefault(), parserHelpers); + return new PrismParserImplIO(new ParserFileSource(file), null, ParsingContext.createDefault(), lexicalHelpers); } @Override public PrismParser parserFor(InputStream stream) { - return new PrismParserImplIO(new ParserInputStreamSource(stream), null, ParsingContext.createDefault(), parserHelpers); + return new PrismParserImplIO(new ParserInputStreamSource(stream), null, ParsingContext.createDefault(), lexicalHelpers); } @Override public PrismParserNoIO parserFor(String data) { - return new PrismParserImplNoIO(new ParserStringSource(data), null, ParsingContext.createDefault(), parserHelpers); + return new PrismParserImplNoIO(new ParserStringSource(data), null, ParsingContext.createDefault(), lexicalHelpers); } @Deprecated @Override public PrismParserNoIO parserFor(Element data) { - return new PrismParserImplNoIO(new ParserElementSource(data), null, ParsingContext.createDefault(), parserHelpers); + return new PrismParserImplNoIO(new ParserElementSource(data), null, ParsingContext.createDefault(), lexicalHelpers); } @Deprecated @@ -306,7 +305,7 @@ public String serializeObjectToString(PrismObject obje @Override public PrismSerializer serializerFor(String language) { - return new PrismSerializerImpl<>(new SerializerStringTarget(parserHelpers, language), null, null); + return new PrismSerializerImpl<>(new SerializerStringTarget(lexicalHelpers, language), null, null); } @Override @@ -326,12 +325,12 @@ public PrismSerializer yamlSerializer() { @Override public PrismSerializer domSerializer() { - return new PrismSerializerImpl<>(new SerializerDomTarget(parserHelpers), null, null); + return new PrismSerializerImpl<>(new SerializerDomTarget(lexicalHelpers), null, null); } @Override public PrismSerializer xnodeSerializer() { - return new PrismSerializerImpl<>(new SerializerXNodeTarget(parserHelpers), null, null); + return new PrismSerializerImpl<>(new SerializerXNodeTarget(lexicalHelpers), null, null); } @Override diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserImpl.java index 1cc17888f86..2daf5c9a482 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserImpl.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserImpl.java @@ -16,8 +16,8 @@ package com.evolveum.midpoint.prism; -import com.evolveum.midpoint.prism.parser.Parser; -import com.evolveum.midpoint.prism.parser.ParserHelpers; +import com.evolveum.midpoint.prism.lex.LexicalProcessor; +import com.evolveum.midpoint.prism.lex.LexicalHelpers; import com.evolveum.midpoint.prism.xnode.XNode; import com.evolveum.midpoint.util.exception.SchemaException; import org.jetbrains.annotations.NotNull; @@ -37,16 +37,16 @@ public abstract class PrismParserImpl implements PrismParser { @NotNull private final ParserSource source; private final String language; @NotNull private final ParsingContext context; - @NotNull private final ParserHelpers helpers; + @NotNull private final LexicalHelpers helpers; - public PrismParserImpl(@NotNull ParserSource source, String language, @NotNull ParsingContext context, @NotNull ParserHelpers helpers) { + public PrismParserImpl(@NotNull ParserSource source, String language, @NotNull ParsingContext context, @NotNull LexicalHelpers helpers) { this.source = source; this.language = language; this.context = context; this.helpers = helpers; } - private PrismParser create(ParserSource source, String language, @NotNull ParsingContext context, ParserHelpers helpers) { + private PrismParser create(ParserSource source, String language, @NotNull ParsingContext context, LexicalHelpers helpers) { return source.isIO() ? new PrismParserImplIO(source, language, context, helpers) : new PrismParserImplNoIO(source, language, context, helpers); @@ -88,24 +88,24 @@ public PrismParser compat() { } protected PrismObject doParse() throws SchemaException, IOException { - Parser parser = getParser(); - XNode xnode = parser.parse(source, context); + LexicalProcessor lexicalProcessor = getParser(); + XNode xnode = lexicalProcessor.parse(source, context); return helpers.xnodeProcessor.parseObject(xnode, context); } - private Parser getParser() throws IOException { - Parser parser; + private LexicalProcessor getParser() throws IOException { + LexicalProcessor lexicalProcessor; if (language != null) { - parser = helpers.parserRegistry.parserFor(language); + lexicalProcessor = helpers.lexicalProcessorRegistry.parserFor(language); } else { - parser = helpers.parserRegistry.findParser(source); + lexicalProcessor = helpers.lexicalProcessorRegistry.findParser(source); } - return parser; + return lexicalProcessor; } protected List> doParseObjects() throws IOException, SchemaException { - Parser parser = getParser(); - Collection xnodes = parser.parseCollection(source, context); + LexicalProcessor lexicalProcessor = getParser(); + Collection xnodes = lexicalProcessor.parseCollection(source, context); List> objects = new ArrayList<>(); for (XNode xnode : xnodes) { PrismObject object = helpers.xnodeProcessor.parseObject(xnode, context); @@ -115,38 +115,38 @@ protected List> doParseObjects() throws IOExce } protected PrismContainer doParseContainer(Class clazz) throws SchemaException, IOException { - Parser parser = getParser(); - XNode xnode = parser.parse(source, context); + LexicalProcessor lexicalProcessor = getParser(); + XNode xnode = lexicalProcessor.parse(source, context); return helpers.xnodeProcessor.parseContainer(xnode, clazz, context); } protected PrismContainer doParseContainer(PrismContainerDefinition definition) throws SchemaException, IOException { - Parser parser = getParser(); - XNode xnode = parser.parse(source, context); + LexicalProcessor lexicalProcessor = getParser(); + XNode xnode = lexicalProcessor.parse(source, context); return helpers.xnodeProcessor.parseContainer(xnode, definition, context); } protected T doParseAtomicValue(QName typeName) throws IOException, SchemaException { - Parser parser = getParser(); - XNode xnode = parser.parse(source, context); + LexicalProcessor lexicalProcessor = getParser(); + XNode xnode = lexicalProcessor.parse(source, context); return helpers.xnodeProcessor.parseAtomicValue(xnode, typeName, context); } protected Object doParseAnyData() throws IOException, SchemaException { - Parser parser = getParser(); - XNode xnode = parser.parse(source, context); + LexicalProcessor lexicalProcessor = getParser(); + XNode xnode = lexicalProcessor.parse(source, context); return helpers.xnodeProcessor.parseAnyData(xnode, context); } protected T doParseAnyValue() throws IOException, SchemaException { - Parser parser = getParser(); - XNode xnode = parser.parse(source, context); + LexicalProcessor lexicalProcessor = getParser(); + XNode xnode = lexicalProcessor.parse(source, context); return helpers.xnodeProcessor.parseAnyValue(xnode, context); } protected JAXBElement doParseAnyValueAsJAXBElement() throws IOException, SchemaException { - Parser parser = getParser(); - XNode xnode = parser.parse(source, context); + LexicalProcessor lexicalProcessor = getParser(); + XNode xnode = lexicalProcessor.parse(source, context); return helpers.xnodeProcessor.parseAnyValueAsJAXBElement(xnode, context); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserImplIO.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserImplIO.java index 3ef42832ad0..7cab7916bb3 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserImplIO.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserImplIO.java @@ -16,7 +16,7 @@ package com.evolveum.midpoint.prism; -import com.evolveum.midpoint.prism.parser.ParserHelpers; +import com.evolveum.midpoint.prism.lex.LexicalHelpers; import com.evolveum.midpoint.prism.xnode.XNode; import com.evolveum.midpoint.util.exception.SchemaException; @@ -30,7 +30,7 @@ */ public class PrismParserImplIO extends PrismParserImpl { - public PrismParserImplIO(ParserSource source, String language, ParsingContext context, ParserHelpers helpers) { + public PrismParserImplIO(ParserSource source, String language, ParsingContext context, LexicalHelpers helpers) { super(source, language, context, helpers); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserImplNoIO.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserImplNoIO.java index 4c34f49f3c8..0fb431a9568 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserImplNoIO.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserImplNoIO.java @@ -16,7 +16,7 @@ package com.evolveum.midpoint.prism; -import com.evolveum.midpoint.prism.parser.ParserHelpers; +import com.evolveum.midpoint.prism.lex.LexicalHelpers; import com.evolveum.midpoint.prism.xnode.XNode; import com.evolveum.midpoint.util.exception.SchemaException; import org.jetbrains.annotations.NotNull; @@ -32,7 +32,7 @@ public class PrismParserImplNoIO extends PrismParserImpl implements PrismParserNoIO { public PrismParserImplNoIO(ParserSource source, String language, ParsingContext context, - ParserHelpers helpers) { + LexicalHelpers helpers) { super(source, language, context, helpers); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismSerializerImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismSerializerImpl.java index e6b8b76cc42..27497c3bf94 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismSerializerImpl.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismSerializerImpl.java @@ -62,7 +62,7 @@ public PrismSerializerImpl options(SerializationOptions options) { @Override public T serialize(PrismObject object) throws SchemaException { - RootXNode xroot = target.parserHelpers.xnodeProcessor.serializeObject(object, false, context); // TODO serialize composite objects? + RootXNode xroot = target.lexicalHelpers.xnodeProcessor.serializeObject(object, false, context); // TODO serialize composite objects? if (elementName != null) { xroot.setRootElementName(elementName); // TODO what about the type? } @@ -76,7 +76,7 @@ public T serialize(PrismValue value) throws SchemaException { @Override public T serialize(PrismValue value, QName rootElementName) throws SchemaException { - RootXNode xroot = target.parserHelpers.xnodeProcessor.serializeItemValueAsRoot(value, rootElementName); // TODO context + RootXNode xroot = target.lexicalHelpers.xnodeProcessor.serializeItemValueAsRoot(value, rootElementName); // TODO context return target.serialize(xroot, context); } @@ -92,13 +92,13 @@ public T serializeAtomicValue(Object value) throws SchemaException { @Override public T serializeAtomicValue(Object value, QName rootElementName) throws SchemaException { - RootXNode xnode = target.parserHelpers.xnodeProcessor.serializeAtomicValue(value, rootElementName, context); + RootXNode xnode = target.lexicalHelpers.xnodeProcessor.serializeAtomicValue(value, rootElementName, context); return target.serialize(xnode, context); } @Override public T serializeAtomicValue(JAXBElement value) throws SchemaException { - RootXNode xnode = target.parserHelpers.xnodeProcessor.serializeAtomicValue(value); // TODO context + RootXNode xnode = target.lexicalHelpers.xnodeProcessor.serializeAtomicValue(value); // TODO context return target.serialize(xnode, context); } @@ -109,7 +109,7 @@ public T serializeAnyData(Object value) throws SchemaException { @Override public T serializeAnyData(Object value, QName rootName) throws SchemaException { - RootXNode xnode = target.parserHelpers.xnodeProcessor.serializeAnyData(value, rootName, context); + RootXNode xnode = target.lexicalHelpers.xnodeProcessor.serializeAnyData(value, rootName, context); return target.serialize(xnode, context); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializationContext.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializationContext.java index 8fe08d7411f..b0ce3141cd7 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializationContext.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializationContext.java @@ -48,7 +48,7 @@ public static SerializationContext forOptions(SerializationOptions options) { @Override protected SerializationContext clone() { - SerializationContext clone = null; + SerializationContext clone; try { clone = (SerializationContext) super.clone(); } catch (CloneNotSupportedException e) { diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializerDomTarget.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializerDomTarget.java index bae9211ce69..766695af2d7 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializerDomTarget.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializerDomTarget.java @@ -1,6 +1,6 @@ package com.evolveum.midpoint.prism; -import com.evolveum.midpoint.prism.parser.ParserHelpers; +import com.evolveum.midpoint.prism.lex.LexicalHelpers; import com.evolveum.midpoint.prism.xnode.RootXNode; import com.evolveum.midpoint.util.exception.SchemaException; import org.jetbrains.annotations.NotNull; @@ -11,12 +11,12 @@ */ public class SerializerDomTarget extends SerializerTarget { - public SerializerDomTarget(@NotNull ParserHelpers parserHelpers) { - super(parserHelpers); + public SerializerDomTarget(@NotNull LexicalHelpers lexicalHelpers) { + super(lexicalHelpers); } @Override public Element serialize(RootXNode xroot, SerializationContext context) throws SchemaException { - return parserHelpers.parserRegistry.domParser().serializeXRootToElement(xroot); + return lexicalHelpers.lexicalProcessorRegistry.domParser().serializeXRootToElement(xroot); } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializerStringTarget.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializerStringTarget.java index d21f58a7b16..36b7203b14d 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializerStringTarget.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializerStringTarget.java @@ -1,9 +1,6 @@ package com.evolveum.midpoint.prism; -import com.evolveum.midpoint.prism.SerializationContext; -import com.evolveum.midpoint.prism.SerializerTarget; -import com.evolveum.midpoint.prism.marshaller.XNodeProcessor; -import com.evolveum.midpoint.prism.parser.ParserHelpers; +import com.evolveum.midpoint.prism.lex.LexicalHelpers; import com.evolveum.midpoint.prism.xnode.RootXNode; import com.evolveum.midpoint.util.exception.SchemaException; import org.jetbrains.annotations.NotNull; @@ -15,13 +12,13 @@ public class SerializerStringTarget extends SerializerTarget { @NotNull private final String language; - public SerializerStringTarget(@NotNull ParserHelpers parserHelpers, @NotNull String language) { - super(parserHelpers); + public SerializerStringTarget(@NotNull LexicalHelpers lexicalHelpers, @NotNull String language) { + super(lexicalHelpers); this.language = language; } @Override public String serialize(RootXNode xroot, SerializationContext context) throws SchemaException { - return parserHelpers.parserRegistry.parserFor(language).serializeToString(xroot, context); + return lexicalHelpers.lexicalProcessorRegistry.parserFor(language).serializeToString(xroot, context); } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializerTarget.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializerTarget.java index c36a1b572ae..a1468f7a043 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializerTarget.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializerTarget.java @@ -1,6 +1,6 @@ package com.evolveum.midpoint.prism; -import com.evolveum.midpoint.prism.parser.ParserHelpers; +import com.evolveum.midpoint.prism.lex.LexicalHelpers; import com.evolveum.midpoint.prism.xnode.RootXNode; import com.evolveum.midpoint.util.exception.SchemaException; import org.jetbrains.annotations.NotNull; @@ -10,10 +10,10 @@ */ public abstract class SerializerTarget { - @NotNull final ParserHelpers parserHelpers; + @NotNull final LexicalHelpers lexicalHelpers; - protected SerializerTarget(@NotNull ParserHelpers parserHelpers) { - this.parserHelpers = parserHelpers; + protected SerializerTarget(@NotNull LexicalHelpers lexicalHelpers) { + this.lexicalHelpers = lexicalHelpers; } abstract public T serialize(RootXNode xroot, SerializationContext context) throws SchemaException; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializerXNodeTarget.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializerXNodeTarget.java index 9cedde15b55..4d2e0bf51d2 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializerXNodeTarget.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializerXNodeTarget.java @@ -1,6 +1,6 @@ package com.evolveum.midpoint.prism; -import com.evolveum.midpoint.prism.parser.ParserHelpers; +import com.evolveum.midpoint.prism.lex.LexicalHelpers; import com.evolveum.midpoint.prism.xnode.RootXNode; import com.evolveum.midpoint.prism.xnode.XNode; import com.evolveum.midpoint.util.exception.SchemaException; @@ -11,8 +11,8 @@ */ public class SerializerXNodeTarget extends SerializerTarget { - public SerializerXNodeTarget(@NotNull ParserHelpers parserHelpers) { - super(parserHelpers); + public SerializerXNodeTarget(@NotNull LexicalHelpers lexicalHelpers) { + super(lexicalHelpers); } @Override diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/ParserHelpers.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/LexicalHelpers.java similarity index 73% rename from infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/ParserHelpers.java rename to infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/LexicalHelpers.java index 2bcbd00fcae..149b712822f 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/ParserHelpers.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/LexicalHelpers.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.evolveum.midpoint.prism.parser; +package com.evolveum.midpoint.prism.lex; import com.evolveum.midpoint.prism.marshaller.PrismBeanConverter; import com.evolveum.midpoint.prism.marshaller.XNodeProcessor; @@ -22,14 +22,14 @@ /** * @author mederly */ -public class ParserHelpers { +public class LexicalHelpers { - public final ParserRegistry parserRegistry; + public final LexicalProcessorRegistry lexicalProcessorRegistry; public final XNodeProcessor xnodeProcessor; public final PrismBeanConverter beanConverter; - public ParserHelpers(ParserRegistry parserRegistry, XNodeProcessor xnodeProcessor, PrismBeanConverter beanConverter) { - this.parserRegistry = parserRegistry; + public LexicalHelpers(LexicalProcessorRegistry lexicalProcessorRegistry, XNodeProcessor xnodeProcessor, PrismBeanConverter beanConverter) { + this.lexicalProcessorRegistry = lexicalProcessorRegistry; this.xnodeProcessor = xnodeProcessor; this.beanConverter = beanConverter; } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/ParsingMode.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/LexicalParsingMode.java similarity index 90% rename from infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/ParsingMode.java rename to infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/LexicalParsingMode.java index 925738b4d56..d03ff0282e9 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/ParsingMode.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/LexicalParsingMode.java @@ -14,12 +14,12 @@ * limitations under the License. */ -package com.evolveum.midpoint.prism.parser; +package com.evolveum.midpoint.prism.lex; /** * @author mederly */ -public enum ParsingMode { +public enum LexicalParsingMode { // TODO documentation STRICT, LAX; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/Parser.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/LexicalProcessor.java similarity index 94% rename from infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/Parser.java rename to infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/LexicalProcessor.java index 9411e62374e..35e0dd286e2 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/Parser.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/LexicalProcessor.java @@ -13,11 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package com.evolveum.midpoint.prism.parser; + package com.evolveum.midpoint.prism.lex; import java.io.File; import java.io.IOException; -import java.io.InputStream; import java.util.Collection; import javax.xml.namespace.QName; @@ -33,7 +32,7 @@ * @author semancik * */ -public interface Parser { +public interface LexicalProcessor { XNode parse(ParserSource source, ParsingContext parsingContext) throws SchemaException, IOException; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/ParserRegistry.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/LexicalProcessorRegistry.java similarity index 57% rename from infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/ParserRegistry.java rename to infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/LexicalProcessorRegistry.java index 9907f4267a9..e1ca9c91511 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/ParserRegistry.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/LexicalProcessorRegistry.java @@ -14,12 +14,12 @@ * limitations under the License. */ -package com.evolveum.midpoint.prism.parser; +package com.evolveum.midpoint.prism.lex; import com.evolveum.midpoint.prism.*; -import com.evolveum.midpoint.prism.parser.dom.DomParser; -import com.evolveum.midpoint.prism.parser.json.JsonParser; -import com.evolveum.midpoint.prism.parser.json.YamlParser; +import com.evolveum.midpoint.prism.lex.dom.DomLexicalProcessor; +import com.evolveum.midpoint.prism.lex.json.JsonLexicalProcessor; +import com.evolveum.midpoint.prism.lex.json.YamlLexicalProcessor; import com.evolveum.midpoint.prism.schema.SchemaRegistry; import com.evolveum.midpoint.util.DebugUtil; import com.evolveum.midpoint.util.exception.SystemException; @@ -37,56 +37,56 @@ /** * @author mederly */ -public class ParserRegistry { +public class LexicalProcessorRegistry { - private final Map parserMap; + private final Map parserMap; - public ParserRegistry(SchemaRegistry schemaRegistry) { + public LexicalProcessorRegistry(SchemaRegistry schemaRegistry) { parserMap = new HashMap<>(); - DomParser parserDom = new DomParser(schemaRegistry); + DomLexicalProcessor parserDom = new DomLexicalProcessor(schemaRegistry); parserMap.put(LANG_XML, parserDom); - JsonParser parserJson = new JsonParser(); + JsonLexicalProcessor parserJson = new JsonLexicalProcessor(); parserMap.put(LANG_JSON, parserJson); - YamlParser parserYaml = new YamlParser(); + YamlLexicalProcessor parserYaml = new YamlLexicalProcessor(); parserMap.put(LANG_YAML, parserYaml); } @NotNull - public Parser findParser(File file) throws IOException { - for (Map.Entry entry: parserMap.entrySet()) { - Parser aParser = entry.getValue(); - if (aParser.canParse(file)) { - return aParser; + public LexicalProcessor findParser(File file) throws IOException { + for (Map.Entry entry: parserMap.entrySet()) { + LexicalProcessor aLexicalProcessor = entry.getValue(); + if (aLexicalProcessor.canParse(file)) { + return aLexicalProcessor; } } throw new SystemException("No parser for file '"+file+"' (autodetect)"); } @NotNull - public Parser findParser(String data){ - for (Map.Entry entry: parserMap.entrySet()) { - Parser aParser = entry.getValue(); - if (aParser.canParse(data)) { - return aParser; + public LexicalProcessor findParser(String data){ + for (Map.Entry entry: parserMap.entrySet()) { + LexicalProcessor aLexicalProcessor = entry.getValue(); + if (aLexicalProcessor.canParse(data)) { + return aLexicalProcessor; } } throw new SystemException("No parser for data '"+ DebugUtil.excerpt(data,16)+"' (autodetect)"); } @NotNull - public DomParser domParser() { - return (DomParser) parserFor(PrismContext.LANG_XML); + public DomLexicalProcessor domParser() { + return (DomLexicalProcessor) parserFor(PrismContext.LANG_XML); } - public Parser parserFor(String language) { - Parser parser = parserMap.get(language); - if (parser == null) { + public LexicalProcessor parserFor(String language) { + LexicalProcessor lexicalProcessor = parserMap.get(language); + if (lexicalProcessor == null) { throw new SystemException("No parser for language '"+language+"'"); } - return parser; + return lexicalProcessor; } - public Parser findParser(@NotNull ParserSource source) throws IOException { + public LexicalProcessor findParser(@NotNull ParserSource source) throws IOException { if (source instanceof ParserElementSource) { return parserFor(LANG_XML); } else if (source instanceof ParserFileSource) { diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/ParserUtils.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/LexicalUtils.java similarity index 93% rename from infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/ParserUtils.java rename to infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/LexicalUtils.java index a1a7c4b8199..7629ef4260b 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/ParserUtils.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/LexicalUtils.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.evolveum.midpoint.prism.parser; +package com.evolveum.midpoint.prism.lex; import com.evolveum.midpoint.prism.xnode.RootXNode; import com.evolveum.midpoint.prism.xnode.XNode; @@ -25,7 +25,7 @@ /** * @author mederly */ -public class ParserUtils { +public class LexicalUtils { @NotNull public static RootXNode createRootXNode(XNode xnode, QName rootElementName) { diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/dom/DomParser.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/dom/DomLexicalProcessor.java similarity index 93% rename from infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/dom/DomParser.java rename to infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/dom/DomLexicalProcessor.java index 8a198282032..ba256d27773 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/dom/DomParser.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/dom/DomLexicalProcessor.java @@ -13,13 +13,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.evolveum.midpoint.prism.parser.dom; +package com.evolveum.midpoint.prism.lex.dom; import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.marshaller.XNodeProcessorEvaluationMode; import com.evolveum.midpoint.prism.marshaller.XPathHolder; -import com.evolveum.midpoint.prism.parser.Parser; -import com.evolveum.midpoint.prism.parser.ParserUtils; +import com.evolveum.midpoint.prism.lex.LexicalProcessor; +import com.evolveum.midpoint.prism.lex.LexicalUtils; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.schema.SchemaRegistry; import com.evolveum.midpoint.prism.xml.XmlTypeConverter; @@ -49,15 +49,15 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -public class DomParser implements Parser { +public class DomLexicalProcessor implements LexicalProcessor { - public static final Trace LOGGER = TraceManager.getTrace(DomParser.class); + public static final Trace LOGGER = TraceManager.getTrace(DomLexicalProcessor.class); private static final QName SCHEMA_ELEMENT_QNAME = DOMUtil.XSD_SCHEMA_ELEMENT; private SchemaRegistry schemaRegistry; - public DomParser(SchemaRegistry schemaRegistry) { + public DomLexicalProcessor(SchemaRegistry schemaRegistry) { super(); this.schemaRegistry = schemaRegistry; } @@ -416,44 +416,44 @@ public boolean canParse(String dataString) { @Override public String serializeToString(XNode xnode, QName rootElementName, SerializationContext serializationContext) throws SchemaException { - DomSerializer serializer = new DomSerializer(this, schemaRegistry); - RootXNode xroot = ParserUtils.createRootXNode(xnode, rootElementName); + DomLexicalWriter serializer = new DomLexicalWriter(this, schemaRegistry); + RootXNode xroot = LexicalUtils.createRootXNode(xnode, rootElementName); Element element = serializer.serialize(xroot); return DOMUtil.serializeDOMToString(element); } @Override public String serializeToString(RootXNode xnode, SerializationContext serializationContext) throws SchemaException { - DomSerializer serializer = new DomSerializer(this, schemaRegistry); + DomLexicalWriter serializer = new DomLexicalWriter(this, schemaRegistry); Element element = serializer.serialize(xnode); return DOMUtil.serializeDOMToString(element); } public Element serializeUnderElement(XNode xnode, QName rootElementName, Element parentElement) throws SchemaException { - DomSerializer serializer = new DomSerializer(this, schemaRegistry); - RootXNode xroot = ParserUtils.createRootXNode(xnode, rootElementName); + DomLexicalWriter serializer = new DomLexicalWriter(this, schemaRegistry); + RootXNode xroot = LexicalUtils.createRootXNode(xnode, rootElementName); return serializer.serializeUnderElement(xroot, parentElement); } public Element serializeXMapToElement(MapXNode xmap, QName elementName) throws SchemaException { - DomSerializer serializer = new DomSerializer(this, schemaRegistry); + DomLexicalWriter serializer = new DomLexicalWriter(this, schemaRegistry); return serializer.serializeToElement(xmap, elementName); } private Element serializeXPrimitiveToElement(PrimitiveXNode xprim, QName elementName) throws SchemaException { - DomSerializer serializer = new DomSerializer(this, schemaRegistry); + DomLexicalWriter serializer = new DomLexicalWriter(this, schemaRegistry); return serializer.serializeXPrimitiveToElement(xprim, elementName); } public Element serializeXRootToElement(RootXNode xroot) throws SchemaException { - DomSerializer serializer = new DomSerializer(this, schemaRegistry); + DomLexicalWriter serializer = new DomLexicalWriter(this, schemaRegistry); return serializer.serialize(xroot); } // used only by JaxbDomHack.toAny(..) - hopefully it will disappear soon @Deprecated public Element serializeXRootToElement(RootXNode xroot, Document document) throws SchemaException { - DomSerializer serializer = new DomSerializer(this, schemaRegistry); + DomLexicalWriter serializer = new DomLexicalWriter(this, schemaRegistry); return serializer.serialize(xroot, document); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/dom/DomSerializer.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/dom/DomLexicalWriter.java similarity index 98% rename from infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/dom/DomSerializer.java rename to infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/dom/DomLexicalWriter.java index 8db37322f60..9b82cee5e41 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/dom/DomSerializer.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/dom/DomLexicalWriter.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.evolveum.midpoint.prism.parser.dom; +package com.evolveum.midpoint.prism.lex.dom; import com.evolveum.midpoint.prism.marshaller.XPathHolder; -import com.evolveum.midpoint.prism.parser.dom.DomParser; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.schema.SchemaRegistry; import com.evolveum.midpoint.prism.xml.DynamicNamespacePrefixMapper; @@ -41,14 +40,14 @@ * @author semancik * */ -public class DomSerializer { +public class DomLexicalWriter { private Document doc; private Element topElement; private boolean serializeCompositeObjects = false; private SchemaRegistry schemaRegistry; - DomSerializer(DomParser parser, SchemaRegistry schemaRegistry) { + DomLexicalWriter(DomLexicalProcessor parser, SchemaRegistry schemaRegistry) { super(); this.schemaRegistry = schemaRegistry; } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/AbstractJsonParser.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/AbstractJsonLexicalProcessor.java similarity index 98% rename from infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/AbstractJsonParser.java rename to infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/AbstractJsonLexicalProcessor.java index 3cb8550b265..c507dd17715 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/AbstractJsonParser.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/AbstractJsonLexicalProcessor.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.evolveum.midpoint.prism.parser.json; +package com.evolveum.midpoint.prism.lex.json; import java.io.*; import java.util.*; @@ -26,8 +26,8 @@ import com.evolveum.midpoint.prism.ParsingContext; import com.evolveum.midpoint.prism.SerializationContext; import com.evolveum.midpoint.prism.SerializationOptions; -import com.evolveum.midpoint.prism.parser.Parser; -import com.evolveum.midpoint.prism.parser.ParserUtils; +import com.evolveum.midpoint.prism.lex.LexicalProcessor; +import com.evolveum.midpoint.prism.lex.LexicalUtils; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; import com.fasterxml.jackson.core.*; @@ -55,9 +55,9 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.module.SimpleModule; -public abstract class AbstractJsonParser implements Parser { +public abstract class AbstractJsonLexicalProcessor implements LexicalProcessor { - private static final Trace LOGGER = TraceManager.getTrace(AbstractJsonParser.class); + private static final Trace LOGGER = TraceManager.getTrace(AbstractJsonLexicalProcessor.class); static final String PROP_NAMESPACE = "@ns"; static final String PROP_TYPE = "@type"; @@ -432,7 +432,7 @@ private JsonSerializationContext(@NotNull JsonGenerator generator, @Nullable Ser } @Override public String serializeToString(XNode xnode, QName rootElementName, SerializationContext serializationContext) throws SchemaException { - return serializeToString(ParserUtils.createRootXNode(xnode, rootElementName), serializationContext); + return serializeToString(LexicalUtils.createRootXNode(xnode, rootElementName), serializationContext); } protected abstract JsonGenerator createJacksonGenerator(StringWriter out) throws SchemaException; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/DomElementSerializer.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/DomElementSerializer.java similarity index 84% rename from infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/DomElementSerializer.java rename to infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/DomElementSerializer.java index e03f32ede41..b1ca413826b 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/DomElementSerializer.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/DomElementSerializer.java @@ -1,4 +1,4 @@ -package com.evolveum.midpoint.prism.parser.json; +package com.evolveum.midpoint.prism.lex.json; import java.io.IOException; @@ -10,7 +10,7 @@ import com.fasterxml.jackson.databind.ext.DOMSerializer; import com.fasterxml.jackson.databind.jsontype.TypeSerializer; -public class DomElementSerializer extends DOMSerializer{ +public class DomElementSerializer extends DOMSerializer { @Override public void serializeWithType(Node value, JsonGenerator jgen, SerializerProvider provider, diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/ItemPathDeserializer.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/ItemPathDeserializer.java similarity index 97% rename from infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/ItemPathDeserializer.java rename to infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/ItemPathDeserializer.java index 104a110e84f..ccc59dda11c 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/ItemPathDeserializer.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/ItemPathDeserializer.java @@ -1,4 +1,4 @@ -package com.evolveum.midpoint.prism.parser.json; +package com.evolveum.midpoint.prism.lex.json; import java.io.IOException; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/ItemPathSerializer.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/ItemPathSerializer.java similarity index 95% rename from infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/ItemPathSerializer.java rename to infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/ItemPathSerializer.java index e67dc889a9b..a51a2e84d6e 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/ItemPathSerializer.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/ItemPathSerializer.java @@ -1,4 +1,4 @@ -package com.evolveum.midpoint.prism.parser.json; +package com.evolveum.midpoint.prism.lex.json; import java.io.IOException; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/ItemPathTypeDeserializer.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/ItemPathTypeDeserializer.java similarity index 97% rename from infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/ItemPathTypeDeserializer.java rename to infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/ItemPathTypeDeserializer.java index 519a8c22d77..f8b65f51dc0 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/ItemPathTypeDeserializer.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/ItemPathTypeDeserializer.java @@ -1,4 +1,4 @@ -package com.evolveum.midpoint.prism.parser.json; +package com.evolveum.midpoint.prism.lex.json; import java.io.IOException; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/JsonParser.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/JsonLexicalProcessor.java similarity index 93% rename from infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/JsonParser.java rename to infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/JsonLexicalProcessor.java index cad2a48118d..482bca6489d 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/JsonParser.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/JsonLexicalProcessor.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.evolveum.midpoint.prism.parser.json; +package com.evolveum.midpoint.prism.lex.json; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.polystring.PolyString; @@ -39,7 +39,7 @@ import java.io.InputStream; import java.io.StringWriter; -public class JsonParser extends AbstractJsonParser { +public class JsonLexicalProcessor extends AbstractJsonLexicalProcessor { @Override public boolean canParse(File file) throws IOException { @@ -114,7 +114,7 @@ private Module createSerializerModule(){ } @Override - protected void serializeFromPrimitive(PrimitiveXNode primitive, AbstractJsonParser.JsonSerializationContext ctx) throws IOException { + protected void serializeFromPrimitive(PrimitiveXNode primitive, AbstractJsonLexicalProcessor.JsonSerializationContext ctx) throws IOException { QName explicitType = getExplicitType(primitive); if (explicitType != null) { ctx.generator.writeStartObject(); @@ -132,7 +132,7 @@ protected void writeExplicitType(QName explicitType, JsonGenerator generator) th } @Override - protected QName tagToTypeName(Object tid, AbstractJsonParser.JsonParsingContext ctx) { + protected QName tagToTypeName(Object tid, AbstractJsonLexicalProcessor.JsonParsingContext ctx) { return null; } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/JsonNullValueParser.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/JsonNullValueParser.java similarity index 97% rename from infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/JsonNullValueParser.java rename to infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/JsonNullValueParser.java index cabbcd49853..c4035917325 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/JsonNullValueParser.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/JsonNullValueParser.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.evolveum.midpoint.prism.parser.json; +package com.evolveum.midpoint.prism.lex.json; import com.evolveum.midpoint.prism.marshaller.XNodeProcessorEvaluationMode; import com.evolveum.midpoint.prism.util.JavaTypeConverter; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/JsonValueParser.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/JsonValueParser.java similarity index 97% rename from infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/JsonValueParser.java rename to infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/JsonValueParser.java index 2032bb63e7f..26a10cb7b41 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/JsonValueParser.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/JsonValueParser.java @@ -1,4 +1,4 @@ -package com.evolveum.midpoint.prism.parser.json; +package com.evolveum.midpoint.prism.lex.json; import java.io.IOException; import java.util.Map; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/PolyStringDeserializer.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/PolyStringDeserializer.java similarity index 94% rename from infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/PolyStringDeserializer.java rename to infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/PolyStringDeserializer.java index 246c982f8a5..4efa0da13d8 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/PolyStringDeserializer.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/PolyStringDeserializer.java @@ -1,4 +1,4 @@ -package com.evolveum.midpoint.prism.parser.json; +package com.evolveum.midpoint.prism.lex.json; import java.io.IOException; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/PolyStringSerializer.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/PolyStringSerializer.java similarity index 96% rename from infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/PolyStringSerializer.java rename to infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/PolyStringSerializer.java index 0aec12dd31c..f58fa60d494 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/PolyStringSerializer.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/PolyStringSerializer.java @@ -1,4 +1,4 @@ -package com.evolveum.midpoint.prism.parser.json; +package com.evolveum.midpoint.prism.lex.json; import java.io.IOException; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/QNameDeserializer.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/QNameDeserializer.java similarity index 97% rename from infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/QNameDeserializer.java rename to infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/QNameDeserializer.java index bc451da193f..53f516486d9 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/QNameDeserializer.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/QNameDeserializer.java @@ -1,4 +1,4 @@ -package com.evolveum.midpoint.prism.parser.json; +package com.evolveum.midpoint.prism.lex.json; import java.io.IOException; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/QNameSerializer.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/QNameSerializer.java similarity index 87% rename from infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/QNameSerializer.java rename to infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/QNameSerializer.java index f48e8a58992..381426c3365 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/QNameSerializer.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/QNameSerializer.java @@ -1,4 +1,4 @@ -package com.evolveum.midpoint.prism.parser.json; +package com.evolveum.midpoint.prism.lex.json; import java.io.IOException; @@ -6,7 +6,6 @@ import com.evolveum.midpoint.util.QNameUtil; import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.jsontype.TypeSerializer; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/XmlGregorialCalendarSerializer.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/XmlGregorialCalendarSerializer.java similarity index 93% rename from infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/XmlGregorialCalendarSerializer.java rename to infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/XmlGregorialCalendarSerializer.java index 0dd356443e6..f1108d78286 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/XmlGregorialCalendarSerializer.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/XmlGregorialCalendarSerializer.java @@ -1,4 +1,4 @@ -package com.evolveum.midpoint.prism.parser.json; +package com.evolveum.midpoint.prism.lex.json; import java.io.IOException; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/YamlParser.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/YamlLexicalProcessor.java similarity index 92% rename from infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/YamlParser.java rename to infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/YamlLexicalProcessor.java index 9f4e483c98d..8ba883634cf 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/YamlParser.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/YamlLexicalProcessor.java @@ -14,11 +14,11 @@ * limitations under the License. */ -package com.evolveum.midpoint.prism.parser.json; +package com.evolveum.midpoint.prism.lex.json; -import com.evolveum.midpoint.prism.parser.json.yaml.MidpointYAMLFactory; -import com.evolveum.midpoint.prism.parser.json.yaml.MidpointYAMLGenerator; -import com.evolveum.midpoint.prism.parser.json.yaml.MidpointYAMLParser; +import com.evolveum.midpoint.prism.lex.json.yaml.MidpointYAMLFactory; +import com.evolveum.midpoint.prism.lex.json.yaml.MidpointYAMLGenerator; +import com.evolveum.midpoint.prism.lex.json.yaml.MidpointYAMLParser; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.prism.xnode.PrimitiveXNode; @@ -46,7 +46,7 @@ import java.io.StringWriter; //import com.fasterxml.jackson.core.YAMLGenerator; -public class YamlParser extends AbstractJsonParser { +public class YamlLexicalProcessor extends AbstractJsonLexicalProcessor { private static final String YAML = "tag:yaml.org,2002:"; private static final String TAG_STRING = YAML + "str"; @@ -127,7 +127,7 @@ protected MidpointYAMLParser createJacksonParser(InputStream stream) throws Sche } @Override - protected QName tagToTypeName(Object tag, AbstractJsonParser.JsonParsingContext ctx) throws IOException, SchemaException { + protected QName tagToTypeName(Object tag, AbstractJsonLexicalProcessor.JsonParsingContext ctx) throws IOException, SchemaException { if (tag == null) { return null; } if (TAG_STRING.equals(tag)) { @@ -170,7 +170,7 @@ protected MidpointYAMLParser createJacksonParser(String dataString) throws Schem } @Override - protected void serializeFromPrimitive(PrimitiveXNode primitive, AbstractJsonParser.JsonSerializationContext ctx) throws IOException { + protected void serializeFromPrimitive(PrimitiveXNode primitive, AbstractJsonLexicalProcessor.JsonSerializationContext ctx) throws IOException { QName explicitType = getExplicitType(primitive); if (explicitType != null) { ctx.generator.writeTypeId(QNameUtil.qNameToUri(explicitType, false, '/')); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/yaml/MidpointYAMLFactory.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/yaml/MidpointYAMLFactory.java similarity index 95% rename from infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/yaml/MidpointYAMLFactory.java rename to infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/yaml/MidpointYAMLFactory.java index 36e5706b039..f0af223b299 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/yaml/MidpointYAMLFactory.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/yaml/MidpointYAMLFactory.java @@ -1,4 +1,4 @@ -package com.evolveum.midpoint.prism.parser.json.yaml; +package com.evolveum.midpoint.prism.lex.json.yaml; import java.io.IOException; import java.io.InputStream; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/yaml/MidpointYAMLGenerator.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/yaml/MidpointYAMLGenerator.java similarity index 95% rename from infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/yaml/MidpointYAMLGenerator.java rename to infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/yaml/MidpointYAMLGenerator.java index 3af92537538..96e642a0b76 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/yaml/MidpointYAMLGenerator.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/yaml/MidpointYAMLGenerator.java @@ -1,4 +1,4 @@ -package com.evolveum.midpoint.prism.parser.json.yaml; +package com.evolveum.midpoint.prism.lex.json.yaml; import com.fasterxml.jackson.core.ObjectCodec; import com.fasterxml.jackson.core.io.IOContext; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/yaml/MidpointYAMLParser.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/yaml/MidpointYAMLParser.java similarity index 85% rename from infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/yaml/MidpointYAMLParser.java rename to infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/yaml/MidpointYAMLParser.java index 85d77611ecd..c03e28502c9 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/json/yaml/MidpointYAMLParser.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/yaml/MidpointYAMLParser.java @@ -1,19 +1,13 @@ -package com.evolveum.midpoint.prism.parser.json.yaml; +package com.evolveum.midpoint.prism.lex.json.yaml; -import java.io.IOException; import java.io.Reader; //import org.yaml.snakeyaml.events.CollectionStartEvent; - - -import com.fasterxml.jackson.core.JsonGenerationException; import com.fasterxml.jackson.core.ObjectCodec; import com.fasterxml.jackson.core.io.IOContext; import com.fasterxml.jackson.core.util.BufferRecycler; import com.fasterxml.jackson.dataformat.yaml.YAMLParser; -import org.yaml.snakeyaml.events.CollectionStartEvent; -import org.yaml.snakeyaml.events.ScalarEvent; public class MidpointYAMLParser extends YAMLParser { diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/JaxbDomHack.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/JaxbDomHack.java index 583fcb3e9bf..b7db89550ff 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/JaxbDomHack.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/JaxbDomHack.java @@ -21,8 +21,7 @@ import javax.xml.namespace.QName; import com.evolveum.midpoint.prism.*; -import com.evolveum.midpoint.prism.parser.dom.DomParser; -import com.evolveum.midpoint.util.logging.LoggingUtils; +import com.evolveum.midpoint.prism.lex.dom.DomLexicalProcessor; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.Validate; @@ -53,9 +52,9 @@ public class JaxbDomHack { private static final Trace LOGGER = TraceManager.getTrace(JaxbDomHack.class); private PrismContext prismContext; - private DomParser domParser; + private DomLexicalProcessor domParser; - public JaxbDomHack(DomParser domParser, PrismContext prismContext) { + public JaxbDomHack(DomLexicalProcessor domParser, PrismContext prismContext) { super(); this.domParser = domParser; this.prismContext = prismContext; @@ -169,7 +168,7 @@ public Item subItem; if (element instanceof Element) { // DOM Element - DomParser domParser = prismContext.getParserDom(); + DomLexicalProcessor domParser = prismContext.getParserDom(); XNode xnode = domParser.parseElementContent((Element)element); subItem = (Item) prismContext.getXnodeProcessor().parseItem(xnode, elementName, itemDefinition, ParsingContext.createDefault()); } else if (element instanceof JAXBElement) { diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismBeanConverter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismBeanConverter.java index ea6bde548af..82314b138f8 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismBeanConverter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismBeanConverter.java @@ -16,7 +16,7 @@ package com.evolveum.midpoint.prism.marshaller; import com.evolveum.midpoint.prism.*; -import com.evolveum.midpoint.prism.parser.dom.DomParser; +import com.evolveum.midpoint.prism.lex.dom.DomLexicalProcessor; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.prism.schema.SchemaRegistry; @@ -157,7 +157,7 @@ public T unmarshall(MapXNode xnode, Class beanClass, ParsingContext pc) t return (T) new XmlAsStringType(); } else { Map.Entry entry = xnode.entrySet().iterator().next(); - DomParser domParser = prismContext.getParserDom(); + DomLexicalProcessor domParser = prismContext.getParserDom(); String value = domParser.serializeToString(entry.getValue(), entry.getKey(), null); return (T) new XmlAsStringType(value); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/PrismUtil.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/PrismUtil.java index e2d65896131..8f2e4eb9fa9 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/PrismUtil.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/PrismUtil.java @@ -26,7 +26,7 @@ import com.evolveum.midpoint.prism.PrismPropertyValue; import com.evolveum.midpoint.prism.PrismValue; import com.evolveum.midpoint.prism.delta.ItemDelta; -import com.evolveum.midpoint.prism.parser.dom.DomParser; +import com.evolveum.midpoint.prism.lex.dom.DomLexicalProcessor; import com.evolveum.midpoint.prism.marshaller.PrismBeanConverter; import com.evolveum.midpoint.prism.marshaller.XNodeProcessor; import com.evolveum.midpoint.prism.polystring.PolyString; @@ -163,9 +163,9 @@ public static PrismBeanConverter getBeanConverter(PrismContext prismContext) { } } - public static DomParser getDomParser(PrismContext prismContext) { + public static DomLexicalProcessor getDomParser(PrismContext prismContext) { if (prismContext == null) { - return new DomParser(null); + return new DomLexicalProcessor(null); } else { return prismContext.getParserDom(); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xjc/PrismForJAXBUtil.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xjc/PrismForJAXBUtil.java index e953d7d8046..ed12b616629 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xjc/PrismForJAXBUtil.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xjc/PrismForJAXBUtil.java @@ -17,7 +17,7 @@ package com.evolveum.midpoint.prism.xjc; import com.evolveum.midpoint.prism.*; -import com.evolveum.midpoint.prism.parser.dom.DomParser; +import com.evolveum.midpoint.prism.lex.dom.DomLexicalProcessor; import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.prism.xnode.MapXNode; import com.evolveum.midpoint.util.exception.SchemaException; @@ -443,12 +443,12 @@ public static void setReferenceTargetName(PrismReferenceValue rval, PolyStringTy } } - private static DomParser getDomParser(PrismValue pval) { + private static DomLexicalProcessor getDomParser(PrismValue pval) { PrismContext prismContext = pval.getPrismContext(); if (prismContext != null) { return prismContext.getParserDom(); } else { - DomParser parser = new DomParser(null); + DomLexicalProcessor parser = new DomLexicalProcessor(null); return parser; } } diff --git a/infra/prism/src/main/java/com/evolveum/prism/xml/ns/_public/query_3/SearchFilterType.java b/infra/prism/src/main/java/com/evolveum/prism/xml/ns/_public/query_3/SearchFilterType.java index e0d286d6bae..4c5b5fe2526 100644 --- a/infra/prism/src/main/java/com/evolveum/prism/xml/ns/_public/query_3/SearchFilterType.java +++ b/infra/prism/src/main/java/com/evolveum/prism/xml/ns/_public/query_3/SearchFilterType.java @@ -41,7 +41,7 @@ import com.evolveum.midpoint.prism.PrismConstants; import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.parser.dom.DomParser; +import com.evolveum.midpoint.prism.lex.dom.DomLexicalProcessor; import com.evolveum.midpoint.prism.marshaller.QueryConvertor; import com.evolveum.midpoint.prism.util.PrismUtil; import com.evolveum.midpoint.prism.xnode.MapXNode; @@ -167,7 +167,7 @@ public Element getFilterClauseAsElement() throws SchemaException { if (filterClauseXNode == null) { return null; } - DomParser domParser = PrismUtil.getDomParser(null); + DomLexicalProcessor domParser = PrismUtil.getDomParser(null); return domParser.serializeSingleElementMapToElement(filterClauseXNode); } diff --git a/infra/prism/src/test/java/com/evolveum/midpoint/prism/parser/AbstractParserTest.java b/infra/prism/src/test/java/com/evolveum/midpoint/prism/lex/AbstractLexicalProcessorTest.java similarity index 90% rename from infra/prism/src/test/java/com/evolveum/midpoint/prism/parser/AbstractParserTest.java rename to infra/prism/src/test/java/com/evolveum/midpoint/prism/lex/AbstractLexicalProcessorTest.java index e4b6ea43786..779d23d728e 100644 --- a/infra/prism/src/test/java/com/evolveum/midpoint/prism/parser/AbstractParserTest.java +++ b/infra/prism/src/test/java/com/evolveum/midpoint/prism/lex/AbstractLexicalProcessorTest.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.evolveum.midpoint.prism.parser; +package com.evolveum.midpoint.prism.lex; import static org.testng.AssertJUnit.assertTrue; import static com.evolveum.midpoint.prism.PrismInternalTestUtil.*; @@ -58,7 +58,7 @@ * @author semancik * */ -public abstract class AbstractParserTest { +public abstract class AbstractLexicalProcessorTest { private static final QName XSD_COMPLEX_TYPE_ELEMENT_NAME = new QName(XMLConstants.W3C_XML_SCHEMA_NS_URI, "complexType"); @@ -83,7 +83,7 @@ protected File getFile(String baseName) { return new File(getCommonSubdir(), baseName+"."+getFilenameSuffix()); } - protected abstract Parser createParser(); + protected abstract LexicalProcessor createParser(); @Test @@ -92,12 +92,12 @@ public void testParseUserToPrism() throws Exception { displayTestTitle(TEST_NAME); // GIVEN - Parser parser = createParser(); + LexicalProcessor lexicalProcessor = createParser(); PrismContext prismContext = PrismTestUtil.getPrismContext(); XNodeProcessor processor = new XNodeProcessor(prismContext); // WHEN (parse to xnode) - XNode xnode = parser.parse(getFileSource(USER_JACK_FILE_BASENAME), ParsingContext.createDefault()); + XNode xnode = lexicalProcessor.parse(getFileSource(USER_JACK_FILE_BASENAME), ParsingContext.createDefault()); System.out.println("XNode after parsing:"); System.out.println(xnode.debugDump()); @@ -124,12 +124,12 @@ public void testParseUserRoundTrip() throws Exception { displayTestTitle(TEST_NAME); // GIVEN - Parser parser = createParser(); + LexicalProcessor lexicalProcessor = createParser(); PrismContext prismContext = PrismTestUtil.getPrismContext(); XNodeProcessor processor = new XNodeProcessor(prismContext); // WHEN (parse) - XNode xnode = parser.parse(getFileSource(USER_JACK_FILE_BASENAME), ParsingContext.createDefault()); + XNode xnode = lexicalProcessor.parse(getFileSource(USER_JACK_FILE_BASENAME), ParsingContext.createDefault()); System.out.println("\nParsed xnode:"); System.out.println(xnode.debugDump()); PrismObject user = processor.parseObject(xnode, ParsingContext.createDefault()); @@ -142,7 +142,7 @@ public void testParseUserRoundTrip() throws Exception { // WHEN (re-serialize to XNode) XNode serializedXNode = processor.serializeObject(user, true); - String serializedString = parser.serializeToString(serializedXNode, new QName(NS_FOO, "user"), null); + String serializedString = lexicalProcessor.serializeToString(serializedXNode, new QName(NS_FOO, "user"), null); // THEN System.out.println("\nXNode after re-serialization:"); @@ -175,7 +175,7 @@ public void testParseUserRoundTrip() throws Exception { validateUserSchema(serializedString, prismContext); // WHEN (re-parse) - XNode reparsedXnode = parser.parse(new ParserStringSource(serializedString), ParsingContext.createDefault()); + XNode reparsedXnode = lexicalProcessor.parse(new ParserStringSource(serializedString), ParsingContext.createDefault()); PrismObject reparsedUser = processor.parseObject(reparsedXnode, ParsingContext.createDefault()); // THEN @@ -208,12 +208,12 @@ public void testParseResourceRumToPrism() throws Exception { displayTestTitle(TEST_NAME); // GIVEN - Parser parser = createParser(); + LexicalProcessor lexicalProcessor = createParser(); PrismContext prismContext = PrismTestUtil.getPrismContext(); XNodeProcessor processor = new XNodeProcessor(prismContext); // WHEN (parse to xnode) - XNode xnode = parser.parse(getFileSource(RESOURCE_RUM_FILE_BASENAME), ParsingContext.createDefault()); + XNode xnode = lexicalProcessor.parse(getFileSource(RESOURCE_RUM_FILE_BASENAME), ParsingContext.createDefault()); System.out.println("XNode after parsing:"); System.out.println(xnode.debugDump()); @@ -234,12 +234,12 @@ public void testParseResourceRoundTrip() throws Exception { displayTestTitle(TEST_NAME); // GIVEN - Parser parser = createParser(); + LexicalProcessor lexicalProcessor = createParser(); PrismContext prismContext = PrismTestUtil.getPrismContext(); XNodeProcessor processor = new XNodeProcessor(prismContext); // WHEN (parse) - XNode xnode = parser.parse(getFileSource(RESOURCE_RUM_FILE_BASENAME), ParsingContext.createDefault()); + XNode xnode = lexicalProcessor.parse(getFileSource(RESOURCE_RUM_FILE_BASENAME), ParsingContext.createDefault()); PrismObject resource = processor.parseObject(xnode, ParsingContext.createDefault()); // THEN @@ -250,7 +250,7 @@ public void testParseResourceRoundTrip() throws Exception { // WHEN (re-serialize to XNode) XNode serializedXNode = processor.serializeObject(resource, true); - String serializedString = parser.serializeToString(serializedXNode, new QName(NS_FOO, "resource"), null); + String serializedString = lexicalProcessor.serializeToString(serializedXNode, new QName(NS_FOO, "resource"), null); // THEN System.out.println("\nXNode after re-serialization:"); @@ -284,7 +284,7 @@ public void testParseResourceRoundTrip() throws Exception { validateResourceSchema(serializedString, prismContext); // WHEN (re-parse) - XNode reparsedXnode = parser.parse(new ParserStringSource(serializedString), ParsingContext.createDefault()); + XNode reparsedXnode = lexicalProcessor.parse(new ParserStringSource(serializedString), ParsingContext.createDefault()); PrismObject reparsedResource = processor.parseObject(reparsedXnode, ParsingContext.createDefault()); // THEN @@ -386,12 +386,12 @@ public void testParseEventHandler() throws Exception { displayTestTitle(TEST_NAME); // GIVEN - Parser parser = createParser(); + LexicalProcessor lexicalProcessor = createParser(); PrismContext prismContext = PrismTestUtil.getPrismContext(); XNodeProcessor processor = new XNodeProcessor(prismContext); // WHEN (parse to xnode) - RootXNode xnode = (RootXNode) parser.parse(getFileSource(EVENT_HANDLER_FILE_BASENAME), ParsingContext.createDefault()); + RootXNode xnode = (RootXNode) lexicalProcessor.parse(getFileSource(EVENT_HANDLER_FILE_BASENAME), ParsingContext.createDefault()); System.out.println("XNode after parsing:"); System.out.println(xnode.debugDump()); diff --git a/infra/prism/src/test/java/com/evolveum/midpoint/prism/parser/TestDomParser.java b/infra/prism/src/test/java/com/evolveum/midpoint/prism/lex/TestDomParser.java similarity index 91% rename from infra/prism/src/test/java/com/evolveum/midpoint/prism/parser/TestDomParser.java rename to infra/prism/src/test/java/com/evolveum/midpoint/prism/lex/TestDomParser.java index b890daee499..86d55d89e9f 100644 --- a/infra/prism/src/test/java/com/evolveum/midpoint/prism/parser/TestDomParser.java +++ b/infra/prism/src/test/java/com/evolveum/midpoint/prism/lex/TestDomParser.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.evolveum.midpoint.prism.parser; +package com.evolveum.midpoint.prism.lex; import static com.evolveum.midpoint.prism.PrismInternalTestUtil.USER_JACK_FILE_BASENAME; import static com.evolveum.midpoint.prism.PrismInternalTestUtil.displayTestTitle; @@ -27,7 +27,7 @@ import javax.xml.validation.Validator; import com.evolveum.midpoint.prism.ParsingContext; -import com.evolveum.midpoint.prism.parser.dom.DomParser; +import com.evolveum.midpoint.prism.lex.dom.DomLexicalProcessor; import org.testng.annotations.Test; import org.w3c.dom.Document; import org.xml.sax.SAXException; @@ -46,7 +46,7 @@ * @author semancik * */ -public class TestDomParser extends AbstractParserTest { +public class TestDomParser extends AbstractLexicalProcessorTest { @Override protected String getSubdirName() { @@ -59,8 +59,8 @@ protected String getFilenameSuffix() { } @Override - protected DomParser createParser() { - return new DomParser(PrismTestUtil.getSchemaRegistry()); + protected DomLexicalProcessor createParser() { + return new DomLexicalProcessor(PrismTestUtil.getSchemaRegistry()); } @Test @@ -69,7 +69,7 @@ public void testParseUserToXNode() throws Exception { displayTestTitle(TEST_NAME); // GIVEN - DomParser parser = createParser(); + DomLexicalProcessor parser = createParser(); // WHEN XNode xnode = parser.parse(getFile(USER_JACK_FILE_BASENAME), ParsingContext.createDefault()); diff --git a/infra/prism/src/test/java/com/evolveum/midpoint/prism/lex/TestJsonParser.java b/infra/prism/src/test/java/com/evolveum/midpoint/prism/lex/TestJsonParser.java new file mode 100644 index 00000000000..7c27e3d589c --- /dev/null +++ b/infra/prism/src/test/java/com/evolveum/midpoint/prism/lex/TestJsonParser.java @@ -0,0 +1,22 @@ +package com.evolveum.midpoint.prism.lex; + +import com.evolveum.midpoint.prism.lex.json.JsonLexicalProcessor; + +public class TestJsonParser extends AbstractLexicalProcessorTest { + + @Override + protected String getSubdirName() { + return "json"; + } + + @Override + protected String getFilenameSuffix() { + return "json"; + } + + @Override + protected JsonLexicalProcessor createParser() { + return new JsonLexicalProcessor(); + } + +} diff --git a/infra/prism/src/test/java/com/evolveum/midpoint/prism/parser/TestProtectedString.java b/infra/prism/src/test/java/com/evolveum/midpoint/prism/lex/TestProtectedString.java similarity index 98% rename from infra/prism/src/test/java/com/evolveum/midpoint/prism/parser/TestProtectedString.java rename to infra/prism/src/test/java/com/evolveum/midpoint/prism/lex/TestProtectedString.java index 00d2cf78429..3b306d95124 100644 --- a/infra/prism/src/test/java/com/evolveum/midpoint/prism/parser/TestProtectedString.java +++ b/infra/prism/src/test/java/com/evolveum/midpoint/prism/lex/TestProtectedString.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.evolveum.midpoint.prism.parser; +package com.evolveum.midpoint.prism.lex; import com.evolveum.midpoint.prism.ParsingContext; import com.evolveum.midpoint.prism.PrismContext; diff --git a/infra/prism/src/test/java/com/evolveum/midpoint/prism/lex/TestYamlParser.java b/infra/prism/src/test/java/com/evolveum/midpoint/prism/lex/TestYamlParser.java new file mode 100644 index 00000000000..10bebb07f4d --- /dev/null +++ b/infra/prism/src/test/java/com/evolveum/midpoint/prism/lex/TestYamlParser.java @@ -0,0 +1,23 @@ +package com.evolveum.midpoint.prism.lex; + +import com.evolveum.midpoint.prism.lex.json.YamlLexicalProcessor; + +public class TestYamlParser extends AbstractLexicalProcessorTest { + + + @Override + protected String getSubdirName() { + return "yaml"; + } + + @Override + protected String getFilenameSuffix() { + return "yaml"; + } + + @Override + protected YamlLexicalProcessor createParser() { + return new YamlLexicalProcessor(); + } + +} diff --git a/infra/prism/src/test/java/com/evolveum/midpoint/prism/parser/TestJsonParser.java b/infra/prism/src/test/java/com/evolveum/midpoint/prism/parser/TestJsonParser.java deleted file mode 100644 index 68e79bb085e..00000000000 --- a/infra/prism/src/test/java/com/evolveum/midpoint/prism/parser/TestJsonParser.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.evolveum.midpoint.prism.parser; - -import com.evolveum.midpoint.prism.parser.json.JsonParser; -import org.testng.annotations.Test; - -public class TestJsonParser extends AbstractParserTest { - - @Override - protected String getSubdirName() { - return "json"; - } - - @Override - protected String getFilenameSuffix() { - return "json"; - } - - @Override - protected JsonParser createParser() { - return new JsonParser(); - } - -} diff --git a/infra/prism/src/test/java/com/evolveum/midpoint/prism/parser/TestYamlParser.java b/infra/prism/src/test/java/com/evolveum/midpoint/prism/parser/TestYamlParser.java deleted file mode 100644 index 9ec7d1ab3d2..00000000000 --- a/infra/prism/src/test/java/com/evolveum/midpoint/prism/parser/TestYamlParser.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.evolveum.midpoint.prism.parser; - -import com.evolveum.midpoint.prism.parser.json.YamlParser; -import org.testng.annotations.Test; - -public class TestYamlParser extends AbstractParserTest { - - - @Override - protected String getSubdirName() { - return "yaml"; - } - - @Override - protected String getFilenameSuffix() { - return "yaml"; - } - - @Override - protected YamlParser createParser() { - return new YamlParser(); - } - -} diff --git a/infra/prism/testng-unit.xml b/infra/prism/testng-unit.xml index 8bde7f79c96..33d253f205f 100644 --- a/infra/prism/testng-unit.xml +++ b/infra/prism/testng-unit.xml @@ -44,9 +44,9 @@ - - - + + + diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResource.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResource.java index a21da0af31a..8aaa9c2a437 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResource.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResource.java @@ -18,8 +18,6 @@ import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.delta.ObjectDelta; import com.evolveum.midpoint.prism.marshaller.QueryConvertor; -import com.evolveum.midpoint.prism.marshaller.XNodeProcessor; -import com.evolveum.midpoint.prism.parser.dom.DomParser; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.path.NameItemPathSegment; import com.evolveum.midpoint.prism.query.EqualFilter; @@ -29,7 +27,6 @@ import com.evolveum.midpoint.prism.util.PrismAsserts; import com.evolveum.midpoint.prism.util.PrismTestUtil; import com.evolveum.midpoint.prism.xnode.MapXNode; -import com.evolveum.midpoint.prism.xnode.RootXNode; import com.evolveum.midpoint.schema.MidPointPrismContextFactory; import com.evolveum.midpoint.schema.SchemaConstantsGenerated; import com.evolveum.midpoint.schema.TestConstants; diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceXml.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceXml.java index 005b038565c..861a19378fb 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceXml.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceXml.java @@ -19,7 +19,7 @@ import com.evolveum.midpoint.prism.ParsingContext; import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismObject; -import com.evolveum.midpoint.prism.parser.dom.DomParser; +import com.evolveum.midpoint.prism.lex.dom.DomLexicalProcessor; import com.evolveum.midpoint.prism.util.PrismTestUtil; import com.evolveum.midpoint.prism.xnode.XNode; import com.evolveum.midpoint.schema.TestConstants; @@ -50,7 +50,7 @@ public void testParseResourceDom() throws Exception { PrismContext prismContext = PrismTestUtil.getPrismContext(); // WHEN - DomParser parserDom = prismContext.getParserDom(); + DomLexicalProcessor parserDom = prismContext.getParserDom(); XNode xnode = parserDom.parse(getFile(TestConstants.RESOURCE_FILE_BASENAME), null); PrismObject resource = prismContext.getXnodeProcessor().parseObject(xnode, ParsingContext.createDefault()); diff --git a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/script/xpath/LazyXPathVariableResolver.java b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/script/xpath/LazyXPathVariableResolver.java index 972bb5189d2..f438bebb606 100644 --- a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/script/xpath/LazyXPathVariableResolver.java +++ b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/script/xpath/LazyXPathVariableResolver.java @@ -22,7 +22,7 @@ import javax.xml.namespace.QName; import javax.xml.xpath.XPathVariableResolver; -import com.evolveum.midpoint.prism.parser.dom.DomParser; +import com.evolveum.midpoint.prism.lex.dom.DomLexicalProcessor; import org.w3c.dom.Element; import org.w3c.dom.Node; @@ -143,7 +143,7 @@ public static Object convertToXml(Object variableValue, QName variableName, fina } else if (variableValue instanceof PrismProperty) { PrismProperty prismProperty = (PrismProperty)variableValue; - DomParser domProcessor = prismProperty.getPrismContext().getParserDom(); + DomLexicalProcessor domProcessor = prismProperty.getPrismContext().getParserDom(); final List elementList = new ArrayList(); for (PrismPropertyValue value: prismProperty.getValues()) { Element valueElement = prismContext.domSerializer().serialize(value, prismProperty.getElementName()); @@ -163,7 +163,7 @@ public int getLength() { } else if (variableValue instanceof PrismValue) { PrismValue pval = (PrismValue)variableValue; - DomParser domProcessor = prismContext.getParserDom(); + DomLexicalProcessor domProcessor = prismContext.getParserDom(); if (pval.getParent() == null) { // Set a fake parent to allow serialization pval.setParent(new Itemable() { From 50b392ecaa9ba0b28400e779aba6f159b171788f Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Mon, 10 Oct 2016 11:29:59 +0200 Subject: [PATCH 23/74] Continuing renaming --- .../midpoint/prism/PrismParserImpl.java | 18 +++++++++--------- .../midpoint/prism/SerializerStringTarget.java | 2 +- .../midpoint/prism/lex/LexicalProcessor.java | 12 ++++++------ .../prism/lex/LexicalProcessorRegistry.java | 4 ++-- .../prism/lex/dom/DomLexicalProcessor.java | 14 +++++++------- .../lex/json/AbstractJsonLexicalProcessor.java | 10 +++++----- .../prism/lex/json/JsonLexicalProcessor.java | 4 ++-- .../prism/lex/json/YamlLexicalProcessor.java | 4 ++-- .../prism/marshaller/PrismBeanConverter.java | 2 +- .../midpoint/prism/TestXmlSerialization.java | 4 ++-- .../lex/AbstractLexicalProcessorTest.java | 18 +++++++++--------- 11 files changed, 46 insertions(+), 46 deletions(-) diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserImpl.java index 2daf5c9a482..d693d54c127 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserImpl.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserImpl.java @@ -89,7 +89,7 @@ public PrismParser compat() { protected PrismObject doParse() throws SchemaException, IOException { LexicalProcessor lexicalProcessor = getParser(); - XNode xnode = lexicalProcessor.parse(source, context); + XNode xnode = lexicalProcessor.read(source, context); return helpers.xnodeProcessor.parseObject(xnode, context); } @@ -105,7 +105,7 @@ private LexicalProcessor getParser() throws IOException { protected List> doParseObjects() throws IOException, SchemaException { LexicalProcessor lexicalProcessor = getParser(); - Collection xnodes = lexicalProcessor.parseCollection(source, context); + Collection xnodes = lexicalProcessor.readCollection(source, context); List> objects = new ArrayList<>(); for (XNode xnode : xnodes) { PrismObject object = helpers.xnodeProcessor.parseObject(xnode, context); @@ -116,41 +116,41 @@ protected List> doParseObjects() throws IOExce protected PrismContainer doParseContainer(Class clazz) throws SchemaException, IOException { LexicalProcessor lexicalProcessor = getParser(); - XNode xnode = lexicalProcessor.parse(source, context); + XNode xnode = lexicalProcessor.read(source, context); return helpers.xnodeProcessor.parseContainer(xnode, clazz, context); } protected PrismContainer doParseContainer(PrismContainerDefinition definition) throws SchemaException, IOException { LexicalProcessor lexicalProcessor = getParser(); - XNode xnode = lexicalProcessor.parse(source, context); + XNode xnode = lexicalProcessor.read(source, context); return helpers.xnodeProcessor.parseContainer(xnode, definition, context); } protected T doParseAtomicValue(QName typeName) throws IOException, SchemaException { LexicalProcessor lexicalProcessor = getParser(); - XNode xnode = lexicalProcessor.parse(source, context); + XNode xnode = lexicalProcessor.read(source, context); return helpers.xnodeProcessor.parseAtomicValue(xnode, typeName, context); } protected Object doParseAnyData() throws IOException, SchemaException { LexicalProcessor lexicalProcessor = getParser(); - XNode xnode = lexicalProcessor.parse(source, context); + XNode xnode = lexicalProcessor.read(source, context); return helpers.xnodeProcessor.parseAnyData(xnode, context); } protected T doParseAnyValue() throws IOException, SchemaException { LexicalProcessor lexicalProcessor = getParser(); - XNode xnode = lexicalProcessor.parse(source, context); + XNode xnode = lexicalProcessor.read(source, context); return helpers.xnodeProcessor.parseAnyValue(xnode, context); } protected JAXBElement doParseAnyValueAsJAXBElement() throws IOException, SchemaException { LexicalProcessor lexicalProcessor = getParser(); - XNode xnode = lexicalProcessor.parse(source, context); + XNode xnode = lexicalProcessor.read(source, context); return helpers.xnodeProcessor.parseAnyValueAsJAXBElement(xnode, context); } protected XNode doParseToXNode() throws IOException, SchemaException { - return getParser().parse(source, context); + return getParser().read(source, context); } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializerStringTarget.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializerStringTarget.java index 36b7203b14d..6143f295995 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializerStringTarget.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializerStringTarget.java @@ -19,6 +19,6 @@ public SerializerStringTarget(@NotNull LexicalHelpers lexicalHelpers, @NotNull S @Override public String serialize(RootXNode xroot, SerializationContext context) throws SchemaException { - return lexicalHelpers.lexicalProcessorRegistry.parserFor(language).serializeToString(xroot, context); + return lexicalHelpers.lexicalProcessorRegistry.parserFor(language).write(xroot, context); } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/LexicalProcessor.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/LexicalProcessor.java index 35e0dd286e2..d6fe0b05622 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/LexicalProcessor.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/LexicalProcessor.java @@ -34,16 +34,16 @@ */ public interface LexicalProcessor { - XNode parse(ParserSource source, ParsingContext parsingContext) throws SchemaException, IOException; + XNode read(ParserSource source, ParsingContext parsingContext) throws SchemaException, IOException; - Collection parseCollection(ParserSource source, ParsingContext parsingContext) throws SchemaException, IOException; + Collection readCollection(ParserSource source, ParsingContext parsingContext) throws SchemaException, IOException; - boolean canParse(File file) throws IOException; + boolean canRead(File file) throws IOException; - boolean canParse(String dataString); + boolean canRead(String dataString); - String serializeToString(XNode xnode, QName rootElementName, SerializationContext serializationContext) throws SchemaException; + String write(XNode xnode, QName rootElementName, SerializationContext serializationContext) throws SchemaException; - String serializeToString(RootXNode xnode, SerializationContext serializationContext) throws SchemaException; + String write(RootXNode xnode, SerializationContext serializationContext) throws SchemaException; } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/LexicalProcessorRegistry.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/LexicalProcessorRegistry.java index e1ca9c91511..fe63cf9af48 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/LexicalProcessorRegistry.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/LexicalProcessorRegistry.java @@ -55,7 +55,7 @@ public LexicalProcessorRegistry(SchemaRegistry schemaRegistry) { public LexicalProcessor findParser(File file) throws IOException { for (Map.Entry entry: parserMap.entrySet()) { LexicalProcessor aLexicalProcessor = entry.getValue(); - if (aLexicalProcessor.canParse(file)) { + if (aLexicalProcessor.canRead(file)) { return aLexicalProcessor; } } @@ -66,7 +66,7 @@ public LexicalProcessor findParser(File file) throws IOException { public LexicalProcessor findParser(String data){ for (Map.Entry entry: parserMap.entrySet()) { LexicalProcessor aLexicalProcessor = entry.getValue(); - if (aLexicalProcessor.canParse(data)) { + if (aLexicalProcessor.canRead(data)) { return aLexicalProcessor; } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/dom/DomLexicalProcessor.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/dom/DomLexicalProcessor.java index ba256d27773..ea41fafe00f 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/dom/DomLexicalProcessor.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/dom/DomLexicalProcessor.java @@ -64,11 +64,11 @@ public DomLexicalProcessor(SchemaRegistry schemaRegistry) { @Deprecated public XNode parse(File file, ParsingContext parsingContext) throws SchemaException, IOException { - return parse(new ParserFileSource(file), parsingContext); + return read(new ParserFileSource(file), parsingContext); } @Override - public XNode parse(ParserSource source, ParsingContext parsingContext) throws SchemaException, IOException { + public XNode read(ParserSource source, ParsingContext parsingContext) throws SchemaException, IOException { if (source instanceof ParserElementSource) { return parse(((ParserElementSource) source).getElement()); } @@ -85,7 +85,7 @@ public XNode parse(ParserSource source, ParsingContext parsingContext) throws Sc } @Override - public Collection parseCollection(ParserSource source, ParsingContext parsingContext) throws SchemaException, IOException { + public Collection readCollection(ParserSource source, ParsingContext parsingContext) throws SchemaException, IOException { InputStream is = source.getInputStream(); try { Document document = DOMUtil.parse(is); @@ -391,7 +391,7 @@ private SchemaXNode parseSchemaElement(Element schemaElement) { } @Override - public boolean canParse(File file) throws IOException { + public boolean canRead(File file) throws IOException { if (file == null) { return false; } @@ -399,7 +399,7 @@ public boolean canParse(File file) throws IOException { } @Override - public boolean canParse(String dataString) { + public boolean canRead(String dataString) { if (dataString == null) { return false; } @@ -415,7 +415,7 @@ public boolean canParse(String dataString) { } @Override - public String serializeToString(XNode xnode, QName rootElementName, SerializationContext serializationContext) throws SchemaException { + public String write(XNode xnode, QName rootElementName, SerializationContext serializationContext) throws SchemaException { DomLexicalWriter serializer = new DomLexicalWriter(this, schemaRegistry); RootXNode xroot = LexicalUtils.createRootXNode(xnode, rootElementName); Element element = serializer.serialize(xroot); @@ -423,7 +423,7 @@ public String serializeToString(XNode xnode, QName rootElementName, Serializatio } @Override - public String serializeToString(RootXNode xnode, SerializationContext serializationContext) throws SchemaException { + public String write(RootXNode xnode, SerializationContext serializationContext) throws SchemaException { DomLexicalWriter serializer = new DomLexicalWriter(this, schemaRegistry); Element element = serializer.serialize(xnode); return DOMUtil.serializeDOMToString(element); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/AbstractJsonLexicalProcessor.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/AbstractJsonLexicalProcessor.java index c507dd17715..07da73ba509 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/AbstractJsonLexicalProcessor.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/AbstractJsonLexicalProcessor.java @@ -66,7 +66,7 @@ public abstract class AbstractJsonLexicalProcessor implements LexicalProcessor { //region Parsing implementation @Override - public RootXNode parse(ParserSource source, ParsingContext parsingContext) throws SchemaException, IOException { + public RootXNode read(ParserSource source, ParsingContext parsingContext) throws SchemaException, IOException { InputStream is = source.getInputStream(); try { JsonParser parser = createJacksonParser(is); @@ -79,7 +79,7 @@ public RootXNode parse(ParserSource source, ParsingContext parsingContext) throw } @Override - public Collection parseCollection(ParserSource source, ParsingContext parsingContext) throws SchemaException, IOException { + public Collection readCollection(ParserSource source, ParsingContext parsingContext) throws SchemaException, IOException { throw new UnsupportedOperationException("Parse objects not supported for json and yaml."); // why? } @@ -431,8 +431,8 @@ private JsonSerializationContext(@NotNull JsonGenerator generator, @Nullable Ser } } @Override - public String serializeToString(XNode xnode, QName rootElementName, SerializationContext serializationContext) throws SchemaException { - return serializeToString(LexicalUtils.createRootXNode(xnode, rootElementName), serializationContext); + public String write(XNode xnode, QName rootElementName, SerializationContext serializationContext) throws SchemaException { + return write(LexicalUtils.createRootXNode(xnode, rootElementName), serializationContext); } protected abstract JsonGenerator createJacksonGenerator(StringWriter out) throws SchemaException; @@ -440,7 +440,7 @@ public String serializeToString(XNode xnode, QName rootElementName, Serializatio protected abstract void writeExplicitType(QName explicitType, JsonGenerator generator) throws IOException; @Override - public String serializeToString(RootXNode root, SerializationContext prismSerializationContext) throws SchemaException { + public String write(RootXNode root, SerializationContext prismSerializationContext) throws SchemaException { StringWriter out = new StringWriter(); try ( JsonGenerator generator = createJacksonGenerator(out) ) { JsonSerializationContext ctx = new JsonSerializationContext(generator, prismSerializationContext); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/JsonLexicalProcessor.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/JsonLexicalProcessor.java index 482bca6489d..3c2034d7f3e 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/JsonLexicalProcessor.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/JsonLexicalProcessor.java @@ -42,7 +42,7 @@ public class JsonLexicalProcessor extends AbstractJsonLexicalProcessor { @Override - public boolean canParse(File file) throws IOException { + public boolean canRead(File file) throws IOException { if (file == null) { return false; } @@ -50,7 +50,7 @@ public boolean canParse(File file) throws IOException { } @Override - public boolean canParse(String dataString) { + public boolean canRead(String dataString) { if (dataString == null) { return false; } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/YamlLexicalProcessor.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/YamlLexicalProcessor.java index 8ba883634cf..727dbd6fdeb 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/YamlLexicalProcessor.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/YamlLexicalProcessor.java @@ -58,7 +58,7 @@ public class YamlLexicalProcessor extends AbstractJsonLexicalProcessor { //------------------------END OF METHODS FOR SERIALIZATION ------------------------------- @Override - public boolean canParse(File file) throws IOException { + public boolean canRead(File file) throws IOException { if (file == null) { return false; } @@ -66,7 +66,7 @@ public boolean canParse(File file) throws IOException { } @Override - public boolean canParse(String dataString) { + public boolean canRead(String dataString) { if (dataString == null) { return false; } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismBeanConverter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismBeanConverter.java index 82314b138f8..4dd63b78fcd 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismBeanConverter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismBeanConverter.java @@ -158,7 +158,7 @@ public T unmarshall(MapXNode xnode, Class beanClass, ParsingContext pc) t } else { Map.Entry entry = xnode.entrySet().iterator().next(); DomLexicalProcessor domParser = prismContext.getParserDom(); - String value = domParser.serializeToString(entry.getValue(), entry.getKey(), null); + String value = domParser.write(entry.getValue(), entry.getKey(), null); return (T) new XmlAsStringType(value); } } diff --git a/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestXmlSerialization.java b/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestXmlSerialization.java index 6fc1f9b9d0a..8b2077ab974 100644 --- a/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestXmlSerialization.java +++ b/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestXmlSerialization.java @@ -60,12 +60,12 @@ public void testHandlingInvalidChars() throws Exception { // THEN - String ok = prismContext.getParserDom().serializeToString(valOkNode, new QName("ok"), null); + String ok = prismContext.getParserDom().write(valOkNode, new QName("ok"), null); System.out.println("correct value serialized to: " + ok); assertEquals("Wrong serialization", "abcdef", ok.trim()); // todo make this less brittle with regards to serialization style try { - String wrong = prismContext.getParserDom().serializeToString(valWrongNode, new QName("wrong"), null); + String wrong = prismContext.getParserDom().write(valWrongNode, new QName("wrong"), null); System.out.println("wrong value serialized to: " + wrong); assert false : "Wrong value serialization had to fail but it didn't!"; } catch (RuntimeException e) { diff --git a/infra/prism/src/test/java/com/evolveum/midpoint/prism/lex/AbstractLexicalProcessorTest.java b/infra/prism/src/test/java/com/evolveum/midpoint/prism/lex/AbstractLexicalProcessorTest.java index 779d23d728e..802c105a15d 100644 --- a/infra/prism/src/test/java/com/evolveum/midpoint/prism/lex/AbstractLexicalProcessorTest.java +++ b/infra/prism/src/test/java/com/evolveum/midpoint/prism/lex/AbstractLexicalProcessorTest.java @@ -97,7 +97,7 @@ public void testParseUserToPrism() throws Exception { XNodeProcessor processor = new XNodeProcessor(prismContext); // WHEN (parse to xnode) - XNode xnode = lexicalProcessor.parse(getFileSource(USER_JACK_FILE_BASENAME), ParsingContext.createDefault()); + XNode xnode = lexicalProcessor.read(getFileSource(USER_JACK_FILE_BASENAME), ParsingContext.createDefault()); System.out.println("XNode after parsing:"); System.out.println(xnode.debugDump()); @@ -129,7 +129,7 @@ public void testParseUserRoundTrip() throws Exception { XNodeProcessor processor = new XNodeProcessor(prismContext); // WHEN (parse) - XNode xnode = lexicalProcessor.parse(getFileSource(USER_JACK_FILE_BASENAME), ParsingContext.createDefault()); + XNode xnode = lexicalProcessor.read(getFileSource(USER_JACK_FILE_BASENAME), ParsingContext.createDefault()); System.out.println("\nParsed xnode:"); System.out.println(xnode.debugDump()); PrismObject user = processor.parseObject(xnode, ParsingContext.createDefault()); @@ -142,7 +142,7 @@ public void testParseUserRoundTrip() throws Exception { // WHEN (re-serialize to XNode) XNode serializedXNode = processor.serializeObject(user, true); - String serializedString = lexicalProcessor.serializeToString(serializedXNode, new QName(NS_FOO, "user"), null); + String serializedString = lexicalProcessor.write(serializedXNode, new QName(NS_FOO, "user"), null); // THEN System.out.println("\nXNode after re-serialization:"); @@ -175,7 +175,7 @@ public void testParseUserRoundTrip() throws Exception { validateUserSchema(serializedString, prismContext); // WHEN (re-parse) - XNode reparsedXnode = lexicalProcessor.parse(new ParserStringSource(serializedString), ParsingContext.createDefault()); + XNode reparsedXnode = lexicalProcessor.read(new ParserStringSource(serializedString), ParsingContext.createDefault()); PrismObject reparsedUser = processor.parseObject(reparsedXnode, ParsingContext.createDefault()); // THEN @@ -213,7 +213,7 @@ public void testParseResourceRumToPrism() throws Exception { XNodeProcessor processor = new XNodeProcessor(prismContext); // WHEN (parse to xnode) - XNode xnode = lexicalProcessor.parse(getFileSource(RESOURCE_RUM_FILE_BASENAME), ParsingContext.createDefault()); + XNode xnode = lexicalProcessor.read(getFileSource(RESOURCE_RUM_FILE_BASENAME), ParsingContext.createDefault()); System.out.println("XNode after parsing:"); System.out.println(xnode.debugDump()); @@ -239,7 +239,7 @@ public void testParseResourceRoundTrip() throws Exception { XNodeProcessor processor = new XNodeProcessor(prismContext); // WHEN (parse) - XNode xnode = lexicalProcessor.parse(getFileSource(RESOURCE_RUM_FILE_BASENAME), ParsingContext.createDefault()); + XNode xnode = lexicalProcessor.read(getFileSource(RESOURCE_RUM_FILE_BASENAME), ParsingContext.createDefault()); PrismObject resource = processor.parseObject(xnode, ParsingContext.createDefault()); // THEN @@ -250,7 +250,7 @@ public void testParseResourceRoundTrip() throws Exception { // WHEN (re-serialize to XNode) XNode serializedXNode = processor.serializeObject(resource, true); - String serializedString = lexicalProcessor.serializeToString(serializedXNode, new QName(NS_FOO, "resource"), null); + String serializedString = lexicalProcessor.write(serializedXNode, new QName(NS_FOO, "resource"), null); // THEN System.out.println("\nXNode after re-serialization:"); @@ -284,7 +284,7 @@ public void testParseResourceRoundTrip() throws Exception { validateResourceSchema(serializedString, prismContext); // WHEN (re-parse) - XNode reparsedXnode = lexicalProcessor.parse(new ParserStringSource(serializedString), ParsingContext.createDefault()); + XNode reparsedXnode = lexicalProcessor.read(new ParserStringSource(serializedString), ParsingContext.createDefault()); PrismObject reparsedResource = processor.parseObject(reparsedXnode, ParsingContext.createDefault()); // THEN @@ -391,7 +391,7 @@ public void testParseEventHandler() throws Exception { XNodeProcessor processor = new XNodeProcessor(prismContext); // WHEN (parse to xnode) - RootXNode xnode = (RootXNode) lexicalProcessor.parse(getFileSource(EVENT_HANDLER_FILE_BASENAME), ParsingContext.createDefault()); + RootXNode xnode = (RootXNode) lexicalProcessor.read(getFileSource(EVENT_HANDLER_FILE_BASENAME), ParsingContext.createDefault()); System.out.println("XNode after parsing:"); System.out.println(xnode.debugDump()); From b2e8151dfdcf74fae3c5970c549356247aae59ea Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Tue, 11 Oct 2016 10:05:00 +0200 Subject: [PATCH 24/74] Started deconstructing JaxbDomHack, introduced (empty) prism-api. --- infra/prism/pom.xml | 5 ++ .../evolveum/midpoint/prism/PrismContext.java | 3 - .../midpoint/prism/PrismContextImpl.java | 23 ------- .../midpoint/prism/PrismPropertyValue.java | 2 +- .../midpoint/prism/PrismSerializer.java | 61 +++++++++++++++++-- .../midpoint/prism/PrismSerializerImpl.java | 12 +++- .../prism/lex/dom/DomLexicalProcessor.java | 7 --- .../prism/marshaller/JaxbDomHack.java | 57 +++++++++-------- .../midpoint/prism/xjc/AnyArrayList.java | 1 - .../midpoint/prism/xml/XmlTypeConverter.java | 4 +- .../midpoint/testing/sanity/TestSanity.java | 20 +++--- 11 files changed, 113 insertions(+), 82 deletions(-) diff --git a/infra/prism/pom.xml b/infra/prism/pom.xml index 2385a2c1d35..4e4c623f00c 100644 --- a/infra/prism/pom.xml +++ b/infra/prism/pom.xml @@ -38,6 +38,11 @@ util 3.5-SNAPSHOT + + com.evolveum.midpoint.infra + prism-api + 3.5-SNAPSHOT + com.sun.xml.bind jaxb-xjc diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java index 0e3a01b28b1..24739962b7f 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java @@ -120,9 +120,6 @@ void adopt(PrismContainerValue PrismObject createObject(Class clazz) throws SchemaException; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContextImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContextImpl.java index 087de4ab1c7..1c7ef14ffd1 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContextImpl.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContextImpl.java @@ -338,29 +338,6 @@ public boolean canSerialize(Object value) { return xnodeProcessor.canSerialize(value); } - -// public String serializeAtomicValues(QName elementName, String language, T... values) throws SchemaException { -// Parser parser = getParserNotNull(language); -// PrismPropertyDefinition definition = schemaRegistry.findPropertyDefinitionByElementName(elementName); -// if (definition == null) { -// throw new SchemaException("Prism property with name " + elementName + " couldn't be found"); -// } -// PrismProperty property = definition.instantiate(); -// for (T value : values) { -// property.addRealValue(value); -// } -// RootXNode xroot = xnodeProcessor.serializeItemAsRoot(property); -// return parser.serializeToString(xroot); -// } - - @Override - @Deprecated - public Element serializeValueToDom(PrismValue pval, QName elementName, Document document) throws SchemaException { - RootXNode xroot = xnodeProcessor.serializeItemValueAsRoot(pval, elementName); - return getParserDom().serializeXRootToElement(xroot, document); - } - - //endregion /** diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyValue.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyValue.java index f1093b3369e..f561cb3ae08 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyValue.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyValue.java @@ -150,7 +150,7 @@ public static Collection getValues(Collection> pval return realValues; } - public Object getRawElement() { + public XNode getRawElement() { return rawElement; } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismSerializer.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismSerializer.java index ce853b50fa8..7113a14ba72 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismSerializer.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismSerializer.java @@ -20,22 +20,73 @@ import com.evolveum.midpoint.prism.xnode.XNode; import com.evolveum.midpoint.util.exception.SchemaException; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import javax.xml.bind.JAXBElement; import javax.xml.namespace.QName; /** + * Takes care of serializing prism objects and other beans, i.e. converts java form to + * lexical representation (XML/JSON/YAML strings, DOM tree) or intermediate one (XNode). + * * @author mederly */ public interface PrismSerializer { - PrismSerializer context(SerializationContext context); + /** + * Sets the name of the root element. Can be done either here or during call to serialize(..) methods. + * + * @param elementName Name of the root element + * @return Serializer with the root element name set. + */ + @NotNull PrismSerializer root(QName elementName); - PrismSerializer options(SerializationOptions options); - T serialize(PrismObject object) throws SchemaException; - T serialize(PrismValue value) throws SchemaException; - T serialize(PrismValue value, QName rootName) throws SchemaException; + /** + * Sets the context for the serialization operation, containing e.g. serialization options. + * + * @param context Context to be set. + * @return Serializer with the context set. + */ + @NotNull + PrismSerializer context(@Nullable SerializationContext context); + + /** + * Sets the serialization options (part of the context). + * + * @param options Options to be set. + * @return Serializer with the options set. + */ + @NotNull + PrismSerializer options(@Nullable SerializationOptions options); + + /** + * Serializes given PrismObject. + * + * @param object PrismObject to be serialized. + * @return String representation of the object. + */ + @NotNull + T serialize(@NotNull PrismObject object) throws SchemaException; + + /** + * Serializes given prism value (property, reference, or container). + * Name of the root element is derived in the following way: + * 1. if explicit name is set ( + * @param value Value to be serialized. + * @return String representation of the value. + */ + @NotNull + T serialize(@NotNull PrismValue value) throws SchemaException; + + /** + * Serializes given prism value (property, reference, or container). + * @param value Value to be serialized. + * @param rootName Name of the root element. (Overrides other means of deriving the name.) + * @return String representation of the value. + */ + @NotNull + T serialize(@NotNull PrismValue value, @NotNull QName rootName) throws SchemaException; @Deprecated T serialize(RootXNode xnode) throws SchemaException; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismSerializerImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismSerializerImpl.java index 27497c3bf94..59f5cd70892 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismSerializerImpl.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismSerializerImpl.java @@ -38,16 +38,19 @@ public PrismSerializerImpl(@NotNull SerializerTarget target, QName elementNam this.context = context; } + @NotNull @Override public PrismSerializerImpl context(SerializationContext context) { return new PrismSerializerImpl<>(this.target, elementName, context); } + @NotNull @Override public PrismSerializerImpl root(QName elementName) { return new PrismSerializerImpl<>(this.target, elementName, this.context); } + @NotNull @Override public PrismSerializerImpl options(SerializationOptions options) { SerializationContext context; @@ -60,8 +63,9 @@ public PrismSerializerImpl options(SerializationOptions options) { return new PrismSerializerImpl<>(this.target, this.elementName, context); } + @NotNull @Override - public T serialize(PrismObject object) throws SchemaException { + public T serialize(@NotNull PrismObject object) throws SchemaException { RootXNode xroot = target.lexicalHelpers.xnodeProcessor.serializeObject(object, false, context); // TODO serialize composite objects? if (elementName != null) { xroot.setRootElementName(elementName); // TODO what about the type? @@ -69,13 +73,15 @@ public T serialize(PrismObject object) throws SchemaEx return target.serialize(xroot, context); } + @NotNull @Override - public T serialize(PrismValue value) throws SchemaException { + public T serialize(@NotNull PrismValue value) throws SchemaException { return serialize(value, elementName); } + @NotNull @Override - public T serialize(PrismValue value, QName rootElementName) throws SchemaException { + public T serialize(@NotNull PrismValue value, @NotNull QName rootElementName) throws SchemaException { RootXNode xroot = target.lexicalHelpers.xnodeProcessor.serializeItemValueAsRoot(value, rootElementName); // TODO context return target.serialize(xroot, context); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/dom/DomLexicalProcessor.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/dom/DomLexicalProcessor.java index ea41fafe00f..1bc75b86f44 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/dom/DomLexicalProcessor.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/dom/DomLexicalProcessor.java @@ -450,13 +450,6 @@ public Element serializeXRootToElement(RootXNode xroot) throws SchemaException { return serializer.serialize(xroot); } - // used only by JaxbDomHack.toAny(..) - hopefully it will disappear soon - @Deprecated - public Element serializeXRootToElement(RootXNode xroot, Document document) throws SchemaException { - DomLexicalWriter serializer = new DomLexicalWriter(this, schemaRegistry); - return serializer.serialize(xroot, document); - } - private Element serializeToElement(XNode xnode, QName elementName) throws SchemaException { Validate.notNull(xnode); Validate.notNull(elementName); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/JaxbDomHack.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/JaxbDomHack.java index b7db89550ff..1a346a997bf 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/JaxbDomHack.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/JaxbDomHack.java @@ -25,7 +25,6 @@ import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.Validate; -import org.w3c.dom.Document; import org.w3c.dom.Element; import com.evolveum.midpoint.prism.xml.XmlTypeConverter; @@ -214,61 +213,65 @@ public /** - * Serializes prism value to JAXB "any" format as returned by JAXB getAny() methods. + * Serializes prism value to JAXB "any" format as returned by JAXB getAny() methods. */ public Object toAny(PrismValue value) throws SchemaException { - Document document = DOMUtil.getDocument(); if (value == null) { - return value; + return null; + } + Itemable parent = value.getParent(); + if (parent == null) { + throw new IllegalStateException("Couldn't convert parent-less prism value to xsd:any: " + value); } - QName elementName = value.getParent().getElementName(); - Object xmlValue; + QName elementName = parent.getElementName(); if (value instanceof PrismPropertyValue) { PrismPropertyValue pval = (PrismPropertyValue)value; - if (pval.isRaw() && (pval.getParent() == null || pval.getParent().getDefinition() == null)) { - Object rawElement = pval.getRawElement(); - if (rawElement instanceof Element) { - return ((Element)rawElement).cloneNode(true); - } else if (rawElement instanceof MapXNode) { + if (pval.isRaw() && parent.getDefinition() == null) { + XNode rawElement = pval.getRawElement(); + if (rawElement instanceof MapXNode) { return domParser.serializeXMapToElement((MapXNode)rawElement, elementName); } else if (rawElement instanceof PrimitiveXNode) { PrimitiveXNode xprim = (PrimitiveXNode)rawElement; String stringValue = xprim.getStringValue(); - Element element = DOMUtil.createElement(document, elementName); + Element element = DOMUtil.createElement(DOMUtil.getDocument(), elementName); element.setTextContent(stringValue); DOMUtil.setNamespaceDeclarations(element, xprim.getRelevantNamespaceDeclarations()); return element; } else { throw new IllegalArgumentException("Cannot convert raw element "+rawElement+" to xsd:any"); } + } else { + Object realValue = pval.getValue(); + if (XmlTypeConverter.canConvert(realValue.getClass())) { + // Always record xsi:type. This is FIXME, but should work OK for now (until we put definition into deltas) + return XmlTypeConverter.toXsdElement(realValue, elementName, DOMUtil.getDocument(), true); + } else { + return wrapIfNeeded(realValue, elementName); + } } - Object realValue = pval.getValue(); - xmlValue = realValue; - if (XmlTypeConverter.canConvert(realValue.getClass())) { - // Always record xsi:type. This is FIXME, but should work OK for now (until we put definition into deltas) - xmlValue = XmlTypeConverter.toXsdElement(realValue, elementName, document, true); - } } else if (value instanceof PrismReferenceValue) { - PrismReferenceValue rval = (PrismReferenceValue)value; - xmlValue = prismContext.serializeValueToDom(rval, elementName, document); + return prismContext.domSerializer().serialize(value, elementName); } else if (value instanceof PrismContainerValue) { PrismContainerValue pval = (PrismContainerValue)value; if (pval.getParent().getCompileTimeClass() == null) { // This has to be runtime schema without a compile-time representation. // We need to convert it to DOM - xmlValue = prismContext.serializeValueToDom(pval, elementName, document); + return prismContext.domSerializer().serialize(pval, elementName); } else { - xmlValue = pval.asContainerable(); + return wrapIfNeeded(pval.asContainerable(), elementName); } } else { throw new IllegalArgumentException("Unknown type "+value); } - if (!(xmlValue instanceof Element) && !(xmlValue instanceof JAXBElement)) { - xmlValue = new JAXBElement(elementName, xmlValue.getClass(), xmlValue); - } - return xmlValue; - } + } + private Object wrapIfNeeded(Object value, QName elementName) { + if (value instanceof Element || value instanceof JAXBElement) { + return value; + } else { + return new JAXBElement(elementName, value.getClass(), value); + } + } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xjc/AnyArrayList.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xjc/AnyArrayList.java index 2a793544bd0..9dd83b1657d 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xjc/AnyArrayList.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xjc/AnyArrayList.java @@ -201,7 +201,6 @@ private Object asElement(PrismValue itemValue) { } catch (SchemaException e) { throw new SystemException("Unexpected schema problem: "+e.getMessage(),e); } - // return itemValue.asDomElement(); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xml/XmlTypeConverter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xml/XmlTypeConverter.java index b817a30fc0a..0da09c8ea37 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xml/XmlTypeConverter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xml/XmlTypeConverter.java @@ -226,9 +226,9 @@ public static Object toXsdElement(Object val, QName elementName, Document doc) t * @param doc * @param recordType * @return created element - * @throws JAXBException + * @throws SchemaException */ - public static Object toXsdElement(Object val, QName elementName, Document doc, boolean recordType) throws SchemaException { + public static Element toXsdElement(Object val, QName elementName, Document doc, boolean recordType) throws SchemaException { if (val == null) { // if no value is specified, do not create element return null; diff --git a/testing/sanity/src/test/java/com/evolveum/midpoint/testing/sanity/TestSanity.java b/testing/sanity/src/test/java/com/evolveum/midpoint/testing/sanity/TestSanity.java index 68ad79a6ca1..e1ba869635a 100644 --- a/testing/sanity/src/test/java/com/evolveum/midpoint/testing/sanity/TestSanity.java +++ b/testing/sanity/src/test/java/com/evolveum/midpoint/testing/sanity/TestSanity.java @@ -50,6 +50,7 @@ import javax.xml.namespace.QName; import javax.xml.ws.Holder; +import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.task.api.TaskManagerException; import com.evolveum.midpoint.util.exception.*; import org.apache.commons.lang.StringUtils; @@ -80,14 +81,6 @@ import com.evolveum.midpoint.common.refinery.RefinedObjectClassDefinition; import com.evolveum.midpoint.common.refinery.RefinedResourceSchema; import com.evolveum.midpoint.model.test.AbstractModelIntegrationTest; -import com.evolveum.midpoint.prism.Containerable; -import com.evolveum.midpoint.prism.Item; -import com.evolveum.midpoint.prism.PrismContainer; -import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.PrismObject; -import com.evolveum.midpoint.prism.PrismProperty; -import com.evolveum.midpoint.prism.PrismPropertyDefinition; -import com.evolveum.midpoint.prism.PrismPropertyValue; import com.evolveum.midpoint.prism.crypto.EncryptionException; import com.evolveum.midpoint.prism.delta.ChangeType; import com.evolveum.midpoint.prism.delta.ItemDelta; @@ -709,14 +702,21 @@ public void test002AddDerbyResource() throws Exception { display("DB Connector: ", dbConnector); // Check if password was encrypted during import + // via JAXB Object configurationPropertiesElement = JAXBUtil.findElement(derbyResource.asObjectable().getConnectorConfiguration().getAny(), new QName(dbConnector.asObjectable().getNamespace(), "configurationProperties")); Object passwordElement = JAXBUtil.findElement(JAXBUtil.listChildElements(configurationPropertiesElement), new QName(dbConnector.asObjectable().getNamespace(), "password")); System.out.println("Password element: " + passwordElement); - - + // via prisms + PrismContainerValue configurationProperties = derbyResource.findContainer( + new ItemPath( + ResourceType.F_CONNECTOR_CONFIGURATION, + new QName("configurationProperties"))) + .getValue(); + PrismProperty password = configurationProperties.findProperty(new QName(dbConnector.asObjectable().getNamespace(), "password")); + System.out.println("Password property: " + password); } private void addObjectViaModelWS(ObjectType objectType, ModelExecuteOptionsType options, Holder oidHolder, Holder resultHolder) throws FaultMessage { From 5f1db0ca2f46db6668759c861b1550ac04c410c8 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Tue, 11 Oct 2016 14:57:13 +0200 Subject: [PATCH 25/74] Cleaning up prism filters: interim commit. --- .../assignment/AssignmentEditorPanel.java | 25 +- .../MultipleAssignmentSelectorPanel.java | 14 +- .../web/page/admin/home/PageDashboard.java | 32 +-- .../LayerRefinedAttributeDefinition.java | 4 +- .../refinery/RefinedAttributeDefinition.java | 4 +- infra/prism-api/pom.xml | 242 ++++++++++++++++++ infra/prism-api/testng-integration.xml | 19 ++ infra/prism-api/testng-unit.xml | 20 ++ .../midpoint/prism/Containerable.java | 4 +- .../evolveum/midpoint/prism/IPrismValue.java | 100 ++++++++ .../midpoint/prism/ItemDefinition.java | 8 +- .../evolveum/midpoint/prism/Objectable.java | 24 +- .../midpoint/prism/PrismContainerValue.java | 2 + .../evolveum/midpoint/prism/PrismValue.java | 63 +++-- .../prism/match/MatchingRuleRegistry.java | 2 +- .../midpoint/prism/path/ItemPath.java | 5 +- .../prism/query/ComparativeFilter.java | 16 +- .../midpoint/prism/query/EqualFilter.java | 214 +++++++--------- .../midpoint/prism/query/ExistsFilter.java | 2 +- .../midpoint/prism/query/GreaterFilter.java | 11 +- .../midpoint/prism/query/InFilter.java | 7 +- .../midpoint/prism/query/LessFilter.java | 12 +- .../midpoint/prism/query/ObjectFilter.java | 3 - .../prism/query/PropertyValueFilter.java | 77 +++--- .../midpoint/prism/query/RefFilter.java | 9 +- .../midpoint/prism/query/SubstringFilter.java | 10 +- .../midpoint/prism/query/ValueFilter.java | 104 +++----- .../prism/query/builder/QueryBuilder.java | 6 +- .../prism/query/builder/R_AtomicFilter.java | 34 +-- .../prism/query/builder/R_Filter.java | 94 ++++--- .../query/builder/S_AtomicFilterEntry.java | 42 +-- .../query/builder/S_AtomicFilterExit.java | 4 +- .../prism/query/builder/S_ConditionEntry.java | 9 +- .../prism/query/builder/S_FilterExit.java | 10 +- .../prism/query/builder/S_QueryExit.java | 4 +- .../query/builder/S_RightHandItemEntry.java | 4 +- .../midpoint/prism/query/TestObjectQuery.java | 47 ++-- .../impl/expr/MidpointFunctionsImpl.java | 6 +- .../projector/FocusConstraintsChecker.java | 2 +- .../midpoint/report/impl/ReportFunctions.java | 13 +- .../impl/EntitlementConverter.java | 16 +- .../impl/ResourceObjectConverter.java | 13 +- .../provisioning/impl/ShadowManager.java | 14 +- .../provisioning/impl/dummy/TestDummy.java | 27 +- .../dummy/TestDummyUuidNonUniqueName.java | 17 +- .../midpoint/repo/sql/AddOverwriteTest.java | 6 +- .../midpoint/repo/sql/OrgStructTest.java | 16 +- .../repo/sql/QueryInterpreter2Test.java | 14 +- .../repo/sql/QueryInterpreterTest.java | 14 +- .../midpoint/test/IntegrationTestTools.java | 14 +- 50 files changed, 864 insertions(+), 595 deletions(-) create mode 100644 infra/prism-api/pom.xml create mode 100644 infra/prism-api/testng-integration.xml create mode 100644 infra/prism-api/testng-unit.xml create mode 100644 infra/prism/src/main/java/com/evolveum/midpoint/prism/IPrismValue.java diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorPanel.java index 8c12870e057..07b41a38bd8 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorPanel.java @@ -33,6 +33,7 @@ import com.evolveum.midpoint.prism.query.ObjectFilter; import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.prism.query.OrFilter; +import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import com.evolveum.midpoint.schema.GetOperationOptions; import com.evolveum.midpoint.schema.SelectorOptions; import com.evolveum.midpoint.schema.result.OperationResult; @@ -538,13 +539,9 @@ private WebMarkupContainer createTenantContainer() { @Override protected ObjectQuery getChooseQuery() { - ObjectQuery query = new ObjectQuery(); - - ObjectFilter filter = EqualFilter.createEqual(OrgType.F_TENANT, OrgType.class, - getPageBase().getPrismContext(), null, true); - query.setFilter(filter); - - return query; + return QueryBuilder.queryFor(OrgType.class, getPageBase().getPrismContext()) + .item(OrgType.F_TENANT).eq(true) + .build(); } @Override @@ -583,16 +580,10 @@ private WebMarkupContainer createOrgContainer() { @Override protected ObjectQuery getChooseQuery() { - ObjectQuery query = new ObjectQuery(); - - ObjectFilter filter = OrFilter.createOr( - EqualFilter.createEqual(OrgType.F_TENANT, OrgType.class, - getPageBase().getPrismContext(), null, false), - EqualFilter.createEqual(OrgType.F_TENANT, OrgType.class, - getPageBase().getPrismContext(), null, null)); - query.setFilter(filter); - - return query; + return QueryBuilder.queryFor(OrgType.class, getPageBase().getPrismContext()) + .item(OrgType.F_TENANT).eq(false) + .or().item(OrgType.F_TENANT).eq(null) + .build(); } @Override diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/MultipleAssignmentSelectorPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/MultipleAssignmentSelectorPanel.java index aae0570f210..b996df81cae 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/MultipleAssignmentSelectorPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/MultipleAssignmentSelectorPanel.java @@ -26,6 +26,7 @@ import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.query.*; +import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.security.api.AuthorizationConstants; import com.evolveum.midpoint.util.logging.LoggingUtils; @@ -242,10 +243,10 @@ private IModel getFilterModel(final boolean isRequestableFilter){ return new IModel() { @Override public ObjectFilter getObject() { - ItemPath path = new ItemPath(FocusType.F_ACTIVATION, ActivationType.F_ADMINISTRATIVE_STATUS); - ObjectFilter archivedRolesFilter = EqualFilter.createEqual(path, RoleType.class, - getPageBase().getPrismContext(), null, ActivationStatusType.ARCHIVED); - ObjectFilter filter = null; + ObjectFilter archivedRolesFilter = QueryBuilder.queryFor(RoleType.class, getPageBase().getPrismContext()) + .item(RoleType.F_ACTIVATION, ActivationType.F_ADMINISTRATIVE_STATUS).eq(ActivationStatusType.ARCHIVED) + .buildFilter(); + ObjectFilter filter; if (isRequestableFilter) { ObjectFilter assignableRolesFilter = getAssignableRolesFilter(); if (assignableRolesFilter instanceof NotFilter) { @@ -336,8 +337,9 @@ protected void editValuePerformed(AjaxRequestTarget target, IModel rowM supportedTypes.add(getPageBase().getPrismContext().getSchemaRegistry() .findObjectDefinitionByCompileTimeClass(OrgType.class).getTypeName()); - ObjectFilter filter = EqualFilter.createEqual(OrgType.F_TENANT, OrgType.class, - getPageBase().getPrismContext(), null, true); + ObjectFilter filter = QueryBuilder.queryFor(OrgType.class, getPageBase().getPrismContext()) + .item(OrgType.F_TENANT).eq(true) + .buildFilter(); ObjectBrowserPanel tenantPanel = new ObjectBrowserPanel(getPageBase().getMainPopupBodyId(), OrgType.class, supportedTypes, false, getPageBase(), filter) { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/home/PageDashboard.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/home/PageDashboard.java index 8524a42c1ef..e76e1ebcbd6 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/home/PageDashboard.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/home/PageDashboard.java @@ -15,6 +15,7 @@ */ package com.evolveum.midpoint.web.page.admin.home; +import com.evolveum.midpoint.xml.ns._public.common.common_3.*; import org.apache.wicket.Component; import org.apache.wicket.model.Model; import org.apache.wicket.request.component.IRequestablePage; @@ -44,17 +45,8 @@ import com.evolveum.midpoint.web.page.admin.services.PageServices; import com.evolveum.midpoint.web.page.admin.users.PageOrgTree; import com.evolveum.midpoint.web.page.admin.users.PageUsers; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ActivationStatusType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.AvailabilityStatusType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.FocusType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.OperationalStateType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.OrgType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.RoleType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ServiceType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskExecutionStatusType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; + +import static com.evolveum.midpoint.schema.constants.SchemaConstants.C_ACTIVATION; /** * @author lazyman @@ -138,17 +130,19 @@ private InfoBoxPanel createFocusInfoBoxPanel(String id, Cl if (allCount == null) { allCount = 0; } - - EqualFilter filterDisabled = EqualFilter.createEqual(SchemaConstants.PATH_ACTIVATION_EFFECTIVE_STATUS, - type, getPrismContext(), ActivationStatusType.DISABLED); - Integer disabledCount = getModelService().countObjects(type, ObjectQuery.createObjectQuery(filterDisabled), null, task, result); + + ObjectQuery queryDisabled = QueryBuilder.queryFor(type, getPrismContext()) + .item(FocusType.F_ACTIVATION, ActivationType.F_EFFECTIVE_STATUS).eq(ActivationStatusType.DISABLED) + .build(); + Integer disabledCount = getModelService().countObjects(type, queryDisabled, null, task, result); if (disabledCount == null) { disabledCount = 0; } - - EqualFilter filterArchived = EqualFilter.createEqual(SchemaConstants.PATH_ACTIVATION_EFFECTIVE_STATUS, - type, getPrismContext(), ActivationStatusType.ARCHIVED); - Integer archivedCount = getModelService().countObjects(type, ObjectQuery.createObjectQuery(filterArchived), null, task, result); + + ObjectQuery queryArchived = QueryBuilder.queryFor(type, getPrismContext()) + .item(FocusType.F_ACTIVATION, ActivationType.F_EFFECTIVE_STATUS).eq(ActivationStatusType.ARCHIVED) + .build(); + Integer archivedCount = getModelService().countObjects(type, queryArchived, null, task, result); if (archivedCount == null) { archivedCount = 0; } diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedAttributeDefinition.java b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedAttributeDefinition.java index 180908da79c..e10ece7c614 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedAttributeDefinition.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedAttributeDefinition.java @@ -36,6 +36,7 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.AttributeFetchStrategyType; import com.evolveum.midpoint.xml.ns._public.common.common_3.LayerType; import com.evolveum.midpoint.xml.ns._public.common.common_3.MappingType; +import org.jetbrains.annotations.NotNull; /** * @author semancik @@ -180,7 +181,7 @@ public boolean canModify() { } @Override - public void setName(QName name) { + public void setName(@NotNull QName name) { refinedAttributeDefinition.setName(name); } @@ -452,6 +453,7 @@ public void setInboundMappingTypes(List inboundAssignmentTypes) { refinedAttributeDefinition.setInboundMappingTypes(inboundAssignmentTypes); } + @NotNull @Override public QName getName() { return refinedAttributeDefinition.getName(); diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedAttributeDefinition.java b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedAttributeDefinition.java index 258627c57f0..09ca9d9a782 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedAttributeDefinition.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedAttributeDefinition.java @@ -39,6 +39,7 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.PropertyAccessType; import com.evolveum.midpoint.xml.ns._public.common.common_3.PropertyLimitationsType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceAttributeDefinitionType; +import org.jetbrains.annotations.NotNull; /** * @author semancik @@ -228,7 +229,8 @@ public void setInboundMappingTypes(List inboundAssignmentTypes) { this.inboundMappingTypes = inboundAssignmentTypes; } - public QName getName() { + @NotNull + public QName getName() { return attributeDefinition.getName(); } diff --git a/infra/prism-api/pom.xml b/infra/prism-api/pom.xml new file mode 100644 index 00000000000..79ec9f34355 --- /dev/null +++ b/infra/prism-api/pom.xml @@ -0,0 +1,242 @@ + + + + + 4.0.0 + com.evolveum.midpoint.infra + prism-api + 3.5-SNAPSHOT + midPoint Infrastructure - prism API + + infra + com.evolveum.midpoint + 3.5-SNAPSHOT + + + https://github.com/Evolveum/midpoint.git + git@github.com:Evolveum/midpoint.git + https://fisheye.evolveum.com/browse/midPoint + + + + com.evolveum.midpoint.infra + util + 3.5-SNAPSHOT + + + com.sun.xml.bind + jaxb-xjc + ${jaxb-xjc.version} + + + org.apache.cxf + cxf-rt-wsdl + + + commons-lang + commons-lang + + + org.apache.commons + commons-lang3 + + + org.apache.santuario + xmlsec + + + org.jetbrains + annotations-java5 + + + + + + + + + + + + + + + + + + + com.fasterxml.jackson.core + jackson-core + + + com.fasterxml.jackson.core + jackson-annotations + + + org.yaml + snakeyaml + + + org.springframework + spring-core + + + org.springframework + spring-beans + + + xml-resolver + xml-resolver + + + commons-codec + commons-codec + + + commons-io + commons-io + + + com.sun.xml.bind + jaxb-impl + + + org.jvnet.jaxb2_commons + jaxb2-basics-runtime + + + + org.codehaus.woodstox + stax2-api + + + + + + com.fasterxml.jackson.core + jackson-databind + + + + + com.fasterxml.jackson.module + jackson-module-jaxb-annotations + + + com.fasterxml.jackson.dataformat + jackson-dataformat-yaml + + + + + + org.testng + testng + test + + + com.evolveum.midpoint.tools + test-ng + 3.5-SNAPSHOT + test + + + + + + + + + + + diff --git a/infra/prism-api/testng-integration.xml b/infra/prism-api/testng-integration.xml new file mode 100644 index 00000000000..ad76cb3698a --- /dev/null +++ b/infra/prism-api/testng-integration.xml @@ -0,0 +1,19 @@ + + + + + diff --git a/infra/prism-api/testng-unit.xml b/infra/prism-api/testng-unit.xml new file mode 100644 index 00000000000..6fe0e134e73 --- /dev/null +++ b/infra/prism-api/testng-unit.xml @@ -0,0 +1,20 @@ + + + + + + diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/Containerable.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/Containerable.java index 50e34e1aeb1..67c05055f51 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/Containerable.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/Containerable.java @@ -24,13 +24,13 @@ public interface Containerable extends Serializable { - public PrismContainerValue asPrismContainerValue(); + PrismContainerValue asPrismContainerValue(); /** * Setup value to the containerable representation. This is used to after (empty) containerable is created to * initialize it with a correct prism container value. * Note: This method DOES NOT change the container value parent. */ - public void setupContainerValue(PrismContainerValue container); + void setupContainerValue(PrismContainerValue container); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/IPrismValue.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/IPrismValue.java new file mode 100644 index 00000000000..b428cf6f17f --- /dev/null +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/IPrismValue.java @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.prism; + +import com.evolveum.midpoint.prism.delta.ItemDelta; +import com.evolveum.midpoint.prism.path.ItemPath; +import com.evolveum.midpoint.util.DebugDumpable; +import com.evolveum.midpoint.util.exception.SchemaException; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.io.Serializable; +import java.util.Collection; + +/** + * @author semancik + * @author mederly + */ +public interface IPrismValue extends Visitable, PathVisitable, Serializable, DebugDumpable, Revivable { + + @Nullable + OriginType getOriginType(); + + @Nullable + Objectable getOriginObject(); + + @Nullable + Object getUserData(@NotNull String key); + + void setUserData(@NotNull String key, @Nullable Object value); + + @Nullable + Itemable getParent(); + + void setParent(@Nullable Itemable parent); + + void clearParent(); + + /** + * Computes a path in current prism structure this value is part of. + * If there's no parent (Itemable) for this or some parent value, an exception is thrown. + */ + @NotNull + ItemPath getPath(); + + PrismContext getPrismContext(); + + void applyDefinition(ItemDefinition definition) throws SchemaException; + + void applyDefinition(ItemDefinition definition, boolean force) throws SchemaException; + + void recompute(); + + void recompute(PrismContext prismContext); + + boolean isEmpty(); + + void normalize(); + + /** + * Returns true if the value is raw. Raw value is a semi-parsed value. + * A value for which we don't have a full definition yet and therefore + * the parsing could not be finished until the definition is supplied. + */ + boolean isRaw(); + + Object find(ItemPath path); + + PartiallyResolvedItem findPartial(ItemPath path); + + boolean equals(PrismValue otherValue, boolean ignoreMetadata); + + Collection diff(PrismValue otherValue); + + Collection diff(PrismValue otherValue, boolean ignoreMetadata, boolean isLiteral); + + boolean match(PrismValue otherValue); + + /** + * Returns a short (one-line) representation of the real value stored in this object. + * The value is returned without any decorations or type demarcations (such as PPV, PRV, etc.) + */ + String toHumanReadableString(); + + boolean isImmutable(); +} diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/ItemDefinition.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/ItemDefinition.java index 651330f2bdf..506d5bbfd8e 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/ItemDefinition.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/ItemDefinition.java @@ -30,6 +30,7 @@ import com.evolveum.midpoint.util.exception.SchemaException; import org.apache.commons.lang.StringUtils; +import org.jetbrains.annotations.NotNull; /** * Abstract item definition in the schema. @@ -58,7 +59,7 @@ public abstract class ItemDefinition extends Definition implements Serializable { private static final long serialVersionUID = -2643332934312107274L; - protected QName name; + @NotNull protected QName name; private int minOccurs = 1; private int maxOccurs = 1; private boolean operational = false; @@ -78,7 +79,7 @@ public abstract class ItemDefinition extends Definition implemen * @param defaultName default element name * @param typeName type name (XSD complex or simple type) */ - ItemDefinition(QName elementName, QName typeName, PrismContext prismContext) { + ItemDefinition(@NotNull QName elementName, QName typeName, PrismContext prismContext) { super(typeName, prismContext); this.name = elementName; } @@ -98,11 +99,12 @@ public abstract class ItemDefinition extends Definition implemen * * @return the name name of the entity or null. */ + @NotNull public QName getName() { return name; } - public void setName(QName name) { + public void setName(@NotNull QName name) { this.name = name; } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/Objectable.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/Objectable.java index e64cc672165..e6bad33f520 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/Objectable.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/Objectable.java @@ -23,21 +23,21 @@ */ public interface Objectable extends Containerable { - public String getOid(); + String getOid(); - public void setOid(String oid); + void setOid(String oid); - public String getVersion(); + String getVersion(); - public void setVersion(String version); + void setVersion(String version); - public PolyStringType getName(); + PolyStringType getName(); - public void setName(PolyStringType name); + void setName(PolyStringType name); - public String getDescription(); + String getDescription(); - public void setDescription(String description); + void setDescription(String description); /** * Returns short string representing identity of this object. @@ -45,7 +45,7 @@ public interface Objectable extends Containerable { * in a form suitable for log and diagnostic messages (understandable for * system administrator). */ - public String toDebugName(); + String toDebugName(); /** * Returns short string identification of object type. It should be in a form @@ -54,11 +54,11 @@ public interface Objectable extends Containerable { * QNames or URIs. * @return */ - public String toDebugType(); + String toDebugType(); - public PrismObject asPrismObject(); + PrismObject asPrismObject(); - public void setupContainer(PrismObject object); + void setupContainer(PrismObject object); // public PrismObject asPrismObject(); // diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerValue.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerValue.java index e9e744168e2..980cd7fb972 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerValue.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerValue.java @@ -46,6 +46,7 @@ import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.Validate; +import org.jetbrains.annotations.NotNull; /** * @author semancik @@ -243,6 +244,7 @@ void setParent(PrismContainer container) { super.setParent(container); } + @NotNull public ItemPath getPath() { Itemable parent = getParent(); ItemPath parentPath = ItemPath.EMPTY_PATH; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismValue.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismValue.java index ead8b7656a1..0dceb9bf929 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismValue.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismValue.java @@ -22,6 +22,7 @@ import com.evolveum.midpoint.util.MiscUtil; import com.evolveum.midpoint.util.exception.SchemaException; +import org.jetbrains.annotations.NotNull; import org.w3c.dom.Element; import java.io.Serializable; @@ -38,7 +39,7 @@ * @author semancik * */ -public abstract class PrismValue implements Visitable, PathVisitable, Serializable, DebugDumpable, Revivable { +public abstract class PrismValue implements IPrismValue { private OriginType originType; private Objectable originObject; @@ -72,11 +73,13 @@ public void setOriginType(OriginType type) { this.originType = type; } - public OriginType getOriginType() { + @Override + public OriginType getOriginType() { return originType; } - public Objectable getOriginObject() { + @Override + public Objectable getOriginObject() { return originObject; } @@ -84,18 +87,22 @@ public Map getUserData() { return userData; } - public Object getUserData(String key) { + @Override + public Object getUserData(@NotNull String key) { return userData.get(key); } - public void setUserData(String key, Object value) { + @Override + public void setUserData(@NotNull String key, Object value) { userData.put(key, value); } - public Itemable getParent() { + @Override + public Itemable getParent() { return parent; } + @Override public void setParent(Itemable parent) { if (this.parent != null && parent != null && this.parent != parent) { throw new IllegalStateException("Attempt to reset value parent from "+this.parent+" to "+parent); @@ -103,6 +110,8 @@ public void setParent(Itemable parent) { this.parent = parent; } + @NotNull + @Override public ItemPath getPath() { Itemable parent = getParent(); if (parent == null) { @@ -116,6 +125,7 @@ public ItemPath getPath() { * Or when we know that the previous parent will be discarded and we * want to avoid unnecessary cloning. */ + @Override public void clearParent() { parent = null; } @@ -129,6 +139,7 @@ public static void clearParent(List> values) { } } + @Override public PrismContext getPrismContext() { if (parent != null) { return parent.getPrismContext(); @@ -144,11 +155,13 @@ protected ItemDefinition getDefinition() { return parent.getDefinition(); } + @Override public void applyDefinition(ItemDefinition definition) throws SchemaException { checkMutability(); // TODO reconsider applyDefinition(definition, true); } + @Override public void applyDefinition(ItemDefinition definition, boolean force) throws SchemaException { checkMutability(); // TODO reconsider // Do nothing by default @@ -162,12 +175,11 @@ public void revive(PrismContext prismContext) throws SchemaException { * Recompute the value or otherwise "initialize" it before adding it to a prism tree. * This may as well do nothing if no recomputing or initialization is needed. */ + @Override public void recompute() { recompute(getPrismContext()); } - - public abstract void recompute(PrismContext prismContext); - + @Override public void accept(Visitor visitor) { visitor.visit(this); @@ -220,19 +232,11 @@ public int compare(V v1, V v2) { }; return MiscUtil.unorderedCollectionEquals(collection1, collection2, comparator); } - - public abstract boolean isEmpty(); - + + @Override public void normalize() { // do nothing by default } - - /** - * Returns true if the value is raw. Raw value is a semi-parsed value. - * A value for which we don't have a full definition yet and therefore - * the parsing could not be finished until the defintion is supplied. - */ - public abstract boolean isRaw(); public static Collection cloneValues(Collection values) { Collection clonedCollection = new ArrayList(values.size()); @@ -252,7 +256,8 @@ protected void copyValues(PrismValue clone) { clone.parent = null; // Do not clone immutable flag. } - + + @NotNull public static Collection cloneCollection(Collection values) { Collection clones = new ArrayList(); for (T value: values) { @@ -271,11 +276,7 @@ public static Collection resetParentCollection(Collect } return values; } - - public abstract Object find(ItemPath path); - - public abstract PartiallyResolvedItem findPartial(ItemPath path); - + @Override public int hashCode() { int result = 1; @@ -297,6 +298,7 @@ public boolean equalsComplex(PrismValue other, boolean ignoreMetadata, boolean i return true; } + @Override public boolean equals(PrismValue otherValue, boolean ignoreMetadata) { return equalsComplex(otherValue, ignoreMetadata, false); } @@ -341,6 +343,7 @@ public boolean equals(Object obj) { * Assumes matching representations. I.e. it assumes that both this and otherValue represent the same instance of item. * E.g. the container with the same ID. */ + @Override public Collection diff(PrismValue otherValue) { return diff(otherValue, true, false); } @@ -349,6 +352,7 @@ public Collection diff(PrismValue otherValue) { * Assumes matching representations. I.e. it assumes that both this and otherValue represent the same instance of item. * E.g. the container with the same ID. */ + @Override public Collection diff(PrismValue otherValue, boolean ignoreMetadata, boolean isLiteral) { Collection itemDeltas = new ArrayList(); diffMatchingRepresentation(otherValue, itemDeltas, ignoreMetadata, isLiteral); @@ -360,14 +364,6 @@ void diffMatchingRepresentation(PrismValue otherValue, // Nothing to do by default } - public abstract boolean match(PrismValue otherValue); - - /** - * Returns a short (one-line) representation of the real value stored in this object. - * The value is returned without any decorations or type demarcations (such as PPV, PRV, etc.) - */ - public abstract String toHumanReadableString(); - protected void appendOriginDump(StringBuilder builder) { if (DebugUtil.isDetailedDebugDump()) { if (getOriginType() != null || getOriginObject() != null) { @@ -387,6 +383,7 @@ public static Set getRealValuesOfCollection(Collection defaultMatchingRule; + @NotNull public final MatchingRule defaultMatchingRule; public Map> matchingRules = new HashMap>(); public MatchingRuleRegistry() { diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/path/ItemPath.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/path/ItemPath.java index a10e2c23cdd..8fc0a7f9c76 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/path/ItemPath.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/path/ItemPath.java @@ -20,6 +20,7 @@ import com.evolveum.prism.xml.ns._public.types_3.ItemPathType; import org.apache.commons.lang.Validate; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import javax.xml.namespace.QName; import java.io.Serializable; @@ -210,7 +211,8 @@ public NameItemPathSegment lastNamed() { } return null; } - + + @Nullable public ItemPathSegment last() { if (segments.size() == 0) { return null; @@ -242,6 +244,7 @@ public ItemPath tail() { /** * Returns a path containing all segments except the last one. */ + @NotNull public ItemPath allExceptLast() { if (segments.size() == 0) { return EMPTY_PATH; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/ComparativeFilter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/ComparativeFilter.java index b23aa70de19..2ea3404d483 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/ComparativeFilter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/ComparativeFilter.java @@ -18,29 +18,15 @@ import java.util.List; -import javax.xml.namespace.QName; - -import org.w3c.dom.Element; - -import com.evolveum.midpoint.prism.Containerable; import com.evolveum.midpoint.prism.ItemDefinition; -import com.evolveum.midpoint.prism.Objectable; -import com.evolveum.midpoint.prism.PrismContainerDefinition; -import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.PrismObjectDefinition; import com.evolveum.midpoint.prism.PrismPropertyDefinition; import com.evolveum.midpoint.prism.PrismPropertyValue; -import com.evolveum.midpoint.prism.PrismValue; import com.evolveum.midpoint.prism.path.ItemPath; -import com.evolveum.midpoint.util.exception.SchemaException; public abstract class ComparativeFilter extends PropertyValueFilter> { private boolean equals; - public ComparativeFilter() { - } - ComparativeFilter(ItemPath path, PrismPropertyDefinition definition, PrismPropertyValue value, boolean equals) { super(path, definition, value); this.equals = equals; @@ -60,7 +46,7 @@ public void setEquals(boolean equals) { } static PrismPropertyValue createPropertyValue(PrismPropertyDefinition itemDefinition, T realValue){ - List> values = createPropertyList(itemDefinition, realValue); + List> values = realValueToPropertyList(itemDefinition, realValue); if (values == null || values.isEmpty()){ return null; } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/EqualFilter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/EqualFilter.java index 607a827e8e2..703ac6f7e79 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/EqualFilter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/EqualFilter.java @@ -16,6 +16,7 @@ package com.evolveum.midpoint.prism.query; +import java.util.Collection; import java.util.List; import javax.xml.namespace.QName; @@ -25,8 +26,6 @@ import com.evolveum.midpoint.prism.match.MatchingRule; import com.evolveum.midpoint.prism.match.MatchingRuleRegistry; -import org.apache.commons.lang.Validate; - import com.evolveum.midpoint.prism.Containerable; import com.evolveum.midpoint.prism.Item; import com.evolveum.midpoint.prism.Itemable; @@ -36,158 +35,125 @@ import com.evolveum.midpoint.prism.PrismProperty; import com.evolveum.midpoint.prism.PrismPropertyDefinition; import com.evolveum.midpoint.prism.PrismPropertyValue; -import com.evolveum.midpoint.prism.PrismValue; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.util.DebugUtil; import com.evolveum.midpoint.util.exception.SchemaException; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; -public class EqualFilter extends PropertyValueFilter> implements Itemable { +public class EqualFilter extends PropertyValueFilter> implements Itemable { private static final long serialVersionUID = 3284478412180258355L; public static final QName ELEMENT_NAME = new QName(PrismConstants.NS_QUERY, "equal"); - EqualFilter() { - } - - EqualFilter(ItemPath parentPath, PrismPropertyDefinition definition, QName matchingRule, List> values) { - super(parentPath, definition, matchingRule, values); - } - - EqualFilter(ItemPath parentPath, PrismPropertyDefinition definition, QName matchingRule, ItemPath rightSidePath, ItemDefinition rightSideDefinition) { + private EqualFilter(@NotNull ItemPath parentPath, PrismPropertyDefinition definition, QName matchingRule, + @NotNull ItemPath rightSidePath, ItemDefinition rightSideDefinition) { super(parentPath, definition, matchingRule, rightSidePath, rightSideDefinition); } - private EqualFilter(ItemPath parentPath, PrismPropertyDefinition definition, QName matchingRule) { - super(parentPath, definition, matchingRule); - } - - EqualFilter(ItemPath parentPath, PrismPropertyDefinition definition, QName matchingRule, ExpressionWrapper expression) { - super(parentPath, definition, matchingRule, expression); - } - - public static EqualFilter createEqual(ItemPath path, PrismPropertyDefinition definition, - QName matchingRule, ExpressionWrapper expression) { - Validate.notNull(path, "Path must not be null"); - // Do not check definition. We may want queries for which the definition is supplied later. - return new EqualFilter<>(path, definition, matchingRule, expression); + private EqualFilter(@NotNull ItemPath fullPath, PrismPropertyDefinition definition, QName matchingRule, + List> values, ExpressionWrapper expression) { + super(fullPath, definition, matchingRule, values, expression); } //factory methods - public static EqualFilter createEqual(ItemPath path, PrismProperty item) { - return createEqual(path, item, null); + // Do not require definition. We may want queries for which the definition is supplied later. + + // expression-related + @NotNull + public static EqualFilter createEqual(@NotNull ItemPath path, @Nullable PrismPropertyDefinition definition, + @Nullable QName matchingRule, @Nullable ExpressionWrapper expression) { + return new EqualFilter<>(path, definition, matchingRule, null, expression); } - - public static EqualFilter createEqual(ItemPath path, PrismProperty item, - QName matchingRule) { - List> clonedValues = (List>) PrismPropertyValue.cloneCollection(item.getValues()); - return createEqual(path, item.getDefinition(), matchingRule, clonedValues); + + // Collection + @NotNull + public static EqualFilter createEqual(@NotNull ItemPath path, @Nullable PrismPropertyDefinition definition, + @Nullable QName matchingRule, @NotNull List> values) { + return new EqualFilter(path, definition, matchingRule, values, null); } - - public static EqualFilter createEqual(ItemPath path, PrismPropertyDefinition definition, - QName matchingRule, List> values) { - Validate.notNull(values, "values must not be null"); - Validate.notNull(path, "Path must not be null"); - EqualFilter equalFilter = new EqualFilter(path, definition, matchingRule, values); - for (PrismPropertyValue value: values) { - value.setParent(equalFilter); - } - return equalFilter; + + // -------------------------------- PPV + // canonical + + @NotNull + public static EqualFilter createEqual(@NotNull ItemPath path, @NotNull PrismPropertyDefinition itemDefinition, PrismPropertyValue value) { + List> pValues = createPropertyList(itemDefinition, value); + return new EqualFilter<>(path, itemDefinition, null, pValues, null); } - - public static EqualFilter createEqual(ItemPath path, PrismPropertyDefinition itemDefinition, T realValue){ - return createEqual(path, itemDefinition, null, realValue); + + + // List + // Array of values + + @NotNull + @SafeVarargs + public static EqualFilter createEqualMultiple(@NotNull ItemPath path, @NotNull PrismPropertyDefinition definition, + @Nullable QName matchingRule, T... realValues) { + return new EqualFilter<>(path, definition, matchingRule, createPropertyListFromArray(definition, realValues), null); } - - public static EqualFilter createEqual(ItemPath path, PrismPropertyDefinition itemDefinition, QName matchingRule, T realValue){ - Validate.notNull(itemDefinition, "Item definition in the filter must not be null"); - Validate.notNull(path, "Path in the filter must not be null"); - if (realValue == null){ - //TODO: create null filter - return createNullEqual(path, itemDefinition, matchingRule); - } - List> pVals = createPropertyList(itemDefinition, realValue); - EqualFilter equalFilter = new EqualFilter<>(path, itemDefinition, matchingRule, pVals); - for (PrismPropertyValue value: pVals) { - value.setParent(equalFilter); - } - return equalFilter; + + // -------------------------------- single value + // ------------------- with matching rule + // canonical + @NotNull + public static EqualFilter createEqual(@NotNull ItemPath path, @NotNull PrismPropertyDefinition definition, + @Nullable QName matchingRule, @Nullable T realValue) { + return new EqualFilter<>(path, definition, matchingRule, realValueToPropertyList(definition, realValue), null); } - public static EqualFilter createEqualMultiple(ItemPath path, PrismPropertyDefinition itemDefinition, QName matchingRule, T... realValues) { - Validate.notNull(itemDefinition, "Item definition in the filter must not be null"); - Validate.notNull(path, "Path in the filter must not be null"); - if (realValues.length == 0 || (realValues.length == 1 && realValues[0] == null)) { - return createNullEqual(path, itemDefinition, matchingRule); - } - List> pVals = createPropertyListFromArray(itemDefinition, realValues); - EqualFilter equalFilter = new EqualFilter<>(path, itemDefinition, matchingRule, pVals); - for (PrismPropertyValue value: pVals) { - value.setParent(equalFilter); - } - return equalFilter; + // ------------------- without matching rule + @NotNull + public static EqualFilter createEqual(@NotNull ItemPath path, @NotNull PrismPropertyDefinition itemDefinition, @Nullable T realValue) { + return createEqual(path, itemDefinition, null, realValue); } - - public static EqualFilter createEqual(QName propertyName, PrismPropertyDefinition propertyDefinition, QName matchingRule, T realValue){ - return createEqual(new ItemPath(propertyName), propertyDefinition, matchingRule, realValue); + + // definition from container + private static EqualFilter createEqual(@NotNull ItemPath propertyPath, @NotNull Class type, @NotNull PrismContext prismContext, + @Nullable QName matchingRule, T realValue) { + @SuppressWarnings("unchecked") + PrismPropertyDefinition propertyDefinition = (PrismPropertyDefinition) FilterUtils.findItemDefinition(propertyPath, type, prismContext); + return createEqual(propertyPath, propertyDefinition, matchingRule, realValue); } - - public static EqualFilter createEqual(QName propertyName, PrismPropertyDefinition propertyDefinition, T realValues){ - return createEqual(new ItemPath(propertyName), propertyDefinition, null, realValues); + + @NotNull + public static EqualFilter createEqual(@NotNull ItemPath propertyPath, @NotNull Class type, @NotNull PrismContext prismContext, T realValue) + throws SchemaException { + return createEqual(propertyPath, type, prismContext, null, realValue); } - - public static EqualFilter createEqual(ItemPath path, PrismPropertyDefinition itemDefinition, PrismPropertyValue values) { - return createEqual(path, itemDefinition, null, values); + + @NotNull + public static EqualFilter createEqual(@NotNull QName propertyName, @NotNull Class type, @NotNull PrismContext prismContext, + QName matchingRule, T realValues) { + return createEqual(new ItemPath(propertyName), type, prismContext, matchingRule, realValues); } - - public static EqualFilter createEqual(ItemPath path, PrismPropertyDefinition itemDefinition, QName matchingRule, PrismPropertyValue values){ - Validate.notNull(itemDefinition, "Item definition in the filter must not be null"); - Validate.notNull(path, "Path in the filter must not be null"); - if (values == null){ - //TODO: create null filter - return createNullEqual(path, itemDefinition, matchingRule); - } - - List> pValues = createPropertyList(itemDefinition, values); - - EqualFilter equalFilter = new EqualFilter<>(path, itemDefinition, matchingRule, pValues); - for (PrismPropertyValue value: pValues) { - value.setParent(equalFilter); - } - return equalFilter; + + @NotNull + public static EqualFilter createEqual(@NotNull QName propertyName, @NotNull Class type, @NotNull PrismContext prismContext, T realValue) + throws SchemaException { + return createEqual(propertyName, type, prismContext, null, realValue); } - - public static EqualFilter createEqual(ItemPath parentPath, PrismContainerDefinition containerDef, - PrismPropertyValue values) throws SchemaException { - PrismPropertyDefinition propertyDef = (PrismPropertyDefinition) FilterUtils.findItemDefinition(parentPath, containerDef); - return createEqual(parentPath, propertyDef, values); + + + // taking values from existing item (item's values are cloned) + @NotNull + public static EqualFilter createEqual(@NotNull ItemPath path, @NotNull PrismProperty item) { + List> clonedValues = (List>) PrismPropertyValue.cloneCollection(item.getValues()); + return createEqual(path, item.getDefinition(), null, clonedValues); } - public static EqualFilter createEqual(ItemPath itemPath, PrismContainerDefinition containerDef, + + + + + + @NotNull + public static EqualFilter createEqual(@NotNull ItemPath itemPath, @NotNull PrismContainerDefinition containerDef, T realValues) throws SchemaException { PrismPropertyDefinition propertyDef = (PrismPropertyDefinition) FilterUtils.findItemDefinition(itemPath, containerDef); return createEqual(itemPath, propertyDef, realValues); } - public static EqualFilter createEqual(QName propertyName, Class type, PrismContext prismContext, T realValues) - throws SchemaException { - return createEqual(propertyName, type, prismContext, null, realValues); - } - - public static EqualFilter createEqual(QName propertyName, Class type, PrismContext prismContext, - QName matchingRule, T realValues) { - - return createEqual(new ItemPath(propertyName), type, prismContext, matchingRule, realValues); - } - - public static EqualFilter createEqual(ItemPath propertyPath, Class type, PrismContext prismContext, T realValue) - throws SchemaException { - return createEqual(propertyPath, type, prismContext, null, realValue); - } - - public static EqualFilter createEqual(ItemPath propertyPath, Class type, PrismContext prismContext, QName matchingRule, T realValue) { - PrismPropertyDefinition propertyDefinition = (PrismPropertyDefinition) FilterUtils.findItemDefinition(propertyPath, type, prismContext); - return createEqual(propertyPath, propertyDefinition, matchingRule, realValue); - } public static EqualFilter createEqual(ItemPath propertyPath, Class type, PrismContext prismContext, QName matchingRule, ItemPath rightSidePath) { PrismPropertyDefinition propertyDefinition = (PrismPropertyDefinition) FilterUtils.findItemDefinition(propertyPath, type, prismContext); @@ -207,13 +173,13 @@ public static EqualFilter createEqual(ItemPath p } public static EqualFilter createNullEqual(ItemPath itemPath, PrismPropertyDefinition propertyDef, QName matchingRule){ - return new EqualFilter(itemPath, propertyDef, matchingRule); + return new EqualFilter(itemPath, propertyDef, matchingRule, (List) null, null); } @Override public EqualFilter clone() { - EqualFilter clone = new EqualFilter<>(getFullPath(), getDefinition(), getMatchingRule(), (List>) getValues()); + EqualFilter clone = new EqualFilter<>(getFullPath(), getDefinition(), getMatchingRule(), (List>) getValues(), null); clone.setExpression(getExpression()); cloneValues(clone); clone.copyRightSideThingsFrom(this); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/ExistsFilter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/ExistsFilter.java index 36cbb54b65f..3a2bdc9e891 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/ExistsFilter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/ExistsFilter.java @@ -72,7 +72,7 @@ public static ExistsFilter createExists(ItemPath itemP } public static ExistsFilter createExists(ItemPath itemPath, Class clazz, PrismContext prismContext, - ObjectFilter filter) throws SchemaException { + ObjectFilter filter) { ItemDefinition itemDefinition = FilterUtils.findItemDefinition(itemPath, clazz, prismContext); return new ExistsFilter(itemPath, itemDefinition, filter); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/GreaterFilter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/GreaterFilter.java index 5fa25dd4021..d989a58e5a5 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/GreaterFilter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/GreaterFilter.java @@ -33,10 +33,6 @@ public class GreaterFilter extends ComparativeFilter { - - public GreaterFilter() { - } - GreaterFilter(ItemPath itemPath, PrismPropertyDefinition definition, PrismPropertyValue value, boolean equals) { super(itemPath, definition, value, equals); } @@ -63,7 +59,7 @@ public static GreaterFilter createGreater(ItemPa return greaterFilter; } - public static GreaterFilter createGreater(ItemPath itemPath, PrismPropertyDefinition itemDefinition, T realValue, boolean equals) throws SchemaException{ + public static GreaterFilter createGreater(ItemPath itemPath, PrismPropertyDefinition itemDefinition, T realValue, boolean equals) { PrismPropertyValue value = createPropertyValue(itemDefinition, realValue); if (value == null){ @@ -143,11 +139,6 @@ public PrismPropertyDefinition getDefinition() { return (PrismPropertyDefinition) super.getDefinition(); } - @Override - public QName getElementName() { - return getDefinition().getName(); - } - @Override public PrismContext getPrismContext() { return getDefinition().getPrismContext(); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/InFilter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/InFilter.java index 4aa2217c8e4..35ad6ad2c7f 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/InFilter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/InFilter.java @@ -35,7 +35,7 @@ public class InFilter extends PropertyValueFilter { public static InFilter createIn(ItemPath path, PrismPropertyDefinition definition, QName matchingRule, V values){ - List> pVals = createPropertyList(definition, values); + List> pVals = realValueToPropertyList(definition, values); return new InFilter(path, definition, matchingRule, pVals); } @@ -60,11 +60,6 @@ public static InFilter createIn(ItemPath path, Class type, PrismContext pris - @Override - public QName getElementName() { - return getDefinition().getName(); - } - @Override public PrismContext getPrismContext() { return getDefinition().getPrismContext(); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/LessFilter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/LessFilter.java index 21518655797..c58dd73a215 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/LessFilter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/LessFilter.java @@ -41,9 +41,6 @@ public class LessFilter extends ComparativeFilter { super(itemPath, definition, rightSidePath, rightSideDefinition, equals); } - public LessFilter() { - } - public static LessFilter createLess(QName itemPath, PrismPropertyDefinition definition, PrismPropertyValue value, boolean equals){ LessFilter lessFilter = new LessFilter<>(new ItemPath(itemPath), definition, value, equals); if (value != null) { @@ -66,11 +63,11 @@ public static LessFilter createLess(ItemPath itemPa return createLess(itemPath, def, value, equals); } - public static LessFilter createLess(QName itemPath, PrismPropertyDefinition itemDefinition, T realValue, boolean equals) throws SchemaException{ + public static LessFilter createLess(QName itemPath, PrismPropertyDefinition itemDefinition, T realValue, boolean equals) { return createLess(new ItemPath(itemPath), itemDefinition, realValue, equals); } - public static LessFilter createLess(ItemPath itemPath, PrismPropertyDefinition itemDefinition, T realValue, boolean equals) throws SchemaException{ + public static LessFilter createLess(ItemPath itemPath, PrismPropertyDefinition itemDefinition, T realValue, boolean equals) { PrismPropertyValue value = createPropertyValue(itemDefinition, realValue); if (value == null){ @@ -152,11 +149,6 @@ public PrismPropertyDefinition getDefinition() { return (PrismPropertyDefinition) super.getDefinition(); } - @Override - public QName getElementName() { - return getDefinition().getName(); - } - @Override public PrismContext getPrismContext() { return getDefinition().getPrismContext(); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/ObjectFilter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/ObjectFilter.java index 7e2a4351056..6b555a4c673 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/ObjectFilter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/ObjectFilter.java @@ -36,9 +36,6 @@ public abstract class ObjectFilter implements DebugDumpable, Serializable, Reviv public abstract boolean match(PrismContainerValue value, MatchingRuleRegistry matchingRuleRegistry) throws SchemaException; - protected void cloneValues(ObjectFilter clone) { - } - public void accept(Visitor visitor) { visitor.visit(this); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/PropertyValueFilter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/PropertyValueFilter.java index cd73ec4cbd8..bf4812c13d9 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/PropertyValueFilter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/PropertyValueFilter.java @@ -16,9 +16,7 @@ package com.evolveum.midpoint.prism.query; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; +import java.util.*; import javax.xml.namespace.QName; @@ -37,6 +35,8 @@ import com.evolveum.midpoint.prism.util.PrismUtil; import com.evolveum.midpoint.util.DebugUtil; import com.evolveum.midpoint.util.exception.SchemaException; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; public abstract class PropertyValueFilter extends ValueFilter implements Itemable { @@ -49,56 +49,58 @@ public abstract class PropertyValueFilter extends ValueFil * TODO clean up the right side path/definition mess */ - PropertyValueFilter() { - super(); - } - - PropertyValueFilter(ItemPath path, ItemDefinition definition, QName matchingRule, ItemPath rightHandSidePath, ItemDefinition rightHandSideDefinition) { + PropertyValueFilter(@NotNull ItemPath path, @Nullable ItemDefinition definition, @Nullable QName matchingRule, + @NotNull ItemPath rightHandSidePath, @Nullable ItemDefinition rightHandSideDefinition) { super(path, definition, matchingRule); - Validate.notNull(rightHandSidePath, "rightHandSidePath"); this.rightHandSidePath = rightHandSidePath; this.rightHandSideDefinition = rightHandSideDefinition; } - - PropertyValueFilter(ItemPath path, ItemDefinition definition, QName matchingRule, List values) { + + protected PropertyValueFilter(@NotNull ItemPath path, @Nullable ItemDefinition definition, @Nullable QName matchingRule, + @Nullable List values, @Nullable ExpressionWrapper expression) { super(path, definition, matchingRule); + if (values != null) { + for (V value : values) { + value.setParent(this); + } + } this.values = values; + this.expression = expression; } - PropertyValueFilter(ItemPath path, ItemDefinition definition, V value){ - super(path, definition); - setValue(value); + PropertyValueFilter(@NotNull ItemPath path, @Nullable ItemDefinition definition, @Nullable QName matchingRule, @Nullable List values) { + this(path, definition, matchingRule, values, null); } - PropertyValueFilter(ItemPath path, ItemDefinition definition, QName matchingRule) { - super(path, definition, matchingRule); - this.values = null; + PropertyValueFilter(@NotNull ItemPath path, @Nullable ItemDefinition definition, @Nullable V value) { + this(path, definition, (QName) null, value != null ? Collections.singletonList(value) : null); } - PropertyValueFilter(ItemPath path, ItemDefinition definition, ExpressionWrapper expression) { - super(path, definition); - this.expression = expression; + PropertyValueFilter(@NotNull ItemPath path, @Nullable ItemDefinition definition, @Nullable QName matchingRule) { + this(path, definition, matchingRule, (List) null); } - PropertyValueFilter(ItemPath path, ItemDefinition definition, ExpressionWrapper expression, List values) { - super(path, definition); - this.values = values; - this.expression = expression; + PropertyValueFilter(@NotNull ItemPath path, @Nullable ItemDefinition definition, @Nullable ExpressionWrapper expression) { + this(path, definition, null, null, expression); + } + + PropertyValueFilter(@NotNull ItemPath path, @Nullable ItemDefinition definition, @Nullable ExpressionWrapper expression, @Nullable List values) { + this(path, definition, null, values, expression); } PropertyValueFilter(ItemPath path, ItemDefinition definition, QName matchingRule, ExpressionWrapper expression) { - super(path, definition, matchingRule); - this.expression = expression; + this(path, definition, matchingRule, null, expression); } - static List> createPropertyList(PrismPropertyDefinition itemDefinition, PrismPropertyValue values) { - Validate.notNull(itemDefinition, "Item definition in substring filter must not be null."); - - List> pValues = new ArrayList>(); - PrismUtil.recomputePrismPropertyValue(values, itemDefinition.getPrismContext()); - pValues.add(values); - - return pValues; + static protected List> createPropertyList(@NotNull PrismPropertyDefinition itemDefinition, @Nullable PrismPropertyValue pValue) { + List> pValues = new ArrayList<>(); + if (pValue == null) { + return pValues; + } else { + PrismUtil.recomputePrismPropertyValue(pValue, itemDefinition.getPrismContext()); + pValues.add(pValue); + return pValues; + } } static List> createPropertyList(PrismPropertyDefinition itemDefinition, PrismPropertyValue[] values) { @@ -114,10 +116,14 @@ static List> createPropertyList(PrismPropertyDefinitio return pValues; } + @SafeVarargs static List> createPropertyListFromArray(PrismPropertyDefinition itemDefinition, T... realValues) { List> pVals = new ArrayList>(); for (T realValue : realValues) { + if (realValue == null) { + continue; + } if (realValue instanceof PrismPropertyValue) { PrismPropertyValue pVal = (PrismPropertyValue) realValue; PrismUtil.recomputePrismPropertyValue(pVal, itemDefinition.getPrismContext()); @@ -129,7 +135,7 @@ static List> createPropertyListFromArray(PrismProperty return pVals; } - static List> createPropertyList(PrismPropertyDefinition itemDefinition, T realValue){ + static List> realValueToPropertyList(PrismPropertyDefinition itemDefinition, T realValue) { List> pVals = new ArrayList>(); if (realValue.getClass() != null && Collection.class.isAssignableFrom(realValue.getClass())) { @@ -175,7 +181,6 @@ public void setValue(V value) { } protected void cloneValues(PropertyValueFilter clone) { - super.cloneValues(clone); clone.values = getCloneValuesList(); if (clone.values != null) { for (V clonedValue: clone.values) { diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/RefFilter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/RefFilter.java index f3f1ce7b863..9c47003663d 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/RefFilter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/RefFilter.java @@ -160,9 +160,7 @@ public static RefFilter createNullRefFilter(ItemPath path, PrismReferenceDefinit @Override public RefFilter clone() { - RefFilter clone = new RefFilter(getFullPath(), (PrismReferenceDefinition) getDefinition(), getExpression(), (List) getValues()); - cloneValues(clone); - return clone; + return new RefFilter(getFullPath(), getDefinition(), getExpression(), getCloneValuesList()); } @Override @@ -233,11 +231,6 @@ private boolean isInFilterItem(PrismReferenceValue v, Item filterItem) { return false; } - @Override - public QName getElementName() { - return getDefinition().getName(); - } - @Override public PrismContext getPrismContext() { return getDefinition().getPrismContext(); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/SubstringFilter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/SubstringFilter.java index 30090729d57..7814539964c 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/SubstringFilter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/SubstringFilter.java @@ -25,7 +25,6 @@ import com.evolveum.midpoint.prism.PrismPropertyDefinition; import com.evolveum.midpoint.prism.PrismPropertyValue; import com.evolveum.midpoint.prism.PrismReferenceValue; -import com.evolveum.midpoint.prism.PrismValue; import com.evolveum.midpoint.prism.match.MatchingRule; import com.evolveum.midpoint.prism.match.MatchingRuleRegistry; import com.evolveum.midpoint.prism.path.ItemPath; @@ -124,7 +123,7 @@ public static SubstringFilter createSubstring(ItemPath path, PrismPropert if (realValues == null){ return createNullSubstring(path, itemDefinition, matchingRule); } - List> pValues = createPropertyList(itemDefinition, realValues); + List> pValues = realValueToPropertyList(itemDefinition, realValues); SubstringFilter substringFilter = new SubstringFilter(path, itemDefinition, matchingRule, pValues, anchorStart, anchorEnd); for (PrismPropertyValue pVal: pValues) { pVal.setParent(substringFilter); @@ -181,7 +180,7 @@ public static SubstringFilter createSubstring(ItemP return createNullSubstring(path, (PrismPropertyDefinition) itemDefinition, matchingRule); } - List> pVals = createPropertyList((PrismPropertyDefinition) itemDefinition, realValue); + List> pVals = realValueToPropertyList((PrismPropertyDefinition) itemDefinition, realValue); SubstringFilter substringFilter = new SubstringFilter<>(path, itemDefinition, matchingRule, pVals); for (PrismPropertyValue pVal: pVals) { @@ -302,11 +301,6 @@ private Set toRealValues(){ return PrismPropertyValue.getRealValuesOfCollection(getValues()); } - @Override - public QName getElementName() { - return getDefinition().getName(); - } - @Override public PrismContext getPrismContext() { return getDefinition().getPrismContext(); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/ValueFilter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/ValueFilter.java index 346bc974539..29a5b633d03 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/ValueFilter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/ValueFilter.java @@ -29,110 +29,89 @@ import com.evolveum.midpoint.prism.path.ItemPathSegment; import com.evolveum.midpoint.prism.path.NameItemPathSegment; import com.evolveum.midpoint.util.exception.SchemaException; +import org.apache.commons.lang.Validate; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import javax.xml.namespace.QName; public abstract class ValueFilter extends ObjectFilter { private static final long serialVersionUID = 1L; - private ItemPath fullPath; - private ItemDefinition definition; - private QName matchingRule; - - public ValueFilter() { - super(); - } - - public ValueFilter(ItemPath parentPath, ItemDefinition definition){ - this.fullPath = parentPath; - this.definition = definition; + + @NotNull private final ItemPath fullPath; + /** + * Definition is not required and not final, because it can be filled-in after creation of the filter (e.g. in provisioning) + */ + @Nullable private ItemDefinition definition; + @Nullable private QName matchingRule; + + // path is not empty + protected ValueFilter(@NotNull ItemPath fullPath, @Nullable ItemDefinition definition) { + this(fullPath, definition, null); } - - public ValueFilter(ItemPath parentPath, ItemDefinition definition, QName matchingRule){ - this.fullPath = parentPath; + + protected ValueFilter(@NotNull ItemPath fullPath, @Nullable ItemDefinition definition, @Nullable QName matchingRule) { + Validate.isTrue(!ItemPath.isNullOrEmpty(fullPath), "path in filter is null or empty"); + this.fullPath = fullPath; this.definition = definition; this.matchingRule = matchingRule; } + @Nullable public ItemDefinition getDefinition() { return definition; } - - public void setDefinition(ItemDefinition definition) { + + public void setDefinition(@Nullable ItemDefinition definition) { this.definition = definition; } + @NotNull public ItemPath getFullPath() { return fullPath; } - public void setFullPath(ItemPath path) { - this.fullPath = path; - } - + @Nullable public QName getMatchingRule() { return matchingRule; } - public void setMatchingRule(QName matchingRule) { + public void setMatchingRule(@Nullable QName matchingRule) { this.matchingRule = matchingRule; } - - public ItemPath getParentPath(){ - if (fullPath == null){ - return null; - } - ItemPath parentPath = fullPath.allExceptLast(); - - if (parentPath == null || parentPath.isEmpty()){ - return null; - } - - return parentPath; + + @NotNull + public ItemPath getParentPath() { + return fullPath.allExceptLast(); } - - public QName getElementName(){ - if (fullPath == null){ - return null; + + @NotNull + public QName getElementName() { + if (definition != null) { + return definition.getName(); // this is more precise, as the name in path can be unqualified } ItemPathSegment lastPathSegement = fullPath.last(); - - if (lastPathSegement == null) { - return null; - } - if (lastPathSegement instanceof NameItemPathSegment) { return ((NameItemPathSegment)lastPathSegement).getName(); + } else if (lastPathSegement == null) { + throw new IllegalStateException("Empty full path in filter "+this); } else { throw new IllegalStateException("Got "+lastPathSegement+" as a last path segment in value filter "+this); } } - public MatchingRule getMatchingRuleFromRegistry(MatchingRuleRegistry matchingRuleRegistry, Item filterItem){ - MatchingRule matching = null; - try{ - matching = matchingRuleRegistry.getMatchingRule(matchingRule, filterItem.getDefinition().getTypeName()); + protected MatchingRule getMatchingRuleFromRegistry(MatchingRuleRegistry matchingRuleRegistry, Item filterItem) { + try { + return matchingRuleRegistry.getMatchingRule(matchingRule, filterItem.getDefinition().getTypeName()); } catch (SchemaException ex){ throw new IllegalArgumentException(ex.getMessage(), ex); } - - return matching; - } - protected void cloneValues(ValueFilter clone) { - super.cloneValues(clone); - clone.fullPath = this.fullPath; - clone.definition = this.definition; - clone.matchingRule = this.matchingRule; - } - public abstract boolean isRaw(); @Override public void checkConsistence(boolean requireDefinitions) { - if (fullPath == null) { - throw new IllegalArgumentException("Null path in "+this); - } if (requireDefinitions && definition == null) { throw new IllegalArgumentException("Null definition in "+this); } @@ -143,7 +122,7 @@ public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((definition == null) ? 0 : definition.hashCode()); - result = prime * result + ((fullPath == null) ? 0 : fullPath.hashCode()); + result = prime * result + fullPath.hashCode(); result = prime * result + ((matchingRule == null) ? 0 : matchingRule.hashCode()); return result; } @@ -164,10 +143,7 @@ public boolean equals(Object obj, boolean exact) { } else if (!definition.equals(other.definition)) return false; } - if (fullPath == null) { - if (other.fullPath != null) - return false; - } else if (!fullPath.equals(other.fullPath, exact)) + if (!fullPath.equals(other.fullPath, exact)) return false; if (matchingRule == null) { if (other.matchingRule != null) diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/QueryBuilder.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/QueryBuilder.java index f0c868b3fb6..76a1c2ca8c5 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/QueryBuilder.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/QueryBuilder.java @@ -58,12 +58,12 @@ public class QueryBuilder { final private ComplexTypeDefinition containerCTD; final private PrismContext prismContext; - private QueryBuilder(Class queryClass, PrismContext prismContext) throws SchemaException { + private QueryBuilder(Class queryClass, PrismContext prismContext) { this.queryClass = queryClass; this.prismContext = prismContext; containerCTD = prismContext.getSchemaRegistry().findComplexTypeDefinitionByCompileTimeClass(queryClass); if (containerCTD == null) { - throw new SchemaException("Couldn't find definition for complex type " + queryClass); + throw new IllegalArgumentException("Couldn't find definition for complex type " + queryClass); } } @@ -75,7 +75,7 @@ public PrismContext getPrismContext() { return prismContext; } - public static S_FilterEntryOrEmpty queryFor(Class queryClass, PrismContext prismContext) throws SchemaException { + public static S_FilterEntryOrEmpty queryFor(Class queryClass, PrismContext prismContext) { QueryBuilder builder = new QueryBuilder(queryClass, prismContext); return R_Filter.create(builder); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/R_AtomicFilter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/R_AtomicFilter.java index 646bb7edfd7..6fdd28d75be 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/R_AtomicFilter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/R_AtomicFilter.java @@ -34,7 +34,7 @@ import com.evolveum.midpoint.prism.query.PropertyValueFilter; import com.evolveum.midpoint.prism.query.RefFilter; import com.evolveum.midpoint.prism.query.SubstringFilter; -import com.evolveum.midpoint.util.exception.SchemaException; + import org.apache.commons.lang.Validate; import javax.xml.namespace.QName; @@ -91,12 +91,12 @@ static R_AtomicFilter create(ItemPath itemPath, ItemDefinition itemDefinition, R } @Override - public S_AtomicFilterExit item(QName... names) throws SchemaException { + public S_AtomicFilterExit item(QName... names) { return item(new ItemPath(names), null); } @Override - public S_AtomicFilterExit item(ItemPath itemPath, ItemDefinition itemDefinition) throws SchemaException { + public S_AtomicFilterExit item(ItemPath itemPath, ItemDefinition itemDefinition) { if (!expectingRightSide) { throw new IllegalStateException("Unexpected item() call"); } @@ -130,7 +130,7 @@ public S_MatchingRuleEntry eqPoly(String orig) { } @Override - public S_MatchingRuleEntry gt(Object value) throws SchemaException { + public S_MatchingRuleEntry gt(Object value) { return new R_AtomicFilter(this, GreaterFilter.createGreater(itemPath, propertyDefinition, value, false)); } @@ -140,7 +140,7 @@ public S_RightHandItemEntry gt() { } @Override - public S_MatchingRuleEntry ge(Object value) throws SchemaException { + public S_MatchingRuleEntry ge(Object value) { return new R_AtomicFilter(this, GreaterFilter.createGreater(itemPath, propertyDefinition, value, true)); } @@ -150,7 +150,7 @@ public S_RightHandItemEntry ge() { } @Override - public S_MatchingRuleEntry lt(Object value) throws SchemaException { + public S_MatchingRuleEntry lt(Object value) { return new R_AtomicFilter(this, LessFilter.createLess(itemPath, propertyDefinition, value, false)); } @@ -160,7 +160,7 @@ public S_RightHandItemEntry lt() { } @Override - public S_MatchingRuleEntry le(Object value) throws SchemaException { + public S_MatchingRuleEntry le(Object value) { return new R_AtomicFilter(this, LessFilter.createLess(itemPath, propertyDefinition, value, true)); } @@ -262,51 +262,51 @@ public S_AtomicFilterExit matchingCaseIgnore() { // Methods which implement actions common with R_Filter @Override - public S_FilterEntry or() throws SchemaException { + public S_FilterEntry or() { return finish().or(); } @Override - public S_FilterEntry and() throws SchemaException { + public S_FilterEntry and() { return finish().and(); } @Override - public ObjectQuery build() throws SchemaException { + public ObjectQuery build() { return finish().build(); } @Override - public ObjectFilter buildFilter() throws SchemaException { + public ObjectFilter buildFilter() { return build().getFilter(); } @Override - public S_FilterExit asc(QName... names) throws SchemaException { + public S_FilterExit asc(QName... names) { return finish().asc(names); } @Override - public S_FilterExit asc(ItemPath path) throws SchemaException { + public S_FilterExit asc(ItemPath path) { return finish().asc(path); } @Override - public S_FilterExit desc(QName... names) throws SchemaException { + public S_FilterExit desc(QName... names) { return finish().desc(names); } @Override - public S_FilterExit desc(ItemPath path) throws SchemaException { + public S_FilterExit desc(ItemPath path) { return finish().desc(path); } @Override - public S_AtomicFilterExit endBlock() throws SchemaException { + public S_AtomicFilterExit endBlock() { return finish().endBlock(); } - private R_Filter finish() throws SchemaException { + private R_Filter finish() { if (filter == null) { throw new IllegalStateException("Filter is not yet created!"); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/R_Filter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/R_Filter.java index da967f64648..7c77fc762f0 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/R_Filter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/R_Filter.java @@ -81,7 +81,7 @@ public static S_FilterEntryOrEmpty create(QueryBuilder builder) { } // subfilter might be null - R_Filter addSubfilter(ObjectFilter subfilter) throws SchemaException { + R_Filter addSubfilter(ObjectFilter subfilter) { if (!currentFilter.isEmpty() && lastLogicalSymbol == null) { throw new IllegalStateException("lastLogicalSymbol is empty but there is already some filter present: " + currentFilter); } @@ -152,28 +152,28 @@ private R_Filter addOrdering(ObjectOrdering ordering) { } @Override - public S_AtomicFilterExit all() throws SchemaException { + public S_AtomicFilterExit all() { return addSubfilter(AllFilter.createAll()); } @Override - public S_AtomicFilterExit none() throws SchemaException { + public S_AtomicFilterExit none() { return addSubfilter(NoneFilter.createNone()); } @Override - public S_AtomicFilterExit undefined() throws SchemaException { + public S_AtomicFilterExit undefined() { return addSubfilter(UndefinedFilter.createUndefined()); } // TODO ............................................. @Override - public S_AtomicFilterExit id(String... identifiers) throws SchemaException { + public S_AtomicFilterExit id(String... identifiers) { return addSubfilter(InOidFilter.createInOid(identifiers)); } @Override - public S_AtomicFilterExit id(long... identifiers) throws SchemaException { + public S_AtomicFilterExit id(long... identifiers) { List ids = longsToStrings(identifiers); return addSubfilter(InOidFilter.createInOid(ids)); } @@ -187,53 +187,53 @@ private List longsToStrings(long[] identifiers) { } @Override - public S_AtomicFilterExit ownerId(String... identifiers) throws SchemaException { + public S_AtomicFilterExit ownerId(String... identifiers) { return addSubfilter(InOidFilter.createOwnerHasOidIn(identifiers)); } @Override - public S_AtomicFilterExit ownerId(long... identifiers) throws SchemaException { + public S_AtomicFilterExit ownerId(long... identifiers) { return addSubfilter(InOidFilter.createOwnerHasOidIn(longsToStrings(identifiers))); } @Override - public S_AtomicFilterExit isDirectChildOf(PrismReferenceValue value) throws SchemaException { + public S_AtomicFilterExit isDirectChildOf(PrismReferenceValue value) { OrgFilter orgFilter = OrgFilter.createOrg(value, OrgFilter.Scope.ONE_LEVEL); return addSubfilter(orgFilter); } @Override - public S_AtomicFilterExit isChildOf(PrismReferenceValue value) throws SchemaException { + public S_AtomicFilterExit isChildOf(PrismReferenceValue value) { OrgFilter orgFilter = OrgFilter.createOrg(value, OrgFilter.Scope.SUBTREE); return addSubfilter(orgFilter); } @Override - public S_AtomicFilterExit isParentOf(PrismReferenceValue value) throws SchemaException { + public S_AtomicFilterExit isParentOf(PrismReferenceValue value) { OrgFilter orgFilter = OrgFilter.createOrg(value, OrgFilter.Scope.ANCESTORS); return addSubfilter(orgFilter); } @Override - public S_AtomicFilterExit isDirectChildOf(String oid) throws SchemaException { + public S_AtomicFilterExit isDirectChildOf(String oid) { OrgFilter orgFilter = OrgFilter.createOrg(oid, OrgFilter.Scope.ONE_LEVEL); return addSubfilter(orgFilter); } @Override - public S_AtomicFilterExit isChildOf(String oid) throws SchemaException { + public S_AtomicFilterExit isChildOf(String oid) { OrgFilter orgFilter = OrgFilter.createOrg(oid, OrgFilter.Scope.SUBTREE); return addSubfilter(orgFilter); } @Override - public S_AtomicFilterExit isParentOf(String oid) throws SchemaException { + public S_AtomicFilterExit isParentOf(String oid) { OrgFilter orgFilter = OrgFilter.createOrg(oid, OrgFilter.Scope.ANCESTORS); return addSubfilter(orgFilter); } @Override - public S_AtomicFilterExit isRoot() throws SchemaException { + public S_AtomicFilterExit isRoot() { OrgFilter orgFilter = OrgFilter.createRootOrg(); return addSubfilter(orgFilter); } @@ -244,10 +244,10 @@ public S_FilterEntryOrEmpty block() { } @Override - public S_FilterEntry type(Class type) throws SchemaException { + public S_FilterEntry type(Class type) { ComplexTypeDefinition ctd = queryBuilder.getPrismContext().getSchemaRegistry().findComplexTypeDefinitionByCompileTimeClass(type); if (ctd == null) { - throw new SchemaException("Unknown type: " + type); + throw new IllegalArgumentException("Unknown type: " + type); } QName typeName = ctd.getTypeName(); if (typeName == null) { @@ -257,31 +257,31 @@ public S_FilterEntry type(Class type) throws SchemaExce } @Override - public S_FilterEntry exists(QName... names) throws SchemaException { + public S_FilterEntry exists(QName... names) { if (existsRestriction != null) { throw new IllegalStateException("Exists within exists"); } if (names.length == 0) { - throw new SchemaException("Empty path in exists() filter is not allowed."); + throw new IllegalArgumentException("Empty path in exists() filter is not allowed."); } ItemPath existsPath = new ItemPath(names); PrismContainerDefinition pcd = resolveItemPath(existsPath, PrismContainerDefinition.class); Class clazz = pcd.getCompileTimeClass(); if (clazz == null) { - throw new SchemaException("Item path of '" + existsPath + "' in " + currentClass + " does not point to a valid prism container."); + throw new IllegalArgumentException("Item path of '" + existsPath + "' in " + currentClass + " does not point to a valid prism container."); } return new R_Filter(queryBuilder, clazz, OrFilter.createOr(), null, false, this, null, existsPath, null); } - ID resolveItemPath(ItemPath itemPath, Class type) throws SchemaException { + ID resolveItemPath(ItemPath itemPath, Class type) { Validate.notNull(type, "type"); ComplexTypeDefinition ctd = queryBuilder.getPrismContext().getSchemaRegistry().findComplexTypeDefinitionByCompileTimeClass(currentClass); if (ctd == null) { - throw new SchemaException("Definition for " + currentClass + " couldn't be found."); + throw new IllegalArgumentException("Definition for " + currentClass + " couldn't be found."); } ID definition = ctd.findItemDefinition(itemPath, type); if (definition == null) { - throw new SchemaException("Item path of '" + itemPath + "' in " + currentClass + " does not point to a valid " + type.getSimpleName()); + throw new IllegalArgumentException("Item path of '" + itemPath + "' in " + currentClass + " does not point to a valid " + type.getSimpleName()); } return definition; } @@ -304,35 +304,45 @@ public S_AtomicFilterEntry not() { } @Override - public S_ConditionEntry item(QName... names) throws SchemaException { - ItemPath itemPath = new ItemPath(names); + public S_ConditionEntry item(QName... names) { + return item(new ItemPath(names)); + } + + @Override + public S_ConditionEntry item(ItemPath itemPath) { ItemDefinition itemDefinition = resolveItemPath(itemPath, ItemDefinition.class); return item(itemPath, itemDefinition); } @Override - public S_ConditionEntry item(ItemPath itemPath, ItemDefinition itemDefinition) throws SchemaException { + public S_ConditionEntry itemWithDef(ItemDefinition itemDefinition, QName... names) { + ItemPath itemPath = new ItemPath(names); + return item(itemPath, itemDefinition); + } + + @Override + public S_ConditionEntry item(ItemPath itemPath, ItemDefinition itemDefinition) { return R_AtomicFilter.create(itemPath, itemDefinition, this); } @Override - public S_ConditionEntry item(PrismContainerDefinition containerDefinition, QName... names) throws SchemaException { + public S_ConditionEntry item(PrismContainerDefinition containerDefinition, QName... names) { return item(containerDefinition, new ItemPath(names)); } @Override - public S_ConditionEntry item(PrismContainerDefinition containerDefinition, ItemPath itemPath) throws SchemaException { + public S_ConditionEntry item(PrismContainerDefinition containerDefinition, ItemPath itemPath) { ItemDefinition itemDefinition = containerDefinition.findItemDefinition(itemPath); if (itemDefinition == null) { - throw new SchemaException("No definition of " + itemPath + " in " + containerDefinition); + throw new IllegalArgumentException("No definition of " + itemPath + " in " + containerDefinition); } return item(itemPath, itemDefinition); } @Override - public S_AtomicFilterExit endBlock() throws SchemaException { + public S_AtomicFilterExit endBlock() { if (parentFilter == null) { - throw new SchemaException("endBlock() call without preceding block() one"); + throw new IllegalArgumentException("endBlock() call without preceding block() one"); } if (currentFilter != null || parentFilter.hasRestriction()) { ObjectFilter simplified = simplify(currentFilter); @@ -348,45 +358,45 @@ private boolean hasRestriction() { } @Override - public S_FilterExit asc(QName... names) throws SchemaException { + public S_FilterExit asc(QName... names) { if (names.length == 0) { - throw new SchemaException("There must be at least one name for asc(...) ordering"); + throw new IllegalArgumentException("There must be at least one name for asc(...) ordering"); } return addOrdering(ObjectOrdering.createOrdering(new ItemPath(names), OrderDirection.ASCENDING)); } @Override - public S_FilterExit asc(ItemPath path) throws SchemaException { + public S_FilterExit asc(ItemPath path) { if (ItemPath.isNullOrEmpty(path)) { - throw new SchemaException("There must be non-empty path for asc(...) ordering"); + throw new IllegalArgumentException("There must be non-empty path for asc(...) ordering"); } return addOrdering(ObjectOrdering.createOrdering(path, OrderDirection.ASCENDING)); } @Override - public S_FilterExit desc(QName... names) throws SchemaException { + public S_FilterExit desc(QName... names) { if (names.length == 0) { - throw new SchemaException("There must be at least one name for asc(...) ordering"); + throw new IllegalArgumentException("There must be at least one name for asc(...) ordering"); } return addOrdering(ObjectOrdering.createOrdering(new ItemPath(names), OrderDirection.DESCENDING)); } @Override - public S_FilterExit desc(ItemPath path) throws SchemaException { + public S_FilterExit desc(ItemPath path) { if (ItemPath.isNullOrEmpty(path)) { - throw new SchemaException("There must be non-empty path for desc(...) ordering"); + throw new IllegalArgumentException("There must be non-empty path for desc(...) ordering"); } return addOrdering(ObjectOrdering.createOrdering(path, OrderDirection.DESCENDING)); } @Override - public ObjectQuery build() throws SchemaException { + public ObjectQuery build() { if (typeRestriction != null || existsRestriction != null) { // unfinished empty type restriction or exists restriction return addSubfilter(null).build(); } if (parentFilter != null) { - throw new SchemaException("A block in filter definition was probably not closed."); + throw new IllegalStateException("A block in filter definition was probably not closed."); } ObjectPaging paging; if (!orderingList.isEmpty()) { @@ -399,7 +409,7 @@ public ObjectQuery build() throws SchemaException { } @Override - public ObjectFilter buildFilter() throws SchemaException { + public ObjectFilter buildFilter() { return build().getFilter(); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/S_AtomicFilterEntry.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/S_AtomicFilterEntry.java index 0398bdfc4c2..4edbfd49e3b 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/S_AtomicFilterEntry.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/S_AtomicFilterEntry.java @@ -29,25 +29,27 @@ * @author mederly */ public interface S_AtomicFilterEntry { - S_AtomicFilterExit all() throws SchemaException; - S_AtomicFilterExit none() throws SchemaException; - S_AtomicFilterExit undefined() throws SchemaException; - S_ConditionEntry item(QName... names) throws SchemaException; - S_ConditionEntry item(ItemPath itemPath, ItemDefinition itemDefinition) throws SchemaException; - S_ConditionEntry item(PrismContainerDefinition containerDefinition, QName... names) throws SchemaException; - S_ConditionEntry item(PrismContainerDefinition containerDefinition, ItemPath itemPath) throws SchemaException; - S_AtomicFilterExit id(String... identifiers) throws SchemaException; - S_AtomicFilterExit id(long... identifiers) throws SchemaException; - S_AtomicFilterExit ownerId(String... identifiers) throws SchemaException; - S_AtomicFilterExit ownerId(long... identifiers) throws SchemaException; - S_AtomicFilterExit isDirectChildOf(PrismReferenceValue value) throws SchemaException; - S_AtomicFilterExit isChildOf(PrismReferenceValue value) throws SchemaException; - S_AtomicFilterExit isDirectChildOf(String oid) throws SchemaException; - S_AtomicFilterExit isChildOf(String oid) throws SchemaException; - S_AtomicFilterExit isParentOf(PrismReferenceValue value) throws SchemaException; // reference should point to OrgType - S_AtomicFilterExit isParentOf(String oid) throws SchemaException; // oid should be of an OrgType - S_AtomicFilterExit isRoot() throws SchemaException; + S_AtomicFilterExit all() ; + S_AtomicFilterExit none() ; + S_AtomicFilterExit undefined() ; + S_ConditionEntry item(QName... names) ; + S_ConditionEntry item(ItemPath path) ; + S_ConditionEntry item(ItemPath itemPath, ItemDefinition itemDefinition); + S_ConditionEntry itemWithDef(ItemDefinition itemDefinition, QName... names); // experimental + S_ConditionEntry item(PrismContainerDefinition containerDefinition, QName... names); + S_ConditionEntry item(PrismContainerDefinition containerDefinition, ItemPath itemPath); + S_AtomicFilterExit id(String... identifiers) ; + S_AtomicFilterExit id(long... identifiers) ; + S_AtomicFilterExit ownerId(String... identifiers) ; + S_AtomicFilterExit ownerId(long... identifiers) ; + S_AtomicFilterExit isDirectChildOf(PrismReferenceValue value) ; + S_AtomicFilterExit isChildOf(PrismReferenceValue value) ; + S_AtomicFilterExit isDirectChildOf(String oid) ; + S_AtomicFilterExit isChildOf(String oid) ; + S_AtomicFilterExit isParentOf(PrismReferenceValue value) ; // reference should point to OrgType + S_AtomicFilterExit isParentOf(String oid) ; // oid should be of an OrgType + S_AtomicFilterExit isRoot() ; S_FilterEntryOrEmpty block(); - S_FilterEntry type(Class type) throws SchemaException; - S_FilterEntry exists(QName... names) throws SchemaException; + S_FilterEntry type(Class type) ; + S_FilterEntry exists(QName... names) ; } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/S_AtomicFilterExit.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/S_AtomicFilterExit.java index ec4ec6bfe6d..630987c9c48 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/S_AtomicFilterExit.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/S_AtomicFilterExit.java @@ -24,6 +24,6 @@ * @author mederly */ public interface S_AtomicFilterExit extends S_FilterExit { - S_FilterEntry or() throws SchemaException; - S_FilterEntry and() throws SchemaException; + S_FilterEntry or() ; + S_FilterEntry and() ; } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/S_ConditionEntry.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/S_ConditionEntry.java index ab09ea147c5..a8a900a61f1 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/S_ConditionEntry.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/S_ConditionEntry.java @@ -16,6 +16,7 @@ package com.evolveum.midpoint.prism.query.builder; +import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.PrismReferenceValue; import com.evolveum.midpoint.util.exception.SchemaException; @@ -30,13 +31,13 @@ public interface S_ConditionEntry { S_RightHandItemEntry eq(); S_MatchingRuleEntry eqPoly(String orig, String norm); S_MatchingRuleEntry eqPoly(String orig); - S_MatchingRuleEntry gt(Object value) throws SchemaException; + S_MatchingRuleEntry gt(Object value); S_RightHandItemEntry gt(); - S_MatchingRuleEntry ge(Object value) throws SchemaException; + S_MatchingRuleEntry ge(Object value); S_RightHandItemEntry ge(); - S_MatchingRuleEntry lt(Object value) throws SchemaException; + S_MatchingRuleEntry lt(Object value); S_RightHandItemEntry lt(); - S_MatchingRuleEntry le(Object value) throws SchemaException; + S_MatchingRuleEntry le(Object value); S_RightHandItemEntry le(); S_MatchingRuleEntry startsWith(Object value); S_MatchingRuleEntry startsWithPoly(String orig, String norm); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/S_FilterExit.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/S_FilterExit.java index 9cbffcc3948..0a388fa1e45 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/S_FilterExit.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/S_FilterExit.java @@ -28,9 +28,9 @@ */ public interface S_FilterExit extends S_QueryExit { - S_AtomicFilterExit endBlock() throws SchemaException; - S_FilterExit asc(QName... names) throws SchemaException; - S_FilterExit asc(ItemPath path) throws SchemaException; - S_FilterExit desc(QName... names) throws SchemaException; - S_FilterExit desc(ItemPath path) throws SchemaException; + S_AtomicFilterExit endBlock(); + S_FilterExit asc(QName... names); + S_FilterExit asc(ItemPath path); + S_FilterExit desc(QName... names); + S_FilterExit desc(ItemPath path); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/S_QueryExit.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/S_QueryExit.java index 650076413a3..bd2e4effe6a 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/S_QueryExit.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/S_QueryExit.java @@ -25,7 +25,7 @@ */ public interface S_QueryExit { - ObjectQuery build() throws SchemaException; - ObjectFilter buildFilter() throws SchemaException; + ObjectQuery build(); + ObjectFilter buildFilter(); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/S_RightHandItemEntry.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/S_RightHandItemEntry.java index c9a8a8a0edc..047019d8f32 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/S_RightHandItemEntry.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/S_RightHandItemEntry.java @@ -27,6 +27,6 @@ */ public interface S_RightHandItemEntry { // TODO add support for matching rules - S_AtomicFilterExit item(QName... names) throws SchemaException; - S_AtomicFilterExit item(ItemPath itemPath, ItemDefinition itemDefinition) throws SchemaException; + S_AtomicFilterExit item(QName... names); + S_AtomicFilterExit item(ItemPath itemPath, ItemDefinition itemDefinition); } diff --git a/infra/prism/src/test/java/com/evolveum/midpoint/prism/query/TestObjectQuery.java b/infra/prism/src/test/java/com/evolveum/midpoint/prism/query/TestObjectQuery.java index 3347e7ab755..95ed68ac851 100644 --- a/infra/prism/src/test/java/com/evolveum/midpoint/prism/query/TestObjectQuery.java +++ b/infra/prism/src/test/java/com/evolveum/midpoint/prism/query/TestObjectQuery.java @@ -23,6 +23,7 @@ import com.evolveum.midpoint.prism.match.MatchingRuleRegistryFactory; import com.evolveum.midpoint.prism.match.StringIgnoreCaseMatchingRule; import com.evolveum.midpoint.prism.polystring.PolyString; +import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import com.evolveum.midpoint.prism.util.PrismTestUtil; import com.evolveum.midpoint.util.PrettyPrinter; import com.evolveum.midpoint.util.exception.SchemaException; @@ -31,6 +32,7 @@ import org.testng.annotations.Test; import org.xml.sax.SAXException; +import javax.management.Query; import java.io.IOException; import static com.evolveum.midpoint.prism.PrismInternalTestUtil.DEFAULT_NAMESPACE_PREFIX; @@ -50,10 +52,11 @@ public void setupDebug() throws SchemaException, SAXException, IOException { @Test public void testMatchAndFilter() throws Exception{ PrismObject user = PrismTestUtil.parseObject(PrismInternalTestUtil.USER_JACK_FILE_XML); - ObjectFilter filter = - AndFilter.createAnd( - EqualFilter.createEqual(UserType.F_GIVEN_NAME, user.findProperty(UserType.F_GIVEN_NAME).getDefinition(), StringIgnoreCaseMatchingRule.NAME, "Jack"), - SubstringFilter.createSubstring(UserType.F_FULL_NAME, user.findProperty(UserType.F_FULL_NAME).getDefinition(), "arr")); + ObjectFilter filter = + QueryBuilder.queryFor(UserType.class, PrismTestUtil.getPrismContext()) + .item(UserType.F_GIVEN_NAME).eq("Jack").matchingCaseIgnore() + .and().item(UserType.F_FULL_NAME).contains("arr") + .buildFilter(); boolean match = ObjectQuery.match(user, filter, matchingRuleRegistry); AssertJUnit.assertTrue("filter does not match object", match); } @@ -62,10 +65,10 @@ public void testMatchAndFilter() throws Exception{ @Test public void testMatchOrFilter() throws Exception{ PrismObject user = PrismTestUtil.parseObject(PrismInternalTestUtil.USER_JACK_FILE_XML); - ObjectFilter filter = OrFilter.createOr( - EqualFilter.createEqual(UserType.F_GIVEN_NAME, user.findProperty(UserType.F_GIVEN_NAME).getDefinition(), null, "Jack"), - EqualFilter.createEqual(UserType.F_GIVEN_NAME, user.findProperty(UserType.F_GIVEN_NAME).getDefinition(), null, "Jackie")); - + ObjectFilter filter = QueryBuilder.queryFor(UserType.class, PrismTestUtil.getPrismContext()) + .item(UserType.F_GIVEN_NAME).eq("Jack") + .or().item(UserType.F_GIVEN_NAME).eq("Jackie") + .buildFilter(); boolean match = ObjectQuery.match(user, filter, matchingRuleRegistry); AssertJUnit.assertTrue("filter does not match object", match); } @@ -73,8 +76,9 @@ public void testMatchOrFilter() throws Exception{ @Test public void testDontMatchEqualFilter() throws Exception{ PrismObject user = PrismTestUtil.parseObject(PrismInternalTestUtil.USER_JACK_FILE_XML); - ObjectFilter filter = EqualFilter.createEqual(UserType.F_GIVEN_NAME, user.findProperty(UserType.F_GIVEN_NAME).getDefinition(), null, "Jackie"); - + ObjectFilter filter = QueryBuilder.queryFor(UserType.class, PrismTestUtil.getPrismContext()) + .item(UserType.F_GIVEN_NAME).eq("Jackie") + .buildFilter(); boolean match = ObjectQuery.match(user, filter, matchingRuleRegistry); AssertJUnit.assertFalse("filter matches object, but it should not", match); } @@ -84,14 +88,16 @@ public void testComplexMatch() throws Exception{ PrismObject user = PrismTestUtil.parseObject(PrismInternalTestUtil.USER_JACK_FILE_XML); // System.out.println("user given name" + user.asObjectable().getGivenName()); System.out.println("definition: " +user.findItem(UserType.F_FAMILY_NAME).getDefinition().debugDump()); - ObjectFilter filter = - AndFilter.createAnd( - EqualFilter.createEqual(UserType.F_FAMILY_NAME, user.findProperty(UserType.F_FAMILY_NAME).getDefinition(), null, "Sparrow"), - SubstringFilter.createSubstring(UserType.F_FULL_NAME, user.findProperty(UserType.F_FULL_NAME).getDefinition(), "arr"), - OrFilter.createOr( - EqualFilter.createEqual(UserType.F_GIVEN_NAME, user.findProperty(UserType.F_GIVEN_NAME).getDefinition(), null, "Jack"), - EqualFilter.createEqual(UserType.F_GIVEN_NAME, user.findProperty(UserType.F_GIVEN_NAME).getDefinition(), null, "Jackie"))); - + ObjectFilter filter = + QueryBuilder.queryFor(UserType.class, PrismTestUtil.getPrismContext()) + .item(UserType.F_FAMILY_NAME).eq("Sparrow") + .and().item(UserType.F_FULL_NAME).contains("arr") + .and() + .block() + .item(UserType.F_GIVEN_NAME).eq("Jack") + .or().item(UserType.F_GIVEN_NAME).eq("Jackie") + .endBlock() + .buildFilter(); boolean match = ObjectQuery.match(user, filter, matchingRuleRegistry); AssertJUnit.assertTrue("filter does not match object", match); } @@ -100,8 +106,9 @@ public void testComplexMatch() throws Exception{ public void testPolystringMatchEqualFilter() throws Exception{ PrismObject user = PrismTestUtil.parseObject(PrismInternalTestUtil.USER_JACK_FILE_XML); PolyString name = new PolyString("jack", "jack"); - ObjectFilter filter = EqualFilter.createEqual(UserType.F_NAME, user.findProperty(UserType.F_NAME).getDefinition(), null, name); - + ObjectFilter filter = QueryBuilder.queryFor(UserType.class, PrismTestUtil.getPrismContext()) + .item(UserType.F_NAME).eq(name) + .buildFilter(); boolean match = ObjectQuery.match(user, filter, matchingRuleRegistry); AssertJUnit.assertTrue("filter does not match object", match); } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/expr/MidpointFunctionsImpl.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/expr/MidpointFunctionsImpl.java index ec61e473f3d..bcc4666c8cc 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/expr/MidpointFunctionsImpl.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/expr/MidpointFunctionsImpl.java @@ -35,6 +35,7 @@ import com.evolveum.midpoint.prism.query.EqualFilter; import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.prism.query.RefFilter; +import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import com.evolveum.midpoint.provisioning.api.ProvisioningService; import com.evolveum.midpoint.repo.api.RepositoryService; import com.evolveum.midpoint.schema.DeltaConvertor; @@ -554,8 +555,9 @@ private List getObjectsInConflictOnPropertyValue(fi matchingRule = DefaultMatchingRule.NAME; } } - EqualFilter filter = EqualFilter.createEqual(propertyPath, propertyDefinition, matchingRule, propertyValue); - ObjectQuery query = ObjectQuery.createObjectQuery(filter); + ObjectQuery query = QueryBuilder.queryFor(objectType.getClass(), prismContext) + .item(propertyPath, propertyDefinition).eq(propertyValue).matching(matchingRule) + .build(); if (LOGGER.isTraceEnabled()) { LOGGER.trace("Determining uniqueness of property {} using query:\n{}", propertyPath, query.debugDump()); } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/FocusConstraintsChecker.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/FocusConstraintsChecker.java index e29514bf704..7b71c2c3817 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/FocusConstraintsChecker.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/FocusConstraintsChecker.java @@ -126,7 +126,7 @@ private boolean checkPropertyUniqueness(PrismObject objectNew, ItemPath p String oid = objectNew.getOid(); ObjectQuery query = ObjectQuery.createObjectQuery( - EqualFilter.createEqual(propPath, property.clone())); + EqualFilter.createEqual(propPath, property)); List> foundObjects = repositoryService.searchObjects(objectNew.getCompileTimeClass(), query, null, result); if (LOGGER.isTraceEnabled()) { diff --git a/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportFunctions.java b/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportFunctions.java index 9eaf068756a..b3819f44a9f 100644 --- a/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportFunctions.java +++ b/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportFunctions.java @@ -29,6 +29,7 @@ import com.evolveum.midpoint.prism.PrismReferenceValue; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.query.EqualFilter; +import com.evolveum.midpoint.prism.query.ObjectFilter; import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.prism.query.RefFilter; import com.evolveum.midpoint.prism.query.builder.QueryBuilder; @@ -280,12 +281,16 @@ List searchObjects(Class type, ObjectQuery query) { return ret; } - EqualFilter createEqualFilter(QName propertyName, Class type, T realValues) throws SchemaException { - return EqualFilter.createEqual(propertyName, type, prismContext, realValues); + ObjectFilter createEqualFilter(QName propertyName, Class type, T realValue) throws SchemaException { + return QueryBuilder.queryFor(type, prismContext) + .item(propertyName).eq(realValue) + .buildFilter(); } - EqualFilter createEqualFilter(ItemPath propertyPath, Class type, T realValues) throws SchemaException { - return EqualFilter.createEqual(propertyPath, type, prismContext, realValues); + ObjectFilter createEqualFilter(ItemPath propertyPath, Class type, T realValue) throws SchemaException { + return QueryBuilder.queryFor(type, prismContext) + .item(propertyPath).eq(realValue) + .buildFilter(); } RefFilter createReferenceEqualFilter(QName propertyName, Class type, String... oids) { diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/EntitlementConverter.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/EntitlementConverter.java index e8085b42f5e..5f7e0f4b018 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/EntitlementConverter.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/EntitlementConverter.java @@ -21,6 +21,7 @@ import javax.xml.namespace.QName; +import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -313,15 +314,12 @@ private ObjectQuery createQuery(RefinedAssociationDefinition assocDefTyp MatchingRule matchingRule = matchingRuleRegistry.getMatchingRule(assocDefType.getResourceObjectAssociationType().getMatchingRule(), assocAttrDef.getTypeName()); PrismPropertyValue converted = PrismUtil.convertPropertyValue(valueAttr.getValue(0), valueAttr.getDefinition(), assocAttrDef); - PrismPropertyValue normalized = converted; - if (matchingRule != null) { - TA normalizedRealValue = matchingRule.normalize(converted.getValue()); - normalized = new PrismPropertyValue(normalizedRealValue); - } - LOGGER.trace("Converted entitlement filter: {} ({}) def={}", - new Object[]{normalized, normalized.getValue().getClass(), assocAttrDef}); - ObjectFilter filter = EqualFilter.createEqual(new ItemPath(ShadowType.F_ATTRIBUTES, assocAttrDef.getName()), assocAttrDef, normalized); - ObjectQuery query = ObjectQuery.createObjectQuery(filter); + TA normalizedRealValue = matchingRule.normalize(converted.getValue()); + PrismPropertyValue normalized = new PrismPropertyValue(normalizedRealValue); + LOGGER.trace("Converted entitlement filter: {} ({}) def={}", normalized, normalized.getValue().getClass(), assocAttrDef); + ObjectQuery query = QueryBuilder.queryFor(ShadowType.class, prismContext) + .item(new ItemPath(ShadowType.F_ATTRIBUTES, assocAttrDef.getName()), assocAttrDef).eq(normalized) + .build(); query.setAllowPartialResults(true); return query; } diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ResourceObjectConverter.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ResourceObjectConverter.java index cef3fcd58ff..a54356e8a1c 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ResourceObjectConverter.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ResourceObjectConverter.java @@ -29,12 +29,10 @@ import com.evolveum.midpoint.prism.match.MatchingRule; import com.evolveum.midpoint.prism.match.MatchingRuleRegistry; import com.evolveum.midpoint.prism.path.ItemPath; -import com.evolveum.midpoint.prism.query.EqualFilter; -import com.evolveum.midpoint.prism.query.ObjectFilter; import com.evolveum.midpoint.prism.query.ObjectQuery; +import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import com.evolveum.midpoint.prism.util.JavaTypeConverter; import com.evolveum.midpoint.prism.util.PrismUtil; -import com.evolveum.midpoint.prism.xml.XsdTypeMapper; import com.evolveum.midpoint.provisioning.api.GenericConnectorException; import com.evolveum.midpoint.provisioning.ucf.api.*; import com.evolveum.midpoint.provisioning.util.ProvisioningUtil; @@ -174,14 +172,13 @@ public PrismObject locateResourceObject(ProvisioningContext ctx, if (secondaryIdentifierValues.size() > 1) { throw new IllegalStateException("Secondary identifier has more than one value: " + secondaryIdentifier.getValues()); } else if (secondaryIdentifierValues.size() == 1) { - secondaryIdentifierValue = secondaryIdentifierValues.get(0); + secondaryIdentifierValue = secondaryIdentifierValues.get(0).clone(); } else { secondaryIdentifierValue = null; } - ObjectFilter filter = EqualFilter.createEqual(new ItemPath(ShadowType.F_ATTRIBUTES, secondaryIdentifierDef.getName()), - secondaryIdentifierDef, secondaryIdentifierValue.clone()); - ObjectQuery query = ObjectQuery.createObjectQuery(filter); -// query.setFilter(filter); + ObjectQuery query = QueryBuilder.queryFor(ShadowType.class, prismContext) + .itemWithDef(secondaryIdentifierDef, ShadowType.F_ATTRIBUTES, secondaryIdentifierDef.getName()).eq(secondaryIdentifierValue) + .build(); final Holder> shadowHolder = new Holder>(); ResultHandler handler = new ResultHandler() { @Override diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowManager.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowManager.java index 131c655f146..aff1a1caac5 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowManager.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowManager.java @@ -373,14 +373,10 @@ private List> getNormalizedValue(PrismProperty attr MatchingRule matchingRule = matchingRuleRegistry.getMatchingRule(matchingRuleQName, refinedAttributeDefinition.getTypeName()); List> normalized = new ArrayList<>(); for (PrismPropertyValue origPValue : attr.getValues()){ - if (matchingRule != null) { - T normalizedValue = matchingRule.normalize(origPValue.getValue()); - PrismPropertyValue normalizedPValue = origPValue.clone(); - normalizedPValue.setValue(normalizedValue); - normalized.add(normalizedPValue); - } else { - normalized.add(origPValue); - } + T normalizedValue = matchingRule.normalize(origPValue.getValue()); + PrismPropertyValue normalizedPValue = origPValue.clone(); + normalizedPValue.setValue(normalizedValue); + normalized.add(normalizedPValue); } return normalized; @@ -625,7 +621,7 @@ private ObjectQuery createSearchShadowQuery(ProvisioningContext ctx, Collection< //new ItemPath(ShadowType.F_ATTRIBUTES) PrismPropertyDefinition def = (PrismPropertyDefinition) identifier.getDefinition(); EqualFilter filter = EqualFilter.createEqual(new ItemPath(ShadowType.F_ATTRIBUTES, def.getName()), - def, new PrismPropertyValue(normalizedIdentifierValue)); + def, new PrismPropertyValue<>(normalizedIdentifierValue)); conditions.add(filter); } diff --git a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/TestDummy.java b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/TestDummy.java index b5677e3347f..1e80a42c8ac 100644 --- a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/TestDummy.java +++ b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/TestDummy.java @@ -44,6 +44,7 @@ import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.query.OrFilter; +import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import org.apache.commons.lang.StringUtils; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.ContextConfiguration; @@ -2868,37 +2869,27 @@ protected void testSeachIterativeSingleAttrFilter(final String TEST_NAME, St protected void testSeachIterativeSingleAttrFilter(final String TEST_NAME, QName attrQName, T attrVal, GetOperationOptions rootOptions, boolean fullShadow, String... expectedAccountNames) throws Exception { - PrismPropertyValue attrPVal = null; - if (attrVal != null) { - attrPVal = new PrismPropertyValue(attrVal); - } ResourceSchema resourceSchema = RefinedResourceSchema.getResourceSchema(resource, prismContext); ObjectClassComplexTypeDefinition objectClassDef = resourceSchema.findObjectClassDefinition(SchemaTestConstants.ACCOUNT_OBJECT_CLASS_LOCAL_NAME); ResourceAttributeDefinition attrDef = objectClassDef.findAttributeDefinition(attrQName); - ObjectFilter filter = EqualFilter.createEqual(new ItemPath(ShadowType.F_ATTRIBUTES, attrDef.getName()), attrDef, attrPVal); - + ObjectFilter filter = QueryBuilder.queryFor(ShadowType.class, prismContext) + .itemWithDef(attrDef, ShadowType.F_ATTRIBUTES, attrDef.getName()).eq(attrVal) + .buildFilter(); testSeachIterative(TEST_NAME, filter, rootOptions, fullShadow, true, false, expectedAccountNames); } protected void testSeachIterativeAlternativeAttrFilter(final String TEST_NAME, QName attr1QName, T attr1Val, QName attr2QName, T attr2Val, GetOperationOptions rootOptions, boolean fullShadow, String... expectedAccountNames) throws Exception { - PrismPropertyValue attr1PVal = null; - if (attr1Val != null) { - attr1PVal = new PrismPropertyValue(attr1Val); - } - PrismPropertyValue attr2PVal = null; - if (attr2Val != null) { - attr2PVal = new PrismPropertyValue(attr2Val); - } ResourceSchema resourceSchema = RefinedResourceSchema.getResourceSchema(resource, prismContext); ObjectClassComplexTypeDefinition objectClassDef = resourceSchema.findObjectClassDefinition(SchemaTestConstants.ACCOUNT_OBJECT_CLASS_LOCAL_NAME); ResourceAttributeDefinition attr1Def = objectClassDef.findAttributeDefinition(attr1QName); - ObjectFilter filter1 = EqualFilter.createEqual(new ItemPath(ShadowType.F_ATTRIBUTES, attr1Def.getName()), attr1Def, attr1PVal); ResourceAttributeDefinition attr2Def = objectClassDef.findAttributeDefinition(attr2QName); - ObjectFilter filter2 = EqualFilter.createEqual(new ItemPath(ShadowType.F_ATTRIBUTES, attr2Def.getName()), attr2Def, attr2PVal); - - testSeachIterative(TEST_NAME, OrFilter.createOr(filter1, filter2), rootOptions, fullShadow, false, true, expectedAccountNames); + ObjectFilter filter = QueryBuilder.queryFor(ShadowType.class, prismContext) + .itemWithDef(attr1Def, ShadowType.F_ATTRIBUTES, attr1Def.getName()).eq(attr1Val) + .or().itemWithDef(attr2Def, ShadowType.F_ATTRIBUTES, attr2Def.getName()).eq(attr2Val) + .buildFilter(); + testSeachIterative(TEST_NAME, filter, rootOptions, fullShadow, false, true, expectedAccountNames); } diff --git a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/TestDummyUuidNonUniqueName.java b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/TestDummyUuidNonUniqueName.java index ff8b937d1c1..745b35e7ac5 100644 --- a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/TestDummyUuidNonUniqueName.java +++ b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/TestDummyUuidNonUniqueName.java @@ -27,6 +27,8 @@ import javax.xml.namespace.QName; +import com.evolveum.midpoint.prism.query.builder.QueryBuilder; +import com.evolveum.midpoint.schema.util.ObjectTypeUtil; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.ContextConfiguration; import org.testng.annotations.Test; @@ -190,15 +192,12 @@ private String addFettucini(final String TEST_NAME, File file, String oid, Strin private void searchFettucini(int expectedNumberOfFettucinis) throws SchemaException, ObjectNotFoundException, CommunicationException, ConfigurationException, SecurityViolationException { OperationResult result = new OperationResult(TestDummy.class.getName() + ".searchFettucini"); - - ObjectFilter filter = AndFilter.createAnd( - RefFilter.createReferenceEqual(ShadowType.F_RESOURCE_REF, ShadowType.class, resource), - EqualFilter.createEqual(ShadowType.F_OBJECT_CLASS, ShadowType.class, prismContext, null, - new QName(dummyResourceCtl.getNamespace(), "AccountObjectClass")), - EqualFilter.createEqual(new ItemPath(ShadowType.F_ATTRIBUTES, getIcfNameDefinition().getName()), - getIcfNameDefinition(), new PrismPropertyValue(ACCOUNT_FETTUCINI_NAME))); - ObjectQuery query = new ObjectQuery(); - query.setFilter(filter); + ObjectQuery query = QueryBuilder.queryFor(ShadowType.class, prismContext) + .item(ShadowType.F_RESOURCE_REF).ref(resource.getOid()) + .and().item(ShadowType.F_OBJECT_CLASS).eq(new QName(dummyResourceCtl.getNamespace(), "AccountObjectClass")) + .and().itemWithDef(getIcfNameDefinition(), ShadowType.F_ATTRIBUTES, getIcfNameDefinition().getName()).eq(ACCOUNT_FETTUCINI_NAME) + .build(); + // WHEN List> shadows = provisioningService.searchObjects(ShadowType.class, query, null, null, result); assertEquals("Wrong number of Fettucinis found", expectedNumberOfFettucinis, shadows.size()); diff --git a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/AddOverwriteTest.java b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/AddOverwriteTest.java index 2ad7753af98..11082c53cdd 100644 --- a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/AddOverwriteTest.java +++ b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/AddOverwriteTest.java @@ -28,6 +28,7 @@ import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.prism.query.EqualFilter; import com.evolveum.midpoint.prism.query.ObjectQuery; +import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import com.evolveum.midpoint.prism.schema.SchemaRegistry; import com.evolveum.midpoint.prism.util.PrismAsserts; import com.evolveum.midpoint.prism.util.PrismTestUtil; @@ -126,9 +127,10 @@ public void addWithOverwrite() throws Exception { private PrismObject getCarla(OperationResult opResult) throws Exception { final String CARLA_NAME = "carla"; - final ObjectQuery query = new ObjectQuery(); PrismObjectDefinition userObjectDef = prismContext.getSchemaRegistry().findObjectDefinitionByCompileTimeClass(UserType.class); - query.setFilter(EqualFilter.createEqual(ObjectType.F_NAME, userObjectDef.findPropertyDefinition(ObjectType.F_NAME), null, CARLA_NAME)); + ObjectQuery query = QueryBuilder.queryFor(UserType.class, prismContext) + .item(UserType.F_NAME).eq(CARLA_NAME) + .build(); List> users = repositoryService.searchObjects(UserType.class, query, null, opResult); AssertJUnit.assertEquals(1, users.size()); return users.get(0); diff --git a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/OrgStructTest.java b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/OrgStructTest.java index 00851b27ab6..d2b4205cc38 100644 --- a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/OrgStructTest.java +++ b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/OrgStructTest.java @@ -24,6 +24,7 @@ import com.evolveum.midpoint.prism.delta.ObjectDelta; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.query.*; +import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import com.evolveum.midpoint.prism.util.PrismAsserts; import com.evolveum.midpoint.prism.util.PrismTestUtil; import com.evolveum.midpoint.repo.sql.data.common.ROrgClosure; @@ -131,9 +132,10 @@ public void test001addOrgStructObjects() throws Exception { PrismObjectDefinition userObjectDef = prismContext.getSchemaRegistry() .findObjectDefinitionByCompileTimeClass(UserType.class); - EqualFilter equals = EqualFilter.createEqual(UserType.F_NAME, userObjectDef.findPropertyDefinition(UserType.F_NAME), null, ELAINE_NAME); - List> users = repositoryService.searchObjects(UserType.class, - ObjectQuery.createObjectQuery(equals), null, opResult); + ObjectQuery query = QueryBuilder.queryFor(UserType.class, prismContext) + .item(UserType.F_NAME).eq(ELAINE_NAME) + .build(); + List> users = repositoryService.searchObjects(UserType.class, query, null, opResult); AssertJUnit.assertEquals(1, users.size()); ELAINE_OID = users.get(0).getOid(); @@ -270,11 +272,9 @@ public void test001addOrgStructObjectsIncorrect() throws Exception { orgClosure = criteria.list(); AssertJUnit.assertEquals(3, orgClosure.size()); - - ObjectQuery query = new ObjectQuery(); - PrismObjectDefinition userObjectDef = prismContext.getSchemaRegistry().findObjectDefinitionByCompileTimeClass(UserType.class); - query.setFilter(EqualFilter.createEqual(UserType.F_NAME, userObjectDef.findPropertyDefinition(UserType.F_NAME), null, ELAINE_NAME1)); - + ObjectQuery query = QueryBuilder.queryFor(UserType.class, prismContext) + .item(UserType.F_NAME).eq(ELAINE_NAME1) + .build(); List> users = repositoryService.searchObjects(UserType.class, query, null, opResult); AssertJUnit.assertNotNull(users); diff --git a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/QueryInterpreter2Test.java b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/QueryInterpreter2Test.java index e3e42d9cb1c..350459107f8 100644 --- a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/QueryInterpreter2Test.java +++ b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/QueryInterpreter2Test.java @@ -722,12 +722,6 @@ public void test080QueryExistsAssignment() throws Exception { /* * ### UserType: Exists (assignment, Equal (activation/administrativeStatus = Enabled)) */ - ExistsFilter filter = ExistsFilter.createExists(new ItemPath(F_ASSIGNMENT), UserType.class, prismContext, - EqualFilter.createEqual(new ItemPath(AssignmentType.F_ACTIVATION, ActivationType.F_ADMINISTRATIVE_STATUS), - AssignmentType.class, prismContext, null, ActivationStatusType.ENABLED)); - ObjectQuery query0 = ObjectQuery.createObjectQuery(filter); - query0.setPaging(ObjectPaging.createPaging(F_NAME, ASCENDING)); - ObjectQuery query = QueryBuilder.queryFor(UserType.class, prismContext) .exists(F_ASSIGNMENT) .item(AssignmentType.F_ACTIVATION, ActivationType.F_ADMINISTRATIVE_STATUS) @@ -2735,11 +2729,9 @@ public void test640queryAssignmentExtensionBoolean() throws Exception { PrismContainerDefinition assignmentDef = userDef.findContainerDefinition(F_ASSIGNMENT); PrismPropertyDefinition propDef = assignmentDef.createPropertyDefinition(SKIP_AUTOGENERATION, DOMUtil.XSD_BOOLEAN); - EqualFilter eq = EqualFilter.createEqual( - new ItemPath(F_ASSIGNMENT, AssignmentType.F_EXTENSION, SKIP_AUTOGENERATION), - propDef, null, true); - - ObjectQuery objectQuery = ObjectQuery.createObjectQuery(eq); + ObjectQuery objectQuery = QueryBuilder.queryFor(UserType.class, prismContext) + .itemWithDef(propDef, F_ASSIGNMENT, AssignmentType.F_EXTENSION, SKIP_AUTOGENERATION).eq(true) + .build(); objectQuery.setUseNewQueryInterpreter(true); String real = getInterpretedQuery2(session, UserType.class, objectQuery); diff --git a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/QueryInterpreterTest.java b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/QueryInterpreterTest.java index 47a4836cfd5..69b56d4b07c 100644 --- a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/QueryInterpreterTest.java +++ b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/QueryInterpreterTest.java @@ -22,6 +22,7 @@ import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.prism.query.*; +import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import com.evolveum.midpoint.prism.schema.SchemaRegistry; import com.evolveum.midpoint.prism.util.PrismTestUtil; import com.evolveum.midpoint.prism.xml.XmlTypeConverter; @@ -1831,18 +1832,17 @@ public void test440queryAssignmentExtensionBoolean() throws Exception { PrismContainerDefinition assignmentDef = userDef.findContainerDefinition(UserType.F_ASSIGNMENT); PrismPropertyDefinition propDef = assignmentDef.createPropertyDefinition(SKIP_AUTOGENERATION, DOMUtil.XSD_BOOLEAN); - EqualFilter eq = EqualFilter.createEqual( - new ItemPath(UserType.F_ASSIGNMENT, AssignmentType.F_EXTENSION, SKIP_AUTOGENERATION), - propDef, null, true); + ObjectQuery objectQuery = QueryBuilder.queryFor(UserType.class, prismContext) + .itemWithDef(propDef, UserType.F_ASSIGNMENT, AssignmentType.F_EXTENSION, SKIP_AUTOGENERATION).eq(true) + .build(); - String real = getInterpretedQuery(session, UserType.class, ObjectQuery.createObjectQuery(eq)); + String real = getInterpretedQuery(session, UserType.class, objectQuery); LOGGER.info("exp. query>\n{}\nreal query>\n{}", new Object[]{expected, real}); AssertJUnit.assertEquals(expected, real); OperationResult result = new OperationResult("search"); - List> objects = repositoryService.searchObjects(UserType.class, - ObjectQuery.createObjectQuery(eq), null, result); + List> objects = repositoryService.searchObjects(UserType.class, objectQuery, null, result); result.computeStatus(); AssertJUnit.assertTrue(result.isSuccess()); @@ -1853,7 +1853,7 @@ public void test440queryAssignmentExtensionBoolean() throws Exception { AssertJUnit.assertTrue(obj.getCompileTimeClass().equals(UserType.class)); result = new OperationResult("count"); - long count = repositoryService.countObjects(UserType.class, ObjectQuery.createObjectQuery(eq), result); + long count = repositoryService.countObjects(UserType.class, objectQuery, result); result.computeStatus(); AssertJUnit.assertTrue(result.isSuccess()); AssertJUnit.assertEquals(1, count); diff --git a/repo/repo-test-util/src/main/java/com/evolveum/midpoint/test/IntegrationTestTools.java b/repo/repo-test-util/src/main/java/com/evolveum/midpoint/test/IntegrationTestTools.java index 7fc10edf951..cf97a45ead1 100644 --- a/repo/repo-test-util/src/main/java/com/evolveum/midpoint/test/IntegrationTestTools.java +++ b/repo/repo-test-util/src/main/java/com/evolveum/midpoint/test/IntegrationTestTools.java @@ -28,6 +28,7 @@ import com.evolveum.midpoint.prism.query.ObjectFilter; import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.prism.query.RefFilter; +import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import com.evolveum.midpoint.prism.util.PrismAsserts; import com.evolveum.midpoint.prism.util.PrismTestUtil; import com.evolveum.midpoint.prism.util.PrismUtil; @@ -687,16 +688,11 @@ private static ObjectQuery createShadowQuery(ShadowType resourceShadow, ObjectCl identifierValue = uidMatchingRule.normalize(identifierValue); } - ObjectFilter filter; PrismPropertyDefinition identifierDef = identifier.getDefinition(); - filter = AndFilter.createAnd( - RefFilter.createReferenceEqual(ShadowType.F_RESOURCE_REF, ShadowType.class, prismContext, ShadowUtil.getResourceOid(resourceShadow)), - EqualFilter.createEqual(new ItemPath(ShadowType.F_ATTRIBUTES, identifierDef.getName()), identifierDef, new PrismPropertyValue(identifierValue))); - - ObjectQuery query = ObjectQuery.createObjectQuery(filter); - - return query; - + return QueryBuilder.queryFor(ShadowType.class, prismContext) + .item(ShadowType.F_RESOURCE_REF).ref(ShadowUtil.getResourceOid(resourceShadow)) + .and().item(new ItemPath(ShadowType.F_ATTRIBUTES, identifierDef.getName()), identifierDef).eq(identifierValue) + .build(); } public static void applyResourceSchema(ShadowType accountType, ResourceType resourceType, PrismContext prismContext) throws SchemaException { From 54438a8ffdbd813be8f2ed966842607747c612f2 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Tue, 11 Oct 2016 18:35:05 +0200 Subject: [PATCH 26/74] Interim commit. --- .../midpoint/web/component/search/Search.java | 7 +- .../midpoint/prism/query/EqualFilter.java | 65 +- .../prism/query/TestQueryBuilder.java | 4 +- .../impl/expr/MidpointFunctionsImpl.java | 26 +- .../model/intest/TestStrangeCases.java | 17 +- .../test/AbstractModelIntegrationTest.java | 13 +- .../provisioning/impl/ConstraintsChecker.java | 22 +- .../provisioning/impl/ShadowManager.java | 31 +- .../impl/dummy/AbstractDummyTest.java | 6 +- .../provisioning/impl/dummy/TestDummy.java | 32 +- .../repo/sql/QueryInterpreter2Test.java | 67 +- .../repo/sql/QueryInterpreterTest.java | 1864 ----------------- .../test/AbstractIntegrationTest.java | 25 +- 13 files changed, 126 insertions(+), 2053 deletions(-) delete mode 100644 repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/QueryInterpreterTest.java diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/Search.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/Search.java index dbaae7d34a7..68ac9d1dd62 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/Search.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/Search.java @@ -23,6 +23,7 @@ import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.polystring.PolyStringNormalizer; import com.evolveum.midpoint.prism.query.*; +import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.util.DOMUtil; import com.evolveum.midpoint.util.DebugDumpable; @@ -196,7 +197,8 @@ private ObjectFilter createFilterForSearchValue(SearchItem item, DisplayableValu //or if it's boolean value DisplayableValue displayableValue = (DisplayableValue) searchValue.getValue(); Object value = displayableValue.getValue(); - return EqualFilter.createEqual(path, propDef, value); + return QueryBuilder.queryFor(ObjectType.class, ctx) + .item(path, propDef).eq(value).buildFilter(); } else if (DOMUtil.XSD_INT.equals(propDef.getTypeName()) || DOMUtil.XSD_INTEGER.equals(propDef.getTypeName()) || DOMUtil.XSD_LONG.equals(propDef.getTypeName()) @@ -208,7 +210,8 @@ private ObjectFilter createFilterForSearchValue(SearchItem item, DisplayableValu return null; } Object value = Long.parseLong((String) searchValue.getValue()); - return EqualFilter.createEqual(path, propDef, value); + return QueryBuilder.queryFor(ObjectType.class, ctx) + .item(path, propDef).eq(value).buildFilter(); } else if (DOMUtil.XSD_STRING.equals(propDef.getTypeName())) { String text = (String) searchValue.getValue(); return SubstringFilter.createSubstring(path, propDef, StringIgnoreCaseMatchingRule.NAME, text); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/EqualFilter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/EqualFilter.java index 703ac6f7e79..7ca87fa3c49 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/EqualFilter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/EqualFilter.java @@ -16,7 +16,6 @@ package com.evolveum.midpoint.prism.query; -import java.util.Collection; import java.util.List; import javax.xml.namespace.QName; @@ -30,7 +29,6 @@ import com.evolveum.midpoint.prism.Item; import com.evolveum.midpoint.prism.Itemable; import com.evolveum.midpoint.prism.PrismConstants; -import com.evolveum.midpoint.prism.PrismContainerDefinition; import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismProperty; import com.evolveum.midpoint.prism.PrismPropertyDefinition; @@ -46,9 +44,9 @@ public class EqualFilter extends PropertyValueFilter> i public static final QName ELEMENT_NAME = new QName(PrismConstants.NS_QUERY, "equal"); - private EqualFilter(@NotNull ItemPath parentPath, PrismPropertyDefinition definition, QName matchingRule, + private EqualFilter(@NotNull ItemPath fullPath, PrismPropertyDefinition definition, QName matchingRule, @NotNull ItemPath rightSidePath, ItemDefinition rightSideDefinition) { - super(parentPath, definition, matchingRule, rightSidePath, rightSideDefinition); + super(fullPath, definition, matchingRule, rightSidePath, rightSideDefinition); } private EqualFilter(@NotNull ItemPath fullPath, PrismPropertyDefinition definition, QName matchingRule, @@ -59,6 +57,12 @@ private EqualFilter(@NotNull ItemPath fullPath, PrismPropertyDefinition defin //factory methods // Do not require definition. We may want queries for which the definition is supplied later. + // right-side-related + @NotNull + public static EqualFilter createEqual(ItemPath propertyPath, PrismPropertyDefinition propertyDefinition, QName matchingRule, ItemPath rightSidePath, ItemDefinition rightSideDefinition) { + return new EqualFilter<>(propertyPath, propertyDefinition, matchingRule, rightSidePath, rightSideDefinition); + } + // expression-related @NotNull public static EqualFilter createEqual(@NotNull ItemPath path, @Nullable PrismPropertyDefinition definition, @@ -73,19 +77,6 @@ public static EqualFilter createEqual(@NotNull ItemPath path, @Nullable P return new EqualFilter(path, definition, matchingRule, values, null); } - // -------------------------------- PPV - // canonical - - @NotNull - public static EqualFilter createEqual(@NotNull ItemPath path, @NotNull PrismPropertyDefinition itemDefinition, PrismPropertyValue value) { - List> pValues = createPropertyList(itemDefinition, value); - return new EqualFilter<>(path, itemDefinition, null, pValues, null); - } - - - // List - // Array of values - @NotNull @SafeVarargs public static EqualFilter createEqualMultiple(@NotNull ItemPath path, @NotNull PrismPropertyDefinition definition, @@ -93,22 +84,12 @@ public static EqualFilter createEqualMultiple(@NotNull ItemPath path, @No return new EqualFilter<>(path, definition, matchingRule, createPropertyListFromArray(definition, realValues), null); } - // -------------------------------- single value - // ------------------- with matching rule - // canonical @NotNull public static EqualFilter createEqual(@NotNull ItemPath path, @NotNull PrismPropertyDefinition definition, @Nullable QName matchingRule, @Nullable T realValue) { return new EqualFilter<>(path, definition, matchingRule, realValueToPropertyList(definition, realValue), null); } - // ------------------- without matching rule - @NotNull - public static EqualFilter createEqual(@NotNull ItemPath path, @NotNull PrismPropertyDefinition itemDefinition, @Nullable T realValue) { - return createEqual(path, itemDefinition, null, realValue); - } - - // definition from container private static EqualFilter createEqual(@NotNull ItemPath propertyPath, @NotNull Class type, @NotNull PrismContext prismContext, @Nullable QName matchingRule, T realValue) { @SuppressWarnings("unchecked") @@ -137,41 +118,13 @@ public static EqualFilter createEqual(@NotNull Q // taking values from existing item (item's values are cloned) @NotNull + @Deprecated public static EqualFilter createEqual(@NotNull ItemPath path, @NotNull PrismProperty item) { List> clonedValues = (List>) PrismPropertyValue.cloneCollection(item.getValues()); return createEqual(path, item.getDefinition(), null, clonedValues); } - - - - - @NotNull - public static EqualFilter createEqual(@NotNull ItemPath itemPath, @NotNull PrismContainerDefinition containerDef, - T realValues) throws SchemaException { - PrismPropertyDefinition propertyDef = (PrismPropertyDefinition) FilterUtils.findItemDefinition(itemPath, containerDef); - return createEqual(itemPath, propertyDef, realValues); - } - - - public static EqualFilter createEqual(ItemPath propertyPath, Class type, PrismContext prismContext, QName matchingRule, ItemPath rightSidePath) { - PrismPropertyDefinition propertyDefinition = (PrismPropertyDefinition) FilterUtils.findItemDefinition(propertyPath, type, prismContext); - EqualFilter filter = new EqualFilter(propertyPath, propertyDefinition, matchingRule, rightSidePath, null); - return filter; - } - - public static EqualFilter createEqual(ItemPath propertyPath, Class type, PrismContext prismContext, QName matchingRule, ItemPath rightSidePath, ItemDefinition rightSideDefinition) { - PrismPropertyDefinition propertyDefinition = (PrismPropertyDefinition) FilterUtils.findItemDefinition(propertyPath, type, prismContext); - EqualFilter filter = new EqualFilter(propertyPath, propertyDefinition, matchingRule, rightSidePath, rightSideDefinition); - return filter; - } - - public static EqualFilter createEqual(ItemPath propertyPath, PrismPropertyDefinition propertyDefinition, QName matchingRule, ItemPath rightSidePath, ItemDefinition rightSideDefinition) { - EqualFilter filter = new EqualFilter(propertyPath, propertyDefinition, matchingRule, rightSidePath, rightSideDefinition); - return filter; - } - public static EqualFilter createNullEqual(ItemPath itemPath, PrismPropertyDefinition propertyDef, QName matchingRule){ return new EqualFilter(itemPath, propertyDef, matchingRule, (List) null, null); diff --git a/infra/prism/src/test/java/com/evolveum/midpoint/prism/query/TestQueryBuilder.java b/infra/prism/src/test/java/com/evolveum/midpoint/prism/query/TestQueryBuilder.java index 4fa7789cb64..2ffdefd9b87 100644 --- a/infra/prism/src/test/java/com/evolveum/midpoint/prism/query/TestQueryBuilder.java +++ b/infra/prism/src/test/java/com/evolveum/midpoint/prism/query/TestQueryBuilder.java @@ -486,11 +486,11 @@ public void test300EqualItem() throws Exception { ObjectQuery actual = QueryBuilder.queryFor(UserType.class, getPrismContext()) .item(UserType.F_LOCALITY).eq().item(UserType.F_NAME) .build(); + PrismContainerDefinition userPcd = getPrismContext().getSchemaRegistry().findContainerDefinitionByCompileTimeClass(UserType.class); ObjectQuery expected = ObjectQuery.createObjectQuery( EqualFilter.createEqual( new ItemPath(UserType.F_LOCALITY), - UserType.class, - getPrismContext(), + userPcd.findPropertyDefinition(UserType.F_LOCALITY), null, new ItemPath(UserType.F_NAME), null diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/expr/MidpointFunctionsImpl.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/expr/MidpointFunctionsImpl.java index bcc4666c8cc..aac37de5f1d 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/expr/MidpointFunctionsImpl.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/expr/MidpointFunctionsImpl.java @@ -506,12 +506,11 @@ private Integer countAccounts(ResourceType resourceType, QName attributeName RefinedResourceSchema rSchema = RefinedResourceSchema.getRefinedSchema(resourceType); RefinedObjectClassDefinition rAccountDef = rSchema.getDefaultRefinedDefinition(ShadowKindType.ACCOUNT); RefinedAttributeDefinition attrDef = rAccountDef.findAttributeDefinition(attributeName); - EqualFilter idFilter = EqualFilter.createEqual(new ItemPath(ShadowType.F_ATTRIBUTES, attrDef.getName()), attrDef, attributeValue); - EqualFilter ocFilter = EqualFilter.createEqual(ShadowType.F_OBJECT_CLASS, ShadowType.class, prismContext, null, - rAccountDef.getObjectClassDefinition().getTypeName()); - RefFilter resourceRefFilter = RefFilter.createReferenceEqual(ShadowType.F_RESOURCE_REF, ShadowType.class, resourceType); - AndFilter filter = AndFilter.createAnd(idFilter, ocFilter, resourceRefFilter); - ObjectQuery query = ObjectQuery.createObjectQuery(filter); + ObjectQuery query = QueryBuilder.queryFor(ShadowType.class, prismContext) + .itemWithDef(attrDef, ShadowType.F_ATTRIBUTES, attrDef.getName()).eq(attributeValue) + .and().item(ShadowType.F_OBJECT_CLASS).eq(rAccountDef.getObjectClassDefinition().getTypeName()) + .and().item(ShadowType.F_RESOURCE_REF).ref(resourceType.getOid()) + .build(); return modelObjectResolver.countObjects(ShadowType.class, query, null, task, result); } @@ -606,13 +605,14 @@ private boolean isUniqueAccountValue(ResourceType resourceType, final Shadow RefinedResourceSchema rSchema = RefinedResourceSchema.getRefinedSchema(resourceType); RefinedObjectClassDefinition rAccountDef = rSchema.getDefaultRefinedDefinition(ShadowKindType.ACCOUNT); RefinedAttributeDefinition attrDef = rAccountDef.findAttributeDefinition(attributeName); - EqualFilter idFilter = EqualFilter.createEqual(new ItemPath(ShadowType.F_ATTRIBUTES, attrDef.getName()), attrDef, attributeValue); - EqualFilter ocFilter = EqualFilter.createEqual(ShadowType.F_OBJECT_CLASS, ShadowType.class, prismContext, - null, rAccountDef.getObjectClassDefinition().getTypeName()); - RefFilter resourceRefFilter = RefFilter.createReferenceEqual(ShadowType.F_RESOURCE_REF, ShadowType.class, resourceType); - AndFilter filter = AndFilter.createAnd(idFilter, ocFilter, resourceRefFilter); - ObjectQuery query = ObjectQuery.createObjectQuery(filter); - LOGGER.trace("Determining uniqueness of attribute {} using query:\n{}", attributeName, query.debugDump()); + ObjectQuery query = QueryBuilder.queryFor(ShadowType.class, prismContext) + .itemWithDef(attrDef, ShadowType.F_ATTRIBUTES, attrDef.getName()).eq(attributeValue) + .and().item(ShadowType.F_OBJECT_CLASS).eq(rAccountDef.getObjectClassDefinition().getTypeName()) + .and().item(ShadowType.F_RESOURCE_REF).ref(resourceType.getOid()) + .build(); + if (LOGGER.isTraceEnabled()) { + LOGGER.trace("Determining uniqueness of attribute {} using query:\n{}", attributeName, query.debugDump()); + } final Holder isUniqueHolder = new Holder(true); ResultHandler handler = new ResultHandler() { diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestStrangeCases.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestStrangeCases.java index 712afde1139..14386f4293c 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestStrangeCases.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestStrangeCases.java @@ -36,6 +36,7 @@ import javax.xml.datatype.XMLGregorianCalendar; import javax.xml.namespace.QName; +import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import org.apache.commons.io.IOUtils; import org.apache.commons.lang.StringUtils; import org.springframework.test.annotation.DirtiesContext; @@ -706,19 +707,17 @@ private void searchDeGhoulash(String testName, QName propName, T propValue) assumeAssignmentPolicy(AssignmentPolicyEnforcementType.FULL); // Simple query - ObjectFilter filter = EqualFilter.createEqual(new ItemPath(UserType.F_EXTENSION, propName), UserType.class, prismContext, - propValue); - ObjectQuery query = new ObjectQuery(); - query.setFilter(filter); + ObjectQuery query = QueryBuilder.queryFor(UserType.class, prismContext) + .item(UserType.F_EXTENSION, propName).eq(propValue) + .build(); // WHEN, THEN searchDeGhoulash(testName, query, task, result); // Complex query, combine with a name. This results in join down in the database - filter = AndFilter.createAnd( - EqualFilter.createEqual(UserType.F_NAME, UserType.class, prismContext, null, USER_DEGHOULASH_NAME), - EqualFilter.createEqual(new ItemPath(UserType.F_EXTENSION, propName), UserType.class, prismContext, propValue) - ); - query.setFilter(filter); + query = QueryBuilder.queryFor(UserType.class, prismContext) + .item(UserType.F_NAME).eq(USER_DEGHOULASH_NAME) + .and().item(UserType.F_EXTENSION, propName).eq(propValue) + .build(); // WHEN, THEN searchDeGhoulash(testName, query, task, result); } diff --git a/model/model-test/src/main/java/com/evolveum/midpoint/model/test/AbstractModelIntegrationTest.java b/model/model-test/src/main/java/com/evolveum/midpoint/model/test/AbstractModelIntegrationTest.java index d25e03cbcaf..7a08155d21a 100644 --- a/model/model-test/src/main/java/com/evolveum/midpoint/model/test/AbstractModelIntegrationTest.java +++ b/model/model-test/src/main/java/com/evolveum/midpoint/model/test/AbstractModelIntegrationTest.java @@ -64,6 +64,7 @@ import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.prism.query.OrgFilter; import com.evolveum.midpoint.prism.query.RefFilter; +import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import com.evolveum.midpoint.prism.util.PrismAsserts; import com.evolveum.midpoint.prism.util.PrismTestUtil; import com.evolveum.midpoint.prism.xml.XmlTypeConverter; @@ -1237,13 +1238,11 @@ protected ObjectQuery createAccountShadowQuery(String username, PrismObject String getSingleLinkOid(PrismObject focus) { diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ConstraintsChecker.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ConstraintsChecker.java index 951cb091bc3..cacd6e83fbd 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ConstraintsChecker.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ConstraintsChecker.java @@ -28,6 +28,7 @@ import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.prism.query.OrFilter; import com.evolveum.midpoint.prism.query.RefFilter; +import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import com.evolveum.midpoint.provisioning.api.ConstraintViolationConfirmer; import com.evolveum.midpoint.provisioning.api.ConstraintsCheckingResult; import com.evolveum.midpoint.provisioning.api.ProvisioningService; @@ -165,18 +166,17 @@ private boolean checkAttributeUniqueness(PrismProperty identifier, RefinedObject throw new SchemaException("Empty identifier "+identifier+" while checking uniqueness of "+oid+" ("+resourceType+")"); } - OrFilter isNotDead = OrFilter.createOr( - EqualFilter.createEqual(ShadowType.F_DEAD, ShadowType.class, prismContext, false), - EqualFilter.createEqual(ShadowType.F_DEAD, ShadowType.class, prismContext, null)); //TODO: set matching rule instead of null - ObjectQuery query = ObjectQuery.createObjectQuery( - AndFilter.createAnd( - RefFilter.createReferenceEqual(ShadowType.F_RESOURCE_REF, ShadowType.class, prismContext, resourceType.getOid()), - EqualFilter.createEqual(ShadowType.F_OBJECT_CLASS, ShadowType.class, prismContext, accountDefinition.getTypeName()), - EqualFilter.createEqual(new ItemPath(ShadowType.F_ATTRIBUTES, identifier.getDefinition().getName()), identifier.getDefinition(), - PrismPropertyValue.cloneCollection(identifierValues)), - isNotDead)); - + ObjectQuery query = QueryBuilder.queryFor(ShadowType.class, prismContext) + .itemWithDef(identifier.getDefinition(), ShadowType.F_ATTRIBUTES, identifier.getDefinition().getName()) + .eq(PrismPropertyValue.cloneCollection(identifierValues)) + .and().item(ShadowType.F_OBJECT_CLASS).eq(accountDefinition.getObjectClassDefinition().getTypeName()) + .and().item(ShadowType.F_RESOURCE_REF).ref(resourceType.getOid()) + .and().block() + .item(ShadowType.F_DEAD).eq(false) + .or().item(ShadowType.F_DEAD).isNull() + .endBlock() + .build(); boolean unique = checkUniqueness(oid, identifier, query, task, result); return unique; } diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowManager.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowManager.java index aff1a1caac5..4662d06c30c 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowManager.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowManager.java @@ -25,6 +25,7 @@ import javax.xml.namespace.QName; import com.evolveum.midpoint.prism.delta.builder.DeltaBuilder; +import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import com.evolveum.midpoint.provisioning.util.ProvisioningUtil; import com.evolveum.midpoint.schema.SchemaConstantsGenerated; import com.evolveum.midpoint.xml.ns._public.common.common_3.ActivationType; @@ -321,7 +322,7 @@ private List> lookupShadowsBySecondaryIdentifiers( return null; } - List secondaryEquals = new ArrayList<>(); + List secondaryEquals = new ArrayList<>(); for (ResourceAttribute secondaryIdentifier : secondaryIdentifiers) { // There may be identifiers that come from associations and they will have parent set to association/identifiers // For the search to succeed we need all attribute to have "attributes" parent path. @@ -361,10 +362,12 @@ private void checkConsistency(PrismObject shadow) { ProvisioningUtil.checkShadowActivationConsistency(shadow); } - private EqualFilter createAttributeEqualFilter(ProvisioningContext ctx, + private ObjectFilter createAttributeEqualFilter(ProvisioningContext ctx, ResourceAttribute secondaryIdentifier) throws SchemaException, ConfigurationException, ObjectNotFoundException, CommunicationException { - return EqualFilter.createEqual(secondaryIdentifier.getPath(), secondaryIdentifier.getDefinition(), - null, getNormalizedValue(secondaryIdentifier, ctx.getObjectClassDefinition())); + return QueryBuilder.queryFor(ShadowType.class, prismContext) + .item(secondaryIdentifier.getPath(), secondaryIdentifier.getDefinition()) + .eq(getNormalizedValue(secondaryIdentifier, ctx.getObjectClassDefinition())) + .buildFilter(); } private List> getNormalizedValue(PrismProperty attr, RefinedObjectClassDefinition rObjClassDef) throws SchemaException { @@ -618,10 +621,10 @@ private ObjectQuery createSearchShadowQuery(ProvisioningContext ctx, Collection< } String normalizedIdentifierValue = (String) getNormalizedAttributeValue(identifierValue, rAttrDef); - //new ItemPath(ShadowType.F_ATTRIBUTES) PrismPropertyDefinition def = (PrismPropertyDefinition) identifier.getDefinition(); - EqualFilter filter = EqualFilter.createEqual(new ItemPath(ShadowType.F_ATTRIBUTES, def.getName()), - def, new PrismPropertyValue<>(normalizedIdentifierValue)); + ObjectFilter filter = QueryBuilder.queryFor(ShadowType.class, prismContext) + .itemWithDef(def, ShadowType.F_ATTRIBUTES, def.getName()).eq(normalizedIdentifierValue) + .buildFilter(); conditions.add(filter); } @@ -667,21 +670,17 @@ private ObjectQuery createSearchShadowQuery(ProvisioningContext ctx, PrismObject } // We have all the data, we can construct the filter now - ObjectFilter filter = null; try { // TODO TODO TODO TODO: set matching rule instead of null PrismPropertyDefinition def = identifier.getDefinition(); - filter = AndFilter.createAnd( - EqualFilter.createEqual(new ItemPath(ShadowType.F_OBJECT_CLASS), resourceShadow.findProperty(ShadowType.F_OBJECT_CLASS)), - RefFilter.createReferenceEqual(ShadowType.F_RESOURCE_REF, ShadowType.class, ctx.getResource()), - EqualFilter.createEqual(new ItemPath(ShadowType.F_ATTRIBUTES, def.getName()), def, getNormalizedValue(identifier, ctx.getObjectClassDefinition()))); + return QueryBuilder.queryFor(ShadowType.class, prismContext) + .itemWithDef(def, ShadowType.F_ATTRIBUTES, def.getName()).eq(getNormalizedValue(identifier, ctx.getObjectClassDefinition())) + .and().item(ShadowType.F_OBJECT_CLASS).eq(resourceShadow.getPropertyRealValue(ShadowType.F_OBJECT_CLASS, QName.class)) + .and().item(ShadowType.F_RESOURCE_REF).ref(ctx.getResourceOid()) + .build(); } catch (SchemaException e) { throw new SchemaException("Schema error while creating search filter: " + e.getMessage(), e); } - - ObjectQuery query = ObjectQuery.createObjectQuery(filter); - - return query; } public SearchResultMetadata searchObjectsIterativeRepository( diff --git a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/AbstractDummyTest.java b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/AbstractDummyTest.java index 5dba0d948af..6a3fe82f832 100644 --- a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/AbstractDummyTest.java +++ b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/AbstractDummyTest.java @@ -33,6 +33,7 @@ import com.evolveum.midpoint.prism.PrismContext; +import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import org.springframework.beans.factory.annotation.Autowired; import org.testng.AssertJUnit; import org.w3c.dom.Element; @@ -285,8 +286,9 @@ protected void checkConsistency(PrismObject object) throws LOGGER.info("item definition: {}", itemDef.debugDump()); //TODO: matching rule - EqualFilter equal = EqualFilter.createEqual(new ItemPath(ShadowType.F_ATTRIBUTES, itemDef.getName()), itemDef, getWillRepoIcfName()); - ObjectQuery query = ObjectQuery.createObjectQuery(equal); + ObjectQuery query = QueryBuilder.queryFor(ShadowType.class, prismContext) + .itemWithDef(itemDef, ShadowType.F_ATTRIBUTES, itemDef.getName()).eq(getWillRepoIcfName()) + .build(); System.out.println("Looking for shadows of \"" + getWillRepoIcfName() + "\" with filter " + query.debugDump()); diff --git a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/TestDummy.java b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/TestDummy.java index 1e80a42c8ac..7a93b4e8b63 100644 --- a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/TestDummy.java +++ b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/TestDummy.java @@ -2167,8 +2167,10 @@ public void test151SearchDisabledAccounts() throws Exception { OperationResult result = task.getResult(); ObjectQuery query = ObjectQueryUtil.createResourceAndObjectClassQuery(RESOURCE_DUMMY_OID, ProvisioningTestUtil.getDefaultAccountObjectClass(resourceType), prismContext); - ObjectQueryUtil.filterAnd(query.getFilter(), - EqualFilter.createEqual(new ItemPath(ShadowType.F_ACTIVATION, ActivationType.F_ADMINISTRATIVE_STATUS), getShadowDefinition(), ActivationStatusType.DISABLED)); + ObjectQueryUtil.filterAnd(query.getFilter(), + QueryBuilder.queryFor(ShadowType.class, prismContext) + .item(ShadowType.F_ACTIVATION, ActivationType.F_ADMINISTRATIVE_STATUS).eq(ActivationStatusType.DISABLED) + .buildFilter()); syncServiceMock.reset(); @@ -2289,9 +2291,11 @@ public void test155SearchDisabledAccounts() throws Exception { OperationResult result = task.getResult(); ObjectQuery query = ObjectQueryUtil.createResourceAndObjectClassQuery(RESOURCE_DUMMY_OID, ProvisioningTestUtil.getDefaultAccountObjectClass(resourceType), prismContext); - ObjectQueryUtil.filterAnd(query.getFilter(), - EqualFilter.createEqual(new ItemPath(ShadowType.F_ACTIVATION, ActivationType.F_ADMINISTRATIVE_STATUS), getShadowDefinition(), ActivationStatusType.DISABLED)); - + ObjectQueryUtil.filterAnd(query.getFilter(), + QueryBuilder.queryFor(ShadowType.class, prismContext) + .item(ShadowType.F_ACTIVATION, ActivationType.F_ADMINISTRATIVE_STATUS).eq(ActivationStatusType.DISABLED) + .buildFilter()); + syncServiceMock.reset(); // WHEN @@ -2505,8 +2509,10 @@ public void test160SearchLockedAccounts() throws Exception { OperationResult result = task.getResult(); ObjectQuery query = ObjectQueryUtil.createResourceAndObjectClassQuery(RESOURCE_DUMMY_OID, ProvisioningTestUtil.getDefaultAccountObjectClass(resourceType), prismContext); - ObjectQueryUtil.filterAnd(query.getFilter(), - EqualFilter.createEqual(new ItemPath(ShadowType.F_ACTIVATION, ActivationType.F_LOCKOUT_STATUS), getShadowDefinition(), LockoutStatusType.LOCKED)); + ObjectQueryUtil.filterAnd(query.getFilter(), + QueryBuilder.queryFor(ShadowType.class, prismContext) + .item(ShadowType.F_ACTIVATION, ActivationType.F_LOCKOUT_STATUS).eq(LockoutStatusType.LOCKED) + .buildFilter()); syncServiceMock.reset(); @@ -2620,8 +2626,10 @@ public void test163SearchLockedAccounts() throws Exception { OperationResult result = task.getResult(); ObjectQuery query = ObjectQueryUtil.createResourceAndObjectClassQuery(RESOURCE_DUMMY_OID, ProvisioningTestUtil.getDefaultAccountObjectClass(resourceType), prismContext); - ObjectQueryUtil.filterAnd(query.getFilter(), - EqualFilter.createEqual(new ItemPath(ShadowType.F_ACTIVATION, ActivationType.F_LOCKOUT_STATUS), getShadowDefinition(), LockoutStatusType.LOCKED)); + ObjectQueryUtil.filterAnd(query.getFilter(), + QueryBuilder.queryFor(ShadowType.class, prismContext) + .item(ShadowType.F_ACTIVATION, ActivationType.F_LOCKOUT_STATUS).eq(LockoutStatusType.LOCKED) + .buildFilter()); syncServiceMock.reset(); @@ -2849,9 +2857,9 @@ private ObjectQuery createOnOffQuery() throws SchemaException { ResourceAttributeDefinition attrDef = objectClassDef.findAttributeDefinition( dummyResourceCtl.getAttributeQName(DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_SHIP_NAME)); - ObjectFilter attrFilter = EqualFilter.createEqual(new ItemPath(ShadowType.F_ATTRIBUTES, attrDef.getName()), attrDef, - "Sea Monkey"); - + ObjectFilter attrFilter = QueryBuilder.queryFor(ShadowType.class, prismContext) + .itemWithDef(attrDef, ShadowType.F_ATTRIBUTES, attrDef.getName()).eq("Sea Monkey") + .buildFilter(); ObjectFilter deadFilter = EqualFilter.createEqual(ShadowType.F_DEAD, ShadowType.class, prismContext, Boolean.TRUE); ObjectFilter filter = AndFilter.createAnd(query.getFilter(), attrFilter, deadFilter); diff --git a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/QueryInterpreter2Test.java b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/QueryInterpreter2Test.java index 350459107f8..6e79e0e9673 100644 --- a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/QueryInterpreter2Test.java +++ b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/QueryInterpreter2Test.java @@ -1212,11 +1212,9 @@ public void test162QueryTriggerBeforeAfter() throws Exception { public void test170QueryAssignmentActivationAdministrativeStatus() throws Exception { Session session = open(); try { - SchemaRegistry registry = prismContext.getSchemaRegistry(); - PrismObjectDefinition objectDef = registry.findObjectDefinitionByCompileTimeClass(UserType.class); - ItemPath activationPath = new ItemPath(F_ASSIGNMENT, AssignmentType.F_ACTIVATION, ActivationType.F_ADMINISTRATIVE_STATUS); - ObjectFilter filter = EqualFilter.createEqual(activationPath, objectDef, ActivationStatusType.ENABLED); - ObjectQuery query = ObjectQuery.createObjectQuery(filter); + ObjectQuery query = QueryBuilder.queryFor(UserType.class, prismContext) + .item(F_ASSIGNMENT, AssignmentType.F_ACTIVATION, ActivationType.F_ADMINISTRATIVE_STATUS).eq(ActivationStatusType.ENABLED) + .build(); String real = getInterpretedQuery2(session, UserType.class, query); String expected = "select\n" + @@ -1250,11 +1248,10 @@ public void test180QueryInducementActivationAdministrativeStatus() throws Except * a.assignmentOwner = RAssignmentOwner.ABSTRACT_ROLE and <--- this differentiates inducements from assignments * a.activation.administrativeStatus = RActivationStatus.ENABLED */ - SchemaRegistry registry = prismContext.getSchemaRegistry(); - PrismObjectDefinition objectDef = registry.findObjectDefinitionByCompileTimeClass(RoleType.class); - ItemPath activationPath = new ItemPath(RoleType.F_INDUCEMENT, AssignmentType.F_ACTIVATION, ActivationType.F_ADMINISTRATIVE_STATUS); - ObjectFilter filter = EqualFilter.createEqual(activationPath, objectDef, ActivationStatusType.ENABLED); - ObjectQuery query = ObjectQuery.createObjectQuery(filter); + ObjectQuery query = QueryBuilder.queryFor(UserType.class, prismContext) + .item(RoleType.F_INDUCEMENT, AssignmentType.F_ACTIVATION, ActivationType.F_ADMINISTRATIVE_STATUS).eq(ActivationStatusType.ENABLED) + .build(); + String real = getInterpretedQuery2(session, RoleType.class, query); String expected = "select\n" + @@ -1286,18 +1283,10 @@ public void test182QueryInducementAndAssignmentActivationAdministrativeStatus() * ### Role: Or (Equal (assignment/activation/administrativeStatus, RActivationStatus.ENABLED), * Equal (inducement/activation/administrativeStatus, RActivationStatus.ENABLED)) */ - SchemaRegistry registry = prismContext.getSchemaRegistry(); - PrismObjectDefinition objectDef = registry.findObjectDefinitionByCompileTimeClass(RoleType.class); - - //filter1 - ItemPath activationPath1 = new ItemPath(F_ASSIGNMENT, AssignmentType.F_ACTIVATION, ActivationType.F_ADMINISTRATIVE_STATUS); - ObjectFilter filter1 = EqualFilter.createEqual(activationPath1, objectDef, ActivationStatusType.ENABLED); - - //filter2 - ItemPath activationPath2 = new ItemPath(RoleType.F_INDUCEMENT, AssignmentType.F_ACTIVATION, ActivationType.F_ADMINISTRATIVE_STATUS); - ObjectFilter filter2 = EqualFilter.createEqual(activationPath2, objectDef, ActivationStatusType.ENABLED); - - ObjectQuery query = ObjectQuery.createObjectQuery(OrFilter.createOr(filter1, filter2)); + ObjectQuery query = QueryBuilder.queryFor(RoleType.class, prismContext) + .item(F_ASSIGNMENT, AssignmentType.F_ACTIVATION, ActivationType.F_ADMINISTRATIVE_STATUS).eq(ActivationStatusType.ENABLED) + .or().item(RoleType.F_INDUCEMENT, AssignmentType.F_ACTIVATION, ActivationType.F_ADMINISTRATIVE_STATUS).eq(ActivationStatusType.ENABLED) + .build(); String real = getInterpretedQuery2(session, RoleType.class, query); String expected = "select\n" + @@ -1337,14 +1326,10 @@ public void test190QueryUserByActivationDouble() throws Exception { * ==> select u from RUser u where u.activation.administrativeStatus = RActivationStatus.ENABLED and * u.activation.validFrom = ... */ - SchemaRegistry registry = prismContext.getSchemaRegistry(); - PrismObjectDefinition objectDef = registry.findObjectDefinitionByCompileTimeClass(UserType.class); - ObjectFilter filter1 = EqualFilter.createEqual(new ItemPath(AssignmentType.F_ACTIVATION, ActivationType.F_ADMINISTRATIVE_STATUS), objectDef, - ActivationStatusType.ENABLED); - ObjectFilter filter2 = EqualFilter.createEqual(new ItemPath(AssignmentType.F_ACTIVATION, ActivationType.F_VALID_FROM), objectDef, - XmlTypeConverter.createXMLGregorianCalendar(NOW.getTime())); - - ObjectQuery query = ObjectQuery.createObjectQuery(AndFilter.createAnd(filter1, filter2)); + ObjectQuery query = QueryBuilder.queryFor(UserType.class, prismContext) + .item(AssignmentType.F_ACTIVATION, ActivationType.F_ADMINISTRATIVE_STATUS).eq(ActivationStatusType.ENABLED) + .or().item(AssignmentType.F_ACTIVATION, ActivationType.F_VALID_FROM).eq(XmlTypeConverter.createXMLGregorianCalendar(NOW.getTime())) + .build(); String real = getInterpretedQuery2(session, UserType.class, query); String expected = "select\n" + @@ -3278,14 +3263,9 @@ public void test910PreferredLanguageEqualsCostCenter() throws Exception { /* * ### User: preferredLanguage = costCenter */ - ObjectQuery query = ObjectQuery.createObjectQuery( - EqualFilter.createEqual( - new ItemPath(UserType.F_PREFERRED_LANGUAGE), - UserType.class, - prismContext, - null, - new ItemPath(UserType.F_COST_CENTER))); - + ObjectQuery query = QueryBuilder.queryFor(UserType.class, prismContext) + .item(UserType.F_PREFERRED_LANGUAGE).eq(UserType.F_COST_CENTER) + .build(); String real = getInterpretedQuery2(session, UserType.class, query); String expected = "select\n" + " u.fullObject,\n" + @@ -3319,14 +3299,9 @@ public void test915OrganizationEqualsCostCenter() throws Exception { /* * ### User: organization = costCenter */ - ObjectQuery query = ObjectQuery.createObjectQuery( - EqualFilter.createEqual( - new ItemPath(UserType.F_ORGANIZATION), - UserType.class, - prismContext, - null, - new ItemPath(UserType.F_COST_CENTER))); - + ObjectQuery query = QueryBuilder.queryFor(UserType.class, prismContext) + .item(UserType.F_ORGANIZATION).eq(UserType.F_COST_CENTER) + .build(); String real = getInterpretedQuery2(session, UserType.class, query); // assertEqualsIgnoreWhitespace(expected, real); } finally { diff --git a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/QueryInterpreterTest.java b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/QueryInterpreterTest.java deleted file mode 100644 index 69b56d4b07c..00000000000 --- a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/QueryInterpreterTest.java +++ /dev/null @@ -1,1864 +0,0 @@ -/* - * Copyright (c) 2010-2013 Evolveum - * - * 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 com.evolveum.midpoint.repo.sql; - -import com.evolveum.midpoint.prism.*; -import com.evolveum.midpoint.prism.match.PolyStringNormMatchingRule; -import com.evolveum.midpoint.prism.match.PolyStringOrigMatchingRule; -import com.evolveum.midpoint.prism.path.ItemPath; -import com.evolveum.midpoint.prism.polystring.PolyString; -import com.evolveum.midpoint.prism.query.*; -import com.evolveum.midpoint.prism.query.builder.QueryBuilder; -import com.evolveum.midpoint.prism.schema.SchemaRegistry; -import com.evolveum.midpoint.prism.util.PrismTestUtil; -import com.evolveum.midpoint.prism.xml.XmlTypeConverter; -import com.evolveum.midpoint.repo.sql.data.common.*; -import com.evolveum.midpoint.repo.sql.data.common.enums.RActivationStatus; -import com.evolveum.midpoint.repo.sql.data.common.enums.RTaskExecutionStatus; -import com.evolveum.midpoint.repo.sql.data.common.other.RAssignmentOwner; -import com.evolveum.midpoint.repo.sql.data.common.other.RObjectType; -import com.evolveum.midpoint.repo.sql.data.common.type.RAssignmentExtensionType; -import com.evolveum.midpoint.repo.sql.data.common.type.RObjectExtensionType; -import com.evolveum.midpoint.repo.sql.query.QueryException; -import com.evolveum.midpoint.repo.sql.type.XMLGregorianCalendarType; -import com.evolveum.midpoint.repo.sql.util.HibernateToSqlTranslator; -import com.evolveum.midpoint.schema.MidPointPrismContextFactory; -import com.evolveum.midpoint.schema.constants.MidPointConstants; -import com.evolveum.midpoint.schema.result.OperationResult; -import com.evolveum.midpoint.util.DOMUtil; -import com.evolveum.midpoint.util.PrettyPrinter; -import com.evolveum.midpoint.util.QNameUtil; -import com.evolveum.midpoint.util.exception.SchemaException; -import com.evolveum.midpoint.util.logging.Trace; -import com.evolveum.midpoint.util.logging.TraceManager; -import com.evolveum.midpoint.xml.ns._public.common.common_3.*; - -import org.hibernate.Criteria; -import org.hibernate.Session; -import org.hibernate.criterion.*; -import org.hibernate.sql.JoinType; -import org.springframework.test.annotation.DirtiesContext; -import org.springframework.test.context.ContextConfiguration; -import org.testng.AssertJUnit; -import org.testng.annotations.BeforeClass; -import org.testng.annotations.BeforeSuite; -import org.testng.annotations.Test; -import org.xml.sax.SAXException; - -import javax.xml.datatype.XMLGregorianCalendar; -import javax.xml.namespace.QName; - -import java.io.File; -import java.io.IOException; -import java.sql.Timestamp; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Date; -import java.util.List; - -/** - * @author lazyman - */ -@ContextConfiguration(locations = {"../../../../../ctx-test.xml"}) -@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS) -public class QueryInterpreterTest extends BaseSQLRepoTest { - - private static final Trace LOGGER = TraceManager.getTrace(QueryInterpreterTest.class); - private static final File TEST_DIR = new File("./src/test/resources/query"); - - private static final QName SKIP_AUTOGENERATION = new QName("http://example.com/p", "skipAutogeneration"); - - @BeforeSuite - public void setup() throws SchemaException, SAXException, IOException { - PrettyPrinter.setDefaultNamespacePrefix(MidPointConstants.NS_MIDPOINT_PUBLIC_PREFIX); - PrismTestUtil.resetPrismContext(MidPointPrismContextFactory.FACTORY); - } - - @BeforeClass - public void beforeClass() throws Exception { - super.beforeClass(); - - PrismTestUtil.resetPrismContext(MidPointPrismContextFactory.FACTORY); - - List> objects = prismContext.parserFor( - new File(FOLDER_BASIC, "objects.xml")).parseObjects(); - OperationResult result = new OperationResult("add objects"); - for (PrismObject object : objects) { - repositoryService.addObject(object, null, result); - } - - result.recomputeStatus(); - AssertJUnit.assertTrue(result.isSuccess()); - } - - @Test - public void queryOrganizationNorm() throws Exception { - Session session = open(); - - try { - /* - * ### user: Equal (organization, "asdf", PolyStringNorm) - * ==> from RUser u left join u.organization o where o.norm = 'asdf' - */ - ObjectFilter filter = EqualFilter.createEqual(UserType.F_ORGANIZATION, UserType.class, prismContext, - PolyStringNormMatchingRule.NAME, new PolyString("asdf", "asdf")); - ObjectQuery query = ObjectQuery.createObjectQuery(filter); - - Criteria main = session.createCriteria(RUser.class, "u"); - ProjectionList projections = Projections.projectionList(); - addFullObjectProjectionList("u", projections, false); - main.setProjection(projections); - - Criteria o = main.createCriteria("organization", "o", JoinType.LEFT_OUTER_JOIN); - - o.add(Restrictions.eq("o.norm", "asdf")); - - String expected = HibernateToSqlTranslator.toSql(main); - String real = getInterpretedQuery(session, UserType.class, query); - - LOGGER.info("exp. query>\n{}\nreal query>\n{}", new Object[]{expected, real}); - AssertJUnit.assertEquals(expected, real); - } finally { - close(session); - } - } - - @Test - public void queryOrganizationOrig() throws Exception { - Session session = open(); - try { - /* - * ### user: Equal (organization, "asdf", PolyStringOrig) - * ==> from RUser u left join u.organization o where o.orig = 'asdf' - */ - ObjectFilter filter = EqualFilter.createEqual(UserType.F_ORGANIZATION, UserType.class, prismContext, - PolyStringOrigMatchingRule.NAME, new PolyString("asdf", "asdf")); - ObjectQuery query = ObjectQuery.createObjectQuery(filter); - - Criteria main = session.createCriteria(RUser.class, "u"); - ProjectionList projections = Projections.projectionList(); - addFullObjectProjectionList("u", projections, false); - main.setProjection(projections); - - Criteria o = main.createCriteria("organization", "o", JoinType.LEFT_OUTER_JOIN); - - o.add(Restrictions.eq("o.orig", "asdf")); - - String expected = HibernateToSqlTranslator.toSql(main); - String real = getInterpretedQuery(session, UserType.class, query); - - LOGGER.info("exp. query>\n{}\nreal query>\n{}", new Object[]{expected, real}); - AssertJUnit.assertEquals(expected, real); - } finally { - close(session); - } - } - - @Test - public void queryOrganizationStrict() throws Exception { - Session session = open(); - try { - /* - * ### user: Equal (organization, "asdf") - * ==> from RUser u left join u.organization o where o.orig = 'asdf' and o.norm = 'asdf' - */ - - ObjectFilter filter = EqualFilter.createEqual(UserType.F_ORGANIZATION, UserType.class, prismContext, - null, new PolyString("asdf", "asdf")); - ObjectQuery query = ObjectQuery.createObjectQuery(filter); - - Criteria main = session.createCriteria(RUser.class, "u"); - ProjectionList projections = Projections.projectionList(); - addFullObjectProjectionList("u", projections, false); - main.setProjection(projections); - - Criteria o = main.createCriteria("organization", "o", JoinType.LEFT_OUTER_JOIN); - - o.add(Restrictions.conjunction() - .add(Restrictions.eq("o.orig", "asdf")) - .add(Restrictions.eq("o.norm", "asdf"))); - - String expected = HibernateToSqlTranslator.toSql(main); - String real = getInterpretedQuery(session, UserType.class, query); - - LOGGER.info("exp. query>\n{}\nreal query>\n{}", new Object[]{expected, real}); - AssertJUnit.assertEquals(expected, real); - } finally { - close(session); - } - } - - @Test - public void queryDependent() throws Exception { - Session session = open(); - - try { - /* - * ### task: Equal (dependent, "123456") - * ==> from RTask t left join t.dependent d where d = '123456' (why "d.elements" ????) - */ - Criteria main = session.createCriteria(RTask.class, "t"); - Criteria d = main.createCriteria("dependent", "d", JoinType.LEFT_OUTER_JOIN); - d.add(Restrictions.eq("d.elements", "123456")); - ProjectionList projections = Projections.projectionList(); - addFullObjectProjectionList("t", projections, false); - main.setProjection(projections); - - String expected = HibernateToSqlTranslator.toSql(main); - - ObjectFilter filter = EqualFilter.createEqual(TaskType.F_DEPENDENT, TaskType.class, prismContext, null, "123456"); - ObjectQuery query = ObjectQuery.createObjectQuery(filter); - String real = getInterpretedQuery(session, TaskType.class, query); - - LOGGER.info("exp. query>\n{}\nreal query>\n{}", new Object[]{expected, real}); - AssertJUnit.assertEquals(expected, real); - } finally { - close(session); - } - } - - @Test(expectedExceptions = QueryException.class) - public void queryClob() throws Exception { - Session session = open(); - - try { - ObjectFilter filter = EqualFilter.createEqual(UserType.F_DESCRIPTION, UserType.class, prismContext, - null, "aaa"); - ObjectQuery query = ObjectQuery.createObjectQuery(filter); - - //should throw exception, because description is lob and can't be queried - getInterpretedQuery(session, UserType.class, query); - } finally { - close(session); - } - } - - @Test - public void queryEnum() throws Exception { - Session session = open(); - try { - /* - * ### task: Equal (executionStatus, WAITING) - * ==> from RTask t where t.executionStatus = com.evolveum.midpoint.repo.sql.data.common.enums.RTaskExecutionStatus.WAITING - */ - Criteria main = session.createCriteria(RTask.class, "t"); - main.add(Restrictions.eq("executionStatus", RTaskExecutionStatus.WAITING)); - ProjectionList projections = Projections.projectionList(); - addFullObjectProjectionList("t", projections, false); - main.setProjection(projections); - - String expected = HibernateToSqlTranslator.toSql(main); - - ObjectFilter filter = EqualFilter.createEqual(TaskType.F_EXECUTION_STATUS, TaskType.class, prismContext, - null, TaskExecutionStatusType.WAITING); - ObjectQuery query = ObjectQuery.createObjectQuery(filter); - String real = getInterpretedQuery(session, TaskType.class, query); - - LOGGER.info("exp. query>\n{}\nreal query>\n{}", new Object[]{expected, real}); - AssertJUnit.assertEquals(expected, real); - } finally { - close(session); - } - } - - @Test - public void queryEnabled() throws Exception { - Session session = open(); - try { - /* - * ### task: Equal (activation/administrativeStatus, ENABLED) - * ==> from RUser u where u.activation.administrativeStatus = com.evolveum.midpoint.repo.sql.data.common.enums.RActivationStatus.ENABLED - */ - - Criteria main = session.createCriteria(RUser.class, "u"); - main.add(Restrictions.eq("activation.administrativeStatus", RActivationStatus.ENABLED)); - ProjectionList projections = Projections.projectionList(); - addFullObjectProjectionList("u", projections, false); - main.setProjection(projections); - - String expected = HibernateToSqlTranslator.toSql(main); - String real = getInterpretedQuery(session, UserType.class, - new File(TEST_DIR, "query-user-by-enabled.xml")); - - LOGGER.info("exp. query>\n{}\nreal query>\n{}", new Object[]{expected, real}); - AssertJUnit.assertEquals(expected, real); - } finally { - close(session); - } - } - - @Test - public void queryGenericLong() throws Exception { - Session session = open(); - try { - /* - * ### generic: And (Equal (name, "generic object", PolyStringNorm), - * Equal (c:extension/p:intType, 123)) - * ==> from RGenericObject g left join g.longs l where - * g.name.norm = 'generic object' and - * l.ownerType = com.evolveum.midpoint.repo.sql.data.common.type.RObjectExtensionType.EXTENSION and - * l.name = 'http://example.com/p#intType' and - * l.value = 123 - */ - Criteria main = session.createCriteria(RGenericObject.class, "g"); - - Criteria stringExt = main.createCriteria("longs", "l", JoinType.LEFT_OUTER_JOIN); - - //and - Criterion c1 = Restrictions.eq("name.norm", "generic object"); - //and - Conjunction c2 = Restrictions.conjunction(); - c2.add(Restrictions.eq("l.ownerType", RObjectExtensionType.EXTENSION)); - c2.add(Restrictions.eq("l.name", new QName("http://example.com/p", "intType"))); - c2.add(Restrictions.eq("l.value", 123L)); - - Conjunction conjunction = Restrictions.conjunction(); - conjunction.add(c1); - conjunction.add(c2); - main.add(conjunction); - ProjectionList projections = Projections.projectionList(); - addFullObjectProjectionList("g", projections, false); - main.setProjection(projections); - - String expected = HibernateToSqlTranslator.toSql(main); - String real = getInterpretedQuery(session, GenericObjectType.class, - new File(TEST_DIR, "query-and-generic.xml")); - - LOGGER.info("exp. query>\n{}\nreal query>\n{}", new Object[]{expected, real}); - AssertJUnit.assertEquals(expected, real); - } finally { - close(session); - } - } - - @Test - public void queryOrComposite() throws Exception { - Session session = open(); - try { - /* - * ### shadow: - * Or ( - * Equal (intent, "some account type"), - * Equal (attributes/f:foo, "foo value"), - * Equal (extension/p:stringType, "uid=test,dc=example,dc=com"), - * Ref (resourceRef, d0db5be9-cb93-401f-b6c1-86ffffe4cd5e)) - * - * ==> from RShadow r left join r.strings s1 where - * r.intent = 'some account type' or - * (s1.ownerType = RObjectExtensionType.ATTRIBUTES and s1.name = 'http://midpoint.evolveum.com/blabla#foo' and s1.value = 'foo value') or - * (s1.ownerType = RObjectExtensionType.EXTENSION and s1.name = 'http://example.com/p#stringType' and s1.value = 'uid=test,dc=example,dc=com') or - * (r.resourceRef.targetOid = 'd0db5be9-cb93-401f-b6c1-86ffffe4cd5e' and r.resourceRef.relation = '#' and r.resourceRef.type = '...#ResourceType') - * - * [If we used AND instead of OR, this SHOULD BE left join r.strings s1, left join r.strings s2] - */ - Criteria main = session.createCriteria(RShadow.class, "r"); - ProjectionList projections = Projections.projectionList(); - addFullObjectProjectionList("r", projections, false); - main.setProjection(projections); - - Criteria stringExt = main.createCriteria("strings", "s1", JoinType.LEFT_OUTER_JOIN); - - //or - Criterion c1 = Restrictions.eq("intent", "some account type"); - //or - Conjunction c2 = Restrictions.conjunction(); - c2.add(Restrictions.eq("s1.ownerType", RObjectExtensionType.ATTRIBUTES)); - c2.add(Restrictions.eq("s1.name", new QName("http://midpoint.evolveum.com/blabla", "foo"))); - c2.add(Restrictions.eq("s1.value", "foo value")); - //or - Conjunction c3 = Restrictions.conjunction(); - c3.add(Restrictions.eq("s1.ownerType", RObjectExtensionType.EXTENSION)); - c3.add(Restrictions.eq("s1.name", new QName("http://example.com/p", "stringType"))); - c3.add(Restrictions.eq("s1.value", "uid=test,dc=example,dc=com")); - //or - Conjunction c4 = Restrictions.conjunction(); - c4.add(Restrictions.eq("r.resourceRef.targetOid", "d0db5be9-cb93-401f-b6c1-86ffffe4cd5e")); - c4.add(Restrictions.eq("r.resourceRef.relation", "#")); - c4.add(Restrictions.eq("r.resourceRef.type", QNameUtil.qNameToUri(ResourceType.COMPLEX_TYPE))); - - Disjunction disjunction = Restrictions.disjunction(); - disjunction.add(c1); - disjunction.add(c2); - disjunction.add(c3); - disjunction.add(c4); - main.add(disjunction); - - String expected = HibernateToSqlTranslator.toSql(main); - String real = getInterpretedQuery(session, ShadowType.class, - new File(TEST_DIR, "query-or-composite.xml")); - - LOGGER.info("exp. query>\n{}\nreal query>\n{}", new Object[]{expected, real}); - AssertJUnit.assertEquals(expected, real); - } finally { - close(session); - } - } - - @Test - public void queryObjectByName() throws Exception { - Session session = open(); - - try { - /* - * ### object: Equal (name, "cpt. Jack Sparrow") - * Order by name, ASC - * - * ==> from RObject o where name.orig = 'cpt. Jack Sparrow' and name.norm = 'cpt jack sparrow' - * order by name.orig asc - */ - Criteria main = session.createCriteria(RObject.class, "o"); - main.add(Restrictions.and( - Restrictions.eq("name.orig", "cpt. Jack Sparrow"), - Restrictions.eq("name.norm", "cpt jack sparrow"))); - main.addOrder(Order.asc("name.orig")); - ProjectionList projections = Projections.projectionList(); - addFullObjectProjectionList("o", projections, false); - main.setProjection(projections); - String expected = HibernateToSqlTranslator.toSql(main); - - EqualFilter filter = EqualFilter.createEqual(ObjectType.F_NAME, ObjectType.class, prismContext, - null, new PolyString("cpt. Jack Sparrow", "cpt jack sparrow")); - - ObjectQuery query = ObjectQuery.createObjectQuery(filter); - query.setPaging(ObjectPaging.createPaging(null, null, ObjectType.F_NAME, OrderDirection.ASCENDING)); - - String real = getInterpretedQuery(session, ObjectType.class, query); - - LOGGER.info("exp. query>\n{}\nreal query>\n{}", new Object[]{expected, real}); - AssertJUnit.assertEquals(expected, real); - } finally { - close(session); - } - } - - @Test - public void queryUserByFullName() throws Exception { - Session session = open(); - - try { - Criteria main = session.createCriteria(RUser.class, "u"); - ProjectionList projections = Projections.projectionList(); - addFullObjectProjectionList("u", projections, false); - main.setProjection(projections); - - main.add(Restrictions.eq("fullName.norm", "cpt jack sparrow")); - String expected = HibernateToSqlTranslator.toSql(main); - - String real = getInterpretedQuery(session, UserType.class, - new File(TEST_DIR, "query-user-by-fullName.xml")); - - LOGGER.info("exp. query>\n{}\nreal query>\n{}", new Object[]{expected, real}); - AssertJUnit.assertEquals(expected, real); - } finally { - close(session); - } - } - - @Test - public void queryUserSubstringFullName() throws Exception { - Session session = open(); - - try { - Criteria main = session.createCriteria(RUser.class, "u"); - ProjectionList projections = Projections.projectionList(); - addFullObjectProjectionList("u", projections, false); - main.setProjection(projections); - - main.add(Restrictions.like("fullName.norm", "%cpt jack sparrow%").ignoreCase()); - String expected = HibernateToSqlTranslator.toSql(main); - - String real = getInterpretedQuery(session, UserType.class, - new File(TEST_DIR, "query-user-substring-fullName.xml")); - - LOGGER.info("exp. query>\n{}\nreal query>\n{}", new Object[]{expected, real}); - AssertJUnit.assertEquals(expected, real); - } finally { - close(session); - } - } - - @Test - public void queryUserByName() throws Exception { - Session session = open(); - - try { - Criteria main = session.createCriteria(RUser.class, "u"); - ProjectionList projections = Projections.projectionList(); - main.setProjection(projections); - addFullObjectProjectionList("u", projections, false); - - main.add(Restrictions.eq("name.norm", "some name identificator")); - String expected = HibernateToSqlTranslator.toSql(main); - - String real = getInterpretedQuery(session, UserType.class, - new File(TEST_DIR, "query-user-by-name.xml")); - - LOGGER.info("exp. query>\n{}\nreal query>\n{}", new Object[]{expected, real}); - AssertJUnit.assertEquals(expected, real); - } finally { - close(session); - } - } - - @Test - public void queryConnectorByType() throws Exception { - Session session = open(); - - try { - Criteria main = session.createCriteria(RConnector.class, "c"); - Criterion connectorType = Restrictions.conjunction().add( - Restrictions.eq("connectorType", "org.identityconnectors.ldap.LdapConnector")); - main.add(connectorType); - ProjectionList projections = Projections.projectionList(); - addFullObjectProjectionList("c", projections, false); - main.setProjection(projections); - - String expected = HibernateToSqlTranslator.toSql(main); - - String real = getInterpretedQuery(session, ConnectorType.class, - new File(TEST_DIR, "query-connector-by-type.xml")); - - LOGGER.info("exp. query>\n{}\nreal query>\n{}", new Object[]{expected, real}); - AssertJUnit.assertEquals(expected, real); - } finally { - close(session); - } - } - - @Test - public void queryAccountByAttributesAndResourceRef() throws Exception { - Session session = open(); - try { - Criteria main = session.createCriteria(RShadow.class, "r"); - - Criteria stringAttr = main.createCriteria("strings", "s1x", JoinType.LEFT_OUTER_JOIN); - - //and - Conjunction c1 = Restrictions.conjunction(); - c1.add(Restrictions.eq("r.resourceRef.targetOid", "aae7be60-df56-11df-8608-0002a5d5c51b")); - c1.add(Restrictions.eq("r.resourceRef.relation", "#")); - c1.add(Restrictions.eq("r.resourceRef.type", QNameUtil.qNameToUri(ResourceType.COMPLEX_TYPE))); - //and - Conjunction c2 = Restrictions.conjunction(); - c2.add(Restrictions.eq("s1x.ownerType", RObjectExtensionType.ATTRIBUTES)); - c2.add(Restrictions.eq("s1x.name", new QName("http://midpoint.evolveum.com/blabla", "foo"))); - c2.add(Restrictions.eq("s1x.value", "uid=jbond,ou=People,dc=example,dc=com")); - - Conjunction conjunction = Restrictions.conjunction(); - conjunction.add(c1); - conjunction.add(c2); - main.add(conjunction); - ProjectionList projections = Projections.projectionList(); - addFullObjectProjectionList("r", projections, false); - main.setProjection(projections); - - String expected = HibernateToSqlTranslator.toSql(main); - String real = getInterpretedQuery(session, ShadowType.class, - new File(TEST_DIR, "query-account-by-attributes-and-resource-ref.xml")); - - LOGGER.info("exp. query>\n{}\nreal query>\n{}", new Object[]{expected, real}); - AssertJUnit.assertEquals(expected, real); - } finally { - close(session); - } - } - - @Test - public void queryUserAccountRef() throws Exception { - Session session = open(); - try { - /* - * ### user: Ref (linkRef, 123) - * - * ==> select from RUser u left join u.linkRef l where - * l.targetOid = '123' and l.relation = '#' - */ - Criteria main = session.createCriteria(RUser.class, "u"); - ProjectionList projections = Projections.projectionList(); - addFullObjectProjectionList("u", projections, false); - main.setProjection(projections); - - Criteria refs = main.createCriteria("linkRef", "l", JoinType.LEFT_OUTER_JOIN); - Conjunction c = Restrictions.conjunction(); - c.add(Restrictions.eq("l.targetOid", "123")); - c.add(Restrictions.eq("l.relation", "#")); - refs.add(c); - - String expected = HibernateToSqlTranslator.toSql(main); - - RefFilter filter = RefFilter.createReferenceEqual(UserType.F_LINK_REF, UserType.class, prismContext, "123"); - String real = getInterpretedQuery(session, UserType.class, ObjectQuery.createObjectQuery(filter)); - - LOGGER.info("exp. query>\n{}\nreal query>\n{}", new Object[]{expected, real}); - AssertJUnit.assertEquals(expected, real); - } finally { - close(session); - } - } - - @Test - public void queryUserAssignmentTargetRef() throws Exception { - Session session = open(); - try { - /* - * ### user: Ref (assignment/targetRef, '123', RoleType) - * - * ==> select from RUser u left join u.assignments a where - * a.assignmentOwner = RAssignmentOwner.FOCUS and - * a.targetRef.targetOid = '123' and - * a.targetRef.relation = '#' and - * a.targetRef.type = RObjectType.ROLE - */ - Criteria main = session.createCriteria(RUser.class, "u"); - ProjectionList projections = Projections.projectionList(); - addFullObjectProjectionList("u", projections, false); - main.setProjection(projections); - - Criteria a = main.createCriteria("assignments", "a", JoinType.LEFT_OUTER_JOIN); - Conjunction c0 = Restrictions.conjunction(); - c0.add(Restrictions.eq("a.assignmentOwner", RAssignmentOwner.FOCUS)); - Conjunction c1 = Restrictions.conjunction(); - c1.add(Restrictions.eq("a.targetRef.targetOid", "123")); - c1.add(Restrictions.eq("a.targetRef.relation", "#")); - c1.add(Restrictions.eq("a.targetRef.type", RObjectType.ROLE)); - c0.add(c1); - a.add(c0); - - String expected = HibernateToSqlTranslator.toSql(main); - - ObjectReferenceType ort = new ObjectReferenceType(); - ort.setOid("123"); - ort.setType(RoleType.COMPLEX_TYPE); - RefFilter filter = RefFilter.createReferenceEqual( - new ItemPath(UserType.F_ASSIGNMENT, AssignmentType.F_TARGET_REF), - UserType.class, prismContext, ort.asReferenceValue()); - String real = getInterpretedQuery(session, UserType.class, ObjectQuery.createObjectQuery(filter)); - - LOGGER.info("exp. query>\n{}\nreal query>\n{}", new Object[]{expected, real}); - AssertJUnit.assertEquals(expected, real); - } finally { - close(session); - } - } - - - @Test - public void queryTrigger() throws Exception { - final Date NOW = new Date(); - - Session session = open(); - try { - Criteria main = session.createCriteria(RObject.class, "o"); - ProjectionList projections = Projections.projectionList(); - addFullObjectProjectionList("o", projections, false); - main.setProjection(projections); - - Criteria d = main.createCriteria("trigger", "t", JoinType.LEFT_OUTER_JOIN); - d.add(Restrictions.le("t.timestamp", new Timestamp(NOW.getTime()))); - - String expected = HibernateToSqlTranslator.toSql(main); - - XMLGregorianCalendar thisScanTimestamp = XmlTypeConverter.createXMLGregorianCalendar(NOW.getTime()); - - SchemaRegistry registry = prismContext.getSchemaRegistry(); - PrismObjectDefinition objectDef = registry.findObjectDefinitionByCompileTimeClass(ObjectType.class); - ItemPath triggerPath = new ItemPath(ObjectType.F_TRIGGER, TriggerType.F_TIMESTAMP); - // PrismContainerDefinition triggerContainerDef = objectDef.findContainerDefinition(triggerPath); - ObjectFilter filter = LessFilter.createLess(triggerPath, objectDef, thisScanTimestamp, true); - ObjectQuery query = ObjectQuery.createObjectQuery(filter); - String real = getInterpretedQuery(session, ObjectType.class, query); - - LOGGER.info("exp. query>\n{}\nreal query>\n{}", new Object[]{expected, real}); - AssertJUnit.assertEquals(expected, real); - } finally { - close(session); - } - } - - @Test - public void queryAssignmentActivationAdministrativeStatus() throws Exception { - Session session = open(); - try { - Criteria main = session.createCriteria(RUser.class, "u"); - Criteria a = main.createCriteria("assignments", "a", JoinType.LEFT_OUTER_JOIN); - a.add(Restrictions.and( - Restrictions.eq("a.assignmentOwner", RAssignmentOwner.FOCUS), - Restrictions.eq("a.activation.administrativeStatus", RActivationStatus.ENABLED) - )); - ProjectionList projections = Projections.projectionList(); - addFullObjectProjectionList("u", projections, false); - main.setProjection(projections); - - String expected = HibernateToSqlTranslator.toSql(main); - - SchemaRegistry registry = prismContext.getSchemaRegistry(); - PrismObjectDefinition objectDef = registry.findObjectDefinitionByCompileTimeClass(UserType.class); - ItemPath activationPath = new ItemPath(UserType.F_ASSIGNMENT, AssignmentType.F_ACTIVATION, ActivationType.F_ADMINISTRATIVE_STATUS); - - // PrismContainerDefinition activationDef = objectDef.findContainerDefinition(activationPath); - - ObjectFilter filter = EqualFilter.createEqual(activationPath, objectDef, ActivationStatusType.ENABLED); - ObjectQuery query = ObjectQuery.createObjectQuery(filter); - String real = getInterpretedQuery(session, UserType.class, query); - - LOGGER.info("exp. query>\n{}\nreal query>\n{}", new Object[]{expected, real}); - AssertJUnit.assertEquals(expected, real); - } finally { - close(session); - } - } - - @Test - public void queryInducementActivationAdministrativeStatus() throws Exception { - Session session = open(); - try { - /* - * ### role: Equal (inducement/activation/administrativeStatus, ENABLED) - * - * ==> select from RRole r left join r.assignments a where - * a.assignmentOwner = RAssignmentOwner.ABSTRACT_ROLE and <--- this differentiates inducements from assignments - * a.activation.administrativeStatus = RActivationStatus.ENABLED - */ - Criteria main = session.createCriteria(RRole.class, "r"); - Criteria a = main.createCriteria("assignments", "a", JoinType.LEFT_OUTER_JOIN); - a.add(Restrictions.and( - Restrictions.eq("a.assignmentOwner", RAssignmentOwner.ABSTRACT_ROLE), - Restrictions.eq("a.activation.administrativeStatus", RActivationStatus.ENABLED) - )); - ProjectionList projections = Projections.projectionList(); - addFullObjectProjectionList("r", projections, false); - main.setProjection(projections); - - String expected = HibernateToSqlTranslator.toSql(main); - - SchemaRegistry registry = prismContext.getSchemaRegistry(); - PrismObjectDefinition objectDef = registry.findObjectDefinitionByCompileTimeClass(RoleType.class); - ItemPath activationPath = new ItemPath(RoleType.F_INDUCEMENT, AssignmentType.F_ACTIVATION, ActivationType.F_ADMINISTRATIVE_STATUS); - - // PrismContainerDefinition activationDef = objectDef.findContainerDefinition(activationPath); - - ObjectFilter filter = EqualFilter.createEqual(activationPath, objectDef, ActivationStatusType.ENABLED); - ObjectQuery query = ObjectQuery.createObjectQuery(filter); - String real = getInterpretedQuery(session, RoleType.class, query); - - LOGGER.info("exp. query>\n{}\nreal query>\n{}", new Object[]{expected, real}); - AssertJUnit.assertEquals(expected, real); - } finally { - close(session); - } - } - - @Test - public void queryInducementAndAssignmentActivationAdministrativeStatus() throws Exception { - Session session = open(); - try { - /* - * ### Role: Or (Equal (assignment/activation/administrativeStatus, RActivationStatus.ENABLED), - * Equal (inducement/activation/administrativeStatus, RActivationStatus.ENABLED)) - * - * ==> select r from RRole r left join r.assignments a where - * (a.assignmentOwner = com.evolveum.midpoint.repo.sql.data.common.other.RAssignmentOwner.FOCUS and - * a.activation.administrativeStatus = com.evolveum.midpoint.repo.sql.data.common.enums.RActivationStatus.ENABLED) or - * (a.assignmentOwner = com.evolveum.midpoint.repo.sql.data.common.other.RAssignmentOwner.ABSTRACT_ROLE and - * a.activation.administrativeStatus = com.evolveum.midpoint.repo.sql.data.common.enums.RActivationStatus.ENABLED) - * - * (may return duplicate results) - */ - Criteria main = session.createCriteria(RRole.class, "r"); - Criteria a = main.createCriteria("assignments", "a", JoinType.LEFT_OUTER_JOIN); - ProjectionList projections = Projections.projectionList(); - addFullObjectProjectionList("r", projections, false); - main.setProjection(projections); - - Criterion and1 = Restrictions.and( - Restrictions.eq("a.assignmentOwner", RAssignmentOwner.FOCUS), - Restrictions.eq("a.activation.administrativeStatus", RActivationStatus.ENABLED) - ); - - Criterion and2 = Restrictions.and( - Restrictions.eq("a.assignmentOwner", RAssignmentOwner.ABSTRACT_ROLE), - Restrictions.eq("a.activation.administrativeStatus", RActivationStatus.ENABLED) - ); - - a.add(Restrictions.or(and1, and2)); - - String expected = HibernateToSqlTranslator.toSql(main); - - SchemaRegistry registry = prismContext.getSchemaRegistry(); - PrismObjectDefinition objectDef = registry.findObjectDefinitionByCompileTimeClass(RoleType.class); - - //filter1 - ItemPath activationPath1 = new ItemPath(UserType.F_ASSIGNMENT, AssignmentType.F_ACTIVATION, ActivationType.F_ADMINISTRATIVE_STATUS); - // PrismContainerDefinition activationDef1 = objectDef.findContainerDefinition(activationPath1); - ObjectFilter filter1 = EqualFilter.createEqual(activationPath1, objectDef, ActivationStatusType.ENABLED); - - //filter2 - ItemPath activationPath2 = new ItemPath(RoleType.F_INDUCEMENT, AssignmentType.F_ACTIVATION, ActivationType.F_ADMINISTRATIVE_STATUS); - // PrismContainerDefinition activationDef2 = objectDef.findContainerDefinition(activationPath2); - ObjectFilter filter2 = EqualFilter.createEqual(activationPath2, objectDef, ActivationStatusType.ENABLED); - - ObjectQuery query = ObjectQuery.createObjectQuery(OrFilter.createOr(filter1, filter2)); - String real = getInterpretedQuery(session, RoleType.class, query); - - LOGGER.info("exp. query>\n{}\nreal query>\n{}", new Object[]{expected, real}); - AssertJUnit.assertEquals(expected, real); - } finally { - close(session); - } - } - - @Test - public void queryUserByActivationDouble() throws Exception { - Date NOW = new Date(); - - Session session = open(); - try { - /* - * ### user: And (Equal (activation/administrativeStatus, RActivationStatus.ENABLED), - * Equal (activation/validFrom, '...')) - * - * ==> select u from RUser u where u.activation.administrativeStatus = RActivationStatus.ENABLED and - * u.activation.validFrom = ... - */ - Criteria main = session.createCriteria(RUser.class, "u"); - ProjectionList projections = Projections.projectionList(); - addFullObjectProjectionList("u", projections, false); - main.setProjection(projections); - - main.add(Restrictions.and( - Restrictions.eq("u.activation.administrativeStatus", RActivationStatus.ENABLED), - Restrictions.eq("u.activation.validFrom", XmlTypeConverter.createXMLGregorianCalendar(NOW.getTime())))); - - String expected = HibernateToSqlTranslator.toSql(main); - - SchemaRegistry registry = prismContext.getSchemaRegistry(); - PrismObjectDefinition objectDef = registry.findObjectDefinitionByCompileTimeClass(UserType.class); - // ItemPath triggerPath = new ItemPath(AssignmentType.F_ACTIVATION); - - // PrismContainerDefinition triggerContainerDef = objectDef.findContainerDefinition(triggerPath); - - ObjectFilter filter1 = EqualFilter.createEqual(new ItemPath(AssignmentType.F_ACTIVATION, ActivationType.F_ADMINISTRATIVE_STATUS), objectDef, - ActivationStatusType.ENABLED); - - ObjectFilter filter2 = EqualFilter.createEqual(new ItemPath(AssignmentType.F_ACTIVATION, ActivationType.F_VALID_FROM), objectDef, - XmlTypeConverter.createXMLGregorianCalendar(NOW.getTime())); - - ObjectQuery query = ObjectQuery.createObjectQuery(AndFilter.createAnd(filter1, filter2)); - String real = getInterpretedQuery(session, UserType.class, query); - - LOGGER.info("exp. query>\n{}\nreal query>\n{}", new Object[]{expected, real}); - AssertJUnit.assertEquals(expected, real); - } finally { - close(session); - } - } - - @Test - public void queryTriggerTimestampDouble() throws Exception { - final Date NOW = new Date(); - - Session session = open(); - try { - Criteria main = session.createCriteria(RObject.class, "o"); - ProjectionList projections = Projections.projectionList(); - addFullObjectProjectionList("o", projections, false); - main.setProjection(projections); - - Criteria d = main.createCriteria("trigger", "t", JoinType.LEFT_OUTER_JOIN); - d.add(Restrictions.and( - Restrictions.gt("t.timestamp", new Timestamp(NOW.getTime())), - Restrictions.lt("t.timestamp", new Timestamp(NOW.getTime())) - )); - - String expected = HibernateToSqlTranslator.toSql(main); - - XMLGregorianCalendar thisScanTimestamp = XmlTypeConverter.createXMLGregorianCalendar(NOW.getTime()); - - SchemaRegistry registry = prismContext.getSchemaRegistry(); - PrismObjectDefinition objectDef = registry.findObjectDefinitionByCompileTimeClass(ObjectType.class); - ItemPath triggerPath = new ItemPath(ObjectType.F_TRIGGER, TriggerType.F_TIMESTAMP); - // PrismContainerDefinition triggerContainerDef = objectDef.findContainerDefinition(triggerPath); - ObjectFilter greater = GreaterFilter.createGreater(triggerPath, objectDef, thisScanTimestamp, false); - ObjectFilter lesser = LessFilter.createLess(triggerPath, objectDef, thisScanTimestamp, false); - AndFilter and = AndFilter.createAnd(greater, lesser); - LOGGER.info(and.debugDump()); - - ObjectQuery query = ObjectQuery.createObjectQuery(and); - String real = getInterpretedQuery(session, ObjectType.class, query); - - LOGGER.info("exp. query>\n{}\nreal query>\n{}", new Object[]{expected, real}); - AssertJUnit.assertEquals(expected, real); - } finally { - close(session); - } - } - - private void addFullObjectProjectionList(String prefix, ProjectionList list, boolean group) { - if (prefix == null) { - prefix = ""; - } else { - prefix = prefix + "."; - } - - if (group) { - list.add(Projections.groupProperty(prefix + "fullObject")); - list.add(Projections.groupProperty(prefix + "stringsCount")); - list.add(Projections.groupProperty(prefix + "longsCount")); - list.add(Projections.groupProperty(prefix + "datesCount")); - list.add(Projections.groupProperty(prefix + "referencesCount")); - list.add(Projections.groupProperty(prefix + "polysCount")); - list.add(Projections.groupProperty(prefix + "booleansCount")); - } else { - list.add(Projections.property(prefix + "fullObject")); - list.add(Projections.property(prefix + "stringsCount")); - list.add(Projections.property(prefix + "longsCount")); - list.add(Projections.property(prefix + "datesCount")); - list.add(Projections.property(prefix + "referencesCount")); - list.add(Projections.property(prefix + "polysCount")); - list.add(Projections.property(prefix + "booleansCount")); - } - } - - @Test - public void countObjectOrderByName() throws Exception { - Session session = open(); - - try { - Criteria main = session.createCriteria(RUser.class, "u"); - main.add(Restrictions.and( - Restrictions.eq("u.name.orig", "cpt. Jack Sparrow"), - Restrictions.eq("u.name.norm", "cpt jack sparrow"))); - main.setProjection(Projections.rowCount()); - String expected = HibernateToSqlTranslator.toSql(main); - - EqualFilter filter = EqualFilter.createEqual(UserType.F_NAME, UserType.class, prismContext, - null, new PolyString("cpt. Jack Sparrow", "cpt jack sparrow")); - - ObjectQuery query = ObjectQuery.createObjectQuery(filter); - query.setPaging(ObjectPaging.createPaging(null, null, ObjectType.F_NAME, OrderDirection.ASCENDING)); - - String real = getInterpretedQuery(session, UserType.class, query, true); - - LOGGER.info("exp. query>\n{}\nreal query>\n{}", new Object[]{expected, real}); - AssertJUnit.assertEquals(expected, real); - } finally { - close(session); - } - } - - @Test - public void countObjectOrderByNameWithoutFilter() throws Exception { - Session session = open(); - - try { - Criteria main = session.createCriteria(RObject.class, "o"); - main.setProjection(Projections.rowCount()); - String expected = HibernateToSqlTranslator.toSql(main); - - ObjectPaging paging = ObjectPaging.createPaging(null, null, ObjectType.F_NAME, OrderDirection.ASCENDING); - ObjectQuery query = ObjectQuery.createObjectQuery(null, paging); - - String real = getInterpretedQuery(session, ObjectType.class, query, true); - - LOGGER.info("exp. query>\n{}\nreal query>\n{}", new Object[]{expected, real}); - AssertJUnit.assertEquals(expected, real); - } finally { - close(session); - } - } - - /** - * Q{AND: (EQUALS: parent, PPV(null)),PAGING: O: 0,M: 5,BY: name, D:ASCENDING, - * - * @throws Exception - */ - @Test - public void countTaskOrderByName() throws Exception { - Session session = open(); - - try { - Criteria main = session.createCriteria(RTask.class, "t"); - main.add(Restrictions.isNull("t.parent")); - - main.setProjection(Projections.rowCount()); - String expected = HibernateToSqlTranslator.toSql(main); - - EqualFilter filter = EqualFilter.createEqual(TaskType.F_PARENT, TaskType.class, prismContext, null); - - ObjectQuery query = ObjectQuery.createObjectQuery(filter); - query.setPaging(ObjectPaging.createPaging(null, null, TaskType.F_NAME, OrderDirection.ASCENDING)); - - String real = getInterpretedQuery(session, TaskType.class, query, true); - - LOGGER.info("exp. query>\n{}\nreal query>\n{}", new Object[]{expected, real}); - AssertJUnit.assertEquals(expected, real); - } finally { - close(session); - } - } - - @Test - public void inOidTest() throws Exception { - Session session = open(); - try { - Criteria main = session.createCriteria(RObject.class, "o"); - main.add(Restrictions.in("oid", Arrays.asList("1", "2"))); - ProjectionList projections = Projections.projectionList(); - addFullObjectProjectionList("o", projections, false); - main.setProjection(projections); - - String expected = HibernateToSqlTranslator.toSql(main); - - InOidFilter filter = InOidFilter.createInOid(Arrays.asList("1", "2")); - - ObjectQuery query = ObjectQuery.createObjectQuery(filter); - String real = getInterpretedQuery(session, ObjectType.class, query, false); - - LOGGER.info("exp. query>\n{}\nreal query>\n{}", new Object[]{expected, real}); - AssertJUnit.assertEquals(expected, real); - } finally { - close(session); - } - } - - @Test - public void queryOrgTreeFindOrgs() throws Exception { - Session session = open(); - - try { - - Criteria main = session.createCriteria(ROrg.class, "o"); - ProjectionList projections = Projections.projectionList(); - addFullObjectProjectionList("o", projections, false); - main.setProjection(projections); - - DetachedCriteria detached = DetachedCriteria.forClass(RObjectReference.class, "p"); - detached.add(Restrictions.eq("referenceType", 0)); - detached.setProjection(Projections.distinct(Projections.property("p.ownerOid"))); - detached.add(Restrictions.eq("p.targetOid", "some oid")); - - main.add(Subqueries.propertyIn("o.oid", detached)); - main.addOrder(Order.asc("o.name.orig")); - - String expected = HibernateToSqlTranslator.toSql(main); - - OrgFilter orgFilter = OrgFilter.createOrg("some oid", OrgFilter.Scope.ONE_LEVEL); - ObjectQuery objectQuery = ObjectQuery.createObjectQuery(orgFilter); - objectQuery.setPaging(ObjectPaging.createPaging(null, null, ObjectType.F_NAME, OrderDirection.ASCENDING)); - - String real = getInterpretedQuery(session, OrgType.class, objectQuery); - - LOGGER.info("exp. query>\n{}\nreal query>\n{}", new Object[]{expected, real}); - - OperationResult result = new OperationResult("query org structure"); - repositoryService.searchObjects(OrgType.class, objectQuery, null, result); - - AssertJUnit.assertEquals(expected, real); - } finally { - close(session); - } - } - - @Test - public void asdf() throws Exception { - Session session = open(); - try { - Criteria main = session.createCriteria(RUser.class, "u"); - Criteria a = main.createCriteria("assignments", "a"); - a.add(Restrictions.eq("a.assignmentOwner", RAssignmentOwner.FOCUS)); - Criteria e = a.createCriteria("a.extension"); - - Criteria s = e.createCriteria("strings", "s"); - - Conjunction c2 = Restrictions.conjunction(); - c2.add(Restrictions.eq("s.extensionType", RAssignmentExtensionType.EXTENSION)); - c2.add(Restrictions.eq("s.name", new QName("http://midpoint.evolveum.com/blabla", "foo"))); - c2.add(Restrictions.eq("s.value", "uid=jbond,ou=People,dc=example,dc=com")); - - Conjunction c1 = Restrictions.conjunction(); - c1.add(Restrictions.eq("a.targetRef.targetOid", "1234")); - c1.add(Restrictions.eq("a.targetRef.type", RObjectType.ORG)); - - main.add(Restrictions.and(c1, c2)); - - main.setProjection(Projections.property("u.fullObject")); - - String expected = HibernateToSqlTranslator.toSql(main); - LOGGER.info(">>> >>> {}", expected); - } finally { - close(session); - } - } - - @Test - public void test100ActivationQuery() throws Exception { - PrismObjectDefinition focusObjectDef = prismContext.getSchemaRegistry() - .findObjectDefinitionByCompileTimeClass(UserType.class); - - XMLGregorianCalendar thisScanTimestamp = XMLGregorianCalendarType.asXMLGregorianCalendar(new Date()); - - OrFilter filter = OrFilter.createOr( - LessFilter.createLess(new ItemPath(FocusType.F_ACTIVATION, ActivationType.F_VALID_FROM), focusObjectDef, - thisScanTimestamp, true), - LessFilter.createLess(new ItemPath(FocusType.F_ACTIVATION, ActivationType.F_VALID_TO), focusObjectDef, - thisScanTimestamp, true), - LessFilter.createLess(new ItemPath(FocusType.F_ASSIGNMENT, FocusType.F_ACTIVATION, ActivationType.F_VALID_FROM), - focusObjectDef, thisScanTimestamp, true), - LessFilter.createLess(new ItemPath(FocusType.F_ASSIGNMENT, FocusType.F_ACTIVATION, ActivationType.F_VALID_TO), - focusObjectDef, thisScanTimestamp, true) - ); - - Session session = open(); - try { - ObjectQuery query = ObjectQuery.createObjectQuery(filter); - String real = getInterpretedQuery(session, UserType.class, query, false); - - String expected = null; - LOGGER.info("exp. query>\n{}\nreal query>\n{}", new Object[]{expected, real}); - } finally { - close(session); - } - } - - @Test - public void test200ActivationQuery() throws Exception { - PrismObjectDefinition focusObjectDef = prismContext.getSchemaRegistry() - .findObjectDefinitionByCompileTimeClass(UserType.class); - - XMLGregorianCalendar lastScanTimestamp = XMLGregorianCalendarType.asXMLGregorianCalendar(new Date()); - XMLGregorianCalendar thisScanTimestamp = XMLGregorianCalendarType.asXMLGregorianCalendar(new Date()); - - OrFilter filter = OrFilter.createOr( - AndFilter.createAnd( - GreaterFilter.createGreater(new ItemPath(FocusType.F_ACTIVATION, ActivationType.F_VALID_FROM), focusObjectDef, - lastScanTimestamp, false), - LessFilter.createLess(new ItemPath(FocusType.F_ACTIVATION, ActivationType.F_VALID_FROM), focusObjectDef, - thisScanTimestamp, true) - ), - AndFilter.createAnd( - GreaterFilter.createGreater(new ItemPath(FocusType.F_ACTIVATION, ActivationType.F_VALID_TO), focusObjectDef, - lastScanTimestamp, false), - LessFilter.createLess(new ItemPath(FocusType.F_ACTIVATION, ActivationType.F_VALID_TO), focusObjectDef, - thisScanTimestamp, true) - ), - AndFilter.createAnd( - GreaterFilter.createGreater(new ItemPath(FocusType.F_ASSIGNMENT, FocusType.F_ACTIVATION, ActivationType.F_VALID_FROM), - focusObjectDef, lastScanTimestamp, false), - LessFilter.createLess(new ItemPath(FocusType.F_ASSIGNMENT, FocusType.F_ACTIVATION, ActivationType.F_VALID_FROM), - focusObjectDef, thisScanTimestamp, true) - ), - AndFilter.createAnd( - GreaterFilter.createGreater(new ItemPath(FocusType.F_ASSIGNMENT, FocusType.F_ACTIVATION, ActivationType.F_VALID_TO), - focusObjectDef, lastScanTimestamp, false), - LessFilter.createLess(new ItemPath(FocusType.F_ASSIGNMENT, FocusType.F_ACTIVATION, ActivationType.F_VALID_TO), - focusObjectDef, thisScanTimestamp, true) - ) - ); - - Session session = open(); - try { - ObjectQuery query = ObjectQuery.createObjectQuery(filter); - String real = getInterpretedQuery(session, UserType.class, query, false); - - String expected = null; - LOGGER.info("exp. query>\n{}\nreal query>\n{}", new Object[]{expected, real}); - } finally { - close(session); - } - } - - @Test - public void test300OrgQuery() throws Exception { - File objects = new File("src/test/resources/orgstruct/org-monkey-island.xml"); - OperationResult opResult = new OperationResult("test300OrgQuery"); - List> orgStruct = prismContext.parserFor(objects).parseObjects(); - - for (PrismObject o : orgStruct) { - repositoryService.addObject((PrismObject) o, null, opResult); - } - opResult.computeStatusIfUnknown(); - AssertJUnit.assertTrue(opResult.isSuccess()); - - checkQueryResult(ObjectType.class, "00000000-8888-6666-0000-100000000001", OrgFilter.Scope.ONE_LEVEL, 4); - checkQueryResult(UserType.class, "00000000-8888-6666-0000-100000000001", OrgFilter.Scope.ONE_LEVEL, 1); - checkQueryResult(OrgType.class, "00000000-8888-6666-0000-100000000001", OrgFilter.Scope.ONE_LEVEL, 3); - checkQueryResult(OrgType.class, "00000000-8888-6666-0000-100000000001", OrgFilter.Scope.SUBTREE, 5); - checkQueryResult(UserType.class, "00000000-8888-6666-0000-100000000001", OrgFilter.Scope.SUBTREE, 6); - checkQueryResult(ObjectType.class, "00000000-8888-6666-0000-100000000001", OrgFilter.Scope.SUBTREE, 11); - checkQueryResult(ObjectType.class, "00000000-8888-6666-0000-100000000006", OrgFilter.Scope.ONE_LEVEL, 4); - checkQueryResult(UserType.class, "00000000-8888-6666-0000-100000000006", OrgFilter.Scope.ONE_LEVEL, 4); - checkQueryResult(UserType.class, "00000000-8888-6666-0000-100000000006", OrgFilter.Scope.SUBTREE, 4); - checkQueryResult(OrgType.class, "00000000-8888-6666-0000-100000000006", OrgFilter.Scope.ONE_LEVEL, 0); - checkQueryResult(OrgType.class, "00000000-8888-6666-0000-100000000006", OrgFilter.Scope.SUBTREE, 0); - checkQueryResult(UserType.class, "00000000-8888-6666-0000-200000000002", OrgFilter.Scope.ONE_LEVEL, 2); - checkQueryResult(UserType.class, "00000000-8888-6666-0000-200000000002", OrgFilter.Scope.SUBTREE, 2); - checkQueryResult(UserType.class, "00000000-8888-6666-0000-200000000001", OrgFilter.Scope.ONE_LEVEL, 1); - checkQueryResult(UserType.class, "00000000-8888-6666-0000-200000000001", OrgFilter.Scope.SUBTREE, 1); - } - - private void checkQueryResult(Class type, String oid, OrgFilter.Scope scope, int count) - throws Exception { - LOGGER.info("checkQueryResult"); - - OrgFilter orgFilter = OrgFilter.createOrg(oid, scope); - ObjectQuery query = ObjectQuery.createObjectQuery(orgFilter); - query.setPaging(ObjectPaging.createPaging(null, null, ObjectType.F_NAME, OrderDirection.ASCENDING)); - - OperationResult result = new OperationResult("checkQueryResult"); - List> objects = repositoryService.searchObjects(type, query, null, result); - for (PrismObject object : objects) { - LOGGER.info("{}", object.getOid()); - } - int realCount = objects.size(); - AssertJUnit.assertEquals("Expected count doesn't match for searchObjects " + orgFilter, count, realCount); - - result.computeStatusIfUnknown(); - AssertJUnit.assertTrue(result.isSuccess()); - - realCount = repositoryService.countObjects(type, query, result); - AssertJUnit.assertEquals("Expected count doesn't match for countObjects " + orgFilter, count, realCount); - - result.computeStatusIfUnknown(); - AssertJUnit.assertTrue(result.isSuccess()); - } - - @Test - public void test310QueryNameAndOrg() throws Exception { - Session session = open(); - - try { - DetachedCriteria detached = DetachedCriteria.forClass(RObjectReference.class, "p"); - detached.add(Restrictions.eq("referenceType", 0)); - detached.setProjection(Projections.distinct(Projections.property("p.ownerOid"))); - detached.add(Property.forName("targetOid").in( - DetachedCriteria.forClass(ROrgClosure.class, "cl") - .setProjection(Projections.property("cl.descendantOid")) - .add(Restrictions.eq("cl.ancestorOid", "1234")))); - - Criteria main = session.createCriteria(RUser.class, "u"); - String mainAlias = "u"; - - ProjectionList projections = Projections.projectionList(); - projections.add(Projections.property("fullObject")); - - projections.add(Projections.property("stringsCount")); - projections.add(Projections.property("longsCount")); - projections.add(Projections.property("datesCount")); - projections.add(Projections.property("referencesCount")); - projections.add(Projections.property("polysCount")); - projections.add(Projections.property("booleansCount")); - - main.setProjection(projections); - - Conjunction c = Restrictions.conjunction(); - c.add(Restrictions.and( - Restrictions.eq("u.name.orig", "cpt. Jack Sparrow"), - Restrictions.eq("u.name.norm", "cpt jack sparrow"))); - c.add(Subqueries.propertyIn(mainAlias + ".oid", detached)); - main.add(c); - - main.addOrder(Order.asc("u.name.orig")); - - String expected = HibernateToSqlTranslator.toSql(main); - - EqualFilter eqFilter = EqualFilter.createEqual(ObjectType.F_NAME, ObjectType.class, prismContext, - null, new PolyString("cpt. Jack Sparrow", "cpt jack sparrow")); - - OrgFilter orgFilter = OrgFilter.createOrg("12341234-1234-1234-1234-123412341234"); - - ObjectQuery query = ObjectQuery.createObjectQuery(AndFilter.createAnd(eqFilter, orgFilter)); - query.setPaging(ObjectPaging.createPaging(null, null, ObjectType.F_NAME, OrderDirection.ASCENDING)); - - String real = getInterpretedQuery(session, UserType.class, query); - - LOGGER.info("exp. query>\n{}\nreal query>\n{}", new Object[]{expected, real}); - AssertJUnit.assertEquals(expected, real); - } finally { - close(session); - } - } - - @Test(enabled = false) - public void test320QueryEmployeeTypeAndOrgType() throws Exception { - Session session = open(); - - try { - Criteria main = session.createCriteria(RObject.class, "o"); - main.add(Restrictions.or( - Restrictions.and( - Restrictions.eq("o.name.orig", "some name"), - Restrictions.eq("o.employeeNumber", "123") - ), - Restrictions.eq("o.identifier", "1234") - )); - ProjectionList list = Projections.projectionList(); - addFullObjectProjectionList("o", list, false); - main.setProjection(list); - - List l = main.list(); - l.size(); - String expected = HibernateToSqlTranslator.toSql(main); - LOGGER.info("expected query>\n{}", new Object[]{expected}); - - -// EqualsFilter nameFilter = EqualsFilter.createEqual(ObjectType.F_NAME, ObjectType.class, prismContext, -// null, new PolyString("cpt. Jack Sparrow", "cpt jack sparrow")); -// -// EqualsFilter numberFilter = EqualsFilter.createEqual(UserType.F_EMPLOYEE_NUMBER, UserType.class, prismContext, -// null, "123"); -// -//// EqualsFilter orgTypeFilter = EqualsFilter.createEqual(OrgType.F_ORG_TYPE, OrgType.class, prismContext, -//// null, "orgtypevalue"); -// -// ObjectQuery query = ObjectQuery.createObjectQuery(OrFilter.createOr( -// AndFilter.createAnd(nameFilter, numberFilter)//, -//// orgTypeFilter -// )); -// query.setPaging(ObjectPaging.createPaging(null, null, ObjectType.F_NAME, OrderDirection.ASCENDING)); -// -// String real = getInterpretedQuery(session, ObjectType.class, query); -// -// LOGGER.info("real query>\n{}", new Object[]{real}); - } finally { - close(session); - } - } - - @Test - public void test330queryUserSubstringName() throws Exception { - Session session = open(); - - try { - Criteria main = session.createCriteria(RObject.class, "o"); - ProjectionList projections = Projections.projectionList(); - addFullObjectProjectionList("o", projections, false); - main.setProjection(projections); - - main.add(Restrictions.like("name.orig", "a%")); - String expected = HibernateToSqlTranslator.toSql(main); - - SubstringFilter substring = SubstringFilter.createSubstring(ObjectType.F_NAME, ObjectType.class, - prismContext, PolyStringOrigMatchingRule.NAME, "a"); - substring.setAnchorStart(true); - String real = getInterpretedQuery(session, ObjectType.class, ObjectQuery.createObjectQuery(substring)); - - LOGGER.info("exp. query>\n{}\nreal query>\n{}", new Object[]{expected, real}); - AssertJUnit.assertEquals(expected, real); - - OperationResult result = new OperationResult("test330queryUserSubstringName"); - int count = repositoryService.countObjects(ObjectType.class, ObjectQuery.createObjectQuery(substring), result); - AssertJUnit.assertEquals(2, count); - - substring = SubstringFilter.createSubstring(ObjectType.F_NAME, ObjectType.class, - prismContext, PolyStringOrigMatchingRule.NAME, "a"); - count = repositoryService.countObjects(ObjectType.class, ObjectQuery.createObjectQuery(substring), result); - AssertJUnit.assertEquals(18, count); - } finally { - close(session); - } - } - - @Test - public void test340queryObjectClassTypeUser() throws Exception { - Session session = open(); - - try { - Criteria main = session.createCriteria(RObject.class, "o"); - ProjectionList projections = Projections.projectionList(); - addFullObjectProjectionList("o", projections, false); - main.setProjection(projections); - - main.add(Restrictions.eq("o." + RObject.F_OBJECT_TYPE_CLASS, RObjectType.USER)); - String expected = HibernateToSqlTranslator.toSql(main); - - TypeFilter type = TypeFilter.createType(UserType.COMPLEX_TYPE, null); - String real = getInterpretedQuery(session, ObjectType.class, ObjectQuery.createObjectQuery(type)); - - LOGGER.info("exp. query>\n{}\nreal query>\n{}", new Object[]{expected, real}); - AssertJUnit.assertEquals(expected, real); - } finally { - close(session); - } - } - - @Test - public void test350queryObjectClassTypeAbstractRole() throws Exception { - Session session = open(); - - try { - Criteria main = session.createCriteria(RObject.class, "o"); - ProjectionList projections = Projections.projectionList(); - addFullObjectProjectionList("o", projections, false); - main.setProjection(projections); - - List list = new ArrayList<>(); - list.add(RObjectType.ABSTRACT_ROLE); - list.add(RObjectType.ORG); - list.add(RObjectType.ROLE); - main.add(Restrictions.in("o." + RObject.F_OBJECT_TYPE_CLASS, list)); - String expected = HibernateToSqlTranslator.toSql(main); - - TypeFilter type = TypeFilter.createType(AbstractRoleType.COMPLEX_TYPE, null); - String real = getInterpretedQuery(session, ObjectType.class, ObjectQuery.createObjectQuery(type)); - - LOGGER.info("exp. query>\n{}\nreal query>\n{}", new Object[]{expected, real}); - AssertJUnit.assertEquals(expected, real); - } finally { - close(session); - } - } - - @Test - public void test360queryMetadataTimestamp() throws Exception { - Session session = open(); - - try { - Criteria main = session.createCriteria(RReportOutput.class, "r"); - ProjectionList projections = Projections.projectionList(); - addFullObjectProjectionList("r", projections, false); - main.setProjection(projections); - - XMLGregorianCalendar timeXml = XMLGregorianCalendarType.asXMLGregorianCalendar(new Date()); - - main.add(Restrictions.le("r.createTimestamp", timeXml)); - String expected = HibernateToSqlTranslator.toSql(main); - - LessFilter less = LessFilter.createLess( - new ItemPath(ReportOutputType.F_METADATA, MetadataType.F_CREATE_TIMESTAMP), - ReportOutputType.class, prismContext, timeXml, true); - - String real = getInterpretedQuery(session, ReportOutputType.class, ObjectQuery.createObjectQuery(less)); - - LOGGER.info("exp. query>\n{}\nreal query>\n{}", new Object[]{expected, real}); - AssertJUnit.assertEquals(expected, real); - } finally { - close(session); - } - } - - @Test - public void test370queryObjectypeByTypeUserAndLocality() throws Exception { - Session session = open(); - try { - Criteria main = session.createCriteria(RObject.class, "o"); - ProjectionList projections = Projections.projectionList(); - addFullObjectProjectionList("o", projections, false); - main.setProjection(projections); - - Conjunction c = Restrictions.conjunction(); - main.add(c); - c.add(Restrictions.eq("o." + RObject.F_OBJECT_TYPE_CLASS, RObjectType.USER)); - c.add(Restrictions.and(Restrictions.eq("o.localityUser.orig", "Caribbean"), - Restrictions.eq("o.localityUser.norm", "caribbean"))); - - String expected = HibernateToSqlTranslator.toSql(main); - - EqualFilter eq = EqualFilter.createEqual(new ItemPath(UserType.F_LOCALITY), UserType.class, prismContext, - new PolyString("Caribbean", "caribbean")); - TypeFilter type = TypeFilter.createType(UserType.COMPLEX_TYPE, eq); - - String real = getInterpretedQuery(session, ObjectType.class, ObjectQuery.createObjectQuery(type)); - - LOGGER.info("exp. query>\n{}\nreal query>\n{}", new Object[]{expected, real}); - AssertJUnit.assertEquals(expected, real); - - checkQueryTypeAlias(real, "m_user", "locality_orig", "locality_norm"); - } finally { - close(session); - } - } - - /** - * This checks aliases, if they were generated correctly for query. Alias for table as "table" parameter - * must be used for columns in "properties" parameter. - * - * @param query - * @param table - * @param properties - */ - private void checkQueryTypeAlias(String query, String table, String... properties) { - String[] array = query.split(" "); - String alias = null; - for (int i = 0; i < array.length; i++) { - if (table.equals(array[i])) { - alias = array[i + 1]; - break; - } - } - AssertJUnit.assertNotNull(alias); - - for (String property : properties) { - for (String token : array) { - if (token.endsWith(property + "=?") && !token.startsWith("(" + alias + ".")) { - AssertJUnit.fail("Property '" + property + "' doesn't have proper alias '" - + alias + "' in token '" + token + "'"); - } - } - } - } - - @Test - public void test375queryObjectypeByTypeOrgAndLocality() throws Exception { - Session session = open(); - try { - Criteria main = session.createCriteria(RObject.class, "o"); - ProjectionList projections = Projections.projectionList(); - addFullObjectProjectionList("o", projections, false); - main.setProjection(projections); - - Conjunction c = Restrictions.conjunction(); - main.add(c); - c.add(Restrictions.eq("o." + RObject.F_OBJECT_TYPE_CLASS, RObjectType.ORG)); - c.add(Restrictions.and(Restrictions.eq("o.locality.orig", "Caribbean"), - Restrictions.eq("o.locality.norm", "caribbean"))); - - String expected = HibernateToSqlTranslator.toSql(main); - - EqualFilter eq = EqualFilter.createEqual(new ItemPath(OrgType.F_LOCALITY), OrgType.class, prismContext, - new PolyString("Caribbean", "caribbean")); - TypeFilter type = TypeFilter.createType(OrgType.COMPLEX_TYPE, eq); - - String real = getInterpretedQuery(session, ObjectType.class, ObjectQuery.createObjectQuery(type)); - - LOGGER.info("exp. query>\n{}\nreal query>\n{}", new Object[]{expected, real}); - AssertJUnit.assertEquals(expected, real); - - checkQueryTypeAlias(real, "m_org", "locality_orig", "locality_norm"); - } finally { - close(session); - } - } - - @Test - public void test380queryObjectypeByTypeAndExtensionAttribute() throws Exception { - Session session = open(); - try { - Criteria main = session.createCriteria(RObject.class, "o"); - ProjectionList projections = Projections.projectionList(); - addFullObjectProjectionList("o", projections, false); - main.setProjection(projections); - - Conjunction c = Restrictions.conjunction(); - main.add(c); - c.add(Restrictions.eq("o." + RObject.F_OBJECT_TYPE_CLASS, RObjectType.USER)); - - Conjunction c2 = Restrictions.conjunction(); - main.createCriteria("strings", "s", JoinType.LEFT_OUTER_JOIN); - c2.add(Restrictions.eq("s.ownerType", RObjectExtensionType.EXTENSION)); - c2.add(Restrictions.eq("s.name", new QName("http://example.com/p", "weapon"))); - c2.add(Restrictions.eq("s.value", "some weapon name")); - c.add(c2); - - String expected = HibernateToSqlTranslator.toSql(main); - - EqualFilter eq = EqualFilter.createEqual( - new ItemPath(ObjectType.F_EXTENSION, new QName("http://example.com/p", "weapon")), - UserType.class, prismContext, "some weapon name"); - TypeFilter type = TypeFilter.createType(UserType.COMPLEX_TYPE, eq); - - String real = getInterpretedQuery(session, ObjectType.class, ObjectQuery.createObjectQuery(type)); - - LOGGER.info("exp. query>\n{}\nreal query>\n{}", new Object[]{expected, real}); - AssertJUnit.assertEquals(expected, real); - } finally { - close(session); - } - } - - @Test - public void test390queryObjectypeByTypeAndReference() throws Exception { - Session session = open(); - try { - Criteria main = session.createCriteria(RObject.class, "o"); - ProjectionList projections = Projections.projectionList(); - addFullObjectProjectionList("o", projections, false); - main.setProjection(projections); - - Conjunction c = Restrictions.conjunction(); - main.add(c); - c.add(Restrictions.eq("o." + RObject.F_OBJECT_TYPE_CLASS, RObjectType.USER)); - - Criteria refs = main.createCriteria("linkRef", "l", JoinType.LEFT_OUTER_JOIN); - c.add(Restrictions.and(Restrictions.eq("l.targetOid", "123"),Restrictions.eq("l.relation", "#"))); - - String expected = HibernateToSqlTranslator.toSql(main); - - RefFilter ref = RefFilter.createReferenceEqual(UserType.F_LINK_REF, UserType.class, prismContext, "123"); - TypeFilter type = TypeFilter.createType(UserType.COMPLEX_TYPE, ref); - - String real = getInterpretedQuery(session, ObjectType.class, ObjectQuery.createObjectQuery(type)); - - LOGGER.info("exp. query>\n{}\nreal query>\n{}", new Object[]{expected, real}); - AssertJUnit.assertEquals(expected, real); - } finally { - close(session); - } - } - - @Test - public void test400queryObjectypeByTypeComplex() throws Exception { - Session session = open(); - try { - Criteria main = session.createCriteria(RObject.class, "o"); - ProjectionList projections = Projections.projectionList(); - addFullObjectProjectionList("o", projections, false); - main.setProjection(projections); - - Conjunction c1 = Restrictions.conjunction(); - c1.add(Restrictions.eq("o." + RObject.F_OBJECT_TYPE_CLASS, RObjectType.USER)); - Criterion e1 = Restrictions.and(Restrictions.eq("o.localityUser.orig", "Caribbean"), - Restrictions.eq("o.localityUser.norm", "caribbean")); - Criterion e2 = Restrictions.and(Restrictions.eq("o.localityUser.orig", "Adriatic"), - Restrictions.eq("o.localityUser.norm", "adriatic")); - c1.add(Restrictions.or(e1, e2)); - - Conjunction c2 = Restrictions.conjunction(); - c2.add(Restrictions.eq("o." + RObject.F_OBJECT_TYPE_CLASS, RObjectType.ORG)); - Criteria o1 = main.createCriteria("o.orgType", "o1", JoinType.LEFT_OUTER_JOIN); - c2.add(Restrictions.eq("o1.elements", "functional")); - - Criterion c3 = Restrictions.eq("o." + RObject.F_OBJECT_TYPE_CLASS, RObjectType.REPORT); - - main.add(Restrictions.or(c1, c2, c3)); - String expected = HibernateToSqlTranslator.toSql(main); - - - EqualFilter eq1 = EqualFilter.createEqual(UserType.F_LOCALITY, UserType.class, prismContext, - new PolyString("Caribbean", "caribbean")); - EqualFilter eq2 = EqualFilter.createEqual(UserType.F_LOCALITY, UserType.class, prismContext, - new PolyString("Adriatic", "adriatic")); - TypeFilter type1 = TypeFilter.createType(UserType.COMPLEX_TYPE, OrFilter.createOr(eq1, eq2)); - - EqualFilter equal = EqualFilter.createEqual(OrgType.F_ORG_TYPE, OrgType.class, prismContext, "functional"); - TypeFilter type2 = TypeFilter.createType(OrgType.COMPLEX_TYPE, equal); - - TypeFilter type3 = TypeFilter.createType(ReportType.COMPLEX_TYPE, null); - - OrFilter or = OrFilter.createOr(type1, type2, type3); - - String real = getInterpretedQuery(session, ObjectType.class, ObjectQuery.createObjectQuery(or)); - - LOGGER.info("exp. query>\n{}\nreal query>\n{}", new Object[]{expected, real}); - AssertJUnit.assertEquals(expected, real); - } finally { - close(session); - } - } - - @Test(expectedExceptions = QueryException.class) - public void test410QueryGenericClob() throws Exception { - Session session = open(); - try { - EqualFilter eq = EqualFilter.createEqual( - new ItemPath(ObjectType.F_EXTENSION, new QName("http://example.com/p", "locations")), - GenericObjectType.class, prismContext, null); - - getInterpretedQuery(session, GenericObjectType.class, ObjectQuery.createObjectQuery(eq)); - } catch (QueryException ex) { - LOGGER.info("Exception", ex); - throw ex; - } finally { - close(session); - } - } - - @Test - public void test420QueryGenericString() throws Exception { - Session session = open(); - try { - Criteria main = session.createCriteria(RGenericObject.class, "g"); - - Criteria stringExt = main.createCriteria("strings", "s", JoinType.LEFT_OUTER_JOIN); - - //and - Conjunction c2 = Restrictions.conjunction(); - c2.add(Restrictions.eq("s.ownerType", RObjectExtensionType.EXTENSION)); - c2.add(Restrictions.eq("s.name", new QName("http://example.com/p", "stringType"))); - c2.add(Restrictions.eq("s.value", "asdf")); - - main.add(c2); - ProjectionList projections = Projections.projectionList(); - addFullObjectProjectionList("g", projections, false); - main.setProjection(projections); - - String expected = HibernateToSqlTranslator.toSql(main); - - EqualFilter eq = EqualFilter.createEqual( - new ItemPath(ObjectType.F_EXTENSION, new QName("http://example.com/p", "stringType")), - GenericObjectType.class, prismContext, "asdf"); - - String real = getInterpretedQuery(session, GenericObjectType.class, ObjectQuery.createObjectQuery(eq)); - - LOGGER.info("exp. query>\n{}\nreal query>\n{}", new Object[]{expected, real}); - AssertJUnit.assertEquals(expected, real); - } finally { - close(session); - } - } - -// @Test -// public void atest100() throws Exception { -// Session session = open(); -// -// try { -// String expected = null;//HibernateToSqlTranslator.toSql(main); -// -// List secondaryEquals = new ArrayList<>(); -// EqualFilter eq = EqualFilter.createEqual(new ItemPath(ShadowType.F_ATTRIBUTES, SchemaConstantsGenerated.ICF_S_UID), -// new PrismPropertyDefinition(SchemaConstantsGenerated.ICF_S_UID, DOMUtil.XSD_STRING, prismContext), -// "8daaeeae-f0c7-41c9-b258-2a3351aa8876"); -// secondaryEquals.add(eq); -// eq = EqualFilter.createEqual(new ItemPath(ShadowType.F_ATTRIBUTES, SchemaConstantsGenerated.ICF_S_NAME), -// new PrismPropertyDefinition(SchemaConstantsGenerated.ICF_S_NAME, DOMUtil.XSD_STRING, prismContext), -// "some-name"); -// secondaryEquals.add(eq); -// -// OrFilter secondaryIdentifierFilter = OrFilter.createOr((List) secondaryEquals); -// RefFilter ref = RefFilter.createReferenceEqual(ShadowType.F_RESOURCE_REF, ShadowType.class, -// prismContext, "ef2bc95b-76e0-48e2-86d6-3d4f02d3e1a2"); -// -// AndFilter filter = AndFilter.createAnd(ref, secondaryIdentifierFilter); -// ObjectQuery query = ObjectQuery.createObjectQuery(filter); -// LOGGER.debug("Query\n{}", query); -// -// QueryEngine engine = new QueryEngine(repositoryService.getConfiguration(), prismContext); -// RQuery rQuery = engine.interpret(query, ShadowType.class, null, false, session); -// RQueryCriteriaImpl rci = (RQueryCriteriaImpl) rQuery; -// System.out.println(rci); -// System.out.println(rci.getCriteria()); -// //just test if DB will handle it or throws some exception -// List l = rQuery.list(); -// LOGGER.info(">>>>>>>>asdfasdfasdfasdf{}",l.size()); -// -// String real = getInterpretedQuery(session, ShadowType.class, query); -// -// LOGGER.info("exp. query>\n{}\nreal query>\n{}", new Object[]{expected, real}); -// AssertJUnit.assertEquals(expected, real); -// } finally { -// close(session); -// } -// } - - @Test - public void test430QueryGenericBoolean() throws Exception { - Session session = open(); - try { - Criteria main = session.createCriteria(RGenericObject.class, "g"); - - Criteria stringExt = main.createCriteria("booleans", "b", JoinType.LEFT_OUTER_JOIN); - - //and - Conjunction c2 = Restrictions.conjunction(); - c2.add(Restrictions.eq("b.ownerType", RObjectExtensionType.EXTENSION)); - c2.add(Restrictions.eq("b.name", SKIP_AUTOGENERATION)); - c2.add(Restrictions.eq("b.value", true)); - - main.add(c2); - ProjectionList projections = Projections.projectionList(); - addFullObjectProjectionList("g", projections, false); - main.setProjection(projections); - - String expected = HibernateToSqlTranslator.toSql(main); - - EqualFilter eq = EqualFilter.createEqual( - new ItemPath(ObjectType.F_EXTENSION, SKIP_AUTOGENERATION), - GenericObjectType.class, prismContext, true); - - String real = getInterpretedQuery(session, GenericObjectType.class, ObjectQuery.createObjectQuery(eq)); - - LOGGER.info("exp. query>\n{}\nreal query>\n{}", new Object[]{expected, real}); - AssertJUnit.assertEquals(expected, real); - - OperationResult result = new OperationResult("search"); - List> objects = repositoryService.searchObjects(GenericObjectType.class, - ObjectQuery.createObjectQuery(eq), null, result); - result.computeStatus(); - AssertJUnit.assertTrue(result.isSuccess()); - - AssertJUnit.assertNotNull(objects); - AssertJUnit.assertEquals(1, objects.size()); - - PrismObject obj = objects.get(0); - AssertJUnit.assertTrue(obj.getCompileTimeClass().equals(GenericObjectType.class)); - - result = new OperationResult("count"); - long count = repositoryService.countObjects(GenericObjectType.class, ObjectQuery.createObjectQuery(eq), - result); - result.computeStatus(); - AssertJUnit.assertTrue(result.isSuccess()); - AssertJUnit.assertEquals(1, count); - } finally { - close(session); - } - } - - @Test(enabled=false) - public void test440queryAssignmentExtensionBoolean() throws Exception { - Session session = open(); - try { - Criteria main = session.createCriteria(RUser.class, "u"); - Criteria a = main.createCriteria("assignments", "a"); - a.add(Restrictions.eq("a.assignmentOwner", RAssignmentOwner.FOCUS)); - Criteria e = a.createCriteria("a.extension"); - - Criteria b = e.createCriteria("booleans", "b"); - - Conjunction c1 = Restrictions.conjunction(); - c1.add(Restrictions.eq("b.extensionType", RAssignmentExtensionType.EXTENSION)); - c1.add(Restrictions.eq("b.name", SKIP_AUTOGENERATION)); - c1.add(Restrictions.eq("b.value", true)); - - main.add(c1); - main.setProjection(Projections.property("u.fullObject")); - - String expected = HibernateToSqlTranslator.toSql(main); - - SchemaRegistry registry = prismContext.getSchemaRegistry(); - PrismObjectDefinition userDef = registry.findObjectDefinitionByCompileTimeClass(UserType.class); - PrismContainerDefinition assignmentDef = userDef.findContainerDefinition(UserType.F_ASSIGNMENT); - PrismPropertyDefinition propDef = assignmentDef.createPropertyDefinition(SKIP_AUTOGENERATION, DOMUtil.XSD_BOOLEAN); - - ObjectQuery objectQuery = QueryBuilder.queryFor(UserType.class, prismContext) - .itemWithDef(propDef, UserType.F_ASSIGNMENT, AssignmentType.F_EXTENSION, SKIP_AUTOGENERATION).eq(true) - .build(); - - String real = getInterpretedQuery(session, UserType.class, objectQuery); - - LOGGER.info("exp. query>\n{}\nreal query>\n{}", new Object[]{expected, real}); - AssertJUnit.assertEquals(expected, real); - - OperationResult result = new OperationResult("search"); - List> objects = repositoryService.searchObjects(UserType.class, objectQuery, null, result); - result.computeStatus(); - AssertJUnit.assertTrue(result.isSuccess()); - - AssertJUnit.assertNotNull(objects); - AssertJUnit.assertEquals(1, objects.size()); - - PrismObject obj = objects.get(0); - AssertJUnit.assertTrue(obj.getCompileTimeClass().equals(UserType.class)); - - result = new OperationResult("count"); - long count = repositoryService.countObjects(UserType.class, objectQuery, result); - result.computeStatus(); - AssertJUnit.assertTrue(result.isSuccess()); - AssertJUnit.assertEquals(1, count); - } finally { - close(session); - } - } -} diff --git a/repo/repo-test-util/src/main/java/com/evolveum/midpoint/test/AbstractIntegrationTest.java b/repo/repo-test-util/src/main/java/com/evolveum/midpoint/test/AbstractIntegrationTest.java index a966f68f845..b33dbe2c128 100644 --- a/repo/repo-test-util/src/main/java/com/evolveum/midpoint/test/AbstractIntegrationTest.java +++ b/repo/repo-test-util/src/main/java/com/evolveum/midpoint/test/AbstractIntegrationTest.java @@ -47,6 +47,7 @@ import com.evolveum.midpoint.prism.query.ObjectFilter; import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.prism.query.RefFilter; +import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import com.evolveum.midpoint.prism.util.PrismAsserts; import com.evolveum.midpoint.prism.util.PrismTestUtil; import com.evolveum.midpoint.repo.api.RepoAddOptions; @@ -978,12 +979,11 @@ protected ObjectQuery createAccountShadowQuery(String identifier, PrismObject resource) throws SchemaException { @@ -996,13 +996,12 @@ protected ObjectQuery createShadowQuerySecondaryIdentifier(ObjectClassComplexTyp Collection identifierDefs = rAccount.getSecondaryIdentifiers(); assert identifierDefs.size() == 1 : "Unexpected identifier set in "+resource+" refined schema: "+identifierDefs; ResourceAttributeDefinition identifierDef = identifierDefs.iterator().next(); - //TODO: set matching rule instead of null - EqualFilter idFilter = EqualFilter.createEqual(new ItemPath(ShadowType.F_ATTRIBUTES, identifierDef.getName()), identifierDef, identifier); - EqualFilter ocFilter = EqualFilter.createEqual(ShadowType.F_OBJECT_CLASS, ShadowType.class, prismContext, null, - rAccount.getTypeName()); - RefFilter resourceRefFilter = RefFilter.createReferenceEqual(ShadowType.F_RESOURCE_REF, ShadowType.class, resource); - AndFilter filter = AndFilter.createAnd(idFilter, ocFilter, resourceRefFilter); - return ObjectQuery.createObjectQuery(filter); + //TODO: set matching rule instead of null + return QueryBuilder.queryFor(ShadowType.class, prismContext) + .itemWithDef(identifierDef, ShadowType.F_ATTRIBUTES, identifierDef.getName()).eq(identifier) + .and().item(ShadowType.F_OBJECT_CLASS).eq(rAccount.getTypeName()) + .and().item(ShadowType.F_RESOURCE_REF).ref(resource.getOid()) + .build(); } protected PrismObjectDefinition getUserDefinition() { From e607504ef78a6c94ec4de9791ee8c4f3233ddefa Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Wed, 12 Oct 2016 13:18:00 +0200 Subject: [PATCH 27/74] Cleaning up filters. Interim commit. --- .../web/component/dialog/DeleteAllPanel.java | 7 +- .../objectdetails/FocusMainPanel.java | 23 +- .../web/component/prism/PrismValuePanel.java | 25 +- .../midpoint/web/component/search/Search.java | 5 +- .../certification/PageCertCampaigns.java | 21 +- .../admin/configuration/PageAccounts.java | 101 +++---- .../admin/configuration/PageDebugList.java | 30 ++- .../web/page/admin/home/PageDashboard.java | 7 +- .../admin/reports/PageCreatedReports.java | 44 +-- .../web/page/admin/reports/PageReports.java | 28 +- .../admin/resources/PageAdminResources.java | 20 +- .../admin/resources/ResourceContentPanel.java | 7 +- .../resources/ResourceDetailsTabPanel.java | 6 +- .../admin/resources/ResourceTasksPanel.java | 7 +- .../web/page/admin/roles/RoleMemberPanel.java | 108 +++----- .../web/page/admin/server/PageTasks.java | 50 ++-- .../dto/TaskDtoExecutionStatusFilter.java | 21 +- .../admin/users/component/OrgMemberPanel.java | 21 +- .../forgetpassword/PageForgetPassword.java | 13 +- infra/pom.xml | 1 + infra/prism-api/pom.xml | 231 +++++++--------- infra/prism/pom.xml | 10 +- .../prism/marshaller/QueryConvertor.java | 10 +- .../midpoint/prism/query/EqualFilter.java | 64 +---- .../midpoint/prism/query/LogicalFilter.java | 4 +- .../prism/query/PropertyValueFilter.java | 69 +++-- .../midpoint/prism/query/RefFilter.java | 136 +--------- .../midpoint/prism/query/SubstringFilter.java | 61 +---- .../prism/query/builder/R_AtomicFilter.java | 60 ++++- .../prism/query/builder/R_Filter.java | 78 ++++-- .../query/builder/S_AtomicFilterEntry.java | 9 +- .../prism/query/builder/S_ConditionEntry.java | 5 + .../prism/query/builder/S_FilterExit.java | 5 +- .../prism/query/TestQueryBuilder.java | 42 +-- .../midpoint/schema/util/ObjectQueryUtil.java | 66 +++-- .../test/BasicCertificationTest.java | 15 +- .../test/CriticalRolesCertificationTest.java | 7 +- .../test/RoleInducementCertificationTest.java | 7 +- .../impl/controller/ModelDiagController.java | 24 +- .../impl/expr/OrgStructFunctionsImpl.java | 12 +- .../ShadowIntegrityCheckResultHandler.java | 19 +- .../midpoint/model/impl/lens/Clockwork.java | 6 +- .../lens/projector/AssignmentProcessor.java | 16 +- .../projector/FocusConstraintsChecker.java | 6 +- .../actions/DiscoverConnectorsExecutor.java | 11 +- .../actions/TestResourceExecutor.java | 12 +- .../impl/sync/ReconciliationTaskHandler.java | 36 +-- .../midpoint/model/intest/TestIteration.java | 6 +- .../midpoint/model/intest/TestRbac.java | 9 +- .../model/intest/sync/TestImportRecon.java | 17 +- .../test/AbstractModelIntegrationTest.java | 23 +- .../midpoint/report/impl/ReportFunctions.java | 13 +- .../midpoint/wf/impl/AbstractWfTest.java | 5 +- .../impl/ObjectAlreadyExistHandler.java | 27 +- .../provisioning/impl/ConnectorManager.java | 11 +- .../provisioning/impl/ShadowManager.java | 60 ++--- .../impl/TestConnectorDiscovery.java | 14 +- .../provisioning/impl/dummy/TestDummy.java | 19 +- .../midpoint/repo/sql/ConcurrencyTest.java | 5 +- .../midpoint/repo/sql/EncodingTest.java | 8 +- .../midpoint/repo/sql/OrgStructTest.java | 22 +- .../repo/sql/QueryInterpreter2Test.java | 250 ++++++++---------- .../midpoint/repo/sql/SearchTest.java | 108 ++++---- .../test/AbstractIntegrationTest.java | 18 +- .../midpoint/test/IntegrationTestTools.java | 15 +- .../security/impl/SecurityEnforcerImpl.java | 9 +- .../quartzimpl/TaskManagerQuartzImpl.java | 72 ++--- .../task/quartzimpl/TaskQuartzImpl.java | 11 +- .../TestQuartzTaskManagerContract.java | 5 +- .../testing/conntest/AbstractEDirTest.java | 18 +- .../testing/conntest/AbstractLdapTest.java | 8 +- .../midpoint/testing/story/TestVillage.java | 11 +- 72 files changed, 976 insertions(+), 1354 deletions(-) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/dialog/DeleteAllPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/dialog/DeleteAllPanel.java index bf22f562128..d45c091c722 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/dialog/DeleteAllPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/dialog/DeleteAllPanel.java @@ -7,6 +7,7 @@ import com.evolveum.midpoint.prism.query.NotFilter; import com.evolveum.midpoint.prism.query.ObjectFilter; import com.evolveum.midpoint.prism.query.ObjectQuery; +import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import com.evolveum.midpoint.schema.GetOperationOptions; import com.evolveum.midpoint.schema.SelectorOptions; import com.evolveum.midpoint.schema.result.OperationResult; @@ -283,8 +284,10 @@ private void countShadows(boolean isAccountShadow){ options.add(SelectorOptions.create(ItemPath.EMPTY_PATH, opt)); try { - ObjectFilter filter = EqualFilter.createEqual(ShadowType.F_KIND, ShadowType.class, getPagebase().getPrismContext(), null, ShadowKindType.ACCOUNT); - if(isAccountShadow){ + ObjectFilter filter = QueryBuilder.queryFor(ShadowType.class, getPagebase().getPrismContext()) + .item(ShadowType.F_KIND).eq(ShadowKindType.ACCOUNT) + .buildFilter(); + if (isAccountShadow) { ObjectQuery query = ObjectQuery.createObjectQuery(filter); dto.setAccountShadowCount(getPagebase().getModelService().countObjects(ShadowType.class, query, options, task, result)); dto.setObjectsToDelete(dto.getObjectsToDelete() + dto.getAccountShadowCount()); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/objectdetails/FocusMainPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/objectdetails/FocusMainPanel.java index 53a915f0d0b..abd87b7d56f 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/objectdetails/FocusMainPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/objectdetails/FocusMainPanel.java @@ -23,6 +23,7 @@ import com.evolveum.midpoint.gui.api.util.FocusTabVisibleBehavior; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.query.*; +import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import com.evolveum.midpoint.security.api.AuthorizationConstants; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.util.exception.SystemException; @@ -93,25 +94,19 @@ protected void onInitialize() { } private ObjectQuery createTaskQuery(String oid, PageBase page) { - List filters = new ArrayList(); - if (oid == null) { oid = "non-existent"; // TODO !!!!!!!!!!!!!!!!!!!! } - try { - filters.add(RefFilter.createReferenceEqual(TaskType.F_OBJECT_REF, TaskType.class, - page.getPrismContext(), oid)); - filters.add(NotFilter.createNot(EqualFilter.createEqual(TaskType.F_EXECUTION_STATUS, - TaskType.class, page.getPrismContext(), null, TaskExecutionStatusType.CLOSED))); - filters.add(EqualFilter.createEqual(TaskType.F_PARENT, TaskType.class, page.getPrismContext(), null)); - } catch (SchemaException e) { - throw new SystemException("Unexpected SchemaException when creating task filter", e); - } - - return new ObjectQuery().createObjectQuery(AndFilter.createAnd(filters)); + return QueryBuilder.queryFor(TaskType.class, page.getPrismContext()) + .item(TaskType.F_OBJECT_REF).ref(oid) + .and() + .block() + .not().item(TaskType.F_EXECUTION_STATUS).eq(TaskExecutionStatusType.CLOSED) + .endBlock() + .and().item(TaskType.F_PARENT).isNull() + .build(); } - @Override protected List createTabs(final PageAdminObjectDetails parentPage) { List tabs = new ArrayList<>(); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/PrismValuePanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/PrismValuePanel.java index 521f8682b4d..93384e4e357 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/PrismValuePanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/PrismValuePanel.java @@ -29,6 +29,7 @@ import com.evolveum.midpoint.prism.delta.ObjectDelta; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.query.*; +import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import com.evolveum.midpoint.prism.xml.XsdTypeMapper; import com.evolveum.midpoint.schema.DeltaConvertor; import com.evolveum.midpoint.schema.GetOperationOptions; @@ -42,7 +43,6 @@ import com.evolveum.midpoint.util.DOMUtil; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.util.exception.SystemException; -import com.evolveum.midpoint.util.logging.LoggingUtils; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.web.component.LockoutStatusPanel; @@ -731,7 +731,7 @@ public void checkInputValue(AutoCompleteTextField input, AjaxRequestTarget targe RefinedObjectClassDefinition assocTargetDef = assocDef.getAssociationTarget(); ObjectQuery query = getAssociationsSearchQuery(prismContext, resource, - assocTargetDef.getTypeName(), assocTargetDef.getKind(), assocTargetDef.getIntent()); + assocTargetDef.getTypeName(), assocTargetDef.getKind()); List values = item.getValues(); return new AssociationValueChoicePanel(id, valueWrapperModel, values, false, ShadowType.class, @@ -890,21 +890,12 @@ private void removeValue(AjaxRequestTarget target) { target.add(parent.getParent()); } - private ObjectQuery getAssociationsSearchQuery(PrismContext prismContext, PrismObject resource, QName objectClass, ShadowKindType kind, - String intent) { - try { - ObjectFilter andFilter = AndFilter.createAnd( - EqualFilter.createEqual(ShadowType.F_OBJECT_CLASS, ShadowType.class, prismContext, objectClass), - EqualFilter.createEqual(ShadowType.F_KIND, ShadowType.class, prismContext, kind), -// EqualFilter.createEqual(ShadowType.F_INTENT, ShadowType.class, prismContext, intent), - RefFilter.createReferenceEqual(new ItemPath(ShadowType.F_RESOURCE_REF), ShadowType.class, prismContext, resource.getOid())); - ObjectQuery query = ObjectQuery.createObjectQuery(andFilter); - return query; - } catch (SchemaException ex) { - LoggingUtils.logUnexpectedException(LOGGER, "Unable to create associations search query", ex); - return null; - } - + private ObjectQuery getAssociationsSearchQuery(PrismContext prismContext, PrismObject resource, QName objectClass, ShadowKindType kind) { + return QueryBuilder.queryFor(ShadowType.class, prismContext) + .item(ShadowType.F_OBJECT_CLASS).eq(objectClass) + .and().item(ShadowType.F_KIND).eq(kind) + .and().item(ShadowType.F_RESOURCE_REF).ref(resource.getOid()) + .build(); } } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/Search.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/Search.java index 68ac9d1dd62..cb996789195 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/Search.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/Search.java @@ -186,8 +186,9 @@ private ObjectFilter createFilterForSearchValue(SearchItem item, DisplayableValu ItemPath path = item.getPath(); if (definition instanceof PrismReferenceDefinition) { - PrismReferenceValue value = (PrismReferenceValue) searchValue.getValue(); - return RefFilter.createReferenceEqual(path, (PrismReferenceDefinition) definition, value); + return QueryBuilder.queryFor(ObjectType.class, ctx) + .item(path, definition).ref((PrismReferenceValue) searchValue.getValue()) + .buildFilter(); } PrismPropertyDefinition propDef = (PrismPropertyDefinition) definition; diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/certification/PageCertCampaigns.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/certification/PageCertCampaigns.java index d4b4f687b06..72a2be33b97 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/certification/PageCertCampaigns.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/certification/PageCertCampaigns.java @@ -25,6 +25,7 @@ import com.evolveum.midpoint.prism.query.ObjectFilter; import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.prism.query.RefFilter; +import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import com.evolveum.midpoint.schema.constants.ObjectTypes; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.result.OperationResultStatus; @@ -136,21 +137,13 @@ public CertCampaignListItemDto createDataObjectWrapper( private ObjectQuery createQuery() { // TODO filtering based on e.g. campaign state/stage (not started, // active, finished) - ObjectQuery query = new ObjectQuery(); - if (definitionOid != null) { - ObjectReferenceType ref = ObjectTypeUtil.createObjectRef(definitionOid, - ObjectTypes.ACCESS_CERTIFICATION_DEFINITION); - ObjectFilter filter; - try { - filter = RefFilter.createReferenceEqual( - new ItemPath(AccessCertificationCampaignType.F_DEFINITION_REF), - AccessCertificationCampaignType.class, getPrismContext(), ref.asReferenceValue()); - } catch (SchemaException e) { - throw new SystemException("Unexpected schema exception: " + e.getMessage(), e); - } - query = ObjectQuery.createObjectQuery(filter); + if (definitionOid == null) { + return new ObjectQuery(); + } else { + return QueryBuilder.queryFor(AccessCertificationCampaignType.class, getPrismContext()) + .item(AccessCertificationCampaignType.F_DEFINITION_REF).ref(definitionOid) + .build(); } - return query; } // endregion diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageAccounts.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageAccounts.java index 3204556970e..93bc58c8b6b 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageAccounts.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageAccounts.java @@ -31,6 +31,9 @@ import javax.xml.namespace.QName; +import com.evolveum.midpoint.prism.query.builder.QueryBuilder; +import com.evolveum.midpoint.prism.query.builder.S_AtomicFilterEntry; +import com.evolveum.midpoint.util.exception.CommonException; import org.apache.commons.io.IOUtils; import org.apache.commons.lang.StringUtils; import org.apache.wicket.AttributeModifier; @@ -70,14 +73,12 @@ import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.PrismProperty; -import com.evolveum.midpoint.prism.match.PolyStringNormMatchingRule; import com.evolveum.midpoint.prism.polystring.PolyStringNormalizer; import com.evolveum.midpoint.prism.query.AndFilter; import com.evolveum.midpoint.prism.query.EqualFilter; import com.evolveum.midpoint.prism.query.ObjectFilter; import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.prism.query.RefFilter; -import com.evolveum.midpoint.prism.query.SubstringFilter; import com.evolveum.midpoint.schema.AbstractSummarizingResultHandler; import com.evolveum.midpoint.schema.GetOperationOptions; import com.evolveum.midpoint.schema.ResultHandler; @@ -535,14 +536,12 @@ protected Integer load() { Task task = createSimpleTask(OPERATION_GET_TOTALS); OperationResult result = new OperationResult(OPERATION_GET_TOTALS); try { - EqualFilter situationFilter = EqualFilter.createEqual(ShadowType.F_SYNCHRONIZATION_SITUATION, ShadowType.class, - getPrismContext(), null, situation); - - AndFilter andFilter = AndFilter.createAnd(filter, situationFilter); - ObjectQuery query = ObjectQuery.createObjectQuery(andFilter); - + ObjectFilter situationFilter = QueryBuilder.queryFor(ShadowType.class, getPrismContext()) + .item(ShadowType.F_SYNCHRONIZATION_SITUATION).eq(situation) + .buildFilter(); + ObjectQuery query = ObjectQuery.createObjectQuery(AndFilter.createAnd(filter, situationFilter)); return getModelService().countObjects(ShadowType.class, query, options, task, result); - } catch (Exception ex) { + } catch (CommonException|RuntimeException ex) { LoggingUtils.logUnexpectedException(LOGGER, "Couldn't count shadows", ex); } @@ -721,23 +720,19 @@ private ObjectFilter createResourceQueryFilter() { if (dto == null) { return null; } - OperationResult result = new OperationResult(OPERATION_LOAD_ACCOUNTS); String oid = dto.getOid(); - try { - return RefFilter.createReferenceEqual(ShadowType.F_RESOURCE_REF, ShadowType.class, - getPrismContext(), oid); - } catch (Exception ex) { - LoggingUtils.logUnexpectedException(LOGGER, "Couldn't create query", ex); - error("Couldn't create query, reason: " + ex.getMessage()); - } finally { - result.recomputeStatus(); - } + return QueryBuilder.queryFor(ShadowType.class, getPrismContext()) + .item(ShadowType.F_RESOURCE_REF).ref(oid) + .buildFilter(); + } - if (!WebComponentUtil.isSuccessOrHandledError(result)) { - showResult(result); + private ObjectQuery appendResourceQueryFilter(S_AtomicFilterEntry q) { + ResourceItemDto dto = resourceModel.getObject(); + if (dto == null) { + return q.all().build(); // TODO ok? + } else { + return q.item(ShadowType.F_RESOURCE_REF).ref(dto.getOid()).build(); } - - return null; } private List loadResources() { @@ -997,69 +992,41 @@ private void searchPerformed(AjaxRequestTarget target){ target.add(getAccountsContainer()); } - private ObjectQuery createObjectQuery(){ + private ObjectQuery createObjectQuery() { AccountDetailsSearchDto dto = searchModel.getObject(); - ObjectQuery query = new ObjectQuery(); - List filters = new ArrayList<>(); String searchText = dto.getText(); ShadowKindType kind = dto.getKind(); String intent = dto.getIntent(); String objectClass = dto.getObjectClass(); FailedOperationTypeType failedOperatonType = dto.getFailedOperationType(); - if(StringUtils.isNotEmpty(searchText)){ + S_AtomicFilterEntry q = QueryBuilder.queryFor(ShadowType.class, getPrismContext()); + + if (StringUtils.isNotEmpty(searchText)) { PolyStringNormalizer normalizer = getPrismContext().getDefaultPolyStringNormalizer(); String normalized = normalizer.normalize(searchText); - - ObjectFilter substring = SubstringFilter.createSubstring(ShadowType.F_NAME, ShadowType.class, getPrismContext(), - PolyStringNormMatchingRule.NAME, normalized); - filters.add(substring); + q = q.item(ShadowType.F_NAME).contains(normalized).matchingNorm().and(); } - - if(kind != null){ - ObjectFilter kindFilter = EqualFilter.createEqual(ShadowType.F_KIND, ShadowType.class, getPrismContext(), - null, kind); - filters.add(kindFilter); + if (kind != null) { + q = q.item(ShadowType.F_KIND).eq(kind).and(); } - - if(StringUtils.isNotEmpty(intent)){ - ObjectFilter intentFilter = EqualFilter.createEqual(ShadowType.F_INTENT, ShadowType.class, getPrismContext(), - null, intent); - filters.add(intentFilter); + if (StringUtils.isNotEmpty(intent)) { + q = q.item(ShadowType.F_INTENT).eq(kind).and(); } - if (failedOperatonType != null){ - ObjectFilter failedOperationFilter = EqualFilter.createEqual(ShadowType.F_FAILED_OPERATION_TYPE, ShadowType.class, getPrismContext(), - null, failedOperatonType); - filters.add(failedOperationFilter); + q = q.item(ShadowType.F_FAILED_OPERATION_TYPE).eq(failedOperatonType).and(); } - - if(StringUtils.isNotEmpty(objectClass)){ + if (StringUtils.isNotEmpty(objectClass)) { QName objClass = new QName(objectClass); - - for(QName q: dto.getObjectClassList()){ - if(objectClass.equals(q.getLocalPart())){ - objClass = q; + for (QName qn: dto.getObjectClassList()) { + if (objectClass.equals(qn.getLocalPart())){ + objClass = qn; } } - - ObjectFilter objectClassFilter = EqualFilter.createEqual(ShadowType.F_OBJECT_CLASS, ShadowType.class, getPrismContext(), - null, objClass); - filters.add(objectClassFilter); - } - - AndFilter searchFilter; - if(!filters.isEmpty()){ - searchFilter = AndFilter.createAnd(filters); - - ObjectFilter resourceFilter = createResourceQueryFilter(); - query.setFilter(resourceFilter != null ? AndFilter.createAnd(searchFilter, resourceFilter) : searchFilter); - } else { - query.setFilter(createResourceQueryFilter()); + q = q.item(ShadowType.F_OBJECT_CLASS).eq(objClass).and(); } - - return query; + return appendResourceQueryFilter(q); } private void clearSearchPerformed(AjaxRequestTarget target){ diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageDebugList.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageDebugList.java index 4e36f2a79d5..196e3b49900 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageDebugList.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageDebugList.java @@ -23,6 +23,7 @@ import javax.xml.namespace.QName; +import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import com.evolveum.midpoint.web.component.data.BaseSortableDataProvider; import com.evolveum.midpoint.web.component.dialog.*; import com.evolveum.midpoint.web.component.search.Search; @@ -535,9 +536,10 @@ private ObjectQuery createQuery(ObjectQuery searchQuery) { List filters = new ArrayList<>(); if (ObjectTypes.SHADOW.equals(dto.getType()) && dto.getResource() != null) { String oid = dto.getResource().getOid(); - RefFilter ref = RefFilter.createReferenceEqual(ShadowType.F_RESOURCE_REF, ShadowType.class, - getPrismContext(), oid); - filters.add(ref); + ObjectFilter objectFilter = QueryBuilder.queryFor(ShadowType.class, getPrismContext()) + .item(ShadowType.F_RESOURCE_REF).ref(oid) + .buildFilter(); + filters.add(objectFilter); } if (searchQuery != null && searchQuery.getFilter() != null) { @@ -652,17 +654,18 @@ private ObjectQuery createDeleteAllUsersQuery() { private String deleteAllShadowsConfirmed(OperationResult result, boolean deleteAccountShadows) throws ObjectAlreadyExistsException, ObjectNotFoundException, SchemaException { - ObjectFilter kind = EqualFilter.createEqual(ShadowType.F_KIND, ShadowType.class, getPrismContext(), - null, ShadowKindType.ACCOUNT); + ObjectFilter kindFilter = QueryBuilder.queryFor(ShadowType.class, getPrismContext()) + .item(ShadowType.F_KIND).eq(ShadowKindType.ACCOUNT) + .buildFilter(); String taskName; ObjectQuery query; if (deleteAccountShadows) { taskName = "Delete all account shadows"; - query = ObjectQuery.createObjectQuery(kind); + query = ObjectQuery.createObjectQuery(kindFilter); } else { taskName = "Delete all non-account shadows"; - query = ObjectQuery.createObjectQuery(NotFilter.createNot(kind)); + query = ObjectQuery.createObjectQuery(NotFilter.createNot(kindFilter)); } return deleteObjectsAsync(ShadowType.COMPLEX_TYPE, query, true, taskName, result); @@ -827,11 +830,10 @@ private void exportAllShadowsOnResource(AjaxRequestTarget target) { return; } - RefFilter ref = RefFilter.createReferenceEqual(ShadowType.F_RESOURCE_REF, ShadowType.class, - getPrismContext(), dto.getResource().getOid()); - ObjectQuery objectQuery = ObjectQuery.createObjectQuery(ref); + ObjectQuery objectQuery = QueryBuilder.queryFor(ShadowType.class, getPrismContext()) + .item(ShadowType.F_RESOURCE_REF).ref(dto.getResource().getOid()) + .build(); initDownload(target, dto.getType().getClassDefinition(), objectQuery); - } private Popupable getDeleteConfirmationPanel() { @@ -874,9 +876,9 @@ private void deleteAllShadowsOnResourceConfirmed(AjaxRequestTarget target) { OperationResult result = new OperationResult(OPERATION_DELETE_SHADOWS); String taskOid = null; try { - RefFilter ref = RefFilter.createReferenceEqual(ShadowType.F_RESOURCE_REF, ShadowType.class, - getPrismContext(), dto.getResource().getOid()); - ObjectQuery objectQuery = ObjectQuery.createObjectQuery(ref); + ObjectQuery objectQuery = QueryBuilder.queryFor(ShadowType.class, getPrismContext()) + .item(ShadowType.F_RESOURCE_REF).ref(dto.getResource().getOid()) + .build(); QName type = ShadowType.COMPLEX_TYPE; diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/home/PageDashboard.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/home/PageDashboard.java index e76e1ebcbd6..a956b51a915 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/home/PageDashboard.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/home/PageDashboard.java @@ -220,10 +220,9 @@ private Component createTaskInfoBoxPanel(OperationResult result, Task task) { if (totalCount == null) { totalCount = 0; } - - EqualFilter filter = EqualFilter.createEqual(TaskType.F_EXECUTION_STATUS, - TaskType.class, getPrismContext(), TaskExecutionStatusType.RUNNABLE); - ObjectQuery query = ObjectQuery.createObjectQuery(filter); + ObjectQuery query = QueryBuilder.queryFor(TaskType.class, getPrismContext()) + .item(TaskType.F_EXECUTION_STATUS).eq(TaskExecutionStatusType.RUNNABLE) + .build(); Integer activeCount = getModelService().countObjects(TaskType.class, query, null, task, result); if (activeCount == null) { activeCount = 0; diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/PageCreatedReports.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/PageCreatedReports.java index 45f4f05c86f..c13747da09a 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/PageCreatedReports.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/PageCreatedReports.java @@ -24,6 +24,8 @@ import com.evolveum.midpoint.prism.match.PolyStringNormMatchingRule; import com.evolveum.midpoint.prism.polystring.PolyStringNormalizer; import com.evolveum.midpoint.prism.query.*; +import com.evolveum.midpoint.prism.query.builder.QueryBuilder; +import com.evolveum.midpoint.prism.query.builder.S_AtomicFilterEntry; import com.evolveum.midpoint.prism.xml.XmlTypeConverter; import com.evolveum.midpoint.report.api.ReportManager; import com.evolveum.midpoint.schema.result.OperationResult; @@ -466,40 +468,20 @@ private void deleteAllConfirmedPerformed(AjaxRequestTarget target) { private ObjectQuery createQuery() { ReportOutputSearchDto dto = searchModel.getObject(); + S_AtomicFilterEntry q = QueryBuilder.queryFor(ReportOutputType.class, getPrismContext()); - try { - List ands = new ArrayList<>(); - - if (StringUtils.isNotEmpty(dto.getText())) { - PolyStringNormalizer normalizer = getPrismContext().getDefaultPolyStringNormalizer(); - String normalizedString = normalizer.normalize(dto.getText()); - - SubstringFilter substring = SubstringFilter.createSubstring(ReportOutputType.F_NAME, - ReportOutputType.class, getPrismContext(), PolyStringNormMatchingRule.NAME, normalizedString); - ands.add(substring); - } - - String oid = dto.getReportTypeMap().get(dto.getReportType()); - if (StringUtils.isNotEmpty(oid)) { - RefFilter ref = RefFilter.createReferenceEqual(ReportOutputType.F_REPORT_REF, ReportOutputType.class, - getPrismContext(), oid); - ands.add(ref); - } + if (StringUtils.isNotEmpty(dto.getText())) { + PolyStringNormalizer normalizer = getPrismContext().getDefaultPolyStringNormalizer(); + String normalizedString = normalizer.normalize(dto.getText()); + q = q.item(ReportOutputType.F_NAME).containsPoly(normalizedString).matchingNorm().and(); + } - switch (ands.size()) { - case 0: - return null; - case 1: - return ObjectQuery.createObjectQuery(ands.get(0)); - default: - AndFilter and = AndFilter.createAnd(ands); - return ObjectQuery.createObjectQuery(and); - } - } catch (Exception e) { - error(getString("pageCreatedReports.message.queryError") + " " + e.getMessage()); - LoggingUtils.logUnexpectedException(LOGGER, "Couldn't create query filter.", e); - return null; + String oid = dto.getReportTypeMap().get(dto.getReportType()); + if (StringUtils.isNotEmpty(oid)) { + q = q.item(ReportOutputType.F_REPORT_REF).ref(oid).and(); } + + return q.all().build(); } private InputStream createReport(AjaxDownloadBehaviorFromStream ajaxDownloadBehaviorFromStream) { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/PageReports.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/PageReports.java index e0da9e8e9ce..a03bad2b128 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/PageReports.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/PageReports.java @@ -21,6 +21,9 @@ import com.evolveum.midpoint.prism.match.PolyStringNormMatchingRule; import com.evolveum.midpoint.prism.polystring.PolyStringNormalizer; import com.evolveum.midpoint.prism.query.*; +import com.evolveum.midpoint.prism.query.builder.QueryBuilder; +import com.evolveum.midpoint.prism.query.builder.S_AtomicFilterEntry; +import com.evolveum.midpoint.prism.query.builder.S_FilterEntryOrEmpty; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.security.api.AuthorizationConstants; import com.evolveum.midpoint.task.api.Task; @@ -270,32 +273,17 @@ private ObjectQuery createQuery() { ReportSearchDto dto = searchModel.getObject(); String text = dto.getText(); Boolean parent = !dto.isParent(); - ObjectQuery query = new ObjectQuery(); - List filters = new ArrayList<>(); + S_AtomicFilterEntry q = QueryBuilder.queryFor(ReportType.class, getPrismContext()); if (StringUtils.isNotEmpty(text)) { PolyStringNormalizer normalizer = getPrismContext().getDefaultPolyStringNormalizer(); String normalizedText = normalizer.normalize(text); - - ObjectFilter substring = SubstringFilter.createSubstring(ReportType.F_NAME, ReportType.class, - getPrismContext(), PolyStringNormMatchingRule.NAME, normalizedText); - - filters.add(substring); - } - - if (parent == true) { - EqualFilter parentFilter = EqualFilter.createEqual(ReportType.F_PARENT, ReportType.class, - getPrismContext(), null, parent); - filters.add(parentFilter); + q = q.item(ReportType.F_NAME).eqPoly(normalizedText).matchingNorm().and(); } - - if (!filters.isEmpty()) { - query.setFilter(AndFilter.createAnd(filters)); - } else { - query = null; + if (parent) { + q = q.item(ReportType.F_PARENT).eq(true).and(); } - - return query; + return q.all().build(); } private void clearSearchPerformed(AjaxRequestTarget target) { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/PageAdminResources.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/PageAdminResources.java index 60e21bbba66..5c65d13b183 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/PageAdminResources.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/PageAdminResources.java @@ -25,6 +25,7 @@ import com.evolveum.midpoint.prism.delta.PropertyDelta; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.query.*; +import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import com.evolveum.midpoint.schema.GetOperationOptions; import com.evolveum.midpoint.schema.SelectorOptions; import com.evolveum.midpoint.schema.constants.SchemaConstants; @@ -121,21 +122,14 @@ protected void deleteSyncTokenPerformed(AjaxRequestTarget target, ResourceType r PrismObject oldTask; OperationResult result = new OperationResult(OPERATION_DELETE_SYNC_TOKEN); - ObjectQuery query; + ObjectQuery query = QueryBuilder.queryFor(TaskType.class, getPrismContext()) + .item(TaskType.F_OBJECT_REF).ref(resourceOid) + .and().item(TaskType.F_HANDLER_URI).eq(handlerUri) + .build(); - ObjectFilter refFilter = RefFilter.createReferenceEqual(TaskType.F_OBJECT_REF, TaskType.class, - getPrismContext(), resourceOid); + List> taskList = WebModelServiceUtils.searchObjects(TaskType.class, query, result, this); - ObjectFilter filterHandleUri = EqualFilter.createEqual(TaskType.F_HANDLER_URI, TaskType.class, - getPrismContext(), null, handlerUri); - - query = new ObjectQuery(); - query.setFilter(AndFilter.createAnd(refFilter, filterHandleUri)); - - List> taskList = WebModelServiceUtils.searchObjects(TaskType.class, query, - result, this); - - if(taskList.size() != 1){ + if (taskList.size() != 1) { error(getString("pageResource.message.invalidTaskSearch")); } else { oldTask = taskList.get(0); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/ResourceContentPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/ResourceContentPanel.java index 3e7819c4eb5..41fb9e3c38e 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/ResourceContentPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/ResourceContentPanel.java @@ -22,6 +22,7 @@ import javax.xml.namespace.QName; +import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import com.evolveum.midpoint.web.session.SessionStorage; import org.apache.commons.lang.StringUtils; import org.apache.wicket.ajax.AjaxRequestTarget; @@ -344,9 +345,9 @@ public boolean isVisible() { List> tasks = WebModelServiceUtils .searchObjects(TaskType.class, - ObjectQuery.createObjectQuery(RefFilter.createReferenceEqual(TaskType.F_OBJECT_REF, - TaskType.class, getPageBase().getPrismContext(), - getResourceModel().getObject().getOid())), + QueryBuilder.queryFor(TaskType.class, getPageBase().getPrismContext()) + .item(TaskType.F_OBJECT_REF).ref(getResourceModel().getObject().getOid()) + .build(), result, getPageBase()); List tasksForKind = getTasksForKind(tasks); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/ResourceDetailsTabPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/ResourceDetailsTabPanel.java index 2c494b44f80..9adf319327d 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/ResourceDetailsTabPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/ResourceDetailsTabPanel.java @@ -21,6 +21,7 @@ import javax.xml.namespace.QName; +import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang.StringUtils; import org.apache.wicket.ajax.AjaxRequestTarget; @@ -181,8 +182,9 @@ private List createResourceConfigList(ResourceType res OperationResult result = new OperationResult(OPERATION_SEARCH_TASKS_FOR_RESOURCE); List> tasks = WebModelServiceUtils.searchObjects(TaskType.class, - ObjectQuery.createObjectQuery(RefFilter.createReferenceEqual(TaskType.F_OBJECT_REF, - TaskType.class, parentPage.getPrismContext(), resource.getOid())), + QueryBuilder.queryFor(TaskType.class, parentPage.getPrismContext()) + .item(TaskType.F_OBJECT_REF).ref(resource.getOid()) + .build(), result, parentPage); List configs = new ArrayList<>(); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/ResourceTasksPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/ResourceTasksPanel.java index f2ce7ba43c2..ea7c5c06f75 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/ResourceTasksPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/ResourceTasksPanel.java @@ -18,6 +18,7 @@ import java.util.ArrayList; import java.util.List; +import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import org.apache.wicket.Component; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn; @@ -95,9 +96,9 @@ private ListModel createTaskModel(PrismObject object) { OperationResult result = new OperationResult(OPERATION_LOAD_TASKS); List> tasks = WebModelServiceUtils .searchObjects(TaskType.class, - ObjectQuery.createObjectQuery(RefFilter.createReferenceEqual(TaskType.F_OBJECT_REF, - TaskType.class, pageBase.getPrismContext(), - object.getOid())), + QueryBuilder.queryFor(TaskType.class, pageBase.getPrismContext()) + .item(TaskType.F_OBJECT_REF).ref(object.getOid()) + .build(), result, pageBase); List tasksType = new ArrayList(); for (PrismObject task : tasks) { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/roles/RoleMemberPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/roles/RoleMemberPanel.java index 98835f58397..4be40222ec7 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/roles/RoleMemberPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/roles/RoleMemberPanel.java @@ -22,6 +22,9 @@ import javax.xml.namespace.QName; +import com.evolveum.midpoint.prism.query.builder.QueryBuilder; +import com.evolveum.midpoint.prism.query.builder.S_AtomicFilterEntry; +import com.evolveum.midpoint.prism.query.builder.S_AtomicFilterExit; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.form.OnChangeAjaxBehavior; import org.apache.wicket.markup.html.form.DropDownChoice; @@ -120,46 +123,32 @@ protected void refreshTable(AjaxRequestTarget target) { getMemberTable().refreshTable((Class) WebComponentUtil.qnameToClass(getPrismContext(), type), target); } - private List createTenantList() { - ObjectQuery query; - try { - query = ObjectQuery.createObjectQuery( - EqualFilter.createEqual(OrgType.F_TENANT, OrgType.class, getPrismContext(), true)); - List> orgs = WebModelServiceUtils.searchObjects(OrgType.class, query, - new OperationResult("Tenant search"), getPageBase()); - List orgTypes = new ArrayList<>(); - for (PrismObject org : orgs) { - orgTypes.add(org.asObjectable()); - } - - return orgTypes; - } catch (SchemaException e) { - error(getString("pageUsers.message.queryError") + " " + e.getMessage()); - return null; + ObjectQuery query = QueryBuilder.queryFor(OrgType.class, getPrismContext()) + .item(OrgType.F_TENANT).eq(true) + .build(); + List> orgs = WebModelServiceUtils.searchObjects(OrgType.class, query, + new OperationResult("Tenant search"), getPageBase()); + List orgTypes = new ArrayList<>(); + for (PrismObject org : orgs) { + orgTypes.add(org.asObjectable()); } + return orgTypes; } private List createProjectList() { - ObjectQuery query; - try { - query = ObjectQuery.createObjectQuery(OrFilter.createOr( - EqualFilter.createEqual(OrgType.F_TENANT, OrgType.class, getPrismContext(), true), - EqualFilter.createEqual(OrgType.F_TENANT, OrgType.class, getPrismContext(), null))); - List> orgs = WebModelServiceUtils.searchObjects(OrgType.class, query, - new OperationResult("Tenant search"), getPageBase()); - List orgTypes = new ArrayList<>(); - for (PrismObject org : orgs) { - orgTypes.add(org.asObjectable()); - } - - return orgTypes; - } catch (SchemaException e) { - error(getString("pageUsers.message.queryError") + " " + e.getMessage()); - return null; + ObjectQuery query = QueryBuilder.queryFor(OrgType.class, getPrismContext()) + .item(OrgType.F_TENANT).eq(true) + .or().item(OrgType.F_TENANT).isNull() + .build(); + List> orgs = WebModelServiceUtils.searchObjects(OrgType.class, query, + new OperationResult("Tenant search"), getPageBase()); + List orgTypes = new ArrayList<>(); + for (PrismObject org : orgs) { + orgTypes.add(org.asObjectable()); } - + return orgTypes; } private MainObjectListPanel getMemberTable() { @@ -198,7 +187,9 @@ private ObjectQuery getActionQuery(QueryScope scope) { } private ObjectQuery createAllMemberQuery() { - return ObjectQuery.createObjectQuery(RefFilter.createReferenceEqual(FocusType.F_ROLE_MEMBERSHIP_REF, FocusType.class, getModelObject())); + return QueryBuilder.queryFor(FocusType.class, getPrismContext()) + .item(FocusType.F_ROLE_MEMBERSHIP_REF).ref(getModelObject().getOid()) + .build(); } private ObjectQuery createRecomputeQuery() { @@ -313,46 +304,31 @@ private ObjectQuery createDirectMemberQuery() { String oid = getModelObject().getOid(); - List filters = new ArrayList<>(); - try { - filters.add(RefFilter.createReferenceEqual( - new ItemPath(FocusType.F_ASSIGNMENT, AssignmentType.F_TARGET_REF), UserType.class, - getPrismContext(), createReference().asReferenceValue())); - - DropDownChoice tenantChoice = (DropDownChoice) get(createComponentPath(ID_TENANT)); - OrgType tenant = tenantChoice.getModelObject(); - - if (tenant != null) { - filters.add(RefFilter.createReferenceEqual( - new ItemPath(FocusType.F_ASSIGNMENT, AssignmentType.F_TENANT_REF), UserType.class, - getPrismContext(), createReference(tenant).asReferenceValue())); - } - - DropDownChoice projectChoice = (DropDownChoice) get(createComponentPath(ID_PROJECT)); - OrgType project = projectChoice.getModelObject(); - - if (project != null) { - filters.add(RefFilter.createReferenceEqual( - new ItemPath(FocusType.F_ASSIGNMENT, AssignmentType.F_ORG_REF), UserType.class, - getPrismContext(), createReference(project).asReferenceValue())); - } - - query = ObjectQuery.createObjectQuery(AndFilter.createAnd(filters)); + S_AtomicFilterExit q = QueryBuilder.queryFor(FocusType.class, getPrismContext()) + .item(FocusType.F_ASSIGNMENT, AssignmentType.F_TARGET_REF).ref(createReference().asReferenceValue()); + DropDownChoice tenantChoice = (DropDownChoice) get(createComponentPath(ID_TENANT)); + OrgType tenant = tenantChoice.getModelObject(); + if (tenant != null) { + q = q.and().item(FocusType.F_ASSIGNMENT, AssignmentType.F_TENANT_REF).ref(createReference(tenant).asReferenceValue()); + } - if (LOGGER.isTraceEnabled()) { - LOGGER.trace("Searching members of role {} with query:\n{}", oid, query.debugDump()); - } + DropDownChoice projectChoice = (DropDownChoice) get(createComponentPath(ID_PROJECT)); + OrgType project = projectChoice.getModelObject(); + if (project != null) { + q = q.and().item(FocusType.F_ASSIGNMENT, AssignmentType.F_ORG_REF).ref(createReference(project).asReferenceValue()); + } - } catch (SchemaException e) { - LoggingUtils.logUnexpectedException(LOGGER, "Couldn't prepare query for org. members.", e); + query = q.build(); + if (LOGGER.isTraceEnabled()) { + LOGGER.trace("Searching members of role {} with query:\n{}", oid, query.debugDump()); } DropDownChoice objectTypeChoice = (DropDownChoice) get(createComponentPath(ID_OBJECT_TYPE)); QName objectType = objectTypeChoice.getModelObject(); if (objectType == null || FocusType.COMPLEX_TYPE.equals(objectType)) { return query; + } else { + return ObjectQuery.createObjectQuery(TypeFilter.createType(objectType, query.getFilter())); } - - return ObjectQuery.createObjectQuery(TypeFilter.createType(objectType, query.getFilter())); } } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/PageTasks.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/PageTasks.java index cf09d3708c0..522260c4ac1 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/PageTasks.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/PageTasks.java @@ -25,6 +25,9 @@ import com.evolveum.midpoint.prism.match.PolyStringNormMatchingRule; import com.evolveum.midpoint.prism.polystring.PolyStringNormalizer; import com.evolveum.midpoint.prism.query.*; +import com.evolveum.midpoint.prism.query.builder.QueryBuilder; +import com.evolveum.midpoint.prism.query.builder.S_AtomicFilterEntry; +import com.evolveum.midpoint.prism.query.builder.S_FilterEntryOrEmpty; import com.evolveum.midpoint.prism.xml.XmlTypeConverter; import com.evolveum.midpoint.schema.constants.ObjectTypes; import com.evolveum.midpoint.schema.constants.SchemaConstants; @@ -1198,38 +1201,23 @@ private ObjectQuery createTaskQuery() { String category = dto.getCategory(); boolean showSubtasks = dto.isShowSubtasks(); - ObjectQuery query = null; - try { - List filters = new ArrayList<>(); - if (status != null) { - ObjectFilter filter = status.createFilter(TaskType.class, getPrismContext()); - if (filter != null) { - filters.add(filter); - } - } - if (category != null && !ALL_CATEGORIES.equals(category)) { - filters.add(EqualFilter.createEqual(TaskType.F_CATEGORY, TaskType.class, getPrismContext(), null, category)); - } - if (searchText != null && !searchText.trim().equals("")) { - PolyStringNormalizer normalizer = getPrismContext().getDefaultPolyStringNormalizer(); - String normalizedString = normalizer.normalize(searchText); - - ObjectFilter substring = SubstringFilter.createSubstring(TaskType.F_NAME, TaskType.class, - getPrismContext(), PolyStringNormMatchingRule.NAME, normalizedString); - filters.add(substring); - searchText = ""; - } - if (!Boolean.TRUE.equals(showSubtasks)) { - filters.add(EqualFilter.createEqual(TaskType.F_PARENT, TaskType.class, getPrismContext(), null)); - } - if (!filters.isEmpty()) { - query = new ObjectQuery().createObjectQuery(AndFilter.createAnd(filters)); - } - } catch (Exception ex) { - error(getString("pageTasks.message.couldntCreateQuery") + " " + ex.getMessage()); - LoggingUtils.logUnexpectedException(LOGGER, "Couldn't create task filter", ex); + S_AtomicFilterEntry q = QueryBuilder.queryFor(TaskType.class, getPrismContext()); + if (status != null) { + q = status.appendFilter(q); + } + if (category != null && !ALL_CATEGORIES.equals(category)) { + q = q.item(TaskType.F_CATEGORY).eq(category).and(); + } + if (StringUtils.isNotBlank(searchText)) { + PolyStringNormalizer normalizer = getPrismContext().getDefaultPolyStringNormalizer(); + String normalizedString = normalizer.normalize(searchText); + q = q.item(TaskType.F_NAME).containsPoly(normalizedString, normalizedString).matchingNorm().and(); + searchText = ""; // ??? + } + if (!Boolean.TRUE.equals(showSubtasks)) { + q = q.item(TaskType.F_PARENT).isNull().and(); } - return query; + return q.all().build(); } private void clearSearchPerformed(AjaxRequestTarget target) { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/dto/TaskDtoExecutionStatusFilter.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/dto/TaskDtoExecutionStatusFilter.java index eabe150019a..19eca8d59a9 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/dto/TaskDtoExecutionStatusFilter.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/dto/TaskDtoExecutionStatusFilter.java @@ -20,6 +20,7 @@ import com.evolveum.midpoint.prism.query.EqualFilter; import com.evolveum.midpoint.prism.query.NotFilter; import com.evolveum.midpoint.prism.query.ObjectFilter; +import com.evolveum.midpoint.prism.query.builder.S_AtomicFilterEntry; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.util.exception.SystemException; import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskExecutionStatusType; @@ -40,21 +41,15 @@ public enum TaskDtoExecutionStatusFilter { CLOSED, NOT_CLOSED; - public ObjectFilter createFilter(Class clazz, PrismContext prismContext) throws SchemaException { + public S_AtomicFilterEntry appendFilter(S_AtomicFilterEntry q) { switch(this) { - case ALL: return null; - case RUNNING_OR_RUNNABLE: return createExecutionStatusFilter(clazz, prismContext, TaskExecutionStatusType.RUNNABLE); - case WAITING: return createExecutionStatusFilter(clazz, prismContext, TaskExecutionStatusType.WAITING); - case SUSPENDED_OR_SUSPENDING: return createExecutionStatusFilter(clazz, prismContext, TaskExecutionStatusType.SUSPENDED); - case CLOSED: return createExecutionStatusFilter(clazz, prismContext, TaskExecutionStatusType.CLOSED); - case NOT_CLOSED: return NotFilter.createNot(createExecutionStatusFilter(clazz, prismContext, TaskExecutionStatusType.CLOSED)); + case ALL: return q; + case RUNNING_OR_RUNNABLE: return q.item(TaskType.F_EXECUTION_STATUS).eq(TaskExecutionStatusType.RUNNABLE).and(); + case WAITING: return q.item(TaskType.F_EXECUTION_STATUS).eq(TaskExecutionStatusType.WAITING).and(); + case SUSPENDED_OR_SUSPENDING: return q.item(TaskType.F_EXECUTION_STATUS).eq(TaskExecutionStatusType.SUSPENDED).and(); + case CLOSED: return q.item(TaskType.F_EXECUTION_STATUS).eq(TaskExecutionStatusType.CLOSED).and(); + case NOT_CLOSED: return q.block().not().item(TaskType.F_EXECUTION_STATUS).eq(TaskExecutionStatusType.RUNNABLE).endBlock().and(); default: throw new SystemException("Unknown value for TaskDtoExecutionStatusFilter: " + this); } } - - private EqualFilter createExecutionStatusFilter(Class clazz, PrismContext prismContext, TaskExecutionStatusType value){ - return EqualFilter.createEqual(TaskType.F_EXECUTION_STATUS, clazz, prismContext, null, value); - } - - } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/OrgMemberPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/OrgMemberPanel.java index 48ad3442efa..6c81bdae25b 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/OrgMemberPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/OrgMemberPanel.java @@ -25,6 +25,7 @@ import javax.xml.namespace.QName; +import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; import org.apache.commons.lang.Validate; import org.apache.wicket.Component; @@ -456,25 +457,17 @@ private QName getSearchType() { } private ObjectQuery createManagerQuery() { - String oid = getModelObject().getOid(); PrismReferenceValue referenceFilter = new PrismReferenceValue(); referenceFilter.setOid(oid); referenceFilter.setRelation(SchemaConstants.ORG_MANAGER); - RefFilter referenceOidFilter; - try { - referenceOidFilter = RefFilter.createReferenceEqual(new ItemPath(FocusType.F_PARENT_ORG_REF), - UserType.class, getPageBase().getPrismContext(), referenceFilter); - ObjectQuery query = ObjectQuery.createObjectQuery(referenceOidFilter); - if (LOGGER.isTraceEnabled()) { - LOGGER.trace("Searching members of org {} with query:\n{}", oid, query.debugDump()); - } - return query; - } catch (SchemaException e) { - LoggingUtils.logUnexpectedException(LOGGER, "Couldn't prepare query for org. managers.", e); - return null; + ObjectQuery query = QueryBuilder.queryFor(FocusType.class, getPageBase().getPrismContext()) + .item(FocusType.F_PARENT_ORG_REF).ref(referenceFilter) + .build(); + if (LOGGER.isTraceEnabled()) { + LOGGER.trace("Searching members of org {} with query:\n{}", oid, query.debugDump()); } - + return query; } private ObjectDelta prepareDelta(MemberOperation operaton, QName type, QName relation, diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/forgetpassword/PageForgetPassword.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/forgetpassword/PageForgetPassword.java index 7aa5c6114db..2b71201f5f1 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/forgetpassword/PageForgetPassword.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/forgetpassword/PageForgetPassword.java @@ -18,6 +18,7 @@ import java.util.Collection; import java.util.List; +import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import org.apache.wicket.RestartResponseException; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.form.RequiredTextField; @@ -151,12 +152,12 @@ private UserType getUser(String email, String username) { Task task = createAnonymousTask(OPERATION_LOAD_USER); OperationResult result = task.getResult(); - - ObjectQuery query = ObjectQuery.createObjectQuery(AndFilter.createAnd( - EqualFilter.createEqual(UserType.F_NAME, UserType.class,getPrismContext(), PolyStringOrigMatchingRule.NAME, username), - EqualFilter.createEqual(UserType.F_EMAIL_ADDRESS, UserType.class,getPrismContext(), PolyStringOrigMatchingRule.NAME, email))); - - + + ObjectQuery query = QueryBuilder.queryFor(UserType.class, getPrismContext()) + .item(UserType.F_NAME).eqPoly(username).matchingNorm() + .and().item(UserType.F_EMAIL_ADDRESS).eq(email).matchingCaseIgnore() + .build(); + if (LOGGER.isTraceEnabled()) { LOGGER.trace("Searching for user with query:\n{}", query.debugDump(1)); } diff --git a/infra/pom.xml b/infra/pom.xml index 4159fde093f..f9e91d1d1a6 100644 --- a/infra/pom.xml +++ b/infra/pom.xml @@ -52,6 +52,7 @@ common test-util prism + prism-api prism-maven-plugin diff --git a/infra/prism-api/pom.xml b/infra/prism-api/pom.xml index 79ec9f34355..aa8b4b26380 100644 --- a/infra/prism-api/pom.xml +++ b/infra/prism-api/pom.xml @@ -33,152 +33,105 @@ https://fisheye.evolveum.com/browse/midPoint - - com.evolveum.midpoint.infra - util - 3.5-SNAPSHOT - - - com.sun.xml.bind - jaxb-xjc - ${jaxb-xjc.version} - - - org.apache.cxf - cxf-rt-wsdl - - - commons-lang - commons-lang - - - org.apache.commons - commons-lang3 - - - org.apache.santuario - xmlsec - - - org.jetbrains - annotations-java5 - - - - - - - - - - - - - - - - - - - com.fasterxml.jackson.core - jackson-core - - - com.fasterxml.jackson.core - jackson-annotations - - - org.yaml - snakeyaml - - - org.springframework - spring-core - - - org.springframework - spring-beans - - - xml-resolver - xml-resolver - - - commons-codec - commons-codec - - - commons-io - commons-io - - - com.sun.xml.bind - jaxb-impl - - - org.jvnet.jaxb2_commons - jaxb2-basics-runtime - - - - org.codehaus.woodstox - stax2-api - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - com.fasterxml.jackson.core - jackson-databind - - - - - com.fasterxml.jackson.module - jackson-module-jaxb-annotations - - - com.fasterxml.jackson.dataformat - jackson-dataformat-yaml - - - + + + + + + + + + + + + org.testng testng test - - com.evolveum.midpoint.tools - test-ng - 3.5-SNAPSHOT - test - + + + + + + diff --git a/infra/prism/pom.xml b/infra/prism/pom.xml index 4e4c623f00c..4fcd220ad3e 100644 --- a/infra/prism/pom.xml +++ b/infra/prism/pom.xml @@ -38,11 +38,11 @@ util 3.5-SNAPSHOT - - com.evolveum.midpoint.infra - prism-api - 3.5-SNAPSHOT - + + + + + com.sun.xml.bind jaxb-xjc diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/QueryConvertor.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/QueryConvertor.java index d0f06bd14be..1932af12162 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/QueryConvertor.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/QueryConvertor.java @@ -293,8 +293,8 @@ private static ObjectFilter parseComparisonFilter(QN if (isEq) { List> values = item.getValues(); PrismValue.clearParent(values); - return EqualFilter.createEqual(itemPath, - (PrismPropertyDefinition)item.getDefinition(), matchingRule, values); + return EqualFilter.createEqual(itemPath, + (PrismPropertyDefinition)item.getDefinition(), matchingRule, prismContext, values); } PrismPropertyValue propertyValue = (PrismPropertyValue) item.getValue(0); propertyValue.clearParent(); @@ -343,7 +343,7 @@ private static ObjectFilter parseComparisonFilter(QN if (preliminaryParsingOnly) { return null; } else { - return EqualFilter.createNullEqual(itemPath, (PrismPropertyDefinition) itemDefinition, matchingRule); + return EqualFilter.createEqual(itemPath, (PrismPropertyDefinition) itemDefinition, matchingRule, prismContext); } } } @@ -439,7 +439,7 @@ private static RefFilter parseRefFilter(MapXNode claus if (item.getValues().size() < 1) { throw new IllegalStateException("No values to search specified for item " + itemName); } - return RefFilter.createReferenceEqual(itemPath, ref, null); + return RefFilter.createReferenceEqual(itemPath, (PrismReferenceDefinition) itemDefinition, PrismValue.cloneCollection(ref.getValues())); } else { ExpressionWrapper expressionWrapper = parseExpression(clauseXMap, prismContext); if (expressionWrapper != null) { @@ -454,7 +454,7 @@ private static RefFilter parseRefFilter(MapXNode claus return null; } else { return RefFilter.createReferenceEqual(itemPath, - (PrismReferenceDefinition) itemDefinition, expressionWrapper); + (PrismReferenceDefinition) itemDefinition, (ExpressionWrapper) null); } } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/EqualFilter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/EqualFilter.java index 7ca87fa3c49..2ac2e6cc565 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/EqualFilter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/EqualFilter.java @@ -16,6 +16,7 @@ package com.evolveum.midpoint.prism.query; +import java.util.Collection; import java.util.List; import javax.xml.namespace.QName; @@ -70,71 +71,16 @@ public static EqualFilter createEqual(@NotNull ItemPath path, @Nullable P return new EqualFilter<>(path, definition, matchingRule, null, expression); } - // Collection - @NotNull - public static EqualFilter createEqual(@NotNull ItemPath path, @Nullable PrismPropertyDefinition definition, - @Nullable QName matchingRule, @NotNull List> values) { - return new EqualFilter(path, definition, matchingRule, values, null); - } - - @NotNull - @SafeVarargs - public static EqualFilter createEqualMultiple(@NotNull ItemPath path, @NotNull PrismPropertyDefinition definition, - @Nullable QName matchingRule, T... realValues) { - return new EqualFilter<>(path, definition, matchingRule, createPropertyListFromArray(definition, realValues), null); - } - + // values @NotNull public static EqualFilter createEqual(@NotNull ItemPath path, @NotNull PrismPropertyDefinition definition, - @Nullable QName matchingRule, @Nullable T realValue) { - return new EqualFilter<>(path, definition, matchingRule, realValueToPropertyList(definition, realValue), null); - } - - private static EqualFilter createEqual(@NotNull ItemPath propertyPath, @NotNull Class type, @NotNull PrismContext prismContext, - @Nullable QName matchingRule, T realValue) { - @SuppressWarnings("unchecked") - PrismPropertyDefinition propertyDefinition = (PrismPropertyDefinition) FilterUtils.findItemDefinition(propertyPath, type, prismContext); - return createEqual(propertyPath, propertyDefinition, matchingRule, realValue); - } - - @NotNull - public static EqualFilter createEqual(@NotNull ItemPath propertyPath, @NotNull Class type, @NotNull PrismContext prismContext, T realValue) - throws SchemaException { - return createEqual(propertyPath, type, prismContext, null, realValue); - } - - @NotNull - public static EqualFilter createEqual(@NotNull QName propertyName, @NotNull Class type, @NotNull PrismContext prismContext, - QName matchingRule, T realValues) { - return createEqual(new ItemPath(propertyName), type, prismContext, matchingRule, realValues); - } - - @NotNull - public static EqualFilter createEqual(@NotNull QName propertyName, @NotNull Class type, @NotNull PrismContext prismContext, T realValue) - throws SchemaException { - return createEqual(propertyName, type, prismContext, null, realValue); - } - - - // taking values from existing item (item's values are cloned) - @NotNull - @Deprecated - public static EqualFilter createEqual(@NotNull ItemPath path, @NotNull PrismProperty item) { - List> clonedValues = (List>) PrismPropertyValue.cloneCollection(item.getValues()); - return createEqual(path, item.getDefinition(), null, clonedValues); - } - - - public static EqualFilter createNullEqual(ItemPath itemPath, PrismPropertyDefinition propertyDef, QName matchingRule){ - return new EqualFilter(itemPath, propertyDef, matchingRule, (List) null, null); - + @Nullable QName matchingRule, @NotNull PrismContext prismContext, Object... values) { + return new EqualFilter(path, definition, matchingRule, (List) createPropertyListFromArray(prismContext, values), null); } @Override public EqualFilter clone() { - EqualFilter clone = new EqualFilter<>(getFullPath(), getDefinition(), getMatchingRule(), (List>) getValues(), null); - clone.setExpression(getExpression()); - cloneValues(clone); + EqualFilter clone = new EqualFilter<>(getFullPath(), getDefinition(), getMatchingRule(), getCloneValuesList(), getExpression()); clone.copyRightSideThingsFrom(this); return clone; } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/LogicalFilter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/LogicalFilter.java index 65d7805ef60..f9bc69488b0 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/LogicalFilter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/LogicalFilter.java @@ -56,8 +56,8 @@ protected List getClonedConditions() { return null; } List clonedConditions = new ArrayList(conditions.size()); - for (ObjectFilter connditio: conditions) { - clonedConditions.add(connditio.clone()); + for (ObjectFilter condition: conditions) { + clonedConditions.add(condition.clone()); } return clonedConditions; } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/PropertyValueFilter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/PropertyValueFilter.java index bf4812c13d9..1156cddb74f 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/PropertyValueFilter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/PropertyValueFilter.java @@ -20,16 +20,10 @@ import javax.xml.namespace.QName; -import com.evolveum.midpoint.prism.PrismContainerValue; +import com.evolveum.midpoint.prism.*; import org.apache.commons.lang.Validate; -import com.evolveum.midpoint.prism.Item; -import com.evolveum.midpoint.prism.ItemDefinition; -import com.evolveum.midpoint.prism.Itemable; -import com.evolveum.midpoint.prism.PrismPropertyDefinition; -import com.evolveum.midpoint.prism.PrismPropertyValue; -import com.evolveum.midpoint.prism.PrismValue; import com.evolveum.midpoint.prism.match.MatchingRuleRegistry; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.util.PrismUtil; @@ -116,27 +110,56 @@ static List> createPropertyList(PrismPropertyDefinitio return pValues; } - @SafeVarargs - static List> createPropertyListFromArray(PrismPropertyDefinition itemDefinition, T... realValues) { - List> pVals = new ArrayList>(); + static List> createPropertyListFromArray(PrismContext prismContext, Object[] values) { + List> pVals = new ArrayList<>(); + if (values != null) { + for (Object value : values) { + addToPrismValues(pVals, prismContext, value); + } + } + return pVals; + } + +// static List> createPropertyListFromCollection(PrismContext prismContext, Collection realValues) { +// List> pVals = new ArrayList<>(); +// for (T realValue : realValues) { +// addToPrismValues(pVals, realValue, prismContext); +// } +// return pVals; +// } - for (T realValue : realValues) { - if (realValue == null) { - continue; + private static void addToPrismValues(List> pVals, PrismContext prismContext, Object value) { + if (value == null) { + return; + } + if (value instanceof Collection) { + for (Object o : (Collection) value) { + addToPrismValues(pVals, prismContext, o); } - if (realValue instanceof PrismPropertyValue) { - PrismPropertyValue pVal = (PrismPropertyValue) realValue; - PrismUtil.recomputePrismPropertyValue(pVal, itemDefinition.getPrismContext()); - pVals.add(pVal); - } else { - pVals.add(new PrismPropertyValue<>(realValue)); + return; + } + if (value.getClass().isArray()) { + throw new IllegalStateException("Array within array in filter creation: " + value); + } + + PrismPropertyValue pVal; + if (value instanceof PrismPropertyValue) { + pVal = (PrismPropertyValue) value; + if (pVal.getParent() != null) { + pVal = pVal.clone(); } + } else { + pVal = new PrismPropertyValue<>(value); } - return pVals; + PrismUtil.recomputePrismPropertyValue(pVal, prismContext); + pVals.add(pVal); } - static List> realValueToPropertyList(PrismPropertyDefinition itemDefinition, T realValue) { - List> pVals = new ArrayList>(); + static List> realValueToPropertyList(PrismPropertyDefinition itemDefinition, T realValue) { + List> pVals = new ArrayList<>(); + if (realValue == null) { + return pVals; + } if (realValue.getClass() != null && Collection.class.isAssignableFrom(realValue.getClass())) { for (Object o : (Iterable)realValue){ @@ -149,7 +172,7 @@ static List> realValueToPropertyList(PrismPropertyDefi pVals.addAll(PrismPropertyValue.createCollection((Collection) realValue)); } } - + } else { PrismUtil.recomputeRealValue(realValue, itemDefinition.getPrismContext()); pVals.add(new PrismPropertyValue(realValue)); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/RefFilter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/RefFilter.java index 9c47003663d..1137ba088ab 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/RefFilter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/RefFilter.java @@ -15,149 +15,35 @@ */ package com.evolveum.midpoint.prism.query; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import javax.xml.namespace.QName; - -import com.evolveum.midpoint.prism.Containerable; -import com.evolveum.midpoint.prism.PrismContainerValue; -import org.apache.commons.lang.Validate; - -import com.evolveum.midpoint.prism.Item; -import com.evolveum.midpoint.prism.ItemDefinition; -import com.evolveum.midpoint.prism.Objectable; -import com.evolveum.midpoint.prism.PrismContainerDefinition; -import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.PrismObject; -import com.evolveum.midpoint.prism.PrismReference; -import com.evolveum.midpoint.prism.PrismReferenceDefinition; -import com.evolveum.midpoint.prism.PrismReferenceValue; -import com.evolveum.midpoint.prism.PrismValue; +import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.match.MatchingRuleRegistry; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.util.DebugUtil; import com.evolveum.midpoint.util.exception.SchemaException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + public class RefFilter extends PropertyValueFilter { private static final long serialVersionUID = 1L; - RefFilter(ItemPath path, PrismReferenceDefinition definition, ExpressionWrapper expression, List values) { + private RefFilter(ItemPath path, PrismReferenceDefinition definition, ExpressionWrapper expression, List values) { super(path, definition, expression, values); } - RefFilter(ItemPath path, PrismReferenceDefinition definition, ExpressionWrapper expression) { - super(path, definition, expression); - } - - public static RefFilter createReferenceEqual(ItemPath path, PrismReference item) { - List refValues = (List) PrismValue.cloneCollection(item.getValues()); - RefFilter refFilter = new RefFilter(path, item.getDefinition(), null, refValues); - for (PrismReferenceValue rval: refValues) { - rval.setParent(refFilter); - } - return refFilter; - } - - public static RefFilter createReferenceEqual(ItemPath path, PrismReferenceDefinition definition, PrismReferenceValue... values) { - if (values == null){ - createNullRefFilter(path, definition); - } - RefFilter refFilter = new RefFilter(path, definition, null, Arrays.asList(values)); - for (PrismReferenceValue rval: values) { - rval.setParent(refFilter); - } - return refFilter; + private RefFilter(ItemPath path, PrismReferenceDefinition definition, ExpressionWrapper expression) { + super(path, definition, expression, null); } - - public static RefFilter createReferenceEqual(ItemPath path, PrismReference item, ExpressionWrapper expression){ - List refValues = (List) PrismValue.cloneCollection(item.getValues()); - RefFilter refFilter = new RefFilter(path, item.getDefinition(), expression, refValues); - for (PrismReferenceValue rval: refValues) { - rval.setParent(refFilter); - } - return refFilter; + + public static RefFilter createReferenceEqual(ItemPath path, PrismReferenceDefinition definition, Collection values) { + return new RefFilter(path, definition, null, values != null ? new ArrayList<>(values) : null); } public static RefFilter createReferenceEqual(ItemPath path, PrismReferenceDefinition definition, ExpressionWrapper expression) { return new RefFilter(path, definition, expression); } - public static RefFilter createReferenceEqual(ItemPath path, PrismReferenceDefinition referenceDefinition, String... oids) { - Validate.notNull(referenceDefinition, "Reference definition must not be null."); - Validate.notNull(path, "Path must not be null."); - if (oids == null){ - createNullRefFilter(path, referenceDefinition); - } - - List refValues = new ArrayList<>(oids.length); - for (String oid : oids){ - refValues.add(new PrismReferenceValue(oid)); - } - - RefFilter refFilter = new RefFilter(path, referenceDefinition, null, refValues); - for (PrismReferenceValue rval: refValues) { - rval.setParent(refFilter); - } - return refFilter; - } - - // beware, creating reference with (oid, ObjectType) may result in not matching a concrete reference of e.g. (oid, RoleType) - public static RefFilter createReferenceEqual(QName propertyName, Class type, PrismContext prismContext, - String... oids) { - ItemPath path = new ItemPath(propertyName); - PrismReferenceDefinition refDefinition = (PrismReferenceDefinition) FilterUtils.findItemDefinition(path, type, prismContext); - return createReferenceEqual(path, refDefinition, oids); - } - - // beware, creating reference with (oid, ObjectType) may result in not matching a concrete reference of e.g. (oid, RoleType) - public static RefFilter createReferenceEqual(ItemPath path, Class type, PrismContext prismContext, - String... oids) throws SchemaException { - PrismReferenceDefinition refDefinition = (PrismReferenceDefinition) FilterUtils.findItemDefinition(path, type, prismContext); - return createReferenceEqual(path, refDefinition, oids); - } - - public static RefFilter createReferenceEqual(ItemPath path, Class type, PrismContext prismContext, - PrismReferenceValue... values) throws SchemaException { - PrismReferenceDefinition refDefinition = (PrismReferenceDefinition) FilterUtils.findItemDefinition(path, type, prismContext); - return createReferenceEqual(path, refDefinition, values); - } - - - public static RefFilter createReferenceEqual(ItemPath path, PrismContainerDefinition containerDef, String... oids) { - ItemDefinition itemDef = FilterUtils.findItemDefinition(path, containerDef); - - if (!(itemDef instanceof PrismReferenceDefinition)){ - throw new IllegalStateException("Bad item definition. Expected that the definition will be instance of prism refenrence definition, but found " + itemDef); - } - - return createReferenceEqual(path, (PrismReferenceDefinition) itemDef, oids); - } - - public static RefFilter createReferenceEqual(QName propertyName, Class type, O targetObject) { - return createReferenceEqual(propertyName, type, targetObject.asPrismObject()); - } - - public static RefFilter createReferenceEqual(QName propertyName, Class type, PrismObject targetObject) { - Validate.notNull(targetObject, "Target object must not be null"); - - ItemPath path = new ItemPath(propertyName); - - ItemDefinition itemDef = FilterUtils.findItemDefinition(path, type, targetObject.getPrismContext()); - - if (!(itemDef instanceof PrismReferenceDefinition)){ - throw new IllegalStateException("Bad item definition. Expected that the definition will be instance of prism refenrence definition, but found " + itemDef); - } - - return createReferenceEqual(new ItemPath(propertyName), (PrismReferenceDefinition) itemDef, targetObject.getOid()); - - } - - public static RefFilter createNullRefFilter(ItemPath path, PrismReferenceDefinition refDef){ - return new RefFilter(path, refDef, null, null); - } - @Override public RefFilter clone() { return new RefFilter(getFullPath(), getDefinition(), getExpression(), getCloneValuesList()); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/SubstringFilter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/SubstringFilter.java index 7814539964c..ccc0049342d 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/SubstringFilter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/SubstringFilter.java @@ -43,10 +43,6 @@ public class SubstringFilter extends PropertyValueFilter value) { - super(parentPath, definition, value); - } - SubstringFilter(ItemPath parentPath, ItemDefinition definition, QName matchingRule, List> value) { super(parentPath, definition, matchingRule, value); } @@ -55,28 +51,12 @@ public class SubstringFilter extends PropertyValueFilter value, boolean anchorStart, boolean anchorEnd) { - super(parentPath, definition, value); - this.anchorStart = anchorStart; - this.anchorEnd = anchorEnd; - } - SubstringFilter(ItemPath parentPath, ItemDefinition definition, QName matchingRule, List> value, boolean anchorStart, boolean anchorEnd) { super(parentPath, definition, matchingRule, value); this.anchorStart = anchorStart; this.anchorEnd = anchorEnd; } - SubstringFilter(ItemPath parentPath, ItemDefinition definition, QName matchingRule, boolean anchorStart, boolean anchorEnd) { - super(parentPath, definition, matchingRule); - this.anchorStart = anchorStart; - this.anchorEnd = anchorEnd; - } - - public static SubstringFilter createSubstring(ItemPath path, PrismProperty item, QName matchingRule) { - return createSubstring(path, item.getDefinition(), matchingRule, item.getValue().clone()); - } - public static SubstringFilter createSubstring(ItemPath path, PrismProperty item, QName matchingRule, boolean anchorStart, boolean anchorEnd) { List> values = item.getValues(); @@ -91,30 +71,6 @@ public static SubstringFilter createSubstring(ItemPath path, PrismProperty SubstringFilter createSubstring(QName path, PrismPropertyDefinition itemDefinition, PrismPropertyValue values) { - return createSubstring(new ItemPath(path), itemDefinition, null, values); - } - - public static SubstringFilter createSubstring(ItemPath path, PrismPropertyDefinition itemDefinition, PrismPropertyValue values) { - return createSubstring(path, itemDefinition, null, values); - } - - public static SubstringFilter createSubstring(QName path, PrismPropertyDefinition itemDefinition, QName matchingRule, PrismPropertyValue values) { - return createSubstring(new ItemPath(path), itemDefinition, matchingRule, values); - } - - public static SubstringFilter createSubstring(QName path, PrismPropertyDefinition itemDefinition, T realValues) { - return createSubstring(new ItemPath(path), itemDefinition, null, realValues); - } - - public static SubstringFilter createSubstring(ItemPath path, PrismPropertyDefinition itemDefinition, T realValues) { - return createSubstring(path, itemDefinition, null, realValues); - } - - public static SubstringFilter createSubstring(QName path, PrismPropertyDefinition itemDefinition, QName matchingRule, T realValues) { - return createSubstring(new ItemPath(path), itemDefinition, matchingRule, realValues); - } - public static SubstringFilter createSubstring(ItemPath path, PrismPropertyDefinition itemDefinition, QName matchingRule, T realValues) { return createSubstring(path, itemDefinition, matchingRule, realValues, false, false); } @@ -131,22 +87,7 @@ public static SubstringFilter createSubstring(ItemPath path, PrismPropert return substringFilter; } - public static SubstringFilter createSubstring(ItemPath path, PrismPropertyDefinition itemDefinition, QName matchingRule, PrismPropertyValue value) { - Validate.notNull(path, "Item path in substring filter must not be null."); - Validate.notNull(itemDefinition, "Item definition in substring filter must not be null."); - - if (value == null){ - return createNullSubstring(path, itemDefinition, matchingRule); - } - - List> pValues = createPropertyList(itemDefinition, value); - - SubstringFilter substringFilter = new SubstringFilter<>(path, itemDefinition, matchingRule, pValues); - value.setParent(substringFilter); - return substringFilter; - } - - public static SubstringFilter createSubstring(ItemPath path, PrismPropertyDefinition itemDefinition, QName matchingRule, + public static SubstringFilter createSubstring(ItemPath path, PrismPropertyDefinition itemDefinition, QName matchingRule, PrismPropertyValue values, boolean anchorStart, boolean anchorEnd) { Validate.notNull(path, "Item path in substring filter must not be null."); Validate.notNull(itemDefinition, "Item definition in substring filter must not be null."); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/R_AtomicFilter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/R_AtomicFilter.java index 6fdd28d75be..6cdec61fa9b 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/R_AtomicFilter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/R_AtomicFilter.java @@ -16,10 +16,7 @@ package com.evolveum.midpoint.prism.query.builder; -import com.evolveum.midpoint.prism.ItemDefinition; -import com.evolveum.midpoint.prism.PrismPropertyDefinition; -import com.evolveum.midpoint.prism.PrismReferenceDefinition; -import com.evolveum.midpoint.prism.PrismReferenceValue; +import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.match.PolyStringNormMatchingRule; import com.evolveum.midpoint.prism.match.PolyStringOrigMatchingRule; import com.evolveum.midpoint.prism.match.PolyStringStrictMatchingRule; @@ -39,6 +36,8 @@ import javax.xml.namespace.QName; import java.util.Collection; +import java.util.Collections; +import java.util.List; /** * @author mederly @@ -109,24 +108,33 @@ public S_AtomicFilterExit item(ItemPath itemPath, ItemDefinition itemDefinition) return new R_AtomicFilter(this, newFilter); } + @Override + public S_MatchingRuleEntry eq(PrismProperty property) { + List> clonedValues = (List>) PrismPropertyValue.cloneCollection(property.getValues()); + PrismPropertyDefinition definition = + this.propertyDefinition != null ? + this.propertyDefinition : property.getDefinition(); + return new R_AtomicFilter(this, EqualFilter.createEqual(itemPath, definition, null, owner.getPrismContext(), clonedValues)); + } + @Override public S_MatchingRuleEntry eq(Object... values) { - return new R_AtomicFilter(this, EqualFilter.createEqualMultiple(itemPath, propertyDefinition, null, values)); + return new R_AtomicFilter(this, EqualFilter.createEqual(itemPath, propertyDefinition, null, owner.getPrismContext(), values)); } @Override public S_RightHandItemEntry eq() { - return new R_AtomicFilter(this, EqualFilter.createEqual(itemPath, propertyDefinition, null, (Object) null), true); + return new R_AtomicFilter(this, EqualFilter.createEqual(itemPath, propertyDefinition, null, owner.getPrismContext()), true); } @Override public S_MatchingRuleEntry eqPoly(String orig, String norm) { - return new R_AtomicFilter(this, EqualFilter.createEqual(itemPath, propertyDefinition, null, new PolyString(orig, norm))); + return new R_AtomicFilter(this, EqualFilter.createEqual(itemPath, propertyDefinition, null, owner.getPrismContext(), new PolyString(orig, norm))); } @Override public S_MatchingRuleEntry eqPoly(String orig) { - return new R_AtomicFilter(this, EqualFilter.createEqual(itemPath, propertyDefinition, null, new PolyString(orig))); + return new R_AtomicFilter(this, EqualFilter.createEqual(itemPath, propertyDefinition, null, owner.getPrismContext(), new PolyString(orig))); } @Override @@ -179,6 +187,11 @@ public S_MatchingRuleEntry startsWithPoly(String orig, String norm) { return startsWith(new PolyString(orig, norm)); } + @Override + public S_MatchingRuleEntry startsWithPoly(String orig) { + return startsWith(new PolyString(orig)); + } + @Override public S_MatchingRuleEntry endsWith(Object value) { return new R_AtomicFilter(this, SubstringFilter.createSubstring(itemPath, propertyDefinition, null, value, false, true)); @@ -189,6 +202,11 @@ public S_MatchingRuleEntry endsWithPoly(String orig, String norm) { return endsWith(new PolyString(orig, norm)); } + @Override + public S_MatchingRuleEntry endsWithPoly(String orig) { + return endsWith(new PolyString(orig)); + } + @Override public S_MatchingRuleEntry contains(Object value) { return new R_AtomicFilter(this, SubstringFilter.createSubstring(itemPath, propertyDefinition, null, value, false, false)); @@ -199,20 +217,24 @@ public S_MatchingRuleEntry containsPoly(String orig, String norm) { return contains(new PolyString(orig, norm)); } + @Override + public S_MatchingRuleEntry containsPoly(String orig) { + return contains(new PolyString(orig)); + } + @Override public S_AtomicFilterExit ref(PrismReferenceValue value) { - return new R_AtomicFilter(this, RefFilter.createReferenceEqual(itemPath, referenceDefinition, value)); + return ref(Collections.singleton(value)); } @Override public S_AtomicFilterExit ref(Collection values) { - return new R_AtomicFilter(this, RefFilter.createReferenceEqual(itemPath, referenceDefinition, - values.toArray(new PrismReferenceValue[values.size()]))); + return new R_AtomicFilter(this, RefFilter.createReferenceEqual(itemPath, referenceDefinition, values)); } @Override public S_AtomicFilterExit ref(String oid) { - return new R_AtomicFilter(this, RefFilter.createReferenceEqual(itemPath, referenceDefinition, oid)); + return ref(new PrismReferenceValue(oid)); } @Override @@ -223,9 +245,9 @@ public S_AtomicFilterExit ref(String oid, QName targetTypeName) { @Override public S_AtomicFilterExit isNull() { if (propertyDefinition != null) { - return new R_AtomicFilter(this, EqualFilter.createNullEqual(itemPath, propertyDefinition, null)); + return new R_AtomicFilter(this, EqualFilter.createEqual(itemPath, propertyDefinition, null, owner.getPrismContext())); } else if (referenceDefinition != null) { - return new R_AtomicFilter(this, RefFilter.createNullRefFilter(itemPath, referenceDefinition)); + return new R_AtomicFilter(this, RefFilter.createReferenceEqual(itemPath, referenceDefinition, Collections.emptyList())); } else { throw new IllegalStateException("No definition"); } @@ -301,6 +323,16 @@ public S_FilterExit desc(ItemPath path) { return finish().desc(path); } + @Override + public S_FilterExit offset(Integer n) { + return finish().offset(n); + } + + @Override + public S_FilterExit maxSize(Integer n) { + return finish().maxSize(n); + } + @Override public S_AtomicFilterExit endBlock() { return finish().endBlock(); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/R_Filter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/R_Filter.java index 7c77fc762f0..9704b76f9c9 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/R_Filter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/R_Filter.java @@ -16,14 +16,9 @@ package com.evolveum.midpoint.prism.query.builder; -import com.evolveum.midpoint.prism.ComplexTypeDefinition; -import com.evolveum.midpoint.prism.Containerable; -import com.evolveum.midpoint.prism.ItemDefinition; -import com.evolveum.midpoint.prism.PrismContainerDefinition; -import com.evolveum.midpoint.prism.PrismReferenceValue; +import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.query.*; -import com.evolveum.midpoint.util.exception.SchemaException; import org.apache.commons.lang.Validate; import javax.xml.namespace.QName; @@ -46,6 +41,8 @@ public class R_Filter implements S_FilterEntryOrEmpty, S_AtomicFilterExit { final private QName typeRestriction; final private ItemPath existsRestriction; final private List orderingList; + final private Integer offset; + final private Integer maxSize; public R_Filter(QueryBuilder queryBuilder) { this.queryBuilder = queryBuilder; @@ -57,10 +54,12 @@ public R_Filter(QueryBuilder queryBuilder) { this.typeRestriction = null; this.existsRestriction = null; this.orderingList = new ArrayList<>(); + this.offset = null; + this.maxSize = null; } private R_Filter(QueryBuilder queryBuilder, Class currentClass, OrFilter currentFilter, LogicalSymbol lastLogicalSymbol, - boolean isNegated, R_Filter parentFilter, QName typeRestriction, ItemPath existsRestriction, List orderingList) { + boolean isNegated, R_Filter parentFilter, QName typeRestriction, ItemPath existsRestriction, List orderingList, Integer offset, Integer maxSize) { this.queryBuilder = queryBuilder; this.currentClass = currentClass; this.currentFilter = currentFilter; @@ -74,6 +73,8 @@ private R_Filter(QueryBuilder queryBuilder, Class curre } else { this.orderingList = new ArrayList<>(); } + this.offset = offset; + this.maxSize = maxSize; } public static S_FilterEntryOrEmpty create(QueryBuilder builder) { @@ -111,7 +112,7 @@ R_Filter addSubfilter(ObjectFilter subfilter) { subfilter)); } else { OrFilter newFilter = appendAtomicFilter(subfilter, isNegated, lastLogicalSymbol); - return new R_Filter(queryBuilder, currentClass, newFilter, null, false, parentFilter, typeRestriction, existsRestriction, orderingList); + return new R_Filter(queryBuilder, currentClass, newFilter, null, false, parentFilter, typeRestriction, existsRestriction, orderingList, offset, maxSize); } } @@ -134,21 +135,29 @@ private R_Filter setLastLogicalSymbol(LogicalSymbol newLogicalSymbol) { if (this.lastLogicalSymbol != null) { throw new IllegalStateException("Two logical symbols in a sequence"); } - return new R_Filter(queryBuilder, currentClass, currentFilter, newLogicalSymbol, isNegated, parentFilter, typeRestriction, existsRestriction, orderingList); + return new R_Filter(queryBuilder, currentClass, currentFilter, newLogicalSymbol, isNegated, parentFilter, typeRestriction, existsRestriction, orderingList, offset, maxSize); } private R_Filter setNegated() { if (isNegated) { throw new IllegalStateException("Double negation"); } - return new R_Filter(queryBuilder, currentClass, currentFilter, lastLogicalSymbol, true, parentFilter, typeRestriction, existsRestriction, orderingList); + return new R_Filter(queryBuilder, currentClass, currentFilter, lastLogicalSymbol, true, parentFilter, typeRestriction, existsRestriction, orderingList, offset, maxSize); } private R_Filter addOrdering(ObjectOrdering ordering) { Validate.notNull(ordering); List newList = new ArrayList<>(orderingList); newList.add(ordering); - return new R_Filter(queryBuilder, currentClass, currentFilter, lastLogicalSymbol, isNegated, parentFilter, typeRestriction, existsRestriction, newList); + return new R_Filter(queryBuilder, currentClass, currentFilter, lastLogicalSymbol, isNegated, parentFilter, typeRestriction, existsRestriction, newList, offset, maxSize); + } + + private R_Filter setOffset(Integer n) { + return new R_Filter(queryBuilder, currentClass, currentFilter, lastLogicalSymbol, isNegated, parentFilter, typeRestriction, existsRestriction, orderingList, n, maxSize); + } + + private R_Filter setMaxSize(Integer n) { + return new R_Filter(queryBuilder, currentClass, currentFilter, lastLogicalSymbol, isNegated, parentFilter, typeRestriction, existsRestriction, orderingList, offset, n); } @Override @@ -240,11 +249,11 @@ public S_AtomicFilterExit isRoot() { @Override public S_FilterEntryOrEmpty block() { - return new R_Filter(queryBuilder, currentClass, OrFilter.createOr(), null, false, this, null, null, null); + return new R_Filter(queryBuilder, currentClass, OrFilter.createOr(), null, false, this, null, null, null, null, null); } @Override - public S_FilterEntry type(Class type) { + public S_FilterEntryOrEmpty type(Class type) { ComplexTypeDefinition ctd = queryBuilder.getPrismContext().getSchemaRegistry().findComplexTypeDefinitionByCompileTimeClass(type); if (ctd == null) { throw new IllegalArgumentException("Unknown type: " + type); @@ -253,7 +262,7 @@ public S_FilterEntry type(Class type) { if (typeName == null) { throw new IllegalStateException("No type name for " + ctd); } - return new R_Filter(queryBuilder, type, OrFilter.createOr(), null, false, this, typeName, null, null); + return new R_Filter(queryBuilder, type, OrFilter.createOr(), null, false, this, typeName, null, null, null, null); } @Override @@ -270,7 +279,7 @@ public S_FilterEntry exists(QName... names) { if (clazz == null) { throw new IllegalArgumentException("Item path of '" + existsPath + "' in " + currentClass + " does not point to a valid prism container."); } - return new R_Filter(queryBuilder, clazz, OrFilter.createOr(), null, false, this, null, existsPath, null); + return new R_Filter(queryBuilder, clazz, OrFilter.createOr(), null, false, this, null, existsPath, null, null, null); } ID resolveItemPath(ItemPath itemPath, Class type) { @@ -339,10 +348,15 @@ public S_ConditionEntry item(PrismContainerDefinition containerDefinition, ItemP return item(itemPath, itemDefinition); } + @Override + public S_MatchingRuleEntry itemAs(PrismProperty property) { + return item(property.getPath(), property.getDefinition()).eq(property); + } + @Override public S_AtomicFilterExit endBlock() { if (parentFilter == null) { - throw new IllegalArgumentException("endBlock() call without preceding block() one"); + throw new IllegalStateException("endBlock() call without preceding block() one"); } if (currentFilter != null || parentFilter.hasRestriction()) { ObjectFilter simplified = simplify(currentFilter); @@ -389,6 +403,16 @@ public S_FilterExit desc(ItemPath path) { return addOrdering(ObjectOrdering.createOrdering(path, OrderDirection.DESCENDING)); } + @Override + public S_FilterExit offset(Integer n) { + return setOffset(n); + } + + @Override + public S_FilterExit maxSize(Integer n) { + return setMaxSize(n); + } + @Override public ObjectQuery build() { if (typeRestriction != null || existsRestriction != null) { @@ -398,16 +422,26 @@ public ObjectQuery build() { if (parentFilter != null) { throw new IllegalStateException("A block in filter definition was probably not closed."); } - ObjectPaging paging; + ObjectPaging paging = null; if (!orderingList.isEmpty()) { - paging = ObjectPaging.createEmptyPaging(); + paging = createIfNeeded(null); paging.setOrdering(orderingList); - } else { - paging = null; + } + if (offset != null) { + paging = createIfNeeded(paging); + paging.setOffset(offset); + } + if (maxSize != null) { + paging = createIfNeeded(paging); + paging.setMaxSize(maxSize); } return ObjectQuery.createObjectQuery(simplify(currentFilter), paging); } + private ObjectPaging createIfNeeded(ObjectPaging paging) { + return paging != null ? paging : ObjectPaging.createEmptyPaging(); + } + @Override public ObjectFilter buildFilter() { return build().getFilter(); @@ -440,4 +474,8 @@ private ObjectFilter simplify(OrFilter filter) { return simplified; } } + + public PrismContext getPrismContext() { + return queryBuilder.getPrismContext(); + } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/S_AtomicFilterEntry.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/S_AtomicFilterEntry.java index 4edbfd49e3b..1050a770130 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/S_AtomicFilterEntry.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/S_AtomicFilterEntry.java @@ -16,12 +16,8 @@ package com.evolveum.midpoint.prism.query.builder; -import com.evolveum.midpoint.prism.Containerable; -import com.evolveum.midpoint.prism.ItemDefinition; -import com.evolveum.midpoint.prism.PrismContainerDefinition; -import com.evolveum.midpoint.prism.PrismReferenceValue; +import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.path.ItemPath; -import com.evolveum.midpoint.util.exception.SchemaException; import javax.xml.namespace.QName; @@ -38,6 +34,7 @@ public interface S_AtomicFilterEntry { S_ConditionEntry itemWithDef(ItemDefinition itemDefinition, QName... names); // experimental S_ConditionEntry item(PrismContainerDefinition containerDefinition, QName... names); S_ConditionEntry item(PrismContainerDefinition containerDefinition, ItemPath itemPath); + S_MatchingRuleEntry itemAs(PrismProperty property); // experimental; TODO choose better name for this method S_AtomicFilterExit id(String... identifiers) ; S_AtomicFilterExit id(long... identifiers) ; S_AtomicFilterExit ownerId(String... identifiers) ; @@ -50,6 +47,6 @@ public interface S_AtomicFilterEntry { S_AtomicFilterExit isParentOf(String oid) ; // oid should be of an OrgType S_AtomicFilterExit isRoot() ; S_FilterEntryOrEmpty block(); - S_FilterEntry type(Class type) ; + S_FilterEntryOrEmpty type(Class type) ; S_FilterEntry exists(QName... names) ; } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/S_ConditionEntry.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/S_ConditionEntry.java index a8a900a61f1..0e5bfe17e2c 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/S_ConditionEntry.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/S_ConditionEntry.java @@ -17,6 +17,7 @@ package com.evolveum.midpoint.prism.query.builder; import com.evolveum.midpoint.prism.PrismObject; +import com.evolveum.midpoint.prism.PrismProperty; import com.evolveum.midpoint.prism.PrismReferenceValue; import com.evolveum.midpoint.util.exception.SchemaException; @@ -28,6 +29,7 @@ */ public interface S_ConditionEntry { S_MatchingRuleEntry eq(Object... values); + S_MatchingRuleEntry eq(PrismProperty property); // TODO implement something like itemAs(property) to copy the property definition, path, and values into filter S_RightHandItemEntry eq(); S_MatchingRuleEntry eqPoly(String orig, String norm); S_MatchingRuleEntry eqPoly(String orig); @@ -41,10 +43,13 @@ public interface S_ConditionEntry { S_RightHandItemEntry le(); S_MatchingRuleEntry startsWith(Object value); S_MatchingRuleEntry startsWithPoly(String orig, String norm); + S_MatchingRuleEntry startsWithPoly(String orig); S_MatchingRuleEntry endsWith(Object value); S_MatchingRuleEntry endsWithPoly(String orig, String norm); + S_MatchingRuleEntry endsWithPoly(String orig); S_MatchingRuleEntry contains(Object value); S_MatchingRuleEntry containsPoly(String orig, String norm); + S_MatchingRuleEntry containsPoly(String orig); S_AtomicFilterExit ref(PrismReferenceValue value); S_AtomicFilterExit ref(Collection values); // not supported by repo QueryInterpreter yet S_AtomicFilterExit ref(String oid); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/S_FilterExit.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/S_FilterExit.java index 0a388fa1e45..00edf4b9690 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/S_FilterExit.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/S_FilterExit.java @@ -17,11 +17,8 @@ package com.evolveum.midpoint.prism.query.builder; import com.evolveum.midpoint.prism.path.ItemPath; -import com.evolveum.midpoint.prism.query.ObjectQuery; -import com.evolveum.midpoint.util.exception.SchemaException; import javax.xml.namespace.QName; -import java.nio.file.attribute.AclEntry; /** * @author mederly @@ -33,4 +30,6 @@ public interface S_FilterExit extends S_QueryExit { S_FilterExit asc(ItemPath path); S_FilterExit desc(QName... names); S_FilterExit desc(ItemPath path); + S_FilterExit offset(Integer n); + S_FilterExit maxSize(Integer n); } diff --git a/infra/prism/src/test/java/com/evolveum/midpoint/prism/query/TestQueryBuilder.java b/infra/prism/src/test/java/com/evolveum/midpoint/prism/query/TestQueryBuilder.java index 2ffdefd9b87..4e5c0ee06d2 100644 --- a/infra/prism/src/test/java/com/evolveum/midpoint/prism/query/TestQueryBuilder.java +++ b/infra/prism/src/test/java/com/evolveum/midpoint/prism/query/TestQueryBuilder.java @@ -16,12 +16,7 @@ package com.evolveum.midpoint.prism.query; -import com.evolveum.midpoint.prism.ComplexTypeDefinition; -import com.evolveum.midpoint.prism.PrismConstants; -import com.evolveum.midpoint.prism.PrismContainerDefinition; -import com.evolveum.midpoint.prism.PrismInternalTestUtil; -import com.evolveum.midpoint.prism.PrismObjectDefinition; -import com.evolveum.midpoint.prism.PrismPropertyDefinition; +import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.foo.AssignmentType; import com.evolveum.midpoint.prism.foo.UserType; import com.evolveum.midpoint.prism.match.MatchingRuleRegistry; @@ -32,6 +27,8 @@ import com.evolveum.midpoint.util.PrettyPrinter; import com.evolveum.midpoint.util.exception.SchemaException; import com.sun.tools.xjc.reader.xmlschema.bindinfo.BIConversion; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.testng.AssertJUnit; import org.testng.annotations.BeforeMethod; import org.testng.annotations.BeforeSuite; @@ -101,7 +98,7 @@ public void test112EmptyBlocks() throws Exception{ compare(actual, expected); } - @Test(expectedExceptions = SchemaException.class) + @Test(expectedExceptions = IllegalStateException.class) public void test113BlocksLeftOpen() throws Exception{ QueryBuilder.queryFor(UserType.class, getPrismContext()) .block() @@ -112,7 +109,7 @@ public void test113BlocksLeftOpen() throws Exception{ .build(); } - @Test(expectedExceptions = SchemaException.class) + @Test(expectedExceptions = IllegalStateException.class) public void test114NoOpenBlocks() throws Exception{ QueryBuilder.queryFor(UserType.class, getPrismContext()) .block() @@ -140,7 +137,7 @@ public void test122AllInBlock() throws Exception{ @Test public void test130SingleEquals() throws Exception{ ObjectQuery actual = QueryBuilder.queryFor(UserType.class, getPrismContext()).item(UserType.F_LOCALITY).eq("Caribbean").build(); - ObjectQuery expected = ObjectQuery.createObjectQuery(EqualFilter.createEqual(UserType.F_LOCALITY, UserType.class, getPrismContext(), "Caribbean")); + ObjectQuery expected = ObjectQuery.createObjectQuery(createEqual(UserType.F_LOCALITY, UserType.class, null, "Caribbean")); compare(actual, expected); } @@ -152,8 +149,8 @@ public void test132SingleAnd() throws Exception{ .build(); ObjectQuery expected = ObjectQuery.createObjectQuery( AndFilter.createAnd( - EqualFilter.createEqual(UserType.F_LOCALITY, UserType.class, getPrismContext(), "Caribbean"), - EqualFilter.createEqual(UserType.F_DESCRIPTION, UserType.class, getPrismContext(), "desc") + createEqual(UserType.F_LOCALITY, UserType.class, null, "Caribbean"), + createEqual(UserType.F_DESCRIPTION, UserType.class, null, "desc") ) ); compare(actual, expected); @@ -167,9 +164,9 @@ public void test134SingleOrWithNot() throws Exception{ .build(); ObjectQuery expected = ObjectQuery.createObjectQuery( OrFilter.createOr( - EqualFilter.createEqual(UserType.F_LOCALITY, UserType.class, getPrismContext(), "Caribbean"), + createEqual(UserType.F_LOCALITY, UserType.class, null, "Caribbean"), NotFilter.createNot( - EqualFilter.createEqual(UserType.F_DESCRIPTION, UserType.class, getPrismContext(), "desc") + createEqual(UserType.F_DESCRIPTION, UserType.class, null, "desc") ) ) ); @@ -190,10 +187,10 @@ public void test136AndOrNotSequence() throws Exception{ .build(); ObjectQuery expected = ObjectQuery.createObjectQuery( OrFilter.createOr( - EqualFilter.createEqual(UserType.F_LOCALITY, UserType.class, getPrismContext(), "Caribbean"), + createEqual(UserType.F_LOCALITY, UserType.class, null, "Caribbean"), AndFilter.createAnd( NotFilter.createNot( - EqualFilter.createEqual(UserType.F_DESCRIPTION, UserType.class, getPrismContext(), "desc") + createEqual(UserType.F_DESCRIPTION, UserType.class, null, "desc") ), AllFilter.createAll(), NoneFilter.createNone() @@ -218,7 +215,7 @@ public void test140TypeWithEquals() throws Exception{ ObjectQuery expected = ObjectQuery.createObjectQuery( TypeFilter.createType( USER_TYPE_QNAME, - EqualFilter.createEqual(UserType.F_LOCALITY, UserType.class, getPrismContext(), "Caribbean") + createEqual(UserType.F_LOCALITY, UserType.class, null, "Caribbean") ) ); compare(actual, expected); @@ -235,7 +232,7 @@ public void test142TypeWithEqualsInBlock() throws Exception{ ObjectQuery expected = ObjectQuery.createObjectQuery( TypeFilter.createType( USER_TYPE_QNAME, - EqualFilter.createEqual(UserType.F_LOCALITY, UserType.class, getPrismContext(), "Caribbean") + createEqual(UserType.F_LOCALITY, UserType.class, null, "Caribbean") ) ); compare(actual, expected); @@ -254,7 +251,7 @@ public void test144TypeWithEqualsAndAllInBlock() throws Exception{ TypeFilter.createType( USER_TYPE_QNAME, AndFilter.createAnd( - EqualFilter.createEqual(UserType.F_LOCALITY, UserType.class, getPrismContext(), "Caribbean"), + createEqual(UserType.F_LOCALITY, UserType.class, null, "Caribbean"), AllFilter.createAll() ) ) @@ -476,7 +473,7 @@ public void test210OrderByNameAndId() throws Exception{ paging.addOrderingInstruction(UserType.F_NAME, OrderDirection.ASCENDING); paging.addOrderingInstruction(PrismConstants.T_ID, OrderDirection.DESCENDING); ObjectQuery expected = ObjectQuery.createObjectQuery( - EqualFilter.createEqual(UserType.F_LOCALITY, UserType.class, getPrismContext(), "Caribbean"), + createEqual(UserType.F_LOCALITY, UserType.class, null, "Caribbean"), paging); compare(actual, expected); } @@ -528,5 +525,12 @@ protected void compare(ObjectQuery actual, ObjectQuery expected) { AssertJUnit.assertEquals("queries do not match", exp, act); } + private EqualFilter createEqual(QName propertyName, Class type, QName matchingRule, T realValue) { + return createEqual(new ItemPath(propertyName), type, matchingRule, realValue); + } + private EqualFilter createEqual(ItemPath propertyPath, Class type, QName matchingRule, T realValue) { + PrismPropertyDefinition propertyDefinition = (PrismPropertyDefinition) FilterUtils.findItemDefinition(propertyPath, type, getPrismContext()); + return EqualFilter.createEqual(propertyPath, propertyDefinition, matchingRule, getPrismContext(), realValue); + } } diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ObjectQueryUtil.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ObjectQueryUtil.java index 3b55250a75e..330bd9e5851 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ObjectQueryUtil.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ObjectQueryUtil.java @@ -23,6 +23,9 @@ import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.query.*; import com.evolveum.midpoint.prism.query.Visitor; +import com.evolveum.midpoint.prism.query.builder.QueryBuilder; +import com.evolveum.midpoint.prism.query.builder.S_AtomicFilterEntry; +import com.evolveum.midpoint.prism.query.builder.S_AtomicFilterExit; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang.Validate; import org.apache.commons.lang.mutable.MutableBoolean; @@ -68,21 +71,23 @@ public static ObjectQuery createOrigNameQuery(PolyStringType name, PrismContext } public static ObjectQuery createNameQuery(PolyString name, PrismContext prismContext) throws SchemaException { - EqualFilter filter = EqualFilter.createEqual(ObjectType.F_NAME, ObjectType.class, prismContext, null, name); - return ObjectQuery.createObjectQuery(filter); + return QueryBuilder.queryFor(ObjectType.class, prismContext) + .item(ObjectType.F_NAME).eq(name) + .build(); } public static ObjectQuery createOrigNameQuery(PolyString name, PrismContext prismContext) throws SchemaException { - EqualFilter filter = EqualFilter.createEqual(ObjectType.F_NAME, ObjectType.class, prismContext, PolyStringOrigMatchingRule.NAME, name); - return ObjectQuery.createObjectQuery(filter); + return QueryBuilder.queryFor(ObjectType.class, prismContext) + .item(ObjectType.F_NAME).eq(name).matchingOrig() + .build(); } public static ObjectQuery createNormNameQuery(PolyString name, PrismContext prismContext) throws SchemaException { PolyStringNormalizer normalizer = new PrismDefaultPolyStringNormalizer(); name.recompute(normalizer); - - EqualFilter filter = EqualFilter.createEqual(ObjectType.F_NAME, ObjectType.class, prismContext, PolyStringNormMatchingRule.NAME, name); - return ObjectQuery.createObjectQuery(filter); + return QueryBuilder.queryFor(ObjectType.class, prismContext) + .item(ObjectType.F_NAME).eq(name).matchingNorm() + .build(); } public static ObjectQuery createNameQuery(ObjectType object) throws SchemaException { @@ -96,7 +101,7 @@ public static ObjectQuery createNameQuery(PrismObject public static ObjectQuery createResourceAndObjectClassQuery(String resourceOid, QName objectClass, PrismContext prismContext) throws SchemaException { return ObjectQuery.createObjectQuery(createResourceAndObjectClassFilter(resourceOid, objectClass, prismContext)); } - + public static ObjectFilter createResourceAndObjectClassFilter(String resourceOid, QName objectClass, PrismContext prismContext) throws SchemaException { Validate.notNull(resourceOid, "Resource where to search must not be null."); Validate.notNull(objectClass, "Object class to search must not be null."); @@ -106,7 +111,16 @@ public static ObjectFilter createResourceAndObjectClassFilter(String resourceOid createObjectClassFilter(objectClass, prismContext)); return and; } - + + public static S_AtomicFilterExit createResourceAndObjectClassFilterPrefix(String resourceOid, QName objectClass, PrismContext prismContext) throws SchemaException { + Validate.notNull(resourceOid, "Resource where to search must not be null."); + Validate.notNull(objectClass, "Object class to search must not be null."); + Validate.notNull(prismContext, "Prism context must not be null."); + return QueryBuilder.queryFor(ShadowType.class, prismContext) + .item(ShadowType.F_RESOURCE_REF).ref(resourceOid) + .and().item(ShadowType.F_OBJECT_CLASS).eq(objectClass); + } + public static ObjectQuery createResourceAndKindIntent(String resourceOid, ShadowKindType kind, String intent, PrismContext prismContext) throws SchemaException { return ObjectQuery.createObjectQuery(createResourceAndKindIntentFilter(resourceOid, kind, intent, prismContext)); } @@ -119,21 +133,21 @@ public static ObjectFilter createResourceAndKindIntentFilter(String resourceOid, Validate.notNull(resourceOid, "Resource where to search must not be null."); Validate.notNull(kind, "Kind to search must not be null."); Validate.notNull(prismContext, "Prism context must not be null."); - AndFilter and = AndFilter.createAnd( - createResourceFilter(resourceOid, prismContext), - EqualFilter.createEqual(ShadowType.F_KIND, ShadowType.class, prismContext, null, kind), - EqualFilter.createEqual(ShadowType.F_INTENT, ShadowType.class, prismContext, null, intent)); - return and; + return QueryBuilder.queryFor(ShadowType.class, prismContext) + .item(ShadowType.F_RESOURCE_REF).ref(resourceOid) + .and().item(ShadowType.F_KIND).eq(kind) + .and().item(ShadowType.F_INTENT).eq(intent) + .buildFilter(); } private static ObjectFilter createResourceAndKindFilter(String resourceOid, ShadowKindType kind, PrismContext prismContext) throws SchemaException { Validate.notNull(resourceOid, "Resource where to search must not be null."); Validate.notNull(kind, "Kind to search must not be null."); Validate.notNull(prismContext, "Prism context must not be null."); - AndFilter and = AndFilter.createAnd( - createResourceFilter(resourceOid, prismContext), - EqualFilter.createEqual(ShadowType.F_KIND, ShadowType.class, prismContext, null, kind)); - return and; + return QueryBuilder.queryFor(ShadowType.class, prismContext) + .item(ShadowType.F_RESOURCE_REF).ref(resourceOid) + .and().item(ShadowType.F_KIND).eq(kind) + .buildFilter(); } public static ObjectQuery createResourceQuery(String resourceOid, PrismContext prismContext) throws SchemaException { @@ -143,17 +157,21 @@ public static ObjectQuery createResourceQuery(String resourceOid, PrismContext p } public static ObjectFilter createResourceFilter(String resourceOid, PrismContext prismContext) throws SchemaException { - return RefFilter.createReferenceEqual(ShadowType.F_RESOURCE_REF, ShadowType.class, prismContext, resourceOid); + return QueryBuilder.queryFor(ShadowType.class, prismContext) + .item(ShadowType.F_RESOURCE_REF).ref(resourceOid) + .buildFilter(); } public static ObjectFilter createObjectClassFilter(QName objectClass, PrismContext prismContext) { - return EqualFilter.createEqual(ShadowType.F_OBJECT_CLASS, ShadowType.class, prismContext, null, objectClass); + return QueryBuilder.queryFor(ShadowType.class, prismContext) + .item(ShadowType.F_OBJECT_CLASS).eq(objectClass) + .buildFilter(); } - public static ObjectQuery createNameQuery(Class clazz, PrismContext prismContext, String name) throws SchemaException{ - PolyString namePolyString = new PolyString(name); - EqualFilter equal = EqualFilter.createEqual(ObjectType.F_NAME, clazz, prismContext, null, namePolyString); - return ObjectQuery.createObjectQuery(equal); + public static ObjectQuery createNameQuery(Class clazz, PrismContext prismContext, String name) throws SchemaException { + return QueryBuilder.queryFor(clazz, prismContext) + .item(ObjectType.F_NAME).eqPoly(name) + .build(); } public static ObjectQuery createRootOrgQuery(PrismContext prismContext) throws SchemaException { diff --git a/model/certification-impl/src/test/java/com/evolveum/midpoint/certification/test/BasicCertificationTest.java b/model/certification-impl/src/test/java/com/evolveum/midpoint/certification/test/BasicCertificationTest.java index 8bfef33fd29..3bd78fd0dac 100644 --- a/model/certification-impl/src/test/java/com/evolveum/midpoint/certification/test/BasicCertificationTest.java +++ b/model/certification-impl/src/test/java/com/evolveum/midpoint/certification/test/BasicCertificationTest.java @@ -339,10 +339,11 @@ public void test040SearchCasesFilteredSortedPaged() throws Exception { TestUtil.displayWhen(TEST_NAME); Collection> resolveNames = SelectorOptions.createCollection(GetOperationOptions.createResolveNames()); - ObjectFilter filter = RefFilter.createReferenceEqual(new ItemPath(AccessCertificationCaseType.F_OBJECT_REF), - AccessCertificationCaseType.class, prismContext, ObjectTypeUtil.createObjectRef(userAdministrator).asReferenceValue()); - ObjectPaging paging = ObjectPaging.createPaging(2, 2, getOrderBy(F_TARGET_REF), OrderDirection.DESCENDING); - ObjectQuery query = ObjectQuery.createObjectQuery(filter, paging); + ObjectQuery query = QueryBuilder.queryFor(AccessCertificationCaseType.class, prismContext) + .item(AccessCertificationCaseType.F_OBJECT_REF).ref(userAdministrator.getOid()) + .desc(F_TARGET_REF) + .offset(2).maxSize(2) + .build(); List caseList = modelService.searchContainers( AccessCertificationCaseType.class, query, resolveNames, task, result); @@ -728,8 +729,10 @@ public void test205StartRemediationAllow() throws Exception { display("campaign after remediation start", campaign); assertTrue("wrong campaign state: " + campaign.getState(), campaign.getState() == CLOSED || campaign.getState() == IN_REMEDIATION); - RefFilter taskFilter = RefFilter.createReferenceEqual(new ItemPath(TaskType.F_OBJECT_REF), TaskType.class, prismContext, ObjectTypeUtil.createObjectRef(campaign).asReferenceValue()); - List> tasks = taskManager.searchObjects(TaskType.class, ObjectQuery.createObjectQuery(taskFilter), null, result); + ObjectQuery query = QueryBuilder.queryFor(TaskType.class, prismContext) + .item(TaskType.F_OBJECT_REF).ref(campaign.getOid()) + .build(); + List> tasks = taskManager.searchObjects(TaskType.class, query, null, result); assertEquals("unexpected number of related tasks", 1, tasks.size()); waitForTaskFinish(tasks.get(0).getOid(), true); diff --git a/model/certification-impl/src/test/java/com/evolveum/midpoint/certification/test/CriticalRolesCertificationTest.java b/model/certification-impl/src/test/java/com/evolveum/midpoint/certification/test/CriticalRolesCertificationTest.java index 9e5f3860dec..186fb7b5ff0 100644 --- a/model/certification-impl/src/test/java/com/evolveum/midpoint/certification/test/CriticalRolesCertificationTest.java +++ b/model/certification-impl/src/test/java/com/evolveum/midpoint/certification/test/CriticalRolesCertificationTest.java @@ -20,6 +20,7 @@ import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.prism.query.RefFilter; +import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.CertCampaignTypeUtil; import com.evolveum.midpoint.schema.util.ObjectTypeUtil; @@ -947,8 +948,10 @@ public void test900StartRemediation() throws Exception { display("campaign after remediation start", campaign); assertTrue("wrong campaign state: " + campaign.getState(), campaign.getState() == CLOSED || campaign.getState() == IN_REMEDIATION); - RefFilter taskFilter = RefFilter.createReferenceEqual(new ItemPath(TaskType.F_OBJECT_REF), TaskType.class, prismContext, ObjectTypeUtil.createObjectRef(campaign).asReferenceValue()); - List> tasks = taskManager.searchObjects(TaskType.class, ObjectQuery.createObjectQuery(taskFilter), null, result); + ObjectQuery query = QueryBuilder.queryFor(TaskType.class, prismContext) + .item(TaskType.F_OBJECT_REF).ref(campaign.getOid()) + .build(); + List> tasks = taskManager.searchObjects(TaskType.class, query, null, result); assertEquals("unexpected number of related tasks", 1, tasks.size()); waitForTaskFinish(tasks.get(0).getOid(), true); diff --git a/model/certification-impl/src/test/java/com/evolveum/midpoint/certification/test/RoleInducementCertificationTest.java b/model/certification-impl/src/test/java/com/evolveum/midpoint/certification/test/RoleInducementCertificationTest.java index be0802d6388..7ed51e20545 100644 --- a/model/certification-impl/src/test/java/com/evolveum/midpoint/certification/test/RoleInducementCertificationTest.java +++ b/model/certification-impl/src/test/java/com/evolveum/midpoint/certification/test/RoleInducementCertificationTest.java @@ -20,6 +20,7 @@ import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.prism.query.RefFilter; +import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.ObjectTypeUtil; import com.evolveum.midpoint.task.api.Task; @@ -796,8 +797,10 @@ public void test300StartRemediation() throws Exception { display("campaign after remediation start", campaign); assertTrue("wrong campaign state: " + campaign.getState(), campaign.getState() == CLOSED || campaign.getState() == IN_REMEDIATION); - RefFilter taskFilter = RefFilter.createReferenceEqual(new ItemPath(TaskType.F_OBJECT_REF), TaskType.class, prismContext, ObjectTypeUtil.createObjectRef(campaign).asReferenceValue()); - List> tasks = taskManager.searchObjects(TaskType.class, ObjectQuery.createObjectQuery(taskFilter), null, result); + ObjectQuery query = QueryBuilder.queryFor(TaskType.class, prismContext) + .item(TaskType.F_OBJECT_REF).ref(campaign.getOid()) + .build(); + List> tasks = taskManager.searchObjects(TaskType.class, query, null, result); assertEquals("unexpected number of related tasks", 1, tasks.size()); waitForTaskFinish(tasks.get(0).getOid(), true); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/ModelDiagController.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/ModelDiagController.java index 6cf2c4588cb..8ea4f612dd8 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/ModelDiagController.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/ModelDiagController.java @@ -25,6 +25,7 @@ import com.evolveum.midpoint.common.configuration.api.MidpointConfiguration; import com.evolveum.midpoint.model.impl.dataModel.DataModelVisualizer; +import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import com.evolveum.midpoint.schema.*; import com.evolveum.midpoint.security.api.AuthorizationConstants; import com.evolveum.midpoint.security.api.SecurityEnforcer; @@ -267,10 +268,9 @@ private void repositorySelfTestUser(Task task, OperationResult testResult) { OperationResult subresult = result.createSubresult(result.getOperation()+".searchObjects.fullName"); try { - ObjectQuery query = new ObjectQuery(); - ObjectFilter filter = EqualFilter.createEqual(UserType.F_FULL_NAME, UserType.class, prismContext, null, - toPolyString(USER_FULL_NAME)); - query.setFilter(filter); + ObjectQuery query = QueryBuilder.queryFor(UserType.class, prismContext) + .item(UserType.F_FULL_NAME).eq(toPolyString(USER_FULL_NAME)) + .build(); subresult.addParam("query", query); List> foundObjects = repositoryService.searchObjects(UserType.class, query , null, subresult); if (LOGGER.isTraceEnabled()) { @@ -292,11 +292,9 @@ private void repositorySelfTestUser(Task task, OperationResult testResult) { { OperationResult subresult = result.createSubresult(result.getOperation()+".searchObjects.employeeType"); try { - - ObjectQuery query = new ObjectQuery(); - ObjectFilter filter = EqualFilter.createEqual(UserType.F_EMPLOYEE_TYPE, UserType.class, prismContext, null, - USER_EMPLOYEE_TYPE[0]); - query.setFilter(filter); + ObjectQuery query = QueryBuilder.queryFor(UserType.class, prismContext) + .item(UserType.F_EMPLOYEE_TYPE).eq(USER_EMPLOYEE_TYPE[0]) + .build(); subresult.addParam("query", query); List> foundObjects = repositoryService.searchObjects(UserType.class, query , null, subresult); if (LOGGER.isTraceEnabled()) { @@ -318,11 +316,9 @@ private void repositorySelfTestUser(Task task, OperationResult testResult) { { OperationResult subresult = result.createSubresult(result.getOperation()+".searchObjects.organization"); try { - - ObjectQuery query = new ObjectQuery(); - ObjectFilter filter = EqualFilter.createEqual(UserType.F_ORGANIZATION, UserType.class, prismContext, null, - toPolyString(USER_ORGANIZATION[1])); - query.setFilter(filter); + ObjectQuery query = QueryBuilder.queryFor(UserType.class, prismContext) + .item(UserType.F_ORGANIZATION).eq(toPolyString(USER_ORGANIZATION[1])) + .build(); subresult.addParam("query", query); List> foundObjects = repositoryService.searchObjects(UserType.class, query, null, subresult); if (LOGGER.isTraceEnabled()) { diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/expr/OrgStructFunctionsImpl.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/expr/OrgStructFunctionsImpl.java index 804ae6c7331..85178193a65 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/expr/OrgStructFunctionsImpl.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/expr/OrgStructFunctionsImpl.java @@ -22,6 +22,7 @@ import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.prism.query.RefFilter; +import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import com.evolveum.midpoint.repo.api.RepositoryService; import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.result.OperationResult; @@ -275,22 +276,17 @@ public Collection getManagersOfOrg(String orgOid, boolean preAuthorize Set retval = new HashSet(); OperationResult result = new OperationResult("getManagerOfOrg"); - PrismObjectDefinition userDef = prismContext.getSchemaRegistry().findObjectDefinitionByCompileTimeClass(UserType.class); - PrismReferenceDefinition parentOrgRefDef = userDef.findReferenceDefinition(ObjectType.F_PARENT_ORG_REF); - PrismReference parentOrgRef = parentOrgRefDef.instantiate(); PrismReferenceValue parentOrgRefVal = new PrismReferenceValue(orgOid, OrgType.COMPLEX_TYPE); parentOrgRefVal.setRelation(SchemaConstants.ORG_MANAGER); - parentOrgRef.add(parentOrgRefVal); - ObjectQuery objectQuery = ObjectQuery.createObjectQuery(RefFilter.createReferenceEqual( - new ItemPath(ObjectType.F_PARENT_ORG_REF), parentOrgRef)); + ObjectQuery objectQuery = QueryBuilder.queryFor(ObjectType.class, prismContext) + .item(ObjectType.F_PARENT_ORG_REF).ref(parentOrgRefVal) + .build(); List> members = searchObjects(ObjectType.class, objectQuery, result, preAuthorized); for (PrismObject member : members) { if (member.asObjectable() instanceof UserType) { UserType user = (UserType) member.asObjectable(); -// if (isManagerOf(user, orgOid)) { retval.add(user); -// } } } return retval; diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/integrity/ShadowIntegrityCheckResultHandler.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/integrity/ShadowIntegrityCheckResultHandler.java index 4dfb4ff0e01..b1fbfe25b22 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/integrity/ShadowIntegrityCheckResultHandler.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/integrity/ShadowIntegrityCheckResultHandler.java @@ -39,6 +39,7 @@ import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.prism.query.RefFilter; +import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import com.evolveum.midpoint.provisioning.api.ProvisioningService; import com.evolveum.midpoint.repo.api.RepositoryService; import com.evolveum.midpoint.schema.GetOperationOptions; @@ -371,7 +372,7 @@ private void checkShadow(ShadowCheckResult checkResult, PrismObject } if (checkOwners) { - List owners = searchOwners(shadow, result); + List> owners = searchOwners(shadow, result); if (owners != null) { shadow.setUserData(KEY_OWNERS, owners); if (owners.size() > 1) { @@ -478,18 +479,18 @@ private void checkShadow(ShadowCheckResult checkResult, PrismObject } } - private List searchOwners(PrismObject shadow, OperationResult result) { + private List> searchOwners(PrismObject shadow, OperationResult result) { try { - PrismReferenceValue refValue = new PrismReferenceValue(shadow.getOid(), ShadowType.COMPLEX_TYPE); - RefFilter ownerFilter = RefFilter.createReferenceEqual(new ItemPath(FocusType.F_LINK_REF), FocusType.class, prismContext, refValue); - ObjectQuery ownerQuery = ObjectQuery.createObjectQuery(ownerFilter); - List owners = repositoryService.searchObjects(FocusType.class, ownerQuery, null, result); + ObjectQuery ownerQuery = QueryBuilder.queryFor(FocusType.class, prismContext) + .item(FocusType.F_LINK_REF).ref(shadow.getOid()) + .build(); + List> owners = repositoryService.searchObjects(FocusType.class, ownerQuery, null, result); if (LOGGER.isTraceEnabled()) { LOGGER.trace("Owners for {}: {}", ObjectTypeUtil.toShortString(shadow), owners); } return owners; - } catch (SchemaException e) { - LoggingUtils.logUnexpectedException(LOGGER, "Couldn't create owners query for shadow {}", e, ObjectTypeUtil.toShortString(shadow)); + } catch (SchemaException|RuntimeException e) { + LoggingUtils.logUnexpectedException(LOGGER, "Couldn't create/execute owners query for shadow {}", e, ObjectTypeUtil.toShortString(shadow)); return null; } } @@ -721,7 +722,7 @@ private void deleteShadows(DuplicateShadowsTreatmentInstruction instruction, Str sb.append(" --> deleted redundant shadow").append(skippedForDryRun()).append(" ").append(ObjectTypeUtil.toShortString(shadowToDelete)).append("\n"); String oid = shadowToDelete.getOid(); - List owners; + List> owners; if (checkOwners) { owners = (List) shadowToDelete.getUserData(KEY_OWNERS); } else { diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/Clockwork.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/Clockwork.java index 4f2304bc027..7e7c5f0e98c 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/Clockwork.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/Clockwork.java @@ -57,6 +57,7 @@ import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.query.ObjectFilter; import com.evolveum.midpoint.prism.query.RefFilter; +import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import com.evolveum.midpoint.prism.xml.XmlTypeConverter; import com.evolveum.midpoint.provisioning.api.ChangeNotificationDispatcher; import com.evolveum.midpoint.provisioning.api.ProvisioningService; @@ -634,8 +635,9 @@ private HookOperationMode triggerReconcileAffected(LensCo PrismPropertyDefinition propertyDef = prismContext.getSchemaRegistry() .findPropertyDefinitionByElementName(SchemaConstants.MODEL_EXTENSION_OBJECT_QUERY); PrismReferenceValue referenceValue = new PrismReferenceValue(context.getFocusContext().getOid(), RoleType.COMPLEX_TYPE); - ObjectFilter refFilter = RefFilter.createReferenceEqual(new ItemPath(UserType.F_ASSIGNMENT, AssignmentType.F_TARGET_REF), - UserType.class, prismContext, referenceValue); + ObjectFilter refFilter = QueryBuilder.queryFor(FocusType.class, prismContext) + .item(FocusType.F_ASSIGNMENT, AssignmentType.F_TARGET_REF).ref(referenceValue) + .buildFilter(); SearchFilterType filterType = QueryConvertor.createSearchFilterType(refFilter, prismContext); QueryType queryType = new QueryType(); queryType.setFilter(filterType); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/AssignmentProcessor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/AssignmentProcessor.java index 489956d4003..6428e3b7334 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/AssignmentProcessor.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/AssignmentProcessor.java @@ -29,6 +29,8 @@ import javax.xml.datatype.XMLGregorianCalendar; +import com.evolveum.midpoint.prism.query.builder.QueryBuilder; +import com.evolveum.midpoint.prism.query.builder.S_AtomicFilterExit; import com.evolveum.midpoint.xml.ns._public.common.common_3.OrgType; import org.springframework.beans.factory.annotation.Autowired; @@ -1593,16 +1595,12 @@ private void checkAssigneeConstraints(LensContext conte } private int countAssignees(PrismObject target, String selfOid, OperationResult result) throws SchemaException { - ObjectFilter refFilter = RefFilter.createReferenceEqual( - new ItemPath(FocusType.F_ASSIGNMENT, AssignmentType.F_TARGET_REF), UserType.class, prismContext, target.getOid()); - ObjectFilter filter; - if (selfOid == null) { - filter = refFilter; - } else { - InOidFilter oidFilter = InOidFilter.createInOid(selfOid); - filter = AndFilter.createAnd(refFilter, NotFilter.createNot(oidFilter)); + S_AtomicFilterExit q = QueryBuilder.queryFor(FocusType.class, prismContext) + .item(FocusType.F_ASSIGNMENT, AssignmentType.F_TARGET_REF).ref(target.getOid()); + if (selfOid != null) { + q = q.and().not().id(selfOid); } - ObjectQuery query = ObjectQuery.createObjectQuery(filter); + ObjectQuery query = q.build(); return repositoryService.countObjects(FocusType.class, query, result); } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/FocusConstraintsChecker.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/FocusConstraintsChecker.java index 7b71c2c3817..f814548031f 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/FocusConstraintsChecker.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/FocusConstraintsChecker.java @@ -30,6 +30,7 @@ import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.query.EqualFilter; import com.evolveum.midpoint.prism.query.ObjectQuery; +import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import com.evolveum.midpoint.repo.api.RepositoryService; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.util.caching.AbstractCache; @@ -125,8 +126,9 @@ private boolean checkPropertyUniqueness(PrismObject objectNew, ItemPath p } String oid = objectNew.getOid(); - ObjectQuery query = ObjectQuery.createObjectQuery( - EqualFilter.createEqual(propPath, property)); + ObjectQuery query = QueryBuilder.queryFor(objectNew.getCompileTimeClass(), prismContext) + .itemAs(property) + .build(); List> foundObjects = repositoryService.searchObjects(objectNew.getCompileTimeClass(), query, null, result); if (LOGGER.isTraceEnabled()) { diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/DiscoverConnectorsExecutor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/DiscoverConnectorsExecutor.java index 0312bf554f6..a493c987d26 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/DiscoverConnectorsExecutor.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/DiscoverConnectorsExecutor.java @@ -27,6 +27,7 @@ import com.evolveum.midpoint.prism.query.AndFilter; import com.evolveum.midpoint.prism.query.EqualFilter; import com.evolveum.midpoint.prism.query.ObjectQuery; +import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import com.evolveum.midpoint.schema.constants.ObjectTypes; import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.result.OperationResult; @@ -140,12 +141,10 @@ private void determineConnectorMappings(Map rebindMap, ConnectorT LOGGER.trace("Finding obsolete versions for connector: {}", connectorType.asPrismObject().debugDump()); } - AndFilter filter = AndFilter.createAnd( - EqualFilter.createEqual(SchemaConstants.C_CONNECTOR_FRAMEWORK, ConnectorType.class, prismContext, null, connectorType.getFramework()), - EqualFilter.createEqual(SchemaConstants.C_CONNECTOR_CONNECTOR_TYPE, ConnectorType.class, prismContext, null, connectorType.getConnectorType())); - - ObjectQuery query = ObjectQuery.createObjectQuery(filter); - + ObjectQuery query = QueryBuilder.queryFor(ConnectorType.class, prismContext) + .item(SchemaConstants.C_CONNECTOR_FRAMEWORK).eq(connectorType.getFramework()) + .and().item(SchemaConstants.C_CONNECTOR_CONNECTOR_TYPE).eq(connectorType.getConnectorType()) + .build(); List> foundConnectors; try { foundConnectors = modelService.searchObjects(ConnectorType.class, query, null, null, result); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/TestResourceExecutor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/TestResourceExecutor.java index 77cf6304bef..3335a8f6093 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/TestResourceExecutor.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/TestResourceExecutor.java @@ -26,6 +26,7 @@ import com.evolveum.midpoint.prism.query.AndFilter; import com.evolveum.midpoint.prism.query.EqualFilter; import com.evolveum.midpoint.prism.query.ObjectQuery; +import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.util.exception.CommunicationException; @@ -128,13 +129,10 @@ private void determineConnectorMappings(Map rebindMap, ConnectorT if (LOGGER.isTraceEnabled()) { LOGGER.trace("Finding obsolete versions for connector: {}", connectorType.asPrismObject().debugDump()); } - - AndFilter filter = AndFilter.createAnd( - EqualFilter.createEqual(SchemaConstants.C_CONNECTOR_FRAMEWORK, ConnectorType.class, prismContext, null, connectorType.getFramework()), - EqualFilter.createEqual(SchemaConstants.C_CONNECTOR_CONNECTOR_TYPE, ConnectorType.class, prismContext, null, connectorType.getConnectorType())); - - ObjectQuery query = ObjectQuery.createObjectQuery(filter); - + ObjectQuery query = QueryBuilder.queryFor(ConnectorType.class, prismContext) + .item(SchemaConstants.C_CONNECTOR_FRAMEWORK).eq(connectorType.getFramework()) + .and().item(SchemaConstants.C_CONNECTOR_CONNECTOR_TYPE).eq(connectorType.getConnectorType()) + .build(); List> foundConnectors; try { foundConnectors = modelService.searchObjects(ConnectorType.class, query, null, null, result); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/ReconciliationTaskHandler.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/ReconciliationTaskHandler.java index 9ce7126e7c9..37b52beb9c5 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/ReconciliationTaskHandler.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/ReconciliationTaskHandler.java @@ -21,6 +21,7 @@ import javax.annotation.PostConstruct; import javax.xml.namespace.QName; +import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; @@ -539,17 +540,14 @@ private boolean performShadowReconciliation(final PrismObject reso LOGGER.trace("Shadow reconciliation starting for {}, {} -> {}", new Object[]{resource, startTimestamp, endTimestamp}); OperationResult opResult = result.createSubresult(OperationConstants.RECONCILIATION+".shadowReconciliation"); - LessFilter timestampFilter = LessFilter.createLess(ShadowType.F_FULL_SYNCHRONIZATION_TIMESTAMP, ShadowType.class, prismContext, - XmlTypeConverter.createXMLGregorianCalendar(startTimestamp) , true); - PrismObjectDefinition shadowDef = prismContext.getSchemaRegistry().findObjectDefinitionByCompileTimeClass(ShadowType.class); - EqualFilter nullTimestamptFilter = EqualFilter.createNullEqual(new ItemPath(ShadowType.F_FULL_SYNCHRONIZATION_TIMESTAMP), shadowDef.findPropertyDefinition(ShadowType.F_FULL_SYNCHRONIZATION_TIMESTAMP), null); - OrFilter fullTimestampFilter = OrFilter.createOr(timestampFilter, nullTimestamptFilter); - ObjectReferenceType ref = ObjectTypeUtil.createObjectRef(resource); - ObjectFilter filter = AndFilter.createAnd(fullTimestampFilter, - RefFilter.createReferenceEqual(new ItemPath(ShadowType.F_RESOURCE_REF), ShadowType.class, prismContext, ref.asReferenceValue()), - EqualFilter.createEqual(ShadowType.F_OBJECT_CLASS, ShadowType.class, prismContext, objectclassDef.getTypeName())); - - ObjectQuery query = ObjectQuery.createObjectQuery(filter); + ObjectQuery query = QueryBuilder.queryFor(ShadowType.class, prismContext) + .block() + .item(ShadowType.F_FULL_SYNCHRONIZATION_TIMESTAMP).le(XmlTypeConverter.createXMLGregorianCalendar(startTimestamp)) + .or().item(ShadowType.F_FULL_SYNCHRONIZATION_TIMESTAMP).isNull() + .endBlock() + .and().item(ShadowType.F_RESOURCE_REF).ref(ObjectTypeUtil.createObjectRef(resource).asReferenceValue()) + .and().item(ShadowType.F_OBJECT_CLASS).eq(objectclassDef.getTypeName()) + .build(); if (LOGGER.isTraceEnabled()) { LOGGER.trace("Shadow recon query:\n{}", query.debugDump()); } @@ -682,13 +680,11 @@ private boolean scanForUnfinishedOperations(Task task, String resourceOid, Recon OperationResult opResult = result.createSubresult(OperationConstants.RECONCILIATION+".repoReconciliation"); opResult.addParam("reconciled", true); - NotFilter notNull = NotFilter.createNot(createFailedOpFilter(null)); - AndFilter andFilter = AndFilter.createAnd(notNull, RefFilter.createReferenceEqual(ShadowType.F_RESOURCE_REF, ShadowType.class, - prismContext, resourceOid)); - ObjectQuery query = ObjectQuery.createObjectQuery(andFilter); - - List> shadows = repositoryService.searchObjects( - ShadowType.class, query, null, opResult); + ObjectQuery query = QueryBuilder.queryFor(ShadowType.class, prismContext) + .block().not().item(ShadowType.F_FAILED_OPERATION_TYPE).isNull().endBlock() + .and().item(ShadowType.F_RESOURCE_REF).ref(resourceOid) + .build(); + List> shadows = repositoryService.searchObjects(ShadowType.class, query, null, opResult); task.setExpectedTotal((long) shadows.size()); // for this phase, obviously @@ -758,10 +754,6 @@ private boolean scanForUnfinishedOperations(Task task, String resourceOid, Recon return task.canRun(); } - private ObjectFilter createFailedOpFilter(FailedOperationTypeType failedOp) throws SchemaException{ - return EqualFilter.createEqual(ShadowType.F_FAILED_OPERATION_TYPE, ShadowType.class, prismContext, null, failedOp); - } - @Override public Long heartbeat(Task task) { // TODO Auto-generated method stub diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestIteration.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestIteration.java index 51e8e2647eb..edb8a901ee6 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestIteration.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestIteration.java @@ -32,6 +32,7 @@ import com.evolveum.midpoint.prism.delta.ItemDelta; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.polystring.PolyString; +import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import com.evolveum.midpoint.util.exception.ExpressionEvaluationException; import com.evolveum.midpoint.util.exception.ObjectAlreadyExistsException; import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentType; @@ -2358,8 +2359,9 @@ private void assertNoUserNick(String accountName, String accountFullName, String private String lookupIterationTokenByAdditionalName(String additionalName) throws SchemaException, ObjectNotFoundException, SecurityViolationException, CommunicationException, ConfigurationException { Task task = taskManager.createTaskInstance(TestIteration.class.getName() + ".lookupIterationTokenByAdditionalName"); OperationResult result = task.getResult(); - EqualFilter filter = EqualFilter.createEqual(UserType.F_ADDITIONAL_NAME, UserType.class, prismContext, null, PrismTestUtil.createPolyString(additionalName)); - ObjectQuery query = ObjectQuery.createObjectQuery(filter); + ObjectQuery query = QueryBuilder.queryFor(UserType.class, prismContext) + .item(UserType.F_ADDITIONAL_NAME).eq(PrismTestUtil.createPolyString(additionalName)) + .build(); List> objects = modelService.searchObjects(UserType.class, query, null, task, result); if (objects.isEmpty()) { return null; diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestRbac.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestRbac.java index c5118826d7f..c6dce1e24de 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestRbac.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestRbac.java @@ -29,6 +29,7 @@ import javax.xml.bind.JAXBException; import javax.xml.namespace.QName; +import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.annotation.DirtiesContext.ClassMode; import org.springframework.test.context.ContextConfiguration; @@ -207,10 +208,10 @@ public void test010SearchReuqestableRoles() throws Exception { Task task = taskManager.createTaskInstance(TestRbac.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); - ObjectFilter filter = EqualFilter.createEqual(RoleType.F_REQUESTABLE, RoleType.class, prismContext, null, true); - ObjectQuery query = new ObjectQuery(); - query.setFilter(filter); - + ObjectQuery query = QueryBuilder.queryFor(RoleType.class, prismContext) + .item(RoleType.F_REQUESTABLE).eq(true) + .build(); + // WHEN List> requestableRoles = modelService.searchObjects(RoleType.class, query, null, task, result); diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/sync/TestImportRecon.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/sync/TestImportRecon.java index 71dee65c06c..effb4aa62bd 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/sync/TestImportRecon.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/sync/TestImportRecon.java @@ -30,6 +30,7 @@ import javax.xml.namespace.QName; +import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import org.apache.commons.lang.mutable.MutableInt; import org.opends.messages.TaskMessages; import org.springframework.beans.factory.annotation.Autowired; @@ -2519,15 +2520,13 @@ public void test610SearchDummyAccountsNameSubstring() throws Exception { // GIVEN Task task = createTask(TestImportRecon.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); - - ObjectFilter ocFilter = ObjectQueryUtil.createResourceAndObjectClassFilter(RESOURCE_DUMMY_OID, - new QName(RESOURCE_DUMMY_NAMESPACE,"AccountObjectClass"), prismContext); - SubstringFilter subStringFilter = SubstringFilter.createSubstring( - new ItemPath(ShadowType.F_ATTRIBUTES, SchemaConstants.ICFS_NAME), - new ResourceAttributeDefinition(SchemaConstants.ICFS_NAME, DOMUtil.XSD_STRING, prismContext), "s"); - AndFilter andFilter = AndFilter.createAnd(ocFilter, subStringFilter); - ObjectQuery query = ObjectQuery.createObjectQuery(andFilter); - + + ObjectQuery query = + ObjectQueryUtil.createResourceAndObjectClassFilterPrefix(RESOURCE_DUMMY_OID, new QName(RESOURCE_DUMMY_NAMESPACE, "AccountObjectClass"), prismContext) + .and().itemWithDef(new ResourceAttributeDefinition(SchemaConstants.ICFS_NAME, DOMUtil.XSD_STRING, prismContext), + ShadowType.F_ATTRIBUTES, SchemaConstants.ICFS_NAME).eq("s") + .build(); + // WHEN TestUtil.displayWhen(TEST_NAME); SearchResultList> objects = modelService.searchObjects(ShadowType.class, query, null, task, result); diff --git a/model/model-test/src/main/java/com/evolveum/midpoint/model/test/AbstractModelIntegrationTest.java b/model/model-test/src/main/java/com/evolveum/midpoint/model/test/AbstractModelIntegrationTest.java index 7a08155d21a..b8968884d6b 100644 --- a/model/model-test/src/main/java/com/evolveum/midpoint/model/test/AbstractModelIntegrationTest.java +++ b/model/model-test/src/main/java/com/evolveum/midpoint/model/test/AbstractModelIntegrationTest.java @@ -1016,16 +1016,16 @@ protected void assertAssignees(String targetOid, int expectedAssignees) throws S } protected int countAssignees(String targetOid, OperationResult result) throws SchemaException { - ObjectFilter filter = RefFilter.createReferenceEqual( - new ItemPath(FocusType.F_ASSIGNMENT, AssignmentType.F_TARGET_REF), UserType.class, prismContext, targetOid); - ObjectQuery query = ObjectQuery.createObjectQuery(filter); + ObjectQuery query = QueryBuilder.queryFor(FocusType.class, prismContext) + .item(FocusType.F_ASSIGNMENT, AssignmentType.F_TARGET_REF).ref(targetOid) + .build(); return repositoryService.countObjects(FocusType.class, query, result); } protected SearchResultList> listAssignees(String targetOid, OperationResult result) throws SchemaException { - ObjectFilter filter = RefFilter.createReferenceEqual( - new ItemPath(FocusType.F_ASSIGNMENT, AssignmentType.F_TARGET_REF), UserType.class, prismContext, targetOid); - ObjectQuery query = ObjectQuery.createObjectQuery(filter); + ObjectQuery query = QueryBuilder.queryFor(FocusType.class, prismContext) + .item(FocusType.F_ASSIGNMENT, AssignmentType.F_TARGET_REF).ref(targetOid) + .build(); return repositoryService.searchObjects(FocusType.class, query, null, result); } @@ -1157,14 +1157,11 @@ protected Collection> listAccounts(PrismObject identifierDefs = rAccount.getPrimaryIdentifiers(); assert identifierDefs.size() == 1 : "Unexpected identifier set in "+resource+" refined schema: "+identifierDefs; ResourceAttributeDefinition identifierDef = identifierDefs.iterator().next(); - EqualFilter ocFilter = EqualFilter.createEqual(ShadowType.F_OBJECT_CLASS, ShadowType.class, prismContext, null, - rAccount.getObjectClassDefinition().getTypeName()); - RefFilter resourceRefFilter = RefFilter.createReferenceEqual(ShadowType.F_RESOURCE_REF, ShadowType.class, resource); - AndFilter filter = AndFilter.createAnd(ocFilter, resourceRefFilter); - ObjectQuery query = ObjectQuery.createObjectQuery(filter); - + ObjectQuery query = QueryBuilder.queryFor(ShadowType.class, prismContext) + .item(ShadowType.F_OBJECT_CLASS).eq(rAccount.getObjectClassDefinition().getTypeName()) + .and().item(ShadowType.F_RESOURCE_REF).ref(resource.getOid()) + .build(); List> accounts = modelService.searchObjects(ShadowType.class, query, null, task, result); - return accounts; } diff --git a/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportFunctions.java b/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportFunctions.java index b3819f44a9f..eb63d099c63 100644 --- a/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportFunctions.java +++ b/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportFunctions.java @@ -293,13 +293,14 @@ ObjectFilter createEqualFilter(ItemPath propertyPat .buildFilter(); } - RefFilter createReferenceEqualFilter(QName propertyName, Class type, String... oids) { - return RefFilter.createReferenceEqual(propertyName, type, prismContext, oids); - } + // TODO implement if needed +// RefFilter createReferenceEqualFilter(QName propertyName, Class type, String... oids) { +// return RefFilter.createReferenceEqual(propertyName, type, prismContext, oids); +// } - RefFilter createReferenceEqualFilter(ItemPath propertyPath, Class type, String... oids) throws SchemaException { - return RefFilter.createReferenceEqual(propertyPath, type, prismContext, oids); - } +// RefFilter createReferenceEqualFilter(ItemPath propertyPath, Class type, String... oids) throws SchemaException { +// return RefFilter.createReferenceEqual(propertyPath, type, prismContext, oids); +// } Object parseObjectFromXML (String xml) throws SchemaException { return prismContext.parserFor(xml).xml().parseAnyData(); diff --git a/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/AbstractWfTest.java b/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/AbstractWfTest.java index e0287b79faf..a50331117c5 100644 --- a/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/AbstractWfTest.java +++ b/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/AbstractWfTest.java @@ -39,6 +39,7 @@ import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.prism.query.EqualFilter; import com.evolveum.midpoint.prism.query.ObjectQuery; +import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import com.evolveum.midpoint.prism.util.PrismTestUtil; import com.evolveum.midpoint.schema.DeltaConvertor; import com.evolveum.midpoint.schema.result.OperationResult; @@ -544,12 +545,12 @@ protected PrismObject findUserInRepo(String name, OperationResult resu } protected List> findUserInRepoUnchecked(String name, OperationResult result) throws SchemaException { - ObjectQuery q = ObjectQuery.createObjectQuery(EqualFilter.createEqual(UserType.F_NAME, UserType.class, prismContext, PolyStringOrigMatchingRule.NAME, new PolyString(name))); + ObjectQuery q = QueryBuilder.queryFor(UserType.class, prismContext).item(UserType.F_NAME).eqPoly(name).matchingOrig().build(); return repositoryService.searchObjects(UserType.class, q, null, result); } protected List> findRoleInRepoUnchecked(String name, OperationResult result) throws SchemaException { - ObjectQuery q = ObjectQuery.createObjectQuery(EqualFilter.createEqual(RoleType.F_NAME, UserType.class, prismContext, PolyStringOrigMatchingRule.NAME, new PolyString(name))); + ObjectQuery q = QueryBuilder.queryFor(RoleType.class, prismContext).item(RoleType.F_NAME).eqPoly(name).matchingOrig().build(); return repositoryService.searchObjects(RoleType.class, q, null, result); } diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/consistency/impl/ObjectAlreadyExistHandler.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/consistency/impl/ObjectAlreadyExistHandler.java index 2443cfe079d..94ffaade064 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/consistency/impl/ObjectAlreadyExistHandler.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/consistency/impl/ObjectAlreadyExistHandler.java @@ -20,6 +20,9 @@ import java.util.Collection; import java.util.List; +import com.evolveum.midpoint.prism.query.builder.QueryBuilder; +import com.evolveum.midpoint.prism.query.builder.S_AtomicFilterEntry; +import com.evolveum.midpoint.prism.query.builder.S_FilterEntryOrEmpty; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -129,22 +132,16 @@ private ObjectQuery createQueryByIcfName(ShadowType shadow) throws SchemaExcepti // TODO: error handling TODO TODO TODO set matching rule instead of null in equlas filter Collection> secondaryIdentifiers = ShadowUtil.getSecondaryIdentifiers(shadow); - List secondaryIdentifierFilters = new ArrayList(); - - for (ResourceAttribute secondaryIdentifier : secondaryIdentifiers){ - EqualFilter equal = EqualFilter.createEqual(new ItemPath(ShadowType.F_ATTRIBUTES, secondaryIdentifier.getElementName()), secondaryIdentifier); - secondaryIdentifierFilters.add(equal); + S_AtomicFilterEntry q = QueryBuilder.queryFor(ShadowType.class, prismContext); + // secondary identifiers connected by 'or' clause + q = q.block(); + for (ResourceAttribute secondaryIdentifier : secondaryIdentifiers) { + q = q.itemAs(secondaryIdentifier).or(); } - OrFilter orSecondary = OrFilter.createOr((List)secondaryIdentifierFilters); - RefFilter resourceRefFilter = RefFilter.createReferenceEqual(ShadowType.F_RESOURCE_REF, ShadowType.class, - prismContext, shadow.getResourceRef().getOid()); - EqualFilter objectClassFilter = EqualFilter.createEqual(ShadowType.F_OBJECT_CLASS, ShadowType.class, prismContext, - null, shadow.getObjectClass()); - - ObjectQuery query = ObjectQuery.createObjectQuery(AndFilter.createAnd(orSecondary, resourceRefFilter, - objectClassFilter)); - - return query; + q = q.none().endBlock().and(); + // resource + object class + q = q.item(ShadowType.F_RESOURCE_REF).ref(shadow.getResourceRef().getOid()).and(); + return q.item(ShadowType.F_OBJECT_CLASS).eq(shadow.getObjectClass()).build(); } private List> getExistingAccount(ObjectQuery query, Task task, OperationResult parentResult) diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ConnectorManager.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ConnectorManager.java index a8a29078b99..82cba12fc06 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ConnectorManager.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ConnectorManager.java @@ -24,6 +24,7 @@ import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; @@ -417,12 +418,10 @@ public Set discoverConnectors(ConnectorHostType hostType, Operati } private boolean isInRepo(ConnectorType connectorType, OperationResult result) throws SchemaException { - AndFilter filter = AndFilter.createAnd( - EqualFilter.createEqual(SchemaConstants.C_CONNECTOR_FRAMEWORK, ConnectorType.class, prismContext, null, connectorType.getFramework()), - EqualFilter.createEqual(SchemaConstants.C_CONNECTOR_CONNECTOR_TYPE, ConnectorType.class, prismContext, null, connectorType.getConnectorType())); - - ObjectQuery query = ObjectQuery.createObjectQuery(filter); - + ObjectQuery query = QueryBuilder.queryFor(ConnectorType.class, prismContext) + .item(SchemaConstants.C_CONNECTOR_FRAMEWORK).eq(connectorType.getFramework()) + .and().item(SchemaConstants.C_CONNECTOR_CONNECTOR_TYPE).eq(connectorType.getConnectorType()) + .build(); if (LOGGER.isTraceEnabled()) { LOGGER.trace("Looking for connector in repository:\n{}", query.debugDump()); diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowManager.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowManager.java index 4662d06c30c..5d69a2cfcfa 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowManager.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowManager.java @@ -26,6 +26,9 @@ import com.evolveum.midpoint.prism.delta.builder.DeltaBuilder; import com.evolveum.midpoint.prism.query.builder.QueryBuilder; +import com.evolveum.midpoint.prism.query.builder.S_AtomicFilterEntry; +import com.evolveum.midpoint.prism.query.builder.S_FilterEntry; +import com.evolveum.midpoint.prism.query.builder.S_FilterEntryOrEmpty; import com.evolveum.midpoint.provisioning.util.ProvisioningUtil; import com.evolveum.midpoint.schema.SchemaConstantsGenerated; import com.evolveum.midpoint.xml.ns._public.common.common_3.ActivationType; @@ -321,25 +324,20 @@ private List> lookupShadowsBySecondaryIdentifiers( LOGGER.trace("Shadow does not contain secondary identifier. Skipping lookup shadows according to name."); return null; } - - List secondaryEquals = new ArrayList<>(); + + S_FilterEntry q = QueryBuilder.queryFor(ShadowType.class, prismContext) + .block(); for (ResourceAttribute secondaryIdentifier : secondaryIdentifiers) { // There may be identifiers that come from associations and they will have parent set to association/identifiers // For the search to succeed we need all attribute to have "attributes" parent path. secondaryIdentifier = ShadowUtil.fixAttributePath(secondaryIdentifier); - secondaryEquals.add(createAttributeEqualFilter(ctx, secondaryIdentifier)); - } - - ObjectFilter secondaryIdentifierFilter = null; - if (secondaryEquals.size() > 1){ - secondaryIdentifierFilter = OrFilter.createOr((List) secondaryEquals); - } else { - secondaryIdentifierFilter = secondaryEquals.iterator().next(); + q = q.item(secondaryIdentifier.getPath(), secondaryIdentifier.getDefinition()) + .eq(getNormalizedValue(secondaryIdentifier, ctx.getObjectClassDefinition())) + .or(); } - - AndFilter filter = AndFilter.createAnd( - RefFilter.createReferenceEqual(ShadowType.F_RESOURCE_REF, ShadowType.class, ctx.getResource()), secondaryIdentifierFilter); - ObjectQuery query = ObjectQuery.createObjectQuery(filter); + ObjectQuery query = q.none().endBlock() + .and().item(ShadowType.F_RESOURCE_REF).ref(ctx.getResourceOid()) + .build(); if (LOGGER.isTraceEnabled()) { LOGGER.trace("Searching for shadow using filter on secondary identifier:\n{}", query.debugDump()); @@ -599,7 +597,9 @@ private List> searchShadowByIdenifiers(ProvisioningConte private ObjectQuery createSearchShadowQuery(ProvisioningContext ctx, Collection> identifiers, boolean primaryIdentifiersOnly, PrismContext prismContext, OperationResult parentResult) throws SchemaException, ConfigurationException, ObjectNotFoundException, CommunicationException { - List conditions = new ArrayList(); + + S_AtomicFilterEntry q = QueryBuilder.queryFor(ShadowType.class, prismContext); + RefinedObjectClassDefinition objectClassDefinition = ctx.getObjectClassDefinition(); for (PrismProperty identifier : identifiers) { RefinedAttributeDefinition rAttrDef; @@ -622,40 +622,22 @@ private ObjectQuery createSearchShadowQuery(ProvisioningContext ctx, Collection< String normalizedIdentifierValue = (String) getNormalizedAttributeValue(identifierValue, rAttrDef); PrismPropertyDefinition def = (PrismPropertyDefinition) identifier.getDefinition(); - ObjectFilter filter = QueryBuilder.queryFor(ShadowType.class, prismContext) - .itemWithDef(def, ShadowType.F_ATTRIBUTES, def.getName()).eq(normalizedIdentifierValue) - .buildFilter(); - conditions.add(filter); + q = q.itemWithDef(def, ShadowType.F_ATTRIBUTES, def.getName()).eq(normalizedIdentifierValue).and(); } - if (conditions.size() < 1) { + if (identifiers.size() < 1) { throw new SchemaException("Identifier not specified. Cannot create search query by identifier."); } - - RefFilter resourceRefFilter = RefFilter.createReferenceEqual(ShadowType.F_RESOURCE_REF, ShadowType.class, ctx.getResource()); - conditions.add(resourceRefFilter); - - if (objectClassDefinition != null) { - EqualFilter objectClassFilter = EqualFilter.createEqual(ShadowType.F_OBJECT_CLASS, ShadowType.class, - prismContext, objectClassDefinition.getTypeName()); - conditions.add(objectClassFilter); - } - ObjectFilter filter = null; - if (conditions.size() > 1) { - filter = AndFilter.createAnd(conditions); - } else { - filter = conditions.get(0); + if (objectClassDefinition != null) { + q = q.item(ShadowType.F_OBJECT_CLASS).eq(objectClassDefinition.getTypeName()).and(); } - - ObjectQuery query = ObjectQuery.createObjectQuery(filter); - return query; + return q.item(ShadowType.F_RESOURCE_REF).ref(ctx.getResourceOid()).build(); } private ObjectQuery createSearchShadowQuery(ProvisioningContext ctx, PrismObject resourceShadow, PrismContext prismContext, OperationResult parentResult) throws SchemaException, ObjectNotFoundException, CommunicationException, ConfigurationException { - ResourceAttributeContainer attributesContainer = ShadowUtil - .getAttributesContainer(resourceShadow); + ResourceAttributeContainer attributesContainer = ShadowUtil.getAttributesContainer(resourceShadow); PrismProperty identifier = attributesContainer.getPrimaryIdentifier(); Collection> idValues = identifier.getValues(); diff --git a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/TestConnectorDiscovery.java b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/TestConnectorDiscovery.java index eb2c5679b0e..870bde5b53c 100644 --- a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/TestConnectorDiscovery.java +++ b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/TestConnectorDiscovery.java @@ -22,6 +22,7 @@ import java.util.List; +import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.ContextConfiguration; @@ -133,13 +134,12 @@ public void testSearchConnectorAnd() throws SchemaException{ TestUtil.displayTestTile("testSearchConnectorAnd"); OperationResult result = new OperationResult(TestConnectorDiscovery.class.getName() + ".testSearchConnector"); - - Document doc = DOMUtil.getDocument(); - AndFilter filter = AndFilter.createAnd( - EqualFilter.createEqual(SchemaConstants.C_CONNECTOR_FRAMEWORK, ConnectorType.class, prismContext, null, ConnectorFactoryIcfImpl.ICF_FRAMEWORK_URI), - EqualFilter.createEqual(SchemaConstants.C_CONNECTOR_CONNECTOR_TYPE, ConnectorType.class, prismContext, null, LDAP_CONNECTOR_TYPE)); - ObjectQuery query = ObjectQuery.createObjectQuery(filter); - + + ObjectQuery query = QueryBuilder.queryFor(ConnectorType.class, prismContext) + .item(SchemaConstants.C_CONNECTOR_FRAMEWORK).eq(ConnectorFactoryIcfImpl.ICF_FRAMEWORK_URI) + .and().item(SchemaConstants.C_CONNECTOR_CONNECTOR_TYPE).eq(LDAP_CONNECTOR_TYPE) + .build(); + System.out.println("Query:\n"+query.debugDump()); List> connectors = repositoryService.searchObjects(ConnectorType.class, query, null, result); diff --git a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/TestDummy.java b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/TestDummy.java index 7a93b4e8b63..d5c1bb24f66 100644 --- a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/TestDummy.java +++ b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/TestDummy.java @@ -2849,23 +2849,18 @@ public boolean handle(PrismObject object, OperationResult parentResu } private ObjectQuery createOnOffQuery() throws SchemaException { - ObjectQuery query = ObjectQueryUtil.createResourceAndObjectClassQuery(RESOURCE_DUMMY_OID, new QName(ResourceTypeUtil.getResourceNamespace(resourceType), - ConnectorFactoryIcfImpl.ACCOUNT_OBJECT_CLASS_LOCAL_NAME), prismContext); - ResourceSchema resourceSchema = RefinedResourceSchema.getResourceSchema(resource, prismContext); ObjectClassComplexTypeDefinition objectClassDef = resourceSchema.findObjectClassDefinition(SchemaTestConstants.ACCOUNT_OBJECT_CLASS_LOCAL_NAME); - ResourceAttributeDefinition attrDef = objectClassDef.findAttributeDefinition( dummyResourceCtl.getAttributeQName(DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_SHIP_NAME)); - ObjectFilter attrFilter = QueryBuilder.queryFor(ShadowType.class, prismContext) - .itemWithDef(attrDef, ShadowType.F_ATTRIBUTES, attrDef.getName()).eq("Sea Monkey") - .buildFilter(); - ObjectFilter deadFilter = EqualFilter.createEqual(ShadowType.F_DEAD, ShadowType.class, prismContext, Boolean.TRUE); - - ObjectFilter filter = AndFilter.createAnd(query.getFilter(), attrFilter, deadFilter); - query.setFilter(filter); - display("Query", query); + ObjectQuery query = QueryBuilder.queryFor(ShadowType.class, prismContext) + .item(ShadowType.F_RESOURCE_REF).ref(RESOURCE_DUMMY_OID) + .and().item(ShadowType.F_OBJECT_CLASS).eq(new QName(ResourceTypeUtil.getResourceNamespace(resourceType), ConnectorFactoryIcfImpl.ACCOUNT_OBJECT_CLASS_LOCAL_NAME)) + .and().itemWithDef(attrDef, ShadowType.F_ATTRIBUTES, attrDef.getName()).eq("Sea Monkey") + .and().item(ShadowType.F_DEAD).eq(true) + .build(); + display("Query", query); return query; } diff --git a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/ConcurrencyTest.java b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/ConcurrencyTest.java index 9332ddde8eb..5ec8b96c6ee 100644 --- a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/ConcurrencyTest.java +++ b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/ConcurrencyTest.java @@ -36,6 +36,7 @@ import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.prism.query.EqualFilter; import com.evolveum.midpoint.prism.query.ObjectQuery; +import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import com.evolveum.midpoint.repo.sql.testing.SqlRepoTestUtil; import com.evolveum.midpoint.schema.ResultHandler; import com.evolveum.midpoint.schema.result.OperationResult; @@ -459,8 +460,8 @@ public void concurrency010_SearchIterative() throws Exception { String oid = repositoryService.addObject(user, null, result); repositoryService.searchObjectsIterative(UserType.class, - ObjectQuery.createObjectQuery( - EqualFilter.createEqual(UserType.F_NAME, UserType.class, prismContext, PolyStringOrigMatchingRule.NAME, new PolyString(name))), + QueryBuilder.queryFor(UserType.class, prismContext) + .item(UserType.F_NAME).eqPoly(name).matchingOrig().build(), new ResultHandler() { @Override public boolean handle(PrismObject object, OperationResult parentResult) { diff --git a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/EncodingTest.java b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/EncodingTest.java index 34da3a81785..258e835e472 100644 --- a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/EncodingTest.java +++ b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/EncodingTest.java @@ -24,6 +24,7 @@ import com.evolveum.midpoint.prism.query.EqualFilter; import com.evolveum.midpoint.prism.query.ObjectFilter; import com.evolveum.midpoint.prism.query.ObjectQuery; +import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.result.OperationResultStatus; import com.evolveum.midpoint.util.DebugUtil; @@ -559,10 +560,9 @@ private void repositorySelfTestUser(OperationResult testResult) throws SchemaExc OperationResult subresult1 = result.createSubresult(result.getOperation() + ".searchObjects.fullName"); try { - ObjectQuery query = new ObjectQuery(); - ObjectFilter filter = EqualFilter.createEqual(UserType.F_FULL_NAME, UserType.class, prismContext, - PolyStringNormMatchingRule.NAME, toPolyString(USER_FULL_NAME)); - query.setFilter(filter); + ObjectQuery query = QueryBuilder.queryFor(UserType.class, prismContext) + .item(UserType.F_FULL_NAME).eq(toPolyString(USER_FULL_NAME)).matchingNorm() + .build(); subresult1.addParam("query", query); List> foundObjects = repositoryService.searchObjects(UserType.class, query, null, subresult1); if (LOGGER.isTraceEnabled()) { diff --git a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/OrgStructTest.java b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/OrgStructTest.java index d2b4205cc38..f2bbd952fe2 100644 --- a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/OrgStructTest.java +++ b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/OrgStructTest.java @@ -620,11 +620,9 @@ public void test100ParentOrgRefFilterNullRelation() throws Exception { TestUtil.displayTestTile(TEST_NAME); OperationResult opResult = new OperationResult(TEST_NAME); - ObjectQuery query = new ObjectQuery(); - PrismReferenceValue refVal = new PrismReferenceValue(ORG_F001_OID); - ObjectFilter filter = RefFilter.createReferenceEqual(new ItemPath(ObjectType.F_PARENT_ORG_REF), - UserType.class, prismContext, refVal); - query.setFilter(filter); + ObjectQuery query = QueryBuilder.queryFor(ObjectType.class, prismContext) + .item(ObjectType.F_PARENT_ORG_REF).ref(new PrismReferenceValue(ORG_F001_OID)) + .build(); // WHEN List> orgs = repositoryService.searchObjects(ObjectType.class, query, null, opResult); @@ -639,12 +637,11 @@ public void test101ParentOrgRefFilterManagerRelation() throws Exception { TestUtil.displayTestTile(TEST_NAME); OperationResult opResult = new OperationResult(TEST_NAME); - ObjectQuery query = new ObjectQuery(); PrismReferenceValue refVal = new PrismReferenceValue(ORG_F001_OID); refVal.setRelation(SchemaConstants.ORG_MANAGER); - ObjectFilter filter = RefFilter.createReferenceEqual(new ItemPath(ObjectType.F_PARENT_ORG_REF), - UserType.class, prismContext, refVal); - query.setFilter(filter); + ObjectQuery query = QueryBuilder.queryFor(ObjectType.class, prismContext) + .item(ObjectType.F_PARENT_ORG_REF).ref(refVal) + .build(); // WHEN List> orgs = repositoryService.searchObjects(ObjectType.class, query, null, opResult); @@ -659,12 +656,11 @@ public void test102ParentOrgRefFilterAnyRelation() throws Exception { TestUtil.displayTestTile(TEST_NAME); OperationResult opResult = new OperationResult(TEST_NAME); - ObjectQuery query = new ObjectQuery(); PrismReferenceValue refVal = new PrismReferenceValue(ORG_F001_OID); refVal.setRelation(PrismConstants.Q_ANY); - ObjectFilter filter = RefFilter.createReferenceEqual(new ItemPath(ObjectType.F_PARENT_ORG_REF), - UserType.class, prismContext, refVal); - query.setFilter(filter); + ObjectQuery query = QueryBuilder.queryFor(ObjectType.class, prismContext) + .item(ObjectType.F_PARENT_ORG_REF).ref(refVal) + .build(); // WHEN List> orgs = repositoryService.searchObjects(ObjectType.class, query, null, opResult); diff --git a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/QueryInterpreter2Test.java b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/QueryInterpreter2Test.java index 6e79e0e9673..49bbf509fe4 100644 --- a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/QueryInterpreter2Test.java +++ b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/QueryInterpreter2Test.java @@ -190,10 +190,6 @@ public void test002QueryNameOrig() throws Exception { /* * ### user: Equal (name, "asdf", PolyStringOrig) */ - ObjectFilter filter = EqualFilter.createEqual(F_NAME, UserType.class, prismContext, - PolyStringOrigMatchingRule.NAME, new PolyString("asdf", "asdf")); - ObjectQuery query0 = ObjectQuery.createObjectQuery(filter); - ObjectQuery query = QueryBuilder.queryFor(UserType.class, prismContext) .item(F_NAME).eqPoly("asdf", "asdf").matchingOrig().build(); @@ -219,10 +215,6 @@ public void test003QueryNameStrict() throws Exception { /* * ### user: Equal (name, "asdf", PolyStringOrig) */ - ObjectFilter filter = EqualFilter.createEqual(F_NAME, UserType.class, prismContext, - null, new PolyString("asdf", "asdf")); - ObjectQuery query0 = ObjectQuery.createObjectQuery(filter); - ObjectQuery query = QueryBuilder.queryFor(UserType.class, prismContext) .item(F_NAME).eqPoly("asdf", "asdf").build(); @@ -276,10 +268,6 @@ public void test011QueryOrganizationOrig() throws Exception { /* * ### user: Equal (organization, "asdf", PolyStringOrig) */ - ObjectFilter filter = EqualFilter.createEqual(UserType.F_ORGANIZATION, UserType.class, prismContext, - PolyStringOrigMatchingRule.NAME, new PolyString("asdf", "asdf")); - ObjectQuery query0 = ObjectQuery.createObjectQuery(filter); - ObjectQuery query = QueryBuilder.queryFor(UserType.class, prismContext) .item(UserType.F_ORGANIZATION).eqPoly("asdf", "asdf").matchingOrig().build(); @@ -305,11 +293,6 @@ public void test012QueryOrganizationStrict() throws Exception { /* * ### user: Equal (organization, "asdf") */ - - ObjectFilter filter = EqualFilter.createEqual(UserType.F_ORGANIZATION, UserType.class, prismContext, - null, new PolyString("asdf", "asdf")); - ObjectQuery query0 = ObjectQuery.createObjectQuery(filter); - ObjectQuery query = QueryBuilder.queryFor(UserType.class, prismContext) .item(UserType.F_ORGANIZATION).eqPoly("asdf", "asdf").matchingStrict().build(); @@ -336,12 +319,6 @@ public void test020QueryTwoOrganizationsNormAnd() throws Exception { * UserType: And (Equal (organization, 'asdf', PolyStringNorm), * Equal (organization, 'ghjk', PolyStringNorm)) */ - ObjectFilter filter = AndFilter.createAnd( - EqualFilter.createEqual(UserType.F_ORGANIZATION, UserType.class, prismContext, PolyStringNormMatchingRule.NAME, new PolyString("asdf", "asdf")), - EqualFilter.createEqual(UserType.F_ORGANIZATION, UserType.class, prismContext, PolyStringNormMatchingRule.NAME, new PolyString("ghjk", "ghjk"))); - - ObjectQuery query0 = ObjectQuery.createObjectQuery(filter); - ObjectQuery query = QueryBuilder.queryFor(UserType.class, prismContext) .item(UserType.F_ORGANIZATION).eqPoly("asdf", "asdf").matchingNorm() .and().item(UserType.F_ORGANIZATION).eqPoly("ghjk", "ghjk").matchingNorm() @@ -371,12 +348,6 @@ public void test021QueryTwoOrganizationsStrictOr() throws Exception { * UserType: Or (Equal (organization, 'asdf'), * Equal (organization, 'ghjk')) */ - ObjectFilter filter = OrFilter.createOr( - EqualFilter.createEqual(UserType.F_ORGANIZATION, UserType.class, prismContext, null, new PolyString("asdf", "asdf")), - EqualFilter.createEqual(UserType.F_ORGANIZATION, UserType.class, prismContext, null, new PolyString("ghjk", "ghjk"))); - - ObjectQuery query0 = ObjectQuery.createObjectQuery(filter); - ObjectQuery query = QueryBuilder.queryFor(UserType.class, prismContext) .item(UserType.F_ORGANIZATION).eqPoly("asdf", "asdf") .or().item(UserType.F_ORGANIZATION).eqPoly("ghjk", "ghjk") @@ -409,10 +380,9 @@ public void test025QueryOrganizationOrigPolymorphic() throws Exception { /* * ### object: Equal (organization, "asdf", PolyStringOrig) */ - ObjectFilter filter = EqualFilter.createEqual(UserType.F_ORGANIZATION, UserType.class, prismContext, - PolyStringOrigMatchingRule.NAME, new PolyString("asdf", "asdf")); - ObjectQuery query = ObjectQuery.createObjectQuery(filter); - + ObjectQuery query = QueryBuilder.queryFor(UserType.class, prismContext) + .item(UserType.F_ORGANIZATION).eqPoly("asdf", "asdf").matchingOrig() + .build(); String expected = "select\n" + " o.fullObject, o.stringsCount, o.longsCount, o.datesCount, o.referencesCount, o.polysCount, o.booleansCount\n" + "from\n" + @@ -436,8 +406,9 @@ public void test030QueryTaskDependent() throws Exception { /* * ### task: Equal (dependent, "123456") */ - ObjectFilter filter = EqualFilter.createEqual(TaskType.F_DEPENDENT, TaskType.class, prismContext, null, "123456"); - ObjectQuery query = ObjectQuery.createObjectQuery(filter); + ObjectQuery query = QueryBuilder.queryFor(TaskType.class, prismContext) + .item(TaskType.F_DEPENDENT).eq("123456") + .build(); String expected = "select\n" + " t.fullObject, t.stringsCount, t.longsCount, t.datesCount, t.referencesCount, t.polysCount, t.booleansCount\n" + @@ -459,9 +430,6 @@ public void test040QueryClob() throws Exception { Session session = open(); try { - ObjectFilter filter = EqualFilter.createEqual(UserType.F_DESCRIPTION, UserType.class, prismContext, null, "aaa"); - ObjectQuery query0 = ObjectQuery.createObjectQuery(filter); - ObjectQuery query = QueryBuilder.queryFor(UserType.class, prismContext) .item(UserType.F_DESCRIPTION).eq("aaa") .build(); @@ -480,9 +448,9 @@ public void test050QueryEnum() throws Exception { /* * ### task: Equal (executionStatus, WAITING) */ - ObjectFilter filter = EqualFilter.createEqual(TaskType.F_EXECUTION_STATUS, TaskType.class, prismContext, - null, TaskExecutionStatusType.WAITING); - ObjectQuery query = ObjectQuery.createObjectQuery(filter); + ObjectQuery query = QueryBuilder.queryFor(TaskType.class, prismContext) + .item(TaskType.F_EXECUTION_STATUS).eq(TaskExecutionStatusType.WAITING) + .build(); String real = getInterpretedQuery2(session, TaskType.class, query); String expected = "select\n" + @@ -874,10 +842,10 @@ public void test100QueryObjectByName() throws Exception { * ==> from RObject o where name.orig = 'cpt. Jack Sparrow' and name.norm = 'cpt jack sparrow' * order by name.orig asc */ - EqualFilter filter = EqualFilter.createEqual(F_NAME, ObjectType.class, prismContext, - null, new PolyString("cpt. Jack Sparrow", "cpt jack sparrow")); - ObjectQuery query = ObjectQuery.createObjectQuery(filter); - query.setPaging(ObjectPaging.createPaging(null, null, F_NAME, ASCENDING)); + ObjectQuery query = QueryBuilder.queryFor(ObjectType.class, prismContext) + .item(F_NAME).eqPoly("cpt. Jack Sparrow", "cpt jack sparrow") + .asc(F_NAME) + .build(); String real = getInterpretedQuery2(session, ObjectType.class, query); String expected = "select\n" + @@ -1072,12 +1040,9 @@ public void test140QueryUserAccountRef() throws Exception { * ==> select from RUser u left join u.linkRef l where * l.targetOid = '123' and l.relation = '#' */ - RefFilter filter = RefFilter.createReferenceEqual(UserType.F_LINK_REF, UserType.class, prismContext, "123"); - ObjectQuery query = ObjectQuery.createObjectQuery(filter); - -// ObjectQuery query = QueryBuilder.queryFor(UserType.class, prismContext) -// .item(UserType.F_LINK_REF).ref("123") -// .build(); + ObjectQuery query = QueryBuilder.queryFor(UserType.class, prismContext) + .item(UserType.F_LINK_REF).ref("123") + .build(); String real = getInterpretedQuery2(session, UserType.class, query); @@ -1119,10 +1084,10 @@ public void test150QueryUserAssignmentTargetRef() throws Exception { ObjectReferenceType ort = new ObjectReferenceType(); ort.setOid("123"); ort.setType(RoleType.COMPLEX_TYPE); - RefFilter filter = RefFilter.createReferenceEqual( - new ItemPath(F_ASSIGNMENT, AssignmentType.F_TARGET_REF), - UserType.class, prismContext, ort.asReferenceValue()); - String real = getInterpretedQuery2(session, UserType.class, ObjectQuery.createObjectQuery(filter)); + ObjectQuery query = QueryBuilder.queryFor(UserType.class, prismContext) + .item(F_ASSIGNMENT, AssignmentType.F_TARGET_REF).ref(ort.asReferenceValue()) + .build(); + String real = getInterpretedQuery2(session, UserType.class, query); String expected = "select\n" + " u.fullObject,\n" + " u.stringsCount,\n" + @@ -1248,7 +1213,7 @@ public void test180QueryInducementActivationAdministrativeStatus() throws Except * a.assignmentOwner = RAssignmentOwner.ABSTRACT_ROLE and <--- this differentiates inducements from assignments * a.activation.administrativeStatus = RActivationStatus.ENABLED */ - ObjectQuery query = QueryBuilder.queryFor(UserType.class, prismContext) + ObjectQuery query = QueryBuilder.queryFor(RoleType.class, prismContext) .item(RoleType.F_INDUCEMENT, AssignmentType.F_ACTIVATION, ActivationType.F_ADMINISTRATIVE_STATUS).eq(ActivationStatusType.ENABLED) .build(); @@ -1328,7 +1293,7 @@ public void test190QueryUserByActivationDouble() throws Exception { */ ObjectQuery query = QueryBuilder.queryFor(UserType.class, prismContext) .item(AssignmentType.F_ACTIVATION, ActivationType.F_ADMINISTRATIVE_STATUS).eq(ActivationStatusType.ENABLED) - .or().item(AssignmentType.F_ACTIVATION, ActivationType.F_VALID_FROM).eq(XmlTypeConverter.createXMLGregorianCalendar(NOW.getTime())) + .and().item(AssignmentType.F_ACTIVATION, ActivationType.F_VALID_FROM).eq(XmlTypeConverter.createXMLGregorianCalendar(NOW.getTime())) .build(); String real = getInterpretedQuery2(session, UserType.class, query); @@ -1391,12 +1356,6 @@ public void test300CountObjectOrderByName() throws Exception { Session session = open(); try { - EqualFilter filter = EqualFilter.createEqual(F_NAME, UserType.class, prismContext, - null, new PolyString("cpt. Jack Sparrow", "cpt jack sparrow")); - - ObjectQuery query0 = ObjectQuery.createObjectQuery(filter, - ObjectPaging.createPaging(F_NAME, ASCENDING)); - ObjectQuery query = QueryBuilder.queryFor(UserType.class, prismContext) .item(F_NAME).eqPoly("cpt. Jack Sparrow", "cpt jack sparrow") .asc(F_NAME).build(); @@ -1446,11 +1405,10 @@ public void test320CountTaskOrderByName() throws Exception { Session session = open(); try { - EqualFilter filter = EqualFilter.createEqual(TaskType.F_PARENT, TaskType.class, prismContext, null); - - ObjectQuery query = ObjectQuery.createObjectQuery(filter); - query.setPaging(ObjectPaging.createPaging(null, null, F_NAME, ASCENDING)); - + ObjectQuery query = QueryBuilder.queryFor(TaskType.class, prismContext) + .item(TaskType.F_PARENT).isNull() + .asc(F_NAME) + .build(); String real = getInterpretedQuery2(session, TaskType.class, query, true); String expected = "select\n" + " count(*)\n" + @@ -2049,14 +2007,11 @@ public void test510QueryNameAndOrg() throws Exception { Session session = open(); try { - EqualFilter eqFilter = EqualFilter.createEqual(F_NAME, ObjectType.class, prismContext, - null, new PolyString("cpt. Jack Sparrow", "cpt jack sparrow")); - - OrgFilter orgFilter = OrgFilter.createOrg("12341234-1234-1234-1234-123412341234"); - - ObjectQuery query = ObjectQuery.createObjectQuery(AndFilter.createAnd(eqFilter, orgFilter)); - query.setPaging(ObjectPaging.createPaging(null, null, F_NAME, ASCENDING)); - + ObjectQuery query = QueryBuilder.queryFor(UserType.class, prismContext) + .item(F_NAME).eqPoly("cpt. Jack Sparrow", "cpt jack sparrow") + .and().isChildOf("12341234-1234-1234-1234-123412341234") + .asc(F_NAME) + .build(); String real = getInterpretedQuery2(session, UserType.class, query); String expected = "select\n" + @@ -2244,11 +2199,15 @@ public void test560queryMetadataTimestamp() throws Exception { public void test570queryObjectypeByTypeUserAndLocality() throws Exception { Session session = open(); try { - EqualFilter eq = EqualFilter.createEqual(new ItemPath(UserType.F_LOCALITY), UserType.class, prismContext, - new PolyString("Caribbean", "caribbean")); - TypeFilter type = TypeFilter.createType(UserType.COMPLEX_TYPE, eq); + ObjectQuery query = QueryBuilder.queryFor(ObjectType.class, prismContext) + .type(UserType.class) + .item(UserType.F_LOCALITY).eqPoly("Caribbean", "caribbean") + .build(); +// EqualFilter eq = EqualFilter.createEqual(new ItemPath(UserType.F_LOCALITY), UserType.class, prismContext, +// new PolyString("Caribbean", "caribbean")); +// TypeFilter type = TypeFilter.createType(UserType.COMPLEX_TYPE, eq); - String real = getInterpretedQuery2(session, ObjectType.class, ObjectQuery.createObjectQuery(type)); + String real = getInterpretedQuery2(session, ObjectType.class, query); String expected = "select\n" + " o.fullObject,\n" + " o.stringsCount,\n" + @@ -2309,11 +2268,12 @@ private void checkQueryTypeAlias(String query, String table, String... propertie public void test575QueryObjectypeByTypeOrgAndLocality() throws Exception { Session session = open(); try { - EqualFilter eq = EqualFilter.createEqual(new ItemPath(OrgType.F_LOCALITY), OrgType.class, prismContext, - new PolyString("Caribbean", "caribbean")); - TypeFilter type = TypeFilter.createType(OrgType.COMPLEX_TYPE, eq); + ObjectQuery query = QueryBuilder.queryFor(ObjectType.class, prismContext) + .type(OrgType.class) + .item(OrgType.F_LOCALITY).eqPoly("Caribbean", "caribbean") + .build(); - String real = getInterpretedQuery2(session, ObjectType.class, ObjectQuery.createObjectQuery(type)); + String real = getInterpretedQuery2(session, ObjectType.class, query); String expected = "select\n" + " o.fullObject,\n" + " o.stringsCount,\n" + @@ -2343,12 +2303,17 @@ public void test575QueryObjectypeByTypeOrgAndLocality() throws Exception { public void test580QueryObjectypeByTypeAndExtensionAttribute() throws Exception { Session session = open(); try { - EqualFilter eq = EqualFilter.createEqual( - new ItemPath(ObjectType.F_EXTENSION, new QName("http://example.com/p", "weapon")), - UserType.class, prismContext, "some weapon name"); - TypeFilter type = TypeFilter.createType(UserType.COMPLEX_TYPE, eq); + ObjectQuery query = QueryBuilder.queryFor(ObjectType.class, prismContext) + .type(UserType.class) + .item(UserType.F_EXTENSION, new QName("http://example.com/p", "weapon")).eq("some weapon name") + .build(); - RQueryImpl realQuery = (RQueryImpl) getInterpretedQuery2Whole(session, ObjectType.class, ObjectQuery.createObjectQuery(type), false); +// EqualFilter eq = EqualFilter.createEqual( +// new ItemPath(ObjectType.F_EXTENSION, new QName("http://example.com/p", "weapon")), +// UserType.class, prismContext, "some weapon name"); +// TypeFilter type = TypeFilter.createType(UserType.COMPLEX_TYPE, eq); + + RQueryImpl realQuery = (RQueryImpl) getInterpretedQuery2Whole(session, ObjectType.class, query, false); String expected = "select\n" + " o.fullObject,\n" + " o.stringsCount,\n" + @@ -2377,10 +2342,12 @@ public void test580QueryObjectypeByTypeAndExtensionAttribute() throws Exception public void test590QueryObjectypeByTypeAndReference() throws Exception { Session session = open(); try { - RefFilter ref = RefFilter.createReferenceEqual(UserType.F_LINK_REF, UserType.class, prismContext, "123"); - TypeFilter type = TypeFilter.createType(UserType.COMPLEX_TYPE, ref); + ObjectQuery query = QueryBuilder.queryFor(ObjectType.class, prismContext) + .type(UserType.class) + .item(UserType.F_LINK_REF).ref("123") + .build(); - String real = getInterpretedQuery2(session, ObjectType.class, ObjectQuery.createObjectQuery(type)); + String real = getInterpretedQuery2(session, ObjectType.class, query); String expected = "select\n" + " o.fullObject,\n" + " o.stringsCount,\n" + @@ -2411,20 +2378,19 @@ public void test590QueryObjectypeByTypeAndReference() throws Exception { public void test600QueryObjectypeByTypeComplex() throws Exception { Session session = open(); try { - EqualFilter eq1 = EqualFilter.createEqual(UserType.F_LOCALITY, UserType.class, prismContext, - new PolyString("Caribbean", "caribbean")); - EqualFilter eq2 = EqualFilter.createEqual(UserType.F_LOCALITY, UserType.class, prismContext, - new PolyString("Adriatic", "adriatic")); - TypeFilter type1 = TypeFilter.createType(UserType.COMPLEX_TYPE, OrFilter.createOr(eq1, eq2)); - - EqualFilter equal = EqualFilter.createEqual(OrgType.F_ORG_TYPE, OrgType.class, prismContext, "functional"); - TypeFilter type2 = TypeFilter.createType(OrgType.COMPLEX_TYPE, equal); - - TypeFilter type3 = TypeFilter.createType(ReportType.COMPLEX_TYPE, null); - - OrFilter or = OrFilter.createOr(type1, type2, type3); - - String real = getInterpretedQuery2(session, ObjectType.class, ObjectQuery.createObjectQuery(or)); + ObjectQuery query = QueryBuilder.queryFor(ObjectType.class, prismContext) + .type(UserType.class) + .block() + .item(UserType.F_LOCALITY).eqPoly("Caribbean", "caribbean") + .or().item(UserType.F_LOCALITY).eqPoly("Adriatic", "adriatic") + .endBlock() + .or().type(OrgType.class) + .block() + .item(OrgType.F_ORG_TYPE).eq("functional") + .endBlock() + .or().type(ReportType.class) + .build(); + String real = getInterpretedQuery2(session, ObjectType.class, query); String expected = "select\n" + " o.fullObject,\n" + " o.stringsCount,\n" + @@ -2569,11 +2535,10 @@ public void test606QueryObjectypeByTypeAndOwnerRefOverloaded() throws Exception public void test610QueryGenericClob() throws Exception { Session session = open(); try { - EqualFilter eq = EqualFilter.createEqual( - new ItemPath(ObjectType.F_EXTENSION, new QName("http://example.com/p", "locations")), - GenericObjectType.class, prismContext, null); - - getInterpretedQuery2(session, GenericObjectType.class, ObjectQuery.createObjectQuery(eq)); + ObjectQuery query = QueryBuilder.queryFor(GenericObjectType.class, prismContext) + .item(ObjectType.F_EXTENSION, new QName("http://example.com/p", "locations")).isNull() + .build(); + getInterpretedQuery2(session, GenericObjectType.class, query); } catch (QueryException ex) { LOGGER.info("Exception", ex); throw ex; @@ -2586,11 +2551,10 @@ public void test610QueryGenericClob() throws Exception { public void test620QueryGenericString() throws Exception { Session session = open(); try { - EqualFilter eq = EqualFilter.createEqual( - new ItemPath(ObjectType.F_EXTENSION, new QName("http://example.com/p", "stringType")), - GenericObjectType.class, prismContext, "asdf"); - - String real = getInterpretedQuery2(session, GenericObjectType.class, ObjectQuery.createObjectQuery(eq)); + ObjectQuery query = QueryBuilder.queryFor(GenericObjectType.class, prismContext) + .item(ObjectType.F_EXTENSION, new QName("http://example.com/p", "stringType")).eq("asdf") + .build(); + String real = getInterpretedQuery2(session, GenericObjectType.class, query); String expected = "select\n" + " g.fullObject,\n" + " g.stringsCount,\n" + @@ -2657,11 +2621,9 @@ public void test620QueryGenericString() throws Exception { public void test630QueryGenericBoolean() throws Exception { Session session = open(); try { - EqualFilter eq = EqualFilter.createEqual( - new ItemPath(ObjectType.F_EXTENSION, SKIP_AUTOGENERATION), - GenericObjectType.class, prismContext, true); - - ObjectQuery objectQuery = ObjectQuery.createObjectQuery(eq); + ObjectQuery objectQuery = QueryBuilder.queryFor(GenericObjectType.class, prismContext) + .item(ObjectType.F_EXTENSION, SKIP_AUTOGENERATION).eq(true) + .build(); objectQuery.setUseNewQueryInterpreter(true); RQueryImpl realQuery = (RQueryImpl) getInterpretedQuery2Whole(session, GenericObjectType.class, objectQuery, false); @@ -2797,12 +2759,10 @@ public void test710QueryCertCaseOwner() throws Exception { public void test720QueryCertCaseOwnerAndTarget() throws Exception { Session session = open(); try { - PrismContainerDefinition caseDef = - prismContext.getSchemaRegistry().findContainerDefinitionByCompileTimeClass(AccessCertificationCaseType.class); - AndFilter filter = AndFilter.createAnd( - InOidFilter.createOwnerHasOidIn("123456"), - RefFilter.createReferenceEqual(new ItemPath(AccessCertificationCaseType.F_TARGET_REF), caseDef, "1234567890")); - ObjectQuery query = ObjectQuery.createObjectQuery(filter); + ObjectQuery query = QueryBuilder.queryFor(AccessCertificationCaseType.class, prismContext) + .ownerId("123456") + .and().item(AccessCertificationCaseType.F_TARGET_REF).ref("1234567890") + .build(); String real = getInterpretedQuery2(session, AccessCertificationCaseType.class, query, false); String expected = "select\n" + " a.fullObject, a.ownerOid\n" + @@ -2826,10 +2786,9 @@ public void test720QueryCertCaseOwnerAndTarget() throws Exception { public void test730QueryCertCaseReviewer() throws Exception { Session session = open(); try { - PrismContainerDefinition caseDef = - prismContext.getSchemaRegistry().findContainerDefinitionByCompileTimeClass(AccessCertificationCaseType.class); - ObjectFilter filter = RefFilter.createReferenceEqual(new ItemPath(F_CURRENT_REVIEWER_REF), caseDef, "1234567890"); - ObjectQuery query = ObjectQuery.createObjectQuery(filter); + ObjectQuery query = QueryBuilder.queryFor(AccessCertificationCaseType.class, prismContext) + .item(F_CURRENT_REVIEWER_REF).ref("1234567890") + .build(); String real = getInterpretedQuery2(session, AccessCertificationCaseType.class, query, false); String expected = "select\n" + " a.fullObject, a.ownerOid\n" + @@ -3083,7 +3042,7 @@ public void test752DereferenceLinkedResourceName() throws Exception { } } - @Test(expectedExceptions = IllegalStateException.class) // at this time + @Test(expectedExceptions = IllegalArgumentException.class) // at this time public void test760DereferenceAssignedRoleType() throws Exception { Session session = open(); @@ -3096,10 +3055,14 @@ public void test760DereferenceAssignedRoleType() throws Exception { * ### UserType: assignment/targetRef/@/roleType */ - ObjectFilter filter = EqualFilter.createEqual( - new ItemPath(F_ASSIGNMENT, AssignmentType.F_TARGET_REF, PrismConstants.T_OBJECT_REFERENCE, RoleType.F_ROLE_TYPE), - UserType.class, prismContext, "type1"); - ObjectQuery query = ObjectQuery.createObjectQuery(filter); + ObjectQuery query = QueryBuilder.queryFor(UserType.class, prismContext) + .item(F_ASSIGNMENT, AssignmentType.F_TARGET_REF, PrismConstants.T_OBJECT_REFERENCE, RoleType.F_ROLE_TYPE).eq("type1") + .build(); +// +// ObjectFilter filter = EqualFilter.createEqual( +// new ItemPath(), +// UserType.class, prismContext, "type1"); +// ObjectQuery query = ObjectQuery.createObjectQuery(filter); String real = getInterpretedQuery2(session, UserType.class, query); @@ -3117,11 +3080,9 @@ public void test770CaseParentFilter() throws Exception { * ### AccessCertificationCaseType: Equal(../name, 'Campaign 1') */ - ObjectFilter filter = EqualFilter.createEqual( - new ItemPath(T_PARENT, F_NAME), - AccessCertificationCaseType.class, prismContext, "Campaign 1"); - ObjectQuery query = ObjectQuery.createObjectQuery(filter); - + ObjectQuery query = QueryBuilder.queryFor(AccessCertificationCaseType.class, prismContext) + .item(T_PARENT, F_NAME).eq("Campaign 1") + .build(); String real = getInterpretedQuery2(session, AccessCertificationCaseType.class, query); String expected = "select\n" + " a.fullObject, a.ownerOid\n" + @@ -3245,8 +3206,9 @@ public void test900EqualsMultivalue() throws Exception { multivalProperty.addRealValue("SK"); multivalProperty.addRealValue("HU"); - ObjectQuery query = ObjectQuery.createObjectQuery( - EqualFilter.createEqual(new ItemPath(UserType.F_PREFERRED_LANGUAGE), multivalProperty)); + ObjectQuery query = QueryBuilder.queryFor(UserType.class, prismContext) + .item(UserType.F_PREFERRED_LANGUAGE).eq(multivalProperty) + .build(); String real = getInterpretedQuery2(session, UserType.class, query); // assertEqualsIgnoreWhitespace(expected, real); @@ -3264,7 +3226,7 @@ public void test910PreferredLanguageEqualsCostCenter() throws Exception { * ### User: preferredLanguage = costCenter */ ObjectQuery query = QueryBuilder.queryFor(UserType.class, prismContext) - .item(UserType.F_PREFERRED_LANGUAGE).eq(UserType.F_COST_CENTER) + .item(UserType.F_PREFERRED_LANGUAGE).eq().item(UserType.F_COST_CENTER) .build(); String real = getInterpretedQuery2(session, UserType.class, query); String expected = "select\n" + diff --git a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/SearchTest.java b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/SearchTest.java index c5d2b0a0b53..3c80c25440e 100644 --- a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/SearchTest.java +++ b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/SearchTest.java @@ -100,9 +100,9 @@ public boolean handle(PrismObject object, OperationResult parentResult) { } }; - EqualFilter filter = EqualFilter.createEqual(UserType.F_NAME, UserType.class, prismContext, - PolyStringStrictMatchingRule.NAME, new PolyString("asdf", "asdf")); - ObjectQuery query = ObjectQuery.createObjectQuery(filter); + ObjectQuery query = QueryBuilder.queryFor(UserType.class, prismContext) + .item(UserType.F_NAME).eqPoly("asdf", "asdf").matchingStrict() + .build(); repositoryService.searchObjectsIterative(UserType.class, query, handler, null, false, result); result.recomputeStatus(); @@ -180,9 +180,9 @@ public void caseSensitiveSearchTest() throws Exception { final String nonExistingNameOrig = "test UserX00003"; final String nameNorm = "test userx00003"; - EqualFilter filter = EqualFilter.createEqual(UserType.F_FULL_NAME, UserType.class, prismContext, - PolyStringOrigMatchingRule.NAME, new PolyString(existingNameOrig, nameNorm)); - ObjectQuery query = ObjectQuery.createObjectQuery(filter); + ObjectQuery query = QueryBuilder.queryFor(UserType.class, prismContext) + .item(UserType.F_FULL_NAME).eqPoly(existingNameOrig, nameNorm).matchingOrig() + .build(); OperationResult result = new OperationResult("search"); List> users = repositoryService.searchObjects(UserType.class, query, null, result); @@ -190,9 +190,9 @@ public void caseSensitiveSearchTest() throws Exception { assertTrue(result.isSuccess()); assertEquals("Should find one user", 1, users.size()); - filter = EqualFilter.createEqual(UserType.F_FULL_NAME, UserType.class, prismContext, - PolyStringOrigMatchingRule.NAME, new PolyString(nonExistingNameOrig, nameNorm)); - query = ObjectQuery.createObjectQuery(filter); + query = QueryBuilder.queryFor(UserType.class, prismContext) + .item(UserType.F_FULL_NAME).eqPoly(nonExistingNameOrig, nameNorm).matchingOrig() + .build(); users = repositoryService.searchObjects(UserType.class, query, null, result); result.recomputeStatus(); @@ -203,9 +203,9 @@ public void caseSensitiveSearchTest() throws Exception { @Test public void roleMembershipSearchTest() throws Exception { PrismReferenceValue r456 = new PrismReferenceValue("r456", RoleType.COMPLEX_TYPE); - RefFilter filter = RefFilter.createReferenceEqual(new ItemPath(UserType.F_ROLE_MEMBERSHIP_REF), UserType.class, prismContext, r456); - ObjectQuery query = ObjectQuery.createObjectQuery(filter); - + ObjectQuery query = QueryBuilder.queryFor(UserType.class, prismContext) + .item(UserType.F_ROLE_MEMBERSHIP_REF).ref(r456) + .build(); OperationResult result = new OperationResult("search"); List> users = repositoryService.searchObjects(UserType.class, query, null, result); result.recomputeStatus(); @@ -214,9 +214,9 @@ public void roleMembershipSearchTest() throws Exception { assertEquals("Wrong user name", "atestuserX00003", users.get(0).getName().getOrig()); PrismReferenceValue r123 = new PrismReferenceValue("r123", RoleType.COMPLEX_TYPE); - filter = RefFilter.createReferenceEqual(new ItemPath(UserType.F_ROLE_MEMBERSHIP_REF), UserType.class, prismContext, r123); - query = ObjectQuery.createObjectQuery(filter); - + query = QueryBuilder.queryFor(UserType.class, prismContext) + .item(UserType.F_ROLE_MEMBERSHIP_REF).ref(r123) + .build(); users = repositoryService.searchObjects(UserType.class, query, null, result); result.recomputeStatus(); assertTrue(result.isSuccess()); @@ -226,8 +226,9 @@ public void roleMembershipSearchTest() throws Exception { @Test public void assignmentOrgRefSearchTest() throws Exception { PrismReferenceValue o123456 = new PrismReferenceValue("o123456", OrgType.COMPLEX_TYPE); - RefFilter filter = RefFilter.createReferenceEqual(new ItemPath(UserType.F_ASSIGNMENT, AssignmentType.F_ORG_REF), UserType.class, prismContext, o123456); - ObjectQuery query = ObjectQuery.createObjectQuery(filter); + ObjectQuery query = QueryBuilder.queryFor(UserType.class, prismContext) + .item(UserType.F_ASSIGNMENT, AssignmentType.F_ORG_REF).ref(o123456) + .build(); OperationResult result = new OperationResult("search"); List> users = repositoryService.searchObjects(UserType.class, query, null, result); @@ -237,8 +238,9 @@ public void assignmentOrgRefSearchTest() throws Exception { assertEquals("Wrong user name", "atestuserX00002", users.get(0).getName().getOrig()); PrismReferenceValue o999 = new PrismReferenceValue("o999", RoleType.COMPLEX_TYPE); - filter = RefFilter.createReferenceEqual(new ItemPath(UserType.F_ASSIGNMENT, AssignmentType.F_ORG_REF), UserType.class, prismContext, o999); - query = ObjectQuery.createObjectQuery(filter); + query = QueryBuilder.queryFor(UserType.class, prismContext) + .item(UserType.F_ASSIGNMENT, AssignmentType.F_ORG_REF).ref(o999) + .build(); users = repositoryService.searchObjects(UserType.class, query, null, result); result.recomputeStatus(); @@ -249,8 +251,9 @@ public void assignmentOrgRefSearchTest() throws Exception { @Test public void assignmentResourceRefSearchTest() throws Exception { PrismReferenceValue resourceRef = new PrismReferenceValue("10000000-0000-0000-0000-000000000004", ResourceType.COMPLEX_TYPE); - RefFilter filter = RefFilter.createReferenceEqual(new ItemPath(RoleType.F_ASSIGNMENT, AssignmentType.F_CONSTRUCTION, ConstructionType.F_RESOURCE_REF), UserType.class, prismContext, resourceRef); - ObjectQuery query = ObjectQuery.createObjectQuery(filter); + ObjectQuery query = QueryBuilder.queryFor(RoleType.class, prismContext) + .item(RoleType.F_ASSIGNMENT, AssignmentType.F_CONSTRUCTION, ConstructionType.F_RESOURCE_REF).eq(resourceRef) + .build(); OperationResult result = new OperationResult("search"); List> roles = repositoryService.searchObjects(RoleType.class, query, null, result); @@ -260,22 +263,21 @@ public void assignmentResourceRefSearchTest() throws Exception { assertEquals("Wrong role name", "Judge", roles.get(0).getName().getOrig()); PrismReferenceValue resourceRef2 = new PrismReferenceValue("FFFFFFFF-0000-0000-0000-000000000004", ResourceType.COMPLEX_TYPE); - filter = RefFilter.createReferenceEqual(new ItemPath(RoleType.F_ASSIGNMENT, AssignmentType.F_CONSTRUCTION, ConstructionType.F_RESOURCE_REF), UserType.class, prismContext, resourceRef2); - query = ObjectQuery.createObjectQuery(filter); - + query = QueryBuilder.queryFor(RoleType.class, prismContext) + .item(RoleType.F_ASSIGNMENT, AssignmentType.F_CONSTRUCTION, ConstructionType.F_RESOURCE_REF).eq(resourceRef2) + .build(); roles = repositoryService.searchObjects(RoleType.class, query, null, result); result.recomputeStatus(); assertTrue(result.isSuccess()); assertEquals("Should find zero roles", 0, roles.size()); } - @Test + + @Test public void roleAssignmentSearchTest() throws Exception { PrismReferenceValue r456 = new PrismReferenceValue("r123", RoleType.COMPLEX_TYPE); - RefFilter rFilter = RefFilter.createReferenceEqual(new ItemPath(UserType.F_ASSIGNMENT, AssignmentType.F_TARGET_REF), UserType.class, prismContext, r456); - - - ObjectQuery query = ObjectQuery.createObjectQuery(rFilter); - + ObjectQuery query = QueryBuilder.queryFor(UserType.class, prismContext) + .item(UserType.F_ASSIGNMENT, AssignmentType.F_TARGET_REF).ref(r456) + .build(); OperationResult result = new OperationResult("search"); List> users = repositoryService.searchObjects(UserType.class, query, null, result); result.recomputeStatus(); @@ -287,11 +289,10 @@ public void roleAssignmentSearchTest() throws Exception { @Test public void orgAssignmentSearchTest() throws Exception { - PrismReferenceValue org = new PrismReferenceValue("00000000-8888-6666-0000-100000000085", OrgType.COMPLEX_TYPE); - RefFilter oFilter = RefFilter.createReferenceEqual(new ItemPath(UserType.F_ASSIGNMENT, AssignmentType.F_TARGET_REF), UserType.class, prismContext, org); - ObjectQuery query = ObjectQuery.createObjectQuery(oFilter); - + ObjectQuery query = QueryBuilder.queryFor(UserType.class, prismContext) + .item(UserType.F_ASSIGNMENT, AssignmentType.F_TARGET_REF).eq(org) + .build(); OperationResult result = new OperationResult("search"); List> users = repositoryService.searchObjects(UserType.class, query, null, result); result.recomputeStatus(); @@ -304,12 +305,11 @@ public void orgAssignmentSearchTest() throws Exception { @Test(enabled = false) public void roleAndOrgAssignmentSearchTest() throws Exception { PrismReferenceValue r456 = new PrismReferenceValue("r123", RoleType.COMPLEX_TYPE); - RefFilter rFilter = RefFilter.createReferenceEqual(new ItemPath(UserType.F_ASSIGNMENT, AssignmentType.F_TARGET_REF), UserType.class, prismContext, r456); - PrismReferenceValue org = new PrismReferenceValue("00000000-8888-6666-0000-100000000085", OrgType.COMPLEX_TYPE); - RefFilter oFilter = RefFilter.createReferenceEqual(new ItemPath(UserType.F_ASSIGNMENT, AssignmentType.F_TARGET_REF), UserType.class, prismContext, org); - ObjectQuery query = ObjectQuery.createObjectQuery(AndFilter.createAnd(rFilter, oFilter)); - + ObjectQuery query = QueryBuilder.queryFor(UserType.class, prismContext) + .item(UserType.F_ASSIGNMENT, AssignmentType.F_TARGET_REF).ref(r456) + .and().item(UserType.F_ASSIGNMENT, AssignmentType.F_TARGET_REF).ref(org) + .build(); OperationResult result = new OperationResult("search"); List> users = repositoryService.searchObjects(UserType.class, query, null, result); result.recomputeStatus(); @@ -321,11 +321,9 @@ public void roleAndOrgAssignmentSearchTest() throws Exception { @Test public void notBusinessRoleTypeSearchTest() throws Exception { - - EqualFilter equalFilter = EqualFilter.createEqual(new ItemPath(RoleType.F_ROLE_TYPE), RoleType.class, prismContext, "business"); - NotFilter notFilter = NotFilter.createNot(equalFilter); - ObjectQuery query = ObjectQuery.createObjectQuery(notFilter); - + ObjectQuery query = QueryBuilder.queryFor(RoleType.class, prismContext) + .not().item(RoleType.F_ROLE_TYPE).eq("business") + .build(); OperationResult result = new OperationResult("search"); List> roles = repositoryService.searchObjects(RoleType.class, query, null, result); result.recomputeStatus(); @@ -339,10 +337,9 @@ public void notBusinessRoleTypeSearchTest() throws Exception { @Test public void businessRoleTypeSearchTest() throws Exception { - - EqualFilter equalFilter = EqualFilter.createEqual(new ItemPath(RoleType.F_ROLE_TYPE), RoleType.class, prismContext, "business"); - ObjectQuery query = ObjectQuery.createObjectQuery(equalFilter); - + ObjectQuery query = QueryBuilder.queryFor(RoleType.class, prismContext) + .item(RoleType.F_ROLE_TYPE).eq("business") + .build(); OperationResult result = new OperationResult("search"); List> roles = repositoryService.searchObjects(RoleType.class, query, null, result); result.recomputeStatus(); @@ -354,10 +351,9 @@ public void businessRoleTypeSearchTest() throws Exception { @Test public void emptyRoleTypeSearchTest() throws Exception { - - EqualFilter equalFilter = EqualFilter.createEqual(new ItemPath(RoleType.F_ROLE_TYPE), RoleType.class, prismContext, null); - ObjectQuery query = ObjectQuery.createObjectQuery(equalFilter); - + ObjectQuery query = QueryBuilder.queryFor(RoleType.class, prismContext) + .item(RoleType.F_ROLE_TYPE).isNull() + .build(); OperationResult result = new OperationResult("search"); List> roles = repositoryService.searchObjects(RoleType.class, query, null, result); result.recomputeStatus(); @@ -371,11 +367,9 @@ public void emptyRoleTypeSearchTest() throws Exception { @Test public void nonEmptyRoleTypeSearchTest() throws Exception { - - EqualFilter equalFilter = EqualFilter.createEqual(new ItemPath(RoleType.F_ROLE_TYPE), RoleType.class, prismContext, null); - NotFilter notFilter = NotFilter.createNot(equalFilter); - ObjectQuery query = ObjectQuery.createObjectQuery(notFilter); - + ObjectQuery query = QueryBuilder.queryFor(RoleType.class, prismContext) + .not().item(RoleType.F_ROLE_TYPE).isNull() + .build(); OperationResult result = new OperationResult("search"); List> roles = repositoryService.searchObjects(RoleType.class, query, null, result); result.recomputeStatus(); diff --git a/repo/repo-test-util/src/main/java/com/evolveum/midpoint/test/AbstractIntegrationTest.java b/repo/repo-test-util/src/main/java/com/evolveum/midpoint/test/AbstractIntegrationTest.java index b33dbe2c128..4a0b2c849e7 100644 --- a/repo/repo-test-util/src/main/java/com/evolveum/midpoint/test/AbstractIntegrationTest.java +++ b/repo/repo-test-util/src/main/java/com/evolveum/midpoint/test/AbstractIntegrationTest.java @@ -414,24 +414,22 @@ protected PrismObject addResourceFromFile(File file, String connec protected PrismObject findConnectorByType(String connectorType, OperationResult result) throws SchemaException { - - EqualFilter equal = EqualFilter.createEqual(ConnectorType.F_CONNECTOR_TYPE, ConnectorType.class, prismContext, null, connectorType); - ObjectQuery query = ObjectQuery.createObjectQuery(equal); + ObjectQuery query = QueryBuilder.queryFor(ConnectorType.class, prismContext) + .item(ConnectorType.F_CONNECTOR_TYPE).eq(connectorType) + .build(); List> connectors = repositoryService.searchObjects(ConnectorType.class, query, null, result); if (connectors.size() != 1) { - throw new IllegalStateException("Cannot find connector type " + connectorType + ", got " - + connectors); + throw new IllegalStateException("Cannot find connector type " + connectorType + ", got " + connectors); } return connectors.get(0); } protected PrismObject findConnectorByTypeAndVersion(String connectorType, String connectorVersion, OperationResult result) throws SchemaException { - - EqualFilter equalType = EqualFilter.createEqual(ConnectorType.F_CONNECTOR_TYPE, ConnectorType.class, prismContext, null, connectorType); - EqualFilter equalVersion = EqualFilter.createEqual(ConnectorType.F_CONNECTOR_VERSION, ConnectorType.class, prismContext, null, connectorVersion); - AndFilter filter = AndFilter.createAnd(equalType, equalVersion); - ObjectQuery query = ObjectQuery.createObjectQuery(filter); + ObjectQuery query = QueryBuilder.queryFor(ConnectorType.class, prismContext) + .item(ConnectorType.F_CONNECTOR_TYPE).eq(connectorType) + .and().item(ConnectorType.F_CONNECTOR_VERSION).eq(connectorVersion) + .build(); List> connectors = repositoryService.searchObjects(ConnectorType.class, query, null, result); if (connectors.size() != 1) { throw new IllegalStateException("Cannot find connector type " + connectorType + ", version "+connectorVersion+", got " diff --git a/repo/repo-test-util/src/main/java/com/evolveum/midpoint/test/IntegrationTestTools.java b/repo/repo-test-util/src/main/java/com/evolveum/midpoint/test/IntegrationTestTools.java index cf97a45ead1..990b82402c2 100644 --- a/repo/repo-test-util/src/main/java/com/evolveum/midpoint/test/IntegrationTestTools.java +++ b/repo/repo-test-util/src/main/java/com/evolveum/midpoint/test/IntegrationTestTools.java @@ -545,17 +545,16 @@ public static void checkAllShadows(ResourceType resourceType, RepositoryService } public static ObjectQuery createAllShadowsQuery(ResourceType resourceType, PrismContext prismContext) throws SchemaException { - RefFilter equal = RefFilter.createReferenceEqual(ShadowType.F_RESOURCE_REF, ShadowType.class, prismContext, resourceType.getOid()); - ObjectQuery query = ObjectQuery.createObjectQuery(equal); - return query; + return QueryBuilder.queryFor(ShadowType.class, prismContext) + .item(ShadowType.F_RESOURCE_REF).ref(resourceType.getOid()) + .build(); } public static ObjectQuery createAllShadowsQuery(ResourceType resourceType, QName objectClass, PrismContext prismContext) throws SchemaException { - AndFilter and = AndFilter.createAnd( - RefFilter.createReferenceEqual(ShadowType.F_RESOURCE_REF, ShadowType.class, prismContext, resourceType.getOid()), - EqualFilter.createEqual(ShadowType.F_OBJECT_CLASS, ShadowType.class, prismContext, null, objectClass)); - ObjectQuery query = ObjectQuery.createObjectQuery(and); - return query; + return QueryBuilder.queryFor(ShadowType.class, prismContext) + .item(ShadowType.F_RESOURCE_REF).ref(resourceType.getOid()) + .and().item(ShadowType.F_OBJECT_CLASS).eq(objectClass) + .build(); } public static ObjectQuery createAllShadowsQuery(ResourceType resourceType, String objectClassLocalName, PrismContext prismContext) throws SchemaException { diff --git a/repo/security-impl/src/main/java/com/evolveum/midpoint/security/impl/SecurityEnforcerImpl.java b/repo/security-impl/src/main/java/com/evolveum/midpoint/security/impl/SecurityEnforcerImpl.java index 8bd24790a1f..99c64765e22 100644 --- a/repo/security-impl/src/main/java/com/evolveum/midpoint/security/impl/SecurityEnforcerImpl.java +++ b/repo/security-impl/src/main/java/com/evolveum/midpoint/security/impl/SecurityEnforcerImpl.java @@ -22,6 +22,8 @@ import javax.xml.namespace.QName; +import com.evolveum.midpoint.prism.query.builder.QueryBuilder; +import com.evolveum.midpoint.prism.query.builder.S_AtomicFilterExit; import org.aopalliance.intercept.MethodInvocation; import org.apache.commons.lang.BooleanUtils; import org.apache.commons.lang.mutable.MutableBoolean; @@ -963,13 +965,14 @@ private ObjectFilter preProcessObje } ItemPath ownerRefPath = new ItemPath(AbstractRoleType.F_OWNER_REF); PrismReferenceDefinition ownerRefDef = objectDefinition.findReferenceDefinition(ownerRefPath); - ObjectFilter objSpecOwnerFilter = RefFilter.createReferenceEqual(ownerRefPath, ownerRefDef, principal.getUser().getOid()); + S_AtomicFilterExit builder = QueryBuilder.queryFor(AbstractRoleType.class, prismContext) + .item(ownerRefPath, ownerRefDef).ref(principal.getUser().getOid()); for (ObjectReferenceType subjectParentOrgRef: principal.getUser().getParentOrgRef()) { if (MiscSchemaUtil.compareRelation(null, subjectParentOrgRef.getRelation())) { - objSpecOwnerFilter = ObjectQueryUtil.filterOr(objSpecOwnerFilter, - RefFilter.createReferenceEqual(ownerRefPath, ownerRefDef, subjectParentOrgRef.getOid())); + builder = builder.or().item(ownerRefPath, ownerRefDef).ref(subjectParentOrgRef.getOid()); } } + ObjectFilter objSpecOwnerFilter = builder.buildFilter(); objSpecSecurityFilter = ObjectQueryUtil.filterAnd(objSpecSecurityFilter, objSpecOwnerFilter); LOGGER.trace(" applying owner filter {}", objSpecOwnerFilter); } else { diff --git a/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/TaskManagerQuartzImpl.java b/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/TaskManagerQuartzImpl.java index 1f336a81e33..da2552bb85b 100644 --- a/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/TaskManagerQuartzImpl.java +++ b/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/TaskManagerQuartzImpl.java @@ -27,6 +27,9 @@ import com.evolveum.midpoint.prism.query.LessFilter; import com.evolveum.midpoint.prism.query.ObjectFilter; import com.evolveum.midpoint.prism.query.ObjectQuery; +import com.evolveum.midpoint.prism.query.builder.QueryBuilder; +import com.evolveum.midpoint.prism.query.builder.S_AtomicFilterEntry; +import com.evolveum.midpoint.prism.query.builder.S_FilterEntryOrEmpty; import com.evolveum.midpoint.prism.xml.XmlTypeConverter; import com.evolveum.midpoint.repo.api.RepositoryService; import com.evolveum.midpoint.schema.GetOperationOptions; @@ -155,7 +158,7 @@ public class TaskManagerQuartzImpl implements TaskManager, BeanFactoryAware { // Use ONLY for those actions that need to work with these instances, e.g. when calling heartbeat() methods on them. // For any other business please use LocalNodeManager.getLocallyRunningTasks(...). // Maps task id -> task - private HashMap locallyRunningTaskInstancesMap = new HashMap(); + private final HashMap locallyRunningTaskInstancesMap = new HashMap<>(); private ExecutorService lightweightHandlersExecutor = Executors.newCachedThreadPool(); @@ -1033,10 +1036,9 @@ public List> listSubtasksForTask(String taskIdentifier, Op if (StringUtils.isEmpty(taskIdentifier)) { return new ArrayList<>(); } - - ObjectFilter filter = null; - filter = EqualFilter.createEqual(TaskType.F_PARENT, TaskType.class, prismContext, null, taskIdentifier); - ObjectQuery query = ObjectQuery.createObjectQuery(filter); + ObjectQuery query = QueryBuilder.queryFor(TaskType.class, prismContext) + .item(TaskType.F_PARENT).eq(taskIdentifier) + .build(); List> list; try { @@ -1658,24 +1660,17 @@ public PrismObject getTaskTypeByIdentifier(String identifier, Collecti result.addParam("identifier", identifier); result.addContext(OperationResult.CONTEXT_IMPLEMENTATION_CLASS, TaskManagerQuartzImpl.class); - PrismObject retval; + ObjectQuery query = QueryBuilder.queryFor(TaskType.class, prismContext) + .item(TaskType.F_TASK_IDENTIFIER).eq(identifier) + .build(); -// TaskQuartzImpl transientTask = registeredTransientTasks.get(identifier); -// if (transientTask != null) { -// retval = transientTask.getTaskPrismObject(); -// } else { - // search the repo - ObjectFilter filter = EqualFilter.createEqual(TaskType.F_TASK_IDENTIFIER, TaskType.class, prismContext, null, identifier); - ObjectQuery query = ObjectQuery.createObjectQuery(filter); - - List> list = repositoryService.searchObjects(TaskType.class, query, options, result); - if (list.isEmpty()) { - throw new ObjectNotFoundException("Task with identifier " + identifier + " could not be found"); - } else if (list.size() > 1) { - throw new IllegalStateException("Found more than one task with identifier " + identifier + " (" + list.size() + " of them)"); - } - retval = list.get(0); -// } + List> list = repositoryService.searchObjects(TaskType.class, query, options, result); + if (list.isEmpty()) { + throw new ObjectNotFoundException("Task with identifier " + identifier + " could not be found"); + } else if (list.size() > 1) { + throw new IllegalStateException("Found more than one task with identifier " + identifier + " (" + list.size() + " of them)"); + } + PrismObject retval = list.get(0); if (SelectorOptions.hasToLoadPath(TaskType.F_SUBTASK, options)) { ClusterStatusInformation clusterStatusInformation = getClusterStatusInformation(options, TaskType.class, true, result); // returns null if noFetch is set fillInSubtasks(retval.asObjectable(), clusterStatusInformation, options, result); @@ -1716,10 +1711,10 @@ public void cleanupTasks(CleanupPolicyType policy, Task executionTask, Operation List> obsoleteTasks; try { - ObjectQuery obsoleteTasksQuery = ObjectQuery.createObjectQuery(AndFilter.createAnd( - LessFilter.createLess(TaskType.F_COMPLETION_TIMESTAMP, TaskType.class, getPrismContext(), timeXml, true), - EqualFilter.createEqual(TaskType.F_PARENT, TaskType.class, getPrismContext(), null))); - + ObjectQuery obsoleteTasksQuery = QueryBuilder.queryFor(TaskType.class, prismContext) + .item(TaskType.F_COMPLETION_TIMESTAMP).le(timeXml) + .and().item(TaskType.F_PARENT).isNull() + .build(); obsoleteTasks = repositoryService.searchObjects(TaskType.class, obsoleteTasksQuery, null, result); } catch (SchemaException e) { throw new SchemaException("Couldn't get the list of obsolete tasks: " + e.getMessage(), e); @@ -1843,29 +1838,20 @@ public void checkWaitingTasks(OperationResult result) throws SchemaException { try { ((TaskQuartzImpl) task).checkDependencies(result); count++; - } catch (SchemaException e) { - LoggingUtils.logException(LOGGER, "Couldn't check dependencies for task {}", e, task); - } catch (ObjectNotFoundException e) { + } catch (SchemaException | ObjectNotFoundException e) { LoggingUtils.logException(LOGGER, "Couldn't check dependencies for task {}", e, task); } - } + } LOGGER.trace("Check waiting tasks completed; {} tasks checked.", count); } private List listWaitingTasks(TaskWaitingReason reason, OperationResult result) throws SchemaException { - - ObjectFilter filter, filter1 = null, filter2 = null; -// try { - filter1 = EqualFilter.createEqual(TaskType.F_EXECUTION_STATUS, TaskType.class, prismContext, null, TaskExecutionStatusType.WAITING); - if (reason != null) { - filter2 = EqualFilter.createEqual(TaskType.F_WAITING_REASON, TaskType.class, prismContext, null, reason.toTaskType()); - } -// } catch (SchemaException e) { -// throw new SystemException("Cannot create filter for listing waiting tasks due to schema exception", e); -// } - filter = filter2 != null ? AndFilter.createAnd(filter1, filter2) : filter1; - ObjectQuery query = ObjectQuery.createObjectQuery(filter); -// query = new ObjectQuery(); // todo remove this hack when searching will work + S_AtomicFilterEntry q = QueryBuilder.queryFor(TaskType.class, prismContext); + q = q.item(TaskType.F_EXECUTION_STATUS).eq(TaskExecutionStatusType.WAITING).and(); + if (reason != null) { + q = q.item(TaskType.F_WAITING_REASON).eq(reason.toTaskType()).and(); + } + ObjectQuery query = q.all().build(); List> prisms = repositoryService.searchObjects(TaskType.class, query, null, result); List tasks = resolveTasksFromTaskTypes(prisms, result); diff --git a/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/TaskQuartzImpl.java b/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/TaskQuartzImpl.java index db94681312b..ec2306f4aa2 100644 --- a/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/TaskQuartzImpl.java +++ b/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/TaskQuartzImpl.java @@ -41,6 +41,7 @@ import com.evolveum.midpoint.prism.query.EqualFilter; import com.evolveum.midpoint.prism.query.ObjectFilter; import com.evolveum.midpoint.prism.query.ObjectQuery; +import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import com.evolveum.midpoint.prism.xml.XmlTypeConverter; import com.evolveum.midpoint.repo.api.RepositoryService; import com.evolveum.midpoint.schema.DeltaConvertor; @@ -2559,13 +2560,9 @@ public List> listPrerequisiteTasksRaw(OperationResult pare result.addContext(OperationResult.CONTEXT_OID, getOid()); result.addContext(OperationResult.CONTEXT_IMPLEMENTATION_CLASS, TaskQuartzImpl.class); - ObjectFilter filter = null; -// try { - filter = EqualFilter.createEqual(TaskType.F_DEPENDENT, TaskType.class, taskManager.getPrismContext(), null, getTaskIdentifier()); -// } catch (SchemaException e) { -// throw new SystemException("Cannot create filter for 'dependent contains task identifier' due to schema exception", e); -// } - ObjectQuery query = ObjectQuery.createObjectQuery(filter); + ObjectQuery query = QueryBuilder.queryFor(TaskType.class, getPrismContext()) + .item(TaskType.F_DEPENDENT).eq(getTaskIdentifier()) + .build(); List> list = taskManager.getRepositoryService().searchObjects(TaskType.class, query, null, result); result.recordSuccessIfUnknown(); diff --git a/repo/task-quartz-impl/src/test/java/com/evolveum/midpoint/task/quartzimpl/TestQuartzTaskManagerContract.java b/repo/task-quartz-impl/src/test/java/com/evolveum/midpoint/task/quartzimpl/TestQuartzTaskManagerContract.java index 2d713381e6e..47630abbe09 100644 --- a/repo/task-quartz-impl/src/test/java/com/evolveum/midpoint/task/quartzimpl/TestQuartzTaskManagerContract.java +++ b/repo/task-quartz-impl/src/test/java/com/evolveum/midpoint/task/quartzimpl/TestQuartzTaskManagerContract.java @@ -37,6 +37,7 @@ import com.evolveum.midpoint.prism.query.EqualFilter; import com.evolveum.midpoint.prism.query.ObjectFilter; import com.evolveum.midpoint.prism.query.ObjectQuery; +import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import com.evolveum.midpoint.schema.DeltaConvertor; import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.result.OperationResultStatus; @@ -1420,8 +1421,8 @@ public void test020QueryByExecutionStatus() throws Exception { Task rootTask = taskManager.createTaskInstance((PrismObject) (PrismObject) addObjectFromFile(taskFilename(test)), result); String oid = rootTask.getOid(); - ObjectFilter filter1 = EqualFilter.createEqual(TaskType.F_EXECUTION_STATUS, TaskType.class, prismContext, null, TaskExecutionStatusType.WAITING); - ObjectFilter filter2 = EqualFilter.createEqual(TaskType.F_WAITING_REASON, TaskType.class, prismContext, null, TaskWaitingReasonType.WORKFLOW); + ObjectFilter filter1 = QueryBuilder.queryFor(TaskType.class, prismContext).item(TaskType.F_EXECUTION_STATUS).eq(TaskExecutionStatusType.WAITING).buildFilter(); + ObjectFilter filter2 = QueryBuilder.queryFor(TaskType.class, prismContext).item(TaskType.F_WAITING_REASON).eq(TaskWaitingReasonType.WORKFLOW).buildFilter(); ObjectFilter filter3 = AndFilter.createAnd(filter1, filter2); List> prisms1 = repositoryService.searchObjects(TaskType.class, ObjectQuery.createObjectQuery(filter1), null, result); diff --git a/testing/conntest/src/test/java/com/evolveum/midpoint/testing/conntest/AbstractEDirTest.java b/testing/conntest/src/test/java/com/evolveum/midpoint/testing/conntest/AbstractEDirTest.java index b64a01fb89f..9ce28a2746c 100644 --- a/testing/conntest/src/test/java/com/evolveum/midpoint/testing/conntest/AbstractEDirTest.java +++ b/testing/conntest/src/test/java/com/evolveum/midpoint/testing/conntest/AbstractEDirTest.java @@ -27,6 +27,7 @@ import javax.xml.namespace.QName; +import com.evolveum.midpoint.prism.query.builder.S_AtomicFilterExit; import org.apache.directory.api.ldap.model.cursor.CursorException; import org.apache.directory.api.ldap.model.entry.Entry; import org.apache.directory.api.ldap.model.exception.LdapException; @@ -416,11 +417,11 @@ public void test190SeachLockedAccounts() throws Exception { // GIVEN Task task = taskManager.createTaskInstance(this.getClass().getName() + "." + TEST_NAME); OperationResult result = task.getResult(); - - ObjectQuery query = ObjectQueryUtil.createResourceAndObjectClassQuery(getResourceOid(), getAccountObjectClass(), prismContext); - ObjectQueryUtil.filterAnd(query.getFilter(), - EqualFilter.createEqual(new ItemPath(ShadowType.F_ACTIVATION, ActivationType.F_LOCKOUT_STATUS), getShadowDefinition(), LockoutStatusType.LOCKED)); - + + ObjectQuery query = ObjectQueryUtil.createResourceAndObjectClassFilterPrefix(getResourceOid(), getAccountObjectClass(), prismContext) + .and().item(ShadowType.F_ACTIVATION, ActivationType.F_LOCKOUT_STATUS).eq(LockoutStatusType.LOCKED) + .build(); + SearchResultList> searchResultList = doSearch(TEST_NAME, query, 1, task, result); assertConnectorOperationIncrement(1); @@ -916,10 +917,9 @@ public void test810SeachLockedAccounts() throws Exception { Task task = taskManager.createTaskInstance(this.getClass().getName() + "." + TEST_NAME); OperationResult result = task.getResult(); - ObjectQuery query = ObjectQueryUtil.createResourceAndObjectClassQuery(getResourceOid(), getAccountObjectClass(), prismContext); - ObjectQueryUtil.filterAnd(query.getFilter(), - EqualFilter.createEqual(new ItemPath(ShadowType.F_ACTIVATION, ActivationType.F_LOCKOUT_STATUS), getShadowDefinition(), LockoutStatusType.LOCKED)); - + ObjectQuery query = ObjectQueryUtil.createResourceAndObjectClassFilterPrefix(getResourceOid(), getAccountObjectClass(), prismContext) + .and().item(ShadowType.F_ACTIVATION, ActivationType.F_LOCKOUT_STATUS).eq(LockoutStatusType.LOCKED) + .build(); SearchResultList> searchResultList = doSearch(TEST_NAME, query, 0, task, result); assertConnectorOperationIncrement(1); diff --git a/testing/conntest/src/test/java/com/evolveum/midpoint/testing/conntest/AbstractLdapTest.java b/testing/conntest/src/test/java/com/evolveum/midpoint/testing/conntest/AbstractLdapTest.java index aa5a3520e23..a4b306bf521 100644 --- a/testing/conntest/src/test/java/com/evolveum/midpoint/testing/conntest/AbstractLdapTest.java +++ b/testing/conntest/src/test/java/com/evolveum/midpoint/testing/conntest/AbstractLdapTest.java @@ -40,6 +40,7 @@ import com.evolveum.midpoint.common.refinery.RefinedResourceSchema; import com.evolveum.midpoint.model.impl.sync.ReconciliationTaskHandler; +import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import com.evolveum.midpoint.util.DOMUtil; import com.evolveum.midpoint.util.Holder; import com.evolveum.midpoint.util.aspect.ProfilingDataManager; @@ -446,9 +447,10 @@ public void test020Schema() throws Exception { } protected ObjectFilter createAttributeFilter(String attrName, T attrVal) throws SchemaException { - ResourceAttributeDefinition ldapUidAttrDef = accountObjectClassDefinition.findAttributeDefinition(attrName); - return EqualFilter.createEqual( - new ItemPath(ShadowType.F_ATTRIBUTES, ldapUidAttrDef.getName()), ldapUidAttrDef, attrVal); + ResourceAttributeDefinition ldapAttrDef = accountObjectClassDefinition.findAttributeDefinition(attrName); + return QueryBuilder.queryFor(ShadowType.class, prismContext) + .itemWithDef(ldapAttrDef, ShadowType.F_ATTRIBUTES, ldapAttrDef.getName()).eq(attrVal) + .buildFilter(); } protected ObjectQuery createUidQuery(String uid) throws SchemaException { diff --git a/testing/story/src/test/java/com/evolveum/midpoint/testing/story/TestVillage.java b/testing/story/src/test/java/com/evolveum/midpoint/testing/story/TestVillage.java index fd889f928ea..c6ab697f088 100644 --- a/testing/story/src/test/java/com/evolveum/midpoint/testing/story/TestVillage.java +++ b/testing/story/src/test/java/com/evolveum/midpoint/testing/story/TestVillage.java @@ -943,11 +943,12 @@ public void test310ProjectJollyRogerNestedGroup() throws Exception { display("LDAP entries", openDJController.dumpEntries()); - ObjectFilter baseFilter = ObjectQueryUtil.createResourceAndObjectClassFilter(RESOURCE_OPENDJ_OID, GROUP_OF_UNIQUE_NAMES_OBJECTCLASS_QNAME, prismContext); - ObjectFilter filter = ObjectQueryUtil.filterAnd(baseFilter, EqualFilter.createEqual(new ItemPath(ShadowType.F_ATTRIBUTES, new QName(RESOURCE_OPENDJ_NAMESPACE, "cn")), - new PrismPropertyDefinition<>(new QName(RESOURCE_OPENDJ_NAMESPACE, "cn"), DOMUtil.XSD_STRING, prismContext), "admins")); - ObjectQuery query = ObjectQuery.createObjectQuery(filter); - + ObjectQuery query = ObjectQueryUtil.createResourceAndObjectClassFilterPrefix(RESOURCE_OPENDJ_OID, GROUP_OF_UNIQUE_NAMES_OBJECTCLASS_QNAME, prismContext) + .and().itemWithDef( + new PrismPropertyDefinition<>(new QName(RESOURCE_OPENDJ_NAMESPACE, "cn"), DOMUtil.XSD_STRING, prismContext), + ShadowType.F_ATTRIBUTES, new QName(RESOURCE_OPENDJ_NAMESPACE, "cn")).eq("admins") + .build(); + // WHEN TestUtil.displayWhen(TEST_NAME); // TODO: search for cn=admins,ou=Jolly Roger,dc=example,dc=com From fd7095ac442c8dcb8c9f9582077468895e39e56b Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Wed, 12 Oct 2016 13:29:13 +0200 Subject: [PATCH 28/74] Fixes in SQL repo test. --- .../java/com/evolveum/midpoint/repo/sql/SearchTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/SearchTest.java b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/SearchTest.java index 3c80c25440e..0ac61837f18 100644 --- a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/SearchTest.java +++ b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/SearchTest.java @@ -252,7 +252,7 @@ public void assignmentOrgRefSearchTest() throws Exception { public void assignmentResourceRefSearchTest() throws Exception { PrismReferenceValue resourceRef = new PrismReferenceValue("10000000-0000-0000-0000-000000000004", ResourceType.COMPLEX_TYPE); ObjectQuery query = QueryBuilder.queryFor(RoleType.class, prismContext) - .item(RoleType.F_ASSIGNMENT, AssignmentType.F_CONSTRUCTION, ConstructionType.F_RESOURCE_REF).eq(resourceRef) + .item(RoleType.F_ASSIGNMENT, AssignmentType.F_CONSTRUCTION, ConstructionType.F_RESOURCE_REF).ref(resourceRef) .build(); OperationResult result = new OperationResult("search"); @@ -264,7 +264,7 @@ public void assignmentResourceRefSearchTest() throws Exception { PrismReferenceValue resourceRef2 = new PrismReferenceValue("FFFFFFFF-0000-0000-0000-000000000004", ResourceType.COMPLEX_TYPE); query = QueryBuilder.queryFor(RoleType.class, prismContext) - .item(RoleType.F_ASSIGNMENT, AssignmentType.F_CONSTRUCTION, ConstructionType.F_RESOURCE_REF).eq(resourceRef2) + .item(RoleType.F_ASSIGNMENT, AssignmentType.F_CONSTRUCTION, ConstructionType.F_RESOURCE_REF).ref(resourceRef2) .build(); roles = repositoryService.searchObjects(RoleType.class, query, null, result); result.recomputeStatus(); @@ -291,7 +291,7 @@ public void roleAssignmentSearchTest() throws Exception { public void orgAssignmentSearchTest() throws Exception { PrismReferenceValue org = new PrismReferenceValue("00000000-8888-6666-0000-100000000085", OrgType.COMPLEX_TYPE); ObjectQuery query = QueryBuilder.queryFor(UserType.class, prismContext) - .item(UserType.F_ASSIGNMENT, AssignmentType.F_TARGET_REF).eq(org) + .item(UserType.F_ASSIGNMENT, AssignmentType.F_TARGET_REF).ref(org) .build(); OperationResult result = new OperationResult("search"); List> users = repositoryService.searchObjects(UserType.class, query, null, result); From c31a693c1e342d2460620196e6bde84f38cda46f Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Wed, 12 Oct 2016 17:15:52 +0200 Subject: [PATCH 29/74] Filters cleanup. Interim commit. --- .../assignment/CatalogItemsPanel.java | 13 +- .../midpoint/web/component/search/Search.java | 6 +- .../component/ObjectSelectionPanel.java | 9 +- .../component/RunReportPopupPanel.java | 11 +- .../component/AbstractTreeTablePanel.java | 41 +++--- .../admin/users/component/OrgMemberPanel.java | 41 +++--- .../users/component/OrgTreeProvider.java | 9 +- .../admin/users/component/TreeTablePanel.java | 7 +- .../evolveum/midpoint/prism/PrismValue.java | 6 +- .../prism/marshaller/QueryConvertor.java | 12 +- .../midpoint/prism/query/OrgFilter.java | 4 +- .../prism/query/PropertyValueFilter.java | 16 +-- .../midpoint/prism/query/RefFilter.java | 6 +- .../midpoint/prism/query/SubstringFilter.java | 136 +++--------------- .../prism/query/builder/R_AtomicFilter.java | 6 +- .../prism/query/builder/R_Filter.java | 10 ++ .../query/builder/S_AtomicFilterEntry.java | 23 +-- .../prism/query/TestQueryBuilder.java | 4 + .../test/AbstractModelIntegrationTest.java | 12 +- .../midpoint/repo/sql/OrgStructTest.java | 17 ++- .../repo/sql/QueryInterpreter2Test.java | 29 ++-- 21 files changed, 169 insertions(+), 249 deletions(-) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/CatalogItemsPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/CatalogItemsPanel.java index dae84acae7c..fe71f40ff52 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/CatalogItemsPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/CatalogItemsPanel.java @@ -8,6 +8,7 @@ import com.evolveum.midpoint.model.api.RoleSelectionSpecification; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.query.*; +import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.util.logging.LoggingUtils; @@ -257,14 +258,10 @@ private ObjectQuery createMemberQuery(QName focusTypeClass) { } private ObjectQuery createMemberQuery(String oid) { - ObjectFilter filter = OrgFilter.createOrg(oid, OrgFilter.Scope.ONE_LEVEL); - - TypeFilter roleTypeFilter = TypeFilter.createType(RoleType.COMPLEX_TYPE, filter); - TypeFilter orgTypeFilter = TypeFilter.createType(OrgType.COMPLEX_TYPE, filter); - TypeFilter serviceTypeFilter = TypeFilter.createType(ServiceType.COMPLEX_TYPE, filter); - ObjectQuery query = ObjectQuery.createObjectQuery(OrFilter.createOr(roleTypeFilter, orgTypeFilter, serviceTypeFilter)); - return query; - + return QueryBuilder.queryFor(ObjectType.class, getPageBase().getPrismContext()) + .type(AbstractRoleType.class) + .isDirectChildOf(oid) + .build(); } private void refreshItemsPanel() { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/Search.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/Search.java index cb996789195..e6a064d6c70 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/Search.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/Search.java @@ -215,13 +215,15 @@ private ObjectFilter createFilterForSearchValue(SearchItem item, DisplayableValu .item(path, propDef).eq(value).buildFilter(); } else if (DOMUtil.XSD_STRING.equals(propDef.getTypeName())) { String text = (String) searchValue.getValue(); - return SubstringFilter.createSubstring(path, propDef, StringIgnoreCaseMatchingRule.NAME, text); + return QueryBuilder.queryFor(ObjectType.class, ctx) + .item(path, propDef).contains(text).matchingCaseIgnore().buildFilter(); } else if (SchemaConstants.T_POLY_STRING_TYPE.equals(propDef.getTypeName())) { //we're looking for string value, therefore substring filter should be used String text = (String) searchValue.getValue(); PolyStringNormalizer normalizer = ctx.getDefaultPolyStringNormalizer(); String value = normalizer.normalize(text); - return SubstringFilter.createSubstring(path, propDef, PolyStringNormMatchingRule.NAME, value); + return QueryBuilder.queryFor(ObjectType.class, ctx) + .item(path, propDef).contains(text).matchingNorm().buildFilter(); } //we don't know how to create filter from search item, should not happen, ha ha ha :) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/component/ObjectSelectionPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/component/ObjectSelectionPanel.java index 29cfa10ebaa..287603807b4 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/component/ObjectSelectionPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/component/ObjectSelectionPanel.java @@ -23,8 +23,10 @@ import com.evolveum.midpoint.prism.match.PolyStringNormMatchingRule; import com.evolveum.midpoint.prism.polystring.PolyStringNormalizer; import com.evolveum.midpoint.prism.query.AndFilter; +import com.evolveum.midpoint.prism.query.ObjectFilter; import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.prism.query.SubstringFilter; +import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import com.evolveum.midpoint.schema.GetOperationOptions; import com.evolveum.midpoint.schema.SelectorOptions; import com.evolveum.midpoint.util.logging.LoggingUtils; @@ -300,10 +302,11 @@ private ObjectQuery createObjectQuery() { PolyStringNormalizer normalizer = prismContext.getDefaultPolyStringNormalizer(); String normalized = normalizer.normalize(dto.getText()); - SubstringFilter filter = SubstringFilter.createSubstring(context.getSearchProperty(), objectType, prismContext, - PolyStringNormMatchingRule.NAME, normalized); + ObjectFilter filter = QueryBuilder.queryFor(objectType, prismContext) + .item(context.getSearchProperty()).contains(normalized).matchingNorm() + .buildFilter(); - if(context.getDataProviderQuery() != null){ + if (context.getDataProviderQuery() != null) { AndFilter and = AndFilter.createAnd(context.getDataProviderQuery().getFilter(), filter); query = ObjectQuery.createObjectQuery(and); } else { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/RunReportPopupPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/RunReportPopupPanel.java index edc4d810a9c..c51a907edd5 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/RunReportPopupPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/RunReportPopupPanel.java @@ -23,6 +23,7 @@ import javax.xml.datatype.XMLGregorianCalendar; import javax.xml.namespace.QName; +import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import org.apache.wicket.Component; import org.apache.wicket.MarkupContainer; import org.apache.wicket.ajax.AjaxRequestTarget; @@ -316,12 +317,10 @@ private List createLookupTableRows(Ja Task task = createSimpleTask(OPERATION_LOAD_RESOURCES); Collection> objects; - SubstringFilter filter = SubstringFilter.createSubstring(new QName(SchemaConstants.NS_C, pLabel), targetType, getPrismContext(), input); - filter.setMatchingRule(new QName(SchemaConstants.NS_MATCHING_RULE, "origIgnoreCase")); - filter.setAnchorStart(true); // =startsWith - ObjectQuery query = ObjectQuery.createObjectQuery(filter); - query.setPaging(ObjectPaging.createPaging(0, AUTO_COMPLETE_BOX_SIZE)); - + ObjectQuery query = QueryBuilder.queryFor(targetType, getPrismContext()) + .item(new QName(SchemaConstants.NS_C, pLabel)).startsWith(input).matchingCaseIgnore() + .maxSize(AUTO_COMPLETE_BOX_SIZE) + .build(); try { objects = modelService.searchObjects(targetType, query, SelectorOptions.createCollection(GetOperationOptions.createNoFetch()), task, result); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/AbstractTreeTablePanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/AbstractTreeTablePanel.java index 5d37217a25e..e7fe9a3bd0e 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/AbstractTreeTablePanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/AbstractTreeTablePanel.java @@ -20,6 +20,9 @@ import java.util.Iterator; import java.util.List; +import com.evolveum.midpoint.prism.query.builder.QueryBuilder; +import com.evolveum.midpoint.prism.query.builder.S_AtomicFilterExit; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; import org.apache.commons.lang.StringUtils; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.extensions.markup.html.repeater.tree.ITreeProvider; @@ -158,42 +161,38 @@ protected ObjectQuery createOrgChildQuery() { if (StringUtils.isBlank(object)) { object = null; } - - OrgFilter org; + + PageBase page = getPageBase(); + PrismContext context = page.getPrismContext(); + + S_AtomicFilterExit q; if (object == null || SEARCH_SCOPE_ONE.equals(scope)) { - org = OrgFilter.createOrg(oid, OrgFilter.Scope.ONE_LEVEL); + q = QueryBuilder.queryFor(OrgType.class, context) + .isDirectChildOf(oid); } else { - org = OrgFilter.createOrg(oid, OrgFilter.Scope.SUBTREE); + q = QueryBuilder.queryFor(OrgType.class, context) + .isChildOf(oid); } if (object == null) { - return ObjectQuery.createObjectQuery(org); + return q.build(); } - - PageBase page = getPageBase(); - PrismContext context = page.getPrismContext(); PolyStringNormalizer normalizer = context.getDefaultPolyStringNormalizer(); String normalizedString = normalizer.normalize(object); if (StringUtils.isEmpty(normalizedString)) { - return ObjectQuery.createObjectQuery(org); + return q.build(); } - SubstringFilter substringName = SubstringFilter.createSubstring(OrgType.F_NAME, OrgType.class, context, - PolyStringNormMatchingRule.NAME, normalizedString); - - SubstringFilter substringDisplayName = SubstringFilter.createSubstring(OrgType.F_DISPLAY_NAME, OrgType.class, context, - PolyStringNormMatchingRule.NAME, normalizedString); - OrFilter orName = OrFilter.createOr(substringName, substringDisplayName); - AndFilter and = AndFilter.createAnd(org, orName); - ObjectQuery query = ObjectQuery.createObjectQuery(and); - - if(LOGGER.isTraceEnabled()){ + ObjectQuery query = q.and().block() + .item(OrgType.F_NAME).containsPoly(normalizedString).matchingNorm() + .or().item(OrgType.F_DISPLAY_NAME).containsPoly(normalizedString).matchingNorm() + .build(); + + if (LOGGER.isTraceEnabled()) { LOGGER.trace("Searching child orgs of org {} with query:\n{}", oid, query.debugDump()); } - return query; } - } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/OrgMemberPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/OrgMemberPanel.java index 6c81bdae25b..8a450e79187 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/OrgMemberPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/OrgMemberPanel.java @@ -26,6 +26,8 @@ import javax.xml.namespace.QName; import com.evolveum.midpoint.prism.query.builder.QueryBuilder; +import com.evolveum.midpoint.prism.query.builder.S_AtomicFilterEntry; +import com.evolveum.midpoint.prism.query.builder.S_FilterEntryOrEmpty; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; import org.apache.commons.lang.Validate; import org.apache.wicket.Component; @@ -449,11 +451,10 @@ private MainObjectListPanel getMemberTable() { createComponentPath(ID_FORM, ID_CONTAINER_MEMBER, ID_MEMBER_TABLE)); } - private QName getSearchType() { + private ObjectTypes getSearchType() { DropDownChoice searchByTypeChoice = (DropDownChoice) get( createComponentPath(ID_FORM, ID_SEARCH_BY_TYPE)); - ObjectTypes typeModel = searchByTypeChoice.getModelObject(); - return typeModel.getTypeQName(); + return searchByTypeChoice.getModelObject(); } private ObjectQuery createManagerQuery() { @@ -561,37 +562,27 @@ protected void recomputeManagersPerformed(QueryScope scope, AjaxRequestTarget ta @Override protected ObjectQuery createMemberQuery() { - ObjectQuery query = null; - String oid = getModelObject().getOid(); - List filters = new ArrayList<>(); - DropDownChoice searchScopeChoice = (DropDownChoice) get( createComponentPath(ID_FORM, ID_SEARCH_SCOPE)); String scope = searchScopeChoice.getModelObject(); - QName searchType = getSearchType(); - - OrgFilter org; + ObjectTypes searchType = getSearchType(); + S_FilterEntryOrEmpty q = QueryBuilder.queryFor(ObjectType.class, getPageBase().getPrismContext()); + if (!searchType.equals(ObjectTypes.OBJECT)) { + q = q.type(searchType.getClassDefinition()); + } + ObjectQuery query; if (SEARCH_SCOPE_ONE.equals(scope)) { - filters.add(OrgFilter.createOrg(oid, OrgFilter.Scope.ONE_LEVEL)); + query = q.isDirectChildOf(oid).build(); } else { - filters.add(OrgFilter.createOrg(oid, OrgFilter.Scope.SUBTREE)); + query = q.isChildOf(oid).build(); } - - query = ObjectQuery.createObjectQuery(AndFilter.createAnd(filters)); - if (LOGGER.isTraceEnabled()) { LOGGER.trace("Searching members of org {} with query:\n{}", oid, query.debugDump()); } - - if (searchType.equals(ObjectType.COMPLEX_TYPE)) { - return query; - } - - return ObjectQuery.createObjectQuery(TypeFilter.createType(searchType, query.getFilter())); - + return query; } private ObjectQuery createQueryForMemberAction(QueryScope scope, QName orgRelation, boolean isFocus) { @@ -634,9 +625,9 @@ private boolean satisfyConstraints(boolean isFocus, Class private ObjectQuery createQueryForAll(QueryScope scope, boolean isFocus, QName relation) { OrgType org = getModelObject(); - - return ObjectQuery.createObjectQuery(OrgFilter.createOrg(org.getOid(), getScope(scope))); - + return QueryBuilder.queryFor(ObjectType.class, getPageBase().getPrismContext()) + .isInScopeOf(org.getOid(), getScope(scope)) + .build(); } private Scope getScope(QueryScope queryScope) { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/OrgTreeProvider.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/OrgTreeProvider.java index 6541ef193b1..49e8475cb6f 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/OrgTreeProvider.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/OrgTreeProvider.java @@ -23,6 +23,7 @@ import java.util.List; import java.util.Set; +import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import org.apache.wicket.Component; import org.apache.wicket.RestartResponseException; import org.apache.wicket.extensions.markup.html.repeater.util.SortableTreeProvider; @@ -99,10 +100,10 @@ public Iterator> getChildren(SelectableBean> iterator = null; - OrgFilter orgFilter = OrgFilter.createOrg(node.getValue().getOid(), OrgFilter.Scope.ONE_LEVEL); - ObjectQuery query = ObjectQuery.createObjectQuery(orgFilter); - query.setPaging(ObjectPaging.createPaging(null, null, ObjectType.F_NAME, OrderDirection.ASCENDING)); - + ObjectQuery query = QueryBuilder.queryFor(ObjectType.class, getPageBase().getPrismContext()) + .isDirectChildOf(node.getValue().getOid()) + .asc(ObjectType.F_NAME) + .build(); OperationResult result = new OperationResult(LOAD_ORG_UNITS); try { // Collection> options = WebModelServiceUtils.createOptionsForParentOrgRefs(); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/TreeTablePanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/TreeTablePanel.java index cac93607e80..5a761555508 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/TreeTablePanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/TreeTablePanel.java @@ -29,6 +29,7 @@ import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.prism.query.OrgFilter; import com.evolveum.midpoint.prism.query.OrgFilter.Scope; +import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.ObjectTypeUtil; import com.evolveum.midpoint.task.api.Task; @@ -425,12 +426,14 @@ public void yesPerformed(AjaxRequestTarget target) { } private boolean hasChildren(SelectableBean orgToDelete) { - OrgFilter childrenFilter = OrgFilter.createOrg(orgToDelete.getValue().getOid(), Scope.SUBTREE); + ObjectQuery query = QueryBuilder.queryFor(ObjectType.class, getPageBase().getPrismContext()) + .isChildOf(orgToDelete.getValue().getOid()) + .build(); Task task = getPageBase().createSimpleTask(OPERATION_COUNT_CHILDREN); OperationResult result = new OperationResult(OPERATION_COUNT_CHILDREN); try { int count = getPageBase().getModelService().countObjects(ObjectType.class, - ObjectQuery.createObjectQuery(childrenFilter), null, task, result); + query, null, task, result); return (count > 0); } catch (SchemaException | ObjectNotFoundException | SecurityViolationException | ConfigurationException | CommunicationException e) { diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismValue.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismValue.java index 0dceb9bf929..4c1c4c881f8 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismValue.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismValue.java @@ -260,8 +260,10 @@ protected void copyValues(PrismValue clone) { @NotNull public static Collection cloneCollection(Collection values) { Collection clones = new ArrayList(); - for (T value: values) { - clones.add((T)value.clone()); + if (values != null) { + for (T value : values) { + clones.add((T) value.clone()); + } } return clones; } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/QueryConvertor.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/QueryConvertor.java index 1932af12162..9c22e04a9cb 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/QueryConvertor.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/QueryConvertor.java @@ -505,7 +505,17 @@ private static SubstringFilter parseSubstringFilter(Ma if (preliminaryParsingOnly) { return null; } else { - return SubstringFilter.createSubstring(itemPath, (PrismProperty) item, matchingRule, anchorStart, anchorEnd); + List values = item.getValues(); + Object realValue; + if (values == null || values.isEmpty()) { + realValue = null; // TODO throw an exception? + } else if (values.size() > 1) { + throw new IllegalArgumentException("Expected at most 1 value, got " + values); + } else { + realValue = ((PrismPropertyValue) values.get(0)).getValue(); + } + return SubstringFilter.createSubstring(itemPath, (PrismPropertyDefinition) itemDefinition, + prismContext, matchingRule, realValue, anchorStart, anchorEnd); } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/OrgFilter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/OrgFilter.java index ef4c47e56f4..30b87629cba 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/OrgFilter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/OrgFilter.java @@ -34,12 +34,12 @@ public enum Scope { private Scope scope; private boolean root; - public OrgFilter(PrismReferenceValue baseOrgRef, Scope scope) { + private OrgFilter(PrismReferenceValue baseOrgRef, Scope scope) { this.baseOrgRef = baseOrgRef; this.scope = scope != null ? scope : Scope.SUBTREE; } - public OrgFilter() { + private OrgFilter() { } public static OrgFilter createOrg(PrismReferenceValue baseOrgRef, Scope scope) { diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/PropertyValueFilter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/PropertyValueFilter.java index 1156cddb74f..615aff6b81b 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/PropertyValueFilter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/PropertyValueFilter.java @@ -74,18 +74,10 @@ protected PropertyValueFilter(@NotNull ItemPath path, @Nullable ItemDefinition d this(path, definition, matchingRule, (List) null); } - PropertyValueFilter(@NotNull ItemPath path, @Nullable ItemDefinition definition, @Nullable ExpressionWrapper expression) { - this(path, definition, null, null, expression); - } - PropertyValueFilter(@NotNull ItemPath path, @Nullable ItemDefinition definition, @Nullable ExpressionWrapper expression, @Nullable List values) { this(path, definition, null, values, expression); } - PropertyValueFilter(ItemPath path, ItemDefinition definition, QName matchingRule, ExpressionWrapper expression) { - this(path, definition, matchingRule, null, expression); - } - static protected List> createPropertyList(@NotNull PrismPropertyDefinition itemDefinition, @Nullable PrismPropertyValue pValue) { List> pValues = new ArrayList<>(); if (pValue == null) { @@ -120,6 +112,14 @@ static List> createPropertyListFromArray(PrismContext pris return pVals; } + static List> createPropertyListFromValue(PrismContext prismContext, Object value) { + List> pVals = new ArrayList<>(); + if (value != null) { + addToPrismValues((List) pVals, prismContext, value); + } + return pVals; + } + // static List> createPropertyListFromCollection(PrismContext prismContext, Collection realValues) { // List> pVals = new ArrayList<>(); // for (T realValue : realValues) { diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/RefFilter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/RefFilter.java index 1137ba088ab..356a5dc4f3d 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/RefFilter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/RefFilter.java @@ -32,16 +32,12 @@ private RefFilter(ItemPath path, PrismReferenceDefinition definition, Expression super(path, definition, expression, values); } - private RefFilter(ItemPath path, PrismReferenceDefinition definition, ExpressionWrapper expression) { - super(path, definition, expression, null); - } - public static RefFilter createReferenceEqual(ItemPath path, PrismReferenceDefinition definition, Collection values) { return new RefFilter(path, definition, null, values != null ? new ArrayList<>(values) : null); } public static RefFilter createReferenceEqual(ItemPath path, PrismReferenceDefinition definition, ExpressionWrapper expression) { - return new RefFilter(path, definition, expression); + return new RefFilter(path, definition, expression, null); } @Override diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/SubstringFilter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/SubstringFilter.java index ccc0049342d..0542a846776 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/SubstringFilter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/SubstringFilter.java @@ -18,10 +18,8 @@ import com.evolveum.midpoint.prism.Item; import com.evolveum.midpoint.prism.ItemDefinition; -import com.evolveum.midpoint.prism.Objectable; import com.evolveum.midpoint.prism.PrismContainerValue; import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.PrismProperty; import com.evolveum.midpoint.prism.PrismPropertyDefinition; import com.evolveum.midpoint.prism.PrismPropertyValue; import com.evolveum.midpoint.prism.PrismReferenceValue; @@ -30,7 +28,8 @@ import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.util.DebugUtil; import com.evolveum.midpoint.util.exception.SchemaException; -import org.apache.commons.lang.Validate; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import javax.xml.namespace.QName; import java.util.Iterator; @@ -39,109 +38,30 @@ import java.util.regex.Pattern; public class SubstringFilter extends PropertyValueFilter> { - - private boolean anchorStart = false; - private boolean anchorEnd = false; - SubstringFilter(ItemPath parentPath, ItemDefinition definition, QName matchingRule, List> value) { - super(parentPath, definition, matchingRule, value); - } - - SubstringFilter(ItemPath parentPath, ItemDefinition definition, QName matchingRule) { - super(parentPath, definition, matchingRule); - } - - SubstringFilter(ItemPath parentPath, ItemDefinition definition, QName matchingRule, List> value, boolean anchorStart, boolean anchorEnd) { - super(parentPath, definition, matchingRule, value); + private boolean anchorStart; + private boolean anchorEnd; + + SubstringFilter(ItemPath parentPath, ItemDefinition definition, QName matchingRule, List> values, boolean anchorStart, boolean anchorEnd) { + super(parentPath, definition, matchingRule, values); this.anchorStart = anchorStart; this.anchorEnd = anchorEnd; } - - public static SubstringFilter createSubstring(ItemPath path, PrismProperty item, QName matchingRule, - boolean anchorStart, boolean anchorEnd) { - List> values = item.getValues(); - PrismPropertyValue value; - if (values.size() > 1) { - throw new IllegalArgumentException("Expected at most 1 value, got " + values); - } else if (values.size() == 1) { - value = values.get(0).clone(); - } else { - value = null; - } - return createSubstring(path, item.getDefinition(), matchingRule, value, anchorStart, anchorEnd); - } - - public static SubstringFilter createSubstring(ItemPath path, PrismPropertyDefinition itemDefinition, QName matchingRule, T realValues) { - return createSubstring(path, itemDefinition, matchingRule, realValues, false, false); - } - public static SubstringFilter createSubstring(ItemPath path, PrismPropertyDefinition itemDefinition, QName matchingRule, T realValues, boolean anchorStart, boolean anchorEnd) { - if (realValues == null){ - return createNullSubstring(path, itemDefinition, matchingRule); - } - List> pValues = realValueToPropertyList(itemDefinition, realValues); - SubstringFilter substringFilter = new SubstringFilter(path, itemDefinition, matchingRule, pValues, anchorStart, anchorEnd); - for (PrismPropertyValue pVal: pValues) { - pVal.setParent(substringFilter); - } - return substringFilter; - } - - public static SubstringFilter createSubstring(ItemPath path, PrismPropertyDefinition itemDefinition, QName matchingRule, - PrismPropertyValue values, boolean anchorStart, boolean anchorEnd) { - Validate.notNull(path, "Item path in substring filter must not be null."); - Validate.notNull(itemDefinition, "Item definition in substring filter must not be null."); - - if (values == null){ - return createNullSubstring(path, itemDefinition, matchingRule); - } - - List> pValues = createPropertyList(itemDefinition, values); - - SubstringFilter substringFilter = new SubstringFilter<>(path, itemDefinition, matchingRule, pValues, anchorStart, anchorEnd); - for (PrismPropertyValue pVal: pValues) { - pVal.setParent(substringFilter); - } - return substringFilter; + /** + * Creates a substring filter. + * + * @param itemDefinition TODO about nullability + * @param value real value or prism property value; TODO about nullability + */ + public static SubstringFilter createSubstring(@NotNull ItemPath path, @Nullable PrismPropertyDefinition itemDefinition, + @NotNull PrismContext prismContext, + @Nullable QName matchingRule, Object value, boolean anchorStart, boolean anchorEnd) { + List> pValues = createPropertyListFromValue(prismContext, value); + return new SubstringFilter(path, itemDefinition, matchingRule, pValues, anchorStart, anchorEnd); } - - public static SubstringFilter createSubstring(ItemPath path, Class clazz, PrismContext prismContext, T realValue) { - return createSubstring(path, clazz, prismContext, null, realValue); - } - - public static SubstringFilter createSubstring(ItemPath path, Class clazz, PrismContext prismContext, QName matchingRule, T realValue) { - - ItemDefinition itemDefinition = FilterUtils.findItemDefinition(path, clazz, prismContext); - - if (!(itemDefinition instanceof PrismPropertyDefinition)){ - throw new IllegalStateException("Bad definition. Expected property definition, but got " + itemDefinition); - } - - if (realValue == null){ - return createNullSubstring(path, (PrismPropertyDefinition) itemDefinition, matchingRule); - } - - List> pVals = realValueToPropertyList((PrismPropertyDefinition) itemDefinition, realValue); - - SubstringFilter substringFilter = new SubstringFilter<>(path, itemDefinition, matchingRule, pVals); - for (PrismPropertyValue pVal: pVals) { - pVal.setParent(substringFilter); - } - return substringFilter; - } - - public static SubstringFilter createSubstring(QName propertyName, Class clazz, PrismContext prismContext, String value) { - return createSubstring(propertyName, clazz, prismContext, null, value); - } - public static SubstringFilter createSubstring(QName propertyName, Class clazz, PrismContext prismContext, QName matchingRule, String value) { - return createSubstring(new ItemPath(propertyName), clazz, prismContext, matchingRule, value); - } - - private static SubstringFilter createNullSubstring(ItemPath itemPath, PrismPropertyDefinition propertyDef, QName matchingRule){ - return new SubstringFilter<>(itemPath, propertyDef, matchingRule); - - } + // TODO expression based substring filter public boolean isAnchorStart() { return anchorStart; @@ -151,25 +71,9 @@ public boolean isAnchorEnd() { return anchorEnd; } - public void setAnchorStart(boolean anchorStart) { - this.anchorStart = anchorStart; - } - - public void setAnchorEnd(boolean anchorEnd) { - this.anchorEnd = anchorEnd; - } - @Override public SubstringFilter clone() { - List> clonedValues = getCloneValuesList(); - SubstringFilter filter = new SubstringFilter<>(getFullPath(), getDefinition(), getMatchingRule(), clonedValues); - for (PrismPropertyValue clonedValue: clonedValues) { - clonedValue.setParent(filter); - } - filter.anchorStart = anchorStart; - filter.anchorEnd = anchorEnd; - - return filter; + return new SubstringFilter<>(getFullPath(), getDefinition(), getMatchingRule(), getCloneValuesList(), anchorStart, anchorEnd); } @Override diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/R_AtomicFilter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/R_AtomicFilter.java index 6cdec61fa9b..1fadc0bfa8c 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/R_AtomicFilter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/R_AtomicFilter.java @@ -179,7 +179,7 @@ public S_RightHandItemEntry le() { @Override public S_MatchingRuleEntry startsWith(Object value) { - return new R_AtomicFilter(this, SubstringFilter.createSubstring(itemPath, propertyDefinition, null, value, true, false)); + return new R_AtomicFilter(this, SubstringFilter.createSubstring(itemPath, propertyDefinition, owner.getPrismContext(), null, value, true, false)); } @Override @@ -194,7 +194,7 @@ public S_MatchingRuleEntry startsWithPoly(String orig) { @Override public S_MatchingRuleEntry endsWith(Object value) { - return new R_AtomicFilter(this, SubstringFilter.createSubstring(itemPath, propertyDefinition, null, value, false, true)); + return new R_AtomicFilter(this, SubstringFilter.createSubstring(itemPath, propertyDefinition, owner.getPrismContext(), null, value, false, true)); } @Override @@ -209,7 +209,7 @@ public S_MatchingRuleEntry endsWithPoly(String orig) { @Override public S_MatchingRuleEntry contains(Object value) { - return new R_AtomicFilter(this, SubstringFilter.createSubstring(itemPath, propertyDefinition, null, value, false, false)); + return new R_AtomicFilter(this, SubstringFilter.createSubstring(itemPath, propertyDefinition, owner.getPrismContext(), null, value, false, false)); } @Override diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/R_Filter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/R_Filter.java index 9704b76f9c9..3ab3441e023 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/R_Filter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/R_Filter.java @@ -235,6 +235,16 @@ public S_AtomicFilterExit isChildOf(String oid) { return addSubfilter(orgFilter); } + @Override + public S_AtomicFilterExit isInScopeOf(String oid, OrgFilter.Scope scope) { + return addSubfilter(OrgFilter.createOrg(oid, scope)); + } + + @Override + public S_AtomicFilterExit isInScopeOf(PrismReferenceValue value, OrgFilter.Scope scope) { + return addSubfilter(OrgFilter.createOrg(value, scope)); + } + @Override public S_AtomicFilterExit isParentOf(String oid) { OrgFilter orgFilter = OrgFilter.createOrg(oid, OrgFilter.Scope.ANCESTORS); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/S_AtomicFilterEntry.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/S_AtomicFilterEntry.java index 1050a770130..160096c4953 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/S_AtomicFilterEntry.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/S_AtomicFilterEntry.java @@ -18,6 +18,7 @@ import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.path.ItemPath; +import com.evolveum.midpoint.prism.query.OrgFilter; import javax.xml.namespace.QName; @@ -35,16 +36,18 @@ public interface S_AtomicFilterEntry { S_ConditionEntry item(PrismContainerDefinition containerDefinition, QName... names); S_ConditionEntry item(PrismContainerDefinition containerDefinition, ItemPath itemPath); S_MatchingRuleEntry itemAs(PrismProperty property); // experimental; TODO choose better name for this method - S_AtomicFilterExit id(String... identifiers) ; - S_AtomicFilterExit id(long... identifiers) ; - S_AtomicFilterExit ownerId(String... identifiers) ; - S_AtomicFilterExit ownerId(long... identifiers) ; - S_AtomicFilterExit isDirectChildOf(PrismReferenceValue value) ; - S_AtomicFilterExit isChildOf(PrismReferenceValue value) ; - S_AtomicFilterExit isDirectChildOf(String oid) ; - S_AtomicFilterExit isChildOf(String oid) ; - S_AtomicFilterExit isParentOf(PrismReferenceValue value) ; // reference should point to OrgType - S_AtomicFilterExit isParentOf(String oid) ; // oid should be of an OrgType + S_AtomicFilterExit id(String... identifiers); + S_AtomicFilterExit id(long... identifiers); + S_AtomicFilterExit ownerId(String... identifiers); + S_AtomicFilterExit ownerId(long... identifiers); + S_AtomicFilterExit isDirectChildOf(PrismReferenceValue value); + S_AtomicFilterExit isChildOf(PrismReferenceValue value); + S_AtomicFilterExit isDirectChildOf(String oid); + S_AtomicFilterExit isChildOf(String oid); + S_AtomicFilterExit isParentOf(PrismReferenceValue value); // reference should point to OrgType + S_AtomicFilterExit isParentOf(String oid); // oid should be of an OrgType + S_AtomicFilterExit isInScopeOf(String oid, OrgFilter.Scope scope); + S_AtomicFilterExit isInScopeOf(PrismReferenceValue value, OrgFilter.Scope scope); S_AtomicFilterExit isRoot() ; S_FilterEntryOrEmpty block(); S_FilterEntryOrEmpty type(Class type) ; diff --git a/infra/prism/src/test/java/com/evolveum/midpoint/prism/query/TestQueryBuilder.java b/infra/prism/src/test/java/com/evolveum/midpoint/prism/query/TestQueryBuilder.java index 4e5c0ee06d2..ba3286e3faa 100644 --- a/infra/prism/src/test/java/com/evolveum/midpoint/prism/query/TestQueryBuilder.java +++ b/infra/prism/src/test/java/com/evolveum/midpoint/prism/query/TestQueryBuilder.java @@ -350,6 +350,7 @@ public void test150ExistsWithEquals() throws Exception{ SubstringFilter.createSubstring( new ItemPath(AssignmentType.F_DESCRIPTION), assCtd.findPropertyDefinition(AssignmentType.F_DESCRIPTION), + getPrismContext(), null, "desc1", true, false) ) ); @@ -371,6 +372,7 @@ public void test151ExistsWithEquals2() throws Exception{ SubstringFilter.createSubstring( new ItemPath(AssignmentType.F_NOTE), assCtd.findPropertyDefinition(AssignmentType.F_NOTE), + getPrismContext(), null, "DONE.", false, true) ) ); @@ -394,6 +396,7 @@ public void test152ExistsWithEqualsInBlock() throws Exception{ SubstringFilter.createSubstring( new ItemPath(AssignmentType.F_NOTE), assCtd.findPropertyDefinition(AssignmentType.F_NOTE), + getPrismContext(), null, "DONE.", false, true) ) ); @@ -419,6 +422,7 @@ public void test154ExistsWithEqualsAndAllInBlock() throws Exception{ SubstringFilter.createSubstring( new ItemPath(AssignmentType.F_NOTE), assCtd.findPropertyDefinition(AssignmentType.F_NOTE), + getPrismContext(), null, "DONE.", false, true ), AllFilter.createAll() diff --git a/model/model-test/src/main/java/com/evolveum/midpoint/model/test/AbstractModelIntegrationTest.java b/model/model-test/src/main/java/com/evolveum/midpoint/model/test/AbstractModelIntegrationTest.java index b8968884d6b..39f37e6e2b6 100644 --- a/model/model-test/src/main/java/com/evolveum/midpoint/model/test/AbstractModelIntegrationTest.java +++ b/model/model-test/src/main/java/com/evolveum/midpoint/model/test/AbstractModelIntegrationTest.java @@ -1479,10 +1479,9 @@ protected void assertSubOrgs(PrismObject baseOrg, int expected) throws } protected List> getSubOrgs(String baseOrgOid, Task task, OperationResult result) throws SchemaException, ObjectNotFoundException, SecurityViolationException, CommunicationException, ConfigurationException { - ObjectQuery query = new ObjectQuery(); - PrismReferenceValue baseOrgRef = new PrismReferenceValue(baseOrgOid); - ObjectFilter filter = OrgFilter.createOrg(baseOrgRef, OrgFilter.Scope.ONE_LEVEL); - query.setFilter(filter); + ObjectQuery query = QueryBuilder.queryFor(OrgType.class, prismContext) + .isDirectChildOf(baseOrgOid) + .build(); return modelService.searchObjects(OrgType.class, query, null, task, result); } @@ -1908,8 +1907,9 @@ protected void purgeResourceSchema(String resourceOid) throws ObjectAlreadyExist } protected List> searchOrg(String baseOrgOid, OrgFilter.Scope scope, Task task, OperationResult result) throws SchemaException, ObjectNotFoundException, SecurityViolationException, CommunicationException, ConfigurationException { - ObjectFilter filter = OrgFilter.createOrg(baseOrgOid, scope); - ObjectQuery query = ObjectQuery.createObjectQuery(filter); + ObjectQuery query = QueryBuilder.queryFor(OrgType.class, prismContext) + .isInScopeOf(baseOrgOid, scope) + .build(); return modelService.searchObjects(OrgType.class, query, null, task, result); } diff --git a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/OrgStructTest.java b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/OrgStructTest.java index f2bbd952fe2..045e5c16842 100644 --- a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/OrgStructTest.java +++ b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/OrgStructTest.java @@ -543,9 +543,10 @@ public void test007searchOrgStructOrgDepth() throws Exception { session.getTransaction().commit(); session.close(); - ObjectQuery objectQuery = ObjectQuery.createObjectQuery(OrgFilter.createOrg(SEARCH_ORG_OID_DEPTH1, OrgFilter.Scope.ONE_LEVEL)); - objectQuery.setPaging(ObjectPaging.createPaging(null, null, ObjectType.F_NAME, OrderDirection.ASCENDING)); - + ObjectQuery objectQuery = QueryBuilder.queryFor(ObjectType.class, prismContext) + .isDirectChildOf(SEARCH_ORG_OID_DEPTH1) + .asc(ObjectType.F_NAME) + .build(); List> sOrgClosure = repositoryService.searchObjects(ObjectType.class, objectQuery, null, parentResult); for (PrismObject u : sOrgClosure) { @@ -600,12 +601,10 @@ public void test011OrgFilter() throws Exception { TestUtil.displayTestTile(TEST_NAME); OperationResult opResult = new OperationResult(TEST_NAME); - ObjectQuery query = new ObjectQuery(); - PrismReferenceValue baseOrgRef = new PrismReferenceValue(ORG_F001_OID); - ObjectFilter filter = OrgFilter.createOrg(baseOrgRef, OrgFilter.Scope.ONE_LEVEL); - ObjectPaging paging = ObjectPaging.createPaging(null, null, ObjectType.F_NAME, null); - query.setFilter(filter); - query.setPaging(paging); + ObjectQuery query = QueryBuilder.queryFor(ObjectType.class, prismContext) + .isDirectChildOf(ORG_F001_OID) + .asc(ObjectType.F_NAME) + .build(); // WHEN List> orgClosure = repositoryService.searchObjects(ObjectType.class, query, null, opResult); diff --git a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/QueryInterpreter2Test.java b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/QueryInterpreter2Test.java index 49bbf509fe4..62b3f113673 100644 --- a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/QueryInterpreter2Test.java +++ b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/QueryInterpreter2Test.java @@ -2075,10 +2075,9 @@ public void test530queryUserSubstringName() throws Exception { Session session = open(); try { - SubstringFilter substring = SubstringFilter.createSubstring(F_NAME, ObjectType.class, - prismContext, PolyStringOrigMatchingRule.NAME, "a"); - substring.setAnchorStart(true); - ObjectQuery objectQuery = ObjectQuery.createObjectQuery(substring); + ObjectQuery objectQuery = QueryBuilder.queryFor(ObjectType.class, prismContext) + .item(F_NAME).startsWith("a").matchingOrig() + .build(); objectQuery.setUseNewQueryInterpreter(true); String real = getInterpretedQuery2(session, ObjectType.class, objectQuery); @@ -2100,9 +2099,9 @@ public void test530queryUserSubstringName() throws Exception { int count = repositoryService.countObjects(ObjectType.class, objectQuery, result); assertEquals(2, count); - substring = SubstringFilter.createSubstring(F_NAME, ObjectType.class, - prismContext, PolyStringOrigMatchingRule.NAME, "a"); - objectQuery = ObjectQuery.createObjectQuery(substring); + objectQuery = QueryBuilder.queryFor(ObjectType.class, prismContext) + .item(F_NAME).containsPoly("a").matchingOrig() + .build(); objectQuery.setUseNewQueryInterpreter(true); count = repositoryService.countObjects(ObjectType.class, objectQuery, result); assertEquals(20, count); @@ -2974,10 +2973,9 @@ public void test750DereferenceLink() throws Exception { * ### UserType: linkRef/@/name contains 'test.com' */ - ObjectFilter filter = SubstringFilter.createSubstring( - new ItemPath(UserType.F_LINK_REF, PrismConstants.T_OBJECT_REFERENCE, F_NAME), - UserType.class, prismContext, "test.com"); - ObjectQuery query = ObjectQuery.createObjectQuery(filter); + ObjectQuery query = QueryBuilder.queryFor(UserType.class, prismContext) + .item(UserType.F_LINK_REF, PrismConstants.T_OBJECT_REFERENCE, F_NAME).containsPoly("test.com") + .build(); String real = getInterpretedQuery2(session, UserType.class, query); String expected = "select\n" + @@ -3012,12 +3010,11 @@ public void test752DereferenceLinkedResourceName() throws Exception { * ### UserType: linkRef/@/resourceRef/@/name contains 'CSV' (norm) */ - ObjectFilter filter = SubstringFilter.createSubstring( - new ItemPath(UserType.F_LINK_REF, PrismConstants.T_OBJECT_REFERENCE, + ObjectQuery query = QueryBuilder.queryFor(UserType.class, prismContext) + .item(UserType.F_LINK_REF, PrismConstants.T_OBJECT_REFERENCE, ShadowType.F_RESOURCE_REF, PrismConstants.T_OBJECT_REFERENCE, - F_NAME), - UserType.class, prismContext, PolyStringNormMatchingRule.NAME, "CSV"); - ObjectQuery query = ObjectQuery.createObjectQuery(filter); + F_NAME).containsPoly("CSV").matchingNorm() + .build(); String real = getInterpretedQuery2(session, UserType.class, query); String expected = "select\n" + From 24d0516121c52d585abd14b555fa0973205bdcb1 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Wed, 12 Oct 2016 22:52:55 +0200 Subject: [PATCH 30/74] Continuing filters cleanup. --- .../assignment/AssignmentEditorPanel.java | 2 +- infra/prism/pom.xml | 2 +- .../com/evolveum/midpoint/prism/Itemable.java | 10 +- .../prism/marshaller/QueryConvertor.java | 29 +- .../midpoint/prism/query/AllFilter.java | 2 +- .../midpoint/prism/query/AndFilter.java | 25 +- .../prism/query/ComparativeFilter.java | 59 +-- .../midpoint/prism/query/EqualFilter.java | 147 +++--- .../midpoint/prism/query/ExistsFilter.java | 24 +- .../midpoint/prism/query/GreaterFilter.java | 145 ++---- .../midpoint/prism/query/InFilter.java | 108 ----- .../midpoint/prism/query/LessFilter.java | 153 ++---- .../midpoint/prism/query/NotFilter.java | 6 +- .../midpoint/prism/query/ObjectFilter.java | 11 +- .../midpoint/prism/query/ObjectQuery.java | 1 + .../midpoint/prism/query/OrFilter.java | 8 +- .../midpoint/prism/query/OrgFilter.java | 12 - .../prism/query/PropertyValueFilter.java | 452 +++--------------- .../midpoint/prism/query/RefFilter.java | 62 +-- .../midpoint/prism/query/SubstringFilter.java | 94 +--- .../midpoint/prism/query/TypeFilter.java | 11 +- .../prism/query/UnaryLogicalFilter.java | 9 +- .../midpoint/prism/query/ValueFilter.java | 434 ++++++++++++++--- .../prism/query/builder/R_AtomicFilter.java | 51 +- .../prism/query/TestQueryBuilder.java | 2 +- .../midpoint/schema/util/ObjectQueryUtil.java | 5 +- .../com/evolveum/midpoint/util/MiscUtil.java | 12 + .../common/expression/ExpressionUtil.java | 2 +- .../impl/sync/ReconciliationTaskHandler.java | 44 +- .../trigger/TriggerScannerTaskHandler.java | 6 +- .../report/impl/ReportManagerImpl.java | 80 ++-- .../provisioning/impl/ShadowCache.java | 104 +--- .../provisioning/impl/ShadowManager.java | 4 - .../ucf/query/ValueOperation.java | 12 - .../midpoint/repo/sql/ModifyTest.java | 9 +- .../midpoint/repo/sql/OrgStructTest.java | 13 +- .../repo/sql/QueryInterpreter2Test.java | 182 +------ .../sql/closure/AbstractOrgClosureTest.java | 13 +- .../security/impl/SecurityEnforcerImpl.java | 20 +- .../quartzimpl/TaskManagerQuartzImpl.java | 25 +- 40 files changed, 861 insertions(+), 1529 deletions(-) delete mode 100644 infra/prism/src/main/java/com/evolveum/midpoint/prism/query/InFilter.java diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorPanel.java index 07b41a38bd8..527f72d1c0c 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorPanel.java @@ -582,7 +582,7 @@ private WebMarkupContainer createOrgContainer() { protected ObjectQuery getChooseQuery() { return QueryBuilder.queryFor(OrgType.class, getPageBase().getPrismContext()) .item(OrgType.F_TENANT).eq(false) - .or().item(OrgType.F_TENANT).eq(null) + .or().item(OrgType.F_TENANT).isNull() .build(); } diff --git a/infra/prism/pom.xml b/infra/prism/pom.xml index 4fcd220ad3e..5a234425281 100644 --- a/infra/prism/pom.xml +++ b/infra/prism/pom.xml @@ -60,7 +60,7 @@ org.apache.commons commons-lang3 - + org.apache.santuario xmlsec diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/Itemable.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/Itemable.java index 3697920dc6a..e48e00474a3 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/Itemable.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/Itemable.java @@ -24,18 +24,20 @@ * * Currently provides common abstraction on top of Item and ItemDelta, as both can hold values and * construct them in a similar way. + * + * Also used for ValueFilter, although semantics of e.g. getPath() is quite different in this case. * * @author Radovan Semancik * */ public interface Itemable { - public QName getElementName(); + QName getElementName(); - public ItemDefinition getDefinition(); + ItemDefinition getDefinition(); - public PrismContext getPrismContext(); + PrismContext getPrismContext(); - public ItemPath getPath(); + ItemPath getPath(); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/QueryConvertor.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/QueryConvertor.java index 9c22e04a9cb..0533aec6eff 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/QueryConvertor.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/QueryConvertor.java @@ -278,7 +278,7 @@ private static ObjectFilter parseComparisonFilter(QN ItemPath rightSidePath = getPath(clauseXMap, ELEMENT_RIGHT_HAND_SIDE_PATH); ItemDefinition itemDefinition = locateItemDefinition(valueXnode, itemPath, pcd, prismContext); - if (itemDefinition != null){ + if (itemDefinition != null) { itemName = itemDefinition.getName(); } @@ -299,9 +299,10 @@ private static ObjectFilter parseComparisonFilter(QN PrismPropertyValue propertyValue = (PrismPropertyValue) item.getValue(0); propertyValue.clearParent(); if (isGt || isGtEq) { - return GreaterFilter.createGreater(itemPath, pcd, propertyValue, isGtEq); + return GreaterFilter.createGreater(itemPath, (PrismPropertyDefinition) itemDefinition, isGtEq, prismContext, propertyValue); } else { - return LessFilter.createLess(itemPath, pcd, propertyValue, isLtEq); + return LessFilter.createLess(itemPath, (PrismPropertyDefinition) itemDefinition, prismContext, + propertyValue, isLtEq); } } } else if (rightSidePath != null) { @@ -312,9 +313,11 @@ private static ObjectFilter parseComparisonFilter(QN if (isEq) { return EqualFilter.createEqual(itemPath, (PrismPropertyDefinition) itemDefinition, matchingRule, rightSidePath, rightSideDefinition); } else if (isGt || isGtEq) { - return GreaterFilter.createGreater(itemPath, (PrismPropertyDefinition) itemDefinition, rightSidePath, rightSideDefinition, isGtEq); + return GreaterFilter.createGreater(itemPath, (PrismPropertyDefinition) itemDefinition, rightSidePath, + rightSideDefinition, isGtEq); } else { - return LessFilter.createLess(itemPath, (PrismPropertyDefinition) itemDefinition, rightSidePath, rightSideDefinition, isLtEq); + return LessFilter.createLess(itemPath, (PrismPropertyDefinition) itemDefinition, rightSidePath, + rightSideDefinition, isLtEq); } } } else { @@ -331,9 +334,11 @@ private static ObjectFilter parseComparisonFilter(QN if (isEq) { return EqualFilter.createEqual(itemPath, (PrismPropertyDefinition) itemDefinition, matchingRule, expressionWrapper); } else if (isGt || isGtEq) { - return GreaterFilter.createGreater(itemPath, (PrismPropertyDefinition) itemDefinition, expressionWrapper, isGtEq); + return GreaterFilter.createGreater(itemPath, (PrismPropertyDefinition) itemDefinition, + expressionWrapper, isGtEq); } else { - return LessFilter.createLess(itemPath, (PrismPropertyDefinition) itemDefinition, expressionWrapper, isLtEq); + return LessFilter.createLess(itemPath, (PrismPropertyDefinition) itemDefinition, expressionWrapper, + isLtEq); } } } else { @@ -343,7 +348,7 @@ private static ObjectFilter parseComparisonFilter(QN if (preliminaryParsingOnly) { return null; } else { - return EqualFilter.createEqual(itemPath, (PrismPropertyDefinition) itemDefinition, matchingRule, prismContext); + return EqualFilter.createEqual(itemPath, (PrismPropertyDefinition) itemDefinition, matchingRule); } } } @@ -738,7 +743,7 @@ private static MapXNode serializeInOidFilter(InOidFilter filter, XNodeSerializer return createFilter(CLAUSE_IN_OID, clauseMap); } - private static MapXNode serializeComparisonFilter(PropertyValueFilter filter, XNodeSerializer xnodeSerializer) throws SchemaException{ + private static MapXNode serializeComparisonFilter(PropertyValueFilter filter, XNodeSerializer xnodeSerializer) throws SchemaException{ MapXNode map = new MapXNode(); QName clause; if (filter instanceof EqualFilter) { @@ -754,15 +759,15 @@ private static MapXNode serializeComparisonFilter(Propert return map; } - private static MapXNode serializeValueFilter(PropertyValueFilter filter, XNodeSerializer xnodeSerializer) throws SchemaException { + private static MapXNode serializeValueFilter(ValueFilter filter, XNodeSerializer xnodeSerializer) throws SchemaException { MapXNode map = new MapXNode(); serializeMatchingRule(filter, map); serializePath(map, filter.getFullPath(), filter); - List values = filter.getValues(); + List values = filter.getValues(); if (values != null) { ListXNode valuesNode = new ListXNode(); - for (T val : values) { + for (V val : values) { if (val.getParent() == null) { val.setParent(filter); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/AllFilter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/AllFilter.java index 0b83cfbf861..e7f1eeb0877 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/AllFilter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/AllFilter.java @@ -40,6 +40,7 @@ public static AllFilter createAll() { return new AllFilter(); } + @SuppressWarnings("CloneDoesntCallSuperClone") @Override public AllFilter clone() { return new AllFilter(); @@ -61,7 +62,6 @@ public String debugDump(int indent) { DebugUtil.indentDebugDump(sb, indent); sb.append("ALL"); return sb.toString(); - } @Override diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/AndFilter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/AndFilter.java index 641327bda3a..7fd581d6432 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/AndFilter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/AndFilter.java @@ -16,20 +16,17 @@ package com.evolveum.midpoint.prism.query; -import java.util.ArrayList; -import java.util.List; - -import javax.xml.namespace.QName; - -import com.evolveum.midpoint.prism.Containerable; -import com.evolveum.midpoint.prism.Objectable; import com.evolveum.midpoint.prism.PrismConstants; import com.evolveum.midpoint.prism.PrismContainerValue; -import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.match.MatchingRuleRegistry; import com.evolveum.midpoint.util.DebugUtil; import com.evolveum.midpoint.util.exception.SchemaException; +import javax.xml.namespace.QName; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + public class AndFilter extends NaryLogicalFilter { public static final QName ELEMENT_NAME = new QName(PrismConstants.NS_QUERY, "and"); @@ -39,11 +36,8 @@ public AndFilter(List condition) { } public static AndFilter createAnd(ObjectFilter... conditions){ - List filters = new ArrayList(); - for (ObjectFilter condition : conditions){ - filters.add(condition); - } - + List filters = new ArrayList<>(conditions.length); + Collections.addAll(filters, conditions); return new AndFilter(filters); } @@ -51,6 +45,7 @@ public static AndFilter createAnd(List conditions){ return new AndFilter(conditions); } + @SuppressWarnings("CloneDoesntCallSuperClone") @Override public AndFilter clone() { return new AndFilter(getClonedConditions()); @@ -75,9 +70,7 @@ public String debugDump(int indent) { sb.append("\n"); sb.append(filter.debugDump(indent + 1)); } - return sb.toString(); - } @Override @@ -87,7 +80,7 @@ public String toString() { sb.append("("); for (int i = 0; i < getConditions().size(); i++){ sb.append(getConditions().get(i)); - if (i != getConditions().size() -1){ + if (i != getConditions().size() - 1) { sb.append(","); } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/ComparativeFilter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/ComparativeFilter.java index 2ea3404d483..e242af652f8 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/ComparativeFilter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/ComparativeFilter.java @@ -16,24 +16,31 @@ package com.evolveum.midpoint.prism.query; +import java.util.Collections; import java.util.List; +import java.util.Objects; -import com.evolveum.midpoint.prism.ItemDefinition; -import com.evolveum.midpoint.prism.PrismPropertyDefinition; -import com.evolveum.midpoint.prism.PrismPropertyValue; +import com.evolveum.midpoint.prism.*; +import com.evolveum.midpoint.prism.match.MatchingRuleRegistry; import com.evolveum.midpoint.prism.path.ItemPath; +import com.evolveum.midpoint.util.exception.SchemaException; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; -public abstract class ComparativeFilter extends PropertyValueFilter> { +import javax.xml.namespace.QName; + +public abstract class ComparativeFilter extends PropertyValueFilter { private boolean equals; - - ComparativeFilter(ItemPath path, PrismPropertyDefinition definition, PrismPropertyValue value, boolean equals) { - super(path, definition, value); - this.equals = equals; - } - public ComparativeFilter(ItemPath path, PrismPropertyDefinition definition, ItemPath rightSidePath, ItemDefinition rightSideDefinition, boolean equals) { - super(path, definition, null, rightSidePath, rightSideDefinition); + ComparativeFilter(@NotNull ItemPath path, + @Nullable PrismPropertyDefinition definition, + @Nullable PrismPropertyValue value, + @Nullable ExpressionWrapper expression, @Nullable ItemPath rightHandSidePath, + @Nullable ItemDefinition rightHandSideDefinition, boolean equals) { + super(path, definition, null, + value != null ? Collections.singletonList(value) : null, + expression, rightHandSidePath, rightHandSideDefinition); this.equals = equals; } @@ -44,19 +51,17 @@ public boolean isEquals() { public void setEquals(boolean equals) { this.equals = equals; } - - static PrismPropertyValue createPropertyValue(PrismPropertyDefinition itemDefinition, T realValue){ - List> values = realValueToPropertyList(itemDefinition, realValue); - if (values == null || values.isEmpty()){ + + @Nullable + static PrismPropertyValue anyValueToPropertyValue(@NotNull PrismContext prismContext, Object value) { + List> values = anyValueToPropertyValueList(prismContext, value); + if (values.isEmpty()) { return null; + } else if (values.size() > 1) { + throw new UnsupportedOperationException("Comparative filter with more than one value is not supported"); + } else { + return values.iterator().next(); } - - if (values.size() > 1 ){ - throw new UnsupportedOperationException("Greater filter with more than one value is not supported"); - } - - return values.iterator().next(); - } @Override @@ -67,17 +72,17 @@ public boolean equals(Object o, boolean exact) { return false; if (!super.equals(o, exact)) return false; - ComparativeFilter that = (ComparativeFilter) o; - return equals == that.equals; + } + @Override + public boolean match(PrismContainerValue value, MatchingRuleRegistry matchingRuleRegistry) throws SchemaException { + throw new UnsupportedOperationException("Matching object and greater/less filter is not supported yet"); } @Override public int hashCode() { - int result = super.hashCode(); - result = 31 * result + (equals ? 1 : 0); - return result; + return Objects.hash(super.hashCode(), equals); } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/EqualFilter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/EqualFilter.java index 2ac2e6cc565..35a748388b6 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/EqualFilter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/EqualFilter.java @@ -16,109 +16,98 @@ package com.evolveum.midpoint.prism.query; -import java.util.Collection; -import java.util.List; - -import javax.xml.namespace.QName; - -import com.evolveum.midpoint.prism.ItemDefinition; -import com.evolveum.midpoint.prism.PrismContainerValue; +import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.match.MatchingRule; import com.evolveum.midpoint.prism.match.MatchingRuleRegistry; - -import com.evolveum.midpoint.prism.Containerable; -import com.evolveum.midpoint.prism.Item; -import com.evolveum.midpoint.prism.Itemable; -import com.evolveum.midpoint.prism.PrismConstants; -import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.PrismProperty; -import com.evolveum.midpoint.prism.PrismPropertyDefinition; -import com.evolveum.midpoint.prism.PrismPropertyValue; import com.evolveum.midpoint.prism.path.ItemPath; -import com.evolveum.midpoint.util.DebugUtil; import com.evolveum.midpoint.util.exception.SchemaException; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -public class EqualFilter extends PropertyValueFilter> implements Itemable { +import javax.xml.namespace.QName; +import java.util.List; + +public class EqualFilter extends PropertyValueFilter implements Itemable { private static final long serialVersionUID = 3284478412180258355L; public static final QName ELEMENT_NAME = new QName(PrismConstants.NS_QUERY, "equal"); - private EqualFilter(@NotNull ItemPath fullPath, PrismPropertyDefinition definition, QName matchingRule, - @NotNull ItemPath rightSidePath, ItemDefinition rightSideDefinition) { - super(fullPath, definition, matchingRule, rightSidePath, rightSideDefinition); - } - - private EqualFilter(@NotNull ItemPath fullPath, PrismPropertyDefinition definition, QName matchingRule, - List> values, ExpressionWrapper expression) { - super(fullPath, definition, matchingRule, values, expression); - } - - //factory methods - // Do not require definition. We may want queries for which the definition is supplied later. - - // right-side-related - @NotNull - public static EqualFilter createEqual(ItemPath propertyPath, PrismPropertyDefinition propertyDefinition, QName matchingRule, ItemPath rightSidePath, ItemDefinition rightSideDefinition) { - return new EqualFilter<>(propertyPath, propertyDefinition, matchingRule, rightSidePath, rightSideDefinition); - } - - // expression-related + /* + * The pattern for factory methods and constructors signatures is: + * - path and definition + * - matching rule (if applicable) + * - values (incl. prismContext if needed) + * - expressionWrapper + * - right hand things + * - filter-specific flags (equal, anchors) + * + * Ordering of methods: + * - constructor + * - factory methods: [null], value(s), expression, right-side + * - match + * - equals + * + * Parent for prism values is set in the appropriate constructor; so there's no need to do that at other places. + * + * Normalization of "Object"-typed values is done in anyArrayToXXX and anyValueToXXX methods. This includes cloning + * of values that have a parent (note that we recompute the PolyString values as part of conversion process; if that's + * a problem for the client, it has to do cloning itself). + * + * Please respect these conventions in order to make these classes understandable and maintainable. + */ + + public EqualFilter(@NotNull ItemPath path, @Nullable PrismPropertyDefinition definition, + @Nullable QName matchingRule, + @Nullable List> prismPropertyValues, + @Nullable ExpressionWrapper expression, @Nullable ItemPath rightHandSidePath, + @Nullable ItemDefinition rightHandSideDefinition) { + super(path, definition, matchingRule, prismPropertyValues, expression, rightHandSidePath, rightHandSideDefinition); + } + + // factory methods + + // empty (different from values as it generates filter with null 'values' attribute) @NotNull - public static EqualFilter createEqual(@NotNull ItemPath path, @Nullable PrismPropertyDefinition definition, - @Nullable QName matchingRule, @Nullable ExpressionWrapper expression) { - return new EqualFilter<>(path, definition, matchingRule, null, expression); + public static EqualFilter createEqual(@NotNull ItemPath path, @NotNull PrismPropertyDefinition definition, + @Nullable QName matchingRule) { + return new EqualFilter(path, definition, matchingRule, null, null, null, null); } // values @NotNull public static EqualFilter createEqual(@NotNull ItemPath path, @NotNull PrismPropertyDefinition definition, @Nullable QName matchingRule, @NotNull PrismContext prismContext, Object... values) { - return new EqualFilter(path, definition, matchingRule, (List) createPropertyListFromArray(prismContext, values), null); + List> propertyValues = anyArrayToPropertyValueList(prismContext, values); + return new EqualFilter(path, definition, matchingRule, propertyValues, null, null, null); } - @Override - public EqualFilter clone() { - EqualFilter clone = new EqualFilter<>(getFullPath(), getDefinition(), getMatchingRule(), getCloneValuesList(), getExpression()); - clone.copyRightSideThingsFrom(this); - return clone; - } - - @Override - public String debugDump() { - return debugDump(0); + // expression-related + @NotNull + public static EqualFilter createEqual(@NotNull ItemPath path, @Nullable PrismPropertyDefinition definition, + @Nullable QName matchingRule, @NotNull ExpressionWrapper expression) { + return new EqualFilter<>(path, definition, matchingRule, null, expression, null, null); } - @Override - public String debugDump(int indent) { - StringBuilder sb = new StringBuilder(); - DebugUtil.indentDebugDump(sb, indent); - sb.append("EQUAL:"); - return debugDump(indent, sb); - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append("EQUAL: "); - return toString(sb); + // right-side-related; right side can be supplied later (therefore it's nullable) + @NotNull + public static EqualFilter createEqual(@NotNull ItemPath propertyPath, PrismPropertyDefinition propertyDefinition, + QName matchingRule, @NotNull ItemPath rightSidePath, ItemDefinition rightSideDefinition) { + return new EqualFilter<>(propertyPath, propertyDefinition, matchingRule, null, null, rightSidePath, rightSideDefinition); } + @SuppressWarnings("CloneDoesntCallSuperClone") @Override - public PrismContext getPrismContext() { - PrismPropertyDefinition def = getDefinition(); - if (def == null) { - return null; - } - return def.getPrismContext(); + public EqualFilter clone() { + return new EqualFilter<>(getFullPath(), getDefinition(), getMatchingRule(), getClonedValues(), + getExpression(), getRightHandSidePath(), getRightHandSideDefinition()); } @Override - public ItemPath getPath() { - return getFullPath(); + protected String getFilterName() { + return "EQUAL"; } + // TODO revise @Override public boolean match(PrismContainerValue cvalue, MatchingRuleRegistry matchingRuleRegistry) throws SchemaException { Item filterItem = getFilterItem(); @@ -172,19 +161,9 @@ private boolean isInFilterItem(PrismPropertyValue v, Item filterItem, MatchingRu return false; } - @Override - public PrismPropertyDefinition getDefinition(){ - return (PrismPropertyDefinition) super.getDefinition(); - } - - @Override - public List> getValues() { - return super.getValues(); - } - @Override public boolean equals(Object obj, boolean exact) { - return super.equals(obj, exact) && obj instanceof EqualFilter; + return obj instanceof EqualFilter && super.equals(obj, exact); } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/ExistsFilter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/ExistsFilter.java index 3a2bdc9e891..a2723d22f68 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/ExistsFilter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/ExistsFilter.java @@ -16,19 +16,13 @@ package com.evolveum.midpoint.prism.query; -import com.evolveum.midpoint.prism.Containerable; -import com.evolveum.midpoint.prism.ItemDefinition; -import com.evolveum.midpoint.prism.PrismContainerDefinition; -import com.evolveum.midpoint.prism.PrismContainerValue; -import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.PrismPropertyDefinition; +import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.match.MatchingRuleRegistry; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.util.DebugUtil; import com.evolveum.midpoint.util.PrettyPrinter; import com.evolveum.midpoint.util.exception.SchemaException; - -import javax.xml.namespace.QName; +import org.jetbrains.annotations.NotNull; /** * TODO think about creating abstract ItemFilter (ItemRelatedFilter) for this filter and ValueFilter. @@ -38,18 +32,19 @@ */ public class ExistsFilter extends ObjectFilter { - private ItemPath fullPath; + @NotNull private final ItemPath fullPath; private ItemDefinition definition; private ObjectFilter filter; - public ExistsFilter(ItemPath fullPath, ItemDefinition definition, ObjectFilter filter) { + public ExistsFilter(@NotNull ItemPath fullPath, ItemDefinition definition, ObjectFilter filter) { this.fullPath = fullPath; this.definition = definition; this.filter = filter; checkConsistence(true); } - public ItemPath getFullPath() { + @NotNull + public ItemPath getFullPath() { return fullPath; } @@ -77,7 +72,8 @@ public static ExistsFilter createExists(ItemPath itemP return new ExistsFilter(itemPath, itemDefinition, filter); } - @Override + @SuppressWarnings("CloneDoesntCallSuperClone") + @Override public ObjectFilter clone() { ObjectFilter f = filter != null ? filter.clone() : null; return new ExistsFilter(fullPath, definition, f); @@ -94,7 +90,7 @@ public boolean match(PrismContainerValue value, MatchingRuleRegistry matchingRul @Override public void checkConsistence(boolean requireDefinitions) { - if (fullPath == null || fullPath.isEmpty()) { + if (fullPath.isEmpty()) { throw new IllegalArgumentException("Null or empty path in "+this); } if (requireDefinitions && definition == null) { @@ -160,7 +156,7 @@ public boolean equals(Object o, boolean exact) { ExistsFilter that = (ExistsFilter) o; - if (fullPath != null ? !fullPath.equals(that.fullPath, exact) : that.fullPath != null) + if (!fullPath.equals(that.fullPath, exact)) return false; if (exact) { if (definition != null ? !definition.equals(that.definition) : that.definition != null) diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/GreaterFilter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/GreaterFilter.java index d989a58e5a5..c8085bf03ce 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/GreaterFilter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/GreaterFilter.java @@ -15,14 +15,9 @@ */ package com.evolveum.midpoint.prism.query; -import javax.xml.namespace.QName; - -import com.evolveum.midpoint.prism.Containerable; import com.evolveum.midpoint.prism.ItemDefinition; -import com.evolveum.midpoint.prism.PrismContainerDefinition; import com.evolveum.midpoint.prism.PrismContainerValue; -import com.evolveum.midpoint.prism.Objectable; import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismPropertyDefinition; import com.evolveum.midpoint.prism.PrismPropertyValue; @@ -30,132 +25,62 @@ import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.util.DebugUtil; import com.evolveum.midpoint.util.exception.SchemaException; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; public class GreaterFilter extends ComparativeFilter { - - GreaterFilter(ItemPath itemPath, PrismPropertyDefinition definition, PrismPropertyValue value, boolean equals) { - super(itemPath, definition, value, equals); - } - - GreaterFilter(ItemPath itemPath, PrismPropertyDefinition definition, ItemPath rightSidePath, ItemDefinition rightSideDefinition, boolean equals) { - super(itemPath, definition, rightSidePath, rightSideDefinition, equals); - } - - public static GreaterFilter createGreater(ItemPath itemPath, PrismPropertyDefinition definition, PrismPropertyValue value, boolean equals){ - GreaterFilter greaterFilter = new GreaterFilter<>(itemPath, definition, value, equals); - if (value != null) { - value.setParent(greaterFilter); - } - return greaterFilter; - } - - public static GreaterFilter createGreater(ItemPath itemPath, PrismContainerDefinition containerDef, - PrismPropertyValue value, boolean equals) throws SchemaException { - PrismPropertyDefinition def = (PrismPropertyDefinition) FilterUtils.findItemDefinition(itemPath, containerDef); - GreaterFilter greaterFilter = createGreater(itemPath, def, value, equals); - if (value != null) { - value.setParent(greaterFilter); - } - return greaterFilter; - } - public static GreaterFilter createGreater(ItemPath itemPath, PrismPropertyDefinition itemDefinition, T realValue, boolean equals) { - PrismPropertyValue value = createPropertyValue(itemDefinition, realValue); - - if (value == null){ - //TODO: create null - } - - GreaterFilter greaterFilter = createGreater(itemPath, itemDefinition, value, equals); - value.setParent(greaterFilter); - return greaterFilter; + public GreaterFilter(@NotNull ItemPath path, @Nullable PrismPropertyDefinition definition, + @Nullable PrismPropertyValue prismPropertyValue, + @Nullable ExpressionWrapper expression, @Nullable ItemPath rightHandSidePath, + @Nullable ItemDefinition rightHandSideDefinition, boolean equals) { + super(path, definition, prismPropertyValue, expression, rightHandSidePath, rightHandSideDefinition, equals); } - public static GreaterFilter createGreater(ItemPath itemPath, PrismContainerDefinition containerDef, - T realValue, boolean equals) throws SchemaException { - PrismPropertyDefinition def = (PrismPropertyDefinition) FilterUtils.findItemDefinition(itemPath, containerDef); - return createGreater(itemPath, def, realValue, equals); - } - - public static GreaterFilter createGreater(QName propertyName, Class type, PrismContext prismContext, T realValue, boolean equals) - throws SchemaException { - return createGreater(new ItemPath(propertyName), type, prismContext, realValue, equals); - } - - public static GreaterFilter createGreater(ItemPath path, Class type, PrismContext prismContext, T realValue, boolean equals) - throws SchemaException { - - PrismPropertyDefinition def = (PrismPropertyDefinition) FilterUtils.findItemDefinition(path, type, prismContext); - - return createGreater(path, def, realValue, equals); - } + // factory methods - public static GreaterFilter createGreater(ItemPath propertyPath, PrismPropertyDefinition propertyDefinition, ItemPath rightSidePath, ItemDefinition rightSideDefinition, boolean equals) { - return new GreaterFilter(propertyPath, propertyDefinition, rightSidePath, rightSideDefinition, equals); - } - - @Override - public GreaterFilter clone() { - PrismPropertyValue clonedValue = null; - PrismPropertyValue value = getSingleValue(); - if (value != null) { - clonedValue = value.clone(); - } - GreaterFilter clone = new GreaterFilter<>(getFullPath(), getDefinition(), clonedValue, isEquals()); - if (clonedValue != null) { - clonedValue.setParent(clone); - } - clone.copyRightSideThingsFrom(this); - return clone; + // empty (can be filled-in later) + @NotNull + public static GreaterFilter createGreater(@NotNull ItemPath itemPath, PrismPropertyDefinition definition, boolean equals) { + return new GreaterFilter(itemPath, definition, null, null, null, null, equals); } - @Override - public String debugDump() { - return debugDump(0); + // value + @NotNull + public static GreaterFilter createGreater(@NotNull ItemPath itemPath, PrismPropertyDefinition definition, + boolean equals, @NotNull PrismContext prismContext, Object anyValue) { + PrismPropertyValue propertyValue = anyValueToPropertyValue(prismContext, anyValue); + return new GreaterFilter(itemPath, definition, propertyValue, null, null, null, equals); } - @Override - public String debugDump(int indent) { - StringBuilder sb = new StringBuilder(); - DebugUtil.indentDebugDump(sb, indent); - sb.append("GREATER:"); - return debugDump(indent, sb); - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append("GREATER: "); - return toString(sb); + // expression-related + @NotNull + public static GreaterFilter createGreater(@NotNull ItemPath itemPath, PrismPropertyDefinition definition, + @NotNull ExpressionWrapper wrapper, boolean equals) { + return new GreaterFilter<>(itemPath, definition, null, wrapper, null, null, equals); } - @Override - public boolean match(PrismContainerValue value, MatchingRuleRegistry matchingRuleRegistry) throws SchemaException { - throw new UnsupportedOperationException("Matching object and greater filter not supported yet"); - } - - @Override - public PrismPropertyDefinition getDefinition() { - return (PrismPropertyDefinition) super.getDefinition(); + // right-side-related + @NotNull + public static GreaterFilter createGreater(@NotNull ItemPath propertyPath, PrismPropertyDefinition definition, + @NotNull ItemPath rightSidePath, ItemDefinition rightSideDefinition, boolean equals) { + return new GreaterFilter<>(propertyPath, definition, null, null, rightSidePath, rightSideDefinition, equals); } + @SuppressWarnings("CloneDoesntCallSuperClone") @Override - public PrismContext getPrismContext() { - return getDefinition().getPrismContext(); + public GreaterFilter clone() { + return new GreaterFilter(getFullPath(), getDefinition(), getClonedValue(), getExpression(), + getRightHandSidePath(), getRightHandSideDefinition(), isEquals()); } @Override - public ItemPath getPath() { - return getFullPath(); - } - - public static GreaterFilter createGreaterThanItem(ItemPath itemPath, PrismPropertyDefinition propertyDefinition, ItemPath rightSidePath, ItemDefinition rightSideDefinition, boolean equals) { - return new GreaterFilter<>(itemPath, propertyDefinition, rightSidePath, rightSideDefinition, equals); + protected String getFilterName() { + return "GREATER"; } @Override public boolean equals(Object obj, boolean exact) { - return super.equals(obj, exact) && obj instanceof GreaterFilter; + return obj instanceof GreaterFilter && super.equals(obj, exact); } - } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/InFilter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/InFilter.java deleted file mode 100644 index 35ad6ad2c7f..00000000000 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/InFilter.java +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Copyright (c) 2010-2014 Evolveum - * - * 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 com.evolveum.midpoint.prism.query; - -import java.util.List; - -import javax.xml.namespace.QName; - -import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.PrismPropertyDefinition; -import com.evolveum.midpoint.prism.PrismPropertyValue; -import com.evolveum.midpoint.prism.path.ItemPath; -import com.evolveum.midpoint.util.DebugUtil; - -@Deprecated // deprecated because of confusing name/semantics; see https://wiki.evolveum.com/display/midPoint/Query+API+Evolution -public class InFilter extends PropertyValueFilter { - - InFilter(ItemPath path, PrismPropertyDefinition definition, QName matchingRule, List values ) { - super(path, definition, matchingRule, values); - } - - public static InFilter createIn(ItemPath path, PrismPropertyDefinition definition, QName matchingRule, V values){ - - List> pVals = realValueToPropertyList(definition, values); - - return new InFilter(path, definition, matchingRule, pVals); - } - - - public static InFilter createIn(ItemPath path, PrismPropertyDefinition definition, QName matchingRule, PrismPropertyValue... values) { - - List> pVals = createPropertyList(definition, values); - - return new InFilter(path, definition, matchingRule, pVals); - } - - public static InFilter createIn(ItemPath path, PrismPropertyDefinition definition, PrismPropertyValue... values) { - return createIn(path, definition, null, values); - } - - public static InFilter createIn(ItemPath path, Class type, PrismContext prismContext, QName matchingRule, V values) { - - PrismPropertyDefinition definition = (PrismPropertyDefinition) FilterUtils.findItemDefinition(path, type, prismContext); - return createIn(path, definition, null, values); - } - - - - @Override - public PrismContext getPrismContext() { - return getDefinition().getPrismContext(); - } - - @Override - public ItemPath getPath() { - return getFullPath(); - } - - @Override - public String debugDump() { - return debugDump(0); - } - - @Override - public String debugDump(int indent) { - StringBuilder sb = new StringBuilder(); - DebugUtil.indentDebugDump(sb, indent); - sb.append("IN: "); - return debugDump(indent, sb); - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append("IN: "); - return toString(sb); - } - - @Override - public InFilter clone() { - return new InFilter(getFullPath(), getDefinition(),getMatchingRule(), getValues()); - } - - @Override - public PrismPropertyDefinition getDefinition() { - return (PrismPropertyDefinition) super.getDefinition(); - } - - @Override - public boolean equals(Object obj, boolean exact) { - return super.equals(obj, exact) && obj instanceof InFilter; - } - -} diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/LessFilter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/LessFilter.java index c58dd73a215..546a55f86ae 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/LessFilter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/LessFilter.java @@ -16,153 +16,66 @@ package com.evolveum.midpoint.prism.query; -import javax.xml.namespace.QName; - -import com.evolveum.midpoint.prism.Containerable; import com.evolveum.midpoint.prism.ItemDefinition; -import com.evolveum.midpoint.prism.Objectable; -import com.evolveum.midpoint.prism.PrismContainerDefinition; -import com.evolveum.midpoint.prism.PrismContainerValue; import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismPropertyDefinition; import com.evolveum.midpoint.prism.PrismPropertyValue; -import com.evolveum.midpoint.prism.match.MatchingRuleRegistry; import com.evolveum.midpoint.prism.path.ItemPath; -import com.evolveum.midpoint.util.DebugUtil; -import com.evolveum.midpoint.util.exception.SchemaException; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; public class LessFilter extends ComparativeFilter { - LessFilter(ItemPath itemPath, PrismPropertyDefinition definition, PrismPropertyValue value, boolean equals) { - super(itemPath, definition, value, equals); - } - - LessFilter(ItemPath itemPath, PrismPropertyDefinition definition, ItemPath rightSidePath, ItemDefinition rightSideDefinition, boolean equals) { - super(itemPath, definition, rightSidePath, rightSideDefinition, equals); - } - - public static LessFilter createLess(QName itemPath, PrismPropertyDefinition definition, PrismPropertyValue value, boolean equals){ - LessFilter lessFilter = new LessFilter<>(new ItemPath(itemPath), definition, value, equals); - if (value != null) { - value.setParent(lessFilter); - } - return lessFilter; - } - - public static LessFilter createLess(ItemPath itemPath, PrismPropertyDefinition definition, PrismPropertyValue value, boolean equals){ - LessFilter lessFilter = new LessFilter<>(itemPath, definition, value, equals); - if (value != null) { - value.setParent(lessFilter); - } - return lessFilter; - } - - public static LessFilter createLess(ItemPath itemPath, PrismContainerDefinition containerDef, - PrismPropertyValue value, boolean equals) throws SchemaException { - PrismPropertyDefinition def = (PrismPropertyDefinition) FilterUtils.findItemDefinition(itemPath, containerDef); - return createLess(itemPath, def, value, equals); + public LessFilter(@NotNull ItemPath path, @Nullable PrismPropertyDefinition definition, + @Nullable PrismPropertyValue value, @Nullable ExpressionWrapper expression, + @Nullable ItemPath rightHandSidePath, @Nullable ItemDefinition rightHandSideDefinition, boolean equals) { + super(path, definition, value, expression, rightHandSidePath, rightHandSideDefinition, equals); } - public static LessFilter createLess(QName itemPath, PrismPropertyDefinition itemDefinition, T realValue, boolean equals) { - return createLess(new ItemPath(itemPath), itemDefinition, realValue, equals); - } - - public static LessFilter createLess(ItemPath itemPath, PrismPropertyDefinition itemDefinition, T realValue, boolean equals) { - PrismPropertyValue value = createPropertyValue(itemDefinition, realValue); - - if (value == null){ - // create null filter - } - - return createLess(itemPath, itemDefinition, value, equals); - } + // factory methods - public static LessFilter createLessThanItem(ItemPath itemPath, PrismPropertyDefinition propertyDefinition, ItemPath rightSidePath, ItemDefinition rightSideDefinition, boolean equals) { - return new LessFilter<>(itemPath, propertyDefinition, rightSidePath, rightSideDefinition, equals); + // empty (can be filled-in later) + @NotNull + public static LessFilter createLess(@NotNull ItemPath itemPath, PrismPropertyDefinition definition, boolean equals) { + return new LessFilter(itemPath, definition, null, null, null, null, equals); } - public static LessFilter createLess(ItemPath itemPath, PrismContainerDefinition containerDef, - T realValue, boolean equals) throws SchemaException { - PrismPropertyDefinition def = (PrismPropertyDefinition) FilterUtils.findItemDefinition(itemPath, containerDef); - return createLess(itemPath, def, realValue, equals); + // value + @NotNull + public static LessFilter createLess(@NotNull ItemPath itemPath, PrismPropertyDefinition definition, + @NotNull PrismContext prismContext, Object anyValue, boolean equals) { + PrismPropertyValue propertyValue = anyValueToPropertyValue(prismContext, anyValue); + return new LessFilter(itemPath, definition, propertyValue, null, null, null, equals); } - public static LessFilter createLess(QName propertyName, Class type, PrismContext prismContext, T realValue, boolean equals) - throws SchemaException { - return createLess(new ItemPath(propertyName), type, prismContext, realValue, equals); - } - - public static LessFilter createLess(ItemPath path, Class type, PrismContext prismContext, T realValue, boolean equals) - throws SchemaException { - - PrismPropertyDefinition def = (PrismPropertyDefinition) FilterUtils.findItemDefinition(path, type, prismContext); - - return createLess(path, def, realValue, equals); + // expression-related + @NotNull + public static LessFilter createLess(@NotNull ItemPath itemPath, PrismPropertyDefinition itemDefinition, + @NotNull ExpressionWrapper wrapper, boolean equals) { + return new LessFilter<>(itemPath, itemDefinition, null, wrapper, null, null, equals); } - public static LessFilter createLess(ItemPath propertyPath, PrismPropertyDefinition propertyDefinition, ItemPath rightSidePath, ItemDefinition rightSideDefinition, boolean equals) { - return new LessFilter<>(propertyPath, propertyDefinition, rightSidePath, rightSideDefinition, equals); + // right-side-related + @NotNull + public static LessFilter createLess(@NotNull ItemPath propertyPath, PrismPropertyDefinition definition, + @NotNull ItemPath rightSidePath, ItemDefinition rightSideDefinition, boolean equals) { + return new LessFilter<>(propertyPath, definition, null, null, rightSidePath, rightSideDefinition, equals); } + @SuppressWarnings("CloneDoesntCallSuperClone") @Override public LessFilter clone() { - PrismPropertyValue clonedValue = null; - PrismPropertyValue value = getSingleValue(); - if (value != null) { - clonedValue = value.clone(); - } - LessFilter clone = new LessFilter<>(getFullPath(), getDefinition(), clonedValue, isEquals()); - if (clonedValue != null) { - clonedValue.setParent(clone); - } - clone.copyRightSideThingsFrom(this); - return clone; - } - - @Override - public String debugDump() { - return debugDump(0); - } - - @Override - public String debugDump(int indent) { - StringBuilder sb = new StringBuilder(); - DebugUtil.indentDebugDump(sb, indent); - sb.append("LESS:"); - return debugDump(indent, sb); - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append("LESS: "); - return toString(sb); - } - - @Override - public boolean match(PrismContainerValue value, MatchingRuleRegistry matchingRuleRegistry) throws SchemaException { - throw new UnsupportedOperationException("Matching object and less filter not supported yet"); - } - - @Override - public PrismPropertyDefinition getDefinition() { - return (PrismPropertyDefinition) super.getDefinition(); + return new LessFilter(getFullPath(), getDefinition(), getClonedValue(), getExpression(), + getRightHandSidePath(), getRightHandSideDefinition(), isEquals()); } @Override - public PrismContext getPrismContext() { - return getDefinition().getPrismContext(); - } - - @Override - public ItemPath getPath() { - return getFullPath(); + protected String getFilterName() { + return "LESS"; } @Override public boolean equals(Object obj, boolean exact) { - return super.equals(obj, exact) && obj instanceof LessFilter; + return obj instanceof LessFilter && super.equals(obj, exact); } - - } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/NotFilter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/NotFilter.java index 77321630c4f..e8c4f79bf70 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/NotFilter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/NotFilter.java @@ -32,10 +32,7 @@ public class NotFilter extends UnaryLogicalFilter { -// private ObjectFilter filter; - public NotFilter() { - } public NotFilter(ObjectFilter filter) { @@ -46,6 +43,7 @@ public static NotFilter createNot(ObjectFilter filter) { return new NotFilter(filter); } + @SuppressWarnings("CloneDoesntCallSuperClone") @Override public NotFilter clone() { return new NotFilter(getFilter().clone()); @@ -70,9 +68,7 @@ public String debugDump(int indent) { sb.append("\n"); sb.append(getFilter().debugDump(indent + 1)); } - return sb.toString(); - } @Override diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/ObjectFilter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/ObjectFilter.java index 6b555a4c673..a35c675aef1 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/ObjectFilter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/ObjectFilter.java @@ -27,11 +27,10 @@ import com.evolveum.midpoint.util.exception.SchemaException; public abstract class ObjectFilter implements DebugDumpable, Serializable, Revivable { - - ObjectFilter() { - // Nothing to do - } - + + /** + * Does a SHALLOW clone. + */ public abstract ObjectFilter clone(); public abstract boolean match(PrismContainerValue value, MatchingRuleRegistry matchingRuleRegistry) throws SchemaException; @@ -41,7 +40,7 @@ public void accept(Visitor visitor) { } @Override - public void revive(final PrismContext prismContext) throws SchemaException { + public void revive(PrismContext prismContext) throws SchemaException { QueryConvertor.revive(this, prismContext); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/ObjectQuery.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/ObjectQuery.java index f5cde569b33..19570e63bd0 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/ObjectQuery.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/ObjectQuery.java @@ -209,6 +209,7 @@ public Integer getMaxSize() { return paging.getMaxSize(); } + @SuppressWarnings("EqualsWhichDoesntCheckParameterClass") public boolean equals(Object o) { return equals(o, true); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/OrFilter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/OrFilter.java index 137a40cda76..a2f97bf1eec 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/OrFilter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/OrFilter.java @@ -17,6 +17,7 @@ package com.evolveum.midpoint.prism.query; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import com.evolveum.midpoint.prism.Containerable; @@ -33,13 +34,9 @@ public OrFilter(List condition) { super(condition); } - public static OrFilter createOr(ObjectFilter... conditions){ List filters = new ArrayList(); - for (ObjectFilter condition : conditions){ - filters.add(condition); - } - + Collections.addAll(filters, conditions); return new OrFilter(filters); } @@ -47,6 +44,7 @@ public static OrFilter createOr(List conditions){ return new OrFilter(conditions); } + @SuppressWarnings("CloneDoesntCallSuperClone") @Override public OrFilter clone() { return new OrFilter(getClonedConditions()); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/OrgFilter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/OrgFilter.java index 30b87629cba..f8e657681c1 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/OrgFilter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/OrgFilter.java @@ -50,10 +50,6 @@ public static OrgFilter createOrg(String baseOrgOid, Scope scope) { return new OrgFilter(new PrismReferenceValue(baseOrgOid), scope); } - public static OrgFilter createOrg(String baseOrgRef) { - return new OrgFilter(new PrismReferenceValue(baseOrgRef), Scope.SUBTREE); - } - public static OrgFilter createRootOrg() { OrgFilter filter = new OrgFilter(); filter.setRoot(true); @@ -64,18 +60,10 @@ public PrismReferenceValue getOrgRef() { return baseOrgRef; } - public void setOrgRef(PrismReferenceValue baseOrgRef) { - this.baseOrgRef = baseOrgRef; - } - public Scope getScope() { return scope; } - public void setScope(Scope scope) { - this.scope = scope; - } - private void setRoot(boolean root) { this.root = root; } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/PropertyValueFilter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/PropertyValueFilter.java index 615aff6b81b..5b43e02dc10 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/PropertyValueFilter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/PropertyValueFilter.java @@ -32,87 +32,51 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -public abstract class PropertyValueFilter extends ValueFilter implements Itemable { - - private ExpressionWrapper expression; - private List values; - private ItemPath rightHandSidePath; // alternative to "values" - private ItemDefinition rightHandSideDefinition; // optional (needed only if path points to extension item) - - /* - * TODO clean up the right side path/definition mess - */ - - PropertyValueFilter(@NotNull ItemPath path, @Nullable ItemDefinition definition, @Nullable QName matchingRule, - @NotNull ItemPath rightHandSidePath, @Nullable ItemDefinition rightHandSideDefinition) { - super(path, definition, matchingRule); - this.rightHandSidePath = rightHandSidePath; - this.rightHandSideDefinition = rightHandSideDefinition; - } - - protected PropertyValueFilter(@NotNull ItemPath path, @Nullable ItemDefinition definition, @Nullable QName matchingRule, - @Nullable List values, @Nullable ExpressionWrapper expression) { - super(path, definition, matchingRule); - if (values != null) { - for (V value : values) { - value.setParent(this); - } - } - this.values = values; - this.expression = expression; - } - - PropertyValueFilter(@NotNull ItemPath path, @Nullable ItemDefinition definition, @Nullable QName matchingRule, @Nullable List values) { - this(path, definition, matchingRule, values, null); - } - - PropertyValueFilter(@NotNull ItemPath path, @Nullable ItemDefinition definition, @Nullable V value) { - this(path, definition, (QName) null, value != null ? Collections.singletonList(value) : null); - } - - PropertyValueFilter(@NotNull ItemPath path, @Nullable ItemDefinition definition, @Nullable QName matchingRule) { - this(path, definition, matchingRule, (List) null); - } - - PropertyValueFilter(@NotNull ItemPath path, @Nullable ItemDefinition definition, @Nullable ExpressionWrapper expression, @Nullable List values) { - this(path, definition, null, values, expression); - } - - static protected List> createPropertyList(@NotNull PrismPropertyDefinition itemDefinition, @Nullable PrismPropertyValue pValue) { - List> pValues = new ArrayList<>(); - if (pValue == null) { - return pValues; - } else { - PrismUtil.recomputePrismPropertyValue(pValue, itemDefinition.getPrismContext()); - pValues.add(pValue); - return pValues; - } - } - - static List> createPropertyList(PrismPropertyDefinition itemDefinition, PrismPropertyValue[] values) { - Validate.notNull(itemDefinition, "Item definition in substring filter must not be null."); - - List> pValues = new ArrayList>(); - - for (PrismPropertyValue val : values){ - PrismUtil.recomputePrismPropertyValue(val, itemDefinition.getPrismContext()); - pValues.add(val); - } - - return pValues; - } +public abstract class PropertyValueFilter extends ValueFilter, PrismPropertyDefinition> implements Itemable { + + PropertyValueFilter(@NotNull ItemPath path, @Nullable PrismPropertyDefinition definition, @Nullable QName matchingRule, + @Nullable List> values, @Nullable ExpressionWrapper expression, + @Nullable ItemPath rightHandSidePath, @Nullable ItemDefinition rightHandSideDefinition) { + super(path, definition, matchingRule, values, expression, rightHandSidePath, rightHandSideDefinition); + } + +// static protected List> createPropertyList(@NotNull PrismPropertyDefinition itemDefinition, @Nullable PrismPropertyValue pValue) { +// List> pValues = new ArrayList<>(); +// if (pValue == null) { +// return pValues; +// } else { +// PrismUtil.recomputePrismPropertyValue(pValue, itemDefinition.getPrismContext()); +// pValues.add(pValue); +// return pValues; +// } +// } +// +// static List> createPropertyList(PrismPropertyDefinition itemDefinition, PrismPropertyValue[] values) { +// Validate.notNull(itemDefinition, "Item definition in substring filter must not be null."); +// +// List> pValues = new ArrayList>(); +// +// for (PrismPropertyValue val : values){ +// PrismUtil.recomputePrismPropertyValue(val, itemDefinition.getPrismContext()); +// pValues.add(val); +// } +// +// return pValues; +// } - static List> createPropertyListFromArray(PrismContext prismContext, Object[] values) { - List> pVals = new ArrayList<>(); + @NotNull + static List> anyArrayToPropertyValueList(PrismContext prismContext, Object[] values) { + List> pVals = new ArrayList<>(); if (values != null) { for (Object value : values) { - addToPrismValues(pVals, prismContext, value); + addToPrismValues((List) pVals, prismContext, value); } } return pVals; } - static List> createPropertyListFromValue(PrismContext prismContext, Object value) { + @NotNull + static List> anyValueToPropertyValueList(PrismContext prismContext, Object value) { List> pVals = new ArrayList<>(); if (value != null) { addToPrismValues((List) pVals, prismContext, value); @@ -120,14 +84,6 @@ static List> createPropertyListFromValue(PrismContext return pVals; } -// static List> createPropertyListFromCollection(PrismContext prismContext, Collection realValues) { -// List> pVals = new ArrayList<>(); -// for (T realValue : realValues) { -// addToPrismValues(pVals, realValue, prismContext); -// } -// return pVals; -// } - private static void addToPrismValues(List> pVals, PrismContext prismContext, Object value) { if (value == null) { return; @@ -155,313 +111,43 @@ private static void addToPrismValues(List> pVals, PrismCon pVals.add(pVal); } - static List> realValueToPropertyList(PrismPropertyDefinition itemDefinition, T realValue) { - List> pVals = new ArrayList<>(); - if (realValue == null) { - return pVals; - } - - if (realValue.getClass() != null && Collection.class.isAssignableFrom(realValue.getClass())) { - for (Object o : (Iterable)realValue){ - if (o instanceof PrismPropertyValue){ - PrismPropertyValue pVal = (PrismPropertyValue) o; - PrismUtil.recomputePrismPropertyValue(pVal, itemDefinition.getPrismContext()); - pVals.add(pVal); - }else{ - // TODO what's this??? - pVals.addAll(PrismPropertyValue.createCollection((Collection) realValue)); - } - } - - } else { - PrismUtil.recomputeRealValue(realValue, itemDefinition.getPrismContext()); - pVals.add(new PrismPropertyValue(realValue)); - } - return pVals; - } - - public List getValues() { - return values; - } - - public V getSingleValue() { - if (values == null || values.isEmpty()) { - return null; - } - if (values.size() > 1) { - throw new IllegalArgumentException("Filter '" + this + "' should contain at most one value, but it has " + values.size() + " of them."); - } - return values.iterator().next(); - } - - public void setValue(V value) { - List values = new ArrayList(); - if (value != null) { - value.setParent(this); - values.add(value); - } - this.values = values; - } - - protected void cloneValues(PropertyValueFilter clone) { - clone.values = getCloneValuesList(); - if (clone.values != null) { - for (V clonedValue: clone.values) { - clonedValue.setParent(clone); - } - } - } - - protected List getCloneValuesList() { - if (values == null) { - return null; - } - List clonedValues = new ArrayList(values.size()); - for(V value: values) { - clonedValues.add((V) value.clone()); - } - return clonedValues; - } - - public Item getObjectItem(PrismContainerValue value){ - ItemPath path = getFullPath(); - return value.findItem(path); - } - - public Item getFilterItem() throws SchemaException{ - - if (getDefinition() == null){ - throw new SchemaException("Could not find definition for item " + getPath()); - } - Item filterItem = getDefinition().instantiate(); - if (getValues() != null && !getValues().isEmpty()) { - try { - for (PrismValue v : getValues()){ - filterItem.add(v.clone()); - } - } catch (SchemaException e) { - throw new IllegalArgumentException(e.getMessage(), e); - } - } - - return filterItem; - } - - public ItemPath getRightHandSidePath() { - return rightHandSidePath; - } - - public ItemDefinition getRightHandSideDefinition() { - return rightHandSideDefinition; - } - - public void setRightHandSidePath(ItemPath rightHandSidePath) { - this.rightHandSidePath = rightHandSidePath; - if (rightHandSidePath != null) { - values = null; - } - } - - public void setRightHandSideDefinition(ItemDefinition rightHandSideDefinition) { - this.rightHandSideDefinition = rightHandSideDefinition; - } - - public ExpressionWrapper getExpression() { - return expression; - } - - public void setExpression(ExpressionWrapper expression) { - this.expression = expression; - } - - @Override - public void checkConsistence(boolean requireDefinitions) { - super.checkConsistence(requireDefinitions); - if (values == null) { - return; // this is OK, searching for item with no value - } - for (V value: values) { - if (value.getParent() != this) { - throw new IllegalArgumentException("Value "+value+" in "+this+" has a bad parent "+value.getParent()); - } - if (value == null) { - throw new IllegalArgumentException("Null value in "+this); - } - if (value.isEmpty() && !value.isRaw()) { - throw new IllegalArgumentException("Empty value in "+this); - } - } - } - - @Override - public boolean isRaw() { - if (values != null) { - for (V value: values) { - if (value.isRaw()) { - return true; - } - } - } - return false; - } - - @Override - public boolean match(PrismContainerValue cvalue, MatchingRuleRegistry matchingRuleRegistry) throws SchemaException { - - Item item = getObjectItem(cvalue); - - boolean filterItemIsEmpty = getValues() == null || getValues().isEmpty(); - boolean objectItemIsEmpty = item == null || item.isEmpty(); - - if (filterItemIsEmpty && !objectItemIsEmpty) { - return false; - } - - if (!filterItemIsEmpty && objectItemIsEmpty) { - return false; - } - - return true; - } +// static List> realValueToPropertyList(PrismPropertyDefinition itemDefinition, Object realValue) { +// List> pVals = new ArrayList<>(); +// if (realValue == null) { +// return pVals; +// } +// +// if (realValue.getClass() != null && Collection.class.isAssignableFrom(realValue.getClass())) { +// for (Object o : (Iterable)realValue){ +// if (o instanceof PrismPropertyValue){ +// PrismPropertyValue pVal = (PrismPropertyValue) o; +// PrismUtil.recomputePrismPropertyValue(pVal, itemDefinition.getPrismContext()); +// pVals.add(pVal); +// }else{ +// // TODO what's this??? +// pVals.addAll(PrismPropertyValue.createCollection((Collection) realValue)); +// } +// } +// +// } else { +// PrismUtil.recomputeRealValue(realValue, itemDefinition.getPrismContext()); +// pVals.add(new PrismPropertyValue(realValue)); +// } +// return pVals; +// } - @Override - public boolean equals(Object o) { - return equals(o, true); - } - - @Override - public boolean equals(Object o, boolean exact) { - if (this == o) - return true; - if (o == null || getClass() != o.getClass()) - return false; - if (!super.equals(o, exact)) - return false; - - PropertyValueFilter that = (PropertyValueFilter) o; - - if (expression != null ? !expression.equals(that.expression) : that.expression != null) - return false; - if (values != null ? !values.equals(that.values) : that.values != null) - return false; - if (rightHandSidePath != null ? !rightHandSidePath.equals(that.rightHandSidePath, exact) : that.rightHandSidePath != null) - return false; - if (exact) { - return rightHandSideDefinition != null ? - rightHandSideDefinition.equals(that.rightHandSideDefinition) : - that.rightHandSideDefinition == null; - } else { - return true; - } - } - @Override - public int hashCode() { - int result = super.hashCode(); - result = 31 * result + (expression != null ? expression.hashCode() : 0); - result = 31 * result + (values != null ? values.hashCode() : 0); - result = 31 * result + (rightHandSidePath != null ? rightHandSidePath.hashCode() : 0); - result = 31 * result + (rightHandSideDefinition != null ? rightHandSideDefinition.hashCode() : 0); - return result; - } - - public String debugDump(int indent, StringBuilder sb){ - if (getFullPath() != null){ - sb.append("\n"); - DebugUtil.indentDebugDump(sb, indent+1); - sb.append("PATH: "); - sb.append(getFullPath().toString()); - } - - sb.append("\n"); - DebugUtil.indentDebugDump(sb, indent+1); - sb.append("DEF: "); - if (getDefinition() != null) { - sb.append(getDefinition().toString()); - } else { - sb.append("null"); - } - - List values = getValues(); - if (values != null) { - sb.append("\n"); - DebugUtil.indentDebugDump(sb, indent+1); - sb.append("VALUE:"); - sb.append("\n"); - for (PrismValue val : getValues()) { - sb.append(DebugUtil.debugDump(val, indent + 2)); - } - } - - ExpressionWrapper expression = getExpression(); - if (expression != null && expression.getExpression() != null) { - sb.append("\n"); - DebugUtil.indentDebugDump(sb, indent+1); - sb.append("EXPRESSION:"); - sb.append("\n"); - sb.append(DebugUtil.debugDump(expression.getExpression(), indent + 2)); - } - - if (getRightHandSidePath() != null) { - sb.append("\n"); - DebugUtil.indentDebugDump(sb, indent+1); - sb.append("RIGHT SIDE PATH: "); - sb.append(getFullPath().toString()); - sb.append("\n"); - DebugUtil.indentDebugDump(sb, indent+1); - sb.append("RIGHT SIDE DEF: "); - if (getRightHandSideDefinition() != null) { - sb.append(getRightHandSideDefinition().toString()); - } else { - sb.append("null"); - } - } - - QName matchingRule = getMatchingRule(); - if (matchingRule != null) { - sb.append("\n"); - DebugUtil.indentDebugDump(sb, indent+1); - sb.append("MATCHING: "); - sb.append(matchingRule); - } - - return sb.toString(); - } - - public String toString(StringBuilder sb){ - if (getFullPath() != null){ - sb.append(getFullPath().toString()); - sb.append(","); - } - if (getValues() != null){ - for (int i = 0; i< getValues().size() ; i++){ - PrismValue value = getValues().get(i); - if (value == null) { - sb.append("null"); - } else { - sb.append(value.toString()); - } - if ( i != getValues().size() -1){ - sb.append(","); - } - } - } - if (rightHandSidePath != null) { - sb.append(getRightHandSidePath()); - } - return sb.toString(); - } +// protected void cloneValues(PropertyValueFilter clone) { +// clone.values = getCloneValuesList(); +// if (clone.values != null) { +// for (V clonedValue: clone.values) { +// clonedValue.setParent(clone); +// } +// } +// } // TODO cleanup this mess - how values are cloned, that expression is not cloned in LT/GT filter etc public abstract PropertyValueFilter clone(); - protected void copyRightSideThingsFrom(PropertyValueFilter original) { - if (original.getRightHandSidePath() != null) { - setRightHandSidePath(original.getRightHandSidePath()); - } - if (original.getRightHandSideDefinition() != null) { - setRightHandSideDefinition(original.getRightHandSideDefinition()); - } - } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/RefFilter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/RefFilter.java index 356a5dc4f3d..18c4fea831b 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/RefFilter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/RefFilter.java @@ -15,55 +15,45 @@ */ package com.evolveum.midpoint.prism.query; -import com.evolveum.midpoint.prism.*; +import com.evolveum.midpoint.prism.Item; +import com.evolveum.midpoint.prism.PrismContainerValue; +import com.evolveum.midpoint.prism.PrismReferenceDefinition; +import com.evolveum.midpoint.prism.PrismReferenceValue; import com.evolveum.midpoint.prism.match.MatchingRuleRegistry; import com.evolveum.midpoint.prism.path.ItemPath; -import com.evolveum.midpoint.util.DebugUtil; import com.evolveum.midpoint.util.exception.SchemaException; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.Collection; import java.util.List; -public class RefFilter extends PropertyValueFilter { +public class RefFilter extends ValueFilter { private static final long serialVersionUID = 1L; - private RefFilter(ItemPath path, PrismReferenceDefinition definition, ExpressionWrapper expression, List values) { - super(path, definition, expression, values); + public RefFilter(@NotNull ItemPath fullPath, @Nullable PrismReferenceDefinition definition, + @Nullable List values, @Nullable ExpressionWrapper expression) { + super(fullPath, definition, null, values, expression, null, null); } - + public static RefFilter createReferenceEqual(ItemPath path, PrismReferenceDefinition definition, Collection values) { - return new RefFilter(path, definition, null, values != null ? new ArrayList<>(values) : null); + return new RefFilter(path, definition, values != null ? new ArrayList<>(values) : null, null); } public static RefFilter createReferenceEqual(ItemPath path, PrismReferenceDefinition definition, ExpressionWrapper expression) { - return new RefFilter(path, definition, expression, null); + return new RefFilter(path, definition, null, expression); } + @SuppressWarnings("CloneDoesntCallSuperClone") @Override public RefFilter clone() { - return new RefFilter(getFullPath(), getDefinition(), getExpression(), getCloneValuesList()); - } - - @Override - public String debugDump() { - return debugDump(0); + return new RefFilter(getFullPath(), getDefinition(), getClonedValues(), getExpression()); } @Override - public String debugDump(int indent) { - StringBuilder sb = new StringBuilder(); - DebugUtil.indentDebugDump(sb, indent); - sb.append("REF:"); - - return debugDump(indent, sb); - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append("REF: "); - return toString(sb); + protected String getFilterName() { + return "REF"; } @Override @@ -113,25 +103,9 @@ private boolean isInFilterItem(PrismReferenceValue v, Item filterItem) { return false; } - @Override - public PrismContext getPrismContext() { - return getDefinition().getPrismContext(); - } - - @Override - public ItemPath getPath() { - return getFullPath(); - } - - @Override - public PrismReferenceDefinition getDefinition() { - // TODO Auto-generated method stub - return (PrismReferenceDefinition) super.getDefinition(); - } - @Override public boolean equals(Object obj, boolean exact) { - return super.equals(obj, exact) && obj instanceof RefFilter; + return obj instanceof RefFilter && super.equals(obj, exact); } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/SubstringFilter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/SubstringFilter.java index 0542a846776..21666fc8727 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/SubstringFilter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/SubstringFilter.java @@ -16,17 +16,10 @@ package com.evolveum.midpoint.prism.query; -import com.evolveum.midpoint.prism.Item; -import com.evolveum.midpoint.prism.ItemDefinition; -import com.evolveum.midpoint.prism.PrismContainerValue; -import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.PrismPropertyDefinition; -import com.evolveum.midpoint.prism.PrismPropertyValue; -import com.evolveum.midpoint.prism.PrismReferenceValue; +import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.match.MatchingRule; import com.evolveum.midpoint.prism.match.MatchingRuleRegistry; import com.evolveum.midpoint.prism.path.ItemPath; -import com.evolveum.midpoint.util.DebugUtil; import com.evolveum.midpoint.util.exception.SchemaException; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -34,16 +27,20 @@ import javax.xml.namespace.QName; import java.util.Iterator; import java.util.List; +import java.util.Objects; import java.util.Set; import java.util.regex.Pattern; -public class SubstringFilter extends PropertyValueFilter> { +public class SubstringFilter extends PropertyValueFilter { private boolean anchorStart; private boolean anchorEnd; - SubstringFilter(ItemPath parentPath, ItemDefinition definition, QName matchingRule, List> values, boolean anchorStart, boolean anchorEnd) { - super(parentPath, definition, matchingRule, values); + public SubstringFilter(@NotNull ItemPath path, @Nullable PrismPropertyDefinition definition, + @Nullable QName matchingRule, + @Nullable List> prismPropertyValues, + @Nullable ExpressionWrapper expression, boolean anchorStart, boolean anchorEnd) { + super(path, definition, matchingRule, prismPropertyValues, expression, null, null); this.anchorStart = anchorStart; this.anchorEnd = anchorEnd; } @@ -52,13 +49,13 @@ public class SubstringFilter extends PropertyValueFilter SubstringFilter createSubstring(@NotNull ItemPath path, @Nullable PrismPropertyDefinition itemDefinition, @NotNull PrismContext prismContext, - @Nullable QName matchingRule, Object value, boolean anchorStart, boolean anchorEnd) { - List> pValues = createPropertyListFromValue(prismContext, value); - return new SubstringFilter(path, itemDefinition, matchingRule, pValues, anchorStart, anchorEnd); + @Nullable QName matchingRule, Object anyValue, boolean anchorStart, boolean anchorEnd) { + List> values = anyValueToPropertyValueList(prismContext, anyValue); + return new SubstringFilter<>(path, itemDefinition, matchingRule, values, null, anchorStart, anchorEnd); } // TODO expression based substring filter @@ -73,40 +70,17 @@ public boolean isAnchorEnd() { @Override public SubstringFilter clone() { - return new SubstringFilter<>(getFullPath(), getDefinition(), getMatchingRule(), getCloneValuesList(), anchorStart, anchorEnd); + return new SubstringFilter<>(getFullPath(), getDefinition(), getMatchingRule(), getClonedValues(), + getExpression(), anchorStart, anchorEnd); } @Override - public String debugDump() { - return debugDump(0); - } - - @Override - public String debugDump(int indent) { - StringBuilder sb = new StringBuilder(); - DebugUtil.indentDebugDump(sb, indent); - sb.append("SUBSTRING:"); - if (anchorStart) { - sb.append(" anchorStart"); - } - if (anchorEnd) { - sb.append(" anchorEnd"); - } - return debugDump(indent, sb); - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append("SUBSTRING: "); - String rv = toString(sb); - if (anchorStart) { - rv += ",S"; - } - if (anchorEnd) { - rv += ",E"; - } - return rv; + protected String getFilterName() { + return "SUBSTRING(" + + (anchorStart ? "S" : "") + + (anchorStart && anchorEnd ? "," : "") + + (anchorEnd ? "E" : "") + + ")"; } @Override @@ -145,21 +119,6 @@ public boolean match(PrismContainerValue containerValue, MatchingRuleRegistry ma private Set toRealValues(){ return PrismPropertyValue.getRealValuesOfCollection(getValues()); } - - @Override - public PrismContext getPrismContext() { - return getDefinition().getPrismContext(); - } - - @Override - public ItemPath getPath() { - return getFullPath(); - } - - @Override - public PrismPropertyDefinition getDefinition() { - return (PrismPropertyDefinition) super.getDefinition(); - } @Override public boolean equals(Object o, boolean exact) { @@ -169,20 +128,13 @@ public boolean equals(Object o, boolean exact) { return false; if (!super.equals(o, exact)) return false; - SubstringFilter that = (SubstringFilter) o; - - if (anchorStart != that.anchorStart) - return false; - return anchorEnd == that.anchorEnd; - + return anchorStart == that.anchorStart && + anchorEnd == that.anchorEnd; } @Override public int hashCode() { - int result = super.hashCode(); - result = 31 * result + (anchorStart ? 1 : 0); - result = 31 * result + (anchorEnd ? 1 : 0); - return result; + return Objects.hash(super.hashCode(), anchorStart, anchorEnd); } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/TypeFilter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/TypeFilter.java index 49b98cc0154..56b0a76a086 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/TypeFilter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/TypeFilter.java @@ -24,6 +24,7 @@ import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; +import org.jetbrains.annotations.NotNull; import javax.xml.namespace.QName; @@ -34,14 +35,15 @@ public class TypeFilter extends ObjectFilter { private static final Trace LOGGER = TraceManager.getTrace(TypeFilter.class); - private QName type; + @NotNull private final QName type; private ObjectFilter filter; - public TypeFilter(QName type, ObjectFilter filter) { + public TypeFilter(@NotNull QName type, ObjectFilter filter) { this.type = type; this.filter = filter; } + @NotNull public QName getType() { return type; } @@ -58,6 +60,7 @@ public static TypeFilter createType(QName type, ObjectFilter filter) { return new TypeFilter(type, filter); } + @SuppressWarnings("CloneDoesntCallSuperClone") @Override public ObjectFilter clone() { ObjectFilter f = filter != null ? filter.clone() : null; @@ -134,7 +137,7 @@ public boolean equals(Object o, boolean exact) { TypeFilter that = (TypeFilter) o; - if (type != null ? !type.equals(that.type) : that.type != null) return false; + if (!type.equals(that.type)) return false; if (filter != null ? !filter.equals(that.filter, exact) : that.filter != null) return false; return true; @@ -142,7 +145,7 @@ public boolean equals(Object o, boolean exact) { @Override public int hashCode() { - return type != null ? type.hashCode() : 0; + return type.hashCode(); } @Override diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/UnaryLogicalFilter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/UnaryLogicalFilter.java index 1fab9414c2b..37c0a76b00a 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/UnaryLogicalFilter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/UnaryLogicalFilter.java @@ -21,15 +21,10 @@ public abstract class UnaryLogicalFilter extends LogicalFilter { - public UnaryLogicalFilter() { + UnaryLogicalFilter() { super(); } - public UnaryLogicalFilter(ObjectFilter condition) { - super(); - setFilter(condition); - } - public ObjectFilter getFilter() { if (conditions == null) { return null; @@ -45,7 +40,7 @@ public ObjectFilter getFilter() { } public void setFilter(ObjectFilter filter){ - conditions = new ArrayList(); + conditions = new ArrayList<>(); conditions.add(filter); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/ValueFilter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/ValueFilter.java index 29a5b633d03..e3a1b41f536 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/ValueFilter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/ValueFilter.java @@ -16,69 +16,70 @@ package com.evolveum.midpoint.prism.query; -import com.evolveum.midpoint.prism.ComplexTypeDefinition; -import com.evolveum.midpoint.prism.Containerable; -import com.evolveum.midpoint.prism.Item; -import com.evolveum.midpoint.prism.ItemDefinition; -import com.evolveum.midpoint.prism.PrismContainerDefinition; -import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.PrismValue; +import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.match.MatchingRule; import com.evolveum.midpoint.prism.match.MatchingRuleRegistry; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.path.ItemPathSegment; import com.evolveum.midpoint.prism.path.NameItemPathSegment; +import com.evolveum.midpoint.util.DebugUtil; +import com.evolveum.midpoint.util.MiscUtil; import com.evolveum.midpoint.util.exception.SchemaException; import org.apache.commons.lang.Validate; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.xml.namespace.QName; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; -public abstract class ValueFilter extends ObjectFilter { +public abstract class ValueFilter extends ObjectFilter implements Itemable { private static final long serialVersionUID = 1L; @NotNull private final ItemPath fullPath; - /** - * Definition is not required and not final, because it can be filled-in after creation of the filter (e.g. in provisioning) - */ - @Nullable private ItemDefinition definition; + @Nullable private D definition; // not required, because it can be filled-in after creation of the filter (e.g. in provisioning) @Nullable private QName matchingRule; + @Nullable private List values; + @Nullable private ExpressionWrapper expression; + @Nullable private ItemPath rightHandSidePath; // alternative to values/expression; can be provided later + @Nullable private ItemDefinition rightHandSideDefinition; // optional (needed only if path points to dynamically defined item) + + // At most one of values, expression, rightHandSidePath can be non-null. + // It is a responsibility of the client to ensure it. - // path is not empty - protected ValueFilter(@NotNull ItemPath fullPath, @Nullable ItemDefinition definition) { - this(fullPath, definition, null); + /** + * TODO decide whether to make these fields final. It makes the code simpler, but maybe not that much + * that it is worth the discomfort of the clients (they cannot change they if the would wish). + * Some of them like definition, matchingRule, and right-hand things are filled-in later in some cases (provisioning, query builder). + */ + protected ValueFilter(@NotNull ItemPath fullPath, @Nullable D definition) { + this(fullPath, definition, null, null, null, null, null); } - protected ValueFilter(@NotNull ItemPath fullPath, @Nullable ItemDefinition definition, @Nullable QName matchingRule) { + protected ValueFilter(@NotNull ItemPath fullPath, @Nullable D definition, @Nullable QName matchingRule, + @Nullable List values, @Nullable ExpressionWrapper expression, + @Nullable ItemPath rightHandSidePath, @Nullable ItemDefinition rightHandSideDefinition) { Validate.isTrue(!ItemPath.isNullOrEmpty(fullPath), "path in filter is null or empty"); this.fullPath = fullPath; this.definition = definition; this.matchingRule = matchingRule; - } - - @Nullable - public ItemDefinition getDefinition() { - return definition; + this.expression = expression; + this.values = values; + this.rightHandSidePath = rightHandSidePath; + this.rightHandSideDefinition = rightHandSideDefinition; + if (values != null) { + for (V value : values) { + value.setParent(this); + } + } + checkConsistence(false); } - public void setDefinition(@Nullable ItemDefinition definition) { - this.definition = definition; - } - @NotNull public ItemPath getFullPath() { return fullPath; } - - @Nullable - public QName getMatchingRule() { - return matchingRule; - } - - public void setMatchingRule(@Nullable QName matchingRule) { - this.matchingRule = matchingRule; - } @NotNull public ItemPath getParentPath() { @@ -99,8 +100,26 @@ public QName getElementName() { throw new IllegalStateException("Got "+lastPathSegement+" as a last path segment in value filter "+this); } } + + @Nullable + public D getDefinition() { + return definition; + } + + public void setDefinition(@Nullable D definition) { + this.definition = definition; + } - protected MatchingRule getMatchingRuleFromRegistry(MatchingRuleRegistry matchingRuleRegistry, Item filterItem) { + @Nullable + public QName getMatchingRule() { + return matchingRule; + } + + public void setMatchingRule(@Nullable QName matchingRule) { + this.matchingRule = matchingRule; + } + + MatchingRule getMatchingRuleFromRegistry(MatchingRuleRegistry matchingRuleRegistry, Item filterItem) { try { return matchingRuleRegistry.getMatchingRule(matchingRule, filterItem.getDefinition().getTypeName()); } catch (SchemaException ex){ @@ -108,49 +127,332 @@ protected MatchingRule getMatchingRuleFromRegistry(MatchingRuleRegistry matching } } - public abstract boolean isRaw(); - + @Nullable + public List getValues() { + return values; + } + + @Nullable + List getClonedValues() { + if (values == null) { + return null; + } else { + List clonedValues = new ArrayList<>(values.size()); + for (V value : values) { + @SuppressWarnings("unchecked") + V cloned = (V) value.clone(); + clonedValues.add(cloned); + } + return clonedValues; + } + } + + @Nullable + V getClonedValue() { + V value = getSingleValue(); + if (value == null) { + return null; + } else { + @SuppressWarnings("unchecked") + V cloned = (V) value.clone(); + return cloned; + } + } + + @Nullable + public V getSingleValue() { + if (values == null || values.isEmpty()) { + return null; + } else if (values.size() > 1) { + throw new IllegalArgumentException("Filter '" + this + "' should contain at most one value, but it has " + values.size() + " of them."); + } else { + return values.iterator().next(); + } + } + + /** + * @pre value has to be parent-less + */ + public void setValue(V value) { + this.values = new ArrayList<>(); + if (value != null) { + value.setParent(this); + values.add(value); + } + } + + @Nullable + public ExpressionWrapper getExpression() { + return expression; + } + + public void setExpression(@Nullable ExpressionWrapper expression) { + this.expression = expression; + } + + @Nullable + public ItemPath getRightHandSidePath() { + return rightHandSidePath; + } + + public void setRightHandSidePath(@Nullable ItemPath rightHandSidePath) { + this.rightHandSidePath = rightHandSidePath; + } + + @Nullable + public ItemDefinition getRightHandSideDefinition() { + return rightHandSideDefinition; + } + + public void setRightHandSideDefinition(@Nullable ItemDefinition rightHandSideDefinition) { + this.rightHandSideDefinition = rightHandSideDefinition; + } + + @Override + public PrismContext getPrismContext() { + D def = getDefinition(); + if (def == null) { + return null; + } + return def.getPrismContext(); + } + + @Override + public ItemPath getPath() { + return getFullPath(); + } + + public boolean isRaw() { + if (values != null) { + for (V value: values) { + if (value.isRaw()) { + return true; + } + } + } + return false; + } + + // TODO revise + @Override + public boolean match(PrismContainerValue cvalue, MatchingRuleRegistry matchingRuleRegistry) throws SchemaException { + + Item item = getObjectItem(cvalue); + + boolean filterItemIsEmpty = getValues() == null || getValues().isEmpty(); + boolean objectItemIsEmpty = item == null || item.isEmpty(); + + if (filterItemIsEmpty && !objectItemIsEmpty) { + return false; + } + + if (!filterItemIsEmpty && objectItemIsEmpty) { + return false; + } + + return true; + } + + // TODO revise + Item getObjectItem(PrismContainerValue value) { + ItemPath path = getFullPath(); + return value.findItem(path); + } + + // TODO revise + Item getFilterItem() throws SchemaException { + + if (getDefinition() == null){ + throw new SchemaException("Could not find definition for item " + getPath()); + } + Item filterItem = getDefinition().instantiate(); + if (getValues() != null && !getValues().isEmpty()) { + try { + for (PrismValue v : getValues()){ + filterItem.add(v.clone()); + } + } catch (SchemaException e) { + throw new IllegalArgumentException(e.getMessage(), e); + } + } + + return filterItem; + } + @Override public void checkConsistence(boolean requireDefinitions) { if (requireDefinitions && definition == null) { throw new IllegalArgumentException("Null definition in "+this); } + if (fullPath.isEmpty()) { + throw new IllegalArgumentException("Empty path in "+this); + } + if (rightHandSidePath != null && rightHandSidePath.isEmpty()) { + throw new IllegalArgumentException("Not-null but empty right side path in "+this); + } + int count = 0; + if (values != null) { + count++; + } + if (expression != null) { + count++; + } + if (rightHandSidePath != null) { + count++; + } + if (count > 1) { + throw new IllegalStateException("Two or more of the following are non-null: values (" + values + + "), expression (" + expression + "), rightHandSidePath (" + rightHandSidePath + ") in " + this); + } + if (values != null) { + for (V value: values) { + if (value == null) { + throw new IllegalArgumentException("Null value in "+this); + } + if (value.getParent() != this) { + throw new IllegalArgumentException("Value "+value+" in "+this+" has a bad parent "+value.getParent()); + } + if (value.isEmpty() && !value.isRaw()) { + throw new IllegalArgumentException("Empty value in "+this); + } + } + } } @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((definition == null) ? 0 : definition.hashCode()); - result = prime * result + fullPath.hashCode(); - result = prime * result + ((matchingRule == null) ? 0 : matchingRule.hashCode()); - return result; + public abstract ValueFilter clone(); + + @SuppressWarnings("EqualsWhichDoesntCheckParameterClass") + @Override + public boolean equals(Object o) { + return equals(o, true); } @Override - public boolean equals(Object obj, boolean exact) { - if (this == obj) + public boolean equals(Object o, boolean exact) { + if (this == o) return true; - if (obj == null) + if (o == null || getClass() != o.getClass()) return false; - if (getClass() != obj.getClass()) - return false; - ValueFilter other = (ValueFilter) obj; - if (exact) { - if (definition == null) { - if (other.definition != null) - return false; - } else if (!definition.equals(other.definition)) - return false; - } - if (!fullPath.equals(other.fullPath, exact)) - return false; - if (matchingRule == null) { - if (other.matchingRule != null) - return false; - } else if (!matchingRule.equals(other.matchingRule)) - return false; - return true; + ValueFilter that = (ValueFilter) o; + return fullPath.equals(that.fullPath, exact) && + (!exact || Objects.equals(definition, that.definition)) && + Objects.equals(matchingRule, that.matchingRule) && + MiscUtil.nullableCollectionsEqual(values, that.values) && + Objects.equals(expression, that.expression) && + (rightHandSidePath == null && that.rightHandSidePath == null || + rightHandSidePath != null && rightHandSidePath.equals(that.rightHandSidePath, exact)) && + (!exact || Objects.equals(rightHandSideDefinition, that.rightHandSideDefinition)); } - + + @Override + public int hashCode() { + return Objects.hash(fullPath, matchingRule, values, expression, rightHandSidePath); + } + + @Override + public String debugDump() { + return debugDump(0); + } + + @Override + public String debugDump(int indent) { + StringBuilder sb = new StringBuilder(); + DebugUtil.indentDebugDump(sb, indent); + sb.append(getFilterName()).append(":"); + return debugDump(indent, sb); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(getFilterName()).append(": "); + return toString(sb); + } + + protected abstract String getFilterName(); + + protected String debugDump(int indent, StringBuilder sb) { + sb.append("\n"); + DebugUtil.indentDebugDump(sb, indent+1); + sb.append("PATH: "); + sb.append(getFullPath().toString()); + + sb.append("\n"); + DebugUtil.indentDebugDump(sb, indent+1); + sb.append("DEF: "); + if (getDefinition() != null) { + sb.append(getDefinition().toString()); + } else { + sb.append("null"); + } + + List values = getValues(); + if (values != null) { + sb.append("\n"); + DebugUtil.indentDebugDump(sb, indent+1); + sb.append("VALUE:"); + sb.append("\n"); + for (PrismValue val : getValues()) { + sb.append(DebugUtil.debugDump(val, indent + 2)); + } + } + + ExpressionWrapper expression = getExpression(); + if (expression != null && expression.getExpression() != null) { + sb.append("\n"); + DebugUtil.indentDebugDump(sb, indent+1); + sb.append("EXPRESSION:"); + sb.append("\n"); + sb.append(DebugUtil.debugDump(expression.getExpression(), indent + 2)); + } + + if (getRightHandSidePath() != null) { + sb.append("\n"); + DebugUtil.indentDebugDump(sb, indent+1); + sb.append("RIGHT SIDE PATH: "); + sb.append(getFullPath().toString()); + sb.append("\n"); + DebugUtil.indentDebugDump(sb, indent+1); + sb.append("RIGHT SIDE DEF: "); + if (getRightHandSideDefinition() != null) { + sb.append(getRightHandSideDefinition().toString()); + } else { + sb.append("null"); + } + } + + QName matchingRule = getMatchingRule(); + if (matchingRule != null) { + sb.append("\n"); + DebugUtil.indentDebugDump(sb, indent+1); + sb.append("MATCHING: "); + sb.append(matchingRule); + } + + return sb.toString(); + } + + protected String toString(StringBuilder sb){ + sb.append(getFullPath().toString()); + sb.append(","); + if (getValues() != null){ + for (int i = 0; i< getValues().size() ; i++){ + PrismValue value = getValues().get(i); + if (value == null) { + sb.append("null"); + } else { + sb.append(value.toString()); + } + if ( i != getValues().size() -1){ + sb.append(","); + } + } + } + if (getRightHandSidePath() != null) { + sb.append(getRightHandSidePath()); + } + return sb.toString(); + } + } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/R_AtomicFilter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/R_AtomicFilter.java index 1fadc0bfa8c..b5f79796dad 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/R_AtomicFilter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/R_AtomicFilter.java @@ -23,14 +23,7 @@ import com.evolveum.midpoint.prism.match.StringIgnoreCaseMatchingRule; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.polystring.PolyString; -import com.evolveum.midpoint.prism.query.EqualFilter; -import com.evolveum.midpoint.prism.query.GreaterFilter; -import com.evolveum.midpoint.prism.query.LessFilter; -import com.evolveum.midpoint.prism.query.ObjectFilter; -import com.evolveum.midpoint.prism.query.ObjectQuery; -import com.evolveum.midpoint.prism.query.PropertyValueFilter; -import com.evolveum.midpoint.prism.query.RefFilter; -import com.evolveum.midpoint.prism.query.SubstringFilter; +import com.evolveum.midpoint.prism.query.*; import org.apache.commons.lang.Validate; @@ -47,7 +40,7 @@ public class R_AtomicFilter implements S_ConditionEntry, S_MatchingRuleEntry, S_ final ItemPath itemPath; final PrismPropertyDefinition propertyDefinition; final PrismReferenceDefinition referenceDefinition; - final PropertyValueFilter filter; + final ValueFilter filter; final R_Filter owner; final boolean expectingRightSide; @@ -70,7 +63,7 @@ public class R_AtomicFilter implements S_ConditionEntry, S_MatchingRuleEntry, S_ this.expectingRightSide = false; } - R_AtomicFilter(R_AtomicFilter original, PropertyValueFilter filter, boolean expectingRightSide) { + R_AtomicFilter(R_AtomicFilter original, ValueFilter filter, boolean expectingRightSide) { Validate.notNull(original); Validate.notNull(filter); this.itemPath = original.itemPath; @@ -81,7 +74,7 @@ public class R_AtomicFilter implements S_ConditionEntry, S_MatchingRuleEntry, S_ this.expectingRightSide = expectingRightSide; } - public R_AtomicFilter(R_AtomicFilter original, PropertyValueFilter filter) { + public R_AtomicFilter(R_AtomicFilter original, ValueFilter filter) { this(original, filter, false); } @@ -102,7 +95,7 @@ public S_AtomicFilterExit item(ItemPath itemPath, ItemDefinition itemDefinition) if (filter == null) { throw new IllegalStateException("item() call with no filter"); } - PropertyValueFilter newFilter = filter.clone(); + ValueFilter newFilter = filter.clone(); newFilter.setRightHandSidePath(itemPath); newFilter.setRightHandSideDefinition(itemDefinition); return new R_AtomicFilter(this, newFilter); @@ -124,57 +117,57 @@ public S_MatchingRuleEntry eq(Object... values) { @Override public S_RightHandItemEntry eq() { - return new R_AtomicFilter(this, EqualFilter.createEqual(itemPath, propertyDefinition, null, owner.getPrismContext()), true); + return new R_AtomicFilter(this, EqualFilter.createEqual(itemPath, propertyDefinition, null), true); } @Override public S_MatchingRuleEntry eqPoly(String orig, String norm) { - return new R_AtomicFilter(this, EqualFilter.createEqual(itemPath, propertyDefinition, null, owner.getPrismContext(), new PolyString(orig, norm))); + return eq(new PolyString(orig, norm)); } @Override public S_MatchingRuleEntry eqPoly(String orig) { - return new R_AtomicFilter(this, EqualFilter.createEqual(itemPath, propertyDefinition, null, owner.getPrismContext(), new PolyString(orig))); + return eq(new PolyString(orig)); } @Override public S_MatchingRuleEntry gt(Object value) { - return new R_AtomicFilter(this, GreaterFilter.createGreater(itemPath, propertyDefinition, value, false)); + return new R_AtomicFilter(this, GreaterFilter.createGreater(itemPath, propertyDefinition, false, owner.getPrismContext(), value)); } @Override public S_RightHandItemEntry gt() { - return new R_AtomicFilter(this, GreaterFilter.createGreater(itemPath, propertyDefinition, null, false), true); + return new R_AtomicFilter(this, GreaterFilter.createGreater(itemPath, propertyDefinition, false), true); } @Override public S_MatchingRuleEntry ge(Object value) { - return new R_AtomicFilter(this, GreaterFilter.createGreater(itemPath, propertyDefinition, value, true)); + return new R_AtomicFilter(this, GreaterFilter.createGreater(itemPath, propertyDefinition, true, owner.getPrismContext(), value)); } @Override public S_RightHandItemEntry ge() { - return new R_AtomicFilter(this, GreaterFilter.createGreater(itemPath, propertyDefinition, null, true), true); + return new R_AtomicFilter(this, GreaterFilter.createGreater(itemPath, propertyDefinition, true), true); } @Override public S_MatchingRuleEntry lt(Object value) { - return new R_AtomicFilter(this, LessFilter.createLess(itemPath, propertyDefinition, value, false)); + return new R_AtomicFilter(this, LessFilter.createLess(itemPath, propertyDefinition, owner.getPrismContext(), value, false)); } @Override public S_RightHandItemEntry lt() { - return new R_AtomicFilter(this, LessFilter.createLess(itemPath, propertyDefinition, null, false), true); + return new R_AtomicFilter(this, LessFilter.createLess(itemPath, propertyDefinition, false), true); } @Override public S_MatchingRuleEntry le(Object value) { - return new R_AtomicFilter(this, LessFilter.createLess(itemPath, propertyDefinition, value, true)); + return new R_AtomicFilter(this, LessFilter.createLess(itemPath, propertyDefinition, owner.getPrismContext(), value, true)); } @Override public S_RightHandItemEntry le() { - return new R_AtomicFilter(this, LessFilter.createLess(itemPath, propertyDefinition, null, true), true); + return new R_AtomicFilter(this, LessFilter.createLess(itemPath, propertyDefinition, true), true); } @Override @@ -224,7 +217,7 @@ public S_MatchingRuleEntry containsPoly(String orig) { @Override public S_AtomicFilterExit ref(PrismReferenceValue value) { - return ref(Collections.singleton(value)); + return ref(value != null ? Collections.singleton(value) : Collections.emptyList()); } @Override @@ -234,12 +227,16 @@ public S_AtomicFilterExit ref(Collection values) { @Override public S_AtomicFilterExit ref(String oid) { - return ref(new PrismReferenceValue(oid)); + return ref(oid != null ? new PrismReferenceValue(oid) : null); } @Override public S_AtomicFilterExit ref(String oid, QName targetTypeName) { - return ref(new PrismReferenceValue(oid, targetTypeName)); + if (oid != null) { + return ref(new PrismReferenceValue(oid, targetTypeName)); + } else { + return ref((PrismReferenceValue) null); + } } @Override @@ -255,7 +252,7 @@ public S_AtomicFilterExit isNull() { @Override public S_AtomicFilterExit matching(QName matchingRuleName) { - PropertyValueFilter clone = filter.clone(); + ValueFilter clone = filter.clone(); clone.setMatchingRule(matchingRuleName); return new R_AtomicFilter(this, clone); } diff --git a/infra/prism/src/test/java/com/evolveum/midpoint/prism/query/TestQueryBuilder.java b/infra/prism/src/test/java/com/evolveum/midpoint/prism/query/TestQueryBuilder.java index ba3286e3faa..26043954d29 100644 --- a/infra/prism/src/test/java/com/evolveum/midpoint/prism/query/TestQueryBuilder.java +++ b/infra/prism/src/test/java/com/evolveum/midpoint/prism/query/TestQueryBuilder.java @@ -511,7 +511,7 @@ public void test310LessThanItem() throws Exception { .item(new ItemPath(UserType.F_NAME), nameDef) .build(); ObjectQuery expected = ObjectQuery.createObjectQuery( - LessFilter.createLessThanItem( + LessFilter.createLess( new ItemPath(UserType.F_LOCALITY), localityDef, new ItemPath(UserType.F_NAME), diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ObjectQueryUtil.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ObjectQueryUtil.java index 330bd9e5851..e3d6c4e341e 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ObjectQueryUtil.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ObjectQueryUtil.java @@ -175,8 +175,7 @@ public static ObjectQuery createNameQuery(Class clazz, } public static ObjectQuery createRootOrgQuery(PrismContext prismContext) throws SchemaException { - ObjectQuery objectQuery = ObjectQuery.createObjectQuery(OrgFilter.createRootOrg()); - return objectQuery; + return QueryBuilder.queryFor(ObjectType.class, prismContext).isRoot().build(); } public static boolean hasAllDefinitions(ObjectQuery query) { @@ -190,7 +189,7 @@ public static boolean hasAllDefinitions(ObjectFilter filter) { @Override public void visit(ObjectFilter filter) { if (filter instanceof ValueFilter) { - ItemDefinition definition = ((ValueFilter)filter).getDefinition(); + ItemDefinition definition = ((ValueFilter)filter).getDefinition(); if (definition == null) { hasAllDefinitions.setValue(false); } diff --git a/infra/util/src/main/java/com/evolveum/midpoint/util/MiscUtil.java b/infra/util/src/main/java/com/evolveum/midpoint/util/MiscUtil.java index 96c5d5f658f..6494e202d5d 100644 --- a/infra/util/src/main/java/com/evolveum/midpoint/util/MiscUtil.java +++ b/infra/util/src/main/java/com/evolveum/midpoint/util/MiscUtil.java @@ -517,4 +517,16 @@ public static void addIfNotPresent(List receivingList, T supplyingElement receivingList.add(supplyingElement); } } + + public static boolean nullableCollectionsEqual(Collection c1, Collection c2) { + boolean empty1 = c1 == null || c1.isEmpty(); + boolean empty2 = c2 == null || c2.isEmpty(); + if (empty1) { + return empty2; + } else if (empty2) { + return false; + } else { + return c1.equals(c2); + } + } } diff --git a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/ExpressionUtil.java b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/ExpressionUtil.java index 883a59626b3..197d641d3b8 100644 --- a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/ExpressionUtil.java +++ b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/ExpressionUtil.java @@ -567,7 +567,7 @@ private static ObjectFilter evaluateFilterExpressionsInternal(ObjectFilter filte LOGGER.trace("Search filter expression in the rule for {} evaluated to {}.", new Object[] { shortDesc, expressionResult }); - PropertyValueFilter evaluatedFilter = (PropertyValueFilter) pvfilter.clone(); + ValueFilter evaluatedFilter = pvfilter.clone(); evaluatedFilter.setValue(expressionResult); evaluatedFilter.setExpression(null); // } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/ReconciliationTaskHandler.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/ReconciliationTaskHandler.java index 37b52beb9c5..b1581c61da7 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/ReconciliationTaskHandler.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/ReconciliationTaskHandler.java @@ -15,17 +15,6 @@ */ package com.evolveum.midpoint.model.impl.sync; -import java.util.Collection; -import java.util.List; - -import javax.annotation.PostConstruct; -import javax.xml.namespace.QName; - -import com.evolveum.midpoint.prism.query.builder.QueryBuilder; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.stereotype.Component; - import com.evolveum.midpoint.audit.api.AuditEventRecord; import com.evolveum.midpoint.audit.api.AuditEventStage; import com.evolveum.midpoint.audit.api.AuditEventType; @@ -37,20 +26,12 @@ import com.evolveum.midpoint.model.impl.util.Utils; import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismObject; -import com.evolveum.midpoint.prism.PrismObjectDefinition; import com.evolveum.midpoint.prism.delta.ChangeType; import com.evolveum.midpoint.prism.delta.ItemDelta; import com.evolveum.midpoint.prism.delta.ObjectDelta; import com.evolveum.midpoint.prism.delta.PropertyDelta; -import com.evolveum.midpoint.prism.path.ItemPath; -import com.evolveum.midpoint.prism.query.AndFilter; -import com.evolveum.midpoint.prism.query.EqualFilter; -import com.evolveum.midpoint.prism.query.LessFilter; -import com.evolveum.midpoint.prism.query.NotFilter; -import com.evolveum.midpoint.prism.query.ObjectFilter; import com.evolveum.midpoint.prism.query.ObjectQuery; -import com.evolveum.midpoint.prism.query.OrFilter; -import com.evolveum.midpoint.prism.query.RefFilter; +import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import com.evolveum.midpoint.prism.xml.XmlTypeConverter; import com.evolveum.midpoint.provisioning.api.ChangeNotificationDispatcher; import com.evolveum.midpoint.provisioning.api.ProvisioningOperationOptions; @@ -68,29 +49,26 @@ import com.evolveum.midpoint.schema.result.OperationResultStatus; import com.evolveum.midpoint.schema.util.ObjectTypeUtil; import com.evolveum.midpoint.schema.util.ShadowUtil; -import com.evolveum.midpoint.task.api.Task; -import com.evolveum.midpoint.task.api.TaskCategory; -import com.evolveum.midpoint.task.api.TaskHandler; -import com.evolveum.midpoint.task.api.TaskManager; -import com.evolveum.midpoint.task.api.TaskRunResult; +import com.evolveum.midpoint.task.api.*; import com.evolveum.midpoint.task.api.TaskRunResult.TaskRunResultStatus; import com.evolveum.midpoint.util.Holder; import com.evolveum.midpoint.util.QNameUtil; -import com.evolveum.midpoint.util.exception.CommunicationException; -import com.evolveum.midpoint.util.exception.ConfigurationException; -import com.evolveum.midpoint.util.exception.ObjectAlreadyExistsException; -import com.evolveum.midpoint.util.exception.ObjectNotFoundException; -import com.evolveum.midpoint.util.exception.SchemaException; -import com.evolveum.midpoint.util.exception.SecurityViolationException; +import com.evolveum.midpoint.util.exception.*; import com.evolveum.midpoint.util.logging.LoggingUtils; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; -import com.evolveum.midpoint.xml.ns._public.common.common_3.FailedOperationTypeType; import com.evolveum.midpoint.xml.ns._public.common.common_3.LayerType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import javax.xml.namespace.QName; +import java.util.Collection; +import java.util.List; /** * The task hander for reconciliation. diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/trigger/TriggerScannerTaskHandler.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/trigger/TriggerScannerTaskHandler.java index fe8eadb3260..02ecf04496f 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/trigger/TriggerScannerTaskHandler.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/trigger/TriggerScannerTaskHandler.java @@ -24,7 +24,6 @@ import com.evolveum.midpoint.prism.delta.ContainerDelta; import com.evolveum.midpoint.prism.delta.ItemDelta; import com.evolveum.midpoint.prism.path.ItemPath; -import com.evolveum.midpoint.prism.query.LessFilter; import com.evolveum.midpoint.prism.query.ObjectFilter; import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.prism.query.builder.QueryBuilder; @@ -129,8 +128,9 @@ protected ObjectQuery createQuery(AbstractScannerResultHandler handl PrismContainerDefinition triggerContainerDef = focusObjectDef.findContainerDefinition(F_TRIGGER); if (handler.getLastScanTimestamp() == null) { - filter = LessFilter.createLess(new ItemPath(F_TRIGGER, F_TIMESTAMP), focusObjectDef, - handler.getThisScanTimestamp(), true); + filter = QueryBuilder.queryFor(ObjectType.class, prismContext) + .item(F_TRIGGER, F_TIMESTAMP).le(handler.getThisScanTimestamp()) + .buildFilter(); } else { filter = QueryBuilder.queryFor(ObjectType.class, prismContext) .exists(F_TRIGGER) diff --git a/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportManagerImpl.java b/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportManagerImpl.java index 547c67e029c..d262e768f90 100644 --- a/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportManagerImpl.java +++ b/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportManagerImpl.java @@ -16,33 +16,6 @@ package com.evolveum.midpoint.report.impl; -import java.io.ByteArrayInputStream; -import java.io.File; -import java.io.InputStream; -import java.io.Serializable; -import java.io.UnsupportedEncodingException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Date; -import java.util.List; -import java.util.Map; - -import javax.annotation.PostConstruct; -import javax.xml.datatype.Duration; -import javax.xml.datatype.XMLGregorianCalendar; - -import net.sf.jasperreports.engine.JRException; -import net.sf.jasperreports.engine.JasperCompileManager; -import net.sf.jasperreports.engine.JasperReport; -import net.sf.jasperreports.engine.design.JasperDesign; -import net.sf.jasperreports.engine.xml.JRXmlLoader; - -import org.apache.commons.codec.binary.Base64; -import org.apache.commons.io.FileUtils; -import org.apache.commons.lang.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - import com.evolveum.midpoint.model.api.ModelService; import com.evolveum.midpoint.model.api.context.ModelContext; import com.evolveum.midpoint.model.api.context.ModelElementContext; @@ -51,18 +24,12 @@ import com.evolveum.midpoint.model.api.hooks.HookOperationMode; import com.evolveum.midpoint.model.api.hooks.HookRegistry; import com.evolveum.midpoint.model.api.hooks.ReadHook; -import com.evolveum.midpoint.prism.Containerable; import com.evolveum.midpoint.prism.PrismContainer; -import com.evolveum.midpoint.prism.PrismContainerDefinition; import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismObject; -import com.evolveum.midpoint.prism.PrismProperty; -import com.evolveum.midpoint.prism.PrismPropertyDefinition; import com.evolveum.midpoint.prism.delta.ObjectDelta; -import com.evolveum.midpoint.prism.path.ItemPath; -import com.evolveum.midpoint.prism.query.LessFilter; import com.evolveum.midpoint.prism.query.ObjectQuery; -import com.evolveum.midpoint.prism.schema.PrismSchema; +import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import com.evolveum.midpoint.prism.xml.XmlTypeConverter; import com.evolveum.midpoint.report.api.ReportManager; import com.evolveum.midpoint.schema.GetOperationOptions; @@ -70,27 +37,36 @@ import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.result.OperationResultStatus; import com.evolveum.midpoint.schema.util.MiscSchemaUtil; -import com.evolveum.midpoint.schema.util.ParamsTypeUtil; import com.evolveum.midpoint.schema.util.ReportTypeUtil; import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.task.api.TaskManager; -import com.evolveum.midpoint.util.exception.CommunicationException; -import com.evolveum.midpoint.util.exception.ConfigurationException; -import com.evolveum.midpoint.util.exception.ObjectNotFoundException; -import com.evolveum.midpoint.util.exception.SchemaException; -import com.evolveum.midpoint.util.exception.SecurityViolationException; -import com.evolveum.midpoint.util.exception.SystemException; +import com.evolveum.midpoint.util.exception.*; import com.evolveum.midpoint.util.logging.LoggingUtils; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; -import com.evolveum.midpoint.xml.ns._public.common.common_3.CleanupPolicyType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.MetadataType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ReportConfigurationType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ReportOutputType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ReportParameterType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ReportType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ThreadStopActionType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.*; +import net.sf.jasperreports.engine.JRException; +import net.sf.jasperreports.engine.JasperCompileManager; +import net.sf.jasperreports.engine.JasperReport; +import net.sf.jasperreports.engine.design.JasperDesign; +import net.sf.jasperreports.engine.xml.JRXmlLoader; +import org.apache.commons.codec.binary.Base64; +import org.apache.commons.io.FileUtils; +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.PostConstruct; +import javax.xml.datatype.Duration; +import javax.xml.datatype.XMLGregorianCalendar; +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.InputStream; +import java.io.UnsupportedEncodingException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Date; +import java.util.List; /** @@ -312,9 +288,9 @@ public void cleanupReports(CleanupPolicyType cleanupPolicy, OperationResult pare List> obsoleteReportOutputs = new ArrayList>(); try { - ObjectQuery obsoleteReportOutputsQuery = ObjectQuery.createObjectQuery(LessFilter.createLess( - new ItemPath(ReportOutputType.F_METADATA, MetadataType.F_CREATE_TIMESTAMP), - ReportOutputType.class, prismContext, timeXml, true)); + ObjectQuery obsoleteReportOutputsQuery = QueryBuilder.queryFor(ReportOutputType.class, prismContext) + .item(ReportOutputType.F_METADATA, MetadataType.F_CREATE_TIMESTAMP).le(timeXml) + .build(); obsoleteReportOutputs = modelService.searchObjects(ReportOutputType.class, obsoleteReportOutputsQuery, null, null, result); } catch (Exception e) { throw new SystemException("Couldn't get the list of obsolete report outputs: " + e.getMessage(), e); diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowCache.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowCache.java index a2f28a4be40..c1db5e0d61b 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowCache.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowCache.java @@ -15,90 +15,35 @@ */ package com.evolveum.midpoint.provisioning.impl; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Iterator; -import java.util.List; - -import javax.xml.namespace.QName; - -import com.evolveum.midpoint.prism.Item; -import com.evolveum.midpoint.schema.util.ObjectQueryUtil; - -import org.apache.commons.lang.StringUtils; -import org.apache.commons.lang.Validate; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; - import com.evolveum.midpoint.common.refinery.RefinedAssociationDefinition; -import com.evolveum.midpoint.common.refinery.RefinedAttributeDefinition; import com.evolveum.midpoint.common.refinery.RefinedObjectClassDefinition; import com.evolveum.midpoint.common.refinery.ShadowDiscriminatorObjectDelta; -import com.evolveum.midpoint.prism.Containerable; -import com.evolveum.midpoint.prism.ItemDefinition; -import com.evolveum.midpoint.prism.PrismContainer; -import com.evolveum.midpoint.prism.PrismContainerDefinition; -import com.evolveum.midpoint.prism.PrismContainerValue; -import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.PrismObject; -import com.evolveum.midpoint.prism.PrismObjectDefinition; -import com.evolveum.midpoint.prism.PrismProperty; -import com.evolveum.midpoint.prism.PrismPropertyValue; -import com.evolveum.midpoint.prism.PrismValue; -import com.evolveum.midpoint.prism.Visitable; +import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.Visitor; -import com.evolveum.midpoint.prism.delta.ChangeType; -import com.evolveum.midpoint.prism.delta.ContainerDelta; -import com.evolveum.midpoint.prism.delta.ItemDelta; -import com.evolveum.midpoint.prism.delta.ObjectDelta; -import com.evolveum.midpoint.prism.delta.PropertyDelta; +import com.evolveum.midpoint.prism.delta.*; import com.evolveum.midpoint.prism.match.MatchingRuleRegistry; import com.evolveum.midpoint.prism.path.IdItemPathSegment; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.path.NameItemPathSegment; -import com.evolveum.midpoint.prism.polystring.PolyString; -import com.evolveum.midpoint.prism.query.AndFilter; -import com.evolveum.midpoint.prism.query.EqualFilter; -import com.evolveum.midpoint.prism.query.NaryLogicalFilter; -import com.evolveum.midpoint.prism.query.ObjectFilter; -import com.evolveum.midpoint.prism.query.ObjectPaging; -import com.evolveum.midpoint.prism.query.ObjectQuery; -import com.evolveum.midpoint.prism.query.OrFilter; -import com.evolveum.midpoint.prism.query.RefFilter; -import com.evolveum.midpoint.prism.query.SubstringFilter; -import com.evolveum.midpoint.prism.query.ValueFilter; -import com.evolveum.midpoint.prism.util.PrismUtil; -import com.evolveum.midpoint.provisioning.api.ChangeNotificationDispatcher; -import com.evolveum.midpoint.provisioning.api.GenericConnectorException; -import com.evolveum.midpoint.provisioning.api.ProvisioningOperationOptions; -import com.evolveum.midpoint.provisioning.api.ResourceObjectShadowChangeDescription; -import com.evolveum.midpoint.provisioning.api.ResourceOperationDescription; +import com.evolveum.midpoint.prism.query.*; +import com.evolveum.midpoint.provisioning.api.*; import com.evolveum.midpoint.provisioning.consistency.api.ErrorHandler; import com.evolveum.midpoint.provisioning.consistency.api.ErrorHandler.FailedOperation; import com.evolveum.midpoint.provisioning.consistency.impl.ErrorHandlerFactory; import com.evolveum.midpoint.provisioning.ucf.api.Change; import com.evolveum.midpoint.provisioning.ucf.api.ConnectorInstance; import com.evolveum.midpoint.provisioning.ucf.api.GenericFrameworkException; -import com.evolveum.midpoint.provisioning.ucf.api.PropertyModificationOperation; import com.evolveum.midpoint.provisioning.ucf.api.ResultHandler; import com.evolveum.midpoint.provisioning.util.ProvisioningUtil; import com.evolveum.midpoint.repo.api.RepositoryService; -import com.evolveum.midpoint.schema.DeltaConvertor; -import com.evolveum.midpoint.schema.GetOperationOptions; -import com.evolveum.midpoint.schema.ResourceShadowDiscriminator; -import com.evolveum.midpoint.schema.RetrieveOption; -import com.evolveum.midpoint.schema.SearchResultMetadata; -import com.evolveum.midpoint.schema.SelectorOptions; +import com.evolveum.midpoint.schema.*; import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.internals.InternalMonitor; import com.evolveum.midpoint.schema.internals.InternalsConfig; -import com.evolveum.midpoint.schema.processor.ObjectClassComplexTypeDefinition; -import com.evolveum.midpoint.schema.processor.ResourceAttribute; -import com.evolveum.midpoint.schema.processor.ResourceAttributeContainer; -import com.evolveum.midpoint.schema.processor.ResourceAttributeContainerDefinition; -import com.evolveum.midpoint.schema.processor.ResourceAttributeDefinition; +import com.evolveum.midpoint.schema.processor.*; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.result.OperationResultStatus; +import com.evolveum.midpoint.schema.util.ObjectQueryUtil; import com.evolveum.midpoint.schema.util.ObjectTypeUtil; import com.evolveum.midpoint.schema.util.SchemaDebugUtil; import com.evolveum.midpoint.schema.util.ShadowUtil; @@ -107,31 +52,23 @@ import com.evolveum.midpoint.util.DebugUtil; import com.evolveum.midpoint.util.Holder; import com.evolveum.midpoint.util.QNameUtil; -import com.evolveum.midpoint.util.exception.CommunicationException; -import com.evolveum.midpoint.util.exception.ConfigurationException; -import com.evolveum.midpoint.util.exception.ObjectAlreadyExistsException; -import com.evolveum.midpoint.util.exception.ObjectNotFoundException; -import com.evolveum.midpoint.util.exception.SchemaException; -import com.evolveum.midpoint.util.exception.SecurityViolationException; -import com.evolveum.midpoint.util.exception.SystemException; -import com.evolveum.midpoint.util.exception.TunnelException; +import com.evolveum.midpoint.util.exception.*; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ActivationType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.AvailabilityStatusType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.FailedOperationTypeType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.OperationProvisioningScriptsType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowAssociationType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowAttributesType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowKindType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.*; import com.evolveum.midpoint.xml.ns._public.resource.capabilities_3.CountObjectsCapabilityType; import com.evolveum.midpoint.xml.ns._public.resource.capabilities_3.CountObjectsSimulateType; import com.evolveum.prism.xml.ns._public.types_3.ObjectDeltaType; import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; +import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang.Validate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; + +import javax.xml.namespace.QName; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; /** * Shadow cache is a facade that covers all the operations with shadows. It @@ -692,11 +629,10 @@ private void applyDefinition(final ProvisioningContext ctx, final ObjectQuery qu com.evolveum.midpoint.prism.query.Visitor visitor = new com.evolveum.midpoint.prism.query.Visitor() { @Override public void visit(ObjectFilter filter) { - if (filter instanceof ValueFilter) { - ValueFilter valueFilter = (ValueFilter) filter; + if (filter instanceof PropertyValueFilter) { + PropertyValueFilter valueFilter = (PropertyValueFilter) filter; ItemDefinition definition = valueFilter.getDefinition(); if (definition == null) { - ItemPath itemPath = valueFilter.getFullPath(); if (attributesPath.equivalent(valueFilter.getParentPath())) { QName attributeName = valueFilter.getElementName(); ResourceAttributeDefinition attributeDefinition = objectClassDefinition diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowManager.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowManager.java index 5d69a2cfcfa..37a52b2077c 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowManager.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowManager.java @@ -713,10 +713,6 @@ private void processQueryMatchingRuleFilter(ObjectFilter filter, RefinedObje return; } MatchingRule matchingRule = matchingRuleRegistry.getMatchingRule(matchingRuleQName, rAttrDef.getTypeName()); - if (matchingRule == null) { - // TODO: warning? - return; - } List newValues = new ArrayList(); for (PrismPropertyValue ppval: eqFilter.getValues()) { T normalizedRealValue = matchingRule.normalize(ppval.getValue()); diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/ucf/query/ValueOperation.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/ucf/query/ValueOperation.java index eda8fb312e3..6c79b149726 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/ucf/query/ValueOperation.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/ucf/query/ValueOperation.java @@ -33,7 +33,6 @@ import com.evolveum.midpoint.prism.PrismValue; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.query.EqualFilter; -import com.evolveum.midpoint.prism.query.InFilter; import com.evolveum.midpoint.prism.query.ObjectFilter; import com.evolveum.midpoint.prism.query.SubstringFilter; import com.evolveum.midpoint.prism.query.ValueFilter; @@ -83,17 +82,6 @@ public Filter interpret(ObjectFilter objectFilter, IcfNameMapper icfNameMapp } } - } else if (objectFilter instanceof InFilter) { - InFilter in = (InFilter) objectFilter; - - Collection convertedValues = convertValues(propName, (List) in.getValues()); - if (convertedValues.isEmpty()) { - throw new IllegalArgumentException("In filter with a null value makes no sense"); - } else { - Attribute attr = AttributeBuilder.build(icfName, convertedValues); - return FilterBuilder.equalTo(attr); - } - } else if (objectFilter instanceof SubstringFilter) { SubstringFilter substring = (SubstringFilter) objectFilter; Collection convertedValues = convertValues(propName, substring.getValues()); diff --git a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/ModifyTest.java b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/ModifyTest.java index ebd90f987f1..b49d8898eb8 100644 --- a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/ModifyTest.java +++ b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/ModifyTest.java @@ -23,8 +23,8 @@ import com.evolveum.midpoint.prism.delta.PropertyDelta; import com.evolveum.midpoint.prism.delta.ReferenceDelta; import com.evolveum.midpoint.prism.path.ItemPath; -import com.evolveum.midpoint.prism.query.LessFilter; import com.evolveum.midpoint.prism.query.ObjectQuery; +import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import com.evolveum.midpoint.prism.util.PrismTestUtil; import com.evolveum.midpoint.prism.xml.XmlTypeConverter; import com.evolveum.midpoint.repo.api.RepoModifyOptions; @@ -509,10 +509,9 @@ public void testModifyAccountSynchronizationSituation() throws Exception { AssertJUnit.assertNotNull(afterModifytimestamp); assertEquals(afterSecondModifyType.getSynchronizationTimestamp(), description.getTimestamp()); - LessFilter filter = LessFilter.createLess(ShadowType.F_SYNCHRONIZATION_TIMESTAMP, afterSecondModify.findProperty( - ShadowType.F_SYNCHRONIZATION_TIMESTAMP).getDefinition(), afterModifytimestamp, true); - ObjectQuery query = ObjectQuery.createObjectQuery(filter); - + ObjectQuery query = QueryBuilder.queryFor(ShadowType.class, prismContext) + .item(ShadowType.F_SYNCHRONIZATION_TIMESTAMP).le(afterModifytimestamp) + .build(); List> shadows = repositoryService.searchObjects(ShadowType.class, query, null, result); AssertJUnit.assertNotNull(shadows); assertEquals(1, shadows.size()); diff --git a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/OrgStructTest.java b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/OrgStructTest.java index 045e5c16842..d4e4391cf6c 100644 --- a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/OrgStructTest.java +++ b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/OrgStructTest.java @@ -514,8 +514,10 @@ public void test005deleteOrg() throws Exception { public void test006searchOrgStructUserUnbounded() throws Exception { OperationResult parentResult = new OperationResult("test006searchOrgStructUserUnbounded"); - ObjectQuery objectQuery = ObjectQuery.createObjectQuery(OrgFilter.createOrg(SEARCH_ORG_OID_UNBOUNDED_DEPTH)); - objectQuery.setPaging(ObjectPaging.createPaging(null, null, ObjectType.F_NAME, OrderDirection.ASCENDING)); + ObjectQuery objectQuery = QueryBuilder.queryFor(ObjectType.class, prismContext) + .isChildOf(SEARCH_ORG_OID_UNBOUNDED_DEPTH) + .asc(ObjectType.F_NAME) + .build(); List> orgClosure = repositoryService.searchObjects(ObjectType.class, objectQuery, null, parentResult); @@ -564,9 +566,10 @@ public void test007searchOrgStructOrgDepth() throws Exception { public void test008searchRootOrg() throws Exception { OperationResult parentResult = new OperationResult("test008searchRootOrg"); - ObjectQuery qSearch = ObjectQuery.createObjectQuery(OrgFilter.createRootOrg()); - qSearch.setPaging(ObjectPaging.createPaging(null, null, ObjectType.F_NAME, OrderDirection.ASCENDING)); - + ObjectQuery qSearch = QueryBuilder.queryFor(ObjectType.class, prismContext) + .isRoot() + .asc(ObjectType.F_NAME) + .build(); List> rootOrgs = repositoryService.searchObjects(OrgType.class, qSearch, null, parentResult); for (PrismObject ro : rootOrgs) { diff --git a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/QueryInterpreter2Test.java b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/QueryInterpreter2Test.java index 62b3f113673..a127db89658 100644 --- a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/QueryInterpreter2Test.java +++ b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/QueryInterpreter2Test.java @@ -16,36 +16,10 @@ package com.evolveum.midpoint.repo.sql; -import com.evolveum.midpoint.prism.Containerable; -import com.evolveum.midpoint.prism.Objectable; -import com.evolveum.midpoint.prism.PrismConstants; -import com.evolveum.midpoint.prism.PrismContainerDefinition; -import com.evolveum.midpoint.prism.PrismObject; -import com.evolveum.midpoint.prism.PrismObjectDefinition; -import com.evolveum.midpoint.prism.PrismProperty; -import com.evolveum.midpoint.prism.PrismPropertyDefinition; -import com.evolveum.midpoint.prism.PrismReferenceValue; -import com.evolveum.midpoint.prism.match.PolyStringNormMatchingRule; -import com.evolveum.midpoint.prism.match.PolyStringOrigMatchingRule; +import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.path.ItemPath; -import com.evolveum.midpoint.prism.polystring.PolyString; -import com.evolveum.midpoint.prism.query.AndFilter; -import com.evolveum.midpoint.prism.query.EqualFilter; -import com.evolveum.midpoint.prism.query.ExistsFilter; -import com.evolveum.midpoint.prism.query.GreaterFilter; -import com.evolveum.midpoint.prism.query.InOidFilter; -import com.evolveum.midpoint.prism.query.LessFilter; -import com.evolveum.midpoint.prism.query.ObjectFilter; -import com.evolveum.midpoint.prism.query.ObjectPaging; -import com.evolveum.midpoint.prism.query.ObjectQuery; -import com.evolveum.midpoint.prism.query.OrFilter; -import com.evolveum.midpoint.prism.query.OrgFilter; -import com.evolveum.midpoint.prism.query.QueryJaxbConvertor; -import com.evolveum.midpoint.prism.query.RefFilter; -import com.evolveum.midpoint.prism.query.SubstringFilter; -import com.evolveum.midpoint.prism.query.TypeFilter; +import com.evolveum.midpoint.prism.query.*; import com.evolveum.midpoint.prism.query.builder.QueryBuilder; -import com.evolveum.midpoint.prism.query.builder.S_FilterEntry; import com.evolveum.midpoint.prism.schema.SchemaRegistry; import com.evolveum.midpoint.prism.util.PrismTestUtil; import com.evolveum.midpoint.prism.xml.XmlTypeConverter; @@ -69,7 +43,6 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.*; import com.evolveum.prism.xml.ns._public.query_3.QueryType; import org.apache.commons.lang.StringUtils; -import org.hibernate.Query; import org.hibernate.Session; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -86,7 +59,6 @@ import java.io.File; import java.io.IOException; import java.util.ArrayList; -import java.util.Arrays; import java.util.Date; import java.util.List; @@ -97,11 +69,7 @@ import static com.evolveum.midpoint.xml.ns._public.common.common_3.AccessCertificationCampaignStateType.IN_REVIEW_STAGE; import static com.evolveum.midpoint.xml.ns._public.common.common_3.AccessCertificationCampaignType.F_OWNER_REF; import static com.evolveum.midpoint.xml.ns._public.common.common_3.AccessCertificationCampaignType.F_STATE; -import static com.evolveum.midpoint.xml.ns._public.common.common_3.AccessCertificationCaseType.F_CURRENT_STAGE_NUMBER; -import static com.evolveum.midpoint.xml.ns._public.common.common_3.AccessCertificationCaseType.F_DECISION; -import static com.evolveum.midpoint.xml.ns._public.common.common_3.AccessCertificationCaseType.F_CURRENT_REVIEWER_REF; -import static com.evolveum.midpoint.xml.ns._public.common.common_3.AccessCertificationCaseType.F_CURRENT_REVIEW_DEADLINE; -import static com.evolveum.midpoint.xml.ns._public.common.common_3.AccessCertificationCaseType.F_CURRENT_REVIEW_REQUESTED_TIMESTAMP; +import static com.evolveum.midpoint.xml.ns._public.common.common_3.AccessCertificationCaseType.*; import static com.evolveum.midpoint.xml.ns._public.common.common_3.AccessCertificationDecisionType.F_RESPONSE; import static com.evolveum.midpoint.xml.ns._public.common.common_3.AccessCertificationDecisionType.F_STAGE_NUMBER; import static com.evolveum.midpoint.xml.ns._public.common.common_3.AccessCertificationResponseType.NO_RESPONSE; @@ -110,15 +78,10 @@ import static com.evolveum.midpoint.xml.ns._public.common.common_3.FocusType.F_ASSIGNMENT; import static com.evolveum.midpoint.xml.ns._public.common.common_3.MetadataType.F_CREATE_APPROVER_REF; import static com.evolveum.midpoint.xml.ns._public.common.common_3.MetadataType.F_CREATOR_REF; -import static com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType.F_EXTENSION; -import static com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType.F_METADATA; -import static com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType.F_NAME; -import static com.evolveum.midpoint.xml.ns._public.common.common_3.TaskType.F_OBJECT_REF; +import static com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType.*; import static com.evolveum.midpoint.xml.ns._public.common.common_3.TaskType.F_WORKFLOW_CONTEXT; import static com.evolveum.midpoint.xml.ns._public.common.common_3.TriggerType.F_TIMESTAMP; -import static com.evolveum.midpoint.xml.ns._public.common.common_3.WfContextType.F_PROCESS_INSTANCE_ID; -import static com.evolveum.midpoint.xml.ns._public.common.common_3.WfContextType.F_REQUESTER_REF; -import static com.evolveum.midpoint.xml.ns._public.common.common_3.WfContextType.F_START_TIMESTAMP; +import static com.evolveum.midpoint.xml.ns._public.common.common_3.WfContextType.*; import static org.testng.AssertJUnit.assertEquals; /** @@ -1119,12 +1082,9 @@ public void test160QueryTrigger() throws Exception { Session session = open(); try { XMLGregorianCalendar thisScanTimestamp = XmlTypeConverter.createXMLGregorianCalendar(NOW.getTime()); - - SchemaRegistry registry = prismContext.getSchemaRegistry(); - PrismObjectDefinition objectDef = registry.findObjectDefinitionByCompileTimeClass(ObjectType.class); - ItemPath triggerPath = new ItemPath(ObjectType.F_TRIGGER, F_TIMESTAMP); - ObjectFilter filter = LessFilter.createLess(triggerPath, objectDef, thisScanTimestamp, true); - ObjectQuery query = ObjectQuery.createObjectQuery(filter); + ObjectQuery query = QueryBuilder.queryFor(ObjectType.class, prismContext) + .item(ObjectType.F_TRIGGER, F_TIMESTAMP).le(thisScanTimestamp) + .build(); String real = getInterpretedQuery2(session, ObjectType.class, query); String expected = "select\n" + @@ -1321,15 +1281,11 @@ public void test200QueryTriggerTimestampDoubleWrong() throws Exception { try { XMLGregorianCalendar thisScanTimestamp = XmlTypeConverter.createXMLGregorianCalendar(NOW.getTime()); - SchemaRegistry registry = prismContext.getSchemaRegistry(); - PrismObjectDefinition objectDef = registry.findObjectDefinitionByCompileTimeClass(ObjectType.class); - ItemPath triggerPath = new ItemPath(ObjectType.F_TRIGGER, F_TIMESTAMP); - ObjectFilter greater = GreaterFilter.createGreater(triggerPath, objectDef, thisScanTimestamp, false); - ObjectFilter lesser = LessFilter.createLess(triggerPath, objectDef, thisScanTimestamp, false); - AndFilter and = AndFilter.createAnd(greater, lesser); - LOGGER.info(and.debugDump()); - - ObjectQuery query = ObjectQuery.createObjectQuery(and); + ObjectQuery query = QueryBuilder.queryFor(ObjectType.class, prismContext) + .item(ObjectType.F_TRIGGER, F_TIMESTAMP).gt(thisScanTimestamp) + .and().item(ObjectType.F_TRIGGER, F_TIMESTAMP).lt(thisScanTimestamp) + .build(); + LOGGER.info(query.debugDump()); String real = getInterpretedQuery2(session, ObjectType.class, query); // correct translation but the filter is wrong: we need to point to THE SAME timestamp -> i.e. ForValue should be used here @@ -1473,11 +1429,6 @@ public void test340QueryOrgTreeFindOrgs() throws Exception { Session session = open(); try { - OrgFilter orgFilter = OrgFilter.createOrg("some oid", OrgFilter.Scope.ONE_LEVEL); - ObjectQuery query0 = ObjectQuery.createObjectQuery(orgFilter); - query0.setPaging(ObjectPaging.createPaging(null, null, F_NAME, ASCENDING)); - query0.setUseNewQueryInterpreter(true); - ObjectQuery query = QueryBuilder.queryFor(OrgType.class, prismContext) .isDirectChildOf("some oid") .asc(ObjectType.F_NAME) @@ -1616,18 +1567,6 @@ public void test400ActivationQueryWrong() throws Exception { XMLGregorianCalendar thisScanTimestamp = XMLGregorianCalendarType.asXMLGregorianCalendar(new Date()); - OrFilter filter = OrFilter.createOr( - LessFilter.createLess(new ItemPath(FocusType.F_ACTIVATION, ActivationType.F_VALID_FROM), focusObjectDef, - thisScanTimestamp, true), - LessFilter.createLess(new ItemPath(FocusType.F_ACTIVATION, ActivationType.F_VALID_TO), focusObjectDef, - thisScanTimestamp, true), - LessFilter.createLess(new ItemPath(F_ASSIGNMENT, AssignmentType.F_ACTIVATION, ActivationType.F_VALID_FROM), - focusObjectDef, thisScanTimestamp, true), - LessFilter.createLess(new ItemPath(F_ASSIGNMENT, AssignmentType.F_ACTIVATION, ActivationType.F_VALID_TO), - focusObjectDef, thisScanTimestamp, true) - ); - ObjectQuery query0 = ObjectQuery.createObjectQuery(filter); - ObjectQuery query = QueryBuilder.queryFor(FocusType.class, prismContext) .item(FocusType.F_ACTIVATION, ActivationType.F_VALID_FROM).le(thisScanTimestamp) .or().item(FocusType.F_ACTIVATION, ActivationType.F_VALID_TO).le(thisScanTimestamp) @@ -1677,19 +1616,6 @@ public void test405ActivationQueryCorrect() throws Exception { XMLGregorianCalendar thisScanTimestamp = XMLGregorianCalendarType.asXMLGregorianCalendar(new Date()); - OrFilter filter = OrFilter.createOr( - LessFilter.createLess(new ItemPath(FocusType.F_ACTIVATION, ActivationType.F_VALID_FROM), focusObjectDef, - thisScanTimestamp, true), - LessFilter.createLess(new ItemPath(FocusType.F_ACTIVATION, ActivationType.F_VALID_TO), focusObjectDef, - thisScanTimestamp, true), - ExistsFilter.createExists(new ItemPath(F_ASSIGNMENT), focusObjectDef, - OrFilter.createOr( - LessFilter.createLess(new ItemPath(FocusType.F_ACTIVATION, ActivationType.F_VALID_FROM), - assignmentDef, thisScanTimestamp, true), - LessFilter.createLess(new ItemPath(FocusType.F_ACTIVATION, ActivationType.F_VALID_TO), - assignmentDef, thisScanTimestamp, true)))); - ObjectQuery query0 = ObjectQuery.createObjectQuery(filter); - ObjectQuery query = QueryBuilder.queryFor(FocusType.class, prismContext) .item(FocusType.F_ACTIVATION, ActivationType.F_VALID_FROM).le(thisScanTimestamp) .or().item(FocusType.F_ACTIVATION, ActivationType.F_VALID_TO).le(thisScanTimestamp) @@ -1739,34 +1665,6 @@ public void test410ActivationQueryWrong() throws Exception { XMLGregorianCalendar lastScanTimestamp = XMLGregorianCalendarType.asXMLGregorianCalendar(new Date()); XMLGregorianCalendar thisScanTimestamp = XMLGregorianCalendarType.asXMLGregorianCalendar(new Date()); - OrFilter filter = OrFilter.createOr( - AndFilter.createAnd( - GreaterFilter.createGreater(new ItemPath(FocusType.F_ACTIVATION, ActivationType.F_VALID_FROM), focusObjectDef, - lastScanTimestamp, false), - LessFilter.createLess(new ItemPath(FocusType.F_ACTIVATION, ActivationType.F_VALID_FROM), focusObjectDef, - thisScanTimestamp, true) - ), - AndFilter.createAnd( - GreaterFilter.createGreater(new ItemPath(FocusType.F_ACTIVATION, ActivationType.F_VALID_TO), focusObjectDef, - lastScanTimestamp, false), - LessFilter.createLess(new ItemPath(FocusType.F_ACTIVATION, ActivationType.F_VALID_TO), focusObjectDef, - thisScanTimestamp, true) - ), - AndFilter.createAnd( - GreaterFilter.createGreater(new ItemPath(F_ASSIGNMENT, FocusType.F_ACTIVATION, ActivationType.F_VALID_FROM), - focusObjectDef, lastScanTimestamp, false), - LessFilter.createLess(new ItemPath(F_ASSIGNMENT, FocusType.F_ACTIVATION, ActivationType.F_VALID_FROM), - focusObjectDef, thisScanTimestamp, true) - ), - AndFilter.createAnd( - GreaterFilter.createGreater(new ItemPath(F_ASSIGNMENT, FocusType.F_ACTIVATION, ActivationType.F_VALID_TO), - focusObjectDef, lastScanTimestamp, false), - LessFilter.createLess(new ItemPath(F_ASSIGNMENT, FocusType.F_ACTIVATION, ActivationType.F_VALID_TO), - focusObjectDef, thisScanTimestamp, true) - ) - ); - ObjectQuery query0 = ObjectQuery.createObjectQuery(filter); - ObjectQuery query = QueryBuilder.queryFor(FocusType.class, prismContext) .block() .item(FocusType.F_ACTIVATION, ActivationType.F_VALID_FROM).gt(lastScanTimestamp) @@ -1786,8 +1684,6 @@ public void test410ActivationQueryWrong() throws Exception { .endBlock() .build(); - //QueryBuilder.queryFor(UserType.class, prismContext); - Session session = open(); try { String real = getInterpretedQuery2(session, UserType.class, query, false); @@ -1843,37 +1739,6 @@ public void test415ActivationQueryCorrect() throws Exception { XMLGregorianCalendar lastScanTimestamp = XMLGregorianCalendarType.asXMLGregorianCalendar(new Date()); XMLGregorianCalendar thisScanTimestamp = XMLGregorianCalendarType.asXMLGregorianCalendar(new Date()); - OrFilter filter = OrFilter.createOr( - AndFilter.createAnd( - GreaterFilter.createGreater(new ItemPath(FocusType.F_ACTIVATION, ActivationType.F_VALID_FROM), focusObjectDef, - lastScanTimestamp, false), - LessFilter.createLess(new ItemPath(FocusType.F_ACTIVATION, ActivationType.F_VALID_FROM), focusObjectDef, - thisScanTimestamp, true) - ), - AndFilter.createAnd( - GreaterFilter.createGreater(new ItemPath(FocusType.F_ACTIVATION, ActivationType.F_VALID_TO), focusObjectDef, - lastScanTimestamp, false), - LessFilter.createLess(new ItemPath(FocusType.F_ACTIVATION, ActivationType.F_VALID_TO), focusObjectDef, - thisScanTimestamp, true) - ), - AndFilter.createAnd( - ExistsFilter.createExists(new ItemPath(F_ASSIGNMENT), focusObjectDef, - OrFilter.createOr( - AndFilter.createAnd( - GreaterFilter.createGreater(new ItemPath(FocusType.F_ACTIVATION, ActivationType.F_VALID_FROM), - assignmentDef, lastScanTimestamp, false), - LessFilter.createLess(new ItemPath(FocusType.F_ACTIVATION, ActivationType.F_VALID_FROM), - assignmentDef, thisScanTimestamp, true) - ), - AndFilter.createAnd( - GreaterFilter.createGreater(new ItemPath(FocusType.F_ACTIVATION, ActivationType.F_VALID_TO), - assignmentDef, lastScanTimestamp, false), - LessFilter.createLess(new ItemPath(FocusType.F_ACTIVATION, ActivationType.F_VALID_TO), - assignmentDef, thisScanTimestamp, true)))) - ) - ); - ObjectQuery query0 = ObjectQuery.createObjectQuery(filter); - ObjectQuery query = QueryBuilder.queryFor(FocusType.class, prismContext) .block() .item(FocusType.F_ACTIVATION, ActivationType.F_VALID_FROM).gt(lastScanTimestamp) @@ -1979,9 +1844,10 @@ private void checkQueryResult(Class type, String oid, throws Exception { LOGGER.info("checkQueryResult"); - OrgFilter orgFilter = OrgFilter.createOrg(oid, scope); - ObjectQuery query = ObjectQuery.createObjectQuery(orgFilter); - query.setPaging(ObjectPaging.createPaging(null, null, F_NAME, ASCENDING)); + ObjectQuery query = QueryBuilder.queryFor(type, prismContext) + .isInScopeOf(oid, scope) + .asc(F_NAME) + .build(); query.setUseNewQueryInterpreter(true); OperationResult result = new OperationResult("checkQueryResult"); @@ -1990,13 +1856,13 @@ private void checkQueryResult(Class type, String oid, LOGGER.info("{}", object.getOid()); } int realCount = objects.size(); - assertEquals("Expected count doesn't match for searchObjects " + orgFilter, count, realCount); + assertEquals("Expected count doesn't match for searchObjects " + query, count, realCount); result.computeStatusIfUnknown(); AssertJUnit.assertTrue(result.isSuccess()); realCount = repositoryService.countObjects(type, query, result); - assertEquals("Expected count doesn't match for countObjects " + orgFilter, count, realCount); + assertEquals("Expected count doesn't match for countObjects " + query, count, realCount); result.computeStatusIfUnknown(); AssertJUnit.assertTrue(result.isSuccess()); @@ -2169,12 +2035,10 @@ public void test560queryMetadataTimestamp() throws Exception { try { XMLGregorianCalendar timeXml = XMLGregorianCalendarType.asXMLGregorianCalendar(new Date()); - - LessFilter less = LessFilter.createLess( - new ItemPath(ReportOutputType.F_METADATA, MetadataType.F_CREATE_TIMESTAMP), - ReportOutputType.class, prismContext, timeXml, true); - - String real = getInterpretedQuery2(session, ReportOutputType.class, ObjectQuery.createObjectQuery(less)); + ObjectQuery query = QueryBuilder.queryFor(ReportOutputType.class, prismContext) + .item(ReportOutputType.F_METADATA, MetadataType.F_CREATE_TIMESTAMP).le(timeXml) + .build(); + String real = getInterpretedQuery2(session, ReportOutputType.class, query); String expected = "select\n" + " r.fullObject,\n" + " r.stringsCount,\n" + diff --git a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/closure/AbstractOrgClosureTest.java b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/closure/AbstractOrgClosureTest.java index 9c8b9f635eb..c643ea75fa7 100644 --- a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/closure/AbstractOrgClosureTest.java +++ b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/closure/AbstractOrgClosureTest.java @@ -30,6 +30,7 @@ import com.evolveum.midpoint.prism.query.ObjectFilter; import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.prism.query.OrgFilter; +import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import com.evolveum.midpoint.repo.sql.BaseSQLRepoTest; import com.evolveum.midpoint.repo.sql.data.common.ROrgClosure; import com.evolveum.midpoint.repo.sql.data.common.other.RObjectType; @@ -647,9 +648,9 @@ protected void removeOrgStructure(OperationResult result) throws Exception { protected void removeOrgStructure(String nodeOid, OperationResult result) throws Exception { removeUsersFromOrg(nodeOid, result); - ObjectQuery query = new ObjectQuery(); - ObjectFilter filter = OrgFilter.createOrg(nodeOid, OrgFilter.Scope.ONE_LEVEL); - query.setFilter(filter); + ObjectQuery query = QueryBuilder.queryFor(OrgType.class, prismContext) + .isDirectChildOf(nodeOid) + .build(); List> subOrgs = repositoryService.searchObjects(OrgType.class, query, null, result); for (PrismObject subOrg : subOrgs) { removeOrgStructure(subOrg.getOid(), result); @@ -663,9 +664,9 @@ protected void removeOrgStructure(String nodeOid, OperationResult result) throws } protected void removeUsersFromOrg(String nodeOid, OperationResult result) throws Exception { - ObjectQuery query = new ObjectQuery(); - ObjectFilter filter = OrgFilter.createOrg(nodeOid, OrgFilter.Scope.ONE_LEVEL); - query.setFilter(filter); + ObjectQuery query = QueryBuilder.queryFor(UserType.class, prismContext) + .isDirectChildOf(nodeOid) + .build(); List> users = repositoryService.searchObjects(UserType.class, query, null, result); for (PrismObject user : users) { try { diff --git a/repo/security-impl/src/main/java/com/evolveum/midpoint/security/impl/SecurityEnforcerImpl.java b/repo/security-impl/src/main/java/com/evolveum/midpoint/security/impl/SecurityEnforcerImpl.java index 99c64765e22..ce0c56293d6 100644 --- a/repo/security-impl/src/main/java/com/evolveum/midpoint/security/impl/SecurityEnforcerImpl.java +++ b/repo/security-impl/src/main/java/com/evolveum/midpoint/security/impl/SecurityEnforcerImpl.java @@ -24,6 +24,7 @@ import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import com.evolveum.midpoint.prism.query.builder.S_AtomicFilterExit; +import com.evolveum.midpoint.prism.query.builder.S_FilterEntryOrEmpty; import org.aopalliance.intercept.MethodInvocation; import org.apache.commons.lang.BooleanUtils; import org.apache.commons.lang.mutable.MutableBoolean; @@ -1022,7 +1023,8 @@ private ObjectFilter preProcessObje // Org if (specOrgRef != null) { - OrgFilter orgFilter = OrgFilter.createOrg(specOrgRef.getOid()); + ObjectFilter orgFilter = QueryBuilder.queryFor(ObjectType.class, prismContext) + .isChildOf(specOrgRef.getOid()).buildFilter(); objSpecSecurityFilter = ObjectQueryUtil.filterAnd(objSpecSecurityFilter, orgFilter); LOGGER.trace(" applying org filter {}", orgFilter); } else { @@ -1035,23 +1037,21 @@ private ObjectFilter preProcessObje QName subjectRelation = specOrgRelation.getSubjectRelation(); for (ObjectReferenceType subjectParentOrgRef: principal.getUser().getParentOrgRef()) { if (MiscSchemaUtil.compareRelation(subjectRelation, subjectParentOrgRef.getRelation())) { - OrgFilter orgFilter = null; + S_FilterEntryOrEmpty q = QueryBuilder.queryFor(ObjectType.class, prismContext); + S_AtomicFilterExit q2; if (specOrgRelation.getScope() == null || specOrgRelation.getScope() == OrgScopeType.ALL_DESCENDANTS) { - orgFilter = OrgFilter.createOrg(subjectParentOrgRef.getOid(), OrgFilter.Scope.SUBTREE); + q2 = q.isChildOf(subjectParentOrgRef.getOid()); } else if (specOrgRelation.getScope() == OrgScopeType.DIRECT_DESCENDANTS) { - orgFilter = OrgFilter.createOrg(subjectParentOrgRef.getOid(), OrgFilter.Scope.ONE_LEVEL); + q2 = q.isDirectChildOf(subjectParentOrgRef.getOid()); } else if (specOrgRelation.getScope() == OrgScopeType.ALL_ANCESTORS) { - orgFilter = OrgFilter.createOrg(subjectParentOrgRef.getOid(), OrgFilter.Scope.ANCESTORS); + q2 = q.isParentOf(subjectParentOrgRef.getOid()); } else { throw new UnsupportedOperationException("Unknown orgRelation scope "+specOrgRelation.getScope()); } if (BooleanUtils.isTrue(specOrgRelation.isIncludeReferenceOrg())) { - InOidFilter oidFilter = InOidFilter.createInOid(subjectParentOrgRef.getOid()); - objSpecOrgRelationFilter = ObjectQueryUtil.filterAnd(objSpecOrgRelationFilter, - ObjectQueryUtil.filterOr(orgFilter, oidFilter)); - } else { - objSpecOrgRelationFilter = ObjectQueryUtil.filterAnd(objSpecOrgRelationFilter, orgFilter); + q2 = q2.or().id(subjectParentOrgRef.getOid()); } + objSpecOrgRelationFilter = ObjectQueryUtil.filterAnd(objSpecOrgRelationFilter, q2.buildFilter()); } } if (objSpecOrgRelationFilter == null) { diff --git a/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/TaskManagerQuartzImpl.java b/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/TaskManagerQuartzImpl.java index da2552bb85b..78c9dd77d9c 100644 --- a/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/TaskManagerQuartzImpl.java +++ b/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/TaskManagerQuartzImpl.java @@ -22,14 +22,9 @@ import com.evolveum.midpoint.prism.delta.ItemDelta; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.polystring.PolyString; -import com.evolveum.midpoint.prism.query.AndFilter; -import com.evolveum.midpoint.prism.query.EqualFilter; -import com.evolveum.midpoint.prism.query.LessFilter; -import com.evolveum.midpoint.prism.query.ObjectFilter; import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import com.evolveum.midpoint.prism.query.builder.S_AtomicFilterEntry; -import com.evolveum.midpoint.prism.query.builder.S_FilterEntryOrEmpty; import com.evolveum.midpoint.prism.xml.XmlTypeConverter; import com.evolveum.midpoint.repo.api.RepositoryService; import com.evolveum.midpoint.schema.GetOperationOptions; @@ -50,16 +45,8 @@ import com.evolveum.midpoint.util.logging.LoggingUtils; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; -import com.evolveum.midpoint.xml.ns._public.common.common_3.CleanupPolicyType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.NodeErrorStatusType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.NodeExecutionStatusType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.NodeType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.OperationStatsType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskExecutionStatusType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.*; import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; - import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.Validate; import org.quartz.JobKey; @@ -77,16 +64,8 @@ import javax.annotation.PreDestroy; import javax.xml.datatype.Duration; import javax.xml.datatype.XMLGregorianCalendar; - import java.text.ParseException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Date; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.util.concurrent.CancellationException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; From c683bf0e0b99f351399eac3ac7cc1d699cc6f87d Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Wed, 12 Oct 2016 22:52:55 +0200 Subject: [PATCH 31/74] Continuing filters cleanup. --- .../model/common/expression/ExpressionUtil.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/ExpressionUtil.java b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/ExpressionUtil.java index 197d641d3b8..44d40cf2cee 100644 --- a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/ExpressionUtil.java +++ b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/ExpressionUtil.java @@ -533,18 +533,18 @@ private static ObjectFilter evaluateFilterExpressionsInternal(ObjectFilter filte } return evaluatedFilter; - } else if (filter instanceof PropertyValueFilter) { - PropertyValueFilter pvfilter = (PropertyValueFilter) filter; + } else if (filter instanceof ValueFilter) { + ValueFilter valueFilter = (ValueFilter) filter; - if (pvfilter.getValues() != null && !pvfilter.getValues().isEmpty()) { + if (valueFilter.getValues() != null && !valueFilter.getValues().isEmpty()) { // We have value. Nothing to evaluate. - return pvfilter.clone(); + return valueFilter.clone(); } - ExpressionWrapper expressionWrapper = pvfilter.getExpression(); + ExpressionWrapper expressionWrapper = valueFilter.getExpression(); if (expressionWrapper == null || expressionWrapper.getExpression() == null) { LOGGER.warn("No valueExpression in filter in {}. Returning original filter", shortDesc); - return pvfilter.clone(); + return valueFilter.clone(); } if (!(expressionWrapper.getExpression() instanceof ExpressionType)) { throw new SchemaException("Unexpected expression type " @@ -561,13 +561,13 @@ private static ObjectFilter evaluateFilterExpressionsInternal(ObjectFilter filte LOGGER.debug("Result of search filter expression was null or empty. Expression: {}", valueExpression); - return createFilterForNoValue(pvfilter, valueExpression); + return createFilterForNoValue(valueFilter, valueExpression); } // TODO: log more context LOGGER.trace("Search filter expression in the rule for {} evaluated to {}.", new Object[] { shortDesc, expressionResult }); - ValueFilter evaluatedFilter = pvfilter.clone(); + ValueFilter evaluatedFilter = valueFilter.clone(); evaluatedFilter.setValue(expressionResult); evaluatedFilter.setExpression(null); // } From 2f3fce5f0dab61f8340b098c9ce49ace0f28ad6b Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Thu, 13 Oct 2016 09:17:06 +0200 Subject: [PATCH 32/74] Fixing tests. --- .../certification/test/BasicCertificationTest.java | 2 +- .../midpoint/model/common/expression/ExpressionUtil.java | 6 +++--- .../java/com/evolveum/midpoint/model/impl/util/Utils.java | 2 +- .../sql/query/restriction/AnyPropertyRestriction.java | 8 +------- .../repo/sql/query/restriction/ItemRestriction.java | 4 ++-- 5 files changed, 8 insertions(+), 14 deletions(-) diff --git a/model/certification-impl/src/test/java/com/evolveum/midpoint/certification/test/BasicCertificationTest.java b/model/certification-impl/src/test/java/com/evolveum/midpoint/certification/test/BasicCertificationTest.java index 3bd78fd0dac..04a24c5cb29 100644 --- a/model/certification-impl/src/test/java/com/evolveum/midpoint/certification/test/BasicCertificationTest.java +++ b/model/certification-impl/src/test/java/com/evolveum/midpoint/certification/test/BasicCertificationTest.java @@ -341,7 +341,7 @@ public void test040SearchCasesFilteredSortedPaged() throws Exception { SelectorOptions.createCollection(GetOperationOptions.createResolveNames()); ObjectQuery query = QueryBuilder.queryFor(AccessCertificationCaseType.class, prismContext) .item(AccessCertificationCaseType.F_OBJECT_REF).ref(userAdministrator.getOid()) - .desc(F_TARGET_REF) + .desc(getOrderBy(F_TARGET_REF)) .offset(2).maxSize(2) .build(); List caseList = modelService.searchContainers( diff --git a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/ExpressionUtil.java b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/ExpressionUtil.java index 44d40cf2cee..934ddf7b0f6 100644 --- a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/ExpressionUtil.java +++ b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/ExpressionUtil.java @@ -638,14 +638,14 @@ private static ObjectFilter createFilterForNoValue(ObjectFilter filter, Expressi return AllFilter.createAll(); case FILTER_EQUAL_NULL: - if (filter instanceof PropertyValueFilter) { - PropertyValueFilter evaluatedFilter = (PropertyValueFilter) filter.clone(); + if (filter instanceof ValueFilter) { + ValueFilter evaluatedFilter = (ValueFilter) filter.clone(); evaluatedFilter.setExpression(null); return evaluatedFilter; } else if (filter instanceof InOidFilter) { return NoneFilter.createNone(); } else { - throw new IllegalArgumentException("Unknow filter to evaluate: " + filter); + throw new IllegalArgumentException("Unknown filter to evaluate: " + filter); } case ERROR: diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/util/Utils.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/util/Utils.java index 62f7924f488..bd0955940cc 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/util/Utils.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/util/Utils.java @@ -327,7 +327,7 @@ private static boolean containExpression(ObjectFilter filter){ return true; } - if (filter instanceof PropertyValueFilter && ((PropertyValueFilter) filter).getExpression() != null){ + if (filter instanceof ValueFilter && ((ValueFilter) filter).getExpression() != null){ return true; } diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query/restriction/AnyPropertyRestriction.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query/restriction/AnyPropertyRestriction.java index 6232cf99475..10c6760a285 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query/restriction/AnyPropertyRestriction.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query/restriction/AnyPropertyRestriction.java @@ -21,15 +21,11 @@ import com.evolveum.midpoint.prism.path.ItemPathSegment; import com.evolveum.midpoint.prism.path.NameItemPathSegment; import com.evolveum.midpoint.prism.query.ObjectFilter; -import com.evolveum.midpoint.prism.query.PropertyValueFilter; import com.evolveum.midpoint.prism.query.ValueFilter; -import com.evolveum.midpoint.repo.sql.data.common.RObject; import com.evolveum.midpoint.repo.sql.data.common.any.RAnyConverter; import com.evolveum.midpoint.repo.sql.data.common.any.RAnyValue; -import com.evolveum.midpoint.repo.sql.data.common.other.RObjectType; import com.evolveum.midpoint.repo.sql.data.common.type.RObjectExtensionType; import com.evolveum.midpoint.repo.sql.query.QueryException; -import com.evolveum.midpoint.repo.sql.query.QueryContext; import com.evolveum.midpoint.repo.sql.query.definition.AnyDefinition; import com.evolveum.midpoint.repo.sql.query.definition.Definition; import com.evolveum.midpoint.repo.sql.util.RUtil; @@ -38,13 +34,11 @@ import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; - import org.hibernate.criterion.Conjunction; import org.hibernate.criterion.Criterion; import org.hibernate.criterion.Restrictions; import javax.xml.namespace.QName; - import java.util.ArrayList; import java.util.List; @@ -108,7 +102,7 @@ public Criterion interpretInternal(ValueFilter filter) throws QueryException { conjunction.add(Restrictions.eq(propertyNamePrefix + RAnyValue.F_NAME, RUtil.qnameToString(name))); - Object testedValue = getValue(((PropertyValueFilter) filter).getValues()); + Object testedValue = getValue(filter.getValues()); Object value = RAnyConverter.getAggregatedRepoObject(testedValue); conjunction.add(createCriterion(propertyNamePrefix + RAnyValue.F_VALUE, value, filter)); diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query/restriction/ItemRestriction.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query/restriction/ItemRestriction.java index 0f30049cd5e..25b60d3da7d 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query/restriction/ItemRestriction.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query/restriction/ItemRestriction.java @@ -498,8 +498,8 @@ protected Object getValue(List values) { protected Object getValueFromFilter(ValueFilter filter, PropertyDefinition def) throws QueryException { Object value; - if (filter instanceof PropertyValueFilter) { - value = getValue(((PropertyValueFilter) filter).getValues()); + if (filter != null) { + value = getValue((filter).getValues()); } else { throw new QueryException("Unknown filter '" + filter + "', can't get value from it."); } From aef49595f43391874e8ca34061f6fe480756e2de Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Thu, 13 Oct 2016 09:35:54 +0200 Subject: [PATCH 33/74] Fixed reference to ModelService in ObjectMerger. --- .../evolveum/midpoint/model/impl/controller/ObjectMerger.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/ObjectMerger.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/ObjectMerger.java index b9bb70d8d32..ce6eb555d07 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/ObjectMerger.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/ObjectMerger.java @@ -19,6 +19,7 @@ import java.util.Collection; import java.util.List; +import com.evolveum.midpoint.model.api.ModelService; import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -98,7 +99,7 @@ public class ObjectMerger { // But cannot fix it right now. TODO: later refactor. // MID-3459 @Autowired(required = true) - private ModelController modelController; + private ModelService modelController; public Collection> mergeObjects(Class type, String leftOid, String rightOid, String mergeConfigurationName, Task task, OperationResult result) From afeaca6d96b474d0b8d56e5ef1aa84aba69f989f Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Thu, 13 Oct 2016 10:44:13 +0200 Subject: [PATCH 34/74] Temporarily removed prism-api. Fixed query in TestImportRecon. --- infra/pom.xml | 2 +- infra/prism-api/pom.xml | 195 ------------------ infra/prism-api/testng-integration.xml | 19 -- infra/prism-api/testng-unit.xml | 20 -- .../model/intest/sync/TestImportRecon.java | 5 +- 5 files changed, 4 insertions(+), 237 deletions(-) delete mode 100644 infra/prism-api/pom.xml delete mode 100644 infra/prism-api/testng-integration.xml delete mode 100644 infra/prism-api/testng-unit.xml diff --git a/infra/pom.xml b/infra/pom.xml index f9e91d1d1a6..625367758cb 100644 --- a/infra/pom.xml +++ b/infra/pom.xml @@ -52,7 +52,7 @@ common test-util prism - prism-api + prism-maven-plugin diff --git a/infra/prism-api/pom.xml b/infra/prism-api/pom.xml deleted file mode 100644 index aa8b4b26380..00000000000 --- a/infra/prism-api/pom.xml +++ /dev/null @@ -1,195 +0,0 @@ - - - - - 4.0.0 - com.evolveum.midpoint.infra - prism-api - 3.5-SNAPSHOT - midPoint Infrastructure - prism API - - infra - com.evolveum.midpoint - 3.5-SNAPSHOT - - - https://github.com/Evolveum/midpoint.git - git@github.com:Evolveum/midpoint.git - https://fisheye.evolveum.com/browse/midPoint - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - org.testng - testng - test - - - - - - - - - - - - - - - - - diff --git a/infra/prism-api/testng-integration.xml b/infra/prism-api/testng-integration.xml deleted file mode 100644 index ad76cb3698a..00000000000 --- a/infra/prism-api/testng-integration.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - diff --git a/infra/prism-api/testng-unit.xml b/infra/prism-api/testng-unit.xml deleted file mode 100644 index 6fe0e134e73..00000000000 --- a/infra/prism-api/testng-unit.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/sync/TestImportRecon.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/sync/TestImportRecon.java index effb4aa62bd..c9aa08ef993 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/sync/TestImportRecon.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/sync/TestImportRecon.java @@ -2523,8 +2523,9 @@ public void test610SearchDummyAccountsNameSubstring() throws Exception { ObjectQuery query = ObjectQueryUtil.createResourceAndObjectClassFilterPrefix(RESOURCE_DUMMY_OID, new QName(RESOURCE_DUMMY_NAMESPACE, "AccountObjectClass"), prismContext) - .and().itemWithDef(new ResourceAttributeDefinition(SchemaConstants.ICFS_NAME, DOMUtil.XSD_STRING, prismContext), - ShadowType.F_ATTRIBUTES, SchemaConstants.ICFS_NAME).eq("s") + .and().item(new ItemPath(ShadowType.F_ATTRIBUTES, SchemaConstants.ICFS_NAME), + new ResourceAttributeDefinition(SchemaConstants.ICFS_NAME, DOMUtil.XSD_STRING, prismContext)) + .contains("s") .build(); // WHEN From e74df51165e60a681a06adf76ccbf539441e6b49 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Thu, 13 Oct 2016 12:25:04 +0200 Subject: [PATCH 35/74] Selectable data language in debug pages. --- .../midpoint/gui/api/page/PageBase.java | 25 +++-- .../midpoint/web/component/AceEditor.java | 23 +++- .../admin/configuration/PageDebugView.java | 37 +++--- .../web/page/admin/reports/PageReport.java | 5 +- .../admin/resources/PageResourceEdit.java | 2 +- .../midpoint/prism/PrismParserImpl.java | 5 +- .../midpoint/prism/PrismParserImplNoIO.java | 3 +- .../midpoint/prism/PrismParserNoIO.java | 3 +- .../schema/util/AdminGuiConfigTypeUtil.java | 19 +++- .../xml/ns/public/common/common-core-3.xsd | 27 +++++ .../impl/security/UserProfileServiceImpl.java | 105 +++++++++--------- 11 files changed, 163 insertions(+), 91 deletions(-) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/page/PageBase.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/page/PageBase.java index 4ebf9899854..2726deec301 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/page/PageBase.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/page/PageBase.java @@ -33,6 +33,7 @@ import com.evolveum.midpoint.web.page.admin.configuration.*; import com.evolveum.midpoint.web.page.admin.reports.*; import com.evolveum.midpoint.web.page.self.*; +import com.evolveum.midpoint.xml.ns._public.common.common_3.*; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.Validate; import org.apache.wicket.AttributeModifier; @@ -159,10 +160,6 @@ import com.evolveum.midpoint.web.session.UserProfileStorage; import com.evolveum.midpoint.web.util.validation.MidpointFormValidatorRegistry; import com.evolveum.midpoint.wf.api.WorkflowManager; -import com.evolveum.midpoint.xml.ns._public.common.common_3.AdminGuiConfigurationType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.RichHyperlinkType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.WorkItemType; /** * @author lazyman @@ -870,8 +867,20 @@ public RestartResponseException getRestartResponseException(Class void validateObject(String xmlObject, final Holder

objectHolder, - boolean validateSchema, OperationResult result) { + protected void validateObject(String lexicalRepresentation, final Holder> objectHolder, + String language, boolean validateSchema, OperationResult result) { + + if (language == null || PrismContext.LANG_JSON.equals(language) || PrismContext.LANG_YAML.equals(language)) { + PrismObject object; + try { + object = getPrismContext().parserFor(lexicalRepresentation).language(language).parse(); + objectHolder.setValue(object); + } catch (RuntimeException | SchemaException e) { + result.recordFatalError("Couldn't parse object: " + e.getMessage(), e); + } + return; + } + EventHandler handler = new EventHandler() { @Override @@ -883,7 +892,7 @@ public EventResult preMarshall(Element objectElement, Node postValidationTree, @Override public EventResult postMarshall(PrismObject object, Element objectElement, OperationResult objectResult) { - objectHolder.setValue((P) object); + objectHolder.setValue((PrismObject) object); return EventResult.cont(); } @@ -894,7 +903,7 @@ public void handleGlobalError(OperationResult currentResult) { Validator validator = new Validator(getPrismContext(), handler); validator.setVerbose(true); validator.setValidateSchema(validateSchema); - validator.validateObject(xmlObject, result); + validator.validateObject(lexicalRepresentation, result); result.computeStatus(); } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/AceEditor.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/AceEditor.java index 97ded86034a..11d504bcb4f 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/AceEditor.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/AceEditor.java @@ -16,16 +16,32 @@ package com.evolveum.midpoint.web.component; +import com.evolveum.midpoint.prism.PrismContext; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.markup.head.IHeaderResponse; import org.apache.wicket.markup.head.OnDomReadyHeaderItem; import org.apache.wicket.markup.html.form.TextArea; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; +import org.jetbrains.annotations.Nullable; + +import java.util.HashMap; +import java.util.Map; public class AceEditor extends TextArea { public static final String MODE_XML = "ace/mode/xml"; + public static final String MODE_JSON = "ace/mode/json"; + public static final String MODE_YAML = "ace/mode/yaml"; + + public static final Map MODES = new HashMap<>(); + + static { + MODES.put(null, MODE_XML); + MODES.put(PrismContext.LANG_XML, MODE_XML); + MODES.put(PrismContext.LANG_JSON, MODE_JSON); + MODES.put(PrismContext.LANG_YAML, MODE_YAML); + } private IModel readonly = new Model(false); @@ -88,7 +104,11 @@ public void setMode(String mode) { this.mode = mode; } - public void setReadonly(boolean readonly) { + public void setModeForDataLanguage(@Nullable String dataLanguage) { + setMode(MODES.get(dataLanguage)); + } + + public void setReadonly(boolean readonly) { this.readonly.setObject(readonly); } @@ -102,4 +122,5 @@ public void refreshReadonly(AjaxRequestTarget target) { target.appendJavaScript(sb.toString()); } + } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageDebugView.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageDebugView.java index b2ddc95c654..01e0865d53c 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageDebugView.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageDebugView.java @@ -27,7 +27,6 @@ import com.evolveum.midpoint.schema.SchemaConstantsGenerated; import com.evolveum.midpoint.schema.SelectorOptions; import com.evolveum.midpoint.schema.result.OperationResult; -import com.evolveum.midpoint.schema.util.ReportTypeUtil; import com.evolveum.midpoint.security.api.AuthorizationConstants; import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.util.Holder; @@ -38,18 +37,12 @@ import com.evolveum.midpoint.web.application.PageDescriptor; import com.evolveum.midpoint.web.component.AjaxButton; import com.evolveum.midpoint.web.component.AjaxSubmitButton; -import com.evolveum.midpoint.web.component.assignment.AssignmentEditorDto; import com.evolveum.midpoint.web.component.AceEditor; import com.evolveum.midpoint.web.page.admin.dto.ObjectViewDto; import com.evolveum.midpoint.web.security.MidPointApplication; -import com.evolveum.midpoint.xml.ns._public.common.common_3.AccessCertificationCampaignType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.LookupTableType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ReportType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.*; import org.apache.commons.lang.StringUtils; -import org.apache.wicket.Page; import org.apache.wicket.RestartResponseException; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.markup.html.form.AjaxCheckBox; @@ -90,6 +83,7 @@ public class PageDebugView extends PageAdminConfiguration { private final IModel switchToPlainText = new Model<>(false); private TextArea plainTextarea; final Form mainForm = new Form("mainForm"); + private final String dataLanguage; public PageDebugView() { model = new LoadableModel(false) { @@ -99,9 +93,19 @@ protected ObjectViewDto load() { return loadObject(); } }; + dataLanguage = determineDataLanguage(); initLayout(); } + private String determineDataLanguage() { + AdminGuiConfigurationType config = loadAdminGuiConfiguration(); + if (config != null && config.getPreferredDataLanguage() != null) { + return config.getPreferredDataLanguage(); + } else { + return PrismContext.LANG_XML; + } + } + @Override protected IModel createPageTitleModel() { return new AbstractReadOnlyModel() { @@ -159,8 +163,8 @@ private ObjectViewDto loadObject() { PrismObject object = getModelService().getObject(type, objectOid.toString(), options, task, result); PrismContext context = application.getPrismContext(); - String xml = context.serializeObjectToString(object, PrismContext.LANG_XML); - dto = new ObjectViewDto(object.getOid(), WebComponentUtil.getName(object), object, xml); + String lex = context.serializerFor(dataLanguage).serialize(object); + dto = new ObjectViewDto(object.getOid(), WebComponentUtil.getName(object), object, lex); result.recomputeStatus(); } catch (Exception ex) { @@ -172,7 +176,7 @@ private ObjectViewDto loadObject() { throw new RestartResponseException(PageDebugList.class); } - showResult(result, false); + showResult(result, false); if (!WebComponentUtil.isSuccessOrHandledErrorOrWarning(result)) { showResult(result, false); @@ -185,8 +189,6 @@ private ObjectViewDto loadObject() { private void initLayout() { add(mainForm); -// final IModel editable = new Model(false); - mainForm.add(new AjaxCheckBox("encrypt", encrypt) { @Override @@ -219,7 +221,7 @@ protected void onUpdate(AjaxRequestTarget target) { @Override protected void onUpdate(AjaxRequestTarget target) { - if (switchToPlainText.getObject().booleanValue()){ + if (switchToPlainText.getObject()){ editor.setVisible(false); plainTextarea.setVisible(true); } else { @@ -237,6 +239,7 @@ protected void onUpdate(AjaxRequestTarget target) { mainForm.add(plainTextarea); editor = new AceEditor("aceEditor", new PropertyModel(model, ObjectViewDto.F_XML)); + editor.setModeForDataLanguage(dataLanguage); mainForm.add(editor); initButtons(mainForm); @@ -296,11 +299,11 @@ public void savePerformed(AjaxRequestTarget target) { PrismObject oldObject = dto.getObject(); oldObject.revive(getPrismContext()); - Holder> objectHolder = new Holder>(null); + Holder> objectHolder = new Holder<>(null); if (editor.isVisible()) { - validateObject(editor.getModel().getObject(), objectHolder, validateSchema.getObject(), result); + validateObject(editor.getModel().getObject(), objectHolder, dataLanguage, validateSchema.getObject(), result); } else { - validateObject(plainTextarea.getModel().getObject(), objectHolder, validateSchema.getObject(), result); + validateObject(plainTextarea.getModel().getObject(), objectHolder, dataLanguage, validateSchema.getObject(), result); } if (result.isAcceptable()) { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/PageReport.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/PageReport.java index ed2e075be60..366b156e2bb 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/PageReport.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/PageReport.java @@ -15,7 +15,6 @@ */ package com.evolveum.midpoint.web.page.admin.reports; -import java.io.Serializable; import java.util.ArrayList; import java.util.List; @@ -217,7 +216,7 @@ public void validate(IValidatable validatable) { OpResult opResult = null; try { - validateObject(value, reportHolder, true, result); + validateObject(value, reportHolder, PrismContext.LANG_XML, true, result); if(!result.isAcceptable()){ result.recordFatalError("Could not validate object", result.getCause()); @@ -262,7 +261,7 @@ public void setObject(String object) { Holder> reportHolder = new Holder<>(null); try { - validateObject(object, reportHolder, true, result); + validateObject(object, reportHolder, PrismContext.LANG_XML, true, result); model.getObject().setObject(reportHolder.getValue()); } catch (Exception e){ LOGGER.error("Could not set object. Validation problem occured." + result.getMessage()); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/PageResourceEdit.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/PageResourceEdit.java index e4afafd2d28..c9947013cdf 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/PageResourceEdit.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/PageResourceEdit.java @@ -214,7 +214,7 @@ private void savePerformed(AjaxRequestTarget target) { OperationResult result = task.getResult(); try { Holder> objectHolder = new Holder>(null); - validateObject(dto.getXml(), objectHolder, false, result); + validateObject(dto.getXml(), objectHolder, PrismContext.LANG_XML, false, result); if (result.isAcceptable()) { PrismObject newResource = objectHolder.getValue(); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserImpl.java index d693d54c127..ed0b0466656 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserImpl.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserImpl.java @@ -21,6 +21,7 @@ import com.evolveum.midpoint.prism.xnode.XNode; import com.evolveum.midpoint.util.exception.SchemaException; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import javax.xml.bind.JAXBElement; import javax.xml.namespace.QName; @@ -46,14 +47,14 @@ public PrismParserImpl(@NotNull ParserSource source, String language, @NotNull P this.helpers = helpers; } - private PrismParser create(ParserSource source, String language, @NotNull ParsingContext context, LexicalHelpers helpers) { + private PrismParser create(ParserSource source, @Nullable String language, @NotNull ParsingContext context, LexicalHelpers helpers) { return source.isIO() ? new PrismParserImplIO(source, language, context, helpers) : new PrismParserImplNoIO(source, language, context, helpers); } @Override - public PrismParser language(String language) { + public PrismParser language(@Nullable String language) { return create(this.source, language, this.context, this.helpers); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserImplNoIO.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserImplNoIO.java index 0fb431a9568..7c076dcf240 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserImplNoIO.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserImplNoIO.java @@ -20,6 +20,7 @@ import com.evolveum.midpoint.prism.xnode.XNode; import com.evolveum.midpoint.util.exception.SchemaException; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import javax.xml.bind.JAXBElement; import javax.xml.namespace.QName; @@ -37,7 +38,7 @@ public PrismParserImplNoIO(ParserSource source, String language, ParsingContext } @Override - public PrismParserNoIO language(String language) { + public PrismParserNoIO language(@Nullable String language) { return (PrismParserNoIO) super.language(language); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserNoIO.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserNoIO.java index b5edbfe8442..116266a316f 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserNoIO.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserNoIO.java @@ -19,6 +19,7 @@ import com.evolveum.midpoint.prism.xnode.XNode; import com.evolveum.midpoint.util.exception.SchemaException; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import javax.xml.bind.JAXBElement; import javax.xml.namespace.QName; @@ -35,7 +36,7 @@ */ public interface PrismParserNoIO extends PrismParser { - PrismParserNoIO language(String language); + PrismParserNoIO language(@Nullable String language); PrismParserNoIO xml(); PrismParserNoIO json(); PrismParserNoIO yaml(); diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/AdminGuiConfigTypeUtil.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/AdminGuiConfigTypeUtil.java index 6cda5218920..9b5ce4d9e48 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/AdminGuiConfigTypeUtil.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/AdminGuiConfigTypeUtil.java @@ -15,14 +15,15 @@ */ package com.evolveum.midpoint.schema.util; -import java.util.Collection; -import java.util.Iterator; - import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.xml.ns._public.common.common_3.AdminGuiConfigurationType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectFormType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectFormsType; import com.evolveum.midpoint.xml.ns._public.common.common_3.SystemConfigurationType; +import org.jetbrains.annotations.NotNull; + +import java.util.Iterator; +import java.util.List; /** * @author semancik @@ -30,8 +31,15 @@ */ public class AdminGuiConfigTypeUtil { - public static AdminGuiConfigurationType compileAdminGuiConfiguration(Collection adminGuiConfigurations, + public static AdminGuiConfigurationType compileAdminGuiConfiguration(@NotNull List adminGuiConfigurations, PrismObject systemConfiguration) { + + // if there's no admin config at all, return null (to preserve original behavior) + if (adminGuiConfigurations.isEmpty() && + (systemConfiguration == null || systemConfiguration.asObjectable().getAdminGuiConfiguration() == null)) { + return null; + } + AdminGuiConfigurationType composite = new AdminGuiConfigurationType(); if (systemConfiguration != null) { applyAdminGuiConfiguration(composite, systemConfiguration.asObjectable().getAdminGuiConfiguration()); @@ -51,6 +59,9 @@ private static void applyAdminGuiConfiguration(AdminGuiConfigurationType composi if (adminGuiConfiguration.getDefaultTimezone() != null) { composite.setDefaultTimezone(adminGuiConfiguration.getDefaultTimezone()); } + if (adminGuiConfiguration.getPreferredDataLanguage() != null) { + composite.setPreferredDataLanguage(adminGuiConfiguration.getPreferredDataLanguage()); + } if (adminGuiConfiguration.getObjectForms() != null) { if (composite.getObjectForms() == null) { composite.setObjectForms(adminGuiConfiguration.getObjectForms().clone()); diff --git a/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd b/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd index 770a3e8f7d5..8238653ab8b 100644 --- a/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd +++ b/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd @@ -2451,6 +2451,21 @@ + + + +

+ Specifies the admin GUI configuration that should be used + by this user. +

+ + + 3.5 + AdminGuiConfigurationType.adminGuiConfiguration + + + + @@ -9475,6 +9490,18 @@ + + + +

+ Preferred data language (e.g. xml, json, yaml - written in lowercase). Default is xml. +

+
+ + 3.5 + +
+
diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/security/UserProfileServiceImpl.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/security/UserProfileServiceImpl.java index 52261f60021..a545045442b 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/security/UserProfileServiceImpl.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/security/UserProfileServiceImpl.java @@ -189,66 +189,65 @@ private void initializePrincipalFromAssignments(MidPointPrincipal principal, Pri UserType userType = principal.getUser(); Collection authorizations = principal.getAuthorities(); - Collection adminGuiConfigurations = new ArrayList<>(); + List adminGuiConfigurations = new ArrayList<>(); Task task = taskManager.createTaskInstance(UserProfileServiceImpl.class.getName() + ".addAuthorizations"); OperationResult result = task.getResult(); principal.setApplicableSecurityPolicy(locateSecurityPolicy(principal, systemConfiguration, task, result)); - - if (userType.getAssignment().isEmpty()) { - if (systemConfiguration != null) { - principal.setAdminGuiConfiguration(systemConfiguration.asObjectable().getAdminGuiConfiguration()); - } - return; - } - - AssignmentEvaluator assignmentEvaluator = new AssignmentEvaluator<>(); - assignmentEvaluator.setRepository(repositoryService); - assignmentEvaluator.setFocusOdo(new ObjectDeltaObject(userType.asPrismObject(), null, userType.asPrismObject())); - assignmentEvaluator.setChannel(null); - assignmentEvaluator.setObjectResolver(objectResolver); - assignmentEvaluator.setSystemObjectCache(systemObjectCache); - assignmentEvaluator.setPrismContext(prismContext); - assignmentEvaluator.setMappingFactory(mappingFactory); - assignmentEvaluator.setMappingEvaluator(mappingEvaluator); - assignmentEvaluator.setActivationComputer(activationComputer); - assignmentEvaluator.setNow(clock.currentTimeXMLGregorianCalendar()); - - // We do need only authorizations. Therefore we not need to evaluate constructions, - // so switching it off is faster. It also avoids nasty problems with resources being down, - // resource schema not available, etc. - assignmentEvaluator.setEvaluateConstructions(false); - - // We do not have real lens context here. But the push methods in ModelExpressionThreadLocalHolder - // will need something to push on the stack. So give them context placeholder. - LensContext lensContext = new LensContextPlaceholder<>(prismContext); - assignmentEvaluator.setLensContext(lensContext); - - for(AssignmentType assignmentType: userType.getAssignment()) { - try { - ItemDeltaItem,PrismContainerDefinition> assignmentIdi = new ItemDeltaItem<>(); - assignmentIdi.setItemOld(LensUtil.createAssignmentSingleValueContainerClone(assignmentType)); - assignmentIdi.recompute(); - EvaluatedAssignment assignment = assignmentEvaluator.evaluate(assignmentIdi, false, userType, userType.toString(), task, result); - if (assignment.isValid()) { - authorizations.addAll(assignment.getAuthorizations()); - adminGuiConfigurations.addAll(assignment.getAdminGuiConfigurations()); + + if (!userType.getAssignment().isEmpty()) { + AssignmentEvaluator assignmentEvaluator = new AssignmentEvaluator<>(); + assignmentEvaluator.setRepository(repositoryService); + assignmentEvaluator.setFocusOdo(new ObjectDeltaObject<>(userType.asPrismObject(), null, userType.asPrismObject())); + assignmentEvaluator.setChannel(null); + assignmentEvaluator.setObjectResolver(objectResolver); + assignmentEvaluator.setSystemObjectCache(systemObjectCache); + assignmentEvaluator.setPrismContext(prismContext); + assignmentEvaluator.setMappingFactory(mappingFactory); + assignmentEvaluator.setMappingEvaluator(mappingEvaluator); + assignmentEvaluator.setActivationComputer(activationComputer); + assignmentEvaluator.setNow(clock.currentTimeXMLGregorianCalendar()); + + // We do need only authorizations. Therefore we not need to evaluate constructions, + // so switching it off is faster. It also avoids nasty problems with resources being down, + // resource schema not available, etc. + assignmentEvaluator.setEvaluateConstructions(false); + + // We do not have real lens context here. But the push methods in ModelExpressionThreadLocalHolder + // will need something to push on the stack. So give them context placeholder. + LensContext lensContext = new LensContextPlaceholder<>(prismContext); + assignmentEvaluator.setLensContext(lensContext); + + for (AssignmentType assignmentType: userType.getAssignment()) { + try { + ItemDeltaItem,PrismContainerDefinition> assignmentIdi = new ItemDeltaItem<>(); + assignmentIdi.setItemOld(LensUtil.createAssignmentSingleValueContainerClone(assignmentType)); + assignmentIdi.recompute(); + EvaluatedAssignment assignment = assignmentEvaluator.evaluate(assignmentIdi, false, userType, userType.toString(), task, result); + if (assignment.isValid()) { + authorizations.addAll(assignment.getAuthorizations()); + adminGuiConfigurations.addAll(assignment.getAdminGuiConfigurations()); + } + } catch (SchemaException e) { + LOGGER.error("Schema violation while processing assignment of {}: {}; assignment: {}", + userType, e.getMessage(), assignmentType, e); + } catch (ObjectNotFoundException e) { + LOGGER.error("Object not found while processing assignment of {}: {}; assignment: {}", + userType, e.getMessage(), assignmentType, e); + } catch (ExpressionEvaluationException e) { + LOGGER.error("Evaluation error while processing assignment of {}: {}; assignment: {}", + userType, e.getMessage(), assignmentType, e); + } catch (PolicyViolationException e) { + LOGGER.error("Policy violation while processing assignment of {}: {}; assignment: {}", + userType, e.getMessage(), assignmentType, e); } - } catch (SchemaException e) { - LOGGER.error("Schema violation while processing assignment of {}: {}; assignment: {}", - new Object[]{userType, e.getMessage(), assignmentType, e}); - } catch (ObjectNotFoundException e) { - LOGGER.error("Object not found while processing assignment of {}: {}; assignment: {}", - new Object[]{userType, e.getMessage(), assignmentType, e}); - } catch (ExpressionEvaluationException e) { - LOGGER.error("Evaluation error while processing assignment of {}: {}; assignment: {}", - new Object[]{userType, e.getMessage(), assignmentType, e}); - } catch (PolicyViolationException e) { - LOGGER.error("Policy violation while processing assignment of {}: {}; assignment: {}", - new Object[]{userType, e.getMessage(), assignmentType, e}); } - } + } + if (userType.getAdminGuiConfiguration() != null) { + // config from the user object should go last (to be applied as the last one) + adminGuiConfigurations.add(userType.getAdminGuiConfiguration()); + } principal.setAdminGuiConfiguration(AdminGuiConfigTypeUtil.compileAdminGuiConfiguration(adminGuiConfigurations, systemConfiguration)); } From 4b80e0b658419b75247e06d4c0a0652920250390 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Thu, 13 Oct 2016 16:03:23 +0200 Subject: [PATCH 36/74] Commenting and refining API for parsing. --- .../midpoint/prism/ParserElementSource.java | 12 +- .../midpoint/prism/ParserFileSource.java | 12 +- .../prism/ParserInputStreamSource.java | 11 +- .../evolveum/midpoint/prism/ParserSource.java | 20 ++- .../midpoint/prism/ParserStringSource.java | 11 +- .../midpoint/prism/PrismContainerValue.java | 56 +++++---- .../evolveum/midpoint/prism/PrismContext.java | 114 ++++++++++++++++-- .../midpoint/prism/PrismContextImpl.java | 41 ++++--- .../midpoint/prism/PrismObjectDefinition.java | 5 +- .../evolveum/midpoint/prism/PrismParser.java | 78 +++++++++++- .../midpoint/prism/PrismParserNoIO.java | 21 +++- .../midpoint/prism/lex/LexicalProcessor.java | 46 +++++-- .../prism/lex/LexicalProcessorRegistry.java | 6 +- .../prism/lex/dom/DomLexicalProcessor.java | 55 ++++----- .../json/AbstractJsonLexicalProcessor.java | 14 ++- .../prism/lex/json/JsonLexicalProcessor.java | 11 +- .../prism/lex/json/YamlLexicalProcessor.java | 11 +- .../{ => marshaller}/PrismParserImpl.java | 50 ++++---- .../{ => marshaller}/PrismParserImplIO.java | 12 +- .../{ => marshaller}/PrismParserImplNoIO.java | 18 ++- .../prism/marshaller/XNodeProcessor.java | 100 +++++++-------- .../prism/marshaller/XNodeSerializer.java | 4 +- .../midpoint/prism/schema/SchemaRegistry.java | 2 +- .../midpoint/prism/xnode/RootXNode.java | 16 +-- .../midpoint/prism/lex/TestDomParser.java | 2 +- .../parser/resource/TestParseResourceXml.java | 2 +- .../midpoint/wf/impl/util/MiscDataUtil.java | 2 +- 27 files changed, 496 insertions(+), 236 deletions(-) rename infra/prism/src/main/java/com/evolveum/midpoint/prism/{ => marshaller}/PrismParserImpl.java (77%) rename infra/prism/src/main/java/com/evolveum/midpoint/prism/{ => marshaller}/PrismParserImplIO.java (87%) rename infra/prism/src/main/java/com/evolveum/midpoint/prism/{ => marshaller}/PrismParserImplNoIO.java (92%) diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/ParserElementSource.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/ParserElementSource.java index 814744a69f3..fab208d5b2c 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/ParserElementSource.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/ParserElementSource.java @@ -16,6 +16,7 @@ package com.evolveum.midpoint.prism; +import org.jetbrains.annotations.NotNull; import org.w3c.dom.Element; import java.io.IOException; @@ -24,31 +25,32 @@ /** * @author mederly */ -@Deprecated public class ParserElementSource implements ParserSource { - private final Element element; + @NotNull private final Element element; - public ParserElementSource(Element element) { + public ParserElementSource(@NotNull Element element) { this.element = element; } + @NotNull public Element getElement() { return element; } + @NotNull @Override public InputStream getInputStream() throws IOException { throw new UnsupportedOperationException(); } @Override - public boolean closeAfterParsing() { + public boolean closeStreamAfterParsing() { return true; } @Override - public boolean isIO() { + public boolean throwsIOException() { return false; } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/ParserFileSource.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/ParserFileSource.java index 04ff1c7cdd8..53b02bd9109 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/ParserFileSource.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/ParserFileSource.java @@ -16,6 +16,8 @@ package com.evolveum.midpoint.prism; +import org.jetbrains.annotations.NotNull; + import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; @@ -26,28 +28,30 @@ */ public class ParserFileSource implements ParserSource { - private final File file; + @NotNull private final File file; - public ParserFileSource(File file) { + public ParserFileSource(@NotNull File file) { this.file = file; } + @NotNull public File getFile() { return file; } + @NotNull @Override public InputStream getInputStream() throws FileNotFoundException { return new FileInputStream(file); } @Override - public boolean closeAfterParsing() { + public boolean closeStreamAfterParsing() { return true; } @Override - public boolean isIO() { + public boolean throwsIOException() { return true; } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/ParserInputStreamSource.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/ParserInputStreamSource.java index 6e16345becf..0f2151b0596 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/ParserInputStreamSource.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/ParserInputStreamSource.java @@ -16,6 +16,8 @@ package com.evolveum.midpoint.prism; +import org.jetbrains.annotations.NotNull; + import java.io.InputStream; /** @@ -23,23 +25,24 @@ */ public class ParserInputStreamSource implements ParserSource { - private final InputStream inputStream; + @NotNull private final InputStream inputStream; - public ParserInputStreamSource(InputStream inputStream) { + public ParserInputStreamSource(@NotNull InputStream inputStream) { this.inputStream = inputStream; } + @NotNull public InputStream getInputStream() { return inputStream; } @Override - public boolean closeAfterParsing() { + public boolean closeStreamAfterParsing() { return false; // TODO eventually make configurable } @Override - public boolean isIO() { + public boolean throwsIOException() { return true; } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/ParserSource.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/ParserSource.java index 5583fe2e180..cbfd80590b7 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/ParserSource.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/ParserSource.java @@ -16,17 +16,33 @@ package com.evolveum.midpoint.prism; +import org.jetbrains.annotations.NotNull; + import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; /** + * Source for prism parser (file, input stream, string, DOM tree, ...). + * * @author mederly */ public interface ParserSource { + + /** + * Presents the input data in the form of an InputStream. + * For some special cases might not be implemented, and the data could be accessed in another way. + */ + @NotNull InputStream getInputStream() throws IOException; - boolean closeAfterParsing(); + /** + * Should the stream be closed after parsing? Useful for sources that create/open the stream themselves. + */ + boolean closeStreamAfterParsing(); - boolean isIO(); + /** + * Is the source expected to throw IOExceptions? + */ + boolean throwsIOException(); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/ParserStringSource.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/ParserStringSource.java index 39f8b4ea65e..a3a09732c06 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/ParserStringSource.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/ParserStringSource.java @@ -17,6 +17,7 @@ package com.evolveum.midpoint.prism; import org.apache.commons.io.IOUtils; +import org.jetbrains.annotations.NotNull; import java.io.IOException; import java.io.InputStream; @@ -26,28 +27,30 @@ */ public class ParserStringSource implements ParserSource { - private final String data; + @NotNull private final String data; - public ParserStringSource(String data) { + public ParserStringSource(@NotNull String data) { this.data = data; } + @NotNull public String getData() { return data; } + @NotNull @Override public InputStream getInputStream() throws IOException { return IOUtils.toInputStream(data, "utf-8"); } @Override - public boolean closeAfterParsing() { + public boolean closeStreamAfterParsing() { return true; } @Override - public boolean isIO() { + public boolean throwsIOException() { return false; } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerValue.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerValue.java index 980cd7fb972..73c255b91d0 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerValue.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerValue.java @@ -89,16 +89,23 @@ public class PrismContainerValue extends PrismValue imp transient private PrismContext prismContext; - public PrismContainerValue() { - super(); - // Nothing to do - } + public PrismContainerValue() { + } - public PrismContainerValue(PrismContext prismContext) { - this(); - setPrismContext(prismContext); + public PrismContainerValue(C containerable) { + this(containerable, null); } + public PrismContainerValue(PrismContext prismContext) { + this(null, prismContext); + } + + public PrismContainerValue(C containerable, PrismContext prismContext) { + this.containerable = containerable; + this.prismContext = prismContext; + } + + private void setPrismContext(PrismContext prismContext) { //Validate.notNull(prismContext, "No prismContext in PrismContainerValue"); // not yet //if (prismContext == null) { @@ -262,26 +269,30 @@ public ItemPath getPath() { public C getValue() { return asContainerable(); } - - private List createElement() { - return new ArrayList(); - } + @SuppressWarnings("unchecked") public C asContainerable() { + if (containerable != null) { + return containerable; + } + PrismContainerable parent = getParent(); - if (parent == null) { - throw new IllegalStateException("Cannot represent container value without a parent as containerable; value: "+this); + PrismContainerDefinition concreteTypeDefinition = getConcreteTypeDefinition(); + + if (parent == null && concreteTypeDefinition == null) { + throw new IllegalStateException("Cannot represent container value without a parent and concrete type definition as containerable; value: " + this); } - Class clazz = null; - if (concreteType != null) { - clazz = resolveConcreteClass(parent); + Class clazz = null; + if (concreteTypeDefinition != null && concreteTypeDefinition.getCompileTimeClass() != null) { + clazz = concreteTypeDefinition.getCompileTimeClass(); } - if (clazz == null) { + if (clazz == null && parent != null) { clazz = parent.getCompileTimeClass(); } if (clazz == null) { - throw new SystemException("Unknown compile time class of container '" + parent.getElementName() + "'."); + QName elementName = parent != null ? parent.getElementName() : concreteTypeDefinition.getName(); + throw new SystemException("Unknown compile time class of container '" + elementName + "'."); } if (Modifier.isAbstract(clazz.getModifiers())) { throw new SystemException("Can't create instance of class '" + clazz.getSimpleName() + "', it's abstract."); @@ -303,7 +314,11 @@ private Class resolveConcreteClass(PrismContainerable parent) { } public C asContainerable(Class defaultClazz) { - Class clazz = defaultClazz; + if (containerable != null) { + return containerable; + } + + Class clazz = defaultClazz; if (concreteType != null) { PrismContainerable parent = getParent(); if (parent != null) { @@ -316,9 +331,6 @@ public C asContainerable(Class defaultClazz) { } private C asContainerableInternal(Class clazz) { - if (containerable != null) { - return containerable ; - } try { containerable = clazz.newInstance(); containerable.setupContainerValue(this); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java index 24739962b7f..5d27f93201e 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java @@ -30,7 +30,7 @@ import com.evolveum.midpoint.prism.xnode.XNode; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.prism.xml.ns._public.types_3.RawType; -import org.w3c.dom.Document; +import org.jetbrains.annotations.NotNull; import org.w3c.dom.Element; import org.xml.sax.SAXException; @@ -73,10 +73,38 @@ public interface PrismContext { void setMonitor(PrismMonitor monitor); //region Parsing - PrismParser parserFor(File file); - PrismParser parserFor(InputStream stream); - PrismParserNoIO parserFor(String data); - @Deprecated PrismParserNoIO parserFor(Element element); + /** + * Creates a parser ready to process the given file. + * @param file File to be parsed. + * @return Parser that can be invoked to retrieve the (parsed) content of the file. + */ + @NotNull + PrismParser parserFor(@NotNull File file); + + /** + * Creates a parser ready to process data from the given input stream. + * @param stream Input stream to be parsed. + * @return Parser that can be invoked to retrieve the (parsed) content of the input stream. + */ + @NotNull + PrismParser parserFor(@NotNull InputStream stream); + + /** + * Creates a parser ready to process data from the given string. + * @param data String with the data to be parsed. It has be in UTF-8 encoding. + * (For other encodings please use InputStream or File source.) + * @return Parser that can be invoked to retrieve the (parsed) content. + */ + @NotNull + PrismParserNoIO parserFor(@NotNull String data); + + /** + * Creates a parser ready to process data from the given DOM element. + * @param element Element with the data to be parsed. + * @return Parser that can be invoked to retrieve the (parsed) content. + */ + @NotNull + PrismParserNoIO parserFor(@NotNull Element element); @Deprecated // user parserFor + parse instead PrismObject parseObject(File file) throws SchemaException, IOException; @@ -107,23 +135,85 @@ void adopt(PrismContainerValue serializerFor(String language); + //region Serializing + /** + * Creates a serializer for the given language. + * @param language Language (like xml, json, yaml). + * @return The serializer. + */ + @NotNull + PrismSerializer serializerFor(@NotNull String language); + + /** + * Creates a serializer for XML language. + * @return The serializer. + */ + @NotNull PrismSerializer xmlSerializer(); + + /** + * Creates a serializer for JSON language. + * @return The serializer. + */ + @NotNull PrismSerializer jsonSerializer(); + + /** + * Creates a serializer for YAML language. + * @return The serializer. + */ + @NotNull PrismSerializer yamlSerializer(); + + /** + * Creates a serializer for DOM. The difference from XML serializer is that XML produces String output + * whereas this one produces a DOM Element. + * @return The serializer. + */ + @NotNull PrismSerializer domSerializer(); + + /** + * Creates a serializer for XNode. The output of this serializer is intermediate XNode representation. + * @return The serializer. + */ + @NotNull PrismSerializer xnodeSerializer(); + @Deprecated // use serializerFor + serialize instead String serializeObjectToString(PrismObject object, String language) throws SchemaException; + /** + * TODO + * @param value + * @return + */ boolean canSerialize(Object value); + //endregion + /** + * TODO + * @param item + * @return + * @throws SchemaException + */ RawType toRawType(Item item) throws SchemaException; - PrismObject createObject(Class clazz) throws SchemaException; - - T createObjectable(Class clazz) throws SchemaException; - + /** + * Creates a new PrismObject of a given static type. + * @param clazz Static type of the object to be created. + * @return New PrismObject. + * @throws SchemaException If a definition for the given class couldn't be found. + */ + @NotNull + PrismObject createObject(@NotNull Class clazz) throws SchemaException; + + /** + * Creates a new Objectable of a given static type. + * @param clazz Static type of the object to be created. + * @return New PrismObject's objectable content. + * @throws SchemaException If a definition for the given class couldn't be found. + */ + @NotNull + O createObjectable(@NotNull Class clazz) throws SchemaException; } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContextImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContextImpl.java index 1c7ef14ffd1..5432f6a1ed1 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContextImpl.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContextImpl.java @@ -17,10 +17,7 @@ import com.evolveum.midpoint.prism.crypto.Protector; import com.evolveum.midpoint.prism.delta.ObjectDelta; -import com.evolveum.midpoint.prism.marshaller.JaxbDomHack; -import com.evolveum.midpoint.prism.marshaller.PrismBeanConverter; -import com.evolveum.midpoint.prism.marshaller.PrismBeanInspector; -import com.evolveum.midpoint.prism.marshaller.XNodeProcessor; +import com.evolveum.midpoint.prism.marshaller.*; import com.evolveum.midpoint.prism.lex.LexicalProcessor; import com.evolveum.midpoint.prism.lex.LexicalHelpers; import com.evolveum.midpoint.prism.lex.LexicalProcessorRegistry; @@ -38,8 +35,8 @@ import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.prism.xml.ns._public.types_3.RawType; +import org.jetbrains.annotations.NotNull; import org.springframework.beans.factory.annotation.Autowired; -import org.w3c.dom.Document; import org.w3c.dom.Element; import org.xml.sax.SAXException; @@ -206,24 +203,28 @@ public void setMonitor(PrismMonitor monitor) { //endregion //region Parsing + @NotNull @Override - public PrismParser parserFor(File file) { + public PrismParser parserFor(@NotNull File file) { return new PrismParserImplIO(new ParserFileSource(file), null, ParsingContext.createDefault(), lexicalHelpers); } + @NotNull @Override - public PrismParser parserFor(InputStream stream) { + public PrismParser parserFor(@NotNull InputStream stream) { return new PrismParserImplIO(new ParserInputStreamSource(stream), null, ParsingContext.createDefault(), lexicalHelpers); } + @NotNull @Override - public PrismParserNoIO parserFor(String data) { + public PrismParserNoIO parserFor(@NotNull String data) { return new PrismParserImplNoIO(new ParserStringSource(data), null, ParsingContext.createDefault(), lexicalHelpers); } + @NotNull @Deprecated @Override - public PrismParserNoIO parserFor(Element data) { + public PrismParserNoIO parserFor(@NotNull Element data) { return new PrismParserImplNoIO(new ParserElementSource(data), null, ParsingContext.createDefault(), lexicalHelpers); } @@ -303,31 +304,37 @@ public String serializeObjectToString(PrismObject obje return serializerFor(language).serialize(object); } + @NotNull @Override - public PrismSerializer serializerFor(String language) { + public PrismSerializer serializerFor(@NotNull String language) { return new PrismSerializerImpl<>(new SerializerStringTarget(lexicalHelpers, language), null, null); } + @NotNull @Override public PrismSerializer xmlSerializer() { return serializerFor(LANG_XML); } + @NotNull @Override public PrismSerializer jsonSerializer() { return serializerFor(LANG_JSON); } + @NotNull @Override public PrismSerializer yamlSerializer() { return serializerFor(LANG_YAML); } + @NotNull @Override public PrismSerializer domSerializer() { return new PrismSerializerImpl<>(new SerializerDomTarget(lexicalHelpers), null, null); } + @NotNull @Override public PrismSerializer xnodeSerializer() { return new PrismSerializerImpl<>(new SerializerXNodeTarget(lexicalHelpers), null, null); @@ -351,21 +358,19 @@ public RawType toRawType(Item item) throws SchemaException { return new RawType(rootXNode, this); } - @Override - public PrismObject createObject(Class clazz) throws SchemaException { - PrismObjectDefinition definition = schemaRegistry.findObjectDefinitionByCompileTimeClass(clazz); + @NotNull + @Override + public PrismObject createObject(@NotNull Class clazz) throws SchemaException { + PrismObjectDefinition definition = schemaRegistry.findObjectDefinitionByCompileTimeClass(clazz); if (definition == null) { throw new SchemaException("Definition for prism object holding " + clazz + " couldn't be found"); } return definition.instantiate(); } + @NotNull @Override - public T createObjectable(Class clazz) throws SchemaException { + public T createObjectable(@NotNull Class clazz) throws SchemaException { return createObject(clazz).asObjectable(); } - - protected ParsingContext newParsingContext() { - return ParsingContext.createDefault(); - } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismObjectDefinition.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismObjectDefinition.java index 4a19f653c49..45ac8c38db0 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismObjectDefinition.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismObjectDefinition.java @@ -19,6 +19,7 @@ import javax.xml.namespace.QName; import com.evolveum.midpoint.util.exception.SchemaException; +import org.jetbrains.annotations.NotNull; /** * MidPoint Object Definition. @@ -46,12 +47,12 @@ public PrismObjectDefinition(QName elementName, ComplexTypeDefinition complexTyp } @Override + @NotNull public PrismObject instantiate() throws SchemaException { if (isAbstract()) { throw new SchemaException("Cannot instantiate abstract definition "+this); } - PrismObject midPointObject = new PrismObject(getName(), this, prismContext); - return midPointObject; + return new PrismObject(getName(), this, prismContext); } @Override diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParser.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParser.java index b3af3a40ab2..7f28d4356cd 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParser.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParser.java @@ -19,6 +19,7 @@ import com.evolveum.midpoint.prism.xnode.XNode; import com.evolveum.midpoint.util.exception.SchemaException; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.w3c.dom.Element; import javax.xml.bind.JAXBElement; @@ -33,18 +34,89 @@ */ public interface PrismParser { - PrismParser language(String language); + /** + * Sets the language of the parser. null means auto-detect. + * @param language The language + * @return Updated parser. + */ + @NotNull + PrismParser language(@Nullable String language); + + /** + * Sets the language of the parser to be XML. + * @return Updated parser. + */ + @NotNull PrismParser xml(); + + /** + * Sets the language of the parser to be JSON. + * @return Updated parser. + */ + @NotNull PrismParser json(); + + /** + * Sets the language of the parser to be YAML. + * @return Updated parser. + */ + @NotNull PrismParser yaml(); + + /** + * Provides a parsing context for the parser. The context contains e.g. mode of operations (set by client) + * or a list of warnings (maintained by the parser). + * @param context The parsing context. + * @return Updated parser. + */ + @NotNull PrismParser context(@NotNull ParsingContext context); + + /** + * Switches the parser into "strict" parsing mode. + * @return Updated parser. + */ + @NotNull PrismParser strict(); + + /** + * Switches the parser into "compatibility" (or relaxed) parsing mode. + * TODO description here + * @return Updated parser. + */ + @NotNull PrismParser compat(); + /** + * Parses the input as a prism object. + * @return The object. + */ + @NotNull PrismObject parse() throws SchemaException, IOException; + + /** + * Parses the input as a collection of prism objects. + * Currently supported only for XML. (For the time being, it is used only in tests.) + * @return A list of objects. + */ + @NotNull List> parseObjects() throws SchemaException, IOException; - PrismContainer parseContainer(Class clazz) throws SchemaException, IOException; - PrismContainer parseContainer(PrismContainerDefinition definition) throws SchemaException, IOException; + + /** + * Parses the input as a single value of a prism container. + * @param clazz Type of a container content. + * @return Single-valued container. + */ + @NotNull + PrismContainer parseContainer(@NotNull Class clazz) throws SchemaException, IOException; + + /** + * Parses the input as a single value of a prism container. + * @param definition Container definition. + * @return Single-valued container. + */ + @NotNull + PrismContainer parseContainer(@NotNull PrismContainerDefinition definition) throws SchemaException, IOException; /** * Parses an atomic value - i.e. something that could present a property diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserNoIO.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserNoIO.java index 116266a316f..5ab408afa71 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserNoIO.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserNoIO.java @@ -27,27 +27,38 @@ import java.util.List; /** - * The same as PrismParser but has no IOException on parseXYZ methods. It is used when parsing from strings - * where no IOExceptions could occur. + * The same as PrismParser but has no IOException on parseXYZ methods. It is used when parsing from strings or DOM structures + * where no IOExceptions occur. * - * For methods' descriptions please see PrismParser interface. + * For methods' descriptions please see the parent interface (PrismParser). * * @author mederly */ public interface PrismParserNoIO extends PrismParser { + @NotNull PrismParserNoIO language(@Nullable String language); + @NotNull PrismParserNoIO xml(); + @NotNull PrismParserNoIO json(); + @NotNull PrismParserNoIO yaml(); + @NotNull PrismParserNoIO context(@NotNull ParsingContext context); + @NotNull PrismParserNoIO strict(); + @NotNull PrismParserNoIO compat(); + @NotNull PrismObject parse() throws SchemaException; + @NotNull List> parseObjects() throws SchemaException; - PrismContainer parseContainer(Class clazz) throws SchemaException; - PrismContainer parseContainer(PrismContainerDefinition definition) throws SchemaException; + @NotNull + PrismContainer parseContainer(@NotNull Class clazz) throws SchemaException; + @NotNull + PrismContainer parseContainer(@NotNull PrismContainerDefinition definition) throws SchemaException; T parseAtomicValue(QName typeName) throws SchemaException; Object parseAnyData() throws SchemaException; T parseAnyValue() throws SchemaException; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/LexicalProcessor.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/LexicalProcessor.java index d6fe0b05622..c22ae9c4ea8 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/LexicalProcessor.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/LexicalProcessor.java @@ -17,7 +17,7 @@ import java.io.File; import java.io.IOException; -import java.util.Collection; +import java.util.List; import javax.xml.namespace.QName; @@ -27,23 +27,49 @@ import com.evolveum.midpoint.prism.xnode.RootXNode; import com.evolveum.midpoint.prism.xnode.XNode; import com.evolveum.midpoint.util.exception.SchemaException; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; /** + * Takes care of converting between XNode tree and specific lexical representation (XML, JSON, YAML). + * * @author semancik * */ public interface LexicalProcessor { - XNode read(ParserSource source, ParsingContext parsingContext) throws SchemaException, IOException; + @NotNull + XNode read(@NotNull ParserSource source, @NotNull ParsingContext parsingContext) throws SchemaException, IOException; + + @NotNull + List readObjects(ParserSource source, ParsingContext parsingContext) throws SchemaException, IOException; + + /** + * Checks if the processor can read from a given file. (Guessed by file extension, for now.) + * Used for autodetection of language. + */ + boolean canRead(@NotNull File file) throws IOException; + + /** + * Checks if the processor can read from a given string. Note this is only an approximative information (for now). + * Used for autodetection of language. + */ + boolean canRead(@NotNull String dataString); + + /** + * Serializes a root node into XNode tree. + */ + @NotNull + String write(@NotNull RootXNode xnode, @Nullable SerializationContext serializationContext) throws SchemaException; - Collection readCollection(ParserSource source, ParsingContext parsingContext) throws SchemaException, IOException; - - boolean canRead(File file) throws IOException; - - boolean canRead(String dataString); + /** + * Serializes a non-root node into XNode tree. + * So, xnode SHOULD NOT be a root node (at least for now). + * + * TODO consider removing - replacing by the previous form. + */ + @NotNull + String write(@NotNull XNode xnode, @NotNull QName rootElementName, @Nullable SerializationContext serializationContext) throws SchemaException; - String write(XNode xnode, QName rootElementName, SerializationContext serializationContext) throws SchemaException; - - String write(RootXNode xnode, SerializationContext serializationContext) throws SchemaException; } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/LexicalProcessorRegistry.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/LexicalProcessorRegistry.java index fe63cf9af48..ad129d79554 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/LexicalProcessorRegistry.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/LexicalProcessorRegistry.java @@ -52,7 +52,7 @@ public LexicalProcessorRegistry(SchemaRegistry schemaRegistry) { } @NotNull - public LexicalProcessor findParser(File file) throws IOException { + private LexicalProcessor findParser(File file) throws IOException { for (Map.Entry entry: parserMap.entrySet()) { LexicalProcessor aLexicalProcessor = entry.getValue(); if (aLexicalProcessor.canRead(file)) { @@ -63,7 +63,7 @@ public LexicalProcessor findParser(File file) throws IOException { } @NotNull - public LexicalProcessor findParser(String data){ + private LexicalProcessor findParser(@NotNull String data){ for (Map.Entry entry: parserMap.entrySet()) { LexicalProcessor aLexicalProcessor = entry.getValue(); if (aLexicalProcessor.canRead(data)) { @@ -78,6 +78,7 @@ public DomLexicalProcessor domParser() { return (DomLexicalProcessor) parserFor(PrismContext.LANG_XML); } + @NotNull public LexicalProcessor parserFor(String language) { LexicalProcessor lexicalProcessor = parserMap.get(language); if (lexicalProcessor == null) { @@ -86,6 +87,7 @@ public LexicalProcessor parserFor(String language) { return lexicalProcessor; } + @NotNull public LexicalProcessor findParser(@NotNull ParserSource source) throws IOException { if (source instanceof ParserElementSource) { return parserFor(LANG_XML); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/dom/DomLexicalProcessor.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/dom/DomLexicalProcessor.java index 1bc75b86f44..9720a5790e2 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/dom/DomLexicalProcessor.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/dom/DomLexicalProcessor.java @@ -32,6 +32,8 @@ import org.apache.commons.io.IOUtils; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.Validate; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.w3c.dom.Attr; import org.w3c.dom.Document; import org.w3c.dom.Element; @@ -42,7 +44,6 @@ import java.io.InputStream; import java.io.Serializable; import java.util.ArrayList; -import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -63,59 +64,62 @@ public DomLexicalProcessor(SchemaRegistry schemaRegistry) { } @Deprecated - public XNode parse(File file, ParsingContext parsingContext) throws SchemaException, IOException { + public XNode read(File file, ParsingContext parsingContext) throws SchemaException, IOException { return read(new ParserFileSource(file), parsingContext); } + @NotNull @Override - public XNode read(ParserSource source, ParsingContext parsingContext) throws SchemaException, IOException { + public XNode read(@NotNull ParserSource source, @NotNull ParsingContext parsingContext) throws SchemaException, IOException { if (source instanceof ParserElementSource) { - return parse(((ParserElementSource) source).getElement()); + return read(((ParserElementSource) source).getElement()); } InputStream is = source.getInputStream(); try { Document document = DOMUtil.parse(is); - return parse(document); + return read(document); } finally { - if (source.closeAfterParsing()) { + if (source.closeStreamAfterParsing()) { IOUtils.closeQuietly(is); } } } + @NotNull @Override - public Collection readCollection(ParserSource source, ParsingContext parsingContext) throws SchemaException, IOException { + public List readObjects(ParserSource source, ParsingContext parsingContext) throws SchemaException, IOException { InputStream is = source.getInputStream(); try { Document document = DOMUtil.parse(is); - return parseCollection(document); + return readObjects(document); } finally { - if (source.closeAfterParsing()) { + if (source.closeStreamAfterParsing()) { IOUtils.closeQuietly(is); } } } - private Collection parseCollection(Document document) throws SchemaException{ + private List readObjects(Document document) throws SchemaException{ Element root = DOMUtil.getFirstChildElement(document); // TODO: maybe some check if this is a collection of other objects??? List children = DOMUtil.listChildElements(root); - Collection nodes = new ArrayList(); + List nodes = new ArrayList(); for (Element child : children){ - RootXNode xroot = parse(child); + RootXNode xroot = read(child); nodes.add(xroot); } return nodes; } - public RootXNode parse(Document document) throws SchemaException { + @NotNull + public RootXNode read(Document document) throws SchemaException { Element rootElement = DOMUtil.getFirstChildElement(document); - RootXNode xroot = parse(rootElement); - return xroot; + return read(rootElement); } - - public RootXNode parse(Element rootElement) throws SchemaException{ + + @NotNull + public RootXNode read(Element rootElement) throws SchemaException{ RootXNode xroot = new RootXNode(DOMUtil.getQName(rootElement)); extractCommonMetadata(rootElement, xroot); XNode xnode = parseElementContent(rootElement); @@ -177,6 +181,7 @@ public MapXNode parseElementAsMap(Element element) throws SchemaException { /** * Parses the content of the element (the name of the provided element is ignored, only the content is parsed). */ + @Nullable public XNode parseElementContent(Element element) throws SchemaException { if (DOMUtil.isNil(element)) { return null; @@ -391,18 +396,12 @@ private SchemaXNode parseSchemaElement(Element schemaElement) { } @Override - public boolean canRead(File file) throws IOException { - if (file == null) { - return false; - } + public boolean canRead(@NotNull File file) throws IOException { return file.getName().endsWith(".xml"); } @Override - public boolean canRead(String dataString) { - if (dataString == null) { - return false; - } + public boolean canRead(@NotNull String dataString) { if (dataString.startsWith(" readCollection(ParserSource source, ParsingContext parsingContext) throws SchemaException, IOException { + public List readObjects(ParserSource source, ParsingContext parsingContext) throws SchemaException, IOException { throw new UnsupportedOperationException("Parse objects not supported for json and yaml."); // why? } @@ -430,8 +432,9 @@ private JsonSerializationContext(@NotNull JsonGenerator generator, @Nullable Ser new SerializationContext(null); } } + @NotNull @Override - public String write(XNode xnode, QName rootElementName, SerializationContext serializationContext) throws SchemaException { + public String write(@NotNull XNode xnode, @NotNull QName rootElementName, SerializationContext serializationContext) throws SchemaException { return write(LexicalUtils.createRootXNode(xnode, rootElementName), serializationContext); } @@ -439,8 +442,9 @@ public String write(XNode xnode, QName rootElementName, SerializationContext ser protected abstract void writeExplicitType(QName explicitType, JsonGenerator generator) throws IOException; + @NotNull @Override - public String write(RootXNode root, SerializationContext prismSerializationContext) throws SchemaException { + public String write(@NotNull RootXNode root, SerializationContext prismSerializationContext) throws SchemaException { StringWriter out = new StringWriter(); try ( JsonGenerator generator = createJacksonGenerator(out) ) { JsonSerializationContext ctx = new JsonSerializationContext(generator, prismSerializationContext); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/JsonLexicalProcessor.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/JsonLexicalProcessor.java index 3c2034d7f3e..961047aa499 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/JsonLexicalProcessor.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/JsonLexicalProcessor.java @@ -32,6 +32,7 @@ import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.module.jaxb.JaxbAnnotationIntrospector; +import org.jetbrains.annotations.NotNull; import javax.xml.namespace.QName; import java.io.File; @@ -42,18 +43,12 @@ public class JsonLexicalProcessor extends AbstractJsonLexicalProcessor { @Override - public boolean canRead(File file) throws IOException { - if (file == null) { - return false; - } + public boolean canRead(@NotNull File file) throws IOException { return file.getName().endsWith(".json"); } @Override - public boolean canRead(String dataString) { - if (dataString == null) { - return false; - } + public boolean canRead(@NotNull String dataString) { return dataString.startsWith("{"); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/YamlLexicalProcessor.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/YamlLexicalProcessor.java index 727dbd6fdeb..9af62ebd8a1 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/YamlLexicalProcessor.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/YamlLexicalProcessor.java @@ -36,6 +36,7 @@ import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.dataformat.yaml.YAMLGenerator; +import org.jetbrains.annotations.NotNull; import org.w3c.dom.Element; import javax.xml.datatype.XMLGregorianCalendar; @@ -58,18 +59,12 @@ public class YamlLexicalProcessor extends AbstractJsonLexicalProcessor { //------------------------END OF METHODS FOR SERIALIZATION ------------------------------- @Override - public boolean canRead(File file) throws IOException { - if (file == null) { - return false; - } + public boolean canRead(@NotNull File file) throws IOException { return file.getName().endsWith(".yaml"); } @Override - public boolean canRead(String dataString) { - if (dataString == null) { - return false; - } + public boolean canRead(@NotNull String dataString) { return dataString.startsWith("---"); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismParserImpl.java similarity index 77% rename from infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserImpl.java rename to infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismParserImpl.java index ed0b0466656..c490893d3bb 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserImpl.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismParserImpl.java @@ -14,8 +14,9 @@ * limitations under the License. */ -package com.evolveum.midpoint.prism; +package com.evolveum.midpoint.prism.marshaller; +import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.lex.LexicalProcessor; import com.evolveum.midpoint.prism.lex.LexicalHelpers; import com.evolveum.midpoint.prism.xnode.XNode; @@ -40,7 +41,7 @@ public abstract class PrismParserImpl implements PrismParser { @NotNull private final ParsingContext context; @NotNull private final LexicalHelpers helpers; - public PrismParserImpl(@NotNull ParserSource source, String language, @NotNull ParsingContext context, @NotNull LexicalHelpers helpers) { + PrismParserImpl(@NotNull ParserSource source, String language, @NotNull ParsingContext context, @NotNull LexicalHelpers helpers) { this.source = source; this.language = language; this.context = context; @@ -48,65 +49,72 @@ public PrismParserImpl(@NotNull ParserSource source, String language, @NotNull P } private PrismParser create(ParserSource source, @Nullable String language, @NotNull ParsingContext context, LexicalHelpers helpers) { - return source.isIO() ? + return source.throwsIOException() ? new PrismParserImplIO(source, language, context, helpers) : new PrismParserImplNoIO(source, language, context, helpers); } + @NotNull @Override public PrismParser language(@Nullable String language) { return create(this.source, language, this.context, this.helpers); } + @NotNull @Override public PrismParser xml() { return language(PrismContext.LANG_XML); } + @NotNull @Override public PrismParser json() { return language(PrismContext.LANG_JSON); } + @NotNull @Override public PrismParser yaml() { return language(PrismContext.LANG_YAML); } + @NotNull @Override public PrismParser context(@NotNull ParsingContext context) { return create(this.source, this.language, context, this.helpers); } + @NotNull @Override public PrismParser strict() { return create(this.source, this.language, context.clone().strict(), this.helpers); } + @NotNull @Override public PrismParser compat() { return create(this.source, this.language, context.clone().compat(), this.helpers); } + @NotNull protected PrismObject doParse() throws SchemaException, IOException { - LexicalProcessor lexicalProcessor = getParser(); + LexicalProcessor lexicalProcessor = getLexicalProcessor(); XNode xnode = lexicalProcessor.read(source, context); return helpers.xnodeProcessor.parseObject(xnode, context); } - private LexicalProcessor getParser() throws IOException { - LexicalProcessor lexicalProcessor; + @NotNull + private LexicalProcessor getLexicalProcessor() throws IOException { if (language != null) { - lexicalProcessor = helpers.lexicalProcessorRegistry.parserFor(language); + return helpers.lexicalProcessorRegistry.parserFor(language); } else { - lexicalProcessor = helpers.lexicalProcessorRegistry.findParser(source); + return helpers.lexicalProcessorRegistry.findParser(source); } - return lexicalProcessor; } protected List> doParseObjects() throws IOException, SchemaException { - LexicalProcessor lexicalProcessor = getParser(); - Collection xnodes = lexicalProcessor.readCollection(source, context); + LexicalProcessor lexicalProcessor = getLexicalProcessor(); + Collection xnodes = lexicalProcessor.readObjects(source, context); List> objects = new ArrayList<>(); for (XNode xnode : xnodes) { PrismObject object = helpers.xnodeProcessor.parseObject(xnode, context); @@ -116,42 +124,40 @@ protected List> doParseObjects() throws IOExce } protected PrismContainer doParseContainer(Class clazz) throws SchemaException, IOException { - LexicalProcessor lexicalProcessor = getParser(); - XNode xnode = lexicalProcessor.read(source, context); - return helpers.xnodeProcessor.parseContainer(xnode, clazz, context); + XNode xnode = getLexicalProcessor().read(source, context); + return helpers.xnodeProcessor.unmarshalContainerValue(xnode, clazz, context); } protected PrismContainer doParseContainer(PrismContainerDefinition definition) throws SchemaException, IOException { - LexicalProcessor lexicalProcessor = getParser(); - XNode xnode = lexicalProcessor.read(source, context); - return helpers.xnodeProcessor.parseContainer(xnode, definition, context); + XNode xnode = getLexicalProcessor().read(source, context); + return helpers.xnodeProcessor.unmarshalContainerValue(xnode, definition, context); } protected T doParseAtomicValue(QName typeName) throws IOException, SchemaException { - LexicalProcessor lexicalProcessor = getParser(); + LexicalProcessor lexicalProcessor = getLexicalProcessor(); XNode xnode = lexicalProcessor.read(source, context); return helpers.xnodeProcessor.parseAtomicValue(xnode, typeName, context); } protected Object doParseAnyData() throws IOException, SchemaException { - LexicalProcessor lexicalProcessor = getParser(); + LexicalProcessor lexicalProcessor = getLexicalProcessor(); XNode xnode = lexicalProcessor.read(source, context); return helpers.xnodeProcessor.parseAnyData(xnode, context); } protected T doParseAnyValue() throws IOException, SchemaException { - LexicalProcessor lexicalProcessor = getParser(); + LexicalProcessor lexicalProcessor = getLexicalProcessor(); XNode xnode = lexicalProcessor.read(source, context); return helpers.xnodeProcessor.parseAnyValue(xnode, context); } protected JAXBElement doParseAnyValueAsJAXBElement() throws IOException, SchemaException { - LexicalProcessor lexicalProcessor = getParser(); + LexicalProcessor lexicalProcessor = getLexicalProcessor(); XNode xnode = lexicalProcessor.read(source, context); return helpers.xnodeProcessor.parseAnyValueAsJAXBElement(xnode, context); } protected XNode doParseToXNode() throws IOException, SchemaException { - return getParser().read(source, context); + return getLexicalProcessor().read(source, context); } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserImplIO.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismParserImplIO.java similarity index 87% rename from infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserImplIO.java rename to infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismParserImplIO.java index 7cab7916bb3..a89f5e0cd5f 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserImplIO.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismParserImplIO.java @@ -14,11 +14,13 @@ * limitations under the License. */ -package com.evolveum.midpoint.prism; +package com.evolveum.midpoint.prism.marshaller; +import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.lex.LexicalHelpers; import com.evolveum.midpoint.prism.xnode.XNode; import com.evolveum.midpoint.util.exception.SchemaException; +import org.jetbrains.annotations.NotNull; import javax.xml.bind.JAXBElement; import javax.xml.namespace.QName; @@ -34,23 +36,27 @@ public PrismParserImplIO(ParserSource source, String language, ParsingContext co super(source, language, context, helpers); } + @NotNull @Override public PrismObject parse() throws SchemaException, IOException { return doParse(); } + @NotNull @Override public List> parseObjects() throws SchemaException, IOException { return doParseObjects(); } + @NotNull @Override - public PrismContainer parseContainer(Class clazz) throws SchemaException, IOException { + public PrismContainer parseContainer(@NotNull Class clazz) throws SchemaException, IOException { return doParseContainer(clazz); } + @NotNull @Override - public PrismContainer parseContainer(PrismContainerDefinition definition) throws SchemaException, IOException { + public PrismContainer parseContainer(@NotNull PrismContainerDefinition definition) throws SchemaException, IOException { return doParseContainer(definition); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserImplNoIO.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismParserImplNoIO.java similarity index 92% rename from infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserImplNoIO.java rename to infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismParserImplNoIO.java index 7c076dcf240..e55c656f2b0 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserImplNoIO.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismParserImplNoIO.java @@ -14,8 +14,9 @@ * limitations under the License. */ -package com.evolveum.midpoint.prism; +package com.evolveum.midpoint.prism.marshaller; +import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.lex.LexicalHelpers; import com.evolveum.midpoint.prism.xnode.XNode; import com.evolveum.midpoint.util.exception.SchemaException; @@ -37,41 +38,49 @@ public PrismParserImplNoIO(ParserSource source, String language, ParsingContext super(source, language, context, helpers); } + @NotNull @Override public PrismParserNoIO language(@Nullable String language) { return (PrismParserNoIO) super.language(language); } + @NotNull @Override public PrismParserNoIO xml() { return (PrismParserNoIO) super.xml(); } + @NotNull @Override public PrismParserNoIO json() { return (PrismParserNoIO) super.json(); } + @NotNull @Override public PrismParserNoIO yaml() { return (PrismParserNoIO) super.yaml(); } + @NotNull @Override public PrismParserNoIO context(@NotNull ParsingContext context) { return (PrismParserNoIO) super.context(context); } + @NotNull @Override public PrismParserNoIO strict() { return (PrismParserNoIO) super.strict(); } + @NotNull @Override public PrismParserNoIO compat() { return (PrismParserNoIO) super.compat(); } + @NotNull @Override public PrismObject parse() throws SchemaException { try { @@ -81,6 +90,7 @@ public PrismObject parse() throws SchemaException { } } + @NotNull @Override public List> parseObjects() throws SchemaException { try { @@ -90,8 +100,9 @@ public List> parseObjects() throws SchemaExcep } } + @NotNull @Override - public PrismContainer parseContainer(Class clazz) throws SchemaException { + public PrismContainer parseContainer(@NotNull Class clazz) throws SchemaException { try { return doParseContainer(clazz); } catch (IOException e) { @@ -99,8 +110,9 @@ public PrismContainer parseContainer(Class clazz } } + @NotNull @Override - public PrismContainer parseContainer(PrismContainerDefinition definition) + public PrismContainer parseContainer(@NotNull PrismContainerDefinition definition) throws SchemaException { try { return doParseContainer(definition); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/XNodeProcessor.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/XNodeProcessor.java index 6396d6af11b..03712882674 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/XNodeProcessor.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/XNodeProcessor.java @@ -52,6 +52,7 @@ import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; import com.evolveum.prism.xml.ns._public.types_3.ProtectedStringType; import com.evolveum.prism.xml.ns._public.types_3.SchemaDefinitionType; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; public class XNodeProcessor { @@ -149,73 +150,72 @@ private String getVersion(MapXNode xmap) throws SchemaException { //endregion //region Parsing prism containers - public PrismContainer parseContainer(XNode xnode, ParsingContext pc) throws SchemaException { - Validate.notNull(xnode); - - if (xnode instanceof RootXNode) { - return parseContainer((RootXNode) xnode, pc); - } else if (xnode.getTypeQName() != null) { - PrismContainerDefinition definition = getSchemaRegistry().findContainerDefinitionByType(xnode.getTypeQName()); - if (definition == null) { - throw new SchemaException("No container definition for type " + xnode.getTypeQName()); - } - return parseContainer(xnode, definition, pc); - } else { - throw new SchemaException("Couldn't parse container because no element name nor type name is known"); - } - } - - public PrismContainer parseContainer(RootXNode rootXnode, ParsingContext pc) throws SchemaException { - Validate.notNull(rootXnode); +// public PrismContainer unmarshallContainer(XNode xnode, ParsingContext pc) throws SchemaException { +// Validate.notNull(xnode); +// +// if (xnode instanceof RootXNode) { +// return unmarshallContainer((RootXNode) xnode, pc); +// } else if (xnode.getTypeQName() != null) { +// PrismContainerDefinition definition = getSchemaRegistry().findContainerDefinitionByType(xnode.getTypeQName()); +// if (definition == null) { +// throw new SchemaException("No container definition for type " + xnode.getTypeQName()); +// } +// return unmarshallContainer(xnode, definition, pc); +// } else { +// throw new SchemaException("Couldn't parse container because no element name nor type name is known"); +// } +// } - QName rootElementName = rootXnode.getRootElementName(); - PrismContainerDefinition definition; - if (rootXnode.getTypeQName() != null) { - definition = getSchemaRegistry().findContainerDefinitionByType(rootXnode.getTypeQName()); - if (definition == null) { - throw new SchemaException("No container definition for type " + rootXnode.getTypeQName()); - } - } else { - definition = getSchemaRegistry().findContainerDefinitionByElementName(rootElementName); - if (definition == null) { - throw new SchemaException("No container definition for element name " + rootElementName); - } - } - XNode subnode = rootXnode.getSubnode(); - if (!(subnode instanceof MapXNode)) { - throw new IllegalArgumentException("Cannot parse object from " + subnode.getClass().getSimpleName() + ", we need a map"); - } - return parseContainerInternal(subnode, rootElementName, definition, pc); - } +// public PrismContainer unmarshalContainerValue(RootXNode rootXnode, ParsingContext pc) throws SchemaException { +// Validate.notNull(rootXnode); +// +// QName rootElementName = rootXnode.getRootElementName(); +// PrismContainerDefinition definition; +// if (rootXnode.getTypeQName() != null) { +// definition = getSchemaRegistry().findContainerDefinitionByType(rootXnode.getTypeQName()); +// if (definition == null) { +// throw new SchemaException("No container definition for type " + rootXnode.getTypeQName()); +// } +// } else { +// definition = getSchemaRegistry().findContainerDefinitionByElementName(rootElementName); +// if (definition == null) { +// throw new SchemaException("No container definition for element name " + rootElementName); +// } +// } +// XNode subnode = rootXnode.getSubnode(); +// if (!(subnode instanceof MapXNode)) { +// throw new IllegalArgumentException("Cannot parse object from " + subnode.getClass().getSimpleName() + ", we need a map"); +// } +// return unmarshalContainerInternal(subnode, rootElementName, definition, pc); +// } - public PrismContainer parseContainer(XNode xnode, Class type, ParsingContext pc) throws SchemaException { - Validate.notNull(xnode); - Validate.notNull(type); + @NotNull + PrismContainer unmarshalContainerValue(@NotNull XNode xnode, @NotNull Class type, @NotNull ParsingContext pc) throws SchemaException { PrismContainerDefinition definition = getSchemaRegistry().findContainerDefinitionByCompileTimeClass(type); if (definition == null) { throw new SchemaException("No container definition for class " + type); } - return parseContainer(xnode, definition, pc); + return unmarshalContainerValue(xnode, definition, pc); } - public PrismContainer parseContainer(XNode xnode, PrismContainerDefinition definition, ParsingContext pc) throws SchemaException { - Validate.notNull(xnode); - Validate.notNull(definition); + @NotNull + PrismContainer unmarshalContainerValue(@NotNull XNode xnode, @NotNull PrismContainerDefinition definition, @NotNull ParsingContext pc) throws SchemaException { if (xnode instanceof RootXNode) { RootXNode xroot = (RootXNode) xnode; - return parseContainerInternal(xroot.getSubnode(), xroot.getRootElementName(), definition, pc); + return unmarshalContainerInternal(xroot.getSubnode(), xroot.getRootElementName(), definition, pc); } else if (xnode instanceof MapXNode) { - return parseContainerInternal(xnode, definition.getName(), definition, pc); + return unmarshalContainerInternal(xnode, definition.getName(), definition, pc); } else { throw new SchemaException("Cannot parse container from " + xnode); } } - private PrismContainer parseContainerInternal(XNode xnode, QName elementName, - PrismContainerDefinition containerDef, ParsingContext pc) throws SchemaException { + @NotNull + private PrismContainer unmarshalContainerInternal(@NotNull XNode xnode, @NotNull QName elementName, + @NotNull PrismContainerDefinition containerDef, @NotNull ParsingContext pc) throws SchemaException { if (xnode instanceof RootXNode) { RootXNode rootXnode = (RootXNode) xnode; - return parseContainerInternal(rootXnode.getSubnode(), rootXnode.getRootElementName(), containerDef, pc); // ignoring elementName from parameters (probably set to be root element name) + return unmarshalContainerInternal(rootXnode.getSubnode(), rootXnode.getRootElementName(), containerDef, pc); // ignoring elementName from parameters (probably set to be root element name) } else if (xnode instanceof MapXNode) { return parseContainerFromMapInternal((MapXNode) xnode, elementName, containerDef, null, pc); } else if (xnode instanceof ListXNode) { @@ -975,7 +975,7 @@ public Item parseItem if (itemDef instanceof PrismObjectDefinition) { return parseObject(xnode, itemName, (PrismObjectDefinition) itemDef, pc); } else if (itemDef instanceof PrismContainerDefinition) { - return (Item) parseContainerInternal(xnode, itemName, (PrismContainerDefinition) itemDef, pc); + return (Item) unmarshalContainerInternal(xnode, itemName, (PrismContainerDefinition) itemDef, pc); } else if (itemDef instanceof PrismPropertyDefinition) { return (Item) parsePrismProperty(xnode, itemName, (PrismPropertyDefinition) itemDef, pc); } else if (itemDef instanceof PrismReferenceDefinition) { diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/XNodeSerializer.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/XNodeSerializer.java index b479860ea21..00c0c6fc56c 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/XNodeSerializer.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/XNodeSerializer.java @@ -82,11 +82,9 @@ public RootXNode serializeObject(PrismObject object) t } public RootXNode serializeObject(PrismObject object, SerializationContext ctx) throws SchemaException { - RootXNode xroot = new RootXNode(); + RootXNode xroot = new RootXNode(object.getElementName()); xroot.setSubnode(serializeObjectContent(object, ctx)); xroot.setTypeQName(object.getDefinition().getTypeName()); - QName elementName = object.getElementName(); - xroot.setRootElementName(elementName); return xroot; } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistry.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistry.java index fedabdbdad1..822270cc282 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistry.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistry.java @@ -1004,7 +1004,7 @@ public PrismContainerDefinition findContainerDefini return schema.findContainerDefinitionByElementName(elementName); } - public PrismContainerDefinition findContainerDefinitionByCompileTimeClass(Class compileTimeClass) { + public PrismContainerDefinition findContainerDefinitionByCompileTimeClass(@NotNull Class compileTimeClass) { PrismSchema schema = findSchemaByCompileTimeClass(compileTimeClass); if (schema == null) { return null; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/RootXNode.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/RootXNode.java index 02085875787..cffebfae9de 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/RootXNode.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/RootXNode.java @@ -17,25 +17,20 @@ import com.evolveum.midpoint.prism.Visitor; import com.evolveum.midpoint.util.DebugUtil; +import org.jetbrains.annotations.NotNull; import javax.xml.namespace.QName; public class RootXNode extends XNode { - private QName rootElementName; + @NotNull private QName rootElementName; private XNode subnode; - public RootXNode() { - super(); - } - - public RootXNode(QName rootElementName) { - super(); + public RootXNode(@NotNull QName rootElementName) { this.rootElementName = rootElementName; } - public RootXNode(QName rootElementName, XNode subnode) { - super(); + public RootXNode(@NotNull QName rootElementName, XNode subnode) { this.rootElementName = rootElementName; this.subnode = subnode; } @@ -52,11 +47,12 @@ public QName getTypeQName() { } } + @NotNull public QName getRootElementName() { return rootElementName; } - public void setRootElementName(QName rootElementName) { + public void setRootElementName(@NotNull QName rootElementName) { this.rootElementName = rootElementName; } diff --git a/infra/prism/src/test/java/com/evolveum/midpoint/prism/lex/TestDomParser.java b/infra/prism/src/test/java/com/evolveum/midpoint/prism/lex/TestDomParser.java index 86d55d89e9f..245c8ca57d5 100644 --- a/infra/prism/src/test/java/com/evolveum/midpoint/prism/lex/TestDomParser.java +++ b/infra/prism/src/test/java/com/evolveum/midpoint/prism/lex/TestDomParser.java @@ -72,7 +72,7 @@ public void testParseUserToXNode() throws Exception { DomLexicalProcessor parser = createParser(); // WHEN - XNode xnode = parser.parse(getFile(USER_JACK_FILE_BASENAME), ParsingContext.createDefault()); + XNode xnode = parser.read(getFile(USER_JACK_FILE_BASENAME), ParsingContext.createDefault()); // THEN System.out.println("Parsed XNode:"); diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceXml.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceXml.java index 861a19378fb..94e4dc552d4 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceXml.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceXml.java @@ -51,7 +51,7 @@ public void testParseResourceDom() throws Exception { // WHEN DomLexicalProcessor parserDom = prismContext.getParserDom(); - XNode xnode = parserDom.parse(getFile(TestConstants.RESOURCE_FILE_BASENAME), null); + XNode xnode = parserDom.read(getFile(TestConstants.RESOURCE_FILE_BASENAME), null); PrismObject resource = prismContext.getXnodeProcessor().parseObject(xnode, ParsingContext.createDefault()); // THEN diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/util/MiscDataUtil.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/util/MiscDataUtil.java index c0d05b7cfc8..282b41a5e60 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/util/MiscDataUtil.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/util/MiscDataUtil.java @@ -200,7 +200,7 @@ public static ObjectType deserializeObjectFromXml(String xml, PrismContext prism // public static PrismContainer deserializeContainerFromXml(String xml, PrismContext prismContext) { // try { -// return prismContext.parserFor(xml).xml().parseContainer(null); // TODO will 'null' work? +// return prismContext.parserFor(xml).xml().unmarshallContainer(null); // TODO will 'null' work? // } catch (SchemaException e) { // throw new SystemException("Couldn't deserialize a Containerable from XML", e); // } From b627923746c2fe2753b5e1bab7bfdde782eb1566 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Thu, 13 Oct 2016 16:27:17 +0200 Subject: [PATCH 37/74] Bidirectional coupling of Containerable - PCV --- .../schema/xjc/schema/SchemaProcessor.java | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/tools/xjc-plugin/src/main/java/com/evolveum/midpoint/schema/xjc/schema/SchemaProcessor.java b/tools/xjc-plugin/src/main/java/com/evolveum/midpoint/schema/xjc/schema/SchemaProcessor.java index 52feb5c13d1..f52acf2ac80 100644 --- a/tools/xjc-plugin/src/main/java/com/evolveum/midpoint/schema/xjc/schema/SchemaProcessor.java +++ b/tools/xjc-plugin/src/main/java/com/evolveum/midpoint/schema/xjc/schema/SchemaProcessor.java @@ -478,7 +478,10 @@ private JMethod createPrismContextContainerableConstructor(JDefinedClass defined constructor.param(PrismContext.class, "prismContext"); JBlock body = constructor.body(); - body.invoke(setupContainerMethod).arg(JExpr._new(CLASS_MAP.get(PrismContainerValue.class)).arg(constructor.params().get(0))); + body.invoke(setupContainerMethod) // setupContainerValue( + .arg(JExpr._new(CLASS_MAP.get(PrismContainerValue.class).narrow(new JClass[0])) // new PrismContainerValue<>( + .arg(JExpr._this()) // this, + .arg(constructor.params().get(0))); // prismContext); return constructor; } @@ -528,9 +531,12 @@ private void createAsPrismContainerValue(JDefinedClass definedClass, JVar contai //create method body JBlock body = getContainer.body(); - JBlock then = body._if(containerValueVar.eq(JExpr._null()))._then(); - then.assign(containerValueVar, JExpr._new(CLASS_MAP.get(PrismContainerValue.class))); - + body._if(containerValueVar.eq(JExpr._null())). // if (_containerValue == null) { + _then() // + .assign(containerValueVar, // _containerValue = + JExpr._new(CLASS_MAP.get(PrismContainerValue.class).narrow(new JClass[0])) // new PrismContainerValue<>( + .arg(JExpr._this()) // this) + ); body._return(containerValueVar); } From abe2faaf49751d6bc0572eac2fdde3917836f727 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Sat, 15 Oct 2016 01:54:13 +0200 Subject: [PATCH 38/74] Big prism refactoring. Interim commit. --- .../assignment/AssignmentEditorDto.java | 3 +- .../assignment/AssignmentEditorPanel.java | 3 +- .../input/RefinedObjectTypeChoicePanel.java | 3 +- .../FocusProjectionsTabPanel.java | 3 +- .../prism/ContainerWrapperFactory.java | 5 +- .../component/prism/ObjectWrapperFactory.java | 2 +- .../web/component/prism/PrismValuePanel.java | 7 +- .../web/component/wizard/WizardStep.java | 3 +- .../wizard/resource/CapabilityStep.java | 3 +- .../wizard/resource/ConfigurationStep.java | 7 +- .../resource/component/SchemaListPanel.java | 3 +- .../ResourceAssociationEditor.java | 3 +- .../ResourceAttributeEditor.java | 3 +- .../certification/dto/CertDefinitionDto.java | 2 - .../admin/configuration/PageAccounts.java | 3 +- .../admin/configuration/PageDebugList.java | 7 +- .../component/RunReportPopupPanel.java | 12 +- .../admin/resources/ResourceContentPanel.java | 5 +- .../resources/ResourceContentTabPanel.java | 9 +- .../resources/ResourceDetailsTabPanel.java | 5 +- .../page/admin/resources/dto/ResourceDto.java | 3 +- .../web/page/admin/server/PageTaskAdd.java | 3 +- .../handlers/ResourceRelatedHandlerPanel.java | 3 +- .../handlers/dto/GenericHandlerDto.java | 10 +- .../dto/ResourceRelatedHandlerDto.java | 3 +- .../midpoint/common/SynchronizationUtils.java | 3 +- ...CompositeRefinedObjectClassDefinition.java | 259 +++- .../LayerRefinedAttributeDefinition.java | 547 +------ .../LayerRefinedAttributeDefinitionImpl.java | 583 ++++++++ .../LayerRefinedObjectClassDefinition.java | 634 +------- ...LayerRefinedObjectClassDefinitionImpl.java | 665 +++++++++ .../refinery/LayerRefinedResourceSchema.java | 294 +--- .../LayerRefinedResourceSchemaImpl.java | 270 ++++ .../refinery/RefinedAttributeDefinition.java | 587 +------- .../RefinedAttributeDefinitionImpl.java | 636 +++++++++ .../refinery/RefinedConnectorSchema.java | 72 +- .../refinery/RefinedConnectorSchemaImpl.java | 90 ++ .../RefinedObjectClassDefinition.java | 1134 +-------------- .../RefinedObjectClassDefinitionImpl.java | 1203 ++++++++++++++++ .../refinery/RefinedResourceSchema.java | 501 +------ .../refinery/RefinedResourceSchemaImpl.java | 567 ++++++++ .../midpoint/common/validator/Validator.java | 2 +- .../midpoint/common/TestStaticValues.java | 11 +- .../common/refinery/TestRefinedSchema.java | 22 +- .../midpoint/prism/ComplexTypeDefinition.java | 479 +------ .../prism/ComplexTypeDefinitionImpl.java | 464 ++++++ .../evolveum/midpoint/prism/Definition.java | 326 +---- .../midpoint/prism/DefinitionImpl.java | 300 ++++ .../midpoint/prism/ItemDefinition.java | 447 +----- .../midpoint/prism/ItemDefinitionImpl.java | 479 +++++++ .../midpoint/prism/LocalDefinitionStore.java | 87 ++ .../prism/PrismContainerDefinition.java | 613 +------- .../prism/PrismContainerDefinitionImpl.java | 563 ++++++++ .../midpoint/prism/PrismContainerValue.java | 467 ++---- .../evolveum/midpoint/prism/PrismContext.java | 3 + .../midpoint/prism/PrismContextImpl.java | 15 +- .../midpoint/prism/PrismObjectDefinition.java | 125 +- .../prism/PrismObjectDefinitionImpl.java | 149 ++ .../midpoint/prism/PrismProperty.java | 2 +- .../prism/PrismPropertyDefinition.java | 217 +-- .../prism/PrismPropertyDefinitionImpl.java | 242 ++++ .../midpoint/prism/PrismPropertyValue.java | 3 +- .../prism/PrismReferenceDefinition.java | 148 +- .../prism/PrismReferenceDefinitionImpl.java | 173 +++ .../midpoint/prism/XmlEntityResolver.java | 26 + .../prism/lex/dom/DomLexicalWriter.java | 3 +- .../prism/marshaller/JaxbDomHack.java | 4 +- .../prism/marshaller/XNodeProcessor.java | 97 +- .../midpoint/prism/path/ItemPath.java | 3 + .../prism/path/NameItemPathSegment.java | 10 +- .../midpoint/prism/query/TypeFilter.java | 8 +- .../prism/schema/DefinitionSearchContext.java | 33 + .../DefinitionSearchContextCtdImpl.java | 51 + .../DefinitionSearchContextItemImpl.java | 58 + .../DefinitionSearchImplementation.java | 44 + .../prism/schema/DefinitionsStore.java | 35 + .../prism/schema/DomToSchemaProcessor.java | 80 +- .../schema/GlobalDefinitionSearchContext.java | 33 + .../prism/schema/GlobalDefinitionsStore.java | 142 ++ .../schema/HierarchicalDefinitionsStore.java | 23 + .../midpoint/prism/schema/PrismSchema.java | 536 +------ .../prism/schema/PrismSchemaImpl.java | 410 ++++++ .../prism/schema/SchemaDefinitionFactory.java | 25 +- .../midpoint/prism/schema/SchemaRegistry.java | 1270 +---------------- .../prism/schema/SchemaRegistryImpl.java | 1122 +++++++++++++++ .../prism/schema/SchemaToDomProcessor.java | 6 +- .../midpoint/prism/schema/SearchContexts.java | 42 + .../prism/schema/XmlEntityResolverImpl.java | 255 ++++ .../midpoint/prism/util/CloneUtil.java | 5 +- .../midpoint/prism/util/JaxbTestUtil.java | 5 +- .../midpoint/prism/xjc/AnyArrayList.java | 20 +- .../prism/xjc/PrismContainerArrayList.java | 11 +- .../midpoint/prism/PrismInternalTestUtil.java | 16 +- .../evolveum/midpoint/prism/TestCompare.java | 4 +- .../evolveum/midpoint/prism/TestDelta.java | 44 +- .../midpoint/prism/TestExtraSchema.java | 11 +- .../midpoint/prism/TestPrismContext.java | 2 +- .../prism/TestPrismObjectConstruction.java | 4 +- .../midpoint/prism/TestPrismParsingXml.java | 10 +- .../prism/TestPrismSchemaConstruction.java | 15 +- .../midpoint/prism/lex/TestDomParser.java | 10 +- .../resources/schema-extra/extension/user.xsd | 8 + .../schema/MidPointPrismContextFactory.java | 13 +- .../schema/processor/ConnectorSchema.java | 110 +- .../schema/processor/ConnectorSchemaImpl.java | 129 ++ .../MidPointSchemaDefinitionFactory.java | 11 +- .../ObjectClassComplexTypeDefinition.java | 497 +------ .../ObjectClassComplexTypeDefinitionImpl.java | 523 +++++++ .../processor/ResourceAttributeContainer.java | 2 +- .../ResourceAttributeContainerDefinition.java | 364 +---- ...ourceAttributeContainerDefinitionImpl.java | 401 ++++++ .../ResourceAttributeDefinition.java | 208 +-- .../ResourceAttributeDefinitionImpl.java | 236 +++ .../schema/processor/ResourceSchema.java | 106 +- .../schema/processor/ResourceSchemaImpl.java | 121 ++ .../schema/util/ConnectorTypeUtil.java | 14 +- .../midpoint/schema/util/ReportTypeUtil.java | 3 +- .../midpoint/schema/util/ShadowUtil.java | 9 +- .../midpoint/schema/TestImmutable.java | 4 +- .../midpoint/schema/TestParseDiffPatch.java | 7 +- .../midpoint/schema/TestSchemaRegistry.java | 3 +- .../parser/resource/TestParseResource.java | 3 +- .../schema/processor/SchemaProcessorTest.java | 27 +- .../schema/processor/TestResourceSchema.java | 16 +- .../evolveum/midpoint/test/util/TestUtil.java | 3 +- .../com/evolveum/midpoint/util/QNameUtil.java | 8 + .../impl/AccCertExpressionHelper.java | 3 +- .../DirectAssignmentCertificationHandler.java | 1 - .../common/expression/ExpressionUtil.java | 6 +- .../model/common/mapping/Mapping.java | 4 +- .../common/expression/TestExpression.java | 7 +- .../expression/script/AbstractScriptTest.java | 10 +- .../expression/script/TestScriptCaching.java | 7 +- .../model/common/mapping/TestMappingTime.java | 11 +- .../ModelInteractionServiceImpl.java | 23 +- .../impl/controller/SchemaTransformer.java | 45 +- .../dataModel/DataModelVisualizerImpl.java | 11 +- .../impl/dataModel/VisualizationContext.java | 3 +- .../model/impl/expr/ExpressionHandler.java | 5 +- .../impl/expr/MidpointFunctionsImpl.java | 5 +- ...ImportAccountsFromResourceTaskHandler.java | 6 +- .../ImportObjectsFromFileTaskHandler.java | 3 +- .../model/impl/importer/ObjectImporter.java | 7 +- .../ShadowIntegrityCheckResultHandler.java | 3 +- .../model/impl/lens/AssignmentEvaluator.java | 15 +- .../model/impl/lens/ChangeExecutor.java | 13 +- .../model/impl/lens/Construction.java | 7 +- .../impl/lens/LensProjectionContext.java | 9 +- .../midpoint/model/impl/lens/LensUtil.java | 16 +- .../lens/projector/ActivationProcessor.java | 15 +- .../midpoint/model/impl/scripting/Data.java | 12 +- .../CorrelationConfirmationEvaluator.java | 12 +- .../model/impl/sync/LiveSyncTaskHandler.java | 3 +- .../impl/sync/ReconciliationTaskHandler.java | 3 +- .../impl/util/AbstractScannerTaskHandler.java | 3 +- .../impl/validator/ResourceValidatorImpl.java | 3 +- .../model/impl/visualizer/Visualizer.java | 6 +- .../model/impl/TestRefinedSchema.java | 9 +- .../model/impl/expr/TestModelExpressions.java | 11 +- .../intest/TestModelServiceContract.java | 2 +- .../midpoint/model/intest/TestRbac.java | 12 +- .../model/intest/sync/TestImportRecon.java | 2 +- .../test/AbstractModelIntegrationTest.java | 11 +- .../api/transports/SimpleSmsTransport.java | 3 +- .../impl/handlers/BaseHandler.java | 7 +- .../impl/helpers/BaseHelper.java | 5 +- ...InitializeLoopThroughApproversInLevel.java | 4 +- .../ItemApprovalSpecificContent.java | 1 - .../general/GcpExpressionHelper.java | 3 +- ...PrimaryChangeProcessorSpecificContent.java | 1 - .../aspect/PrimaryChangeAspectHelper.java | 7 +- .../assignments/ResourceAssignmentHelper.java | 2 +- .../assignments/RoleAssignmentHelper.java | 3 +- ...ovingDummyResourceChangesScenarioBean.java | 2 +- .../general/TestGeneralChangeProcessor.java | 4 +- pom.xml | 2 +- .../provisioning/impl/ConnectorManager.java | 3 +- .../impl/EntitlementConverter.java | 7 +- .../impl/ProvisioningContext.java | 3 +- .../provisioning/impl/ResourceManager.java | 24 +- .../impl/ResourceObjectConverter.java | 9 +- .../ucf/impl/ConnectorFactoryIcfImpl.java | 3 +- .../ucf/impl/ConnectorInstanceIcfImpl.java | 68 +- .../provisioning/util/ProvisioningUtil.java | 11 +- .../impl/ProvisioningTestUtil.java | 3 +- .../provisioning/impl/TestCsvFile.java | 10 +- .../impl/dummy/AbstractDummyTest.java | 7 +- .../provisioning/impl/dummy/TestDummy.java | 40 +- .../impl/dummy/TestDummyHacks.java | 3 +- .../impl/dummy/TestDummyLegacy.java | 5 +- .../TestDummyResourceAndSchemaCaching.java | 42 +- .../impl/dummy/TestDummySchemaless.java | 11 +- .../dummy/TestDummyUuidNonUniqueName.java | 3 +- .../provisioning/impl/opendj/TestOpenDj.java | 18 +- .../impl/opendj/TestOpenDjNegative.java | 5 +- .../provisioning/impl/ucf/TestUcfDummy.java | 10 +- .../midpoint/repo/sql/AddGetObjectTest.java | 5 +- .../repo/sql/QueryInterpreter2Test.java | 8 +- .../repo/sql/RAnyConverterStaticTest.java | 9 +- .../repo/sql/helpers/ObjectRetriever.java | 4 +- .../test/AbstractIntegrationTest.java | 25 +- .../midpoint/test/IntegrationTestTools.java | 5 +- .../init/ConfigurablePrismContextFactory.java | 3 +- .../TestQuartzTaskManagerContract.java | 6 +- 204 files changed, 11743 insertions(+), 9769 deletions(-) create mode 100644 infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedAttributeDefinitionImpl.java create mode 100644 infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedObjectClassDefinitionImpl.java create mode 100644 infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedResourceSchemaImpl.java create mode 100644 infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedAttributeDefinitionImpl.java create mode 100644 infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedConnectorSchemaImpl.java create mode 100644 infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedObjectClassDefinitionImpl.java create mode 100644 infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedResourceSchemaImpl.java create mode 100644 infra/prism/src/main/java/com/evolveum/midpoint/prism/ComplexTypeDefinitionImpl.java create mode 100644 infra/prism/src/main/java/com/evolveum/midpoint/prism/DefinitionImpl.java create mode 100644 infra/prism/src/main/java/com/evolveum/midpoint/prism/ItemDefinitionImpl.java create mode 100644 infra/prism/src/main/java/com/evolveum/midpoint/prism/LocalDefinitionStore.java create mode 100644 infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerDefinitionImpl.java create mode 100644 infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismObjectDefinitionImpl.java create mode 100644 infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyDefinitionImpl.java create mode 100644 infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismReferenceDefinitionImpl.java create mode 100644 infra/prism/src/main/java/com/evolveum/midpoint/prism/XmlEntityResolver.java create mode 100644 infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/DefinitionSearchContext.java create mode 100644 infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/DefinitionSearchContextCtdImpl.java create mode 100644 infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/DefinitionSearchContextItemImpl.java create mode 100644 infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/DefinitionSearchImplementation.java create mode 100644 infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/DefinitionsStore.java create mode 100644 infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/GlobalDefinitionSearchContext.java create mode 100644 infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/GlobalDefinitionsStore.java create mode 100644 infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/HierarchicalDefinitionsStore.java create mode 100644 infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/PrismSchemaImpl.java create mode 100644 infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistryImpl.java create mode 100644 infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SearchContexts.java create mode 100644 infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/XmlEntityResolverImpl.java create mode 100644 infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ConnectorSchemaImpl.java create mode 100644 infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ObjectClassComplexTypeDefinitionImpl.java create mode 100644 infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ResourceAttributeContainerDefinitionImpl.java create mode 100644 infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ResourceAttributeDefinitionImpl.java create mode 100644 infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ResourceSchemaImpl.java diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorDto.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorDto.java index 966bdf7fae3..3d55fb0f2c5 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorDto.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorDto.java @@ -22,6 +22,7 @@ import javax.xml.namespace.QName; +import com.evolveum.midpoint.common.refinery.RefinedResourceSchemaImpl; import org.apache.commons.lang.Validate; import com.evolveum.midpoint.common.refinery.RefinedObjectClassDefinition; @@ -217,7 +218,7 @@ private List prepareAssignmentAttributes(AssignmentType assignme try { PrismContext prismContext = pageBase.getPrismContext(); - RefinedResourceSchema refinedSchema = RefinedResourceSchema.getRefinedSchema(resource, + RefinedResourceSchema refinedSchema = RefinedResourceSchemaImpl.getRefinedSchema(resource, LayerType.PRESENTATION, prismContext); RefinedObjectClassDefinition objectClassDefinition = refinedSchema .getRefinedDefinition(ShadowKindType.ACCOUNT, construction.getIntent()); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorPanel.java index 527f72d1c0c..a9c32b0e2d5 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorPanel.java @@ -18,6 +18,7 @@ import com.evolveum.midpoint.common.refinery.RefinedObjectClassDefinition; import com.evolveum.midpoint.common.refinery.RefinedResourceSchema; +import com.evolveum.midpoint.common.refinery.RefinedResourceSchemaImpl; import com.evolveum.midpoint.gui.api.GuiStyleConstants; import com.evolveum.midpoint.gui.api.component.BasePanel; import com.evolveum.midpoint.gui.api.component.objecttypeselect.ObjectTypeSelectPanel; @@ -733,7 +734,7 @@ private List loadAttributes() { } PrismContext prismContext = getPageBase().getPrismContext(); - RefinedResourceSchema refinedSchema = RefinedResourceSchema.getRefinedSchema(resource, + RefinedResourceSchema refinedSchema = RefinedResourceSchemaImpl.getRefinedSchema(resource, LayerType.PRESENTATION, prismContext); RefinedObjectClassDefinition objectClassDefinition = refinedSchema .getRefinedDefinition(ShadowKindType.ACCOUNT, construction.getIntent()); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/input/RefinedObjectTypeChoicePanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/input/RefinedObjectTypeChoicePanel.java index 488d7597fd0..b76dd1179ba 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/input/RefinedObjectTypeChoicePanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/input/RefinedObjectTypeChoicePanel.java @@ -18,6 +18,7 @@ import java.util.ArrayList; import java.util.List; +import com.evolveum.midpoint.common.refinery.RefinedResourceSchemaImpl; import org.apache.commons.lang.StringUtils; import org.apache.wicket.markup.html.form.IChoiceRenderer; import org.apache.wicket.model.IModel; @@ -49,7 +50,7 @@ private static IModel> cr public List getObject() { RefinedResourceSchema refinedSchema; try { - refinedSchema = RefinedResourceSchema.getRefinedSchema(resourceModel.getObject()); + refinedSchema = RefinedResourceSchemaImpl.getRefinedSchema(resourceModel.getObject()); } catch (SchemaException e) { throw new IllegalArgumentException(e.getMessage(),e); } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/objectdetails/FocusProjectionsTabPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/objectdetails/FocusProjectionsTabPanel.java index 5a98c5b0faf..46a74e54d2c 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/objectdetails/FocusProjectionsTabPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/objectdetails/FocusProjectionsTabPanel.java @@ -21,6 +21,7 @@ import javax.xml.namespace.QName; +import com.evolveum.midpoint.common.refinery.RefinedResourceSchemaImpl; import com.evolveum.midpoint.web.component.prism.*; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; import org.apache.commons.lang.Validate; @@ -217,7 +218,7 @@ private void addSelectedAccountPerformed(AjaxRequestTarget target, List createProperties(ContainerWrapper cWrapper, OperationR // hack... we want to create a definition for Name // PrismPropertyDefinition def = ((PrismContainerValue) // pcv.getContainer().getParent()).getContainer().findProperty(ObjectType.F_NAME).getDefinition(); - PrismPropertyDefinition def = new PrismPropertyDefinition(ObjectType.F_NAME, + PrismPropertyDefinitionImpl def = new PrismPropertyDefinitionImpl(ObjectType.F_NAME, DOMUtil.XSD_STRING, pcv.getPrismContext()); if (OrgType.COMPLEX_TYPE.equals(assignmentType.getTargetRef().getType())) { @@ -260,7 +261,7 @@ private List createProperties(ContainerWrapper cWrapper, OperationR RefinedResourceSchema refinedSchema; CompositeRefinedObjectClassDefinition rOcDef; try { - refinedSchema = RefinedResourceSchema.getRefinedSchema(resource); + refinedSchema = RefinedResourceSchemaImpl.getRefinedSchema(resource); rOcDef = refinedSchema.determineCompositeObjectClassDefinition(objectWrapper.getObject()); } catch (SchemaException e) { throw new SystemException(e.getMessage(), e); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/ObjectWrapperFactory.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/ObjectWrapperFactory.java index 9cb03f32f0f..33ea37fd51d 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/ObjectWrapperFactory.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/ObjectWrapperFactory.java @@ -331,7 +331,7 @@ private void addResourceContainerWrapper( // unbounded. But there can be only one configuration container. // See MID-2317 and related issues PrismContainerDefinition definitionFixed = definition.clone(); - definitionFixed.setMaxOccurs(1); + ((PrismContainerDefinitionImpl) definitionFixed).setMaxOccurs(1); if (container == null) { container = definitionFixed.instantiate(); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/PrismValuePanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/PrismValuePanel.java index 93384e4e357..d95aa7a3a3c 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/PrismValuePanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/PrismValuePanel.java @@ -16,10 +16,7 @@ package com.evolveum.midpoint.web.component.prism; -import com.evolveum.midpoint.common.refinery.CompositeRefinedObjectClassDefinition; -import com.evolveum.midpoint.common.refinery.RefinedAssociationDefinition; -import com.evolveum.midpoint.common.refinery.RefinedObjectClassDefinition; -import com.evolveum.midpoint.common.refinery.RefinedResourceSchema; +import com.evolveum.midpoint.common.refinery.*; import com.evolveum.midpoint.gui.api.component.autocomplete.AutoCompleteTextPanel; import com.evolveum.midpoint.gui.api.component.password.PasswordPanel; import com.evolveum.midpoint.gui.api.page.PageBase; @@ -722,7 +719,7 @@ public void checkInputValue(AutoCompleteTextField input, AjaxRequestTarget targe RefinedResourceSchema refinedSchema; CompositeRefinedObjectClassDefinition rOcDef; try { - refinedSchema = RefinedResourceSchema.getRefinedSchema(resource); + refinedSchema = RefinedResourceSchemaImpl.getRefinedSchema(resource); rOcDef = refinedSchema.determineCompositeObjectClassDefinition(shadowType.asPrismObject()); } catch (SchemaException e) { throw new SystemException(e.getMessage(),e); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/WizardStep.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/WizardStep.java index a019fec2cae..cee55386f26 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/WizardStep.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/WizardStep.java @@ -21,6 +21,7 @@ import javax.xml.namespace.QName; +import com.evolveum.midpoint.common.refinery.RefinedResourceSchemaImpl; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.web.page.admin.resources.PageResourceWizard; import org.apache.commons.lang.StringUtils; @@ -119,7 +120,7 @@ protected String createComponentPath(String... components) { protected List loadResourceObjectClassList(IModel> model, Trace LOGGER, String message){ List list = new ArrayList<>(); try { - ResourceSchema schema = RefinedResourceSchema.getResourceSchema(model.getObject(), getPageBase().getPrismContext()); + ResourceSchema schema = RefinedResourceSchemaImpl.getResourceSchema(model.getObject(), getPageBase().getPrismContext()); if (schema != null) { for (Definition def: schema.getDefinitions()) { list.add(def.getTypeName()); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/CapabilityStep.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/CapabilityStep.java index d8c8594b89b..b46d5dec941 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/CapabilityStep.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/CapabilityStep.java @@ -17,6 +17,7 @@ package com.evolveum.midpoint.web.component.wizard.resource; import com.evolveum.midpoint.common.refinery.RefinedResourceSchema; +import com.evolveum.midpoint.common.refinery.RefinedResourceSchemaImpl; import com.evolveum.midpoint.gui.api.model.LoadableModel; import com.evolveum.midpoint.gui.api.model.NonEmptyLoadableModel; import com.evolveum.midpoint.gui.api.util.WebComponentUtil; @@ -307,7 +308,7 @@ protected List load() { PrismObject resourcePrism = resourceModel.getObject(); try { - ResourceSchema schema = RefinedResourceSchema.getResourceSchema(resourcePrism, getPageBase().getPrismContext()); + ResourceSchema schema = RefinedResourceSchemaImpl.getResourceSchema(resourcePrism, getPageBase().getPrismContext()); if (schema != null) { ObjectClassComplexTypeDefinition def = schema.findDefaultObjectClassDefinition(ShadowKindType.ACCOUNT); for (ResourceAttributeDefinition attribute : def.getAttributeDefinitions()) { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/ConfigurationStep.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/ConfigurationStep.java index 5a6369c4d2e..26503862d31 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/ConfigurationStep.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/ConfigurationStep.java @@ -22,10 +22,7 @@ import com.evolveum.midpoint.gui.api.util.WebComponentUtil; import com.evolveum.midpoint.gui.api.util.WebModelServiceUtils; import com.evolveum.midpoint.model.api.ModelService; -import com.evolveum.midpoint.prism.ItemDefinition; -import com.evolveum.midpoint.prism.PrismContainer; -import com.evolveum.midpoint.prism.PrismContainerDefinition; -import com.evolveum.midpoint.prism.PrismObject; +import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.delta.ObjectDelta; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.schema.PrismSchema; @@ -129,7 +126,7 @@ private List createConfigContainerWrappers() throws SchemaExce PrismContainerDefinition definition = ConnectorTypeUtil.findConfigurationContainerDefinition(connectorType, schema); // Fixing (errorneously) set maxOccurs = unbounded. See MID-2317 and related issues. PrismContainerDefinition definitionFixed = definition.clone(); - definitionFixed.setMaxOccurs(1); + ((PrismContainerDefinitionImpl) definitionFixed).setMaxOccurs(1); configuration = definitionFixed.instantiate(); } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/component/SchemaListPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/component/SchemaListPanel.java index aa2e16f02fd..9e97fb06c45 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/component/SchemaListPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/component/SchemaListPanel.java @@ -18,6 +18,7 @@ import com.evolveum.midpoint.common.refinery.RefinedObjectClassDefinition; import com.evolveum.midpoint.common.refinery.RefinedResourceSchema; +import com.evolveum.midpoint.common.refinery.RefinedResourceSchemaImpl; import com.evolveum.midpoint.gui.api.component.BasePanel; import com.evolveum.midpoint.gui.api.model.NonEmptyLoadableModel; import com.evolveum.midpoint.prism.PrismObject; @@ -359,7 +360,7 @@ private RefinedResourceSchema loadResourceSchema() { return null; } - return RefinedResourceSchema.getRefinedSchema(resource, getPageBase().getPrismContext()); + return RefinedResourceSchemaImpl.getRefinedSchema(resource, getPageBase().getPrismContext()); } catch (SchemaException|RuntimeException ex) { LoggingUtils.logUnexpectedException(LOGGER, "Couldn't parse resource schema.", ex); getSession().error(getString("SchemaListPanel.message.couldntParseSchema") + " " + ex.getMessage()); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/component/schemahandling/ResourceAssociationEditor.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/component/schemahandling/ResourceAssociationEditor.java index d614e2ae8a1..ac9167b1d89 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/component/schemahandling/ResourceAssociationEditor.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/component/schemahandling/ResourceAssociationEditor.java @@ -23,6 +23,7 @@ import com.evolveum.midpoint.schema.processor.ObjectClassComplexTypeDefinition; import com.evolveum.midpoint.schema.processor.ResourceAttributeDefinition; import com.evolveum.midpoint.schema.processor.ResourceSchema; +import com.evolveum.midpoint.schema.processor.ResourceSchemaImpl; import com.evolveum.midpoint.schema.util.ResourceTypeUtil; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.util.logging.LoggingUtils; @@ -462,7 +463,7 @@ private ResourceSchema loadResourceSchema() { } try { - return ResourceSchema.parse(xsdSchema, resource.toString(), getPageBase().getPrismContext()); + return ResourceSchemaImpl.parse(xsdSchema, resource.toString(), getPageBase().getPrismContext()); } catch (SchemaException|RuntimeException e) { LoggingUtils.logUnexpectedException(LOGGER, "Couldn't parse resource schema.", e); getSession().error(getString("ResourceAssociationEditor.message.cantParseSchema") + " " + e.getMessage()); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/component/schemahandling/ResourceAttributeEditor.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/component/schemahandling/ResourceAttributeEditor.java index 8582ee92542..76c0e67d4fe 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/component/schemahandling/ResourceAttributeEditor.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/component/schemahandling/ResourceAttributeEditor.java @@ -25,6 +25,7 @@ import com.evolveum.midpoint.schema.processor.ObjectClassComplexTypeDefinition; import com.evolveum.midpoint.schema.processor.ResourceAttributeDefinition; import com.evolveum.midpoint.schema.processor.ResourceSchema; +import com.evolveum.midpoint.schema.processor.ResourceSchemaImpl; import com.evolveum.midpoint.schema.util.ResourceTypeUtil; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.util.logging.LoggingUtils; @@ -491,7 +492,7 @@ private ResourceSchema loadResourceSchema() { } try { - return ResourceSchema.parse(xsdSchema, resource.toString(), getPageBase().getPrismContext()); + return ResourceSchemaImpl.parse(xsdSchema, resource.toString(), getPageBase().getPrismContext()); } catch (SchemaException|RuntimeException e) { LoggingUtils.logUnexpectedException(LOGGER, "Couldn't parse resource schema.", e); getSession().error(getString("ResourceAttributeEditor.message.cantParseSchema") + " " + e.getMessage()); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/certification/dto/CertDefinitionDto.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/certification/dto/CertDefinitionDto.java index 49e2106ab22..715dcecefa9 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/certification/dto/CertDefinitionDto.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/certification/dto/CertDefinitionDto.java @@ -312,8 +312,6 @@ public void updateScopeDefinition(PrismContext prismContext) { scopeTypeObj.setIncludeOrgs(definitionScopeDto.isIncludeOrgs()); scopeTypeObj.setIncludeServices(definitionScopeDto.isIncludeServices()); scopeTypeObj.setEnabledItemsOnly(definitionScopeDto.isEnabledItemsOnly()); - // needed because of prism implementation limitation (because the scopeDefinition is declared as AccessCertificationScopeType) - scopeTypeObj.asPrismContainerValue().setConcreteType(AccessCertificationAssignmentReviewScopeType.COMPLEX_TYPE); } definition.setScopeDefinition(scopeTypeObj); } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageAccounts.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageAccounts.java index 93bc58c8b6b..95a5e7591f8 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageAccounts.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageAccounts.java @@ -31,6 +31,7 @@ import javax.xml.namespace.QName; +import com.evolveum.midpoint.common.refinery.RefinedResourceSchemaImpl; import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import com.evolveum.midpoint.prism.query.builder.S_AtomicFilterEntry; import com.evolveum.midpoint.util.exception.CommonException; @@ -804,7 +805,7 @@ private void loadResourceObjectClass(){ resourcePrism = getModelService().getObject(ResourceType.class, oid, null, createSimpleTask(OPERATION_GET_INTENTS), result); - ResourceSchema schema = RefinedResourceSchema.getResourceSchema(resourcePrism, getPrismContext()); + ResourceSchema schema = RefinedResourceSchemaImpl.getResourceSchema(resourcePrism, getPrismContext()); schema.getObjectClassDefinitions(); for(Definition def: schema.getDefinitions()){ diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageDebugList.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageDebugList.java index 196e3b49900..e0277082a63 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageDebugList.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageDebugList.java @@ -23,6 +23,7 @@ import javax.xml.namespace.QName; +import com.evolveum.midpoint.prism.PrismPropertyDefinitionImpl; import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import com.evolveum.midpoint.web.component.data.BaseSortableDataProvider; import com.evolveum.midpoint.web.component.dialog.*; @@ -917,19 +918,19 @@ private String deleteObjectsAsync(QName type, ObjectQuery objectQuery, boolean r QueryType query = QueryJaxbConvertor.createQueryType(objectQuery, getPrismContext()); - PrismPropertyDefinition queryDef = new PrismPropertyDefinition( + PrismPropertyDefinition queryDef = new PrismPropertyDefinitionImpl( SchemaConstants.MODEL_EXTENSION_OBJECT_QUERY, QueryType.COMPLEX_TYPE, getPrismContext()); PrismProperty queryProp = queryDef.instantiate(); queryProp.setRealValue(query); task.setExtensionProperty(queryProp); - PrismPropertyDefinition typeDef = new PrismPropertyDefinition( + PrismPropertyDefinition typeDef = new PrismPropertyDefinitionImpl( SchemaConstants.MODEL_EXTENSION_OBJECT_TYPE, DOMUtil.XSD_QNAME, getPrismContext()); PrismProperty typeProp = typeDef.instantiate(); typeProp.setRealValue(type); task.setExtensionProperty(typeProp); - PrismPropertyDefinition rawDef = new PrismPropertyDefinition( + PrismPropertyDefinition rawDef = new PrismPropertyDefinitionImpl( SchemaConstants.MODEL_EXTENSION_OPTION_RAW, DOMUtil.XSD_BOOLEAN, getPrismContext()); PrismProperty rawProp = rawDef.instantiate(); rawProp.setRealValue(raw); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/RunReportPopupPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/RunReportPopupPanel.java index c51a907edd5..9754794291c 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/RunReportPopupPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/RunReportPopupPanel.java @@ -23,6 +23,7 @@ import javax.xml.datatype.XMLGregorianCalendar; import javax.xml.namespace.QName; +import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import org.apache.wicket.Component; import org.apache.wicket.MarkupContainer; @@ -48,15 +49,6 @@ import com.evolveum.midpoint.gui.api.page.PageBase; import com.evolveum.midpoint.gui.api.util.WebComponentUtil; import com.evolveum.midpoint.model.api.ModelService; -import com.evolveum.midpoint.prism.ItemDefinition; -import com.evolveum.midpoint.prism.PrismContainer; -import com.evolveum.midpoint.prism.PrismContainerDefinition; -import com.evolveum.midpoint.prism.PrismContainerValue; -import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.PrismObject; -import com.evolveum.midpoint.prism.PrismObjectDefinition; -import com.evolveum.midpoint.prism.PrismProperty; -import com.evolveum.midpoint.prism.PrismPropertyDefinition; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.prism.query.ObjectPaging; @@ -543,7 +535,7 @@ private void runConfirmPerformed(AjaxRequestTarget target, IModel mod } typeName = getPrismContext().getBeanConverter().determineTypeForClass(paramClass); } - PrismPropertyDefinition def = new PrismPropertyDefinition<>(new QName(ReportConstants.NS_EXTENSION, paramDto.getName()), typeName, getPrismContext()); + PrismPropertyDefinitionImpl def = new PrismPropertyDefinitionImpl<>(new QName(ReportConstants.NS_EXTENSION, paramDto.getName()), typeName, getPrismContext()); def.setDynamic(true); def.setRuntimeSchema(true); PrismProperty prop = def.instantiate(); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/ResourceContentPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/ResourceContentPanel.java index 41fb9e3c38e..c2edbca331a 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/ResourceContentPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/ResourceContentPanel.java @@ -22,6 +22,7 @@ import javax.xml.namespace.QName; +import com.evolveum.midpoint.common.refinery.RefinedResourceSchemaImpl; import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import com.evolveum.midpoint.web.session.SessionStorage; import org.apache.commons.lang.StringUtils; @@ -186,7 +187,7 @@ public QName getObjectClass() { } public RefinedObjectClassDefinition getDefinitionByKind() throws SchemaException { - RefinedResourceSchema refinedSchema = RefinedResourceSchema + RefinedResourceSchema refinedSchema = RefinedResourceSchemaImpl .getRefinedSchema(resourceModel.getObject(), getPageBase().getPrismContext()); if (refinedSchema == null) { warn("No schema found in resource. Please check your configuration and try to test connection for the resource."); @@ -197,7 +198,7 @@ public RefinedObjectClassDefinition getDefinitionByKind() throws SchemaException } public RefinedObjectClassDefinition getDefinitionByObjectClass() throws SchemaException { - RefinedResourceSchema refinedSchema = RefinedResourceSchema + RefinedResourceSchema refinedSchema = RefinedResourceSchemaImpl .getRefinedSchema(resourceModel.getObject(), getPageBase().getPrismContext()); if (refinedSchema == null) { warn("No schema found in resource. Please check your configuration and try to test connection for the resource."); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/ResourceContentTabPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/ResourceContentTabPanel.java index c904ce54023..100e7409a5b 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/ResourceContentTabPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/ResourceContentTabPanel.java @@ -22,6 +22,7 @@ import javax.xml.namespace.QName; +import com.evolveum.midpoint.common.refinery.RefinedResourceSchemaImpl; import com.evolveum.midpoint.web.session.SessionStorage; import org.apache.wicket.AttributeModifier; import org.apache.wicket.ajax.AjaxRequestTarget; @@ -139,13 +140,13 @@ private void initLayout(final IModel> model, final Pag public Iterator getIterator(String input) { RefinedResourceSchema refinedSchema = null; try { - refinedSchema = RefinedResourceSchema.getRefinedSchema(model.getObject(), + refinedSchema = RefinedResourceSchemaImpl.getRefinedSchema(model.getObject(), parentPage.getPrismContext()); } catch (SchemaException e) { return new ArrayList().iterator(); } - return RefinedResourceSchema.getIntentsForKind(refinedSchema, getKind()).iterator(); + return RefinedResourceSchemaImpl.getIntentsForKind(refinedSchema, getKind()).iterator(); } @@ -180,7 +181,7 @@ public boolean isVisible() { public String getObject() { RefinedObjectClassDefinition ocDef; try { - RefinedResourceSchema refinedSchema = RefinedResourceSchema + RefinedResourceSchema refinedSchema = RefinedResourceSchemaImpl .getRefinedSchema(model.getObject(), parentPage.getPrismContext()); if (refinedSchema == null) { return "NO SCHEMA DEFINED"; @@ -288,7 +289,7 @@ protected void onBeforeRender() { private List createObjectClassChoices(IModel> model) { RefinedResourceSchema refinedSchema; try { - refinedSchema = RefinedResourceSchema.getRefinedSchema(model.getObject(), + refinedSchema = RefinedResourceSchemaImpl.getRefinedSchema(model.getObject(), parentPage.getPrismContext()); } catch (SchemaException e) { warn("Could not determine defined obejct classes for resource"); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/ResourceDetailsTabPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/ResourceDetailsTabPanel.java index 9adf319327d..abd91eb6964 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/ResourceDetailsTabPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/ResourceDetailsTabPanel.java @@ -21,6 +21,7 @@ import javax.xml.namespace.QName; +import com.evolveum.midpoint.common.refinery.RefinedResourceSchemaImpl; import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang.StringUtils; @@ -323,7 +324,7 @@ private InfoBoxPanel createSchemaStatusInfo(ResourceType resource) { Integer progress = null; RefinedResourceSchema refinedSchema = null; try { - refinedSchema = RefinedResourceSchema.getRefinedSchema(resource); + refinedSchema = RefinedResourceSchemaImpl.getRefinedSchema(resource); if (refinedSchema != null) { backgroundColor = "bg-purple"; icon = "fa-cubes"; @@ -414,7 +415,7 @@ private List getTaskFor(List> tasks, // is not accessible in admin-gui) if (taskObjectClassValue == null) { ObjectClassComplexTypeDefinition taskObjectClassDef = null; - RefinedResourceSchema schema = RefinedResourceSchema.getRefinedSchema(resource); + RefinedResourceSchema schema = RefinedResourceSchemaImpl.getRefinedSchema(resource); if (schema == null) { throw new SchemaException( "No schema defined in resource. Possible configuration problem?"); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/dto/ResourceDto.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/dto/ResourceDto.java index bb892e78e2d..afe391561a0 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/dto/ResourceDto.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/dto/ResourceDto.java @@ -20,6 +20,7 @@ import java.util.Collection; import java.util.List; +import com.evolveum.midpoint.common.refinery.RefinedResourceSchemaImpl; import com.evolveum.midpoint.prism.PrismReference; import com.evolveum.midpoint.schema.result.OperationResultStatus; import com.evolveum.midpoint.web.component.data.column.InlineMenuable; @@ -98,7 +99,7 @@ public ResourceDto(PrismObject resource, PrismContext prismContext this.capabilities = capabilities; try { - ResourceSchema resourceSchema = RefinedResourceSchema.getResourceSchema(resource, prismContext); + ResourceSchema resourceSchema = RefinedResourceSchemaImpl.getResourceSchema(resource, prismContext); Collection definitions = resourceSchema.getObjectClassDefinitions(); for (ObjectClassComplexTypeDefinition definition : definitions) { if (!(definition instanceof ObjectClassComplexTypeDefinition)) { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/PageTaskAdd.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/PageTaskAdd.java index 2c8fc9b9672..9149c830cb7 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/PageTaskAdd.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/PageTaskAdd.java @@ -24,6 +24,7 @@ import javax.xml.namespace.QName; +import com.evolveum.midpoint.common.refinery.RefinedResourceSchemaImpl; import org.apache.commons.lang.StringUtils; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior; @@ -255,7 +256,7 @@ protected void onUpdate(AjaxRequestTarget target) { resourcesDto.getOid(), PageTaskAdd.this, task, result); try { - ResourceSchema schema = RefinedResourceSchema.getResourceSchema(resource, getPrismContext()); + ResourceSchema schema = RefinedResourceSchemaImpl.getResourceSchema(resource, getPrismContext()); schema.getObjectClassDefinitions(); for(Definition def: schema.getDefinitions()){ diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/handlers/ResourceRelatedHandlerPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/handlers/ResourceRelatedHandlerPanel.java index 6f1be97ae17..9fec27719ab 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/handlers/ResourceRelatedHandlerPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/handlers/ResourceRelatedHandlerPanel.java @@ -16,6 +16,7 @@ package com.evolveum.midpoint.web.page.admin.server.handlers; import com.evolveum.midpoint.common.refinery.RefinedResourceSchema; +import com.evolveum.midpoint.common.refinery.RefinedResourceSchemaImpl; import com.evolveum.midpoint.gui.api.component.BasePanel; import com.evolveum.midpoint.gui.api.util.WebComponentUtil; import com.evolveum.midpoint.gui.api.util.WebModelServiceUtils; @@ -149,7 +150,7 @@ protected void onUpdate(AjaxRequestTarget target) { resourcesDto.getOid(), parentPage, task, result); try { - ResourceSchema schema = RefinedResourceSchema.getResourceSchema(resource, parentPage.getPrismContext()); + ResourceSchema schema = RefinedResourceSchemaImpl.getResourceSchema(resource, parentPage.getPrismContext()); schema.getObjectClassDefinitions(); for(Definition def: schema.getDefinitions()){ diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/handlers/dto/GenericHandlerDto.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/handlers/dto/GenericHandlerDto.java index 3adfd1a0bbe..9a0ea2c88d1 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/handlers/dto/GenericHandlerDto.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/handlers/dto/GenericHandlerDto.java @@ -72,17 +72,17 @@ public GenericHandlerDto(TaskDto taskDto, @NotNull List items, PageBase pa final PrismContext prismContext = pageBase.getPrismContext(); PrismContainer container = new PrismContainer(new QName("test"), prismContext); - ComplexTypeDefinition ctd = new ComplexTypeDefinition(new QName("Test"), prismContext); + ComplexTypeDefinitionImpl ctd = new ComplexTypeDefinitionImpl(new QName("Test"), prismContext); int displayOrder = 1; for (Item item : items) { PrismProperty property = taskDto.getExtensionProperty(item.name); - PrismPropertyDefinition clonedDefinition = null; + PrismPropertyDefinitionImpl clonedDefinition = null; if (property != null) { try { PrismProperty clonedProperty = property.clone(); container.add(clonedProperty); if (clonedProperty.getDefinition() != null) { - clonedDefinition = clonedProperty.getDefinition().clone(); + clonedDefinition = (PrismPropertyDefinitionImpl) clonedProperty.getDefinition().clone(); clonedProperty.setDefinition((PrismPropertyDefinition) clonedDefinition); } } catch (SchemaException e) { @@ -90,7 +90,7 @@ public GenericHandlerDto(TaskDto taskDto, @NotNull List items, PageBase pa } } if (clonedDefinition == null) { - clonedDefinition = CloneUtil.clone(prismContext.getSchemaRegistry().findPropertyDefinitionByElementName(item.name)); + clonedDefinition = CloneUtil.clone((PrismPropertyDefinitionImpl) prismContext.getSchemaRegistry().findPropertyDefinitionByElementName(item.name)); } if (clonedDefinition == null) { System.out.println("Definition-less property " + item.name); @@ -102,7 +102,7 @@ public GenericHandlerDto(TaskDto taskDto, @NotNull List items, PageBase pa } displayOrder++; } - PrismContainerDefinition containerDefinition = new PrismContainerDefinition<>(new QName("test"), ctd, prismContext); + PrismContainerDefinition containerDefinition = new PrismContainerDefinitionImpl<>(new QName("test"), ctd, prismContext); container.setDefinition(containerDefinition); containerWrapper = cwf.createContainerWrapper(container, ContainerStatus.MODIFYING, ItemPath.EMPTY_PATH, true); } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/handlers/dto/ResourceRelatedHandlerDto.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/handlers/dto/ResourceRelatedHandlerDto.java index 32358901613..2bc0d224653 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/handlers/dto/ResourceRelatedHandlerDto.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/handlers/dto/ResourceRelatedHandlerDto.java @@ -1,6 +1,7 @@ package com.evolveum.midpoint.web.page.admin.server.handlers.dto; import com.evolveum.midpoint.common.refinery.RefinedResourceSchema; +import com.evolveum.midpoint.common.refinery.RefinedResourceSchemaImpl; import com.evolveum.midpoint.gui.api.page.PageBase; import com.evolveum.midpoint.gui.api.util.WebModelServiceUtils; import com.evolveum.midpoint.prism.*; @@ -155,7 +156,7 @@ private void updateObjectClassList(PageBase pageBase){ pageBase, task, result); try { - ResourceSchema schema = RefinedResourceSchema.getResourceSchema(resource, pageBase.getPrismContext()); + ResourceSchema schema = RefinedResourceSchemaImpl.getResourceSchema(resource, pageBase.getPrismContext()); schema.getObjectClassDefinitions(); for(Definition def: schema.getDefinitions()){ diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/SynchronizationUtils.java b/infra/common/src/main/java/com/evolveum/midpoint/common/SynchronizationUtils.java index 47e208661b0..d9f5da32894 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/SynchronizationUtils.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/SynchronizationUtils.java @@ -23,6 +23,7 @@ import javax.xml.datatype.XMLGregorianCalendar; import javax.xml.namespace.QName; +import com.evolveum.midpoint.common.refinery.RefinedResourceSchemaImpl; import com.evolveum.midpoint.util.QNameUtil; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.Validate; @@ -69,7 +70,7 @@ public static boolean isPolicyApplicable(QName objectClass, ShadowKindType kind, String policyIntent = synchronizationPolicy.getIntent(); ShadowKindType policyKind = synchronizationPolicy.getKind(); ObjectClassComplexTypeDefinition policyObjectClass = null; - RefinedResourceSchema schema = RefinedResourceSchema.getRefinedSchema(resource); + RefinedResourceSchema schema = RefinedResourceSchemaImpl.getRefinedSchema(resource); if (schema == null) { throw new SchemaException("No schema defined in resource. Possible configuration problem?"); } diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/CompositeRefinedObjectClassDefinition.java b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/CompositeRefinedObjectClassDefinition.java index 1d62086e97d..8d56b37ec91 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/CompositeRefinedObjectClassDefinition.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/CompositeRefinedObjectClassDefinition.java @@ -22,25 +22,23 @@ import javax.xml.namespace.QName; import com.evolveum.midpoint.common.ResourceObjectPattern; -import com.evolveum.midpoint.prism.ItemDefinition; -import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.PrismObjectDefinition; +import com.evolveum.midpoint.prism.*; +import com.evolveum.midpoint.prism.path.ItemPath; +import com.evolveum.midpoint.prism.query.ObjectQuery; +import com.evolveum.midpoint.prism.schema.SchemaRegistry; +import com.evolveum.midpoint.schema.ResourceShadowDiscriminator; import com.evolveum.midpoint.schema.processor.ObjectClassComplexTypeDefinition; +import com.evolveum.midpoint.schema.processor.ResourceAttributeContainer; +import com.evolveum.midpoint.schema.processor.ResourceAttributeContainerDefinition; import com.evolveum.midpoint.schema.processor.ResourceAttributeDefinition; import com.evolveum.midpoint.schema.util.SchemaDebugUtil; import com.evolveum.midpoint.util.DebugUtil; -import com.evolveum.midpoint.xml.ns._public.common.common_3.AttributeFetchStrategyType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.LayerType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.MappingType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceActivationDefinitionType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceBidirectionalMappingType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceObjectReferenceType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowKindType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; +import com.evolveum.midpoint.util.exception.SchemaException; +import com.evolveum.midpoint.xml.ns._public.common.common_3.*; import com.evolveum.midpoint.xml.ns._public.resource.capabilities_3.CapabilityType; import com.evolveum.midpoint.xml.ns._public.resource.capabilities_3.PagedSearchCapabilityType; +import com.evolveum.prism.xml.ns._public.types_3.ItemPathType; +import org.jetbrains.annotations.NotNull; /** * Used to represent combined definition of structural and auxiliary object classes. @@ -48,15 +46,18 @@ * @author semancik * */ -public class CompositeRefinedObjectClassDefinition extends RefinedObjectClassDefinition { +public class CompositeRefinedObjectClassDefinition implements RefinedObjectClassDefinition { - private RefinedObjectClassDefinition structuralObjectClassDefinition; - private Collection auxiliaryObjectClassDefinitions; + @NotNull private final RefinedObjectClassDefinition structuralObjectClassDefinition; + @NotNull private final Collection auxiliaryObjectClassDefinitions; - public CompositeRefinedObjectClassDefinition(RefinedObjectClassDefinition structuralObjectClassDefinition, Collection auxiliaryObjectClassDefinitions) { - super(structuralObjectClassDefinition.getTypeName(), structuralObjectClassDefinition.getPrismContext()); + public CompositeRefinedObjectClassDefinition(@NotNull RefinedObjectClassDefinition structuralObjectClassDefinition, Collection auxiliaryObjectClassDefinitions) { this.structuralObjectClassDefinition = structuralObjectClassDefinition; - this.auxiliaryObjectClassDefinitions = auxiliaryObjectClassDefinitions; + if (auxiliaryObjectClassDefinitions != null) { + this.auxiliaryObjectClassDefinitions = auxiliaryObjectClassDefinitions; + } else { + this.auxiliaryObjectClassDefinitions = new ArrayList<>(); + } } public RefinedObjectClassDefinition getStructuralObjectClassDefinition() { @@ -127,6 +128,7 @@ public RefinedAttributeDefinition getNamingAttribute() { return structuralObjectClassDefinition.getNamingAttribute(); } + @NotNull public QName getTypeName() { return structuralObjectClassDefinition.getTypeName(); } @@ -206,10 +208,6 @@ public Collection getProtectedObjectPatterns() { return structuralObjectClassDefinition.getProtectedObjectPatterns(); } - public String getDocClassName() { - return structuralObjectClassDefinition.getDocClassName(); - } - public String getDisplayName() { return structuralObjectClassDefinition.getDisplayName(); } @@ -288,7 +286,7 @@ public boolean isObjectCountingEnabled() { @Override public T findItemDefinition(QName name, Class clazz, boolean caseInsensitive) { T itemDef = structuralObjectClassDefinition.findItemDefinition(name, clazz, caseInsensitive); - if (itemDef == null && auxiliaryObjectClassDefinitions != null) { + if (itemDef == null) { for(RefinedObjectClassDefinition auxiliaryObjectClassDefinition: auxiliaryObjectClassDefinitions) { itemDef = auxiliaryObjectClassDefinition.findItemDefinition(name, clazz, caseInsensitive); if (itemDef != null) { @@ -302,7 +300,7 @@ public T findItemDefinition(QName name, Class claz @Override public Collection> getAttributeDefinitions() { - if (auxiliaryObjectClassDefinitions == null || auxiliaryObjectClassDefinitions.isEmpty()) { + if (auxiliaryObjectClassDefinitions.isEmpty()) { return structuralObjectClassDefinition.getAttributeDefinitions(); } Collection> defs = new ArrayList<>(); @@ -329,6 +327,215 @@ public PrismContext getPrismContext() { return structuralObjectClassDefinition.getPrismContext(); } + @Override + public void revive(PrismContext prismContext) { + structuralObjectClassDefinition.revive(prismContext); + for (RefinedObjectClassDefinition auxiliaryObjectClassDefinition : auxiliaryObjectClassDefinitions) { + auxiliaryObjectClassDefinition.revive(prismContext); + } + } + + @Override + public List getDefinitions() { + throw new UnsupportedOperationException("TODO implement getDefinitions() maybe as union of definitions from structural and aux OCs?"); + } + + @Override + public QName getExtensionForType() { + return structuralObjectClassDefinition.getExtensionForType(); + } + + @Override + public boolean isXsdAnyMarker() { + return structuralObjectClassDefinition.isXsdAnyMarker(); + } + + @Override + public String getDefaultNamespace() { + return structuralObjectClassDefinition.getDefaultNamespace(); + } + + @NotNull + @Override + public List getIgnoredNamespaces() { + return structuralObjectClassDefinition.getIgnoredNamespaces(); + } + + @Override + public ID findItemDefinition(@NotNull QName name) { + return null; + } + + @Override + public PrismPropertyDefinition findPropertyDefinition(@NotNull QName name) { + return null; + } + + @Override + public LayerRefinedObjectClassDefinition forLayer(LayerType layerType) { + return null; + } + + @Override + public PrismContainerDefinition findContainerDefinition(@NotNull QName name) { + return null; + } + + @Override + public ID findItemDefinition(@NotNull QName name, @NotNull Class clazz) { + return null; + } + + @Override + public ResourceAttributeDefinition findAttributeDefinition(QName name, boolean caseInsensitive) { + return null; + } + + @Override + public RefinedAssociationDefinition findAssociation(QName name) { + return null; + } + + @Override + public RefinedAssociationDefinition findEntitlementAssociation(QName name) { + return null; + } + + @Override + public ResourceAttributeContainerDefinition toResourceAttributeContainerDefinition() { + return null; + } + + @Override + public ID findItemDefinition(@NotNull ItemPath path) { + return null; + } + + @Override + public ResourceAttributeContainerDefinition toResourceAttributeContainerDefinition(QName elementName) { + return null; + } + + @Override + public PrismPropertyDefinition findPropertyDefinition(@NotNull ItemPath path) { + return null; + } + + @Override + public Collection getNamesOfAssociationsWithOutboundExpressions() { + return null; + } + + @Override + public ObjectQuery createShadowSearchQuery(String resourceOid) throws SchemaException { + return null; + } + + @Override + public PrismContainerDefinition findContainerDefinition(@NotNull ItemPath path) { + return null; + } + + @Override + public boolean hasAuxiliaryObjectClass(QName expectedObjectClassName) { + return false; + } + + @Override + public ResourceAttributeContainer instantiate(QName elementName) { + return null; + } + + @Override + public ID findItemDefinition(@NotNull ItemPath path, @NotNull Class clazz) { + return null; + } + + @Override + public void merge(ComplexTypeDefinition otherComplexTypeDef) { + + } + + @Override + public ComplexTypeDefinition deepClone() { + return null; + } + + @Override + public RefinedAttributeDefinition findAttributeDefinition(QName elementQName) { + return null; + } + + @Override + public RefinedAttributeDefinition findAttributeDefinition(String elementLocalname) { + return null; + } + + @Override + public String getResourceNamespace() { + return structuralObjectClassDefinition.getResourceNamespace(); + } + + @Override + public PrismObjectDefinition getObjectDefinition() { + return null; + } + + @Override + public SchemaRegistry getSchemaRegistry() { + return null; + } + + @Override + public RefinedAttributeDefinition getAttributeDefinition(QName attributeName) { + return null; + } + + @Override + public Class getTypeClassIfKnown() { + return null; + } + + @Override + public Class getTypeClass() { + return null; + } + + @Override + public boolean containsAttributeDefinition(ItemPathType pathType) { + return false; + } + + @Override + public boolean containsAttributeDefinition(QName attributeName) { + return false; + } + + @Override + public PrismObject createBlankShadow() { + return null; + } + + @Override + public ResourceShadowDiscriminator getShadowDiscriminator() { + return null; + } + + @Override + public Collection getNamesOfAttributesWithOutboundExpressions() { + return null; + } + + @Override + public Collection getNamesOfAttributesWithInboundExpressions() { + return null; + } + + @Override + public ResourcePasswordDefinitionType getPasswordDefinition() { + return null; + } + @Override public CompositeRefinedObjectClassDefinition clone() { RefinedObjectClassDefinition structuralObjectClassDefinitionClone = structuralObjectClassDefinition.clone(); @@ -409,7 +616,7 @@ protected String debugDump(int indent, LayerType layer) { /** * Return a human readable name of this class suitable for logs. */ - @Override +// @Override protected String getDebugDumpClassName() { return "crOCD"; } diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedAttributeDefinition.java b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedAttributeDefinition.java index e10ece7c614..05e88a41b0b 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedAttributeDefinition.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedAttributeDefinition.java @@ -13,553 +13,22 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.evolveum.midpoint.common.refinery; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import javax.xml.namespace.QName; +package com.evolveum.midpoint.common.refinery; -import com.evolveum.midpoint.prism.ItemDefinition; -import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.PrismPropertyDefinition; -import com.evolveum.midpoint.prism.delta.ItemDelta; -import com.evolveum.midpoint.prism.delta.PropertyDelta; -import com.evolveum.midpoint.prism.path.ItemPath; -import com.evolveum.midpoint.schema.processor.ObjectClassComplexTypeDefinition; -import com.evolveum.midpoint.schema.processor.ResourceAttribute; -import com.evolveum.midpoint.schema.processor.ResourceAttributeContainerDefinition; -import com.evolveum.midpoint.schema.processor.ResourceAttributeDefinition; -import com.evolveum.midpoint.util.DebugUtil; -import com.evolveum.midpoint.util.DisplayableValue; -import com.evolveum.midpoint.xml.ns._public.common.common_3.AttributeFetchStrategyType; import com.evolveum.midpoint.xml.ns._public.common.common_3.LayerType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.MappingType; -import org.jetbrains.annotations.NotNull; /** - * @author semancik - * + * @author mederly */ -public class LayerRefinedAttributeDefinition extends RefinedAttributeDefinition { - - private RefinedAttributeDefinition refinedAttributeDefinition; - private LayerType layer; - private Boolean overrideCanRead = null; - private Boolean overrideCanAdd = null; - private Boolean overrideCanModify = null; - - private LayerRefinedAttributeDefinition(RefinedAttributeDefinition refinedAttributeDefinition, LayerType layer) { - super(refinedAttributeDefinition, refinedAttributeDefinition.getPrismContext()); - this.refinedAttributeDefinition = refinedAttributeDefinition; - this.layer = layer; - } - - static LayerRefinedAttributeDefinition wrap(RefinedAttributeDefinition rAttrDef, LayerType layer) { - if (rAttrDef == null) { - return null; - } - return new LayerRefinedAttributeDefinition(rAttrDef, layer); - } - - static List> wrapCollection( - Collection defs, LayerType layer) { - List outs = new ArrayList>(defs.size()); - for (ItemDefinition itemDef: defs) { - if (itemDef instanceof LayerRefinedAttributeDefinition) { - outs.add(itemDef); - } else if (itemDef instanceof RefinedAttributeDefinition) { - outs.add(wrap((RefinedAttributeDefinition)itemDef, layer)); - } else { - throw new IllegalStateException("Unexpected type of attribute definition: " + itemDef); - } - } - return outs; - } - - public LayerType getLayer() { - return layer; - } - - @Override - public ResourceAttribute instantiate() { - return refinedAttributeDefinition.instantiate(); - } - - @Override - public ResourceAttribute instantiate(QName name) { - return refinedAttributeDefinition.instantiate(name); - } - - @Override - public boolean isIdentifier(ResourceAttributeContainerDefinition objectDefinition) { - return refinedAttributeDefinition.isIdentifier(objectDefinition); - } - - @Override - public boolean isIdentifier(ObjectClassComplexTypeDefinition objectDefinition) { - return refinedAttributeDefinition.isIdentifier(objectDefinition); - } - - @Override - public void setNativeAttributeName(String nativeAttributeName) { - refinedAttributeDefinition.setNativeAttributeName(nativeAttributeName); - } - - @Override - public boolean isSecondaryIdentifier(ObjectClassComplexTypeDefinition objectDefinition) { - return refinedAttributeDefinition.isSecondaryIdentifier(objectDefinition); - } - - @Override - public boolean isTolerant() { - return refinedAttributeDefinition.isTolerant(); - } - - @Override - public void setTolerant(boolean tolerant) { - refinedAttributeDefinition.setTolerant(tolerant); - } - - public Boolean getOverrideCanRead() { - return overrideCanRead; - } - - public void setOverrideCanRead(Boolean overrideCanRead) { - this.overrideCanRead = overrideCanRead; - } - - public Boolean getOverrideCanAdd() { - return overrideCanAdd; - } - - public void setOverrideCanAdd(Boolean overrideCanAdd) { - this.overrideCanAdd = overrideCanAdd; - } - - public Boolean getOverrideCanModify() { - return overrideCanModify; - } - - public void setOverrideCanModify(Boolean overrideCanModify) { - this.overrideCanModify = overrideCanModify; - } - - @Override - public boolean canAdd() { - if (overrideCanAdd != null) { - return overrideCanAdd; - } - return refinedAttributeDefinition.canAdd(layer); - } - - @Override - public boolean canAdd(LayerType layer) { - return refinedAttributeDefinition.canAdd(layer); - } - - @Override - public boolean canRead() { - if (overrideCanRead != null) { - return overrideCanRead; - } - return refinedAttributeDefinition.canRead(layer); - } - - @Override - public boolean canRead(LayerType layer) { - return refinedAttributeDefinition.canRead(layer); - } - - @Override - public boolean canModify() { - if (overrideCanModify != null) { - return overrideCanModify; - } - return refinedAttributeDefinition.canModify(layer); - } - - @Override - public void setName(@NotNull QName name) { - refinedAttributeDefinition.setName(name); - } - - @Override - public boolean canModify(LayerType layer) { - return refinedAttributeDefinition.canModify(layer); - } - - @Override - public void setReadOnly() { - refinedAttributeDefinition.setReadOnly(); - } - - @Override - public void setTypeName(QName typeName) { - refinedAttributeDefinition.setTypeName(typeName); - } - - @Override - public QName getValueType() { - return refinedAttributeDefinition.getValueType(); - } - - @Override - public String getNamespace() { - return refinedAttributeDefinition.getNamespace(); - } - - @Override - public Boolean isIndexed() { - return refinedAttributeDefinition.isIndexed(); - } - - @Override - public void setMinOccurs(int minOccurs) { - refinedAttributeDefinition.setMinOccurs(minOccurs); - } - - @Override - public void setMaxOccurs(int maxOccurs) { - refinedAttributeDefinition.setMaxOccurs(maxOccurs); - } - - @Override - public void setCanRead(boolean read) { - refinedAttributeDefinition.setCanRead(read); - } - - @Override - public void setCanModify(boolean update) { - refinedAttributeDefinition.setCanModify(update); - } - - @Override - public void setIndexed(Boolean indexed) { - refinedAttributeDefinition.setIndexed(indexed); - } - - @Override - public Integer getDisplayOrder() { - return refinedAttributeDefinition.getDisplayOrder(); - } - - @Override - public boolean isSingleValue() { - return refinedAttributeDefinition.isSingleValue(layer); - } - - @Override - public void setCanAdd(boolean create) { - refinedAttributeDefinition.setCanAdd(create); - } - - @Override - public PropertyDelta createEmptyDelta(ItemPath path) { - return refinedAttributeDefinition.createEmptyDelta(path); - } - - @Override - public boolean isMultiValue() { - return refinedAttributeDefinition.isMultiValue(layer); - } - - @Override - public boolean isIgnored() { - return refinedAttributeDefinition.isIgnored(layer); - } - - @Override - public boolean isIgnored(LayerType layer) { - return refinedAttributeDefinition.isIgnored(layer); - } - - @Override - public void setDisplayOrder(Integer displayOrder) { - refinedAttributeDefinition.setDisplayOrder(displayOrder); - } - - @Override - public boolean isMandatory() { - return refinedAttributeDefinition.isMandatory(layer); - } - - @Override - public void setIgnored(boolean ignored) { - refinedAttributeDefinition.setIgnored(ignored); - } - - @Override - public boolean isOptional() { - return refinedAttributeDefinition.isOptional(layer); - } - - @Override - public void setHelp(String help) { - refinedAttributeDefinition.setHelp(help); - } - - @Override - public String getDisplayName() { - return refinedAttributeDefinition.getDisplayName(); - } - - @Override - public boolean isDynamic() { - return refinedAttributeDefinition.isDynamic(); - } - - @Override - public void setDisplayName(String displayName) { - refinedAttributeDefinition.setDisplayName(displayName); - } - - @Override - public String getDescription() { - return refinedAttributeDefinition.getDescription(); - } - - @Override - public PrismContext getPrismContext() { - return refinedAttributeDefinition.getPrismContext(); - } - - @Override - public void setDescription(String description) { - refinedAttributeDefinition.setDescription(description); - } - - @Override - public Class getTypeClass() { - return refinedAttributeDefinition.getTypeClass(); - } - - @Override - public ResourceAttributeDefinition getAttributeDefinition() { - return refinedAttributeDefinition.getAttributeDefinition(); - } - - @Override - public void setAttributeDefinition(ResourceAttributeDefinition attributeDefinition) { - refinedAttributeDefinition.setAttributeDefinition(attributeDefinition); - } - - @Override - public void setDynamic(boolean dynamic) { - refinedAttributeDefinition.setDynamic(dynamic); - } - - @Override - public boolean isValidFor(QName elementQName, Class clazz) { - return isValidFor(elementQName, clazz, false); - } - - @Override - public boolean isValidFor(QName elementQName, Class clazz, boolean caseInsensitive) { - return refinedAttributeDefinition.isValidFor(elementQName, clazz, caseInsensitive); - } - - public Boolean getReturnedByDefault() { - return refinedAttributeDefinition.getReturnedByDefault(); - } - - public boolean isAbstract() { - return refinedAttributeDefinition.isAbstract(); - } - - public boolean isDeprecated() { - return refinedAttributeDefinition.isDeprecated(); - } - - public boolean isOperational() { - return refinedAttributeDefinition.isOperational(); - } - - public String getDocumentation() { - return refinedAttributeDefinition.getDocumentation(); - } - - public String getDocumentationPreview() { - return refinedAttributeDefinition.getDocumentationPreview(); - } - - public boolean isRuntimeSchema() { - return refinedAttributeDefinition.isRuntimeSchema(); - } - - public boolean isReturnedByDefault() { - return refinedAttributeDefinition.isReturnedByDefault(); - } - - public String getDocClassName() { - return refinedAttributeDefinition.getDocClassName(); - } - - public boolean isExlusiveStrong() { - return refinedAttributeDefinition.isExlusiveStrong(); - } - - public boolean isSecondaryIdentifier() { - return refinedAttributeDefinition.isSecondaryIdentifier(); - } - - public boolean isInherited() { - return refinedAttributeDefinition.isInherited(); - } - - public boolean isVolatilityTrigger() { - return refinedAttributeDefinition.isVolatilityTrigger(); - } - - public boolean isDisplayNameAttribute() { - return refinedAttributeDefinition.isDisplayNameAttribute(); - } - - public AttributeFetchStrategyType getFetchStrategy() { - return refinedAttributeDefinition.getFetchStrategy(); - } - - public List getTolerantValuePattern() { - return refinedAttributeDefinition.getTolerantValuePattern(); - } - - public List getIntolerantValuePattern() { - return refinedAttributeDefinition.getIntolerantValuePattern(); - } - - @Override - public MappingType getOutboundMappingType() { - return refinedAttributeDefinition.getOutboundMappingType(); - } - - @Override - public void setOutboundMappingType(MappingType outboundMappingType) { - refinedAttributeDefinition.setOutboundMappingType(outboundMappingType); - } - - @Override - public boolean hasOutboundMapping() { - return refinedAttributeDefinition.hasOutboundMapping(); - } - - @Override - public List getInboundMappingTypes() { - return refinedAttributeDefinition.getInboundMappingTypes(); - } - - @Override - public void setInboundMappingTypes(List inboundAssignmentTypes) { - refinedAttributeDefinition.setInboundMappingTypes(inboundAssignmentTypes); - } - - @NotNull - @Override - public QName getName() { - return refinedAttributeDefinition.getName(); - } - - @Override - public QName getTypeName() { - return refinedAttributeDefinition.getTypeName(); - } - - @Override - public String getNativeAttributeName() { - return refinedAttributeDefinition.getNativeAttributeName(); - } - - @Override - public Collection> getAllowedValues() { - return refinedAttributeDefinition.getAllowedValues(); - } - - @Override - public int getMaxOccurs() { - return refinedAttributeDefinition.getMaxOccurs(layer); - } - - @Override - public int getMaxOccurs(LayerType layer) { - return refinedAttributeDefinition.getMaxOccurs(layer); - } - - @Override - public int getMinOccurs() { - return refinedAttributeDefinition.getMinOccurs(layer); - } - - @Override - public int getMinOccurs(LayerType layer) { - return refinedAttributeDefinition.getMinOccurs(layer); - } - - @Override - public PropertyLimitations getLimitations(LayerType layer) { - return refinedAttributeDefinition.getLimitations(layer); - } - - public PropertyLimitations getLimitations() { - return refinedAttributeDefinition.getLimitations(layer); - } - - @Override - public String getHelp() { - return refinedAttributeDefinition.getHelp(); - } +public interface LayerRefinedAttributeDefinition extends RefinedAttributeDefinition { + LayerType getLayer(); - public QName getMatchingRuleQName() { - return refinedAttributeDefinition.getMatchingRuleQName(); - } + Boolean getOverrideCanRead(); - @Override - public int hashCode() { - final int prime = 31; - int result = super.hashCode(); - result = prime * result + ((layer == null) ? 0 : layer.hashCode()); - result = prime * result + ((refinedAttributeDefinition == null) ? 0 : refinedAttributeDefinition.hashCode()); - return result; - } + Boolean getOverrideCanAdd(); - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (!super.equals(obj)) - return false; - if (getClass() != obj.getClass()) - return false; - LayerRefinedAttributeDefinition other = (LayerRefinedAttributeDefinition) obj; - if (layer != other.layer) - return false; - if (refinedAttributeDefinition == null) { - if (other.refinedAttributeDefinition != null) - return false; - } else if (!refinedAttributeDefinition.equals(other.refinedAttributeDefinition)) - return false; - return true; - } - - @Override - public String debugDump() { - return debugDump(0); - } + Boolean getOverrideCanModify(); - @Override - public String debugDump(int indent) { - StringBuilder sb = new StringBuilder(); - DebugUtil.indentDebugDump(sb, indent); - sb.append(getDebugDumpClassName()).append("(layer=").append(layer).append(",\n"); - sb.append(refinedAttributeDefinition.debugDump(indent+1, layer)); - return sb.toString(); - } - - /** - * Return a human readable name of this class suitable for logs. - */ - @Override - protected String getDebugDumpClassName() { - return "LRRAD"; - } - + PropertyLimitations getLimitations(); } diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedAttributeDefinitionImpl.java b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedAttributeDefinitionImpl.java new file mode 100644 index 00000000000..4f155591b14 --- /dev/null +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedAttributeDefinitionImpl.java @@ -0,0 +1,583 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.common.refinery; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import javax.xml.namespace.QName; + +import com.evolveum.midpoint.prism.*; +import com.evolveum.midpoint.prism.delta.ItemDelta; +import com.evolveum.midpoint.prism.delta.PropertyDelta; +import com.evolveum.midpoint.prism.path.ItemPath; +import com.evolveum.midpoint.prism.schema.SchemaRegistry; +import com.evolveum.midpoint.schema.processor.ObjectClassComplexTypeDefinition; +import com.evolveum.midpoint.schema.processor.ResourceAttribute; +import com.evolveum.midpoint.schema.processor.ResourceAttributeContainerDefinition; +import com.evolveum.midpoint.schema.processor.ResourceAttributeDefinition; +import com.evolveum.midpoint.util.DebugUtil; +import com.evolveum.midpoint.util.DisplayableValue; +import com.evolveum.midpoint.xml.ns._public.common.common_3.AttributeFetchStrategyType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.LayerType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.MappingType; +import org.jetbrains.annotations.NotNull; + +/** + * @author semancik + * + */ +public class LayerRefinedAttributeDefinitionImpl implements LayerRefinedAttributeDefinition { + + private RefinedAttributeDefinition refinedAttributeDefinition; + private LayerType layer; + private Boolean overrideCanRead = null; + private Boolean overrideCanAdd = null; + private Boolean overrideCanModify = null; + + private LayerRefinedAttributeDefinitionImpl(RefinedAttributeDefinition refinedAttributeDefinition, LayerType layer) { + this.refinedAttributeDefinition = refinedAttributeDefinition; + this.layer = layer; + } + + static LayerRefinedAttributeDefinition wrap(RefinedAttributeDefinition rAttrDef, LayerType layer) { + if (rAttrDef == null) { + return null; + } + return new LayerRefinedAttributeDefinitionImpl(rAttrDef, layer); + } + + static List> wrapCollection( + Collection defs, LayerType layer) { + List outs = new ArrayList>(defs.size()); + for (ItemDefinition itemDef: defs) { + if (itemDef instanceof LayerRefinedAttributeDefinition) { + outs.add(itemDef); + } else if (itemDef instanceof RefinedAttributeDefinition) { + outs.add(wrap((RefinedAttributeDefinition)itemDef, layer)); + } else { + throw new IllegalStateException("Unexpected type of attribute definition: " + itemDef); + } + } + return outs; + } + + @Override + public LayerType getLayer() { + return layer; + } + + @Override + public Boolean getOverrideCanRead() { + return overrideCanRead; + } + + public void setOverrideCanRead(Boolean overrideCanRead) { + this.overrideCanRead = overrideCanRead; + } + + @Override + public Boolean getOverrideCanAdd() { + return overrideCanAdd; + } + + public void setOverrideCanAdd(Boolean overrideCanAdd) { + this.overrideCanAdd = overrideCanAdd; + } + + @Override + public Boolean getOverrideCanModify() { + return overrideCanModify; + } + + public void setOverrideCanModify(Boolean overrideCanModify) { + this.overrideCanModify = overrideCanModify; + } + + @Override + public boolean canAdd() { + if (overrideCanAdd != null) { + return overrideCanAdd; + } + return refinedAttributeDefinition.canAdd(layer); + } + + @Override + public PropertyLimitations getLimitations() { + return refinedAttributeDefinition.getLimitations(layer); + } + + @Override + public RefinedAttributeDefinition clone() { + return refinedAttributeDefinition.clone(); + } + + // TODO ???????? + @Override + public String debugDump(int indent, LayerType layer) { + return refinedAttributeDefinition.debugDump(indent, layer); + } + + @Override + public boolean canRead() { + if (overrideCanRead != null) { + return overrideCanRead; + } + return refinedAttributeDefinition.canRead(layer); + } + + @Override + public boolean isIgnored(LayerType layer) { + return refinedAttributeDefinition.isIgnored(layer); + } + + @Override + public boolean canModify() { + if (overrideCanModify != null) { + return overrideCanModify; + } + return refinedAttributeDefinition.canModify(layer); + } + + // @Override +// public boolean isValidFor(QName elementQName, Class clazz) { +// return isValidFor(elementQName, clazz, false); +// } + + @Override + public int hashCode() { + final int prime = 31; + int result = super.hashCode(); + result = prime * result + ((layer == null) ? 0 : layer.hashCode()); + result = prime * result + ((refinedAttributeDefinition == null) ? 0 : refinedAttributeDefinition.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (!super.equals(obj)) + return false; + if (getClass() != obj.getClass()) + return false; + LayerRefinedAttributeDefinitionImpl other = (LayerRefinedAttributeDefinitionImpl) obj; + if (layer != other.layer) + return false; + if (refinedAttributeDefinition == null) { + if (other.refinedAttributeDefinition != null) + return false; + } else if (!refinedAttributeDefinition.equals(other.refinedAttributeDefinition)) + return false; + return true; + } + + @Override + public String debugDump() { + return debugDump(0); + } + + @Override + public String debugDump(int indent) { + StringBuilder sb = new StringBuilder(); + DebugUtil.indentDebugDump(sb, indent); + sb.append(getDebugDumpClassName()).append("(layer=").append(layer).append(",\n"); + sb.append(refinedAttributeDefinition.debugDump(indent+1, layer)); + return sb.toString(); + } + + /** + * Return a human readable name of this class suitable for logs. + */ + protected String getDebugDumpClassName() { + return "LRRAD"; + } + + //region Delegation (automatically generated) + + @Override + public String getFrameworkAttributeName() { + return refinedAttributeDefinition.getFrameworkAttributeName(); + } + + @Override + public boolean isInherited() { + return refinedAttributeDefinition.isInherited(); + } + + @Override + public Integer getModificationPriority() { + return refinedAttributeDefinition.getModificationPriority(); + } + + @Override + public Boolean getReadReplaceMode() { + return refinedAttributeDefinition.getReadReplaceMode(); + } + + @Override + public T findItemDefinition(@NotNull ItemPath path, @NotNull Class clazz) { + return refinedAttributeDefinition.findItemDefinition(path, clazz); + } + + @Override + public boolean isDisplayNameAttribute() { + return refinedAttributeDefinition.isDisplayNameAttribute(); + } + + @Override + public ItemDefinition> deepClone(boolean ultraDeep) { + return refinedAttributeDefinition.deepClone(ultraDeep); + } + + @Override + public void revive(PrismContext prismContext) { + refinedAttributeDefinition.revive(prismContext); + } + + @Override + public Integer getDisplayOrder() { + return refinedAttributeDefinition.getDisplayOrder(); + } + + @Override + public String getHelp() { + return refinedAttributeDefinition.getHelp(); + } + + @Override + public String getDocumentation() { + return refinedAttributeDefinition.getDocumentation(); + } + + @Override + public String getDocumentationPreview() { + return refinedAttributeDefinition.getDocumentationPreview(); + } + + @Override + public boolean isRuntimeSchema() { + return refinedAttributeDefinition.isRuntimeSchema(); + } + + @Override + public PrismContext getPrismContext() { + return refinedAttributeDefinition.getPrismContext(); + } + + @Override + public SchemaRegistry getSchemaRegistry() { + return refinedAttributeDefinition.getSchemaRegistry(); + } + + @Override + public Class getTypeClassIfKnown() { + return refinedAttributeDefinition.getTypeClassIfKnown(); + } + + @Override + public Class getTypeClass() { + return refinedAttributeDefinition.getTypeClass(); + } + + @Override + public String getDescription() { + return refinedAttributeDefinition.getDescription(); + } + + @Override + public PrismReferenceValue getValueEnumerationRef() { + return refinedAttributeDefinition.getValueEnumerationRef(); + } + + @Override + public ResourceAttributeDefinition getAttributeDefinition() { + return refinedAttributeDefinition.getAttributeDefinition(); + } + + @Override + public boolean isValidFor(QName elementQName, Class clazz) { + return refinedAttributeDefinition.isValidFor(elementQName, clazz); + } + + @Override + public MappingType getOutboundMappingType() { + return refinedAttributeDefinition.getOutboundMappingType(); + } + + @Override + public boolean hasOutboundMapping() { + return refinedAttributeDefinition.hasOutboundMapping(); + } + + @Override + public boolean isValidFor(@NotNull QName elementQName, + @NotNull Class clazz, boolean caseInsensitive) { + return refinedAttributeDefinition.isValidFor(elementQName, clazz, caseInsensitive); + } + + @Override + public List getInboundMappingTypes() { + return refinedAttributeDefinition.getInboundMappingTypes(); + } + + @Override + public int getMaxOccurs(LayerType layer) { + return refinedAttributeDefinition.getMaxOccurs(layer); + } + + @Override + public int getMinOccurs(LayerType layer) { + return refinedAttributeDefinition.getMinOccurs(layer); + } + + @Override + public void adoptElementDefinitionFrom(ItemDefinition otherDef) { + refinedAttributeDefinition.adoptElementDefinitionFrom(otherDef); + } + + @Override + public boolean isOptional(LayerType layer) { + return refinedAttributeDefinition.isOptional(layer); + } + + @Override + public boolean isEmphasized() { + return refinedAttributeDefinition.isEmphasized(); + } + + @Override + public boolean isMandatory(LayerType layer) { + return refinedAttributeDefinition.isMandatory(layer); + } + + @Override + public boolean isMultiValue(LayerType layer) { + return refinedAttributeDefinition.isMultiValue(layer); + } + + @Override + public boolean isSingleValue(LayerType layer) { + return refinedAttributeDefinition.isSingleValue(layer); + } + + @Override + public boolean isExlusiveStrong() { + return refinedAttributeDefinition.isExlusiveStrong(); + } + + @Override + public PropertyLimitations getLimitations(LayerType layer) { + return refinedAttributeDefinition.getLimitations(layer); + } + + @Override + public AttributeFetchStrategyType getFetchStrategy() { + return refinedAttributeDefinition.getFetchStrategy(); + } + + @Override + public List getTolerantValuePattern() { + return refinedAttributeDefinition.getTolerantValuePattern(); + } + + @Override + public List getIntolerantValuePattern() { + return refinedAttributeDefinition.getIntolerantValuePattern(); + } + + @Override + public boolean isVolatilityTrigger() { + return refinedAttributeDefinition.isVolatilityTrigger(); + } + + @Override + public String getDisplayName() { + return refinedAttributeDefinition.getDisplayName(); + } + + + @Override + public ResourceAttribute instantiate() { + return refinedAttributeDefinition.instantiate(); + } + + @Override + public ResourceAttribute instantiate(QName name) { + return refinedAttributeDefinition.instantiate(name); + } + + @Override + public Boolean getReturnedByDefault() { + return refinedAttributeDefinition.getReturnedByDefault(); + } + + @Override + public boolean isReturnedByDefault() { + return refinedAttributeDefinition.isReturnedByDefault(); + } + + @Override + public boolean isIdentifier(ResourceAttributeContainerDefinition objectDefinition) { + return refinedAttributeDefinition.isIdentifier(objectDefinition); + } + + @Override + @NotNull + public QName getName() { + return refinedAttributeDefinition.getName(); + } + + @Override + public String getNamespace() { + return refinedAttributeDefinition.getNamespace(); + } + + @Override + public int getMinOccurs() { + return refinedAttributeDefinition.getMinOccurs(); + } + + @Override + public Collection> getAllowedValues() { + return refinedAttributeDefinition.getAllowedValues(); + } + + @Override + public int getMaxOccurs() { + return refinedAttributeDefinition.getMaxOccurs(); + } + + @Override + public boolean isIdentifier(ObjectClassComplexTypeDefinition objectDefinition) { + return refinedAttributeDefinition.isIdentifier(objectDefinition); + } + + @Override + public T defaultValue() { + return refinedAttributeDefinition.defaultValue(); + } + + @Override + public boolean isTolerant() { + return refinedAttributeDefinition.isTolerant(); + } + + @Override + public boolean isSingleValue() { + return refinedAttributeDefinition.isSingleValue(); + } + + @Override + public QName getValueType() { + return refinedAttributeDefinition.getValueType(); + } + + @Override + public boolean isSecondaryIdentifier() { + return refinedAttributeDefinition.isSecondaryIdentifier(); + } + + @Override + public boolean isMultiValue() { + return refinedAttributeDefinition.isMultiValue(); + } + + @Override + @NotNull + public QName getTypeName() { + return refinedAttributeDefinition.getTypeName(); + } + + @Override + public Boolean isIndexed() { + return refinedAttributeDefinition.isIndexed(); + } + + @Override + public boolean canAdd(LayerType layer) { + return refinedAttributeDefinition.canAdd(layer); + } + + @Override + public boolean isMandatory() { + return refinedAttributeDefinition.isMandatory(); + } + + @Override + public boolean isIgnored() { + return refinedAttributeDefinition.isIgnored(); + } + + @Override + public boolean isSecondaryIdentifier(ObjectClassComplexTypeDefinition objectDefinition) { + return refinedAttributeDefinition.isSecondaryIdentifier(objectDefinition); + } + + @Override + public QName getMatchingRuleQName() { + return refinedAttributeDefinition.getMatchingRuleQName(); + } + + @Override + public boolean isAbstract() { + return refinedAttributeDefinition.isAbstract(); + } + + @Override + public boolean isOptional() { + return refinedAttributeDefinition.isOptional(); + } + + @Override + public boolean canRead(LayerType layer) { + return refinedAttributeDefinition.canRead(layer); + } + + @Override + public boolean isDeprecated() { + return refinedAttributeDefinition.isDeprecated(); + } + + @Override + public boolean isOperational() { + return refinedAttributeDefinition.isOperational(); + } + + @Override + public PropertyDelta createEmptyDelta(ItemPath path) { + return refinedAttributeDefinition.createEmptyDelta(path); + } + + @Override + public boolean canModify(LayerType layer) { + return refinedAttributeDefinition.canModify(layer); + } + + @Override + public boolean isDynamic() { + return refinedAttributeDefinition.isDynamic(); + } + + @Override + public String getNativeAttributeName() { + return refinedAttributeDefinition.getNativeAttributeName(); + } + + //endregion + +} diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedObjectClassDefinition.java b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedObjectClassDefinition.java index afd922b9bd0..47743e2584a 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedObjectClassDefinition.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedObjectClassDefinition.java @@ -13,637 +13,45 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.evolveum.midpoint.common.refinery; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import javax.xml.namespace.QName; +package com.evolveum.midpoint.common.refinery; -import com.evolveum.midpoint.common.ResourceObjectPattern; -import com.evolveum.midpoint.prism.ItemDefinition; -import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.PrismObject; -import com.evolveum.midpoint.prism.PrismObjectDefinition; -import com.evolveum.midpoint.prism.PrismPropertyDefinition; -import com.evolveum.midpoint.prism.query.ObjectQuery; -import com.evolveum.midpoint.schema.ResourceShadowDiscriminator; +import com.evolveum.midpoint.prism.ComplexTypeDefinition; +import com.evolveum.midpoint.prism.Definition; import com.evolveum.midpoint.schema.processor.ObjectClassComplexTypeDefinition; -import com.evolveum.midpoint.schema.processor.ResourceAttributeContainer; -import com.evolveum.midpoint.schema.processor.ResourceAttributeContainerDefinition; -import com.evolveum.midpoint.schema.processor.ResourceAttributeDefinition; -import com.evolveum.midpoint.util.DebugUtil; -import com.evolveum.midpoint.util.QNameUtil; -import com.evolveum.midpoint.util.exception.SchemaException; -import com.evolveum.midpoint.xml.ns._public.common.common_3.AttributeFetchStrategyType; import com.evolveum.midpoint.xml.ns._public.common.common_3.LayerType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.MappingType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceActivationDefinitionType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceBidirectionalMappingType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceObjectAssociationType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceObjectReferenceType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowKindType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; + +import javax.xml.namespace.QName; +import java.util.Collection; +import java.util.List; /** - * @author semancik * @author mederly - * - * Work in-progress. TODO fix this mess - * */ -public class LayerRefinedObjectClassDefinition extends RefinedObjectClassDefinition { - - private RefinedObjectClassDefinition refinedObjectClassDefinition; - private LayerType layer; - /** - * Keeps layer-specific information on resource object attributes. - * This list is lazily evaluated. - */ - private List> layerRefinedAttributeDefinitions; - - private LayerRefinedObjectClassDefinition(RefinedObjectClassDefinition refinedAccountDefinition, LayerType layer) { - super(new QName("fake"), refinedAccountDefinition.getPrismContext()); - this.refinedObjectClassDefinition = refinedAccountDefinition; - this.layer = layer; - } - - static LayerRefinedObjectClassDefinition wrap(RefinedObjectClassDefinition rAccountDef, LayerType layer) { - if (rAccountDef == null) { - return null; - } - return new LayerRefinedObjectClassDefinition(rAccountDef, layer); - } - - static Collection wrapCollection(Collection rAccountDefs, LayerType layer) { - Collection outs = new ArrayList(rAccountDefs.size()); - for (RefinedObjectClassDefinition rAccountDef: rAccountDefs) { - outs.add(wrap(rAccountDef, layer)); - } - return outs; - } - - public LayerType getLayer() { - return layer; - } - - @Override - public QName getTypeName() { - return refinedObjectClassDefinition.getTypeName(); - } - - @Override - public void setTypeName(QName typeName) { - refinedObjectClassDefinition.setTypeName(typeName); - } - - @Override - public boolean isIgnored() { - return refinedObjectClassDefinition.isIgnored(); - } - - @Override - public void setIgnored(boolean ignored) { - refinedObjectClassDefinition.setIgnored(ignored); - } - - public boolean isEmphasized() { - return refinedObjectClassDefinition.isEmphasized(); - } - - public void setEmphasized(boolean emphasized) { - refinedObjectClassDefinition.setEmphasized(emphasized); - } +public interface LayerRefinedObjectClassDefinition extends RefinedObjectClassDefinition { + LayerType getLayer(); @Override - public ResourceAttributeDefinition getDescriptionAttribute() { - return substituteLayerRefinedAttributeDefinition(refinedObjectClassDefinition.getDescriptionAttribute()); - } - - @Override - public void setDescriptionAttribute(ResourceAttributeDefinition descriptionAttribute) { - refinedObjectClassDefinition.setDescriptionAttribute(descriptionAttribute); - } - - private LayerRefinedAttributeDefinition substituteLayerRefinedAttributeDefinition(ResourceAttributeDefinition attributeDef) { - LayerRefinedAttributeDefinition rAttrDef = findAttributeDefinition(attributeDef.getName()); - return rAttrDef; - } - - private Collection> substituteLayerRefinedAttributeDefinitionCollection(Collection> attributes) { - Collection> retval = new ArrayList<>(); - for (RefinedAttributeDefinition rad : attributes) { - retval.add(substituteLayerRefinedAttributeDefinition(rad)); - } - return retval; - } - - @Override - public LayerRefinedAttributeDefinition getNamingAttribute() { - return substituteLayerRefinedAttributeDefinition(refinedObjectClassDefinition.getNamingAttribute()); - } - - @Override - public String getNativeObjectClass() { - return refinedObjectClassDefinition.getNativeObjectClass(); - } - - @Override - public Integer getDisplayOrder() { - return refinedObjectClassDefinition.getDisplayOrder(); - } - - @Override - public boolean isDefaultInAKind() { - return refinedObjectClassDefinition.isDefaultInAKind(); - } - - @Override - public void setDefaultInAKind(boolean defaultAccountType) { - refinedObjectClassDefinition.setDefaultInAKind(defaultAccountType); - } - - @Override - public ShadowKindType getKind() { - return refinedObjectClassDefinition.getKind(); - } - - @Override - public void setKind(ShadowKindType kind) { - refinedObjectClassDefinition.setKind(kind); - } - - @Override - public AttributeFetchStrategyType getPasswordFetchStrategy() { - return refinedObjectClassDefinition.getPasswordFetchStrategy(); - } - - @Override - public String getIntent() { - return refinedObjectClassDefinition.getIntent(); - } - - @Override - public void setIntent(String accountTypeName) { - refinedObjectClassDefinition.setIntent(accountTypeName); - } - - @Override - public void setDisplayOrder(Integer displayOrder) { - refinedObjectClassDefinition.setDisplayOrder(displayOrder); - } - - @Override - public LayerRefinedAttributeDefinition getDisplayNameAttribute() { - return substituteLayerRefinedAttributeDefinition(refinedObjectClassDefinition.getDisplayNameAttribute()); - } - - @Override - public String getHelp() { - return refinedObjectClassDefinition.getHelp(); - } - - @Override - public void setDisplayNameAttribute(QName displayName) { - refinedObjectClassDefinition.setDisplayNameAttribute(displayName); - } - - @Override - public Collection> getPrimaryIdentifiers() { - return substituteLayerRefinedAttributeDefinitionCollection(refinedObjectClassDefinition.getPrimaryIdentifiers()); - } - - @Override - public Collection> getAllIdentifiers() { - return substituteLayerRefinedAttributeDefinitionCollection(refinedObjectClassDefinition.getAllIdentifiers()); - } - - @Override - public D findItemDefinition(QName name, Class clazz) { - D findItemDefinition = refinedObjectClassDefinition.findItemDefinition(name, clazz); - return (D) LayerRefinedAttributeDefinition.wrap((RefinedAttributeDefinition) findItemDefinition, layer); - } - - @Override - public void setHelp(String help) { - refinedObjectClassDefinition.setHelp(help); - } - - @Override - public Collection> getSecondaryIdentifiers() { - return LayerRefinedAttributeDefinition.wrapCollection(refinedObjectClassDefinition.getSecondaryIdentifiers(), layer); - } - - @Override - public Class getTypeClass() { - return refinedObjectClassDefinition.getTypeClass(); - } - - @Override - public Collection getProtectedObjectPatterns() { - return refinedObjectClassDefinition.getProtectedObjectPatterns(); - } - - @Override - public PrismContext getPrismContext() { - return refinedObjectClassDefinition.getPrismContext(); - } - - @Override - public void setNamingAttribute(ResourceAttributeDefinition namingAttribute) { - refinedObjectClassDefinition.setNamingAttribute(namingAttribute); - } - - @Override - public ResourceAttributeContainer instantiate(QName name) { - return refinedObjectClassDefinition.instantiate(name); - } - - @Override - public void setNamingAttribute(QName namingAttribute) { - refinedObjectClassDefinition.setNamingAttribute(namingAttribute); - } - - @Override - public PrismPropertyDefinition findPropertyDefinition(QName name) { - LayerRefinedAttributeDefinition def = findAttributeDefinition(name); - if (def != null) { - return def; - } else { - // actually, can there be properties other than attributes? [mederly] - return LayerRefinedAttributeDefinition.wrap((RefinedAttributeDefinition) refinedObjectClassDefinition.findPropertyDefinition(name), layer); - } - } - - @Override - public LayerRefinedAttributeDefinition findAttributeDefinition(QName elementQName) { - for (LayerRefinedAttributeDefinition definition : getAttributeDefinitions()) { - if (QNameUtil.match(definition.getName(), elementQName)) { - return definition; - } - } - return null; - } - - @Override - public void setNativeObjectClass(String nativeObjectClass) { - refinedObjectClassDefinition.setNativeObjectClass(nativeObjectClass); - } - - @Override - public LayerRefinedAttributeDefinition findAttributeDefinition(String elementLocalname) { - return findAttributeDefinition(new QName(getResourceNamespace(), elementLocalname)); // todo or should we use ns-less matching? - } - - @Override - public String getDisplayName() { - return refinedObjectClassDefinition.getDisplayName(); - } - - @Override - public void setDisplayName(String displayName) { - refinedObjectClassDefinition.setDisplayName(displayName); - } - - @Override - public List getDefinitions() { - return getAttributeDefinitions(); - } - - @Override - public String getDescription() { - return refinedObjectClassDefinition.getDescription(); - } - - @Override - public void setDescription(String description) { - refinedObjectClassDefinition.setDescription(description); - } - - @Override - public boolean isDefault() { - return refinedObjectClassDefinition.isDefault(); - } - - @Override - public void setDefault(boolean isDefault) { - refinedObjectClassDefinition.setDefault(isDefault); - } - - @Override - public ObjectClassComplexTypeDefinition getObjectClassDefinition() { - return refinedObjectClassDefinition.getObjectClassDefinition(); - } - - @Override - public void setObjectClassDefinition(ObjectClassComplexTypeDefinition objectClassDefinition) { - refinedObjectClassDefinition.setObjectClassDefinition(objectClassDefinition); - } - - @Override - public List> getAttributeDefinitions() { - if (layerRefinedAttributeDefinitions == null) { - layerRefinedAttributeDefinitions = LayerRefinedAttributeDefinition.wrapCollection(refinedObjectClassDefinition.getAttributeDefinitions(), layer); - } - return layerRefinedAttributeDefinitions; - } - - @Override - public ResourceType getResourceType() { - return refinedObjectClassDefinition.getResourceType(); - } - - @Override - public PrismObjectDefinition getObjectDefinition() { - return refinedObjectClassDefinition.getObjectDefinition(); - } - - @Override - public void setDisplayNameAttribute(ResourceAttributeDefinition displayName) { - refinedObjectClassDefinition.setDisplayNameAttribute(displayName); - } - - @Override - public LayerRefinedAttributeDefinition getAttributeDefinition(QName attributeName) { - // todo should there be any difference between findAttributeDefinition and getAttributeDefinition? [mederly] - return findAttributeDefinition(attributeName); - } - - @Override - public boolean containsAttributeDefinition(QName attributeName) { - return refinedObjectClassDefinition.containsAttributeDefinition(attributeName); - } - - @Override - public PrismPropertyDefinition createPropertyDefinition(String localName, QName typeName) { - throw new UnsupportedOperationException("property definition cannot be created in LayerRefinedObjectClassDefinition"); - // return refinedObjectClassDefinition.createPropertyDefinition(localName, typeName); - } - - @Override - public boolean isEmpty() { - return refinedObjectClassDefinition.isEmpty(); - } - - @Override - public PrismObject createBlankShadow() { - return refinedObjectClassDefinition.createBlankShadow(); - } - - @Override - public ResourceShadowDiscriminator getShadowDiscriminator() { - return refinedObjectClassDefinition.getShadowDiscriminator(); - } - - @Override - public Collection getNamesOfAttributesWithOutboundExpressions() { - return refinedObjectClassDefinition.getNamesOfAttributesWithOutboundExpressions(); - } - - @Override - public Collection getNamesOfAttributesWithInboundExpressions() { - return refinedObjectClassDefinition.getNamesOfAttributesWithInboundExpressions(); - } - - @Override - public List getPasswordInbound() { - return refinedObjectClassDefinition.getPasswordInbound(); - } - - @Override - public MappingType getPasswordOutbound() { - return refinedObjectClassDefinition.getPasswordOutbound(); - } - - @Override - public ObjectReferenceType getPasswordPolicy() { - return refinedObjectClassDefinition.getPasswordPolicy(); - } - - @Override - public Class getCompileTimeClass() { - return refinedObjectClassDefinition.getCompileTimeClass(); - } - - @Override - public QName getExtensionForType() { - return refinedObjectClassDefinition.getExtensionForType(); - } - - @Override - public boolean isContainerMarker() { - return refinedObjectClassDefinition.isContainerMarker(); - } - - @Override - public boolean isPrimaryIdentifier(QName attrName) { - return refinedObjectClassDefinition.isPrimaryIdentifier(attrName); - } - - @Override - public boolean isObjectMarker() { - return refinedObjectClassDefinition.isObjectMarker(); - } - - @Override - public boolean isXsdAnyMarker() { - return refinedObjectClassDefinition.isXsdAnyMarker(); - } - - @Override - public QName getSuperType() { - return refinedObjectClassDefinition.getSuperType(); - } - - @Override - public boolean isSecondaryIdentifier(QName attrName) { - return refinedObjectClassDefinition.isSecondaryIdentifier(attrName); - } - - @Override - public boolean isRuntimeSchema() { - return refinedObjectClassDefinition.isRuntimeSchema(); - } - - @Override - public Collection getAssociations() { - return refinedObjectClassDefinition.getAssociations(); - } - - @Override - public Collection getAssociations(ShadowKindType kind) { - return refinedObjectClassDefinition.getAssociations(kind); - } - - @Override - public ResourceAttributeContainerDefinition toResourceAttributeContainerDefinition() { - ResourceAttributeContainerDefinition resourceAttributeContainerDefinition = refinedObjectClassDefinition.toResourceAttributeContainerDefinition(); - resourceAttributeContainerDefinition.setComplexTypeDefinition(this); - return resourceAttributeContainerDefinition; - } - - @Override - public ResourceAttributeContainerDefinition toResourceAttributeContainerDefinition(QName elementName) { - ResourceAttributeContainerDefinition resourceAttributeContainerDefinition = refinedObjectClassDefinition.toResourceAttributeContainerDefinition(elementName); - resourceAttributeContainerDefinition.setComplexTypeDefinition(this); - return resourceAttributeContainerDefinition; - } - - @Override - public ResourceActivationDefinitionType getActivationSchemaHandling() { - return refinedObjectClassDefinition.getActivationSchemaHandling(); - } - - @Override - public ResourceBidirectionalMappingType getActivationBidirectionalMappingType(QName propertyName) { - return refinedObjectClassDefinition.getActivationBidirectionalMappingType(propertyName); - } - - @Override - public AttributeFetchStrategyType getActivationFetchStrategy(QName propertyName) { - return refinedObjectClassDefinition.getActivationFetchStrategy(propertyName); - } - - @Override - public Collection getEntitlementAssociations() { - return refinedObjectClassDefinition.getEntitlementAssociations(); - } - - @Override - public boolean isAbstract() { - return refinedObjectClassDefinition.isAbstract(); - } - - @Override - public boolean isDeprecated() { - return refinedObjectClassDefinition.isDeprecated(); - } - - @Override - public String getDocumentation() { - return refinedObjectClassDefinition.getDocumentation(); - } - - @Override - public String getDocumentationPreview() { - return refinedObjectClassDefinition.getDocumentationPreview(); - } - - @Override - public RefinedAssociationDefinition findAssociation(QName name) { - return refinedObjectClassDefinition.findAssociation(name); - } - - @Override - public RefinedAssociationDefinition findEntitlementAssociation(QName name) { - return refinedObjectClassDefinition.findEntitlementAssociation(name); - } - - @Override - public Collection getNamesOfAssociationsWithOutboundExpressions() { - return refinedObjectClassDefinition.getNamesOfAssociationsWithOutboundExpressions(); - } - - @Override - public String getDocClassName() { - return refinedObjectClassDefinition.getDocClassName(); - } - - @Override - public boolean matches(ShadowType shadowType) { - return refinedObjectClassDefinition.matches(shadowType); - } + LayerRefinedAttributeDefinition getNamingAttribute(); @Override - public int hashCode() { - final int prime = 31; - int result = super.hashCode(); - result = prime * result + ((layer == null) ? 0 : layer.hashCode()); - result = prime * result + ((refinedObjectClassDefinition == null) ? 0 : refinedObjectClassDefinition.hashCode()); - return result; - } + LayerRefinedAttributeDefinition getDisplayNameAttribute(); @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (!super.equals(obj)) - return false; - if (getClass() != obj.getClass()) - return false; - LayerRefinedObjectClassDefinition other = (LayerRefinedObjectClassDefinition) obj; - if (layer != other.layer) - return false; - if (refinedObjectClassDefinition == null) { - if (other.refinedObjectClassDefinition != null) - return false; - } else if (!refinedObjectClassDefinition.equals(other.refinedObjectClassDefinition)) - return false; - return true; - } - - @Override - public String debugDump() { - return debugDump(0); - } + Collection> getSecondaryIdentifiers(); @Override - public String debugDump(int indent) { - return debugDump(indent, layer); - } + LayerRefinedAttributeDefinition findAttributeDefinition(QName elementQName); - // Do NOT override&delegate debugDump(int indent, LayerType layer) here. - // We want to use code in the context of this class so things like - // getDebugDumpClassName() will be correct. - - /** - * Return a human readable name of this class suitable for logs. - */ - @Override - protected String getDebugDumpClassName() { - return "LRObjectClassDef"; - } - - @Override - public String getHumanReadableName() { - return refinedObjectClassDefinition.getHumanReadableName(); - } - - @Override - public LayerRefinedObjectClassDefinition clone() { - return wrap(refinedObjectClassDefinition.clone(), this.layer); - } + @Override + LayerRefinedAttributeDefinition findAttributeDefinition(String elementLocalname); - @Override - protected String getResourceNamespace() { - return refinedObjectClassDefinition.getResourceNamespace(); - } + @Override + List> getAttributeDefinitions(); - @Override - public void add(RefinedAttributeDefinition refinedAttributeDefinition) { - throw new UnsupportedOperationException(); - } + @Override + LayerRefinedAttributeDefinition getAttributeDefinition(QName attributeName); - @Override - public void parseAssociations(RefinedResourceSchema rSchema) { - throw new UnsupportedOperationException(); - } - - @Override - public ResourceObjectReferenceType getBaseContext() { - return refinedObjectClassDefinition.getBaseContext(); - } - - @Override - public Collection getAuxiliaryObjectClassDefinitions() { - return refinedObjectClassDefinition.getAuxiliaryObjectClassDefinitions(); - } - - @Override - public ObjectQuery createShadowSearchQuery(String resourceOid) throws SchemaException { - return refinedObjectClassDefinition.createShadowSearchQuery(resourceOid); - } + @Override + LayerRefinedObjectClassDefinition clone(); } diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedObjectClassDefinitionImpl.java b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedObjectClassDefinitionImpl.java new file mode 100644 index 00000000000..00b149a8403 --- /dev/null +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedObjectClassDefinitionImpl.java @@ -0,0 +1,665 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.common.refinery; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import javax.xml.namespace.QName; + +import com.evolveum.midpoint.common.ResourceObjectPattern; +import com.evolveum.midpoint.prism.*; +import com.evolveum.midpoint.prism.path.ItemPath; +import com.evolveum.midpoint.prism.query.ObjectQuery; +import com.evolveum.midpoint.prism.schema.SchemaRegistry; +import com.evolveum.midpoint.schema.ResourceShadowDiscriminator; +import com.evolveum.midpoint.schema.processor.*; +import com.evolveum.midpoint.util.DebugUtil; +import com.evolveum.midpoint.util.QNameUtil; +import com.evolveum.midpoint.util.exception.SchemaException; +import com.evolveum.midpoint.xml.ns._public.common.common_3.*; +import com.evolveum.midpoint.xml.ns._public.resource.capabilities_3.CapabilityType; +import com.evolveum.midpoint.xml.ns._public.resource.capabilities_3.PagedSearchCapabilityType; +import com.evolveum.prism.xml.ns._public.types_3.ItemPathType; +import org.jetbrains.annotations.NotNull; + +/** + * @author semancik + * @author mederly + * + * Work in-progress. + * + */ +public class LayerRefinedObjectClassDefinitionImpl implements LayerRefinedObjectClassDefinition { + + private RefinedObjectClassDefinition refinedObjectClassDefinition; + private LayerType layer; + /** + * Keeps layer-specific information on resource object attributes. + * This list is lazily evaluated. + */ + private List> layerRefinedAttributeDefinitions; + + private LayerRefinedObjectClassDefinitionImpl(RefinedObjectClassDefinition refinedAccountDefinition, LayerType layer) { + this.refinedObjectClassDefinition = refinedAccountDefinition; + this.layer = layer; + } + + static LayerRefinedObjectClassDefinition wrap(RefinedObjectClassDefinition rAccountDef, LayerType layer) { + if (rAccountDef == null) { + return null; + } + return new LayerRefinedObjectClassDefinitionImpl(rAccountDef, layer); + } + + static List wrapCollection(Collection rAccountDefs, LayerType layer) { + List outs = new ArrayList(rAccountDefs.size()); + for (RefinedObjectClassDefinition rAccountDef: rAccountDefs) { + outs.add(wrap(rAccountDef, layer)); + } + return outs; + } + + @Override + public LayerType getLayer() { + return layer; + } + + @NotNull + @Override + public QName getTypeName() { + return refinedObjectClassDefinition.getTypeName(); + } + + @Override + public boolean isIgnored() { + return refinedObjectClassDefinition.isIgnored(); + } + + public boolean isEmphasized() { + return refinedObjectClassDefinition.isEmphasized(); + } + + @Override + public ResourceAttributeDefinition getDescriptionAttribute() { + return substituteLayerRefinedAttributeDefinition(refinedObjectClassDefinition.getDescriptionAttribute()); + } + + @Override + @NotNull + public List getIgnoredNamespaces() { + return refinedObjectClassDefinition.getIgnoredNamespaces(); + } + + private LayerRefinedAttributeDefinition substituteLayerRefinedAttributeDefinition(ResourceAttributeDefinition attributeDef) { + LayerRefinedAttributeDefinition rAttrDef = findAttributeDefinition(attributeDef.getName()); + return rAttrDef; + } + + private Collection> substituteLayerRefinedAttributeDefinitionCollection(Collection> attributes) { + Collection> retval = new ArrayList<>(); + for (RefinedAttributeDefinition rad : attributes) { + retval.add(substituteLayerRefinedAttributeDefinition(rad)); + } + return retval; + } + + @Override + public LayerRefinedAttributeDefinition getNamingAttribute() { + return substituteLayerRefinedAttributeDefinition(refinedObjectClassDefinition.getNamingAttribute()); + } + + @Override + public String getNativeObjectClass() { + return refinedObjectClassDefinition.getNativeObjectClass(); + } + + @Override + public ID findItemDefinition(@NotNull QName name) { + return refinedObjectClassDefinition.findItemDefinition(name); + } + + @Override + public boolean isAuxiliary() { + return refinedObjectClassDefinition.isAuxiliary(); + } + + @Override + public Integer getDisplayOrder() { + return refinedObjectClassDefinition.getDisplayOrder(); + } + + @Override + public ID findItemDefinition(@NotNull ItemPath path, + @NotNull Class clazz) { + return refinedObjectClassDefinition.findItemDefinition(path, clazz); + } + + @Override + public boolean isDefaultInAKind() { + return refinedObjectClassDefinition.isDefaultInAKind(); + } + + @Override + public ShadowKindType getKind() { + return refinedObjectClassDefinition.getKind(); + } + + @Override + public AttributeFetchStrategyType getPasswordFetchStrategy() { + return refinedObjectClassDefinition.getPasswordFetchStrategy(); + } + + @Override + public String getIntent() { + return refinedObjectClassDefinition.getIntent(); + } + + @Override + public LayerRefinedObjectClassDefinition forLayer(LayerType layerType) { + return refinedObjectClassDefinition.forLayer(layerType); + } + + @Override + public PrismContainerDefinition findContainerDefinition( + @NotNull QName name) { + return refinedObjectClassDefinition.findContainerDefinition(name); + } + + @Override + public LayerRefinedAttributeDefinition getDisplayNameAttribute() { + return substituteLayerRefinedAttributeDefinition(refinedObjectClassDefinition.getDisplayNameAttribute()); + } + + @Override + public ComplexTypeDefinition deepClone() { + return refinedObjectClassDefinition.deepClone(); + } + + @Override + public String getHelp() { + return refinedObjectClassDefinition.getHelp(); + } + + @Override + public Collection> getPrimaryIdentifiers() { + return substituteLayerRefinedAttributeDefinitionCollection(refinedObjectClassDefinition.getPrimaryIdentifiers()); + } + + @Override + public Collection> getAllIdentifiers() { + return substituteLayerRefinedAttributeDefinitionCollection(refinedObjectClassDefinition.getAllIdentifiers()); + } + + @Override + public D findItemDefinition(QName name, Class clazz) { + D findItemDefinition = refinedObjectClassDefinition.findItemDefinition(name, clazz); + return (D) LayerRefinedAttributeDefinitionImpl.wrap((RefinedAttributeDefinition) findItemDefinition, layer); + } + + @Override + public Collection> getSecondaryIdentifiers() { + return LayerRefinedAttributeDefinitionImpl.wrapCollection(refinedObjectClassDefinition.getSecondaryIdentifiers(), layer); + } + + @Override + public Class getTypeClass() { + return refinedObjectClassDefinition.getTypeClass(); + } + + @Override + public Collection getProtectedObjectPatterns() { + return refinedObjectClassDefinition.getProtectedObjectPatterns(); + } + + @Override + public void merge(ComplexTypeDefinition otherComplexTypeDef) { + refinedObjectClassDefinition.merge(otherComplexTypeDef); + } + + @Override + public PrismContext getPrismContext() { + return refinedObjectClassDefinition.getPrismContext(); + } + + @Override + public SchemaRegistry getSchemaRegistry() { + return refinedObjectClassDefinition.getSchemaRegistry(); + } + + @Override + public ResourceAttributeContainer instantiate(QName name) { + return refinedObjectClassDefinition.instantiate(name); + } + + @Override + public PrismPropertyDefinition findPropertyDefinition(QName name) { + LayerRefinedAttributeDefinition def = findAttributeDefinition(name); + if (def != null) { + return def; + } else { + // actually, can there be properties other than attributes? [mederly] + return LayerRefinedAttributeDefinitionImpl.wrap((RefinedAttributeDefinition) refinedObjectClassDefinition.findPropertyDefinition(name), layer); + } + } + + @Override + public LayerRefinedAttributeDefinition findAttributeDefinition(QName elementQName) { + for (LayerRefinedAttributeDefinition definition : getAttributeDefinitions()) { + if (QNameUtil.match(definition.getName(), elementQName)) { + return definition; + } + } + return null; + } + + @Override + public LayerRefinedAttributeDefinition findAttributeDefinition(String elementLocalname) { + return findAttributeDefinition(new QName(getResourceNamespace(), elementLocalname)); // todo or should we use ns-less matching? + } + + @Override + public String getDisplayName() { + return refinedObjectClassDefinition.getDisplayName(); + } + + @Override + public List getDefinitions() { + return getAttributeDefinitions(); + } + + @Override + public String getDescription() { + return refinedObjectClassDefinition.getDescription(); + } + + @Override + public boolean isDefault() { + return refinedObjectClassDefinition.isDefault(); + } + + @Override + public ObjectClassComplexTypeDefinition getObjectClassDefinition() { + return refinedObjectClassDefinition.getObjectClassDefinition(); + } + + @Override + public List> getAttributeDefinitions() { + if (layerRefinedAttributeDefinitions == null) { + layerRefinedAttributeDefinitions = LayerRefinedAttributeDefinitionImpl.wrapCollection(refinedObjectClassDefinition.getAttributeDefinitions(), layer); + } + return layerRefinedAttributeDefinitions; + } + + @Override + public boolean containsAttributeDefinition(ItemPathType pathType) { + return refinedObjectClassDefinition.containsAttributeDefinition(pathType); + } + + @Override + public ResourceType getResourceType() { + return refinedObjectClassDefinition.getResourceType(); + } + + @Override + public PrismObjectDefinition getObjectDefinition() { + return refinedObjectClassDefinition.getObjectDefinition(); + } + + @Override + public LayerRefinedAttributeDefinition getAttributeDefinition(QName attributeName) { + // todo should there be any difference between findAttributeDefinition and getAttributeDefinition? [mederly] + return findAttributeDefinition(attributeName); + } + + @Override + public boolean containsAttributeDefinition(QName attributeName) { + return refinedObjectClassDefinition.containsAttributeDefinition(attributeName); + } + + @Override + public boolean isEmpty() { + return refinedObjectClassDefinition.isEmpty(); + } + + @Override + public PrismObject createBlankShadow() { + return refinedObjectClassDefinition.createBlankShadow(); + } + + @Override + public ResourceShadowDiscriminator getShadowDiscriminator() { + return refinedObjectClassDefinition.getShadowDiscriminator(); + } + + @Override + public Collection getNamesOfAttributesWithOutboundExpressions() { + return refinedObjectClassDefinition.getNamesOfAttributesWithOutboundExpressions(); + } + + @Override + public Collection getNamesOfAttributesWithInboundExpressions() { + return refinedObjectClassDefinition.getNamesOfAttributesWithInboundExpressions(); + } + + @Override + public List getPasswordInbound() { + return refinedObjectClassDefinition.getPasswordInbound(); + } + + @Override + public MappingType getPasswordOutbound() { + return refinedObjectClassDefinition.getPasswordOutbound(); + } + + @Override + public ObjectReferenceType getPasswordPolicy() { + return refinedObjectClassDefinition.getPasswordPolicy(); + } + + @Override + public ResourcePasswordDefinitionType getPasswordDefinition() { + return refinedObjectClassDefinition.getPasswordDefinition(); + } + + @Override + public Class getCompileTimeClass() { + return refinedObjectClassDefinition.getCompileTimeClass(); + } + + @Override + public QName getExtensionForType() { + return refinedObjectClassDefinition.getExtensionForType(); + } + + @Override + public boolean isContainerMarker() { + return refinedObjectClassDefinition.isContainerMarker(); + } + + @Override + public boolean isPrimaryIdentifier(QName attrName) { + return refinedObjectClassDefinition.isPrimaryIdentifier(attrName); + } + + @Override + public boolean isInherited() { + return refinedObjectClassDefinition.isInherited(); + } + + @Override + public boolean isObjectMarker() { + return refinedObjectClassDefinition.isObjectMarker(); + } + + @Override + public boolean isXsdAnyMarker() { + return refinedObjectClassDefinition.isXsdAnyMarker(); + } + + @Override + public QName getSuperType() { + return refinedObjectClassDefinition.getSuperType(); + } + + @Override + public boolean isSecondaryIdentifier(QName attrName) { + return refinedObjectClassDefinition.isSecondaryIdentifier(attrName); + } + + @Override + public boolean isRuntimeSchema() { + return refinedObjectClassDefinition.isRuntimeSchema(); + } + + @Override + public Collection getAssociations() { + return refinedObjectClassDefinition.getAssociations(); + } + + @Override + public Collection getAssociations(ShadowKindType kind) { + return refinedObjectClassDefinition.getAssociations(kind); + } + + @Override + public ResourceAttributeDefinition findAttributeDefinition(QName name, boolean caseInsensitive) { + return refinedObjectClassDefinition.findAttributeDefinition(name, caseInsensitive); + } + + @Override + public ResourceAttributeContainerDefinition toResourceAttributeContainerDefinition() { + ResourceAttributeContainerDefinition resourceAttributeContainerDefinition = refinedObjectClassDefinition.toResourceAttributeContainerDefinition(); + ((ResourceAttributeContainerDefinitionImpl) resourceAttributeContainerDefinition).setComplexTypeDefinition(this); + return resourceAttributeContainerDefinition; + } + + @Override + public ID findItemDefinition(@NotNull ItemPath path) { + return refinedObjectClassDefinition.findItemDefinition(path); + } + + @Override + public Collection getNamesOfAssociations() { + return refinedObjectClassDefinition.getNamesOfAssociations(); + } + + @Override + public PrismPropertyDefinition findPropertyDefinition(@NotNull ItemPath path) { + return refinedObjectClassDefinition.findPropertyDefinition(path); + } + + @Override + public ResourceAttributeContainerDefinition toResourceAttributeContainerDefinition(QName elementName) { + ResourceAttributeContainerDefinition resourceAttributeContainerDefinition = refinedObjectClassDefinition.toResourceAttributeContainerDefinition(elementName); + ((ResourceAttributeContainerDefinitionImpl) resourceAttributeContainerDefinition).setComplexTypeDefinition(this); + return resourceAttributeContainerDefinition; + } + + @Override + public ResourceActivationDefinitionType getActivationSchemaHandling() { + return refinedObjectClassDefinition.getActivationSchemaHandling(); + } + + @Override + public ResourceBidirectionalMappingType getActivationBidirectionalMappingType(QName propertyName) { + return refinedObjectClassDefinition.getActivationBidirectionalMappingType(propertyName); + } + + @Override + public AttributeFetchStrategyType getActivationFetchStrategy(QName propertyName) { + return refinedObjectClassDefinition.getActivationFetchStrategy(propertyName); + } + + @Override + public T getEffectiveCapability( + Class capabilityClass) { + return refinedObjectClassDefinition.getEffectiveCapability(capabilityClass); + } + + @Override + public PagedSearchCapabilityType getPagedSearches() { + return refinedObjectClassDefinition.getPagedSearches(); + } + + @Override + public boolean isPagedSearchEnabled() { + return refinedObjectClassDefinition.isPagedSearchEnabled(); + } + + @Override + public boolean isObjectCountingEnabled() { + return refinedObjectClassDefinition.isObjectCountingEnabled(); + } + + @Override + public Collection getEntitlementAssociations() { + return refinedObjectClassDefinition.getEntitlementAssociations(); + } + + @Override + public boolean isAbstract() { + return refinedObjectClassDefinition.isAbstract(); + } + + @Override + public boolean isDeprecated() { + return refinedObjectClassDefinition.isDeprecated(); + } + + @Override + public String getDocumentation() { + return refinedObjectClassDefinition.getDocumentation(); + } + + @Override + public String getDocumentationPreview() { + return refinedObjectClassDefinition.getDocumentationPreview(); + } + + @Override + public RefinedAssociationDefinition findAssociation(QName name) { + return refinedObjectClassDefinition.findAssociation(name); + } + + @Override + public ID findItemDefinition(@NotNull QName name, @NotNull Class clazz, + boolean caseInsensitive) { + return refinedObjectClassDefinition.findItemDefinition(name, clazz, caseInsensitive); + } + + @Override + public RefinedAssociationDefinition findEntitlementAssociation(QName name) { + return refinedObjectClassDefinition.findEntitlementAssociation(name); + } + + @Override + public Collection getNamesOfAssociationsWithOutboundExpressions() { + return refinedObjectClassDefinition.getNamesOfAssociationsWithOutboundExpressions(); + } + + @Override + public boolean matches(ShadowType shadowType) { + return refinedObjectClassDefinition.matches(shadowType); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = super.hashCode(); + result = prime * result + ((layer == null) ? 0 : layer.hashCode()); + result = prime * result + ((refinedObjectClassDefinition == null) ? 0 : refinedObjectClassDefinition.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (!super.equals(obj)) + return false; + if (getClass() != obj.getClass()) + return false; + LayerRefinedObjectClassDefinitionImpl other = (LayerRefinedObjectClassDefinitionImpl) obj; + if (layer != other.layer) + return false; + if (refinedObjectClassDefinition == null) { + if (other.refinedObjectClassDefinition != null) + return false; + } else if (!refinedObjectClassDefinition.equals(other.refinedObjectClassDefinition)) + return false; + return true; + } + + @Override + public String debugDump() { + return debugDump(0); + } + + @Override + public String getDefaultNamespace() { + return refinedObjectClassDefinition.getDefaultNamespace(); + } + + @Override + public String debugDump(int indent) { + // TODO fix this hack + return ((RefinedObjectClassDefinitionImpl) refinedObjectClassDefinition).debugDump(indent, layer, getDebugDumpClassName()); + } + + // Do NOT override&delegate debugDump(int indent, LayerType layer) here. + // We want to use code in the context of this class so things like + // getDebugDumpClassName() will be correct. + + /** + * Return a human readable name of this class suitable for logs. + */ + protected String getDebugDumpClassName() { + return "LRObjectClassDef"; + } + + @Override + public String getHumanReadableName() { + return refinedObjectClassDefinition.getHumanReadableName(); + } + + @Override + public LayerRefinedObjectClassDefinition clone() { + return wrap(refinedObjectClassDefinition.clone(), this.layer); + } + + @Override + public String getResourceNamespace() { + return refinedObjectClassDefinition.getResourceNamespace(); + } + + @Override + public ResourceObjectReferenceType getBaseContext() { + return refinedObjectClassDefinition.getBaseContext(); + } + + @Override + public Class getTypeClassIfKnown() { + return refinedObjectClassDefinition.getTypeClassIfKnown(); + } + + @Override + public Collection getAuxiliaryObjectClassDefinitions() { + return refinedObjectClassDefinition.getAuxiliaryObjectClassDefinitions(); + } + + @Override + public boolean hasAuxiliaryObjectClass(QName expectedObjectClassName) { + return refinedObjectClassDefinition.hasAuxiliaryObjectClass(expectedObjectClassName); + } + + @Override + public ObjectQuery createShadowSearchQuery(String resourceOid) throws SchemaException { + return refinedObjectClassDefinition.createShadowSearchQuery(resourceOid); + } + + @Override + public PrismContainerDefinition findContainerDefinition( + @NotNull ItemPath path) { + return refinedObjectClassDefinition.findContainerDefinition(path); + } + + @Override + public void revive(PrismContext prismContext) { + refinedObjectClassDefinition.revive(prismContext); + } +} diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedResourceSchema.java b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedResourceSchema.java index e7b2cbad241..5f8f375a3f6 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedResourceSchema.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedResourceSchema.java @@ -13,300 +13,26 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.evolveum.midpoint.common.refinery; - -import java.util.Collection; -import java.util.List; - -import javax.xml.namespace.QName; -import org.w3c.dom.Document; +package com.evolveum.midpoint.common.refinery; -import com.evolveum.midpoint.prism.ComplexTypeDefinition; -import com.evolveum.midpoint.prism.Containerable; -import com.evolveum.midpoint.prism.Definition; -import com.evolveum.midpoint.prism.ItemDefinition; -import com.evolveum.midpoint.prism.Objectable; -import com.evolveum.midpoint.prism.PrismContainerDefinition; -import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.PrismObject; -import com.evolveum.midpoint.prism.PrismObjectDefinition; -import com.evolveum.midpoint.prism.PrismPropertyDefinition; -import com.evolveum.midpoint.prism.PrismReferenceDefinition; -import com.evolveum.midpoint.schema.processor.ObjectClassComplexTypeDefinition; -import com.evolveum.midpoint.schema.processor.ResourceSchema; -import com.evolveum.midpoint.util.DebugUtil; -import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.xml.ns._public.common.common_3.LayerType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowKindType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; +import javax.xml.namespace.QName; + /** - * @author semancik - * - * This class enhances RefinedResourceSchema with a layer-specific view. - * - * TODO: However, there are a few unresolved issues that should be dealt with: - * - * 1) Although it might seem to contain LayerRefinedObjectClassDefinitions (LROCDs), it is not the case: - * it generates them on the fly by calling LROCD.wrap method every time. - * - * 2) When accessing attributes via findItemDefinition of this object, a non-layered version - * of attribute container is returned. - * + * @author mederly */ -public class LayerRefinedResourceSchema extends RefinedResourceSchema { - - private RefinedResourceSchema refinedResourceSchema; - private LayerType layer; - - private LayerRefinedResourceSchema(RefinedResourceSchema refinedResourceSchema, LayerType layer) { - super(refinedResourceSchema.getPrismContext()); - this.refinedResourceSchema = refinedResourceSchema; - this.layer = layer; - } - - public LayerType getLayer() { - return layer; - } - - static LayerRefinedResourceSchema wrap(RefinedResourceSchema rSchema, LayerType layer) { - return new LayerRefinedResourceSchema(rSchema, layer); - } - - public String getNamespace() { - return refinedResourceSchema.getNamespace(); - } - - public Collection getRefinedDefinitions(ShadowKindType kind) { - return LayerRefinedObjectClassDefinition.wrapCollection(refinedResourceSchema.getRefinedDefinitions(kind), layer); - } - - public Collection getDefinitions() { - return refinedResourceSchema.getDefinitions(); - } - - public ResourceSchema getOriginalResourceSchema() { - return refinedResourceSchema.getOriginalResourceSchema(); - } - - public Collection getDefinitions(Class type) { - return refinedResourceSchema.getDefinitions(type); - } - - public LayerRefinedObjectClassDefinition getRefinedDefinition(ShadowKindType kind, ShadowType shadow) { - return LayerRefinedObjectClassDefinition.wrap(refinedResourceSchema.getRefinedDefinition(kind, shadow),layer); - } - - public LayerRefinedObjectClassDefinition getRefinedDefinition(ShadowKindType kind, String intent) { - return LayerRefinedObjectClassDefinition.wrap(refinedResourceSchema.getRefinedDefinition(kind, intent),layer); - } - - public LayerRefinedObjectClassDefinition getRefinedDefinition(QName typeName) { - return LayerRefinedObjectClassDefinition.wrap(refinedResourceSchema.getRefinedDefinition(typeName),layer); - } - - public void add(Definition def) { - refinedResourceSchema.add(def); - } - - public PrismContext getPrismContext() { - return refinedResourceSchema.getPrismContext(); - } - - public LayerRefinedObjectClassDefinition getDefaultRefinedDefinition(ShadowKindType kind) { - return LayerRefinedObjectClassDefinition.wrap(refinedResourceSchema.getDefaultRefinedDefinition(kind),layer); - } - - public PrismObjectDefinition getObjectDefinition(ShadowKindType kind, String intent) { - return refinedResourceSchema.getObjectDefinition(kind, intent); - } - - public PrismObjectDefinition getObjectDefinition(ShadowKindType kind, ShadowType shadow) { - return refinedResourceSchema.getObjectDefinition(kind, shadow); - } - - public PrismContainerDefinition findContainerDefinitionByType(QName typeName) { - return refinedResourceSchema.findContainerDefinitionByType(typeName); - } - - public PrismObjectDefinition findObjectDefinitionByType(QName typeName) { - return refinedResourceSchema.findObjectDefinitionByType(typeName); - } - - public PrismObjectDefinition findObjectDefinitionByElementName(QName elementName) { - return refinedResourceSchema.findObjectDefinitionByElementName(elementName); - } - - public PrismObjectDefinition findObjectDefinitionByType(QName typeName, Class type) { - return refinedResourceSchema.findObjectDefinitionByType(typeName, type); - } - - public PrismObjectDefinition findObjectDefinitionByCompileTimeClass(Class type) { - return refinedResourceSchema.findObjectDefinitionByCompileTimeClass(type); - } - - public PrismPropertyDefinition findPropertyDefinitionByElementName(QName elementName) { - return refinedResourceSchema.findPropertyDefinitionByElementName(elementName); - } - - public T findItemDefinition(QName definitionName, Class definitionType) { - return refinedResourceSchema.findItemDefinition(definitionName, definitionType); - } - - public T findItemDefinition(String localName, Class definitionType) { - return refinedResourceSchema.findItemDefinition(localName, definitionType); - } - - public T findItemDefinitionByType(QName typeName, Class definitionType) { - return refinedResourceSchema.findItemDefinitionByType(typeName, definitionType); - } - - public PrismContainerDefinition createPropertyContainerDefinition(String localTypeName) { - return refinedResourceSchema.createPropertyContainerDefinition(localTypeName); - } - - public PrismContainerDefinition createPropertyContainerDefinition(String localElementName, String localTypeName) { - return refinedResourceSchema.createPropertyContainerDefinition(localElementName, localTypeName); - } - - public ComplexTypeDefinition createComplexTypeDefinition(QName typeName) { - return refinedResourceSchema.createComplexTypeDefinition(typeName); - } - - public PrismPropertyDefinition createPropertyDefinition(String localName, QName typeName) { - return refinedResourceSchema.createPropertyDefinition(localName, typeName); - } - - public PrismPropertyDefinition createPropertyDefinition(String localName, String localTypeName) { - return refinedResourceSchema.createPropertyDefinition(localName, localTypeName); - } - - public PrismPropertyDefinition createPropertyDefinition(QName name, QName typeName) { - return refinedResourceSchema.createPropertyDefinition(name, typeName); - } - - public LayerRefinedObjectClassDefinition findRefinedDefinitionByObjectClassQName(ShadowKindType kind, QName objectClass) { - return LayerRefinedObjectClassDefinition.wrap(refinedResourceSchema.findRefinedDefinitionByObjectClassQName(kind, objectClass),layer); - } - - public PrismContainerDefinition findContainerDefinitionByElementName(QName elementName) { - return refinedResourceSchema.findContainerDefinitionByElementName(elementName); - } - - public ComplexTypeDefinition findComplexTypeDefinition(QName typeName) { - return refinedResourceSchema.findComplexTypeDefinition(typeName); - } - - public void setNamespace(String namespace) { - refinedResourceSchema.setNamespace(namespace); - } - - public Document serializeToXsd() throws SchemaException { - return refinedResourceSchema.serializeToXsd(); - } - - public boolean isEmpty() { - return refinedResourceSchema.isEmpty(); - } - - public Collection getObjectClassDefinitions() { - return refinedResourceSchema.getObjectClassDefinitions(); - } - - public ObjectClassComplexTypeDefinition createObjectClassDefinition(String localTypeName) { - return refinedResourceSchema.createObjectClassDefinition(localTypeName); - } - - public ObjectClassComplexTypeDefinition createObjectClassDefinition(QName typeName) { - return refinedResourceSchema.createObjectClassDefinition(typeName); - } - - public List getRefinedDefinitions() { - return refinedResourceSchema.getRefinedDefinitions(); - } - - public ObjectClassComplexTypeDefinition findObjectClassDefinition(ShadowType shadow) { - return refinedResourceSchema.findObjectClassDefinition(shadow); - } - - public ObjectClassComplexTypeDefinition findObjectClassDefinition(String localName) { - return refinedResourceSchema.findObjectClassDefinition(localName); - } - - public Collection getObjectDefinitions() { - return refinedResourceSchema.getObjectDefinitions(); - } - - public Collection getComplexTypeDefinitions() { - return refinedResourceSchema.getComplexTypeDefinitions(); - } - - public ObjectClassComplexTypeDefinition findObjectClassDefinition(ShadowKindType kind, String intent) { - return refinedResourceSchema.findObjectClassDefinition(kind, intent); - } - - public ObjectClassComplexTypeDefinition findDefaultObjectClassDefinition(ShadowKindType kind) { - return refinedResourceSchema.findDefaultObjectClassDefinition(kind); - } - - public ObjectClassComplexTypeDefinition findObjectClassDefinition(QName objectClassQName) { - return refinedResourceSchema.findObjectClassDefinition(objectClassQName); - } - - public PrismObjectDefinition findObjectDefinitionByTypeAssumeNs(QName typeName) { - return refinedResourceSchema.findObjectDefinitionByTypeAssumeNs(typeName); - } - - public PrismContainerDefinition findContainerDefinitionByCompileTimeClass( - Class type) { - return refinedResourceSchema.findContainerDefinitionByCompileTimeClass(type); - } +public interface LayerRefinedResourceSchema extends RefinedResourceSchema { + LayerType getLayer(); - public PrismReferenceDefinition findReferenceDefinitionByElementName(QName elementName) { - return refinedResourceSchema.findReferenceDefinitionByElementName(elementName); - } + LayerRefinedObjectClassDefinition getRefinedDefinition(ShadowKindType kind, ShadowType shadow); - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((layer == null) ? 0 : layer.hashCode()); - result = prime * result + ((refinedResourceSchema == null) ? 0 : refinedResourceSchema.hashCode()); - return result; - } + LayerRefinedObjectClassDefinition getRefinedDefinition(ShadowKindType kind, String intent); - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - LayerRefinedResourceSchema other = (LayerRefinedResourceSchema) obj; - if (layer != other.layer) - return false; - if (refinedResourceSchema == null) { - if (other.refinedResourceSchema != null) - return false; - } else if (!refinedResourceSchema.equals(other.refinedResourceSchema)) - return false; - return true; - } - - @Override - public String debugDump() { - return debugDump(0); - } + LayerRefinedObjectClassDefinition getRefinedDefinition(QName typeName); - @Override - public String debugDump(int indent) { - StringBuilder sb = new StringBuilder(); - DebugUtil.indentDebugDump(sb, indent); - sb.append("LRSchema(layer=").append(layer).append(",\n"); - sb.append(refinedResourceSchema.debugDump(indent+1)); - return sb.toString(); - } - + LayerRefinedObjectClassDefinition getDefaultRefinedDefinition(ShadowKindType kind); } diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedResourceSchemaImpl.java b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedResourceSchemaImpl.java new file mode 100644 index 00000000000..f6a431e9bfb --- /dev/null +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedResourceSchemaImpl.java @@ -0,0 +1,270 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.common.refinery; + +import com.evolveum.midpoint.prism.*; +import com.evolveum.midpoint.schema.ResourceShadowDiscriminator; +import com.evolveum.midpoint.schema.processor.ObjectClassComplexTypeDefinition; +import com.evolveum.midpoint.schema.processor.ResourceSchema; +import com.evolveum.midpoint.util.DebugUtil; +import com.evolveum.midpoint.util.exception.SchemaException; +import com.evolveum.midpoint.xml.ns._public.common.common_3.LayerType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowKindType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.w3c.dom.Document; + +import javax.xml.namespace.QName; +import java.util.Collection; +import java.util.List; + +/** + * @author semancik + * + * This class enhances RefinedResourceSchema with a layer-specific view. + * + * TODO: However, there are a few unresolved issues that should be dealt with: + * + * 1) Although it might seem to contain LayerRefinedObjectClassDefinitions (LROCDs), it is not the case: + * it generates them on the fly by calling LROCD.wrap method every time. + * + * 2) When accessing attributes via findItemDefinition of this object, a non-layered version + * of attribute container is returned. + * + */ +public class LayerRefinedResourceSchemaImpl implements LayerRefinedResourceSchema { + + private final RefinedResourceSchema refinedResourceSchema; + private final LayerType layer; + + LayerRefinedResourceSchemaImpl(RefinedResourceSchema refinedResourceSchema, LayerType layer) { + this.refinedResourceSchema = refinedResourceSchema; + this.layer = layer; + } + + @Override + public LayerType getLayer() { + return layer; + } + + public List getRefinedDefinitions(ShadowKindType kind) { + return LayerRefinedObjectClassDefinitionImpl + .wrapCollection(refinedResourceSchema.getRefinedDefinitions(kind), layer); + } + + @Override + public ResourceSchema getOriginalResourceSchema() { + return refinedResourceSchema.getOriginalResourceSchema(); + } + + @Override + public LayerRefinedObjectClassDefinition getRefinedDefinition(ShadowKindType kind, ShadowType shadow) { + return LayerRefinedObjectClassDefinitionImpl + .wrap(refinedResourceSchema.getRefinedDefinition(kind, shadow), layer); + } + + @Override + public String getNamespace() { + return refinedResourceSchema.getNamespace(); + } + + @Override + public LayerRefinedObjectClassDefinition getRefinedDefinition(ShadowKindType kind, String intent) { + return LayerRefinedObjectClassDefinitionImpl + .wrap(refinedResourceSchema.getRefinedDefinition(kind, intent), layer); + } + + @Override + @NotNull + public Collection getDefinitions() { + return refinedResourceSchema.getDefinitions(); + } + + @Override + public CompositeRefinedObjectClassDefinition determineCompositeObjectClassDefinition( + ResourceShadowDiscriminator discriminator) { + return refinedResourceSchema.determineCompositeObjectClassDefinition(discriminator); + } + + @Override + public CompositeRefinedObjectClassDefinition determineCompositeObjectClassDefinition( + PrismObject shadow) throws SchemaException { + return refinedResourceSchema.determineCompositeObjectClassDefinition(shadow); + } + + @Override + @NotNull + public List getDefinitions(@NotNull Class type) { + return refinedResourceSchema.getDefinitions(type); + } + + @Override + public CompositeRefinedObjectClassDefinition determineCompositeObjectClassDefinition( + PrismObject shadow, Collection additionalAuxiliaryObjectClassQNames) throws SchemaException { + return refinedResourceSchema.determineCompositeObjectClassDefinition(shadow, additionalAuxiliaryObjectClassQNames); + } + + + @Override + public CompositeRefinedObjectClassDefinition determineCompositeObjectClassDefinition( + QName structuralObjectClassQName, ShadowKindType kind, String intent) { + return refinedResourceSchema.determineCompositeObjectClassDefinition(structuralObjectClassQName, kind, intent); + } + + @Override + public PrismContext getPrismContext() { + return refinedResourceSchema.getPrismContext(); + } + + @Override + @NotNull + public Document serializeToXsd() throws SchemaException { + return refinedResourceSchema.serializeToXsd(); + } + + @Override + public boolean isEmpty() { + return refinedResourceSchema.isEmpty(); + } + + @Override + public RefinedObjectClassDefinition getRefinedDefinition(ShadowKindType kind, Collection intents) + throws SchemaException { + return refinedResourceSchema.getRefinedDefinition(kind, intents); + } + + @Override + public LayerRefinedObjectClassDefinition getRefinedDefinition(QName typeName) { + return LayerRefinedObjectClassDefinitionImpl + .wrap(refinedResourceSchema.getRefinedDefinition(typeName), layer); + } + + @Override + public LayerRefinedObjectClassDefinition getDefaultRefinedDefinition(ShadowKindType kind) { + return LayerRefinedObjectClassDefinitionImpl + .wrap(refinedResourceSchema.getDefaultRefinedDefinition(kind), layer); + } + + public LayerRefinedObjectClassDefinition findRefinedDefinitionByObjectClassQName(ShadowKindType kind, QName objectClass) { + return LayerRefinedObjectClassDefinitionImpl + .wrap(refinedResourceSchema.findRefinedDefinitionByObjectClassQName(kind, objectClass), layer); + } + + @Override + public ObjectClassComplexTypeDefinition findObjectClassDefinition(QName objectClassQName) { + return refinedResourceSchema.findObjectClassDefinition(objectClassQName); + } + + @Override + public LayerRefinedResourceSchema forLayer(LayerType layer) { + return refinedResourceSchema.forLayer(layer); + } + + @Override + @Nullable + public CD findContainerDefinitionByCompileTimeClass( + @NotNull Class compileTimeClass, @NotNull Class definitionClass) { + return refinedResourceSchema.findContainerDefinitionByCompileTimeClass(compileTimeClass, definitionClass); + } + + @Override + @Nullable + public ID findItemDefinitionByType(@NotNull QName typeName, + @NotNull Class definitionClass) { + return refinedResourceSchema.findItemDefinitionByType(typeName, definitionClass); + } + + @Override + @Nullable + public ID findItemDefinitionByElementName(@NotNull QName elementName, + @NotNull Class definitionClass) { + return refinedResourceSchema.findItemDefinitionByElementName(elementName, definitionClass); + } + + @Override + @Nullable + public ComplexTypeDefinition findComplexTypeDefinitionByCompileTimeClass( + @NotNull Class compileTimeClass) { + return refinedResourceSchema.findComplexTypeDefinitionByCompileTimeClass(compileTimeClass); + } + + @Override + @Nullable + public ComplexTypeDefinition findComplexTypeDefinitionByType(@NotNull QName typeName) { + return refinedResourceSchema.findComplexTypeDefinitionByType(typeName); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((layer == null) ? 0 : layer.hashCode()); + result = prime * result + ((refinedResourceSchema == null) ? 0 : refinedResourceSchema.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + LayerRefinedResourceSchemaImpl other = (LayerRefinedResourceSchemaImpl) obj; + if (layer != other.layer) + return false; + if (refinedResourceSchema == null) { + if (other.refinedResourceSchema != null) + return false; + } else if (!refinedResourceSchema.equals(other.refinedResourceSchema)) + return false; + return true; + } + + @Override + public String debugDump() { + return debugDump(0); + } + + @Override + public String debugDump(int indent) { + StringBuilder sb = new StringBuilder(); + DebugUtil.indentDebugDump(sb, indent); + sb.append("LRSchema(layer=").append(layer).append(",\n"); + sb.append(refinedResourceSchema.debugDump(indent + 1)); + return sb.toString(); + } + + @Override + public ObjectClassComplexTypeDefinition findObjectClassDefinition( + ShadowKindType kind, String intent) { + return refinedResourceSchema.findObjectClassDefinition(kind, intent); + } + + @Override + public List getRefinedDefinitions() { + return refinedResourceSchema.getRefinedDefinitions(); + } + + @Override + public ObjectClassComplexTypeDefinition findDefaultObjectClassDefinition( + ShadowKindType kind) { + return refinedResourceSchema.findDefaultObjectClassDefinition(kind); + } + +} diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedAttributeDefinition.java b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedAttributeDefinition.java index 09ca9d9a782..ca1bcc9c09b 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedAttributeDefinition.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedAttributeDefinition.java @@ -13,595 +13,74 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.evolveum.midpoint.common.refinery; - -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import javax.xml.namespace.QName; -import org.apache.commons.lang.BooleanUtils; +package com.evolveum.midpoint.common.refinery; -import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.schema.SchemaProcessorUtil; -import com.evolveum.midpoint.schema.processor.ObjectClassComplexTypeDefinition; import com.evolveum.midpoint.schema.processor.ResourceAttributeDefinition; -import com.evolveum.midpoint.schema.util.MiscSchemaUtil; -import com.evolveum.midpoint.util.DebugDumpable; -import com.evolveum.midpoint.util.DebugUtil; -import com.evolveum.midpoint.util.DisplayableValue; -import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.xml.ns._public.common.common_3.AttributeFetchStrategyType; import com.evolveum.midpoint.xml.ns._public.common.common_3.LayerType; import com.evolveum.midpoint.xml.ns._public.common.common_3.MappingType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.PropertyAccessType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.PropertyLimitationsType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceAttributeDefinitionType; -import org.jetbrains.annotations.NotNull; + +import java.util.List; /** - * @author semancik + * @author mederly */ -public class RefinedAttributeDefinition extends ResourceAttributeDefinition implements DebugDumpable { - - private static LayerType DEFAULT_LAYER = LayerType.MODEL; - - private String displayName; - private String description; - private boolean tolerant = true; - private boolean isExclusiveStrong = false; - protected boolean secondaryIdentifier = false; - private boolean isDisplayNameAttribute = false; - private List intolerantValuePattern; - private List tolerantValuePattern; - private ResourceAttributeDefinition attributeDefinition; - private AttributeFetchStrategyType fetchStrategy; - private MappingType outboundMappingType; - private List inboundMappingTypes; - private Map limitationsMap = new HashMap(); - private QName matchingRuleQName = null; - private Integer modificationPriority; - private Boolean readReplaceMode; - private PropertyAccessType accessOverride = new PropertyAccessType(); - private boolean isVolatilityTrigger = false; - - protected RefinedAttributeDefinition(ResourceAttributeDefinition attrDef, PrismContext prismContext) { - super(attrDef.getName(), attrDef.getTypeName(), prismContext); - this.attributeDefinition = attrDef; - } - - @Override - public void setNativeAttributeName(String nativeAttributeName) { - throw new UnsupportedOperationException("Parts of refined attribute are immutable"); - } - - public boolean isTolerant() { - return tolerant; - } - - public void setTolerant(boolean tolerant) { - this.tolerant = tolerant; - } - - public boolean isSecondaryIdentifier() { - return secondaryIdentifier; - } - - public void setSecondaryIdentifier(boolean secondaryIdentifier) { - this.secondaryIdentifier = secondaryIdentifier; - } - - @Override - public boolean canAdd() { - return canAdd(DEFAULT_LAYER); - } - - public boolean canAdd(LayerType layer) { - if (accessOverride.isAdd() != null) { - return accessOverride.isAdd(); - } - return limitationsMap.get(layer).getAccess().isAdd(); - } - - @Override - public boolean canRead() { - return canRead(DEFAULT_LAYER); - } - - public boolean canRead(LayerType layer) { - if (accessOverride.isRead() != null) { - return accessOverride.isRead(); - } - return limitationsMap.get(layer).getAccess().isRead(); - } - - @Override - public boolean canModify() { - return canModify(DEFAULT_LAYER); - } - - public boolean canModify(LayerType layer) { - if (accessOverride.isModify() != null) { - return accessOverride.isModify(); - } - return limitationsMap.get(layer).getAccess().isModify(); - } - - @Override - public void setReadOnly() { - setCanRead(false); - } - - @Override - public QName getValueType() { - return attributeDefinition.getValueType(); - } - - @Override - public void setMinOccurs(int minOccurs) { - throw new UnsupportedOperationException("Parts of refined attribute are immutable"); - } - - @Override - public void setMaxOccurs(int maxOccurs) { - throw new UnsupportedOperationException("Parts of refined attribute are immutable"); - } - - @Override - public void setCanRead(boolean read) { - accessOverride.setRead(read); - } - - @Override - public void setCanModify(boolean update) { - accessOverride.setModify(update); - } - - @Override - public void setCanAdd(boolean create) { - accessOverride.setAdd(create); - } - - @Override - public boolean isIgnored() { - return isIgnored(DEFAULT_LAYER); - } - - public boolean isIgnored(LayerType layer) { - return limitationsMap.get(layer).isIgnore(); - } - - @Override - public void setIgnored(boolean ignored) { - throw new UnsupportedOperationException("Parts of refined attribute are immutable"); - } - - @Override - public void setHelp(String help) { - throw new UnsupportedOperationException("Parts of refined attribute are immutable"); - } - - @Override - public String getDisplayName() { - return displayName; - } - - @Override - public void setDisplayName(String displayName) { - this.displayName = displayName; - } - - public String getDescription() { - return description; - } +public interface RefinedAttributeDefinition extends ResourceAttributeDefinition { + boolean isTolerant(); - public void setDescription(String description) { - this.description = description; - } + boolean isSecondaryIdentifier(); - public ResourceAttributeDefinition getAttributeDefinition() { - return attributeDefinition; - } + boolean canAdd(LayerType layer); - public void setAttributeDefinition(ResourceAttributeDefinition attributeDefinition) { - this.attributeDefinition = attributeDefinition; - } + boolean canRead(LayerType layer); - public MappingType getOutboundMappingType() { - return outboundMappingType; - } + boolean canModify(LayerType layer); - public void setOutboundMappingType(MappingType outboundMappingType) { - this.outboundMappingType = outboundMappingType; - } - - public boolean hasOutboundMapping() { - return outboundMappingType != null; - } + boolean isIgnored(LayerType layer); - public List getInboundMappingTypes() { - return inboundMappingTypes; - } + String getDescription(); - public void setInboundMappingTypes(List inboundAssignmentTypes) { - this.inboundMappingTypes = inboundAssignmentTypes; - } + ResourceAttributeDefinition getAttributeDefinition(); - @NotNull - public QName getName() { - return attributeDefinition.getName(); - } + MappingType getOutboundMappingType(); - public QName getTypeName() { - return attributeDefinition.getTypeName(); - } + boolean hasOutboundMapping(); - public String getNativeAttributeName() { - return attributeDefinition.getNativeAttributeName(); - } - - public String getFrameworkAttributeName() { - return attributeDefinition.getFrameworkAttributeName(); - } + List getInboundMappingTypes(); - public Collection> getAllowedValues() { - return attributeDefinition.getAllowedValues(); - } - - public boolean isReturnedByDefault() { - return attributeDefinition.isReturnedByDefault(); - } + int getMaxOccurs(LayerType layer); - public void setReturnedByDefault(Boolean returnedByDefault) { - throw new UnsupportedOperationException("Cannot change returnedByDefault"); - } + int getMinOccurs(LayerType layer); - @Override - public int getMaxOccurs() { - return getMaxOccurs(DEFAULT_LAYER); - } - - public int getMaxOccurs(LayerType layer) { - return limitationsMap.get(layer).getMaxOccurs(); - } - - @Override - public int getMinOccurs() { - return getMinOccurs(DEFAULT_LAYER); - } - - public int getMinOccurs(LayerType layer) { - return limitationsMap.get(layer).getMinOccurs(); - } - - public boolean isOptional(LayerType layer) { - return limitationsMap.get(layer).getMinOccurs() == 0; - } - - public boolean isMandatory(LayerType layer) { - return limitationsMap.get(layer).getMinOccurs() > 0; - } - - public boolean isMultiValue(LayerType layer) { - int maxOccurs = limitationsMap.get(layer).getMaxOccurs(); - return maxOccurs < 0 || maxOccurs > 1; - } - - public boolean isSingleValue(LayerType layer) { - return limitationsMap.get(layer).getMaxOccurs() == 1; - } - - public boolean isExlusiveStrong() { - return isExclusiveStrong; - } - - public void setExclusiveStrong(boolean isExclusiveStrong) { - this.isExclusiveStrong = isExclusiveStrong; - } - - public PropertyLimitations getLimitations(LayerType layer) { - return limitationsMap.get(layer); - } - - public String getHelp() { - return attributeDefinition.getHelp(); - } - - public AttributeFetchStrategyType getFetchStrategy() { - return fetchStrategy; - } - - public void setFetchStrategy(AttributeFetchStrategyType fetchStrategy) { - this.fetchStrategy = fetchStrategy; - } - - public QName getMatchingRuleQName() { - return matchingRuleQName; - } - - public void setMatchingRuleQName(QName matchingRuleQName) { - this.matchingRuleQName = matchingRuleQName; - } - - public List getTolerantValuePattern(){ - return tolerantValuePattern; - } - - public List getIntolerantValuePattern(){ - return intolerantValuePattern; - } - - public boolean isVolatilityTrigger() { - return isVolatilityTrigger; - } - - public void setVolatilityTrigger(boolean isVolatilityTrigger) { - this.isVolatilityTrigger = isVolatilityTrigger; - } - - // schemaHandlingAttrDefType may be null if we are parsing from schema only - static RefinedAttributeDefinition parse(ResourceAttributeDefinition schemaAttrDef, ResourceAttributeDefinitionType schemaHandlingAttrDefType, - ObjectClassComplexTypeDefinition objectClassDef, PrismContext prismContext, - String contextDescription) throws SchemaException { + boolean isOptional(LayerType layer); - RefinedAttributeDefinition rAttrDef = new RefinedAttributeDefinition(schemaAttrDef, prismContext); + boolean isMandatory(LayerType layer); - if (schemaHandlingAttrDefType != null && schemaHandlingAttrDefType.getDisplayName() != null) { - rAttrDef.setDisplayName(schemaHandlingAttrDefType.getDisplayName()); - } else { - if (schemaAttrDef.getDisplayName() != null) { - rAttrDef.setDisplayName(schemaAttrDef.getDisplayName()); - } - } - - if (schemaHandlingAttrDefType != null && schemaHandlingAttrDefType.getDisplayOrder() != null) { - rAttrDef.setDisplayOrder(schemaHandlingAttrDefType.getDisplayOrder()); - } else { - if (schemaAttrDef.getDisplayOrder() != null) { - rAttrDef.setDisplayOrder(schemaAttrDef.getDisplayOrder()); - } - } + boolean isMultiValue(LayerType layer); - rAttrDef.matchingRuleQName = schemaAttrDef.getMatchingRuleQName(); - if (schemaHandlingAttrDefType != null) { - rAttrDef.fetchStrategy = schemaHandlingAttrDefType.getFetchStrategy(); - if (schemaHandlingAttrDefType.getMatchingRule() != null) { - rAttrDef.matchingRuleQName = schemaHandlingAttrDefType.getMatchingRule(); - } - } + boolean isSingleValue(LayerType layer); - PropertyLimitations schemaLimitations = getOrCreateLimitations(rAttrDef.limitationsMap, LayerType.SCHEMA); - schemaLimitations.setMinOccurs(schemaAttrDef.getMinOccurs()); - schemaLimitations.setMaxOccurs(schemaAttrDef.getMaxOccurs()); - schemaLimitations.setIgnore(schemaAttrDef.isIgnored()); - schemaLimitations.getAccess().setAdd(schemaAttrDef.canAdd()); - schemaLimitations.getAccess().setModify(schemaAttrDef.canModify()); - schemaLimitations.getAccess().setRead(schemaAttrDef.canRead()); + boolean isExlusiveStrong(); - if (schemaHandlingAttrDefType != null) { + PropertyLimitations getLimitations(LayerType layer); - if (schemaHandlingAttrDefType.getDescription() != null) { - rAttrDef.setDescription(schemaHandlingAttrDefType.getDescription()); - } + AttributeFetchStrategyType getFetchStrategy(); - if (schemaHandlingAttrDefType.isTolerant() == null) { - rAttrDef.tolerant = true; - } else { - rAttrDef.tolerant = schemaHandlingAttrDefType.isTolerant(); - } + List getTolerantValuePattern(); - if (schemaHandlingAttrDefType.isSecondaryIdentifier() == null) { - rAttrDef.secondaryIdentifier = false; - } else { - rAttrDef.secondaryIdentifier = schemaHandlingAttrDefType.isSecondaryIdentifier(); - } + List getIntolerantValuePattern(); - rAttrDef.tolerantValuePattern = schemaHandlingAttrDefType.getTolerantValuePattern(); - rAttrDef.intolerantValuePattern = schemaHandlingAttrDefType.getIntolerantValuePattern(); - - rAttrDef.isExclusiveStrong = BooleanUtils.isTrue(schemaHandlingAttrDefType.isExclusiveStrong()); - rAttrDef.isVolatilityTrigger = BooleanUtils.isTrue(schemaHandlingAttrDefType.isVolatilityTrigger()); - - if (schemaHandlingAttrDefType.getOutbound() != null) { - rAttrDef.setOutboundMappingType(schemaHandlingAttrDefType.getOutbound()); - } - - if (schemaHandlingAttrDefType.getInbound() != null) { - rAttrDef.setInboundMappingTypes(schemaHandlingAttrDefType.getInbound()); - } - - rAttrDef.setModificationPriority(schemaHandlingAttrDefType.getModificationPriority()); - - rAttrDef.setReadReplaceMode(schemaHandlingAttrDefType.isReadReplaceMode()); // may be null at this point - - if (schemaHandlingAttrDefType.isDisplayNameAttribute() != null && schemaHandlingAttrDefType.isDisplayNameAttribute()) { - rAttrDef.isDisplayNameAttribute = true; - } - } - - PropertyLimitations previousLimitations = null; - for (LayerType layer : LayerType.values()) { - PropertyLimitations limitations = getOrCreateLimitations(rAttrDef.limitationsMap, layer); - if (previousLimitations != null) { - limitations.setMinOccurs(previousLimitations.getMinOccurs()); - limitations.setMaxOccurs(previousLimitations.getMaxOccurs()); - limitations.setIgnore(previousLimitations.isIgnore()); - limitations.getAccess().setAdd(previousLimitations.getAccess().isAdd()); - limitations.getAccess().setRead(previousLimitations.getAccess().isRead()); - limitations.getAccess().setModify(previousLimitations.getAccess().isModify()); - } - previousLimitations = limitations; - if (schemaHandlingAttrDefType != null) { - if (layer != LayerType.SCHEMA) { - // SCHEMA is a pseudo-layer. It cannot be overriden ... unless specified explicitly - PropertyLimitationsType genericLimitationsType = MiscSchemaUtil.getLimitationsType(schemaHandlingAttrDefType.getLimitations(), null); - if (genericLimitationsType != null) { - applyLimitationsType(limitations, genericLimitationsType); - } - } - PropertyLimitationsType layerLimitationsType = MiscSchemaUtil.getLimitationsType(schemaHandlingAttrDefType.getLimitations(), layer); - if (layerLimitationsType != null) { - applyLimitationsType(limitations, layerLimitationsType); - } - } - } - - return rAttrDef; - - } - - private static void applyLimitationsType(PropertyLimitations limitations, PropertyLimitationsType layerLimitationsType) { - if (layerLimitationsType.getMinOccurs() != null) { - limitations.setMinOccurs(SchemaProcessorUtil.parseMultiplicity(layerLimitationsType.getMinOccurs())); - } - if (layerLimitationsType.getMaxOccurs() != null) { - limitations.setMaxOccurs(SchemaProcessorUtil.parseMultiplicity(layerLimitationsType.getMaxOccurs())); - } - if (layerLimitationsType.isIgnore() != null) { - limitations.setIgnore(layerLimitationsType.isIgnore()); - } - if (layerLimitationsType.getAccess() != null) { - PropertyAccessType accessType = layerLimitationsType.getAccess(); - if (accessType.isAdd() != null) { - limitations.getAccess().setAdd(accessType.isAdd()); - } - if (accessType.isRead() != null) { - limitations.getAccess().setRead(accessType.isRead()); - } - if (accessType.isModify() != null) { - limitations.getAccess().setModify(accessType.isModify()); - } - } - - } - - private static PropertyLimitations getOrCreateLimitations(Map limitationsMap, - LayerType layer) { - PropertyLimitations limitations = limitationsMap.get(layer); - if (limitations == null) { - limitations = new PropertyLimitations(); - limitationsMap.put(layer, limitations); - } - return limitations; - } - - static boolean isIgnored(ResourceAttributeDefinitionType attrDefType) throws SchemaException { - List limitations = attrDefType.getLimitations(); - if (limitations == null) { - return false; - } - PropertyLimitationsType limitationsType = MiscSchemaUtil.getLimitationsType(limitations, DEFAULT_LAYER); - if (limitationsType == null) { - return false; - } - if (limitationsType.isIgnore() == null) { - return false; - } - return limitationsType.isIgnore(); - } - - @Override - public RefinedAttributeDefinition clone() { - ResourceAttributeDefinition attrDefClone = this.attributeDefinition.clone(); - RefinedAttributeDefinition clone = new RefinedAttributeDefinition<>(attrDefClone, prismContext); - copyDefinitionData(clone); - return clone; - } - - protected void copyDefinitionData(RefinedAttributeDefinition clone) { - super.copyDefinitionData(clone); - clone.accessOverride = this.accessOverride.clone(); - clone.description = this.description; - clone.displayName = this.displayName; - clone.fetchStrategy = this.fetchStrategy; - clone.inboundMappingTypes = this.inboundMappingTypes; - clone.intolerantValuePattern = this.intolerantValuePattern; - clone.isExclusiveStrong = this.isExclusiveStrong; - clone.isVolatilityTrigger = this.isVolatilityTrigger; - clone.limitationsMap = this.limitationsMap; - clone.matchingRuleQName = this.matchingRuleQName; - clone.modificationPriority = this.modificationPriority; - clone.outboundMappingType = this.outboundMappingType; - clone.readReplaceMode = this.readReplaceMode; - clone.secondaryIdentifier = this.secondaryIdentifier; - clone.tolerant = this.tolerant; - clone.tolerantValuePattern = this.tolerantValuePattern; - } - - + boolean isVolatilityTrigger(); @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append(super.toString()); - if (getDisplayName() != null) { - sb.append(",Disp"); - } - if (getDescription() != null) { - sb.append(",Desc"); - } - if (getOutboundMappingType() != null) { - sb.append(",OUT"); - } - if (getInboundMappingTypes() != null) { - sb.append(",IN"); - } - if (Boolean.TRUE.equals(getReadReplaceMode())) { - sb.append(",R+E"); - } - if (getModificationPriority() != null) { - sb.append(",P").append(getModificationPriority()); - } - return sb.toString(); - } - - /** - * Return a human readable name of this class suitable for logs. - */ - @Override - protected String getDebugDumpClassName() { - return "rRAD"; - } - - @Override - public String debugDump(int indent) { - return debugDump(indent, null); - } - - String debugDump(int indent, LayerType layer) { - StringBuilder sb = new StringBuilder(); - sb.append(super.debugDump(indent)); - if (layer == null) { - sb.append("\n"); - DebugUtil.debugDumpMapSingleLine(sb, limitationsMap, indent + 1); - } else { - PropertyLimitations limitations = limitationsMap.get(layer); - if (limitations != null) { - sb.append(limitations.toString()); - } - } - return sb.toString(); - } - - public void setModificationPriority(Integer modificationPriority) { - this.modificationPriority = modificationPriority; - } + RefinedAttributeDefinition clone(); - public Integer getModificationPriority() { - return modificationPriority; - } + String debugDump(int indent, LayerType layer); - public Boolean getReadReplaceMode() { // "get" instead of "is" because it may be null - return readReplaceMode; - } + Integer getModificationPriority(); - public void setReadReplaceMode(Boolean readReplaceMode) { - this.readReplaceMode = readReplaceMode; - } + Boolean getReadReplaceMode(); - public boolean isDisplayNameAttribute() { - return isDisplayNameAttribute; - } + boolean isDisplayNameAttribute(); } diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedAttributeDefinitionImpl.java b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedAttributeDefinitionImpl.java new file mode 100644 index 00000000000..a382b6eb5d9 --- /dev/null +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedAttributeDefinitionImpl.java @@ -0,0 +1,636 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.common.refinery; + +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.xml.namespace.QName; + +import com.evolveum.midpoint.schema.processor.ResourceAttributeDefinitionImpl; +import org.apache.commons.lang.BooleanUtils; + +import com.evolveum.midpoint.prism.PrismContext; +import com.evolveum.midpoint.prism.schema.SchemaProcessorUtil; +import com.evolveum.midpoint.schema.processor.ObjectClassComplexTypeDefinition; +import com.evolveum.midpoint.schema.processor.ResourceAttributeDefinition; +import com.evolveum.midpoint.schema.util.MiscSchemaUtil; +import com.evolveum.midpoint.util.DebugDumpable; +import com.evolveum.midpoint.util.DebugUtil; +import com.evolveum.midpoint.util.DisplayableValue; +import com.evolveum.midpoint.util.exception.SchemaException; +import com.evolveum.midpoint.xml.ns._public.common.common_3.AttributeFetchStrategyType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.LayerType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.MappingType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.PropertyAccessType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.PropertyLimitationsType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceAttributeDefinitionType; +import org.jetbrains.annotations.NotNull; + +/** + * @author semancik + */ +public class RefinedAttributeDefinitionImpl extends ResourceAttributeDefinitionImpl implements RefinedAttributeDefinition { + + private static LayerType DEFAULT_LAYER = LayerType.MODEL; + + private String displayName; + private String description; + private boolean tolerant = true; + private boolean isExclusiveStrong = false; + protected boolean secondaryIdentifier = false; + private boolean isDisplayNameAttribute = false; + private List intolerantValuePattern; + private List tolerantValuePattern; + private ResourceAttributeDefinition attributeDefinition; + private AttributeFetchStrategyType fetchStrategy; + private MappingType outboundMappingType; + private List inboundMappingTypes; + private Map limitationsMap = new HashMap<>(); + private QName matchingRuleQName = null; + private Integer modificationPriority; + private Boolean readReplaceMode; + private PropertyAccessType accessOverride = new PropertyAccessType(); + private boolean isVolatilityTrigger = false; + + protected RefinedAttributeDefinitionImpl(ResourceAttributeDefinition attrDef, PrismContext prismContext) { + super(attrDef.getName(), attrDef.getTypeName(), prismContext); + this.attributeDefinition = attrDef; + } + + @Override + public void setNativeAttributeName(String nativeAttributeName) { + throw new UnsupportedOperationException("Parts of refined attribute are immutable"); + } + + @Override + public boolean isTolerant() { + return tolerant; + } + + public void setTolerant(boolean tolerant) { + this.tolerant = tolerant; + } + + @Override + public boolean isSecondaryIdentifier() { + return secondaryIdentifier; + } + + public void setSecondaryIdentifier(boolean secondaryIdentifier) { + this.secondaryIdentifier = secondaryIdentifier; + } + + @Override + public boolean canAdd() { + return canAdd(DEFAULT_LAYER); + } + + @Override + public boolean canAdd(LayerType layer) { + if (accessOverride.isAdd() != null) { + return accessOverride.isAdd(); + } + return limitationsMap.get(layer).getAccess().isAdd(); + } + + @Override + public boolean canRead() { + return canRead(DEFAULT_LAYER); + } + + @Override + public boolean canRead(LayerType layer) { + if (accessOverride.isRead() != null) { + return accessOverride.isRead(); + } + return limitationsMap.get(layer).getAccess().isRead(); + } + + @Override + public boolean canModify() { + return canModify(DEFAULT_LAYER); + } + + @Override + public boolean canModify(LayerType layer) { + if (accessOverride.isModify() != null) { + return accessOverride.isModify(); + } + return limitationsMap.get(layer).getAccess().isModify(); + } + + @Override + public void setReadOnly() { + setCanRead(false); + } + + @Override + public QName getValueType() { + return attributeDefinition.getValueType(); + } + + @Override + public void setMinOccurs(int minOccurs) { + throw new UnsupportedOperationException("Parts of refined attribute are immutable"); + } + + @Override + public void setMaxOccurs(int maxOccurs) { + throw new UnsupportedOperationException("Parts of refined attribute are immutable"); + } + + @Override + public void setCanRead(boolean read) { + accessOverride.setRead(read); + } + + @Override + public void setCanModify(boolean update) { + accessOverride.setModify(update); + } + + @Override + public void setCanAdd(boolean create) { + accessOverride.setAdd(create); + } + + @Override + public boolean isIgnored() { + return isIgnored(DEFAULT_LAYER); + } + + @Override + public boolean isIgnored(LayerType layer) { + return limitationsMap.get(layer).isIgnore(); + } + + @Override + public void setIgnored(boolean ignored) { + throw new UnsupportedOperationException("Parts of refined attribute are immutable"); + } + + @Override + public void setHelp(String help) { + throw new UnsupportedOperationException("Parts of refined attribute are immutable"); + } + + @Override + public String getDisplayName() { + return displayName; + } + + @Override + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + @Override + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + @Override + public ResourceAttributeDefinition getAttributeDefinition() { + return attributeDefinition; + } + + public void setAttributeDefinition(ResourceAttributeDefinition attributeDefinition) { + this.attributeDefinition = attributeDefinition; + } + + @Override + public MappingType getOutboundMappingType() { + return outboundMappingType; + } + + public void setOutboundMappingType(MappingType outboundMappingType) { + this.outboundMappingType = outboundMappingType; + } + + @Override + public boolean hasOutboundMapping() { + return outboundMappingType != null; + } + + @Override + public List getInboundMappingTypes() { + return inboundMappingTypes; + } + + public void setInboundMappingTypes(List inboundAssignmentTypes) { + this.inboundMappingTypes = inboundAssignmentTypes; + } + + @NotNull + public QName getName() { + return attributeDefinition.getName(); + } + + @NotNull + public QName getTypeName() { + return attributeDefinition.getTypeName(); + } + + public String getNativeAttributeName() { + return attributeDefinition.getNativeAttributeName(); + } + + public String getFrameworkAttributeName() { + return attributeDefinition.getFrameworkAttributeName(); + } + + public Collection> getAllowedValues() { + return attributeDefinition.getAllowedValues(); + } + + public boolean isReturnedByDefault() { + return attributeDefinition.isReturnedByDefault(); + } + + public void setReturnedByDefault(Boolean returnedByDefault) { + throw new UnsupportedOperationException("Cannot change returnedByDefault"); + } + + @Override + public int getMaxOccurs() { + return getMaxOccurs(DEFAULT_LAYER); + } + + @Override + public int getMaxOccurs(LayerType layer) { + return limitationsMap.get(layer).getMaxOccurs(); + } + + @Override + public int getMinOccurs() { + return getMinOccurs(DEFAULT_LAYER); + } + + @Override + public int getMinOccurs(LayerType layer) { + return limitationsMap.get(layer).getMinOccurs(); + } + + @Override + public boolean isOptional(LayerType layer) { + return limitationsMap.get(layer).getMinOccurs() == 0; + } + + @Override + public boolean isMandatory(LayerType layer) { + return limitationsMap.get(layer).getMinOccurs() > 0; + } + + @Override + public boolean isMultiValue(LayerType layer) { + int maxOccurs = limitationsMap.get(layer).getMaxOccurs(); + return maxOccurs < 0 || maxOccurs > 1; + } + + @Override + public boolean isSingleValue(LayerType layer) { + return limitationsMap.get(layer).getMaxOccurs() == 1; + } + + @Override + public boolean isExlusiveStrong() { + return isExclusiveStrong; + } + + public void setExclusiveStrong(boolean isExclusiveStrong) { + this.isExclusiveStrong = isExclusiveStrong; + } + + @Override + public PropertyLimitations getLimitations(LayerType layer) { + return limitationsMap.get(layer); + } + + public String getHelp() { + return attributeDefinition.getHelp(); + } + + @Override + public AttributeFetchStrategyType getFetchStrategy() { + return fetchStrategy; + } + + public void setFetchStrategy(AttributeFetchStrategyType fetchStrategy) { + this.fetchStrategy = fetchStrategy; + } + + public QName getMatchingRuleQName() { + return matchingRuleQName; + } + + public void setMatchingRuleQName(QName matchingRuleQName) { + this.matchingRuleQName = matchingRuleQName; + } + + @Override + public List getTolerantValuePattern(){ + return tolerantValuePattern; + } + + @Override + public List getIntolerantValuePattern(){ + return intolerantValuePattern; + } + + @Override + public boolean isVolatilityTrigger() { + return isVolatilityTrigger; + } + + public void setVolatilityTrigger(boolean isVolatilityTrigger) { + this.isVolatilityTrigger = isVolatilityTrigger; + } + + // schemaHandlingAttrDefType may be null if we are parsing from schema only + static RefinedAttributeDefinition parse(ResourceAttributeDefinition schemaAttrDef, ResourceAttributeDefinitionType schemaHandlingAttrDefType, + ObjectClassComplexTypeDefinition objectClassDef, PrismContext prismContext, + String contextDescription) throws SchemaException { + + RefinedAttributeDefinitionImpl rAttrDef = new RefinedAttributeDefinitionImpl(schemaAttrDef, prismContext); + + if (schemaHandlingAttrDefType != null && schemaHandlingAttrDefType.getDisplayName() != null) { + rAttrDef.setDisplayName(schemaHandlingAttrDefType.getDisplayName()); + } else { + if (schemaAttrDef.getDisplayName() != null) { + rAttrDef.setDisplayName(schemaAttrDef.getDisplayName()); + } + } + + if (schemaHandlingAttrDefType != null && schemaHandlingAttrDefType.getDisplayOrder() != null) { + rAttrDef.setDisplayOrder(schemaHandlingAttrDefType.getDisplayOrder()); + } else { + if (schemaAttrDef.getDisplayOrder() != null) { + rAttrDef.setDisplayOrder(schemaAttrDef.getDisplayOrder()); + } + } + + rAttrDef.matchingRuleQName = schemaAttrDef.getMatchingRuleQName(); + if (schemaHandlingAttrDefType != null) { + rAttrDef.fetchStrategy = schemaHandlingAttrDefType.getFetchStrategy(); + if (schemaHandlingAttrDefType.getMatchingRule() != null) { + rAttrDef.matchingRuleQName = schemaHandlingAttrDefType.getMatchingRule(); + } + } + + PropertyLimitations schemaLimitations = getOrCreateLimitations(rAttrDef.limitationsMap, LayerType.SCHEMA); + schemaLimitations.setMinOccurs(schemaAttrDef.getMinOccurs()); + schemaLimitations.setMaxOccurs(schemaAttrDef.getMaxOccurs()); + schemaLimitations.setIgnore(schemaAttrDef.isIgnored()); + schemaLimitations.getAccess().setAdd(schemaAttrDef.canAdd()); + schemaLimitations.getAccess().setModify(schemaAttrDef.canModify()); + schemaLimitations.getAccess().setRead(schemaAttrDef.canRead()); + + if (schemaHandlingAttrDefType != null) { + + if (schemaHandlingAttrDefType.getDescription() != null) { + rAttrDef.setDescription(schemaHandlingAttrDefType.getDescription()); + } + + if (schemaHandlingAttrDefType.isTolerant() == null) { + rAttrDef.tolerant = true; + } else { + rAttrDef.tolerant = schemaHandlingAttrDefType.isTolerant(); + } + + if (schemaHandlingAttrDefType.isSecondaryIdentifier() == null) { + rAttrDef.secondaryIdentifier = false; + } else { + rAttrDef.secondaryIdentifier = schemaHandlingAttrDefType.isSecondaryIdentifier(); + } + + rAttrDef.tolerantValuePattern = schemaHandlingAttrDefType.getTolerantValuePattern(); + rAttrDef.intolerantValuePattern = schemaHandlingAttrDefType.getIntolerantValuePattern(); + + rAttrDef.isExclusiveStrong = BooleanUtils.isTrue(schemaHandlingAttrDefType.isExclusiveStrong()); + rAttrDef.isVolatilityTrigger = BooleanUtils.isTrue(schemaHandlingAttrDefType.isVolatilityTrigger()); + + if (schemaHandlingAttrDefType.getOutbound() != null) { + rAttrDef.setOutboundMappingType(schemaHandlingAttrDefType.getOutbound()); + } + + if (schemaHandlingAttrDefType.getInbound() != null) { + rAttrDef.setInboundMappingTypes(schemaHandlingAttrDefType.getInbound()); + } + + rAttrDef.setModificationPriority(schemaHandlingAttrDefType.getModificationPriority()); + + rAttrDef.setReadReplaceMode(schemaHandlingAttrDefType.isReadReplaceMode()); // may be null at this point + + if (schemaHandlingAttrDefType.isDisplayNameAttribute() != null && schemaHandlingAttrDefType.isDisplayNameAttribute()) { + rAttrDef.isDisplayNameAttribute = true; + } + } + + PropertyLimitations previousLimitations = null; + for (LayerType layer : LayerType.values()) { + PropertyLimitations limitations = getOrCreateLimitations(rAttrDef.limitationsMap, layer); + if (previousLimitations != null) { + limitations.setMinOccurs(previousLimitations.getMinOccurs()); + limitations.setMaxOccurs(previousLimitations.getMaxOccurs()); + limitations.setIgnore(previousLimitations.isIgnore()); + limitations.getAccess().setAdd(previousLimitations.getAccess().isAdd()); + limitations.getAccess().setRead(previousLimitations.getAccess().isRead()); + limitations.getAccess().setModify(previousLimitations.getAccess().isModify()); + } + previousLimitations = limitations; + if (schemaHandlingAttrDefType != null) { + if (layer != LayerType.SCHEMA) { + // SCHEMA is a pseudo-layer. It cannot be overriden ... unless specified explicitly + PropertyLimitationsType genericLimitationsType = MiscSchemaUtil.getLimitationsType(schemaHandlingAttrDefType.getLimitations(), null); + if (genericLimitationsType != null) { + applyLimitationsType(limitations, genericLimitationsType); + } + } + PropertyLimitationsType layerLimitationsType = MiscSchemaUtil.getLimitationsType(schemaHandlingAttrDefType.getLimitations(), layer); + if (layerLimitationsType != null) { + applyLimitationsType(limitations, layerLimitationsType); + } + } + } + + return rAttrDef; + + } + + private static void applyLimitationsType(PropertyLimitations limitations, PropertyLimitationsType layerLimitationsType) { + if (layerLimitationsType.getMinOccurs() != null) { + limitations.setMinOccurs(SchemaProcessorUtil.parseMultiplicity(layerLimitationsType.getMinOccurs())); + } + if (layerLimitationsType.getMaxOccurs() != null) { + limitations.setMaxOccurs(SchemaProcessorUtil.parseMultiplicity(layerLimitationsType.getMaxOccurs())); + } + if (layerLimitationsType.isIgnore() != null) { + limitations.setIgnore(layerLimitationsType.isIgnore()); + } + if (layerLimitationsType.getAccess() != null) { + PropertyAccessType accessType = layerLimitationsType.getAccess(); + if (accessType.isAdd() != null) { + limitations.getAccess().setAdd(accessType.isAdd()); + } + if (accessType.isRead() != null) { + limitations.getAccess().setRead(accessType.isRead()); + } + if (accessType.isModify() != null) { + limitations.getAccess().setModify(accessType.isModify()); + } + } + + } + + private static PropertyLimitations getOrCreateLimitations(Map limitationsMap, + LayerType layer) { + PropertyLimitations limitations = limitationsMap.get(layer); + if (limitations == null) { + limitations = new PropertyLimitations(); + limitationsMap.put(layer, limitations); + } + return limitations; + } + + static boolean isIgnored(ResourceAttributeDefinitionType attrDefType) throws SchemaException { + List limitations = attrDefType.getLimitations(); + if (limitations == null) { + return false; + } + PropertyLimitationsType limitationsType = MiscSchemaUtil.getLimitationsType(limitations, DEFAULT_LAYER); + if (limitationsType == null) { + return false; + } + if (limitationsType.isIgnore() == null) { + return false; + } + return limitationsType.isIgnore(); + } + + @Override + public RefinedAttributeDefinition clone() { + ResourceAttributeDefinition attrDefClone = this.attributeDefinition.clone(); + RefinedAttributeDefinitionImpl clone = new RefinedAttributeDefinitionImpl(attrDefClone, prismContext); + copyDefinitionData(clone); + return clone; + } + + protected void copyDefinitionData(RefinedAttributeDefinitionImpl clone) { + super.copyDefinitionData(clone); + clone.accessOverride = this.accessOverride.clone(); + clone.description = this.description; + clone.displayName = this.displayName; + clone.fetchStrategy = this.fetchStrategy; + clone.inboundMappingTypes = this.inboundMappingTypes; + clone.intolerantValuePattern = this.intolerantValuePattern; + clone.isExclusiveStrong = this.isExclusiveStrong; + clone.isVolatilityTrigger = this.isVolatilityTrigger; + clone.limitationsMap = this.limitationsMap; + clone.matchingRuleQName = this.matchingRuleQName; + clone.modificationPriority = this.modificationPriority; + clone.outboundMappingType = this.outboundMappingType; + clone.readReplaceMode = this.readReplaceMode; + clone.secondaryIdentifier = this.secondaryIdentifier; + clone.tolerant = this.tolerant; + clone.tolerantValuePattern = this.tolerantValuePattern; + } + + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(super.toString()); + if (getDisplayName() != null) { + sb.append(",Disp"); + } + if (getDescription() != null) { + sb.append(",Desc"); + } + if (getOutboundMappingType() != null) { + sb.append(",OUT"); + } + if (getInboundMappingTypes() != null) { + sb.append(",IN"); + } + if (Boolean.TRUE.equals(getReadReplaceMode())) { + sb.append(",R+E"); + } + if (getModificationPriority() != null) { + sb.append(",P").append(getModificationPriority()); + } + return sb.toString(); + } + + /** + * Return a human readable name of this class suitable for logs. + */ + @Override + protected String getDebugDumpClassName() { + return "rRAD"; + } + + @Override + public String debugDump(int indent) { + return debugDump(indent, null); + } + + @Override + public String debugDump(int indent, LayerType layer) { + StringBuilder sb = new StringBuilder(); + sb.append(super.debugDump(indent)); + if (layer == null) { + sb.append("\n"); + DebugUtil.debugDumpMapSingleLine(sb, limitationsMap, indent + 1); + } else { + PropertyLimitations limitations = limitationsMap.get(layer); + if (limitations != null) { + sb.append(limitations.toString()); + } + } + return sb.toString(); + } + + public void setModificationPriority(Integer modificationPriority) { + this.modificationPriority = modificationPriority; + } + + @Override + public Integer getModificationPriority() { + return modificationPriority; + } + + @Override + public Boolean getReadReplaceMode() { // "get" instead of "is" because it may be null + return readReplaceMode; + } + + public void setReadReplaceMode(Boolean readReplaceMode) { + this.readReplaceMode = readReplaceMode; + } + + @Override + public boolean isDisplayNameAttribute() { + return isDisplayNameAttribute; + } +} diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedConnectorSchema.java b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedConnectorSchema.java index f9ce9629031..bd84fe23725 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedConnectorSchema.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedConnectorSchema.java @@ -1,11 +1,11 @@ /* - * Copyright (c) 2010-2014 Evolveum + * Copyright (c) 2010-2016 Evolveum * * 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 + * 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, @@ -13,77 +13,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package com.evolveum.midpoint.common.refinery; -import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.schema.PrismSchema; import com.evolveum.midpoint.schema.processor.ConnectorSchema; -import com.evolveum.midpoint.schema.util.ConnectorTypeUtil; import com.evolveum.midpoint.util.DebugDumpable; -import com.evolveum.midpoint.util.exception.SchemaException; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ConnectorType; - -import org.w3c.dom.Element; /** - * @author semancik - * + * @author mederly */ -public class RefinedConnectorSchema extends PrismSchema implements DebugDumpable { - - private static final String USER_DATA_KEY_PARSED_CONNECTOR_SCHEMA = RefinedConnectorSchema.class.getName()+".parsedConnectorSchema"; - - protected RefinedConnectorSchema(PrismContext prismContext) { - super(prismContext); - } - - public static ConnectorSchema getConnectorSchema(ConnectorType connectorType, PrismContext prismContext) throws SchemaException { - PrismObject connector = connectorType.asPrismObject(); - return getConnectorSchema(connector, prismContext); - } - - public static ConnectorSchema getConnectorSchema(PrismObject connector, PrismContext prismContext) throws SchemaException { - Element connectorXsdSchema = ConnectorTypeUtil.getConnectorXsdSchema(connector); - if (connectorXsdSchema == null) { - return null; - } - Object userDataEntry = connector.getUserData(USER_DATA_KEY_PARSED_CONNECTOR_SCHEMA); - if (userDataEntry != null) { - if (userDataEntry instanceof ConnectorSchema) { - return (ConnectorSchema)userDataEntry; - } else { - throw new IllegalStateException("Expected ConnectorSchema under user data key "+ - USER_DATA_KEY_PARSED_CONNECTOR_SCHEMA + "in "+connector+", but got "+userDataEntry.getClass()); - } - } else { - //InternalMonitor.recordConnectorSchemaParse(); - ConnectorSchema parsedSchema = ConnectorSchema.parse(connectorXsdSchema, "connector schema of "+connector, prismContext); - if (parsedSchema == null) { - throw new IllegalStateException("Parsed schema is null: most likely an internall error"); - } - parsedSchema.setUsualNamespacePrefix(ConnectorSchema.retrieveUsualNamespacePrefix(connector.asObjectable())); - connector.setUserData(USER_DATA_KEY_PARSED_CONNECTOR_SCHEMA, parsedSchema); - return parsedSchema; - } - } - - public static void setParsedConnectorSchemaConditional(ConnectorType connectorType, ConnectorSchema parsedSchema) { - if (hasParsedSchema(connectorType)) { - return; - } - PrismObject connector = connectorType.asPrismObject(); - connector.setUserData(USER_DATA_KEY_PARSED_CONNECTOR_SCHEMA, parsedSchema); - } - - public static boolean hasParsedSchema(ConnectorType connectorType) { - PrismObject connector = connectorType.asPrismObject(); - return connector.getUserData(USER_DATA_KEY_PARSED_CONNECTOR_SCHEMA) != null; - } - - @Override - public String toString() { - return "rSchema(ns=" + namespace + ")"; - } - +public interface RefinedConnectorSchema extends ConnectorSchema { } diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedConnectorSchemaImpl.java b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedConnectorSchemaImpl.java new file mode 100644 index 00000000000..e68664ee4a7 --- /dev/null +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedConnectorSchemaImpl.java @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2010-2014 Evolveum + * + * 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 com.evolveum.midpoint.common.refinery; + +import com.evolveum.midpoint.prism.PrismContext; +import com.evolveum.midpoint.prism.PrismObject; +import com.evolveum.midpoint.prism.schema.PrismSchema; +import com.evolveum.midpoint.schema.processor.ConnectorSchema; +import com.evolveum.midpoint.schema.processor.ConnectorSchemaImpl; +import com.evolveum.midpoint.schema.util.ConnectorTypeUtil; +import com.evolveum.midpoint.util.DebugDumpable; +import com.evolveum.midpoint.util.exception.SchemaException; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ConnectorType; + +import org.w3c.dom.Element; + +/** + * @author semancik + * + */ +public class RefinedConnectorSchemaImpl extends ConnectorSchemaImpl implements RefinedConnectorSchema { + + private static final String USER_DATA_KEY_PARSED_CONNECTOR_SCHEMA = RefinedConnectorSchemaImpl.class.getName()+".parsedConnectorSchema"; + + protected RefinedConnectorSchemaImpl(PrismContext prismContext) { + super(prismContext); + } + + public static ConnectorSchema getConnectorSchema(ConnectorType connectorType, PrismContext prismContext) throws SchemaException { + PrismObject connector = connectorType.asPrismObject(); + return getConnectorSchema(connector, prismContext); + } + + public static ConnectorSchema getConnectorSchema(PrismObject connector, PrismContext prismContext) throws SchemaException { + Element connectorXsdSchema = ConnectorTypeUtil.getConnectorXsdSchema(connector); + if (connectorXsdSchema == null) { + return null; + } + Object userDataEntry = connector.getUserData(USER_DATA_KEY_PARSED_CONNECTOR_SCHEMA); + if (userDataEntry != null) { + if (userDataEntry instanceof ConnectorSchema) { + return (ConnectorSchema)userDataEntry; + } else { + throw new IllegalStateException("Expected ConnectorSchema under user data key "+ + USER_DATA_KEY_PARSED_CONNECTOR_SCHEMA + "in "+connector+", but got "+userDataEntry.getClass()); + } + } else { + //InternalMonitor.recordConnectorSchemaParse(); + ConnectorSchemaImpl parsedSchema = ConnectorSchemaImpl.parse(connectorXsdSchema, "connector schema of "+connector, prismContext); + if (parsedSchema == null) { + throw new IllegalStateException("Parsed schema is null: most likely an internall error"); + } + parsedSchema.setUsualNamespacePrefix(ConnectorSchemaImpl.retrieveUsualNamespacePrefix(connector.asObjectable())); + connector.setUserData(USER_DATA_KEY_PARSED_CONNECTOR_SCHEMA, parsedSchema); + return parsedSchema; + } + } + + public static void setParsedConnectorSchemaConditional(ConnectorType connectorType, ConnectorSchema parsedSchema) { + if (hasParsedSchema(connectorType)) { + return; + } + PrismObject connector = connectorType.asPrismObject(); + connector.setUserData(USER_DATA_KEY_PARSED_CONNECTOR_SCHEMA, parsedSchema); + } + + public static boolean hasParsedSchema(ConnectorType connectorType) { + PrismObject connector = connectorType.asPrismObject(); + return connector.getUserData(USER_DATA_KEY_PARSED_CONNECTOR_SCHEMA) != null; + } + + @Override + public String toString() { + return "rSchema(ns=" + namespace + ")"; + } + +} diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedObjectClassDefinition.java b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedObjectClassDefinition.java index 9fa745f3189..4d7ebc95967 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedObjectClassDefinition.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedObjectClassDefinition.java @@ -13,1150 +13,134 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package com.evolveum.midpoint.common.refinery; import com.evolveum.midpoint.common.ResourceObjectPattern; -import com.evolveum.midpoint.prism.ItemDefinition; -import com.evolveum.midpoint.prism.PrismContext; +import com.evolveum.midpoint.prism.ComplexTypeDefinition; +import com.evolveum.midpoint.prism.Definition; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.PrismObjectDefinition; -import com.evolveum.midpoint.prism.marshaller.QueryConvertor; -import com.evolveum.midpoint.prism.query.ObjectFilter; -import com.evolveum.midpoint.prism.query.ObjectQuery; -import com.evolveum.midpoint.prism.util.ItemPathUtil; import com.evolveum.midpoint.schema.ResourceShadowDiscriminator; -import com.evolveum.midpoint.schema.constants.SchemaConstants; -import com.evolveum.midpoint.schema.processor.*; -import com.evolveum.midpoint.schema.util.ResourceTypeUtil; -import com.evolveum.midpoint.schema.util.SchemaDebugUtil; -import com.evolveum.midpoint.schema.util.ObjectQueryUtil; -import com.evolveum.midpoint.schema.util.ObjectTypeUtil; +import com.evolveum.midpoint.schema.processor.ObjectClassComplexTypeDefinition; +import com.evolveum.midpoint.schema.processor.ResourceAttributeDefinition; import com.evolveum.midpoint.util.DebugDumpable; -import com.evolveum.midpoint.util.MiscUtil; -import com.evolveum.midpoint.util.PrettyPrinter; -import com.evolveum.midpoint.util.QNameUtil; -import com.evolveum.midpoint.util.exception.SchemaException; -import com.evolveum.midpoint.util.exception.SystemException; -import com.evolveum.midpoint.util.logging.Trace; -import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; import com.evolveum.midpoint.xml.ns._public.resource.capabilities_3.CapabilityType; -import com.evolveum.midpoint.xml.ns._public.resource.capabilities_3.CountObjectsCapabilityType; import com.evolveum.midpoint.xml.ns._public.resource.capabilities_3.PagedSearchCapabilityType; -import com.evolveum.prism.xml.ns._public.query_3.SearchFilterType; import com.evolveum.prism.xml.ns._public.types_3.ItemPathType; import javax.xml.namespace.QName; - -import org.apache.commons.lang.Validate; -import org.jetbrains.annotations.NotNull; - -import java.util.*; +import java.util.Collection; +import java.util.List; /** - * @author semancik + * @author mederly */ -public class RefinedObjectClassDefinition extends ObjectClassComplexTypeDefinition implements DebugDumpable { +public interface RefinedObjectClassDefinition extends ObjectClassComplexTypeDefinition { - private static final Trace LOGGER = TraceManager.getTrace(RefinedObjectClassDefinition.class); + LayerRefinedObjectClassDefinition forLayer(LayerType layerType); - private String intent; - private String displayName; - private String description; - private boolean isDefault; - private ObjectClassComplexTypeDefinition objectClassDefinition; - private ResourceObjectTypeDefinitionType schemaHandlingObjectTypeDefinitionType; - private ResourceType resourceType; - private Collection> identifiers; - private Collection> secondaryIdentifiers; - private Collection protectedObjectPatterns; - private List> attributeDefinitions; - private Collection associations = new ArrayList(); - private Collection auxiliaryObjectClassDefinitions; - private ResourceObjectReferenceType baseContext; - private RefinedAttributeDefinition displayNameAttributeDefinition; - - /** - * Refined object definition. The "any" parts are replaced with appropriate schema (e.g. resource schema) - */ - PrismObjectDefinition objectDefinition = null; - private ShadowKindType kind = null; - - /** - * This is needed by the LayerRefinedObjectClassDefinition class - */ - protected RefinedObjectClassDefinition(QName typeName, PrismContext prismContext) { - super(typeName, prismContext); - } + Collection getAssociations(); - private RefinedObjectClassDefinition(PrismContext prismContext, ResourceType resourceType, - ObjectClassComplexTypeDefinition objectClassDefinition) { - super(objectClassDefinition.getTypeName(), prismContext); - Validate.notNull(objectClassDefinition, "ObjectClass definition must not be null"); - attributeDefinitions = new ArrayList<>(); - this.resourceType = resourceType; - this.objectClassDefinition = objectClassDefinition; - } + Collection getAssociations(ShadowKindType kind); - /** - * Creates a derived version of this ROCD for a given layer. - * TODO clone if necessary/if specified (currently there is no cloning) - * - * @param layerType - * @return - */ - public LayerRefinedObjectClassDefinition forLayer(LayerType layerType) { - Validate.notNull(layerType); - return LayerRefinedObjectClassDefinition.wrap(this, layerType); - } + RefinedAssociationDefinition findAssociation(QName name); - @Override - public ResourceAttributeDefinition getDescriptionAttribute() { - return getObjectClassDefinition().getDescriptionAttribute(); - } + Collection getEntitlementAssociations(); - @Override - public void setDescriptionAttribute(ResourceAttributeDefinition descriptionAttribute) { - throw new UnsupportedOperationException("Parts of refined account are immutable"); - } + RefinedAssociationDefinition findEntitlementAssociation(QName name); - @Override - public RefinedAttributeDefinition getNamingAttribute() { - return substituteRefinedAttributeDefinition(getObjectClassDefinition().getNamingAttribute()); - } - - @Override - public QName getTypeName() { - return getObjectClassDefinition().getTypeName(); - } + Collection getNamesOfAssociations(); - @Override - public String getNativeObjectClass() { - return getObjectClassDefinition().getNativeObjectClass(); - } + Collection getNamesOfAssociationsWithOutboundExpressions(); - @Override - public boolean isDefaultInAKind() { - return isDefault; - } + Collection getAuxiliaryObjectClassDefinitions(); - @Override - public void setDefaultInAKind(boolean defaultAccountType) { - this.isDefault = defaultAccountType; - } + boolean hasAuxiliaryObjectClass(QName expectedObjectClassName); - @Override - public String getIntent() { - return intent; - } - - @Override - public void setIntent(String intent) { - this.intent = intent; - } - - @Override - public ShadowKindType getKind() { - if (kind != null) { - return kind; - } - return getObjectClassDefinition().getKind(); - } + Collection getProtectedObjectPatterns(); @Override - public void setKind(ShadowKindType kind) { - this.kind = kind; - } + RefinedAttributeDefinition getNamingAttribute(); @Override - public RefinedAttributeDefinition getDisplayNameAttribute() { - if (displayNameAttributeDefinition == null) { - ResourceAttributeDefinition displayNameAttribute = getObjectClassDefinition().getDisplayNameAttribute(); - if (displayNameAttribute == null) { - return null; - } - displayNameAttributeDefinition = substituteRefinedAttributeDefinition(displayNameAttribute); - } - return displayNameAttributeDefinition; - } - - @Override - public void setDisplayNameAttribute(QName displayName) { - throw new UnsupportedOperationException("Parts of refined account are immutable"); - } - - @Override - public Collection> getPrimaryIdentifiers() { - if (identifiers == null) { - identifiers = createIdentifiersCollection(); - } - return identifiers; - } + RefinedAttributeDefinition getDisplayNameAttribute(); @Override - public Collection> getSecondaryIdentifiers() { - if (secondaryIdentifiers == null) { - secondaryIdentifiers = createIdentifiersCollection(); - } - return secondaryIdentifiers; - } - - public Collection> getAllIdentifiers() { - Collection> allIdentifiers = new ArrayList<>(); - if (identifiers != null) { - allIdentifiers.addAll((Collection)getPrimaryIdentifiers()); - } - if (secondaryIdentifiers != null) { - allIdentifiers.addAll((Collection)getSecondaryIdentifiers()); - } - return allIdentifiers; - } - - private Collection> createIdentifiersCollection() { - return new ArrayList<>(); - } - - public Collection getAssociations() { - return associations; - } - - public Collection getAssociations(ShadowKindType kind) { - Collection retAssoc = new ArrayList(); - for (RefinedAssociationDefinition association: associations) { - if (kind == association.getKind()) { - retAssoc.add(association); - } - } - return retAssoc; - } - - public RefinedAssociationDefinition findAssociation(QName name) { - for (RefinedAssociationDefinition assocType: getAssociations()) { - if (QNameUtil.match(assocType.getName(), name)) { - return assocType; - } - } - return null; - } - - public Collection getEntitlementAssociations() { - return getAssociations(ShadowKindType.ENTITLEMENT); - } - - public RefinedAssociationDefinition findEntitlementAssociation(QName name) { - for (RefinedAssociationDefinition assocType: getEntitlementAssociations()) { - if (QNameUtil.match(assocType.getName(), name)) { - return assocType; - } - } - return null; - } - - public Collection getNamesOfAssociations() { - Collection names = new HashSet(); - for (RefinedAssociationDefinition assocDef : getAssociations()) { - names.add(assocDef.getName()); - } - return names; - } - - public Collection getNamesOfAssociationsWithOutboundExpressions() { - Collection names = new HashSet(); - for (RefinedAssociationDefinition assocDef : getAssociations()) { - if (assocDef.getOutboundMappingType() != null) { - names.add(assocDef.getName()); - } - } - return names; - } - - public Collection getAuxiliaryObjectClassDefinitions() { - return auxiliaryObjectClassDefinitions; - } - - public boolean hasAuxiliaryObjectClass(QName expectedObjectClassName) { - if (getAuxiliaryObjectClassDefinitions() == null) { - return false; - } - for (RefinedObjectClassDefinition auxiliaryObjectClassDefinition: getAuxiliaryObjectClassDefinitions()) { - if (QNameUtil.match(auxiliaryObjectClassDefinition.getTypeName(), expectedObjectClassName)) { - return true; - } - } - return false; - } - - public Collection getProtectedObjectPatterns() { - if (protectedObjectPatterns == null) { - protectedObjectPatterns = new ArrayList(); - } - return protectedObjectPatterns; - } - - public PrismContext getPrismContext() { - return getResourceType().asPrismObject().getPrismContext(); - } - - @Override - public RefinedObjectClassDefinition clone() { - RefinedObjectClassDefinition clone = new RefinedObjectClassDefinition(getPrismContext(), resourceType, objectClassDefinition); - copyDefinitionData(clone); - return clone; - } - - private void copyDefinitionData(RefinedObjectClassDefinition clone) { - super.copyDefinitionData(clone); - clone.intent = this.intent; - clone.kind = this.kind; - clone.attributeDefinitions = cloneDefinitions(this.attributeDefinitions); - clone.identifiers = cloneDefinitions(this.identifiers); - clone.secondaryIdentifiers = cloneDefinitions(this.secondaryIdentifiers); - clone.associations = cloneAssociations(this.associations); - clone.baseContext = this.baseContext; - clone.description = this.description; - clone.displayName = this.displayName; - clone.isDefault = this.isDefault; - clone.objectClassDefinition = this.objectClassDefinition.clone(); - clone.objectDefinition = this.objectDefinition; - clone.resourceType = this.resourceType; - clone.protectedObjectPatterns = this.protectedObjectPatterns; - clone.resourceType = this.resourceType; - clone.schemaHandlingObjectTypeDefinitionType = this.schemaHandlingObjectTypeDefinitionType; - } - - private Collection cloneAssociations( - Collection origAsoc) { - if (origAsoc == null) { - return null; - } - Collection cloned = new ArrayList<>(); - for (RefinedAssociationDefinition rAsocDef: origAsoc) { - cloned.add(rAsocDef.clone()); - } - return cloned; - } - - private List> cloneDefinitions(Collection> origDefs) { - if (origDefs == null) { - return null; - } - List> clonedAttributes = new ArrayList<>(); - for (RefinedAttributeDefinition attributeDefinition: origDefs) { - clonedAttributes.add(attributeDefinition.clone()); - } - return clonedAttributes; - } + Collection> getPrimaryIdentifiers(); @Override - public RefinedAttributeDefinition findAttributeDefinition(QName elementQName) { - return findItemDefinition(elementQName, RefinedAttributeDefinition.class); - } - - @Override - public RefinedAttributeDefinition findAttributeDefinition(String elementLocalname) { - QName elementQName = new QName(getResourceNamespace(), elementLocalname); - return findAttributeDefinition(elementQName); - } - - protected String getResourceNamespace() { - return ResourceTypeUtil.getResourceNamespace(getResourceType()); - } + Collection> getSecondaryIdentifiers(); @Override - public String getDisplayName() { - return displayName; - } - - @Override - public void setDisplayName(String displayName) { - this.displayName = displayName; - } - - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - - public boolean isDefault() { - return isDefault; - } - - public void setDefault(boolean isDefault) { - this.isDefault = isDefault; - } + Collection> getAllIdentifiers(); - public ObjectClassComplexTypeDefinition getObjectClassDefinition() { - return objectClassDefinition; - } - - public void setObjectClassDefinition(ObjectClassComplexTypeDefinition objectClassDefinition) { - Validate.notNull(objectClassDefinition, "ObjectClass definition must not be null"); - this.objectClassDefinition = objectClassDefinition; - } - - @Override - public Collection> getAttributeDefinitions() { - return attributeDefinitions; - } - @Override - public List getDefinitions() { - return (List) getAttributeDefinitions(); - } - - public ResourceType getResourceType() { - return resourceType; - } - - public PrismObjectDefinition getObjectDefinition() { - if (objectDefinition == null) { - constructObjectDefinition(); - } - return objectDefinition; - } - - public ResourceObjectReferenceType getBaseContext() { - return baseContext; - } - - public void setBaseContext(ResourceObjectReferenceType baseContext) { - this.baseContext = baseContext; - } - - private void constructObjectDefinition() { - // Almost-shallow clone of object definition and complex type - PrismObjectDefinition originalObjectDefinition = - getSchemaRegistry().findObjectDefinitionByCompileTimeClass(ShadowType.class); - PrismObjectDefinition refinedObjectDef = - originalObjectDefinition.cloneWithReplacedDefinition(ShadowType.F_ATTRIBUTES, - this.toResourceAttributeContainerDefinition()); - this.objectDefinition = refinedObjectDef; - } + RefinedAttributeDefinition findAttributeDefinition(QName elementQName); - public RefinedAttributeDefinition getAttributeDefinition(QName attributeName) { - for (RefinedAttributeDefinition attrDef : getAttributeDefinitions()) { - if (QNameUtil.match(attrDef.getName(), attributeName)) { - return attrDef; - } - } - return null; - } - - - public void add(RefinedAttributeDefinition refinedAttributeDefinition) { - ((Collection)getAttributeDefinitions()).add(refinedAttributeDefinition); - } - - public boolean containsAttributeDefinition(ItemPathType pathType) { - QName segmentQName = ItemPathUtil.getOnlySegmentQName(pathType); - return containsAttributeDefinition(segmentQName); - } - - public boolean containsAttributeDefinition(QName attributeName) { - for (RefinedAttributeDefinition rAttributeDef : getAttributeDefinitions()) { - if (QNameUtil.match(rAttributeDef.getName(), attributeName)) { - return true; - } - } - return false; - } - - static RefinedObjectClassDefinition parse(ResourceObjectTypeDefinitionType entTypeDefType, - ResourceType resourceType, RefinedResourceSchema rSchema, ShadowKindType impliedKind, PrismContext prismContext, - String contextDescription) throws SchemaException { - - ShadowKindType kind = entTypeDefType.getKind(); - if (kind == null) { - kind = impliedKind; - } - if (kind == null) { - kind = ShadowKindType.ACCOUNT; - } - String intent = entTypeDefType.getIntent(); - if (intent == null) { - intent = SchemaConstants.INTENT_DEFAULT; - } - RefinedObjectClassDefinition rObjectClassDef = parseRefinedObjectClass(entTypeDefType, - resourceType, rSchema, prismContext, kind, intent, kind.value(), kind.value() + " type definition '"+intent+"' in " + contextDescription); - - if (entTypeDefType.getPagedSearches() != null) { - LOGGER.warn("PagedSearches element is no more supported and is ignored. Use PagedSearchCapabilityType instead. In {}", resourceType); - } - return rObjectClassDef; - } - - private static void parseProtected(RefinedObjectClassDefinition rAccountDef, ResourceObjectTypeDefinitionType accountTypeDefType) throws SchemaException { - for (ResourceObjectPatternType protectedType: accountTypeDefType.getProtected()) { - ResourceObjectPattern protectedPattern = convertToPattern(protectedType, rAccountDef); - rAccountDef.getProtectedObjectPatterns().add(protectedPattern); - } - } - - private static ResourceObjectPattern convertToPattern(ResourceObjectPatternType patternType, RefinedObjectClassDefinition rAccountDef) throws SchemaException { - ResourceObjectPattern resourceObjectPattern = new ResourceObjectPattern(rAccountDef); - SearchFilterType filterType = patternType.getFilter(); - if (filterType != null) { - ObjectFilter filter = QueryConvertor.parseFilter(filterType, rAccountDef.getObjectDefinition()); - resourceObjectPattern.addFilter(filter); - return resourceObjectPattern; - } - - // Deprecated - if (patternType.getName() != null) { - RefinedAttributeDefinition attributeDefinition = rAccountDef.findAttributeDefinition(new QName(SchemaConstants.NS_ICF_SCHEMA,"name")); - if (attributeDefinition == null) { - throw new SchemaException("No ICF NAME attribute in schema as specified in the definition of protected objects (this is deprecated syntax anyway, convert it to filter)"); - } - ResourceAttribute attr = attributeDefinition.instantiate(); - attr.setRealValue(patternType.getName()); - resourceObjectPattern.addIdentifier(attr); - } else if (patternType.getUid() != null) { - RefinedAttributeDefinition attributeDefinition = rAccountDef.findAttributeDefinition(new QName(SchemaConstants.NS_ICF_SCHEMA,"uid")); - if (attributeDefinition == null) { - throw new SchemaException("No ICF UID attribute in schema as specified in the definition of protected objects (this is deprecated syntax anyway, convert it to filter)"); - } - ResourceAttribute attr = attributeDefinition.instantiate(); - attr.setRealValue(patternType.getUid()); - resourceObjectPattern.addIdentifier(attr); - } else { - throw new SchemaException("No filter and no deprecated name/uid in resource object pattern"); - } - return resourceObjectPattern; - } - - public static RefinedObjectClassDefinition parseFromSchema(ObjectClassComplexTypeDefinition objectClassDef, ResourceType resourceType, - RefinedResourceSchema rSchema, - PrismContext prismContext, String contextDescription) throws SchemaException { - - RefinedObjectClassDefinition rOcDef = new RefinedObjectClassDefinition(prismContext, resourceType, objectClassDef); - - String intent = objectClassDef.getIntent(); - if (intent == null && objectClassDef.isDefaultInAKind()) { - intent = SchemaConstants.INTENT_DEFAULT; - } - rOcDef.setIntent(intent); - - if (objectClassDef.getDisplayName() != null) { - rOcDef.setDisplayName(objectClassDef.getDisplayName()); - } - - rOcDef.setDefault(objectClassDef.isDefaultInAKind()); - - for (ResourceAttributeDefinition attrDef : objectClassDef.getAttributeDefinitions()) { - String attrContextDescription = intent + ", in " + contextDescription; - - RefinedAttributeDefinition rAttrDef = RefinedAttributeDefinition.parse(attrDef, null, objectClassDef, prismContext, - attrContextDescription); - rOcDef.processIdentifiers(rAttrDef, objectClassDef); - - if (rOcDef.containsAttributeDefinition(rAttrDef.getName())) { - throw new SchemaException("Duplicate definition of attribute " + rAttrDef.getName() + " in " + attrContextDescription); - } - rOcDef.add(rAttrDef); - - } - - return rOcDef; - - } - - private static RefinedObjectClassDefinition parseRefinedObjectClass(ResourceObjectTypeDefinitionType schemaHandlingObjDefType, - ResourceType resourceType, RefinedResourceSchema rSchema, PrismContext prismContext, - @NotNull ShadowKindType kind, @NotNull String intent, String typeDesc, String contextDescription) throws SchemaException { - - ObjectClassComplexTypeDefinition objectClassDef; - if (schemaHandlingObjDefType.getObjectClass() != null) { - QName objectClass = schemaHandlingObjDefType.getObjectClass(); - objectClassDef = rSchema.getOriginalResourceSchema().findObjectClassDefinition(objectClass); - if (objectClassDef == null) { - throw new SchemaException("Object class " + objectClass + " as specified in "+typeDesc+" type " + schemaHandlingObjDefType.getIntent() + " was not found in the resource schema of " + contextDescription); - } - } else { - throw new SchemaException("Definition of "+typeDesc+" type " + schemaHandlingObjDefType.getIntent() + " does not have objectclass, in " + contextDescription); - } - - RefinedObjectClassDefinition rOcDef = new RefinedObjectClassDefinition(prismContext, resourceType, objectClassDef); - rOcDef.setKind(kind); - rOcDef.schemaHandlingObjectTypeDefinitionType = schemaHandlingObjDefType; - rOcDef.setIntent(intent); - - if (schemaHandlingObjDefType.getDisplayName() != null) { - rOcDef.setDisplayName(schemaHandlingObjDefType.getDisplayName()); - } else { - if (objectClassDef.getDisplayName() != null) { - rOcDef.setDisplayName(objectClassDef.getDisplayName()); - } - } - - if (schemaHandlingObjDefType.getDescription() != null) { - rOcDef.setDescription(schemaHandlingObjDefType.getDescription()); - } - - if (schemaHandlingObjDefType.isDefault() != null) { - rOcDef.setDefault(schemaHandlingObjDefType.isDefault()); - } else { - rOcDef.setDefault(objectClassDef.isDefaultInAKind()); - } - - if (schemaHandlingObjDefType.getBaseContext() != null) { - rOcDef.setBaseContext(schemaHandlingObjDefType.getBaseContext()); - } - - return rOcDef; - } + @Override + RefinedAttributeDefinition findAttributeDefinition(String elementLocalname); - public void parseAssociations(RefinedResourceSchema rSchema) throws SchemaException { - if (schemaHandlingObjectTypeDefinitionType == null) { - return; - } - for (ResourceObjectAssociationType resourceObjectAssociationType: schemaHandlingObjectTypeDefinitionType.getAssociation()) { - RefinedAssociationDefinition rAssocDef = new RefinedAssociationDefinition(resourceObjectAssociationType); - ShadowKindType assocKind = rAssocDef.getKind(); - RefinedObjectClassDefinition assocTarget = rSchema.getRefinedDefinition(assocKind, rAssocDef.getIntents()); - rAssocDef.setAssociationTarget(assocTarget); - associations.add(rAssocDef); - } - } - - public void parseAuxiliaryObjectClasses(RefinedResourceSchema rSchema) throws SchemaException { - if (schemaHandlingObjectTypeDefinitionType == null) { - return; - } - List auxiliaryObjectClassQNames = schemaHandlingObjectTypeDefinitionType.getAuxiliaryObjectClass(); - auxiliaryObjectClassDefinitions = new ArrayList<>(auxiliaryObjectClassQNames.size()); - for (QName auxiliaryObjectClassQName: auxiliaryObjectClassQNames) { - RefinedObjectClassDefinition auxiliaryObjectClassDef = rSchema.getRefinedDefinition(auxiliaryObjectClassQName); - if (auxiliaryObjectClassDef == null) { - throw new SchemaException("Auxiliary object class "+auxiliaryObjectClassQName+" specified in "+this+" does not exist"); - } - auxiliaryObjectClassDefinitions.add(auxiliaryObjectClassDef); - } - } + String getResourceNamespace(); - public void parseAttributes(RefinedResourceSchema rSchema, String contextDescription) throws SchemaException { - if (schemaHandlingObjectTypeDefinitionType == null) { - // this is definition from schema. We already have all we need. - return; - } - - parseAttributesFrom(rSchema, getObjectClassDefinition(), false, contextDescription); - if (auxiliaryObjectClassDefinitions != null) { - for (RefinedObjectClassDefinition auxiliaryObjectClassDefinition: auxiliaryObjectClassDefinitions) { - parseAttributesFrom(rSchema, auxiliaryObjectClassDefinition, true, contextDescription); - } - } + String getDescription(); - // Check for extra attribute definitions in the account type - for (ResourceAttributeDefinitionType attrDefType : schemaHandlingObjectTypeDefinitionType.getAttribute()) { - if (!containsAttributeDefinition(attrDefType.getRef()) && !RefinedAttributeDefinition.isIgnored(attrDefType)) { - throw new SchemaException("Definition of attribute " + attrDefType.getRef() + " not found in object class " + objectClassDefinition.getTypeName() + " as defined in " + contextDescription); - } - } - - parseProtected(this, schemaHandlingObjectTypeDefinitionType); - } - - public void parseAttributesFrom(RefinedResourceSchema rSchema, ObjectClassComplexTypeDefinition ocDef, boolean auxiliary, String contextDescription) throws SchemaException { - if (schemaHandlingObjectTypeDefinitionType == null) { - // this is definition from schema. We already have all we need. - return; - } - for (ResourceAttributeDefinition road : ocDef.getAttributeDefinitions()) { - String attrContextDescription = road.getName() + ", in " + contextDescription; - ResourceAttributeDefinitionType attrDefType = findAttributeDefinitionType(road.getName(), schemaHandlingObjectTypeDefinitionType, - attrContextDescription); - // We MUST NOT skip ignored attribute definitions here. We must include them in the schema as - // the shadows will still have that attributes and we will need their type definition to work - // well with them. They may also be mandatory. We cannot pretend that they do not exist. + boolean isDefault(); - RefinedAttributeDefinition rAttrDef = RefinedAttributeDefinition.parse(road, attrDefType, ocDef, - prismContext, "in "+kind+" type " + intent + ", in " + contextDescription); - if (!auxiliary) { - processIdentifiers(rAttrDef, ocDef); - } + ObjectClassComplexTypeDefinition getObjectClassDefinition(); - if (containsAttributeDefinition(rAttrDef.getName())) { - if (auxiliary) { - continue; - } else { - throw new SchemaException("Duplicate definition of attribute " + rAttrDef.getName() + " in "+kind+" type " + - intent + ", in " + contextDescription); - } - } - add(rAttrDef); - - if (rAttrDef.isDisplayNameAttribute()) { - displayNameAttributeDefinition = rAttrDef; - } + ResourceType getResourceType(); - } + PrismObjectDefinition getObjectDefinition(); - - } + ResourceObjectReferenceType getBaseContext(); - private void processIdentifiers(RefinedAttributeDefinition rAttrDef, ObjectClassComplexTypeDefinition objectClassDef) { - QName attrName = rAttrDef.getName(); - if (objectClassDef.isPrimaryIdentifier(attrName)) { - ((Collection)getPrimaryIdentifiers()).add(rAttrDef); - } - if (objectClassDef.isSecondaryIdentifier(attrName) || rAttrDef.isSecondaryIdentifier()) { - ((Collection)getSecondaryIdentifiers()).add(rAttrDef); - } - } - - private RefinedAttributeDefinition substituteRefinedAttributeDefinition(ResourceAttributeDefinition attributeDef) { - RefinedAttributeDefinition rAttrDef = findAttributeDefinition(attributeDef.getName()); - return rAttrDef; - } + RefinedAttributeDefinition getAttributeDefinition(QName attributeName); - private ResourceAttributeDefinitionType findAttributeDefinitionType(QName attrName, - ResourceObjectTypeDefinitionType rOcDefType, String contextDescription) throws SchemaException { - ResourceAttributeDefinitionType foundAttrDefType = null; - for (ResourceAttributeDefinitionType attrDefType : rOcDefType.getAttribute()) { - if (attrDefType.getRef() != null) { - QName ref = ItemPathUtil.getOnlySegmentQName(attrDefType.getRef()); - if (QNameUtil.match(ref, attrName)) { - if (foundAttrDefType == null) { - foundAttrDefType = attrDefType; - } else { - throw new SchemaException("Duplicate definition of attribute " + ref + " in "+kind+" type " - + rOcDefType.getIntent() + ", in " + contextDescription); - } - } - } else { - throw new SchemaException("Missing reference to the attribute schema definition in definition " + SchemaDebugUtil.prettyPrint(attrDefType) + " during processing of " + contextDescription); - } - } - return foundAttrDefType; - } + @Override + Collection> getAttributeDefinitions(); - + boolean containsAttributeDefinition(ItemPathType pathType); - public PrismObject createBlankShadow() { - PrismObject accountShadow; - try { - accountShadow = prismContext.getSchemaRegistry().instantiate(ShadowType.class); - } catch (SchemaException e) { - // This should not happen - throw new SystemException("Internal error instantiating account shadow: "+e.getMessage(), e); - } - ShadowType accountShadowType = accountShadow.asObjectable(); - - accountShadowType.setIntent(getIntent()); - accountShadowType.setKind(getKind()); - accountShadowType.setObjectClass(getObjectClassDefinition().getTypeName()); - accountShadowType.setResourceRef(ObjectTypeUtil.createObjectRef(getResourceType())); - - // Setup definition - PrismObjectDefinition newDefinition = accountShadow.getDefinition().cloneWithReplacedDefinition( - ShadowType.F_ATTRIBUTES, toResourceAttributeContainerDefinition()); - accountShadow.setDefinition(newDefinition); - - return accountShadow; - } + boolean containsAttributeDefinition(QName attributeName); - public ResourceShadowDiscriminator getShadowDiscriminator() { - return new ResourceShadowDiscriminator(getResourceType().getOid(), getKind(), getIntent()); - } + PrismObject createBlankShadow(); - public Collection getNamesOfAttributesWithOutboundExpressions() { - Collection attrNames = new HashSet(); - for (RefinedAttributeDefinition attrDef : getAttributeDefinitions()) { - if (attrDef.getOutboundMappingType() != null) { - attrNames.add(attrDef.getName()); - } - } - return attrNames; - } + ResourceShadowDiscriminator getShadowDiscriminator(); - public Collection getNamesOfAttributesWithInboundExpressions() { - Collection attrNames = new HashSet(); - for (RefinedAttributeDefinition attrDef : getAttributeDefinitions()) { - List inbounds = attrDef.getInboundMappingTypes(); - if (inbounds != null && !inbounds.isEmpty()) { - attrNames.add(attrDef.getName()); - } - } + Collection getNamesOfAttributesWithOutboundExpressions(); - return attrNames; - } - - public List getPasswordInbound() { - - ResourcePasswordDefinitionType password = getPasswordDefinition(); - - if (password == null || password.getInbound() == null) { - return null; - } + Collection getNamesOfAttributesWithInboundExpressions(); - return password.getInbound(); - } - - public MappingType getPasswordOutbound() { + List getPasswordInbound(); - ResourcePasswordDefinitionType password = getPasswordDefinition(); + MappingType getPasswordOutbound(); - if (password == null || password.getOutbound() == null) { - return null; - } + AttributeFetchStrategyType getPasswordFetchStrategy(); - return password.getOutbound(); - } - - public AttributeFetchStrategyType getPasswordFetchStrategy() { - ResourcePasswordDefinitionType password = getPasswordDefinition(); - if (password == null) { - return AttributeFetchStrategyType.IMPLICIT; - } - if (password.getFetchStrategy() == null) { - return AttributeFetchStrategyType.IMPLICIT; - } - return password.getFetchStrategy(); - } - - public ObjectReferenceType getPasswordPolicy(){ - ResourcePasswordDefinitionType password = getPasswordDefinition(); - - if (password == null || password.getPasswordPolicyRef() == null){ - return null; - } - - return password.getPasswordPolicyRef(); - } - - public ResourcePasswordDefinitionType getPasswordDefinition(){ - if (schemaHandlingObjectTypeDefinitionType == null) { - return null; - } - ResourceCredentialsDefinitionType credentials = schemaHandlingObjectTypeDefinitionType.getCredentials(); - if (credentials == null) { - return null; - } - - return credentials.getPassword(); - } - - public ResourceActivationDefinitionType getActivationSchemaHandling(){ - if (schemaHandlingObjectTypeDefinitionType == null) { - return null; - } + ObjectReferenceType getPasswordPolicy(); - return schemaHandlingObjectTypeDefinitionType.getActivation(); - } - - public ResourceBidirectionalMappingType getActivationBidirectionalMappingType(QName propertyName) { - ResourceActivationDefinitionType activationSchemaHandling = getActivationSchemaHandling(); - if (activationSchemaHandling == null) { - return null; - } - - if (QNameUtil.match(ActivationType.F_ADMINISTRATIVE_STATUS, propertyName)) { - return activationSchemaHandling.getAdministrativeStatus(); - } else if (QNameUtil.match(ActivationType.F_VALID_FROM, propertyName)) { - return activationSchemaHandling.getValidFrom(); - } else if (QNameUtil.match(ActivationType.F_VALID_TO, propertyName)) { - return activationSchemaHandling.getValidTo(); - } else if (QNameUtil.match(ActivationType.F_LOCKOUT_STATUS, propertyName)) { - return null; // todo implement this - } else if (QNameUtil.match(ActivationType.F_LOCKOUT_EXPIRATION_TIMESTAMP, propertyName)) { - return null; // todo implement this - } else { - throw new IllegalArgumentException("Unknown activation property "+propertyName); - } - } - - public AttributeFetchStrategyType getActivationFetchStrategy(QName propertyName) { - ResourceBidirectionalMappingType biType = getActivationBidirectionalMappingType(propertyName); - if (biType == null) { - return AttributeFetchStrategyType.IMPLICIT; - } - if (biType.getFetchStrategy() == null) { - return AttributeFetchStrategyType.IMPLICIT; - } - return biType.getFetchStrategy(); - } - - public T getEffectiveCapability(Class capabilityClass) { - return ResourceTypeUtil.getEffectiveCapability(getResourceType(), schemaHandlingObjectTypeDefinitionType, capabilityClass); - } + ResourcePasswordDefinitionType getPasswordDefinition(); - public PagedSearchCapabilityType getPagedSearches() { - return getEffectiveCapability(PagedSearchCapabilityType.class); - } + ResourceActivationDefinitionType getActivationSchemaHandling(); - public boolean isPagedSearchEnabled() { - return getPagedSearches() != null; // null means nothing or disabled - } + ResourceBidirectionalMappingType getActivationBidirectionalMappingType(QName propertyName); - public boolean isObjectCountingEnabled() { - return getEffectiveCapability(CountObjectsCapabilityType.class) != null; - } - - - - public boolean isAuxiliary() { - return getObjectClassDefinition().isAuxiliary(); - } + AttributeFetchStrategyType getActivationFetchStrategy(QName propertyName); - public boolean matches(ShadowType shadowType) { - if (shadowType == null) { - return false; - } - if (!QNameUtil.match(getObjectClassDefinition().getTypeName(), shadowType.getObjectClass())) { - return false; - } - if (shadowType.getKind() == null) { - if (kind != ShadowKindType.ACCOUNT) { - return false; - } - } else { - if (!MiscUtil.equals(kind, shadowType.getKind())) { - return false; - } - } - if (shadowType.getIntent() != null) { -// if (isDefault) { -// return true; -// } else { -// return false; -// } -// } else { - return MiscUtil.equals(intent, shadowType.getIntent()); - } - return true; - } + T getEffectiveCapability(Class capabilityClass); - @Override - public ObjectQuery createShadowSearchQuery(String resourceOid) throws SchemaException { - if (getKind() == null) { - return super.createShadowSearchQuery(resourceOid); - } else { - return ObjectQueryUtil.createResourceAndKindIntent(resourceOid, getKind(), getIntent(), getPrismContext()); - } - } + PagedSearchCapabilityType getPagedSearches(); - @Override - public int hashCode() { - final int prime = 31; - int result = super.hashCode(); - result = prime * result + ((associations == null) ? 0 : associations.hashCode()); - result = prime * result + ((attributeDefinitions == null) ? 0 : attributeDefinitions.hashCode()); - result = prime * result - + ((auxiliaryObjectClassDefinitions == null) ? 0 : auxiliaryObjectClassDefinitions.hashCode()); - result = prime * result + ((baseContext == null) ? 0 : baseContext.hashCode()); - result = prime * result + ((description == null) ? 0 : description.hashCode()); - result = prime * result + ((displayName == null) ? 0 : displayName.hashCode()); - result = prime * result - + ((displayNameAttributeDefinition == null) ? 0 : displayNameAttributeDefinition.hashCode()); - result = prime * result + ((identifiers == null) ? 0 : identifiers.hashCode()); - result = prime * result + ((intent == null) ? 0 : intent.hashCode()); - result = prime * result + (isDefault ? 1231 : 1237); - result = prime * result + ((kind == null) ? 0 : kind.hashCode()); - result = prime * result + ((objectClassDefinition == null) ? 0 : objectClassDefinition.hashCode()); - result = prime * result + ((objectDefinition == null) ? 0 : objectDefinition.hashCode()); - result = prime * result + ((protectedObjectPatterns == null) ? 0 : protectedObjectPatterns.hashCode()); - result = prime * result + ((resourceType == null) ? 0 : resourceType.hashCode()); - result = prime * result + ((schemaHandlingObjectTypeDefinitionType == null) ? 0 - : schemaHandlingObjectTypeDefinitionType.hashCode()); - result = prime * result + ((secondaryIdentifiers == null) ? 0 : secondaryIdentifiers.hashCode()); - return result; - } + boolean isPagedSearchEnabled(); - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (!super.equals(obj)) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - RefinedObjectClassDefinition other = (RefinedObjectClassDefinition) obj; - if (associations == null) { - if (other.associations != null) { - return false; - } - } else if (!associations.equals(other.associations)) { - return false; - } - if (attributeDefinitions == null) { - if (other.attributeDefinitions != null) { - return false; - } - } else if (!attributeDefinitions.equals(other.attributeDefinitions)) { - return false; - } - if (auxiliaryObjectClassDefinitions == null) { - if (other.auxiliaryObjectClassDefinitions != null) { - return false; - } - } else if (!auxiliaryObjectClassDefinitions.equals(other.auxiliaryObjectClassDefinitions)) { - return false; - } - if (baseContext == null) { - if (other.baseContext != null) { - return false; - } - } else if (!baseContext.equals(other.baseContext)) { - return false; - } - if (description == null) { - if (other.description != null) { - return false; - } - } else if (!description.equals(other.description)) { - return false; - } - if (displayName == null) { - if (other.displayName != null) { - return false; - } - } else if (!displayName.equals(other.displayName)) { - return false; - } - if (displayNameAttributeDefinition == null) { - if (other.displayNameAttributeDefinition != null) { - return false; - } - } else if (!displayNameAttributeDefinition.equals(other.displayNameAttributeDefinition)) { - return false; - } - if (identifiers == null) { - if (other.identifiers != null) { - return false; - } - } else if (!identifiers.equals(other.identifiers)) { - return false; - } - if (intent == null) { - if (other.intent != null) { - return false; - } - } else if (!intent.equals(other.intent)) { - return false; - } - if (isDefault != other.isDefault) { - return false; - } - if (kind != other.kind) { - return false; - } - if (objectClassDefinition == null) { - if (other.objectClassDefinition != null) { - return false; - } - } else if (!objectClassDefinition.equals(other.objectClassDefinition)) { - return false; - } - if (objectDefinition == null) { - if (other.objectDefinition != null) { - return false; - } - } else if (!objectDefinition.equals(other.objectDefinition)) { - return false; - } - if (protectedObjectPatterns == null) { - if (other.protectedObjectPatterns != null) { - return false; - } - } else if (!protectedObjectPatterns.equals(other.protectedObjectPatterns)) { - return false; - } - if (resourceType == null) { - if (other.resourceType != null) { - return false; - } - } else if (!resourceType.equals(other.resourceType)) { - return false; - } - if (schemaHandlingObjectTypeDefinitionType == null) { - if (other.schemaHandlingObjectTypeDefinitionType != null) { - return false; - } - } else if (!schemaHandlingObjectTypeDefinitionType.equals(other.schemaHandlingObjectTypeDefinitionType)) { - return false; - } - if (secondaryIdentifiers == null) { - if (other.secondaryIdentifiers != null) { - return false; - } - } else if (!secondaryIdentifiers.equals(other.secondaryIdentifiers)) { - return false; - } - return true; - } + boolean isObjectCountingEnabled(); - @Override - public String debugDump() { - return debugDump(0); - } - - @Override - public String debugDump(int indent) { - return debugDump(indent, null); - } + boolean matches(ShadowType shadowType); - protected String debugDump(int indent, LayerType layer) { - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < indent; i++) { - sb.append(INDENT_STRING); - } - sb.append(getDebugDumpClassName()).append("("); - sb.append(SchemaDebugUtil.prettyPrint(getTypeName())); - if (isDefault()) { - sb.append(",default"); - } - if (getKind() != null) { - sb.append(" ").append(getKind().value()); - } - sb.append(","); - if (getIntent() != null) { - sb.append("intent=").append(getIntent()); - } - if (layer != null) { - sb.append(",layer=").append(layer); - } - sb.append(")"); - for (RefinedAttributeDefinition rAttrDef: getAttributeDefinitions()) { - sb.append("\n"); - sb.append(rAttrDef.debugDump(indent + 1, layer)); - } - return sb.toString(); - } - - /** - * Return a human readable name of this class suitable for logs. - */ - @Override - protected String getDebugDumpClassName() { - return "rOCD"; - } + String getHumanReadableName(); - public String getHumanReadableName() { - if (getDisplayName() != null) { - return getDisplayName(); - } else if (getKind() != null) { - return getKind()+":"+getIntent(); - } else if (getTypeName() != null) { - return getTypeName().getLocalPart(); - } else { - return "null"; - } - } - @Override - public String toString() { - if (getKind() == null) { - return getDebugDumpClassName() + "("+PrettyPrinter.prettyPrint(getTypeName())+")"; - } else { - return getDebugDumpClassName() + "("+getKind()+":"+getIntent()+"="+PrettyPrinter.prettyPrint(getTypeName())+")"; - } - } - + RefinedObjectClassDefinition clone(); } diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedObjectClassDefinitionImpl.java b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedObjectClassDefinitionImpl.java new file mode 100644 index 00000000000..1b29be35654 --- /dev/null +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedObjectClassDefinitionImpl.java @@ -0,0 +1,1203 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.common.refinery; + +import com.evolveum.midpoint.common.ResourceObjectPattern; +import com.evolveum.midpoint.prism.ItemDefinition; +import com.evolveum.midpoint.prism.PrismContext; +import com.evolveum.midpoint.prism.PrismObject; +import com.evolveum.midpoint.prism.PrismObjectDefinition; +import com.evolveum.midpoint.prism.marshaller.QueryConvertor; +import com.evolveum.midpoint.prism.query.ObjectFilter; +import com.evolveum.midpoint.prism.query.ObjectQuery; +import com.evolveum.midpoint.prism.util.ItemPathUtil; +import com.evolveum.midpoint.schema.ResourceShadowDiscriminator; +import com.evolveum.midpoint.schema.constants.SchemaConstants; +import com.evolveum.midpoint.schema.processor.*; +import com.evolveum.midpoint.schema.util.ResourceTypeUtil; +import com.evolveum.midpoint.schema.util.SchemaDebugUtil; +import com.evolveum.midpoint.schema.util.ObjectQueryUtil; +import com.evolveum.midpoint.schema.util.ObjectTypeUtil; +import com.evolveum.midpoint.util.DebugDumpable; +import com.evolveum.midpoint.util.MiscUtil; +import com.evolveum.midpoint.util.PrettyPrinter; +import com.evolveum.midpoint.util.QNameUtil; +import com.evolveum.midpoint.util.exception.SchemaException; +import com.evolveum.midpoint.util.exception.SystemException; +import com.evolveum.midpoint.util.logging.Trace; +import com.evolveum.midpoint.util.logging.TraceManager; +import com.evolveum.midpoint.xml.ns._public.common.common_3.*; +import com.evolveum.midpoint.xml.ns._public.resource.capabilities_3.CapabilityType; +import com.evolveum.midpoint.xml.ns._public.resource.capabilities_3.CountObjectsCapabilityType; +import com.evolveum.midpoint.xml.ns._public.resource.capabilities_3.PagedSearchCapabilityType; +import com.evolveum.prism.xml.ns._public.query_3.SearchFilterType; +import com.evolveum.prism.xml.ns._public.types_3.ItemPathType; + +import javax.xml.namespace.QName; + +import org.apache.commons.lang.Validate; +import org.jetbrains.annotations.NotNull; + +import java.util.*; + +/** + * @author semancik + */ +public class RefinedObjectClassDefinitionImpl extends ObjectClassComplexTypeDefinitionImpl implements + RefinedObjectClassDefinition { + + private static final Trace LOGGER = TraceManager.getTrace(RefinedObjectClassDefinition.class); + + private String intent; + private String displayName; + private String description; + private boolean isDefault; + private ObjectClassComplexTypeDefinition objectClassDefinition; + private ResourceObjectTypeDefinitionType schemaHandlingObjectTypeDefinitionType; + private ResourceType resourceType; + private Collection> identifiers; + private Collection> secondaryIdentifiers; + private Collection protectedObjectPatterns; + private List> attributeDefinitions; + private Collection associations = new ArrayList(); + private Collection auxiliaryObjectClassDefinitions; + private ResourceObjectReferenceType baseContext; + private RefinedAttributeDefinition displayNameAttributeDefinition; + + /** + * Refined object definition. The "any" parts are replaced with appropriate schema (e.g. resource schema) + */ + PrismObjectDefinition objectDefinition = null; + private ShadowKindType kind = null; + + /** + * This is needed by the LayerRefinedObjectClassDefinition class + */ + protected RefinedObjectClassDefinitionImpl(QName typeName, PrismContext prismContext) { + super(typeName, prismContext); + } + + private RefinedObjectClassDefinitionImpl(PrismContext prismContext, ResourceType resourceType, + ObjectClassComplexTypeDefinition objectClassDefinition) { + super(objectClassDefinition.getTypeName(), prismContext); + Validate.notNull(objectClassDefinition, "ObjectClass definition must not be null"); + attributeDefinitions = new ArrayList<>(); + this.resourceType = resourceType; + this.objectClassDefinition = objectClassDefinition; + } + + /** + * Creates a derived version of this ROCD for a given layer. + * TODO clone if necessary/if specified (currently there is no cloning) + * + * @param layerType + * @return + */ + @Override + public LayerRefinedObjectClassDefinition forLayer(LayerType layerType) { + Validate.notNull(layerType); + return LayerRefinedObjectClassDefinitionImpl.wrap(this, layerType); + } + + @Override + public ResourceAttributeDefinition getDescriptionAttribute() { + return getObjectClassDefinition().getDescriptionAttribute(); + } + + @Override + public void setDescriptionAttribute(ResourceAttributeDefinition descriptionAttribute) { + throw new UnsupportedOperationException("Parts of refined account are immutable"); + } + + @Override + public RefinedAttributeDefinition getNamingAttribute() { + return substituteRefinedAttributeDefinition(getObjectClassDefinition().getNamingAttribute()); + } + + @NotNull + @Override + public QName getTypeName() { + return getObjectClassDefinition().getTypeName(); + } + + @Override + public String getNativeObjectClass() { + return getObjectClassDefinition().getNativeObjectClass(); + } + + @Override + public boolean isDefaultInAKind() { + return isDefault; + } + + @Override + public void setDefaultInAKind(boolean defaultAccountType) { + this.isDefault = defaultAccountType; + } + + @Override + public String getIntent() { + return intent; + } + + @Override + public void setIntent(String intent) { + this.intent = intent; + } + + @Override + public ShadowKindType getKind() { + if (kind != null) { + return kind; + } + return getObjectClassDefinition().getKind(); + } + + @Override + public void setKind(ShadowKindType kind) { + this.kind = kind; + } + + @Override + public RefinedAttributeDefinition getDisplayNameAttribute() { + if (displayNameAttributeDefinition == null) { + ResourceAttributeDefinition displayNameAttribute = getObjectClassDefinition().getDisplayNameAttribute(); + if (displayNameAttribute == null) { + return null; + } + displayNameAttributeDefinition = substituteRefinedAttributeDefinition(displayNameAttribute); + } + return displayNameAttributeDefinition; + } + + @Override + public void setDisplayNameAttribute(QName displayName) { + throw new UnsupportedOperationException("Parts of refined account are immutable"); + } + + @Override + public Collection> getPrimaryIdentifiers() { + if (identifiers == null) { + identifiers = createIdentifiersCollection(); + } + return identifiers; + } + + @Override + public Collection> getSecondaryIdentifiers() { + if (secondaryIdentifiers == null) { + secondaryIdentifiers = createIdentifiersCollection(); + } + return secondaryIdentifiers; + } + + public Collection> getAllIdentifiers() { + Collection> allIdentifiers = new ArrayList<>(); + if (identifiers != null) { + allIdentifiers.addAll((Collection)getPrimaryIdentifiers()); + } + if (secondaryIdentifiers != null) { + allIdentifiers.addAll((Collection)getSecondaryIdentifiers()); + } + return allIdentifiers; + } + + private Collection> createIdentifiersCollection() { + return new ArrayList<>(); + } + + @Override + public Collection getAssociations() { + return associations; + } + + @Override + public Collection getAssociations(ShadowKindType kind) { + Collection retAssoc = new ArrayList(); + for (RefinedAssociationDefinition association: associations) { + if (kind == association.getKind()) { + retAssoc.add(association); + } + } + return retAssoc; + } + + @Override + public RefinedAssociationDefinition findAssociation(QName name) { + for (RefinedAssociationDefinition assocType: getAssociations()) { + if (QNameUtil.match(assocType.getName(), name)) { + return assocType; + } + } + return null; + } + + @Override + public Collection getEntitlementAssociations() { + return getAssociations(ShadowKindType.ENTITLEMENT); + } + + @Override + public RefinedAssociationDefinition findEntitlementAssociation(QName name) { + for (RefinedAssociationDefinition assocType: getEntitlementAssociations()) { + if (QNameUtil.match(assocType.getName(), name)) { + return assocType; + } + } + return null; + } + + @Override + public Collection getNamesOfAssociations() { + Collection names = new HashSet(); + for (RefinedAssociationDefinition assocDef : getAssociations()) { + names.add(assocDef.getName()); + } + return names; + } + + @Override + public Collection getNamesOfAssociationsWithOutboundExpressions() { + Collection names = new HashSet(); + for (RefinedAssociationDefinition assocDef : getAssociations()) { + if (assocDef.getOutboundMappingType() != null) { + names.add(assocDef.getName()); + } + } + return names; + } + + @Override + public Collection getAuxiliaryObjectClassDefinitions() { + return auxiliaryObjectClassDefinitions; + } + + @Override + public boolean hasAuxiliaryObjectClass(QName expectedObjectClassName) { + if (getAuxiliaryObjectClassDefinitions() == null) { + return false; + } + for (RefinedObjectClassDefinition auxiliaryObjectClassDefinition: getAuxiliaryObjectClassDefinitions()) { + if (QNameUtil.match(auxiliaryObjectClassDefinition.getTypeName(), expectedObjectClassName)) { + return true; + } + } + return false; + } + + @Override + public Collection getProtectedObjectPatterns() { + if (protectedObjectPatterns == null) { + protectedObjectPatterns = new ArrayList(); + } + return protectedObjectPatterns; + } + + public PrismContext getPrismContext() { + return getResourceType().asPrismObject().getPrismContext(); + } + + @Override + public RefinedObjectClassDefinitionImpl clone() { + RefinedObjectClassDefinitionImpl clone = new RefinedObjectClassDefinitionImpl(getPrismContext(), resourceType, objectClassDefinition); + copyDefinitionData(clone); + return clone; + } + + private void copyDefinitionData(RefinedObjectClassDefinitionImpl clone) { + super.copyDefinitionData(clone); + clone.intent = this.intent; + clone.kind = this.kind; + clone.attributeDefinitions = cloneDefinitions(this.attributeDefinitions); + clone.identifiers = cloneDefinitions(this.identifiers); + clone.secondaryIdentifiers = cloneDefinitions(this.secondaryIdentifiers); + clone.associations = cloneAssociations(this.associations); + clone.baseContext = this.baseContext; + clone.description = this.description; + clone.displayName = this.displayName; + clone.isDefault = this.isDefault; + clone.objectClassDefinition = this.objectClassDefinition.clone(); + clone.objectDefinition = this.objectDefinition; + clone.resourceType = this.resourceType; + clone.protectedObjectPatterns = this.protectedObjectPatterns; + clone.resourceType = this.resourceType; + clone.schemaHandlingObjectTypeDefinitionType = this.schemaHandlingObjectTypeDefinitionType; + } + + private Collection cloneAssociations( + Collection origAsoc) { + if (origAsoc == null) { + return null; + } + Collection cloned = new ArrayList<>(); + for (RefinedAssociationDefinition rAsocDef: origAsoc) { + cloned.add(rAsocDef.clone()); + } + return cloned; + } + + private List> cloneDefinitions(Collection> origDefs) { + if (origDefs == null) { + return null; + } + List> clonedAttributes = new ArrayList<>(); + for (RefinedAttributeDefinition attributeDefinition: origDefs) { + clonedAttributes.add(attributeDefinition.clone()); + } + return clonedAttributes; + } + + @Override + public RefinedAttributeDefinition findAttributeDefinition(QName elementQName) { + return findItemDefinition(elementQName, RefinedAttributeDefinition.class); + } + + @Override + public RefinedAttributeDefinition findAttributeDefinition(String elementLocalname) { + QName elementQName = new QName(getResourceNamespace(), elementLocalname); + return findAttributeDefinition(elementQName); + } + + @Override + public String getResourceNamespace() { + return ResourceTypeUtil.getResourceNamespace(getResourceType()); + } + + @Override + public String getDisplayName() { + return displayName; + } + + @Override + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + + @Override + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + @Override + public boolean isDefault() { + return isDefault; + } + + public void setDefault(boolean isDefault) { + this.isDefault = isDefault; + } + + @Override + public ObjectClassComplexTypeDefinition getObjectClassDefinition() { + return objectClassDefinition; + } + + public void setObjectClassDefinition(ObjectClassComplexTypeDefinition objectClassDefinition) { + Validate.notNull(objectClassDefinition, "ObjectClass definition must not be null"); + this.objectClassDefinition = objectClassDefinition; + } + + @Override + public Collection> getAttributeDefinitions() { + return attributeDefinitions; + } + + @Override + public List getDefinitions() { + return (List) getAttributeDefinitions(); + } + + @Override + public ResourceType getResourceType() { + return resourceType; + } + + @Override + public PrismObjectDefinition getObjectDefinition() { + if (objectDefinition == null) { + constructObjectDefinition(); + } + return objectDefinition; + } + + @Override + public ResourceObjectReferenceType getBaseContext() { + return baseContext; + } + + public void setBaseContext(ResourceObjectReferenceType baseContext) { + this.baseContext = baseContext; + } + + private void constructObjectDefinition() { + // Almost-shallow clone of object definition and complex type + PrismObjectDefinition originalObjectDefinition = + getSchemaRegistry().findObjectDefinitionByCompileTimeClass(ShadowType.class); + PrismObjectDefinition refinedObjectDef = + originalObjectDefinition.cloneWithReplacedDefinition(ShadowType.F_ATTRIBUTES, + this.toResourceAttributeContainerDefinition()); + this.objectDefinition = refinedObjectDef; + } + + @Override + public RefinedAttributeDefinition getAttributeDefinition(QName attributeName) { + for (RefinedAttributeDefinition attrDef : getAttributeDefinitions()) { + if (QNameUtil.match(attrDef.getName(), attributeName)) { + return attrDef; + } + } + return null; + } + + + public void add(RefinedAttributeDefinition refinedAttributeDefinition) { + ((Collection)getAttributeDefinitions()).add(refinedAttributeDefinition); + } + + @Override + public boolean containsAttributeDefinition(ItemPathType pathType) { + QName segmentQName = ItemPathUtil.getOnlySegmentQName(pathType); + return containsAttributeDefinition(segmentQName); + } + + @Override + public boolean containsAttributeDefinition(QName attributeName) { + for (RefinedAttributeDefinition rAttributeDef : getAttributeDefinitions()) { + if (QNameUtil.match(rAttributeDef.getName(), attributeName)) { + return true; + } + } + return false; + } + + static RefinedObjectClassDefinition parse(ResourceObjectTypeDefinitionType entTypeDefType, + ResourceType resourceType, RefinedResourceSchema rSchema, ShadowKindType impliedKind, PrismContext prismContext, + String contextDescription) throws SchemaException { + + ShadowKindType kind = entTypeDefType.getKind(); + if (kind == null) { + kind = impliedKind; + } + if (kind == null) { + kind = ShadowKindType.ACCOUNT; + } + String intent = entTypeDefType.getIntent(); + if (intent == null) { + intent = SchemaConstants.INTENT_DEFAULT; + } + RefinedObjectClassDefinition rObjectClassDef = parseRefinedObjectClass(entTypeDefType, + resourceType, rSchema, prismContext, kind, intent, kind.value(), kind.value() + " type definition '"+intent+"' in " + contextDescription); + + if (entTypeDefType.getPagedSearches() != null) { + LOGGER.warn("PagedSearches element is no more supported and is ignored. Use PagedSearchCapabilityType instead. In {}", resourceType); + } + return rObjectClassDef; + } + + private static void parseProtected(RefinedObjectClassDefinition rAccountDef, ResourceObjectTypeDefinitionType accountTypeDefType) throws SchemaException { + for (ResourceObjectPatternType protectedType: accountTypeDefType.getProtected()) { + ResourceObjectPattern protectedPattern = convertToPattern(protectedType, rAccountDef); + rAccountDef.getProtectedObjectPatterns().add(protectedPattern); + } + } + + private static ResourceObjectPattern convertToPattern(ResourceObjectPatternType patternType, RefinedObjectClassDefinition rAccountDef) throws SchemaException { + ResourceObjectPattern resourceObjectPattern = new ResourceObjectPattern(rAccountDef); + SearchFilterType filterType = patternType.getFilter(); + if (filterType != null) { + ObjectFilter filter = QueryConvertor.parseFilter(filterType, rAccountDef.getObjectDefinition()); + resourceObjectPattern.addFilter(filter); + return resourceObjectPattern; + } + + // Deprecated + if (patternType.getName() != null) { + RefinedAttributeDefinition attributeDefinition = rAccountDef.findAttributeDefinition(new QName(SchemaConstants.NS_ICF_SCHEMA,"name")); + if (attributeDefinition == null) { + throw new SchemaException("No ICF NAME attribute in schema as specified in the definition of protected objects (this is deprecated syntax anyway, convert it to filter)"); + } + ResourceAttribute attr = attributeDefinition.instantiate(); + attr.setRealValue(patternType.getName()); + resourceObjectPattern.addIdentifier(attr); + } else if (patternType.getUid() != null) { + RefinedAttributeDefinition attributeDefinition = rAccountDef.findAttributeDefinition(new QName(SchemaConstants.NS_ICF_SCHEMA,"uid")); + if (attributeDefinition == null) { + throw new SchemaException("No ICF UID attribute in schema as specified in the definition of protected objects (this is deprecated syntax anyway, convert it to filter)"); + } + ResourceAttribute attr = attributeDefinition.instantiate(); + attr.setRealValue(patternType.getUid()); + resourceObjectPattern.addIdentifier(attr); + } else { + throw new SchemaException("No filter and no deprecated name/uid in resource object pattern"); + } + return resourceObjectPattern; + } + + public static RefinedObjectClassDefinition parseFromSchema(ObjectClassComplexTypeDefinition objectClassDef, ResourceType resourceType, + RefinedResourceSchema rSchema, + PrismContext prismContext, String contextDescription) throws SchemaException { + + RefinedObjectClassDefinitionImpl rOcDef = new RefinedObjectClassDefinitionImpl(prismContext, resourceType, objectClassDef); + + String intent = objectClassDef.getIntent(); + if (intent == null && objectClassDef.isDefaultInAKind()) { + intent = SchemaConstants.INTENT_DEFAULT; + } + rOcDef.setIntent(intent); + + if (objectClassDef.getDisplayName() != null) { + rOcDef.setDisplayName(objectClassDef.getDisplayName()); + } + + rOcDef.setDefault(objectClassDef.isDefaultInAKind()); + + for (ResourceAttributeDefinition attrDef : objectClassDef.getAttributeDefinitions()) { + String attrContextDescription = intent + ", in " + contextDescription; + + RefinedAttributeDefinition rAttrDef = RefinedAttributeDefinitionImpl.parse(attrDef, null, objectClassDef, prismContext, + attrContextDescription); + rOcDef.processIdentifiers(rAttrDef, objectClassDef); + + if (rOcDef.containsAttributeDefinition(rAttrDef.getName())) { + throw new SchemaException("Duplicate definition of attribute " + rAttrDef.getName() + " in " + attrContextDescription); + } + rOcDef.add(rAttrDef); + + } + + return rOcDef; + + } + + private static RefinedObjectClassDefinition parseRefinedObjectClass(ResourceObjectTypeDefinitionType schemaHandlingObjDefType, + ResourceType resourceType, RefinedResourceSchema rSchema, PrismContext prismContext, + @NotNull ShadowKindType kind, @NotNull String intent, String typeDesc, String contextDescription) throws SchemaException { + + ObjectClassComplexTypeDefinition objectClassDef; + if (schemaHandlingObjDefType.getObjectClass() != null) { + QName objectClass = schemaHandlingObjDefType.getObjectClass(); + objectClassDef = rSchema.getOriginalResourceSchema().findObjectClassDefinition(objectClass); + if (objectClassDef == null) { + throw new SchemaException("Object class " + objectClass + " as specified in "+typeDesc+" type " + schemaHandlingObjDefType.getIntent() + " was not found in the resource schema of " + contextDescription); + } + } else { + throw new SchemaException("Definition of "+typeDesc+" type " + schemaHandlingObjDefType.getIntent() + " does not have objectclass, in " + contextDescription); + } + + RefinedObjectClassDefinitionImpl rOcDef = new RefinedObjectClassDefinitionImpl(prismContext, resourceType, objectClassDef); + rOcDef.setKind(kind); + rOcDef.schemaHandlingObjectTypeDefinitionType = schemaHandlingObjDefType; + rOcDef.setIntent(intent); + + if (schemaHandlingObjDefType.getDisplayName() != null) { + rOcDef.setDisplayName(schemaHandlingObjDefType.getDisplayName()); + } else { + if (objectClassDef.getDisplayName() != null) { + rOcDef.setDisplayName(objectClassDef.getDisplayName()); + } + } + + if (schemaHandlingObjDefType.getDescription() != null) { + rOcDef.setDescription(schemaHandlingObjDefType.getDescription()); + } + + if (schemaHandlingObjDefType.isDefault() != null) { + rOcDef.setDefault(schemaHandlingObjDefType.isDefault()); + } else { + rOcDef.setDefault(objectClassDef.isDefaultInAKind()); + } + + if (schemaHandlingObjDefType.getBaseContext() != null) { + rOcDef.setBaseContext(schemaHandlingObjDefType.getBaseContext()); + } + + return rOcDef; + } + + public void parseAssociations(RefinedResourceSchema rSchema) throws SchemaException { + if (schemaHandlingObjectTypeDefinitionType == null) { + return; + } + for (ResourceObjectAssociationType resourceObjectAssociationType: schemaHandlingObjectTypeDefinitionType.getAssociation()) { + RefinedAssociationDefinition rAssocDef = new RefinedAssociationDefinition(resourceObjectAssociationType); + ShadowKindType assocKind = rAssocDef.getKind(); + RefinedObjectClassDefinition assocTarget = rSchema.getRefinedDefinition(assocKind, rAssocDef.getIntents()); + rAssocDef.setAssociationTarget(assocTarget); + associations.add(rAssocDef); + } + } + + public void parseAuxiliaryObjectClasses(RefinedResourceSchema rSchema) throws SchemaException { + if (schemaHandlingObjectTypeDefinitionType == null) { + return; + } + List auxiliaryObjectClassQNames = schemaHandlingObjectTypeDefinitionType.getAuxiliaryObjectClass(); + auxiliaryObjectClassDefinitions = new ArrayList<>(auxiliaryObjectClassQNames.size()); + for (QName auxiliaryObjectClassQName: auxiliaryObjectClassQNames) { + RefinedObjectClassDefinition auxiliaryObjectClassDef = rSchema.getRefinedDefinition(auxiliaryObjectClassQName); + if (auxiliaryObjectClassDef == null) { + throw new SchemaException("Auxiliary object class "+auxiliaryObjectClassQName+" specified in "+this+" does not exist"); + } + auxiliaryObjectClassDefinitions.add(auxiliaryObjectClassDef); + } + } + + public void parseAttributes(RefinedResourceSchema rSchema, String contextDescription) throws SchemaException { + if (schemaHandlingObjectTypeDefinitionType == null) { + // this is definition from schema. We already have all we need. + return; + } + + parseAttributesFrom(rSchema, getObjectClassDefinition(), false, contextDescription); + if (auxiliaryObjectClassDefinitions != null) { + for (RefinedObjectClassDefinition auxiliaryObjectClassDefinition: auxiliaryObjectClassDefinitions) { + parseAttributesFrom(rSchema, auxiliaryObjectClassDefinition, true, contextDescription); + } + } + + // Check for extra attribute definitions in the account type + for (ResourceAttributeDefinitionType attrDefType : schemaHandlingObjectTypeDefinitionType.getAttribute()) { + if (!containsAttributeDefinition(attrDefType.getRef()) && !RefinedAttributeDefinitionImpl.isIgnored(attrDefType)) { + throw new SchemaException("Definition of attribute " + attrDefType.getRef() + " not found in object class " + objectClassDefinition.getTypeName() + " as defined in " + contextDescription); + } + } + + parseProtected(this, schemaHandlingObjectTypeDefinitionType); + } + + public void parseAttributesFrom(RefinedResourceSchema rSchema, ObjectClassComplexTypeDefinition ocDef, boolean auxiliary, String contextDescription) throws SchemaException { + if (schemaHandlingObjectTypeDefinitionType == null) { + // this is definition from schema. We already have all we need. + return; + } + for (ResourceAttributeDefinition road : ocDef.getAttributeDefinitions()) { + String attrContextDescription = road.getName() + ", in " + contextDescription; + ResourceAttributeDefinitionType attrDefType = findAttributeDefinitionType(road.getName(), schemaHandlingObjectTypeDefinitionType, + attrContextDescription); + // We MUST NOT skip ignored attribute definitions here. We must include them in the schema as + // the shadows will still have that attributes and we will need their type definition to work + // well with them. They may also be mandatory. We cannot pretend that they do not exist. + + RefinedAttributeDefinition rAttrDef = RefinedAttributeDefinitionImpl.parse(road, attrDefType, ocDef, + prismContext, "in "+kind+" type " + intent + ", in " + contextDescription); + if (!auxiliary) { + processIdentifiers(rAttrDef, ocDef); + } + + if (containsAttributeDefinition(rAttrDef.getName())) { + if (auxiliary) { + continue; + } else { + throw new SchemaException("Duplicate definition of attribute " + rAttrDef.getName() + " in "+kind+" type " + + intent + ", in " + contextDescription); + } + } + add(rAttrDef); + + if (rAttrDef.isDisplayNameAttribute()) { + displayNameAttributeDefinition = rAttrDef; + } + + } + + + } + + private void processIdentifiers(RefinedAttributeDefinition rAttrDef, ObjectClassComplexTypeDefinition objectClassDef) { + QName attrName = rAttrDef.getName(); + if (objectClassDef.isPrimaryIdentifier(attrName)) { + ((Collection)getPrimaryIdentifiers()).add(rAttrDef); + } + if (objectClassDef.isSecondaryIdentifier(attrName) || rAttrDef.isSecondaryIdentifier()) { + ((Collection)getSecondaryIdentifiers()).add(rAttrDef); + } + } + + private RefinedAttributeDefinition substituteRefinedAttributeDefinition(ResourceAttributeDefinition attributeDef) { + RefinedAttributeDefinition rAttrDef = findAttributeDefinition(attributeDef.getName()); + return rAttrDef; + } + + private ResourceAttributeDefinitionType findAttributeDefinitionType(QName attrName, + ResourceObjectTypeDefinitionType rOcDefType, String contextDescription) throws SchemaException { + ResourceAttributeDefinitionType foundAttrDefType = null; + for (ResourceAttributeDefinitionType attrDefType : rOcDefType.getAttribute()) { + if (attrDefType.getRef() != null) { + QName ref = ItemPathUtil.getOnlySegmentQName(attrDefType.getRef()); + if (QNameUtil.match(ref, attrName)) { + if (foundAttrDefType == null) { + foundAttrDefType = attrDefType; + } else { + throw new SchemaException("Duplicate definition of attribute " + ref + " in "+kind+" type " + + rOcDefType.getIntent() + ", in " + contextDescription); + } + } + } else { + throw new SchemaException("Missing reference to the attribute schema definition in definition " + SchemaDebugUtil.prettyPrint(attrDefType) + " during processing of " + contextDescription); + } + } + return foundAttrDefType; + } + + + + @Override + public PrismObject createBlankShadow() { + PrismObject accountShadow; + try { + accountShadow = prismContext.createObject(ShadowType.class); + } catch (SchemaException e) { + // This should not happen + throw new SystemException("Internal error instantiating account shadow: "+e.getMessage(), e); + } + ShadowType accountShadowType = accountShadow.asObjectable(); + + accountShadowType.setIntent(getIntent()); + accountShadowType.setKind(getKind()); + accountShadowType.setObjectClass(getObjectClassDefinition().getTypeName()); + accountShadowType.setResourceRef(ObjectTypeUtil.createObjectRef(getResourceType())); + + // Setup definition + PrismObjectDefinition newDefinition = accountShadow.getDefinition().cloneWithReplacedDefinition( + ShadowType.F_ATTRIBUTES, toResourceAttributeContainerDefinition()); + accountShadow.setDefinition(newDefinition); + + return accountShadow; + } + + @Override + public ResourceShadowDiscriminator getShadowDiscriminator() { + return new ResourceShadowDiscriminator(getResourceType().getOid(), getKind(), getIntent()); + } + + @Override + public Collection getNamesOfAttributesWithOutboundExpressions() { + Collection attrNames = new HashSet(); + for (RefinedAttributeDefinition attrDef : getAttributeDefinitions()) { + if (attrDef.getOutboundMappingType() != null) { + attrNames.add(attrDef.getName()); + } + } + return attrNames; + } + + @Override + public Collection getNamesOfAttributesWithInboundExpressions() { + Collection attrNames = new HashSet(); + for (RefinedAttributeDefinition attrDef : getAttributeDefinitions()) { + List inbounds = attrDef.getInboundMappingTypes(); + if (inbounds != null && !inbounds.isEmpty()) { + attrNames.add(attrDef.getName()); + } + } + + return attrNames; + } + + @Override + public List getPasswordInbound() { + + ResourcePasswordDefinitionType password = getPasswordDefinition(); + + if (password == null || password.getInbound() == null) { + return null; + } + + return password.getInbound(); + } + + @Override + public MappingType getPasswordOutbound() { + + ResourcePasswordDefinitionType password = getPasswordDefinition(); + + if (password == null || password.getOutbound() == null) { + return null; + } + + return password.getOutbound(); + } + + @Override + public AttributeFetchStrategyType getPasswordFetchStrategy() { + ResourcePasswordDefinitionType password = getPasswordDefinition(); + if (password == null) { + return AttributeFetchStrategyType.IMPLICIT; + } + if (password.getFetchStrategy() == null) { + return AttributeFetchStrategyType.IMPLICIT; + } + return password.getFetchStrategy(); + } + + @Override + public ObjectReferenceType getPasswordPolicy(){ + ResourcePasswordDefinitionType password = getPasswordDefinition(); + + if (password == null || password.getPasswordPolicyRef() == null){ + return null; + } + + return password.getPasswordPolicyRef(); + } + + @Override + public ResourcePasswordDefinitionType getPasswordDefinition(){ + if (schemaHandlingObjectTypeDefinitionType == null) { + return null; + } + ResourceCredentialsDefinitionType credentials = schemaHandlingObjectTypeDefinitionType.getCredentials(); + if (credentials == null) { + return null; + } + + return credentials.getPassword(); + } + + @Override + public ResourceActivationDefinitionType getActivationSchemaHandling(){ + if (schemaHandlingObjectTypeDefinitionType == null) { + return null; + } + + return schemaHandlingObjectTypeDefinitionType.getActivation(); + } + + @Override + public ResourceBidirectionalMappingType getActivationBidirectionalMappingType(QName propertyName) { + ResourceActivationDefinitionType activationSchemaHandling = getActivationSchemaHandling(); + if (activationSchemaHandling == null) { + return null; + } + + if (QNameUtil.match(ActivationType.F_ADMINISTRATIVE_STATUS, propertyName)) { + return activationSchemaHandling.getAdministrativeStatus(); + } else if (QNameUtil.match(ActivationType.F_VALID_FROM, propertyName)) { + return activationSchemaHandling.getValidFrom(); + } else if (QNameUtil.match(ActivationType.F_VALID_TO, propertyName)) { + return activationSchemaHandling.getValidTo(); + } else if (QNameUtil.match(ActivationType.F_LOCKOUT_STATUS, propertyName)) { + return null; // todo implement this + } else if (QNameUtil.match(ActivationType.F_LOCKOUT_EXPIRATION_TIMESTAMP, propertyName)) { + return null; // todo implement this + } else { + throw new IllegalArgumentException("Unknown activation property "+propertyName); + } + } + + @Override + public AttributeFetchStrategyType getActivationFetchStrategy(QName propertyName) { + ResourceBidirectionalMappingType biType = getActivationBidirectionalMappingType(propertyName); + if (biType == null) { + return AttributeFetchStrategyType.IMPLICIT; + } + if (biType.getFetchStrategy() == null) { + return AttributeFetchStrategyType.IMPLICIT; + } + return biType.getFetchStrategy(); + } + + @Override + public T getEffectiveCapability(Class capabilityClass) { + return ResourceTypeUtil.getEffectiveCapability(getResourceType(), schemaHandlingObjectTypeDefinitionType, capabilityClass); + } + + @Override + public PagedSearchCapabilityType getPagedSearches() { + return getEffectiveCapability(PagedSearchCapabilityType.class); + } + + @Override + public boolean isPagedSearchEnabled() { + return getPagedSearches() != null; // null means nothing or disabled + } + + @Override + public boolean isObjectCountingEnabled() { + return getEffectiveCapability(CountObjectsCapabilityType.class) != null; + } + + + + public boolean isAuxiliary() { + return getObjectClassDefinition().isAuxiliary(); + } + + @Override + public boolean matches(ShadowType shadowType) { + if (shadowType == null) { + return false; + } + if (!QNameUtil.match(getObjectClassDefinition().getTypeName(), shadowType.getObjectClass())) { + return false; + } + if (shadowType.getKind() == null) { + if (kind != ShadowKindType.ACCOUNT) { + return false; + } + } else { + if (!MiscUtil.equals(kind, shadowType.getKind())) { + return false; + } + } + if (shadowType.getIntent() != null) { +// if (isDefault) { +// return true; +// } else { +// return false; +// } +// } else { + return MiscUtil.equals(intent, shadowType.getIntent()); + } + return true; + } + + @Override + public ObjectQuery createShadowSearchQuery(String resourceOid) throws SchemaException { + if (getKind() == null) { + return super.createShadowSearchQuery(resourceOid); + } else { + return ObjectQueryUtil.createResourceAndKindIntent(resourceOid, getKind(), getIntent(), getPrismContext()); + } + } + + @Override + public int hashCode() { + final int prime = 31; + int result = super.hashCode(); + result = prime * result + ((associations == null) ? 0 : associations.hashCode()); + result = prime * result + ((attributeDefinitions == null) ? 0 : attributeDefinitions.hashCode()); + result = prime * result + + ((auxiliaryObjectClassDefinitions == null) ? 0 : auxiliaryObjectClassDefinitions.hashCode()); + result = prime * result + ((baseContext == null) ? 0 : baseContext.hashCode()); + result = prime * result + ((description == null) ? 0 : description.hashCode()); + result = prime * result + ((displayName == null) ? 0 : displayName.hashCode()); + result = prime * result + + ((displayNameAttributeDefinition == null) ? 0 : displayNameAttributeDefinition.hashCode()); + result = prime * result + ((identifiers == null) ? 0 : identifiers.hashCode()); + result = prime * result + ((intent == null) ? 0 : intent.hashCode()); + result = prime * result + (isDefault ? 1231 : 1237); + result = prime * result + ((kind == null) ? 0 : kind.hashCode()); + result = prime * result + ((objectClassDefinition == null) ? 0 : objectClassDefinition.hashCode()); + result = prime * result + ((objectDefinition == null) ? 0 : objectDefinition.hashCode()); + result = prime * result + ((protectedObjectPatterns == null) ? 0 : protectedObjectPatterns.hashCode()); + result = prime * result + ((resourceType == null) ? 0 : resourceType.hashCode()); + result = prime * result + ((schemaHandlingObjectTypeDefinitionType == null) ? 0 + : schemaHandlingObjectTypeDefinitionType.hashCode()); + result = prime * result + ((secondaryIdentifiers == null) ? 0 : secondaryIdentifiers.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (!super.equals(obj)) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + RefinedObjectClassDefinitionImpl other = (RefinedObjectClassDefinitionImpl) obj; + if (associations == null) { + if (other.associations != null) { + return false; + } + } else if (!associations.equals(other.associations)) { + return false; + } + if (attributeDefinitions == null) { + if (other.attributeDefinitions != null) { + return false; + } + } else if (!attributeDefinitions.equals(other.attributeDefinitions)) { + return false; + } + if (auxiliaryObjectClassDefinitions == null) { + if (other.auxiliaryObjectClassDefinitions != null) { + return false; + } + } else if (!auxiliaryObjectClassDefinitions.equals(other.auxiliaryObjectClassDefinitions)) { + return false; + } + if (baseContext == null) { + if (other.baseContext != null) { + return false; + } + } else if (!baseContext.equals(other.baseContext)) { + return false; + } + if (description == null) { + if (other.description != null) { + return false; + } + } else if (!description.equals(other.description)) { + return false; + } + if (displayName == null) { + if (other.displayName != null) { + return false; + } + } else if (!displayName.equals(other.displayName)) { + return false; + } + if (displayNameAttributeDefinition == null) { + if (other.displayNameAttributeDefinition != null) { + return false; + } + } else if (!displayNameAttributeDefinition.equals(other.displayNameAttributeDefinition)) { + return false; + } + if (identifiers == null) { + if (other.identifiers != null) { + return false; + } + } else if (!identifiers.equals(other.identifiers)) { + return false; + } + if (intent == null) { + if (other.intent != null) { + return false; + } + } else if (!intent.equals(other.intent)) { + return false; + } + if (isDefault != other.isDefault) { + return false; + } + if (kind != other.kind) { + return false; + } + if (objectClassDefinition == null) { + if (other.objectClassDefinition != null) { + return false; + } + } else if (!objectClassDefinition.equals(other.objectClassDefinition)) { + return false; + } + if (objectDefinition == null) { + if (other.objectDefinition != null) { + return false; + } + } else if (!objectDefinition.equals(other.objectDefinition)) { + return false; + } + if (protectedObjectPatterns == null) { + if (other.protectedObjectPatterns != null) { + return false; + } + } else if (!protectedObjectPatterns.equals(other.protectedObjectPatterns)) { + return false; + } + if (resourceType == null) { + if (other.resourceType != null) { + return false; + } + } else if (!resourceType.equals(other.resourceType)) { + return false; + } + if (schemaHandlingObjectTypeDefinitionType == null) { + if (other.schemaHandlingObjectTypeDefinitionType != null) { + return false; + } + } else if (!schemaHandlingObjectTypeDefinitionType.equals(other.schemaHandlingObjectTypeDefinitionType)) { + return false; + } + if (secondaryIdentifiers == null) { + if (other.secondaryIdentifiers != null) { + return false; + } + } else if (!secondaryIdentifiers.equals(other.secondaryIdentifiers)) { + return false; + } + return true; + } + + @Override + public String debugDump() { + return debugDump(0); + } + + @Override + public String debugDump(int indent) { + return debugDump(indent, null, getDebugDumpClassName()); + } + + public String debugDump(int indent, LayerType layer, String debugDumpClassName) { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < indent; i++) { + sb.append(INDENT_STRING); + } + sb.append(debugDumpClassName).append("("); + sb.append(SchemaDebugUtil.prettyPrint(getTypeName())); + if (isDefault()) { + sb.append(",default"); + } + if (getKind() != null) { + sb.append(" ").append(getKind().value()); + } + sb.append(","); + if (getIntent() != null) { + sb.append("intent=").append(getIntent()); + } + if (layer != null) { + sb.append(",layer=").append(layer); + } + sb.append(")"); + for (RefinedAttributeDefinition rAttrDef: getAttributeDefinitions()) { + sb.append("\n"); + sb.append(rAttrDef.debugDump(indent + 1, layer)); + } + return sb.toString(); + } + + /** + * Return a human readable name of this class suitable for logs. + */ + @Override + protected String getDebugDumpClassName() { + return "rOCD"; + } + + @Override + public String getHumanReadableName() { + if (getDisplayName() != null) { + return getDisplayName(); + } else if (getKind() != null) { + return getKind()+":"+getIntent(); + } else if (getTypeName() != null) { + return getTypeName().getLocalPart(); + } else { + return "null"; + } + } + + @Override + public String toString() { + if (getKind() == null) { + return getDebugDumpClassName() + "("+PrettyPrinter.prettyPrint(getTypeName())+")"; + } else { + return getDebugDumpClassName() + "("+getKind()+":"+getIntent()+"="+PrettyPrinter.prettyPrint(getTypeName())+")"; + } + } + +} diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedResourceSchema.java b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedResourceSchema.java index 74b293784c9..1f415015266 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedResourceSchema.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedResourceSchema.java @@ -13,504 +13,79 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.evolveum.midpoint.common.refinery; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import javax.xml.namespace.QName; - -import com.evolveum.midpoint.util.PrettyPrinter; -import com.evolveum.midpoint.util.QNameUtil; - -import org.apache.commons.lang.Validate; -import org.w3c.dom.Element; +package com.evolveum.midpoint.common.refinery; -import com.evolveum.midpoint.prism.Definition; -import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.PrismObjectDefinition; +import com.evolveum.midpoint.prism.schema.PrismSchema; import com.evolveum.midpoint.schema.ResourceShadowDiscriminator; -import com.evolveum.midpoint.schema.internals.InternalMonitor; import com.evolveum.midpoint.schema.processor.ObjectClassComplexTypeDefinition; import com.evolveum.midpoint.schema.processor.ResourceSchema; -import com.evolveum.midpoint.schema.util.MiscSchemaUtil; -import com.evolveum.midpoint.schema.util.ResourceTypeUtil; import com.evolveum.midpoint.schema.util.ShadowUtil; import com.evolveum.midpoint.util.DebugDumpable; -import com.evolveum.midpoint.util.exception.ConfigurationException; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.xml.ns._public.common.common_3.LayerType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceObjectTypeDefinitionType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.SchemaHandlingType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowKindType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; +import javax.xml.namespace.QName; +import java.util.Collection; +import java.util.List; + /** - * @author semancik - * + * @author mederly */ -public class RefinedResourceSchema extends ResourceSchema implements DebugDumpable { - - private static final String USER_DATA_KEY_PARSED_RESOURCE_SCHEMA = RefinedResourceSchema.class.getName()+".parsedResourceSchema"; - private static final String USER_DATA_KEY_REFINED_SCHEMA = RefinedResourceSchema.class.getName()+".refinedSchema"; - - private ResourceSchema originalResourceSchema; - - protected RefinedResourceSchema(PrismContext prismContext) { - super(prismContext); - } +public interface RefinedResourceSchema extends ResourceSchema, DebugDumpable { + List getRefinedDefinitions(); - private RefinedResourceSchema(ResourceType resourceType, ResourceSchema originalResourceSchema, PrismContext prismContext) { - super(ResourceTypeUtil.getResourceNamespace(resourceType), prismContext); - Validate.notNull(originalResourceSchema); - this.originalResourceSchema = originalResourceSchema; - } - - public List getRefinedDefinitions() { - List ocDefs = new ArrayList(); - for (Definition def: definitions) { - if (def instanceof RefinedObjectClassDefinition) { - RefinedObjectClassDefinition rOcDef = (RefinedObjectClassDefinition)def; - ocDefs.add(rOcDef); - } - } - return ocDefs; - } - - public Collection getRefinedDefinitions(ShadowKindType kind) { - Collection ocDefs = new ArrayList(); - for (Definition def: definitions) { - if ((def instanceof RefinedObjectClassDefinition) - && MiscSchemaUtil.matchesKind(kind, ((RefinedObjectClassDefinition) def).getKind())) { - RefinedObjectClassDefinition rOcDef = (RefinedObjectClassDefinition)def; - ocDefs.add(rOcDef); - } - } - return ocDefs; - } - - public ResourceSchema getOriginalResourceSchema() { - return originalResourceSchema; - } - - public RefinedObjectClassDefinition getRefinedDefinition(ShadowKindType kind, ShadowType shadow) { + List getRefinedDefinitions(ShadowKindType kind); + + ResourceSchema getOriginalResourceSchema(); + + default RefinedObjectClassDefinition getRefinedDefinition(ShadowKindType kind, ShadowType shadow) { return getRefinedDefinition(kind, ShadowUtil.getIntent(shadow)); } - + /** * if null accountType is provided, default account definition is returned. */ - public RefinedObjectClassDefinition getRefinedDefinition(ShadowKindType kind, String intent) { - for (RefinedObjectClassDefinition acctDef: getRefinedDefinitions(kind)) { - if (intent == null && acctDef.isDefault()) { - return acctDef; - } - if (acctDef.getIntent() != null && acctDef.getIntent().equals(intent)) { - return acctDef; - } - if (acctDef.getIntent() == null && intent == null) { - return acctDef; - } - } - return null; - } - - public CompositeRefinedObjectClassDefinition determineCompositeObjectClassDefinition(ResourceShadowDiscriminator discriminator) { - if (discriminator.getKind() == null && discriminator.getObjectClass() == null) { - return null; - } - RefinedObjectClassDefinition structuralObjectClassDefinition; - if (discriminator.getKind() == null && discriminator.getObjectClass() != null) { - structuralObjectClassDefinition = getRefinedDefinition(discriminator.getObjectClass()); - } else { - structuralObjectClassDefinition = getRefinedDefinition(discriminator.getKind(), discriminator.getIntent()); - } - if (structuralObjectClassDefinition == null) { - return null; - } - Collection auxiliaryObjectClassDefinitions = structuralObjectClassDefinition.getAuxiliaryObjectClassDefinitions(); - return new CompositeRefinedObjectClassDefinition(structuralObjectClassDefinition, auxiliaryObjectClassDefinitions); - } - - public CompositeRefinedObjectClassDefinition determineCompositeObjectClassDefinition(PrismObject shadow) throws SchemaException { - return determineCompositeObjectClassDefinition(shadow, null); - } - - public CompositeRefinedObjectClassDefinition determineCompositeObjectClassDefinition(PrismObject shadow, - Collection additionalAuxiliaryObjectClassQNames) throws SchemaException { - ShadowType shadowType = shadow.asObjectable(); - - RefinedObjectClassDefinition structuralObjectClassDefinition = null; - ShadowKindType kind = shadowType.getKind(); - String intent = shadowType.getIntent(); - QName structuralObjectClassQName = shadowType.getObjectClass(); - - if (kind != null) { - structuralObjectClassDefinition = getRefinedDefinition(kind, intent); - } - - if (structuralObjectClassDefinition == null) { - // Fallback to objectclass only - if (structuralObjectClassQName == null) { - return null; - } - structuralObjectClassDefinition = getRefinedDefinition(structuralObjectClassQName); - } - - if (structuralObjectClassDefinition == null) { - return null; - } - List auxiliaryObjectClassQNames = shadowType.getAuxiliaryObjectClass(); - if (additionalAuxiliaryObjectClassQNames != null) { - auxiliaryObjectClassQNames.addAll(additionalAuxiliaryObjectClassQNames); - } - Collection auxiliaryObjectClassDefinitions = new ArrayList<>(auxiliaryObjectClassQNames.size()); - for (QName auxiliaryObjectClassQName: auxiliaryObjectClassQNames) { - RefinedObjectClassDefinition auxiliaryObjectClassDef = getRefinedDefinition(auxiliaryObjectClassQName); - if (auxiliaryObjectClassDef == null) { - throw new SchemaException("Auxiliary object class "+auxiliaryObjectClassQName+" specified in "+shadow+" does not exist"); - } - auxiliaryObjectClassDefinitions.add(auxiliaryObjectClassDef); - } - - return new CompositeRefinedObjectClassDefinition(structuralObjectClassDefinition, auxiliaryObjectClassDefinitions); - } - - public CompositeRefinedObjectClassDefinition determineCompositeObjectClassDefinition(QName structuralObjectClassQName, ShadowKindType kind, String intent) { - RefinedObjectClassDefinition structuralObjectClassDefinition = null; - Collection auxiliaryObjectClassDefinitions; - if (kind != null) { - structuralObjectClassDefinition = getRefinedDefinition(kind, intent); - } - if (structuralObjectClassDefinition == null) { - // Fallback to objectclass only - if (structuralObjectClassQName == null) { - throw new IllegalArgumentException("No kind nor objectclass defined"); - } - structuralObjectClassDefinition = getRefinedDefinition(structuralObjectClassQName); - } - - if (structuralObjectClassDefinition == null) { - return null; - } + RefinedObjectClassDefinition getRefinedDefinition(ShadowKindType kind, String intent); - auxiliaryObjectClassDefinitions = structuralObjectClassDefinition.getAuxiliaryObjectClassDefinitions(); - - return new CompositeRefinedObjectClassDefinition(structuralObjectClassDefinition, auxiliaryObjectClassDefinitions); - } + CompositeRefinedObjectClassDefinition determineCompositeObjectClassDefinition(ResourceShadowDiscriminator discriminator); - /** - * If no intents are provided, default account definition is returned. - * We check whether there is only one relevant rOCD. - */ - public RefinedObjectClassDefinition getRefinedDefinition(ShadowKindType kind, Collection intents) throws SchemaException { - RefinedObjectClassDefinition found = null; - for (RefinedObjectClassDefinition acctDef: getRefinedDefinitions(kind)) { - RefinedObjectClassDefinition foundCurrent = null; - if (intents == null || intents.isEmpty()) { - if (acctDef.isDefault()) { - foundCurrent = acctDef; - } - } else { - if (intents.contains(acctDef.getIntent())) { - foundCurrent = acctDef; - } - } - if (foundCurrent != null) { - if (found != null) { - if (!QNameUtil.match(found.getTypeName(), foundCurrent.getTypeName())) { - throw new SchemaException("More than one ObjectClass found for kind " + kind + ", intents: " + intents + ": " + found.getTypeName() + ", " + foundCurrent.getTypeName()); - } - } else { - found = foundCurrent; - } - } - } - return found; - } + CompositeRefinedObjectClassDefinition determineCompositeObjectClassDefinition(PrismObject shadow) throws + SchemaException; - public RefinedObjectClassDefinition getRefinedDefinition(QName objectClassName) { - for (Definition def: definitions) { - if ((def instanceof RefinedObjectClassDefinition) - && ((RefinedObjectClassDefinition)def).isDefault() - && (QNameUtil.match(def.getTypeName(), objectClassName))) { - //&& (def.getTypeName().equals(objectClassName))) { - return (RefinedObjectClassDefinition)def; - } - } - // No default for this object class, so just use the first one. - // This is not strictly correct .. but it is a "compatible bug" :-) - // TODO: remove this in next major revision - for (Definition def: definitions) { - if ((def instanceof RefinedObjectClassDefinition) - && (QNameUtil.match(def.getTypeName(), objectClassName))) { - //&& (def.getTypeName().equals(objectClassName))) { - return (RefinedObjectClassDefinition)def; - } - } - return null; - } - - public RefinedObjectClassDefinition getDefaultRefinedDefinition(ShadowKindType kind) { - return getRefinedDefinition(kind, (String)null); - } - - public PrismObjectDefinition getObjectDefinition(ShadowKindType kind, String intent) { - return getRefinedDefinition(kind, intent).getObjectDefinition(); - } - - public PrismObjectDefinition getObjectDefinition(ShadowKindType kind, ShadowType shadow) { - return getObjectDefinition(kind, ShadowUtil.getIntent(shadow)); - } - - private void add(RefinedObjectClassDefinition rOcDef) { - definitions.add(rOcDef); - } - - public RefinedObjectClassDefinition findRefinedDefinitionByObjectClassQName(ShadowKindType kind, QName objectClass) { - if (objectClass == null) { - return getDefaultRefinedDefinition(kind); - } - for (RefinedObjectClassDefinition acctDef: getRefinedDefinitions(kind)) { - if (acctDef.isDefault() && QNameUtil.match(acctDef.getObjectClassDefinition().getTypeName(), objectClass)) { - return acctDef; - } - } - // No default for this object class, so just use the first one. - // This is not strictly correct .. but it is a "compatible bug" :-) - // TODO: remove this in next major revision - for (RefinedObjectClassDefinition acctDef: getRefinedDefinitions(kind)) { - if (QNameUtil.match(acctDef.getObjectClassDefinition().getTypeName(), objectClass)) { - return acctDef; - } - } - return null; - } - - public ObjectClassComplexTypeDefinition findObjectClassDefinition(QName objectClassQName) { - return originalResourceSchema.findObjectClassDefinition(objectClassQName); - } - - public static RefinedResourceSchema getRefinedSchema(ResourceType resourceType) throws SchemaException { - return getRefinedSchema(resourceType, resourceType.asPrismObject().getPrismContext()); - } - - public static LayerRefinedResourceSchema getRefinedSchema(ResourceType resourceType, LayerType layer) throws SchemaException { - return getRefinedSchema(resourceType, layer, resourceType.asPrismObject().getPrismContext()); - } + CompositeRefinedObjectClassDefinition determineCompositeObjectClassDefinition(PrismObject shadow, + Collection additionalAuxiliaryObjectClassQNames) throws SchemaException; - public static RefinedResourceSchema getRefinedSchema(ResourceType resourceType, PrismContext prismContext) throws SchemaException { - PrismObject resource = resourceType.asPrismObject(); - return getRefinedSchema(resource, prismContext); - } - - public static LayerRefinedResourceSchema getRefinedSchema(ResourceType resourceType, LayerType layer, PrismContext prismContext) throws SchemaException { - PrismObject resource = resourceType.asPrismObject(); - return getRefinedSchema(resource, layer, prismContext); - } - - public static RefinedResourceSchema getRefinedSchema(PrismObject resource) throws SchemaException { - return getRefinedSchema(resource, resource.getPrismContext()); - } - - public static RefinedResourceSchema getRefinedSchema(PrismObject resource, PrismContext prismContext) throws SchemaException { - if (resource == null){ - throw new SchemaException("Could not get refined schema, resource does not exist."); - } - - Object userDataEntry = resource.getUserData(USER_DATA_KEY_REFINED_SCHEMA); - if (userDataEntry != null) { - if (userDataEntry instanceof RefinedResourceSchema) { - return (RefinedResourceSchema)userDataEntry; - } else { - throw new IllegalStateException("Expected RefinedResourceSchema under user data key "+USER_DATA_KEY_REFINED_SCHEMA+ - "in "+resource+", but got "+userDataEntry.getClass()); - } - } else { - RefinedResourceSchema refinedSchema = parse(resource, prismContext); - resource.setUserData(USER_DATA_KEY_REFINED_SCHEMA, refinedSchema); - return refinedSchema; - } - } - - public static LayerRefinedResourceSchema getRefinedSchema(PrismObject resource, LayerType layer, PrismContext prismContext) throws SchemaException { - RefinedResourceSchema refinedSchema = getRefinedSchema(resource, prismContext); - if (refinedSchema == null) { - return null; - } - return refinedSchema.forLayer(layer); - } - - public static boolean hasRefinedSchema(ResourceType resourceType) { - PrismObject resource = resourceType.asPrismObject(); - return resource.getUserData(USER_DATA_KEY_REFINED_SCHEMA) != null; - } - - public static ResourceSchema getResourceSchema(ResourceType resourceType, PrismContext prismContext) throws SchemaException { - PrismObject resource = resourceType.asPrismObject(); - return getResourceSchema(resource, prismContext); - } - - public static ResourceSchema getResourceSchema(PrismObject resource, PrismContext prismContext) throws SchemaException { - Element resourceXsdSchema = ResourceTypeUtil.getResourceXsdSchema(resource); - if (resourceXsdSchema == null) { - return null; - } - Object userDataEntry = resource.getUserData(USER_DATA_KEY_PARSED_RESOURCE_SCHEMA); - if (userDataEntry != null) { - if (userDataEntry instanceof ResourceSchema) { - return (ResourceSchema)userDataEntry; - } else { - throw new IllegalStateException("Expected ResourceSchema under user data key "+ - USER_DATA_KEY_PARSED_RESOURCE_SCHEMA+ "in "+resource+", but got "+userDataEntry.getClass()); - } - } else { - InternalMonitor.recordResourceSchemaParse(); - ResourceSchema parsedSchema = ResourceSchema.parse(resourceXsdSchema, "resource schema of "+resource, prismContext); - if (parsedSchema == null) { - throw new IllegalStateException("Parsed schema is null: most likely an internall error"); - } - resource.setUserData(USER_DATA_KEY_PARSED_RESOURCE_SCHEMA, parsedSchema); - return parsedSchema; - } - } - - public static void setParsedResourceSchemaConditional(ResourceType resourceType, ResourceSchema parsedSchema) { - if (hasParsedSchema(resourceType)) { - return; - } - PrismObject resource = resourceType.asPrismObject(); - resource.setUserData(USER_DATA_KEY_PARSED_RESOURCE_SCHEMA, parsedSchema); - } + CompositeRefinedObjectClassDefinition determineCompositeObjectClassDefinition(QName structuralObjectClassQName, + ShadowKindType kind, String intent); - public static boolean hasParsedSchema(ResourceType resourceType) { - PrismObject resource = resourceType.asPrismObject(); - return resource.getUserData(USER_DATA_KEY_PARSED_RESOURCE_SCHEMA) != null; - } + /** + * If no intents are provided, default account definition is returned. + * We check whether there is only one relevant rOCD. + */ + RefinedObjectClassDefinition getRefinedDefinition(ShadowKindType kind, Collection intents) throws SchemaException; - public static RefinedResourceSchema parse(PrismObject resource, PrismContext prismContext) throws SchemaException { - return parse(resource.asObjectable(), prismContext); - } - - public static RefinedResourceSchema parse(ResourceType resourceType, PrismContext prismContext) throws SchemaException { - - ResourceSchema originalResourceSchema = getResourceSchema(resourceType, prismContext); - if (originalResourceSchema == null) { - return null; - } - - String contextDescription = "definition of "+resourceType; - - RefinedResourceSchema rSchema = new RefinedResourceSchema(resourceType, originalResourceSchema, prismContext); - - SchemaHandlingType schemaHandling = resourceType.getSchemaHandling(); - if (schemaHandling != null) { - parseObjectTypeDefsFromSchemaHandling(rSchema, resourceType, schemaHandling, - schemaHandling.getObjectType(), null, prismContext, contextDescription); - } + RefinedObjectClassDefinition getRefinedDefinition(QName objectClassName); - parseObjectTypesFromSchema(rSchema, resourceType, prismContext, contextDescription); - - // We need to parse associations and auxiliary object classes in a second pass. We need to have all object classes parsed before correctly setting association - // targets - for (RefinedObjectClassDefinition rOcDef: rSchema.getRefinedDefinitions()) { - rOcDef.parseAssociations(rSchema); - rOcDef.parseAuxiliaryObjectClasses(rSchema); - } - - // We can parse attributes only after we have all the object class info parsed (including auxiliary object classes) - for (RefinedObjectClassDefinition rOcDef: rSchema.getRefinedDefinitions()) { - rOcDef.parseAttributes(rSchema, contextDescription); - } - - return rSchema; + default RefinedObjectClassDefinition getDefaultRefinedDefinition(ShadowKindType kind) { + return getRefinedDefinition(kind, (String)null); } - private static boolean hasAnyObjectTypeDef(SchemaHandlingType schemaHandling) { - if (schemaHandling == null) { - return false; - } - if (!schemaHandling.getObjectType().isEmpty()) { - return true; - } - return false; + default PrismObjectDefinition getObjectDefinition(ShadowKindType kind, String intent) { + return getRefinedDefinition(kind, intent).getObjectDefinition(); } - private static void parseObjectTypeDefsFromSchemaHandling(RefinedResourceSchema rSchema, ResourceType resourceType, - SchemaHandlingType schemaHandling, Collection resourceObjectTypeDefs, - ShadowKindType impliedKind, PrismContext prismContext, String contextDescription) throws SchemaException { - - if (resourceObjectTypeDefs == null) { - return; - } - - Map defaults = new HashMap(); - - for (ResourceObjectTypeDefinitionType accountTypeDefType: resourceObjectTypeDefs) { - RefinedObjectClassDefinition rOcDef = RefinedObjectClassDefinition.parse(accountTypeDefType, resourceType, rSchema, impliedKind, - prismContext, contextDescription); - - if (rOcDef.isDefault()) { - if (defaults.containsKey(rOcDef.getKind())) { - throw new SchemaException("More than one default "+rOcDef.getKind()+" definitions ("+defaults.get(rOcDef.getKind())+", "+rOcDef+") in " + contextDescription); - } else { - defaults.put(rOcDef.getKind(), rOcDef); - } - } - - rSchema.add(rOcDef); - } - } - -public static List getIntentsForKind(RefinedResourceSchema rSchema, ShadowKindType kind) { - List intents = new ArrayList<>(); - for (ObjectClassComplexTypeDefinition objClassDef : rSchema.getObjectClassDefinitions()) { - if (objClassDef.getKind() == kind){ - intents.add(objClassDef.getIntent()); - } - } - - return intents; - + default PrismObjectDefinition getObjectDefinition(ShadowKindType kind, ShadowType shadow) { + return getObjectDefinition(kind, ShadowUtil.getIntent(shadow)); } + RefinedObjectClassDefinition findRefinedDefinitionByObjectClassQName(ShadowKindType kind, QName objectClass); - private static void parseObjectTypesFromSchema(RefinedResourceSchema rSchema, ResourceType resourceType, - PrismContext prismContext, String contextDescription) throws SchemaException { - - RefinedObjectClassDefinition rAccountDefDefault = null; - for(ObjectClassComplexTypeDefinition objectClassDef: rSchema.getOriginalResourceSchema().getObjectClassDefinitions()) { - QName objectClassname = objectClassDef.getTypeName(); - if (rSchema.getRefinedDefinition(objectClassname) != null) { - continue; - } - RefinedObjectClassDefinition rOcDef = RefinedObjectClassDefinition.parseFromSchema(objectClassDef, resourceType, rSchema, prismContext, - "object class " + objectClassname + ", in " + contextDescription); - - if (objectClassDef.getKind() == ShadowKindType.ACCOUNT && rOcDef.isDefault()) { - if (rAccountDefDefault == null) { - rAccountDefDefault = rOcDef; - } else { - throw new SchemaException("More than one default account definitions ("+rAccountDefDefault+", "+rOcDef+") in " + contextDescription); - } - } - - rSchema.add(rOcDef); - } - } - - public LayerRefinedResourceSchema forLayer(LayerType layer) { - return LayerRefinedResourceSchema.wrap(this, layer); - } - - @Override - public String toString() { - return "rSchema(ns=" + namespace + ")"; - } + ObjectClassComplexTypeDefinition findObjectClassDefinition(QName objectClassQName); + LayerRefinedResourceSchema forLayer(LayerType layer); } diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedResourceSchemaImpl.java b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedResourceSchemaImpl.java new file mode 100644 index 00000000000..3cefa143660 --- /dev/null +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedResourceSchemaImpl.java @@ -0,0 +1,567 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.common.refinery; + +import com.evolveum.midpoint.prism.*; +import com.evolveum.midpoint.schema.ResourceShadowDiscriminator; +import com.evolveum.midpoint.schema.internals.InternalMonitor; +import com.evolveum.midpoint.schema.processor.ObjectClassComplexTypeDefinition; +import com.evolveum.midpoint.schema.processor.ResourceSchema; +import com.evolveum.midpoint.schema.processor.ResourceSchemaImpl; +import com.evolveum.midpoint.schema.util.MiscSchemaUtil; +import com.evolveum.midpoint.schema.util.ResourceTypeUtil; +import com.evolveum.midpoint.util.QNameUtil; +import com.evolveum.midpoint.util.exception.SchemaException; +import com.evolveum.midpoint.xml.ns._public.common.common_3.*; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.w3c.dom.Document; +import org.w3c.dom.Element; + +import javax.xml.namespace.QName; +import java.util.*; + +/** + * @author semancik + * + */ +public class RefinedResourceSchemaImpl implements RefinedResourceSchema { + + private static final String USER_DATA_KEY_PARSED_RESOURCE_SCHEMA = RefinedResourceSchema.class.getName()+".parsedResourceSchema"; + private static final String USER_DATA_KEY_REFINED_SCHEMA = RefinedResourceSchema.class.getName()+".refinedSchema"; + + // TODO really don't remember why we include originalResourceSchema here instead of simply extending ResourceSchemaImpl ... + // TODO Maybe that's because we need to create new RefinedResourceSchema(s) based on existing ResourceSchema(s)? + private ResourceSchema originalResourceSchema; + + private RefinedResourceSchemaImpl(@NotNull ResourceSchema originalResourceSchema) { + this.originalResourceSchema = originalResourceSchema; + } + + @Override + public List getRefinedDefinitions() { + return originalResourceSchema.getDefinitions(RefinedObjectClassDefinition.class); + } + + @Override + public List getRefinedDefinitions(ShadowKindType kind) { + List rv = new ArrayList<>(); + for (RefinedObjectClassDefinition def: getRefinedDefinitions()) { + if (MiscSchemaUtil.matchesKind(kind, def.getKind())) { + rv.add(def); + } + } + return rv; + } + + @Override + public ResourceSchema getOriginalResourceSchema() { + return originalResourceSchema; + } + + @Override + public RefinedObjectClassDefinition getRefinedDefinition(ShadowKindType kind, String intent) { + for (RefinedObjectClassDefinition acctDef: getRefinedDefinitions(kind)) { + if (intent == null && acctDef.isDefault()) { + return acctDef; + } + if (acctDef.getIntent() != null && acctDef.getIntent().equals(intent)) { + return acctDef; + } + if (acctDef.getIntent() == null && intent == null) { + return acctDef; + } + } + return null; + } + + @Override + public CompositeRefinedObjectClassDefinition determineCompositeObjectClassDefinition(ResourceShadowDiscriminator discriminator) { + if (discriminator.getKind() == null && discriminator.getObjectClass() == null) { + return null; + } + RefinedObjectClassDefinition structuralObjectClassDefinition; + if (discriminator.getKind() == null && discriminator.getObjectClass() != null) { + structuralObjectClassDefinition = getRefinedDefinition(discriminator.getObjectClass()); + } else { + structuralObjectClassDefinition = getRefinedDefinition(discriminator.getKind(), discriminator.getIntent()); + } + if (structuralObjectClassDefinition == null) { + return null; + } + Collection auxiliaryObjectClassDefinitions = structuralObjectClassDefinition.getAuxiliaryObjectClassDefinitions(); + return new CompositeRefinedObjectClassDefinition(structuralObjectClassDefinition, auxiliaryObjectClassDefinitions); + } + + @Override + public CompositeRefinedObjectClassDefinition determineCompositeObjectClassDefinition(PrismObject shadow) throws SchemaException { + return determineCompositeObjectClassDefinition(shadow, null); + } + + @Override + public CompositeRefinedObjectClassDefinition determineCompositeObjectClassDefinition(PrismObject shadow, + Collection additionalAuxiliaryObjectClassQNames) throws SchemaException { + ShadowType shadowType = shadow.asObjectable(); + + RefinedObjectClassDefinition structuralObjectClassDefinition = null; + ShadowKindType kind = shadowType.getKind(); + String intent = shadowType.getIntent(); + QName structuralObjectClassQName = shadowType.getObjectClass(); + + if (kind != null) { + structuralObjectClassDefinition = getRefinedDefinition(kind, intent); + } + + if (structuralObjectClassDefinition == null) { + // Fallback to objectclass only + if (structuralObjectClassQName == null) { + return null; + } + structuralObjectClassDefinition = getRefinedDefinition(structuralObjectClassQName); + } + + if (structuralObjectClassDefinition == null) { + return null; + } + List auxiliaryObjectClassQNames = shadowType.getAuxiliaryObjectClass(); + if (additionalAuxiliaryObjectClassQNames != null) { + auxiliaryObjectClassQNames.addAll(additionalAuxiliaryObjectClassQNames); + } + Collection auxiliaryObjectClassDefinitions = new ArrayList<>(auxiliaryObjectClassQNames.size()); + for (QName auxiliaryObjectClassQName: auxiliaryObjectClassQNames) { + RefinedObjectClassDefinition auxiliaryObjectClassDef = getRefinedDefinition(auxiliaryObjectClassQName); + if (auxiliaryObjectClassDef == null) { + throw new SchemaException("Auxiliary object class "+auxiliaryObjectClassQName+" specified in "+shadow+" does not exist"); + } + auxiliaryObjectClassDefinitions.add(auxiliaryObjectClassDef); + } + + return new CompositeRefinedObjectClassDefinition(structuralObjectClassDefinition, auxiliaryObjectClassDefinitions); + } + + @Override + public CompositeRefinedObjectClassDefinition determineCompositeObjectClassDefinition(QName structuralObjectClassQName, + ShadowKindType kind, String intent) { + RefinedObjectClassDefinition structuralObjectClassDefinition = null; + Collection auxiliaryObjectClassDefinitions; + if (kind != null) { + structuralObjectClassDefinition = getRefinedDefinition(kind, intent); + } + if (structuralObjectClassDefinition == null) { + // Fallback to objectclass only + if (structuralObjectClassQName == null) { + throw new IllegalArgumentException("No kind nor objectclass defined"); + } + structuralObjectClassDefinition = getRefinedDefinition(structuralObjectClassQName); + } + + if (structuralObjectClassDefinition == null) { + return null; + } + + auxiliaryObjectClassDefinitions = structuralObjectClassDefinition.getAuxiliaryObjectClassDefinitions(); + + return new CompositeRefinedObjectClassDefinition(structuralObjectClassDefinition, auxiliaryObjectClassDefinitions); + } + + @Override + public RefinedObjectClassDefinition getRefinedDefinition(ShadowKindType kind, Collection intents) throws SchemaException { + RefinedObjectClassDefinition found = null; + for (RefinedObjectClassDefinition acctDef: getRefinedDefinitions(kind)) { + RefinedObjectClassDefinition foundCurrent = null; + if (intents == null || intents.isEmpty()) { + if (acctDef.isDefault()) { + foundCurrent = acctDef; + } + } else { + if (intents.contains(acctDef.getIntent())) { + foundCurrent = acctDef; + } + } + if (foundCurrent != null) { + if (found != null) { + if (!QNameUtil.match(found.getTypeName(), foundCurrent.getTypeName())) { + throw new SchemaException("More than one ObjectClass found for kind " + kind + ", intents: " + intents + ": " + found.getTypeName() + ", " + foundCurrent.getTypeName()); + } + } else { + found = foundCurrent; + } + } + } + return found; + } + + @Override + public RefinedObjectClassDefinition getRefinedDefinition(QName objectClassName) { + for (RefinedObjectClassDefinition def: getRefinedDefinitions()) { + if (def.isDefault() && (QNameUtil.match(def.getTypeName(), objectClassName))) { + return def; + } + } + // No default for this object class, so just use the first one. + // This is not strictly correct .. but it is a "compatible bug" :-) + // TODO: remove this in next major revision + for (RefinedObjectClassDefinition def: getRefinedDefinitions()) { + if ((QNameUtil.match(def.getTypeName(), objectClassName))) { + return def; + } + } + return null; + } + + @Override + public RefinedObjectClassDefinition findRefinedDefinitionByObjectClassQName(ShadowKindType kind, QName objectClass) { + if (objectClass == null) { + return getDefaultRefinedDefinition(kind); + } + for (RefinedObjectClassDefinition acctDef: getRefinedDefinitions(kind)) { + if (acctDef.isDefault() && QNameUtil.match(acctDef.getObjectClassDefinition().getTypeName(), objectClass)) { + return acctDef; + } + } + // No default for this object class, so just use the first one. + // This is not strictly correct .. but it is a "compatible bug" :-) + // TODO: remove this in next major revision + for (RefinedObjectClassDefinition acctDef: getRefinedDefinitions(kind)) { + if (QNameUtil.match(acctDef.getObjectClassDefinition().getTypeName(), objectClass)) { + return acctDef; + } + } + return null; + } + + + @Override + public LayerRefinedResourceSchema forLayer(LayerType layer) { + return new LayerRefinedResourceSchemaImpl(this, layer); + } + + @Override + public String toString() { + return "rSchema(ns=" + getNamespace() + ")"; + } + + //region Static methods + public static RefinedResourceSchema getRefinedSchema(ResourceType resourceType) throws SchemaException { + return getRefinedSchema(resourceType, resourceType.asPrismObject().getPrismContext()); + } + + public static LayerRefinedResourceSchema getRefinedSchema(ResourceType resourceType, LayerType layer) throws SchemaException { + return getRefinedSchema(resourceType, layer, resourceType.asPrismObject().getPrismContext()); + } + + public static RefinedResourceSchema getRefinedSchema(ResourceType resourceType, PrismContext prismContext) throws SchemaException { + PrismObject resource = resourceType.asPrismObject(); + return getRefinedSchema(resource, prismContext); + } + + public static LayerRefinedResourceSchema getRefinedSchema(ResourceType resourceType, LayerType layer, PrismContext prismContext) throws SchemaException { + PrismObject resource = resourceType.asPrismObject(); + return getRefinedSchema(resource, layer, prismContext); + } + + public static RefinedResourceSchema getRefinedSchema(PrismObject resource) throws SchemaException { + return getRefinedSchema(resource, resource.getPrismContext()); + } + + public static RefinedResourceSchema getRefinedSchema(PrismObject resource, PrismContext prismContext) throws SchemaException { + if (resource == null){ + throw new SchemaException("Could not get refined schema, resource does not exist."); + } + + Object userDataEntry = resource.getUserData(USER_DATA_KEY_REFINED_SCHEMA); + if (userDataEntry != null) { + if (userDataEntry instanceof RefinedResourceSchema) { + return (RefinedResourceSchema)userDataEntry; + } else { + throw new IllegalStateException("Expected RefinedResourceSchema under user data key "+USER_DATA_KEY_REFINED_SCHEMA+ + "in "+resource+", but got "+userDataEntry.getClass()); + } + } else { + RefinedResourceSchema refinedSchema = parse(resource, prismContext); + resource.setUserData(USER_DATA_KEY_REFINED_SCHEMA, refinedSchema); + return refinedSchema; + } + } + + public static LayerRefinedResourceSchema getRefinedSchema(PrismObject resource, LayerType layer, PrismContext prismContext) throws SchemaException { + RefinedResourceSchema refinedSchema = getRefinedSchema(resource, prismContext); + if (refinedSchema == null) { + return null; + } + return refinedSchema.forLayer(layer); + } + + public static boolean hasRefinedSchema(ResourceType resourceType) { + PrismObject resource = resourceType.asPrismObject(); + return resource.getUserData(USER_DATA_KEY_REFINED_SCHEMA) != null; + } + + public static ResourceSchema getResourceSchema(ResourceType resourceType, PrismContext prismContext) throws SchemaException { + PrismObject resource = resourceType.asPrismObject(); + return getResourceSchema(resource, prismContext); + } + + public static ResourceSchema getResourceSchema(PrismObject resource, PrismContext prismContext) throws SchemaException { + Element resourceXsdSchema = ResourceTypeUtil.getResourceXsdSchema(resource); + if (resourceXsdSchema == null) { + return null; + } + Object userDataEntry = resource.getUserData(USER_DATA_KEY_PARSED_RESOURCE_SCHEMA); + if (userDataEntry != null) { + if (userDataEntry instanceof ResourceSchema) { + return (ResourceSchema)userDataEntry; + } else { + throw new IllegalStateException("Expected ResourceSchema under user data key "+ + USER_DATA_KEY_PARSED_RESOURCE_SCHEMA+ "in "+resource+", but got "+userDataEntry.getClass()); + } + } else { + InternalMonitor.recordResourceSchemaParse(); + ResourceSchemaImpl parsedSchema = ResourceSchemaImpl.parse(resourceXsdSchema, "resource schema of "+resource, prismContext); + if (parsedSchema == null) { + throw new IllegalStateException("Parsed schema is null: most likely an internall error"); + } + resource.setUserData(USER_DATA_KEY_PARSED_RESOURCE_SCHEMA, parsedSchema); + parsedSchema.setNamespace(ResourceTypeUtil.getResourceNamespace(resource)); + return parsedSchema; + } + } + + public static void setParsedResourceSchemaConditional(ResourceType resourceType, ResourceSchema parsedSchema) { + if (hasParsedSchema(resourceType)) { + return; + } + PrismObject resource = resourceType.asPrismObject(); + resource.setUserData(USER_DATA_KEY_PARSED_RESOURCE_SCHEMA, parsedSchema); + } + + public static boolean hasParsedSchema(ResourceType resourceType) { + PrismObject resource = resourceType.asPrismObject(); + return resource.getUserData(USER_DATA_KEY_PARSED_RESOURCE_SCHEMA) != null; + } + + public static RefinedResourceSchema parse(PrismObject resource, PrismContext prismContext) throws SchemaException { + return parse(resource.asObjectable(), prismContext); + } + + public static RefinedResourceSchema parse(ResourceType resourceType, PrismContext prismContext) throws SchemaException { + + ResourceSchema originalResourceSchema = getResourceSchema(resourceType, prismContext); + if (originalResourceSchema == null) { + return null; + } + + String contextDescription = "definition of "+resourceType; + + RefinedResourceSchemaImpl rSchema = new RefinedResourceSchemaImpl(originalResourceSchema); + + SchemaHandlingType schemaHandling = resourceType.getSchemaHandling(); + if (schemaHandling != null) { + parseObjectTypeDefsFromSchemaHandling(rSchema, resourceType, schemaHandling, + schemaHandling.getObjectType(), null, prismContext, contextDescription); + } + + parseObjectTypesFromSchema(rSchema, resourceType, prismContext, contextDescription); + + // We need to parse associations and auxiliary object classes in a second pass. We need to have all object classes parsed before correctly setting association + // targets + for (RefinedObjectClassDefinition rOcDef: rSchema.getRefinedDefinitions()) { + ((RefinedObjectClassDefinitionImpl) rOcDef).parseAssociations(rSchema); + ((RefinedObjectClassDefinitionImpl) rOcDef).parseAuxiliaryObjectClasses(rSchema); + } + + // We can parse attributes only after we have all the object class info parsed (including auxiliary object classes) + for (RefinedObjectClassDefinition rOcDef: rSchema.getRefinedDefinitions()) { + ((RefinedObjectClassDefinitionImpl) rOcDef).parseAttributes(rSchema, contextDescription); + } + + return rSchema; + } + +// private static boolean hasAnyObjectTypeDef(SchemaHandlingType schemaHandling) { +// if (schemaHandling == null) { +// return false; +// } +// if (!schemaHandling.getObjectType().isEmpty()) { +// return true; +// } +// return false; +// } + + private static void parseObjectTypeDefsFromSchemaHandling(RefinedResourceSchemaImpl rSchema, ResourceType resourceType, + SchemaHandlingType schemaHandling, Collection resourceObjectTypeDefs, + ShadowKindType impliedKind, PrismContext prismContext, String contextDescription) throws SchemaException { + + if (resourceObjectTypeDefs == null) { + return; + } + + Map defaults = new HashMap<>(); + + for (ResourceObjectTypeDefinitionType accountTypeDefType: resourceObjectTypeDefs) { + RefinedObjectClassDefinition rOcDef = RefinedObjectClassDefinitionImpl.parse(accountTypeDefType, resourceType, rSchema, impliedKind, + prismContext, contextDescription); + + if (rOcDef.isDefault()) { + if (defaults.containsKey(rOcDef.getKind())) { + throw new SchemaException("More than one default "+rOcDef.getKind()+" definitions ("+defaults.get(rOcDef.getKind())+", "+rOcDef+") in " + contextDescription); + } else { + defaults.put(rOcDef.getKind(), rOcDef); + } + } + + rSchema.add(rOcDef); + } + } + + public static List getIntentsForKind(RefinedResourceSchema rSchema, ShadowKindType kind) { + List intents = new ArrayList<>(); + for (ObjectClassComplexTypeDefinition objClassDef : rSchema.getObjectClassDefinitions()) { + if (objClassDef.getKind() == kind){ + intents.add(objClassDef.getIntent()); + } + } + + return intents; + + } + + + private static void parseObjectTypesFromSchema(RefinedResourceSchemaImpl rSchema, ResourceType resourceType, + PrismContext prismContext, String contextDescription) throws SchemaException { + + RefinedObjectClassDefinition rAccountDefDefault = null; + for(ObjectClassComplexTypeDefinition objectClassDef: rSchema.getOriginalResourceSchema().getObjectClassDefinitions()) { + QName objectClassname = objectClassDef.getTypeName(); + if (rSchema.getRefinedDefinition(objectClassname) != null) { + continue; + } + RefinedObjectClassDefinition rOcDef = RefinedObjectClassDefinitionImpl.parseFromSchema(objectClassDef, resourceType, rSchema, prismContext, + "object class " + objectClassname + ", in " + contextDescription); + + if (objectClassDef.getKind() == ShadowKindType.ACCOUNT && rOcDef.isDefault()) { + if (rAccountDefDefault == null) { + rAccountDefDefault = rOcDef; + } else { + throw new SchemaException("More than one default account definitions ("+rAccountDefDefault+", "+rOcDef+") in " + contextDescription); + } + } + + rSchema.add(rOcDef); + } + } + //endregion + + private void add(RefinedObjectClassDefinition rOcDef) { + ((ResourceSchemaImpl) originalResourceSchema).add(rOcDef); // TODO FIXME + } + + //region Delegations + @Override + public ObjectClassComplexTypeDefinition findObjectClassDefinition(QName objectClassQName) { + return originalResourceSchema.findObjectClassDefinition(objectClassQName); + } + + @Override + public ObjectClassComplexTypeDefinition findObjectClassDefinition(ShadowKindType kind, String intent) { + return originalResourceSchema.findObjectClassDefinition(kind, intent); + } + + @Override + public ObjectClassComplexTypeDefinition findDefaultObjectClassDefinition(ShadowKindType kind) { + return originalResourceSchema.findDefaultObjectClassDefinition(kind); + } + + @Override + public String getNamespace() { + return originalResourceSchema.getNamespace(); + } + + @Override + @NotNull + public Collection getDefinitions() { + return originalResourceSchema.getDefinitions(); + } + + @Override + @NotNull + public List getDefinitions(@NotNull Class type) { + return originalResourceSchema.getDefinitions(type); + } + + @Override + public PrismContext getPrismContext() { + return originalResourceSchema.getPrismContext(); + } + + @Override + @NotNull + public Document serializeToXsd() throws SchemaException { + return originalResourceSchema.serializeToXsd(); + } + + @Override + public boolean isEmpty() { + return originalResourceSchema.isEmpty(); + } + + @Override + @Nullable + public CD findContainerDefinitionByCompileTimeClass( + @NotNull Class compileTimeClass, @NotNull Class definitionClass) { + return originalResourceSchema.findContainerDefinitionByCompileTimeClass(compileTimeClass, definitionClass); + } + + @Nullable + @Override + public ComplexTypeDefinition findComplexTypeDefinitionByCompileTimeClass( + @NotNull Class clazz) { + return originalResourceSchema.findComplexTypeDefinitionByCompileTimeClass(clazz); + } + + @Override + @Nullable + public ComplexTypeDefinition findComplexTypeDefinitionByType(@NotNull QName typeName) { + return originalResourceSchema.findComplexTypeDefinitionByType(typeName); + } + + @Override + public String debugDump() { + return originalResourceSchema.debugDump(); + } + + @Override + public String debugDump(int indent) { + return originalResourceSchema.debugDump(indent); + } + + @Nullable + @Override + public ID findItemDefinitionByType( + @NotNull QName typeName, @NotNull Class definitionType) { + return originalResourceSchema.findItemDefinitionByType(typeName, definitionType); + } + + @Override + @Nullable + public ID findItemDefinitionByElementName(@NotNull QName elementName, + @NotNull Class definitionClass) { + return originalResourceSchema.findItemDefinitionByElementName(elementName, definitionClass); + } + + //endregion + +} diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/validator/Validator.java b/infra/common/src/main/java/com/evolveum/midpoint/common/validator/Validator.java index e3e0bb170cc..b7ace857e8b 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/validator/Validator.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/validator/Validator.java @@ -109,7 +109,7 @@ private void initialize() { SchemaRegistry schemaRegistry = prismContext.getSchemaRegistry(); midPointJavaxSchema = schemaRegistry.getJavaxSchema(); xsdValidator = midPointJavaxSchema.newValidator(); - xsdValidator.setResourceResolver(schemaRegistry); + xsdValidator.setResourceResolver(prismContext.getEntityResolver()); } public EventHandler getHandler() { diff --git a/infra/common/src/test/java/com/evolveum/midpoint/common/TestStaticValues.java b/infra/common/src/test/java/com/evolveum/midpoint/common/TestStaticValues.java index 306c1556bc1..e4cb37afbaf 100644 --- a/infra/common/src/test/java/com/evolveum/midpoint/common/TestStaticValues.java +++ b/infra/common/src/test/java/com/evolveum/midpoint/common/TestStaticValues.java @@ -15,12 +15,7 @@ */ package com.evolveum.midpoint.common; -import com.evolveum.midpoint.prism.Item; -import com.evolveum.midpoint.prism.ItemDefinition; -import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.PrismProperty; -import com.evolveum.midpoint.prism.PrismPropertyDefinition; -import com.evolveum.midpoint.prism.PrismValue; +import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.util.PrismTestUtil; import com.evolveum.midpoint.schema.MidPointPrismContextFactory; import com.evolveum.midpoint.schema.constants.MidPointConstants; @@ -68,7 +63,7 @@ public void testValueElementsRoundtripString() throws Exception { // GIVEN PrismContext prismContext = PrismTestUtil.getPrismContext(); - PrismPropertyDefinition propDef = new PrismPropertyDefinition(PROP_NAME, DOMUtil.XSD_STRING, prismContext); + PrismPropertyDefinitionImpl propDef = new PrismPropertyDefinitionImpl(PROP_NAME, DOMUtil.XSD_STRING, prismContext); propDef.setMaxOccurs(-1); PrismProperty origProperty = propDef.instantiate(); origProperty.addRealValue("FOO"); @@ -84,7 +79,7 @@ public void testValueElementsRoundtripInt() throws Exception { // GIVEN PrismContext prismContext = PrismTestUtil.getPrismContext(); - PrismPropertyDefinition propDef = new PrismPropertyDefinition(PROP_NAME, DOMUtil.XSD_INT, prismContext); + PrismPropertyDefinitionImpl propDef = new PrismPropertyDefinitionImpl(PROP_NAME, DOMUtil.XSD_INT, prismContext); propDef.setMaxOccurs(-1); PrismProperty origProperty = propDef.instantiate(); origProperty.addRealValue(42); diff --git a/infra/common/src/test/java/com/evolveum/midpoint/common/refinery/TestRefinedSchema.java b/infra/common/src/test/java/com/evolveum/midpoint/common/refinery/TestRefinedSchema.java index 147d5a2f865..2d1def12a37 100644 --- a/infra/common/src/test/java/com/evolveum/midpoint/common/refinery/TestRefinedSchema.java +++ b/infra/common/src/test/java/com/evolveum/midpoint/common/refinery/TestRefinedSchema.java @@ -34,6 +34,7 @@ import com.evolveum.midpoint.prism.ConsistencyCheckScope; import com.evolveum.midpoint.prism.util.PrismTestUtil; +import com.evolveum.midpoint.schema.processor.*; import org.testng.Assert; import org.testng.AssertJUnit; import org.testng.annotations.BeforeSuite; @@ -53,11 +54,6 @@ import com.evolveum.midpoint.schema.MidPointPrismContextFactory; import com.evolveum.midpoint.schema.constants.MidPointConstants; import com.evolveum.midpoint.schema.constants.SchemaConstants; -import com.evolveum.midpoint.schema.processor.ObjectClassComplexTypeDefinition; -import com.evolveum.midpoint.schema.processor.ResourceAttribute; -import com.evolveum.midpoint.schema.processor.ResourceAttributeContainer; -import com.evolveum.midpoint.schema.processor.ResourceAttributeContainerDefinition; -import com.evolveum.midpoint.schema.processor.ResourceAttributeDefinition; import com.evolveum.midpoint.schema.util.ResourceTypeUtil; import com.evolveum.midpoint.schema.util.SchemaTestConstants; import com.evolveum.midpoint.schema.util.ShadowUtil; @@ -106,7 +102,7 @@ public void testParseFromResourceComplex() throws Exception { // WHEN TestUtil.displayWhen(TEST_NAME); - RefinedResourceSchema rSchema = RefinedResourceSchema.parse(resourceType, prismContext); + RefinedResourceSchema rSchema = RefinedResourceSchemaImpl.parse(resourceType, prismContext); // THEN TestUtil.displayThen(TEST_NAME); @@ -144,7 +140,7 @@ public void testParseFromResourceSimple() throws JAXBException, SchemaException, ResourceType resourceType = resource.asObjectable(); // WHEN - RefinedResourceSchema rSchema = RefinedResourceSchema.parse(resourceType, prismContext); + RefinedResourceSchema rSchema = RefinedResourceSchemaImpl.parse(resourceType, prismContext); // THEN assertNotNull("Refined schema is null", rSchema); @@ -284,7 +280,7 @@ public void testParseAccount() throws JAXBException, SchemaException, SAXExcepti PrismObject resource = prismContext.parseObject(RESOURCE_COMPLEX_FILE); ResourceType resourceType = resource.asObjectable(); - RefinedResourceSchema rSchema = RefinedResourceSchema.parse(resourceType, prismContext); + RefinedResourceSchema rSchema = RefinedResourceSchemaImpl.parse(resourceType, prismContext); RefinedObjectClassDefinition defaultAccountDefinition = rSchema.getDefaultRefinedDefinition(ShadowKindType.ACCOUNT); assertNotNull("No refined default account definition in "+rSchema, defaultAccountDefinition); @@ -316,7 +312,7 @@ public void testApplyAttributeDefinition() throws JAXBException, SchemaException PrismObject resource = prismContext.parseObject(RESOURCE_COMPLEX_FILE); - RefinedResourceSchema rSchema = RefinedResourceSchema.parse(resource, prismContext); + RefinedResourceSchema rSchema = RefinedResourceSchemaImpl.parse(resource, prismContext); RefinedObjectClassDefinition defaultAccountDefinition = rSchema.getDefaultRefinedDefinition(ShadowKindType.ACCOUNT); assertNotNull("No refined default account definition in "+rSchema, defaultAccountDefinition); System.out.println("Refined account definition:"); @@ -391,7 +387,7 @@ public void testCreateShadow() throws JAXBException, SchemaException, SAXExcepti PrismObject resource = prismContext.parseObject(RESOURCE_COMPLEX_FILE); ResourceType resourceType = resource.asObjectable(); - RefinedResourceSchema rSchema = RefinedResourceSchema.parse(resourceType, prismContext); + RefinedResourceSchema rSchema = RefinedResourceSchemaImpl.parse(resourceType, prismContext); assertNotNull("Refined schema is null", rSchema); assertFalse("No account definitions", rSchema.getRefinedDefinitions(ShadowKindType.ACCOUNT).isEmpty()); RefinedObjectClassDefinition rAccount = rSchema.getRefinedDefinition(ShadowKindType.ACCOUNT, (String)null); @@ -418,7 +414,7 @@ public void testProtectedAccount() throws JAXBException, SchemaException, SAXExc PrismContext prismContext = createInitializedPrismContext(); PrismObject resource = prismContext.parseObject(RESOURCE_COMPLEX_FILE); ResourceType resourceType = resource.asObjectable(); - RefinedResourceSchema rSchema = RefinedResourceSchema.parse(resourceType, prismContext); + RefinedResourceSchema rSchema = RefinedResourceSchemaImpl.parse(resourceType, prismContext); assertNotNull("Refined schema is null", rSchema); assertFalse("No account definitions", rSchema.getRefinedDefinitions(ShadowKindType.ACCOUNT).isEmpty()); RefinedObjectClassDefinition rAccount = rSchema.getRefinedDefinition(ShadowKindType.ACCOUNT, (String)null); @@ -530,7 +526,7 @@ private void assertDeprecatedProtectedAccount(String message, ResourceObjectPatt } private ResourceAttribute createStringAttribute(QName attrName, String value) { - ResourceAttributeDefinition testAttrDef = new ResourceAttributeDefinition(attrName, DOMUtil.XSD_STRING, getPrismContext()); + ResourceAttributeDefinition testAttrDef = new ResourceAttributeDefinitionImpl(attrName, DOMUtil.XSD_STRING, getPrismContext()); ResourceAttribute testAttr = testAttrDef.instantiate(); testAttr.setRealValue(value); return testAttr; @@ -549,7 +545,7 @@ public void testParseFromResourcePosix() throws Exception { // WHEN TestUtil.displayWhen(TEST_NAME); - RefinedResourceSchema rSchema = RefinedResourceSchema.parse(resourceType, prismContext); + RefinedResourceSchema rSchema = RefinedResourceSchemaImpl.parse(resourceType, prismContext); // THEN TestUtil.displayThen(TEST_NAME); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/ComplexTypeDefinition.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/ComplexTypeDefinition.java index 8158ea081e9..217413ae347 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/ComplexTypeDefinition.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/ComplexTypeDefinition.java @@ -16,110 +16,32 @@ package com.evolveum.midpoint.prism; -import com.evolveum.midpoint.prism.path.IdItemPathSegment; import com.evolveum.midpoint.prism.path.ItemPath; -import com.evolveum.midpoint.prism.path.ItemPathSegment; -import com.evolveum.midpoint.prism.path.NameItemPathSegment; -import com.evolveum.midpoint.prism.path.ObjectReferencePathSegment; -import com.evolveum.midpoint.prism.path.ParentPathSegment; -import com.evolveum.midpoint.prism.path.ReferencePathSegment; -import com.evolveum.midpoint.util.DebugDumpable; -import com.evolveum.midpoint.util.PrettyPrinter; +import com.evolveum.midpoint.util.exception.SchemaException; import org.jetbrains.annotations.NotNull; -import com.evolveum.midpoint.util.QNameUtil; -import org.apache.commons.lang.StringUtils; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; import javax.xml.namespace.QName; +import java.util.List; /** - * TODO - * - * @author Radovan Semancik - * + * @author mederly */ -public class ComplexTypeDefinition extends Definition { - private static final long serialVersionUID = 2655797837209175037L; - private List itemDefinitions; - private QName superType; - private boolean containerMarker; - private boolean objectMarker; - private boolean xsdAnyMarker; - private QName extensionForType; - private Class compileTimeClass; - private String defaultNamespace; - @NotNull private List ignoredNamespaces = new ArrayList<>(); +public interface ComplexTypeDefinition extends Definition, LocalDefinitionStore { - public ComplexTypeDefinition(QName typeName, PrismContext prismContext) { - super(typeName, prismContext); - itemDefinitions = new ArrayList(); - } - - public ComplexTypeDefinition(QName typeName, PrismContext prismContext, Class compileTimeClass) { - super(typeName, prismContext); - itemDefinitions = new ArrayList(); - this.compileTimeClass = compileTimeClass; - } + List getDefinitions(); - protected String getSchemaNamespace() { - return getTypeName().getNamespaceURI(); - } - - /** - * Returns set of property definitions. - * - * The set contains all property definitions of all types that were parsed. - * Order of definitions is insignificant. - * - * @return set of definitions - */ - public List getDefinitions() { - if (itemDefinitions == null) { - itemDefinitions = new ArrayList(); - } - return itemDefinitions; - } - - public void addDefinition(ItemDefinition itemDef) { - itemDefinitions.add(itemDef); - } - - public Class getCompileTimeClass() { - return compileTimeClass; - } + Class getCompileTimeClass(); - public void setCompileTimeClass(Class compileTimeClass) { - this.compileTimeClass = compileTimeClass; - } + QName getExtensionForType(); - public QName getExtensionForType() { - return extensionForType; - } - - public void setExtensionForType(QName extensionForType) { - this.extensionForType = extensionForType; - } - /** * Flag indicating whether this type was marked as "container" * in the original schema. Does not provide any information to - * schema processing logic, just conveys the marker from oginal - * schema so we can serialized and deserialize the schema without + * schema processing logic, just conveys the marker from original + * schema so we can serialize and deserialize the schema without * loss of information. */ - public boolean isContainerMarker() { - return containerMarker; - } - - public void setContainerMarker(boolean containerMarker) { - this.containerMarker = containerMarker; - } + boolean isContainerMarker(); /** * Flag indicating whether this type was marked as "object" @@ -128,383 +50,34 @@ public void setContainerMarker(boolean containerMarker) { * schema so we can serialized and deserialize the schema without * loss of information. */ - public boolean isObjectMarker() { - return objectMarker; - } - - public boolean isXsdAnyMarker() { - return xsdAnyMarker; - } - - public void setXsdAnyMarker(boolean xsdAnyMarker) { - this.xsdAnyMarker = xsdAnyMarker; - } - - public String getDefaultNamespace() { - return defaultNamespace; - } - - public void setDefaultNamespace(String defaultNamespace) { - this.defaultNamespace = defaultNamespace; - } - - @NotNull - public List getIgnoredNamespaces() { - return ignoredNamespaces; - } - - public void setIgnoredNamespaces(@NotNull List ignoredNamespaces) { - this.ignoredNamespaces = ignoredNamespaces; - } - - public QName getSuperType() { - return superType; - } - - public void setSuperType(QName superType) { - this.superType = superType; - } - - public void setObjectMarker(boolean objectMarker) { - this.objectMarker = objectMarker; - } + boolean isObjectMarker(); - public void add(ItemDefinition definition) { - itemDefinitions.add(definition); - } - - public PrismPropertyDefinition createPropertyDefinifion(QName name, QName typeName) { - PrismPropertyDefinition propDef = new PrismPropertyDefinition(name, typeName, prismContext); - itemDefinitions.add(propDef); - return propDef; - } - - // Creates reference to other schema - // TODO: maybe check if the name is in different namespace - // TODO: maybe create entirely new concept of property reference? - public PrismPropertyDefinition createPropertyDefinifion(QName name) { - PrismPropertyDefinition propDef = new PrismPropertyDefinition(name, null, prismContext); - itemDefinitions.add(propDef); - return propDef; - } + boolean isXsdAnyMarker(); - public PrismPropertyDefinition createPropertyDefinition(String localName, QName typeName) { - QName name = new QName(getSchemaNamespace(),localName); - return createPropertyDefinifion(name, typeName); - } - - - public PrismPropertyDefinition createPropertyDefinifion(String localName, String localTypeName) { - QName name = new QName(getSchemaNamespace(),localName); - QName typeName = new QName(getSchemaNamespace(),localTypeName); - return createPropertyDefinifion(name, typeName); - } - - /** - * Finds a PropertyDefinition by looking at the property name. - *

- * Returns null if nothing is found. - * - * @param name property definition name - * @return found property definition or null - */ - public PrismPropertyDefinition findPropertyDefinition(QName name) { - return findItemDefinition(name, PrismPropertyDefinition.class); - } - - public PrismPropertyDefinition findPropertyDefinition(ItemPath path) { - return findItemDefinition(path, PrismPropertyDefinition.class); - } - - public PrismContainerDefinition findContainerDefinition(QName name) { - return findItemDefinition(name, PrismContainerDefinition.class); - } - - public PrismContainerDefinition findContainerDefinition(ItemPath path) { - return findItemDefinition(path, PrismContainerDefinition.class); - } - - public T findItemDefinition(QName name, Class clazz) { - return findItemDefinition(name, clazz, false); - } - - public T findItemDefinition(QName name, Class clazz, boolean caseInsensitive) { - if (clazz == null) { - throw new IllegalArgumentException("type not specified while searching for " + name + " in " + this); - } - if (name == null) { - throw new IllegalArgumentException("name not specified while searching in " + this); - } - - for (ItemDefinition def : getDefinitions()) { - if (isItemValid(def, name, clazz, caseInsensitive)) { - return (T) def; - } - } - return null; - } - - public ID findItemDefinition(ItemPath path) { - return (ID)findItemDefinition(path, ItemDefinition.class); - } - - public ID findItemDefinition(ItemPath path, Class clazz) { - for (;;) { - if (path.isEmpty()) { - throw new IllegalArgumentException("Cannot resolve empty path on complex type definition "+this); - } - ItemPathSegment first = path.first(); - if (first instanceof NameItemPathSegment) { - QName firstName = ((NameItemPathSegment)first).getName(); - return findNamedItemDefinition(firstName, path.rest(), clazz); - } else if (first instanceof IdItemPathSegment) { - path = path.rest(); - } else if (first instanceof ParentPathSegment) { - ItemPath rest = path.rest(); - ComplexTypeDefinition parent = getSchemaRegistry().determineParentDefinition(this, rest); - if (rest.isEmpty()) { - // requires that the parent is defined as an item (container, object) - return (ID) getSchemaRegistry().findItemDefinitionByType(parent.getTypeName()); - } else { - return parent.findItemDefinition(rest, clazz); - } - } else if (first instanceof ObjectReferencePathSegment) { - throw new IllegalStateException("Couldn't use '@' path segment in this context. CTD=" + getTypeName() + ", path=" + path); - } else { - throw new IllegalStateException("Unexpected path segment: " + first + " in " + path); - } - } - } - - // path starts with NamedItemPathSegment - private ID findNamedItemDefinition(QName firstName, ItemPath rest, Class clazz) { - ID found = null; - for (ItemDefinition def : getDefinitions()) { - if (firstName != null && QNameUtil.match(firstName, def.getName())) { - if (found != null) { - throw new IllegalStateException("More definitions found for " + firstName + "/" + rest + " in " + this); - } - found = (ID) def.findItemDefinition(rest, clazz); - if (StringUtils.isNotEmpty(firstName.getNamespaceURI())) { - return found; // if qualified then there's no risk of matching more entries - } - } - } - return found; - } - - private boolean isItemValid(ItemDefinition def, QName name, Class clazz, boolean caseInsensitive) { - if (def == null) { - return false; - } - return def.isValidFor(name, clazz, caseInsensitive); - } - /** - * Merge provided definition into this definition. + * When resolving unqualified names for items contained in this CTD, what should be the default namespace to look into at first. + * Currently does NOT apply recursively (to inner CTDs). */ - public void merge(ComplexTypeDefinition otherComplexTypeDef) { - for (ItemDefinition otherItemDef: otherComplexTypeDef.getDefinitions()) { - add(otherItemDef.clone()); - } - } + String getDefaultNamespace(); - @Override - public void revive(PrismContext prismContext) { - if (this.prismContext != null) { - return; - } - this.prismContext = prismContext; - for (ItemDefinition def: itemDefinitions) { - def.revive(prismContext); - } - } - - public boolean isEmpty() { - return itemDefinitions.isEmpty(); - } - /** - * Shallow clone. + * When resolving unqualified names for items contained in this CTD, what namespace(s) should be ignored. + * Names in this list are interpreted as a namespace prefixes. + * Currently does NOT apply recursively (to inner CTDs). */ - public ComplexTypeDefinition clone() { - ComplexTypeDefinition clone = new ComplexTypeDefinition(this.typeName, prismContext); - copyDefinitionData(clone); - return clone; - } - - public ComplexTypeDefinition deepClone() { - return deepClone(new HashMap()); - } - - ComplexTypeDefinition deepClone(Map ctdMap) { - ComplexTypeDefinition clone; - if (ctdMap != null) { - clone = ctdMap.get(this.getTypeName()); - if (clone != null) { - return clone; // already cloned - } - } - clone = clone(); // shallow - if (ctdMap != null) { - ctdMap.put(this.getTypeName(), clone); - } - clone.itemDefinitions.clear(); - for (ItemDefinition itemDef: this.itemDefinitions) { - clone.itemDefinitions.add(itemDef.deepClone(ctdMap)); - } - return clone; - } - - protected void copyDefinitionData(ComplexTypeDefinition clone) { - super.copyDefinitionData(clone); - clone.superType = this.superType; - clone.containerMarker = this.containerMarker; - clone.objectMarker = this.objectMarker; - clone.xsdAnyMarker = this.xsdAnyMarker; - clone.extensionForType = this.extensionForType; - clone.compileTimeClass = this.compileTimeClass; - clone.itemDefinitions.addAll(this.itemDefinitions); - } + @NotNull + List getIgnoredNamespaces(); - public void replaceDefinition(QName propertyName, ItemDefinition newDefinition) { - for (int i=0; i itemDefinitions = new ArrayList<>(); + private QName superType; + private boolean containerMarker; + private boolean objectMarker; + private boolean xsdAnyMarker; + private QName extensionForType; + private Class compileTimeClass; + + private String defaultNamespace; + + @NotNull private List ignoredNamespaces = new ArrayList<>(); + + public ComplexTypeDefinitionImpl(@NotNull QName typeName, @NotNull PrismContext prismContext) { + super(typeName, prismContext); + } + + //region Trivia + protected String getSchemaNamespace() { + return getTypeName().getNamespaceURI(); + } + + /** + * Returns set of item definitions. + * + * The set contains all item definitions of all types that were parsed. + * Order of definitions is insignificant. + * + * @return set of definitions + */ + @Override + public List getDefinitions() { + return itemDefinitions; + } + + public void addDefinition(ItemDefinition itemDef) { + itemDefinitions.add(itemDef); + } + + public void add(ItemDefinition definition) { + itemDefinitions.add(definition); + } + + @Override + public Class getCompileTimeClass() { + return compileTimeClass; + } + + public void setCompileTimeClass(Class compileTimeClass) { + this.compileTimeClass = compileTimeClass; + } + + @Override + public QName getExtensionForType() { + return extensionForType; + } + + public void setExtensionForType(QName extensionForType) { + this.extensionForType = extensionForType; + } + + @Override + public boolean isContainerMarker() { + return containerMarker; + } + + public void setContainerMarker(boolean containerMarker) { + this.containerMarker = containerMarker; + } + + @Override + public boolean isObjectMarker() { + return objectMarker; + } + + @Override + public boolean isXsdAnyMarker() { + return xsdAnyMarker; + } + + public void setXsdAnyMarker(boolean xsdAnyMarker) { + this.xsdAnyMarker = xsdAnyMarker; + } + + @Override + public String getDefaultNamespace() { + return defaultNamespace; + } + + public void setDefaultNamespace(String defaultNamespace) { + this.defaultNamespace = defaultNamespace; + } + + @Override + @NotNull + public List getIgnoredNamespaces() { + return ignoredNamespaces; + } + + public void setIgnoredNamespaces(@NotNull List ignoredNamespaces) { + this.ignoredNamespaces = ignoredNamespaces; + } + + @Override + public QName getSuperType() { + return superType; + } + + public void setSuperType(QName superType) { + this.superType = superType; + } + + public void setObjectMarker(boolean objectMarker) { + this.objectMarker = objectMarker; + } + + //endregion + + //region Creating definitions + public PrismPropertyDefinitionImpl createPropertyDefinition(QName name, QName typeName) { + PrismPropertyDefinitionImpl propDef = new PrismPropertyDefinitionImpl(name, typeName, prismContext); + itemDefinitions.add(propDef); + return propDef; + } + + // Creates reference to other schema + // TODO: maybe check if the name is in different namespace + // TODO: maybe create entirely new concept of property reference? + public PrismPropertyDefinition createPropertyDefinition(QName name) { + PrismPropertyDefinition propDef = new PrismPropertyDefinitionImpl(name, null, prismContext); + itemDefinitions.add(propDef); + return propDef; + } + + public PrismPropertyDefinitionImpl createPropertyDefinition(String localName, QName typeName) { + QName name = new QName(getSchemaNamespace(), localName); + return createPropertyDefinition(name, typeName); + } + + public PrismPropertyDefinition createPropertyDefinition(String localName, String localTypeName) { + QName name = new QName(getSchemaNamespace(), localName); + QName typeName = new QName(getSchemaNamespace(), localTypeName); + return createPropertyDefinition(name, typeName); + } + //endregion + + //region Finding definitions + + // TODO deduplicate w.r.t. findNamedItemDefinition + @Override + public T findItemDefinition(@NotNull QName name, @NotNull Class clazz, boolean caseInsensitive) { + for (ItemDefinition def : getDefinitions()) { + if (def.isValidFor(name, clazz, caseInsensitive)) { + return (T) def; + } + } + return null; + } + + @Override + public ID findItemDefinition(@NotNull ItemPath path, @NotNull Class clazz) { + for (;;) { + if (path.isEmpty()) { + throw new IllegalArgumentException("Cannot resolve empty path on complex type definition "+this); + } + ItemPathSegment first = path.first(); + if (first instanceof NameItemPathSegment) { + QName firstName = ((NameItemPathSegment)first).getName(); + return findNamedItemDefinition(firstName, path.rest(), clazz); + } else if (first instanceof IdItemPathSegment) { + path = path.rest(); + } else if (first instanceof ParentPathSegment) { + ItemPath rest = path.rest(); + ComplexTypeDefinition parent = getSchemaRegistry().determineParentDefinition(this, rest); + if (rest.isEmpty()) { + // requires that the parent is defined as an item (container, object) + return (ID) getSchemaRegistry().findItemDefinitionByType(parent.getTypeName()); + } else { + return parent.findItemDefinition(rest, clazz); + } + } else if (first instanceof ObjectReferencePathSegment) { + throw new IllegalStateException("Couldn't use '@' path segment in this context. CTD=" + getTypeName() + ", path=" + path); + } else { + throw new IllegalStateException("Unexpected path segment: " + first + " in " + path); + } + } + } + + // path starts with NamedItemPathSegment + public ID findNamedItemDefinition(@NotNull QName firstName, @NotNull ItemPath rest, @NotNull Class clazz) { + ID found = null; + for (ItemDefinition def : getDefinitions()) { + if (def.isValidFor(firstName, clazz, false)) { + if (found != null) { + throw new IllegalStateException("More definitions found for " + firstName + "/" + rest + " in " + this); + } + found = (ID) def.findItemDefinition(rest, clazz); + if (QNameUtil.hasNamespace(firstName)) { + return found; // if qualified then there's no risk of matching more entries + } + } + } + return found; + } + //endregion + + /** + * Merge provided definition into this definition. + */ + @Override + public void merge(ComplexTypeDefinition otherComplexTypeDef) { + for (ItemDefinition otherItemDef: otherComplexTypeDef.getDefinitions()) { + add(otherItemDef.clone()); + } + } + + @Override + public void revive(PrismContext prismContext) { + if (this.prismContext != null) { + return; + } + this.prismContext = prismContext; + for (ItemDefinition def: itemDefinitions) { + def.revive(prismContext); + } + } + + @Override + public boolean isEmpty() { + return itemDefinitions.isEmpty(); + } + + /** + * Shallow clone. + */ + @Override + public ComplexTypeDefinitionImpl clone() { + ComplexTypeDefinitionImpl clone = new ComplexTypeDefinitionImpl(this.typeName, prismContext); + copyDefinitionData(clone); + return clone; + } + + @Override + public ComplexTypeDefinition deepClone() { + return deepClone(new HashMap()); + } + + ComplexTypeDefinitionImpl deepClone(Map ctdMap) { + ComplexTypeDefinitionImpl clone; + if (ctdMap != null) { + clone = (ComplexTypeDefinitionImpl) ctdMap.get(this.getTypeName()); + if (clone != null) { + return clone; // already cloned + } + } + clone = clone(); // shallow + if (ctdMap != null) { + ctdMap.put(this.getTypeName(), clone); + } + clone.itemDefinitions.clear(); + for (ItemDefinition itemDef: this.itemDefinitions) { + clone.itemDefinitions.add(((ItemDefinitionImpl) itemDef).deepClone(ctdMap)); + } + return clone; + } + + protected void copyDefinitionData(ComplexTypeDefinitionImpl clone) { + super.copyDefinitionData(clone); + clone.superType = this.superType; + clone.containerMarker = this.containerMarker; + clone.objectMarker = this.objectMarker; + clone.xsdAnyMarker = this.xsdAnyMarker; + clone.extensionForType = this.extensionForType; + clone.compileTimeClass = this.compileTimeClass; + clone.defaultNamespace = this.defaultNamespace; + clone.ignoredNamespaces = this.ignoredNamespaces; + clone.itemDefinitions.addAll(this.itemDefinitions); + } + + public void replaceDefinition(QName propertyName, ItemDefinition newDefinition) { + for (int i=0; idefinitions from - * the schema, not specific properties or objects. E.g the definitions does not - * have any value. - * - * To transform definition to a real property or object use the explicit - * instantiate() methods provided in the definition classes. E.g. the - * instantiate() method will create instance of Property using appropriate - * PropertyDefinition. - * - * The convenience methods in Schema are using this abstract class to find - * appropriate definitions easily. - * - * @author Radovan Semancik - * + * @author mederly */ -public abstract class Definition implements Serializable, DebugDumpable, Revivable { - - private static final long serialVersionUID = -2643332934312107274L; - protected QName typeName; - protected boolean ignored = false; - protected boolean isAbstract = false; - protected String displayName; - protected Integer displayOrder; - protected String help; - protected String documentation; - protected boolean deprecated = false; - - /** - * whether an item is inherited from a supertype (experimental feature) - */ - protected boolean inherited = false; - - /** - * This means that the property container is not defined by fixed (compile-time) schema. - * This in fact means that we need to use getAny in a JAXB types. It does not influence the - * processing of DOM that much, as that does not really depend on compile-time/run-time distinction. - */ - protected boolean isRuntimeSchema; - - /** - * Set true for definitions that are more important than others and that should be emphasized - * during presentation. E.g. the emphasized definitions will always be displayed in the user - * interfaces (even if they are empty), they will always be included in the dumps, etc. - */ - protected boolean emphasized = false; - - protected transient PrismContext prismContext; - - Definition(QName typeName, PrismContext prismContext) { - if (typeName == null) { - throw new IllegalArgumentException("Type name can't be null."); - } - if (prismContext == null) { - throw new IllegalArgumentException("prismContext can't be null."); - } - this.typeName = typeName; - this.prismContext = prismContext; - } +public interface Definition extends Serializable, DebugDumpable, Revivable { /** - * Returns the name of the definition type. - * * Returns a name of the type for this definition. - * + * * In XML representation that corresponds to the name of the XSD type. - * + * * @return the typeName */ - public QName getTypeName() { - return typeName; - } - - public void setTypeName(QName typeName) { - this.typeName = typeName; - } - - public boolean isIgnored() { - return ignored; - } - - public void setIgnored(boolean ignored) { - this.ignored = ignored; - } - - public boolean isAbstract() { - return isAbstract; - } - - public void setAbstract(boolean isAbstract) { - this.isAbstract = isAbstract; - } + @NotNull + QName getTypeName(); - public boolean isDeprecated() { - return deprecated; - } + boolean isIgnored(); - public void setDeprecated(boolean deprecated) { - this.deprecated = deprecated; - } + boolean isAbstract(); - public boolean isInherited() { - return inherited; - } + boolean isDeprecated(); - public void setInherited(boolean inherited) { - this.inherited = inherited; - } - - /** - * Set true for definitions that are more important than others and that should be emphasized - * during presentation. E.g. the emphasized definitions will always be displayed in the user - * interfaces (even if they are empty), they will always be included in the dumps, etc. - */ - public boolean isEmphasized() { - return emphasized; - } + /** + * Whether an item is inherited from a supertype. + */ + boolean isInherited(); - public void setEmphasized(boolean emphasized) { - this.emphasized = emphasized; - } + /** + * True for definitions that are more important than others and that should be emphasized + * during presentation. E.g. the emphasized definitions will always be displayed in the user + * interfaces (even if they are empty), they will always be included in the dumps, etc. + */ + boolean isEmphasized(); /** * Returns display name. - * + * * Specifies the printable name of the object class or attribute. It must * contain a printable string. It may also contain a key to catalog file. - * + * * Returns null if no display name is set. - * + * * Corresponds to "displayName" XSD annotation. - * + * * @return display name string or catalog key */ - public String getDisplayName() { - return displayName; - } - - public void setDisplayName(String displayName) { - this.displayName = displayName; - } - + String getDisplayName(); + /** * Specifies an order in which the item should be displayed relative to other items * at the same level. The items will be displayed by sorting them by the @@ -188,155 +77,46 @@ public void setDisplayName(String displayName) { * any displayOrder annotation will be displayed last. The ordering of * values with the same displayOrder is undefined and it may be arbitrary. */ - public Integer getDisplayOrder() { - return displayOrder; - } - - public void setDisplayOrder(Integer displayOrder) { - this.displayOrder = displayOrder; - } + Integer getDisplayOrder(); /** * Returns help string. - * + * * Specifies the help text or a key to catalog file for a help text. The * help text may be displayed in any suitable way by the GUI. It should * explain the meaning of an attribute or object class. - * + * * Returns null if no help string is set. - * + * * Corresponds to "help" XSD annotation. - * + * * @return help string or catalog key */ - public String getHelp() { - return help; - } - - public void setHelp(String help) { - this.help = help; - } - - public String getDocumentation() { - return documentation; - } + String getHelp(); - public void setDocumentation(String documentation) { - this.documentation = documentation; - } + String getDocumentation(); - /** - * Returns only a first sentence of documentation. - */ - public String getDocumentationPreview() { - if (documentation == null || documentation.isEmpty()) { - return documentation; - } - String plainDoc = MiscUtil.stripHtmlMarkup(documentation); - int i = plainDoc.indexOf('.'); - if (i<0) { - return plainDoc; - } - return plainDoc.substring(0,i+1); - } - - public boolean isRuntimeSchema() { - return isRuntimeSchema; - } - - public void setRuntimeSchema(boolean isRuntimeSchema) { - this.isRuntimeSchema = isRuntimeSchema; - } - - public PrismContext getPrismContext() { - return prismContext; - } - - protected SchemaRegistry getSchemaRegistry() { - return prismContext.getSchemaRegistry(); - } + /** + * Returns only a first sentence of documentation. + */ + String getDocumentationPreview(); - public Class getTypeClassIfKnown() { - return XsdTypeMapper.toJavaTypeIfKnown(getTypeName()); - } + /** + * This means that the item container is not defined by fixed (compile-time) schema. + * This in fact means that we need to use getAny in a JAXB types. It does not influence the + * processing of DOM that much, as that does not really depend on compile-time/run-time distinction. + * + * TODO clarify (container vs properties) + */ + boolean isRuntimeSchema(); - public Class getTypeClass() { - return XsdTypeMapper.toJavaType(getTypeName()); - } - - public abstract void revive(PrismContext prismContext); - - public abstract Definition clone(); - - protected void copyDefinitionData(Definition clone) { - clone.ignored = this.ignored; - clone.typeName = this.typeName; - clone.displayName = this.displayName; - clone.displayOrder = this.displayOrder; - clone.help = this.help; - clone.inherited = this.inherited; - clone.documentation = this.documentation; - clone.isAbstract = this.isAbstract; - clone.deprecated = this.deprecated; - clone.isRuntimeSchema = this.isRuntimeSchema; - clone.emphasized = this.emphasized; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + (ignored ? 1231 : 1237); - result = prime * result + ((typeName == null) ? 0 : typeName.hashCode()); - return result; - } + PrismContext getPrismContext(); - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - Definition other = (Definition) obj; - if (ignored != other.ignored) - return false; - if (typeName == null) { - if (other.typeName != null) - return false; - } else if (!typeName.equals(other.typeName)) - return false; - return true; - } + SchemaRegistry getSchemaRegistry(); - @Override - public String toString() { - return getDebugDumpClassName() + " ("+PrettyPrinter.prettyPrint(getTypeName())+")"; - } - - @Override - public String debugDump() { - return debugDump(0); - } + Class getTypeClassIfKnown(); - @Override - public String debugDump(int indent) { - StringBuilder sb = new StringBuilder(); - for (int i=0; idefinitions from + * the schema, not specific properties or objects. E.g the definitions does not + * have any value. + * + * To transform definition to a real property or object use the explicit + * instantiate() methods provided in the definition classes. E.g. the + * instantiate() method will create instance of Property using appropriate + * PropertyDefinition. + * + * The convenience methods in Schema are using this abstract class to find + * appropriate definitions easily. + * + * @author Radovan Semancik + * + */ +public abstract class DefinitionImpl implements Definition { + + private static final long serialVersionUID = -2643332934312107274L; + @NotNull protected QName typeName; + protected boolean ignored = false; + protected boolean isAbstract = false; + protected String displayName; + protected Integer displayOrder; + protected String help; + protected String documentation; + protected boolean deprecated = false; + + /** + * whether an item is inherited from a supertype (experimental feature) + */ + protected boolean inherited = false; + + /** + * This means that the item container is not defined by fixed (compile-time) schema. + * This in fact means that we need to use getAny in a JAXB types. It does not influence the + * processing of DOM that much, as that does not really depend on compile-time/run-time distinction. + */ + protected boolean isRuntimeSchema; + + /** + * Set true for definitions that are more important than others and that should be emphasized + * during presentation. E.g. the emphasized definitions will always be displayed in the user + * interfaces (even if they are empty), they will always be included in the dumps, etc. + */ + protected boolean emphasized = false; + + protected transient PrismContext prismContext; + + DefinitionImpl(@NotNull QName typeName, @NotNull PrismContext prismContext) { + this.typeName = typeName; + this.prismContext = prismContext; + } + + @Override + @NotNull + public QName getTypeName() { + return typeName; + } + + public void setTypeName(@NotNull QName typeName) { + this.typeName = typeName; + } + + @Override + public boolean isIgnored() { + return ignored; + } + + public void setIgnored(boolean ignored) { + this.ignored = ignored; + } + + @Override + public boolean isAbstract() { + return isAbstract; + } + + public void setAbstract(boolean isAbstract) { + this.isAbstract = isAbstract; + } + + @Override + public boolean isDeprecated() { + return deprecated; + } + + public void setDeprecated(boolean deprecated) { + this.deprecated = deprecated; + } + + @Override + public boolean isInherited() { + return inherited; + } + + public void setInherited(boolean inherited) { + this.inherited = inherited; + } + + @Override + public boolean isEmphasized() { + return emphasized; + } + + public void setEmphasized(boolean emphasized) { + this.emphasized = emphasized; + } + + @Override + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + @Override + public Integer getDisplayOrder() { + return displayOrder; + } + + public void setDisplayOrder(Integer displayOrder) { + this.displayOrder = displayOrder; + } + + @Override + public String getHelp() { + return help; + } + + public void setHelp(String help) { + this.help = help; + } + + @Override + public String getDocumentation() { + return documentation; + } + + public void setDocumentation(String documentation) { + this.documentation = documentation; + } + + @Override + public String getDocumentationPreview() { + if (documentation == null || documentation.isEmpty()) { + return documentation; + } + String plainDoc = MiscUtil.stripHtmlMarkup(documentation); + int i = plainDoc.indexOf('.'); + if (i<0) { + return plainDoc; + } + return plainDoc.substring(0,i+1); + } + + @Override + public boolean isRuntimeSchema() { + return isRuntimeSchema; + } + + public void setRuntimeSchema(boolean isRuntimeSchema) { + this.isRuntimeSchema = isRuntimeSchema; + } + + @Override + public PrismContext getPrismContext() { + return prismContext; + } + + @Override + public SchemaRegistry getSchemaRegistry() { + return prismContext.getSchemaRegistry(); + } + + @Override + public Class getTypeClassIfKnown() { + return XsdTypeMapper.toJavaTypeIfKnown(getTypeName()); + } + + @Override + public Class getTypeClass() { + return XsdTypeMapper.toJavaType(getTypeName()); + } + + public abstract void revive(PrismContext prismContext); + + protected void copyDefinitionData(DefinitionImpl clone) { + clone.ignored = this.ignored; + clone.typeName = this.typeName; + clone.displayName = this.displayName; + clone.displayOrder = this.displayOrder; + clone.help = this.help; + clone.inherited = this.inherited; + clone.documentation = this.documentation; + clone.isAbstract = this.isAbstract; + clone.deprecated = this.deprecated; + clone.isRuntimeSchema = this.isRuntimeSchema; + clone.emphasized = this.emphasized; + } + + @SuppressWarnings("ConstantConditions") + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + (ignored ? 1231 : 1237); + result = prime * result + ((typeName == null) ? 0 : typeName.hashCode()); + return result; + } + + @SuppressWarnings("ConstantConditions") + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + DefinitionImpl other = (DefinitionImpl) obj; + if (ignored != other.ignored) + return false; + if (typeName == null) { + if (other.typeName != null) + return false; + } else if (!typeName.equals(other.typeName)) + return false; + return true; + } + + @Override + public String toString() { + return getDebugDumpClassName() + " ("+PrettyPrinter.prettyPrint(getTypeName())+")"; + } + + @Override + public String debugDump() { + return debugDump(0); + } + + @Override + public String debugDump(int indent) { + StringBuilder sb = new StringBuilder(); + for (int i=0; idefinitions from - * the schema, not specific properties or objects. E.g the definitions does not - * have any value. - * - * To transform definition to a real property or object use the explicit - * instantiate() methods provided in the definition classes. E.g. the - * instantiate() method will create instance of Property using appropriate - * PropertyDefinition. - * - * The convenience methods in Schema are using this abstract class to find - * appropriate definitions easily. - * - * @author Radovan Semancik - * + * @author mederly */ -public abstract class ItemDefinition extends Definition implements Serializable { +public interface ItemDefinition extends Definition { - private static final long serialVersionUID = -2643332934312107274L; - @NotNull protected QName name; - private int minOccurs = 1; - private int maxOccurs = 1; - private boolean operational = false; - private boolean dynamic; - private boolean canAdd = true; - private boolean canRead = true; - private boolean canModify = true; - private PrismReferenceValue valueEnumerationRef; - - // TODO: annotations - - /** - * The constructors should be used only occasionally (if used at all). - * Use the factory methods in the ResourceObjectDefintion instead. - * - * @param name definition name (element Name) - * @param defaultName default element name - * @param typeName type name (XSD complex or simple type) - */ - ItemDefinition(@NotNull QName elementName, QName typeName, PrismContext prismContext) { - super(typeName, prismContext); - this.name = elementName; - } - - /** - * Returns name of the defined entity. - * - * The name is a name of the entity instance if it is fixed by the schema. - * E.g. it may be a name of the property in the container that cannot be - * changed. - * - * The name corresponds to the XML element name in the XML representation of - * the schema. It does NOT correspond to a XSD type name. - * - * Name is optional. If name is not set the null value is returned. If name is - * not set the type is "abstract", does not correspond to the element. - * - * @return the name name of the entity or null. - */ @NotNull - public QName getName() { - return name; - } + QName getName(); - public void setName(@NotNull QName name) { - this.name = name; - } - - public String getNamespace() { - return getName().getNamespaceURI(); - } - - /** - * Return the number of minimal value occurrences. - * - * @return the minOccurs - */ - public int getMinOccurs() { - return minOccurs; - } + String getNamespace(); - public void setMinOccurs(int minOccurs) { - this.minOccurs = minOccurs; - } - - /** - * Return the number of maximal value occurrences. - *

- * Any negative number means "unbounded". - * - * @return the maxOccurs - */ - public int getMaxOccurs() { - return maxOccurs; - } + int getMinOccurs(); - public void setMaxOccurs(int maxOccurs) { - this.maxOccurs = maxOccurs; - } - - /** - * Returns true if property is single-valued. - * - * @return true if property is single-valued. - */ - public boolean isSingleValue() { - int maxOccurs = getMaxOccurs(); - return maxOccurs >= 0 && maxOccurs <= 1; - } + int getMaxOccurs(); - /** - * Returns true if property is multi-valued. - * - * @return true if property is multi-valued. - */ - public boolean isMultiValue() { - int maxOccurs = getMaxOccurs(); - return maxOccurs < 0 || maxOccurs > 1; - } + boolean isSingleValue(); - /** - * Returns true if property is mandatory. - * - * @return true if property is mandatory. - */ - public boolean isMandatory() { - return getMinOccurs() > 0; - } + boolean isMultiValue(); - /** - * Returns true if property is optional. - * - * @return true if property is optional. - */ - public boolean isOptional() { - return getMinOccurs() == 0; - } + boolean isMandatory(); - public boolean isOperational() { - return operational; - } + boolean isOptional(); - public void setOperational(boolean operational) { - this.operational = operational; - } + boolean isOperational(); /** * Returns true if definition was created during the runtime based on a dynamic information @@ -193,295 +55,44 @@ public void setOperational(boolean operational) { * part of any schema and therefore cannot be determined. It may even be different for every * instance of the associated item (element name). */ - public boolean isDynamic() { - return dynamic; - } - - public void setDynamic(boolean dynamic) { - this.dynamic = dynamic; - } - - /** - * Returns true if the property can be read. I.e. if it is returned in objects - * retrieved from "get", "search" and similar operations. - */ - public boolean canRead() { - return canRead; - } + boolean isDynamic(); - /** - * Returns true if the item can be modified. I.e. if it can be changed - * during a modification of existing object. - */ - public boolean canModify() { - return canModify; - } + boolean canRead(); - /** - * - */ - public void setReadOnly() { - canAdd = false; - canRead = true; - canModify = false; - } + boolean canModify(); - public void setCanRead(boolean read) { - this.canRead = read; - } + boolean canAdd(); - public void setCanModify(boolean modify) { - this.canModify = modify; - } + PrismReferenceValue getValueEnumerationRef(); - public void setCanAdd(boolean add) { - this.canAdd = add; - } + boolean isValidFor(QName elementQName, Class clazz); - /** - * Returns true if the item can be added. I.e. if it can be present - * in the object when a new object is created. - */ - public boolean canAdd() { - return canAdd; - } + boolean isValidFor(@NotNull QName elementQName, @NotNull Class clazz, boolean caseInsensitive); - /** - * Reference to an object that directly or indirectly represents possible values for - * this item. We do not define here what exactly the object has to be. It can be a lookup - * table, script that dynamically produces the values or anything similar. - * The object must produce the values of the correct type for this item otherwise an - * error occurs. - */ - public PrismReferenceValue getValueEnumerationRef() { - return valueEnumerationRef; - } - - public void setValueEnumerationRef(PrismReferenceValue valueEnumerationRef) { - this.valueEnumerationRef = valueEnumerationRef; - } - - public boolean isValidFor(QName elementQName, Class clazz) { - return isValidFor(elementQName, clazz, false); - } - - public boolean isValidFor(QName elementQName, Class clazz, boolean caseInsensitive) { - if (!clazz.isAssignableFrom(this.getClass())) { - return false; - } - if (QNameUtil.match(elementQName, getName(), caseInsensitive)) { - return true; - } - return false; - } - - public void adoptElementDefinitionFrom(ItemDefinition otherDef) { - if (otherDef == null) { - return; - } - setName(otherDef.getName()); - setMinOccurs(otherDef.getMinOccurs()); - setMaxOccurs(otherDef.getMaxOccurs()); - } + void adoptElementDefinitionFrom(ItemDefinition otherDef); /** * Create an item instance. Definition name or default name will * used as an element name for the instance. The instance will otherwise be empty. * @return created item instance */ - abstract public I instantiate() throws SchemaException; + I instantiate() throws SchemaException; /** * Create an item instance. Definition name will use provided name. * for the instance. The instance will otherwise be empty. * @return created item instance */ - abstract public I instantiate(QName name) throws SchemaException; + I instantiate(QName name) throws SchemaException; - // add namespace from the definition if it's safe to do so - protected QName addNamespaceIfApplicable(QName name) { - if (StringUtils.isEmpty(name.getNamespaceURI())) { - if (QNameUtil.match(name, this.name)) { - return this.name; - } - } - return name; - } + T findItemDefinition(@NotNull ItemPath path, @NotNull Class clazz); - T findItemDefinition(ItemPath path, Class clazz) { - if (path.isEmpty()) { - if (clazz.isAssignableFrom(this.getClass())) { - return (T) this; - } else { - throw new IllegalArgumentException("Looking for definition of class " + clazz + " but found " + this); - } - } else { - throw new IllegalArgumentException("No definition for path " + path + " in " + this); - } - } - - abstract public ItemDelta createEmptyDelta(ItemPath path); - - abstract public ItemDefinition clone(); - - protected void copyDefinitionData(ItemDefinition clone) { - super.copyDefinitionData(clone); - clone.name = this.name; - clone.minOccurs = this.minOccurs; - clone.maxOccurs = this.maxOccurs; - clone.dynamic = this.dynamic; - clone.canAdd = this.canAdd; - clone.canRead = this.canRead; - clone.canModify = this.canModify; - clone.operational = this.operational; - clone.valueEnumerationRef = this.valueEnumerationRef; - } + ItemDelta createEmptyDelta(ItemPath path); - /** - * Make a deep clone, cloning all the sub-items and definitions. - * - * @param ultraDeep if set to true then even the objects that were same instance in the original will be - * cloned as separate instances in the clone. - * - */ - public ItemDefinition deepClone(boolean ultraDeep) { - if (ultraDeep) { - return deepClone(null); - } else { - return deepClone(new HashMap()); - } - } - - ItemDefinition deepClone(Map ctdMap) { - return clone(); - } - - @Override - public void revive(PrismContext prismContext) { - if (this.prismContext != null) { - return; - } - this.prismContext = prismContext; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = super.hashCode(); - result = prime * result + ((name == null) ? 0 : name.hashCode()); - result = prime * result + maxOccurs; - result = prime * result + minOccurs; - result = prime * result + (canAdd ? 1231 : 1237); - result = prime * result + (canRead ? 1231 : 1237); - result = prime * result + (canModify ? 1231 : 1237); - return result; - } + ItemDefinition clone(); - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (!super.equals(obj)) - return false; - if (getClass() != obj.getClass()) - return false; - ItemDefinition other = (ItemDefinition) obj; - if (name == null) { - if (other.name != null) - return false; - } else if (!name.equals(other.name)) - return false; - if (maxOccurs != other.maxOccurs) - return false; - if (minOccurs != other.minOccurs) - return false; - if (canAdd != other.canAdd) - return false; - if (canRead != other.canRead) - return false; - if (canModify != other.canModify) - return false; - return true; - } + ItemDefinition deepClone(boolean ultraDeep); @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append(getDebugDumpClassName()); - sb.append(":"); - sb.append(PrettyPrinter.prettyPrint(getName())); - sb.append(" "); - debugDumpShortToString(sb); - return sb.toString(); - } - - /** - * Used in debugDumping items. Does not need to have name in it as item already has it. Does not need - * to have class as that is just too much info that is almost anytime pretty obvious anyway. - */ - void debugDumpShortToString(StringBuilder sb) { - sb.append(PrettyPrinter.prettyPrint(getTypeName())); - debugMultiplicity(sb); - debugFlags(sb); - } - - private void debugMultiplicity(StringBuilder sb) { - sb.append("["); - sb.append(getMinOccurs()); - sb.append(","); - sb.append(getMaxOccurs()); - sb.append("]"); - } - - public String debugMultiplicity() { - StringBuilder sb = new StringBuilder(); - debugMultiplicity(sb); - return sb.toString(); - } - - private void debugFlags(StringBuilder sb) { - if (isIgnored()) { - sb.append(",ignored"); - } - if (isDynamic()) { - sb.append(",dyn"); - } - extendToString(sb); - } - - public String debugFlags() { - StringBuilder sb = new StringBuilder(); - debugFlags(sb); - // This starts with a collon, we do not want it here - if (sb.length() > 0) { - sb.deleteCharAt(0); - } - return sb.toString(); - } - - protected void extendToString(StringBuilder sb) { - sb.append(","); - if (canRead()) { - sb.append("R"); - } else { - sb.append("-"); - } - if (canAdd()) { - sb.append("A"); - } else { - sb.append("-"); - } - if (canModify()) { - sb.append("M"); - } else { - sb.append("-"); - } - if (isRuntimeSchema()) { - sb.append(",runtime"); - } - if (isOperational()) { - sb.append(",oper"); - } - } - + void revive(PrismContext prismContext); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/ItemDefinitionImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/ItemDefinitionImpl.java new file mode 100644 index 00000000000..7c7f5de4afe --- /dev/null +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/ItemDefinitionImpl.java @@ -0,0 +1,479 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.prism; + +import java.io.Serializable; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.xml.namespace.QName; + +import com.evolveum.midpoint.prism.delta.ItemDelta; +import com.evolveum.midpoint.prism.path.ItemPath; +import com.evolveum.midpoint.util.PrettyPrinter; +import com.evolveum.midpoint.util.QNameUtil; +import com.evolveum.midpoint.util.exception.SchemaException; + +import org.apache.commons.lang.StringUtils; +import org.jetbrains.annotations.NotNull; + +/** + * Abstract item definition in the schema. + * + * This is supposed to be a superclass for all item definitions. Items are things + * that can appear in property containers, which generally means only a property + * and property container itself. Therefore this is in fact superclass for those + * two definitions. + * + * The definitions represent data structures of the schema. Therefore instances + * of Java objects from this class represent specific definitions from + * the schema, not specific properties or objects. E.g the definitions does not + * have any value. + * + * To transform definition to a real property or object use the explicit + * instantiate() methods provided in the definition classes. E.g. the + * instantiate() method will create instance of Property using appropriate + * PropertyDefinition. + * + * The convenience methods in Schema are using this abstract class to find + * appropriate definitions easily. + * + * @author Radovan Semancik + * + */ +public abstract class ItemDefinitionImpl extends DefinitionImpl implements ItemDefinition { + + private static final long serialVersionUID = -2643332934312107274L; + @NotNull protected QName name; + private int minOccurs = 1; + private int maxOccurs = 1; + private boolean operational = false; + private boolean dynamic; + private boolean canAdd = true; + private boolean canRead = true; + private boolean canModify = true; + private PrismReferenceValue valueEnumerationRef; + + // TODO: annotations + + /** + * The constructors should be used only occasionally (if used at all). + * Use the factory methods in the ResourceObjectDefintion instead. + * + * @param name definition name (element Name) + * @param typeName type name (XSD complex or simple type) + */ + ItemDefinitionImpl(@NotNull QName name, @NotNull QName typeName, @NotNull PrismContext prismContext) { + super(typeName, prismContext); + this.name = name; + } + + /** + * Returns name of the defined entity. + * + * The name is a name of the entity instance if it is fixed by the schema. + * E.g. it may be a name of the property in the container that cannot be + * changed. + * + * The name corresponds to the XML element name in the XML representation of + * the schema. It does NOT correspond to a XSD type name. + * + * Name is optional. If name is not set the null value is returned. If name is + * not set the type is "abstract", does not correspond to the element. + * + * @return the name name of the entity or null. + */ + @Override + @NotNull + public QName getName() { + return name; + } + + public void setName(@NotNull QName name) { + this.name = name; + } + + @Override + public String getNamespace() { + return getName().getNamespaceURI(); + } + + /** + * Return the number of minimal value occurrences. + * + * @return the minOccurs + */ + @Override + public int getMinOccurs() { + return minOccurs; + } + + public void setMinOccurs(int minOccurs) { + this.minOccurs = minOccurs; + } + + /** + * Return the number of maximal value occurrences. + *

+ * Any negative number means "unbounded". + * + * @return the maxOccurs + */ + @Override + public int getMaxOccurs() { + return maxOccurs; + } + + public void setMaxOccurs(int maxOccurs) { + this.maxOccurs = maxOccurs; + } + + /** + * Returns true if property is single-valued. + * + * @return true if property is single-valued. + */ + @Override + public boolean isSingleValue() { + int maxOccurs = getMaxOccurs(); + return maxOccurs >= 0 && maxOccurs <= 1; + } + + /** + * Returns true if property is multi-valued. + * + * @return true if property is multi-valued. + */ + @Override + public boolean isMultiValue() { + int maxOccurs = getMaxOccurs(); + return maxOccurs < 0 || maxOccurs > 1; + } + + /** + * Returns true if property is mandatory. + * + * @return true if property is mandatory. + */ + @Override + public boolean isMandatory() { + return getMinOccurs() > 0; + } + + /** + * Returns true if property is optional. + * + * @return true if property is optional. + */ + @Override + public boolean isOptional() { + return getMinOccurs() == 0; + } + + @Override + public boolean isOperational() { + return operational; + } + + public void setOperational(boolean operational) { + this.operational = operational; + } + + @Override + public boolean isDynamic() { + return dynamic; + } + + public void setDynamic(boolean dynamic) { + this.dynamic = dynamic; + } + + /** + * Returns true if the property can be read. I.e. if it is returned in objects + * retrieved from "get", "search" and similar operations. + */ + @Override + public boolean canRead() { + return canRead; + } + + /** + * Returns true if the item can be modified. I.e. if it can be changed + * during a modification of existing object. + */ + @Override + public boolean canModify() { + return canModify; + } + + /** + * + */ + public void setReadOnly() { + canAdd = false; + canRead = true; + canModify = false; + } + + public void setCanRead(boolean read) { + this.canRead = read; + } + + public void setCanModify(boolean modify) { + this.canModify = modify; + } + + public void setCanAdd(boolean add) { + this.canAdd = add; + } + + /** + * Returns true if the item can be added. I.e. if it can be present + * in the object when a new object is created. + */ + @Override + public boolean canAdd() { + return canAdd; + } + + /** + * Reference to an object that directly or indirectly represents possible values for + * this item. We do not define here what exactly the object has to be. It can be a lookup + * table, script that dynamically produces the values or anything similar. + * The object must produce the values of the correct type for this item otherwise an + * error occurs. + */ + @Override + public PrismReferenceValue getValueEnumerationRef() { + return valueEnumerationRef; + } + + public void setValueEnumerationRef(PrismReferenceValue valueEnumerationRef) { + this.valueEnumerationRef = valueEnumerationRef; + } + + @Override + public boolean isValidFor(QName elementQName, Class clazz) { + return isValidFor(elementQName, clazz, false); + } + + @Override + public boolean isValidFor(@NotNull QName elementQName, @NotNull Class clazz, + boolean caseInsensitive) { + return clazz.isAssignableFrom(this.getClass()) + && QNameUtil.match(elementQName, getName(), caseInsensitive); + } + + @Override + public void adoptElementDefinitionFrom(ItemDefinition otherDef) { + if (otherDef == null) { + return; + } + setName(otherDef.getName()); + setMinOccurs(otherDef.getMinOccurs()); + setMaxOccurs(otherDef.getMaxOccurs()); + } + + // add namespace from the definition if it's safe to do so + protected QName addNamespaceIfApplicable(QName name) { + if (StringUtils.isEmpty(name.getNamespaceURI())) { + if (QNameUtil.match(name, this.name)) { + return this.name; + } + } + return name; + } + + @Override + public T findItemDefinition(@NotNull ItemPath path, @NotNull Class clazz) { + if (path.isEmpty()) { + if (clazz.isAssignableFrom(this.getClass())) { + return (T) this; + } else { + throw new IllegalArgumentException("Looking for definition of class " + clazz + " but found " + this); + } + } else { + throw new IllegalArgumentException("No definition for path " + path + " in " + this); + } + } + + @Override + public abstract ItemDefinition clone(); + + protected void copyDefinitionData(ItemDefinitionImpl clone) { + super.copyDefinitionData(clone); + clone.name = this.name; + clone.minOccurs = this.minOccurs; + clone.maxOccurs = this.maxOccurs; + clone.dynamic = this.dynamic; + clone.canAdd = this.canAdd; + clone.canRead = this.canRead; + clone.canModify = this.canModify; + clone.operational = this.operational; + clone.valueEnumerationRef = this.valueEnumerationRef; + } + + /** + * Make a deep clone, cloning all the sub-items and definitions. + * + * @param ultraDeep if set to true then even the objects that were same instance in the original will be + * cloned as separate instances in the clone. + * + */ + @Override + public ItemDefinition deepClone(boolean ultraDeep) { + if (ultraDeep) { + return deepClone(null); + } else { + return deepClone(new HashMap()); + } + } + + ItemDefinition deepClone(Map ctdMap) { + return clone(); + } + + @Override + public void revive(PrismContext prismContext) { + if (this.prismContext != null) { + return; + } + this.prismContext = prismContext; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = super.hashCode(); + result = prime * result + ((name == null) ? 0 : name.hashCode()); + result = prime * result + maxOccurs; + result = prime * result + minOccurs; + result = prime * result + (canAdd ? 1231 : 1237); + result = prime * result + (canRead ? 1231 : 1237); + result = prime * result + (canModify ? 1231 : 1237); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (!super.equals(obj)) + return false; + if (getClass() != obj.getClass()) + return false; + ItemDefinitionImpl other = (ItemDefinitionImpl) obj; + if (name == null) { + if (other.name != null) + return false; + } else if (!name.equals(other.name)) + return false; + if (maxOccurs != other.maxOccurs) + return false; + if (minOccurs != other.minOccurs) + return false; + if (canAdd != other.canAdd) + return false; + if (canRead != other.canRead) + return false; + if (canModify != other.canModify) + return false; + return true; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(getDebugDumpClassName()); + sb.append(":"); + sb.append(PrettyPrinter.prettyPrint(getName())); + sb.append(" "); + debugDumpShortToString(sb); + return sb.toString(); + } + + /** + * Used in debugDumping items. Does not need to have name in it as item already has it. Does not need + * to have class as that is just too much info that is almost anytime pretty obvious anyway. + */ + void debugDumpShortToString(StringBuilder sb) { + sb.append(PrettyPrinter.prettyPrint(getTypeName())); + debugMultiplicity(sb); + debugFlags(sb); + } + + private void debugMultiplicity(StringBuilder sb) { + sb.append("["); + sb.append(getMinOccurs()); + sb.append(","); + sb.append(getMaxOccurs()); + sb.append("]"); + } + + public String debugMultiplicity() { + StringBuilder sb = new StringBuilder(); + debugMultiplicity(sb); + return sb.toString(); + } + + private void debugFlags(StringBuilder sb) { + if (isIgnored()) { + sb.append(",ignored"); + } + if (isDynamic()) { + sb.append(",dyn"); + } + extendToString(sb); + } + + public String debugFlags() { + StringBuilder sb = new StringBuilder(); + debugFlags(sb); + // This starts with a collon, we do not want it here + if (sb.length() > 0) { + sb.deleteCharAt(0); + } + return sb.toString(); + } + + protected void extendToString(StringBuilder sb) { + sb.append(","); + if (canRead()) { + sb.append("R"); + } else { + sb.append("-"); + } + if (canAdd()) { + sb.append("A"); + } else { + sb.append("-"); + } + if (canModify()) { + sb.append("M"); + } else { + sb.append("-"); + } + if (isRuntimeSchema()) { + sb.append(",runtime"); + } + if (isOperational()) { + sb.append(",oper"); + } + } + +} diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/LocalDefinitionStore.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/LocalDefinitionStore.java new file mode 100644 index 00000000000..df938ba16f8 --- /dev/null +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/LocalDefinitionStore.java @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.prism; + +import com.evolveum.midpoint.prism.path.ItemPath; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import javax.xml.namespace.QName; + +/** + * @author mederly + */ +public interface LocalDefinitionStore { + + // (1) single-name resolution + + // (1a) derived + default ID findItemDefinition(@NotNull QName name) { + return (ID) findItemDefinition(name, ItemDefinition.class); + } + + default PrismPropertyDefinition findPropertyDefinition(@NotNull QName name) { + return findItemDefinition(name, PrismPropertyDefinition.class); + } + + default PrismReferenceDefinition findReferenceDefinition(@NotNull QName name) { + return findItemDefinition(name, PrismReferenceDefinition.class); + } + + default PrismContainerDefinition findContainerDefinition(@NotNull QName name) { + return findItemDefinition(name, PrismContainerDefinition.class); + } + + default PrismContainerDefinition findContainerDefinition(@NotNull String name) { + return findItemDefinition(new QName(name), PrismContainerDefinition.class); + } + + default ID findItemDefinition(@NotNull QName name, @NotNull Class clazz) { + return findItemDefinition(name, clazz, false); + } + + // (1b) core + + @Nullable + ID findItemDefinition(@NotNull QName name, @NotNull Class clazz, boolean caseInsensitive); + + // (2) path resolution + // (2a) derived + + default ID findItemDefinition(@NotNull ItemPath path) { + return (ID) findItemDefinition(path, ItemDefinition.class); + } + + default PrismPropertyDefinition findPropertyDefinition(@NotNull ItemPath path) { + return findItemDefinition(path, PrismPropertyDefinition.class); + } + + default PrismReferenceDefinition findReferenceDefinition(@NotNull ItemPath path) { + return findItemDefinition(path, PrismReferenceDefinition.class); + } + + default PrismContainerDefinition findContainerDefinition(@NotNull ItemPath path) { + return findItemDefinition(path, PrismContainerDefinition.class); + } + + // (2b) core + + ID findItemDefinition(@NotNull ItemPath path, @NotNull Class clazz); + + ID findNamedItemDefinition(@NotNull QName firstName, @NotNull ItemPath rest, @NotNull Class clazz); + +} diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerDefinition.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerDefinition.java index d28632afc1d..98b92cf9701 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerDefinition.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerDefinition.java @@ -17,618 +17,43 @@ package com.evolveum.midpoint.prism; import com.evolveum.midpoint.prism.delta.ContainerDelta; -import com.evolveum.midpoint.prism.delta.ItemDelta; -import com.evolveum.midpoint.prism.path.IdItemPathSegment; import com.evolveum.midpoint.prism.path.ItemPath; -import com.evolveum.midpoint.prism.path.ItemPathSegment; -import com.evolveum.midpoint.prism.path.NameItemPathSegment; -import com.evolveum.midpoint.prism.path.ObjectReferencePathSegment; -import com.evolveum.midpoint.prism.path.ParentPathSegment; -import com.evolveum.midpoint.prism.schema.PrismSchema; -import com.evolveum.midpoint.util.DOMUtil; -import com.evolveum.midpoint.util.DebugDumpable; -import com.evolveum.midpoint.util.DebugUtil; -import com.evolveum.midpoint.util.QNameUtil; import com.evolveum.midpoint.util.exception.SchemaException; import javax.xml.namespace.QName; - -import org.apache.commons.lang.StringUtils; - -import java.util.*; +import java.util.List; /** - * Definition of a property container. - *

- * Property container groups properties into logical blocks. The reason for - * grouping may be as simple as better understandability of data structure. But - * the group usually means different meaning, source or structure of the data. - * For example, the property container is frequently used to hold properties - * that are dynamic, not fixed by a static schema. Such grouping also naturally - * translates to XML and helps to "quarantine" such properties to avoid Unique - * Particle Attribute problems. - *

- * Property Container contains a set of (potentially multi-valued) properties. - * The order of properties is not significant, regardless of the fact that it - * may be fixed in the XML representation. In the XML representation, each - * element inside Property Container must be either Property or a Property - * Container. - *

- * This class represents schema definition for property container. See - * {@link Definition} for more details. - * - * @author Radovan Semancik + * @author mederly */ -public class PrismContainerDefinition extends ItemDefinition> { - - private static final long serialVersionUID = -5068923696147960699L; - - protected ComplexTypeDefinition complexTypeDefinition; - protected Class compileTimeClass; - - /** - * The constructors should be used only occasionally (if used at all). - * Use the factory methods in the ResourceObjectDefintion instead. - */ - public PrismContainerDefinition(QName name, ComplexTypeDefinition complexTypeDefinition, PrismContext prismContext) { - this(name, complexTypeDefinition, prismContext, null); - } - - public PrismContainerDefinition(QName name, ComplexTypeDefinition complexTypeDefinition, PrismContext prismContext, - Class compileTimeClass) { - super(name, determineTypeName(complexTypeDefinition), prismContext); - this.complexTypeDefinition = complexTypeDefinition; - if (complexTypeDefinition == null) { - isRuntimeSchema = true; - super.setDynamic(true); - } else { - isRuntimeSchema = complexTypeDefinition.isXsdAnyMarker(); - super.setDynamic(isRuntimeSchema); - } - this.compileTimeClass = compileTimeClass; - } - - private static QName determineTypeName(ComplexTypeDefinition complexTypeDefinition) { - if (complexTypeDefinition == null) { - // Property container without type: xsd:any - // FIXME: this is kind of hack, but it works now - return DOMUtil.XSD_ANY; - } - return complexTypeDefinition.getTypeName(); - } - - public Class getCompileTimeClass() { - if (compileTimeClass != null) { - return compileTimeClass; - } - if (complexTypeDefinition == null) { - return null; - } - return (Class) complexTypeDefinition.getCompileTimeClass(); - } - - public void setCompileTimeClass(Class compileTimeClass) { - this.compileTimeClass = compileTimeClass; - } - - protected String getSchemaNamespace() { - return getName().getNamespaceURI(); - } - - public ComplexTypeDefinition getComplexTypeDefinition() { - return complexTypeDefinition; - } - - public void setComplexTypeDefinition(ComplexTypeDefinition complexTypeDefinition) { - this.complexTypeDefinition = complexTypeDefinition; - } - - @Override - public boolean isAbstract() { - if (super.isAbstract()) { - return true; - } - if (complexTypeDefinition != null && complexTypeDefinition.isAbstract()) { - return true; - } - return false; - } - - /** - * Returns true if the definition does not define specific items but it is just - * a "wildcard" for any kind of item (usually represented as xsd:any type). - */ - public boolean isWildcard() { - if (getTypeName().equals(DOMUtil.XSD_ANY)) { - return true; - } -// if (complexTypeDefinition != null && complexTypeDefinition.isXsdAnyMarker()) { -// return true; -// } - return false; - } - - @Override - public void revive(PrismContext prismContext) { - if (this.prismContext != null) { - return; - } - this.prismContext = prismContext; - if (complexTypeDefinition != null) { - complexTypeDefinition.revive(prismContext); - } - } - - /* - * TODO clean this up: There are three definition-finding algorithms: - * - findItemDefinition (QName ...) - * - findItemDefinition (ItemPath ...) - * - findPropertyDefinition (ItemPath ...) - * - * This has to be replaced by a single algorithm. - */ - public D findItemDefinition(QName name, Class clazz) { - return findItemDefinition(name, clazz, false); - } - - public D findItemDefinition(QName name, Class clazz, boolean caseInsensitive) { - if (clazz == null) { - throw new IllegalArgumentException("type not specified while searching for " + name + " in " + this); - } - if (name == null) { - throw new IllegalArgumentException("name not specified while searching in " + this); - } - - D itemDefinition; - if (complexTypeDefinition != null) { - itemDefinition = complexTypeDefinition.findItemDefinition(name, clazz, caseInsensitive); - } else { - // xsd:any and similar dynamic definitions - itemDefinition = null; - } - - if (itemDefinition == null && isRuntimeSchema()) { - itemDefinition = findRuntimeItemDefinition(name, null, clazz); // TODO what about case insensitive? - } - return itemDefinition; - } - - public String getDefaultNamespace() { - return complexTypeDefinition != null ? complexTypeDefinition.getDefaultNamespace() : null; - } - - public List getIgnoredNamespaces() { - return complexTypeDefinition != null ? complexTypeDefinition.getIgnoredNamespaces() : null; - } - - private D findRuntimeItemDefinition(QName firstName, ItemPath rest, Class clazz) { - if (prismContext == null) { - return null; // should not occur - } - ItemDefinition definition = null; - if (StringUtils.isEmpty(firstName.getNamespaceURI()) && StringUtils.isNotEmpty(getDefaultNamespace())) { - definition = prismContext.getSchemaRegistry().findItemDefinitionByElementName( - new QName(getDefaultNamespace(), firstName.getLocalPart())); - } - if (definition == null) { - definition = prismContext.getSchemaRegistry().findItemDefinitionByElementName(firstName, getIgnoredNamespaces()); - } - if (definition == null) { - return null; - } - if (rest != null && !rest.isEmpty()) { - return (D) definition.findItemDefinition(rest, clazz); - } - // this is the last step of search - if (clazz.isAssignableFrom(definition.getClass())) { - return (D) definition; - } else { - return null; - } - } - - public ID findItemDefinition(ItemPath path, Class clazz) { - for (;;) { - if (path.isEmpty()) { - if (clazz.isAssignableFrom(PrismContainerDefinition.class)) { - return (ID) this; - } else { - return null; - } - } - ItemPathSegment first = path.first(); - if (first instanceof NameItemPathSegment) { - QName firstName = ((NameItemPathSegment)first).getName(); - return findNamedItemDefinition(firstName, path.rest(), clazz); - } else if (first instanceof IdItemPathSegment) { - path = path.rest(); - } else if (first instanceof ParentPathSegment) { - ItemPath rest = path.rest(); - ComplexTypeDefinition parent = getSchemaRegistry().determineParentDefinition(getComplexTypeDefinition(), rest); - if (rest.isEmpty()) { - // requires that the parent is defined as an item (container, object) - return (ID) getSchemaRegistry().findItemDefinitionByType(parent.getTypeName()); - } else { - return parent.findItemDefinition(rest, clazz); - } - } else if (first instanceof ObjectReferencePathSegment) { - throw new IllegalStateException("Couldn't use '@' path segment in this context. PCD=" + getTypeName() + ", path=" + path); - } else { - throw new IllegalStateException("Unexpected path segment: " + first + " in " + path); - } - } - } - - public ID findNamedItemDefinition(QName firstName, ItemPath rest, Class clazz) { - - // we need to be compatible with older versions..soo if the path does - // not contains qnames with namespaces defined (but the prefix was - // specified) match definition according to the local name - if (StringUtils.isEmpty(firstName.getNamespaceURI())) { - for (ItemDefinition def : getDefinitions()){ - if (QNameUtil.match(firstName, def.getName())){ - return (ID) def.findItemDefinition(rest, clazz); - } - } - } - - for (ItemDefinition def : getDefinitions()) { - if (firstName.equals(def.getName())) { - return (ID) def.findItemDefinition(rest, clazz); - } - } - - if (isRuntimeSchema()) { - return findRuntimeItemDefinition(firstName, rest, clazz); - } - - return null; - } - - public ID findItemDefinition(QName name) { - return (ID)findItemDefinition(name, ItemDefinition.class); - } - - public ID findItemDefinition(ItemPath path) { - return (ID)findItemDefinition(path, ItemDefinition.class); - } - - /** - * Finds a PropertyDefinition by looking at the property name. - *

- * Returns null if nothing is found. - * - * @param name property definition name - * @return found property definition or null - */ - public PrismPropertyDefinition findPropertyDefinition(QName name) { - return findItemDefinition(name, PrismPropertyDefinition.class); - } - - public PrismPropertyDefinition findPropertyDefinition(ItemPath path) { - while (!path.isEmpty() && !(path.first() instanceof NameItemPathSegment)) { - path = path.rest(); - } - if (path.isEmpty()) { - throw new IllegalArgumentException("Property path is empty while searching for property definition in " + this); - } - QName firstName = ((NameItemPathSegment)path.first()).getName(); - if (path.size() == 1) { - return findPropertyDefinition(firstName); - } - PrismContainerDefinition pcd = findContainerDefinition(firstName); - if (pcd == null) { - throw new IllegalArgumentException("There is no " + firstName + " subcontainer in " + this); - } - return pcd.findPropertyDefinition(path.rest()); - } - - public PrismReferenceDefinition findReferenceDefinition(QName name) { - return findItemDefinition(name, PrismReferenceDefinition.class); - } - - public PrismReferenceDefinition findReferenceDefinition(ItemPath path) { - return findItemDefinition(path, PrismReferenceDefinition.class); - } - - /** - * Finds an inner PropertyContainerDefinition by looking at the property container name. - *

- * Returns null if nothing is found. - * - * @param name property container definition name - * @return found property container definition or null - */ - public PrismContainerDefinition findContainerDefinition(QName name) { - return findItemDefinition(name, PrismContainerDefinition.class); - } - - public PrismContainerDefinition findContainerDefinition(String name) { - return findContainerDefinition(new QName(getNamespace(), name)); - } - - /** - * Finds an inner PropertyContainerDefinition by following the property container path. - *

- * Returns null if nothing is found. - * - * @param path property container path - * @return found property container definition or null - */ - public PrismContainerDefinition findContainerDefinition(ItemPath path) { - return findItemDefinition(path, PrismContainerDefinition.class); - } - - /** - * Returns set of property definitions. - *

- * WARNING: This may return definitions from the associated complex type. - * Therefore changing the returned set may influence also the complex type definition. - *

- * The set contains all property definitions of all types that were parsed. - * Order of definitions is insignificant. - * - * @return set of definitions - */ - public List getDefinitions() { - if (complexTypeDefinition == null) { - // e.g. for xsd:any containers - // FIXME - return new ArrayList(); - } - return complexTypeDefinition.getDefinitions(); - } - - /** - * Returns set of property definitions. - *

- * The set contains all property definitions of all types that were parsed. - * Order of definitions is insignificant. - *

- * The returned set is immutable! All changes may be lost. - * - * @return set of definitions - */ - public List getPropertyDefinitions() { - List props = new ArrayList(); - for (ItemDefinition def : complexTypeDefinition.getDefinitions()) { - if (def instanceof PrismPropertyDefinition) { - props.add((PrismPropertyDefinition) def); - } - } - return props; - } - - /** - * Create property container instance with a default name. - *

- * This is a preferred way how to create property container. - */ - @Override - public PrismContainer instantiate() throws SchemaException { - return instantiate(getName()); - } - - /** - * Create property container instance with a specified name and element. - *

- * This is a preferred way how to create property container. - */ - @Override - public PrismContainer instantiate(QName elementName) throws SchemaException { - if (isAbstract()) { - throw new SchemaException("Cannot instantiate abstract definition "+this); - } - elementName = addNamespaceIfApplicable(elementName); - return new PrismContainer(elementName, this, prismContext); - } - - @Override - public ContainerDelta createEmptyDelta(ItemPath path) { - return new ContainerDelta(path, this, prismContext); - } - - /** - * Shallow clone - */ - @Override - public PrismContainerDefinition clone() { - PrismContainerDefinition clone = new PrismContainerDefinition(name, complexTypeDefinition, prismContext, compileTimeClass); - copyDefinitionData(clone); - return clone; - } +public interface PrismContainerDefinition extends ItemDefinition>, LocalDefinitionStore { - protected void copyDefinitionData(PrismContainerDefinition clone) { - super.copyDefinitionData(clone); - clone.complexTypeDefinition = this.complexTypeDefinition; - clone.compileTimeClass = this.compileTimeClass; - } - - @Override - ItemDefinition deepClone(Map ctdMap) { - PrismContainerDefinition clone = clone(); - ComplexTypeDefinition ctd = getComplexTypeDefinition(); - if (ctd != null) { - ctd = ctd.deepClone(ctdMap); - clone.setComplexTypeDefinition(ctd); - } - return clone; - } + Class getCompileTimeClass(); - public PrismContainerDefinition cloneWithReplacedDefinition(QName itemName, ItemDefinition newDefinition) { - PrismContainerDefinition clone = clone(); - ComplexTypeDefinition originalComplexTypeDefinition = getComplexTypeDefinition(); - ComplexTypeDefinition cloneComplexTypeDefinition = originalComplexTypeDefinition.clone(); - clone.setComplexTypeDefinition(cloneComplexTypeDefinition); - cloneComplexTypeDefinition.replaceDefinition(itemName, newDefinition); - return clone; - } + ComplexTypeDefinition getComplexTypeDefinition(); - /** - * Creates new instance of property definition and adds it to the container. - *

- * This is the preferred method of creating a new definition. - * - * @param name name of the property (element name) - * @param typeName XSD type of the property - * @return created property definition - */ - public PrismPropertyDefinition createPropertyDefinition(QName name, QName typeName) { - PrismPropertyDefinition propDef = new PrismPropertyDefinition(name, typeName, prismContext); - addDefinition(propDef); - return propDef; - } - - private void addDefinition(ItemDefinition itemDef) { - ((Collection)getDefinitions()).add(itemDef); - } + boolean isWildcard(); - /** - * Creates new instance of property definition and adds it to the container. - *

- * This is the preferred method of creating a new definition. - * - * @param name name of the property (element name) - * @param typeName XSD type of the property - * @param minOccurs minimal number of occurrences - * @param maxOccurs maximal number of occurrences (-1 means unbounded) - * @return created property definition - */ - public PrismPropertyDefinition createPropertyDefinition(QName name, QName typeName, - int minOccurs, int maxOccurs) { - PrismPropertyDefinition propDef = new PrismPropertyDefinition(name, typeName, prismContext); - propDef.setMinOccurs(minOccurs); - propDef.setMaxOccurs(maxOccurs); - addDefinition(propDef); - return propDef; - } + @Override + void revive(PrismContext prismContext); - // Creates reference to other schema - // TODO: maybe check if the name is in different namespace - // TODO: maybe create entirely new concept of property reference? - public PrismPropertyDefinition createPropertyDefinition(QName name) { - PrismPropertyDefinition propDef = new PrismPropertyDefinition(name, null, prismContext); - addDefinition(propDef); - return propDef; - } + String getDefaultNamespace(); - /** - * Creates new instance of property definition and adds it to the container. - *

- * This is the preferred method of creating a new definition. - * - * @param localName name of the property (element name) relative to the schema namespace - * @param typeName XSD type of the property - * @return created property definition - */ - public PrismPropertyDefinition createPropertyDefinition(String localName, QName typeName) { - QName name = new QName(getSchemaNamespace(), localName); - return createPropertyDefinition(name, typeName); - } + List getIgnoredNamespaces(); - /** - * Creates new instance of property definition and adds it to the container. - *

- * This is the preferred method of creating a new definition. - * - * @param localName name of the property (element name) relative to the schema namespace - * @param localTypeName XSD type of the property - * @return created property definition - */ - public PrismPropertyDefinition createPropertyDefinition(String localName, String localTypeName) { - QName name = new QName(getSchemaNamespace(), localName); - QName typeName = new QName(getSchemaNamespace(), localTypeName); - return createPropertyDefinition(name, typeName); - } + List getDefinitions(); - /** - * Creates new instance of property definition and adds it to the container. - *

- * This is the preferred method of creating a new definition. - * - * @param localName name of the property (element name) relative to the schema namespace - * @param localTypeName XSD type of the property - * @param minOccurs minimal number of occurrences - * @param maxOccurs maximal number of occurrences (-1 means unbounded) - * @return created property definition - */ - public PrismPropertyDefinition createPropertyDefinition(String localName, String localTypeName, - int minOccurs, int maxOccurs) { - QName name = new QName(getSchemaNamespace(), localName); - QName typeName = new QName(getSchemaNamespace(), localTypeName); - PrismPropertyDefinition propertyDefinition = createPropertyDefinition(name, typeName); - propertyDefinition.setMinOccurs(minOccurs); - propertyDefinition.setMaxOccurs(maxOccurs); - return propertyDefinition; - } - - public PrismContainerDefinition createContainerDefinition(QName name, QName typeName) { - return createContainerDefinition(name, typeName, 1, 1); - } - - public PrismContainerDefinition createContainerDefinition(QName name, QName typeName, - int minOccurs, int maxOccurs) { - PrismSchema typeSchema = prismContext.getSchemaRegistry().findSchemaByNamespace(typeName.getNamespaceURI()); - if (typeSchema == null) { - throw new IllegalArgumentException("Schema for namespace "+typeName.getNamespaceURI()+" is not known in the prism context"); - } - ComplexTypeDefinition typeDefinition = typeSchema.findComplexTypeDefinition(typeName); - if (typeDefinition == null) { - throw new IllegalArgumentException("Type "+typeName+" is not known in the schema"); - } - return createContainerDefinition(name, typeDefinition, minOccurs, maxOccurs); - } - - public PrismContainerDefinition createContainerDefinition(QName name, ComplexTypeDefinition complexTypeDefinition, - int minOccurs, int maxOccurs) { - PrismContainerDefinition def = new PrismContainerDefinition(name, complexTypeDefinition, prismContext); - def.setMinOccurs(minOccurs); - def.setMaxOccurs(maxOccurs); - addDefinition(def); - return def; - } - - public PrismContainerValue createValue() { - return new PrismContainerValue(prismContext); - } + List getPropertyDefinitions(); - @Override - public String debugDump(int indent) { - StringBuilder sb = new StringBuilder(); - DebugUtil.indentDebugDump(sb, indent); - sb.append(toString()); - if (isRuntimeSchema()) { - sb.append(" dynamic"); - } - for (Definition def : getDefinitions()) { - sb.append("\n"); - if (def == this) { - // Not perfect loop protection, but works for now - DebugUtil.indentDebugDump(sb, indent); - sb.append(""); - } else { - sb.append(def.debugDump(indent + 1)); - } - } - return sb.toString(); - } + @Override + ContainerDelta createEmptyDelta(ItemPath path); + @Override + PrismContainerDefinition clone(); - public boolean isEmpty() { - return complexTypeDefinition.isEmpty(); - } - - /** - * Return a human readable name of this class suitable for logs. - */ - @Override - protected String getDebugDumpClassName() { - return "PCD"; - } + PrismContainerDefinition cloneWithReplacedDefinition(QName itemName, ItemDefinition newDefinition); - @Override - public String getDocClassName() { - return "container"; - } + PrismContainerValue createValue(); + boolean isEmpty(); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerDefinitionImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerDefinitionImpl.java new file mode 100644 index 00000000000..7f7b63a0c5a --- /dev/null +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerDefinitionImpl.java @@ -0,0 +1,563 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.prism; + +import com.evolveum.midpoint.prism.delta.ContainerDelta; +import com.evolveum.midpoint.prism.delta.ItemDelta; +import com.evolveum.midpoint.prism.path.IdItemPathSegment; +import com.evolveum.midpoint.prism.path.ItemPath; +import com.evolveum.midpoint.prism.path.ItemPathSegment; +import com.evolveum.midpoint.prism.path.NameItemPathSegment; +import com.evolveum.midpoint.prism.path.ObjectReferencePathSegment; +import com.evolveum.midpoint.prism.path.ParentPathSegment; +import com.evolveum.midpoint.prism.schema.PrismSchema; +import com.evolveum.midpoint.util.DOMUtil; +import com.evolveum.midpoint.util.DebugDumpable; +import com.evolveum.midpoint.util.DebugUtil; +import com.evolveum.midpoint.util.QNameUtil; +import com.evolveum.midpoint.util.exception.SchemaException; + +import javax.xml.namespace.QName; + +import org.apache.commons.lang.StringUtils; +import org.jetbrains.annotations.NotNull; + +import java.util.*; + +/** + * Definition of a property container. + *

+ * Property container groups properties into logical blocks. The reason for + * grouping may be as simple as better understandability of data structure. But + * the group usually means different meaning, source or structure of the data. + * For example, the property container is frequently used to hold properties + * that are dynamic, not fixed by a static schema. Such grouping also naturally + * translates to XML and helps to "quarantine" such properties to avoid Unique + * Particle Attribute problems. + *

+ * Property Container contains a set of (potentially multi-valued) properties. + * The order of properties is not significant, regardless of the fact that it + * may be fixed in the XML representation. In the XML representation, each + * element inside Property Container must be either Property or a Property + * Container. + *

+ * This class represents schema definition for property container. See + * {@link Definition} for more details. + * + * @author Radovan Semancik + */ +public class PrismContainerDefinitionImpl extends ItemDefinitionImpl> + implements PrismContainerDefinition { + + private static final long serialVersionUID = -5068923696147960699L; + + // There are situations where CTD is (maybe) null but class is defined. + // TODO clean up this. + protected ComplexTypeDefinition complexTypeDefinition; + protected Class compileTimeClass; + + /** + * The constructors should be used only occasionally (if used at all). + * Use the factory methods in the ResourceObjectDefintion instead. + */ + public PrismContainerDefinitionImpl(@NotNull QName name, ComplexTypeDefinition complexTypeDefinition, @NotNull PrismContext prismContext) { + this(name, complexTypeDefinition, prismContext, null); + } + + public PrismContainerDefinitionImpl(@NotNull QName name, ComplexTypeDefinition complexTypeDefinition, @NotNull PrismContext prismContext, + Class compileTimeClass) { + super(name, determineTypeName(complexTypeDefinition), prismContext); + this.complexTypeDefinition = complexTypeDefinition; + if (complexTypeDefinition == null) { + isRuntimeSchema = true; + super.setDynamic(true); + } else { + isRuntimeSchema = complexTypeDefinition.isXsdAnyMarker(); + super.setDynamic(isRuntimeSchema); + } + this.compileTimeClass = compileTimeClass; + } + + private static QName determineTypeName(ComplexTypeDefinition complexTypeDefinition) { + if (complexTypeDefinition == null) { + // Property container without type: xsd:any + // FIXME: this is kind of hack, but it works now + return DOMUtil.XSD_ANY; + } + return complexTypeDefinition.getTypeName(); + } + + @Override + public Class getCompileTimeClass() { + if (compileTimeClass != null) { + return compileTimeClass; + } + if (complexTypeDefinition == null) { + return null; + } + return (Class) complexTypeDefinition.getCompileTimeClass(); + } + + public void setCompileTimeClass(Class compileTimeClass) { + this.compileTimeClass = compileTimeClass; + } + + protected String getSchemaNamespace() { + return getName().getNamespaceURI(); + } + + @Override + public ComplexTypeDefinition getComplexTypeDefinition() { + return complexTypeDefinition; + } + + public void setComplexTypeDefinition(ComplexTypeDefinition complexTypeDefinition) { + this.complexTypeDefinition = complexTypeDefinition; + } + + @Override + public boolean isAbstract() { + if (super.isAbstract()) { + return true; + } + return complexTypeDefinition != null && complexTypeDefinition.isAbstract(); + } + + /** + * Returns true if the definition does not define specific items but it is just + * a "wildcard" for any kind of item (usually represented as xsd:any type). + */ + @Override + public boolean isWildcard() { + if (getTypeName().equals(DOMUtil.XSD_ANY)) { + return true; + } +// if (complexTypeDefinition != null && complexTypeDefinition.isXsdAnyMarker()) { +// return true; +// } + return false; + } + + @Override + public void revive(PrismContext prismContext) { + if (this.prismContext != null) { + return; + } + this.prismContext = prismContext; + if (complexTypeDefinition != null) { + complexTypeDefinition.revive(prismContext); + } + } + + @Override + public D findItemDefinition(@NotNull QName name, @NotNull Class clazz, boolean caseInsensitive) { + D itemDefinition; + if (complexTypeDefinition != null) { + itemDefinition = complexTypeDefinition.findItemDefinition(name, clazz, caseInsensitive); + } else { + // xsd:any and similar dynamic definitions + itemDefinition = null; + } + + if (itemDefinition == null && isRuntimeSchema()) { + itemDefinition = findRuntimeItemDefinition(name, null, clazz); // TODO what about case insensitive? + } + return itemDefinition; + } + + @Override + public String getDefaultNamespace() { + return complexTypeDefinition != null ? complexTypeDefinition.getDefaultNamespace() : null; + } + + @Override + public List getIgnoredNamespaces() { + return complexTypeDefinition != null ? complexTypeDefinition.getIgnoredNamespaces() : null; + } + + private D findRuntimeItemDefinition(QName firstName, ItemPath rest, Class clazz) { + if (prismContext == null) { + return null; // should not occur + } + ItemDefinition definition = null; + if (StringUtils.isEmpty(firstName.getNamespaceURI()) && StringUtils.isNotEmpty(getDefaultNamespace())) { + definition = prismContext.getSchemaRegistry().findItemDefinitionByElementName( + new QName(getDefaultNamespace(), firstName.getLocalPart())); + } + if (definition == null) { + definition = prismContext.getSchemaRegistry().findItemDefinitionByElementName(firstName, getIgnoredNamespaces()); + } + if (definition == null) { + return null; + } + if (rest != null && !rest.isEmpty()) { + return (D) definition.findItemDefinition(rest, clazz); + } + // this is the last step of search + if (clazz.isAssignableFrom(definition.getClass())) { + return (D) definition; + } else { + return null; + } + } + + public ID findItemDefinition(@NotNull ItemPath path, @NotNull Class clazz) { + for (;;) { + if (path.isEmpty()) { + if (clazz.isAssignableFrom(PrismContainerDefinition.class)) { + return (ID) this; + } else { + return null; + } + } + ItemPathSegment first = path.first(); + if (first instanceof NameItemPathSegment) { + QName firstName = ((NameItemPathSegment)first).getName(); + return findNamedItemDefinition(firstName, path.rest(), clazz); + } else if (first instanceof IdItemPathSegment) { + path = path.rest(); + } else if (first instanceof ParentPathSegment) { + ItemPath rest = path.rest(); + ComplexTypeDefinition parent = getSchemaRegistry().determineParentDefinition(getComplexTypeDefinition(), rest); + if (rest.isEmpty()) { + // requires that the parent is defined as an item (container, object) + return (ID) getSchemaRegistry().findItemDefinitionByType(parent.getTypeName()); + } else { + return parent.findItemDefinition(rest, clazz); + } + } else if (first instanceof ObjectReferencePathSegment) { + throw new IllegalStateException("Couldn't use '@' path segment in this context. PCD=" + getTypeName() + ", path=" + path); + } else { + throw new IllegalStateException("Unexpected path segment: " + first + " in " + path); + } + } + } + + @Override + public ID findNamedItemDefinition(@NotNull QName firstName, @NotNull ItemPath rest, @NotNull Class clazz) { + + // we need to be compatible with older versions..soo if the path does + // not contains qnames with namespaces defined (but the prefix was + // specified) match definition according to the local name + if (StringUtils.isEmpty(firstName.getNamespaceURI())) { + for (ItemDefinition def : getDefinitions()){ + if (QNameUtil.match(firstName, def.getName())){ + return (ID) def.findItemDefinition(rest, clazz); + } + } + } + + for (ItemDefinition def : getDefinitions()) { + if (firstName.equals(def.getName())) { + return (ID) def.findItemDefinition(rest, clazz); + } + } + + if (isRuntimeSchema()) { + return findRuntimeItemDefinition(firstName, rest, clazz); + } + + return null; + } + +// @Override +// public PrismPropertyDefinition findPropertyDefinition(ItemPath path) { +// while (!path.isEmpty() && !(path.first() instanceof NameItemPathSegment)) { +// path = path.rest(); +// } +// if (path.isEmpty()) { +// throw new IllegalArgumentException("Property path is empty while searching for property definition in " + this); +// } +// QName firstName = ((NameItemPathSegment)path.first()).getName(); +// if (path.size() == 1) { +// return findPropertyDefinition(firstName); +// } +// PrismContainerDefinition pcd = findContainerDefinition(firstName); +// if (pcd == null) { +// throw new IllegalArgumentException("There is no " + firstName + " subcontainer in " + this); +// } +// return pcd.findPropertyDefinition(path.rest()); +// } + + /** + * Returns set of property definitions. + *

+ * WARNING: This may return definitions from the associated complex type. + * Therefore changing the returned set may influence also the complex type definition. + *

+ * The set contains all property definitions of all types that were parsed. + * Order of definitions is insignificant. + * + * @return set of definitions + */ + @Override + public List getDefinitions() { + if (complexTypeDefinition == null) { + // e.g. for xsd:any containers + // FIXME + return new ArrayList<>(); + } + return complexTypeDefinition.getDefinitions(); + } + + /** + * Returns set of property definitions. + *

+ * The set contains all property definitions of all types that were parsed. + * Order of definitions is insignificant. + *

+ * The returned set is immutable! All changes may be lost. + * + * @return set of definitions + */ + @Override + public List getPropertyDefinitions() { + List props = new ArrayList(); + for (ItemDefinition def : complexTypeDefinition.getDefinitions()) { + if (def instanceof PrismPropertyDefinition) { + props.add((PrismPropertyDefinition) def); + } + } + return props; + } + + @Override + public PrismContainer instantiate() throws SchemaException { + return instantiate(getName()); + } + + @Override + public PrismContainer instantiate(QName elementName) throws SchemaException { + if (isAbstract()) { + throw new SchemaException("Cannot instantiate abstract definition "+this); + } + elementName = addNamespaceIfApplicable(elementName); + return new PrismContainer(elementName, this, prismContext); + } + + @Override + public ContainerDelta createEmptyDelta(ItemPath path) { + return new ContainerDelta(path, this, prismContext); + } + + /** + * Shallow clone + */ + @Override + public PrismContainerDefinitionImpl clone() { + PrismContainerDefinitionImpl clone = new PrismContainerDefinitionImpl(name, complexTypeDefinition, prismContext, compileTimeClass); + copyDefinitionData(clone); + return clone; + } + + protected void copyDefinitionData(PrismContainerDefinitionImpl clone) { + super.copyDefinitionData(clone); + clone.complexTypeDefinition = this.complexTypeDefinition; + clone.compileTimeClass = this.compileTimeClass; + } + + @Override + ItemDefinition deepClone(Map ctdMap) { + PrismContainerDefinitionImpl clone = clone(); + ComplexTypeDefinitionImpl ctd = (ComplexTypeDefinitionImpl) getComplexTypeDefinition(); + if (ctd != null) { + ctd = ctd.deepClone(ctdMap); + clone.setComplexTypeDefinition(ctd); + } + return clone; + } + + @Override + public PrismContainerDefinition cloneWithReplacedDefinition(QName itemName, ItemDefinition newDefinition) { + PrismContainerDefinitionImpl clone = clone(); + ComplexTypeDefinition originalComplexTypeDefinition = getComplexTypeDefinition(); + ComplexTypeDefinition cloneComplexTypeDefinition = originalComplexTypeDefinition.clone(); + clone.setComplexTypeDefinition(cloneComplexTypeDefinition); + ((ComplexTypeDefinitionImpl) cloneComplexTypeDefinition).replaceDefinition(itemName, newDefinition); + return clone; + } + + /** + * Creates new instance of property definition and adds it to the container. + *

+ * This is the preferred method of creating a new definition. + * + * @param name name of the property (element name) + * @param typeName XSD type of the property + * @return created property definition + */ + public PrismPropertyDefinitionImpl createPropertyDefinition(QName name, QName typeName) { + PrismPropertyDefinitionImpl propDef = new PrismPropertyDefinitionImpl(name, typeName, prismContext); + addDefinition(propDef); + return propDef; + } + + private void addDefinition(ItemDefinition itemDef) { + ((Collection)getDefinitions()).add(itemDef); + } + + /** + * Creates new instance of property definition and adds it to the container. + *

+ * This is the preferred method of creating a new definition. + * + * @param name name of the property (element name) + * @param typeName XSD type of the property + * @param minOccurs minimal number of occurrences + * @param maxOccurs maximal number of occurrences (-1 means unbounded) + * @return created property definition + */ + public PrismPropertyDefinition createPropertyDefinition(QName name, QName typeName, + int minOccurs, int maxOccurs) { + PrismPropertyDefinitionImpl propDef = new PrismPropertyDefinitionImpl(name, typeName, prismContext); + propDef.setMinOccurs(minOccurs); + propDef.setMaxOccurs(maxOccurs); + addDefinition(propDef); + return propDef; + } + + // Creates reference to other schema + // TODO: maybe check if the name is in different namespace + // TODO: maybe create entirely new concept of property reference? + public PrismPropertyDefinition createPropertyDefinition(QName name) { + PrismPropertyDefinition propDef = new PrismPropertyDefinitionImpl(name, null, prismContext); + addDefinition(propDef); + return propDef; + } + + /** + * Creates new instance of property definition and adds it to the container. + *

+ * This is the preferred method of creating a new definition. + * + * @param localName name of the property (element name) relative to the schema namespace + * @param typeName XSD type of the property + * @return created property definition + */ + public PrismPropertyDefinition createPropertyDefinition(String localName, QName typeName) { + QName name = new QName(getSchemaNamespace(), localName); + return createPropertyDefinition(name, typeName); + } + + /** + * Creates new instance of property definition and adds it to the container. + *

+ * This is the preferred method of creating a new definition. + * + * @param localName name of the property (element name) relative to the schema namespace + * @param localTypeName XSD type of the property + * @return created property definition + */ + public PrismPropertyDefinition createPropertyDefinition(String localName, String localTypeName) { + QName name = new QName(getSchemaNamespace(), localName); + QName typeName = new QName(getSchemaNamespace(), localTypeName); + return createPropertyDefinition(name, typeName); + } + + /** + * Creates new instance of property definition and adds it to the container. + *

+ * This is the preferred method of creating a new definition. + * + * @param localName name of the property (element name) relative to the schema namespace + * @param localTypeName XSD type of the property + * @param minOccurs minimal number of occurrences + * @param maxOccurs maximal number of occurrences (-1 means unbounded) + * @return created property definition + */ + public PrismPropertyDefinition createPropertyDefinition(String localName, String localTypeName, + int minOccurs, int maxOccurs) { + QName name = new QName(getSchemaNamespace(), localName); + QName typeName = new QName(getSchemaNamespace(), localTypeName); + PrismPropertyDefinitionImpl propertyDefinition = createPropertyDefinition(name, typeName); + propertyDefinition.setMinOccurs(minOccurs); + propertyDefinition.setMaxOccurs(maxOccurs); + return propertyDefinition; + } + + public PrismContainerDefinition createContainerDefinition(QName name, QName typeName) { + return createContainerDefinition(name, typeName, 1, 1); + } + + public PrismContainerDefinition createContainerDefinition(QName name, QName typeName, + int minOccurs, int maxOccurs) { + PrismSchema typeSchema = prismContext.getSchemaRegistry().findSchemaByNamespace(typeName.getNamespaceURI()); + if (typeSchema == null) { + throw new IllegalArgumentException("Schema for namespace "+typeName.getNamespaceURI()+" is not known in the prism context"); + } + ComplexTypeDefinition typeDefinition = typeSchema.findComplexTypeDefinition(typeName); + if (typeDefinition == null) { + throw new IllegalArgumentException("Type "+typeName+" is not known in the schema"); + } + return createContainerDefinition(name, typeDefinition, minOccurs, maxOccurs); + } + + public PrismContainerDefinition createContainerDefinition(QName name, ComplexTypeDefinition complexTypeDefinition, + int minOccurs, int maxOccurs) { + PrismContainerDefinitionImpl def = new PrismContainerDefinitionImpl(name, complexTypeDefinition, prismContext); + def.setMinOccurs(minOccurs); + def.setMaxOccurs(maxOccurs); + addDefinition(def); + return def; + } + + @Override + public PrismContainerValue createValue() { + return new PrismContainerValue(prismContext); + } + + @Override + public String debugDump(int indent) { + StringBuilder sb = new StringBuilder(); + DebugUtil.indentDebugDump(sb, indent); + sb.append(toString()); + if (isRuntimeSchema()) { + sb.append(" dynamic"); + } + for (Definition def : getDefinitions()) { + sb.append("\n"); + if (def == this) { + // Not perfect loop protection, but works for now + DebugUtil.indentDebugDump(sb, indent); + sb.append(""); + } else { + sb.append(def.debugDump(indent + 1)); + } + } + return sb.toString(); + } + + + @Override + public boolean isEmpty() { + return complexTypeDefinition.isEmpty(); + } + + /** + * Return a human readable name of this class suitable for logs. + */ + @Override + protected String getDebugDumpClassName() { + return "PCD"; + } + + @Override + public String getDocClassName() { + return "container"; + } + +} diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerValue.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerValue.java index 73c255b91d0..cccc72fead9 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerValue.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerValue.java @@ -16,24 +16,16 @@ package com.evolveum.midpoint.prism; import java.lang.reflect.Modifier; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Set; +import java.util.*; import javax.xml.namespace.QName; import com.evolveum.midpoint.prism.delta.ItemDelta; import com.evolveum.midpoint.prism.marshaller.JaxbDomHack; -import com.evolveum.midpoint.prism.marshaller.XNodeProcessor; import com.evolveum.midpoint.prism.path.IdItemPathSegment; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.path.ItemPathSegment; import com.evolveum.midpoint.prism.path.NameItemPathSegment; -import com.evolveum.midpoint.prism.xnode.MapXNode; -import com.evolveum.midpoint.prism.xnode.XNode; import com.evolveum.midpoint.util.DebugDumpable; import com.evolveum.midpoint.util.DebugUtil; import com.evolveum.midpoint.util.MiscUtil; @@ -47,6 +39,7 @@ import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.Validate; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; /** * @author semancik @@ -61,31 +54,12 @@ public class PrismContainerValue extends PrismValue imp private List> items = null; private Long id; - // XNode map of all sub-elements in this container value. - private MapXNode rawXNode = null; - // The elements are set during a schema-less parsing, e.g. during a dumb JAXB parsing of the object - // We can't do anything smarter, as we don't have definition nor prism context. We cannot even convert - // this to XNode because no prism context means no parser. - // So we store the raw elements here and process them later (e.g. during applyDefinition). - private List rawElements = null; - private C containerable = null; - /** - * Concrete type of the containerable value. It is the declared container type or any of its subtypes. - * If null, it is considered to be the declared type itself. - * - * (It is advisable to keep it null when the concrete type is the same as declared type - * in order to prevent the serialized form from having unnecessary type QName declaration, - * as currently this information is directly serialized into value's MapXNode representation - * as type attribute.) - * - * Currently this feature is "half-baked" and experimental. If you need it, you have to set it up explicitly - * when creating your container value. - */ - private QName concreteType = null; - - private PrismContainerDefinition concreteTypeDefinition = null; // lazily evaluated + // Definition of this value. Usually it is the same as CTD declared in the parent container. + // However, in order to support polymorphism (as well as parent-less values) we distinguish between PC and PCV type definition. + // It can be lazily evaluated based on containerable value. + private ComplexTypeDefinition complexTypeDefinition = null; transient private PrismContext prismContext; @@ -105,24 +79,15 @@ public PrismContainerValue(C containerable, PrismContext prismContext) { this.prismContext = prismContext; } - private void setPrismContext(PrismContext prismContext) { - //Validate.notNull(prismContext, "No prismContext in PrismContainerValue"); // not yet - //if (prismContext == null) { - // LOGGER.warn("No prismContext in PrismContainerValue"); - //} this.prismContext = prismContext; } - - private PrismContainerValue(OriginType type, Objectable source, PrismContainerable container, Long id, QName concreteType) { + + public PrismContainerValue(OriginType type, Objectable source, PrismContainerable container, Long id, ComplexTypeDefinition complexTypeDefinition, PrismContext prismContext) { super(type, source, container); this.id = id; - this.concreteType = concreteType; - } - - public PrismContainerValue(OriginType type, Objectable source, PrismContainerable container, Long id, QName concreteType, PrismContext prismContext) { - this(type, source, container, id, concreteType); - setPrismContext(prismContext); + this.complexTypeDefinition = complexTypeDefinition; + this.prismContext = prismContext; } @Override @@ -130,6 +95,9 @@ public PrismContext getPrismContext() { if (prismContext != null) { return prismContext; } + if (complexTypeDefinition != null && complexTypeDefinition.getPrismContext() != null) { + return complexTypeDefinition.getPrismContext(); + } if (getParent() != null) { return getParent().getPrismContext(); } @@ -148,11 +116,15 @@ public PrismContext getPrismContext() { */ public List> getItems() { - return items; + if (isImmutable()) { + return Collections.unmodifiableList(items); + } else { + return items; + } } public Item getNextItem(Item referenceItem) { - if (items == null){ + if (items == null) { return null; } Iterator> iterator = items.iterator(); @@ -175,7 +147,8 @@ public Item getPreviousItem(Item referenceItem) { } Item lastItem = null; Iterator> iterator = items.iterator(); - while (iterator.hasNext()) { + //noinspection WhileLoopReplaceableByForEach + while (iterator.hasNext()) { Item item = iterator.next(); if (item == referenceItem) { return lastItem; @@ -230,10 +203,6 @@ public PrismContainerable getParent() { return (PrismContainerable)parent; } - void setParent(PrismContainerable container) { - super.setParent(container); - } - @SuppressWarnings("unchecked") public PrismContainer getContainer() { Itemable parent = super.getParent(); @@ -247,10 +216,6 @@ public PrismContainer getContainer() { return (PrismContainer)super.getParent(); } - void setParent(PrismContainer container) { - super.setParent(container); - } - @NotNull public ItemPath getPath() { Itemable parent = getParent(); @@ -275,62 +240,40 @@ public C asContainerable() { if (containerable != null) { return containerable; } - - PrismContainerable parent = getParent(); - PrismContainerDefinition concreteTypeDefinition = getConcreteTypeDefinition(); - - if (parent == null && concreteTypeDefinition == null) { - throw new IllegalStateException("Cannot represent container value without a parent and concrete type definition as containerable; value: " + this); + if (getParent() == null && complexTypeDefinition == null) { + throw new IllegalStateException("Cannot represent container value without a parent and complex type definition as containerable; value: " + this); } - - Class clazz = null; - if (concreteTypeDefinition != null && concreteTypeDefinition.getCompileTimeClass() != null) { - clazz = concreteTypeDefinition.getCompileTimeClass(); - } - if (clazz == null && parent != null) { - clazz = parent.getCompileTimeClass(); - } - if (clazz == null) { - QName elementName = parent != null ? parent.getElementName() : concreteTypeDefinition.getName(); - throw new SystemException("Unknown compile time class of container '" + elementName + "'."); - } - if (Modifier.isAbstract(clazz.getModifiers())) { - throw new SystemException("Can't create instance of class '" + clazz.getSimpleName() + "', it's abstract."); - } - return asContainerableInternal(clazz); + return asContainerableInternal(resolveClass(null)); } - private Class resolveConcreteClass(PrismContainerable parent) { - Class clazz; - PrismContainerDefinition containerDefinition = parent.getPrismContext().getSchemaRegistry().findContainerDefinitionByType(concreteType); - if (containerDefinition == null) { - throw new IllegalStateException("A definition for an explicit type " + concreteType + " of a container " + parent.getElementName() + " value couldn't be found"); - } - clazz = containerDefinition.getCompileTimeClass(); - if (clazz == null) { - throw new IllegalStateException("A definition for an explicit type " + concreteType + " of a container " + parent.getElementName() + " value has no compile-time class specified"); - } - return clazz; - } - - public C asContainerable(Class defaultClazz) { + public C asContainerable(Class defaultClass) { if (containerable != null) { return containerable; } - - Class clazz = defaultClazz; - if (concreteType != null) { - PrismContainerable parent = getParent(); - if (parent != null) { - clazz = resolveConcreteClass(parent); - } else { - throw new IllegalStateException("Cannot determine compile-time class for concrete type " + concreteType + " because the respective prism container value has no parent"); - } - } - return asContainerableInternal(clazz); + return asContainerableInternal(resolveClass(defaultClass)); } - private C asContainerableInternal(Class clazz) { + private Class resolveClass(Class defaultClass) { + Class clazz = defaultClass; + if (complexTypeDefinition != null && complexTypeDefinition.getCompileTimeClass() != null) { + clazz = (Class) complexTypeDefinition.getCompileTimeClass(); + } else { + PrismContainerable parent = getParent(); + if (parent != null && parent.getCompileTimeClass() != null) { + clazz = parent.getCompileTimeClass(); // TODO is this ok? + } + } + return clazz; + } + + private C asContainerableInternal(Class clazz) { + if (clazz == null) { + String elementName = getParent() != null ? String.valueOf(getParent().getElementName()) : String.valueOf(this); + throw new SystemException("Unknown compile time class of container value of '" + elementName + "'."); + } + if (Modifier.isAbstract(clazz.getModifiers())) { + throw new SystemException("Can't create instance of class '" + clazz.getSimpleName() + "', it's abstract."); + } try { containerable = clazz.newInstance(); containerable.setupContainerValue(this); @@ -343,7 +286,7 @@ private C asContainerableInternal(Class clazz) { } public Collection getPropertyNames() { - Collection names = new HashSet(); + Collection names = new HashSet<>(); for (PrismProperty prop: getProperties()) { names.add(prop.getElementName()); } @@ -361,12 +304,12 @@ public boolean add(Item * @throws SchemaException * @throws IllegalArgumentException an attempt to add value that already exists */ - public boolean add(Item item, boolean checkUniquness) throws SchemaException { + public boolean add(Item item, boolean checkUniqueness) throws SchemaException { checkMutability(); if (item.getElementName() == null) { throw new IllegalArgumentException("Cannot add item without a name to value of container "+getParent()); } - if (checkUniquness && findItem(item.getElementName(), Item.class) != null) { + if (checkUniqueness && findItem(item.getElementName(), Item.class) != null) { throw new IllegalArgumentException("Item " + item.getElementName() + " is already present in " + this.getClass().getSimpleName()); } item.setParent(this); @@ -374,11 +317,11 @@ public boolean add(Item if (prismContext != null) { item.setPrismContext(prismContext); } - if (getActualDefinition() != null && item.getDefinition() == null) { - item.applyDefinition((ID)determineItemDefinition(item.getElementName(), getActualDefinition()), false); + if (getComplexTypeDefinition() != null && item.getDefinition() == null) { + item.applyDefinition((ID)determineItemDefinition(item.getElementName(), getComplexTypeDefinition()), false); } if (items == null) { - items = new ArrayList>(); + items = new ArrayList<>(); } return items.add(item); } @@ -389,13 +332,13 @@ public boolean add(Item */ public boolean merge(Item item) throws SchemaException { checkMutability(); - Item exisingItem = findItem(item.getElementName(), Item.class); - if (exisingItem == null) { + Item existingItem = findItem(item.getElementName(), Item.class); + if (existingItem == null) { return add(item); } else { boolean changed = false; for (IV newVal: item.getValues()) { - if (exisingItem.add((IV) newVal.clone())) { + if (existingItem.add((IV) newVal.clone())) { changed = true; } } @@ -408,15 +351,15 @@ public boolean merge(Item boolean substract(Item item) throws SchemaException { + public boolean subtract(Item item) throws SchemaException { checkMutability(); - Item exisingItem = findItem(item.getElementName(), Item.class); - if (exisingItem == null) { + Item existingItem = findItem(item.getElementName(), Item.class); + if (existingItem == null) { return false; } else { boolean changed = false; for (IV newVal: item.getValues()) { - if (exisingItem.remove(newVal)) { + if (existingItem.remove(newVal)) { changed = true; } } @@ -431,7 +374,7 @@ public boolean substract(Item< */ public void addReplaceExisting(Item item) throws SchemaException { checkMutability(); - if (item == null){ + if (item == null) { return; } Item existingItem = findItem(item.getElementName(), Item.class); @@ -446,7 +389,7 @@ public void remove(Item Validate.notNull(item, "Item must not be null."); checkMutability(); - Item existingItem = findItem(item.getElementName(), Item.class); + Item existingItem = findItem(item.getElementName(), Item.class); if (existingItem != null && items != null) { items.remove(existingItem); existingItem.setParent(null); @@ -500,21 +443,6 @@ public void replace(Item list) { -// if (items != null) { -// for (Item item: items) { -// if (item instanceof PrismProperty) { -// list.add(basePath.subPath(item.getElementName())); -// } else if (item instanceof PrismContainer) { -// ((PrismContainer)item).addItemPathsToList(basePath, list); -// } -// } -// } -// } - public void clear() { checkMutability(); if (items != null) { @@ -523,11 +451,8 @@ public void clear() { } public boolean contains(Item item) { - if (items != null) { - return items.contains(item); - } - return false; - } + return items != null && items.contains(item); + } public boolean contains(QName itemName) { return findItem(itemName) != null; @@ -757,9 +682,10 @@ private > // the item with specified name does not exist, create it now I newItem = null; - if (itemDefinition == null && getActualDefinition() != null) { - itemDefinition = determineItemDefinition(name, getActualDefinition()); - if (itemDefinition == null) { + if (itemDefinition == null) { + ComplexTypeDefinition ctd = getComplexTypeDefinition(); + itemDefinition = determineItemDefinition(name, ctd); + if (ctd != null && itemDefinition == null) { throw new SchemaException("No definition for item "+name+" in "+getParent()); } } @@ -840,12 +766,13 @@ public PrismProperty findOrCreateProperty(PrismPropertyDefinition propert public PrismContainer createContainer(QName containerName) throws SchemaException { checkMutability(); - if (getActualDefinition() == null) { + ComplexTypeDefinition complexTypeDefinition = getComplexTypeDefinition(); + if (complexTypeDefinition == null) { throw new IllegalStateException("No definition of container "+containerName); } - PrismContainerDefinition containerDefinition = getActualDefinition().findContainerDefinition(containerName); + PrismContainerDefinition containerDefinition = complexTypeDefinition.findContainerDefinition(containerName); if (containerDefinition == null) { - throw new IllegalArgumentException("No definition of container '" + containerName + "' in " + getActualDefinition()); + throw new IllegalArgumentException("No definition of container '" + containerName + "' in " + complexTypeDefinition); } PrismContainer container = containerDefinition.instantiate(); add(container); @@ -855,16 +782,17 @@ public PrismContainer createContainer(QName contain public PrismProperty createProperty(QName propertyName) throws SchemaException { checkMutability(); PrismPropertyDefinition propertyDefinition = null; - if (getActualDefinition() != null) { - propertyDefinition = getActualDefinition().findPropertyDefinition(propertyName); + ComplexTypeDefinition complexTypeDefinition = getComplexTypeDefinition(); + if (complexTypeDefinition != null) { + propertyDefinition = complexTypeDefinition.findPropertyDefinition(propertyName); if (propertyDefinition == null) { // container has definition, but there is no property definition. This is either runtime schema // or an error - if (getParent().getDefinition().isRuntimeSchema) { + if (getParent().getDefinition().isRuntimeSchema()) { // TODO: create opportunistic runtime definition - //propertyDefinition = new PrismPropertyDefinition(propertyName, propertyName, typeName, container.prismContext); + //propertyDefinition = new PrismPropertyDefinitionImpl(propertyName, propertyName, typeName, container.prismContext); } else { - throw new IllegalArgumentException("No definition for property "+propertyName+" in "+getActualDefinition()); + throw new IllegalArgumentException("No definition for property "+propertyName+" in "+complexTypeDefinition); } } } @@ -1018,9 +946,10 @@ public boolean representsSameValue(PrismValue other) { } } - public boolean representsSameValue(PrismContainerValue other) { + @SuppressWarnings("Duplicates") + private boolean representsSameValue(PrismContainerValue other) { if (getParent() != null) { - PrismContainerDefinition definition = getActualDefinition(); + PrismContainerDefinition definition = getDefinition(); if (definition != null) { if (definition.isSingleValue()) { // There is only one value, therefore it always represents the same thing @@ -1029,7 +958,7 @@ public boolean representsSameValue(PrismContainerValue other) { } } if (other.getParent() != null) { - PrismContainerDefinition definition = other.getActualDefinition(); + PrismContainerDefinition definition = other.getDefinition(); if (definition != null) { if (definition.isSingleValue()) { // There is only one value, therefore it always represents the same thing @@ -1056,48 +985,19 @@ void diffMatchingRepresentation(PrismValue otherValue, void diffRepresentation(PrismContainerValue otherValue, Collection deltas, boolean ignoreMetadata, boolean isLiteral) { - PrismContainerValue thisValue = this; - if (this.isRaw() || otherValue.isRaw()) { - try { - if (this.isRaw()) { - otherValue = parseRawElementsToNewValue(otherValue, thisValue); - } else if (otherValue.isRaw()) { - thisValue = parseRawElementsToNewValue(thisValue, otherValue); - } - } catch (SchemaException e) { - // TODO: Maybe just return false? - throw new IllegalArgumentException("Error parsing the value of container "+getParent()+" using the 'other' definition "+ - "during a compare: "+e.getMessage(),e); - } - } - diffItems(thisValue, otherValue, deltas, ignoreMetadata, isLiteral); + diffItems(this, otherValue, deltas, ignoreMetadata, isLiteral); } @Override public boolean isRaw() { - return rawXNode != null || rawElements != null; + return false; } - public MapXNode getRawXNode() { - return rawXNode; - } - - public List getRawElements() { - return rawElements; - } - public boolean addRawElement(Object element) throws SchemaException { checkMutability(); PrismContainerDefinition definition = getDefinition(); if (definition == null) { - // We cannot do much better. We do not even have prism context here. - if (rawElements == null) { - if (items != null && !items.isEmpty()) { - throw new IllegalStateException("Attempt to add raw element to prism container value which already has items: "+this); - } - rawElements = new ArrayList(); - } - return rawElements.add(element); + throw new UnsupportedOperationException("Definition-less containers are not supported any more."); } else { // We have definition here, we can parse it right now Item subitem = parseRawElement(element, definition); @@ -1109,22 +1009,18 @@ public boolean deleteRawElement(Object element) throws SchemaException { checkMutability(); PrismContainerDefinition definition = getDefinition(); if (definition == null) { - // We cannot do much better. We do not even have prism context here. - if (rawElements == null) { - rawElements = new ArrayList(); - } - return rawElements.add(element); + throw new UnsupportedOperationException("Definition-less containers are not supported any more."); } else { // We have definition here, we can parse it right now Item subitem = parseRawElement(element, definition); - return substract(subitem); + return subtract(subitem); } } public boolean removeRawElement(Object element) { checkMutability(); - return rawElements.remove(element); + throw new UnsupportedOperationException("Definition-less containers are not supported any more."); } private Item parseRawElement(Object element, PrismContainerDefinition definition) throws SchemaException { @@ -1133,30 +1029,7 @@ private Item parseRawEl } private PrismContainerValue parseRawElementsToNewValue(PrismContainerValue origCVal, PrismContainerValue definitionSource) throws SchemaException { - if (definitionSource.getParent() == null || definitionSource.getActualDefinition() == null) { - throw new IllegalArgumentException("Attempt to use container " + origCVal.getParent() + - " values in a raw parsing state (raw elements) with parsed value that has no definition"); - } - PrismContainerDefinition definition = definitionSource.getActualDefinition(); - - XNode origRawXnode = origCVal.rawXNode; - if (origRawXnode != null) { - XNodeProcessor xnodeProcessor = definition.getPrismContext().getXnodeProcessor(); - PrismContainerValue newCVal = xnodeProcessor.parsePrismContainerValue(origRawXnode, definition, ParsingContext.createDefault()); - return newCVal; - } - - List origRawElements = origCVal.rawElements; - if (origRawElements != null) { - PrismContainerValue newCVal = new PrismContainerValue(prismContext); - for (Object rawElement: origRawElements) { - Item subitem = parseRawElement(rawElement, definition); - newCVal.merge(subitem); - } - return newCVal; - } - - return null; + throw new UnsupportedOperationException("Definition-less containers are not supported any more."); } @SuppressWarnings({ "rawtypes", "unchecked" }) @@ -1202,36 +1075,24 @@ public void applyDefinition(ItemDefinition definition, boolean force) throws Sch public void applyDefinition(PrismContainerDefinition containerDef, boolean force) throws SchemaException { checkMutability(); - PrismContainerDefinition valueDefinition = getConcreteTypeDefinition(); - if (valueDefinition == null) { - valueDefinition = containerDef; + ComplexTypeDefinition ctd = getComplexTypeDefinition(); + if (ctd == null) { + if (containerDef == null || containerDef.getComplexTypeDefinition() == null) { + return; + } + ctd = containerDef.getComplexTypeDefinition(); } - if (valueDefinition.isWildcard()) { + if (ctd.isXsdAnyMarker()) { // No point in aplying this. Nothing will change and there may be phantom errors. return; } - if (rawElements != null) { - for (Object rawElement: rawElements) { - Item subitem = parseRawElement(rawElement, valueDefinition); - merge(subitem); - } - rawElements = null; - } - if (rawXNode != null) { - PrismContext prismContext = valueDefinition.getPrismContext(); - XNodeProcessor xnodeProcessor = prismContext.getXnodeProcessor(); - PrismContainerValue newCVal = xnodeProcessor.parsePrismContainerValue(rawXNode, valueDefinition, ParsingContext.createDefault()); - // Maybe we need to manually reset parent on items? - addAll(newCVal.getItems()); - rawXNode = null; - } if (items != null) { for (Item item: items) { if (item.getDefinition() != null && !force) { // Item has a definition already, no need to apply it continue; } - ItemDefinition itemDefinition = determineItemDefinition(item.getElementName(), valueDefinition); + ItemDefinition itemDefinition = determineItemDefinition(item.getElementName(), ctd); if (itemDefinition == null && item.getDefinition() != null && item.getDefinition().isDynamic()) { // We will not apply the null definition here. The item has a dynamic definition that we don't // want to destroy as it cannot be reconstructed later. @@ -1246,21 +1107,23 @@ public void applyDefinition(PrismContainerDefinition containerDef, boolean fo * This method can both return null and throws exception. It returns null in case there is no definition * but it is OK (e.g. runtime schema). It throws exception if there is no definition and it is not OK. */ - private ID determineItemDefinition(QName itemName, PrismContainerDefinition containerDefinition) throws SchemaException { - ID itemDefinition = containerDefinition.findItemDefinition(itemName); - if (itemDefinition == null) { - if (containerDefinition.isRuntimeSchema()) { - // If we have prism context, try to locate global definition. But even if that is not - // found it is still OK. This is runtime container. We tolerate quite a lot here. - PrismContext prismContext = getPrismContext(); - if (prismContext != null) { - itemDefinition = (ID) prismContext.getSchemaRegistry().resolveGlobalItemDefinition(itemName, containerDefinition); - } + private ID determineItemDefinition(QName itemName, @Nullable ComplexTypeDefinition ctd) throws SchemaException { + ID itemDefinition = ctd != null ? ctd.findItemDefinition(itemName) : null; + if (itemDefinition != null) { + return itemDefinition; + } + if (ctd == null || ctd.isXsdAnyMarker() || ctd.isRuntimeSchema()) { + // If we have prism context, try to locate global definition. But even if that is not + // found it is still OK. This is runtime container. We tolerate quite a lot here. + PrismContext prismContext = getPrismContext(); + if (prismContext != null) { + return (ID) prismContext.getSchemaRegistry().resolveGlobalItemDefinition(itemName, ctd); } else { - throw new SchemaException("No definition for item " + itemName + " in " + getParent()); + return null; } + } else { + throw new SchemaException("No definition for item " + itemName + " in " + getParent()); } - return itemDefinition; } @Override @@ -1305,18 +1168,9 @@ public void normalize() { @Override public void checkConsistenceInternal(Itemable rootItem, boolean requireDefinitions, boolean prohibitRaw, ConsistencyCheckScope scope) { ItemPath myPath = getPath(); - if (scope.isThorough()) { - if (prohibitRaw && isRaw()) { - throw new IllegalStateException("Raw elements in container value "+this+" ("+myPath+" in "+rootItem+")"); - } - if (items == null && !isRaw()) { - // This is normal empty container, isn't it? -// throw new IllegalStateException("Neither items nor raw elements specified in container value "+this+" ("+myPath+" in "+rootItem+")"); - } - if (items != null && isRaw()) { - throw new IllegalStateException("Both items and raw elements specified in container value "+this+" ("+myPath+" in "+rootItem+")"); - } - } + if (getDefinition() == null) { + throw new IllegalStateException("Definition-less container value " + this +" ("+myPath+" in "+rootItem+")"); + } if (items != null) { for (Item item: items) { if (scope.isThorough()) { @@ -1349,8 +1203,8 @@ public void assertDefinitions(boolean tolerateRaw, String sourceDescription) thr } } - public PrismContainerValue clone() { - PrismContainerValue clone = new PrismContainerValue(getOriginType(), getOriginObject(), getParent(), getId(), this.concreteType, this.prismContext); + public PrismContainerValue clone() { // TODO resolve also the definition? + PrismContainerValue clone = new PrismContainerValue(getOriginType(), getOriginObject(), getParent(), getId(), this.complexTypeDefinition, this.prismContext); copyValues(clone); return clone; } @@ -1368,9 +1222,6 @@ protected void copyValues(PrismContainerValue clone) { clone.items.add(clonedItem); } } - // TODO: deep clonning? - clone.rawXNode = this.rawXNode; - clone.rawElements = this.rawElements; } protected void deepCloneDefinition(boolean ultraDeep, PrismContainerDefinition clonedContainerDef) { @@ -1467,9 +1318,6 @@ public String toString() { StringBuilder sb = new StringBuilder(); sb.append("PCV("); sb.append(getId()); - if (isRaw()) { - sb.append(", raw"); - } sb.append("):"); sb.append(getItems()); return sb.toString(); @@ -1516,14 +1364,6 @@ public String debugDump(int indent) { sb.append("\n"); } } - } else { - if (isRaw()) { - if (wasIndent) { - sb.append("\n"); - } - DebugUtil.indentDebugDump(sb, indent + 1); - sb.append("(raw)"); - } } return sb.toString(); } @@ -1546,14 +1386,17 @@ public String toHumanReadableString() { // no information on corresponding element name) // // todo review usefulness and appropriateness of this method and its placement - public static void copyDefinition(Containerable aClone, Containerable original) { + @Deprecated + public static void copyDefinition(Containerable aClone, Containerable original, PrismContext prismContext) { try { Validate.notNull(original.asPrismContainerValue().getParent(), "original PrismContainerValue has no parent"); - PrismContainerDefinition definition = original.asPrismContainerValue().getActualDefinition(); + ComplexTypeDefinition definition = original.asPrismContainerValue().getComplexTypeDefinition(); Validate.notNull(definition, "original PrismContainer definition is null"); - PrismContainer aCloneParent = definition.instantiate(); + PrismContainer aCloneParent = prismContext.getSchemaRegistry() + .findContainerDefinitionByCompileTimeClass((Class) definition.getCompileTimeClass()) + .instantiate(); aCloneParent.add(aClone.asPrismContainerValue()); } catch (SchemaException e) { throw new SystemException("Unexpected SchemaException when copying definition from original object to its clone", e); @@ -1561,54 +1404,32 @@ public static void copyDefinition(Containerable aClone, Containerable original) } public QName getConcreteType() { - return concreteType; - } - - public void setConcreteType(QName concreteType) { - this.concreteType = concreteType; - this.concreteTypeDefinition = null; + return complexTypeDefinition != null ? complexTypeDefinition.getTypeName() : null; } - // TODO change from PrismContainerDefinition to ComplexTypeDefinition - // because in current state there should be an element definition for each subtype that is to be resolvable in this way - public PrismContainerDefinition getConcreteTypeDefinition() { - if (concreteTypeDefinition != null) { - return concreteTypeDefinition; - } - if (concreteType != null) { - // First of all, if we have parent definition and it is applicable, just use that - // (Besides performance aspects, the parent definition might be already converted - // to contain ResourceAttributeContainerDefinition instead of PrismContainerDefinition - // - in case of ShadowType.) - if (getParent() != null && getParent().getDefinition() != null && concreteType.equals(getParent().getDefinition().getTypeName())) { - concreteTypeDefinition = getParent().getDefinition(); - } else { - PrismContext prismContext = getPrismContext(); - if (prismContext != null) { - concreteTypeDefinition = prismContext.getSchemaRegistry().findContainerDefinitionByType(concreteType); - if (concreteTypeDefinition == null) { - throw new IllegalStateException("Couldn't find a definition for concrete type " + concreteType); - } - } - } - } - return concreteTypeDefinition; // may still be null at this moment - } - - private PrismContainerDefinition getActualDefinition() { - if (getParent() != null) { - PrismContainerDefinition concreteDef = getConcreteTypeDefinition(); - if (concreteDef != null) { - return concreteDef; - } else { - return getParent().getDefinition(); - } - } else { - return null; - } + @Nullable + public ComplexTypeDefinition getComplexTypeDefinition() { + if (complexTypeDefinition != null) { + return complexTypeDefinition; + } + PrismContainerable parent = getParent(); + ComplexTypeDefinition parentCTD = parent != null && parent.getDefinition() != null ? + parent.getDefinition().getComplexTypeDefinition() : null; + if (containerable == null) { + return parentCTD; + } + if (prismContext == null) { + // check if parentCTD matches containerable + if (parentCTD != null && containerable.getClass().equals(parentCTD.getCompileTimeClass())) { + return parentCTD; + } else { + return null; // TODO or throw an exception? + } + } + complexTypeDefinition = prismContext.getSchemaRegistry().findComplexTypeDefinitionByCompileTimeClass(containerable.getClass()); + return complexTypeDefinition; // may be null at this place } - public static List> toPcvList(List beans) { List> rv = new ArrayList<>(beans.size()); for (T bean : beans) { diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java index 5d27f93201e..0f9a23e92e6 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java @@ -32,6 +32,7 @@ import com.evolveum.prism.xml.ns._public.types_3.RawType; import org.jetbrains.annotations.NotNull; import org.w3c.dom.Element; +import org.xml.sax.EntityResolver; import org.xml.sax.SAXException; import javax.xml.namespace.QName; @@ -52,6 +53,8 @@ public interface PrismContext { void initialize() throws SchemaException, SAXException, IOException; + XmlEntityResolver getEntityResolver(); + SchemaRegistry getSchemaRegistry(); XNodeProcessor getXnodeProcessor(); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContextImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContextImpl.java index 5432f6a1ed1..8d747ada397 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContextImpl.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContextImpl.java @@ -27,6 +27,7 @@ import com.evolveum.midpoint.prism.polystring.PrismDefaultPolyStringNormalizer; import com.evolveum.midpoint.prism.schema.SchemaDefinitionFactory; import com.evolveum.midpoint.prism.schema.SchemaRegistry; +import com.evolveum.midpoint.prism.schema.SchemaRegistryImpl; import com.evolveum.midpoint.prism.util.PrismMonitor; import com.evolveum.midpoint.prism.xnode.RootXNode; import com.evolveum.midpoint.prism.xnode.XNode; @@ -38,6 +39,7 @@ import org.jetbrains.annotations.NotNull; import org.springframework.beans.factory.annotation.Autowired; import org.w3c.dom.Element; +import org.xml.sax.EntityResolver; import org.xml.sax.SAXException; import javax.xml.namespace.QName; @@ -55,7 +57,7 @@ public class PrismContextImpl implements PrismContext { private static boolean allowSchemalessSerialization = true; - private SchemaRegistry schemaRegistry; + private SchemaRegistryImpl schemaRegistry; private XNodeProcessor xnodeProcessor; private PrismBeanConverter beanConverter; private SchemaDefinitionFactory definitionFactory; @@ -75,7 +77,7 @@ private PrismContextImpl() { // empty } - public static PrismContextImpl create(SchemaRegistry schemaRegistry) { + public static PrismContextImpl create(SchemaRegistryImpl schemaRegistry) { PrismContextImpl prismContext = new PrismContextImpl(); prismContext.schemaRegistry = schemaRegistry; schemaRegistry.setPrismContext(prismContext); @@ -92,7 +94,7 @@ public static PrismContextImpl create(SchemaRegistry schemaRegistry) { return prismContext; } - public static PrismContextImpl createEmptyContext(SchemaRegistry schemaRegistry){ + public static PrismContextImpl createEmptyContext(SchemaRegistryImpl schemaRegistry){ PrismContextImpl prismContext = new PrismContextImpl(); prismContext.schemaRegistry = schemaRegistry; schemaRegistry.setPrismContext(prismContext); @@ -116,12 +118,17 @@ public static void setAllowSchemalessSerialization(boolean allowSchemalessSerial PrismContextImpl.allowSchemalessSerialization = allowSchemalessSerialization; } + @Override + public XmlEntityResolver getEntityResolver() { + return schemaRegistry.getEntityResolver(); + } + @Override public SchemaRegistry getSchemaRegistry() { return schemaRegistry; } - public void setSchemaRegistry(SchemaRegistry schemaRegistry) { + public void setSchemaRegistry(SchemaRegistryImpl schemaRegistry) { this.schemaRegistry = schemaRegistry; } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismObjectDefinition.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismObjectDefinition.java index 45ac8c38db0..c5e437139ae 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismObjectDefinition.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismObjectDefinition.java @@ -16,130 +16,29 @@ package com.evolveum.midpoint.prism; -import javax.xml.namespace.QName; - import com.evolveum.midpoint.util.exception.SchemaException; import org.jetbrains.annotations.NotNull; +import javax.xml.namespace.QName; + /** - * MidPoint Object Definition. - * - * Objects are storable entities in midPoint. - * - * This is mostly just a marker class to identify object boundaries in schema. - * - * This class represents schema definition for objects. See {@link Definition} - * for more details. - * - * "Instance" class of this class is MidPointObject, not Object - to avoid - * confusion with java.lang.Object. - * - * @author Radovan Semancik - * + * @author mederly */ -public class PrismObjectDefinition extends PrismContainerDefinition { - private static final long serialVersionUID = -8298581031956931008L; +public interface PrismObjectDefinition extends PrismContainerDefinition { - public PrismObjectDefinition(QName elementName, ComplexTypeDefinition complexTypeDefinition, PrismContext prismContext, - Class compileTimeClass) { - // Object definition can only be top-level, hence null parent - super(elementName, complexTypeDefinition, prismContext, compileTimeClass); - } - @Override @NotNull - public PrismObject instantiate() throws SchemaException { - if (isAbstract()) { - throw new SchemaException("Cannot instantiate abstract definition "+this); - } - return new PrismObject(getName(), this, prismContext); - } - - @Override - public PrismObject instantiate(QName name) throws SchemaException { - if (isAbstract()) { - throw new SchemaException("Cannot instantiate abstract definition "+this); - } - name = addNamespaceIfApplicable(name); - PrismObject midPointObject = new PrismObject(name, this, prismContext); - return midPointObject; - } - - public PrismObjectDefinition clone() { - PrismObjectDefinition clone = new PrismObjectDefinition(name, complexTypeDefinition, prismContext, compileTimeClass); - copyDefinitionData(clone); - return clone; - } - - @Override - public PrismObjectDefinition deepClone(boolean ultraDeep) { - return (PrismObjectDefinition) super.deepClone(ultraDeep); - } - - public PrismObjectDefinition cloneWithReplacedDefinition(QName itemName, ItemDefinition newDefinition) { - return (PrismObjectDefinition) super.cloneWithReplacedDefinition(itemName, newDefinition); - } - - public PrismContainerDefinition getExtensionDefinition() { - return findContainerDefinition(getExtensionQName()); - } + PrismObject instantiate() throws SchemaException; - public void setExtensionDefinition(ComplexTypeDefinition extensionComplexTypeDefinition) { - QName extensionQName = getExtensionQName(); - - PrismContainerDefinition oldExtensionDef = findContainerDefinition(extensionQName); - - PrismContainerDefinition newExtensionDef = new PrismContainerDefinition(extensionQName, - extensionComplexTypeDefinition, prismContext); - newExtensionDef.setRuntimeSchema(true); - if (oldExtensionDef != null) { - if (newExtensionDef.getDisplayName() == null) { - newExtensionDef.setDisplayName(oldExtensionDef.getDisplayName()); - } - if (newExtensionDef.getDisplayOrder() == null) { - newExtensionDef.setDisplayOrder(oldExtensionDef.getDisplayOrder()); - } - if (newExtensionDef.getHelp() == null) { - newExtensionDef.setHelp(oldExtensionDef.getHelp()); - } - } - - ComplexTypeDefinition newCtd = this.complexTypeDefinition.clone(); - newCtd.replaceDefinition(extensionQName, newExtensionDef); - if (newCtd.getDisplayName() == null) { - newCtd.setDisplayName(this.complexTypeDefinition.getDisplayName()); - } - if (newCtd.getDisplayOrder() == null) { - newCtd.setDisplayOrder(this.complexTypeDefinition.getDisplayOrder()); - } - if (newCtd.getHelp() == null) { - newCtd.setHelp(this.complexTypeDefinition.getHelp()); - } + @Override + PrismObject instantiate(QName name) throws SchemaException; - this.complexTypeDefinition = newCtd; - } - - private QName getExtensionQName() { - String namespace = getName().getNamespaceURI(); - return new QName(namespace, PrismConstants.EXTENSION_LOCAL_NAME); - } - - public I getExtensionItemDefinition(QName elementName) { - PrismContainerDefinition extensionDefinition = getExtensionDefinition(); - if (extensionDefinition == null) { - return null; - } - return (I) extensionDefinition.findItemDefinition(elementName); - } + PrismObjectDefinition clone(); @Override - protected String getDebugDumpClassName() { - return "POD"; - } + PrismObjectDefinition deepClone(boolean ultraDeep); + + PrismObjectDefinition cloneWithReplacedDefinition(QName itemName, ItemDefinition newDefinition); - @Override - public String getDocClassName() { - return "object"; - } - + PrismContainerDefinition getExtensionDefinition(); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismObjectDefinitionImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismObjectDefinitionImpl.java new file mode 100644 index 00000000000..052ed386f3e --- /dev/null +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismObjectDefinitionImpl.java @@ -0,0 +1,149 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.prism; + +import javax.xml.namespace.QName; + +import com.evolveum.midpoint.util.exception.SchemaException; +import org.jetbrains.annotations.NotNull; + +/** + * MidPoint Object Definition. + * + * Objects are storable entities in midPoint. + * + * This is mostly just a marker class to identify object boundaries in schema. + * + * This class represents schema definition for objects. See {@link Definition} + * for more details. + * + * "Instance" class of this class is MidPointObject, not Object - to avoid + * confusion with java.lang.Object. + * + * @author Radovan Semancik + * + */ +public class PrismObjectDefinitionImpl extends PrismContainerDefinitionImpl implements + PrismObjectDefinition { + private static final long serialVersionUID = -8298581031956931008L; + + public PrismObjectDefinitionImpl(QName elementName, ComplexTypeDefinition complexTypeDefinition, PrismContext prismContext, + Class compileTimeClass) { + // Object definition can only be top-level, hence null parent + super(elementName, complexTypeDefinition, prismContext, compileTimeClass); + } + + @Override + @NotNull + public PrismObject instantiate() throws SchemaException { + if (isAbstract()) { + throw new SchemaException("Cannot instantiate abstract definition "+this); + } + return new PrismObject(getName(), this, prismContext); + } + + @Override + public PrismObject instantiate(QName name) throws SchemaException { + if (isAbstract()) { + throw new SchemaException("Cannot instantiate abstract definition "+this); + } + name = addNamespaceIfApplicable(name); + PrismObject midPointObject = new PrismObject(name, this, prismContext); + return midPointObject; + } + + @Override + public PrismObjectDefinitionImpl clone() { + PrismObjectDefinitionImpl clone = new PrismObjectDefinitionImpl<>(name, complexTypeDefinition, prismContext, compileTimeClass); + copyDefinitionData(clone); + return clone; + } + + @Override + public PrismObjectDefinition deepClone(boolean ultraDeep) { + return (PrismObjectDefinition) super.deepClone(ultraDeep); + } + + @Override + public PrismObjectDefinition cloneWithReplacedDefinition(QName itemName, ItemDefinition newDefinition) { + return (PrismObjectDefinition) super.cloneWithReplacedDefinition(itemName, newDefinition); + } + + @Override + public PrismContainerDefinition getExtensionDefinition() { + return findContainerDefinition(getExtensionQName()); + } + + public void setExtensionDefinition(ComplexTypeDefinition extensionComplexTypeDefinition) { + QName extensionQName = getExtensionQName(); + + PrismContainerDefinition oldExtensionDef = findContainerDefinition(extensionQName); + + PrismContainerDefinitionImpl newExtensionDef = new PrismContainerDefinitionImpl<>(extensionQName, + extensionComplexTypeDefinition, prismContext); + newExtensionDef.setRuntimeSchema(true); + if (oldExtensionDef != null) { + if (newExtensionDef.getDisplayName() == null) { + newExtensionDef.setDisplayName(oldExtensionDef.getDisplayName()); + } + if (newExtensionDef.getDisplayOrder() == null) { + newExtensionDef.setDisplayOrder(oldExtensionDef.getDisplayOrder()); + } + if (newExtensionDef.getHelp() == null) { + newExtensionDef.setHelp(oldExtensionDef.getHelp()); + } + } + + ComplexTypeDefinitionImpl newCtd = (ComplexTypeDefinitionImpl) this.complexTypeDefinition.clone(); + newCtd.replaceDefinition(extensionQName, newExtensionDef); + if (newCtd.getDisplayName() == null) { + newCtd.setDisplayName(this.complexTypeDefinition.getDisplayName()); + } + if (newCtd.getDisplayOrder() == null) { + newCtd.setDisplayOrder(this.complexTypeDefinition.getDisplayOrder()); + } + if (newCtd.getHelp() == null) { + newCtd.setHelp(this.complexTypeDefinition.getHelp()); + } + + this.complexTypeDefinition = newCtd; + } + + private QName getExtensionQName() { + String namespace = getName().getNamespaceURI(); + return new QName(namespace, PrismConstants.EXTENSION_LOCAL_NAME); + } + + public I getExtensionItemDefinition(QName elementName) { + PrismContainerDefinition extensionDefinition = getExtensionDefinition(); + if (extensionDefinition == null) { + return null; + } + return (I) extensionDefinition.findItemDefinition(elementName); + } + + @Override + protected String getDebugDumpClassName() { + return "POD"; + } + + @Override + public String getDocClassName() { + return "object"; + } + +} diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismProperty.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismProperty.java index 917b7a63015..119eddaba58 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismProperty.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismProperty.java @@ -573,7 +573,7 @@ public String debugDump(int indent) { if (def != null && DebugUtil.isDetailedDebugDump()) { sb.append(" def("); - def.debugDumpShortToString(sb); + ((PrismPropertyDefinitionImpl) def).debugDumpShortToString(sb); // if (def.isIndexed() != null) { // sb.append(def.isIndexed() ? ",i+" : ",i-"); // } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyDefinition.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyDefinition.java index 9289490d58e..7f6d24846c4 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyDefinition.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyDefinition.java @@ -16,222 +16,37 @@ package com.evolveum.midpoint.prism; -import java.util.Collection; - -import javax.xml.namespace.QName; - import com.evolveum.midpoint.prism.delta.PropertyDelta; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.util.DisplayableValue; +import com.evolveum.midpoint.util.exception.SchemaException; + +import javax.xml.namespace.QName; +import java.util.Collection; /** - * Property Definition. - *

- * Property is a basic unit of information in midPoint. This class provides - * definition of property type, multiplicity and so on. - *

- * Property is a specific characteristic of an object. It may be considered - * object "attribute" or "field". For example User has fullName property that - * contains string value of user's full name. - *

- * Properties may be single-valued or multi-valued - *

- * Properties may contain primitive types or complex types (defined by XSD - * schema) - *

- * Property values are unordered, implementation may change the order of values - *

- * Duplicate values of properties should be silently removed by implementations, - * but clients must be able tolerate presence of duplicate values. - *

- * Operations that modify the objects work with the granularity of properties. - * They add/remove/replace the values of properties, but do not "see" inside the - * property. - *

- * This class represents schema definition for property. See {@link Definition} - * for more details. - * - * @author Radovan Semancik + * @author mederly */ -public class PrismPropertyDefinition extends ItemDefinition> { - - private static final long serialVersionUID = 7259761997904371009L; - private QName valueType; - private Collection> allowedValues; - private Boolean indexed = null; - private T defaultValue; - private QName matchingRuleQName = null; - - public PrismPropertyDefinition(QName elementName, QName typeName, PrismContext prismContext) { - super(elementName, typeName, prismContext); - } - - public PrismPropertyDefinition(QName elementName, QName typeName, PrismContext prismContext, Collection> allowedValues, T defaultValue) { - super(elementName, typeName, prismContext); - this.allowedValues = allowedValues; - this.defaultValue = defaultValue; - } +public interface PrismPropertyDefinition extends ItemDefinition> { + Collection> getAllowedValues(); - /** - * Returns allowed values for this property. - * - * @return Object array. May be null. - */ - public Collection> getAllowedValues() { - return allowedValues; - } + T defaultValue(); - public T defaultValue(){ - return defaultValue; - } - /** - * Returns QName of the property value type. - *

- * The returned type is either XSD simple type or complex type. It may not - * be defined in the same schema (especially if it is standard XSD simple - * type). - * - * @return QName of the property value type - */ - public QName getValueType() { - return valueType; - } + QName getValueType(); - void setValueType(QName valueType) { - this.valueType = valueType; - } + Boolean isIndexed(); - /** - * This is XSD annotation that specifies whether a property should - * be indexed in the storage. It can only apply to properties. It - * has following meaning: - * - * true: the property must be indexed. If the storage is not able to - * index the value, it should indicate an error. - * - * false: the property should not be indexed. - * - * null: data store decides whether to index the property or - * not. - */ - public Boolean isIndexed() { - return indexed; - } - - public void setIndexed(Boolean indexed) { - this.indexed = indexed; - } - - /** - * Returns matching rule name. Matching rules are algorithms that specify - * how to compare, normalize and/or order the values. E.g. there are matching - * rules for case insensitive string comparison, for LDAP DNs, etc. - * - * @return matching rule name - */ - public QName getMatchingRuleQName() { - return matchingRuleQName; - } - - public void setMatchingRuleQName(QName matchingRuleQName) { - this.matchingRuleQName = matchingRuleQName; - } + QName getMatchingRuleQName(); @Override - public PrismProperty instantiate() { - return instantiate(getName()); - } - - @Override - public PrismProperty instantiate(QName name) { - name = addNamespaceIfApplicable(name); - return new PrismProperty(name, this, prismContext); - } - - @Override - public PropertyDelta createEmptyDelta(ItemPath path) { - return new PropertyDelta(path, this, prismContext); - } + PropertyDelta createEmptyDelta(ItemPath path); @Override - public PrismPropertyDefinition clone() { - PrismPropertyDefinition clone = new PrismPropertyDefinition(getName(), getTypeName(), getPrismContext()); - copyDefinitionData(clone); - return clone; - } - - protected void copyDefinitionData(PrismPropertyDefinition clone) { - super.copyDefinitionData(clone); - clone.indexed = this.indexed; - clone.defaultValue = this.defaultValue; - clone.allowedValues = this.allowedValues; - clone.valueType = this.valueType; - } - - @Override - protected void extendToString(StringBuilder sb) { - super.extendToString(sb); - if (indexed != null && indexed) { - sb.append(",I"); - } - if (allowedValues != null && !allowedValues.isEmpty()) { - sb.append(",AVals:").append(allowedValues.size()); - } - } - - @Override - public int hashCode() { - final int prime = 31; - int result = super.hashCode(); - result = prime * result + ((allowedValues == null) ? 0 : allowedValues.hashCode()); - result = prime * result + ((defaultValue == null) ? 0 : defaultValue.hashCode()); - result = prime * result + ((indexed == null) ? 0 : indexed.hashCode()); - result = prime * result + ((valueType == null) ? 0 : valueType.hashCode()); - return result; - } + PrismProperty instantiate(); @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (!super.equals(obj)) - return false; - if (getClass() != obj.getClass()) - return false; - PrismPropertyDefinition other = (PrismPropertyDefinition) obj; - if (allowedValues == null) { - if (other.allowedValues != null) - return false; - } else if (!allowedValues.equals(other.allowedValues)) - return false; - if (defaultValue == null) { - if (other.defaultValue != null) - return false; - } else if (!defaultValue.equals(other.defaultValue)) - return false; - if (indexed == null) { - if (other.indexed != null) - return false; - } else if (!indexed.equals(other.indexed)) - return false; - if (valueType == null) { - if (other.valueType != null) - return false; - } else if (!valueType.equals(other.valueType)) - return false; - return true; - } + PrismProperty instantiate(QName name); - /** - * Return a human readable name of this class suitable for logs. - */ - @Override - protected String getDebugDumpClassName() { - return "PPD"; - } - - @Override - public String getDocClassName() { - return "property"; - } + @Override + PrismPropertyDefinition clone(); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyDefinitionImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyDefinitionImpl.java new file mode 100644 index 00000000000..9d9996f4f89 --- /dev/null +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyDefinitionImpl.java @@ -0,0 +1,242 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.prism; + +import java.util.Collection; + +import javax.xml.namespace.QName; + +import com.evolveum.midpoint.prism.delta.PropertyDelta; +import com.evolveum.midpoint.prism.path.ItemPath; +import com.evolveum.midpoint.util.DisplayableValue; + +/** + * Property Definition. + *

+ * Property is a basic unit of information in midPoint. This class provides + * definition of property type, multiplicity and so on. + *

+ * Property is a specific characteristic of an object. It may be considered + * object "attribute" or "field". For example User has fullName property that + * contains string value of user's full name. + *

+ * Properties may be single-valued or multi-valued + *

+ * Properties may contain primitive types or complex types (defined by XSD + * schema) + *

+ * Property values are unordered, implementation may change the order of values + *

+ * Duplicate values of properties should be silently removed by implementations, + * but clients must be able tolerate presence of duplicate values. + *

+ * Operations that modify the objects work with the granularity of properties. + * They add/remove/replace the values of properties, but do not "see" inside the + * property. + *

+ * This class represents schema definition for property. See {@link Definition} + * for more details. + * + * @author Radovan Semancik + */ +public class PrismPropertyDefinitionImpl extends ItemDefinitionImpl> implements PrismPropertyDefinition { + + private static final long serialVersionUID = 7259761997904371009L; + private QName valueType; + private Collection> allowedValues; + private Boolean indexed = null; + private T defaultValue; + private QName matchingRuleQName = null; + + public PrismPropertyDefinitionImpl(QName elementName, QName typeName, PrismContext prismContext) { + super(elementName, typeName, prismContext); + } + + public PrismPropertyDefinitionImpl(QName elementName, QName typeName, PrismContext prismContext, Collection> allowedValues, T defaultValue) { + super(elementName, typeName, prismContext); + this.allowedValues = allowedValues; + this.defaultValue = defaultValue; + } + + /** + * Returns allowed values for this property. + * + * @return Object array. May be null. + */ + @Override + public Collection> getAllowedValues() { + return allowedValues; + } + + @Override + public T defaultValue(){ + return defaultValue; + } + /** + * Returns QName of the property value type. + *

+ * The returned type is either XSD simple type or complex type. It may not + * be defined in the same schema (especially if it is standard XSD simple + * type). + * + * @return QName of the property value type + */ + @Override + public QName getValueType() { + return valueType; + } + + void setValueType(QName valueType) { + this.valueType = valueType; + } + + /** + * This is XSD annotation that specifies whether a property should + * be indexed in the storage. It can only apply to properties. It + * has following meaning: + * + * true: the property must be indexed. If the storage is not able to + * index the value, it should indicate an error. + * + * false: the property should not be indexed. + * + * null: data store decides whether to index the property or + * not. + */ + @Override + public Boolean isIndexed() { + return indexed; + } + + public void setIndexed(Boolean indexed) { + this.indexed = indexed; + } + + /** + * Returns matching rule name. Matching rules are algorithms that specify + * how to compare, normalize and/or order the values. E.g. there are matching + * rules for case insensitive string comparison, for LDAP DNs, etc. + * + * @return matching rule name + */ + @Override + public QName getMatchingRuleQName() { + return matchingRuleQName; + } + + public void setMatchingRuleQName(QName matchingRuleQName) { + this.matchingRuleQName = matchingRuleQName; + } + + @Override + public PrismProperty instantiate() { + return instantiate(getName()); + } + + @Override + public PrismProperty instantiate(QName name) { + name = addNamespaceIfApplicable(name); + return new PrismProperty(name, this, prismContext); + } + + @Override + public PropertyDelta createEmptyDelta(ItemPath path) { + return new PropertyDelta(path, this, prismContext); + } + + @Override + public PrismPropertyDefinition clone() { + PrismPropertyDefinitionImpl clone = new PrismPropertyDefinitionImpl(getName(), getTypeName(), getPrismContext()); + copyDefinitionData(clone); + return clone; + } + + protected void copyDefinitionData(PrismPropertyDefinitionImpl clone) { + super.copyDefinitionData(clone); + clone.indexed = this.indexed; + clone.defaultValue = this.defaultValue; + clone.allowedValues = this.allowedValues; + clone.valueType = this.valueType; + } + + @Override + protected void extendToString(StringBuilder sb) { + super.extendToString(sb); + if (indexed != null && indexed) { + sb.append(",I"); + } + if (allowedValues != null && !allowedValues.isEmpty()) { + sb.append(",AVals:").append(allowedValues.size()); + } + } + + @Override + public int hashCode() { + final int prime = 31; + int result = super.hashCode(); + result = prime * result + ((allowedValues == null) ? 0 : allowedValues.hashCode()); + result = prime * result + ((defaultValue == null) ? 0 : defaultValue.hashCode()); + result = prime * result + ((indexed == null) ? 0 : indexed.hashCode()); + result = prime * result + ((valueType == null) ? 0 : valueType.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (!super.equals(obj)) + return false; + if (getClass() != obj.getClass()) + return false; + PrismPropertyDefinitionImpl other = (PrismPropertyDefinitionImpl) obj; + if (allowedValues == null) { + if (other.allowedValues != null) + return false; + } else if (!allowedValues.equals(other.allowedValues)) + return false; + if (defaultValue == null) { + if (other.defaultValue != null) + return false; + } else if (!defaultValue.equals(other.defaultValue)) + return false; + if (indexed == null) { + if (other.indexed != null) + return false; + } else if (!indexed.equals(other.indexed)) + return false; + if (valueType == null) { + if (other.valueType != null) + return false; + } else if (!valueType.equals(other.valueType)) + return false; + return true; + } + + /** + * Return a human readable name of this class suitable for logs. + */ + @Override + protected String getDebugDumpClassName() { + return "PPD"; + } + + @Override + public String getDocClassName() { + return "property"; + } +} diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyValue.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyValue.java index f561cb3ae08..5b1b76b91c9 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyValue.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyValue.java @@ -23,6 +23,7 @@ import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.prism.polystring.PolyStringNormalizer; import com.evolveum.midpoint.prism.schema.SchemaRegistry; +import com.evolveum.midpoint.prism.schema.SchemaRegistryImpl; import com.evolveum.midpoint.prism.util.CloneUtil; import com.evolveum.midpoint.prism.util.PrismUtil; import com.evolveum.midpoint.prism.xnode.PrimitiveXNode; @@ -111,7 +112,7 @@ public T getValue() { // the attribute now. But we should rather do this: TODO: // throw new IllegalStateException("Attempt to get value withot a type from raw value of property "+getParent()); if (parent != null && parent.getPrismContext() != null) { - def = SchemaRegistry.createDefaultItemDefinition(parent.getElementName(), parent.getPrismContext()); + def = SchemaRegistryImpl.createDefaultItemDefinition(parent.getElementName(), parent.getPrismContext()); } else if (PrismContextImpl.isAllowSchemalessSerialization()) { if (rawElement instanceof Element) { // Do the most stupid thing possible. Assume string value. And there will be no definition. diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismReferenceDefinition.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismReferenceDefinition.java index f0bf92d34c8..0d406993a9f 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismReferenceDefinition.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismReferenceDefinition.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2015 Evolveum + * Copyright (c) 2010-2016 Evolveum * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,155 +16,31 @@ package com.evolveum.midpoint.prism; -import javax.xml.namespace.QName; - import com.evolveum.midpoint.prism.delta.ItemDelta; -import com.evolveum.midpoint.prism.delta.ReferenceDelta; import com.evolveum.midpoint.prism.path.ItemPath; -import com.evolveum.midpoint.prism.path.ObjectReferencePathSegment; -import com.evolveum.midpoint.util.QNameUtil; +import com.evolveum.midpoint.util.exception.SchemaException; +import javax.xml.namespace.QName; /** - * Object Reference Schema Definition. - * - * Object Reference is a property that describes reference to an object. It is - * used to represent association between objects. For example reference from - * User object to Account objects that belong to the user. The reference is a - * simple uni-directional link using an OID as an identifier. - * - * This type should be used for all object references so the implementations can - * detect them and automatically resolve them. - * - * This class represents schema definition for object reference. See - * {@link Definition} for more details. - * - * @author Radovan Semancik - * + * @author mederly */ -public class PrismReferenceDefinition extends ItemDefinition { - - private static final long serialVersionUID = 2427488779612517600L; - private QName targetTypeName; - private QName compositeObjectElementName; - private boolean isComposite = false; - - public PrismReferenceDefinition(QName elementName, QName typeName, PrismContext prismContext) { - super(elementName, typeName, prismContext); - } - - /** - * Returns valid XSD object types whose may be the targets of the reference. - * - * Corresponds to "targetType" XSD annotation. - * - * Returns empty set if not specified. Must not return null. - * - * @return set of target type names - */ - public QName getTargetTypeName() { - return targetTypeName; - } - - public void setTargetTypeName(QName targetTypeName) { - this.targetTypeName = targetTypeName; - } - - public QName getCompositeObjectElementName() { - return compositeObjectElementName; - } +public interface PrismReferenceDefinition extends ItemDefinition { + QName getTargetTypeName(); - public void setCompositeObjectElementName(QName compositeObjectElementName) { - this.compositeObjectElementName = compositeObjectElementName; - } - - public boolean isComposite() { - return isComposite; - } + QName getCompositeObjectElementName(); - public void setComposite(boolean isComposite) { - this.isComposite = isComposite; - } + boolean isComposite(); @Override - public boolean isValidFor(QName elementQName, Class clazz) { - return isValidFor(elementQName, clazz, false); - } + PrismReference instantiate(); @Override - public boolean isValidFor(QName elementQName, Class clazz, boolean caseInsensitive) { - if (!clazz.isAssignableFrom(this.getClass())) { - return false; - } - if (QNameUtil.match(elementQName, getName(), caseInsensitive)) { - return true; - } - if (QNameUtil.match(elementQName, getCompositeObjectElementName(), caseInsensitive)) { - return true; - } - return false; - } + PrismReference instantiate(QName name); @Override - T findItemDefinition(ItemPath path, Class clazz) { - if (path.isEmpty() || !(path.first() instanceof ObjectReferencePathSegment)) { - return super.findItemDefinition(path, clazz); - } else { - ItemPath rest = path.rest(); - PrismObjectDefinition referencedObjectDefinition = getSchemaRegistry().determineReferencedObjectDefinition(targetTypeName, rest); - return (T) referencedObjectDefinition.findItemDefinition(rest, clazz); - } - } - - @Override - public PrismReference instantiate() { - return instantiate(getName()); - } - - @Override - public PrismReference instantiate(QName name) { - name = addNamespaceIfApplicable(name); - return new PrismReference(name, this, prismContext); - } - - @Override - public ItemDelta createEmptyDelta(ItemPath path) { - return new ReferenceDelta(path, this, prismContext); - } - - @Override - public PrismReferenceDefinition clone() { - PrismReferenceDefinition clone = new PrismReferenceDefinition(getName(), getTypeName(), getPrismContext()); - copyDefinitionData(clone); - return clone; - } - - protected void copyDefinitionData(PrismReferenceDefinition clone) { - super.copyDefinitionData(clone); - clone.targetTypeName = this.targetTypeName; - clone.compositeObjectElementName = this.compositeObjectElementName; - clone.isComposite = this.isComposite; - } - - /** - * Return a human readable name of this class suitable for logs. - */ - @Override - protected String getDebugDumpClassName() { - return "PRD"; - } - - @Override - public String getDocClassName() { - return "reference"; - } + ItemDelta createEmptyDelta(ItemPath path); @Override - protected void extendToString(StringBuilder sb) { - super.extendToString(sb); - if (isComposite) { - sb.append(",composite"); - } - } - + PrismReferenceDefinition clone(); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismReferenceDefinitionImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismReferenceDefinitionImpl.java new file mode 100644 index 00000000000..a030a4fbcfd --- /dev/null +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismReferenceDefinitionImpl.java @@ -0,0 +1,173 @@ +/* + * Copyright (c) 2010-2015 Evolveum + * + * 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 com.evolveum.midpoint.prism; + +import javax.xml.namespace.QName; + +import com.evolveum.midpoint.prism.delta.ItemDelta; +import com.evolveum.midpoint.prism.delta.ReferenceDelta; +import com.evolveum.midpoint.prism.path.ItemPath; +import com.evolveum.midpoint.prism.path.ObjectReferencePathSegment; +import com.evolveum.midpoint.util.QNameUtil; +import org.jetbrains.annotations.NotNull; + +/** + * Object Reference Schema Definition. + * + * Object Reference is a property that describes reference to an object. It is + * used to represent association between objects. For example reference from + * User object to Account objects that belong to the user. The reference is a + * simple uni-directional link using an OID as an identifier. + * + * This type should be used for all object references so the implementations can + * detect them and automatically resolve them. + * + * This class represents schema definition for object reference. See + * {@link Definition} for more details. + * + * @author Radovan Semancik + * + */ +public class PrismReferenceDefinitionImpl extends ItemDefinitionImpl implements PrismReferenceDefinition { + + private static final long serialVersionUID = 2427488779612517600L; + private QName targetTypeName; + private QName compositeObjectElementName; + private boolean isComposite = false; + + public PrismReferenceDefinitionImpl(QName elementName, QName typeName, PrismContext prismContext) { + super(elementName, typeName, prismContext); + } + + /** + * Returns valid XSD object types whose may be the targets of the reference. + * + * Corresponds to "targetType" XSD annotation. + * + * Returns empty set if not specified. Must not return null. + * + * @return set of target type names + */ + @Override + public QName getTargetTypeName() { + return targetTypeName; + } + + public void setTargetTypeName(QName targetTypeName) { + this.targetTypeName = targetTypeName; + } + + @Override + public QName getCompositeObjectElementName() { + return compositeObjectElementName; + } + + public void setCompositeObjectElementName(QName compositeObjectElementName) { + this.compositeObjectElementName = compositeObjectElementName; + } + + @Override + public boolean isComposite() { + return isComposite; + } + + public void setComposite(boolean isComposite) { + this.isComposite = isComposite; + } + + @Override + public boolean isValidFor(QName elementQName, Class clazz) { + return isValidFor(elementQName, clazz, false); + } + + @Override + public boolean isValidFor(@NotNull QName elementQName, @NotNull Class clazz, boolean caseInsensitive) { + if (!clazz.isAssignableFrom(this.getClass())) { + return false; + } + if (QNameUtil.match(elementQName, getName(), caseInsensitive)) { + return true; + } + if (QNameUtil.match(elementQName, getCompositeObjectElementName(), caseInsensitive)) { + return true; + } + return false; + } + + @Override + public T findItemDefinition(@NotNull ItemPath path, @NotNull Class clazz) { + if (path.isEmpty() || !(path.first() instanceof ObjectReferencePathSegment)) { + return super.findItemDefinition(path, clazz); + } else { + ItemPath rest = path.rest(); + PrismObjectDefinition referencedObjectDefinition = getSchemaRegistry().determineReferencedObjectDefinition(targetTypeName, rest); + return (T) referencedObjectDefinition.findItemDefinition(rest, clazz); + } + } + + @Override + public PrismReference instantiate() { + return instantiate(getName()); + } + + @Override + public PrismReference instantiate(QName name) { + name = addNamespaceIfApplicable(name); + return new PrismReference(name, this, prismContext); + } + + @Override + public ItemDelta createEmptyDelta(ItemPath path) { + return new ReferenceDelta(path, this, prismContext); + } + + @Override + public PrismReferenceDefinition clone() { + PrismReferenceDefinitionImpl clone = new PrismReferenceDefinitionImpl(getName(), getTypeName(), getPrismContext()); + copyDefinitionData(clone); + return clone; + } + + protected void copyDefinitionData(PrismReferenceDefinitionImpl clone) { + super.copyDefinitionData(clone); + clone.targetTypeName = this.targetTypeName; + clone.compositeObjectElementName = this.compositeObjectElementName; + clone.isComposite = this.isComposite; + } + + /** + * Return a human readable name of this class suitable for logs. + */ + @Override + protected String getDebugDumpClassName() { + return "PRD"; + } + + @Override + public String getDocClassName() { + return "reference"; + } + + @Override + protected void extendToString(StringBuilder sb) { + super.extendToString(sb); + if (isComposite) { + sb.append(",composite"); + } + } + +} diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/XmlEntityResolver.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/XmlEntityResolver.java new file mode 100644 index 00000000000..cd1cf859ded --- /dev/null +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/XmlEntityResolver.java @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.prism; + +import org.w3c.dom.ls.LSResourceResolver; +import org.xml.sax.EntityResolver; + +/** + * @author mederly + */ +public interface XmlEntityResolver extends EntityResolver, LSResourceResolver { +} diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/dom/DomLexicalWriter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/dom/DomLexicalWriter.java index 9b82cee5e41..52ed05f8229 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/dom/DomLexicalWriter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/dom/DomLexicalWriter.java @@ -18,6 +18,7 @@ import com.evolveum.midpoint.prism.marshaller.XPathHolder; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.schema.SchemaRegistry; +import com.evolveum.midpoint.prism.schema.SchemaRegistryImpl; import com.evolveum.midpoint.prism.xml.DynamicNamespacePrefixMapper; import com.evolveum.midpoint.prism.xml.XsdTypeMapper; import com.evolveum.midpoint.prism.xnode.ListXNode; @@ -64,7 +65,7 @@ private DynamicNamespacePrefixMapper getNamespacePrefixMapper() { if (schemaRegistry == null) { return null; } - return schemaRegistry.getNamespacePrefixMapper(); + return ((SchemaRegistryImpl) schemaRegistry).getNamespacePrefixMapper(); } private void initialize() { diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/JaxbDomHack.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/JaxbDomHack.java index 1a346a997bf..40d7b8ccf13 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/JaxbDomHack.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/JaxbDomHack.java @@ -81,7 +81,7 @@ private ItemDefinition locateItemDefinition( Object val = ((JAXBElement) element).getValue(); if (val.getClass().isPrimitive()){ QName typeName = XsdTypeMapper.toXsdType(val.getClass()); - PrismPropertyDefinition propDef = new PrismPropertyDefinition(elementQName, typeName, prismContext); + PrismPropertyDefinitionImpl propDef = new PrismPropertyDefinitionImpl(elementQName, typeName, prismContext); // propDef.setMaxOccurs(maxOccurs); propDef.setDynamic(true); return propDef; @@ -132,7 +132,7 @@ private ItemDefinition resolveDynamicItemDefinition(ItemDefinition parentDefinit if (typeName == null) { return null; } - PrismPropertyDefinition propDef = new PrismPropertyDefinition(elementName, typeName, prismContext); + PrismPropertyDefinitionImpl propDef = new PrismPropertyDefinitionImpl(elementName, typeName, prismContext); propDef.setMaxOccurs(maxOccurs); propDef.setDynamic(true); return propDef; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/XNodeProcessor.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/XNodeProcessor.java index 03712882674..29a97ecb6d0 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/XNodeProcessor.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/XNodeProcessor.java @@ -266,22 +266,22 @@ public PrismContainerValue parsePrismContainerValue } } - private PrismContainerValue parsePrismContainerValueFromMap(MapXNode xmap, PrismContainerDefinition containerDef, - Collection ignoredItems, ParsingContext pc) throws SchemaException { + private PrismContainerValue parsePrismContainerValueFromMap(@NotNull MapXNode xmap, + @NotNull PrismContainerDefinition containerDef, + @Nullable Collection ignoredItems, @NotNull ParsingContext pc) throws SchemaException { Long id = getContainerId(xmap); // override container definition, if explicit type is specified - PrismContainerDefinition valueDefinition = containerDef; + ComplexTypeDefinition complexTypeDefinition = containerDef.getComplexTypeDefinition(); if (xmap.getTypeQName() != null) { - PrismContainerDefinition specificDef = getSchemaRegistry().findContainerDefinitionByType(xmap.getTypeQName()); + ComplexTypeDefinition specificDef = getSchemaRegistry().findComplexTypeDefinition(xmap.getTypeQName()); if (specificDef != null) { - valueDefinition = specificDef; + complexTypeDefinition = specificDef; } else { - // TODO raise exception here? - // by silently proceeding we risk losing some subclass-specific items + pc.warnOrThrow(LOGGER, "Unknown type " + xmap.getTypeQName() + " in " + xmap); } } - PrismContainerValue cval = new PrismContainerValue(null, null, null, id, xmap.getTypeQName(), prismContext); + PrismContainerValue cval = new PrismContainerValue(null, null, null, id, complexTypeDefinition, prismContext); for (Entry xentry : xmap.entrySet()) { QName itemQName = xentry.getKey(); if (QNameUtil.match(itemQName, XNode.KEY_CONTAINER_ID)) { @@ -290,29 +290,34 @@ private PrismContainerValue parsePrismContainerValu if (QNameUtil.matchAny(itemQName, ignoredItems)) { continue; } - ItemDefinition itemDef = locateItemDefinition(valueDefinition, itemQName, xentry.getValue()); + ItemDefinition itemDef = locateItemDefinition(complexTypeDefinition, itemQName, xentry.getValue()); +// if (itemDef == null) { +// itemDef = locateItemDefinition(containerDef, itemQName, xentry.getValue()); +// } if (itemDef == null) { - if (valueDefinition.isRuntimeSchema()) { - PrismSchema itemSchema = getSchemaRegistry().findSchemaByNamespace(itemQName.getNamespaceURI()); - if (itemSchema != null) { - // If we already have schema for this namespace then a missing element is - // an error. We positively know that it is not in the schema. - String message = - "Item " + itemQName + " has no definition (schema present, in container " + containerDef + ")" + "while parsing " - + xmap.debugDump(); - if (pc.isStrict()) { - throw new SchemaException(message, itemQName); - } else { - pc.warn(LOGGER, message); - continue; - } - } else { - // No definition for item, but the schema is runtime. the definition may come later. - // Null is OK here. The item will be parsed as "raw" - } + if (complexTypeDefinition == null || complexTypeDefinition.isXsdAnyMarker()) { + // ok + } else if (complexTypeDefinition.isRuntimeSchema()) { +// PrismSchema itemSchema = getSchemaRegistry().findSchemaByNamespace(itemQName.getNamespaceURI()); +// if (itemSchema != null) { +// // If we already have schema for this namespace then a missing element is +// // an error. We positively know that it is not in the schema. +// String message = +// "Item " + itemQName + " has no definition (schema present, in container " + containerDef + ")" + "while parsing " +// + xmap.debugDump(); +// if (pc.isStrict()) { +// throw new SchemaException(message, itemQName); +// } else { +// pc.warn(LOGGER, message); +// continue; +// } +// } else { +// // No definition for item, but the schema is runtime. the definition may come later. +// // Null is OK here. The item will be parsed as "raw" +// } } else { String message = - "Item " + itemQName + " has no definition (in container value " + valueDefinition + ")" + "while parsing " + xmap + "Item " + itemQName + " has no definition (in container value " + complexTypeDefinition + ")" + "while parsing " + xmap .debugDump(); if (pc.isStrict()) { throw new SchemaException(message, itemQName); @@ -877,7 +882,7 @@ private PrismReferenceValue parseReferenceAsCompositeObject(MapXNode xmap, PrismReferenceValue refVal = new PrismReferenceValue(); setReferenceObject(refVal, compositeObject); - referenceDefinition.setComposite(true); + ((PrismReferenceDefinitionImpl) referenceDefinition).setComposite(true); return refVal; } @@ -916,12 +921,36 @@ public ItemDefinition locateItemDefinition( if (containerDefinition.isRuntimeSchema()) { // Try to locate global definition in any of the schemas - def = resolveGlobalItemDefinition(containerDefinition, elementQName, xnode); + def = resolveGlobalItemDefinition(containerDefinition.getComplexTypeDefinition(), elementQName, xnode); } return def; } - private ItemDefinition resolveDynamicItemDefinition(ItemDefinition parentDefinition, QName elementName, XNode xnode) throws SchemaException { + public ItemDefinition locateItemDefinition( + ComplexTypeDefinition complexTypeDefinition, QName elementQName, XNode xnode) + throws SchemaException { + ItemDefinition def = null; + + if (complexTypeDefinition != null) { + //def = complexTypeDefinition.findItemDefinition(elementQName, ItemDefinition.class, false); + def = complexTypeDefinition.findItemDefinition(new ItemPath(elementQName)); + if (def != null) { + return def; + } + } + + def = resolveDynamicItemDefinition(complexTypeDefinition, elementQName, xnode); + if (def != null) { + return def; + } + + if (complexTypeDefinition == null || complexTypeDefinition.isXsdAnyMarker()) { + // Try to locate global definition in any of the schemas + def = resolveGlobalItemDefinition(complexTypeDefinition, elementQName, xnode); + } + return def; + } + private ItemDefinition resolveDynamicItemDefinition(Definition parentDefinition, QName elementName, XNode xnode) throws SchemaException { if (xnode == null) { return null; } @@ -941,7 +970,7 @@ private ItemDefinition resolveDynamicItemDefinition(ItemDefinition parentDefinit if (typeName == null) { return null; } - PrismPropertyDefinition propDef = new PrismPropertyDefinition(elementName, typeName, prismContext); + PrismPropertyDefinitionImpl propDef = new PrismPropertyDefinitionImpl(elementName, typeName, prismContext); Integer maxOccurs = xnode.getMaxOccurs(); if (maxOccurs != null) { propDef.setMaxOccurs(maxOccurs); @@ -954,9 +983,9 @@ private ItemDefinition resolveDynamicItemDefinition(ItemDefinition parentDefinit } private ItemDefinition resolveGlobalItemDefinition( - PrismContainerDefinition containerDefinition, QName elementQName, XNode xnode) + ComplexTypeDefinition complexTypeDefinition, QName elementQName, XNode xnode) throws SchemaException { - return prismContext.getSchemaRegistry().resolveGlobalItemDefinition(elementQName, containerDefinition); + return prismContext.getSchemaRegistry().resolveGlobalItemDefinition(elementQName, complexTypeDefinition); } //endregion diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/path/ItemPath.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/path/ItemPath.java index 8fc0a7f9c76..b2eae6022d2 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/path/ItemPath.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/path/ItemPath.java @@ -199,6 +199,7 @@ public ItemPathSegment first() { return segments.get(0); } + @NotNull public ItemPath rest() { return tail(); } @@ -230,6 +231,7 @@ public ItemPath head() { /** * Returns path containing all segments except the first N. */ + @NotNull public ItemPath tail(int n) { if (segments.size() < n) { return EMPTY_PATH; @@ -237,6 +239,7 @@ public ItemPath tail(int n) { return new ItemPath(segments.subList(n, segments.size())); } + @NotNull public ItemPath tail() { return tail(1); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/path/NameItemPathSegment.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/path/NameItemPathSegment.java index 5d48c81a95d..af788b19232 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/path/NameItemPathSegment.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/path/NameItemPathSegment.java @@ -22,6 +22,7 @@ import com.evolveum.midpoint.util.DebugUtil; import com.evolveum.midpoint.util.PrettyPrinter; import com.evolveum.midpoint.util.QNameUtil; +import org.jetbrains.annotations.NotNull; import java.io.Serializable; @@ -33,24 +34,25 @@ public class NameItemPathSegment extends ItemPathSegment { public static final NameItemPathSegment WILDCARD = NameItemPathSegment.createWildcard(); - private QName name; + @NotNull private final QName name; private boolean isVariable = false; - public NameItemPathSegment(QName name) { + public NameItemPathSegment(@NotNull QName name) { this.name = name; } private static NameItemPathSegment createWildcard() { - NameItemPathSegment segment = new NameItemPathSegment(null); + NameItemPathSegment segment = new NameItemPathSegment(new QName("*")); // TODO segment.setWildcard(true); return segment; } - public NameItemPathSegment(QName name, boolean isVariable) { + public NameItemPathSegment(@NotNull QName name, boolean isVariable) { this.name = name; this.isVariable = isVariable; } + @NotNull public QName getName() { return name; } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/TypeFilter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/TypeFilter.java index 56b0a76a086..928fac50fe2 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/TypeFilter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/TypeFilter.java @@ -77,19 +77,21 @@ public boolean match(PrismContainerValue value, MatchingRuleRegistry matchingRul if (value == null) { return false; // just for safety } - PrismContainerDefinition definition = value.getConcreteTypeDefinition(); + ComplexTypeDefinition definition = value.getComplexTypeDefinition(); if (definition == null) { if (!(value.getParent() instanceof PrismContainer)) { LOGGER.trace("Parent of {} is not a PrismContainer, returning false; it is {}", value, value.getParent()); return false; } PrismContainer container = (PrismContainer) value.getParent(); - definition = container.getDefinition(); - if (definition == null) { + PrismContainerDefinition pcd = container.getDefinition(); + if (pcd == null) { LOGGER.trace("Parent of {} has no definition, returning false", value); return false; } + definition = pcd.getComplexTypeDefinition(); } + // TODO TODO TODO subtypes!!!!!!!! if (!QNameUtil.match(definition.getTypeName(), type)) { return false; } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/DefinitionSearchContext.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/DefinitionSearchContext.java new file mode 100644 index 00000000000..571dcaf4bdb --- /dev/null +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/DefinitionSearchContext.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.prism.schema; + +import com.evolveum.midpoint.prism.Containerable; +import com.evolveum.midpoint.prism.Definition; +import com.evolveum.midpoint.prism.ItemDefinition; +import org.jetbrains.annotations.NotNull; + +import javax.xml.namespace.QName; + +/** + * @author mederly + */ +public interface DefinitionSearchContext { + +// D byElementName(@NotNull QName elementName); + +} diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/DefinitionSearchContextCtdImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/DefinitionSearchContextCtdImpl.java new file mode 100644 index 00000000000..97fc47695eb --- /dev/null +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/DefinitionSearchContextCtdImpl.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.prism.schema; + +import com.evolveum.midpoint.prism.ComplexTypeDefinition; +import com.evolveum.midpoint.prism.Containerable; +import org.jetbrains.annotations.NotNull; + +import javax.xml.namespace.QName; + +/** + * @author mederly + */ +public class DefinitionSearchContextCtdImpl implements GlobalDefinitionSearchContext { + +// private final DefinitionSearchImplementation provider; +// +// DefinitionSearchContextCtdImpl(DefinitionSearchImplementation provider) { +// this.provider = provider; +// } +// +// @Override +// public ComplexTypeDefinition byElementName(@NotNull QName elementName) { +// throw new UnsupportedOperationException(); +// } +// +// @Override +// public ComplexTypeDefinition byType(@NotNull QName typeName) { +// return provider.findComplexTypeDefinition(typeName); +// } +// +// @Override +// public ComplexTypeDefinition byCompileTimeClass(@NotNull Class clazz) { +// return provider.findComplexTypeDefinitionByCompileTimeClass(clazz); +// } + +} diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/DefinitionSearchContextItemImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/DefinitionSearchContextItemImpl.java new file mode 100644 index 00000000000..e9a0cc9bef1 --- /dev/null +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/DefinitionSearchContextItemImpl.java @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.prism.schema; + +import com.evolveum.midpoint.prism.*; +import org.jetbrains.annotations.NotNull; + +import javax.xml.namespace.QName; + +/** + * @author mederly + */ +public class DefinitionSearchContextItemImpl implements GlobalDefinitionSearchContext { + +// private final DefinitionSearchImplementation provider; +// private final Class definitionClass; +// +// public DefinitionSearchContextItemImpl(DefinitionSearchImplementation provider, Class definitionClass) { +// this.provider = provider; +// this.definitionClass = definitionClass; +// } +// +// @Override +// public ID byElementName(@NotNull QName elementName) { +// return provider.findItemDefinition(elementName, definitionClass); +// } +// +// @Override +// public ID byType(@NotNull QName type) { +// return provider.findItemDefinitionByType(type, definitionClass); +// } +// +// @Override +// public ID byCompileTimeClass(@NotNull Class clazz) { +// if (PrismObjectDefinition.class.isAssignableFrom(definitionClass)) { +// return (ID) provider.findObjectDefinitionByCompileTimeClass((Class) clazz); +// } else if (PrismContainerDefinition.class.isAssignableFrom(definitionClass)) { +// return (ID) provider.findContainerDefinitionByCompileTimeClass(clazz); +// } else { +// throw new UnsupportedOperationException("Only containers and prism objects can be searched by compile-time class. Not " +// + definitionClass + " by " + clazz); +// } +// } +} diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/DefinitionSearchImplementation.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/DefinitionSearchImplementation.java new file mode 100644 index 00000000000..4d729735578 --- /dev/null +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/DefinitionSearchImplementation.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.prism.schema; + +import com.evolveum.midpoint.prism.*; +import org.jetbrains.annotations.NotNull; + +import javax.xml.namespace.QName; + +/** + * @author mederly + */ +public interface DefinitionSearchImplementation { + +// ComplexTypeDefinition findComplexTypeDefinition(@NotNull QName typeName); +// +// ComplexTypeDefinition findComplexTypeDefinitionByCompileTimeClass(@NotNull Class clazz); +// +// ID findItemDefinition(@NotNull QName definitionName, @NotNull Class definitionType); +// +// default ID findItemDefinition(@NotNull String localName, @NotNull Class definitionType) { +// return findItemDefinition(new QName(localName), definitionType); +// } +// +// ID findItemDefinitionByType(@NotNull QName typeName, @NotNull Class definitionType); +// +// PrismObjectDefinition findObjectDefinitionByCompileTimeClass(@NotNull Class type); +// +// PrismContainerDefinition findContainerDefinitionByCompileTimeClass(@NotNull Class type); +} diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/DefinitionsStore.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/DefinitionsStore.java new file mode 100644 index 00000000000..635b94efcaf --- /dev/null +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/DefinitionsStore.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.prism.schema; + +import com.evolveum.midpoint.prism.*; + +/** + * @author mederly + */ +public interface DefinitionsStore { + +// DefinitionSearchContext> findItemDefinition(); +// +// DefinitionSearchContext findPropertyDefinition(); +// +// DefinitionSearchContext findReferenceDefinition(); +// +// DefinitionSearchContext> findContainerDefinition(); + + +} diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/DomToSchemaProcessor.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/DomToSchemaProcessor.java index 117c9fa95d3..43fe55da6a2 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/DomToSchemaProcessor.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/DomToSchemaProcessor.java @@ -37,6 +37,7 @@ import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; +import com.evolveum.midpoint.prism.*; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.Validate; import org.jetbrains.annotations.NotNull; @@ -46,16 +47,6 @@ import org.xml.sax.InputSource; import org.xml.sax.SAXException; -import com.evolveum.midpoint.prism.ComplexTypeDefinition; -import com.evolveum.midpoint.prism.Definition; -import com.evolveum.midpoint.prism.DisplayableValueImpl; -import com.evolveum.midpoint.prism.ItemDefinition; -import com.evolveum.midpoint.prism.PrismConstants; -import com.evolveum.midpoint.prism.PrismContainerDefinition; -import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.PrismPropertyDefinition; -import com.evolveum.midpoint.prism.PrismReferenceDefinition; -import com.evolveum.midpoint.prism.PrismReferenceValue; import com.evolveum.midpoint.prism.xml.XmlTypeConverter; import com.evolveum.midpoint.prism.xml.XsdTypeMapper; import com.evolveum.midpoint.util.DOMUtil; @@ -91,7 +82,7 @@ class DomToSchemaProcessor { private static final Trace LOGGER = TraceManager.getTrace(DomToSchemaProcessor.class); - private PrismSchema schema; + private PrismSchemaImpl schema; private EntityResolver entityResolver; private PrismContext prismContext; private XSSchemaSet xsSchemaSet; @@ -156,7 +147,7 @@ public void setRuntime(boolean isRuntime) { * @throws SchemaException * in case of any error */ - PrismSchema parseDom(PrismSchema prismSchema, Element xsdSchema) throws SchemaException { + void parseDom(PrismSchemaImpl prismSchema, Element xsdSchema) throws SchemaException { Validate.notNull(xsdSchema, "XSD schema element must not be null."); schema = prismSchema; @@ -165,7 +156,7 @@ PrismSchema parseDom(PrismSchema prismSchema, Element xsdSchema) throws SchemaEx xsSchemaSet = parseSchema(xsdSchema); if (xsSchemaSet == null) { - return schema; + return; } // Create ComplexTypeDefinitions from all top-level complexType @@ -176,8 +167,6 @@ PrismSchema parseDom(PrismSchema prismSchema, Element xsdSchema) throws SchemaEx // the top-level elements in XSD // This also creates ResourceObjectDefinition in some cases createDefinitionsFromElements(xsSchemaSet); - - return schema; } private void initSchema(Element xsdSchema) throws SchemaException { @@ -238,7 +227,7 @@ private XSSchemaSet parseSchema(Element schema) throws SchemaException { private XSOMParser createSchemaParser() { XSOMParser parser = new XSOMParser(); if (entityResolver == null) { - entityResolver = prismContext.getSchemaRegistry(); + entityResolver = prismContext.getEntityResolver(); if (entityResolver == null) { throw new IllegalStateException( "Entity resolver is not set (even tried to pull it from prism context)"); @@ -295,7 +284,7 @@ private ComplexTypeDefinition processComplexTypeDefinition(XSComplexType complex throws SchemaException { SchemaDefinitionFactory definitionFactory = getDefinitionFactory(); - ComplexTypeDefinition ctd = definitionFactory.createComplexTypeDefinition(complexType, prismContext, + ComplexTypeDefinitionImpl ctd = (ComplexTypeDefinitionImpl) definitionFactory.createComplexTypeDefinition(complexType, prismContext, complexType.getAnnotation()); ComplexTypeDefinition existingComplexTypeDefinition = schema @@ -369,7 +358,7 @@ private ComplexTypeDefinition processComplexTypeDefinition(XSComplexType complex extractDocumentation(ctd, complexType.getAnnotation()); if (getSchemaRegistry() != null) { - Class compileTimeClass = getSchemaRegistry().determineCompileTimeClass(ctd); + Class compileTimeClass = getSchemaRegistry().determineCompileTimeClass(ctd.getTypeName()); ctd.setCompileTimeClass(compileTimeClass); } @@ -402,7 +391,7 @@ private void extractDocumentation(Definition definition, XSAnnotation annotation // The documentation may be HTML-formatted. Therefore we want to // keep the formatting and tag names String documentationText = DOMUtil.serializeElementContent(documentationElement); - definition.setDocumentation(documentationText); + ((DefinitionImpl) definition).setDocumentation(documentationText); } } @@ -462,13 +451,13 @@ private void addPropertyDefinitionListFromGroup(XSModelGroup group, ComplexTypeD XSAnnotation containerAnnotation = xsType.getAnnotation(); PrismContainerDefinition containerDefinition = createPropertyContainerDefinition( xsType, p, null, containerAnnotation, false); - containerDefinition.setInherited(particleInherited); - ctd.addDefinition(containerDefinition); + ((PrismContainerDefinitionImpl) containerDefinition).setInherited(particleInherited); + ((ComplexTypeDefinitionImpl) ctd).addDefinition(containerDefinition); } else { - PrismPropertyDefinition propDef = createPropertyDefinition(xsType, elementName, + PrismPropertyDefinitionImpl propDef = createPropertyDefinition(xsType, elementName, DOMUtil.XSD_ANY, ctd, annotation, p); propDef.setInherited(particleInherited); - ctd.addDefinition(propDef); + ((ComplexTypeDefinitionImpl) ctd).addDefinition(propDef); } } @@ -501,11 +490,11 @@ private void addPropertyDefinitionListFromGroup(XSModelGroup group, ComplexTypeD PrismContainerDefinition containerDefinition = createPropertyContainerDefinition( xsType, p, complexTypeDefinition, containerAnnotation, false); if (isAny(xsType)) { - containerDefinition.setRuntimeSchema(true); - containerDefinition.setDynamic(true); + ((PrismContainerDefinitionImpl) containerDefinition).setRuntimeSchema(true); + ((PrismContainerDefinitionImpl) containerDefinition).setDynamic(true); } - containerDefinition.setInherited(particleInherited); - ctd.addDefinition(containerDefinition); + ((PrismContainerDefinitionImpl) containerDefinition).setInherited(particleInherited); + ((ComplexTypeDefinitionImpl) ctd).addDefinition(containerDefinition); } else { @@ -513,10 +502,10 @@ private void addPropertyDefinitionListFromGroup(XSModelGroup group, ComplexTypeD // complex type) QName typeName = new QName(xsType.getTargetNamespace(), xsType.getName()); - PrismPropertyDefinition propDef = createPropertyDefinition(xsType, elementName, typeName, + PrismPropertyDefinitionImpl propDef = createPropertyDefinition(xsType, elementName, typeName, ctd, annotation, p); propDef.setInherited(particleInherited); - ctd.add(propDef); + ((ComplexTypeDefinitionImpl) ctd).add(propDef); } } } @@ -534,17 +523,17 @@ private PrismReferenceDefinition processObjectReferenceDefinition(XSType xsType, if (hasExplicitPrimaryElementName) { primaryElementName = DOMUtil.getQNameValue(objRefAnnotationElement); } - PrismReferenceDefinition definition = null; + PrismReferenceDefinitionImpl definition = null; if (containingCtd != null) { - definition = containingCtd.findItemDefinition(primaryElementName, PrismReferenceDefinition.class); + definition = (PrismReferenceDefinitionImpl) containingCtd.findItemDefinition(primaryElementName, PrismReferenceDefinition.class); } if (definition == null) { SchemaDefinitionFactory definitionFactory = getDefinitionFactory(); - definition = definitionFactory.createReferenceDefinition(primaryElementName, typeName, + definition = (PrismReferenceDefinitionImpl) definitionFactory.createReferenceDefinition(primaryElementName, typeName, containingCtd, prismContext, annotation, elementParticle); definition.setInherited(inherited); if (containingCtd != null) { - containingCtd.add(definition); + ((ComplexTypeDefinitionImpl) containingCtd).add(definition); } } if (hasExplicitPrimaryElementName) { @@ -585,20 +574,20 @@ private PrismReferenceDefinition processObjectReferenceDefinition(XSType xsType, private void setMultiplicity(ItemDefinition itemDef, XSParticle particle, XSAnnotation annotation, boolean topLevel) { if (topLevel || particle == null) { - itemDef.setMinOccurs(0); + ((ItemDefinitionImpl) itemDef).setMinOccurs(0); Element maxOccursAnnotation = SchemaProcessorUtil.getAnnotationElement(annotation, A_MAX_OCCURS); if (maxOccursAnnotation != null) { String maxOccursString = maxOccursAnnotation.getTextContent(); int maxOccurs = XsdTypeMapper.multiplicityToInteger(maxOccursString); - itemDef.setMaxOccurs(maxOccurs); + ((ItemDefinitionImpl) itemDef).setMaxOccurs(maxOccurs); } else { - itemDef.setMaxOccurs(-1); + ((ItemDefinitionImpl) itemDef).setMaxOccurs(-1); } } else { // itemDef.setMinOccurs(particle.getMinOccurs()); // itemDef.setMaxOccurs(particle.getMaxOccurs()); - itemDef.setMinOccurs(particle.getMinOccurs().intValue()); - itemDef.setMaxOccurs(particle.getMaxOccurs().intValue()); + ((ItemDefinitionImpl) itemDef).setMinOccurs(particle.getMinOccurs().intValue()); + ((ItemDefinitionImpl) itemDef).setMaxOccurs(particle.getMaxOccurs().intValue()); } } @@ -870,15 +859,14 @@ private PrismContainerDefinition createPropertyContainerDefinition(XSType xsT throws SchemaException { QName elementName = new QName(elementDecl.getTargetNamespace(), elementDecl.getName()); - PrismContainerDefinition pcd = null; + PrismContainerDefinitionImpl pcd = null; SchemaDefinitionFactory definitionFactory = getDefinitionFactory(); if (isObjectDefinition(xsType)) { Class compileTimeClass = null; if (getSchemaRegistry() != null) { - compileTimeClass = getSchemaRegistry().determineCompileTimeClass(elementName, - complexTypeDefinition); + compileTimeClass = getSchemaRegistry().determineCompileTimeClass(complexTypeDefinition.getTypeName()); } pcd = definitionFactory.createObjectDefinition(elementName, complexTypeDefinition, prismContext, compileTimeClass, complexTypeAnnotation, elementParticle); @@ -909,10 +897,10 @@ private PrismContainerDefinition createPropertyContainerDefinition(XSType xsT * of the schema. This method is also processing annotations and other fancy * property-relates stuff. */ - private PrismPropertyDefinition createPropertyDefinition(XSType xsType, QName elementName, + private PrismPropertyDefinitionImpl createPropertyDefinition(XSType xsType, QName elementName, QName typeName, ComplexTypeDefinition ctd, XSAnnotation annotation, XSParticle elementParticle) throws SchemaException { - PrismPropertyDefinition propDef; + PrismPropertyDefinitionImpl propDef; SchemaDefinitionFactory definitionFactory = getDefinitionFactory(); @@ -921,7 +909,7 @@ private PrismPropertyDefinition createPropertyDefinition(XSType xsType, Q Object defaultValue = parseDefaultValue(elementParticle, typeName); - propDef = definitionFactory.createPropertyDefinition(elementName, typeName, ctd, prismContext, + propDef = (PrismPropertyDefinitionImpl) definitionFactory.createPropertyDefinition(elementName, typeName, ctd, prismContext, annotation, elementParticle, allowedValues, null); setMultiplicity(propDef, elementParticle, annotation, ctd == null); @@ -1069,7 +1057,7 @@ private Collection> parseEnumAllowedValues(QNa return null; } - private void parseItemDefinitionAnnotations(ItemDefinition itemDef, XSAnnotation annotation) + private void parseItemDefinitionAnnotations(ItemDefinitionImpl itemDef, XSAnnotation annotation) throws SchemaException { if (annotation == null || annotation.getAnnotation() == null) { return; @@ -1178,7 +1166,7 @@ private boolean testAnnotationAppinfo(XSAnnotation annotation) { private void markRuntime(Definition def) { if (isRuntime) { - def.setRuntimeSchema(true); + ((DefinitionImpl) def).setRuntimeSchema(true); } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/GlobalDefinitionSearchContext.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/GlobalDefinitionSearchContext.java new file mode 100644 index 00000000000..94bc17120f7 --- /dev/null +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/GlobalDefinitionSearchContext.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.prism.schema; + +import com.evolveum.midpoint.prism.Containerable; +import com.evolveum.midpoint.prism.Definition; +import org.jetbrains.annotations.NotNull; + +import javax.xml.namespace.QName; + +/** + * @author mederly + */ +public interface GlobalDefinitionSearchContext extends DefinitionSearchContext { + +// D byType(@NotNull QName type); +// D byCompileTimeClass(@NotNull Class clazz); + +} diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/GlobalDefinitionsStore.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/GlobalDefinitionsStore.java new file mode 100644 index 00000000000..30f212798cd --- /dev/null +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/GlobalDefinitionsStore.java @@ -0,0 +1,142 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.prism.schema; + +import com.evolveum.midpoint.prism.*; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import javax.xml.namespace.QName; +import java.util.List; + +/** + * Note: although all of these methods are '@Nullable', we don't mark them as such, to avoid false 'may produce NPE' + * warnings for cases that will never produce nulls (like searching for known items/CTDs). + * + * @author mederly + */ +public interface GlobalDefinitionsStore extends DefinitionsStore { + + // new API + +// @Override +// GlobalDefinitionSearchContext> findItemDefinition(); +// +// @Override +// GlobalDefinitionSearchContext findPropertyDefinition(); +// +// @Override +// GlobalDefinitionSearchContext findReferenceDefinition(); +// +// @Override +// GlobalDefinitionSearchContext> findContainerDefinition(); +// +// GlobalDefinitionSearchContext> findObjectDefinition(); +// +// GlobalDefinitionSearchContext findComplexTypeDefinition(); + + // old API + + // PrismObject-related + + // non-core methods + + @SuppressWarnings("unchecked") + default PrismObjectDefinition findObjectDefinitionByCompileTimeClass(@NotNull Class compileTimeClass) { + return findContainerDefinitionByCompileTimeClass(compileTimeClass, PrismObjectDefinition.class); + } + + @SuppressWarnings("unchecked") + default PrismObjectDefinition findObjectDefinitionByType(@NotNull QName typeName) { + return findItemDefinitionByType(typeName, PrismObjectDefinition.class); + } + + @SuppressWarnings("unchecked") + default PrismObjectDefinition findObjectDefinitionByElementName(@NotNull QName elementName) { + return findItemDefinitionByElementName(elementName, PrismObjectDefinition.class); + } + + // PrismContainer-related + + @SuppressWarnings("unchecked") + default PrismContainerDefinition findContainerDefinitionByCompileTimeClass(@NotNull Class compileTimeClass) { + return findContainerDefinitionByCompileTimeClass(compileTimeClass, PrismContainerDefinition.class); + } + + @SuppressWarnings("unchecked") + default PrismContainerDefinition findContainerDefinitionByType(@NotNull QName typeName) { + return findItemDefinitionByType(typeName, PrismContainerDefinition.class); + } + + @SuppressWarnings("unchecked") + default PrismContainerDefinition findContainerDefinitionByElementName(@NotNull QName elementName) { + return findItemDefinitionByElementName(elementName, PrismContainerDefinition.class); + } + + // PrismReference-related + + default PrismReferenceDefinition findReferenceDefinitionByElementName(@NotNull QName elementName) { + return findItemDefinitionByElementName(elementName, PrismReferenceDefinition.class); + } + + // PrismProperty-related + + default PrismPropertyDefinition findPropertyDefinitionByElementName(@NotNull QName elementName) { + return findItemDefinitionByElementName(elementName, PrismPropertyDefinition.class); + } + + // Item-related + + default ItemDefinition findItemDefinitionByType(@NotNull QName typeName) { + return findItemDefinitionByType(typeName, ItemDefinition.class); + } + + default ItemDefinition findItemDefinitionByElementName(@NotNull QName elementName) { + return findItemDefinitionByElementName(elementName, ItemDefinition.class); + } + + @Deprecated + default ID findItemDefinition(@NotNull String localElementName, @NotNull Class definitionClass) { + return findItemDefinitionByElementName(new QName(localElementName), definitionClass); + } + + @Deprecated + default ID findItemDefinition(@NotNull QName elementName, @NotNull Class definitionClass) { + return findItemDefinitionByElementName(elementName, definitionClass); + } + + + // ComplexTypeDefinition-related + + @Deprecated default ComplexTypeDefinition findComplexTypeDefinition(@NotNull QName typeName) { + return findComplexTypeDefinitionByType(typeName); + } + + // core methods + + CD findContainerDefinitionByCompileTimeClass( + @NotNull Class compileTimeClass, @NotNull Class definitionClass); + + ID findItemDefinitionByType(@NotNull QName typeName, @NotNull Class definitionClass); + + ID findItemDefinitionByElementName(@NotNull QName elementName, @NotNull Class definitionClass); + + ComplexTypeDefinition findComplexTypeDefinitionByCompileTimeClass(@NotNull Class compileTimeClass); + + ComplexTypeDefinition findComplexTypeDefinitionByType(@NotNull QName typeName); + +} diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/HierarchicalDefinitionsStore.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/HierarchicalDefinitionsStore.java new file mode 100644 index 00000000000..fa46f5018e2 --- /dev/null +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/HierarchicalDefinitionsStore.java @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.prism.schema; + +/** + * @author mederly + */ +public interface HierarchicalDefinitionsStore extends DefinitionsStore { +} diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/PrismSchema.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/PrismSchema.java index c0eded22a2c..a4fe52adff8 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/PrismSchema.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/PrismSchema.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 Evolveum + * Copyright (c) 2010-2016 Evolveum * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,533 +16,79 @@ package com.evolveum.midpoint.prism.schema; -import java.io.Serializable; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.Map; -import java.util.Set; - -import javax.xml.namespace.QName; - import com.evolveum.midpoint.prism.*; - -import org.apache.commons.lang.StringUtils; -import org.w3c.dom.Document; -import org.w3c.dom.Element; -import org.xml.sax.EntityResolver; - import com.evolveum.midpoint.util.DebugDumpable; -import com.evolveum.midpoint.util.QNameUtil; import com.evolveum.midpoint.util.exception.SchemaException; -import com.evolveum.midpoint.util.logging.Trace; -import com.evolveum.midpoint.util.logging.TraceManager; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.w3c.dom.Document; + +import javax.xml.namespace.QName; +import java.util.Collection; +import java.util.List; /** * Schema as a collection of definitions. This is a midPoint-specific view of * schema definition. It is just a collection of definitions grouped under a * specific namespace. - * + * * The schema and all the public classes in this package define a schema * meta-model. It is supposed to be used for run-time schema interpretation. It * will not be a convenient tool to work with static data model objects such as * user or role. But it is needed for interpreting dynamic schemas for resource * objects, extensions and so on. - * - * @author Radovan Semancik - * + * + * @author semancik + * @author mederly */ -public class PrismSchema implements DebugDumpable { - - private static final long serialVersionUID = 5068618465625931984L; - - private static final Trace LOGGER = TraceManager.getTrace(PrismSchema.class); - - protected String namespace; - protected Collection definitions; - protected PrismContext prismContext; - - protected PrismSchema(PrismContext prismContext) { - this.prismContext = prismContext; - definitions = new ArrayList(); - } - - public PrismSchema(String namespace, PrismContext prismContext) { - if (StringUtils.isEmpty(namespace)) { - throw new IllegalArgumentException("Namespace can't be null or empty."); - } - this.namespace = namespace; - this.prismContext = prismContext; - definitions = new ArrayList(); - } +public interface PrismSchema extends DebugDumpable, GlobalDefinitionsStore, DefinitionSearchImplementation { /** * Returns schema namespace. - * + * * All schema definitions are placed in the returned namespace. - * + * * @return schema namespace + * + * TODO can be null? */ - public String getNamespace() { - return namespace; - } - - public void setNamespace(String namespace) { - this.namespace = namespace; - } + String getNamespace(); /** * Returns set of definitions. - * - * The set contains all definitions of all types that were parsed. Order of - * definitions is insignificant. - * + * + * The set contains all definitions of all types that were parsed. Order of definitions is insignificant. + * * @return set of definitions */ - public Collection getDefinitions() { - if (definitions == null) { - definitions = new HashSet(); - } - return definitions; - } - - public Collection getDefinitions(Class type) { - Collection defs = new HashSet(); - for (Definition def: getDefinitions()) { - if (type.isAssignableFrom(def.getClass())) { - defs.add((T) def); - } - } - return defs; - } - - public Collection getObjectDefinitions() { - return getDefinitions(PrismObjectDefinition.class); - } - - public Collection getComplexTypeDefinitions() { - return getDefinitions(ComplexTypeDefinition.class); - } - - public void add(Definition def) { - definitions.add(def); - } - - public PrismContext getPrismContext() { - return prismContext; - } - - - // TODO: cleanup this chaos - public static PrismSchema parse(Element element, boolean isRuntime, String shortDescription, PrismContext prismContext) throws SchemaException { - return parse(element, prismContext.getSchemaRegistry(), new PrismSchema(prismContext), isRuntime, shortDescription, prismContext); - } - - public static PrismSchema parse(Element element, EntityResolver resolver, boolean isRuntime, String shortDescription, PrismContext prismContext) throws SchemaException { - return parse(element, resolver, new PrismSchema(prismContext), isRuntime, shortDescription, prismContext); - } - - protected static PrismSchema parse(Element element, PrismSchema schema, boolean isRuntime, String shortDescription, PrismContext prismContext) throws SchemaException { - return parse(element, prismContext.getSchemaRegistry(), schema, isRuntime, shortDescription, prismContext); - } - - protected static PrismSchema parse(Element element, EntityResolver resolver, PrismSchema schema, boolean isRuntime, String shortDescription, PrismContext prismContext) throws SchemaException { - if (element == null) { - throw new IllegalArgumentException("Schema element must not be null in "+shortDescription); - } - - DomToSchemaProcessor processor = new DomToSchemaProcessor(); - processor.setEntityResolver(resolver); - processor.setPrismContext(prismContext); - processor.setShortDescription(shortDescription); - processor.setRuntime(isRuntime); - return processor.parseDom(schema, element); - } - - - public Document serializeToXsd() throws SchemaException { - SchemaToDomProcessor processor = new SchemaToDomProcessor(); - processor.setPrismContext(prismContext); - return processor.parseSchema(this); - } - - // TODO: Methods for searching the schema, such as findDefinitionByName(), - // etc. + @NotNull + Collection getDefinitions(); /** - * Finds a PropertyContainerDefinition by the type name. - * - * @param typeName - * property container type name - * @return found property container definition - * @throws IllegalStateException - * if more than one definition is found - */ - public PrismContainerDefinition findContainerDefinitionByType(QName typeName) { - return findContainerDefinitionByType(typeName,PrismContainerDefinition.class); - } - - public PrismObjectDefinition findObjectDefinitionByType(QName typeName) { - return findContainerDefinitionByType(typeName,PrismObjectDefinition.class); - } - - public PrismObjectDefinition findObjectDefinitionByTypeAssumeNs(QName typeName) { - return findContainerDefinitionByTypeAssumeNs(typeName,PrismObjectDefinition.class); - } - - public PrismObjectDefinition findObjectDefinitionByElementName(QName elementName) { - return findContainerDefinitionByElementName(elementName, PrismObjectDefinition.class); - } - - public PrismObjectDefinition findObjectDefinitionByType(QName typeName, Class type) { - return findContainerDefinitionByType(typeName,PrismObjectDefinition.class); - } - - // TODO create cache eagerly - private Map, PrismObjectDefinition> classToDefCache = Collections.synchronizedMap(new HashMap()); - - public PrismObjectDefinition findObjectDefinitionByCompileTimeClass(Class type) { - if (classToDefCache.containsKey(type)) { // there may be null values - return classToDefCache.get(type); - } - - PrismObjectDefinition definition = scanForPrismObjectDefinition(type); - classToDefCache.put(type, definition); - return definition; - } - - private PrismObjectDefinition scanForPrismObjectDefinition(Class type) { - for (Definition def: getDefinitions()) { - if (def instanceof PrismObjectDefinition) { - PrismObjectDefinition objDef = (PrismObjectDefinition)def; - if (type.equals(objDef.getCompileTimeClass())) { - classToDefCache.put(type, objDef); - return (PrismObjectDefinition) objDef; - } - } - } - return null; - } - - private T findContainerDefinitionByType(QName typeName, Class type) { - if (typeName == null) { - throw new IllegalArgumentException("typeName must be supplied"); - } - // TODO: check for multiple definition with the same type - for (Definition definition : definitions) { - if (type.isAssignableFrom(definition.getClass()) - && typeName.equals(definition.getTypeName())) { - return (T) definition; - } - } - return null; - } - - private T findContainerDefinitionByTypeAssumeNs(QName typeName, Class type) { - if (typeName == null) { - throw new IllegalArgumentException("typeName must be supplied"); - } - // TODO: check for multiple definition with the same type - for (Definition definition : definitions) { - if (type.isAssignableFrom(definition.getClass()) - && QNameUtil.match(typeName, definition.getTypeName())) { - return (T) definition; - } - } - return null; - } - - public PrismContainerDefinition findContainerDefinitionByElementName(QName elementName) { - return findContainerDefinitionByElementName(elementName, PrismContainerDefinition.class); - } - - private T findContainerDefinitionByElementName(QName elementName, Class type) { - if (elementName == null) { - throw new IllegalArgumentException("elementName must be supplied"); - } - // TODO: check for multiple definition with the same type - for (Definition definition : definitions) { - if (type.isAssignableFrom(definition.getClass()) - && elementName.equals(((PrismContainerDefinition)definition).getName())) { - return (T) definition; - } - } - return null; - } - - public PrismContainerDefinition findContainerDefinitionByCompileTimeClass(Class type) { - for (Definition def: getDefinitions()) { - if (def instanceof PrismContainerDefinition) { - PrismContainerDefinition contDef = (PrismContainerDefinition)def; - if (type.equals(contDef.getCompileTimeClass())) { - return contDef; - } - } - } - return null; - } - - public ComplexTypeDefinition findComplexTypeDefinitionByCompileTimeClass(Class type) { - for (Definition def: getDefinitions()) { - if (def instanceof ComplexTypeDefinition) { - ComplexTypeDefinition ctd = (ComplexTypeDefinition)def; - if (type.equals(ctd.getCompileTimeClass())) { - return ctd; - } - } - } - return null; - } - - public PrismPropertyDefinition findPropertyDefinitionByElementName(QName elementName) { - return findPropertyDefinitionByElementName(elementName, PrismPropertyDefinition.class); - } - - public PrismReferenceDefinition findReferenceDefinitionByElementName(QName elementName) { - return findReferenceDefinitionByElementName(elementName, PrismReferenceDefinition.class); - } - - private T findPropertyDefinitionByElementName(QName elementName, Class type) { - if (elementName == null) { - throw new IllegalArgumentException("elementName must be supplied"); - } - // TODO: check for multiple definition with the same type - for (Definition definition : definitions) { - if (type.isAssignableFrom(definition.getClass()) - && elementName.equals(((PrismPropertyDefinition)definition).getName())) { - return (T) definition; - } - } - return null; - } - - private T findReferenceDefinitionByElementName(QName elementName, Class type) { - if (elementName == null) { - throw new IllegalArgumentException("elementName must be supplied"); - } - // TODO: check for multiple definition with the same type - for (Definition definition : definitions) { - if (type.isAssignableFrom(definition.getClass()) - && elementName.equals(((PrismReferenceDefinition)definition).getName())) { - return (T) definition; - } - } - return null; - } - - /** - * Finds complex type definition by type name. - */ - public ComplexTypeDefinition findComplexTypeDefinition(QName typeName) { - if (typeName == null) { - throw new IllegalArgumentException("typeName must be supplied"); - } - // TODO: check for multiple definition with the same type - for (Definition definition : definitions) { - if (definition instanceof ComplexTypeDefinition && typeName.equals(definition.getTypeName())) { - return (ComplexTypeDefinition) definition; - } - } - return null; - } - - /** - * Finds item definition by name. - * - */ - @SuppressWarnings("unchecked") - public T findItemDefinition(QName definitionName, Class definitionType) { - if (definitionName == null) { - throw new IllegalArgumentException("definitionName must be supplied"); - } - // TODO: check for multiple definition with the same type - for (Definition definition : definitions) { - if (definitionType.isAssignableFrom(definition.getClass())) { - ItemDefinition idef = (ItemDefinition) definition; - if (definitionName.equals(idef.getName())) { - return (T) idef; - } - } - } - return null; - } - - /** - * Finds item definition by local name - */ - public T findItemDefinition(String localName, Class definitionType) { - if (localName == null) { - throw new IllegalArgumentException("localName must be supplied"); - } - // TODO: check for multiple definition with the same type - for (Definition definition : definitions) { - if (definitionType.isAssignableFrom(definition.getClass())) { - ItemDefinition idef = (ItemDefinition) definition; - if (localName.equals(idef.getName().getLocalPart())) { - return (T) idef; - } - } - } - return null; - } - - /** - * Finds item definition by type. - * + * Returns set of definitions of a given type. + * + * The set contains all definitions of the given type that were parsed. Order of definitions is insignificant. + * + * @return set of definitions */ - @SuppressWarnings("unchecked") - public T findItemDefinitionByType(QName typeName, Class definitionType) { - if (typeName == null) { - throw new IllegalArgumentException("typeName must be supplied"); - } - // TODO: check for multiple definition with the same type - for (Definition definition : definitions) { - if (definitionType.isAssignableFrom(definition.getClass())) { - ItemDefinition idef = (ItemDefinition) definition; - if (typeName.equals(idef.getTypeName())) { - return (T) idef; - } - } - } - return null; - } + @NotNull + List getDefinitions(@NotNull Class type); - public boolean isEmpty() { - return definitions.isEmpty(); + @NotNull + default List getObjectDefinitions() { + return getDefinitions(PrismObjectDefinition.class); } - /** - * Creates a new property container definition and adds it to the schema. - * - * This is a preferred way how to create definition in the schema. - * - * @param localTypeName - * type name "relative" to schema namespace - * @return new property container definition - */ - public PrismContainerDefinition createPropertyContainerDefinition(String localTypeName) { - QName typeName = new QName(getNamespace(), localTypeName); - QName name = new QName(getNamespace(), toElementName(localTypeName)); - ComplexTypeDefinition cTypeDef = new ComplexTypeDefinition(typeName, prismContext); - PrismContainerDefinition def = new PrismContainerDefinition(name, cTypeDef, prismContext); - definitions.add(cTypeDef); - definitions.add(def); - return def; - } - - public PrismContainerDefinition createPropertyContainerDefinition(String localElementName, String localTypeName) { - QName typeName = new QName(getNamespace(), localTypeName); - QName name = new QName(getNamespace(), localElementName); - ComplexTypeDefinition cTypeDef = findComplexTypeDefinition(typeName); - if (cTypeDef == null) { - cTypeDef = new ComplexTypeDefinition(typeName, prismContext); - definitions.add(cTypeDef); - } - PrismContainerDefinition def = new PrismContainerDefinition(name, cTypeDef, prismContext); - definitions.add(def); - return def; - } - - public ComplexTypeDefinition createComplexTypeDefinition(QName typeName) { - ComplexTypeDefinition cTypeDef = new ComplexTypeDefinition(typeName, prismContext); - definitions.add(cTypeDef); - return cTypeDef; + @NotNull + default List getComplexTypeDefinitions() { + return getDefinitions(ComplexTypeDefinition.class); } - /** - * Creates a top-level property definition and adds it to the schema. - * - * This is a preferred way how to create definition in the schema. - * - * @param localName - * element name "relative" to schema namespace - * @param typeName - * XSD type name of the element - * @return new property definition - */ - public PrismPropertyDefinition createPropertyDefinition(String localName, QName typeName) { - QName name = new QName(getNamespace(), localName); - return createPropertyDefinition(name, typeName); - } + // TODO nullability? + PrismContext getPrismContext(); - /** - * Creates a top-level property definition and adds it to the schema. - * - * This is a preferred way how to create definition in the schema. - * - * @param localName - * element name "relative" to schema namespace - * @param localTypeName - * XSD type name "relative" to schema namespace - * @return new property definition - */ - public PrismPropertyDefinition createPropertyDefinition(String localName, String localTypeName) { - QName name = new QName(getNamespace(), localName); - QName typeName = new QName(getNamespace(), localTypeName); - return createPropertyDefinition(name, typeName); - } + @NotNull + Document serializeToXsd() throws SchemaException; - /** - * Creates a top-level property definition and adds it to the schema. - * - * This is a preferred way how to create definition in the schema. - * - * @param localName - * element name - * @param typeName - * XSD type name of the element - * @return new property definition - */ - public PrismPropertyDefinition createPropertyDefinition(QName name, QName typeName) { - PrismPropertyDefinition def = new PrismPropertyDefinition(name, typeName, prismContext); - definitions.add(def); - return def; - } - - /** - * Internal method to create a "nice" element name from the type name. - */ - protected String toElementName(String localTypeName) { - String elementName = StringUtils.uncapitalize(localTypeName); - if (elementName.endsWith("Type")) { - return elementName.substring(0, elementName.length() - 4); - } - return elementName; - } - - protected QName toElementQName(QName qname) { - return new QName(qname.getNamespaceURI(), toElementName(qname.getLocalPart())); - } - - @Override - public String debugDump() { - return debugDump(0); - } - - @Override - public String debugDump(int indent) { - StringBuilder sb = new StringBuilder(); - for (int i=0;i i = definitions.iterator(); - while (i.hasNext()) { - Definition def = i.next(); - sb.append(def.debugDump(indent+1)); - if (i.hasNext()) { - sb.append("\n"); - } - } - return sb.toString(); - } - - @Override - public String toString() { - return "Schema(ns=" + namespace + ")"; - } - + boolean isEmpty(); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/PrismSchemaImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/PrismSchemaImpl.java new file mode 100644 index 00000000000..d8b4ec7cd54 --- /dev/null +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/PrismSchemaImpl.java @@ -0,0 +1,410 @@ +/* + * Copyright (c) 2010-2014 Evolveum + * + * 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 com.evolveum.midpoint.prism.schema; + +import java.util.*; +import java.util.stream.Collectors; + +import javax.xml.namespace.QName; + +import com.evolveum.midpoint.prism.*; + +import org.apache.commons.lang.StringUtils; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.xml.sax.EntityResolver; + +import com.evolveum.midpoint.util.QNameUtil; +import com.evolveum.midpoint.util.exception.SchemaException; + +/** + * + * @author Radovan Semancik + * + */ +public class PrismSchemaImpl implements PrismSchema { + + //private static final long serialVersionUID = 5068618465625931984L; + + //private static final Trace LOGGER = TraceManager.getTrace(PrismSchema.class); + + @NotNull protected final Collection definitions = new ArrayList<>(); + protected String namespace; + protected PrismContext prismContext; + + protected PrismSchemaImpl(PrismContext prismContext) { + this.prismContext = prismContext; + } + + public PrismSchemaImpl(String namespace, PrismContext prismContext) { + if (StringUtils.isEmpty(namespace)) { + throw new IllegalArgumentException("Namespace can't be null or empty."); + } + this.namespace = namespace; + this.prismContext = prismContext; + } + + //region Trivia + @Override + public String getNamespace() { + return namespace; + } + + public void setNamespace(String namespace) { + this.namespace = namespace; + } + + @NotNull + @Override + public Collection getDefinitions() { + return definitions; + } + + @SuppressWarnings("unchecked") + @NotNull + @Override + public List getDefinitions(@NotNull Class type) { + return definitions.stream() + .filter(def -> type.isAssignableFrom(def.getClass())) + .map(def -> (T) def) + .collect(Collectors.toList()); + } + + @Override + public boolean isEmpty() { + return definitions.isEmpty(); + } + + public void add(@NotNull Definition def) { + definitions.add(def); + } + + @Override + public PrismContext getPrismContext() { + return prismContext; + } + //endregion + + //region XSD parsing and serialization + // TODO: cleanup this chaos + public static PrismSchema parse(Element element, boolean isRuntime, String shortDescription, PrismContext prismContext) throws SchemaException { + return parse(element, prismContext.getEntityResolver(), new PrismSchemaImpl(prismContext), isRuntime, shortDescription, prismContext); + } + + public static PrismSchema parse(Element element, EntityResolver resolver, boolean isRuntime, String shortDescription, PrismContext prismContext) throws SchemaException { + return parse(element, resolver, new PrismSchemaImpl(prismContext), isRuntime, shortDescription, prismContext); + } + + protected static PrismSchema parse(Element element, PrismSchemaImpl schema, boolean isRuntime, String shortDescription, PrismContext prismContext) throws SchemaException { + return parse(element, prismContext.getEntityResolver(), schema, isRuntime, shortDescription, prismContext); + } + + protected static PrismSchema parse(Element element, EntityResolver resolver, PrismSchemaImpl schema, boolean isRuntime, String shortDescription, PrismContext prismContext) throws SchemaException { + if (element == null) { + throw new IllegalArgumentException("Schema element must not be null in "+shortDescription); + } + + DomToSchemaProcessor processor = new DomToSchemaProcessor(); + processor.setEntityResolver(resolver); + processor.setPrismContext(prismContext); + processor.setShortDescription(shortDescription); + processor.setRuntime(isRuntime); + processor.parseDom(schema, element); + return schema; + } + + @NotNull + @Override + public Document serializeToXsd() throws SchemaException { + SchemaToDomProcessor processor = new SchemaToDomProcessor(); + processor.setPrismContext(prismContext); + return processor.parseSchema(this); + } + //endregion + + //region Creating definitions + /** + * Creates a new property container definition and adds it to the schema. + * + * This is a preferred way how to create definition in the schema. + * + * @param localTypeName + * type name "relative" to schema namespace + * @return new property container definition + */ + public PrismContainerDefinitionImpl createPropertyContainerDefinition(String localTypeName) { + QName typeName = new QName(getNamespace(), localTypeName); + QName name = new QName(getNamespace(), toElementName(localTypeName)); + ComplexTypeDefinition cTypeDef = new ComplexTypeDefinitionImpl(typeName, prismContext); + PrismContainerDefinitionImpl def = new PrismContainerDefinitionImpl(name, cTypeDef, prismContext); + definitions.add(cTypeDef); + definitions.add(def); + return def; + } + + public PrismContainerDefinitionImpl createPropertyContainerDefinition(String localElementName, String localTypeName) { + QName typeName = new QName(getNamespace(), localTypeName); + QName name = new QName(getNamespace(), localElementName); + ComplexTypeDefinition cTypeDef = findComplexTypeDefinitionByType(typeName); + if (cTypeDef == null) { + cTypeDef = new ComplexTypeDefinitionImpl(typeName, prismContext); + definitions.add(cTypeDef); + } + PrismContainerDefinitionImpl def = new PrismContainerDefinitionImpl(name, cTypeDef, prismContext); + definitions.add(def); + return def; + } + + public ComplexTypeDefinition createComplexTypeDefinition(QName typeName) { + ComplexTypeDefinition cTypeDef = new ComplexTypeDefinitionImpl(typeName, prismContext); + definitions.add(cTypeDef); + return cTypeDef; + } + + /** + * Creates a top-level property definition and adds it to the schema. + * + * This is a preferred way how to create definition in the schema. + * + * @param localName + * element name "relative" to schema namespace + * @param typeName + * XSD type name of the element + * @return new property definition + */ + public PrismPropertyDefinition createPropertyDefinition(String localName, QName typeName) { + QName name = new QName(getNamespace(), localName); + return createPropertyDefinition(name, typeName); + } + + /* + * Creates a top-level property definition and adds it to the schema. + * + * This is a preferred way how to create definition in the schema. + * + * @param localName + * element name "relative" to schema namespace + * @param localTypeName + * XSD type name "relative" to schema namespace + * @return new property definition + */ +// public PrismPropertyDefinition createPropertyDefinition(String localName, String localTypeName) { +// QName name = new QName(getNamespace(), localName); +// QName typeName = new QName(getNamespace(), localTypeName); +// return createPropertyDefinition(name, typeName); +// } + + /** + * Creates a top-level property definition and adds it to the schema. + * + * This is a preferred way how to create definition in the schema. + * + * @param name + * element name + * @param typeName + * XSD type name of the element + * @return new property definition + */ + public PrismPropertyDefinition createPropertyDefinition(QName name, QName typeName) { + PrismPropertyDefinition def = new PrismPropertyDefinitionImpl(name, typeName, prismContext); + definitions.add(def); + return def; + } + + /** + * Internal method to create a "nice" element name from the type name. + */ + private String toElementName(String localTypeName) { + String elementName = StringUtils.uncapitalize(localTypeName); + if (elementName.endsWith("Type")) { + return elementName.substring(0, elementName.length() - 4); + } + return elementName; + } + //endregion + + //region Pretty printing + @Override + public String debugDump() { + return debugDump(0); + } + + @Override + public String debugDump(int indent) { + StringBuilder sb = new StringBuilder(); + for (int i=0;i i = definitions.iterator(); + while (i.hasNext()) { + Definition def = i.next(); + sb.append(def.debugDump(indent+1)); + if (i.hasNext()) { + sb.append("\n"); + } + } + return sb.toString(); + } + + @Override + public String toString() { + return "Schema(ns=" + namespace + ")"; + } + //endregion + + //region Implementation of DefinitionsStore methods (commented out) +// private final SearchContexts searchContexts = new SearchContexts(this); // pre-existing object to avoid creating them each time +// +// @Override +// public GlobalDefinitionSearchContext> findObjectDefinition() { +// return searchContexts.pod; +// } +// +// @Override +// public GlobalDefinitionSearchContext> findContainerDefinition() { +// return searchContexts.pcd; +// } +// +// @Override +// public GlobalDefinitionSearchContext> findItemDefinition() { +// return searchContexts.id; +// } +// +// @Override +// public GlobalDefinitionSearchContext findComplexTypeDefinition() { +// return searchContexts.ctd; +// } +// +// @Override +// public GlobalDefinitionSearchContext findPropertyDefinition() { +// return searchContexts.ppd; +// } +// +// @Override +// public GlobalDefinitionSearchContext findReferenceDefinition() { +// return searchContexts.prd; +// } + //endregion + + //region Finding definitions + + // items + + @Nullable + @Override + public CD findContainerDefinitionByCompileTimeClass( + @NotNull Class compileTimeClass, @NotNull Class definitionClass) { + for (Definition def: definitions) { + if (definitionClass.isAssignableFrom(def.getClass())) { + @SuppressWarnings("unchecked") + CD contDef = (CD) def; + if (compileTimeClass.equals(contDef.getCompileTimeClass())) { + return contDef; + } + } + } + return null; + } + + @Override + public ID findItemDefinitionByType(@NotNull QName typeName, @NotNull Class definitionClass) { + // TODO: check for multiple definition with the same type + for (Definition definition : definitions) { + if (definitionClass.isAssignableFrom(definition.getClass())) { + @SuppressWarnings("unchecked") + ID itemDef = (ID) definition; + if (QNameUtil.match(typeName, itemDef.getTypeName())) { + return itemDef; + } + } + } + return null; + } + + @Override + public ID findItemDefinitionByElementName(@NotNull QName elementName, + @NotNull Class definitionClass) { + // TODO: check for multiple definition with the same name + for (Definition definition : definitions) { + if (definitionClass.isAssignableFrom(definition.getClass())) { + @SuppressWarnings("unchecked") + ID itemDef = (ID) definition; + if (QNameUtil.match(elementName, itemDef.getName())) { + return itemDef; + } + } + } + return null; + } + + + // private Map, PrismObjectDefinition> classToDefCache = Collections.synchronizedMap(new HashMap<>()); +// @Override +// public PrismObjectDefinition findObjectDefinitionByCompileTimeClass(@NotNull Class type) { +// if (classToDefCache.containsKey(type)) { // there may be null values +// return classToDefCache.get(type); +// } +// PrismObjectDefinition definition = scanForPrismObjectDefinition(type); +// classToDefCache.put(type, definition); +// return definition; +// } +// private PrismObjectDefinition scanForPrismObjectDefinition(Class type) { +// for (Definition def: getDefinitions()) { +// if (def instanceof PrismObjectDefinition) { +// PrismObjectDefinition objDef = (PrismObjectDefinition)def; +// if (type.equals(objDef.getCompileTimeClass())) { +// classToDefCache.put(type, objDef); +// return (PrismObjectDefinition) objDef; +// } +// } +// } +// return null; +// } + + + + @Override + public ComplexTypeDefinition findComplexTypeDefinitionByCompileTimeClass(@NotNull Class compileTimeClass) { + for (Definition def: definitions) { + if (def instanceof ComplexTypeDefinition) { + ComplexTypeDefinition ctd = (ComplexTypeDefinition) def; + if (compileTimeClass.equals(ctd.getCompileTimeClass())) { + return ctd; + } + } + } + return null; + } + + @Nullable + @Override + public ComplexTypeDefinition findComplexTypeDefinitionByType(@NotNull QName typeName) { + // TODO: check for multiple definition with the same type + for (Definition definition : definitions) { + if (definition instanceof ComplexTypeDefinition && QNameUtil.match(typeName, definition.getTypeName())) { + return (ComplexTypeDefinition) definition; + } + } + return null; + } + + + //endregion +} diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaDefinitionFactory.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaDefinitionFactory.java index 5f9e0cfdb09..150d9683428 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaDefinitionFactory.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaDefinitionFactory.java @@ -19,16 +19,9 @@ import javax.xml.namespace.QName; +import com.evolveum.midpoint.prism.*; import org.w3c.dom.Element; -import com.evolveum.midpoint.prism.ComplexTypeDefinition; -import com.evolveum.midpoint.prism.Containerable; -import com.evolveum.midpoint.prism.Objectable; -import com.evolveum.midpoint.prism.PrismContainerDefinition; -import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.PrismObjectDefinition; -import com.evolveum.midpoint.prism.PrismPropertyDefinition; -import com.evolveum.midpoint.prism.PrismReferenceDefinition; import com.evolveum.midpoint.util.DisplayableValue; import com.evolveum.midpoint.util.exception.SchemaException; import com.sun.xml.xsom.XSAnnotation; @@ -45,33 +38,33 @@ public ComplexTypeDefinition createComplexTypeDefinition(XSComplexType complexTy PrismContext prismContext, XSAnnotation annotation) throws SchemaException { QName typeName = new QName(complexType.getTargetNamespace(),complexType.getName()); - return new ComplexTypeDefinition(typeName, prismContext); + return new ComplexTypeDefinitionImpl(typeName, prismContext); } public PrismPropertyDefinition createPropertyDefinition(QName elementName, QName typeName, ComplexTypeDefinition complexTypeDefinition, PrismContext prismContext, XSAnnotation annotation, XSParticle elementParticle) throws SchemaException { - return new PrismPropertyDefinition(elementName, typeName, prismContext); + return new PrismPropertyDefinitionImpl(elementName, typeName, prismContext); } public PrismPropertyDefinition createPropertyDefinition(QName elementName, QName typeName, ComplexTypeDefinition complexTypeDefinition, PrismContext prismContext, XSAnnotation annotation, XSParticle elementParticle, Collection> allowedValues, T defaultValue) throws SchemaException { - return new PrismPropertyDefinition(elementName, typeName, prismContext, allowedValues, defaultValue); + return new PrismPropertyDefinitionImpl(elementName, typeName, prismContext, allowedValues, defaultValue); } public PrismReferenceDefinition createReferenceDefinition(QName primaryElementName, QName typeName, ComplexTypeDefinition complexTypeDefinition, PrismContext prismContext, XSAnnotation annotation, XSParticle elementParticle) throws SchemaException { - return new PrismReferenceDefinition(primaryElementName, typeName, prismContext); + return new PrismReferenceDefinitionImpl(primaryElementName, typeName, prismContext); } - public PrismContainerDefinition createContainerDefinition(QName elementName, ComplexTypeDefinition complexTypeDefinition, + public PrismContainerDefinitionImpl createContainerDefinition(QName elementName, ComplexTypeDefinition complexTypeDefinition, PrismContext prismContext, XSAnnotation annotation, XSParticle elementParticle) throws SchemaException { - return new PrismContainerDefinition(elementName, complexTypeDefinition, prismContext); + return new PrismContainerDefinitionImpl(elementName, complexTypeDefinition, prismContext); } - public PrismObjectDefinition createObjectDefinition(QName elementName, + public PrismObjectDefinitionImpl createObjectDefinition(QName elementName, ComplexTypeDefinition complexTypeDefinition, PrismContext prismContext, Class compileTimeClass, XSAnnotation annotation, XSParticle elementParticle) throws SchemaException { - return new PrismObjectDefinition(elementName, complexTypeDefinition, prismContext, compileTimeClass ); + return new PrismObjectDefinitionImpl(elementName, complexTypeDefinition, prismContext, compileTimeClass ); } /** diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistry.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistry.java index 822270cc282..baf20cbe6a4 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistry.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistry.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2015 Evolveum + * Copyright (c) 2010-2016 Evolveum * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,1270 +13,108 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.evolveum.midpoint.prism.schema; -import java.io.BufferedInputStream; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; -import java.io.Reader; -import java.net.URL; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.Enumeration; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; - -import javax.xml.XMLConstants; -import javax.xml.namespace.QName; -import javax.xml.transform.Source; -import javax.xml.validation.SchemaFactory; +package com.evolveum.midpoint.prism.schema; import com.evolveum.midpoint.prism.*; - -import com.evolveum.midpoint.util.QNameUtil; -import com.evolveum.prism.xml.ns._public.types_3.ObjectType; -import org.apache.commons.lang.StringUtils; -import org.apache.xml.resolver.Catalog; -import org.apache.xml.resolver.CatalogManager; -import org.apache.xml.resolver.tools.CatalogResolver; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.springframework.beans.factory.annotation.Autowired; -import org.w3c.dom.Element; -import org.w3c.dom.Node; -import org.w3c.dom.ls.LSInput; -import org.w3c.dom.ls.LSResourceResolver; -import org.xml.sax.EntityResolver; -import org.xml.sax.InputSource; -import org.xml.sax.SAXException; -import org.xml.sax.SAXParseException; - import com.evolveum.midpoint.prism.delta.ObjectDelta; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.xml.DynamicNamespacePrefixMapper; -import com.evolveum.midpoint.util.ClassPathUtil; -import com.evolveum.midpoint.util.DOMUtil; import com.evolveum.midpoint.util.DebugDumpable; -import com.evolveum.midpoint.util.DebugUtil; -import com.evolveum.midpoint.util.JAXBUtil; import com.evolveum.midpoint.util.exception.SchemaException; -import com.evolveum.midpoint.util.logging.Trace; -import com.evolveum.midpoint.util.logging.TraceManager; +import com.evolveum.prism.xml.ns._public.types_3.ObjectType; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.xml.sax.SAXException; + +import javax.xml.namespace.QName; +import java.io.IOException; +import java.util.Collection; +import java.util.List; /** - * Registry and resolver of schema files and resources. - * - * - * @author Radovan Semancik - * + * @author mederly */ -public class SchemaRegistry implements LSResourceResolver, EntityResolver, DebugDumpable { - - private static final QName DEFAULT_XSD_TYPE = DOMUtil.XSD_STRING; - - private static final String DEFAULT_RUNTIME_CATALOG_RESOURCE = "META-INF/catalog-runtime.xml"; - - private File[] catalogFiles; // overrides catalog resource name - private String catalogResourceName = DEFAULT_RUNTIME_CATALOG_RESOURCE; - - private javax.xml.validation.SchemaFactory schemaFactory; - private javax.xml.validation.Schema javaxSchema; - private EntityResolver builtinSchemaResolver; - final private List schemaDescriptions = new ArrayList<>(); - final private Map parsedSchemas = new HashMap<>(); - final private Map extensionSchemas = new HashMap<>(); - private boolean initialized = false; - private DynamicNamespacePrefixMapper namespacePrefixMapper; - private String defaultNamespace; - @Autowired(required = true) - private PrismContext prismContext; - - private static final Trace LOGGER = TraceManager.getTrace(SchemaRegistry.class); - - public DynamicNamespacePrefixMapper getNamespacePrefixMapper() { - return namespacePrefixMapper; - } - - public void setNamespacePrefixMapper(DynamicNamespacePrefixMapper namespacePrefixMapper) { - this.namespacePrefixMapper = namespacePrefixMapper; - } - - public PrismContext getPrismContext() { - return prismContext; - } +public interface SchemaRegistry extends DebugDumpable, GlobalDefinitionsStore { - public void setPrismContext(PrismContext prismContext) { - this.prismContext = prismContext; - } - - public EntityResolver getBuiltinSchemaResolver() { - return builtinSchemaResolver; - } + DynamicNamespacePrefixMapper getNamespacePrefixMapper(); - public void setBuiltinSchemaResolver(EntityResolver builtinSchemaResolver) { - this.builtinSchemaResolver = builtinSchemaResolver; - } + PrismContext getPrismContext(); - public File[] getCatalogFiles() { - return catalogFiles; - } + String getDefaultNamespace(); - public void setCatalogFiles(File[] catalogFiles) { - this.catalogFiles = catalogFiles; - } + void initialize() throws SAXException, IOException, SchemaException; - public String getCatalogResourceName() { - return catalogResourceName; - } - - public void setCatalogResourceName(String catalogResourceName) { - this.catalogResourceName = catalogResourceName; - } - - public String getDefaultNamespace() { - return defaultNamespace; - } - - public void setDefaultNamespace(String defaultNamespace) { - this.defaultNamespace = defaultNamespace; - } - - /** - * Must be called before call to initialize() - */ - public void registerSchemaResource(String resourcePath, String usualPrefix) throws SchemaException { - SchemaDescription desc = SchemaDescription.parseResource(resourcePath); - desc.setUsualPrefix(usualPrefix); - registerSchemaDescription(desc); - } - - /** - * Must be called before call to initialize() - */ - public void registerPrismSchemaResource(String resourcePath, String usualPrefix) throws SchemaException { - SchemaDescription desc = SchemaDescription.parseResource(resourcePath); - desc.setUsualPrefix(usualPrefix); - desc.setPrismSchema(true); - registerSchemaDescription(desc); - } - - public void registerPrismSchemasFromWsdlResource(String resourcePath, List compileTimeClassesPackages) throws SchemaException { - List descriptions = SchemaDescription.parseWsdlResource(resourcePath); - Iterator pkgIterator = null; - if (compileTimeClassesPackages != null) { - if (descriptions.size() != compileTimeClassesPackages.size()) { - throw new SchemaException("Mismatch between the size of compileTimeClassesPackages ("+compileTimeClassesPackages.size() - +" and schemas in "+resourcePath+" ("+descriptions.size()+")"); - } - pkgIterator = compileTimeClassesPackages.iterator(); - } - for (SchemaDescription desc : descriptions) { - desc.setPrismSchema(true); - if (pkgIterator != null) { - desc.setCompileTimeClassesPackage(pkgIterator.next()); - } - registerSchemaDescription(desc); - } - } - - /** - * Must be called before call to initialize() - */ - public void registerPrismSchemaResource(String resourcePath, String usualPrefix, Package compileTimeClassesPackage) throws SchemaException { - registerPrismSchemaResource(resourcePath, usualPrefix, compileTimeClassesPackage, false, false); - } - - /** - * Must be called before call to initialize() - */ - public void registerPrismSchemaResource(String resourcePath, String usualPrefix, Package compileTimeClassesPackage, boolean prefixDeclaredByDefault) throws SchemaException { - registerPrismSchemaResource(resourcePath, usualPrefix, compileTimeClassesPackage, false, prefixDeclaredByDefault); - } - - /** - * Must be called before call to initialize() - */ - public void registerPrismDefaultSchemaResource(String resourcePath, String usualPrefix, Package compileTimeClassesPackage) throws SchemaException { - registerPrismSchemaResource(resourcePath, usualPrefix, compileTimeClassesPackage, true, true); - } - - /** - * Must be called before call to initialize() - * - * @param prefixDeclaredByDefault Whether this prefix will be declared in top element in all XML serializations (MID-2198) - */ - public void registerPrismSchemaResource(String resourcePath, String usualPrefix, Package compileTimeClassesPackage, - boolean defaultSchema, boolean prefixDeclaredByDefault) throws SchemaException { - SchemaDescription desc = SchemaDescription.parseResource(resourcePath); - desc.setUsualPrefix(usualPrefix); - desc.setPrismSchema(true); - desc.setDefault(defaultSchema); - desc.setDeclaredByDefault(prefixDeclaredByDefault); - desc.setCompileTimeClassesPackage(compileTimeClassesPackage); - registerSchemaDescription(desc); - } - - /** - * Must be called before call to initialize() - * @param node - */ - public void registerSchema(Node node, String sourceDescription) throws SchemaException { - SchemaDescription desc = SchemaDescription.parseNode(node, sourceDescription); - registerSchemaDescription(desc); - } - - /** - * Must be called before call to initialize() - * @param node - */ - public void registerSchema(Node node, String sourceDescription, String usualPrefix) throws SchemaException { - SchemaDescription desc = SchemaDescription.parseNode(node, sourceDescription); - desc.setUsualPrefix(usualPrefix); - registerSchemaDescription(desc); - } - - public void registerPrismSchemaFile(File file) throws FileNotFoundException, SchemaException { - loadPrismSchemaFileDescription(file); - } - - public SchemaDescription loadPrismSchemaFileDescription(File file) throws FileNotFoundException, SchemaException { - if (!(file.getName().matches(".*\\.xsd$"))){ - LOGGER.trace("Skipping registering {}, because it is not schema definition.", file.getAbsolutePath()); - return null; - } - SchemaDescription desc = SchemaDescription.parseFile(file); - desc.setPrismSchema(true); - registerSchemaDescription(desc); - return desc; - } - - private void registerSchemaDescription(SchemaDescription desc) { - if (desc.getUsualPrefix() != null) { - namespacePrefixMapper.registerPrefix(desc.getNamespace(), desc.getUsualPrefix(), desc.isDefault()); - if (desc.isDeclaredByDefault()) { - namespacePrefixMapper.addDeclaredByDefault(desc.getUsualPrefix()); - } - } - parsedSchemas.put(desc.getNamespace(), desc); - schemaDescriptions.add(desc); - } - - public void registerPrismSchemasFromDirectory(File directory) throws FileNotFoundException, SchemaException { - File[] fileArray = directory.listFiles(); - if (fileArray != null) { - List files = Arrays.asList(fileArray); - // Sort the filenames so we have deterministic order of loading - // This is useful in tests but may come handy also during customization - Collections.sort(files); - for (File file: files) { - if (file.getName().startsWith(".")) { - // skip dotfiles. this will skip SVN data and similar things - continue; - } - if (file.isDirectory()) { - registerPrismSchemasFromDirectory(file); - } - if (file.isFile()) { - registerPrismSchemaFile(file); - } - } - } - } - - /** - * This can be used to read additional schemas even after the registry was initialized. - */ - public void loadPrismSchemasFromDirectory(File directory) throws FileNotFoundException, SchemaException { - List files = Arrays.asList(directory.listFiles()); - // Sort the filenames so we have deterministic order of loading - // This is useful in tests but may come handy also during customization - Collections.sort(files); - for (File file: files) { - if (file.getName().startsWith(".")) { - // skip dotfiles. this will skip SVN data and similar things - continue; - } - if (file.isDirectory()) { - loadPrismSchemasFromDirectory(file); - } - if (file.isFile()) { - loadPrismSchemaFile(file); - } - } - } - - public void loadPrismSchemaFile(File file) throws FileNotFoundException, SchemaException { - SchemaDescription desc = loadPrismSchemaFileDescription(file); - parsePrismSchema(desc); - } + javax.xml.validation.Schema getJavaxSchema(); - public void loadPrismSchemaResource(String resourcePath) throws SchemaException { - SchemaDescription desc = SchemaDescription.parseResource(resourcePath); - desc.setPrismSchema(true); - registerSchemaDescription(desc); - parsePrismSchema(desc); - } + PrismSchema getSchema(String namespace); - /** - * This can be used to read additional schemas even after the registry was initialized. - */ - public void initialize() throws SAXException, IOException, SchemaException { - if (prismContext == null) { - throw new IllegalStateException("Prism context not set"); - } - if (namespacePrefixMapper == null) { - throw new IllegalStateException("Namespace prefix mapper not set"); - } - try { - initResolver(); - parsePrismSchemas(); - parseJavaxSchema(); - compileCompileTimeClassList(); - initialized = true; - - } catch (SAXException ex) { - if (ex instanceof SAXParseException) { - SAXParseException sex = (SAXParseException)ex; - throw new SchemaException("Error parsing schema "+sex.getSystemId()+" line "+sex.getLineNumber()+": "+sex.getMessage(), sex); - } - throw ex; - } - } + Collection getSchemas(); - private void parseJavaxSchema() throws SAXException, IOException { - schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); - Source[] sources = new Source[schemaDescriptions.size()]; - int i = 0; - for (SchemaDescription schemaDescription : schemaDescriptions) { - Source source = schemaDescription.getSource(); - sources[i] = source; - i++; - } - schemaFactory.setResourceResolver(this); - javaxSchema = schemaFactory.newSchema(sources); - } + Collection getSchemaDescriptions(); - private void parsePrismSchemas() throws SchemaException { - for (SchemaDescription schemaDescription : schemaDescriptions) { - if (schemaDescription.isPrismSchema()) { - parsePrismSchema(schemaDescription); - } - } - applySchemaExtensions(); - } - - private void parsePrismSchema(SchemaDescription schemaDescription) throws SchemaException { - String namespace = schemaDescription.getNamespace(); - - Element domElement = schemaDescription.getDomElement(); - boolean isRuntime = schemaDescription.getCompileTimeClassesPackage() == null; -// System.out.println("Parsing schema " + schemaDescription.getNamespace()); - LOGGER.trace("Parsing schema {}, namespace: {}, isRuntime: {}", - schemaDescription.getSourceDescription(), namespace, isRuntime); - PrismSchema schema = PrismSchema.parse(domElement, this, isRuntime, schemaDescription.getSourceDescription(), getPrismContext()); - if (StringUtils.isEmpty(namespace)) { - namespace = schema.getNamespace(); - } - LOGGER.trace("Parsed schema {}, namespace: {}, isRuntime: {}", - schemaDescription.getSourceDescription(), namespace, isRuntime); - schemaDescription.setSchema(schema); - detectExtensionSchema(schema); - } + Collection getCompileTimePackages(); - private void detectExtensionSchema(PrismSchema schema) throws SchemaException { - for (ComplexTypeDefinition def: schema.getDefinitions(ComplexTypeDefinition.class)) { - QName extType = def.getExtensionForType(); - if (extType != null) { - if (extensionSchemas.containsKey(extType)) { - ComplexTypeDefinition existingExtension = extensionSchemas.get(extType); - existingExtension.merge(def); -// throw new SchemaException("Duplicate definition of extension for type "+extType+": "+def+" and "+extensionSchemas.get(extType)); - } else { - extensionSchemas.put(extType, def.clone()); - } - } - } - } - - private void applySchemaExtensions() throws SchemaException { - for (Entry entry: extensionSchemas.entrySet()) { - QName typeQName = entry.getKey(); - ComplexTypeDefinition extensionCtd = entry.getValue(); - ComplexTypeDefinition primaryCtd = findComplexTypeDefinition(typeQName); - PrismContainerDefinition extensionContainer = primaryCtd.findContainerDefinition( - new QName(primaryCtd.getTypeName().getNamespaceURI(), PrismConstants.EXTENSION_LOCAL_NAME)); - if (extensionContainer == null) { - throw new SchemaException("Attempt to extend type "+typeQName+" with "+extensionCtd.getTypeClass()+" but the original type does not have extension container"); - } - extensionContainer.setComplexTypeDefinition(extensionCtd.clone()); - extensionContainer.setTypeName(extensionCtd.getTypeName()); - } - } - - private void compileCompileTimeClassList() { - for (SchemaDescription schemaDescription : schemaDescriptions) { - Package pkg = schemaDescription.getCompileTimeClassesPackage(); - if (pkg != null) { - Map> map = createXsdTypeMap(pkg); - schemaDescription.setXsdTypeTocompileTimeClassMap(map); - } - } - } + // TODO fix this temporary and inefficient implementation + QName resolveUnqualifiedTypeName(QName type) throws SchemaException; - private void initResolver() throws IOException { - CatalogManager catalogManager = new CatalogManager(); - catalogManager.setUseStaticCatalog(true); - catalogManager.setIgnoreMissingProperties(true); - catalogManager.setVerbosity(1); - catalogManager.setPreferPublic(true); - CatalogResolver catalogResolver = new CatalogResolver(catalogManager); - Catalog catalog = catalogResolver.getCatalog(); - - if (catalogFiles != null && catalogFiles.length > 0) { - for (File catalogFile : catalogFiles) { - LOGGER.trace("Using catalog file {}", catalogFile); - catalog.parseCatalog(catalogFile.getPath()); - } - } else if (catalogResourceName != null) { - LOGGER.trace("Using catalog from resource: {}", catalogResourceName); - Enumeration catalogs = Thread.currentThread().getContextClassLoader().getResources(catalogResourceName); - while (catalogs.hasMoreElements()) { - URL catalogResourceUrl = catalogs.nextElement(); - LOGGER.trace("Parsing catalog from URL: {}", catalogResourceUrl); - catalog.parseCatalog(catalogResourceUrl); - } - } else { - throw new IllegalStateException("Catalog is not defined"); - } - - builtinSchemaResolver = catalogResolver; - } - - public javax.xml.validation.Schema getJavaxSchema() { - return javaxSchema; - } - - public PrismSchema getSchema(String namespace) { - return parsedSchemas.get(namespace).getSchema(); - } - - public Collection getSchemas() { - Collection schemas = new ArrayList(); - for (Entry entry: parsedSchemas.entrySet()) { - schemas.add(entry.getValue().getSchema()); - } - return schemas; - } - - public Collection getSchemaDescriptions() { - return parsedSchemas.values(); - } - - public Collection getCompileTimePackages() { - Collection compileTimePackages = new ArrayList(schemaDescriptions.size()); - for (SchemaDescription desc : schemaDescriptions) { - if (desc.getCompileTimeClassesPackage() != null) { - compileTimePackages.add(desc.getCompileTimeClassesPackage()); - } - } - return compileTimePackages; - } - - private Map> createXsdTypeMap(Package pkg) { - Map> map = new HashMap>(); - for (Class clazz: ClassPathUtil.listClasses(pkg)) { - QName typeName = JAXBUtil.getTypeQName(clazz); - if (typeName != null) { - map.put(typeName, clazz); - } - } - return map; - } - - private SchemaDescription lookupSchemaDescription(String namespace) { - for (SchemaDescription desc : schemaDescriptions) { - if (namespace.equals(desc.getNamespace())) { - return desc; - } - } - return null; - } - - //region ======================================================================== Resolving entities and resources - - /* - * Although not sure when resolveEntity and resolveResource is called, general schema is the following: - * 1. For schemas that are imported via xsd:import, we use schemaLocation = namespaceURI, with some exceptions - * (we of course don't modify xsd:imports in standard schemas + for some historic reasons there is a difference - * for 'enc' and 'dsig' schemas: namespaceURI ends with '#', whereas schemaLocation does not) - * 2. For schemas that are included via xsd:include (currently: fragments of common-3 schema), we use - * namespaceURI of the owning schema (e.g. .../common-3), whereas schemaLocation is URI derived from the - * namespace by including the fragment name (e.g. .../common-notifications-3). - * - * XSD parsers (the ones used by xjc and runtime parsing) seem to do the following: - * 1. When encountering xsd:import, they look by publicId = namespaceURI, systemId = schemaLocation OR - * sometimes with publicId = null, systemId = schemaLocation (why?) - * 2. When encountering xsd:include, they look by publicId = null, systemId = schemaLocation - * 3. When encountering XML entity declaration that specifies publicId and systemId, look by them. - * - * See the respective methods. - * - */ - - /* (non-Javadoc) - * @see org.xml.sax.EntityResolver#resolveEntity(java.lang.String, java.lang.String) - */ - @Override - public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException { - LOGGER.trace("--- Resolving entity with publicID: {}, systemID: {}", publicId, systemId); - InputSource inputSource = resolveResourceFromRegisteredSchemas(publicId, systemId); - if (inputSource == null) { - inputSource = resolveResourceUsingBuiltinResolver(null, null, publicId, systemId, null); - } - if (inputSource == null) { - LOGGER.error("Unable to resolve entity with publicID: {}, systemID: {}",new Object[]{publicId, systemId}); - return null; - } - LOGGER.trace("==> Resolved entity with publicID: {}, systemID: {} : {}", publicId, systemId, inputSource); - return inputSource; - } - - /* (non-Javadoc) - * @see org.w3c.dom.ls.LSResourceResolver#resolveResource(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String) - */ - @Override - public LSInput resolveResource(String type, String namespaceURI, String publicId, String systemId, - String baseURI) { - LOGGER.trace("--- Resolving resource of type {}, namespaceURI: {}, publicID: {}, systemID: {}, base URI: {}", type, namespaceURI, publicId, systemId, baseURI); - InputSource inputSource = resolveResourceFromRegisteredSchemas(publicId, systemId); - if (inputSource == null) { - inputSource = resolveResourceUsingBuiltinResolver(type, namespaceURI, publicId, systemId, baseURI); - } - if (inputSource == null) { - LOGGER.error("Unable to resolve resource of type {}, namespaceURI: {}, publicID: {}, systemID: {}, baseURI: {}",new Object[]{type, namespaceURI, publicId, systemId, baseURI}); - return null; - } - LOGGER.trace("==> Resolved resource of type {}, namespaceURI: {}, publicID: {}, systemID: {}, baseURI: {} : {}",new Object[]{type, namespaceURI, publicId, systemId, baseURI, inputSource}); - return new Input(publicId, systemId, inputSource.getByteStream()); - } - - // schema fragments (e.g. common-model-context-3) will be obviously not found by this method - private InputSource resolveResourceFromRegisteredSchemas(String publicId, String systemId) { - InputSource source = resolveResourceFromRegisteredSchemasByNamespace(publicId); - if (source == null) { - // give a chance to systemId - in cases of xsd:import namespaceURI=, schemaLocation= that - // (for some weird reason) result in search with publicId=null, systemId= - source = resolveResourceFromRegisteredSchemasByNamespace(systemId); - } - LOGGER.trace("...... Result of registered schema resolve for publicId: {}, systemId: {}: {}", publicId, systemId, source); - return source; - } - - private InputSource resolveResourceFromRegisteredSchemasByNamespace(String namespaceURI) { - if (namespaceURI != null) { - if (parsedSchemas.containsKey(namespaceURI)) { - SchemaDescription schemaDescription = parsedSchemas.get(namespaceURI); - if (schemaDescription.canInputStream()) { - InputStream inputStream = schemaDescription.openInputStream(); - InputSource source = new InputSource(); - source.setByteStream(inputStream); - //source.setSystemId(schemaDescription.getPath()); - // Make sure that both publicId and systemId are always set to schema namespace - // this helps to avoid double processing of the schemas - source.setSystemId(namespaceURI); - source.setPublicId(namespaceURI); - return source; - } else { - throw new IllegalStateException("Requested resolution of schema "+schemaDescription.getSourceDescription()+" that does not support input stream"); - } - } - } - return null; - } - - public InputSource resolveResourceUsingBuiltinResolver(String type, String namespaceURI, String publicId, String systemId, - String baseURI) { - InputSource inputSource = null; - try { - // we first try to use traditional pair of publicId + systemId - // the use of namespaceUri can be misleading in case of schema fragments: - // e.g. when xsd:including common-model-context-3 the publicId=null, systemId=.../common-model-context-3 but nsUri=.../common-3 - if (inputSource == null) { - inputSource = builtinSchemaResolver.resolveEntity(publicId, systemId); - LOGGER.trace("...... Result of using builtin resolver by publicId + systemId: {}", inputSource); - } - // in some weird cases (e.g. when publicId=null, systemId=xml.xsd) we go with namespaceUri (e.g. http://www.w3.org/XML/1998/namespace) - // it's a kind of unfortunate magic here - if (inputSource == null && namespaceURI != null) { - inputSource = builtinSchemaResolver.resolveEntity(namespaceURI, systemId); - LOGGER.trace("...... Result of using builtin resolver by namespaceURI + systemId: {}", inputSource); - } - } catch (SAXException e) { - LOGGER.error("XML parser error resolving reference of type {}, namespaceURI: {}, publicID: {}, systemID: {}, baseURI: {}: {}",new Object[]{type, namespaceURI, publicId, systemId, baseURI, e.getMessage(), e}); - // TODO: better error handling - return null; - } catch (IOException e) { - LOGGER.error("IO error resolving reference of type {}, namespaceURI: {}, publicID: {}, systemID: {}, baseURI: {}: {}",new Object[]{type, namespaceURI, publicId, systemId, baseURI, e.getMessage(), e}); - // TODO: better error handling - return null; - } - return inputSource; - } - //endregion - - // TODO fix this temporary and inefficient implementation - public QName resolveUnqualifiedTypeName(QName type) throws SchemaException { - QName typeFound = null; - for (SchemaDescription desc: schemaDescriptions) { - QName typeInSchema = new QName(desc.getNamespace(), type.getLocalPart()); - if (desc.getSchema() != null && desc.getSchema().findComplexTypeDefinition(typeInSchema) != null) { - if (typeFound != null) { - throw new SchemaException("Ambiguous type name: " + type); - } else { - typeFound = typeInSchema; - } - } - } - if (typeFound == null) { - throw new SchemaException("Unknown type: " + type); - } else { - return typeFound; - } - } - - public QName qualifyTypeName(QName typeName) throws SchemaException { - if (typeName == null || !QNameUtil.isUnqualified(typeName)) { - return typeName; - } - return resolveUnqualifiedTypeName(typeName); - } + QName qualifyTypeName(QName typeName) throws SchemaException; // current implementation tries to find all references to the child CTD and select those that are able to resolve path of 'rest' // fails on ambiguity // it's a bit fragile, as adding new references to child CTD in future may break existing code - public ComplexTypeDefinition determineParentDefinition(@NotNull ComplexTypeDefinition child, @NotNull ItemPath rest) { - ComplexTypeDefinition parent = null; - for (PrismSchema schema : getSchemas()) { - if (schema == null) { - continue; - } - for (ComplexTypeDefinition ctd : schema.getComplexTypeDefinitions()) { - for (ItemDefinition item : ctd.getDefinitions()) { - if (item instanceof PrismContainerDefinition) { - PrismContainerDefinition itemPcd = (PrismContainerDefinition) item; - if (itemPcd.getComplexTypeDefinition() != null) { - if (child.getTypeName().equals(itemPcd.getComplexTypeDefinition().getTypeName())) { - if (!rest.isEmpty() && ctd.findItemDefinition(rest) == null) { - continue; - } - if (parent != null && !parent.getTypeClass().equals(ctd.getTypeName())) { - throw new IllegalStateException("Couldn't find parent definition for " + child.getTypeName() + ": More than one candidate found: " - + parent.getTypeName() + ", " + itemPcd.getTypeName()); - } - parent = ctd; - } - } - } - } - } - } -// ComplexTypeDefinition def = findComplexTypeDefinition(new QName( -// "http://midpoint.evolveum.com/xml/ns/public/common/common-3", -// "ObjectType")); // FIXME BRUTAL HACK - if (parent == null) { - throw new IllegalStateException("Couldn't find definition for parent for " + child.getTypeName() + ", path=" + rest); - } - return parent; - } - - public PrismObjectDefinition determineReferencedObjectDefinition(QName targetTypeName, ItemPath rest) { - // TEMPORARY HACK -- TODO FIXME - PrismObjectDefinition def = findObjectDefinitionByType(targetTypeName); - if (def == null) { - throw new IllegalStateException("Couldn't find definition for referenced object for " + targetTypeName + ", path=" + rest); - } - return def; - } - - public Class getCompileTimeClassForObjectType(QName objectType) { - PrismObjectDefinition definition = findObjectDefinitionByType(objectType); - if (definition == null) { - return null; - } - return definition.getCompileTimeClass(); - } - - class Input implements LSInput { - - private String publicId; - private String systemId; - private BufferedInputStream inputStream; - - public String getPublicId() { - return publicId; - } - - public void setPublicId(String publicId) { - this.publicId = publicId; - } - - public String getBaseURI() { - return null; - } - - public InputStream getByteStream() { - return null; - } - - public boolean getCertifiedText() { - return false; - } - - public Reader getCharacterStream() { - return null; - } - - public String getEncoding() { - return null; - } + ComplexTypeDefinition determineParentDefinition(@NotNull ComplexTypeDefinition child, @NotNull ItemPath rest); - public String getStringData() { - synchronized (inputStream) { - try { - byte[] input = new byte[inputStream.available()]; - inputStream.read(input); - String contents = new String(input); - return contents; - } catch (IOException e) { - LOGGER.error("IO error creating LSInput for publicID: {}, systemID: {}: {}",new Object[]{publicId, systemId, e.getMessage(), e}); - // TODO: better error handling - return null; - } - } - } + PrismObjectDefinition determineReferencedObjectDefinition(QName targetTypeName, ItemPath rest); - public void setBaseURI(String baseURI) { - } + Class getCompileTimeClassForObjectType(QName objectType); - public void setByteStream(InputStream byteStream) { - } + ItemDefinition findItemDefinitionByElementName(QName elementName, @Nullable List ignoredNamespaces); - public void setCertifiedText(boolean certifiedText) { - } + Class determineCompileTimeClass(QName typeName); - public void setCharacterStream(Reader characterStream) { - } + Class getCompileTimeClass(QName xsdType); - public void setEncoding(String encoding) { - } + PrismSchema findSchemaByCompileTimeClass(Class compileTimeClass); - public void setStringData(String stringData) { - } - - public String getSystemId() { - return systemId; - } - - public void setSystemId(String systemId) { - this.systemId = systemId; - } - - public BufferedInputStream getInputStream() { - return inputStream; - } - - public void setInputStream(BufferedInputStream inputStream) { - this.inputStream = inputStream; - } - - public Input(String publicId, String sysId, InputStream input) { - this.publicId = publicId; - this.systemId = sysId; - this.inputStream = new BufferedInputStream(input); - } - } - - @Override - public String debugDump() { - return debugDump(0); - } - - @Override - public String debugDump(int indent) { - StringBuilder sb = new StringBuilder(); - DebugUtil.indentDebugDump(sb, indent); - sb.append("SchemaRegistry:"); - sb.append(" Parsed Schemas:"); - for (String namespace: parsedSchemas.keySet()) { - sb.append("\n"); - DebugUtil.indentDebugDump(sb, indent + 1); - sb.append(namespace); - sb.append(": "); - sb.append(parsedSchemas.get(namespace)); - } - return sb.toString(); - } - - public Class determineCompileTimeClass(QName elementName, ComplexTypeDefinition complexTypeDefinition) { - return determineCompileTimeClass(complexTypeDefinition.getTypeName()); - } - - public Class determineCompileTimeClass(ComplexTypeDefinition complexTypeDefinition) { - return determineCompileTimeClass(complexTypeDefinition.getTypeName()); - } - - public Class determineCompileTimeClass(QName typeName) { - if (StringUtils.isEmpty(typeName.getNamespaceURI())) { - ComplexTypeDefinition ctd = resolveGlobalTypeDefinitionWithoutNamespace(typeName.getLocalPart()); - if (ctd == null) { - return null; -// throw new IllegalArgumentException("Cannot find type definition for type " + typeName); - } - return (Class) ctd.getCompileTimeClass(); - } - SchemaDescription desc = findSchemaDescriptionByNamespace(typeName.getNamespaceURI()); - if (desc == null) { - return null; - } - Package pkg = desc.getCompileTimeClassesPackage(); - if (pkg == null) { - return null; - } - Class compileTimeClass = JAXBUtil.findClassForType(typeName, pkg); - return compileTimeClass; - } - - public Class getCompileTimeClass(QName xsdType) { - return determineCompileTimeClass(xsdType); - // TODO: which one is better (this one or the above)? -// SchemaDescription desc = findSchemaDescriptionByNamespace(xsdType.getNamespaceURI()); -// if (desc == null) { -// return null; -// } -// Map> map = desc.getXsdTypeTocompileTimeClassMap(); -// if (map == null) { -// return null; -// } -// return (Class) map.get(xsdType); - } - - public PrismSchema findSchemaByCompileTimeClass(Class compileTimeClass) { - Package compileTimePackage = compileTimeClass.getPackage(); - for (SchemaDescription desc: schemaDescriptions) { - if (compileTimePackage.equals(desc.getCompileTimeClassesPackage())) { - PrismSchema schema = desc.getSchema(); - return schema; - } - } - return null; - } - - public PrismObjectDefinition findObjectDefinitionByCompileTimeClass(Class compileTimeClass) { - PrismSchema schema = findSchemaByCompileTimeClass(compileTimeClass); - if (schema == null) { - return null; - } - return schema.findObjectDefinitionByCompileTimeClass(compileTimeClass); - } - - public void applyDefinition(PrismObject prismObject, Class type) throws SchemaException { - applyDefinition(prismObject, type, true); - } - - /** - * This method will try to locate the appropriate object definition and apply it. - */ - public void applyDefinition(PrismObject prismObject, Class type, boolean force) throws SchemaException { - PrismObjectDefinition objectDefinition = determineDefinitionFromClass(type); - prismObject.applyDefinition(objectDefinition, force); - } - /** * This method will try to locate the appropriate object definition and apply it. */ - public void applyDefinition(ObjectDelta objectDelta, Class type, boolean force) throws SchemaException { - PrismObjectDefinition objectDefinition = determineDefinitionFromClass(type); - objectDelta.applyDefinition(objectDefinition, force); - } - - public void applyDefinition(PrismContainerValue prismContainerValue, Class type, - ItemPath path, boolean force) throws SchemaException { - PrismObjectDefinition objectDefinition = determineDefinitionFromClass(type); - PrismContainerDefinition containerDefinition = objectDefinition.findContainerDefinition(path); - prismContainerValue.applyDefinition(containerDefinition, force); - } - - public void applyDefinition(PrismContainerValue prismContainerValue, QName typeName, - ItemPath path, boolean force) throws SchemaException { - PrismObjectDefinition objectDefinition = findObjectDefinitionByType(typeName); - if (objectDefinition != null) { - PrismContainerDefinition containerDefinition = objectDefinition.findContainerDefinition(path); - prismContainerValue.applyDefinition(containerDefinition, force); - return; - } - PrismContainerDefinition typeDefinition = findContainerDefinitionByType(typeName); - if (typeDefinition != null) { - PrismContainerDefinition containerDefinition = typeDefinition.findContainerDefinition(path); - prismContainerValue.applyDefinition(containerDefinition, force); - return; - } - ComplexTypeDefinition complexTypeDefinition = findComplexTypeDefinition(typeName); - if (complexTypeDefinition != null) { - PrismContainerDefinition containerDefinition = complexTypeDefinition.findContainerDefinition(path); - prismContainerValue.applyDefinition(containerDefinition, force); - return; - } - throw new SchemaException("No definition for container "+path+" in type "+typeName); - } - - public PrismObjectDefinition findObjectDefinitionByType(QName typeName) { - if (StringUtils.isEmpty(typeName.getNamespaceURI())) { - // a quick hack (todo do it seriously) - ComplexTypeDefinition ctd = resolveGlobalTypeDefinitionWithoutNamespace(typeName.getLocalPart()); - if (ctd == null) { - return null; - } - typeName = ctd.getTypeName(); - } - PrismSchema schema = findSchemaByNamespace(typeName.getNamespaceURI()); - if (schema == null){ - //TODO: check for confilicted objects -// Iterator schemaIterator = getSchemas().iterator(); -// while (schemaIterator.hasNext()){ -// schema = schemaIterator.next(); -// if (schema == null){ -// continue; -// } -// PrismObjectDefinition def = schema.findObjectDefinitionByTypeAssumeNs(typeName); -// if (def != null){ -// return def; -// } -// -// } - return null; - } - return schema.findObjectDefinitionByType(typeName); - } - - public PrismObjectDefinition findObjectDefinitionByElementName(QName elementName) { - if (StringUtils.isEmpty(elementName.getNamespaceURI())) { - return resolveGlobalItemDefinitionWithoutNamespace(elementName.getLocalPart(), PrismObjectDefinition.class); - } - PrismSchema schema = findSchemaByNamespace(elementName.getNamespaceURI()); - if (schema == null) { - return null; - } - return schema.findObjectDefinitionByElementName(elementName); - } - - public PrismContainerDefinition findContainerDefinitionByType(QName typeName) { - if (StringUtils.isEmpty(typeName.getNamespaceURI())) { - // Maybe not optimal but sufficient way: we resolve complex type definition, and from it we get qualified type name. - // This is then used to find container definition in the traditional way. - ComplexTypeDefinition complexTypeDefinition = resolveGlobalTypeDefinitionWithoutNamespace(typeName.getLocalPart()); - if (complexTypeDefinition == null) { - return null; - } - typeName = complexTypeDefinition.getTypeName(); - } - PrismSchema schema = findSchemaByNamespace(typeName.getNamespaceURI()); - if (schema == null) { - return null; - } - return schema.findContainerDefinitionByType(typeName); - } - - public PrismContainerDefinition findContainerDefinitionByElementName(QName elementName) { - if (StringUtils.isEmpty(elementName.getNamespaceURI())) { - return resolveGlobalItemDefinitionWithoutNamespace(elementName.getLocalPart(), PrismContainerDefinition.class); - } - PrismSchema schema = findSchemaByNamespace(elementName.getNamespaceURI()); - if (schema == null) { - return null; - } - return schema.findContainerDefinitionByElementName(elementName); - } - - public PrismContainerDefinition findContainerDefinitionByCompileTimeClass(@NotNull Class compileTimeClass) { - PrismSchema schema = findSchemaByCompileTimeClass(compileTimeClass); - if (schema == null) { - return null; - } - return schema.findContainerDefinitionByCompileTimeClass(compileTimeClass); - } + void applyDefinition(PrismObject prismObject, Class type) throws SchemaException; - public ComplexTypeDefinition findComplexTypeDefinitionByCompileTimeClass(Class compileTimeClass) { - PrismSchema schema = findSchemaByCompileTimeClass(compileTimeClass); - if (schema == null) { - return null; - } - return schema.findComplexTypeDefinitionByCompileTimeClass(compileTimeClass); - } + void applyDefinition(PrismObject prismObject, Class type, boolean force) throws SchemaException; - public T findItemDefinitionByFullPath(Class objectClass, Class defClass, QName... itemNames) - throws SchemaException { - PrismObjectDefinition objectDefinition = findObjectDefinitionByCompileTimeClass(objectClass); - if (objectDefinition == null) { - throw new SchemaException("No object definition for " + objectClass); - } - return (T) objectDefinition.findItemDefinition(new ItemPath(itemNames), defClass); - } + void applyDefinition(ObjectDelta objectDelta, Class type, boolean force) throws SchemaException; - public ItemDefinition findItemDefinitionByElementName(QName elementName) { - return findItemDefinitionByElementName(elementName, null); - } + void applyDefinition(PrismContainerValue prismContainerValue, + Class type, + ItemPath path, boolean force) throws SchemaException; - public ItemDefinition findItemDefinitionByElementName(QName elementName, @Nullable List ignoredNamespaces) { - if (StringUtils.isEmpty(elementName.getNamespaceURI())) { - return resolveGlobalItemDefinitionWithoutNamespace(elementName.getLocalPart(), ItemDefinition.class, true, ignoredNamespaces); - } - PrismSchema schema = findSchemaByNamespace(elementName.getNamespaceURI()); - if (schema == null) { - return null; - } - return schema.findItemDefinition(elementName, ItemDefinition.class); - } + void applyDefinition(PrismContainerValue prismContainerValue, QName typeName, + ItemPath path, boolean force) throws SchemaException; - public ItemDefinition findItemDefinitionByType(QName typeName) { - if (StringUtils.isEmpty(typeName.getNamespaceURI())) { - ComplexTypeDefinition ctd = resolveGlobalTypeDefinitionWithoutNamespace(typeName.getLocalPart()); - if (ctd == null) { - return null; - } - typeName = ctd.getTypeName(); - } - PrismSchema schema = findSchemaByNamespace(typeName.getNamespaceURI()); - if (schema == null) { - return null; - } - return schema.findItemDefinitionByType(typeName, ItemDefinition.class); - } + T findItemDefinitionByFullPath(Class objectClass, Class defClass, + QName... itemNames) + throws SchemaException; + PrismSchema findSchemaByNamespace(String namespaceURI); - public PrismPropertyDefinition findPropertyDefinitionByElementName(QName elementName) { - if (StringUtils.isEmpty(elementName.getNamespaceURI())) { - return resolveGlobalItemDefinitionWithoutNamespace(elementName.getLocalPart(), PrismPropertyDefinition.class); - } - PrismSchema schema = findSchemaByNamespace(elementName.getNamespaceURI()); - if (schema == null) { - return null; - } - return schema.findPropertyDefinitionByElementName(elementName); - } + SchemaDescription findSchemaDescriptionByNamespace(String namespaceURI); - public PrismReferenceDefinition findReferenceDefinitionByElementName(QName elementName) { - if (StringUtils.isEmpty(elementName.getNamespaceURI())) { - return resolveGlobalItemDefinitionWithoutNamespace(elementName.getLocalPart(), PrismReferenceDefinition.class); - } - PrismSchema schema = findSchemaByNamespace(elementName.getNamespaceURI()); - if (schema == null) { - return null; - } - return schema.findReferenceDefinitionByElementName(elementName); - } - - - public ComplexTypeDefinition findComplexTypeDefinition(QName typeName) { - if (StringUtils.isEmpty(typeName.getNamespaceURI())) { - return resolveGlobalTypeDefinitionWithoutNamespace(typeName.getLocalPart()); - } - PrismSchema schema = findSchemaByNamespace(typeName.getNamespaceURI()); - if (schema == null) { - return null; - } - return schema.findComplexTypeDefinition(typeName); - } - - - public PrismSchema findSchemaByNamespace(String namespaceURI) { - SchemaDescription desc = findSchemaDescriptionByNamespace(namespaceURI); - if (desc == null) { - return null; - } - return desc.getSchema(); - } - - public SchemaDescription findSchemaDescriptionByNamespace(String namespaceURI) { - for (SchemaDescription desc: schemaDescriptions) { - if (namespaceURI.equals(desc.getNamespace())) { - return desc; - } - } - return null; - } - - public PrismSchema findSchemaByPrefix(String prefix) { - SchemaDescription desc = findSchemaDescriptionByPrefix(prefix); - if (desc == null) { - return null; - } - return desc.getSchema(); - } - - public SchemaDescription findSchemaDescriptionByPrefix(String prefix) { - for (SchemaDescription desc: schemaDescriptions) { - if (prefix.equals(desc.getUsualPrefix())) { - return desc; - } - } - return null; - } - - public PrismObjectDefinition determineDefinitionFromClass(Class type) { - PrismObjectDefinition def = findObjectDefinitionByCompileTimeClass(type); - if (def != null) { - return def; - } - Class superclass = type.getSuperclass(); - if (superclass == Object.class) { - return null; - } - return determineDefinitionFromClass(superclass); - } - - /** - * Returns true if specified element has a definition that matches specified type - * in the known schemas. - */ - public boolean hasImplicitTypeDefinition(QName elementName, QName typeName) { - elementName = resolveElementNameIfNeeded(elementName, false); - if (elementName == null) { - return false; - } - PrismSchema schema = findSchemaByNamespace(elementName.getNamespaceURI()); - if (schema == null) { - return false; - } - ItemDefinition itemDefinition = schema.findItemDefinition(elementName, ItemDefinition.class); - if (itemDefinition == null) { - return false; - } - return QNameUtil.match(typeName, itemDefinition.getTypeName()); - } - - private QName resolveElementNameIfNeeded(QName elementName) { - return resolveElementNameIfNeeded(elementName, true); - } - - private QName resolveElementNameIfNeeded(QName elementName, boolean exceptionIfAmbiguous) { - if (StringUtils.isNotEmpty(elementName.getNamespaceURI())) { - return elementName; - } - ItemDefinition itemDef = resolveGlobalItemDefinitionWithoutNamespace(elementName.getLocalPart(), ItemDefinition.class, exceptionIfAmbiguous, null); - if (itemDef != null) { - return itemDef.getName(); - } else { - return null; - } - } - - public static ItemDefinition createDefaultItemDefinition(QName itemName, PrismContext prismContext) { - PrismPropertyDefinition propDef = new PrismPropertyDefinition(itemName, DEFAULT_XSD_TYPE, prismContext); - // Set it to multi-value to be on the safe side - propDef.setMaxOccurs(-1); - propDef.setDynamic(true); - return propDef; - } - - /** - * Looks for a top-level definition for the specified element name (in all schemas). - */ - public ItemDefinition resolveGlobalItemDefinition(QName elementQName) throws SchemaException { - return resolveGlobalItemDefinition(elementQName, null); - } + PrismSchema findSchemaByPrefix(String prefix); - public ItemDefinition resolveGlobalItemDefinition(QName elementQName, PrismContainerDefinition containerDefinition) throws SchemaException { - String elementNamespace = elementQName.getNamespaceURI(); - if (StringUtils.isEmpty(elementNamespace)) { - List ignoredNamespaces = containerDefinition != null ? - containerDefinition.getIgnoredNamespaces() : - null; - return resolveGlobalItemDefinitionWithoutNamespace(elementQName.getLocalPart(), ItemDefinition.class, true, ignoredNamespaces); - } - PrismSchema schema = findSchemaByNamespace(elementNamespace); - if (schema == null) { - return null; - } - ItemDefinition itemDefinition = schema.findItemDefinition(elementQName, ItemDefinition.class); - return itemDefinition; - } + SchemaDescription findSchemaDescriptionByPrefix(String prefix); - private T resolveGlobalItemDefinitionWithoutNamespace(String localPart, Class definitionClass) { - return resolveGlobalItemDefinitionWithoutNamespace(localPart, definitionClass, true, null); - } + PrismObjectDefinition determineDefinitionFromClass(Class type); - private T resolveGlobalItemDefinitionWithoutNamespace(String localPart, Class definitionClass, boolean exceptionIfAmbiguous, @Nullable List ignoredNamespaces) { - ItemDefinition found = null; - for (SchemaDescription schemaDescription : parsedSchemas.values()) { - PrismSchema schema = schemaDescription.getSchema(); - if (schema == null) { // is this possible? - continue; - } - if (namespaceMatches(schema.getNamespace(), ignoredNamespaces)) { - continue; - } - ItemDefinition def = schema.findItemDefinition(localPart, definitionClass); - if (def != null) { - if (found != null) { - // todo change to SchemaException - if (exceptionIfAmbiguous) { - throw new IllegalArgumentException("Multiple possible resolutions for unqualified element name " + localPart + " (e.g. in " + - def.getNamespace() + " and " + found.getNamespace()); - } else { - return null; - } - } - found = def; - } - } - return (T) found; - } + boolean hasImplicitTypeDefinition(QName elementName, QName typeName); - private boolean namespaceMatches(String namespace, @Nullable List ignoredNamespaces) { - if (ignoredNamespaces == null) { - return false; - } - for (String ignored : ignoredNamespaces) { - if (namespace.startsWith(ignored)) { - return true; - } - } - return false; - } + ItemDefinition resolveGlobalItemDefinition(QName elementQName) throws SchemaException; - private ComplexTypeDefinition resolveGlobalTypeDefinitionWithoutNamespace(String typeLocalName) { - ComplexTypeDefinition found = null; - for (SchemaDescription schemaDescription : parsedSchemas.values()) { - PrismSchema schema = schemaDescription.getSchema(); - if (schema == null) { // is this possible? - continue; - } - ComplexTypeDefinition def = schema.findComplexTypeDefinition(new QName(schema.getNamespace(), typeLocalName)); - if (def != null) { - if (found != null) { - // TODO change to SchemaException - throw new IllegalArgumentException("Multiple possible resolutions for unqualified type name " + typeLocalName + " (e.g. in " + - def.getTypeName() + " and " + found.getTypeName()); - } - found = def; - } - } - return found; - } + ItemDefinition resolveGlobalItemDefinition(QName elementQName, PrismContainerDefinition containerDefinition) throws SchemaException; + ItemDefinition resolveGlobalItemDefinition(QName elementQName, @Nullable ComplexTypeDefinition containerCTD) throws SchemaException; - public PrismObject instantiate(Class compileTimeClass) throws SchemaException { - PrismObjectDefinition objDef = findObjectDefinitionByCompileTimeClass(compileTimeClass); - if (objDef == null) { - throw new SchemaException("No definition for compile time class "+compileTimeClass); - } - return objDef.instantiate(); - } + @Deprecated // use methods from PrismContext + PrismObject instantiate(Class compileTimeClass) throws SchemaException; } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistryImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistryImpl.java new file mode 100644 index 00000000000..e009332100a --- /dev/null +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistryImpl.java @@ -0,0 +1,1122 @@ +/* + * Copyright (c) 2010-2015 Evolveum + * + * 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 com.evolveum.midpoint.prism.schema; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.net.URL; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + +import javax.xml.XMLConstants; +import javax.xml.namespace.QName; +import javax.xml.transform.Source; +import javax.xml.validation.SchemaFactory; + +import com.evolveum.midpoint.prism.*; + +import com.evolveum.midpoint.util.QNameUtil; +import com.evolveum.prism.xml.ns._public.types_3.ObjectType; +import org.apache.commons.lang.StringUtils; +import org.apache.xml.resolver.Catalog; +import org.apache.xml.resolver.CatalogManager; +import org.apache.xml.resolver.tools.CatalogResolver; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.springframework.beans.factory.annotation.Autowired; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.xml.sax.EntityResolver; +import org.xml.sax.SAXException; +import org.xml.sax.SAXParseException; + +import com.evolveum.midpoint.prism.delta.ObjectDelta; +import com.evolveum.midpoint.prism.path.ItemPath; +import com.evolveum.midpoint.prism.xml.DynamicNamespacePrefixMapper; +import com.evolveum.midpoint.util.ClassPathUtil; +import com.evolveum.midpoint.util.DOMUtil; +import com.evolveum.midpoint.util.DebugDumpable; +import com.evolveum.midpoint.util.DebugUtil; +import com.evolveum.midpoint.util.JAXBUtil; +import com.evolveum.midpoint.util.exception.SchemaException; +import com.evolveum.midpoint.util.logging.Trace; +import com.evolveum.midpoint.util.logging.TraceManager; + +/** + * Registry and resolver of schema files and resources. + * + * + * @author Radovan Semancik + * + */ +public class SchemaRegistryImpl implements DebugDumpable, SchemaRegistry { + + private static final QName DEFAULT_XSD_TYPE = DOMUtil.XSD_STRING; + + private static final String DEFAULT_RUNTIME_CATALOG_RESOURCE = "META-INF/catalog-runtime.xml"; + + private File[] catalogFiles; // overrides catalog resource name + private String catalogResourceName = DEFAULT_RUNTIME_CATALOG_RESOURCE; + + private javax.xml.validation.SchemaFactory schemaFactory; + private javax.xml.validation.Schema javaxSchema; + private EntityResolver builtinSchemaResolver; + final private List schemaDescriptions = new ArrayList<>(); + final private Map parsedSchemas = new HashMap<>(); + final private Map extensionSchemas = new HashMap<>(); + private boolean initialized = false; + private DynamicNamespacePrefixMapper namespacePrefixMapper; + private String defaultNamespace; + + private XmlEntityResolver entityResolver = new XmlEntityResolverImpl(this); + + @Autowired // TODO does this work? + private PrismContext prismContext; + + private static final Trace LOGGER = TraceManager.getTrace(SchemaRegistry.class); + + @Override + public DynamicNamespacePrefixMapper getNamespacePrefixMapper() { + return namespacePrefixMapper; + } + + public void setNamespacePrefixMapper(DynamicNamespacePrefixMapper namespacePrefixMapper) { + this.namespacePrefixMapper = namespacePrefixMapper; + } + + @Override + public PrismContext getPrismContext() { + return prismContext; + } + + public void setPrismContext(PrismContext prismContext) { + this.prismContext = prismContext; + } + + public XmlEntityResolver getEntityResolver() { + return entityResolver; + } + + public Map getParsedSchemas() { + return parsedSchemas; + } + + public EntityResolver getBuiltinSchemaResolver() { + return builtinSchemaResolver; + } +// +// public File[] getCatalogFiles() { +// return catalogFiles; +// } +// +// public void setCatalogFiles(File[] catalogFiles) { +// this.catalogFiles = catalogFiles; +// } +// +// public String getCatalogResourceName() { +// return catalogResourceName; +// } +// + public void setCatalogResourceName(String catalogResourceName) { + this.catalogResourceName = catalogResourceName; + } + + @Override + public String getDefaultNamespace() { + return defaultNamespace; + } + + public void setDefaultNamespace(String defaultNamespace) { + this.defaultNamespace = defaultNamespace; + } + + //region Registering resources and initialization + /** + * Must be called before call to initialize() + */ + public void registerSchemaResource(String resourcePath, String usualPrefix) throws SchemaException { + SchemaDescription desc = SchemaDescription.parseResource(resourcePath); + desc.setUsualPrefix(usualPrefix); + registerSchemaDescription(desc); + } + + /** + * Must be called before call to initialize() + */ + public void registerPrismSchemaResource(String resourcePath, String usualPrefix) throws SchemaException { + SchemaDescription desc = SchemaDescription.parseResource(resourcePath); + desc.setUsualPrefix(usualPrefix); + desc.setPrismSchema(true); + registerSchemaDescription(desc); + } + + public void registerPrismSchemasFromWsdlResource(String resourcePath, List compileTimeClassesPackages) throws SchemaException { + List descriptions = SchemaDescription.parseWsdlResource(resourcePath); + Iterator pkgIterator = null; + if (compileTimeClassesPackages != null) { + if (descriptions.size() != compileTimeClassesPackages.size()) { + throw new SchemaException("Mismatch between the size of compileTimeClassesPackages ("+compileTimeClassesPackages.size() + +" and schemas in "+resourcePath+" ("+descriptions.size()+")"); + } + pkgIterator = compileTimeClassesPackages.iterator(); + } + for (SchemaDescription desc : descriptions) { + desc.setPrismSchema(true); + if (pkgIterator != null) { + desc.setCompileTimeClassesPackage(pkgIterator.next()); + } + registerSchemaDescription(desc); + } + } + + /** + * Must be called before call to initialize() + */ + public void registerPrismSchemaResource(String resourcePath, String usualPrefix, Package compileTimeClassesPackage) throws SchemaException { + registerPrismSchemaResource(resourcePath, usualPrefix, compileTimeClassesPackage, false, false); + } + + /** + * Must be called before call to initialize() + */ + public void registerPrismSchemaResource(String resourcePath, String usualPrefix, Package compileTimeClassesPackage, boolean prefixDeclaredByDefault) throws SchemaException { + registerPrismSchemaResource(resourcePath, usualPrefix, compileTimeClassesPackage, false, prefixDeclaredByDefault); + } + + /** + * Must be called before call to initialize() + */ + public void registerPrismDefaultSchemaResource(String resourcePath, String usualPrefix, Package compileTimeClassesPackage) throws SchemaException { + registerPrismSchemaResource(resourcePath, usualPrefix, compileTimeClassesPackage, true, true); + } + + /** + * Must be called before call to initialize() + * + * @param prefixDeclaredByDefault Whether this prefix will be declared in top element in all XML serializations (MID-2198) + */ + public void registerPrismSchemaResource(String resourcePath, String usualPrefix, Package compileTimeClassesPackage, + boolean defaultSchema, boolean prefixDeclaredByDefault) throws SchemaException { + SchemaDescription desc = SchemaDescription.parseResource(resourcePath); + desc.setUsualPrefix(usualPrefix); + desc.setPrismSchema(true); + desc.setDefault(defaultSchema); + desc.setDeclaredByDefault(prefixDeclaredByDefault); + desc.setCompileTimeClassesPackage(compileTimeClassesPackage); + registerSchemaDescription(desc); + } + + /** + * Must be called before call to initialize() + * @param node + */ + public void registerSchema(Node node, String sourceDescription) throws SchemaException { + SchemaDescription desc = SchemaDescription.parseNode(node, sourceDescription); + registerSchemaDescription(desc); + } + + /** + * Must be called before call to initialize() + * @param node + */ + public void registerSchema(Node node, String sourceDescription, String usualPrefix) throws SchemaException { + SchemaDescription desc = SchemaDescription.parseNode(node, sourceDescription); + desc.setUsualPrefix(usualPrefix); + registerSchemaDescription(desc); + } + + public void registerPrismSchemaFile(File file) throws FileNotFoundException, SchemaException { + loadPrismSchemaFileDescription(file); + } + + public SchemaDescription loadPrismSchemaFileDescription(File file) throws FileNotFoundException, SchemaException { + if (!(file.getName().matches(".*\\.xsd$"))){ + LOGGER.trace("Skipping registering {}, because it is not schema definition.", file.getAbsolutePath()); + return null; + } + SchemaDescription desc = SchemaDescription.parseFile(file); + desc.setPrismSchema(true); + registerSchemaDescription(desc); + return desc; + } + + private void registerSchemaDescription(SchemaDescription desc) { + if (desc.getUsualPrefix() != null) { + namespacePrefixMapper.registerPrefix(desc.getNamespace(), desc.getUsualPrefix(), desc.isDefault()); + if (desc.isDeclaredByDefault()) { + namespacePrefixMapper.addDeclaredByDefault(desc.getUsualPrefix()); + } + } + parsedSchemas.put(desc.getNamespace(), desc); + schemaDescriptions.add(desc); + } + + public void registerPrismSchemasFromDirectory(File directory) throws FileNotFoundException, SchemaException { + File[] fileArray = directory.listFiles(); + if (fileArray != null) { + List files = Arrays.asList(fileArray); + // Sort the filenames so we have deterministic order of loading + // This is useful in tests but may come handy also during customization + Collections.sort(files); + for (File file: files) { + if (file.getName().startsWith(".")) { + // skip dotfiles. this will skip SVN data and similar things + continue; + } + if (file.isDirectory()) { + registerPrismSchemasFromDirectory(file); + } + if (file.isFile()) { + registerPrismSchemaFile(file); + } + } + } + } + + /** + * This can be used to read additional schemas even after the registry was initialized. + */ + public void loadPrismSchemasFromDirectory(File directory) throws FileNotFoundException, SchemaException { + List files = Arrays.asList(directory.listFiles()); + // Sort the filenames so we have deterministic order of loading + // This is useful in tests but may come handy also during customization + Collections.sort(files); + for (File file: files) { + if (file.getName().startsWith(".")) { + // skip dotfiles. this will skip SVN data and similar things + continue; + } + if (file.isDirectory()) { + loadPrismSchemasFromDirectory(file); + } + if (file.isFile()) { + loadPrismSchemaFile(file); + } + } + } + + public void loadPrismSchemaFile(File file) throws FileNotFoundException, SchemaException { + SchemaDescription desc = loadPrismSchemaFileDescription(file); + parsePrismSchema(desc); + } + + public void loadPrismSchemaResource(String resourcePath) throws SchemaException { + SchemaDescription desc = SchemaDescription.parseResource(resourcePath); + desc.setPrismSchema(true); + registerSchemaDescription(desc); + parsePrismSchema(desc); + } + + /** + * This can be used to read additional schemas even after the registry was initialized. + */ + @Override + public void initialize() throws SAXException, IOException, SchemaException { + if (prismContext == null) { + throw new IllegalStateException("Prism context not set"); + } + if (namespacePrefixMapper == null) { + throw new IllegalStateException("Namespace prefix mapper not set"); + } + try { + initResolver(); + parsePrismSchemas(); + parseJavaxSchema(); + compileCompileTimeClassList(); + initialized = true; + + } catch (SAXException ex) { + if (ex instanceof SAXParseException) { + SAXParseException sex = (SAXParseException)ex; + throw new SchemaException("Error parsing schema "+sex.getSystemId()+" line "+sex.getLineNumber()+": "+sex.getMessage(), sex); + } + throw ex; + } + } + + private void parseJavaxSchema() throws SAXException, IOException { + schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); + Source[] sources = new Source[schemaDescriptions.size()]; + int i = 0; + for (SchemaDescription schemaDescription : schemaDescriptions) { + Source source = schemaDescription.getSource(); + sources[i] = source; + i++; + } + schemaFactory.setResourceResolver(entityResolver); + javaxSchema = schemaFactory.newSchema(sources); + } + + private void parsePrismSchemas() throws SchemaException { + for (SchemaDescription schemaDescription : schemaDescriptions) { + if (schemaDescription.isPrismSchema()) { + parsePrismSchema(schemaDescription); + } + } + applySchemaExtensions(); + } + + private void parsePrismSchema(SchemaDescription schemaDescription) throws SchemaException { + String namespace = schemaDescription.getNamespace(); + + Element domElement = schemaDescription.getDomElement(); + boolean isRuntime = schemaDescription.getCompileTimeClassesPackage() == null; +// System.out.println("Parsing schema " + schemaDescription.getNamespace()); + LOGGER.trace("Parsing schema {}, namespace: {}, isRuntime: {}", + schemaDescription.getSourceDescription(), namespace, isRuntime); + PrismSchema schema = PrismSchemaImpl.parse(domElement, entityResolver, isRuntime, schemaDescription.getSourceDescription(), getPrismContext()); + if (StringUtils.isEmpty(namespace)) { + namespace = schema.getNamespace(); + } + LOGGER.trace("Parsed schema {}, namespace: {}, isRuntime: {}", + schemaDescription.getSourceDescription(), namespace, isRuntime); + schemaDescription.setSchema(schema); + detectExtensionSchema(schema); + } + + private void detectExtensionSchema(PrismSchema schema) throws SchemaException { + for (ComplexTypeDefinition def: schema.getDefinitions(ComplexTypeDefinition.class)) { + QName extType = def.getExtensionForType(); + if (extType != null) { + if (extensionSchemas.containsKey(extType)) { + ComplexTypeDefinition existingExtension = extensionSchemas.get(extType); + existingExtension.merge(def); +// throw new SchemaException("Duplicate definition of extension for type "+extType+": "+def+" and "+extensionSchemas.get(extType)); + } else { + extensionSchemas.put(extType, def.clone()); + } + } + } + } + + private void applySchemaExtensions() throws SchemaException { + for (Entry entry: extensionSchemas.entrySet()) { + QName typeQName = entry.getKey(); + ComplexTypeDefinition extensionCtd = entry.getValue(); + ComplexTypeDefinition primaryCtd = findComplexTypeDefinition(typeQName); + PrismContainerDefinition extensionContainer = primaryCtd.findContainerDefinition( + new QName(primaryCtd.getTypeName().getNamespaceURI(), PrismConstants.EXTENSION_LOCAL_NAME)); + if (extensionContainer == null) { + throw new SchemaException("Attempt to extend type "+typeQName+" with "+extensionCtd.getTypeClass()+" but the original type does not have extension container"); + } + ((PrismContainerDefinitionImpl) extensionContainer).setComplexTypeDefinition(extensionCtd.clone()); + ((PrismContainerDefinitionImpl) extensionContainer).setTypeName(extensionCtd.getTypeName()); + } + } + + private void compileCompileTimeClassList() { + for (SchemaDescription schemaDescription : schemaDescriptions) { + Package pkg = schemaDescription.getCompileTimeClassesPackage(); + if (pkg != null) { + Map> map = createXsdTypeMap(pkg); + schemaDescription.setXsdTypeTocompileTimeClassMap(map); + } + } + } + + private void initResolver() throws IOException { + CatalogManager catalogManager = new CatalogManager(); + catalogManager.setUseStaticCatalog(true); + catalogManager.setIgnoreMissingProperties(true); + catalogManager.setVerbosity(1); + catalogManager.setPreferPublic(true); + CatalogResolver catalogResolver = new CatalogResolver(catalogManager); + Catalog catalog = catalogResolver.getCatalog(); + + if (catalogFiles != null && catalogFiles.length > 0) { + for (File catalogFile : catalogFiles) { + LOGGER.trace("Using catalog file {}", catalogFile); + catalog.parseCatalog(catalogFile.getPath()); + } + } else if (catalogResourceName != null) { + LOGGER.trace("Using catalog from resource: {}", catalogResourceName); + Enumeration catalogs = Thread.currentThread().getContextClassLoader().getResources(catalogResourceName); + while (catalogs.hasMoreElements()) { + URL catalogResourceUrl = catalogs.nextElement(); + LOGGER.trace("Parsing catalog from URL: {}", catalogResourceUrl); + catalog.parseCatalog(catalogResourceUrl); + } + } else { + throw new IllegalStateException("Catalog is not defined"); + } + + builtinSchemaResolver = catalogResolver; + } + //endregion + + //region Schemas and type maps (TODO) + @Override + public javax.xml.validation.Schema getJavaxSchema() { + return javaxSchema; + } + + @Override + public Collection getCompileTimePackages() { + Collection compileTimePackages = new ArrayList(schemaDescriptions.size()); + for (SchemaDescription desc : schemaDescriptions) { + if (desc.getCompileTimeClassesPackage() != null) { + compileTimePackages.add(desc.getCompileTimeClassesPackage()); + } + } + return compileTimePackages; + } + + private Map> createXsdTypeMap(Package pkg) { + Map> map = new HashMap>(); + for (Class clazz: ClassPathUtil.listClasses(pkg)) { + QName typeName = JAXBUtil.getTypeQName(clazz); + if (typeName != null) { + map.put(typeName, clazz); + } + } + return map; + } + + private SchemaDescription lookupSchemaDescription(String namespace) { + for (SchemaDescription desc : schemaDescriptions) { + if (namespace.equals(desc.getNamespace())) { + return desc; + } + } + return null; + } + //endregion + + + + + @Override + public String debugDump() { + return debugDump(0); + } + + @Override + public String debugDump(int indent) { + StringBuilder sb = new StringBuilder(); + DebugUtil.indentDebugDump(sb, indent); + sb.append("SchemaRegistry:"); + sb.append(" Parsed Schemas:"); + for (String namespace: parsedSchemas.keySet()) { + sb.append("\n"); + DebugUtil.indentDebugDump(sb, indent + 1); + sb.append(namespace); + sb.append(": "); + sb.append(parsedSchemas.get(namespace)); + } + return sb.toString(); + } + + //region applyDefinition(..) methods + @Override + public void applyDefinition(PrismObject prismObject, Class type) throws SchemaException { + applyDefinition(prismObject, type, true); + } + + @Override + public void applyDefinition(PrismObject prismObject, Class compileTimeClass, boolean force) throws SchemaException { + PrismObjectDefinition objectDefinition = determineDefinitionFromClass(compileTimeClass); + prismObject.applyDefinition(objectDefinition, force); + } + + @Override + public void applyDefinition(ObjectDelta objectDelta, Class compileTimeClass, boolean force) throws SchemaException { + PrismObjectDefinition objectDefinition = determineDefinitionFromClass(compileTimeClass); + objectDelta.applyDefinition(objectDefinition, force); + } + + @Override + public void applyDefinition(PrismContainerValue prismContainerValue, + Class compileTimeClass, ItemPath path, boolean force) throws SchemaException { + PrismObjectDefinition objectDefinition = determineDefinitionFromClass(compileTimeClass); + PrismContainerDefinition containerDefinition = objectDefinition.findContainerDefinition(path); + prismContainerValue.applyDefinition(containerDefinition, force); + } + + @Override + public void applyDefinition(PrismContainerValue prismContainerValue, QName typeName, + ItemPath path, boolean force) throws SchemaException { + PrismObjectDefinition objectDefinition = findObjectDefinitionByType(typeName); + if (objectDefinition != null) { + PrismContainerDefinition containerDefinition = objectDefinition.findContainerDefinition(path); + prismContainerValue.applyDefinition(containerDefinition, force); + return; + } + PrismContainerDefinition typeDefinition = findContainerDefinitionByType(typeName); + if (typeDefinition != null) { + PrismContainerDefinition containerDefinition = typeDefinition.findContainerDefinition(path); + prismContainerValue.applyDefinition(containerDefinition, force); + return; + } + ComplexTypeDefinition complexTypeDefinition = findComplexTypeDefinition(typeName); + if (complexTypeDefinition != null) { + PrismContainerDefinition containerDefinition = complexTypeDefinition.findContainerDefinition(path); + prismContainerValue.applyDefinition(containerDefinition, force); + return; + } + throw new SchemaException("No definition for container "+path+" in type "+typeName); + } + //endregion + + + + + + + private boolean namespaceMatches(String namespace, @Nullable List ignoredNamespaces) { + if (ignoredNamespaces == null) { + return false; + } + for (String ignored : ignoredNamespaces) { + if (namespace.startsWith(ignored)) { + return true; + } + } + return false; + } + + + + + + + //region Finding items (standard cases - core methods) + +// @Override +// public PrismObjectDefinition findObjectDefinitionByType(@NotNull QName typeName) { +// if (StringUtils.isEmpty(typeName.getNamespaceURI())) { +// // a quick hack (todo do it seriously) +// ComplexTypeDefinition ctd = resolveGlobalTypeDefinitionWithoutNamespace(typeName.getLocalPart()); +// if (ctd == null) { +// return null; +// } +// typeName = ctd.getTypeName(); +// } +// PrismSchema schema = findSchemaByNamespace(typeName.getNamespaceURI()); +// if (schema == null){ +// //TODO: check for confilicted objects +// // Iterator schemaIterator = getSchemas().iterator(); +// // while (schemaIterator.hasNext()){ +// // schema = schemaIterator.next(); +// // if (schema == null){ +// // continue; +// // } +// // PrismObjectDefinition def = schema.findObjectDefinitionByTypeAssumeNs(typeName); +// // if (def != null){ +// // return def; +// // } +// // +// // } +// return null; +// } +// return (PrismObjectDefinition) schema.findObjectDefinitionByType(typeName); +// } +// +// @Override +// public PrismObjectDefinition findObjectDefinitionByElementName(@NotNull QName elementName) { +// if (StringUtils.isEmpty(elementName.getNamespaceURI())) { +// return resolveGlobalItemDefinitionWithoutNamespace(elementName.getLocalPart(), PrismObjectDefinition.class); +// } +// PrismSchema schema = findSchemaByNamespace(elementName.getNamespaceURI()); +// if (schema == null) { +// return null; +// } +// return (PrismObjectDefinition) schema.findObjectDefinitionByElementName(elementName); +// } +// +// @Override +// public PrismContainerDefinition findContainerDefinitionByType(QName typeName) { +// if (StringUtils.isEmpty(typeName.getNamespaceURI())) { +// // Maybe not optimal but sufficient way: we resolve complex type definition, and from it we get qualified type name. +// // This is then used to find container definition in the traditional way. +// ComplexTypeDefinition complexTypeDefinition = resolveGlobalTypeDefinitionWithoutNamespace(typeName.getLocalPart()); +// if (complexTypeDefinition == null) { +// return null; +// } +// typeName = complexTypeDefinition.getTypeName(); +// } +// PrismSchema schema = findSchemaByNamespace(typeName.getNamespaceURI()); +// if (schema == null) { +// return null; +// } +// return schema.findContainerDefinitionByType(typeName); +// } +// +// @Override +// public PrismContainerDefinition findContainerDefinitionByElementName(QName elementName) { +// if (StringUtils.isEmpty(elementName.getNamespaceURI())) { +// return resolveGlobalItemDefinitionWithoutNamespace(elementName.getLocalPart(), PrismContainerDefinition.class); +// } +// PrismSchema schema = findSchemaByNamespace(elementName.getNamespaceURI()); +// if (schema == null) { +// return null; +// } +// return schema.findContainerDefinitionByElementName(elementName); +// } + + + // + @Nullable + @Override + public CD findContainerDefinitionByCompileTimeClass( + @NotNull Class compileTimeClass, @NotNull Class definitionClass) { + PrismSchema schema = findSchemaByCompileTimeClass(compileTimeClass); + if (schema == null) { + return null; + } + return schema.findContainerDefinitionByCompileTimeClass(compileTimeClass, definitionClass); + } + + @Nullable + @Override + public ID findItemDefinitionByType(@NotNull QName typeName, @NotNull Class definitionClass) { + if (QNameUtil.noNamespace(typeName)) { + ComplexTypeDefinition ctd = resolveGlobalTypeDefinitionWithoutNamespace(typeName.getLocalPart()); + if (ctd == null) { + return null; + } + typeName = ctd.getTypeName(); + } + PrismSchema schema = findSchemaByNamespace(typeName.getNamespaceURI()); + if (schema == null) { + return null; + } + return schema.findItemDefinitionByType(typeName, definitionClass); + } + + @Nullable + @Override + public ID findItemDefinitionByElementName(@NotNull QName elementName, @NotNull Class definitionClass) { + if (QNameUtil.noNamespace(elementName)) { + return resolveGlobalItemDefinitionWithoutNamespace(elementName.getLocalPart(), definitionClass); + } else { + PrismSchema schema = findSchemaByNamespace(elementName.getNamespaceURI()); + if (schema == null) { + return null; + } + return schema.findItemDefinitionByElementName(elementName, definitionClass); + } + } + + @Nullable + @Override + public ComplexTypeDefinition findComplexTypeDefinitionByCompileTimeClass(@NotNull Class compileTimeClass) { + PrismSchema schema = findSchemaByCompileTimeClass(compileTimeClass); + if (schema == null) { + return null; + } + return schema.findComplexTypeDefinitionByCompileTimeClass(compileTimeClass); + } + + @Nullable + @Override + public ComplexTypeDefinition findComplexTypeDefinitionByType(@NotNull QName typeName) { + if (QNameUtil.noNamespace(typeName)) { + return resolveGlobalTypeDefinitionWithoutNamespace(typeName.getLocalPart()); + } + PrismSchema schema = findSchemaByNamespace(typeName.getNamespaceURI()); + if (schema == null) { + return null; + } + return schema.findComplexTypeDefinitionByType(typeName); + } + //endregion + + //region Finding items (nonstandard cases) + @Override + public T findItemDefinitionByFullPath(Class objectClass, Class defClass, + QName... itemNames) + throws SchemaException { + PrismObjectDefinition objectDefinition = findObjectDefinitionByCompileTimeClass(objectClass); + if (objectDefinition == null) { + throw new SchemaException("No object definition for " + objectClass); + } + return (T) objectDefinition.findItemDefinition(new ItemPath(itemNames), defClass); + } + + @Override + public ItemDefinition findItemDefinitionByElementName(QName elementName, @Nullable List ignoredNamespaces) { + if (StringUtils.isEmpty(elementName.getNamespaceURI())) { + return resolveGlobalItemDefinitionWithoutNamespace(elementName.getLocalPart(), ItemDefinition.class, true, ignoredNamespaces); + } + PrismSchema schema = findSchemaByNamespace(elementName.getNamespaceURI()); + if (schema == null) { + return null; + } + return schema.findItemDefinitionByElementName(elementName, ItemDefinition.class); + } + + @Override + public Class determineCompileTimeClass(QName typeName) { + if (QNameUtil.noNamespace(typeName)) { + ComplexTypeDefinition ctd = resolveGlobalTypeDefinitionWithoutNamespace(typeName.getLocalPart()); + if (ctd == null) { + return null; + } + return (Class) ctd.getCompileTimeClass(); + } + SchemaDescription desc = findSchemaDescriptionByNamespace(typeName.getNamespaceURI()); + if (desc == null) { + return null; + } + Package pkg = desc.getCompileTimeClassesPackage(); + if (pkg == null) { + return null; + } + return JAXBUtil.findClassForType(typeName, pkg); + } + + @Override + public Class getCompileTimeClass(QName xsdType) { + return determineCompileTimeClass(xsdType); + // TODO: which one is better (this one or the above)? + // SchemaDescription desc = findSchemaDescriptionByNamespace(xsdType.getNamespaceURI()); + // if (desc == null) { + // return null; + // } + // Map> map = desc.getXsdTypeTocompileTimeClassMap(); + // if (map == null) { + // return null; + // } + // return (Class) map.get(xsdType); + } + + @Override + public Class getCompileTimeClassForObjectType(QName objectType) { + PrismObjectDefinition definition = findObjectDefinitionByType(objectType); + if (definition == null) { + return null; + } + return definition.getCompileTimeClass(); + } + + @Override + public PrismObjectDefinition determineDefinitionFromClass(Class compileTimeClass) { + PrismObjectDefinition def = findObjectDefinitionByCompileTimeClass(compileTimeClass); + if (def != null) { + return def; + } + Class superclass = compileTimeClass.getSuperclass(); + if (superclass == Object.class) { + return null; + } + return determineDefinitionFromClass(superclass); + } + + //endregion + + //region Unqualified names resolution + // TODO fix this temporary and inefficient implementation + @Override + public QName resolveUnqualifiedTypeName(QName type) throws SchemaException { + QName typeFound = null; + for (SchemaDescription desc: schemaDescriptions) { + QName typeInSchema = new QName(desc.getNamespace(), type.getLocalPart()); + if (desc.getSchema() != null && desc.getSchema().findComplexTypeDefinition(typeInSchema) != null) { + if (typeFound != null) { + throw new SchemaException("Ambiguous type name: " + type); + } else { + typeFound = typeInSchema; + } + } + } + if (typeFound == null) { + throw new SchemaException("Unknown type: " + type); + } else { + return typeFound; + } + } + + @Override + public QName qualifyTypeName(QName typeName) throws SchemaException { + if (typeName == null || !QNameUtil.isUnqualified(typeName)) { + return typeName; + } + return resolveUnqualifiedTypeName(typeName); + } + + // current implementation tries to find all references to the child CTD and select those that are able to resolve path of 'rest' + // fails on ambiguity + // it's a bit fragile, as adding new references to child CTD in future may break existing code + @Override + public ComplexTypeDefinition determineParentDefinition(@NotNull ComplexTypeDefinition child, @NotNull ItemPath rest) { + ComplexTypeDefinition parent = null; + for (PrismSchema schema : getSchemas()) { + if (schema == null) { + continue; + } + for (ComplexTypeDefinition ctd : schema.getComplexTypeDefinitions()) { + for (ItemDefinition item : ctd.getDefinitions()) { + if (item instanceof PrismContainerDefinition) { + PrismContainerDefinition itemPcd = (PrismContainerDefinition) item; + if (itemPcd.getComplexTypeDefinition() != null) { + if (child.getTypeName().equals(itemPcd.getComplexTypeDefinition().getTypeName())) { + if (!rest.isEmpty() && ctd.findItemDefinition(rest) == null) { + continue; + } + if (parent != null && !parent.getTypeClass().equals(ctd.getTypeName())) { + throw new IllegalStateException("Couldn't find parent definition for " + child.getTypeName() + ": More than one candidate found: " + + parent.getTypeName() + ", " + itemPcd.getTypeName()); + } + parent = ctd; + } + } + } + } + } + } + // ComplexTypeDefinition def = findComplexTypeDefinition(new QName( + // "http://midpoint.evolveum.com/xml/ns/public/common/common-3", + // "ObjectType")); // FIXME BRUTAL HACK + if (parent == null) { + throw new IllegalStateException("Couldn't find definition for parent for " + child.getTypeName() + ", path=" + rest); + } + return parent; + } + + @Override + public PrismObjectDefinition determineReferencedObjectDefinition(QName targetTypeName, ItemPath rest) { + // TEMPORARY HACK -- TODO FIXME + PrismObjectDefinition def = findObjectDefinitionByType(targetTypeName); + if (def == null) { + throw new IllegalStateException("Couldn't find definition for referenced object for " + targetTypeName + ", path=" + rest); + } + return def; + } + + private ComplexTypeDefinition resolveGlobalTypeDefinitionWithoutNamespace(String typeLocalName) { + ComplexTypeDefinition found = null; + for (SchemaDescription schemaDescription : parsedSchemas.values()) { + PrismSchema schema = schemaDescription.getSchema(); + if (schema == null) { // is this possible? + continue; + } + ComplexTypeDefinition def = schema.findComplexTypeDefinition(new QName(schema.getNamespace(), typeLocalName)); + if (def != null) { + if (found != null) { + // TODO change to SchemaException + throw new IllegalArgumentException("Multiple possible resolutions for unqualified type name " + typeLocalName + " (e.g. in " + + def.getTypeName() + " and " + found.getTypeName()); + } + found = def; + } + } + return found; + } + + /** + * Looks for a top-level definition for the specified element name (in all schemas). + */ + @Override + public ItemDefinition resolveGlobalItemDefinition(QName elementQName) throws SchemaException { + return resolveGlobalItemDefinition(elementQName, (ComplexTypeDefinition) null); + } + + @Override + public ItemDefinition resolveGlobalItemDefinition(QName elementQName, PrismContainerDefinition containerDefinition) throws SchemaException { + return resolveGlobalItemDefinition(elementQName, containerDefinition != null ? containerDefinition.getComplexTypeDefinition() : null); + } + + @Override + public ItemDefinition resolveGlobalItemDefinition(QName elementQName, @Nullable ComplexTypeDefinition containerCTD) throws SchemaException { + String elementNamespace = elementQName.getNamespaceURI(); + if (StringUtils.isEmpty(elementNamespace)) { + List ignoredNamespaces = containerCTD != null ? + containerCTD.getIgnoredNamespaces() : + null; + return resolveGlobalItemDefinitionWithoutNamespace(elementQName.getLocalPart(), ItemDefinition.class, true, ignoredNamespaces); + } + PrismSchema schema = findSchemaByNamespace(elementNamespace); + if (schema == null) { + return null; + } + ItemDefinition itemDefinition = schema.findItemDefinitionByElementName(elementQName, ItemDefinition.class); + return itemDefinition; + } + + private T resolveGlobalItemDefinitionWithoutNamespace(String localPart, Class definitionClass) { + return resolveGlobalItemDefinitionWithoutNamespace(localPart, definitionClass, true, null); + } + + private T resolveGlobalItemDefinitionWithoutNamespace(String localPart, Class definitionClass, boolean exceptionIfAmbiguous, @Nullable List ignoredNamespaces) { + ItemDefinition found = null; + for (SchemaDescription schemaDescription : parsedSchemas.values()) { + PrismSchema schema = schemaDescription.getSchema(); + if (schema == null) { // is this possible? + continue; + } + if (namespaceMatches(schema.getNamespace(), ignoredNamespaces)) { + continue; + } + ItemDefinition def = schema.findItemDefinitionByElementName(new QName(localPart), definitionClass); + if (def != null) { + if (found != null) { + // todo change to SchemaException + if (exceptionIfAmbiguous) { + throw new IllegalArgumentException("Multiple possible resolutions for unqualified element name " + localPart + " (e.g. in " + + def.getNamespace() + " and " + found.getNamespace()); + } else { + return null; + } + } + found = def; + } + } + return (T) found; + } + + private QName resolveElementNameIfNeeded(QName elementName) { + return resolveElementNameIfNeeded(elementName, true); + } + + private QName resolveElementNameIfNeeded(QName elementName, boolean exceptionIfAmbiguous) { + if (StringUtils.isNotEmpty(elementName.getNamespaceURI())) { + return elementName; + } + ItemDefinition itemDef = resolveGlobalItemDefinitionWithoutNamespace(elementName.getLocalPart(), ItemDefinition.class, exceptionIfAmbiguous, null); + if (itemDef != null) { + return itemDef.getName(); + } else { + return null; + } + } + + //endregion + + //region Finding schemas + + @Override + public PrismSchema getSchema(String namespace) { + return parsedSchemas.get(namespace).getSchema(); + } + + @Override + public Collection getSchemas() { + Collection schemas = new ArrayList(); + for (Entry entry: parsedSchemas.entrySet()) { + schemas.add(entry.getValue().getSchema()); + } + return schemas; + } + + @Override + public Collection getSchemaDescriptions() { + return parsedSchemas.values(); + } + + + @Override + public PrismSchema findSchemaByCompileTimeClass(Class compileTimeClass) { + Package compileTimePackage = compileTimeClass.getPackage(); + for (SchemaDescription desc: schemaDescriptions) { + if (compileTimePackage.equals(desc.getCompileTimeClassesPackage())) { + PrismSchema schema = desc.getSchema(); + return schema; + } + } + return null; + } + + @Override + public PrismSchema findSchemaByNamespace(String namespaceURI) { + SchemaDescription desc = findSchemaDescriptionByNamespace(namespaceURI); + if (desc == null) { + return null; + } + return desc.getSchema(); + } + + @Override + public SchemaDescription findSchemaDescriptionByNamespace(String namespaceURI) { + for (SchemaDescription desc: schemaDescriptions) { + if (namespaceURI.equals(desc.getNamespace())) { + return desc; + } + } + return null; + } + + @Override + public PrismSchema findSchemaByPrefix(String prefix) { + SchemaDescription desc = findSchemaDescriptionByPrefix(prefix); + if (desc == null) { + return null; + } + return desc.getSchema(); + } + + @Override + public SchemaDescription findSchemaDescriptionByPrefix(String prefix) { + for (SchemaDescription desc: schemaDescriptions) { + if (prefix.equals(desc.getUsualPrefix())) { + return desc; + } + } + return null; + } + + //endregion + + //region Misc + public static ItemDefinition createDefaultItemDefinition(QName itemName, PrismContext prismContext) { + PrismPropertyDefinitionImpl propDef = new PrismPropertyDefinitionImpl(itemName, DEFAULT_XSD_TYPE, prismContext); + // Set it to multi-value to be on the safe side + propDef.setMaxOccurs(-1); + propDef.setDynamic(true); + return propDef; + } + + //endregion + + //region Deprecated misc things + @Override + @Deprecated + public PrismObject instantiate(Class compileTimeClass) throws SchemaException { + return prismContext.createObject(compileTimeClass); + } + //endregion + + //region TODO categorize + /** + * Returns true if specified element has a definition that matches specified type + * in the known schemas. + */ + @Override + public boolean hasImplicitTypeDefinition(QName elementName, QName typeName) { + elementName = resolveElementNameIfNeeded(elementName, false); + if (elementName == null) { + return false; + } + PrismSchema schema = findSchemaByNamespace(elementName.getNamespaceURI()); + if (schema == null) { + return false; + } + ItemDefinition itemDefinition = schema.findItemDefinitionByElementName(elementName, ItemDefinition.class); + if (itemDefinition == null) { + return false; + } + return QNameUtil.match(typeName, itemDefinition.getTypeName()); + } + //endregion +} diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaToDomProcessor.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaToDomProcessor.java index 2419b139b1b..442df10cbb7 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaToDomProcessor.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaToDomProcessor.java @@ -28,6 +28,7 @@ import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; +import org.jetbrains.annotations.NotNull; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; @@ -117,6 +118,7 @@ private boolean isMyNamespace(QName qname) { * @return XSD schema in DOM form * @throws SchemaException error parsing the midPoint schema or converting values */ + @NotNull Document parseSchema(PrismSchema schema) throws SchemaException { if (schema == null) { throw new IllegalArgumentException("Schema can't be null."); @@ -125,7 +127,7 @@ Document parseSchema(PrismSchema schema) throws SchemaException { try { - init(); + init(); // here the document is initialized // Process complex types first. Collection complexTypes = schema.getDefinitions(ComplexTypeDefinition.class); @@ -589,7 +591,7 @@ private void init() throws ParserConfigurationException { if (namespacePrefixMapper == null) { // TODO: clone? - namespacePrefixMapper = prismContext.getSchemaRegistry().getNamespacePrefixMapper(); + namespacePrefixMapper = ((SchemaRegistryImpl) prismContext.getSchemaRegistry()).getNamespacePrefixMapper(); } // We don't want the "tns" prefix to be kept in the mapper diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SearchContexts.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SearchContexts.java new file mode 100644 index 00000000000..f43a063a2de --- /dev/null +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SearchContexts.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.prism.schema; + +import com.evolveum.midpoint.prism.*; + +/** + * @author mederly + */ +class SearchContexts { + +// final DefinitionSearchContextCtdImpl ctd; +// final DefinitionSearchContextItemImpl> id; +// final DefinitionSearchContextItemImpl ppd; +// final DefinitionSearchContextItemImpl prd; +// final DefinitionSearchContextItemImpl> pcd; +// final DefinitionSearchContextItemImpl> pod; +// +// @SuppressWarnings("unchecked") +// public SearchContexts(DefinitionSearchImplementation provider) { +// ctd = new DefinitionSearchContextCtdImpl(provider); +// id = (DefinitionSearchContextItemImpl) new DefinitionSearchContextItemImpl<>(provider, ItemDefinition.class); +// ppd = (DefinitionSearchContextItemImpl) new DefinitionSearchContextItemImpl<>(provider, PrismPropertyDefinition.class); +// prd = new DefinitionSearchContextItemImpl<>(provider, PrismReferenceDefinition.class); +// pcd = (DefinitionSearchContextItemImpl) new DefinitionSearchContextItemImpl<>(provider, PrismContainerDefinition.class); +// pod = (DefinitionSearchContextItemImpl) new DefinitionSearchContextItemImpl<>(provider, PrismObjectDefinition.class); +// } +} diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/XmlEntityResolverImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/XmlEntityResolverImpl.java new file mode 100644 index 00000000000..2e723c4b591 --- /dev/null +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/XmlEntityResolverImpl.java @@ -0,0 +1,255 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.prism.schema; + +import com.evolveum.midpoint.prism.XmlEntityResolver; +import com.evolveum.midpoint.util.logging.Trace; +import com.evolveum.midpoint.util.logging.TraceManager; +import org.w3c.dom.ls.LSInput; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.Reader; + +/** + * @author semancik + * @author mederly + * + * TODO refactor this a bit more + */ +public class XmlEntityResolverImpl implements XmlEntityResolver { + + private static final Trace LOGGER = TraceManager.getTrace(XmlEntityResolverImpl.class); + + private final SchemaRegistryImpl schemaRegistry; + + public XmlEntityResolverImpl(SchemaRegistryImpl schemaRegistry) { + this.schemaRegistry = schemaRegistry; + } + + /* + * Although not sure when resolveEntity and resolveResource is called, general schema is the following: + * 1. For schemas that are imported via xsd:import, we use schemaLocation = namespaceURI, with some exceptions + * (we of course don't modify xsd:imports in standard schemas + for some historic reasons there is a difference + * for 'enc' and 'dsig' schemas: namespaceURI ends with '#', whereas schemaLocation does not) + * 2. For schemas that are included via xsd:include (currently: fragments of common-3 schema), we use + * namespaceURI of the owning schema (e.g. .../common-3), whereas schemaLocation is URI derived from the + * namespace by including the fragment name (e.g. .../common-notifications-3). + * + * XSD parsers (the ones used by xjc and runtime parsing) seem to do the following: + * 1. When encountering xsd:import, they look by publicId = namespaceURI, systemId = schemaLocation OR + * sometimes with publicId = null, systemId = schemaLocation (why?) + * 2. When encountering xsd:include, they look by publicId = null, systemId = schemaLocation + * 3. When encountering XML entity declaration that specifies publicId and systemId, look by them. + * + * See the respective methods. + * + */ + + /* (non-Javadoc) + * @see org.xml.sax.EntityResolver#resolveEntity(java.lang.String, java.lang.String) + */ + @Override + public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException { + LOGGER.trace("--- Resolving entity with publicID: {}, systemID: {}", publicId, systemId); + InputSource inputSource = resolveResourceFromRegisteredSchemas(publicId, systemId); + if (inputSource == null) { + inputSource = resolveResourceUsingBuiltinResolver(null, null, publicId, systemId, null); + } + if (inputSource == null) { + LOGGER.error("Unable to resolve entity with publicID: {}, systemID: {}",new Object[]{publicId, systemId}); + return null; + } + LOGGER.trace("==> Resolved entity with publicID: {}, systemID: {} : {}", publicId, systemId, inputSource); + return inputSource; + } + + /* (non-Javadoc) + * @see org.w3c.dom.ls.LSResourceResolver#resolveResource(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String) + */ + @Override + public LSInput resolveResource(String type, String namespaceURI, String publicId, String systemId, + String baseURI) { + LOGGER.trace("--- Resolving resource of type {}, namespaceURI: {}, publicID: {}, systemID: {}, base URI: {}", type, namespaceURI, publicId, systemId, baseURI); + InputSource inputSource = resolveResourceFromRegisteredSchemas(publicId, systemId); + if (inputSource == null) { + inputSource = resolveResourceUsingBuiltinResolver(type, namespaceURI, publicId, systemId, baseURI); + } + if (inputSource == null) { + LOGGER.error("Unable to resolve resource of type {}, namespaceURI: {}, publicID: {}, systemID: {}, baseURI: {}",new Object[]{type, namespaceURI, publicId, systemId, baseURI}); + return null; + } + LOGGER.trace("==> Resolved resource of type {}, namespaceURI: {}, publicID: {}, systemID: {}, baseURI: {} : {}",new Object[]{type, namespaceURI, publicId, systemId, baseURI, inputSource}); + return new Input(publicId, systemId, inputSource.getByteStream()); + } + + // schema fragments (e.g. common-model-context-3) will be obviously not found by this method + private InputSource resolveResourceFromRegisteredSchemas(String publicId, String systemId) { + InputSource source = resolveResourceFromRegisteredSchemasByNamespace(publicId); + if (source == null) { + // give a chance to systemId - in cases of xsd:import namespaceURI=, schemaLocation= that + // (for some weird reason) result in search with publicId=null, systemId= + source = resolveResourceFromRegisteredSchemasByNamespace(systemId); + } + LOGGER.trace("...... Result of registered schema resolve for publicId: {}, systemId: {}: {}", publicId, systemId, source); + return source; + } + + private InputSource resolveResourceFromRegisteredSchemasByNamespace(String namespaceURI) { + if (namespaceURI != null) { + if (schemaRegistry.getParsedSchemas().containsKey(namespaceURI)) { + SchemaDescription schemaDescription = schemaRegistry.getParsedSchemas().get(namespaceURI); + if (schemaDescription.canInputStream()) { + InputStream inputStream = schemaDescription.openInputStream(); + InputSource source = new InputSource(); + source.setByteStream(inputStream); + //source.setSystemId(schemaDescription.getPath()); + // Make sure that both publicId and systemId are always set to schema namespace + // this helps to avoid double processing of the schemas + source.setSystemId(namespaceURI); + source.setPublicId(namespaceURI); + return source; + } else { + throw new IllegalStateException("Requested resolution of schema "+schemaDescription.getSourceDescription()+" that does not support input stream"); + } + } + } + return null; + } + + public InputSource resolveResourceUsingBuiltinResolver(String type, String namespaceURI, String publicId, String systemId, + String baseURI) { + InputSource inputSource = null; + try { + // we first try to use traditional pair of publicId + systemId + // the use of namespaceUri can be misleading in case of schema fragments: + // e.g. when xsd:including common-model-context-3 the publicId=null, systemId=.../common-model-context-3 but nsUri=.../common-3 + if (inputSource == null) { + inputSource = schemaRegistry.getBuiltinSchemaResolver().resolveEntity(publicId, systemId); + LOGGER.trace("...... Result of using builtin resolver by publicId + systemId: {}", inputSource); + } + // in some weird cases (e.g. when publicId=null, systemId=xml.xsd) we go with namespaceUri (e.g. http://www.w3.org/XML/1998/namespace) + // it's a kind of unfortunate magic here + if (inputSource == null && namespaceURI != null) { + inputSource = schemaRegistry.getBuiltinSchemaResolver().resolveEntity(namespaceURI, systemId); + LOGGER.trace("...... Result of using builtin resolver by namespaceURI + systemId: {}", inputSource); + } + } catch (SAXException e) { + LOGGER.error("XML parser error resolving reference of type {}, namespaceURI: {}, publicID: {}, systemID: {}, baseURI: {}: {}",new Object[]{type, namespaceURI, publicId, systemId, baseURI, e.getMessage(), e}); + // TODO: better error handling + return null; + } catch (IOException e) { + LOGGER.error("IO error resolving reference of type {}, namespaceURI: {}, publicID: {}, systemID: {}, baseURI: {}: {}",new Object[]{type, namespaceURI, publicId, systemId, baseURI, e.getMessage(), e}); + // TODO: better error handling + return null; + } + return inputSource; + } + + class Input implements LSInput { + + private String publicId; + private String systemId; + private final BufferedInputStream inputStream; + + public String getPublicId() { + return publicId; + } + + public void setPublicId(String publicId) { + this.publicId = publicId; + } + + public String getBaseURI() { + return null; + } + + public InputStream getByteStream() { + return null; + } + + public boolean getCertifiedText() { + return false; + } + + public Reader getCharacterStream() { + return null; + } + + public String getEncoding() { + return null; + } + + public String getStringData() { + synchronized (inputStream) { + try { + byte[] input = new byte[inputStream.available()]; + //noinspection ResultOfMethodCallIgnored + inputStream.read(input); + return new String(input); + } catch (IOException e) { + LOGGER.error("IO error creating LSInput for publicID: {}, systemID: {}: {}", publicId, systemId, e.getMessage(), e); + // TODO: better error handling + return null; + } + } + } + + public void setBaseURI(String baseURI) { + } + + public void setByteStream(InputStream byteStream) { + } + + public void setCertifiedText(boolean certifiedText) { + } + + public void setCharacterStream(Reader characterStream) { + } + + public void setEncoding(String encoding) { + } + + public void setStringData(String stringData) { + } + + public String getSystemId() { + return systemId; + } + + public void setSystemId(String systemId) { + this.systemId = systemId; + } + + public BufferedInputStream getInputStream() { + return inputStream; + } + + public Input(String publicId, String sysId, InputStream input) { + this.publicId = publicId; + this.systemId = sysId; + this.inputStream = new BufferedInputStream(input); + } + } + + //endregion + + +} diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/CloneUtil.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/CloneUtil.java index de238aa0203..f5e01755413 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/CloneUtil.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/CloneUtil.java @@ -23,6 +23,7 @@ import java.util.Collection; import java.util.List; +import com.evolveum.midpoint.prism.DefinitionImpl; import com.evolveum.midpoint.prism.xml.XmlTypeConverter; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; @@ -97,8 +98,8 @@ public static T clone(T orig) { if (orig instanceof ItemDelta) { return (T) ((ItemDelta)orig).clone(); } - if (orig instanceof Definition) { - return (T) ((Definition)orig).clone(); + if (orig instanceof DefinitionImpl) { + return (T) ((DefinitionImpl)orig).clone(); } /* * In some environments we cannot clone XMLGregorianCalendar because of this: diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/JaxbTestUtil.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/JaxbTestUtil.java index 26fccf68ba0..70b8b7aa7fc 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/JaxbTestUtil.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/JaxbTestUtil.java @@ -39,6 +39,7 @@ import com.evolveum.midpoint.prism.PrismContainer; import com.evolveum.midpoint.prism.PrismContainerDefinition; +import com.evolveum.midpoint.prism.schema.SchemaRegistryImpl; import org.apache.commons.io.IOUtils; import org.apache.commons.lang.Validate; import org.w3c.dom.Document; @@ -220,7 +221,7 @@ private Marshaller createMarshaller(Map jaxbProperties) throws J // set default properties marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8"); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); - DynamicNamespacePrefixMapper namespacePrefixMapper = getSchemaRegistry().getNamespacePrefixMapper().clone(); + DynamicNamespacePrefixMapper namespacePrefixMapper = ((SchemaRegistryImpl) getSchemaRegistry()).getNamespacePrefixMapper().clone(); namespacePrefixMapper.setAlwaysExplicit(true); marshaller.setProperty("com.sun.xml.bind.namespacePrefixMapper", namespacePrefixMapper); // set custom properties @@ -521,7 +522,7 @@ private PrismContainer unmarshalSingleValueContaine // this is a bit tricky - we have to create a container and put the newly obtained value into it PrismContainerValue containerValue = value.asPrismContainerValue(); containerValue.revive(prismContext); - PrismContainerDefinition definition = prismContext.getSchemaRegistry().findContainerDefinitionByElementName(element.getName()); + PrismContainerDefinition definition = prismContext.getSchemaRegistry().findContainerDefinitionByElementName(element.getName()); if (definition == null) { throw new IllegalStateException("There's no container definition for element name " + element.getName()); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xjc/AnyArrayList.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xjc/AnyArrayList.java index 9dd83b1657d..482170bd1c4 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xjc/AnyArrayList.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xjc/AnyArrayList.java @@ -28,7 +28,6 @@ import com.evolveum.midpoint.prism.PrismContainer; import com.evolveum.midpoint.prism.PrismContainerDefinition; import com.evolveum.midpoint.prism.PrismContainerValue; -import com.evolveum.midpoint.prism.PrismContainerable; import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismValue; import com.evolveum.midpoint.util.JAXBUtil; @@ -56,10 +55,7 @@ public AnyArrayList(PrismContainerValue containerValue) { @Override public int size() { if (isSchemaless()) { - if (containerValue.getRawElements() == null) { - return 0; - } - return containerValue.getRawElements().size(); + throw new UnsupportedOperationException("Definition-less containers are not supported any more."); } else { // Each item and each value are presented as one list entry // (multi-valued items are represented as multiple occurrences of the same element) @@ -77,7 +73,7 @@ public int size() { @Override public Object get(int index) { if (isSchemaless()) { - return containerValue.getRawElements().get(index); + throw new UnsupportedOperationException("Definition-less containers are not supported any more."); } else { if (containerValue != null) { for (Item item : containerValue.getItems()) { @@ -131,7 +127,7 @@ public void add(int i, Object element) { @Override public Object remove(int index) { if (isSchemaless()) { - return containerValue.getRawElements().remove(index); + throw new UnsupportedOperationException("Definition-less containers are not supported any more."); } else { for (Item item: containerValue.getItems()) { if (index < item.getValues().size()) { @@ -171,16 +167,8 @@ public boolean removeAll(Collection objects) { return changed; } - private PrismContainerDefinition getDefinition() { - PrismContainerable parent = containerValue.getParent(); - if (parent == null) { - return null; - } - return parent.getDefinition(); - } - private boolean isSchemaless() { - return getDefinition() == null; + return containerValue.getComplexTypeDefinition() == null; } private PrismContainer getContainer() { diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xjc/PrismContainerArrayList.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xjc/PrismContainerArrayList.java index 12c3ea0bf68..57a2d961085 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xjc/PrismContainerArrayList.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xjc/PrismContainerArrayList.java @@ -16,10 +16,7 @@ package com.evolveum.midpoint.prism.xjc; -import com.evolveum.midpoint.prism.Containerable; -import com.evolveum.midpoint.prism.PrismContainer; -import com.evolveum.midpoint.prism.PrismContainerDefinition; -import com.evolveum.midpoint.prism.PrismContainerValue; +import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.util.exception.SystemException; @@ -54,10 +51,10 @@ public PrismContainerArrayList(PrismContainer container) { protected abstract PrismContainerValue getValueFrom(T t); protected T createItemInternal(PrismContainerValue value) { - PrismContainerDefinition concreteDef = value.getConcreteTypeDefinition(); + ComplexTypeDefinition concreteDef = value.getComplexTypeDefinition(); if (concreteDef != null && - !(container.getCompileTimeClass() != null && - container.getCompileTimeClass().equals(concreteDef.getCompileTimeClass()))) { + (container.getCompileTimeClass() == null || + !container.getCompileTimeClass().equals(concreteDef.getCompileTimeClass()))) { // the dynamic definition exists and the compile time class is different from the one at the container level // ("different" here means it is a subclass) // so we have to instantiate dynamically diff --git a/infra/prism/src/test/java/com/evolveum/midpoint/prism/PrismInternalTestUtil.java b/infra/prism/src/test/java/com/evolveum/midpoint/prism/PrismInternalTestUtil.java index 9d496819ce0..3bf05ee855f 100644 --- a/infra/prism/src/test/java/com/evolveum/midpoint/prism/PrismInternalTestUtil.java +++ b/infra/prism/src/test/java/com/evolveum/midpoint/prism/PrismInternalTestUtil.java @@ -32,6 +32,7 @@ import com.evolveum.midpoint.prism.foo.AccountConstructionType; +import com.evolveum.midpoint.prism.schema.SchemaRegistryImpl; import org.xml.sax.SAXException; import com.evolveum.midpoint.prism.foo.ActivationType; @@ -211,8 +212,8 @@ public class PrismInternalTestUtil implements PrismContextFactory { public static final QName WEAPONS_WEAPON_BRAND_TYPE_QNAME = new QName(NS_WEAPONS, "WeaponBrandType"); - public static PrismContext constructInitializedPrismContext() throws SchemaException, SAXException, IOException { - PrismContext context = constructPrismContext(); + public static PrismContextImpl constructInitializedPrismContext() throws SchemaException, SAXException, IOException { + PrismContextImpl context = constructPrismContext(); context.initialize(); return context; } @@ -223,12 +224,12 @@ public static PrismContext constructInitializedPrismContext(File extraSchema) th return context; } - public static PrismContext constructPrismContext() throws SchemaException, FileNotFoundException { + public static PrismContextImpl constructPrismContext() throws SchemaException, FileNotFoundException { return constructPrismContext(null); } - public static PrismContext constructPrismContext(File extraSchema) throws SchemaException, FileNotFoundException { - SchemaRegistry schemaRegistry = new SchemaRegistry(); + public static PrismContextImpl constructPrismContext(File extraSchema) throws SchemaException, FileNotFoundException { + SchemaRegistryImpl schemaRegistry = new SchemaRegistryImpl(); schemaRegistry.setCatalogResourceName(TEST_CATALOG_RESOURCE_NAME); DynamicNamespacePrefixMapper prefixMapper = new GlobalDynamicNamespacePrefixMapper(); // Set default namespace? @@ -244,8 +245,7 @@ public static PrismContext constructPrismContext(File extraSchema) throws Schema } prefixMapper.registerPrefix(PrismConstants.NS_ANNOTATION, PrismConstants.PREFIX_NS_ANNOTATION, false); prefixMapper.registerPrefix(PrismInternalTestUtil.NS_WEAPONS, PrismInternalTestUtil.NS_WEAPONS_PREFIX, false); - PrismContext context = PrismContextImpl.create(schemaRegistry); - return context; + return PrismContextImpl.create(schemaRegistry); } /* (non-Javadoc) @@ -398,7 +398,7 @@ public static void assertUserJackContent(PrismObject user) throws Sche assertNotNull("Value #1 has no XNode present", value1.getXnode()); RawType value2 = accountConstructionType.getValue().get(1); assertNotNull("Value #2 has no XNode present", value2.getXnode()); - PrismPropertyDefinition value1def = new PrismPropertyDefinition( + PrismPropertyDefinition value1def = new PrismPropertyDefinitionImpl( new QName(NS_FOO, "dummy"), // element name DOMUtil.XSD_STRING, // type name user.getPrismContext()); diff --git a/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestCompare.java b/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestCompare.java index 54c09aa7856..d43bd1e2cd0 100644 --- a/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestCompare.java +++ b/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestCompare.java @@ -276,7 +276,7 @@ public void testEqualsReferenceValuesSchema() throws Exception { PrismContext prismContext = constructInitializedPrismContext(); - PrismReferenceDefinition ref1Def = new PrismReferenceDefinition(REF_QNAME, REF_TYPE_QNAME, prismContext); + PrismReferenceDefinitionImpl ref1Def = new PrismReferenceDefinitionImpl(REF_QNAME, REF_TYPE_QNAME, prismContext); ref1Def.setTargetTypeName(ACCOUNT_TYPE_QNAME); PrismReference ref1 = new PrismReference(REF_QNAME, ref1Def, prismContext); @@ -296,7 +296,7 @@ public void testEqualsReferenceValuesSchema() throws Exception { // No type ref1.add(val14); - PrismReferenceDefinition ref2Def = new PrismReferenceDefinition(REF_QNAME, REF_TYPE_QNAME, prismContext); + PrismReferenceDefinition ref2Def = new PrismReferenceDefinitionImpl(REF_QNAME, REF_TYPE_QNAME, prismContext); // no target type def PrismReference ref2 = new PrismReference(REF_QNAME, ref2Def, prismContext); diff --git a/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestDelta.java b/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestDelta.java index e9bf7343878..11b3198fd61 100644 --- a/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestDelta.java +++ b/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestDelta.java @@ -65,13 +65,13 @@ public void setupDebug() throws SchemaException, SAXException, IOException { public void testDeltaPaths() throws Exception { System.out.println("\n\n===[ testDeltaPaths ]===\n"); - PrismPropertyDefinition descDefinition = new PrismPropertyDefinition<>(UserType.F_DESCRIPTION, + PrismPropertyDefinition descDefinition = new PrismPropertyDefinitionImpl<>(UserType.F_DESCRIPTION, DOMUtil.XSD_STRING, PrismTestUtil.getPrismContext()); PropertyDelta delta1 = new PropertyDelta(descDefinition, PrismTestUtil.getPrismContext()); delta1.addValueToAdd(new PrismPropertyValue("add1")); assertPath(delta1, new ItemPath(UserType.F_DESCRIPTION)); - PrismReferenceDefinition referenceDefinition = new PrismReferenceDefinition(UserType.F_PARENT_ORG_REF, + PrismReferenceDefinitionImpl referenceDefinition = new PrismReferenceDefinitionImpl(UserType.F_PARENT_ORG_REF, OBJECT_REFERENCE_TYPE_QNAME, PrismTestUtil.getPrismContext()); ReferenceDelta delta2 = new ReferenceDelta(referenceDefinition, PrismTestUtil.getPrismContext()); delta2.addValueToAdd(new PrismReferenceValue("oid1")); @@ -93,7 +93,7 @@ public void testDeltaPaths() throws Exception { ItemDelta assDelta2 = assObjDelta2.getModifications().iterator().next(); assertPath(assDelta2, new ItemPath(UserType.F_ASSIGNMENT)); - PrismPropertyDefinition assDescDefinition = new PrismPropertyDefinition<>(AssignmentType.F_DESCRIPTION, + PrismPropertyDefinition assDescDefinition = new PrismPropertyDefinitionImpl<>(AssignmentType.F_DESCRIPTION, DOMUtil.XSD_STRING, PrismTestUtil.getPrismContext()); ItemPath itemPathAssDescNoId = new ItemPath(UserType.F_ASSIGNMENT, AssignmentType.F_DESCRIPTION); PropertyDelta propDelta2 = new PropertyDelta(itemPathAssDescNoId, descDefinition, PrismTestUtil.getPrismContext()); @@ -117,7 +117,7 @@ public void testPropertyDeltaMerge01() throws Exception { System.out.println("\n\n===[ testPropertyDeltaMerge01 ]===\n"); // GIVEN - PrismPropertyDefinition propertyDefinition = new PrismPropertyDefinition(UserType.F_DESCRIPTION, + PrismPropertyDefinition propertyDefinition = new PrismPropertyDefinitionImpl(UserType.F_DESCRIPTION, DOMUtil.XSD_STRING, PrismTestUtil.getPrismContext()); PropertyDelta delta1 = new PropertyDelta(propertyDefinition, PrismTestUtil.getPrismContext()); @@ -143,7 +143,7 @@ public void testPropertyDeltaMerge02() throws Exception { System.out.println("\n\n===[ testPropertyDeltaMerge02 ]===\n"); // GIVEN - PrismPropertyDefinition propertyDefinition = new PrismPropertyDefinition(UserType.F_DESCRIPTION, + PrismPropertyDefinition propertyDefinition = new PrismPropertyDefinitionImpl(UserType.F_DESCRIPTION, DOMUtil.XSD_STRING, PrismTestUtil.getPrismContext()); PropertyDelta delta1 = new PropertyDelta(propertyDefinition, PrismTestUtil.getPrismContext()); @@ -169,7 +169,7 @@ public void testPropertyDeltaMerge03() throws Exception { System.out.println("\n\n===[ testPropertyDeltaMerge03 ]===\n"); // GIVEN - PrismPropertyDefinition propertyDefinition = new PrismPropertyDefinition(UserType.F_DESCRIPTION, + PrismPropertyDefinition propertyDefinition = new PrismPropertyDefinitionImpl(UserType.F_DESCRIPTION, DOMUtil.XSD_STRING, PrismTestUtil.getPrismContext()); PropertyDelta delta1 = new PropertyDelta(propertyDefinition, PrismTestUtil.getPrismContext()); @@ -197,7 +197,7 @@ public void testPropertyDeltaMerge04() throws Exception { System.out.println("\n\n===[ testPropertyDeltaMerge04 ]===\n"); // GIVEN - PrismPropertyDefinition propertyDefinition = new PrismPropertyDefinition(UserType.F_DESCRIPTION, + PrismPropertyDefinition propertyDefinition = new PrismPropertyDefinitionImpl(UserType.F_DESCRIPTION, DOMUtil.XSD_STRING, PrismTestUtil.getPrismContext()); PropertyDelta delta1 = new PropertyDelta(propertyDefinition, PrismTestUtil.getPrismContext()); @@ -225,7 +225,7 @@ public void testPropertyDeltaMerge05() throws Exception { System.out.println("\n\n===[ testPropertyDeltaMerge05 ]===\n"); // GIVEN - PrismPropertyDefinition propertyDefinition = new PrismPropertyDefinition(UserType.F_DESCRIPTION, + PrismPropertyDefinition propertyDefinition = new PrismPropertyDefinitionImpl(UserType.F_DESCRIPTION, DOMUtil.XSD_STRING, PrismTestUtil.getPrismContext()); PropertyDelta delta1 = new PropertyDelta(propertyDefinition, PrismTestUtil.getPrismContext()); @@ -252,7 +252,7 @@ public void testPropertyDeltaMerge06() throws Exception { System.out.println("\n\n===[ testPropertyDeltaMerge06 ]===\n"); // GIVEN - PrismPropertyDefinition propertyDefinition = new PrismPropertyDefinition(UserType.F_DESCRIPTION, + PrismPropertyDefinition propertyDefinition = new PrismPropertyDefinitionImpl(UserType.F_DESCRIPTION, DOMUtil.XSD_STRING, PrismTestUtil.getPrismContext()); PropertyDelta delta1 = new PropertyDelta(propertyDefinition, PrismTestUtil.getPrismContext()); @@ -279,7 +279,7 @@ public void testPropertyDeltaMerge10() throws Exception { System.out.println("\n\n===[ testPropertyDeltaMerge10 ]===\n"); // GIVEN - PrismPropertyDefinition propertyDefinition = new PrismPropertyDefinition(UserType.F_DESCRIPTION, + PrismPropertyDefinition propertyDefinition = new PrismPropertyDefinitionImpl(UserType.F_DESCRIPTION, DOMUtil.XSD_STRING, PrismTestUtil.getPrismContext()); PropertyDelta delta1 = new PropertyDelta(propertyDefinition, PrismTestUtil.getPrismContext()); @@ -305,7 +305,7 @@ public void testPropertyDeltaMerge11() throws Exception { System.out.println("\n\n===[ testPropertyDeltaMerge11 ]===\n"); // GIVEN - PrismPropertyDefinition propertyDefinition = new PrismPropertyDefinition(UserType.F_DESCRIPTION, + PrismPropertyDefinition propertyDefinition = new PrismPropertyDefinitionImpl(UserType.F_DESCRIPTION, DOMUtil.XSD_STRING, PrismTestUtil.getPrismContext()); PropertyDelta delta1 = new PropertyDelta(propertyDefinition, PrismTestUtil.getPrismContext()); @@ -332,7 +332,7 @@ public void testPropertyDeltaMerge12() throws Exception { System.out.println("\n\n===[ testPropertyDeltaMerge12 ]===\n"); // GIVEN - PrismPropertyDefinition propertyDefinition = new PrismPropertyDefinition(UserType.F_DESCRIPTION, + PrismPropertyDefinition propertyDefinition = new PrismPropertyDefinitionImpl(UserType.F_DESCRIPTION, DOMUtil.XSD_STRING, PrismTestUtil.getPrismContext()); PropertyDelta delta1 = new PropertyDelta(propertyDefinition, PrismTestUtil.getPrismContext()); @@ -359,7 +359,7 @@ public void testPropertyDeltaMerge13() throws Exception { System.out.println("\n\n===[ testPropertyDeltaMerge13 ]===\n"); // GIVEN - PrismPropertyDefinition propertyDefinition = new PrismPropertyDefinition(UserType.F_DESCRIPTION, + PrismPropertyDefinition propertyDefinition = new PrismPropertyDefinitionImpl(UserType.F_DESCRIPTION, DOMUtil.XSD_STRING, PrismTestUtil.getPrismContext()); PropertyDelta delta1 = new PropertyDelta(propertyDefinition, PrismTestUtil.getPrismContext()); @@ -385,7 +385,7 @@ public void testPropertyDeltaMerge20() throws Exception { System.out.println("\n\n===[ testPropertyDeltaMerge20 ]===\n"); // GIVEN - PrismPropertyDefinition propertyDefinition = new PrismPropertyDefinition(UserType.F_DESCRIPTION, + PrismPropertyDefinition propertyDefinition = new PrismPropertyDefinitionImpl(UserType.F_DESCRIPTION, DOMUtil.XSD_STRING, PrismTestUtil.getPrismContext()); PropertyDelta delta1 = new PropertyDelta(propertyDefinition, PrismTestUtil.getPrismContext()); @@ -412,7 +412,7 @@ public void testPropertyDeltaSwallow01() throws Exception { System.out.println("\n\n===[ testPropertyDeltaSwallow01 ]===\n"); // GIVEN - PrismPropertyDefinition propertyDefinition = new PrismPropertyDefinition(UserType.F_DESCRIPTION, + PrismPropertyDefinition propertyDefinition = new PrismPropertyDefinitionImpl(UserType.F_DESCRIPTION, DOMUtil.XSD_STRING, PrismTestUtil.getPrismContext()); PropertyDelta delta1 = new PropertyDelta(propertyDefinition, PrismTestUtil.getPrismContext()); @@ -443,7 +443,7 @@ public void testSummarize01() throws Exception { System.out.println("\n\n===[ testSummarize01 ]===\n"); // GIVEN - PrismPropertyDefinition propertyDefinition = new PrismPropertyDefinition(UserType.F_DESCRIPTION, + PrismPropertyDefinition propertyDefinition = new PrismPropertyDefinitionImpl(UserType.F_DESCRIPTION, DOMUtil.XSD_STRING, PrismTestUtil.getPrismContext()); PropertyDelta delta1 = new PropertyDelta(propertyDefinition, PrismTestUtil.getPrismContext()); @@ -477,7 +477,7 @@ public void testSummarize02() throws Exception { System.out.println("\n\n===[ testSummarize02 ]===\n"); // GIVEN - PrismPropertyDefinition propertyDefinition = new PrismPropertyDefinition(UserType.F_DESCRIPTION, + PrismPropertyDefinition propertyDefinition = new PrismPropertyDefinitionImpl(UserType.F_DESCRIPTION, DOMUtil.XSD_STRING, PrismTestUtil.getPrismContext()); PropertyDelta delta1 = new PropertyDelta(propertyDefinition, PrismTestUtil.getPrismContext()); @@ -511,7 +511,7 @@ public void testSummarize05() throws Exception { System.out.println("\n\n===[ testSummarize05 ]===\n"); // GIVEN - PrismPropertyDefinition propertyDefinition = new PrismPropertyDefinition(UserType.F_DESCRIPTION, + PrismPropertyDefinition propertyDefinition = new PrismPropertyDefinitionImpl(UserType.F_DESCRIPTION, DOMUtil.XSD_STRING, PrismTestUtil.getPrismContext()); PropertyDelta delta1 = new PropertyDelta(propertyDefinition, PrismTestUtil.getPrismContext()); @@ -547,7 +547,7 @@ public void testSummarize06() throws Exception { System.out.println("\n\n===[ testSummarize06 ]===\n"); // GIVEN - PrismReferenceDefinition referenceDefinition = new PrismReferenceDefinition(UserType.F_PARENT_ORG_REF, + PrismReferenceDefinition referenceDefinition = new PrismReferenceDefinitionImpl(UserType.F_PARENT_ORG_REF, OBJECT_REFERENCE_TYPE_QNAME, PrismTestUtil.getPrismContext()); ReferenceDelta delta1 = new ReferenceDelta(referenceDefinition, PrismTestUtil.getPrismContext()); @@ -1455,7 +1455,7 @@ public void testPropertyDeltaNarrow01() throws Exception { System.out.println("\n\n===[ testPropertyDeltaNarrow01 ]===\n"); // GIVEN - PrismPropertyDefinition propertyDefinition = new PrismPropertyDefinition(UserType.F_DESCRIPTION, + PrismPropertyDefinition propertyDefinition = new PrismPropertyDefinitionImpl(UserType.F_DESCRIPTION, DOMUtil.XSD_STRING, PrismTestUtil.getPrismContext()); PropertyDelta delta = new PropertyDelta(propertyDefinition, PrismTestUtil.getPrismContext()); @@ -1481,7 +1481,7 @@ public void testPropertyDeltaNarrow02() throws Exception { System.out.println("\n\n===[ testPropertyDeltaNarrow02 ]===\n"); // GIVEN - PrismPropertyDefinition propertyDefinition = new PrismPropertyDefinition(UserType.F_DESCRIPTION, + PrismPropertyDefinition propertyDefinition = new PrismPropertyDefinitionImpl(UserType.F_DESCRIPTION, DOMUtil.XSD_STRING, PrismTestUtil.getPrismContext()); PropertyDelta delta = new PropertyDelta(propertyDefinition, PrismTestUtil.getPrismContext()); @@ -1508,7 +1508,7 @@ public void testPropertyDeltaNarrow03() throws Exception { System.out.println("\n\n===[ testPropertyDeltaNarrow03 ]===\n"); // GIVEN - PrismPropertyDefinition propertyDefinition = new PrismPropertyDefinition(UserType.F_DESCRIPTION, + PrismPropertyDefinition propertyDefinition = new PrismPropertyDefinitionImpl(UserType.F_DESCRIPTION, DOMUtil.XSD_STRING, PrismTestUtil.getPrismContext()); PropertyDelta delta = new PropertyDelta(propertyDefinition, PrismTestUtil.getPrismContext()); diff --git a/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestExtraSchema.java b/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestExtraSchema.java index a550a5effec..8a93067a48f 100644 --- a/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestExtraSchema.java +++ b/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestExtraSchema.java @@ -35,6 +35,7 @@ import javax.xml.validation.Schema; import javax.xml.validation.Validator; +import com.evolveum.midpoint.prism.schema.SchemaRegistryImpl; import org.testng.annotations.Test; import org.w3c.dom.Document; import org.xml.sax.SAXException; @@ -67,7 +68,7 @@ public void testExtraSchema() throws SAXException, IOException, SchemaException Document dataDoc = DOMUtil.parseFile(new File(COMMON_DIR_PATH, "root-foo.xml")); PrismContext context = constructPrismContext(); - SchemaRegistry reg = context.getSchemaRegistry(); + SchemaRegistryImpl reg = (SchemaRegistryImpl) context.getSchemaRegistry(); Document extraSchemaDoc = DOMUtil.parseFile(new File(EXTRA_SCHEMA_DIR, "root.xsd")); reg.registerSchema(extraSchemaDoc, "file root.xsd"); reg.initialize(); @@ -90,7 +91,7 @@ public void testUserExtensionSchemaLoad() throws SAXException, IOException, Sche System.out.println("===[ testUserExtensionSchemaLoad ]==="); PrismContext context = constructPrismContext(); - SchemaRegistry reg = context.getSchemaRegistry(); + SchemaRegistryImpl reg = (SchemaRegistryImpl) context.getSchemaRegistry(); reg.registerPrismSchemasFromDirectory(EXTRA_SCHEMA_DIR); context.initialize(); System.out.println("Initialized registry"); @@ -118,7 +119,7 @@ public void testUserExtensionSchemaParseUser() throws SAXException, IOException, Document dataDoc = DOMUtil.parseFile(USER_JACK_FILE_XML); PrismContext context = constructPrismContext(); - SchemaRegistry reg = context.getSchemaRegistry(); + SchemaRegistryImpl reg = (SchemaRegistryImpl) context.getSchemaRegistry(); reg.registerPrismSchemasFromDirectory(EXTRA_SCHEMA_DIR); context.initialize(); @@ -147,7 +148,7 @@ public void testUserExtensionSchemaSchemaRegistry() throws SAXException, IOExcep System.out.println("===[ testUserExtensionSchemaAsObjectSchema ]==="); PrismContext context = constructPrismContext(); - SchemaRegistry reg = context.getSchemaRegistry(); + SchemaRegistryImpl reg = (SchemaRegistryImpl) context.getSchemaRegistry(); reg.registerPrismSchemasFromDirectory(EXTRA_SCHEMA_DIR); context.initialize(); @@ -219,7 +220,7 @@ public void testTypeOverride() throws SAXException, IOException, SchemaException System.out.println("===[ testTypeOverride ]==="); PrismContext context = constructPrismContext(); - SchemaRegistry reg = context.getSchemaRegistry(); + SchemaRegistryImpl reg = (SchemaRegistryImpl) context.getSchemaRegistry(); reg.registerPrismSchemasFromDirectory(EXTRA_SCHEMA_DIR); context.initialize(); diff --git a/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestPrismContext.java b/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestPrismContext.java index 13560727de7..d8dfb2beedc 100644 --- a/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestPrismContext.java +++ b/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestPrismContext.java @@ -67,7 +67,7 @@ public void testPrefixMapper() throws SchemaException, SAXException, IOException System.out.println("===[ testPrefixMapper ]==="); // WHEN - PrismContext prismContext = constructInitializedPrismContext(); + PrismContextImpl prismContext = constructInitializedPrismContext(); // THEN assertNotNull("No prism context", prismContext); diff --git a/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestPrismObjectConstruction.java b/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestPrismObjectConstruction.java index 987b8c36c40..0738dc44462 100644 --- a/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestPrismObjectConstruction.java +++ b/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestPrismObjectConstruction.java @@ -86,7 +86,7 @@ public void testConstructionWithSchema() throws Exception { * Construct object without schema. Starts by creating object "out of the blue" and * the working downwards. */ - @Test + @Test(enabled = false) // definition-less containers are no longer supported public void testDefinitionlessConstruction() throws Exception { final String TEST_NAME = "testDefinitionlessConstruction"; PrismInternalTestUtil.displayTestTitle(TEST_NAME); @@ -344,7 +344,7 @@ private void serializeAndValidate(PrismObject user, PrismContext prism Document xmlDocument = DOMUtil.parseDocument(xmlString); Schema javaxSchema = prismContext.getSchemaRegistry().getJavaxSchema(); Validator validator = javaxSchema.newValidator(); - validator.setResourceResolver(prismContext.getSchemaRegistry()); + validator.setResourceResolver(prismContext.getEntityResolver()); validator.validate(new DOMSource(xmlDocument)); } diff --git a/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestPrismParsingXml.java b/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestPrismParsingXml.java index fd43e4b1b11..202d39a9f94 100644 --- a/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestPrismParsingXml.java +++ b/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestPrismParsingXml.java @@ -81,10 +81,10 @@ public void testPrismParseDomAdhoc() throws Exception { @Override protected void validateXml(String xmlString, PrismContext prismContext) throws SAXException, IOException { - Document xmlDocument = DOMUtil.parseDocument(xmlString); - Schema javaxSchema = prismContext.getSchemaRegistry().getJavaxSchema(); - Validator validator = javaxSchema.newValidator(); - validator.setResourceResolver(prismContext.getSchemaRegistry()); - validator.validate(new DOMSource(xmlDocument)); +// Document xmlDocument = DOMUtil.parseDocument(xmlString); +// Schema javaxSchema = prismContext.getSchemaRegistry().getJavaxSchema(); +// Validator validator = javaxSchema.newValidator(); +// validator.setResourceResolver(prismContext.getEntityResolver()); +// validator.validate(new DOMSource(xmlDocument)); } } diff --git a/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestPrismSchemaConstruction.java b/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestPrismSchemaConstruction.java index b0f3813ff9c..37cb6da4350 100644 --- a/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestPrismSchemaConstruction.java +++ b/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestPrismSchemaConstruction.java @@ -24,19 +24,16 @@ import java.io.IOException; import java.util.Collection; import java.util.Iterator; -import java.util.List; -import java.util.Set; import javax.xml.namespace.QName; +import com.evolveum.midpoint.prism.schema.PrismSchemaImpl; import org.testng.annotations.BeforeSuite; import org.testng.annotations.Test; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.xml.sax.SAXException; -import com.evolveum.midpoint.prism.foo.ObjectFactory; -import com.evolveum.midpoint.prism.foo.UserType; import com.evolveum.midpoint.prism.schema.PrismSchema; import com.evolveum.midpoint.prism.util.PrismAsserts; import com.evolveum.midpoint.util.DOMUtil; @@ -133,22 +130,22 @@ private void schemaRoundtrip(PrismContext ctx) throws SchemaException, SAXExcept assertPrefix(PrismConstants.PREFIX_NS_ANNOTATION, displayNameElement); // re-parse - PrismSchema reparsedSchema = PrismSchema.parse(xsdElement, true, "serialized schema", ctx); + PrismSchema reparsedSchema = PrismSchemaImpl.parse(xsdElement, true, "serialized schema", ctx); System.out.println("Re-parsed schema"); System.out.println(reparsedSchema.debugDump()); assertSchema(reparsedSchema); } private PrismSchema constructSchema(PrismContext prismContext) { - PrismSchema schema = new PrismSchema(NS_MY_SCHEMA, prismContext); + PrismSchemaImpl schema = new PrismSchemaImpl(NS_MY_SCHEMA, prismContext); - ComplexTypeDefinition weaponTypeDef = schema.createComplexTypeDefinition(WEAPON_TYPE_QNAME); - PrismPropertyDefinition kindPropertyDef = weaponTypeDef.createPropertyDefinifion(WEAPON_KIND_QNAME, DOMUtil.XSD_STRING); + ComplexTypeDefinitionImpl weaponTypeDef = (ComplexTypeDefinitionImpl) schema.createComplexTypeDefinition(WEAPON_TYPE_QNAME); + PrismPropertyDefinitionImpl kindPropertyDef = weaponTypeDef.createPropertyDefinition(WEAPON_KIND_QNAME, DOMUtil.XSD_STRING); kindPropertyDef.setDisplayName("Weapon kind"); weaponTypeDef.createPropertyDefinition(WEAPON_BRAND_LOCAL_NAME, PrismInternalTestUtil.WEAPONS_WEAPON_BRAND_TYPE_QNAME); weaponTypeDef.createPropertyDefinition(WEAPON_PASSWORD_LOCAL_NAME, PrismInternalTestUtil.DUMMY_PROTECTED_STRING_TYPE); weaponTypeDef.createPropertyDefinition(WEAPON_BLADE_LOCAL_NAME, PrismInternalTestUtil.EXTENSION_BLADE_TYPE_QNAME); - PrismPropertyDefinition createTimestampPropertyDef = weaponTypeDef.createPropertyDefinifion(WEAPON_CREATE_TIMESTAMP_QNAME, DOMUtil.XSD_DATETIME); + PrismPropertyDefinitionImpl createTimestampPropertyDef = weaponTypeDef.createPropertyDefinition(WEAPON_CREATE_TIMESTAMP_QNAME, DOMUtil.XSD_DATETIME); createTimestampPropertyDef.setDisplayName("Create timestamp"); createTimestampPropertyDef.setOperational(true); diff --git a/infra/prism/src/test/java/com/evolveum/midpoint/prism/lex/TestDomParser.java b/infra/prism/src/test/java/com/evolveum/midpoint/prism/lex/TestDomParser.java index 245c8ca57d5..66aa45885e8 100644 --- a/infra/prism/src/test/java/com/evolveum/midpoint/prism/lex/TestDomParser.java +++ b/infra/prism/src/test/java/com/evolveum/midpoint/prism/lex/TestDomParser.java @@ -93,11 +93,11 @@ public void testParseUserToXNode() throws Exception { } private void validateSchemaCompliance(String xmlString, PrismContext prismContext) throws SAXException, IOException { - Document xmlDocument = DOMUtil.parseDocument(xmlString); - Schema javaxSchema = prismContext.getSchemaRegistry().getJavaxSchema(); - Validator validator = javaxSchema.newValidator(); - validator.setResourceResolver(prismContext.getSchemaRegistry()); - validator.validate(new DOMSource(xmlDocument)); +// Document xmlDocument = DOMUtil.parseDocument(xmlString); +// Schema javaxSchema = prismContext.getSchemaRegistry().getJavaxSchema(); +// Validator validator = javaxSchema.newValidator(); +// validator.setResourceResolver(prismContext.getEntityResolver()); +// validator.validate(new DOMSource(xmlDocument)); } @Override diff --git a/infra/prism/src/test/resources/schema-extra/extension/user.xsd b/infra/prism/src/test/resources/schema-extra/extension/user.xsd index aec29a80a55..e1e800ef176 100644 --- a/infra/prism/src/test/resources/schema-extra/extension/user.xsd +++ b/infra/prism/src/test/resources/schema-extra/extension/user.xsd @@ -48,6 +48,14 @@ + + + + + + + + diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/MidPointPrismContextFactory.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/MidPointPrismContextFactory.java index 80846f85d0c..61b787bd9c8 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/MidPointPrismContextFactory.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/MidPointPrismContextFactory.java @@ -23,6 +23,7 @@ import java.util.Arrays; import com.evolveum.midpoint.prism.PrismContextImpl; +import com.evolveum.midpoint.prism.schema.SchemaRegistryImpl; import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.internals.InternalMonitor; import com.evolveum.midpoint.schema.internals.InternalsConfig; @@ -61,7 +62,7 @@ public MidPointPrismContextFactory(File extraSchemaDir) { @Override public PrismContext createPrismContext() throws SchemaException, FileNotFoundException { - SchemaRegistry schemaRegistry = createSchemaRegistry(); + SchemaRegistryImpl schemaRegistry = createSchemaRegistry(); PrismContextImpl context = PrismContextImpl.create(schemaRegistry); context.setDefinitionFactory(createDefinitionFactory()); @@ -73,7 +74,7 @@ public PrismContext createPrismContext() throws SchemaException, FileNotFoundExc } public PrismContext createEmptyPrismContext() throws SchemaException, FileNotFoundException { - SchemaRegistry schemaRegistry = createSchemaRegistry(); + SchemaRegistryImpl schemaRegistry = createSchemaRegistry(); PrismContextImpl context = PrismContextImpl.createEmptyContext(schemaRegistry); context.setDefinitionFactory(createDefinitionFactory()); return context; @@ -89,8 +90,8 @@ public PrismContext createInitializedPrismContext() throws SchemaException, SAXE return context; } - private SchemaRegistry createSchemaRegistry() throws SchemaException, FileNotFoundException { - SchemaRegistry schemaRegistry = new SchemaRegistry(); + private SchemaRegistryImpl createSchemaRegistry() throws SchemaException, FileNotFoundException { + SchemaRegistryImpl schemaRegistry = new SchemaRegistryImpl(); schemaRegistry.setDefaultNamespace(SchemaConstantsGenerated.NS_COMMON); schemaRegistry.setNamespacePrefixMapper(new GlobalDynamicNamespacePrefixMapper()); registerBuiltinSchemas(schemaRegistry); @@ -98,13 +99,13 @@ private SchemaRegistry createSchemaRegistry() throws SchemaException, FileNotFou return schemaRegistry; } - protected void registerExtensionSchemas(SchemaRegistry schemaRegistry) throws SchemaException, FileNotFoundException { + protected void registerExtensionSchemas(SchemaRegistryImpl schemaRegistry) throws SchemaException, FileNotFoundException { if (extraSchemaDir != null && extraSchemaDir.exists()) { schemaRegistry.registerPrismSchemasFromDirectory(extraSchemaDir); } } - private void registerBuiltinSchemas(SchemaRegistry schemaRegistry) throws SchemaException { + private void registerBuiltinSchemas(SchemaRegistryImpl schemaRegistry) throws SchemaException { // Note: the order of schema registration may affect the way how the schema files are located // (whether are pulled from the registry or by using a catalog file). diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ConnectorSchema.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ConnectorSchema.java index 420d9d65683..68d0bb5e4e4 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ConnectorSchema.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ConnectorSchema.java @@ -1,11 +1,11 @@ /* - * Copyright (c) 2010-2014 Evolveum + * Copyright (c) 2010-2016 Evolveum * * 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 + * 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, @@ -13,120 +13,32 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package com.evolveum.midpoint.schema.processor; -import com.evolveum.midpoint.prism.ComplexTypeDefinition; -import com.evolveum.midpoint.prism.PrismContainerValue; -import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.PrismProperty; import com.evolveum.midpoint.prism.schema.PrismSchema; -import com.evolveum.midpoint.schema.constants.SchemaConstants; -import com.evolveum.midpoint.schema.util.MiscSchemaUtil; -import com.evolveum.midpoint.util.exception.SchemaException; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ConnectorType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ExtensionType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowKindType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; - -import org.w3c.dom.Element; +import org.jetbrains.annotations.NotNull; import javax.xml.namespace.QName; - import java.util.Collection; /** - * @author semancik * @author mederly - * */ -public class ConnectorSchema extends PrismSchema { - - private String usualNamespacePrefix; - - protected ConnectorSchema(PrismContext prismContext) { - super(prismContext); - } - - public ConnectorSchema(String namespace, PrismContext prismContext) { - super(namespace, prismContext); - } - - public static ConnectorSchema parse(Element element, String shortDesc, PrismContext prismContext) throws SchemaException { - // TODO: make sure correct parser plugins are used - return (ConnectorSchema) PrismSchema.parse(element, new ConnectorSchema(prismContext), true, shortDesc, prismContext); - } - - public static String retrieveUsualNamespacePrefix(ConnectorType connectorType) { - if (connectorType.getExtension() != null) { - PrismContainerValue ext = connectorType.getExtension().asPrismContainerValue(); - PrismProperty prefixProp = ext.findProperty(SchemaConstants.ICF_CONNECTOR_USUAL_NAMESPACE_PREFIX); - if (prefixProp != null) { - return prefixProp.getRealValue(); - } - } - return null; - } +public interface ConnectorSchema extends PrismSchema { - public Collection getObjectClassDefinitions() { - return getDefinitions(ObjectClassComplexTypeDefinition.class); - } - - /** - * Creates a new resource object definition and adds it to the schema. - * - * This is a preferred way how to create definition in the schema. - * - * @param localTypeName - * type name "relative" to schema namespace - * @return new resource object definition - */ - public ObjectClassComplexTypeDefinition createObjectClassDefinition(String localTypeName) { - QName typeName = new QName(getNamespace(), localTypeName); - return createObjectClassDefinition(typeName); - } + Collection getObjectClassDefinitions(); - /** - * Creates a new resource object definition and adds it to the schema. - * - * This is a preferred way how to create definition in the schema. - * - * @param localTypeName - * type QName - * @return new resource object definition - */ - public ObjectClassComplexTypeDefinition createObjectClassDefinition(QName typeName) { - ObjectClassComplexTypeDefinition cTypeDef = new ObjectClassComplexTypeDefinition(typeName, getPrismContext()); - add(cTypeDef); - return cTypeDef; - } - - public ObjectClassComplexTypeDefinition findObjectClassDefinition(ShadowType shadow) { + default ObjectClassComplexTypeDefinition findObjectClassDefinition(@NotNull ShadowType shadow) { return findObjectClassDefinition(shadow.getObjectClass()); } - - public ObjectClassComplexTypeDefinition findObjectClassDefinition(String localName) { + + default ObjectClassComplexTypeDefinition findObjectClassDefinition(@NotNull String localName) { return findObjectClassDefinition(new QName(getNamespace(), localName)); } - - public ObjectClassComplexTypeDefinition findObjectClassDefinition(QName qName) { - ComplexTypeDefinition complexTypeDefinition = findComplexTypeDefinition(qName); - if (complexTypeDefinition == null) { - return null; - } - if (complexTypeDefinition instanceof ObjectClassComplexTypeDefinition) { - return (ObjectClassComplexTypeDefinition)complexTypeDefinition; - } else { - throw new IllegalStateException("Expected the definition "+qName+" to be of type "+ - ObjectClassComplexTypeDefinition.class+" but it was "+complexTypeDefinition.getClass()); - } - } - - public void setUsualNamespacePrefix(String usualNamespacePrefix) { - this.usualNamespacePrefix = usualNamespacePrefix; - } + ObjectClassComplexTypeDefinition findObjectClassDefinition(QName qName); - public String getUsualNamespacePrefix() { - return usualNamespacePrefix; - } + String getUsualNamespacePrefix(); } diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ConnectorSchemaImpl.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ConnectorSchemaImpl.java new file mode 100644 index 00000000000..c42eeac767f --- /dev/null +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ConnectorSchemaImpl.java @@ -0,0 +1,129 @@ +/* + * Copyright (c) 2010-2014 Evolveum + * + * 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 com.evolveum.midpoint.schema.processor; + +import com.evolveum.midpoint.prism.ComplexTypeDefinition; +import com.evolveum.midpoint.prism.PrismContainerValue; +import com.evolveum.midpoint.prism.PrismContext; +import com.evolveum.midpoint.prism.PrismProperty; +import com.evolveum.midpoint.prism.schema.PrismSchema; +import com.evolveum.midpoint.prism.schema.PrismSchemaImpl; +import com.evolveum.midpoint.schema.constants.SchemaConstants; +import com.evolveum.midpoint.schema.util.MiscSchemaUtil; +import com.evolveum.midpoint.util.exception.SchemaException; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ConnectorType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ExtensionType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowKindType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; + +import org.w3c.dom.Element; + +import javax.xml.namespace.QName; + +import java.util.Collection; + +/** + * @author semancik + * @author mederly + * + */ +public class ConnectorSchemaImpl extends PrismSchemaImpl implements ConnectorSchema { + + private String usualNamespacePrefix; + + protected ConnectorSchemaImpl(PrismContext prismContext) { + super(prismContext); + } + + public ConnectorSchemaImpl(String namespace, PrismContext prismContext) { + super(namespace, prismContext); + } + + public static ConnectorSchemaImpl parse(Element element, String shortDesc, PrismContext prismContext) throws SchemaException { + // TODO: make sure correct parser plugins are used + return (ConnectorSchemaImpl) PrismSchemaImpl.parse(element, new ConnectorSchemaImpl(prismContext), true, shortDesc, prismContext); + } + + public static String retrieveUsualNamespacePrefix(ConnectorType connectorType) { + if (connectorType.getExtension() != null) { + PrismContainerValue ext = connectorType.getExtension().asPrismContainerValue(); + PrismProperty prefixProp = ext.findProperty(SchemaConstants.ICF_CONNECTOR_USUAL_NAMESPACE_PREFIX); + if (prefixProp != null) { + return prefixProp.getRealValue(); + } + } + return null; + } + + @Override + public Collection getObjectClassDefinitions() { + return getDefinitions(ObjectClassComplexTypeDefinition.class); + } + +// /** +// * Creates a new resource object definition and adds it to the schema. +// * +// * This is a preferred way how to create definition in the schema. +// * +// * @param localTypeName +// * type name "relative" to schema namespace +// * @return new resource object definition +// */ +// public ObjectClassComplexTypeDefinition createObjectClassDefinition(String localTypeName) { +// QName typeName = new QName(getNamespace(), localTypeName); +// return createObjectClassDefinition(typeName); +// } + +// /** +// * Creates a new resource object definition and adds it to the schema. +// * +// * This is a preferred way how to create definition in the schema. +// * +// * @param typeName +// * type QName +// * @return new resource object definition +// */ +// public ObjectClassComplexTypeDefinition createObjectClassDefinition(QName typeName) { +// ObjectClassComplexTypeDefinition cTypeDef = new ObjectClassComplexTypeDefinitionImpl(typeName, getPrismContext()); +// add(cTypeDef); +// return cTypeDef; +// } + + + @Override + public ObjectClassComplexTypeDefinition findObjectClassDefinition(QName qName) { + ComplexTypeDefinition complexTypeDefinition = findComplexTypeDefinition(qName); + if (complexTypeDefinition == null) { + return null; + } + if (complexTypeDefinition instanceof ObjectClassComplexTypeDefinition) { + return (ObjectClassComplexTypeDefinition)complexTypeDefinition; + } else { + throw new IllegalStateException("Expected the definition "+qName+" to be of type "+ + ObjectClassComplexTypeDefinition.class+" but it was "+complexTypeDefinition.getClass()); + } + } + + + public void setUsualNamespacePrefix(String usualNamespacePrefix) { + this.usualNamespacePrefix = usualNamespacePrefix; + } + + @Override + public String getUsualNamespacePrefix() { + return usualNamespacePrefix; + } +} diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/MidPointSchemaDefinitionFactory.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/MidPointSchemaDefinitionFactory.java index caa61952652..cbe3533eeae 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/MidPointSchemaDefinitionFactory.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/MidPointSchemaDefinitionFactory.java @@ -60,7 +60,7 @@ private ComplexTypeDefinition createObjectClassDefinition(XSComplexType complexT PrismContext prismContext, XSAnnotation annotation) throws SchemaException { QName typeName = new QName(complexType.getTargetNamespace(),complexType.getName()); - ObjectClassComplexTypeDefinition ocDef = new ObjectClassComplexTypeDefinition(typeName, prismContext); + ObjectClassComplexTypeDefinitionImpl ocDef = new ObjectClassComplexTypeDefinitionImpl(typeName, prismContext); // nativeObjectClass Element nativeAttrElement = SchemaProcessorUtil.getAnnotationElement(annotation, MidPointConstants.RA_NATIVE_OBJECT_CLASS); @@ -139,11 +139,12 @@ public void finishComplexTypeDefinition(ComplexTypeDefinition complexTypeDefinit PrismContext prismContext, XSAnnotation annotation) throws SchemaException { super.finishComplexTypeDefinition(complexTypeDefinition, complexType, prismContext, annotation); if (complexTypeDefinition instanceof ObjectClassComplexTypeDefinition) { - finishObjectClassDefinition((ObjectClassComplexTypeDefinition)complexTypeDefinition, complexType, prismContext, annotation); + // TODO is this safe? + finishObjectClassDefinition((ObjectClassComplexTypeDefinitionImpl)complexTypeDefinition, complexType, prismContext, annotation); } } - private void finishObjectClassDefinition(ObjectClassComplexTypeDefinition ocDef, + private void finishObjectClassDefinition(ObjectClassComplexTypeDefinitionImpl ocDef, XSComplexType complexType, PrismContext prismContext, XSAnnotation annotation) throws SchemaException { // displayNameAttribute @@ -235,7 +236,7 @@ public PrismContainerDefinition createExtraDefiniti private PrismContainerDefinition createResourceAttributeContainerDefinition(XSComplexType complexType, ObjectClassComplexTypeDefinition complexTypeDefinition, PrismContext prismContext, XSAnnotation annotation) { - ResourceAttributeContainerDefinition attrContDef = new ResourceAttributeContainerDefinition(null, complexTypeDefinition, prismContext); + ResourceAttributeContainerDefinition attrContDef = new ResourceAttributeContainerDefinitionImpl(null, complexTypeDefinition, prismContext); return attrContDef; @@ -265,7 +266,7 @@ public PrismPropertyDefinition createPropertyDefinition(QName elementName private PrismPropertyDefinition createResourceAttributeDefinition(QName elementName, QName typeName, PrismContext prismContext, XSAnnotation annotation) throws SchemaException { - ResourceAttributeDefinition attrDef = new ResourceAttributeDefinition(elementName, typeName, prismContext); + ResourceAttributeDefinitionImpl attrDef = new ResourceAttributeDefinitionImpl(elementName, typeName, prismContext); // nativeAttributeName Element nativeAttrElement = SchemaProcessorUtil.getAnnotationElement(annotation, MidPointConstants.RA_NATIVE_ATTRIBUTE_NAME); diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ObjectClassComplexTypeDefinition.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ObjectClassComplexTypeDefinition.java index c9872f1ed93..0b57dce2462 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ObjectClassComplexTypeDefinition.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ObjectClassComplexTypeDefinition.java @@ -13,492 +13,63 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.evolveum.midpoint.schema.processor; - -import java.util.ArrayList; -import java.util.Collection; -import javax.xml.namespace.QName; +package com.evolveum.midpoint.schema.processor; import com.evolveum.midpoint.prism.ComplexTypeDefinition; -import com.evolveum.midpoint.prism.ItemDefinition; -import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.PrismObject; +import com.evolveum.midpoint.prism.Definition; import com.evolveum.midpoint.prism.query.ObjectQuery; -import com.evolveum.midpoint.schema.util.ObjectQueryUtil; import com.evolveum.midpoint.util.exception.SchemaException; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowKindType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; + +import javax.xml.namespace.QName; +import java.util.Collection; /** - * @author semancik - * + * @author mederly */ -public class ObjectClassComplexTypeDefinition extends ComplexTypeDefinition { - private static final long serialVersionUID = 1L; +public interface ObjectClassComplexTypeDefinition extends ComplexTypeDefinition { + Collection getAttributeDefinitions(); + + Collection getPrimaryIdentifiers(); + + boolean isPrimaryIdentifier(QName attrName); + + Collection getSecondaryIdentifiers(); + + boolean isSecondaryIdentifier(QName attrName); + + Collection getAllIdentifiers(); - private Collection identifiers; - private Collection secondaryIdentifiers; - private ResourceAttributeDefinition descriptionAttribute; - private ResourceAttributeDefinition displayNameAttribute; - private ResourceAttributeDefinition namingAttribute; - private boolean defaultInAKind = false; - private ShadowKindType kind; - private String intent; - private String nativeObjectClass; - private boolean auxiliary; + ResourceAttributeDefinition getDescriptionAttribute(); - public ObjectClassComplexTypeDefinition(QName typeName, PrismContext prismContext) { - super(typeName, prismContext); - } - - public Collection getAttributeDefinitions() { - Collection attrs = new ArrayList(getDefinitions().size()); - for (ItemDefinition def: getDefinitions()) { - if (def instanceof ResourceAttributeDefinition) { - attrs.add((ResourceAttributeDefinition)def); - } - } - return attrs; - } - - /** - * Returns the definition of primary identifier attributes of a resource object. - * - * May return empty set if there are no identifier attributes. Must not - * return null. - * - * The exception should be never thrown unless there is some bug in the - * code. The validation of model consistency should be done at the time of - * schema parsing. - * - * @return definition of identifier attributes - * @throws IllegalStateException - * if there is no definition for the referenced attributed - */ - public Collection getPrimaryIdentifiers() { - if (identifiers == null) { - identifiers = new ArrayList(1); - } - return identifiers; - } - - public boolean isPrimaryIdentifier(QName attrName) { - for (ResourceAttributeDefinition idDef: getPrimaryIdentifiers()) { - if (idDef.getName().equals(attrName)) { - return true; - } - } - return false; - } - - /** - * Returns the definition of secondary identifier attributes of a resource - * object. - * - * May return empty set if there are no secondary identifier attributes. - * Must not return null. - * - * The exception should be never thrown unless there is some bug in the - * code. The validation of model consistency should be done at the time of - * schema parsing. - * - * @return definition of secondary identifier attributes - * @throws IllegalStateException - * if there is no definition for the referenced attributed - */ - public Collection getSecondaryIdentifiers() { - if (secondaryIdentifiers == null) { - secondaryIdentifiers = new ArrayList(1); - } - return secondaryIdentifiers; - } - - public boolean isSecondaryIdentifier(QName attrName) { - for (ResourceAttributeDefinition idDef: getSecondaryIdentifiers()) { - if (idDef.getName().equals(attrName)) { - return true; - } - } - return false; - } - - public Collection getAllIdentifiers() { - Collection allIdentifiers = new ArrayList<>(); - if (identifiers != null) { - allIdentifiers.addAll((Collection)getPrimaryIdentifiers()); - } - if (secondaryIdentifiers != null) { - allIdentifiers.addAll((Collection)getSecondaryIdentifiers()); - } - return allIdentifiers; - } - - /** - * Returns the definition of description attribute of a resource object. - * - * Returns null if there is no description attribute. - * - * The exception should be never thrown unless there is some bug in the - * code. The validation of model consistency should be done at the time of - * schema parsing. - * - * @return definition of secondary identifier attributes - * @throws IllegalStateException - * if there is more than one description attribute. But this - * should never happen. - * @throws IllegalStateException - * if there is no definition for the referenced attributed - */ - public ResourceAttributeDefinition getDescriptionAttribute() { - return descriptionAttribute; - } + ResourceAttributeDefinition getNamingAttribute(); - public void setDescriptionAttribute(ResourceAttributeDefinition descriptionAttribute) { - this.descriptionAttribute = descriptionAttribute; - } - - /** - * Specifies which resource attribute should be used as a "technical" name - * for the account. This name will appear in log files and other troubleshooting - * tools. The name should be a form of unique identifier that can be used to - * locate the resource object for diagnostics. It should not contain white chars and - * special chars if that can be avoided and it should be reasonable short. - - * It is different from a display name attribute. Display name is intended for a - * common user or non-technical administrator (such as role administrator). The - * naming attribute is intended for technical IDM administrators and developers. - * - * @return resource attribute definition that should be used as a "technical" name - * for the account. - */ - public ResourceAttributeDefinition getNamingAttribute() { - return namingAttribute; - } + String getNativeObjectClass(); - public void setNamingAttribute(ResourceAttributeDefinition namingAttribute) { - this.namingAttribute = namingAttribute; - } - - public void setNamingAttribute(QName namingAttribute) { - setNamingAttribute(findAttributeDefinition(namingAttribute)); - } - - /** - * Returns the native object class string for the resource object. - * - * Native object class is the name of the Resource Object Definition (Object - * Class) as it is seen by the resource itself. The name of the Resource - * Object Definition may be constrained by XSD or other syntax and therefore - * may be "mangled" to conform to such syntax. The native object - * class value will contain unmangled name (if available). - * - * Returns null if there is no native object class. - * - * The exception should be never thrown unless there is some bug in the - * code. The validation of model consistency should be done at the time of - * schema parsing. - * - * @return native object class - * @throws IllegalStateException - * if there is more than one description attribute. - */ - public String getNativeObjectClass() { - return nativeObjectClass; - } + boolean isAuxiliary(); - public void setNativeObjectClass(String nativeObjectClass) { - this.nativeObjectClass = nativeObjectClass; - } - - public boolean isAuxiliary() { - return auxiliary; - } + ShadowKindType getKind(); - public void setAuxiliary(boolean auxiliary) { - this.auxiliary = auxiliary; - } + boolean isDefaultInAKind(); - public ShadowKindType getKind() { - return kind; - } + String getIntent(); - public void setKind(ShadowKindType kind) { - this.kind = kind; - } + ResourceAttributeDefinition getDisplayNameAttribute(); - /** - * Indicates whether definition is should be used as default definition in ist kind. - * E.g. if used in an "account" kind it indicates default account definition. - * - * If true value is returned then the definition should be used as a default - * definition for the kind. This is a way how a resource connector may - * suggest applicable object classes (resource object definitions) for - * individual shadow kinds (e.g. accounts). - * - * @return true if the definition should be used as account type. - * @throws IllegalStateException - * if more than one default account is suggested in the schema. - */ - public boolean isDefaultInAKind() { - return defaultInAKind; - } - - public void setDefaultInAKind(boolean defaultAccountType) { - this.defaultInAKind = defaultAccountType; - } - - public String getIntent() { - return intent; - } - - public void setIntent(String intent) { - this.intent = intent; - } - - /** - * Returns the definition of display name attribute. - * - * Display name attribute specifies which resource attribute should be used - * as title when displaying objects of a specific resource object class. It - * must point to an attribute of String type. If not present, primary - * identifier should be used instead (but this method does not handle this - * default behavior). - * - * Returns null if there is no display name attribute. - * - * The exception should be never thrown unless there is some bug in the - * code. The validation of model consistency should be done at the time of - * schema parsing. - * - * @return native object class - * @throws IllegalStateException - * if there is more than one display name attribute or the - * definition of the referenced attribute does not exist. - */ - public ResourceAttributeDefinition getDisplayNameAttribute() { - return displayNameAttribute; - } + ResourceAttributeDefinition findAttributeDefinition(QName name); - public void setDisplayNameAttribute(ResourceAttributeDefinition displayName) { - this.displayNameAttribute = displayName; - } - - /** - * TODO - * - * Convenience method. It will internally look up the correct definition. - * - * @param displayName - */ - public void setDisplayNameAttribute(QName displayName) { - setDisplayNameAttribute(findAttributeDefinition(displayName)); - } - - /** - * Finds a attribute definition by looking at the property name. - *

- * Returns null if nothing is found. - * - * @param name property definition name - * @return found property definition or null - */ - public ResourceAttributeDefinition findAttributeDefinition(QName name) { - return findItemDefinition(name, ResourceAttributeDefinition.class); - } - - public ResourceAttributeDefinition findAttributeDefinition(QName name, boolean caseInsensitive) { - return findItemDefinition(name, ResourceAttributeDefinition.class, caseInsensitive); - } - - public ResourceAttributeDefinition findAttributeDefinition(String name) { - QName qname = new QName(getTypeName().getNamespaceURI(), name); - return findAttributeDefinition(qname); - } - - public ResourceAttributeDefinition createAttributeDefinition(QName name, QName typeName) { - ResourceAttributeDefinition propDef = new ResourceAttributeDefinition(name, typeName, prismContext); - addDefinition(propDef); - return propDef; - } - - public ResourceAttributeDefinition createAttributeDefinition(String localName, QName typeName) { - QName name = new QName(getSchemaNamespace(),localName); - return createAttributeDefinition(name,typeName); - } + ResourceAttributeDefinition findAttributeDefinition(QName name, boolean caseInsensitive); - - public ResourceAttributeDefinition createAttributeDefinition(String localName, String localTypeName) { - QName name = new QName(getSchemaNamespace(),localName); - QName typeName = new QName(getSchemaNamespace(),localTypeName); - return createAttributeDefinition(name,typeName); - } - - public ResourceAttributeContainerDefinition toResourceAttributeContainerDefinition() { - return toResourceAttributeContainerDefinition(ShadowType.F_ATTRIBUTES); - } - - public ResourceAttributeContainerDefinition toResourceAttributeContainerDefinition(QName elementName) { - return new ResourceAttributeContainerDefinition(elementName, this, getPrismContext()); - } - - public ObjectQuery createShadowSearchQuery(String resourceOid) throws SchemaException { - return ObjectQueryUtil.createResourceAndObjectClassQuery(resourceOid, getTypeName(), prismContext); - } - - /** - * This may not be really "clean" as it actually does two steps instead of one. But it is useful. - */ - public ResourceAttributeContainer instantiate(QName elementName) { - ResourceAttributeContainerDefinition racDef = toResourceAttributeContainerDefinition(elementName); - ResourceAttributeContainer rac = new ResourceAttributeContainer(elementName, racDef, getPrismContext()); - return rac; - } - - public ObjectClassComplexTypeDefinition clone() { - ObjectClassComplexTypeDefinition clone = new ObjectClassComplexTypeDefinition( - getTypeName(), prismContext); - copyDefinitionData(clone); - return clone; - } - - protected void copyDefinitionData(ObjectClassComplexTypeDefinition clone) { - super.copyDefinitionData(clone); - clone.kind = this.kind; - clone.intent = this.intent; - clone.defaultInAKind = this.defaultInAKind; - clone.descriptionAttribute = this.descriptionAttribute; - clone.displayNameAttribute = this.displayNameAttribute; - clone.identifiers = this.identifiers; - clone.namingAttribute = this.namingAttribute; - clone.nativeObjectClass = this.nativeObjectClass; - clone.secondaryIdentifiers = this.secondaryIdentifiers; - clone.auxiliary = this.auxiliary; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = super.hashCode(); - result = prime * result + (auxiliary ? 1231 : 1237); - result = prime * result + (defaultInAKind ? 1231 : 1237); - result = prime * result + ((descriptionAttribute == null) ? 0 : descriptionAttribute.hashCode()); - result = prime * result + ((displayNameAttribute == null) ? 0 : displayNameAttribute.hashCode()); - result = prime * result + ((identifiers == null) ? 0 : identifiers.hashCode()); - result = prime * result + ((intent == null) ? 0 : intent.hashCode()); - result = prime * result + ((kind == null) ? 0 : kind.hashCode()); - result = prime * result + ((namingAttribute == null) ? 0 : namingAttribute.hashCode()); - result = prime * result + ((nativeObjectClass == null) ? 0 : nativeObjectClass.hashCode()); - result = prime * result + ((secondaryIdentifiers == null) ? 0 : secondaryIdentifiers.hashCode()); - return result; - } + ResourceAttributeDefinition findAttributeDefinition(String name); - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (!super.equals(obj)) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - ObjectClassComplexTypeDefinition other = (ObjectClassComplexTypeDefinition) obj; - if (auxiliary != other.auxiliary) { - return false; - } - if (defaultInAKind != other.defaultInAKind) { - return false; - } - if (descriptionAttribute == null) { - if (other.descriptionAttribute != null) { - return false; - } - } else if (!descriptionAttribute.equals(other.descriptionAttribute)) { - return false; - } - if (displayNameAttribute == null) { - if (other.displayNameAttribute != null) { - return false; - } - } else if (!displayNameAttribute.equals(other.displayNameAttribute)) { - return false; - } - if (identifiers == null) { - if (other.identifiers != null) { - return false; - } - } else if (!identifiers.equals(other.identifiers)) { - return false; - } - if (intent == null) { - if (other.intent != null) { - return false; - } - } else if (!intent.equals(other.intent)) { - return false; - } - if (kind != other.kind) { - return false; - } - if (namingAttribute == null) { - if (other.namingAttribute != null) { - return false; - } - } else if (!namingAttribute.equals(other.namingAttribute)) { - return false; - } - if (nativeObjectClass == null) { - if (other.nativeObjectClass != null) { - return false; - } - } else if (!nativeObjectClass.equals(other.nativeObjectClass)) { - return false; - } - if (secondaryIdentifiers == null) { - if (other.secondaryIdentifiers != null) { - return false; - } - } else if (!secondaryIdentifiers.equals(other.secondaryIdentifiers)) { - return false; - } - return true; - } + ResourceAttributeContainerDefinition toResourceAttributeContainerDefinition(); - @Override - protected String getDebugDumpClassName() { - return "OCD"; - } + ResourceAttributeContainerDefinition toResourceAttributeContainerDefinition(QName elementName); - @Override - protected void extendDumpHeader(StringBuilder sb) { - super.extendDumpHeader(sb); - if (defaultInAKind) { - sb.append(" def"); - } - if (auxiliary) { - sb.append(" aux"); - } - if (kind != null) { - sb.append(" ").append(kind.value()); - } - if (intent != null) { - sb.append(" intent=").append(intent); - } - } + ObjectQuery createShadowSearchQuery(String resourceOid) throws SchemaException; - @Override - protected void extendDumpDefinition(StringBuilder sb, ItemDefinition def) { - super.extendDumpDefinition(sb, def); - if (getPrimaryIdentifiers() != null && getPrimaryIdentifiers().contains(def)) { - sb.append(",primID"); - } - if (getSecondaryIdentifiers() != null && getSecondaryIdentifiers().contains(def)) { - sb.append(",secID"); - } - } - + ResourceAttributeContainer instantiate(QName elementName); + ObjectClassComplexTypeDefinition clone(); } diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ObjectClassComplexTypeDefinitionImpl.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ObjectClassComplexTypeDefinitionImpl.java new file mode 100644 index 00000000000..e5207d167b2 --- /dev/null +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ObjectClassComplexTypeDefinitionImpl.java @@ -0,0 +1,523 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.schema.processor; + +import java.util.ArrayList; +import java.util.Collection; + +import javax.xml.namespace.QName; + +import com.evolveum.midpoint.prism.*; +import com.evolveum.midpoint.prism.query.ObjectQuery; +import com.evolveum.midpoint.schema.util.ObjectQueryUtil; +import com.evolveum.midpoint.util.exception.SchemaException; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowKindType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; + +/** + * @author semancik + * + */ +public class ObjectClassComplexTypeDefinitionImpl extends ComplexTypeDefinitionImpl implements ObjectClassComplexTypeDefinition { + private static final long serialVersionUID = 1L; + + private Collection identifiers; + private Collection secondaryIdentifiers; + private ResourceAttributeDefinition descriptionAttribute; + private ResourceAttributeDefinition displayNameAttribute; + private ResourceAttributeDefinition namingAttribute; + private boolean defaultInAKind = false; + private ShadowKindType kind; + private String intent; + private String nativeObjectClass; + private boolean auxiliary; + + public ObjectClassComplexTypeDefinitionImpl(QName typeName, PrismContext prismContext) { + super(typeName, prismContext); + } + + @Override + public Collection getAttributeDefinitions() { + Collection attrs = new ArrayList(getDefinitions().size()); + for (ItemDefinition def: getDefinitions()) { + if (def instanceof ResourceAttributeDefinition) { + attrs.add((ResourceAttributeDefinition)def); + } + } + return attrs; + } + + /** + * Returns the definition of primary identifier attributes of a resource object. + * + * May return empty set if there are no identifier attributes. Must not + * return null. + * + * The exception should be never thrown unless there is some bug in the + * code. The validation of model consistency should be done at the time of + * schema parsing. + * + * @return definition of identifier attributes + * @throws IllegalStateException + * if there is no definition for the referenced attributed + */ + @Override + public Collection getPrimaryIdentifiers() { + if (identifiers == null) { + identifiers = new ArrayList(1); + } + return identifiers; + } + + @Override + public boolean isPrimaryIdentifier(QName attrName) { + for (ResourceAttributeDefinition idDef: getPrimaryIdentifiers()) { + if (idDef.getName().equals(attrName)) { + return true; + } + } + return false; + } + + /** + * Returns the definition of secondary identifier attributes of a resource + * object. + * + * May return empty set if there are no secondary identifier attributes. + * Must not return null. + * + * The exception should be never thrown unless there is some bug in the + * code. The validation of model consistency should be done at the time of + * schema parsing. + * + * @return definition of secondary identifier attributes + * @throws IllegalStateException + * if there is no definition for the referenced attributed + */ + @Override + public Collection getSecondaryIdentifiers() { + if (secondaryIdentifiers == null) { + secondaryIdentifiers = new ArrayList(1); + } + return secondaryIdentifiers; + } + + @Override + public boolean isSecondaryIdentifier(QName attrName) { + for (ResourceAttributeDefinition idDef: getSecondaryIdentifiers()) { + if (idDef.getName().equals(attrName)) { + return true; + } + } + return false; + } + + @Override + public Collection getAllIdentifiers() { + Collection allIdentifiers = new ArrayList<>(); + if (identifiers != null) { + allIdentifiers.addAll((Collection)getPrimaryIdentifiers()); + } + if (secondaryIdentifiers != null) { + allIdentifiers.addAll((Collection)getSecondaryIdentifiers()); + } + return allIdentifiers; + } + + /** + * Returns the definition of description attribute of a resource object. + * + * Returns null if there is no description attribute. + * + * The exception should be never thrown unless there is some bug in the + * code. The validation of model consistency should be done at the time of + * schema parsing. + * + * @return definition of secondary identifier attributes + * @throws IllegalStateException + * if there is more than one description attribute. But this + * should never happen. + * @throws IllegalStateException + * if there is no definition for the referenced attributed + */ + @Override + public ResourceAttributeDefinition getDescriptionAttribute() { + return descriptionAttribute; + } + + public void setDescriptionAttribute(ResourceAttributeDefinition descriptionAttribute) { + this.descriptionAttribute = descriptionAttribute; + } + + /** + * Specifies which resource attribute should be used as a "technical" name + * for the account. This name will appear in log files and other troubleshooting + * tools. The name should be a form of unique identifier that can be used to + * locate the resource object for diagnostics. It should not contain white chars and + * special chars if that can be avoided and it should be reasonable short. + + * It is different from a display name attribute. Display name is intended for a + * common user or non-technical administrator (such as role administrator). The + * naming attribute is intended for technical IDM administrators and developers. + * + * @return resource attribute definition that should be used as a "technical" name + * for the account. + */ + @Override + public ResourceAttributeDefinition getNamingAttribute() { + return namingAttribute; + } + + public void setNamingAttribute(ResourceAttributeDefinition namingAttribute) { + this.namingAttribute = namingAttribute; + } + + public void setNamingAttribute(QName namingAttribute) { + setNamingAttribute(findAttributeDefinition(namingAttribute)); + } + + /** + * Returns the native object class string for the resource object. + * + * Native object class is the name of the Resource Object Definition (Object + * Class) as it is seen by the resource itself. The name of the Resource + * Object Definition may be constrained by XSD or other syntax and therefore + * may be "mangled" to conform to such syntax. The native object + * class value will contain unmangled name (if available). + * + * Returns null if there is no native object class. + * + * The exception should be never thrown unless there is some bug in the + * code. The validation of model consistency should be done at the time of + * schema parsing. + * + * @return native object class + * @throws IllegalStateException + * if there is more than one description attribute. + */ + @Override + public String getNativeObjectClass() { + return nativeObjectClass; + } + + public void setNativeObjectClass(String nativeObjectClass) { + this.nativeObjectClass = nativeObjectClass; + } + + @Override + public boolean isAuxiliary() { + return auxiliary; + } + + public void setAuxiliary(boolean auxiliary) { + this.auxiliary = auxiliary; + } + + @Override + public ShadowKindType getKind() { + return kind; + } + + public void setKind(ShadowKindType kind) { + this.kind = kind; + } + + /** + * Indicates whether definition is should be used as default definition in ist kind. + * E.g. if used in an "account" kind it indicates default account definition. + * + * If true value is returned then the definition should be used as a default + * definition for the kind. This is a way how a resource connector may + * suggest applicable object classes (resource object definitions) for + * individual shadow kinds (e.g. accounts). + * + * @return true if the definition should be used as account type. + * @throws IllegalStateException + * if more than one default account is suggested in the schema. + */ + @Override + public boolean isDefaultInAKind() { + return defaultInAKind; + } + + public void setDefaultInAKind(boolean defaultAccountType) { + this.defaultInAKind = defaultAccountType; + } + + @Override + public String getIntent() { + return intent; + } + + public void setIntent(String intent) { + this.intent = intent; + } + + /** + * Returns the definition of display name attribute. + * + * Display name attribute specifies which resource attribute should be used + * as title when displaying objects of a specific resource object class. It + * must point to an attribute of String type. If not present, primary + * identifier should be used instead (but this method does not handle this + * default behavior). + * + * Returns null if there is no display name attribute. + * + * The exception should be never thrown unless there is some bug in the + * code. The validation of model consistency should be done at the time of + * schema parsing. + * + * @return native object class + * @throws IllegalStateException + * if there is more than one display name attribute or the + * definition of the referenced attribute does not exist. + */ + @Override + public ResourceAttributeDefinition getDisplayNameAttribute() { + return displayNameAttribute; + } + + public void setDisplayNameAttribute(ResourceAttributeDefinition displayName) { + this.displayNameAttribute = displayName; + } + + /** + * TODO + * + * Convenience method. It will internally look up the correct definition. + * + * @param displayName + */ + public void setDisplayNameAttribute(QName displayName) { + setDisplayNameAttribute(findAttributeDefinition(displayName)); + } + + /** + * Finds a attribute definition by looking at the property name. + *

+ * Returns null if nothing is found. + * + * @param name property definition name + * @return found property definition or null + */ + @Override + public ResourceAttributeDefinition findAttributeDefinition(QName name) { + return findItemDefinition(name, ResourceAttributeDefinition.class); + } + + @Override + public ResourceAttributeDefinition findAttributeDefinition(QName name, boolean caseInsensitive) { + return findItemDefinition(name, ResourceAttributeDefinition.class, caseInsensitive); + } + + @Override + public ResourceAttributeDefinition findAttributeDefinition(String name) { + QName qname = new QName(getTypeName().getNamespaceURI(), name); + return findAttributeDefinition(qname); + } + + public ResourceAttributeDefinitionImpl createAttributeDefinition(QName name, QName typeName) { + ResourceAttributeDefinitionImpl propDef = new ResourceAttributeDefinitionImpl(name, typeName, prismContext); + addDefinition(propDef); + return propDef; + } + + public ResourceAttributeDefinitionImpl createAttributeDefinition(String localName, QName typeName) { + QName name = new QName(getSchemaNamespace(),localName); + return createAttributeDefinition(name,typeName); + } + + + public ResourceAttributeDefinition createAttributeDefinition(String localName, String localTypeName) { + QName name = new QName(getSchemaNamespace(),localName); + QName typeName = new QName(getSchemaNamespace(),localTypeName); + return createAttributeDefinition(name,typeName); + } + + @Override + public ResourceAttributeContainerDefinition toResourceAttributeContainerDefinition() { + return toResourceAttributeContainerDefinition(ShadowType.F_ATTRIBUTES); + } + + @Override + public ResourceAttributeContainerDefinition toResourceAttributeContainerDefinition(QName elementName) { + return new ResourceAttributeContainerDefinitionImpl(elementName, this, getPrismContext()); + } + + @Override + public ObjectQuery createShadowSearchQuery(String resourceOid) throws SchemaException { + return ObjectQueryUtil.createResourceAndObjectClassQuery(resourceOid, getTypeName(), prismContext); + } + + /** + * This may not be really "clean" as it actually does two steps instead of one. But it is useful. + */ + @Override + public ResourceAttributeContainer instantiate(QName elementName) { + ResourceAttributeContainerDefinition racDef = toResourceAttributeContainerDefinition(elementName); + ResourceAttributeContainer rac = new ResourceAttributeContainer(elementName, racDef, getPrismContext()); + return rac; + } + + @Override + public ObjectClassComplexTypeDefinitionImpl clone() { + ObjectClassComplexTypeDefinitionImpl clone = new ObjectClassComplexTypeDefinitionImpl( + getTypeName(), prismContext); + copyDefinitionData(clone); + return clone; + } + + protected void copyDefinitionData(ObjectClassComplexTypeDefinitionImpl clone) { + super.copyDefinitionData(clone); + clone.kind = this.kind; + clone.intent = this.intent; + clone.defaultInAKind = this.defaultInAKind; + clone.descriptionAttribute = this.descriptionAttribute; + clone.displayNameAttribute = this.displayNameAttribute; + clone.identifiers = this.identifiers; + clone.namingAttribute = this.namingAttribute; + clone.nativeObjectClass = this.nativeObjectClass; + clone.secondaryIdentifiers = this.secondaryIdentifiers; + clone.auxiliary = this.auxiliary; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = super.hashCode(); + result = prime * result + (auxiliary ? 1231 : 1237); + result = prime * result + (defaultInAKind ? 1231 : 1237); + result = prime * result + ((descriptionAttribute == null) ? 0 : descriptionAttribute.hashCode()); + result = prime * result + ((displayNameAttribute == null) ? 0 : displayNameAttribute.hashCode()); + result = prime * result + ((identifiers == null) ? 0 : identifiers.hashCode()); + result = prime * result + ((intent == null) ? 0 : intent.hashCode()); + result = prime * result + ((kind == null) ? 0 : kind.hashCode()); + result = prime * result + ((namingAttribute == null) ? 0 : namingAttribute.hashCode()); + result = prime * result + ((nativeObjectClass == null) ? 0 : nativeObjectClass.hashCode()); + result = prime * result + ((secondaryIdentifiers == null) ? 0 : secondaryIdentifiers.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (!super.equals(obj)) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + ObjectClassComplexTypeDefinitionImpl other = (ObjectClassComplexTypeDefinitionImpl) obj; + if (auxiliary != other.auxiliary) { + return false; + } + if (defaultInAKind != other.defaultInAKind) { + return false; + } + if (descriptionAttribute == null) { + if (other.descriptionAttribute != null) { + return false; + } + } else if (!descriptionAttribute.equals(other.descriptionAttribute)) { + return false; + } + if (displayNameAttribute == null) { + if (other.displayNameAttribute != null) { + return false; + } + } else if (!displayNameAttribute.equals(other.displayNameAttribute)) { + return false; + } + if (identifiers == null) { + if (other.identifiers != null) { + return false; + } + } else if (!identifiers.equals(other.identifiers)) { + return false; + } + if (intent == null) { + if (other.intent != null) { + return false; + } + } else if (!intent.equals(other.intent)) { + return false; + } + if (kind != other.kind) { + return false; + } + if (namingAttribute == null) { + if (other.namingAttribute != null) { + return false; + } + } else if (!namingAttribute.equals(other.namingAttribute)) { + return false; + } + if (nativeObjectClass == null) { + if (other.nativeObjectClass != null) { + return false; + } + } else if (!nativeObjectClass.equals(other.nativeObjectClass)) { + return false; + } + if (secondaryIdentifiers == null) { + if (other.secondaryIdentifiers != null) { + return false; + } + } else if (!secondaryIdentifiers.equals(other.secondaryIdentifiers)) { + return false; + } + return true; + } + + @Override + protected String getDebugDumpClassName() { + return "OCD"; + } + + @Override + protected void extendDumpHeader(StringBuilder sb) { + super.extendDumpHeader(sb); + if (defaultInAKind) { + sb.append(" def"); + } + if (auxiliary) { + sb.append(" aux"); + } + if (kind != null) { + sb.append(" ").append(kind.value()); + } + if (intent != null) { + sb.append(" intent=").append(intent); + } + } + + @Override + protected void extendDumpDefinition(StringBuilder sb, ItemDefinition def) { + super.extendDumpDefinition(sb, def); + if (getPrimaryIdentifiers() != null && getPrimaryIdentifiers().contains(def)) { + sb.append(",primID"); + } + if (getSecondaryIdentifiers() != null && getSecondaryIdentifiers().contains(def)) { + sb.append(",secID"); + } + } + + +} diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ResourceAttributeContainer.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ResourceAttributeContainer.java index fa08d5759e5..876dd0997f1 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ResourceAttributeContainer.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ResourceAttributeContainer.java @@ -388,7 +388,7 @@ public static ResourceAttributeContainer convertFromContainer(PrismContainer } public static ResourceAttributeContainer createEmptyContainer(QName elementName, ObjectClassComplexTypeDefinition objectClassDefinition) { - ResourceAttributeContainerDefinition attributesContainerDefinition = new ResourceAttributeContainerDefinition(elementName, + ResourceAttributeContainerDefinition attributesContainerDefinition = new ResourceAttributeContainerDefinitionImpl(elementName, objectClassDefinition, objectClassDefinition.getPrismContext()); return new ResourceAttributeContainer(elementName, attributesContainerDefinition , objectClassDefinition.getPrismContext()); } diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ResourceAttributeContainerDefinition.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ResourceAttributeContainerDefinition.java index 3726faed385..5458072f907 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ResourceAttributeContainerDefinition.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ResourceAttributeContainerDefinition.java @@ -16,372 +16,64 @@ package com.evolveum.midpoint.schema.processor; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -import javax.xml.namespace.QName; - -import com.evolveum.midpoint.prism.ComplexTypeDefinition; -import com.evolveum.midpoint.prism.Definition; -import com.evolveum.midpoint.prism.ItemDefinition; -import com.evolveum.midpoint.prism.PrismContainer; import com.evolveum.midpoint.prism.PrismContainerDefinition; -import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismObjectDefinition; import com.evolveum.midpoint.prism.path.ItemPath; -import com.evolveum.midpoint.prism.schema.PrismSchema; -import com.evolveum.midpoint.util.DebugDumpable; -import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowAttributesType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowKindType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; +import javax.xml.namespace.QName; +import java.util.Collection; +import java.util.List; + /** - * Resource Object Definition (Object Class). - * - * Object Class refers to a type of object on the Resource. Unix account, Active - * Directory group, inetOrgPerson LDAP objectclass or a schema of USERS database - * table are all Object Classes from the midPoint point of view. Object class - * defines a set of attribute names, types for each attributes and few - * additional properties. - * - * This class represents schema definition for resource object (object class). - * See {@link Definition} for more details. - * - * Resource Object Definition is immutable. TODO: This will probably need to be - * changed to a mutable object. - * - * @author Radovan Semancik - * + * @author mederly */ -public class ResourceAttributeContainerDefinition extends PrismContainerDefinition { - - private static final long serialVersionUID = 3943909626639924429L; - - public ResourceAttributeContainerDefinition(QName name, ObjectClassComplexTypeDefinition complexTypeDefinition, PrismContext prismContext) { - super(name, complexTypeDefinition, prismContext); - super.setCompileTimeClass(ShadowAttributesType.class); - } - +public interface ResourceAttributeContainerDefinition extends PrismContainerDefinition { @Override - public ObjectClassComplexTypeDefinition getComplexTypeDefinition() { - return (ObjectClassComplexTypeDefinition)super.getComplexTypeDefinition(); - } + ObjectClassComplexTypeDefinition getComplexTypeDefinition(); - /** - * Returns the definition of primary identifier attributes of a resource object. - * - * May return empty set if there are no identifier attributes. Must not - * return null. - * - * The exception should be never thrown unless there is some bug in the - * code. The validation of model consistency should be done at the time of - * schema parsing. - * - * @return definition of identifier attributes - * @throws IllegalStateException - * if there is no definition for the referenced attributed - */ // TODO: rename to getPrimaryIdentifiers - public Collection getPrimaryIdentifiers() { - return getComplexTypeDefinition().getPrimaryIdentifiers(); - } + Collection getPrimaryIdentifiers(); - /** - * Returns the definition of secondary identifier attributes of a resource - * object. - * - * May return empty set if there are no secondary identifier attributes. - * Must not return null. - * - * The exception should be never thrown unless there is some bug in the - * code. The validation of model consistency should be done at the time of - * schema parsing. - * - * @return definition of secondary identifier attributes - * @throws IllegalStateException - * if there is no definition for the referenced attributed - */ - public Collection getSecondaryIdentifiers() { - return getComplexTypeDefinition().getSecondaryIdentifiers(); - } - - public Collection getAllIdentifiers() { - return getComplexTypeDefinition().getAllIdentifiers(); - } + Collection getSecondaryIdentifiers(); - /** - * Returns the definition of description attribute of a resource object. - * - * Returns null if there is no description attribute. - * - * The exception should be never thrown unless there is some bug in the - * code. The validation of model consistency should be done at the time of - * schema parsing. - * - * @return definition of secondary identifier attributes - * @throws IllegalStateException - * if there is more than one description attribute. But this - * should never happen. - * @throws IllegalStateException - * if there is no definition for the referenced attributed - */ - public ResourceAttributeDefinition getDescriptionAttribute() { - return getComplexTypeDefinition().getDescriptionAttribute(); - } + Collection getAllIdentifiers(); - public void setDescriptionAttribute(ResourceAttributeDefinition descriptionAttribute) { - // We can afford to delegate a set here as we know that there is one-to-one correspondence between - // object class definition and attribute container - getComplexTypeDefinition().setDescriptionAttribute(descriptionAttribute); - } - - /** - * Specifies which resource attribute should be used as a "technical" name - * for the account. This name will appear in log files and other troubleshooting - * tools. The name should be a form of unique identifier that can be used to - * locate the resource object for diagnostics. It should not contain white chars and - * special chars if that can be avoided and it should be reasonable short. - - * It is different from a display name attribute. Display name is intended for a - * common user or non-technical administrator (such as role administrator). The - * naming attribute is intended for technical IDM administrators and developers. - * - * @return resource attribute definition that should be used as a "technical" name - * for the account. - */ - public ResourceAttributeDefinition getNamingAttribute() { - return getComplexTypeDefinition().getNamingAttribute(); - } + ResourceAttributeDefinition getDescriptionAttribute(); - public void setNamingAttribute(ResourceAttributeDefinition namingAttribute) { - // We can afford to delegate a set here as we know that there is one-to-one correspondence between - // object class definition and attribute container - getComplexTypeDefinition().setNamingAttribute(namingAttribute); - } + ResourceAttributeDefinition getNamingAttribute(); - public void setNamingAttribute(QName namingAttribute) { - getComplexTypeDefinition().setNamingAttribute(namingAttribute); - } + String getNativeObjectClass(); - /** - * Returns the native object class string for the resource object. - * - * Native object class is the name of the Resource Object Definition (Object - * Class) as it is seen by the resource itself. The name of the Resource - * Object Definition may be constrained by XSD or other syntax and therefore - * may be "mangled" to conform to such syntax. The native object - * class value will contain unmangled name (if available). - * - * Returns null if there is no native object class. - * - * The exception should be never thrown unless there is some bug in the - * code. The validation of model consistency should be done at the time of - * schema parsing. - * - * @return native object class - * @throws IllegalStateException - * if there is more than one description attribute. - */ - public String getNativeObjectClass() { - return getComplexTypeDefinition().getNativeObjectClass(); - } + boolean isDefaultInAKind(); - public void setNativeObjectClass(String nativeObjectClass) { - // We can afford to delegate a set here as we know that there is one-to-one correspondence between - // object class definition and attribute container - getComplexTypeDefinition().setNativeObjectClass(nativeObjectClass); - } + String getIntent(); - /** - * Indicates whether definition is should be used as default account type. - * - * If true value is returned then the definition should be used as a default - * account type definition. This is a way how a resource connector may - * suggest applicable object classes (resource object definitions) for - * accounts. - * - * If no information about account type is present, false should be - * returned. This method must return true only if isAccountType() returns - * true. - * - * The exception should be never thrown unless there is some bug in the - * code. The validation of at-most-one value should be done at the time of - * schema parsing. The exception may not even be thrown at all if the - * implementation is not able to determine duplicity. - * - * @return true if the definition should be used as account type. - * @throws IllegalStateException - * if more than one default account is suggested in the schema. - */ - public boolean isDefaultInAKind() { - return getComplexTypeDefinition().isDefaultInAKind(); - } + ShadowKindType getKind(); - public void setDefaultInAKind(boolean defaultAccountType) { - getComplexTypeDefinition().setDefaultInAKind(defaultAccountType); - } - - public String getIntent() { - return getComplexTypeDefinition().getIntent(); - } - - public void setIntent(String accountTypeName) { - getComplexTypeDefinition().setIntent(accountTypeName); - } - - public ShadowKindType getKind() { - return getComplexTypeDefinition().getKind(); - } - - public void setKind(ShadowKindType kind) { - getComplexTypeDefinition().setKind(kind); - } + ResourceAttributeDefinition getDisplayNameAttribute(); - /** - * Returns the definition of display name attribute. - * - * Display name attribute specifies which resource attribute should be used - * as title when displaying objects of a specific resource object class. It - * must point to an attribute of String type. If not present, primary - * identifier should be used instead (but this method does not handle this - * default behavior). - * - * Returns null if there is no display name attribute. - * - * The exception should be never thrown unless there is some bug in the - * code. The validation of model consistency should be done at the time of - * schema parsing. - * - * @return native object class - * @throws IllegalStateException - * if there is more than one display name attribute or the - * definition of the referenced attribute does not exist. - */ - public ResourceAttributeDefinition getDisplayNameAttribute() { - return getComplexTypeDefinition().getDisplayNameAttribute(); - } + ResourceAttributeContainer instantiate(); - public void setDisplayNameAttribute(ResourceAttributeDefinition displayName) { - getComplexTypeDefinition().setDisplayNameAttribute(displayName); - } + ResourceAttributeContainer instantiate(QName name); - /** - * TODO - * - * Convenience method. It will internally look up the correct definition. - * - * @param displayName - */ - public void setDisplayNameAttribute(QName displayName) { - getComplexTypeDefinition().setDisplayNameAttribute(displayName); - } + ResourceAttributeContainerDefinition clone(); - public ResourceAttributeContainer instantiate() { - return instantiate(getName()); - } - - public ResourceAttributeContainer instantiate(QName name) { - name = addNamespaceIfApplicable(name); - return new ResourceAttributeContainer(name, this, prismContext); - } - - public ResourceAttributeContainerDefinition clone() { - ResourceAttributeContainerDefinition clone = new ResourceAttributeContainerDefinition(name, - (ObjectClassComplexTypeDefinition)complexTypeDefinition.clone(), prismContext); - copyDefinitionData(clone); - return clone; - } - - protected void copyDefinitionData(ResourceAttributeContainerDefinition clone) { - super.copyDefinitionData(clone); - } + ResourceAttributeDefinition findAttributeDefinition(QName elementQName); - public ResourceAttributeDefinition findAttributeDefinition(QName elementQName) { - return findAttributeDefinition(elementQName, false); - } + ResourceAttributeDefinition findAttributeDefinition(QName elementQName, boolean caseInsensitive); - public ResourceAttributeDefinition findAttributeDefinition(QName elementQName, boolean caseInsensitive) { - return findItemDefinition(elementQName, ResourceAttributeDefinition.class, caseInsensitive); - } - - public ResourceAttributeDefinition findAttributeDefinition(ItemPath elementPath) { - return findItemDefinition(elementPath, ResourceAttributeDefinition.class); - } + ResourceAttributeDefinition findAttributeDefinition(ItemPath elementPath); - public ResourceAttributeDefinition findAttributeDefinition(String elementLocalname) { - QName elementQName = new QName(getName().getNamespaceURI(),elementLocalname); - return findAttributeDefinition(elementQName); - } - - public List getAttributeDefinitions() { - List attrs = new ArrayList(); - for (ItemDefinition def: complexTypeDefinition.getDefinitions()) { - if (def instanceof ResourceAttributeDefinition) { - attrs.add((ResourceAttributeDefinition)def); - } else { - throw new IllegalStateException("Found "+def+" in resource attribute container, only attribute definitions are expected here"); - } - } - return attrs; - } - - // Only attribute definitions should be here. - @Override - public List getDefinitions() { - return getAttributeDefinitions(); - } + ResourceAttributeDefinition findAttributeDefinition(String elementLocalname); - public PrismObjectDefinition toShadowDefinition() { - PrismObjectDefinition origShadowDef = (PrismObjectDefinition) prismContext.getSchemaRegistry(). - findObjectDefinitionByCompileTimeClass(ShadowType.class); - PrismObjectDefinition shadowDefinition = - origShadowDef.cloneWithReplacedDefinition(ShadowType.F_ATTRIBUTES, this); - return shadowDefinition; - } - - @Override - public String debugDump(int indent) { - StringBuilder sb = new StringBuilder(); - for (int i=0; i getAttributeDefinitions(); + // Only attribute definitions should be here. @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append(getClass().getSimpleName()).append(":").append(getName()).append(" (").append(getTypeName()).append(")"); - if (isDefaultInAKind()) { - sb.append(" def"); - } - if (getKind() != null) { - sb.append(" ").append(getKind()); - } - if (getNativeObjectClass()!=null) { - sb.append(" native="); - sb.append(getNativeObjectClass()); - } - return sb.toString(); - } - + List getDefinitions(); + PrismObjectDefinition toShadowDefinition(); } diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ResourceAttributeContainerDefinitionImpl.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ResourceAttributeContainerDefinitionImpl.java new file mode 100644 index 00000000000..03c60d34b66 --- /dev/null +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ResourceAttributeContainerDefinitionImpl.java @@ -0,0 +1,401 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.schema.processor; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import javax.xml.namespace.QName; + +import com.evolveum.midpoint.prism.*; +import com.evolveum.midpoint.prism.path.ItemPath; +import com.evolveum.midpoint.prism.schema.PrismSchema; +import com.evolveum.midpoint.util.DebugDumpable; +import com.evolveum.midpoint.util.exception.SchemaException; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowAttributesType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowKindType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; + +/** + * Resource Object Definition (Object Class). + * + * Object Class refers to a type of object on the Resource. Unix account, Active + * Directory group, inetOrgPerson LDAP objectclass or a schema of USERS database + * table are all Object Classes from the midPoint point of view. Object class + * defines a set of attribute names, types for each attributes and few + * additional properties. + * + * This class represents schema definition for resource object (object class). + * See {@link Definition} for more details. + * + * Resource Object Definition is immutable. TODO: This will probably need to be + * changed to a mutable object. + * + * @author Radovan Semancik + * + */ +public class ResourceAttributeContainerDefinitionImpl extends PrismContainerDefinitionImpl implements + ResourceAttributeContainerDefinition { + + private static final long serialVersionUID = 3943909626639924429L; + + public ResourceAttributeContainerDefinitionImpl(QName name, ObjectClassComplexTypeDefinition complexTypeDefinition, PrismContext prismContext) { + super(name, complexTypeDefinition, prismContext); + super.setCompileTimeClass(ShadowAttributesType.class); + } + + @Override + public ObjectClassComplexTypeDefinition getComplexTypeDefinition() { + return (ObjectClassComplexTypeDefinition)super.getComplexTypeDefinition(); + } + + /** + * Returns the definition of primary identifier attributes of a resource object. + * + * May return empty set if there are no identifier attributes. Must not + * return null. + * + * The exception should be never thrown unless there is some bug in the + * code. The validation of model consistency should be done at the time of + * schema parsing. + * + * @return definition of identifier attributes + * @throws IllegalStateException + * if there is no definition for the referenced attributed + */ + // TODO: rename to getPrimaryIdentifiers + @Override + public Collection getPrimaryIdentifiers() { + return getComplexTypeDefinition().getPrimaryIdentifiers(); + } + + /** + * Returns the definition of secondary identifier attributes of a resource + * object. + * + * May return empty set if there are no secondary identifier attributes. + * Must not return null. + * + * The exception should be never thrown unless there is some bug in the + * code. The validation of model consistency should be done at the time of + * schema parsing. + * + * @return definition of secondary identifier attributes + * @throws IllegalStateException + * if there is no definition for the referenced attributed + */ + @Override + public Collection getSecondaryIdentifiers() { + return getComplexTypeDefinition().getSecondaryIdentifiers(); + } + + @Override + public Collection getAllIdentifiers() { + return getComplexTypeDefinition().getAllIdentifiers(); + } + + /** + * Returns the definition of description attribute of a resource object. + * + * Returns null if there is no description attribute. + * + * The exception should be never thrown unless there is some bug in the + * code. The validation of model consistency should be done at the time of + * schema parsing. + * + * @return definition of secondary identifier attributes + * @throws IllegalStateException + * if there is more than one description attribute. But this + * should never happen. + * @throws IllegalStateException + * if there is no definition for the referenced attributed + */ + @Override + public ResourceAttributeDefinition getDescriptionAttribute() { + return getComplexTypeDefinition().getDescriptionAttribute(); + } + + public void setDescriptionAttribute(ResourceAttributeDefinition descriptionAttribute) { + // We can afford to delegate a set here as we know that there is one-to-one correspondence between + // object class definition and attribute container + ((ObjectClassComplexTypeDefinitionImpl) getComplexTypeDefinition()).setDescriptionAttribute(descriptionAttribute); + } + + /** + * Specifies which resource attribute should be used as a "technical" name + * for the account. This name will appear in log files and other troubleshooting + * tools. The name should be a form of unique identifier that can be used to + * locate the resource object for diagnostics. It should not contain white chars and + * special chars if that can be avoided and it should be reasonable short. + + * It is different from a display name attribute. Display name is intended for a + * common user or non-technical administrator (such as role administrator). The + * naming attribute is intended for technical IDM administrators and developers. + * + * @return resource attribute definition that should be used as a "technical" name + * for the account. + */ + @Override + public ResourceAttributeDefinition getNamingAttribute() { + return getComplexTypeDefinition().getNamingAttribute(); + } + + public void setNamingAttribute(ResourceAttributeDefinition namingAttribute) { + // We can afford to delegate a set here as we know that there is one-to-one correspondence between + // object class definition and attribute container + ((ObjectClassComplexTypeDefinitionImpl) getComplexTypeDefinition()).setNamingAttribute(namingAttribute); + } + + public void setNamingAttribute(QName namingAttribute) { + ((ObjectClassComplexTypeDefinitionImpl) getComplexTypeDefinition()).setNamingAttribute(namingAttribute); + } + + /** + * Returns the native object class string for the resource object. + * + * Native object class is the name of the Resource Object Definition (Object + * Class) as it is seen by the resource itself. The name of the Resource + * Object Definition may be constrained by XSD or other syntax and therefore + * may be "mangled" to conform to such syntax. The native object + * class value will contain unmangled name (if available). + * + * Returns null if there is no native object class. + * + * The exception should be never thrown unless there is some bug in the + * code. The validation of model consistency should be done at the time of + * schema parsing. + * + * @return native object class + * @throws IllegalStateException + * if there is more than one description attribute. + */ + @Override + public String getNativeObjectClass() { + return getComplexTypeDefinition().getNativeObjectClass(); + } + + public void setNativeObjectClass(String nativeObjectClass) { + // We can afford to delegate a set here as we know that there is one-to-one correspondence between + // object class definition and attribute container + ((ObjectClassComplexTypeDefinitionImpl) getComplexTypeDefinition()).setNativeObjectClass(nativeObjectClass); + } + + /** + * Indicates whether definition is should be used as default account type. + * + * If true value is returned then the definition should be used as a default + * account type definition. This is a way how a resource connector may + * suggest applicable object classes (resource object definitions) for + * accounts. + * + * If no information about account type is present, false should be + * returned. This method must return true only if isAccountType() returns + * true. + * + * The exception should be never thrown unless there is some bug in the + * code. The validation of at-most-one value should be done at the time of + * schema parsing. The exception may not even be thrown at all if the + * implementation is not able to determine duplicity. + * + * @return true if the definition should be used as account type. + * @throws IllegalStateException + * if more than one default account is suggested in the schema. + */ + @Override + public boolean isDefaultInAKind() { + return getComplexTypeDefinition().isDefaultInAKind(); + } + + public void setDefaultInAKind(boolean defaultAccountType) { + ((ObjectClassComplexTypeDefinitionImpl) getComplexTypeDefinition()).setDefaultInAKind(defaultAccountType); + } + + @Override + public String getIntent() { + return getComplexTypeDefinition().getIntent(); + } + + public void setIntent(String accountTypeName) { + ((ObjectClassComplexTypeDefinitionImpl) getComplexTypeDefinition()).setIntent(accountTypeName); + } + + @Override + public ShadowKindType getKind() { + return getComplexTypeDefinition().getKind(); + } + + public void setKind(ShadowKindType kind) { + ((ObjectClassComplexTypeDefinitionImpl) getComplexTypeDefinition()).setKind(kind); + } + + /** + * Returns the definition of display name attribute. + * + * Display name attribute specifies which resource attribute should be used + * as title when displaying objects of a specific resource object class. It + * must point to an attribute of String type. If not present, primary + * identifier should be used instead (but this method does not handle this + * default behavior). + * + * Returns null if there is no display name attribute. + * + * The exception should be never thrown unless there is some bug in the + * code. The validation of model consistency should be done at the time of + * schema parsing. + * + * @return native object class + * @throws IllegalStateException + * if there is more than one display name attribute or the + * definition of the referenced attribute does not exist. + */ + @Override + public ResourceAttributeDefinition getDisplayNameAttribute() { + return getComplexTypeDefinition().getDisplayNameAttribute(); + } + + public void setDisplayNameAttribute(ResourceAttributeDefinition displayName) { + ((ObjectClassComplexTypeDefinitionImpl) getComplexTypeDefinition()).setDisplayNameAttribute(displayName); + } + + /** + * TODO + * + * Convenience method. It will internally look up the correct definition. + * + * @param displayName + */ + public void setDisplayNameAttribute(QName displayName) { + ((ObjectClassComplexTypeDefinitionImpl) getComplexTypeDefinition()).setDisplayNameAttribute(displayName); + } + + @Override + public ResourceAttributeContainer instantiate() { + return instantiate(getName()); + } + + @Override + public ResourceAttributeContainer instantiate(QName name) { + name = addNamespaceIfApplicable(name); + return new ResourceAttributeContainer(name, this, prismContext); + } + + @Override + public ResourceAttributeContainerDefinitionImpl clone() { + ResourceAttributeContainerDefinitionImpl clone = new ResourceAttributeContainerDefinitionImpl(name, + (ObjectClassComplexTypeDefinition)complexTypeDefinition.clone(), prismContext); + copyDefinitionData(clone); + return clone; + } + + protected void copyDefinitionData(ResourceAttributeContainerDefinitionImpl clone) { + super.copyDefinitionData(clone); + } + + @Override + public ResourceAttributeDefinition findAttributeDefinition(QName elementQName) { + return findAttributeDefinition(elementQName, false); + } + + @Override + public ResourceAttributeDefinition findAttributeDefinition(QName elementQName, boolean caseInsensitive) { + return findItemDefinition(elementQName, ResourceAttributeDefinition.class, caseInsensitive); + } + + @Override + public ResourceAttributeDefinition findAttributeDefinition(ItemPath elementPath) { + return findItemDefinition(elementPath, ResourceAttributeDefinition.class); + } + + @Override + public ResourceAttributeDefinition findAttributeDefinition(String elementLocalname) { + QName elementQName = new QName(getName().getNamespaceURI(),elementLocalname); + return findAttributeDefinition(elementQName); + } + + @Override + public List getAttributeDefinitions() { + List attrs = new ArrayList<>(); + for (ItemDefinition def: complexTypeDefinition.getDefinitions()) { + if (def instanceof ResourceAttributeDefinition) { + attrs.add((ResourceAttributeDefinition)def); + } else { + throw new IllegalStateException("Found "+def+" in resource attribute container, only attribute definitions are expected here"); + } + } + return attrs; + } + + // Only attribute definitions should be here. + @Override + public List getDefinitions() { + return getAttributeDefinitions(); + } + + @Override + public PrismObjectDefinition toShadowDefinition() { + PrismObjectDefinition origShadowDef = (PrismObjectDefinition) prismContext.getSchemaRegistry(). + findObjectDefinitionByCompileTimeClass(ShadowType.class); + PrismObjectDefinition shadowDefinition = + origShadowDef.cloneWithReplacedDefinition(ShadowType.F_ATTRIBUTES, this); + return shadowDefinition; + } + + @Override + public String debugDump(int indent) { + StringBuilder sb = new StringBuilder(); + for (int i=0; i extends PrismPropertyDefinition { - - private static final long serialVersionUID = 7092192397127114804L; - private String nativeAttributeName; - private String frameworkAttributeName; - private Boolean returnedByDefault; +public interface ResourceAttributeDefinition extends PrismPropertyDefinition { - public ResourceAttributeDefinition(QName elementName, QName typeName, PrismContext prismContext) { - super(elementName, typeName, prismContext); - } + ResourceAttribute instantiate(); - public ResourceAttribute instantiate() { - return instantiate(getName()); - } + ResourceAttribute instantiate(QName name); - public ResourceAttribute instantiate(QName name) { - name = addNamespaceIfApplicable(name); - return new ResourceAttribute(name, this, prismContext); - } + Boolean getReturnedByDefault(); - public Boolean getReturnedByDefault() { - return returnedByDefault; - } - - public boolean isReturnedByDefault() { - if (returnedByDefault == null) { - return true; - } else { - return returnedByDefault; - } - } + boolean isReturnedByDefault(); - public void setReturnedByDefault(Boolean returnedByDefault) { - this.returnedByDefault = returnedByDefault; - } + boolean isIdentifier(ResourceAttributeContainerDefinition objectDefinition); - /** - * Returns true if the attribute is a (primary) identifier. - * - * Convenience method. - * - * @return true if the attribute is a (primary) identifier. - */ - public boolean isIdentifier(ResourceAttributeContainerDefinition objectDefinition) { - return isIdentifier(objectDefinition.getComplexTypeDefinition()); - } - - public boolean isIdentifier(ObjectClassComplexTypeDefinition objectDefinition) { - for (ResourceAttributeDefinition identifier : objectDefinition.getPrimaryIdentifiers()) { - if (this == identifier) { - return true; - } - } - return false; - } - - public boolean isSecondaryIdentifier(ObjectClassComplexTypeDefinition objectDefinition) { - for (ResourceAttributeDefinition secondaryIdentifier : objectDefinition.getSecondaryIdentifiers()) { - if (this == secondaryIdentifier) { - return true; - } - } - return false; - } + boolean isIdentifier(ObjectClassComplexTypeDefinition objectDefinition); - /** - * Returns native attribute name. - * - * Native name of the attribute is a name as it is used on the resource or - * as seen by the connector. It is used for diagnostics purposes and may be - * used by the connector itself. As the attribute names in XSD have to - * comply with XML element name limitations, this may be the only way how to - * determine original attribute name. - * - * Returns null if native attribute name is not set or unknown. - * - * The name should be the same as the one used by the resource, if the - * resource supports naming of attributes. E.g. in case of LDAP this - * annotation should contain "cn", "givenName", etc. If the resource is not - * that flexible, the native attribute names may be hardcoded (e.g. - * "username", "homeDirectory") or may not be present at all. - * - * @return native attribute name - */ - public String getNativeAttributeName() { - return nativeAttributeName; - } + boolean isSecondaryIdentifier(ObjectClassComplexTypeDefinition objectDefinition); - public void setNativeAttributeName(String nativeAttributeName) { - this.nativeAttributeName = nativeAttributeName; - } - - /** - * Returns name of the attribute as given in the connector framework. - * This is not used for any significant logic. It is mostly for diagnostics. - * - * @return name of the attribute as given in the connector framework. - */ - public String getFrameworkAttributeName() { - return frameworkAttributeName; - } + String getNativeAttributeName(); - public void setFrameworkAttributeName(String frameworkAttributeName) { - this.frameworkAttributeName = frameworkAttributeName; - } + String getFrameworkAttributeName(); @Override - public ResourceAttributeDefinition clone() { - ResourceAttributeDefinition clone = new ResourceAttributeDefinition(getName(), getTypeName(), getPrismContext()); - copyDefinitionData(clone); - return clone; - } - - protected void copyDefinitionData(ResourceAttributeDefinition clone) { - super.copyDefinitionData(clone); - clone.nativeAttributeName = this.nativeAttributeName; - clone.frameworkAttributeName = this.frameworkAttributeName; - clone.returnedByDefault = this.returnedByDefault; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = super.hashCode(); - result = prime * result + ((frameworkAttributeName == null) ? 0 : frameworkAttributeName.hashCode()); - result = prime * result + ((nativeAttributeName == null) ? 0 : nativeAttributeName.hashCode()); - result = prime * result + ((returnedByDefault == null) ? 0 : returnedByDefault.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (!super.equals(obj)) - return false; - if (getClass() != obj.getClass()) - return false; - ResourceAttributeDefinition other = (ResourceAttributeDefinition) obj; - if (frameworkAttributeName == null) { - if (other.frameworkAttributeName != null) - return false; - } else if (!frameworkAttributeName.equals(other.frameworkAttributeName)) - return false; - if (nativeAttributeName == null) { - if (other.nativeAttributeName != null) - return false; - } else if (!nativeAttributeName.equals(other.nativeAttributeName)) - return false; - if (returnedByDefault == null) { - if (other.returnedByDefault != null) - return false; - } else if (!returnedByDefault.equals(other.returnedByDefault)) - return false; - return true; - } - - @Override - protected void extendToString(StringBuilder sb) { - super.extendToString(sb); - if (getNativeAttributeName()!=null) { - sb.append(" native="); - sb.append(getNativeAttributeName()); - } - if (getFrameworkAttributeName()!=null) { - sb.append(" framework="); - sb.append(getFrameworkAttributeName()); - } - if (returnedByDefault != null) { - sb.append(" returnedByDefault="); - sb.append(returnedByDefault); - } - } - - /** - * Return a human readable name of this class suitable for logs. - */ - @Override - protected String getDebugDumpClassName() { - return "RAD"; - } - + ResourceAttributeDefinition clone(); } diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ResourceAttributeDefinitionImpl.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ResourceAttributeDefinitionImpl.java new file mode 100644 index 00000000000..c6f3c33f0e4 --- /dev/null +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ResourceAttributeDefinitionImpl.java @@ -0,0 +1,236 @@ +/* + * Copyright (c) 2010-2015 Evolveum + * + * 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 com.evolveum.midpoint.schema.processor; + +import javax.xml.namespace.QName; + +import com.evolveum.midpoint.prism.Definition; +import com.evolveum.midpoint.prism.PrismContext; +import com.evolveum.midpoint.prism.PrismPropertyDefinition; +import com.evolveum.midpoint.prism.PrismPropertyDefinitionImpl; +import com.evolveum.midpoint.prism.path.ItemPath; + +/** + * Resource Object Attribute Definition. + * + * Resource Object Attribute is a Property of Resource Object. All that applies + * to property applies also to attribute, e.g. only a whole attributes can be + * changed, they may be simple or complex types, they should be representable in + * XML, etc. In addition, attribute definition may have some annotations that + * suggest its purpose and use on the Resource. + * + * Resource Object Attribute understands resource-specific annotations such as + * native attribute name. + * + * This class represents schema definition for resource object attribute. See + * {@link Definition} for more details. + * + * @author Radovan Semancik + * + */ +public class ResourceAttributeDefinitionImpl extends PrismPropertyDefinitionImpl implements ResourceAttributeDefinition { + + private static final long serialVersionUID = 7092192397127114804L; + private String nativeAttributeName; + private String frameworkAttributeName; + private Boolean returnedByDefault; + + public ResourceAttributeDefinitionImpl(QName elementName, QName typeName, PrismContext prismContext) { + super(elementName, typeName, prismContext); + } + + @Override + public ResourceAttribute instantiate() { + return instantiate(getName()); + } + + @Override + public ResourceAttribute instantiate(QName name) { + name = addNamespaceIfApplicable(name); + return new ResourceAttribute(name, this, prismContext); + } + + @Override + public Boolean getReturnedByDefault() { + return returnedByDefault; + } + + @Override + public boolean isReturnedByDefault() { + if (returnedByDefault == null) { + return true; + } else { + return returnedByDefault; + } + } + + public void setReturnedByDefault(Boolean returnedByDefault) { + this.returnedByDefault = returnedByDefault; + } + + /** + * Returns true if the attribute is a (primary) identifier. + * + * Convenience method. + * + * @return true if the attribute is a (primary) identifier. + */ + @Override + public boolean isIdentifier(ResourceAttributeContainerDefinition objectDefinition) { + return isIdentifier(objectDefinition.getComplexTypeDefinition()); + } + + @Override + public boolean isIdentifier(ObjectClassComplexTypeDefinition objectDefinition) { + for (ResourceAttributeDefinition identifier : objectDefinition.getPrimaryIdentifiers()) { + if (this == identifier) { + return true; + } + } + return false; + } + + @Override + public boolean isSecondaryIdentifier(ObjectClassComplexTypeDefinition objectDefinition) { + for (ResourceAttributeDefinition secondaryIdentifier : objectDefinition.getSecondaryIdentifiers()) { + if (this == secondaryIdentifier) { + return true; + } + } + return false; + } + + /** + * Returns native attribute name. + * + * Native name of the attribute is a name as it is used on the resource or + * as seen by the connector. It is used for diagnostics purposes and may be + * used by the connector itself. As the attribute names in XSD have to + * comply with XML element name limitations, this may be the only way how to + * determine original attribute name. + * + * Returns null if native attribute name is not set or unknown. + * + * The name should be the same as the one used by the resource, if the + * resource supports naming of attributes. E.g. in case of LDAP this + * annotation should contain "cn", "givenName", etc. If the resource is not + * that flexible, the native attribute names may be hardcoded (e.g. + * "username", "homeDirectory") or may not be present at all. + * + * @return native attribute name + */ + @Override + public String getNativeAttributeName() { + return nativeAttributeName; + } + + public void setNativeAttributeName(String nativeAttributeName) { + this.nativeAttributeName = nativeAttributeName; + } + + /** + * Returns name of the attribute as given in the connector framework. + * This is not used for any significant logic. It is mostly for diagnostics. + * + * @return name of the attribute as given in the connector framework. + */ + @Override + public String getFrameworkAttributeName() { + return frameworkAttributeName; + } + + public void setFrameworkAttributeName(String frameworkAttributeName) { + this.frameworkAttributeName = frameworkAttributeName; + } + + @Override + public ResourceAttributeDefinition clone() { + ResourceAttributeDefinitionImpl clone = new ResourceAttributeDefinitionImpl(getName(), getTypeName(), getPrismContext()); + copyDefinitionData(clone); + return clone; + } + + protected void copyDefinitionData(ResourceAttributeDefinitionImpl clone) { + super.copyDefinitionData(clone); + clone.nativeAttributeName = this.nativeAttributeName; + clone.frameworkAttributeName = this.frameworkAttributeName; + clone.returnedByDefault = this.returnedByDefault; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = super.hashCode(); + result = prime * result + ((frameworkAttributeName == null) ? 0 : frameworkAttributeName.hashCode()); + result = prime * result + ((nativeAttributeName == null) ? 0 : nativeAttributeName.hashCode()); + result = prime * result + ((returnedByDefault == null) ? 0 : returnedByDefault.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (!super.equals(obj)) + return false; + if (getClass() != obj.getClass()) + return false; + ResourceAttributeDefinitionImpl other = (ResourceAttributeDefinitionImpl) obj; + if (frameworkAttributeName == null) { + if (other.frameworkAttributeName != null) + return false; + } else if (!frameworkAttributeName.equals(other.frameworkAttributeName)) + return false; + if (nativeAttributeName == null) { + if (other.nativeAttributeName != null) + return false; + } else if (!nativeAttributeName.equals(other.nativeAttributeName)) + return false; + if (returnedByDefault == null) { + if (other.returnedByDefault != null) + return false; + } else if (!returnedByDefault.equals(other.returnedByDefault)) + return false; + return true; + } + + @Override + protected void extendToString(StringBuilder sb) { + super.extendToString(sb); + if (getNativeAttributeName()!=null) { + sb.append(" native="); + sb.append(getNativeAttributeName()); + } + if (getFrameworkAttributeName()!=null) { + sb.append(" framework="); + sb.append(getFrameworkAttributeName()); + } + if (returnedByDefault != null) { + sb.append(" returnedByDefault="); + sb.append(returnedByDefault); + } + } + + /** + * Return a human readable name of this class suitable for logs. + */ + @Override + protected String getDebugDumpClassName() { + return "RAD"; + } + +} diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ResourceSchema.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ResourceSchema.java index 41f1ff67023..4eac8b3e3bd 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ResourceSchema.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ResourceSchema.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2013 Evolveum + * Copyright (c) 2010-2016 Evolveum * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,115 +13,37 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.evolveum.midpoint.schema.processor; - -import java.util.Collection; -import javax.xml.namespace.QName; - -import org.w3c.dom.Element; +package com.evolveum.midpoint.schema.processor; -import com.evolveum.midpoint.prism.ComplexTypeDefinition; -import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.schema.PrismSchema; -import com.evolveum.midpoint.schema.util.MiscSchemaUtil; -import com.evolveum.midpoint.util.MiscUtil; -import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowKindType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; +import javax.xml.namespace.QName; +import java.util.Collection; + /** * @author semancik - * + * @author mederly */ -public class ResourceSchema extends PrismSchema { +public interface ResourceSchema extends PrismSchema { - protected ResourceSchema(PrismContext prismContext) { - super(prismContext); - } - - public ResourceSchema(String namespace, PrismContext prismContext) { - super(namespace, prismContext); - } - - public static ResourceSchema parse(Element element, String shortDesc, PrismContext prismContext) throws SchemaException { - // TODO: make sure correct parser plugins are used - return (ResourceSchema) PrismSchema.parse(element, new ResourceSchema(prismContext), true, shortDesc, prismContext); - } - - public Collection getObjectClassDefinitions() { + default Collection getObjectClassDefinitions() { return getDefinitions(ObjectClassComplexTypeDefinition.class); } - /** - * Creates a new resource object definition and adds it to the schema. - * - * This is a preferred way how to create definition in the schema. - * - * @param localTypeName - * type name "relative" to schema namespace - * @return new resource object definition - */ - public ObjectClassComplexTypeDefinition createObjectClassDefinition(String localTypeName) { - QName typeName = new QName(getNamespace(), localTypeName); - return createObjectClassDefinition(typeName); - } - - /** - * Creates a new resource object definition and adds it to the schema. - * - * This is a preferred way how to create definition in the schema. - * - * @param localTypeName - * type QName - * @return new resource object definition - */ - public ObjectClassComplexTypeDefinition createObjectClassDefinition(QName typeName) { - ObjectClassComplexTypeDefinition cTypeDef = new ObjectClassComplexTypeDefinition(typeName, getPrismContext()); - add(cTypeDef); - return cTypeDef; - } - - public ObjectClassComplexTypeDefinition findObjectClassDefinition(ShadowType shadow) { + default ObjectClassComplexTypeDefinition findObjectClassDefinition(ShadowType shadow) { return findObjectClassDefinition(shadow.getObjectClass()); } - - public ObjectClassComplexTypeDefinition findObjectClassDefinition(String localName) { + + default ObjectClassComplexTypeDefinition findObjectClassDefinition(String localName) { return findObjectClassDefinition(new QName(getNamespace(), localName)); } - - public ObjectClassComplexTypeDefinition findObjectClassDefinition(QName qName) { - ComplexTypeDefinition complexTypeDefinition = findComplexTypeDefinition(qName); - if (complexTypeDefinition == null) { - return null; - } - if (complexTypeDefinition instanceof ObjectClassComplexTypeDefinition) { - return (ObjectClassComplexTypeDefinition)complexTypeDefinition; - } else { - throw new IllegalStateException("Expected the definition "+qName+" to be of type "+ - ObjectClassComplexTypeDefinition.class+" but it was "+complexTypeDefinition.getClass()); - } - } - public ObjectClassComplexTypeDefinition findObjectClassDefinition(ShadowKindType kind, String intent) { - if (intent == null) { - return findDefaultObjectClassDefinition(kind); - } - for (ObjectClassComplexTypeDefinition ocDef: getDefinitions(ObjectClassComplexTypeDefinition.class)) { - if (MiscSchemaUtil.matchesKind(kind, ocDef.getKind()) && MiscSchemaUtil.equalsIntent(intent, ocDef.getIntent())) { - return ocDef; - } - } - return null; - } + ObjectClassComplexTypeDefinition findObjectClassDefinition(QName qName); - public ObjectClassComplexTypeDefinition findDefaultObjectClassDefinition(ShadowKindType kind) { - for (ObjectClassComplexTypeDefinition ocDef: getDefinitions(ObjectClassComplexTypeDefinition.class)) { - if (MiscSchemaUtil.matchesKind(kind, ocDef.getKind()) && ocDef.isDefaultInAKind()) { - return ocDef; - } - } - return null; - } + ObjectClassComplexTypeDefinition findObjectClassDefinition(ShadowKindType kind, String intent); + ObjectClassComplexTypeDefinition findDefaultObjectClassDefinition(ShadowKindType kind); } diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ResourceSchemaImpl.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ResourceSchemaImpl.java new file mode 100644 index 00000000000..ed5697e9427 --- /dev/null +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ResourceSchemaImpl.java @@ -0,0 +1,121 @@ +/* + * Copyright (c) 2010-2013 Evolveum + * + * 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 com.evolveum.midpoint.schema.processor; + +import java.util.Collection; + +import javax.xml.namespace.QName; + +import com.evolveum.midpoint.prism.schema.PrismSchemaImpl; +import org.w3c.dom.Element; + +import com.evolveum.midpoint.prism.ComplexTypeDefinition; +import com.evolveum.midpoint.prism.PrismContext; +import com.evolveum.midpoint.prism.schema.PrismSchema; +import com.evolveum.midpoint.schema.util.MiscSchemaUtil; +import com.evolveum.midpoint.util.MiscUtil; +import com.evolveum.midpoint.util.exception.SchemaException; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowKindType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; + +/** + * @author semancik + * + */ +public class ResourceSchemaImpl extends PrismSchemaImpl implements ResourceSchema { + + protected ResourceSchemaImpl(PrismContext prismContext) { + super(prismContext); + } + + public ResourceSchemaImpl(String namespace, PrismContext prismContext) { + super(namespace, prismContext); + } + + public static ResourceSchemaImpl parse(Element element, String shortDesc, PrismContext prismContext) throws SchemaException { + // TODO: make sure correct parser plugins are used + return (ResourceSchemaImpl) PrismSchemaImpl.parse(element, new ResourceSchemaImpl(prismContext), true, shortDesc, prismContext); + } + + @Override + public ObjectClassComplexTypeDefinition findObjectClassDefinition(QName qName) { + ComplexTypeDefinition complexTypeDefinition = findComplexTypeDefinition(qName); + if (complexTypeDefinition == null) { + return null; + } + if (complexTypeDefinition instanceof ObjectClassComplexTypeDefinition) { + return (ObjectClassComplexTypeDefinition)complexTypeDefinition; + } else { + throw new IllegalStateException("Expected the definition "+qName+" to be of type "+ + ObjectClassComplexTypeDefinition.class+" but it was "+complexTypeDefinition.getClass()); + } + } + + @Override + public ObjectClassComplexTypeDefinition findObjectClassDefinition(ShadowKindType kind, String intent) { + if (intent == null) { + return findDefaultObjectClassDefinition(kind); + } + for (ObjectClassComplexTypeDefinition ocDef: getObjectClassDefinitions()) { + if (MiscSchemaUtil.matchesKind(kind, ocDef.getKind()) && MiscSchemaUtil.equalsIntent(intent, ocDef.getIntent())) { + return ocDef; + } + } + return null; + } + + @Override + public ObjectClassComplexTypeDefinition findDefaultObjectClassDefinition(ShadowKindType kind) { + for (ObjectClassComplexTypeDefinition ocDef: getObjectClassDefinitions()) { + if (MiscSchemaUtil.matchesKind(kind, ocDef.getKind()) && ocDef.isDefaultInAKind()) { + return ocDef; + } + } + return null; + } + + + /** + * Creates a new resource object definition and adds it to the schema. + * + * This is a preferred way how to create definition in the schema. + * + * @param localTypeName + * type name "relative" to schema namespace + * @return new resource object definition + */ + public ObjectClassComplexTypeDefinition createObjectClassDefinition(String localTypeName) { + QName typeName = new QName(getNamespace(), localTypeName); + return createObjectClassDefinition(typeName); + } + + /** + * Creates a new resource object definition and adds it to the schema. + * + * This is a preferred way how to create definition in the schema. + * + * @param typeName + * type QName + * @return new resource object definition + */ + public ObjectClassComplexTypeDefinition createObjectClassDefinition(QName typeName) { + ObjectClassComplexTypeDefinition cTypeDef = new ObjectClassComplexTypeDefinitionImpl(typeName, getPrismContext()); + add(cTypeDef); + return cTypeDef; + } + + +} diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ConnectorTypeUtil.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ConnectorTypeUtil.java index d3684c0414d..1cb2f764156 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ConnectorTypeUtil.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ConnectorTypeUtil.java @@ -17,14 +17,11 @@ import javax.xml.namespace.QName; +import com.evolveum.midpoint.prism.*; +import com.evolveum.midpoint.prism.schema.PrismSchemaImpl; import org.w3c.dom.Document; import org.w3c.dom.Element; -import com.evolveum.midpoint.prism.PrismContainer; -import com.evolveum.midpoint.prism.PrismContainerDefinition; -import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.PrismObject; -import com.evolveum.midpoint.prism.PrismProperty; import com.evolveum.midpoint.prism.schema.PrismSchema; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.xml.ns._public.common.common_3.ConnectorConfigurationType; @@ -91,11 +88,12 @@ public static PrismSchema parseConnectorSchema(ConnectorType connectorType, Pris if (connectorSchemaElement == null) { return null; } - PrismSchema connectorSchema = PrismSchema.parse(connectorSchemaElement, true, "schema for " + connectorType, prismContext); + PrismSchema connectorSchema = PrismSchemaImpl.parse(connectorSchemaElement, true, "schema for " + connectorType, prismContext); // Make sure that the config container definition has a correct compile-time class name QName configContainerQName = new QName(connectorType.getNamespace(), ResourceType.F_CONNECTOR_CONFIGURATION.getLocalPart()); - PrismContainerDefinition configurationContainerDefintion = connectorSchema.findContainerDefinitionByElementName(configContainerQName); - configurationContainerDefintion.setCompileTimeClass(ConnectorConfigurationType.class); + PrismContainerDefinition configurationContainerDefintion = + connectorSchema.findContainerDefinitionByElementName(configContainerQName); + ((PrismContainerDefinitionImpl) configurationContainerDefintion).setCompileTimeClass(ConnectorConfigurationType.class); return connectorSchema; } diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ReportTypeUtil.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ReportTypeUtil.java index d34410acf87..050b88845c6 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ReportTypeUtil.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ReportTypeUtil.java @@ -22,6 +22,7 @@ import javax.xml.namespace.QName; +import com.evolveum.midpoint.prism.schema.PrismSchemaImpl; import net.sf.jasperreports.engine.JRException; import net.sf.jasperreports.engine.JRTemplate; import net.sf.jasperreports.engine.JasperCompileManager; @@ -121,7 +122,7 @@ public static PrismSchema parseReportConfigurationSchema(PrismObject return null; } - return PrismSchema.parse(xmlSchemaElement, true, "schema for " + report, context); + return PrismSchemaImpl.parse(xmlSchemaElement, true, "schema for " + report, context); } public static PrismContainerDefinition findReportConfigurationDefinition(PrismSchema schema) { diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ShadowUtil.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ShadowUtil.java index 1870c411a0c..7e86d536b59 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ShadowUtil.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ShadowUtil.java @@ -22,12 +22,7 @@ import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.schema.ResourceShadowDiscriminator; import com.evolveum.midpoint.schema.constants.SchemaConstants; -import com.evolveum.midpoint.schema.processor.ObjectClassComplexTypeDefinition; -import com.evolveum.midpoint.schema.processor.ResourceAttribute; -import com.evolveum.midpoint.schema.processor.ResourceAttributeContainer; -import com.evolveum.midpoint.schema.processor.ResourceAttributeContainerDefinition; -import com.evolveum.midpoint.schema.processor.ResourceObjectIdentification; -import com.evolveum.midpoint.schema.processor.ResourceSchema; +import com.evolveum.midpoint.schema.processor.*; import com.evolveum.midpoint.util.MiscUtil; import com.evolveum.midpoint.util.QNameUtil; import com.evolveum.midpoint.util.exception.SchemaException; @@ -352,7 +347,7 @@ public static void applyResourceSchema(PrismObject shadow, private static void applyObjectClass(PrismObject shadow, ObjectClassComplexTypeDefinition objectClassDefinition) throws SchemaException { PrismContainer attributesContainer = shadow.findContainer(ShadowType.F_ATTRIBUTES); - ResourceAttributeContainerDefinition racDef = new ResourceAttributeContainerDefinition(ShadowType.F_ATTRIBUTES, + ResourceAttributeContainerDefinition racDef = new ResourceAttributeContainerDefinitionImpl(ShadowType.F_ATTRIBUTES, objectClassDefinition, objectClassDefinition.getPrismContext()); attributesContainer.applyDefinition((PrismContainerDefinition) racDef, true); } diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestImmutable.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestImmutable.java index 9ac7379b924..12f4e312a4e 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestImmutable.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestImmutable.java @@ -97,7 +97,7 @@ public void test020DateProperty() throws Exception { PrismContext prismContext = PrismTestUtil.getPrismContext(); // WHEN - PrismPropertyDefinition datePPD = new PrismPropertyDefinition<>(new QName(SchemaConstants.NS_C, "dateTime"), DOMUtil.XSD_DATETIME, prismContext); + PrismPropertyDefinition datePPD = new PrismPropertyDefinitionImpl<>(new QName(SchemaConstants.NS_C, "dateTime"), DOMUtil.XSD_DATETIME, prismContext); PrismProperty datePP = datePPD.instantiate(); Date now = new Date(); Date yesterday = new Date(now.getTime()-86400000L); @@ -134,7 +134,7 @@ public void test030Reference() throws Exception { PrismContext prismContext = PrismTestUtil.getPrismContext(); // WHEN - PrismReferenceDefinition refPRD = new PrismReferenceDefinition(new QName(SchemaConstants.NS_C, "ref"), ObjectReferenceType.COMPLEX_TYPE, prismContext); + PrismReferenceDefinition refPRD = new PrismReferenceDefinitionImpl(new QName(SchemaConstants.NS_C, "ref"), ObjectReferenceType.COMPLEX_TYPE, prismContext); PrismReference refPR = refPRD.instantiate(); refPR.add(ObjectTypeUtil.createObjectRef("oid1", ObjectTypes.USER).asReferenceValue()); refPR.setImmutable(true); diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseDiffPatch.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseDiffPatch.java index 034db4bdb15..8dc7903e12c 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseDiffPatch.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseDiffPatch.java @@ -28,9 +28,7 @@ import javax.xml.bind.JAXBException; import javax.xml.namespace.QName; -import com.evolveum.midpoint.prism.ParsingContext; -import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.PrismPropertyDefinition; +import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.prism.xnode.XNode; @@ -45,7 +43,6 @@ import org.w3c.dom.Element; import org.xml.sax.SAXException; -import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.delta.ChangeType; import com.evolveum.midpoint.prism.delta.DiffUtil; import com.evolveum.midpoint.prism.delta.ItemDelta; @@ -731,7 +728,7 @@ protected PrismObject getParsedShadowBefore(PrismContext prismContex for (ItemDeltaType itemDeltaType : objectChange.getItemDelta()) { for (RawType rawType : itemDeltaType.getValue()) { rawType.getParsedItem( - new PrismPropertyDefinition(itemDeltaType.getPath().getItemPath().lastNamed().getName(), + new PrismPropertyDefinitionImpl(itemDeltaType.getPath().getItemPath().lastNamed().getName(), rawType.getXnode().getTypeQName(), prismContext)); } diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestSchemaRegistry.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestSchemaRegistry.java index ecb9e0c8612..cbf19514006 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestSchemaRegistry.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestSchemaRegistry.java @@ -32,6 +32,7 @@ import javax.xml.validation.Schema; import javax.xml.validation.Validator; +import com.evolveum.midpoint.prism.schema.SchemaRegistryImpl; import com.evolveum.midpoint.schema.constants.SchemaConstants; import org.testng.annotations.Test; @@ -133,7 +134,7 @@ public void testReferenceInExtension() throws SchemaException, SAXException, IOE SchemaRegistry schemaRegistry = context.getSchemaRegistry(); // Common schema should be parsed during creation of the context - schemaRegistry.loadPrismSchemaResource("schema/extension.xsd"); + ((SchemaRegistryImpl) schemaRegistry).loadPrismSchemaResource("schema/extension.xsd"); // Check that the extension schema was loaded PrismSchema extensionSchema = schemaRegistry.findSchemaByNamespace(EXTENSION_SCHEMA_NAMESPACE); diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResource.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResource.java index 8aaa9c2a437..3d55cf0f894 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResource.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResource.java @@ -32,6 +32,7 @@ import com.evolveum.midpoint.schema.TestConstants; import com.evolveum.midpoint.schema.constants.MidPointConstants; import com.evolveum.midpoint.schema.processor.ResourceSchema; +import com.evolveum.midpoint.schema.processor.ResourceSchemaImpl; import com.evolveum.midpoint.schema.util.ResourceTypeUtil; import com.evolveum.midpoint.util.DOMUtil; import com.evolveum.midpoint.util.PrettyPrinter; @@ -216,7 +217,7 @@ public void testSchemaRoundtrip() throws Exception { XmlSchemaType defType = (XmlSchemaType) reparsedSchemaContainer.getValue().asContainerable(); Element reparsedXsdSchemaElement = defType.getDefinition().getSchema(); - ResourceSchema reparsedSchema = ResourceSchema.parse(reparsedXsdSchemaElement, "reparsed schema", prismContext); + ResourceSchema reparsedSchema = ResourceSchemaImpl.parse(reparsedXsdSchemaElement, "reparsed schema", prismContext); } diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/processor/SchemaProcessorTest.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/processor/SchemaProcessorTest.java index 734ad471a06..e16b14b0fe2 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/processor/SchemaProcessorTest.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/processor/SchemaProcessorTest.java @@ -24,6 +24,9 @@ import java.io.IOException; import java.util.Collection; +import com.evolveum.midpoint.prism.PrismContainerDefinitionImpl; +import com.evolveum.midpoint.prism.PrismPropertyDefinitionImpl; +import com.evolveum.midpoint.prism.schema.PrismSchemaImpl; import org.testng.annotations.BeforeSuite; import org.testng.annotations.Test; import org.testng.AssertJUnit; @@ -62,7 +65,7 @@ public void setup() throws SchemaException, SAXException, IOException { public void testAccessList() throws Exception { String filename = "src/test/resources/processor/resource-schema-complex.xsd"; Document schemaDom = DOMUtil.parseFile(filename); - ResourceSchema schema = ResourceSchema.parse(DOMUtil.getFirstChildElement(schemaDom), filename, PrismTestUtil.getPrismContext()); + ResourceSchema schema = ResourceSchemaImpl.parse(DOMUtil.getFirstChildElement(schemaDom), filename, PrismTestUtil.getPrismContext()); final String defaultNS = "http://midpoint.evolveum.com/xml/ns/public/resource/instances/ef2bc95b-76e0-48e2-86d6-3d4f02d3e1a2"; final String icfNS = "http://midpoint.evolveum.com/xml/ns/public/connector/icf-1/resource-schema-3"; @@ -88,12 +91,12 @@ public void testAccessList() throws Exception { @Test public void testRoundTripGeneric() throws SchemaException { // GIVEN - PrismSchema schema = new PrismSchema(SCHEMA_NS, PrismTestUtil.getPrismContext()); + PrismSchemaImpl schema = new PrismSchemaImpl(SCHEMA_NS, PrismTestUtil.getPrismContext()); // Ordinary property schema.createPropertyDefinition("number1", DOMUtil.XSD_INT); // Property container - PrismContainerDefinition containerDefinition = schema.createPropertyContainerDefinition("ContainerType"); + PrismContainerDefinitionImpl containerDefinition = schema.createPropertyContainerDefinition("ContainerType"); // ... in it ordinary property containerDefinition.createPropertyDefinition("login", DOMUtil.XSD_STRING); // ... and local property with a type from another schema @@ -102,7 +105,7 @@ public void testRoundTripGeneric() throws SchemaException { containerDefinition.createPropertyDefinition(SchemaConstants.C_CREDENTIALS, CredentialsType.COMPLEX_TYPE); // ... read-only int property PrismPropertyDefinition counterProperty = containerDefinition.createPropertyDefinition("counter", DOMUtil.XSD_INT); - counterProperty.setReadOnly(); + ((PrismPropertyDefinitionImpl) counterProperty).setReadOnly(); System.out.println("Generic schema before serializing to XSD: "); System.out.println(schema.debugDump()); @@ -120,7 +123,7 @@ public void testRoundTripGeneric() throws SchemaException { Document parsedXsd = DOMUtil.parseDocument(stringXmlSchema); - PrismSchema newSchema = PrismSchema.parse(DOMUtil.getFirstChildElement(parsedXsd), true, "serialized schema", PrismTestUtil.getPrismContext()); + PrismSchema newSchema = PrismSchemaImpl.parse(DOMUtil.getFirstChildElement(parsedXsd), true, "serialized schema", PrismTestUtil.getPrismContext()); System.out.println("Generic schema after parsing from XSD: "); System.out.println(newSchema.debugDump()); @@ -128,7 +131,7 @@ public void testRoundTripGeneric() throws SchemaException { // THEN - PrismPropertyDefinition number1def = newSchema.findItemDefinition(new QName(SCHEMA_NS,"number1"), PrismPropertyDefinition.class); + PrismPropertyDefinition number1def = newSchema.findItemDefinitionByElementName(new QName(SCHEMA_NS,"number1"), PrismPropertyDefinition.class); assertEquals(new QName(SCHEMA_NS,"number1"),number1def.getName()); assertEquals(DOMUtil.XSD_INT,number1def.getTypeName()); @@ -162,25 +165,25 @@ public void testRoundTripGeneric() throws SchemaException { @Test public void testRoundTripResource() throws SchemaException { // GIVEN - ResourceSchema schema = new ResourceSchema(SCHEMA_NS, PrismTestUtil.getPrismContext()); + ResourceSchemaImpl schema = new ResourceSchemaImpl(SCHEMA_NS, PrismTestUtil.getPrismContext()); // Property container - ObjectClassComplexTypeDefinition containerDefinition = schema.createObjectClassDefinition("AccountObjectClass"); + ObjectClassComplexTypeDefinitionImpl containerDefinition = (ObjectClassComplexTypeDefinitionImpl) schema.createObjectClassDefinition("AccountObjectClass"); containerDefinition.setKind(ShadowKindType.ACCOUNT); containerDefinition.setDefaultInAKind(true); containerDefinition.setNativeObjectClass("ACCOUNT"); // ... in it ordinary attribute - an identifier - ResourceAttributeDefinition xloginDef = containerDefinition.createAttributeDefinition("login", DOMUtil.XSD_STRING); + ResourceAttributeDefinitionImpl xloginDef = containerDefinition.createAttributeDefinition("login", DOMUtil.XSD_STRING); ((Collection)containerDefinition.getPrimaryIdentifiers()).add(xloginDef); xloginDef.setNativeAttributeName("LOGIN"); containerDefinition.setDisplayNameAttribute(xloginDef.getName()); // ... and local property with a type from another schema - ResourceAttributeDefinition xpasswdDef = containerDefinition.createAttributeDefinition("password", ProtectedStringType.COMPLEX_TYPE); + ResourceAttributeDefinitionImpl xpasswdDef = containerDefinition.createAttributeDefinition("password", ProtectedStringType.COMPLEX_TYPE); xpasswdDef.setNativeAttributeName("PASSWORD"); // ... property reference containerDefinition.createAttributeDefinition(SchemaConstants.C_CREDENTIALS, SchemaConstants.C_CREDENTIALS_TYPE); // ... ignored attribute - ResourceAttributeDefinition xSepDef = containerDefinition.createAttributeDefinition("sep", DOMUtil.XSD_STRING); + ResourceAttributeDefinitionImpl xSepDef = containerDefinition.createAttributeDefinition("sep", DOMUtil.XSD_STRING); xSepDef.setIgnored(true); System.out.println("Resource schema before serializing to XSD: "); @@ -199,7 +202,7 @@ public void testRoundTripResource() throws SchemaException { Document parsedXsd = DOMUtil.parseDocument(stringXmlSchema); - ResourceSchema newSchema = ResourceSchema.parse(DOMUtil.getFirstChildElement(parsedXsd), "serialized schema", PrismTestUtil.getPrismContext()); + ResourceSchema newSchema = ResourceSchemaImpl.parse(DOMUtil.getFirstChildElement(parsedXsd), "serialized schema", PrismTestUtil.getPrismContext()); System.out.println("Resource schema after parsing from XSD: "); System.out.println(newSchema.debugDump()); diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/processor/TestResourceSchema.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/processor/TestResourceSchema.java index 8c79d075dd9..e9547312924 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/processor/TestResourceSchema.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/processor/TestResourceSchema.java @@ -92,7 +92,7 @@ public void testParseSchema() throws Exception { // WHEN - ResourceSchema schema = ResourceSchema.parse(DOMUtil.getFirstChildElement(schemaDom), + ResourceSchema schema = ResourceSchemaImpl.parse(DOMUtil.getFirstChildElement(schemaDom), RESOURCE_SCHEMA_SIMPLE_FILENAME, PrismTestUtil.getPrismContext()); // THEN @@ -108,7 +108,7 @@ public void testParseSchemaDeprecated() throws Exception { // WHEN - ResourceSchema schema = ResourceSchema.parse(DOMUtil.getFirstChildElement(schemaDom), + ResourceSchema schema = ResourceSchemaImpl.parse(DOMUtil.getFirstChildElement(schemaDom), RESOURCE_SCHEMA_SIMPLE_DEPRECATED_FILENAME, PrismTestUtil.getPrismContext()); // THEN @@ -179,7 +179,7 @@ public void testResourceSchemaJaxbRoundTrip() throws SchemaException, JAXBExcept System.out.println(ObjectTypeUtil.dump(unmarshalledResource)); XmlSchemaType unXmlSchemaType = unmarshalledResource.getSchema(); Element unXsd = unXmlSchemaType.getDefinition().getAny().get(0); - ResourceSchema unSchema = ResourceSchema.parse(unXsd, "unmarshalled resource", PrismTestUtil.getPrismContext()); + ResourceSchema unSchema = ResourceSchemaImpl.parse(unXsd, "unmarshalled resource", PrismTestUtil.getPrismContext()); System.out.println("unmarshalled schema"); System.out.println(unSchema.debugDump()); @@ -225,7 +225,7 @@ public void testResourceSchemaPrismRoundTrip() throws SchemaException, JAXBExcep System.out.println("unmarshalled resource schema"); System.out.println(DOMUtil.serializeDOMToString(unXsd)); - ResourceSchema unSchema = ResourceSchema.parse(unXsd, "unmarshalled resource schema", PrismTestUtil.getPrismContext()); + ResourceSchema unSchema = ResourceSchemaImpl.parse(unXsd, "unmarshalled resource schema", PrismTestUtil.getPrismContext()); System.out.println("unmarshalled parsed schema"); System.out.println(unSchema.debugDump()); @@ -330,10 +330,10 @@ private void assertDomSchema(Element xsdElement) { } private ResourceSchema createResourceSchema() { - ResourceSchema schema = new ResourceSchema(SCHEMA_NAMESPACE, PrismTestUtil.getPrismContext()); + ResourceSchemaImpl schema = new ResourceSchemaImpl(SCHEMA_NAMESPACE, PrismTestUtil.getPrismContext()); // Property container - ObjectClassComplexTypeDefinition containerDefinition = schema.createObjectClassDefinition("AccountObjectClass"); + ObjectClassComplexTypeDefinitionImpl containerDefinition = (ObjectClassComplexTypeDefinitionImpl) schema.createObjectClassDefinition("AccountObjectClass"); containerDefinition.setKind(ShadowKindType.ACCOUNT); containerDefinition.setDefaultInAKind(true); containerDefinition.setDisplayName("The Account"); @@ -342,11 +342,11 @@ private ResourceSchema createResourceSchema() { ResourceAttributeDefinition icfUidDef = containerDefinition.createAttributeDefinition( SchemaTestConstants.ICFS_UID, DOMUtil.XSD_STRING); ((Collection)containerDefinition.getPrimaryIdentifiers()).add(icfUidDef); - ResourceAttributeDefinition xloginDef = containerDefinition.createAttributeDefinition("login", DOMUtil.XSD_STRING); + ResourceAttributeDefinitionImpl xloginDef = containerDefinition.createAttributeDefinition("login", DOMUtil.XSD_STRING); xloginDef.setNativeAttributeName("LOGIN"); containerDefinition.setDisplayNameAttribute(xloginDef.getName()); // ... and local property with a type from another schema - ResourceAttributeDefinition xpasswdDef = containerDefinition.createAttributeDefinition("password", ProtectedStringType.COMPLEX_TYPE); + ResourceAttributeDefinitionImpl xpasswdDef = containerDefinition.createAttributeDefinition("password", ProtectedStringType.COMPLEX_TYPE); xpasswdDef.setNativeAttributeName("PASSWORD"); // ... property reference containerDefinition.createAttributeDefinition(SchemaConstants.C_CREDENTIALS, SchemaConstants.C_CREDENTIALS_TYPE); diff --git a/infra/test-util/src/main/java/com/evolveum/midpoint/test/util/TestUtil.java b/infra/test-util/src/main/java/com/evolveum/midpoint/test/util/TestUtil.java index 8b1fd897581..0cea31f53cd 100644 --- a/infra/test-util/src/main/java/com/evolveum/midpoint/test/util/TestUtil.java +++ b/infra/test-util/src/main/java/com/evolveum/midpoint/test/util/TestUtil.java @@ -24,6 +24,7 @@ import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.processor.ResourceAttribute; import com.evolveum.midpoint.schema.processor.ResourceAttributeDefinition; +import com.evolveum.midpoint.schema.processor.ResourceAttributeDefinitionImpl; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.result.OperationResultStatus; import com.evolveum.midpoint.util.JAXBUtil; @@ -139,7 +140,7 @@ public static String getNodeOid(Node node) { public static void setAttribute(PrismObject account, QName attrName, QName typeName, PrismContext prismContext, String value) throws SchemaException { PrismContainer attributesContainer = account.findContainer(ShadowType.F_ATTRIBUTES); - ResourceAttributeDefinition attrDef = new ResourceAttributeDefinition(attrName, typeName, prismContext); + ResourceAttributeDefinition attrDef = new ResourceAttributeDefinitionImpl(attrName, typeName, prismContext); ResourceAttribute attribute = attrDef.instantiate(); attribute.setRealValue(value); attributesContainer.add(attribute); diff --git a/infra/util/src/main/java/com/evolveum/midpoint/util/QNameUtil.java b/infra/util/src/main/java/com/evolveum/midpoint/util/QNameUtil.java index 9c2f494ea05..f656ccd2832 100644 --- a/infra/util/src/main/java/com/evolveum/midpoint/util/QNameUtil.java +++ b/infra/util/src/main/java/com/evolveum/midpoint/util/QNameUtil.java @@ -84,6 +84,14 @@ public static QName uriToQName(String uri) { return uriToQName(uri, false); } + public static boolean noNamespace(@NotNull QName name) { + return StringUtils.isEmpty(name.getNamespaceURI()); + } + + public static boolean hasNamespace(@NotNull QName name) { + return !noNamespace(name); + } + public static class QNameInfo { @NotNull public final QName name; public final boolean explicitEmptyNamespace; diff --git a/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccCertExpressionHelper.java b/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccCertExpressionHelper.java index 31b2f92e9de..0754feb321f 100644 --- a/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccCertExpressionHelper.java +++ b/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccCertExpressionHelper.java @@ -23,6 +23,7 @@ import com.evolveum.midpoint.model.impl.expr.ModelExpressionThreadLocalHolder; import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismPropertyDefinition; +import com.evolveum.midpoint.prism.PrismPropertyDefinitionImpl; import com.evolveum.midpoint.prism.PrismPropertyValue; import com.evolveum.midpoint.prism.delta.PrismValueDeltaSetTriple; import com.evolveum.midpoint.prism.xml.XsdTypeMapper; @@ -76,7 +77,7 @@ private List evaluateExpression(Class resultClass, ExpressionType expr QName xsdType = XsdTypeMapper.toXsdType(resultClass); QName resultName = new QName(SchemaConstants.NS_C, "result"); - PrismPropertyDefinition resultDef = new PrismPropertyDefinition(resultName, xsdType, prismContext); + PrismPropertyDefinition resultDef = new PrismPropertyDefinitionImpl(resultName, xsdType, prismContext); Expression,PrismPropertyDefinition> expression = expressionFactory.makeExpression(expressionType, resultDef, shortDesc, task, result); ExpressionEvaluationContext params = new ExpressionEvaluationContext(null, expressionVariables, shortDesc, task, result); diff --git a/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/handlers/DirectAssignmentCertificationHandler.java b/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/handlers/DirectAssignmentCertificationHandler.java index 3cb08b5b5ec..c031f0f426c 100644 --- a/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/handlers/DirectAssignmentCertificationHandler.java +++ b/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/handlers/DirectAssignmentCertificationHandler.java @@ -102,7 +102,6 @@ public Collection createCasesForObject(Pr private void processAssignment(AssignmentType assignment, boolean isInducement, AccessCertificationAssignmentReviewScopeType scope, AccessCertificationCampaignType campaign, ObjectType object, List caseList, Task task, OperationResult result) throws ExpressionEvaluationException, ObjectNotFoundException, SchemaException { AccessCertificationAssignmentCaseType assignmentCase = new AccessCertificationAssignmentCaseType(prismContext); - assignmentCase.asPrismContainerValue().setConcreteType(AccessCertificationAssignmentCaseType.COMPLEX_TYPE); assignmentCase.setAssignment(assignment.clone()); assignmentCase.setIsInducement(isInducement); assignmentCase.setObjectRef(ObjectTypeUtil.createObjectRef(object)); diff --git a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/ExpressionUtil.java b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/ExpressionUtil.java index 934ddf7b0f6..1a51d294895 100644 --- a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/ExpressionUtil.java +++ b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/ExpressionUtil.java @@ -670,7 +670,7 @@ private static V evaluateExpression(ExpressionVariables v } if (outputDefinition == null) { - outputDefinition = new PrismPropertyDefinition(ExpressionConstants.OUTPUT_ELMENT_NAME, + outputDefinition = new PrismPropertyDefinitionImpl(ExpressionConstants.OUTPUT_ELMENT_NAME, DOMUtil.XSD_STRING, prismContext); } @@ -716,7 +716,7 @@ private static Collection evaluateStringExpression(ExpressionVariables v String shortDesc, Task task, OperationResult parentResult) throws SchemaException, ExpressionEvaluationException, ObjectNotFoundException { - PrismPropertyDefinition outputDefinition = new PrismPropertyDefinition( + PrismPropertyDefinitionImpl outputDefinition = new PrismPropertyDefinitionImpl( ExpressionConstants.OUTPUT_ELMENT_NAME, DOMUtil.XSD_STRING, prismContext); outputDefinition.setMaxOccurs(-1); Expression, PrismPropertyDefinition> expression = expressionFactory @@ -744,7 +744,7 @@ public static PrismPropertyValue evaluateCondition(ExpressionVariables ExpressionType expressionType, ExpressionFactory expressionFactory, String shortDesc, Task task, OperationResult parentResult) throws SchemaException, ExpressionEvaluationException, ObjectNotFoundException { - ItemDefinition outputDefinition = new PrismPropertyDefinition( + ItemDefinition outputDefinition = new PrismPropertyDefinitionImpl( ExpressionConstants.OUTPUT_ELMENT_NAME, DOMUtil.XSD_BOOLEAN, expressionFactory.getPrismContext()); return (PrismPropertyValue) evaluateExpression(variables, outputDefinition, expressionType, diff --git a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/mapping/Mapping.java b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/mapping/Mapping.java index fc5fd312158..8bddd256755 100644 --- a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/mapping/Mapping.java +++ b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/mapping/Mapping.java @@ -438,7 +438,7 @@ private boolean isInRange(V value, Task task, OperationResult result) throws Exp } variables.addVariableDefinition(ExpressionConstants.VAR_VALUE, value); - PrismPropertyDefinition outputDef = new PrismPropertyDefinition<>(SchemaConstantsGenerated.C_VALUE, DOMUtil.XSD_BOOLEAN, getPrismContext(), null, false); + PrismPropertyDefinition outputDef = new PrismPropertyDefinitionImpl(SchemaConstantsGenerated.C_VALUE, DOMUtil.XSD_BOOLEAN, getPrismContext(), null, false); PrismPropertyValue rv = ExpressionUtil.evaluateExpression(variables, outputDef, range.getIsInSetExpression(), expressionFactory, "isInSet expression in " + contextDescription, task, result); // but now remove the parent! @@ -866,7 +866,7 @@ private void evaluateCondition(Task task, OperationResult result) throws SchemaE conditionOutputTriple.addToZeroSet(new PrismPropertyValue(Boolean.TRUE)); return; } - PrismPropertyDefinition conditionOutput = new PrismPropertyDefinition<>(CONDITION_OUTPUT_NAME, DOMUtil.XSD_BOOLEAN, expressionFactory.getPrismContext()); + PrismPropertyDefinition conditionOutput = new PrismPropertyDefinitionImpl(CONDITION_OUTPUT_NAME, DOMUtil.XSD_BOOLEAN, expressionFactory.getPrismContext()); Expression,PrismPropertyDefinition> expression = expressionFactory.makeExpression(conditionExpressionType, conditionOutput, "condition in "+getMappingContextDescription(), task, result); ExpressionEvaluationContext params = new ExpressionEvaluationContext(sources, variables, diff --git a/model/model-common/src/test/java/com/evolveum/midpoint/model/common/expression/TestExpression.java b/model/model-common/src/test/java/com/evolveum/midpoint/model/common/expression/TestExpression.java index bb53e51952c..6e97e037263 100644 --- a/model/model-common/src/test/java/com/evolveum/midpoint/model/common/expression/TestExpression.java +++ b/model/model-common/src/test/java/com/evolveum/midpoint/model/common/expression/TestExpression.java @@ -21,14 +21,11 @@ import java.io.File; import java.io.IOException; +import com.evolveum.midpoint.prism.*; import org.testng.annotations.BeforeSuite; import org.testng.annotations.Test; import org.xml.sax.SAXException; -import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.PrismObject; -import com.evolveum.midpoint.prism.PrismPropertyDefinition; -import com.evolveum.midpoint.prism.PrismPropertyValue; import com.evolveum.midpoint.prism.crypto.AESProtector; import com.evolveum.midpoint.prism.delta.PrismValueDeltaSetTriple; import com.evolveum.midpoint.prism.util.PrismTestUtil; @@ -90,7 +87,7 @@ public void testIterationCondition() throws Exception { ExpressionType expressionType = PrismTestUtil.parseAtomicValue( EXPRESSION_ITERATION_CONDITION_FILE, ExpressionType.COMPLEX_TYPE); - PrismPropertyDefinition outputDefinition = new PrismPropertyDefinition(ExpressionConstants.OUTPUT_ELMENT_NAME, + PrismPropertyDefinition outputDefinition = new PrismPropertyDefinitionImpl(ExpressionConstants.OUTPUT_ELMENT_NAME, DOMUtil.XSD_BOOLEAN, prismContext); Expression,PrismPropertyDefinition> expression = expressionFactory.makeExpression(expressionType, outputDefinition , TEST_NAME, null, result); diff --git a/model/model-common/src/test/java/com/evolveum/midpoint/model/common/expression/script/AbstractScriptTest.java b/model/model-common/src/test/java/com/evolveum/midpoint/model/common/expression/script/AbstractScriptTest.java index 882fe1f261d..f54ca4d9d29 100644 --- a/model/model-common/src/test/java/com/evolveum/midpoint/model/common/expression/script/AbstractScriptTest.java +++ b/model/model-common/src/test/java/com/evolveum/midpoint/model/common/expression/script/AbstractScriptTest.java @@ -20,11 +20,7 @@ import com.evolveum.midpoint.model.common.expression.ExpressionUtil; import com.evolveum.midpoint.model.common.expression.ExpressionVariables; import com.evolveum.midpoint.model.common.expression.functions.FunctionLibrary; -import com.evolveum.midpoint.prism.ItemDefinition; -import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.PrismPropertyDefinition; -import com.evolveum.midpoint.prism.PrismPropertyValue; -import com.evolveum.midpoint.prism.PrismValue; +import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.crypto.AESProtector; import com.evolveum.midpoint.prism.crypto.Protector; import com.evolveum.midpoint.prism.util.PrismTestUtil; @@ -266,9 +262,9 @@ private List> evaluateExpression(ScriptExpressionEvalu private List> evaluateExpression(ScriptExpressionEvaluatorType scriptType, QName typeName, boolean scalar, ExpressionVariables variables, String shortDesc, OperationResult result) throws ExpressionEvaluationException, ObjectNotFoundException, SchemaException { - ItemDefinition outputDefinition = new PrismPropertyDefinition(PROPERTY_NAME, typeName, PrismTestUtil.getPrismContext()); + ItemDefinition outputDefinition = new PrismPropertyDefinitionImpl(PROPERTY_NAME, typeName, PrismTestUtil.getPrismContext()); if (!scalar) { - outputDefinition.setMaxOccurs(-1); + ((ItemDefinitionImpl) outputDefinition).setMaxOccurs(-1); } return evaluateExpression(scriptType, outputDefinition, variables, shortDesc, result); } diff --git a/model/model-common/src/test/java/com/evolveum/midpoint/model/common/expression/script/TestScriptCaching.java b/model/model-common/src/test/java/com/evolveum/midpoint/model/common/expression/script/TestScriptCaching.java index f07f0c19347..48f9ca9ecdb 100644 --- a/model/model-common/src/test/java/com/evolveum/midpoint/model/common/expression/script/TestScriptCaching.java +++ b/model/model-common/src/test/java/com/evolveum/midpoint/model/common/expression/script/TestScriptCaching.java @@ -19,10 +19,7 @@ import com.evolveum.midpoint.model.common.expression.ExpressionVariables; import com.evolveum.midpoint.model.common.expression.functions.FunctionLibrary; import com.evolveum.midpoint.model.common.expression.script.jsr223.Jsr223ScriptEvaluator; -import com.evolveum.midpoint.prism.ItemDefinition; -import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.PrismPropertyDefinition; -import com.evolveum.midpoint.prism.PrismPropertyValue; +import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.crypto.AESProtector; import com.evolveum.midpoint.prism.crypto.Protector; import com.evolveum.midpoint.prism.util.PrismTestUtil; @@ -138,7 +135,7 @@ private long executeScript(String filname, String expectedResult, String desc) t // GIVEN OperationResult result = new OperationResult(desc); ScriptExpressionEvaluatorType scriptType = parseScriptType(filname); - ItemDefinition outputDefinition = new PrismPropertyDefinition(PROPERTY_NAME, DOMUtil.XSD_STRING, PrismTestUtil.getPrismContext()); + ItemDefinition outputDefinition = new PrismPropertyDefinitionImpl(PROPERTY_NAME, DOMUtil.XSD_STRING, PrismTestUtil.getPrismContext()); ScriptExpression scriptExpression = scriptExpressionfactory.createScriptExpression(scriptType, outputDefinition, desc); diff --git a/model/model-common/src/test/java/com/evolveum/midpoint/model/common/mapping/TestMappingTime.java b/model/model-common/src/test/java/com/evolveum/midpoint/model/common/mapping/TestMappingTime.java index 34d3921e99d..b0fc0a47c32 100644 --- a/model/model-common/src/test/java/com/evolveum/midpoint/model/common/mapping/TestMappingTime.java +++ b/model/model-common/src/test/java/com/evolveum/midpoint/model/common/mapping/TestMappingTime.java @@ -22,6 +22,7 @@ import javax.xml.datatype.XMLGregorianCalendar; +import com.evolveum.midpoint.prism.PrismPropertyDefinitionImpl; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import org.xml.sax.SAXException; @@ -162,7 +163,7 @@ public void testExistenceBefore() throws Exception { builder.setNow(TIME_PAST); - PrismPropertyDefinition existenceDef = new PrismPropertyDefinition( + PrismPropertyDefinition existenceDef = new PrismPropertyDefinitionImpl( ExpressionConstants.OUTPUT_ELMENT_NAME, DOMUtil.XSD_BOOLEAN, evaluator.getPrismContext()); builder.setDefaultTargetDefinition(existenceDef); @@ -193,7 +194,7 @@ public void testExistenceAfter() throws Exception { builder.setNow(TIME_FUTURE); - PrismPropertyDefinition existenceDef = new PrismPropertyDefinition( + PrismPropertyDefinition existenceDef = new PrismPropertyDefinitionImpl( ExpressionConstants.OUTPUT_ELMENT_NAME, DOMUtil.XSD_BOOLEAN, evaluator.getPrismContext()); builder.setDefaultTargetDefinition(existenceDef); @@ -230,7 +231,7 @@ public void testNoReferenceTime() throws Exception { builder.setNow(TIME_PAST); - PrismPropertyDefinition existenceDef = new PrismPropertyDefinition( + PrismPropertyDefinition existenceDef = new PrismPropertyDefinitionImpl( ExpressionConstants.OUTPUT_ELMENT_NAME, DOMUtil.XSD_BOOLEAN, evaluator.getPrismContext()); builder.setDefaultTargetDefinition(existenceDef); @@ -270,7 +271,7 @@ public void testSetReferenceTimeBefore() throws Exception { builder.setNow(TIME_PAST); - PrismPropertyDefinition existenceDef = new PrismPropertyDefinition( + PrismPropertyDefinition existenceDef = new PrismPropertyDefinitionImpl( ExpressionConstants.OUTPUT_ELMENT_NAME, DOMUtil.XSD_BOOLEAN, evaluator.getPrismContext()); builder.setDefaultTargetDefinition(existenceDef); @@ -309,7 +310,7 @@ public void testSetReferenceTimeAfter() throws Exception { builder.setNow(TIME_FUTURE); - PrismPropertyDefinition existenceDef = new PrismPropertyDefinition( + PrismPropertyDefinition existenceDef = new PrismPropertyDefinitionImpl( ExpressionConstants.OUTPUT_ELMENT_NAME, DOMUtil.XSD_BOOLEAN, evaluator.getPrismContext()); builder.setDefaultTargetDefinition(existenceDef); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/ModelInteractionServiceImpl.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/ModelInteractionServiceImpl.java index a040c62a9be..aac0dc0e22c 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/ModelInteractionServiceImpl.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/ModelInteractionServiceImpl.java @@ -19,10 +19,12 @@ import javax.xml.namespace.QName; +import com.evolveum.midpoint.common.refinery.*; import com.evolveum.midpoint.model.api.*; import com.evolveum.midpoint.model.api.visualizer.Scene; import com.evolveum.midpoint.model.common.SystemObjectCache; import com.evolveum.midpoint.model.impl.visualizer.Visualizer; +import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; import org.apache.commons.lang.Validate; import org.jetbrains.annotations.NotNull; @@ -30,20 +32,11 @@ import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; -import com.evolveum.midpoint.common.refinery.CompositeRefinedObjectClassDefinition; -import com.evolveum.midpoint.common.refinery.LayerRefinedAttributeDefinition; -import com.evolveum.midpoint.common.refinery.LayerRefinedObjectClassDefinition; -import com.evolveum.midpoint.common.refinery.RefinedObjectClassDefinition; -import com.evolveum.midpoint.common.refinery.RefinedResourceSchema; import com.evolveum.midpoint.model.api.context.ModelContext; import com.evolveum.midpoint.model.impl.ModelObjectResolver; import com.evolveum.midpoint.model.impl.lens.ContextFactory; import com.evolveum.midpoint.model.impl.lens.LensContext; import com.evolveum.midpoint.model.impl.lens.projector.Projector; -import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.PrismObject; -import com.evolveum.midpoint.prism.PrismObjectDefinition; -import com.evolveum.midpoint.prism.PrismPropertyValue; import com.evolveum.midpoint.prism.crypto.EncryptionException; import com.evolveum.midpoint.prism.crypto.Protector; import com.evolveum.midpoint.prism.delta.ObjectDelta; @@ -273,7 +266,7 @@ public PrismObjectDefinition getEditObjectDefinition(P } RefinedObjectClassDefinition refinedObjectClassDefinition = getEditObjectClassDefinition(shadow, resource, phase); if (refinedObjectClassDefinition != null) { - objectDefinition.getComplexTypeDefinition().replaceDefinition(ShadowType.F_ATTRIBUTES, + ((ComplexTypeDefinitionImpl) objectDefinition.getComplexTypeDefinition()).replaceDefinition(ShadowType.F_ATTRIBUTES, refinedObjectClassDefinition.toResourceAttributeContainerDefinition()); } } @@ -289,7 +282,7 @@ public PrismObjectDefinition getEditShadowDefinition(ResourceShadowD // Make a dummy shadow instance here and evaluate the schema for that. It is not 100% correct. But good enough for now. // TODO: refactor when we add better support for multi-tenancy - PrismObject shadow = prismContext.getSchemaRegistry().instantiate(ShadowType.class); + PrismObject shadow = prismContext.createObject(ShadowType.class); ShadowType shadowType = shadow.asObjectable(); ObjectReferenceType resourceRef = new ObjectReferenceType(); if (discr != null) { @@ -308,7 +301,7 @@ public RefinedObjectClassDefinition getEditObjectClassDefinition(PrismObject> items, ObjectSecurityConstr ItemDefinition itemDef = item.getDefinition(); if (itemDef != null) { if (itemReadDecision != AuthorizationDecisionType.ALLOW) { - itemDef.setCanRead(false); + ((ItemDefinitionImpl) itemDef).setCanRead(false); } if (itemAddDecision != AuthorizationDecisionType.ALLOW) { - itemDef.setCanAdd(false); + ((ItemDefinitionImpl) itemDef).setCanAdd(false); } if (itemModifyDecision != AuthorizationDecisionType.ALLOW) { - itemDef.setCanModify(false); + ((ItemDefinitionImpl) itemDef).setCanModify(false); } } if (item instanceof PrismContainer) { @@ -354,13 +343,13 @@ private void applySecurityConstraintsItemDef(D itemDe LOGGER.trace("applySecurityConstraints(itemDef): {}: decisions R={}, A={}, M={}", new Object[]{itemPath, readDecision, addDecision, modifyDecision}); if (readDecision != AuthorizationDecisionType.ALLOW) { - itemDefinition.setCanRead(false); + ((ItemDefinitionImpl) itemDefinition).setCanRead(false); } if (addDecision != AuthorizationDecisionType.ALLOW) { - itemDefinition.setCanAdd(false); + ((ItemDefinitionImpl) itemDefinition).setCanAdd(false); } if (modifyDecision != AuthorizationDecisionType.ALLOW) { - itemDefinition.setCanModify(false); + ((ItemDefinitionImpl) itemDefinition).setCanModify(false); } if (itemDefinition instanceof PrismContainerDefinition) { @@ -489,17 +478,17 @@ private void applyObjectTempla String displayName = templateItemDefType.getDisplayName(); if (displayName != null) { - itemDef.setDisplayName(displayName); + ((ItemDefinitionImpl) itemDef).setDisplayName(displayName); } Integer displayOrder = templateItemDefType.getDisplayOrder(); if (displayOrder != null) { - itemDef.setDisplayOrder(displayOrder); + ((ItemDefinitionImpl) itemDef).setDisplayOrder(displayOrder); } Boolean emphasized = templateItemDefType.isEmphasized(); if (emphasized != null) { - itemDef.setEmphasized(emphasized); + ((ItemDefinitionImpl) itemDef).setEmphasized(emphasized); } List limitations = templateItemDefType.getLimitations(); @@ -507,24 +496,24 @@ private void applyObjectTempla PropertyLimitationsType limitationsType = MiscSchemaUtil.getLimitationsType(limitations, LayerType.PRESENTATION); if (limitationsType != null) { if (limitationsType.getMinOccurs() != null) { - itemDef.setMinOccurs(XsdTypeMapper.multiplicityToInteger(limitationsType.getMinOccurs())); + ((ItemDefinitionImpl) itemDef).setMinOccurs(XsdTypeMapper.multiplicityToInteger(limitationsType.getMinOccurs())); } if (limitationsType.getMaxOccurs() != null) { - itemDef.setMaxOccurs(XsdTypeMapper.multiplicityToInteger(limitationsType.getMaxOccurs())); + ((ItemDefinitionImpl) itemDef).setMaxOccurs(XsdTypeMapper.multiplicityToInteger(limitationsType.getMaxOccurs())); } if (limitationsType.isIgnore() != null) { - itemDef.setIgnored(limitationsType.isIgnore()); + ((ItemDefinitionImpl) itemDef).setIgnored(limitationsType.isIgnore()); } PropertyAccessType accessType = limitationsType.getAccess(); if (accessType != null) { if (accessType.isAdd() != null) { - itemDef.setCanAdd(accessType.isAdd()); + ((ItemDefinitionImpl) itemDef).setCanAdd(accessType.isAdd()); } if (accessType.isModify() != null) { - itemDef.setCanModify(accessType.isModify()); + ((ItemDefinitionImpl) itemDef).setCanModify(accessType.isModify()); } if (accessType.isRead() != null) { - itemDef.setCanRead(accessType.isRead()); + ((ItemDefinitionImpl) itemDef).setCanRead(accessType.isRead()); } } } @@ -533,7 +522,7 @@ private void applyObjectTempla ObjectReferenceType valueEnumerationRef = templateItemDefType.getValueEnumerationRef(); if (valueEnumerationRef != null) { PrismReferenceValue valueEnumerationRVal = MiscSchemaUtil.objectReferenceTypeToReferenceValue(valueEnumerationRef); - itemDef.setValueEnumerationRef(valueEnumerationRVal); + ((ItemDefinitionImpl) itemDef).setValueEnumerationRef(valueEnumerationRVal); } } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/dataModel/DataModelVisualizerImpl.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/dataModel/DataModelVisualizerImpl.java index d74674ad7b3..932788ffa45 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/dataModel/DataModelVisualizerImpl.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/dataModel/DataModelVisualizerImpl.java @@ -1,9 +1,6 @@ package com.evolveum.midpoint.model.impl.dataModel; -import com.evolveum.midpoint.common.refinery.RefinedAssociationDefinition; -import com.evolveum.midpoint.common.refinery.RefinedAttributeDefinition; -import com.evolveum.midpoint.common.refinery.RefinedObjectClassDefinition; -import com.evolveum.midpoint.common.refinery.RefinedResourceSchema; +import com.evolveum.midpoint.common.refinery.*; import com.evolveum.midpoint.model.api.ModelService; import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismObject; @@ -93,7 +90,7 @@ public String visualize(ResourceType resource, Task task, OperationResult result private void processResourceMappings(VisualizationContext ctx, List> resources) throws SchemaException { for (PrismObject resource : resources) { LOGGER.debug("Processing {}", ObjectTypeUtil.toShortString(resource)); - RefinedResourceSchema refinedResourceSchema = RefinedResourceSchema.getRefinedSchema(resource); + RefinedResourceSchema refinedResourceSchema = RefinedResourceSchemaImpl.getRefinedSchema(resource); if (refinedResourceSchema == null) { LOGGER.debug("Refined resource schema is null, skipping the resource."); continue; @@ -177,12 +174,12 @@ private void processBidirectionalMapping(VisualizationContext ctx, String oid, S private void createDataItems(VisualizationContext ctx, List> resources) throws SchemaException { LOGGER.debug("createDataItems starting"); for (PrismObject resource : resources) { - final ResourceSchema resourceSchema = RefinedResourceSchema.getResourceSchema(resource, prismContext); + final ResourceSchema resourceSchema = RefinedResourceSchemaImpl.getResourceSchema(resource, prismContext); if (resourceSchema == null) { LOGGER.debug("Resource schema is null, skipping the resource."); continue; } - RefinedResourceSchema refinedResourceSchema = RefinedResourceSchema.getRefinedSchema(resource); + RefinedResourceSchema refinedResourceSchema = RefinedResourceSchemaImpl.getRefinedSchema(resource); if (refinedResourceSchema == null) { LOGGER.debug("Refined resource schema is null, skipping the resource."); // actually shouldn't be null if resource schema exists continue; diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/dataModel/VisualizationContext.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/dataModel/VisualizationContext.java index 75e7d5ab815..c1ed46ad037 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/dataModel/VisualizationContext.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/dataModel/VisualizationContext.java @@ -3,6 +3,7 @@ import com.evolveum.midpoint.common.refinery.RefinedAssociationDefinition; import com.evolveum.midpoint.common.refinery.RefinedObjectClassDefinition; import com.evolveum.midpoint.common.refinery.RefinedResourceSchema; +import com.evolveum.midpoint.common.refinery.RefinedResourceSchemaImpl; import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.path.ItemPath; @@ -67,7 +68,7 @@ public RefinedResourceSchema getRefinedResourceSchema(String resourceOid) { return null; } try { - return RefinedResourceSchema.getRefinedSchema(resource, prismContext); + return RefinedResourceSchemaImpl.getRefinedSchema(resource, prismContext); } catch (SchemaException e) { throw new SystemException("Unexpected exception: " + e.getMessage(), e); } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/expr/ExpressionHandler.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/expr/ExpressionHandler.java index dbe0d572111..2b1fff7e9f7 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/expr/ExpressionHandler.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/expr/ExpressionHandler.java @@ -23,6 +23,7 @@ import com.evolveum.midpoint.model.impl.ModelObjectResolver; import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismPropertyDefinition; +import com.evolveum.midpoint.prism.PrismPropertyDefinitionImpl; import com.evolveum.midpoint.prism.PrismPropertyValue; import com.evolveum.midpoint.prism.delta.PrismValueDeltaSetTriple; import com.evolveum.midpoint.repo.api.RepositoryService; @@ -75,7 +76,7 @@ public String evaluateExpression(ShadowType shadow, ExpressionType expressionTyp ExpressionVariables variables = getDefaultXPathVariables(null, shadow, resource); - PrismPropertyDefinition outputDefinition = new PrismPropertyDefinition<>(ExpressionConstants.OUTPUT_ELMENT_NAME, + PrismPropertyDefinition outputDefinition = new PrismPropertyDefinitionImpl<>(ExpressionConstants.OUTPUT_ELMENT_NAME, DOMUtil.XSD_STRING, prismContext); Expression,PrismPropertyDefinition> expression = expressionFactory.makeExpression(expressionType, outputDefinition, shortDesc, task, result); @@ -107,7 +108,7 @@ public boolean evaluateConfirmationExpression(UserType user, ShadowType shadow, ExpressionVariables variables = getDefaultXPathVariables(user, shadow, resource); String shortDesc = "confirmation expression for "+resource.asPrismObject(); - PrismPropertyDefinition outputDefinition = new PrismPropertyDefinition<>(ExpressionConstants.OUTPUT_ELMENT_NAME, + PrismPropertyDefinition outputDefinition = new PrismPropertyDefinitionImpl<>(ExpressionConstants.OUTPUT_ELMENT_NAME, DOMUtil.XSD_BOOLEAN, prismContext); Expression,PrismPropertyDefinition> expression = expressionFactory.makeExpression(expressionType, outputDefinition, shortDesc, task, result); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/expr/MidpointFunctionsImpl.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/expr/MidpointFunctionsImpl.java index aac37de5f1d..5c17015f17d 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/expr/MidpointFunctionsImpl.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/expr/MidpointFunctionsImpl.java @@ -18,6 +18,7 @@ import com.evolveum.midpoint.common.refinery.RefinedAttributeDefinition; import com.evolveum.midpoint.common.refinery.RefinedObjectClassDefinition; import com.evolveum.midpoint.common.refinery.RefinedResourceSchema; +import com.evolveum.midpoint.common.refinery.RefinedResourceSchemaImpl; import com.evolveum.midpoint.model.api.context.ModelContext; import com.evolveum.midpoint.model.api.context.SynchronizationPolicyDecision; import com.evolveum.midpoint.model.api.expr.MidpointFunctions; @@ -503,7 +504,7 @@ public Integer countAccounts(ResourceType resourceType, String attributeName private Integer countAccounts(ResourceType resourceType, QName attributeName, T attributeValue, Task task, OperationResult result) throws SchemaException, ObjectNotFoundException, CommunicationException, ConfigurationException, SecurityViolationException { - RefinedResourceSchema rSchema = RefinedResourceSchema.getRefinedSchema(resourceType); + RefinedResourceSchema rSchema = RefinedResourceSchemaImpl.getRefinedSchema(resourceType); RefinedObjectClassDefinition rAccountDef = rSchema.getDefaultRefinedDefinition(ShadowKindType.ACCOUNT); RefinedAttributeDefinition attrDef = rAccountDef.findAttributeDefinition(attributeName); ObjectQuery query = QueryBuilder.queryFor(ShadowType.class, prismContext) @@ -602,7 +603,7 @@ private boolean isUniqueAccountValue(ResourceType resourceType, final Shadow Validate.notNull(shadowType, "Null shadow"); Validate.notNull(attributeName, "Null attribute name"); Validate.notNull(attributeValue, "Null attribute value"); - RefinedResourceSchema rSchema = RefinedResourceSchema.getRefinedSchema(resourceType); + RefinedResourceSchema rSchema = RefinedResourceSchemaImpl.getRefinedSchema(resourceType); RefinedObjectClassDefinition rAccountDef = rSchema.getDefaultRefinedDefinition(ShadowKindType.ACCOUNT); RefinedAttributeDefinition attrDef = rAccountDef.findAttributeDefinition(attributeName); ObjectQuery query = QueryBuilder.queryFor(ShadowType.class, prismContext) diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/importer/ImportAccountsFromResourceTaskHandler.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/importer/ImportAccountsFromResourceTaskHandler.java index 4892dfa4229..c75677aae94 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/importer/ImportAccountsFromResourceTaskHandler.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/importer/ImportAccountsFromResourceTaskHandler.java @@ -20,6 +20,8 @@ import javax.annotation.PostConstruct; import javax.xml.namespace.QName; +import com.evolveum.midpoint.common.refinery.RefinedResourceSchemaImpl; +import com.evolveum.midpoint.prism.PrismPropertyDefinitionImpl; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -115,7 +117,7 @@ public ImportAccountsFromResourceTaskHandler() { @PostConstruct private void initialize() { // this call must not be in the constructor, because prismContext is not yet initialized at that moment - objectclassPropertyDefinition = new PrismPropertyDefinition<>(ModelConstants.OBJECTCLASS_PROPERTY_NAME, + objectclassPropertyDefinition = new PrismPropertyDefinitionImpl<>(ModelConstants.OBJECTCLASS_PROPERTY_NAME, DOMUtil.XSD_QNAME, prismContext); taskManager.registerHandler(HANDLER_URI, this); @@ -194,7 +196,7 @@ private SynchronizeAccountResultHandler createHandler(ResourceType resource, Pri RefinedResourceSchema refinedSchema; ObjectClassComplexTypeDefinition objectClass; try { - refinedSchema = RefinedResourceSchema.getRefinedSchema(resource, LayerType.MODEL, prismContext); + refinedSchema = RefinedResourceSchemaImpl.getRefinedSchema(resource, LayerType.MODEL, prismContext); if (LOGGER.isTraceEnabled()) { LOGGER.trace("Refined schema:\n{}", refinedSchema.debugDump()); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/importer/ImportObjectsFromFileTaskHandler.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/importer/ImportObjectsFromFileTaskHandler.java index c3dc55491c4..8ce22676573 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/importer/ImportObjectsFromFileTaskHandler.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/importer/ImportObjectsFromFileTaskHandler.java @@ -19,6 +19,7 @@ import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismProperty; import com.evolveum.midpoint.prism.PrismPropertyDefinition; +import com.evolveum.midpoint.prism.PrismPropertyDefinitionImpl; import com.evolveum.midpoint.provisioning.api.ChangeNotificationDispatcher; import com.evolveum.midpoint.provisioning.api.ResourceObjectChangeListener; import com.evolveum.midpoint.schema.result.OperationConstants; @@ -80,7 +81,7 @@ public ImportObjectsFromFileTaskHandler() { @PostConstruct private void initialize() { - filenamePropertyDefinition = new PrismPropertyDefinition(ModelConstants.FILENAME_PROPERTY_NAME, + filenamePropertyDefinition = new PrismPropertyDefinitionImpl(ModelConstants.FILENAME_PROPERTY_NAME, DOMUtil.XSD_STRING, prismContext); // must not be in the constructor, because prismContext is null at that time taskManager.registerHandler(HANDLER_URI, this); } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/importer/ObjectImporter.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/importer/ObjectImporter.java index 474b10c19d4..434ada5f186 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/importer/ObjectImporter.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/importer/ObjectImporter.java @@ -34,6 +34,7 @@ import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.prism.query.QueryJaxbConvertor; import com.evolveum.midpoint.prism.schema.PrismSchema; +import com.evolveum.midpoint.prism.schema.PrismSchemaImpl; import com.evolveum.midpoint.prism.xml.XmlTypeConverter; import com.evolveum.midpoint.repo.api.RepoAddOptions; import com.evolveum.midpoint.repo.api.RepositoryService; @@ -449,7 +450,7 @@ protected void validateWithDynamicSchemas(PrismObject return; } try { - connectorSchema = PrismSchema.parse(connectorSchemaElement, true, "schema for " + connector, prismContext); + connectorSchema = PrismSchemaImpl.parse(connectorSchemaElement, true, "schema for " + connector, prismContext); } catch (SchemaException e) { result.recordFatalError("Error parsing connector schema for " + connector + ": "+e.getMessage(), e); return; @@ -511,7 +512,7 @@ private void checkSchema(XmlSchemaType dynamicSchema, String schemaName, Operati } try { - PrismSchema.parse(xsdElement, true, schemaName, prismContext); + PrismSchemaImpl.parse(xsdElement, true, schemaName, prismContext); } catch (SchemaException e) { result.recordFatalError("Error during " + schemaName + " schema integrity check: " + e.getMessage(), e); return; @@ -540,7 +541,7 @@ private PrismContainer validateDynamicSchema(List contentElements, QName com.evolveum.midpoint.prism.schema.PrismSchema schema = null; try { - schema = com.evolveum.midpoint.prism.schema.PrismSchema.parse(xsdElement, true, schemaName, prismContext); + schema = com.evolveum.midpoint.prism.schema.PrismSchemaImpl.parse(xsdElement, true, schemaName, prismContext); } catch (SchemaException e) { result.recordFatalError("Error during " + schemaName + " schema parsing: " + e.getMessage(), e); LOGGER.trace("Validation error: {}" + e.getMessage()); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/integrity/ShadowIntegrityCheckResultHandler.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/integrity/ShadowIntegrityCheckResultHandler.java index b1fbfe25b22..f5c179b1120 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/integrity/ShadowIntegrityCheckResultHandler.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/integrity/ShadowIntegrityCheckResultHandler.java @@ -18,6 +18,7 @@ import com.evolveum.midpoint.common.refinery.RefinedAttributeDefinition; import com.evolveum.midpoint.common.refinery.RefinedResourceSchema; +import com.evolveum.midpoint.common.refinery.RefinedResourceSchemaImpl; import com.evolveum.midpoint.model.common.SystemObjectCache; import com.evolveum.midpoint.model.impl.sync.SynchronizationService; import com.evolveum.midpoint.model.impl.util.AbstractSearchIterativeResultHandler; @@ -404,7 +405,7 @@ private void checkShadow(ShadowCheckResult checkResult, PrismObject context.setResource(resource); RefinedResourceSchema resourceSchema; try { - resourceSchema = RefinedResourceSchema.getRefinedSchema(context.getResource(), LayerType.MODEL, prismContext); + resourceSchema = RefinedResourceSchemaImpl.getRefinedSchema(context.getResource(), LayerType.MODEL, prismContext); } catch (SchemaException e) { checkResult.recordError(Statistics.CANNOT_GET_REFINED_SCHEMA, new SchemaException("Couldn't derive resource schema: " + e.getMessage(), e)); return; diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/AssignmentEvaluator.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/AssignmentEvaluator.java index 81bc0b30ccd..7b610ee193e 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/AssignmentEvaluator.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/AssignmentEvaluator.java @@ -34,18 +34,7 @@ import com.evolveum.midpoint.model.impl.expr.ModelExpressionThreadLocalHolder; import com.evolveum.midpoint.model.impl.lens.projector.MappingEvaluator; import com.evolveum.midpoint.model.impl.util.Utils; -import com.evolveum.midpoint.prism.Containerable; -import com.evolveum.midpoint.prism.Item; -import com.evolveum.midpoint.prism.OriginType; -import com.evolveum.midpoint.prism.PrismContainer; -import com.evolveum.midpoint.prism.PrismContainerDefinition; -import com.evolveum.midpoint.prism.PrismContainerValue; -import com.evolveum.midpoint.prism.PrismContainerable; -import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.PrismObject; -import com.evolveum.midpoint.prism.PrismPropertyDefinition; -import com.evolveum.midpoint.prism.PrismPropertyValue; -import com.evolveum.midpoint.prism.PrismReferenceValue; +import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.delta.PlusMinusZero; import com.evolveum.midpoint.prism.delta.PrismValueDeltaSetTriple; import com.evolveum.midpoint.prism.marshaller.QueryConvertor; @@ -744,7 +733,7 @@ public PrismValueDeltaSetTriple> evaluateMappingAsCo .sourceContext(focusOdo) .originType(OriginType.ASSIGNMENTS) .originObject(source) - .defaultTargetDefinition(new PrismPropertyDefinition(CONDITION_OUTPUT_NAME, DOMUtil.XSD_BOOLEAN, prismContext)); + .defaultTargetDefinition(new PrismPropertyDefinitionImpl<>(CONDITION_OUTPUT_NAME, DOMUtil.XSD_BOOLEAN, prismContext)); builder.addVariableDefinition(ExpressionConstants.VAR_USER, focusOdo); builder.addVariableDefinition(ExpressionConstants.VAR_FOCUS, focusOdo); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/ChangeExecutor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/ChangeExecutor.java index b5a16364ee8..f9a03cbe98d 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/ChangeExecutor.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/ChangeExecutor.java @@ -35,16 +35,7 @@ import com.evolveum.midpoint.model.impl.expr.ModelExpressionThreadLocalHolder; import com.evolveum.midpoint.model.impl.lens.projector.FocusConstraintsChecker; import com.evolveum.midpoint.model.impl.util.Utils; -import com.evolveum.midpoint.prism.ConsistencyCheckScope; -import com.evolveum.midpoint.prism.PrismContainer; -import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.PrismObject; -import com.evolveum.midpoint.prism.PrismObjectDefinition; -import com.evolveum.midpoint.prism.PrismProperty; -import com.evolveum.midpoint.prism.PrismPropertyDefinition; -import com.evolveum.midpoint.prism.PrismPropertyValue; -import com.evolveum.midpoint.prism.PrismReference; -import com.evolveum.midpoint.prism.PrismReferenceValue; +import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.delta.ChangeType; import com.evolveum.midpoint.prism.delta.ItemDelta; import com.evolveum.midpoint.prism.delta.ObjectDelta; @@ -1522,7 +1513,7 @@ private void evaluateScriptArgument(ProvisioningScriptArgumentType argument, QName FAKE_SCRIPT_ARGUMENT_NAME = new QName(SchemaConstants.NS_C, "arg"); - PrismPropertyDefinition scriptArgumentDefinition = new PrismPropertyDefinition<>( + PrismPropertyDefinition scriptArgumentDefinition = new PrismPropertyDefinitionImpl<>( FAKE_SCRIPT_ARGUMENT_NAME, DOMUtil.XSD_STRING, prismContext); String shortDesc = "Provisioning script argument expression"; diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/Construction.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/Construction.java index 8e7660a5957..fa7672e6dbe 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/Construction.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/Construction.java @@ -22,10 +22,7 @@ import javax.xml.namespace.QName; -import com.evolveum.midpoint.common.refinery.RefinedAssociationDefinition; -import com.evolveum.midpoint.common.refinery.RefinedAttributeDefinition; -import com.evolveum.midpoint.common.refinery.RefinedObjectClassDefinition; -import com.evolveum.midpoint.common.refinery.RefinedResourceSchema; +import com.evolveum.midpoint.common.refinery.*; import com.evolveum.midpoint.model.common.expression.ExpressionUtil; import com.evolveum.midpoint.model.common.expression.ExpressionVariables; import com.evolveum.midpoint.model.common.expression.ObjectDeltaObject; @@ -451,7 +448,7 @@ private void evaluateKindIntentObjectClass(Task task, OperationResult result) "The specified resource and the resource in construction does not match"); } - RefinedResourceSchema refinedSchema = RefinedResourceSchema.getRefinedSchema(resource, + RefinedResourceSchema refinedSchema = RefinedResourceSchemaImpl.getRefinedSchema(resource, LayerType.MODEL, prismContext); if (refinedSchema == null) { // Refined schema may be null in some error-related border cases diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensProjectionContext.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensProjectionContext.java index a4df0405727..b73a64c0304 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensProjectionContext.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensProjectionContext.java @@ -25,6 +25,7 @@ import javax.xml.namespace.QName; +import com.evolveum.midpoint.common.refinery.*; import com.evolveum.midpoint.model.common.expression.ObjectDeltaObject; import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.delta.ItemDelta; @@ -40,10 +41,6 @@ import org.jvnet.jaxb2_commons.lang.Validate; import com.evolveum.midpoint.common.crypto.CryptoUtil; -import com.evolveum.midpoint.common.refinery.CompositeRefinedObjectClassDefinition; -import com.evolveum.midpoint.common.refinery.RefinedAttributeDefinition; -import com.evolveum.midpoint.common.refinery.RefinedObjectClassDefinition; -import com.evolveum.midpoint.common.refinery.RefinedResourceSchema; import com.evolveum.midpoint.model.api.context.ModelProjectionContext; import com.evolveum.midpoint.model.api.context.SynchronizationPolicyDecision; import com.evolveum.midpoint.prism.delta.ChangeType; @@ -566,14 +563,14 @@ public ResourceObjectTypeDefinitionType getResourceObjectTypeDefinitionType() { } private ResourceSchema getResourceSchema() throws SchemaException { - return RefinedResourceSchema.getResourceSchema(resource, getNotNullPrismContext()); + return RefinedResourceSchemaImpl.getResourceSchema(resource, getNotNullPrismContext()); } public RefinedResourceSchema getRefinedResourceSchema() throws SchemaException { if (resource == null) { return null; } - return RefinedResourceSchema.getRefinedSchema(resource, LayerType.MODEL, getNotNullPrismContext()); + return RefinedResourceSchemaImpl.getRefinedSchema(resource, LayerType.MODEL, getNotNullPrismContext()); } public RefinedObjectClassDefinition getStructuralObjectClassDefinition() throws SchemaException { diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensUtil.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensUtil.java index 571cbb96bac..35c75c150c5 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensUtil.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensUtil.java @@ -27,6 +27,7 @@ import javax.xml.datatype.XMLGregorianCalendar; import javax.xml.namespace.QName; +import com.evolveum.midpoint.common.refinery.RefinedResourceSchemaImpl; import com.evolveum.midpoint.model.common.SystemObjectCache; import com.evolveum.midpoint.model.common.expression.*; import com.evolveum.midpoint.prism.polystring.PolyString; @@ -126,7 +127,7 @@ public static ResourceType getResourceReadOnly(LensContex } public static String refineProjectionIntent(ShadowKindType kind, String intent, ResourceType resource, PrismContext prismContext) throws SchemaException { - RefinedResourceSchema refinedSchema = RefinedResourceSchema.getRefinedSchema(resource, LayerType.MODEL, prismContext); + RefinedResourceSchema refinedSchema = RefinedResourceSchemaImpl.getRefinedSchema(resource, LayerType.MODEL, prismContext); RefinedObjectClassDefinition rObjClassDef = refinedSchema.getRefinedDefinition(kind, intent); if (rObjClassDef == null) { throw new SchemaException("No projection definition for kind="+kind+" intent="+intent+" in "+resource); @@ -562,7 +563,7 @@ public static Object getIterationVariableValue(LensProjectionContext accCtx) { if (iterationOld == null) { return accCtx.getIteration(); } - PrismPropertyDefinition propDef = new PrismPropertyDefinition(ExpressionConstants.VAR_ITERATION, + PrismPropertyDefinition propDef = new PrismPropertyDefinitionImpl<>(ExpressionConstants.VAR_ITERATION, DOMUtil.XSD_INT, accCtx.getPrismContext()); PrismProperty propOld = propDef.instantiate(); propOld.setRealValue(iterationOld); @@ -583,7 +584,7 @@ public static Object getIterationTokenVariableValue(LensProjectionContext accCtx if (iterationTokenOld == null) { return accCtx.getIterationToken(); } - PrismPropertyDefinition propDef = new PrismPropertyDefinition( + PrismPropertyDefinition propDef = new PrismPropertyDefinitionImpl<>( ExpressionConstants.VAR_ITERATION_TOKEN, DOMUtil.XSD_STRING, accCtx.getPrismContext()); PrismProperty propOld = propDef.instantiate(); propOld.setRealValue(iterationTokenOld); @@ -763,12 +764,12 @@ public static String formatIterationToken(LensContext if (tokenExpressionType == null) { return formatIterationTokenDefault(iteration); } - PrismPropertyDefinition outputDefinition = new PrismPropertyDefinition(ExpressionConstants.VAR_ITERATION_TOKEN, + PrismPropertyDefinition outputDefinition = new PrismPropertyDefinitionImpl<>(ExpressionConstants.VAR_ITERATION_TOKEN, DOMUtil.XSD_STRING, context.getPrismContext()); Expression,PrismPropertyDefinition> expression = expressionFactory.makeExpression(tokenExpressionType, outputDefinition , "iteration token expression in "+accountContext.getHumanReadableName(), task, result); Collection> sources = new ArrayList<>(); - PrismPropertyDefinition inputDefinition = new PrismPropertyDefinition(ExpressionConstants.VAR_ITERATION, + PrismPropertyDefinitionImpl inputDefinition = new PrismPropertyDefinitionImpl<>(ExpressionConstants.VAR_ITERATION, DOMUtil.XSD_INT, context.getPrismContext()); inputDefinition.setMaxOccurs(1); PrismProperty input = inputDefinition.instantiate(); @@ -821,7 +822,8 @@ public static boolean evaluateIterationCondition(LensCont if (expressionType == null) { return true; } - PrismPropertyDefinition outputDefinition = new PrismPropertyDefinition(ExpressionConstants.OUTPUT_ELMENT_NAME, + PrismPropertyDefinition outputDefinition = new PrismPropertyDefinitionImpl<>( + ExpressionConstants.OUTPUT_ELMENT_NAME, DOMUtil.XSD_BOOLEAN, context.getPrismContext()); Expression,PrismPropertyDefinition> expression = expressionFactory.makeExpression(expressionType, outputDefinition , desc, task, result); @@ -1214,7 +1216,7 @@ public static PrismContainer createAssignmentSingleValueContaine PrismContainerValue assignmentCVal = assignmentType.asPrismContainerValue(); PrismContainerDefinition def = assignmentCVal.getParent().getDefinition().clone(); // Make it appear to be single-value. Therefore paths without segment IDs will work. - def.setMaxOccurs(1); + ((PrismContainerDefinitionImpl) def).setMaxOccurs(1); PrismContainer assignmentCont = def.instantiate(); assignmentCont.add(assignmentCVal.clone()); return assignmentCont; diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/ActivationProcessor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/ActivationProcessor.java index ff8c393e538..805c3ed145e 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/ActivationProcessor.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/ActivationProcessor.java @@ -26,14 +26,7 @@ import com.evolveum.midpoint.model.impl.lens.LensProjectionContext; import com.evolveum.midpoint.model.impl.lens.LensUtil; import com.evolveum.midpoint.model.impl.lens.SynchronizationIntent; -import com.evolveum.midpoint.prism.OriginType; -import com.evolveum.midpoint.prism.PrismContainerDefinition; -import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.PrismObject; -import com.evolveum.midpoint.prism.PrismObjectDefinition; -import com.evolveum.midpoint.prism.PrismProperty; -import com.evolveum.midpoint.prism.PrismPropertyDefinition; -import com.evolveum.midpoint.prism.PrismPropertyValue; +import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.delta.ObjectDelta; import com.evolveum.midpoint.prism.delta.PrismValueDeltaSetTriple; import com.evolveum.midpoint.prism.delta.PropertyDelta; @@ -530,7 +523,7 @@ public void process(ItemPath mappingOutputPath, params.setFixTarget(true); params.setContext(context); - PrismPropertyDefinition shadowExistsDef = new PrismPropertyDefinition<>( + PrismPropertyDefinitionImpl shadowExistsDef = new PrismPropertyDefinitionImpl<>( SHADOW_EXISTS_PROPERTY_NAME, DOMUtil.XSD_BOOLEAN, prismContext); shadowExistsDef.setMinOccurs(1); @@ -657,7 +650,7 @@ private ItemDeltaItem,PrismPropertyDefinition, PrismPropertyDefinition> createBooleanIdi( QName propertyName, Boolean old, Boolean current) throws SchemaException { - PrismPropertyDefinition definition = new PrismPropertyDefinition<>(propertyName, DOMUtil.XSD_BOOLEAN, prismContext); + PrismPropertyDefinitionImpl definition = new PrismPropertyDefinitionImpl<>(propertyName, DOMUtil.XSD_BOOLEAN, prismContext); definition.setMinOccurs(1); definition.setMaxOccurs(1); PrismProperty property = definition.instantiate(); @@ -698,7 +691,7 @@ private ItemDeltaItem,PrismPr } } - PrismPropertyDefinition existsDef = new PrismPropertyDefinition(FOCUS_EXISTS_PROPERTY_NAME, + PrismPropertyDefinitionImpl existsDef = new PrismPropertyDefinitionImpl<>(FOCUS_EXISTS_PROPERTY_NAME, DOMUtil.XSD_BOOLEAN, prismContext); existsDef.setMinOccurs(1); existsDef.setMaxOccurs(1); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/Data.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/Data.java index d9a5f2ce2fa..af385491b5f 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/Data.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/Data.java @@ -17,13 +17,7 @@ package com.evolveum.midpoint.model.impl.scripting; import com.evolveum.midpoint.model.api.ScriptExecutionException; -import com.evolveum.midpoint.prism.Item; -import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.PrismObject; -import com.evolveum.midpoint.prism.PrismProperty; -import com.evolveum.midpoint.prism.PrismPropertyDefinition; -import com.evolveum.midpoint.prism.PrismReference; -import com.evolveum.midpoint.prism.PrismReferenceValue; +import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.util.DOMUtil; import com.evolveum.midpoint.util.DebugDumpable; @@ -127,7 +121,7 @@ public static Data createProperty(List objects, Class clazz, PrismCon } else { throw new IllegalStateException("Unsupported data class (to be put into scripting data as property): " + clazz); } - PrismPropertyDefinition propertyDefinition = new PrismPropertyDefinition<>(elementName, typeName, prismContext); + PrismPropertyDefinition propertyDefinition = new PrismPropertyDefinitionImpl<>(elementName, typeName, prismContext); PrismProperty property = propertyDefinition.instantiate(); for (Object object : objects) { property.addRealValue(object); @@ -144,7 +138,7 @@ public Collection getDataAsReferences(QName defaultTargetTy ref.setOid(((PrismObject) item).getOid()); // todo check if oid is present retval.add(ref); } else if (item instanceof PrismProperty) { - for (Object value : ((PrismProperty) item).getRealValues()) { + for (Object value : item.getRealValues()) { if (value instanceof String) { ObjectReferenceType ref = new ObjectReferenceType(); ref.setType(defaultTargetType); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/CorrelationConfirmationEvaluator.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/CorrelationConfirmationEvaluator.java index b1e4c5ffd67..16b26fe4822 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/CorrelationConfirmationEvaluator.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/CorrelationConfirmationEvaluator.java @@ -21,6 +21,7 @@ import java.util.List; import com.evolveum.midpoint.model.impl.expr.ModelExpressionThreadLocalHolder; +import com.evolveum.midpoint.prism.*; import org.apache.commons.lang.Validate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; @@ -32,11 +33,6 @@ import com.evolveum.midpoint.model.common.expression.ExpressionUtil; import com.evolveum.midpoint.model.common.expression.ExpressionVariables; import com.evolveum.midpoint.model.impl.util.Utils; -import com.evolveum.midpoint.prism.ItemDefinition; -import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.PrismObject; -import com.evolveum.midpoint.prism.PrismPropertyDefinition; -import com.evolveum.midpoint.prism.PrismPropertyValue; import com.evolveum.midpoint.prism.delta.PrismValueDeltaSetTriple; import com.evolveum.midpoint.prism.match.MatchingRuleRegistry; import com.evolveum.midpoint.prism.query.ObjectQuery; @@ -158,10 +154,10 @@ private boolean satisfyCondition(ShadowType currentShadow, ConditionalSearchFilt ExpressionType condition = conditionalFilter.getCondition(); ExpressionVariables variables = Utils.getDefaultExpressionVariables(null,currentShadow, resourceType, configurationType); - ItemDefinition outputDefinition = new PrismPropertyDefinition( + ItemDefinition outputDefinition = new PrismPropertyDefinitionImpl( ExpressionConstants.OUTPUT_ELMENT_NAME, DOMUtil.XSD_BOOLEAN, prismContext); - PrismPropertyValue satisfy = ExpressionUtil.evaluateExpression(variables, + PrismPropertyValue satisfy = (PrismPropertyValue) ExpressionUtil.evaluateExpression(variables, outputDefinition, condition, expressionFactory, shortDesc, task, parentResult); if (satisfy.getValue() == null) { return false; @@ -390,7 +386,7 @@ public boolean evaluateConfirmationExpression(Class foc ExpressionVariables variables = Utils.getDefaultExpressionVariables(user, shadow, resource, configuration); String shortDesc = "confirmation expression for "+resource.asPrismObject(); - PrismPropertyDefinition outputDefinition = new PrismPropertyDefinition<>(ExpressionConstants.OUTPUT_ELMENT_NAME, + PrismPropertyDefinition outputDefinition = new PrismPropertyDefinitionImpl<>(ExpressionConstants.OUTPUT_ELMENT_NAME, DOMUtil.XSD_BOOLEAN, prismContext); Expression,PrismPropertyDefinition> expression = expressionFactory.makeExpression(expressionType, outputDefinition, shortDesc, task, result); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/LiveSyncTaskHandler.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/LiveSyncTaskHandler.java index 08f3516c1cf..e04753f485a 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/LiveSyncTaskHandler.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/LiveSyncTaskHandler.java @@ -16,6 +16,7 @@ package com.evolveum.midpoint.model.impl.sync; import com.evolveum.midpoint.common.refinery.RefinedResourceSchema; +import com.evolveum.midpoint.common.refinery.RefinedResourceSchemaImpl; import com.evolveum.midpoint.model.impl.ModelConstants; import com.evolveum.midpoint.model.impl.util.Utils; import com.evolveum.midpoint.prism.PrismContext; @@ -153,7 +154,7 @@ private TaskRunResult runInternal(Task task) { RefinedResourceSchema refinedSchema; try { - refinedSchema = RefinedResourceSchema.getRefinedSchema(resource, LayerType.MODEL, prismContext); + refinedSchema = RefinedResourceSchemaImpl.getRefinedSchema(resource, LayerType.MODEL, prismContext); } catch (SchemaException e) { LOGGER.error("Live Sync: Schema error during processing account definition: {}",e.getMessage()); opResult.recordFatalError("Schema error during processing account definition: "+e.getMessage(),e); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/ReconciliationTaskHandler.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/ReconciliationTaskHandler.java index b1581c61da7..2ea90d5ca7b 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/ReconciliationTaskHandler.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/ReconciliationTaskHandler.java @@ -22,6 +22,7 @@ import com.evolveum.midpoint.common.Clock; import com.evolveum.midpoint.common.refinery.RefinedObjectClassDefinition; import com.evolveum.midpoint.common.refinery.RefinedResourceSchema; +import com.evolveum.midpoint.common.refinery.RefinedResourceSchemaImpl; import com.evolveum.midpoint.model.impl.ModelConstants; import com.evolveum.midpoint.model.impl.util.Utils; import com.evolveum.midpoint.prism.PrismContext; @@ -174,7 +175,7 @@ public TaskRunResult runInternal(Task coordinatorTask) { try { resource = provisioningService.getObject(ResourceType.class, resourceOid, null, coordinatorTask, opResult); - RefinedResourceSchema refinedSchema = RefinedResourceSchema.getRefinedSchema(resource, LayerType.MODEL, prismContext); + RefinedResourceSchema refinedSchema = RefinedResourceSchemaImpl.getRefinedSchema(resource, LayerType.MODEL, prismContext); objectclassDef = Utils.determineObjectClass(refinedSchema, coordinatorTask); } catch (ObjectNotFoundException ex) { diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/util/AbstractScannerTaskHandler.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/util/AbstractScannerTaskHandler.java index 91d2c749310..715c0a97f52 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/util/AbstractScannerTaskHandler.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/util/AbstractScannerTaskHandler.java @@ -19,6 +19,7 @@ import javax.xml.datatype.XMLGregorianCalendar; +import com.evolveum.midpoint.prism.PrismPropertyDefinitionImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -82,7 +83,7 @@ protected boolean initializeRun(H handler, TaskRunResult runResult, protected void finish(H handler, TaskRunResult runResult, Task task, OperationResult opResult) throws SchemaException { super.finish(handler, runResult, task, opResult); - PrismPropertyDefinition lastScanTimestampDef = new PrismPropertyDefinition( + PrismPropertyDefinition lastScanTimestampDef = new PrismPropertyDefinitionImpl<>( SchemaConstants.MODEL_EXTENSION_LAST_SCAN_TIMESTAMP_PROPERTY_NAME, DOMUtil.XSD_DATETIME, prismContext); PropertyDelta lastScanTimestampDelta = new PropertyDelta( diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/validator/ResourceValidatorImpl.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/validator/ResourceValidatorImpl.java index aa06a37c4c2..c9e82af693a 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/validator/ResourceValidatorImpl.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/validator/ResourceValidatorImpl.java @@ -17,6 +17,7 @@ package com.evolveum.midpoint.model.impl.validator; import com.evolveum.midpoint.common.refinery.RefinedResourceSchema; +import com.evolveum.midpoint.common.refinery.RefinedResourceSchemaImpl; import com.evolveum.midpoint.model.api.validator.Issue; import com.evolveum.midpoint.model.api.validator.ResourceValidator; import com.evolveum.midpoint.model.api.validator.Scope; @@ -123,7 +124,7 @@ public ValidationResult validate(@NotNull PrismObject resourceObje ResourceSchema resourceSchema = null; try { - resourceSchema = RefinedResourceSchema.getResourceSchema(resourceObject, prismContext); + resourceSchema = RefinedResourceSchemaImpl.getResourceSchema(resourceObject, prismContext); } catch (Throwable t) { vr.add(Issue.Severity.WARNING, CAT_SCHEMA, C_NO_SCHEMA, getString(bundle, CLASS_DOT + C_NO_SCHEMA, t.getMessage()), diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/visualizer/Visualizer.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/visualizer/Visualizer.java index ea233f6ab33..a53d3983869 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/visualizer/Visualizer.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/visualizer/Visualizer.java @@ -119,8 +119,10 @@ private SceneImpl visualize(PrismContainerValue containerValue, SceneImpl own scene.setName(name); scene.setSourceRelPath(EMPTY_PATH); scene.setSourceAbsPath(EMPTY_PATH); - if (containerValue.getConcreteTypeDefinition() != null) { - scene.setSourceDefinition(containerValue.getConcreteTypeDefinition()); + if (containerValue.getComplexTypeDefinition() != null) { + // TEMPORARY!!! + PrismContainerDefinition pcd = prismContext.getSchemaRegistry().findContainerDefinitionByType(containerValue.getComplexTypeDefinition().getTypeName()); + scene.setSourceDefinition(pcd); } else if (containerValue.getParent() != null && containerValue.getParent().getDefinition() != null) { scene.setSourceDefinition(containerValue.getParent().getDefinition()); } diff --git a/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/TestRefinedSchema.java b/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/TestRefinedSchema.java index c8b749b9092..fb03816ce03 100644 --- a/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/TestRefinedSchema.java +++ b/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/TestRefinedSchema.java @@ -25,16 +25,13 @@ import javax.xml.namespace.QName; +import com.evolveum.midpoint.common.refinery.*; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.annotation.DirtiesContext.ClassMode; import org.springframework.test.context.ContextConfiguration; import org.testng.AssertJUnit; import org.testng.annotations.Test; -import com.evolveum.midpoint.common.refinery.LayerRefinedObjectClassDefinition; -import com.evolveum.midpoint.common.refinery.LayerRefinedResourceSchema; -import com.evolveum.midpoint.common.refinery.RefinedObjectClassDefinition; -import com.evolveum.midpoint.common.refinery.RefinedResourceSchema; import com.evolveum.midpoint.model.impl.util.Utils; import com.evolveum.midpoint.schema.internals.InternalMonitor; import com.evolveum.midpoint.schema.processor.ObjectClassComplexTypeDefinition; @@ -84,7 +81,7 @@ public void test000Sanity() throws Exception { TestUtil.displayTestTile(this, TEST_NAME); // WHEN - refinedSchema = RefinedResourceSchema.getRefinedSchema(resourceDummyType, prismContext); + refinedSchema = RefinedResourceSchemaImpl.getRefinedSchema(resourceDummyType, prismContext); display("Dummy refined schema", refinedSchema); @@ -98,7 +95,7 @@ public void test010SanityModel() throws Exception { TestUtil.displayTestTile(this, TEST_NAME); // WHEN - refinedSchemaModel = RefinedResourceSchema.getRefinedSchema(resourceDummyType, LayerType.MODEL, prismContext); + refinedSchemaModel = RefinedResourceSchemaImpl.getRefinedSchema(resourceDummyType, LayerType.MODEL, prismContext); display("Dummy refined schema (MODEL)", refinedSchemaModel); diff --git a/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/expr/TestModelExpressions.java b/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/expr/TestModelExpressions.java index 04e3ed02760..d69b7251be9 100644 --- a/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/expr/TestModelExpressions.java +++ b/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/expr/TestModelExpressions.java @@ -29,6 +29,7 @@ import javax.xml.namespace.QName; import com.evolveum.midpoint.model.api.ModelService; +import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.util.exception.ExpressionEvaluationException; import com.evolveum.midpoint.util.exception.ObjectNotFoundException; import org.springframework.beans.factory.annotation.Autowired; @@ -44,10 +45,6 @@ import com.evolveum.midpoint.model.impl.AbstractInternalModelIntegrationTest; import com.evolveum.midpoint.model.impl.controller.ModelController; import com.evolveum.midpoint.model.test.AbstractModelIntegrationTest; -import com.evolveum.midpoint.prism.ItemDefinition; -import com.evolveum.midpoint.prism.PrismObject; -import com.evolveum.midpoint.prism.PrismPropertyDefinition; -import com.evolveum.midpoint.prism.PrismPropertyValue; import com.evolveum.midpoint.prism.util.PrismTestUtil; import com.evolveum.midpoint.schema.MidPointPrismContextFactory; import com.evolveum.midpoint.schema.constants.ExpressionConstants; @@ -151,7 +148,7 @@ public void testGetManagersOids() throws Exception { PrismObject chef = repositoryService.getObject(UserType.class, CHEF_OID, null, result); ScriptExpressionEvaluatorType scriptType = parseScriptType("expression-" + TEST_NAME + ".xml"); - PrismPropertyDefinition outputDefinition = new PrismPropertyDefinition<>(PROPERTY_NAME, DOMUtil.XSD_STRING, PrismTestUtil.getPrismContext()); + PrismPropertyDefinition outputDefinition = new PrismPropertyDefinitionImpl<>(PROPERTY_NAME, DOMUtil.XSD_STRING, PrismTestUtil.getPrismContext()); ScriptExpression scriptExpression = scriptExpressionFactory.createScriptExpression(scriptType, outputDefinition, TEST_NAME); ExpressionVariables variables = new ExpressionVariables(); variables.addVariableDefinition(new QName(SchemaConstants.NS_C, "user"), chef); @@ -184,7 +181,7 @@ public void testIsUniquePropertyValue() throws Exception { PrismObject chef = repositoryService.getObject(UserType.class, CHEF_OID, null, result); ScriptExpressionEvaluatorType scriptType = parseScriptType("expression-" + TEST_NAME + ".xml"); - PrismPropertyDefinition outputDefinition = new PrismPropertyDefinition<>(PROPERTY_NAME, DOMUtil.XSD_BOOLEAN, PrismTestUtil.getPrismContext()); + PrismPropertyDefinition outputDefinition = new PrismPropertyDefinitionImpl<>(PROPERTY_NAME, DOMUtil.XSD_BOOLEAN, PrismTestUtil.getPrismContext()); ScriptExpression scriptExpression = scriptExpressionFactory.createScriptExpression(scriptType, outputDefinition, TEST_NAME); ExpressionVariables variables = new ExpressionVariables(); variables.addVariableDefinition(new QName(SchemaConstants.NS_C, "user"), chef); @@ -302,7 +299,7 @@ private String executeScriptExpressionString(final String TEST_NAME, ExpressionV OperationResult result = new OperationResult(TestModelExpressions.class.getName() + "." + TEST_NAME); ScriptExpressionEvaluatorType scriptType = parseScriptType("expression-" + TEST_NAME + ".xml"); - ItemDefinition outputDefinition = new PrismPropertyDefinition(PROPERTY_NAME, DOMUtil.XSD_STRING, PrismTestUtil.getPrismContext()); + ItemDefinition outputDefinition = new PrismPropertyDefinitionImpl(PROPERTY_NAME, DOMUtil.XSD_STRING, PrismTestUtil.getPrismContext()); ScriptExpression scriptExpression = scriptExpressionFactory.createScriptExpression(scriptType, outputDefinition, TEST_NAME); if (variables == null) { variables = new ExpressionVariables(); diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestModelServiceContract.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestModelServiceContract.java index 1a19576100f..643149939db 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestModelServiceContract.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestModelServiceContract.java @@ -494,7 +494,7 @@ public void test106SearchAccountWithoutResourceSchema() throws Exception { // create weapon attribute definition - NOT SUPPORTED, use only when you know what you're doing! QName accountObjectClassQName = dummyResourceCtl.getAccountObjectClassQName(); QName weaponQName = dummyResourceCtl.getAttributeWeaponQName(); - PrismPropertyDefinition weaponFakeDef = new PrismPropertyDefinition(weaponQName, DOMUtil.XSD_STRING, prismContext); + PrismPropertyDefinition weaponFakeDef = new PrismPropertyDefinitionImpl(weaponQName, DOMUtil.XSD_STRING, prismContext); ObjectQuery q = QueryBuilder.queryFor(ShadowType.class, prismContext) .item(ShadowType.F_RESOURCE_REF).ref(RESOURCE_DUMMY_OID) diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestRbac.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestRbac.java index c6dce1e24de..645cbcd5ad4 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestRbac.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestRbac.java @@ -533,7 +533,7 @@ public void test130JackAssignRolePirateWithSeaInAssignment() throws Exception { PrismContainer extension = getAssignmentExtensionInstance(); PrismSchema piracySchema = getPiracySchema(); - PrismPropertyDefinition seaPropDef = piracySchema.findPropertyDefinitionByElementName(PIRACY_SEA_QNAME); + PrismPropertyDefinition seaPropDef = (PrismPropertyDefinition) piracySchema.findPropertyDefinition().byElementName(PIRACY_SEA_QNAME); PrismProperty seaProp = seaPropDef.instantiate(); seaProp.setRealValue("Caribbean"); extension.add(seaProp); @@ -570,7 +570,7 @@ public void test132JackUnAssignRolePirateWithSeaInAssignment() throws Exception PrismContainer extension = getAssignmentExtensionInstance(); PrismSchema piracySchema = getPiracySchema(); - PrismPropertyDefinition seaPropDef = piracySchema.findPropertyDefinitionByElementName(PIRACY_SEA_QNAME); + PrismPropertyDefinition seaPropDef = piracySchema.findPropertyDefinition().byElementName(PIRACY_SEA_QNAME); PrismProperty seaProp = seaPropDef.instantiate(); seaProp.setRealValue("Caribbean"); extension.add(seaProp); @@ -704,7 +704,7 @@ public void test137JackAssignRoleAdriaticPirateWithSeaInAssignment() throws Exce PrismContainer extension = getAssignmentExtensionInstance(); PrismSchema piracySchema = getPiracySchema(); - PrismPropertyDefinition seaPropDef = piracySchema.findPropertyDefinitionByElementName(PIRACY_SEA_QNAME); + PrismPropertyDefinition seaPropDef = piracySchema.findPropertyDefinition().byElementName(PIRACY_SEA_QNAME); PrismProperty seaProp = seaPropDef.instantiate(); seaProp.setRealValue("Caribbean"); extension.add(seaProp); @@ -741,7 +741,7 @@ public void test139JackUnAssignRoleAdriaticPirateWithSeaInAssignment() throws Ex PrismContainer extension = getAssignmentExtensionInstance(); PrismSchema piracySchema = getPiracySchema(); - PrismPropertyDefinition seaPropDef = piracySchema.findPropertyDefinitionByElementName(PIRACY_SEA_QNAME); + PrismPropertyDefinition seaPropDef = piracySchema.findPropertyDefinition().byElementName(PIRACY_SEA_QNAME); PrismProperty seaProp = seaPropDef.instantiate(); seaProp.setRealValue("Caribbean"); extension.add(seaProp); @@ -823,7 +823,7 @@ public void test147JackAssignRoleBlackSeaPirateWithSeaInAssignment() throws Exce PrismContainer extension = getAssignmentExtensionInstance(); PrismSchema piracySchema = getPiracySchema(); - PrismPropertyDefinition seaPropDef = piracySchema.findPropertyDefinitionByElementName(PIRACY_SEA_QNAME); + PrismPropertyDefinition seaPropDef = piracySchema.findPropertyDefinition().byElementName(PIRACY_SEA_QNAME); PrismProperty seaProp = seaPropDef.instantiate(); seaProp.setRealValue("Caribbean"); extension.add(seaProp); @@ -861,7 +861,7 @@ public void test149JackUnAssignRoleBlackSeaPirateWithSeaInAssignment() throws Ex PrismContainer extension = getAssignmentExtensionInstance(); PrismSchema piracySchema = getPiracySchema(); - PrismPropertyDefinition seaPropDef = piracySchema.findPropertyDefinitionByElementName(PIRACY_SEA_QNAME); + PrismPropertyDefinition seaPropDef = piracySchema.findPropertyDefinition().byElementName(PIRACY_SEA_QNAME); PrismProperty seaProp = seaPropDef.instantiate(); seaProp.setRealValue("Caribbean"); extension.add(seaProp); diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/sync/TestImportRecon.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/sync/TestImportRecon.java index c9aa08ef993..2b062204760 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/sync/TestImportRecon.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/sync/TestImportRecon.java @@ -2524,7 +2524,7 @@ public void test610SearchDummyAccountsNameSubstring() throws Exception { ObjectQuery query = ObjectQueryUtil.createResourceAndObjectClassFilterPrefix(RESOURCE_DUMMY_OID, new QName(RESOURCE_DUMMY_NAMESPACE, "AccountObjectClass"), prismContext) .and().item(new ItemPath(ShadowType.F_ATTRIBUTES, SchemaConstants.ICFS_NAME), - new ResourceAttributeDefinition(SchemaConstants.ICFS_NAME, DOMUtil.XSD_STRING, prismContext)) + new ResourceAttributeDefinitionImpl(SchemaConstants.ICFS_NAME, DOMUtil.XSD_STRING, prismContext)) .contains("s") .build(); diff --git a/model/model-test/src/main/java/com/evolveum/midpoint/model/test/AbstractModelIntegrationTest.java b/model/model-test/src/main/java/com/evolveum/midpoint/model/test/AbstractModelIntegrationTest.java index b21646d0137..7a84eb363e4 100644 --- a/model/model-test/src/main/java/com/evolveum/midpoint/model/test/AbstractModelIntegrationTest.java +++ b/model/model-test/src/main/java/com/evolveum/midpoint/model/test/AbstractModelIntegrationTest.java @@ -24,6 +24,7 @@ import com.evolveum.midpoint.common.refinery.RefinedAttributeDefinition; import com.evolveum.midpoint.common.refinery.RefinedObjectClassDefinition; import com.evolveum.midpoint.common.refinery.RefinedResourceSchema; +import com.evolveum.midpoint.common.refinery.RefinedResourceSchemaImpl; import com.evolveum.midpoint.model.api.ModelDiagnosticService; import com.evolveum.midpoint.model.api.ModelExecuteOptions; import com.evolveum.midpoint.model.api.ModelInteractionService; @@ -494,7 +495,7 @@ protected ObjectDelta createModifyUserAddAccount(String userOid, Prism ObjectReferenceType resourceRef = new ObjectReferenceType(); resourceRef.setOid(resource.getOid()); account.asObjectable().setResourceRef(resourceRef); - RefinedResourceSchema refinedSchema = RefinedResourceSchema.getRefinedSchema(resource); + RefinedResourceSchema refinedSchema = RefinedResourceSchemaImpl.getRefinedSchema(resource); account.asObjectable().setObjectClass(refinedSchema.getDefaultRefinedDefinition(ShadowKindType.ACCOUNT).getObjectClassDefinition().getTypeName()); ObjectDelta userDelta = ObjectDelta.createEmptyModifyDelta(UserType.class, userOid, prismContext); @@ -597,7 +598,7 @@ protected PropertyDelta createAttributeDeleteDelta(PrismObject resource, QName attributeName) throws SchemaException { - RefinedResourceSchema refinedSchema = RefinedResourceSchema.getRefinedSchema(resource); + RefinedResourceSchema refinedSchema = RefinedResourceSchemaImpl.getRefinedSchema(resource); if (refinedSchema == null) { throw new SchemaException("No refined schema for "+resource); } @@ -1152,7 +1153,7 @@ protected PrismObject findAccountByUsername(String username, PrismOb protected Collection> listAccounts(PrismObject resource, Task task, OperationResult result) throws SchemaException, ObjectNotFoundException, SecurityViolationException, CommunicationException, ConfigurationException { - RefinedResourceSchema rSchema = RefinedResourceSchema.getRefinedSchema(resource); + RefinedResourceSchema rSchema = RefinedResourceSchemaImpl.getRefinedSchema(resource); RefinedObjectClassDefinition rAccount = rSchema.getDefaultRefinedDefinition(ShadowKindType.ACCOUNT); Collection identifierDefs = rAccount.getPrimaryIdentifiers(); assert identifierDefs.size() == 1 : "Unexpected identifier set in "+resource+" refined schema: "+identifierDefs; @@ -1229,7 +1230,7 @@ protected void assertHasShadow(String username, PrismObject resour } protected ObjectQuery createAccountShadowQuery(String username, PrismObject resource) throws SchemaException { - RefinedResourceSchema rSchema = RefinedResourceSchema.getRefinedSchema(resource); + RefinedResourceSchema rSchema = RefinedResourceSchemaImpl.getRefinedSchema(resource); RefinedObjectClassDefinition rAccount = rSchema.getDefaultRefinedDefinition(ShadowKindType.ACCOUNT); Collection identifierDefs = rAccount.getPrimaryIdentifiers(); assert identifierDefs.size() == 1 : "Unexpected identifier set in "+resource+" refined schema: "+identifierDefs; @@ -1711,7 +1712,7 @@ protected PrismObject createAccount(PrismObject resour ObjectReferenceType resourceRef = new ObjectReferenceType(); resourceRef.setOid(resource.getOid()); shadowType.setResourceRef(resourceRef); - RefinedResourceSchema refinedSchema = RefinedResourceSchema.getRefinedSchema(resource); + RefinedResourceSchema refinedSchema = RefinedResourceSchemaImpl.getRefinedSchema(resource); RefinedObjectClassDefinition objectClassDefinition = refinedSchema.getDefaultRefinedDefinition(ShadowKindType.ACCOUNT); shadowType.setObjectClass(objectClassDefinition.getTypeName()); shadowType.setKind(ShadowKindType.ACCOUNT); diff --git a/model/notifications-impl/src/main/java/com/evolveum/midpoint/notifications/impl/api/transports/SimpleSmsTransport.java b/model/notifications-impl/src/main/java/com/evolveum/midpoint/notifications/impl/api/transports/SimpleSmsTransport.java index 0996f3dd9c5..fb9aaa88bab 100644 --- a/model/notifications-impl/src/main/java/com/evolveum/midpoint/notifications/impl/api/transports/SimpleSmsTransport.java +++ b/model/notifications-impl/src/main/java/com/evolveum/midpoint/notifications/impl/api/transports/SimpleSmsTransport.java @@ -27,6 +27,7 @@ import com.evolveum.midpoint.notifications.impl.NotificationFuctionsImpl; import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismPropertyDefinition; +import com.evolveum.midpoint.prism.PrismPropertyDefinitionImpl; import com.evolveum.midpoint.prism.PrismPropertyValue; import com.evolveum.midpoint.prism.delta.PrismValueDeltaSetTriple; import com.evolveum.midpoint.repo.api.RepositoryService; @@ -226,7 +227,7 @@ private String evaluateExpression(ExpressionType expressionType, ExpressionVaria String shortDesc, Task task, OperationResult result) throws ObjectNotFoundException, SchemaException, ExpressionEvaluationException { QName resultName = new QName(SchemaConstants.NS_C, "result"); - PrismPropertyDefinition resultDef = new PrismPropertyDefinition(resultName, DOMUtil.XSD_STRING, prismContext); + PrismPropertyDefinition resultDef = new PrismPropertyDefinitionImpl(resultName, DOMUtil.XSD_STRING, prismContext); Expression,PrismPropertyDefinition> expression = expressionFactory.makeExpression(expressionType, resultDef, shortDesc, task, result); ExpressionEvaluationContext params = new ExpressionEvaluationContext(null, expressionVariables, shortDesc, task, result); diff --git a/model/notifications-impl/src/main/java/com/evolveum/midpoint/notifications/impl/handlers/BaseHandler.java b/model/notifications-impl/src/main/java/com/evolveum/midpoint/notifications/impl/handlers/BaseHandler.java index 935db573501..7f748964894 100644 --- a/model/notifications-impl/src/main/java/com/evolveum/midpoint/notifications/impl/handlers/BaseHandler.java +++ b/model/notifications-impl/src/main/java/com/evolveum/midpoint/notifications/impl/handlers/BaseHandler.java @@ -27,6 +27,7 @@ import com.evolveum.midpoint.notifications.impl.NotificationFuctionsImpl; import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismPropertyDefinition; +import com.evolveum.midpoint.prism.PrismPropertyDefinitionImpl; import com.evolveum.midpoint.prism.PrismPropertyValue; import com.evolveum.midpoint.prism.delta.PrismValueDeltaSetTriple; import com.evolveum.midpoint.schema.constants.SchemaConstants; @@ -128,7 +129,7 @@ protected boolean evaluateBooleanExpression(ExpressionType expressionType, Expre Task task, OperationResult result) throws ObjectNotFoundException, SchemaException, ExpressionEvaluationException { QName resultName = new QName(SchemaConstants.NS_C, "result"); - PrismPropertyDefinition resultDef = new PrismPropertyDefinition<>(resultName, DOMUtil.XSD_BOOLEAN, prismContext); + PrismPropertyDefinition resultDef = new PrismPropertyDefinitionImpl<>(resultName, DOMUtil.XSD_BOOLEAN, prismContext); Expression,PrismPropertyDefinition> expression = expressionFactory.makeExpression(expressionType, resultDef, shortDesc, task, result); ExpressionEvaluationContext params = new ExpressionEvaluationContext(null, expressionVariables, shortDesc, task, result); PrismValueDeltaSetTriple> exprResultTriple = ModelExpressionThreadLocalHolder.evaluateExpressionInContext(expression, params, task, result); @@ -166,14 +167,14 @@ private List evaluateExpression(ExpressionType expressionType, Expressio String shortDesc, Task task, OperationResult result) throws ObjectNotFoundException, SchemaException, ExpressionEvaluationException { QName resultName = new QName(SchemaConstants.NS_C, "result"); - PrismPropertyDefinition resultDef = new PrismPropertyDefinition<>(resultName, DOMUtil.XSD_STRING, prismContext); + PrismPropertyDefinition resultDef = new PrismPropertyDefinitionImpl<>(resultName, DOMUtil.XSD_STRING, prismContext); Expression,PrismPropertyDefinition> expression = expressionFactory.makeExpression(expressionType, resultDef, shortDesc, task, result); ExpressionEvaluationContext params = new ExpressionEvaluationContext(null, expressionVariables, shortDesc, task, result); PrismValueDeltaSetTriple> exprResult = ModelExpressionThreadLocalHolder .evaluateExpressionInContext(expression, params, task, result); - List retval = new ArrayList(); + List retval = new ArrayList<>(); for (PrismPropertyValue item : exprResult.getZeroSet()) { retval.add(item.getValue()); } diff --git a/model/notifications-impl/src/main/java/com/evolveum/midpoint/notifications/impl/helpers/BaseHelper.java b/model/notifications-impl/src/main/java/com/evolveum/midpoint/notifications/impl/helpers/BaseHelper.java index 4da5ec95576..e1f14ff8616 100644 --- a/model/notifications-impl/src/main/java/com/evolveum/midpoint/notifications/impl/helpers/BaseHelper.java +++ b/model/notifications-impl/src/main/java/com/evolveum/midpoint/notifications/impl/helpers/BaseHelper.java @@ -27,6 +27,7 @@ import com.evolveum.midpoint.notifications.impl.NotificationFuctionsImpl; import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismPropertyDefinition; +import com.evolveum.midpoint.prism.PrismPropertyDefinitionImpl; import com.evolveum.midpoint.prism.PrismPropertyValue; import com.evolveum.midpoint.prism.delta.PrismValueDeltaSetTriple; import com.evolveum.midpoint.schema.constants.SchemaConstants; @@ -122,7 +123,7 @@ protected boolean evaluateBooleanExpression(ExpressionType expressionType, Expre Task task, OperationResult result) throws ObjectNotFoundException, SchemaException, ExpressionEvaluationException { QName resultName = new QName(SchemaConstants.NS_C, "result"); - PrismPropertyDefinition resultDef = new PrismPropertyDefinition(resultName, DOMUtil.XSD_BOOLEAN, prismContext); + PrismPropertyDefinition resultDef = new PrismPropertyDefinitionImpl(resultName, DOMUtil.XSD_BOOLEAN, prismContext); Expression,PrismPropertyDefinition> expression = expressionFactory.makeExpression(expressionType, resultDef, shortDesc, task, result); ExpressionEvaluationContext params = new ExpressionEvaluationContext(null, expressionVariables, shortDesc, task, result); @@ -161,7 +162,7 @@ private List evaluateExpression(ExpressionType expressionType, Expressio String shortDesc, Task task, OperationResult result) throws ObjectNotFoundException, SchemaException, ExpressionEvaluationException { QName resultName = new QName(SchemaConstants.NS_C, "result"); - PrismPropertyDefinition resultDef = new PrismPropertyDefinition(resultName, DOMUtil.XSD_STRING, prismContext); + PrismPropertyDefinition resultDef = new PrismPropertyDefinitionImpl(resultName, DOMUtil.XSD_STRING, prismContext); Expression,PrismPropertyDefinition> expression = expressionFactory.makeExpression(expressionType, resultDef, shortDesc, task, result); ExpressionEvaluationContext params = new ExpressionEvaluationContext(null, expressionVariables, shortDesc, task, result); diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processes/itemApproval/InitializeLoopThroughApproversInLevel.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processes/itemApproval/InitializeLoopThroughApproversInLevel.java index bdac39773b0..760fb60db7a 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processes/itemApproval/InitializeLoopThroughApproversInLevel.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processes/itemApproval/InitializeLoopThroughApproversInLevel.java @@ -143,7 +143,7 @@ private Collection evaluateExpression(ExpressionType appro PrismContext prismContext = expressionFactory.getPrismContext(); QName approverOidName = new QName(SchemaConstants.NS_C, "approverOid"); - PrismPropertyDefinition approverOidDef = new PrismPropertyDefinition(approverOidName, DOMUtil.XSD_STRING, prismContext); + PrismPropertyDefinition approverOidDef = new PrismPropertyDefinitionImpl(approverOidName, DOMUtil.XSD_STRING, prismContext); Expression,PrismPropertyDefinition> expression = expressionFactory.makeExpression(approverExpression, approverOidDef, "approverExpression", task, result); ExpressionEvaluationContext params = new ExpressionEvaluationContext(null, expressionVariables, "approverExpression", task, result); PrismValueDeltaSetTriple> exprResult = ModelExpressionThreadLocalHolder.evaluateExpressionInContext(expression, params, task, result); @@ -166,7 +166,7 @@ private boolean evaluateBooleanExpression(ExpressionType expressionType, Express PrismContext prismContext = expressionFactory.getPrismContext(); QName resultName = new QName(SchemaConstants.NS_C, "result"); - PrismPropertyDefinition resultDef = new PrismPropertyDefinition(resultName, DOMUtil.XSD_BOOLEAN, prismContext); + PrismPropertyDefinition resultDef = new PrismPropertyDefinitionImpl(resultName, DOMUtil.XSD_BOOLEAN, prismContext); Expression,PrismPropertyDefinition> expression = expressionFactory.makeExpression(expressionType, resultDef, "automatic approval expression", task, result); ExpressionEvaluationContext params = new ExpressionEvaluationContext(null, expressionVariables, "automatic approval expression", task, result); diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processes/itemApproval/ItemApprovalSpecificContent.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processes/itemApproval/ItemApprovalSpecificContent.java index 158be231b83..8c81e518c48 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processes/itemApproval/ItemApprovalSpecificContent.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processes/itemApproval/ItemApprovalSpecificContent.java @@ -57,7 +57,6 @@ public ApprovalSchema getApprovalSchema() { @Override public WfProcessSpecificStateType createProcessSpecificState() { ItemApprovalProcessStateType state = new ItemApprovalProcessStateType(); - state.asPrismContainerValue().setConcreteType(ItemApprovalProcessStateType.COMPLEX_TYPE); state.setApprovalSchema(approvalSchema != null ? approvalSchema.toApprovalSchemaType() : null); return state; } diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/general/GcpExpressionHelper.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/general/GcpExpressionHelper.java index 47627a0498c..38f9cb9141b 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/general/GcpExpressionHelper.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/general/GcpExpressionHelper.java @@ -24,6 +24,7 @@ import com.evolveum.midpoint.model.impl.expr.ModelExpressionThreadLocalHolder; import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismPropertyDefinition; +import com.evolveum.midpoint.prism.PrismPropertyDefinitionImpl; import com.evolveum.midpoint.prism.PrismPropertyValue; import com.evolveum.midpoint.prism.delta.PrismValueDeltaSetTriple; import com.evolveum.midpoint.schema.constants.SchemaConstants; @@ -80,7 +81,7 @@ private boolean evaluateBooleanExpression(ExpressionType expressionType, Express PrismContext prismContext = expressionFactory.getPrismContext(); QName resultName = new QName(SchemaConstants.NS_C, "result"); - PrismPropertyDefinition resultDef = new PrismPropertyDefinition(resultName, DOMUtil.XSD_BOOLEAN, prismContext); + PrismPropertyDefinition resultDef = new PrismPropertyDefinitionImpl(resultName, DOMUtil.XSD_BOOLEAN, prismContext); Expression,PrismPropertyDefinition> expression = expressionFactory.makeExpression(expressionType, resultDef, opContext, taskFromModel, result); ExpressionEvaluationContext params = new ExpressionEvaluationContext(null, expressionVariables, opContext, taskFromModel, result); PrismValueDeltaSetTriple> exprResultTriple = ModelExpressionThreadLocalHolder diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/PrimaryChangeProcessorSpecificContent.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/PrimaryChangeProcessorSpecificContent.java index 686791bc414..7f104a0efb9 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/PrimaryChangeProcessorSpecificContent.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/PrimaryChangeProcessorSpecificContent.java @@ -33,7 +33,6 @@ public class PrimaryChangeProcessorSpecificContent implements ProcessorSpecificC public PrimaryChangeProcessorSpecificContent(PrismContext prismContext) { processorState = new WfPrimaryChangeProcessorStateType(prismContext); - processorState.asPrismContainerValue().setConcreteType(WfPrimaryChangeProcessorStateType.COMPLEX_TYPE); } public WfPrimaryChangeProcessorStateType createProcessorSpecificState() { diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/aspect/PrimaryChangeAspectHelper.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/aspect/PrimaryChangeAspectHelper.java index 228bfb14734..133a6d59e5f 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/aspect/PrimaryChangeAspectHelper.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/aspect/PrimaryChangeAspectHelper.java @@ -22,10 +22,7 @@ import com.evolveum.midpoint.model.common.expression.ExpressionFactory; import com.evolveum.midpoint.model.common.expression.ExpressionVariables; import com.evolveum.midpoint.model.impl.expr.ModelExpressionThreadLocalHolder; -import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.PrismObject; -import com.evolveum.midpoint.prism.PrismPropertyDefinition; -import com.evolveum.midpoint.prism.PrismPropertyValue; +import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.delta.ObjectDelta; import com.evolveum.midpoint.prism.delta.PrismValueDeltaSetTriple; import com.evolveum.midpoint.repo.api.RepositoryService; @@ -319,7 +316,7 @@ public boolean evaluateApplicabilityCondition(PcpAspectConfigurationType config, ExpressionType expressionType = config.getApplicabilityCondition(); QName resultName = new QName(SchemaConstants.NS_C, "result"); - PrismPropertyDefinition resultDef = new PrismPropertyDefinition(resultName, DOMUtil.XSD_BOOLEAN, prismContext); + PrismPropertyDefinition resultDef = new PrismPropertyDefinitionImpl(resultName, DOMUtil.XSD_BOOLEAN, prismContext); ExpressionVariables expressionVariables = new ExpressionVariables(); expressionVariables.addVariableDefinition(SchemaConstants.C_MODEL_CONTEXT, modelContext); diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/assignments/ResourceAssignmentHelper.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/assignments/ResourceAssignmentHelper.java index cbb5f9c0477..32ae381b4e1 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/assignments/ResourceAssignmentHelper.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/assignments/ResourceAssignmentHelper.java @@ -79,7 +79,7 @@ protected ResourceType getAssignmentApprovalTarget(AssignmentType assignmentType protected AssignmentType cloneAndCanonicalizeAssignment(AssignmentType assignmentType) { AssignmentType assignmentClone = assignmentType.clone(); - PrismContainerValue.copyDefinition(assignmentClone, assignmentType); + PrismContainerValue.copyDefinition(assignmentClone, assignmentType, prismContext); ConstructionType constructionType = assignmentClone.getConstruction(); if (constructionType != null) { // it should always be non-null constructionType.setResource(null); diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/assignments/RoleAssignmentHelper.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/assignments/RoleAssignmentHelper.java index 4ccc0ce5cee..7ecec237b3c 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/assignments/RoleAssignmentHelper.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/assignments/RoleAssignmentHelper.java @@ -30,7 +30,6 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentType; import com.evolveum.midpoint.xml.ns._public.common.common_3.OrgType; import com.evolveum.midpoint.xml.ns._public.common.common_3.PcpAspectConfigurationType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType; import com.evolveum.midpoint.xml.ns._public.common.common_3.RoleType; import com.evolveum.prism.xml.ns._public.types_3.ItemDeltaType; import org.springframework.beans.factory.annotation.Autowired; @@ -83,7 +82,7 @@ public ApprovalRequest createApprovalRequestForModificat // TODO is this ok? protected AssignmentType cloneAndCanonicalizeAssignment(AssignmentType assignmentType) { AssignmentType assignmentClone = assignmentType.clone(); - PrismContainerValue.copyDefinition(assignmentClone, assignmentType); + PrismContainerValue.copyDefinition(assignmentClone, assignmentType, prismContext); assignmentClone.setTarget(null); return assignmentClone; diff --git a/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/general/ApprovingDummyResourceChangesScenarioBean.java b/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/general/ApprovingDummyResourceChangesScenarioBean.java index a0fd4dd1ad0..3b556694dd2 100644 --- a/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/general/ApprovingDummyResourceChangesScenarioBean.java +++ b/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/general/ApprovingDummyResourceChangesScenarioBean.java @@ -47,7 +47,7 @@ public class ApprovingDummyResourceChangesScenarioBean extends BaseGcpScenarioBe // PrismContainer extStateContainer = extDefinition.instantiate(); // ProcessSpecificState extState = extStateContainer.createNewValue().asContainerable(); // -// PrismPropertyDefinition deltaDefinition = new PrismPropertyDefinition( +// PrismPropertyDefinition deltaDefinition = new PrismPropertyDefinitionImpl( // DUMMY_RESOURCE_DELTA_QNAME, // new QName(SchemaConstantsGenerated.NS_TYPES, "ObjectDeltaType"), // prismContext); diff --git a/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/general/TestGeneralChangeProcessor.java b/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/general/TestGeneralChangeProcessor.java index 47474bab60b..1b432d09503 100644 --- a/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/general/TestGeneralChangeProcessor.java +++ b/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/general/TestGeneralChangeProcessor.java @@ -221,7 +221,7 @@ void completeWorkItem(WorkItemType workItem, String taskId, OperationResult resu // ObjectDeltaType deltaType = dummyResourceDelta.getRealValue(); // display("dummyResourceDelta", DeltaConvertor.createObjectDelta(deltaType, prismContext)); // -// PrismPropertyDefinition ppd = new PrismPropertyDefinition(new QName(SchemaConstants.NS_WFCF, "[Button]rejectAll"), +// PrismPropertyDefinition ppd = new PrismPropertyDefinitionImpl(new QName(SchemaConstants.NS_WFCF, "[Button]rejectAll"), // DOMUtil.XSD_BOOLEAN, prismContext); // PrismProperty rejectAll = ppd.instantiate(); // rejectAll.setRealValue(Boolean.TRUE); @@ -321,7 +321,7 @@ void completeWorkItem(WorkItemType workItem, String taskId, OperationResult resu // ObjectDeltaType deltaType = dummyResourceDelta.getRealValue(); // display("dummyResourceDelta", DeltaConvertor.createObjectDelta(deltaType, prismContext)); // -// PrismPropertyDefinition ppd = new PrismPropertyDefinition(new QName(SchemaConstants.NS_WFCF, "[Button]approve"), +// PrismPropertyDefinition ppd = new PrismPropertyDefinitionImpl(new QName(SchemaConstants.NS_WFCF, "[Button]approve"), // DOMUtil.XSD_BOOLEAN, prismContext); // PrismProperty approve = ppd.instantiate(); // approve.setRealValue(Boolean.TRUE); diff --git a/pom.xml b/pom.xml index 89129d9b0c4..2cb0d25f518 100644 --- a/pom.xml +++ b/pom.xml @@ -140,7 +140,7 @@ - 1.7 + 1.8 3.1.11 UTF-8 diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ConnectorManager.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ConnectorManager.java index 82cba12fc06..aa8e7845d99 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ConnectorManager.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ConnectorManager.java @@ -24,6 +24,7 @@ import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import com.evolveum.midpoint.common.refinery.RefinedResourceSchemaImpl; import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -167,7 +168,7 @@ private ConnectorInstance createConfiguredConnectorInstance(PrismObject capabilities = ResourceTypeUtil.getNativeCapabilitiesCollection(resourceType); connector.initialize(resourceSchema, capabilities, ResourceTypeUtil.isCaseIgnoreAttributeNames(resourceType), result); diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/EntitlementConverter.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/EntitlementConverter.java index 5f7e0f4b018..447d4c040b0 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/EntitlementConverter.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/EntitlementConverter.java @@ -21,14 +21,11 @@ import javax.xml.namespace.QName; +import com.evolveum.midpoint.common.refinery.*; import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import com.evolveum.midpoint.common.refinery.RefinedAssociationDefinition; -import com.evolveum.midpoint.common.refinery.RefinedAttributeDefinition; -import com.evolveum.midpoint.common.refinery.RefinedObjectClassDefinition; -import com.evolveum.midpoint.common.refinery.RefinedResourceSchema; import com.evolveum.midpoint.prism.ModificationType; import com.evolveum.midpoint.prism.PrismContainer; import com.evolveum.midpoint.prism.PrismContainerDefinition; @@ -110,7 +107,7 @@ public void postProcessEntitlementsRead(ProvisioningContext subjectCtx, Collection entitlementAssociationDefs = objectClassDefinition.getEntitlementAssociations(); if (entitlementAssociationDefs != null) { ResourceAttributeContainer attributesContainer = ShadowUtil.getAttributesContainer(resourceObject); - RefinedResourceSchema refinedSchema = RefinedResourceSchema.getRefinedSchema(resourceType); + RefinedResourceSchema refinedSchema = RefinedResourceSchemaImpl.getRefinedSchema(resourceType); PrismContainerDefinition associationDef = resourceObject.getDefinition().findContainerDefinition(ShadowType.F_ASSOCIATION); PrismContainer associationContainer = associationDef.instantiate(); diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ProvisioningContext.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ProvisioningContext.java index a20e5d3d68c..c054ec4783c 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ProvisioningContext.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ProvisioningContext.java @@ -17,6 +17,7 @@ import com.evolveum.midpoint.common.refinery.CompositeRefinedObjectClassDefinition; import com.evolveum.midpoint.common.refinery.RefinedObjectClassDefinition; +import com.evolveum.midpoint.common.refinery.RefinedObjectClassDefinitionImpl; import com.evolveum.midpoint.common.refinery.RefinedResourceSchema; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.provisioning.ucf.api.ConnectorInstance; @@ -146,7 +147,7 @@ public RefinedObjectClassDefinition getObjectClassDefinition() throws SchemaExce if (origObjectClassDefinition == null) { throw new SchemaException("No object class definition for "+shadowCoordinates.getObjectClass()+" in original resource schema for "+getResource()); } else { - objectClassDefinition = RefinedObjectClassDefinition.parseFromSchema(origObjectClassDefinition, getResource(), getRefinedSchema(), getResource().asPrismObject().getPrismContext(), + objectClassDefinition = RefinedObjectClassDefinitionImpl.parseFromSchema(origObjectClassDefinition, getResource(), getRefinedSchema(), getResource().asPrismObject().getPrismContext(), "objectclass "+origObjectClassDefinition+" in "+getResource()); } } diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ResourceManager.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ResourceManager.java index 6ba5afb84ae..1b9c6340490 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ResourceManager.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ResourceManager.java @@ -22,6 +22,9 @@ import javax.xml.namespace.QName; +import com.evolveum.midpoint.common.refinery.RefinedResourceSchemaImpl; +import com.evolveum.midpoint.prism.schema.PrismSchemaImpl; +import com.evolveum.midpoint.schema.processor.*; import com.evolveum.prism.xml.ns._public.types_3.SchemaDefinitionType; import org.apache.commons.lang.StringUtils; @@ -67,10 +70,6 @@ import com.evolveum.midpoint.schema.SelectorOptions; import com.evolveum.midpoint.schema.constants.ConnectorTestOperation; import com.evolveum.midpoint.schema.internals.InternalMonitor; -import com.evolveum.midpoint.schema.processor.ObjectClassComplexTypeDefinition; -import com.evolveum.midpoint.schema.processor.ResourceAttributeContainerDefinition; -import com.evolveum.midpoint.schema.processor.ResourceAttributeDefinition; -import com.evolveum.midpoint.schema.processor.ResourceSchema; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.ConnectorTypeUtil; import com.evolveum.midpoint.schema.util.MiscSchemaUtil; @@ -342,8 +341,8 @@ private PrismObject completeResource(PrismObject rep try { // make sure it has parsed resource and refined schema. We are going to cache // it, so we want to cache it with the parsed schemas - RefinedResourceSchema.getResourceSchema(newResource, prismContext); - RefinedResourceSchema.getRefinedSchema(newResource); + RefinedResourceSchemaImpl.getResourceSchema(newResource, prismContext); + RefinedResourceSchemaImpl.getRefinedSchema(newResource); } catch (SchemaException e) { String message = "Schema error while processing schemaHandling section of "+newResource+": "+e.getMessage(); @@ -387,7 +386,7 @@ private void completeSchemaAndCapabilities(PrismObject resource, R if (resourceSchema == null) { // Try to get existing schema from resource. We do not want to override this if it exists // (but we still want to refresh the capabilities, that happens below) - resourceSchema = RefinedResourceSchema.getResourceSchema(resource, prismContext); + resourceSchema = RefinedResourceSchemaImpl.getResourceSchema(resource, prismContext); } if (resourceSchema == null || resourceSchema.isEmpty()) { @@ -678,7 +677,7 @@ public void testConnection(PrismObject resource, OperationResult p // Resource does not support schema // If there is a static schema in resource definition this may still be OK try { - schema = RefinedResourceSchema.getResourceSchema(resource, prismContext); + schema = RefinedResourceSchemaImpl.getResourceSchema(resource, prismContext); } catch (SchemaException e) { modifyResourceAvailabilityStatus(resource, AvailabilityStatusType.BROKEN, parentResult); schemaResult.recordFatalError(e); @@ -787,9 +786,9 @@ private void adjustSchemaForSimulatedCapabilities(PrismObject reso .findAttributeDefinition(attributeName); if (attributeDefinition != null) { if (ignore != null && !ignore.booleanValue()) { - attributeDefinition.setIgnored(false); + ((ResourceAttributeDefinitionImpl) attributeDefinition).setIgnored(false); } else { - attributeDefinition.setIgnored(true); + ((ResourceAttributeDefinitionImpl) attributeDefinition).setIgnored(true); } } else { // simulated activation attribute points to something that is not in the schema @@ -924,13 +923,14 @@ public void applyDefinition(ObjectDelta delta, ResourceType resour return; } try { - connectorSchema = PrismSchema.parse(connectorSchemaElement, true, "schema for " + connector, prismContext); + connectorSchema = PrismSchemaImpl.parse(connectorSchemaElement, true, "schema for " + connector, prismContext); } catch (SchemaException e) { objectResult.recordFatalError("Error parsing connector schema for " + connector + ": "+e.getMessage(), e); return; } QName configContainerQName = new QName(connectorType.getNamespace(), ResourceType.F_CONNECTOR_CONFIGURATION.getLocalPart()); - PrismContainerDefinition configContainerDef = connectorSchema.findContainerDefinitionByElementName(configContainerQName); + PrismContainerDefinition configContainerDef = + connectorSchema.findContainerDefinitionByElementName(configContainerQName); if (configContainerDef == null) { objectResult.recordFatalError("Definition of configuration container " + configContainerQName + " not found in the schema of of " + connector); return; diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ResourceObjectConverter.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ResourceObjectConverter.java index a54356e8a1c..d61b3f708df 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ResourceObjectConverter.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ResourceObjectConverter.java @@ -17,10 +17,7 @@ package com.evolveum.midpoint.provisioning.impl; import com.evolveum.midpoint.common.Clock; -import com.evolveum.midpoint.common.refinery.RefinedAssociationDefinition; -import com.evolveum.midpoint.common.refinery.RefinedAttributeDefinition; -import com.evolveum.midpoint.common.refinery.RefinedObjectClassDefinition; -import com.evolveum.midpoint.common.refinery.RefinedResourceSchema; +import com.evolveum.midpoint.common.refinery.*; import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.delta.ContainerDelta; import com.evolveum.midpoint.prism.delta.ItemDelta; @@ -2132,7 +2129,7 @@ private String getLockoutLockedValue(ActivationLockoutStatusCapabilityType capAc private RefinedObjectClassDefinition determineObjectClassDefinition(PrismObject shadow, ResourceType resource) throws SchemaException, ConfigurationException { ShadowType shadowType = shadow.asObjectable(); - RefinedResourceSchema refinedSchema = RefinedResourceSchema.getRefinedSchema(resource, prismContext); + RefinedResourceSchema refinedSchema = RefinedResourceSchemaImpl.getRefinedSchema(resource, prismContext); if (refinedSchema == null) { throw new ConfigurationException("No schema definied for "+resource); } @@ -2162,7 +2159,7 @@ private RefinedObjectClassDefinition determineObjectClassDefinition(PrismObject< private ObjectClassComplexTypeDefinition determineObjectClassDefinition( ResourceShadowDiscriminator discriminator, ResourceType resource) throws SchemaException { - ResourceSchema schema = RefinedResourceSchema.getResourceSchema(resource, prismContext); + ResourceSchema schema = RefinedResourceSchemaImpl.getResourceSchema(resource, prismContext); // HACK FIXME ObjectClassComplexTypeDefinition objectClassDefinition = schema.findObjectClassDefinition(ShadowKindType.ACCOUNT, discriminator.getIntent()); diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/ucf/impl/ConnectorFactoryIcfImpl.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/ucf/impl/ConnectorFactoryIcfImpl.java index 43e36ff6863..967f0a978a0 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/ucf/impl/ConnectorFactoryIcfImpl.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/ucf/impl/ConnectorFactoryIcfImpl.java @@ -39,6 +39,7 @@ import javax.net.ssl.TrustManager; import javax.xml.namespace.QName; +import com.evolveum.midpoint.prism.schema.PrismSchemaImpl; import org.apache.commons.configuration.Configuration; import org.apache.commons.lang.StringUtils; import org.identityconnectors.common.Version; @@ -282,7 +283,7 @@ private PrismSchema getConnectorSchema(ConnectorType connectorType, String names if (xsdElement == null) { return null; } - PrismSchema connectorSchema = PrismSchema.parse(xsdElement, true, connectorType.toString(), prismContext); + PrismSchema connectorSchema = PrismSchemaImpl.parse(xsdElement, true, connectorType.toString(), prismContext); return connectorSchema; } diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/ucf/impl/ConnectorInstanceIcfImpl.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/ucf/impl/ConnectorInstanceIcfImpl.java index d429491e9ba..1f4f3e4c23e 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/ucf/impl/ConnectorInstanceIcfImpl.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/ucf/impl/ConnectorInstanceIcfImpl.java @@ -24,10 +24,13 @@ import javax.xml.datatype.XMLGregorianCalendar; import javax.xml.namespace.QName; +import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.query.ObjectPaging; import com.evolveum.midpoint.prism.query.OrderDirection; +import com.evolveum.midpoint.prism.schema.PrismSchemaImpl; import com.evolveum.midpoint.provisioning.impl.StateReporter; import com.evolveum.midpoint.schema.SearchResultMetadata; +import com.evolveum.midpoint.schema.processor.*; import com.evolveum.midpoint.schema.statistics.ConnectorOperationalStatus; import com.evolveum.midpoint.schema.statistics.ProvisioningOperation; import com.evolveum.midpoint.util.DebugUtil; @@ -92,17 +95,6 @@ import org.identityconnectors.framework.spi.Connector; import org.identityconnectors.framework.spi.PoolableConnector; -import com.evolveum.midpoint.prism.ComplexTypeDefinition; -import com.evolveum.midpoint.prism.PrismContainer; -import com.evolveum.midpoint.prism.PrismContainerDefinition; -import com.evolveum.midpoint.prism.PrismContainerValue; -import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.PrismObject; -import com.evolveum.midpoint.prism.PrismObjectDefinition; -import com.evolveum.midpoint.prism.PrismProperty; -import com.evolveum.midpoint.prism.PrismPropertyDefinition; -import com.evolveum.midpoint.prism.PrismPropertyValue; -import com.evolveum.midpoint.prism.PrismValue; import com.evolveum.midpoint.prism.crypto.EncryptionException; import com.evolveum.midpoint.prism.crypto.Protector; import com.evolveum.midpoint.prism.delta.ChangeType; @@ -134,14 +126,6 @@ import com.evolveum.midpoint.schema.constants.ConnectorTestOperation; import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.internals.InternalMonitor; -import com.evolveum.midpoint.schema.processor.ObjectClassComplexTypeDefinition; -import com.evolveum.midpoint.schema.processor.ResourceAttribute; -import com.evolveum.midpoint.schema.processor.ResourceAttributeContainer; -import com.evolveum.midpoint.schema.processor.ResourceAttributeContainerDefinition; -import com.evolveum.midpoint.schema.processor.ResourceAttributeDefinition; -import com.evolveum.midpoint.schema.processor.ResourceObjectIdentification; -import com.evolveum.midpoint.schema.processor.ResourceSchema; -import com.evolveum.midpoint.schema.processor.SearchHierarchyConstraints; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.result.OperationResultStatus; import com.evolveum.midpoint.schema.util.ActivationUtil; @@ -365,17 +349,17 @@ public PrismSchema generateConnectorSchema() { return null; } - connectorSchema = new PrismSchema(connectorType.getNamespace(), prismContext); + connectorSchema = new PrismSchemaImpl(connectorType.getNamespace(), prismContext); // Create configuration type - the type used by the "configuration" // element - PrismContainerDefinition configurationContainerDef = connectorSchema.createPropertyContainerDefinition( + PrismContainerDefinitionImpl configurationContainerDef = ((PrismSchemaImpl) connectorSchema).createPropertyContainerDefinition( ResourceType.F_CONNECTOR_CONFIGURATION.getLocalPart(), ConnectorFactoryIcfImpl.CONNECTOR_SCHEMA_CONFIGURATION_TYPE_LOCAL_NAME); // element with "ConfigurationPropertiesType" - the dynamic part of // configuration schema - ComplexTypeDefinition configPropertiesTypeDef = connectorSchema.createComplexTypeDefinition(new QName( + ComplexTypeDefinition configPropertiesTypeDef = ((PrismSchemaImpl) connectorSchema).createComplexTypeDefinition(new QName( connectorType.getNamespace(), ConnectorFactoryIcfImpl.CONNECTOR_SCHEMA_CONFIGURATION_PROPERTIES_TYPE_LOCAL_NAME)); @@ -388,7 +372,7 @@ public PrismSchema generateConnectorSchema() { QName propXsdType = icfTypeToXsdType(icfProperty.getType(), icfProperty.isConfidential()); LOGGER.trace("{}: Mapping ICF config schema property {} from {} to {}", new Object[] { this, icfPropertyName, icfProperty.getType(), propXsdType }); - PrismPropertyDefinition propertyDefinifion = configPropertiesTypeDef.createPropertyDefinition( + PrismPropertyDefinitionImpl propertyDefinifion = ((ComplexTypeDefinitionImpl) configPropertiesTypeDef).createPropertyDefinition( icfPropertyName, propXsdType); propertyDefinifion.setDisplayName(icfProperty.getDisplayName(null)); propertyDefinifion.setHelp(icfProperty.getHelpMessage(null)); @@ -715,7 +699,7 @@ private void parseResourceSchema(org.identityconnectors.framework.common.objects AttributeInfo auxiliaryObjectClasseAttributeInfo = null; // New instance of midPoint schema object - setResourceSchema(new ResourceSchema(getSchemaNamespace(), prismContext)); + setResourceSchema(new ResourceSchemaImpl(getSchemaNamespace(), prismContext)); if (legacySchema == null) { legacySchema = detectLegacySchema(icfSchema); @@ -740,14 +724,14 @@ private void parseResourceSchema(org.identityconnectors.framework.common.objects // object class. // The important thing here is the last "type" parameter // (objectClassXsdName). The rest is more-or-less cosmetics. - ObjectClassComplexTypeDefinition ocDef = resourceSchema + ObjectClassComplexTypeDefinition ocDef = ((ResourceSchemaImpl) resourceSchema) .createObjectClassDefinition(objectClassXsdName); // The __ACCOUNT__ objectclass in ICF is a default account // objectclass. So mark it appropriately. if (ObjectClass.ACCOUNT_NAME.equals(objectClassInfo.getType())) { - ocDef.setKind(ShadowKindType.ACCOUNT); - ocDef.setDefaultInAKind(true); + ((ObjectClassComplexTypeDefinitionImpl) ocDef).setKind(ShadowKindType.ACCOUNT); + ((ObjectClassComplexTypeDefinitionImpl) ocDef).setDefaultInAKind(true); } ResourceAttributeDefinition uidDefinition = null; @@ -814,7 +798,7 @@ private void parseResourceSchema(org.identityconnectors.framework.common.objects // Create ResourceObjectAttributeDefinition, which is midPoint // way how to express attribute schema. - ResourceAttributeDefinition attrDef = new ResourceAttributeDefinition( + ResourceAttributeDefinitionImpl attrDef = new ResourceAttributeDefinitionImpl( attrXsdName, attrXsdType, prismContext); attrDef.setMatchingRuleQName(icfAttributeInfoToMatchingRule(attributeInfo)); @@ -840,7 +824,7 @@ private void parseResourceSchema(org.identityconnectors.framework.common.objects ResourceAttributeDefinition existingDefinition = ocDef.findAttributeDefinition(attrXsdName); if (existingDefinition != null) { hasUidDefinition = true; - existingDefinition.setDisplayOrder(ConnectorFactoryIcfImpl.ICFS_UID_DISPLAY_ORDER); + ((ResourceAttributeDefinitionImpl) existingDefinition).setDisplayOrder(ConnectorFactoryIcfImpl.ICFS_UID_DISPLAY_ORDER); uidDefinition = existingDefinition; continue; } else { @@ -903,26 +887,26 @@ private void parseResourceSchema(org.identityconnectors.framework.common.objects attrDef.setCanRead(canRead); if (!Uid.NAME.equals(icfName)) { - ocDef.add(attrDef); + ((ObjectClassComplexTypeDefinitionImpl) ocDef).add(attrDef); } } if (uidDefinition == null) { // Every object has UID in ICF, therefore add a default definition if no other was specified - uidDefinition = new ResourceAttributeDefinition( + uidDefinition = new ResourceAttributeDefinitionImpl<>( ConnectorFactoryIcfImpl.ICFS_UID, DOMUtil.XSD_STRING, prismContext); // DO NOT make it mandatory. It must not be present on create hence it cannot be mandatory. - uidDefinition.setMinOccurs(0); - uidDefinition.setMaxOccurs(1); + ((ResourceAttributeDefinitionImpl) uidDefinition).setMinOccurs(0); + ((ResourceAttributeDefinitionImpl) uidDefinition).setMaxOccurs(1); // Make it read-only - uidDefinition.setReadOnly(); + ((ResourceAttributeDefinitionImpl) uidDefinition).setReadOnly(); // Set a default display name - uidDefinition.setDisplayName(ConnectorFactoryIcfImpl.ICFS_UID_DISPLAY_NAME); - uidDefinition.setDisplayOrder(ConnectorFactoryIcfImpl.ICFS_UID_DISPLAY_ORDER); + ((ResourceAttributeDefinitionImpl) uidDefinition).setDisplayName(ConnectorFactoryIcfImpl.ICFS_UID_DISPLAY_NAME); + ((ResourceAttributeDefinitionImpl) uidDefinition).setDisplayOrder(ConnectorFactoryIcfImpl.ICFS_UID_DISPLAY_ORDER); // Uid is a primary identifier of every object (this is the ICF way) } if (!hasUidDefinition) { - ocDef.add(uidDefinition); + ((ObjectClassComplexTypeDefinitionImpl) ocDef).add(uidDefinition); } ((Collection)ocDef.getPrimaryIdentifiers()).add(uidDefinition); if (uidDefinition != nameDefinition) { @@ -931,10 +915,10 @@ private void parseResourceSchema(org.identityconnectors.framework.common.objects // Add schema annotations - ocDef.setNativeObjectClass(objectClassInfo.getType()); - ocDef.setDisplayNameAttribute(nameDefinition.getName()); - ocDef.setNamingAttribute(nameDefinition.getName()); - ocDef.setAuxiliary(objectClassInfo.isAuxiliary()); + ((ObjectClassComplexTypeDefinitionImpl) ocDef).setNativeObjectClass(objectClassInfo.getType()); + ((ObjectClassComplexTypeDefinitionImpl) ocDef).setDisplayNameAttribute(nameDefinition.getName()); + ((ObjectClassComplexTypeDefinitionImpl) ocDef).setNamingAttribute(nameDefinition.getName()); + ((ObjectClassComplexTypeDefinitionImpl) ocDef).setAuxiliary(objectClassInfo.isAuxiliary()); } @@ -2925,7 +2909,7 @@ private PrismProperty createTokenProperty(T object) { Set> syncTokenValues = new HashSet>(); syncTokenValues.add(new PrismPropertyValue(object)); - PrismPropertyDefinition propDef = new PrismPropertyDefinition(SchemaConstants.SYNC_TOKEN, + PrismPropertyDefinitionImpl propDef = new PrismPropertyDefinitionImpl(SchemaConstants.SYNC_TOKEN, type, prismContext); propDef.setDynamic(true); PrismProperty property = propDef.instantiate(); diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/util/ProvisioningUtil.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/util/ProvisioningUtil.java index 056eee27d93..4ab8c224b58 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/util/ProvisioningUtil.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/util/ProvisioningUtil.java @@ -18,10 +18,7 @@ import com.evolveum.midpoint.common.ResourceObjectPattern; import com.evolveum.midpoint.common.StaticExpressionUtil; -import com.evolveum.midpoint.common.refinery.RefinedAssociationDefinition; -import com.evolveum.midpoint.common.refinery.RefinedAttributeDefinition; -import com.evolveum.midpoint.common.refinery.RefinedObjectClassDefinition; -import com.evolveum.midpoint.common.refinery.RefinedResourceSchema; +import com.evolveum.midpoint.common.refinery.*; import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.delta.PropertyDelta; import com.evolveum.midpoint.prism.match.MatchingRule; @@ -129,7 +126,7 @@ public static ExecuteProvisioningScriptOperation convertToScriptOperation( ProvisioningScriptType scriptType, String desc, PrismContext prismContext) throws SchemaException { ExecuteProvisioningScriptOperation scriptOperation = new ExecuteProvisioningScriptOperation(); - PrismPropertyDefinition scriptArgumentDefinition = new PrismPropertyDefinition( + PrismPropertyDefinition scriptArgumentDefinition = new PrismPropertyDefinitionImpl( FAKE_SCRIPT_ARGUMENT_NAME, DOMUtil.XSD_STRING, prismContext); for (ProvisioningScriptArgumentType argument : scriptType.getArgument()) { @@ -258,7 +255,7 @@ public static PropertyDelta narrowPropertyDelta(PropertyDelta property } public static RefinedResourceSchema getRefinedSchema(ResourceType resourceType) throws SchemaException, ConfigurationException { - RefinedResourceSchema refinedSchema = RefinedResourceSchema.getRefinedSchema(resourceType); + RefinedResourceSchema refinedSchema = RefinedResourceSchemaImpl.getRefinedSchema(resourceType); if (refinedSchema == null) { throw new ConfigurationException("No schema for "+resourceType); } @@ -289,7 +286,7 @@ public static void setProtectedFlag(ProvisioningContext ctx, PrismObject resource) throws SchemaException, ConfigurationException { - RefinedResourceSchema refinedSchema = RefinedResourceSchema.getRefinedSchema(resource); + RefinedResourceSchema refinedSchema = RefinedResourceSchemaImpl.getRefinedSchema(resource); if (refinedSchema == null) { throw new ConfigurationException("No schema for "+resource); } diff --git a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/ProvisioningTestUtil.java b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/ProvisioningTestUtil.java index 21a8b7f220b..a0b99511ac0 100644 --- a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/ProvisioningTestUtil.java +++ b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/ProvisioningTestUtil.java @@ -31,6 +31,7 @@ import javax.xml.namespace.QName; +import com.evolveum.midpoint.prism.schema.PrismSchemaImpl; import org.apache.commons.lang.StringUtils; import org.w3c.dom.Element; @@ -102,7 +103,7 @@ public static void assertConnectorSchemaSanity(ConnectorType conn, PrismContext // Try to parse the schema PrismSchema schema = null; try { - schema = PrismSchema.parse(xsdElement, true, "schema of "+conn, prismContext); + schema = PrismSchemaImpl.parse(xsdElement, true, "schema of "+conn, prismContext); } catch (SchemaException e) { throw new SchemaException("Error parsing schema of "+conn+": "+e.getMessage(),e); } diff --git a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/TestCsvFile.java b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/TestCsvFile.java index 6c4e5a7f78e..54446f823d8 100644 --- a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/TestCsvFile.java +++ b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/TestCsvFile.java @@ -31,6 +31,8 @@ import javax.xml.bind.JAXBElement; +import com.evolveum.midpoint.common.refinery.RefinedResourceSchemaImpl; +import com.evolveum.midpoint.schema.processor.ResourceSchemaImpl; import org.apache.commons.io.FileUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.annotation.DirtiesContext; @@ -199,7 +201,7 @@ public void test003Connection() throws ObjectNotFoundException, SchemaException assertNotNull("No serialNumber", cachingMetadata.getSerialNumber()); Element xsdElement = ObjectTypeUtil.findXsdElement(xmlSchemaTypeAfter); - ResourceSchema parsedSchema = ResourceSchema.parse(xsdElement, resourceBefore.toString(), prismContext); + ResourceSchema parsedSchema = ResourceSchemaImpl.parse(xsdElement, resourceBefore.toString(), prismContext); assertNotNull("No schema after parsing", parsedSchema); // schema will be checked in next test @@ -237,17 +239,17 @@ public void test005ParsedSchema() throws ObjectNotFoundException, CommunicationE // THEN // The returned type should have the schema pre-parsed - assertNotNull(RefinedResourceSchema.hasParsedSchema(resourceType)); + assertNotNull(RefinedResourceSchemaImpl.hasParsedSchema(resourceType)); // Also test if the utility method returns the same thing - ResourceSchema returnedSchema = RefinedResourceSchema.getResourceSchema(resourceType, prismContext); + ResourceSchema returnedSchema = RefinedResourceSchemaImpl.getResourceSchema(resourceType, prismContext); display("Parsed resource schema", returnedSchema); // Check whether it is reusing the existing schema and not parsing it all over again // Not equals() but == ... we want to really know if exactly the same // object instance is returned - assertTrue("Broken caching", returnedSchema == RefinedResourceSchema.getResourceSchema(resourceType, prismContext)); + assertTrue("Broken caching", returnedSchema == RefinedResourceSchemaImpl.getResourceSchema(resourceType, prismContext)); IntegrationTestTools.assertIcfResourceSchemaSanity(returnedSchema, resourceType); diff --git a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/AbstractDummyTest.java b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/AbstractDummyTest.java index 6a3fe82f832..5957e150fa2 100644 --- a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/AbstractDummyTest.java +++ b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/AbstractDummyTest.java @@ -34,6 +34,7 @@ import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.query.builder.QueryBuilder; +import com.evolveum.midpoint.schema.processor.*; import org.springframework.beans.factory.annotation.Autowired; import org.testng.AssertJUnit; import org.w3c.dom.Element; @@ -71,10 +72,6 @@ import com.evolveum.midpoint.schema.internals.CachingStatistics; import com.evolveum.midpoint.schema.internals.InternalMonitor; import com.evolveum.midpoint.schema.internals.InternalsConfig; -import com.evolveum.midpoint.schema.processor.ObjectClassComplexTypeDefinition; -import com.evolveum.midpoint.schema.processor.ResourceAttribute; -import com.evolveum.midpoint.schema.processor.ResourceAttributeDefinition; -import com.evolveum.midpoint.schema.processor.ResourceSchema; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.ObjectTypeUtil; import com.evolveum.midpoint.schema.util.ShadowUtil; @@ -515,7 +512,7 @@ protected void assertHasSchema(PrismObject resource, String desc) assertNotNull("No serialNumber in "+desc, cachingMetadata.getSerialNumber()); Element xsdElement = ObjectTypeUtil.findXsdElement(xmlSchemaTypeAfter); - ResourceSchema parsedSchema = ResourceSchema.parse(xsdElement, resource.toString(), prismContext); + ResourceSchema parsedSchema = ResourceSchemaImpl.parse(xsdElement, resource.toString(), prismContext); assertNotNull("No schema after parsing in "+desc, parsedSchema); } diff --git a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/TestDummy.java b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/TestDummy.java index d5c1bb24f66..f3711ba9dc0 100644 --- a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/TestDummy.java +++ b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/TestDummy.java @@ -41,10 +41,13 @@ import javax.xml.datatype.XMLGregorianCalendar; import javax.xml.namespace.QName; +import com.evolveum.midpoint.common.refinery.RefinedResourceSchemaImpl; import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.query.OrFilter; import com.evolveum.midpoint.prism.query.builder.QueryBuilder; +import com.evolveum.midpoint.prism.schema.PrismSchemaImpl; +import com.evolveum.midpoint.schema.processor.*; import org.apache.commons.lang.StringUtils; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.ContextConfiguration; @@ -104,11 +107,6 @@ import com.evolveum.midpoint.schema.SearchResultList; import com.evolveum.midpoint.schema.SelectorOptions; import com.evolveum.midpoint.schema.constants.SchemaConstants; -import com.evolveum.midpoint.schema.processor.ObjectClassComplexTypeDefinition; -import com.evolveum.midpoint.schema.processor.ResourceAttribute; -import com.evolveum.midpoint.schema.processor.ResourceAttributeContainer; -import com.evolveum.midpoint.schema.processor.ResourceAttributeDefinition; -import com.evolveum.midpoint.schema.processor.ResourceSchema; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.result.OperationResultStatus; import com.evolveum.midpoint.schema.statistics.ConnectorOperationalStatus; @@ -288,7 +286,7 @@ public void test010ListConnectors() throws Exception { assertNotNull("No schema", connectorXsdSchemaElement); // Try to parse the schema - PrismSchema schema = PrismSchema.parse(connectorXsdSchemaElement, true, "connector schema " + conn, prismContext); + PrismSchema schema = PrismSchemaImpl.parse(connectorXsdSchemaElement, true, "connector schema " + conn, prismContext); assertNotNull("Cannot parse schema", schema); assertFalse("Empty schema", schema.isEmpty()); @@ -429,7 +427,7 @@ public void test020Connection() throws Exception { assertNotNull("No serialNumber", cachingMetadata.getSerialNumber()); Element xsdElement = ObjectTypeUtil.findXsdElement(xmlSchemaTypeAfter); - ResourceSchema parsedSchema = ResourceSchema.parse(xsdElement, resourceTypeBefore.toString(), prismContext); + ResourceSchema parsedSchema = ResourceSchemaImpl.parse(xsdElement, resourceTypeBefore.toString(), prismContext); assertNotNull("No schema after parsing", parsedSchema); // schema will be checked in next test @@ -502,10 +500,10 @@ public void test022ParsedSchema() throws Exception { // THEN // The returned type should have the schema pre-parsed - assertNotNull(RefinedResourceSchema.hasParsedSchema(resourceType)); + assertNotNull(RefinedResourceSchemaImpl.hasParsedSchema(resourceType)); // Also test if the utility method returns the same thing - ResourceSchema returnedSchema = RefinedResourceSchema.getResourceSchema(resourceType, prismContext); + ResourceSchema returnedSchema = RefinedResourceSchemaImpl.getResourceSchema(resourceType, prismContext); display("Parsed resource schema", returnedSchema); @@ -514,7 +512,7 @@ public void test022ParsedSchema() throws Exception { // Not equals() but == ... we want to really know if exactly the same // object instance is returned assertTrue("Broken caching", - returnedSchema == RefinedResourceSchema.getResourceSchema(resourceType, prismContext)); + returnedSchema == RefinedResourceSchemaImpl.getResourceSchema(resourceType, prismContext)); assertSchemaSanity(returnedSchema, resourceType); @@ -529,7 +527,7 @@ public void test023RefinedSchema() throws Exception { // GIVEN // WHEN - RefinedResourceSchema refinedSchema = RefinedResourceSchema.getRefinedSchema(resourceType, prismContext); + RefinedResourceSchema refinedSchema = RefinedResourceSchemaImpl.getRefinedSchema(resourceType, prismContext); display("Refined schema", refinedSchema); // Check whether it is reusing the existing schema and not parsing it @@ -537,7 +535,7 @@ public void test023RefinedSchema() throws Exception { // Not equals() but == ... we want to really know if exactly the same // object instance is returned assertTrue("Broken caching", - refinedSchema == RefinedResourceSchema.getRefinedSchema(resourceType, prismContext)); + refinedSchema == RefinedResourceSchemaImpl.getRefinedSchema(resourceType, prismContext)); RefinedObjectClassDefinition accountDef = refinedSchema.getDefaultRefinedDefinition(ShadowKindType.ACCOUNT); assertNotNull("Account definition is missing", accountDef); @@ -739,7 +737,7 @@ public void test030ResourceAndConnectorCaching() throws Exception { ConnectorInstance configuredConnectorInstance = connectorManager.getConfiguredConnectorInstance( resource, false, result); assertNotNull("No configuredConnectorInstance", configuredConnectorInstance); - ResourceSchema resourceSchema = RefinedResourceSchema.getResourceSchema(resource, prismContext); + ResourceSchema resourceSchema = RefinedResourceSchemaImpl.getResourceSchema(resource, prismContext); assertNotNull("No resource schema", resourceSchema); // WHEN @@ -761,7 +759,7 @@ public void test030ResourceAndConnectorCaching() throws Exception { assertTrue("Configurations not equivalent", configurationContainer.equivalent(configurationContainerAgain)); // Check resource schema caching - ResourceSchema resourceSchemaAgain = RefinedResourceSchema.getResourceSchema(resourceAgain, prismContext); + ResourceSchema resourceSchemaAgain = RefinedResourceSchemaImpl.getResourceSchema(resourceAgain, prismContext); assertNotNull("No resource schema (again)", resourceSchemaAgain); assertTrue("Resource schema was not cached", resourceSchema == resourceSchemaAgain); @@ -819,7 +817,7 @@ public void test031ResourceAndConnectorCachingForceFresh() throws Exception { ConnectorInstance configuredConnectorInstance = connectorManager.getConfiguredConnectorInstance( resource, false, result); assertNotNull("No configuredConnectorInstance", configuredConnectorInstance); - ResourceSchema resourceSchema = RefinedResourceSchema.getResourceSchema(resource, prismContext); + ResourceSchema resourceSchema = RefinedResourceSchemaImpl.getResourceSchema(resource, prismContext); assertNotNull("No resource schema", resourceSchema); // WHEN @@ -840,7 +838,7 @@ public void test031ResourceAndConnectorCachingForceFresh() throws Exception { .findContainer(ResourceType.F_CONNECTOR_CONFIGURATION); assertTrue("Configurations not equivalent", configurationContainer.equivalent(configurationContainerAgain)); - ResourceSchema resourceSchemaAgain = RefinedResourceSchema.getResourceSchema(resourceAgain, prismContext); + ResourceSchema resourceSchemaAgain = RefinedResourceSchemaImpl.getResourceSchema(resourceAgain, prismContext); assertNotNull("No resource schema (again)", resourceSchemaAgain); assertTrue("Resource schema was not cached", resourceSchema == resourceSchemaAgain); @@ -2849,7 +2847,7 @@ public boolean handle(PrismObject object, OperationResult parentResu } private ObjectQuery createOnOffQuery() throws SchemaException { - ResourceSchema resourceSchema = RefinedResourceSchema.getResourceSchema(resource, prismContext); + ResourceSchema resourceSchema = RefinedResourceSchemaImpl.getResourceSchema(resource, prismContext); ObjectClassComplexTypeDefinition objectClassDef = resourceSchema.findObjectClassDefinition(SchemaTestConstants.ACCOUNT_OBJECT_CLASS_LOCAL_NAME); ResourceAttributeDefinition attrDef = objectClassDef.findAttributeDefinition( dummyResourceCtl.getAttributeQName(DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_SHIP_NAME)); @@ -2872,7 +2870,7 @@ protected void testSeachIterativeSingleAttrFilter(final String TEST_NAME, St protected void testSeachIterativeSingleAttrFilter(final String TEST_NAME, QName attrQName, T attrVal, GetOperationOptions rootOptions, boolean fullShadow, String... expectedAccountNames) throws Exception { - ResourceSchema resourceSchema = RefinedResourceSchema.getResourceSchema(resource, prismContext); + ResourceSchema resourceSchema = RefinedResourceSchemaImpl.getResourceSchema(resource, prismContext); ObjectClassComplexTypeDefinition objectClassDef = resourceSchema.findObjectClassDefinition(SchemaTestConstants.ACCOUNT_OBJECT_CLASS_LOCAL_NAME); ResourceAttributeDefinition attrDef = objectClassDef.findAttributeDefinition(attrQName); ObjectFilter filter = QueryBuilder.queryFor(ShadowType.class, prismContext) @@ -2884,7 +2882,7 @@ protected void testSeachIterativeSingleAttrFilter(final String TEST_NAME, QN protected void testSeachIterativeAlternativeAttrFilter(final String TEST_NAME, QName attr1QName, T attr1Val, QName attr2QName, T attr2Val, GetOperationOptions rootOptions, boolean fullShadow, String... expectedAccountNames) throws Exception { - ResourceSchema resourceSchema = RefinedResourceSchema.getResourceSchema(resource, prismContext); + ResourceSchema resourceSchema = RefinedResourceSchemaImpl.getResourceSchema(resource, prismContext); ObjectClassComplexTypeDefinition objectClassDef = resourceSchema.findObjectClassDefinition(SchemaTestConstants.ACCOUNT_OBJECT_CLASS_LOCAL_NAME); ResourceAttributeDefinition attr1Def = objectClassDef.findAttributeDefinition(attr1QName); ResourceAttributeDefinition attr2Def = objectClassDef.findAttributeDefinition(attr2QName); @@ -4190,7 +4188,7 @@ public void test502ModifyProtectedAccountShadowAttributes() throws Exception { syncServiceMock.reset(); Collection modifications = new ArrayList(1); - ResourceSchema resourceSchema = RefinedResourceSchema.getResourceSchema(resource, prismContext); + ResourceSchema resourceSchema = RefinedResourceSchemaImpl.getResourceSchema(resource, prismContext); ObjectClassComplexTypeDefinition defaultAccountDefinition = resourceSchema.findDefaultObjectClassDefinition(ShadowKindType.ACCOUNT); ResourceAttributeDefinition fullnameAttrDef = defaultAccountDefinition.findAttributeDefinition("fullname"); ResourceAttribute fullnameAttr = fullnameAttrDef.instantiate(); @@ -4304,7 +4302,7 @@ public void test511AddProtectedAccountCaseIgnore() throws Exception { } private PrismObject createAccountShadow(String username) throws SchemaException { - ResourceSchema resourceSchema = RefinedResourceSchema.getResourceSchema(resource, prismContext); + ResourceSchema resourceSchema = RefinedResourceSchemaImpl.getResourceSchema(resource, prismContext); ObjectClassComplexTypeDefinition defaultAccountDefinition = resourceSchema.findDefaultObjectClassDefinition(ShadowKindType.ACCOUNT); ShadowType shadowType = new ShadowType(); PrismTestUtil.getPrismContext().adopt(shadowType); diff --git a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/TestDummyHacks.java b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/TestDummyHacks.java index cd2032ef5c6..56a34e8f873 100644 --- a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/TestDummyHacks.java +++ b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/TestDummyHacks.java @@ -27,6 +27,7 @@ import com.evolveum.midpoint.prism.PrismContext; +import com.evolveum.midpoint.schema.processor.ResourceSchemaImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.ContextConfiguration; @@ -175,7 +176,7 @@ public void test003Connection() throws Exception { assertNotNull("No serialNumber", cachingMetadata.getSerialNumber()); Element xsdElement = ObjectTypeUtil.findXsdElement(xmlSchemaTypeAfter); - ResourceSchema parsedSchema = ResourceSchema.parse(xsdElement, resourceBefore.toString(), prismContext); + ResourceSchema parsedSchema = ResourceSchemaImpl.parse(xsdElement, resourceBefore.toString(), prismContext); assertNotNull("No schema after parsing", parsedSchema); display("Parsed schema", parsedSchema); diff --git a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/TestDummyLegacy.java b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/TestDummyLegacy.java index 6b68f31bf45..ba8002d017e 100644 --- a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/TestDummyLegacy.java +++ b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/TestDummyLegacy.java @@ -24,6 +24,7 @@ import java.io.File; +import com.evolveum.midpoint.common.refinery.RefinedResourceSchemaImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.ContextConfiguration; @@ -179,7 +180,7 @@ public void test105NativeParsedSchema() throws Exception { assertSuccess(result); resourceTypeNative = resourceNative.asObjectable(); - ResourceSchema returnedSchema = RefinedResourceSchema.getResourceSchema(resourceTypeNative, prismContext); + ResourceSchema returnedSchema = RefinedResourceSchemaImpl.getResourceSchema(resourceTypeNative, prismContext); display("Parsed resource schema", returnedSchema); assertNotNull("No parsed schema", returnedSchema); @@ -262,7 +263,7 @@ public void test205LegacyParsedSchema() throws Exception { assertSuccess(result); resourceTypeLegacy = resourceLegacy.asObjectable(); - ResourceSchema returnedSchema = RefinedResourceSchema.getResourceSchema(resourceTypeLegacy, prismContext); + ResourceSchema returnedSchema = RefinedResourceSchemaImpl.getResourceSchema(resourceTypeLegacy, prismContext); display("Parsed resource schema", returnedSchema); assertNotNull("No parsed schema", returnedSchema); diff --git a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/TestDummyResourceAndSchemaCaching.java b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/TestDummyResourceAndSchemaCaching.java index a31d2f9db86..977b6e9bda1 100644 --- a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/TestDummyResourceAndSchemaCaching.java +++ b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/TestDummyResourceAndSchemaCaching.java @@ -36,6 +36,8 @@ import javax.xml.namespace.QName; +import com.evolveum.midpoint.common.refinery.RefinedResourceSchemaImpl; +import com.evolveum.midpoint.prism.*; import org.apache.commons.lang.StringUtils; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.ContextConfiguration; @@ -47,12 +49,6 @@ import com.evolveum.midpoint.common.refinery.RefinedAttributeDefinition; import com.evolveum.midpoint.common.refinery.RefinedObjectClassDefinition; import com.evolveum.midpoint.common.refinery.RefinedResourceSchema; -import com.evolveum.midpoint.prism.Containerable; -import com.evolveum.midpoint.prism.PrismContainer; -import com.evolveum.midpoint.prism.PrismContainerDefinition; -import com.evolveum.midpoint.prism.PrismObject; -import com.evolveum.midpoint.prism.PrismProperty; -import com.evolveum.midpoint.prism.PrismPropertyDefinition; import com.evolveum.midpoint.prism.delta.DiffUtil; import com.evolveum.midpoint.prism.delta.ItemDelta; import com.evolveum.midpoint.prism.delta.ObjectDelta; @@ -171,8 +167,8 @@ public void test010GetResource() throws Exception { assertResourceCacheHitsIncrement(0); assertResourceCacheMissesIncrement(1); - rememberResourceSchema(RefinedResourceSchema.getResourceSchema(resourceProvisioning, prismContext)); - rememberRefinedResourceSchema(RefinedResourceSchema.getRefinedSchema(resourceProvisioning)); + rememberResourceSchema(RefinedResourceSchemaImpl.getResourceSchema(resourceProvisioning, prismContext)); + rememberRefinedResourceSchema(RefinedResourceSchemaImpl.getRefinedSchema(resourceProvisioning)); assertResourceSchemaParseCountIncrement(0); // Just refresh the resource used by other tests. This one has a complete schema. @@ -211,8 +207,8 @@ public void test011GetResourceAgain() throws Exception { assertResourceCacheHitsIncrement(1); assertResourceCacheMissesIncrement(0); - assertResourceSchemaUnchanged(RefinedResourceSchema.getResourceSchema(resourceProvisioning, prismContext)); - assertRefinedResourceSchemaUnchanged(RefinedResourceSchema.getRefinedSchema(resourceProvisioning)); + assertResourceSchemaUnchanged(RefinedResourceSchemaImpl.getResourceSchema(resourceProvisioning, prismContext)); + assertRefinedResourceSchemaUnchanged(RefinedResourceSchemaImpl.getRefinedSchema(resourceProvisioning)); assertResourceSchemaParseCountIncrement(0); assertConnectorInstanceUnchanged(resourceProvisioning); @@ -239,8 +235,8 @@ public void test011GetResourceAgain() throws Exception { assertResourceCacheHitsIncrement(1); assertResourceCacheMissesIncrement(0); - assertResourceSchemaUnchanged(RefinedResourceSchema.getResourceSchema(resourceProvisioning, prismContext)); - assertRefinedResourceSchemaUnchanged(RefinedResourceSchema.getRefinedSchema(resourceProvisioning)); + assertResourceSchemaUnchanged(RefinedResourceSchemaImpl.getResourceSchema(resourceProvisioning, prismContext)); + assertRefinedResourceSchemaUnchanged(RefinedResourceSchemaImpl.getRefinedSchema(resourceProvisioning)); assertResourceSchemaParseCountIncrement(0); assertConnectorInstanceUnchanged(resourceProvisioning); @@ -286,8 +282,8 @@ public void test012AddAccountGetResource() throws Exception { assertResourceCacheHitsIncrement(1); assertResourceCacheMissesIncrement(0); - assertResourceSchemaUnchanged(RefinedResourceSchema.getResourceSchema(resourceProvisioning, prismContext)); - assertRefinedResourceSchemaUnchanged(RefinedResourceSchema.getRefinedSchema(resourceProvisioning)); + assertResourceSchemaUnchanged(RefinedResourceSchemaImpl.getResourceSchema(resourceProvisioning, prismContext)); + assertRefinedResourceSchemaUnchanged(RefinedResourceSchemaImpl.getRefinedSchema(resourceProvisioning)); assertResourceSchemaParseCountIncrement(0); assertConnectorInstanceUnchanged(resourceProvisioning); @@ -348,8 +344,8 @@ public void test020ModifyAndGetResource() throws Exception { assertResourceCacheMissesIncrement(1); // There are expected to be re-parsed - rememberResourceSchema(RefinedResourceSchema.getResourceSchema(resourceProvisioning, prismContext)); - rememberRefinedResourceSchema(RefinedResourceSchema.getRefinedSchema(resourceProvisioning)); + rememberResourceSchema(RefinedResourceSchemaImpl.getResourceSchema(resourceProvisioning, prismContext)); + rememberRefinedResourceSchema(RefinedResourceSchemaImpl.getRefinedSchema(resourceProvisioning)); assertResourceSchemaParseCountIncrement(0); assertConnectorInstanceUnchanged(resourceProvisioning); @@ -395,8 +391,8 @@ public void test022GetAccountGetResource() throws Exception { assertResourceCacheHitsIncrement(1); assertResourceCacheMissesIncrement(0); - assertResourceSchemaUnchanged(RefinedResourceSchema.getResourceSchema(resourceProvisioning, prismContext)); - assertRefinedResourceSchemaUnchanged(RefinedResourceSchema.getRefinedSchema(resourceProvisioning)); + assertResourceSchemaUnchanged(RefinedResourceSchemaImpl.getResourceSchema(resourceProvisioning, prismContext)); + assertRefinedResourceSchemaUnchanged(RefinedResourceSchemaImpl.getRefinedSchema(resourceProvisioning)); assertResourceSchemaParseCountIncrement(0); assertConnectorInstanceUnchanged(resourceProvisioning); @@ -459,8 +455,8 @@ public void test023ModifyRepoAndGetResource() throws Exception { assertResourceCacheMissesIncrement(1); // There are expected to be re-parsed - rememberResourceSchema(RefinedResourceSchema.getResourceSchema(resourceProvisioning, prismContext)); - rememberRefinedResourceSchema(RefinedResourceSchema.getRefinedSchema(resourceProvisioning)); + rememberResourceSchema(RefinedResourceSchemaImpl.getResourceSchema(resourceProvisioning, prismContext)); + rememberRefinedResourceSchema(RefinedResourceSchemaImpl.getRefinedSchema(resourceProvisioning)); assertResourceSchemaParseCountIncrement(0); assertConnectorInstanceUnchanged(resourceProvisioning); @@ -564,7 +560,7 @@ private PropertyDelta createUselessStringDelta(String newVal) { new ItemPath(ResourceType.F_CONNECTOR_CONFIGURATION, ConnectorFactoryIcfImpl.CONNECTOR_SCHEMA_CONFIGURATION_PROPERTIES_ELEMENT_QNAME, DummyResourceContoller.CONNECTOR_DUMMY_USELESS_STRING_QNAME), - new PrismPropertyDefinition(DummyResourceContoller.CONNECTOR_DUMMY_USELESS_STRING_QNAME, DOMUtil.XSD_STRING, prismContext), + new PrismPropertyDefinitionImpl(DummyResourceContoller.CONNECTOR_DUMMY_USELESS_STRING_QNAME, DOMUtil.XSD_STRING, prismContext), newVal); return uselessStringDelta; } @@ -601,8 +597,8 @@ private void assertConnectorConfigChanged() throws ObjectNotFoundException, Sche assertResourceCacheMissesIncrement(1); // There are expected to be re-parsed - rememberResourceSchema(RefinedResourceSchema.getResourceSchema(resourceProvisioning, prismContext)); - rememberRefinedResourceSchema(RefinedResourceSchema.getRefinedSchema(resourceProvisioning)); + rememberResourceSchema(RefinedResourceSchemaImpl.getResourceSchema(resourceProvisioning, prismContext)); + rememberRefinedResourceSchema(RefinedResourceSchemaImpl.getRefinedSchema(resourceProvisioning)); assertResourceSchemaParseCountIncrement(0); // WHEN diff --git a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/TestDummySchemaless.java b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/TestDummySchemaless.java index 972c728dc42..48e612feb4f 100644 --- a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/TestDummySchemaless.java +++ b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/TestDummySchemaless.java @@ -34,6 +34,7 @@ import javax.xml.namespace.QName; +import com.evolveum.midpoint.common.refinery.RefinedResourceSchemaImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.ContextConfiguration; @@ -224,10 +225,10 @@ public void test005ParsedSchemaSchemaless() throws Exception { // THEN // The returned type should have the schema pre-parsed - assertNotNull(RefinedResourceSchema.hasParsedSchema(resourceTypeSchemaless)); + assertNotNull(RefinedResourceSchemaImpl.hasParsedSchema(resourceTypeSchemaless)); // Also test if the utility method returns the same thing - ResourceSchema returnedSchema = RefinedResourceSchema.getResourceSchema(resourceTypeSchemaless, prismContext); + ResourceSchema returnedSchema = RefinedResourceSchemaImpl.getResourceSchema(resourceTypeSchemaless, prismContext); display("Parsed resource schema", returnedSchema); @@ -300,10 +301,10 @@ public void test105ParsedSchemaStaticSchema() throws Exception { // THEN // The returned type should have the schema pre-parsed - assertNotNull(RefinedResourceSchema.hasParsedSchema(resourceTypeStaticSchema)); + assertNotNull(RefinedResourceSchemaImpl.hasParsedSchema(resourceTypeStaticSchema)); // Also test if the utility method returns the same thing - ResourceSchema returnedSchema = RefinedResourceSchema.getResourceSchema(resourceTypeStaticSchema, prismContext); + ResourceSchema returnedSchema = RefinedResourceSchemaImpl.getResourceSchema(resourceTypeStaticSchema, prismContext); display("Parsed resource schema", returnedSchema); assertNotNull("Null resource schema", returnedSchema); @@ -324,7 +325,7 @@ public void test106GetObjectStaticSchema() throws Exception { assertNotNull("No connector ref", resourceType.getConnectorRef()); assertNotNull("No connector ref OID", resourceType.getConnectorRef().getOid()); - ResourceSchema returnedSchema = RefinedResourceSchema.getResourceSchema(resource, prismContext); + ResourceSchema returnedSchema = RefinedResourceSchemaImpl.getResourceSchema(resource, prismContext); display("Parsed resource schema", returnedSchema); assertNotNull("Null resource schema", returnedSchema); diff --git a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/TestDummyUuidNonUniqueName.java b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/TestDummyUuidNonUniqueName.java index 745b35e7ac5..304620deb3c 100644 --- a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/TestDummyUuidNonUniqueName.java +++ b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/TestDummyUuidNonUniqueName.java @@ -27,6 +27,7 @@ import javax.xml.namespace.QName; +import com.evolveum.midpoint.prism.PrismPropertyDefinitionImpl; import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import com.evolveum.midpoint.schema.util.ObjectTypeUtil; import org.springframework.test.annotation.DirtiesContext; @@ -204,7 +205,7 @@ private void searchFettucini(int expectedNumberOfFettucinis) throws SchemaExcept } private PrismPropertyDefinition getIcfNameDefinition() { - return new PrismPropertyDefinition(ConnectorFactoryIcfImpl.ICFS_NAME, + return new PrismPropertyDefinitionImpl<>(ConnectorFactoryIcfImpl.ICFS_NAME, DOMUtil.XSD_STRING, prismContext); } diff --git a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/opendj/TestOpenDj.java b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/opendj/TestOpenDj.java index f033ed1598a..f2f0f10ba47 100644 --- a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/opendj/TestOpenDj.java +++ b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/opendj/TestOpenDj.java @@ -38,8 +38,10 @@ import javax.xml.datatype.XMLGregorianCalendar; import javax.xml.namespace.QName; +import com.evolveum.midpoint.common.refinery.RefinedResourceSchemaImpl; import com.evolveum.midpoint.prism.PrismContext; +import com.evolveum.midpoint.schema.processor.*; import org.apache.commons.lang.StringUtils; import org.identityconnectors.framework.common.objects.Name; import org.identityconnectors.framework.common.objects.Uid; @@ -91,10 +93,6 @@ import com.evolveum.midpoint.schema.SearchResultList; import com.evolveum.midpoint.schema.constants.ConnectorTestOperation; import com.evolveum.midpoint.schema.constants.SchemaConstants; -import com.evolveum.midpoint.schema.processor.ObjectClassComplexTypeDefinition; -import com.evolveum.midpoint.schema.processor.ResourceAttribute; -import com.evolveum.midpoint.schema.processor.ResourceAttributeDefinition; -import com.evolveum.midpoint.schema.processor.ResourceSchema; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.MiscSchemaUtil; import com.evolveum.midpoint.schema.util.ObjectQueryUtil; @@ -250,7 +248,7 @@ public void test003Connection() throws Exception { assertNotNull("No serialNumber",cachingMetadata.getSerialNumber()); Element xsdElement = ResourceTypeUtil.getResourceXsdSchema(resourceTypeRepoAfter); - ResourceSchema parsedSchema = ResourceSchema.parse(xsdElement, resourceTypeRepoAfter.toString(), prismContext); + ResourceSchema parsedSchema = ResourceSchemaImpl.parse(xsdElement, resourceTypeRepoAfter.toString(), prismContext); assertNotNull("No schema after parsing",parsedSchema); ObjectClassComplexTypeDefinition inetOrgPersonDefinition = parsedSchema.findObjectClassDefinition(RESOURCE_OPENDJ_ACCOUNT_OBJECTCLASS); @@ -272,7 +270,7 @@ public void test004ResourceAndConnectorCaching() throws Exception { ConnectorInstance configuredConnectorInstance = connectorManager.getConfiguredConnectorInstance( resource, false, result); assertNotNull("No configuredConnectorInstance", configuredConnectorInstance); - ResourceSchema resourceSchema = RefinedResourceSchema.getResourceSchema(resource, prismContext); + ResourceSchema resourceSchema = RefinedResourceSchemaImpl.getResourceSchema(resource, prismContext); assertNotNull("No resource schema", resourceSchema); // WHEN @@ -288,7 +286,7 @@ public void test004ResourceAndConnectorCaching() throws Exception { assertTrue("Configurations not equivalent", configurationContainer.equivalent(configurationContainerAgain)); assertTrue("Configurations not equals", configurationContainer.equals(configurationContainerAgain)); - ResourceSchema resourceSchemaAgain = RefinedResourceSchema.getResourceSchema(resourceAgain, prismContext); + ResourceSchema resourceSchemaAgain = RefinedResourceSchemaImpl.getResourceSchema(resourceAgain, prismContext); assertNotNull("No resource schema (again)", resourceSchemaAgain); assertEquals("Schema serial number mismatch", resourceType.getSchema().getCachingMetadata().getSerialNumber(), resourceTypeAgain.getSchema().getCachingMetadata().getSerialNumber()); @@ -375,7 +373,7 @@ public void test006Schema() throws Exception { // GIVEN // WHEN - ResourceSchema resourceSchema = RefinedResourceSchema.getResourceSchema(resourceType, prismContext); + ResourceSchema resourceSchema = RefinedResourceSchemaImpl.getResourceSchema(resourceType, prismContext); display("Resource schema", resourceSchema); ObjectClassComplexTypeDefinition accountDef = resourceSchema.findObjectClassDefinition(RESOURCE_OPENDJ_ACCOUNT_OBJECTCLASS); @@ -542,7 +540,7 @@ public void test007RefinedSchema() throws Exception { // GIVEN // WHEN - RefinedResourceSchema refinedSchema = RefinedResourceSchema.getRefinedSchema(resourceType, prismContext); + RefinedResourceSchema refinedSchema = RefinedResourceSchemaImpl.getRefinedSchema(resourceType, prismContext); display("Refined schema", refinedSchema); // Check whether it is reusing the existing schema and not parsing it @@ -550,7 +548,7 @@ public void test007RefinedSchema() throws Exception { // Not equals() but == ... we want to really know if exactly the same // object instance is returned assertTrue("Broken caching", - refinedSchema == RefinedResourceSchema.getRefinedSchema(resourceType, prismContext)); + refinedSchema == RefinedResourceSchemaImpl.getRefinedSchema(resourceType, prismContext)); RefinedObjectClassDefinition accountDef = refinedSchema.getDefaultRefinedDefinition(ShadowKindType.ACCOUNT); assertNotNull("Account definition is missing", accountDef); diff --git a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/opendj/TestOpenDjNegative.java b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/opendj/TestOpenDjNegative.java index 0c4ef16d18b..468265e31e9 100644 --- a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/opendj/TestOpenDjNegative.java +++ b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/opendj/TestOpenDjNegative.java @@ -28,6 +28,7 @@ import javax.xml.namespace.QName; +import com.evolveum.midpoint.common.refinery.RefinedResourceSchemaImpl; import com.evolveum.midpoint.prism.PrismContext; import org.springframework.beans.factory.annotation.Autowired; @@ -166,7 +167,7 @@ public void test004ResourceAndConnectorCaching() throws Exception { TestUtil.assertFailure(result); TestUtil.assertFailure(resource.asObjectable().getFetchResult()); - ResourceSchema resourceSchema = RefinedResourceSchema.getResourceSchema(resource, prismContext); + ResourceSchema resourceSchema = RefinedResourceSchemaImpl.getResourceSchema(resource, prismContext); assertNull("Resource schema found", resourceSchema); // WHEN @@ -187,7 +188,7 @@ public void test004ResourceAndConnectorCaching() throws Exception { assertTrue("Configurations not equivalent", configurationContainer.equivalent(configurationContainerAgain)); assertTrue("Configurations not equals", configurationContainer.equals(configurationContainerAgain)); - ResourceSchema resourceSchemaAgain = RefinedResourceSchema.getResourceSchema(resourceAgain, prismContext); + ResourceSchema resourceSchemaAgain = RefinedResourceSchemaImpl.getResourceSchema(resourceAgain, prismContext); assertNull("Resource schema (again)", resourceSchemaAgain); } diff --git a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/ucf/TestUcfDummy.java b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/ucf/TestUcfDummy.java index 76353b78f65..0c5db0e3e01 100644 --- a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/ucf/TestUcfDummy.java +++ b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/ucf/TestUcfDummy.java @@ -29,6 +29,8 @@ import javax.xml.namespace.QName; +import com.evolveum.midpoint.prism.schema.PrismSchemaImpl; +import com.evolveum.midpoint.schema.processor.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.testng.AbstractTestNGSpringContextTests; @@ -65,10 +67,6 @@ import com.evolveum.midpoint.schema.MidPointPrismContextFactory; import com.evolveum.midpoint.schema.SchemaConstantsGenerated; import com.evolveum.midpoint.schema.constants.MidPointConstants; -import com.evolveum.midpoint.schema.processor.ObjectClassComplexTypeDefinition; -import com.evolveum.midpoint.schema.processor.ResourceAttribute; -import com.evolveum.midpoint.schema.processor.ResourceAttributeContainer; -import com.evolveum.midpoint.schema.processor.ResourceSchema; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.statistics.ConnectorOperationalStatus; import com.evolveum.midpoint.schema.util.ObjectTypeUtil; @@ -174,7 +172,7 @@ public void test002ConnectorSchema() throws Exception { display("Serialized XSD connector schema", DOMUtil.serializeDOMToString(xsdSchemaDom)); // Try to re-parse - PrismSchema reparsedConnectorSchema = PrismSchema.parse(DOMUtil.getFirstChildElement(xsdSchemaDom), true, "schema fetched from "+cc, PrismTestUtil.getPrismContext()); + PrismSchema reparsedConnectorSchema = PrismSchemaImpl.parse(DOMUtil.getFirstChildElement(xsdSchemaDom), true, "schema fetched from "+cc, PrismTestUtil.getPrismContext()); ProvisioningTestUtil.assertConnectorSchemaSanity(reparsedConnectorSchema, "re-parsed"); // TODO: 3 definitions would be cleaner. But we can live with this assertEquals("Unexpected number of definitions in re-parsed schema", 6, reparsedConnectorSchema.getDefinitions().size()); @@ -283,7 +281,7 @@ public void test030ResourceSchema() throws Exception { display("Serialized XSD resource schema", DOMUtil.serializeDOMToString(xsdSchemaDom)); // Try to re-parse - ResourceSchema reparsedResourceSchema = ResourceSchema.parse(DOMUtil.getFirstChildElement(xsdSchemaDom), + ResourceSchema reparsedResourceSchema = ResourceSchemaImpl.parse(DOMUtil.getFirstChildElement(xsdSchemaDom), "serialized schema", PrismTestUtil.getPrismContext()); display("Re-parsed resource schema", reparsedResourceSchema); assertEquals("Unexpected number of definitions in re-parsed schema", 4, reparsedResourceSchema.getDefinitions().size()); diff --git a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/AddGetObjectTest.java b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/AddGetObjectTest.java index 320b32b7c8c..a7a32777e2e 100644 --- a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/AddGetObjectTest.java +++ b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/AddGetObjectTest.java @@ -27,6 +27,7 @@ import javax.xml.bind.JAXBException; import javax.xml.namespace.QName; +import com.evolveum.midpoint.common.refinery.RefinedResourceSchemaImpl; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.stat.Statistics; @@ -342,7 +343,7 @@ public void addGetFullAccount() throws Exception { // apply appropriate schema PrismObject resource = prismContext.parseObject(new File(FOLDER_BASIC, "resource-opendj.xml")); - ResourceSchema resourceSchema = RefinedResourceSchema.getResourceSchema(resource, prismContext); + ResourceSchema resourceSchema = RefinedResourceSchemaImpl.getResourceSchema(resource, prismContext); ShadowUtil.applyResourceSchema(fileAccount, resourceSchema); OperationResult result = new OperationResult("ADD"); @@ -553,7 +554,7 @@ private void addGetFullAccountShadow() throws Exception { // apply appropriate schema PrismObject resource = prismContext.parseObject(new File(FOLDER_BASIC, "resource-opendj.xml")); - ResourceSchema resourceSchema = RefinedResourceSchema.getResourceSchema(resource, prismContext); + ResourceSchema resourceSchema = RefinedResourceSchemaImpl.getResourceSchema(resource, prismContext); ShadowUtil.applyResourceSchema(account, resourceSchema); repositoryService.addObject(account, null, result); diff --git a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/QueryInterpreter2Test.java b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/QueryInterpreter2Test.java index a127db89658..729e745e858 100644 --- a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/QueryInterpreter2Test.java +++ b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/QueryInterpreter2Test.java @@ -2446,11 +2446,11 @@ public void test620QueryGenericString() throws Exception { // // List secondaryEquals = new ArrayList<>(); // EqualFilter eq = EqualFilter.createEqual(new ItemPath(ShadowType.F_ATTRIBUTES, SchemaConstantsGenerated.ICF_S_UID), -// new PrismPropertyDefinition(SchemaConstantsGenerated.ICF_S_UID, DOMUtil.XSD_STRING, prismContext), +// new PrismPropertyDefinitionImpl(SchemaConstantsGenerated.ICF_S_UID, DOMUtil.XSD_STRING, prismContext), // "8daaeeae-f0c7-41c9-b258-2a3351aa8876"); // secondaryEquals.add(eq); // eq = EqualFilter.createEqual(new ItemPath(ShadowType.F_ATTRIBUTES, SchemaConstantsGenerated.ICF_S_NAME), -// new PrismPropertyDefinition(SchemaConstantsGenerated.ICF_S_NAME, DOMUtil.XSD_STRING, prismContext), +// new PrismPropertyDefinitionImpl(SchemaConstantsGenerated.ICF_S_NAME, DOMUtil.XSD_STRING, prismContext), // "some-name"); // secondaryEquals.add(eq); // @@ -2537,7 +2537,7 @@ public void test640queryAssignmentExtensionBoolean() throws Exception { SchemaRegistry registry = prismContext.getSchemaRegistry(); PrismObjectDefinition userDef = registry.findObjectDefinitionByCompileTimeClass(UserType.class); PrismContainerDefinition assignmentDef = userDef.findContainerDefinition(F_ASSIGNMENT); - PrismPropertyDefinition propDef = assignmentDef.createPropertyDefinition(SKIP_AUTOGENERATION, DOMUtil.XSD_BOOLEAN); + PrismPropertyDefinition propDef = ((PrismContainerDefinitionImpl) assignmentDef).createPropertyDefinition(SKIP_AUTOGENERATION, DOMUtil.XSD_BOOLEAN); ObjectQuery objectQuery = QueryBuilder.queryFor(UserType.class, prismContext) .itemWithDef(propDef, F_ASSIGNMENT, AssignmentType.F_EXTENSION, SKIP_AUTOGENERATION).eq(true) @@ -3060,7 +3060,7 @@ public void test900EqualsMultivalue() throws Exception { PrismObjectDefinition userDef = prismContext.getSchemaRegistry().findObjectDefinitionByCompileTimeClass(UserType.class); PrismPropertyDefinition prefLangDef = userDef.findPropertyDefinition(UserType.F_PREFERRED_LANGUAGE); - PrismPropertyDefinition multivalDef = new PrismPropertyDefinition(UserType.F_PREFERRED_LANGUAGE, + PrismPropertyDefinitionImpl multivalDef = new PrismPropertyDefinitionImpl(UserType.F_PREFERRED_LANGUAGE, DOMUtil.XSD_STRING, prismContext); multivalDef.setMaxOccurs(-1); PrismProperty multivalProperty = multivalDef.instantiate(); diff --git a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/RAnyConverterStaticTest.java b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/RAnyConverterStaticTest.java index 656971a2872..aa909c1fa95 100644 --- a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/RAnyConverterStaticTest.java +++ b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/RAnyConverterStaticTest.java @@ -18,12 +18,7 @@ import java.util.Set; -import com.evolveum.midpoint.prism.ItemDefinition; -import com.evolveum.midpoint.prism.PrismConstants; -import com.evolveum.midpoint.prism.PrismContainerValue; -import com.evolveum.midpoint.prism.PrismObjectDefinition; -import com.evolveum.midpoint.prism.PrismProperty; -import com.evolveum.midpoint.prism.PrismPropertyValue; +import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.prism.schema.SchemaRegistry; @@ -199,7 +194,7 @@ public void testExtensionEnum() throws Exception { AssertJUnit.assertNotNull(def); PrismProperty item = (PrismProperty) def.instantiate(); item.setValue(new PrismPropertyValue(BeforeAfterType.AFTER)); - def.setName(valueName); + ((ItemDefinitionImpl) def).setName(valueName); RAnyConverter converter = new RAnyConverter(prismContext); diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/ObjectRetriever.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/ObjectRetriever.java index c04bd9a8241..de8cf37617f 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/ObjectRetriever.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/ObjectRetriever.java @@ -533,10 +533,10 @@ private void applyShadowAttributeDefinitions(Class anyValue if (item.getDefinition() == null) { RValueType rValType = (RValueType) value[2]; if (rValType == RValueType.PROPERTY) { - PrismPropertyDefinition def = new PrismPropertyDefinition(name, type, object.getPrismContext()); + PrismPropertyDefinition def = new PrismPropertyDefinitionImpl(name, type, object.getPrismContext()); item.applyDefinition(def, true); } else if (rValType == RValueType.REFERENCE) { - PrismReferenceDefinition def = new PrismReferenceDefinition(name, type, object.getPrismContext()); + PrismReferenceDefinition def = new PrismReferenceDefinitionImpl(name, type, object.getPrismContext()); item.applyDefinition(def, true); } else { throw new UnsupportedOperationException("Unsupported value type " + rValType); diff --git a/repo/repo-test-util/src/main/java/com/evolveum/midpoint/test/AbstractIntegrationTest.java b/repo/repo-test-util/src/main/java/com/evolveum/midpoint/test/AbstractIntegrationTest.java index 06d08fb3e07..fc91bfca66c 100644 --- a/repo/repo-test-util/src/main/java/com/evolveum/midpoint/test/AbstractIntegrationTest.java +++ b/repo/repo-test-util/src/main/java/com/evolveum/midpoint/test/AbstractIntegrationTest.java @@ -26,6 +26,7 @@ import com.evolveum.midpoint.common.refinery.RefinedAttributeDefinition; import com.evolveum.midpoint.common.refinery.RefinedObjectClassDefinition; import com.evolveum.midpoint.common.refinery.RefinedResourceSchema; +import com.evolveum.midpoint.common.refinery.RefinedResourceSchemaImpl; import com.evolveum.midpoint.prism.ConsistencyCheckScope; import com.evolveum.midpoint.prism.Containerable; import com.evolveum.midpoint.prism.Item; @@ -61,11 +62,7 @@ import com.evolveum.midpoint.schema.internals.CachingStatistics; import com.evolveum.midpoint.schema.internals.InternalMonitor; import com.evolveum.midpoint.schema.internals.InternalsConfig; -import com.evolveum.midpoint.schema.processor.ObjectClassComplexTypeDefinition; -import com.evolveum.midpoint.schema.processor.ResourceAttribute; -import com.evolveum.midpoint.schema.processor.ResourceAttributeContainer; -import com.evolveum.midpoint.schema.processor.ResourceAttributeDefinition; -import com.evolveum.midpoint.schema.processor.ResourceSchema; +import com.evolveum.midpoint.schema.processor.*; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.ResourceTypeUtil; import com.evolveum.midpoint.schema.util.ShadowUtil; @@ -257,7 +254,7 @@ protected PrismObject repoAddShadowFromFile(File file, OperationResu PrismContainer attrCont = object.findContainer(ShadowType.F_ATTRIBUTES); for (PrismProperty attr: attrCont.getValue().getProperties()) { if (attr.getDefinition() == null) { - ResourceAttributeDefinition attrDef = new ResourceAttributeDefinition<>(attr.getElementName(), + ResourceAttributeDefinition attrDef = new ResourceAttributeDefinitionImpl<>(attr.getElementName(), DOMUtil.XSD_STRING, prismContext); attr.setDefinition((PrismPropertyDefinition) attrDef); } @@ -630,7 +627,7 @@ protected void assertShadowCommon(PrismObject shadow, String oid, St PrismAsserts.assertPropertyValue(shadow, ShadowType.F_NAME, PrismTestUtil.createPolyString(username)); - RefinedResourceSchema rSchema = RefinedResourceSchema.getRefinedSchema(resourceType); + RefinedResourceSchema rSchema = RefinedResourceSchemaImpl.getRefinedSchema(resourceType); ObjectClassComplexTypeDefinition ocDef = rSchema.findObjectClassDefinition(objectClass); if (ocDef.getSecondaryIdentifiers().isEmpty()) { ResourceAttributeDefinition idDef = ocDef.getPrimaryIdentifiers().iterator().next(); @@ -697,7 +694,7 @@ protected void assertShadowRepo(PrismObject accountShadow, String oi } RefinedResourceSchema refinedSchema = null; try { - refinedSchema = RefinedResourceSchema.getRefinedSchema(resourceType); + refinedSchema = RefinedResourceSchemaImpl.getRefinedSchema(resourceType); } catch (SchemaException e) { AssertJUnit.fail(e.getMessage()); } @@ -919,7 +916,7 @@ protected PrismObject createShadow(PrismObject resourc resourceRef.setOid(resource.getOid()); shadowType.setResourceRef(resourceRef); shadowType.setKind(ShadowKindType.ACCOUNT); - RefinedResourceSchema refinedSchema = RefinedResourceSchema.getRefinedSchema(resource); + RefinedResourceSchema refinedSchema = RefinedResourceSchemaImpl.getRefinedSchema(resource); RefinedObjectClassDefinition objectClassDefinition = refinedSchema.getDefaultRefinedDefinition(ShadowKindType.ACCOUNT); shadowType.setObjectClass(objectClassDefinition.getTypeName()); ResourceAttributeContainer attrContainer = ShadowUtil.getOrCreateAttributesContainer(shadow, objectClassDefinition); @@ -949,7 +946,7 @@ protected PrismObject findAccountShadowByUsername(String username, P } protected PrismObject findShadowByName(ShadowKindType kind, String intent, String name, PrismObject resource, OperationResult result) throws SchemaException, ObjectNotFoundException, SecurityViolationException, CommunicationException, ConfigurationException { - RefinedResourceSchema rSchema = RefinedResourceSchema.getRefinedSchema(resource); + RefinedResourceSchema rSchema = RefinedResourceSchemaImpl.getRefinedSchema(resource); RefinedObjectClassDefinition rOcDef = rSchema.getRefinedDefinition(kind,intent); ObjectQuery query = createShadowQuerySecondaryIdentifier(rOcDef, name, resource); List> shadows = repositoryService.searchObjects(ShadowType.class, query, null, result); @@ -961,7 +958,7 @@ protected PrismObject findShadowByName(ShadowKindType kind, String i } protected PrismObject findShadowByName(QName objectClass, String name, PrismObject resource, OperationResult result) throws SchemaException, ObjectNotFoundException, SecurityViolationException, CommunicationException, ConfigurationException { - RefinedResourceSchema rSchema = RefinedResourceSchema.getRefinedSchema(resource); + RefinedResourceSchema rSchema = RefinedResourceSchemaImpl.getRefinedSchema(resource); RefinedObjectClassDefinition rOcDef = rSchema.getRefinedDefinition(objectClass); ObjectQuery query = createShadowQuerySecondaryIdentifier(rOcDef, name, resource); List> shadows = repositoryService.searchObjects(ShadowType.class, query, null, result); @@ -973,7 +970,7 @@ protected PrismObject findShadowByName(QName objectClass, String nam } protected ObjectQuery createAccountShadowQuery(String identifier, PrismObject resource) throws SchemaException { - RefinedResourceSchema rSchema = RefinedResourceSchema.getRefinedSchema(resource); + RefinedResourceSchema rSchema = RefinedResourceSchemaImpl.getRefinedSchema(resource); RefinedObjectClassDefinition rAccount = rSchema.getDefaultRefinedDefinition(ShadowKindType.ACCOUNT); Collection identifierDefs = rAccount.getPrimaryIdentifiers(); assert identifierDefs.size() == 1 : "Unexpected identifier set in "+resource+" refined schema: "+identifierDefs; @@ -987,7 +984,7 @@ protected ObjectQuery createAccountShadowQuery(String identifier, PrismObject resource) throws SchemaException { - RefinedResourceSchema rSchema = RefinedResourceSchema.getRefinedSchema(resource); + RefinedResourceSchema rSchema = RefinedResourceSchemaImpl.getRefinedSchema(resource); RefinedObjectClassDefinition rAccount = rSchema.getDefaultRefinedDefinition(ShadowKindType.ACCOUNT); return createShadowQuerySecondaryIdentifier(rAccount, identifier, resource); } @@ -1017,7 +1014,7 @@ protected RefinedAttributeDefinition getAttributeDefinition(ResourceType resourc ShadowKindType kind, QName objectClassName, String attributeLocalName) throws SchemaException { - RefinedResourceSchema refinedResourceSchema = RefinedResourceSchema.getRefinedSchema(resourceType); + RefinedResourceSchema refinedResourceSchema = RefinedResourceSchemaImpl.getRefinedSchema(resourceType); RefinedObjectClassDefinition refinedObjectClassDefinition = refinedResourceSchema.findRefinedDefinitionByObjectClassQName(kind, objectClassName); return refinedObjectClassDefinition.findAttributeDefinition(attributeLocalName); diff --git a/repo/repo-test-util/src/main/java/com/evolveum/midpoint/test/IntegrationTestTools.java b/repo/repo-test-util/src/main/java/com/evolveum/midpoint/test/IntegrationTestTools.java index 990b82402c2..1602419d3a5 100644 --- a/repo/repo-test-util/src/main/java/com/evolveum/midpoint/test/IntegrationTestTools.java +++ b/repo/repo-test-util/src/main/java/com/evolveum/midpoint/test/IntegrationTestTools.java @@ -18,6 +18,7 @@ import com.evolveum.icf.dummy.resource.DummyGroup; import com.evolveum.icf.dummy.resource.ScriptHistoryEntry; import com.evolveum.midpoint.common.refinery.RefinedResourceSchema; +import com.evolveum.midpoint.common.refinery.RefinedResourceSchemaImpl; import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.delta.ObjectDelta; import com.evolveum.midpoint.prism.match.MatchingRule; @@ -602,7 +603,7 @@ public static void checkShadow(ShadowType shadowType, ResourceType resourceType, assertNotNull("no attributes",attrs); assertFalse("empty attributes",attrs.isEmpty()); - RefinedResourceSchema rschema = RefinedResourceSchema.getRefinedSchema(resourceType); + RefinedResourceSchema rschema = RefinedResourceSchemaImpl.getRefinedSchema(resourceType); ObjectClassComplexTypeDefinition objectClassDef = rschema.findObjectClassDefinition(shadowType); assertNotNull("cannot determine object class for "+shadowType, objectClassDef); @@ -695,7 +696,7 @@ private static ObjectQuery createShadowQuery(ShadowType resourceShadow, ObjectCl } public static void applyResourceSchema(ShadowType accountType, ResourceType resourceType, PrismContext prismContext) throws SchemaException { - ResourceSchema resourceSchema = RefinedResourceSchema.getResourceSchema(resourceType, prismContext); + ResourceSchema resourceSchema = RefinedResourceSchemaImpl.getResourceSchema(resourceType, prismContext); ShadowUtil.applyResourceSchema(accountType.asPrismObject(), resourceSchema); } diff --git a/repo/system-init/src/main/java/com/evolveum/midpoint/init/ConfigurablePrismContextFactory.java b/repo/system-init/src/main/java/com/evolveum/midpoint/init/ConfigurablePrismContextFactory.java index eab3de520e0..d8da9093935 100644 --- a/repo/system-init/src/main/java/com/evolveum/midpoint/init/ConfigurablePrismContextFactory.java +++ b/repo/system-init/src/main/java/com/evolveum/midpoint/init/ConfigurablePrismContextFactory.java @@ -18,6 +18,7 @@ import com.evolveum.midpoint.common.configuration.api.MidpointConfiguration; import com.evolveum.midpoint.prism.schema.SchemaRegistry; +import com.evolveum.midpoint.prism.schema.SchemaRegistryImpl; import com.evolveum.midpoint.schema.MidPointPrismContextFactory; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.util.logging.Trace; @@ -50,7 +51,7 @@ public void setConfiguration(MidpointConfiguration configuration) { } @Override - protected void registerExtensionSchemas(SchemaRegistry schemaRegistry) throws SchemaException { + protected void registerExtensionSchemas(SchemaRegistryImpl schemaRegistry) throws SchemaException { Configuration config = configuration.getConfiguration(CONFIGURATION_GLOBAL); if (config == null) { LOGGER.warn("Global part 'midpoint.global' is not defined in configuration file."); diff --git a/repo/task-quartz-impl/src/test/java/com/evolveum/midpoint/task/quartzimpl/TestQuartzTaskManagerContract.java b/repo/task-quartz-impl/src/test/java/com/evolveum/midpoint/task/quartzimpl/TestQuartzTaskManagerContract.java index 47630abbe09..b2658dfdb42 100644 --- a/repo/task-quartz-impl/src/test/java/com/evolveum/midpoint/task/quartzimpl/TestQuartzTaskManagerContract.java +++ b/repo/task-quartz-impl/src/test/java/com/evolveum/midpoint/task/quartzimpl/TestQuartzTaskManagerContract.java @@ -263,7 +263,7 @@ public void test004aTaskBigProperty() throws Exception { // property definition QName bigStringQName = new QName("http://midpoint.evolveum.com/repo/test", "bigString"); - PrismPropertyDefinition bigStringDefinition = new PrismPropertyDefinition(bigStringQName, DOMUtil.XSD_STRING, taskManager.getPrismContext()); + PrismPropertyDefinitionImpl bigStringDefinition = new PrismPropertyDefinitionImpl(bigStringQName, DOMUtil.XSD_STRING, taskManager.getPrismContext()); bigStringDefinition.setIndexed(false); bigStringDefinition.setMinOccurs(0); bigStringDefinition.setMaxOccurs(1); @@ -291,7 +291,7 @@ public void test004aTaskBigProperty() throws Exception { task001.setExtensionProperty(bigStringProperty); // brutal hack, because task extension property has no "indexed" flag when retrieved from repo - task001.getExtensionProperty(bigStringQName).getDefinition().setIndexed(false); + ((PrismPropertyDefinitionImpl) task001.getExtensionProperty(bigStringQName).getDefinition()).setIndexed(false); System.out.println("2nd round: Task before save = " + task001.debugDump()); task001.savePendingModifications(result); // however, this does not work, because 'modifyObject' in repo first reads object, overwriting any existing definitions ... @@ -396,7 +396,7 @@ public void test004TaskProperties() throws Exception { System.out.println("Task extension = " + task.getExtension()); - PrismPropertyDefinition delayDefinition = new PrismPropertyDefinition(SchemaConstants.NOOP_DELAY_QNAME, DOMUtil.XSD_INT, taskManager.getPrismContext()); + PrismPropertyDefinition delayDefinition = new PrismPropertyDefinitionImpl(SchemaConstants.NOOP_DELAY_QNAME, DOMUtil.XSD_INT, taskManager.getPrismContext()); System.out.println("property definition = " + delayDefinition); PrismProperty property = (PrismProperty) delayDefinition.instantiate(); From 4daf2c44415ac876d7de374afa44ad80b877f8fa Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Wed, 19 Oct 2016 01:14:07 +0200 Subject: [PATCH 39/74] Prisms tests passing. --- build-system/pom.xml | 9 + .../component/prism/ObjectWrapperFactory.java | 10 +- .../midpoint/web/component/search/Search.java | 4 +- .../wizard/resource/ConfigurationStep.java | 2 +- .../admin/configuration/PageBulkAction.java | 8 +- .../configuration/PageEvaluateMapping.java | 4 +- .../configuration/PageRepositoryQuery.java | 2 +- .../component/RunReportPopupPanel.java | 19 +- .../midpoint/web/util/ExpressionUtil.java | 3 +- .../midpoint/common/StaticExpressionUtil.java | 10 +- ...CompositeRefinedObjectClassDefinition.java | 11 +- ...LayerRefinedObjectClassDefinitionImpl.java | 38 +- .../refinery/RefinedResourceSchema.java | 11 + infra/prism-maven-plugin/pom.xml | 4 + .../midpoint/prism/maven/SchemaDocMojo.java | 9 +- infra/prism/pom.xml | 5 + .../midpoint/prism/ComplexTypeDefinition.java | 3 + .../evolveum/midpoint/prism/Definition.java | 3 +- .../com/evolveum/midpoint/prism/Item.java | 6 +- .../midpoint/prism/ItemDefinitionImpl.java | 3 +- .../midpoint/prism/LocalDefinitionStore.java | 38 +- .../midpoint/prism/ParserXNodeSource.java | 58 + .../midpoint/prism/ParsingContext.java | 8 +- .../midpoint/prism/PrismContainer.java | 5 - .../prism/PrismContainerDefinitionImpl.java | 45 +- .../evolveum/midpoint/prism/PrismContext.java | 74 +- .../midpoint/prism/PrismContextImpl.java | 137 +- .../evolveum/midpoint/prism/PrismParser.java | 146 +- .../midpoint/prism/PrismParserNoIO.java | 30 +- .../midpoint/prism/PrismProperty.java | 30 +- .../midpoint/prism/PrismPropertyValue.java | 16 +- .../midpoint/prism/PrismReference.java | 12 - .../prism/PrismReferenceDefinitionImpl.java | 1 - .../midpoint/prism/PrismSerializer.java | 25 +- .../midpoint/prism/PrismSerializerImpl.java | 123 -- .../midpoint/prism/SerializationContext.java | 6 +- .../midpoint/prism/SerializationOptions.java | 21 +- .../midpoint/prism/SerializerDomTarget.java | 10 +- .../prism/SerializerStringTarget.java | 12 +- .../midpoint/prism/SerializerTarget.java | 10 +- .../midpoint/prism/SerializerXNodeTarget.java | 10 +- .../midpoint/prism/lex/LexicalHelpers.java | 36 - .../midpoint/prism/lex/LexicalProcessor.java | 14 +- .../prism/lex/LexicalProcessorRegistry.java | 50 +- .../prism/lex/dom/DomLexicalProcessor.java | 17 +- .../prism/lex/dom/DomLexicalWriter.java | 8 +- .../json/AbstractJsonLexicalProcessor.java | 6 +- .../prism/lex/json/NullLexicalProcessor.java | 77 + .../midpoint/prism/marshaller/ItemInfo.java | 162 ++ .../prism/marshaller/JaxbDomHack.java | 4 +- .../prism/marshaller/PrismBeanConverter.java | 18 +- .../prism/marshaller/PrismBeanInspector.java | 23 +- ...deSerializer.java => PrismMarshaller.java} | 220 ++- .../prism/marshaller/PrismParserImpl.java | 204 ++- .../prism/marshaller/PrismParserImplIO.java | 45 +- .../prism/marshaller/PrismParserImplNoIO.java | 71 +- .../prism/marshaller/PrismSerializerImpl.java | 155 ++ .../prism/marshaller/PrismUnmarshaller.java | 620 ++++++++ .../prism/marshaller/QueryConvertor.java | 102 +- .../prism/marshaller/XNodeProcessor.java | 1300 ----------------- .../prism/marshaller/XNodeProcessorUtil.java | 47 +- .../prism/schema/DomToSchemaProcessor.java | 2 +- .../prism/schema/GlobalDefinitionsStore.java | 34 +- .../midpoint/prism/schema/SchemaRegistry.java | 26 +- .../prism/schema/SchemaRegistryImpl.java | 149 +- .../prism/schema/SchemaToDomProcessor.java | 11 +- .../midpoint/prism/util/PrismTestUtil.java | 8 +- .../midpoint/prism/util/PrismUtil.java | 32 +- .../midpoint/prism/util/RawTypeUtil.java | 6 +- .../midpoint/prism/xjc/PrismForJAXBUtil.java | 2 +- .../midpoint/prism/xnode/MapXNode.java | 5 + .../midpoint/prism/xnode/RootXNode.java | 17 +- .../evolveum/midpoint/prism/xnode/XNode.java | 15 +- .../prism/xml/ns/_public/types_3/RawType.java | 35 +- .../midpoint/prism/TestExtraSchema.java | 2 +- .../midpoint/prism/TestXmlSerialization.java | 6 +- .../prism/foo/EventHandlerChainType.java | 1 + .../lex/AbstractLexicalProcessorTest.java | 80 +- .../prism/lex/TestProtectedString.java | 3 +- .../midpoint/schema/DeltaConvertor.java | 29 +- .../schema/MidPointPrismContextFactory.java | 4 +- .../midpoint/schema/util/MiscSchemaUtil.java | 26 +- .../midpoint/schema/util/ParamsTypeUtil.java | 14 +- .../midpoint/schema/TestDeltaConverter.java | 2 +- .../midpoint/schema/TestJaxbParsing.java | 16 +- .../midpoint/schema/TestParseDiffPatch.java | 11 +- .../midpoint/schema/TestParseFilter.java | 4 +- .../schema/TestParseModelContext.java | 4 +- .../parser/resource/TestParseResource.java | 6 +- .../parser/resource/TestParseResourceXml.java | 11 +- .../xpath/LazyXPathVariableResolver.java | 2 - .../midpoint/model/impl/ModelRestService.java | 2 +- .../midpoint/model/impl/ModelWebService.java | 4 +- .../model/impl/ModelWebServiceRaw.java | 40 +- .../model/impl/rest/MidpointXmlProvider.java | 2 +- .../ScriptingExpressionEvaluator.java | 2 +- .../impl/expr/ExpressionHandlerImplTest.java | 6 +- .../model/impl/lens/TestClockwork.java | 8 +- .../midpoint/report/impl/ReportFunctions.java | 6 +- .../report/impl/ReportServiceImpl.java | 2 +- .../report/impl/ReportWebServiceRaw.java | 14 +- .../midpoint/wf/impl/util/MiscDataUtil.java | 2 +- .../general/TestGeneralChangeProcessor.java | 2 +- pom.xml | 5 + .../provisioning/impl/ucf/TestUcfOpenDj.java | 11 +- .../midpoint/repo/sql/AddGetObjectTest.java | 2 +- .../sql/data/audit/RObjectDeltaOperation.java | 4 +- .../container/RAccessCertificationCase.java | 6 +- .../midpoint/testing/sanity/TestSanity.java | 15 +- .../testing/sanity/TestSanityLegacy.java | 20 +- .../midpoint/testing/story/TestUnix.java | 1 + 111 files changed, 2380 insertions(+), 2497 deletions(-) create mode 100644 infra/prism/src/main/java/com/evolveum/midpoint/prism/ParserXNodeSource.java delete mode 100644 infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismSerializerImpl.java delete mode 100644 infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/LexicalHelpers.java create mode 100644 infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/NullLexicalProcessor.java create mode 100644 infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/ItemInfo.java rename infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/{XNodeSerializer.java => PrismMarshaller.java} (59%) create mode 100644 infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismSerializerImpl.java create mode 100644 infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismUnmarshaller.java delete mode 100644 infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/XNodeProcessor.java diff --git a/build-system/pom.xml b/build-system/pom.xml index df31b72e831..3ae728c479f 100644 --- a/build-system/pom.xml +++ b/build-system/pom.xml @@ -937,6 +937,15 @@ org.apache.maven maven-plugin-api 2.0 + org.apache.maven diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/ObjectWrapperFactory.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/ObjectWrapperFactory.java index 33ea37fd51d..2bfd7aebb6e 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/ObjectWrapperFactory.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/ObjectWrapperFactory.java @@ -207,7 +207,7 @@ private List> c ContainerStatus status = container == null ? ContainerStatus.ADDING : ContainerStatus.MODIFYING; List> list = new ArrayList<>(); if (container == null) { - PrismContainerDefinition definition = getDefinition(object, objectDefinitionForEditing).findContainerDefinition(name); + PrismContainerDefinition definition = getDefinition(object, objectDefinitionForEditing).findContainerDefinition(name); container = definition.instantiate(); } @@ -254,7 +254,7 @@ private void addContainerWrapper LOGGER.trace("ObjectWrapper.createContainerWrapper processing definition: {}", def); - PrismContainerDefinition containerDef = (PrismContainerDefinition) def; + PrismContainerDefinition containerDef = (PrismContainerDefinition) def; //todo this oWrapper.isShowAssignments() value is not set when initialization occurs (only default is there) [lazyman] if (!oWrapper.isShowAssignments() && AssignmentType.COMPLEX_TYPE.equals(containerDef.getTypeName())) { continue; @@ -330,7 +330,7 @@ private void addResourceContainerWrapper( // brutal hack - the definition has (errorneously) set maxOccurs = // unbounded. But there can be only one configuration container. // See MID-2317 and related issues - PrismContainerDefinition definitionFixed = definition.clone(); + PrismContainerDefinition definitionFixed = definition.clone(); ((PrismContainerDefinitionImpl) definitionFixed).setMaxOccurs(1); if (container == null) { @@ -351,7 +351,7 @@ private void addShadowContainers( PrismContainer attributesContainer = object.findContainer(ShadowType.F_ATTRIBUTES); ContainerStatus status = attributesContainer != null ? cStatus : ContainerStatus.ADDING; if (attributesContainer == null) { - PrismContainerDefinition definition = object.getDefinition().findContainerDefinition( + PrismContainerDefinition definition = object.getDefinition().findContainerDefinition( ShadowType.F_ATTRIBUTES); attributesContainer = definition.instantiate(); } @@ -402,7 +402,7 @@ private void addReportContainers( if (container == null) { PrismSchema schema = ReportTypeUtil.parseReportConfigurationSchema( (PrismObject) object, object.getPrismContext()); - PrismContainerDefinition definition = ReportTypeUtil.findReportConfigurationDefinition(schema); + PrismContainerDefinition definition = ReportTypeUtil.findReportConfigurationDefinition(schema); if (definition == null) { return; } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/Search.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/Search.java index e6a064d6c70..a009e2d9df4 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/Search.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/Search.java @@ -17,8 +17,6 @@ package com.evolveum.midpoint.web.component.search; import com.evolveum.midpoint.prism.*; -import com.evolveum.midpoint.prism.match.PolyStringNormMatchingRule; -import com.evolveum.midpoint.prism.match.StringIgnoreCaseMatchingRule; import com.evolveum.midpoint.prism.marshaller.QueryConvertor; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.polystring.PolyStringNormalizer; @@ -274,7 +272,7 @@ private ObjectFilter createAdvancedObjectFilter(PrismContext ctx) throws SchemaE return null; } - SearchFilterType search = ctx.parserFor(advancedQuery).parseAtomicValue(SearchFilterType.COMPLEX_TYPE); + SearchFilterType search = ctx.parserFor(advancedQuery).type(SearchFilterType.COMPLEX_TYPE).parseRealValue(); return QueryConvertor.parseFilter(search, type, ctx); } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/ConfigurationStep.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/ConfigurationStep.java index 26503862d31..ec97b330fec 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/ConfigurationStep.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/ConfigurationStep.java @@ -131,7 +131,7 @@ private List createConfigContainerWrappers() throws SchemaExce } List containerDefinitions = getSortedConfigContainerDefinitions(configuration); - for (PrismContainerDefinition containerDef : containerDefinitions) { + for (PrismContainerDefinition containerDef : containerDefinitions) { ItemPath containerPath = new ItemPath(ResourceType.F_CONNECTOR_CONFIGURATION, containerDef.getName()); PrismContainer container = configuration.findContainer(containerDef.getName()); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageBulkAction.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageBulkAction.java index 8dc59bf018d..f40f867b33d 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageBulkAction.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageBulkAction.java @@ -110,13 +110,13 @@ private void startPerformed(AjaxRequestTarget target) { ScriptingExpressionType expression = null; try { - Object parsed = getPrismContext().parserFor(bulkActionDto.getScript()).xml().parseAnyValue(); + Object parsed = getPrismContext().parserFor(bulkActionDto.getScript()).xml().parseRealValue(); if (parsed == null) { result.recordFatalError("No bulk action object was provided."); } - if (parsed instanceof JAXBElement) { - parsed = ((JAXBElement) parsed).getValue(); - } +// if (parsed instanceof JAXBElement) { +// parsed = ((JAXBElement) parsed).getValue(); +// } if (parsed instanceof ScriptingExpressionType) { expression = (ScriptingExpressionType) parsed; } else { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageEvaluateMapping.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageEvaluateMapping.java index dbfb9aff93d..17204df97dd 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageEvaluateMapping.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageEvaluateMapping.java @@ -183,13 +183,13 @@ private void executeMappingPerformed(AjaxRequestTarget target) { try { MappingEvaluationRequestType request; if (StringUtils.isNotBlank(dto.getRequest())) { - request = getPrismContext().parserFor(dto.getRequest()).xml().parseAtomicValue(MappingEvaluationRequestType.COMPLEX_TYPE); + request = getPrismContext().parserFor(dto.getRequest()).xml().parseRealValue(MappingEvaluationRequestType.class); } else { request = new MappingEvaluationRequestType(); } if (StringUtils.isNotBlank(dto.getMapping())) { - request.setMapping((MappingType) getPrismContext().parserFor(dto.getMapping()).xml().parseAtomicValue(MappingType.COMPLEX_TYPE)); + request.setMapping(getPrismContext().parserFor(dto.getMapping()).xml().parseRealValue(MappingType.class)); } MappingEvaluationResponseType response = getModelDiagnosticService().evaluateMapping(request, task, result); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageRepositoryQuery.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageRepositoryQuery.java index 1b2d119ea6b..037a7f620eb 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageRepositoryQuery.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageRepositoryQuery.java @@ -507,7 +507,7 @@ private void updateRequestWithMidpointQuery(RepositoryQueryDiagRequest request, if (clazz == null) { throw new SchemaException("Couldn't find compile-time class for object type of " + objectType); } - QueryType queryType = prismContext.parserFor(queryText).xml().parseAtomicValue(QueryType.COMPLEX_TYPE); + QueryType queryType = prismContext.parserFor(queryText).xml().parseRealValue(QueryType.class); request.setType(clazz); ObjectQuery objectQuery = QueryJaxbConvertor.createObjectQuery(clazz, queryType, prismContext); ObjectQuery queryWithExprEvaluated = ExpressionUtil.evaluateQueryExpressions(objectQuery, new ExpressionVariables(), diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/RunReportPopupPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/RunReportPopupPanel.java index 9754794291c..0fff79bc9d8 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/RunReportPopupPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/RunReportPopupPanel.java @@ -522,19 +522,14 @@ private void runConfirmPerformed(AjaxRequestTarget target, IModel mod } } */ - if (XmlTypeConverter.canConvert(paramClass)) { - typeName = XsdTypeMapper.toXsdType(paramClass); - } else { - - if (AuditEventType.class.isAssignableFrom(paramClass)) { - paramClass = AuditEventTypeType.class; - realValue = AuditEventType.fromAuditEventType((AuditEventType) realValue); - } else if (AuditEventStage.class.isAssignableFrom(paramClass)) { - paramClass = AuditEventStageType.class; - realValue = AuditEventStage.fromAuditEventStage((AuditEventStage) realValue); - } - typeName = getPrismContext().getBeanConverter().determineTypeForClass(paramClass); + if (AuditEventType.class.isAssignableFrom(paramClass)) { + paramClass = AuditEventTypeType.class; + realValue = AuditEventType.fromAuditEventType((AuditEventType) realValue); + } else if (AuditEventStage.class.isAssignableFrom(paramClass)) { + paramClass = AuditEventStageType.class; + realValue = AuditEventStage.fromAuditEventStage((AuditEventStage) realValue); } + typeName = getPrismContext().getSchemaRegistry().determineTypeForClass(paramClass); PrismPropertyDefinitionImpl def = new PrismPropertyDefinitionImpl<>(new QName(ReportConstants.NS_EXTENSION, paramDto.getName()), typeName, getPrismContext()); def.setDynamic(true); def.setRuntimeSchema(true); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/util/ExpressionUtil.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/util/ExpressionUtil.java index eaeaed5f253..b6ce5b8b6c0 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/util/ExpressionUtil.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/util/ExpressionUtil.java @@ -23,7 +23,6 @@ import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.xml.ns._public.common.common_3.ExpressionType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.MappingType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; import com.evolveum.prism.xml.ns._public.types_3.RawType; import org.apache.commons.lang.StringUtils; @@ -246,7 +245,7 @@ public static void parseExpressionEvaluators(String xml, ExpressionType expressi if (xml != null && StringUtils.isNotBlank(xml)) { xml = WebXmlUtil.wrapInElement("expression", xml); LOGGER.info("Expression to serialize: {}", xml); - JAXBElement newElement = context.parserFor(xml).xml().parseAnyValueAsJAXBElement(); + JAXBElement newElement = context.parserFor(xml).xml().parseRealValueToJaxbElement(); expressionObject.getExpressionEvaluator().addAll(((ExpressionType) (newElement.getValue())).getExpressionEvaluator()); } } diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/StaticExpressionUtil.java b/infra/common/src/main/java/com/evolveum/midpoint/common/StaticExpressionUtil.java index 28501c09c88..b3fdcfa2e22 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/StaticExpressionUtil.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/StaticExpressionUtil.java @@ -28,7 +28,7 @@ import com.evolveum.midpoint.prism.PrismProperty; import com.evolveum.midpoint.prism.PrismPropertyDefinition; import com.evolveum.midpoint.prism.PrismValue; -import com.evolveum.midpoint.prism.marshaller.XNodeProcessor; +import com.evolveum.midpoint.prism.xnode.RootXNode; import com.evolveum.midpoint.prism.xnode.XNode; import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.util.JAXBUtil; @@ -95,8 +95,7 @@ public static Item pars String contextDescription, PrismContext prismContext) throws SchemaException { Item output = null; - XNodeProcessor xnodeProcessor = prismContext.getXnodeProcessor(); - + for (Object valueElement: valueElements) { if (!(valueElement instanceof JAXBElement)) { throw new SchemaException("Literal expression cannot handle element "+valueElement+" "+valueElement.getClass().getName()+" in " @@ -131,11 +130,10 @@ public static List> elements = new ArrayList<>(item.size()); for (PrismValue value : item.getValues()) { - XNode xnode = xnodeProcessor.serializeItemValue(value); - RawType rawType = new RawType(xnode, item.getPrismContext()); + RootXNode xnode = item.getPrismContext().xnodeSerializer().serialize(value); + RawType rawType = new RawType(xnode.getSubnode(), item.getPrismContext()); JAXBElement jaxbElement = new JAXBElement<>(SchemaConstants.C_VALUE, RawType.class, rawType); elements.add(jaxbElement); } diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/CompositeRefinedObjectClassDefinition.java b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/CompositeRefinedObjectClassDefinition.java index 8d56b37ec91..0c11f89f88c 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/CompositeRefinedObjectClassDefinition.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/CompositeRefinedObjectClassDefinition.java @@ -284,7 +284,7 @@ public boolean isObjectCountingEnabled() { } @Override - public T findItemDefinition(QName name, Class clazz, boolean caseInsensitive) { + public T findItemDefinition(@NotNull QName name, @NotNull Class clazz, boolean caseInsensitive) { T itemDef = structuralObjectClassDefinition.findItemDefinition(name, clazz, caseInsensitive); if (itemDef == null) { for(RefinedObjectClassDefinition auxiliaryObjectClassDefinition: auxiliaryObjectClassDefinitions) { @@ -296,8 +296,13 @@ public T findItemDefinition(QName name, Class claz } return itemDef; } - - + + @Override + public ID findNamedItemDefinition(@NotNull QName firstName, @NotNull ItemPath rest, + @NotNull Class clazz) { + throw new UnsupportedOperationException(); // implement if needed + } + @Override public Collection> getAttributeDefinitions() { if (auxiliaryObjectClassDefinitions.isEmpty()) { diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedObjectClassDefinitionImpl.java b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedObjectClassDefinitionImpl.java index 00b149a8403..fb5318ae2b8 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedObjectClassDefinitionImpl.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedObjectClassDefinitionImpl.java @@ -129,8 +129,9 @@ public String getNativeObjectClass() { } @Override - public ID findItemDefinition(@NotNull QName name) { - return refinedObjectClassDefinition.findItemDefinition(name); + public ID findNamedItemDefinition(@NotNull QName firstName, @NotNull ItemPath rest, + @NotNull Class clazz) { + return refinedObjectClassDefinition.findNamedItemDefinition(firstName, rest, clazz); } @Override @@ -174,12 +175,6 @@ public LayerRefinedObjectClassDefinition forLayer(LayerType layerType) { return refinedObjectClassDefinition.forLayer(layerType); } - @Override - public PrismContainerDefinition findContainerDefinition( - @NotNull QName name) { - return refinedObjectClassDefinition.findContainerDefinition(name); - } - @Override public LayerRefinedAttributeDefinition getDisplayNameAttribute() { return substituteLayerRefinedAttributeDefinition(refinedObjectClassDefinition.getDisplayNameAttribute()); @@ -205,12 +200,6 @@ public Collection> getAllIdentifier return substituteLayerRefinedAttributeDefinitionCollection(refinedObjectClassDefinition.getAllIdentifiers()); } - @Override - public D findItemDefinition(QName name, Class clazz) { - D findItemDefinition = refinedObjectClassDefinition.findItemDefinition(name, clazz); - return (D) LayerRefinedAttributeDefinitionImpl.wrap((RefinedAttributeDefinition) findItemDefinition, layer); - } - @Override public Collection> getSecondaryIdentifiers() { return LayerRefinedAttributeDefinitionImpl.wrapCollection(refinedObjectClassDefinition.getSecondaryIdentifiers(), layer); @@ -247,7 +236,7 @@ public ResourceAttributeContainer instantiate(QName name) { } @Override - public PrismPropertyDefinition findPropertyDefinition(QName name) { + public PrismPropertyDefinition findPropertyDefinition(@NotNull QName name) { LayerRefinedAttributeDefinition def = findAttributeDefinition(name); if (def != null) { return def; @@ -448,21 +437,11 @@ public ResourceAttributeContainerDefinition toResourceAttributeContainerDefiniti return resourceAttributeContainerDefinition; } - @Override - public ID findItemDefinition(@NotNull ItemPath path) { - return refinedObjectClassDefinition.findItemDefinition(path); - } - @Override public Collection getNamesOfAssociations() { return refinedObjectClassDefinition.getNamesOfAssociations(); } - @Override - public PrismPropertyDefinition findPropertyDefinition(@NotNull ItemPath path) { - return refinedObjectClassDefinition.findPropertyDefinition(path); - } - @Override public ResourceAttributeContainerDefinition toResourceAttributeContainerDefinition(QName elementName) { ResourceAttributeContainerDefinition resourceAttributeContainerDefinition = refinedObjectClassDefinition.toResourceAttributeContainerDefinition(elementName); @@ -539,7 +518,8 @@ public RefinedAssociationDefinition findAssociation(QName name) { @Override public ID findItemDefinition(@NotNull QName name, @NotNull Class clazz, boolean caseInsensitive) { - return refinedObjectClassDefinition.findItemDefinition(name, clazz, caseInsensitive); + ID def = refinedObjectClassDefinition.findItemDefinition(name, clazz, caseInsensitive); + return (ID) LayerRefinedAttributeDefinitionImpl.wrap((RefinedAttributeDefinition) def, layer); } @Override @@ -652,12 +632,6 @@ public ObjectQuery createShadowSearchQuery(String resourceOid) throws SchemaExce return refinedObjectClassDefinition.createShadowSearchQuery(resourceOid); } - @Override - public PrismContainerDefinition findContainerDefinition( - @NotNull ItemPath path) { - return refinedObjectClassDefinition.findContainerDefinition(path); - } - @Override public void revive(PrismContext prismContext) { refinedObjectClassDefinition.revive(prismContext); diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedResourceSchema.java b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedResourceSchema.java index 1f415015266..dd113518ab5 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedResourceSchema.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedResourceSchema.java @@ -16,6 +16,7 @@ package com.evolveum.midpoint.common.refinery; +import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.PrismObjectDefinition; import com.evolveum.midpoint.prism.schema.PrismSchema; @@ -26,6 +27,7 @@ import com.evolveum.midpoint.util.DebugDumpable; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.xml.ns._public.common.common_3.LayerType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowKindType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; @@ -88,4 +90,13 @@ default PrismObjectDefinition getObjectDefinition(ShadowKindType kin ObjectClassComplexTypeDefinition findObjectClassDefinition(QName objectClassQName); LayerRefinedResourceSchema forLayer(LayerType layer); + + static RefinedResourceSchema getRefinedSchema(PrismObject resource) throws SchemaException { + return RefinedResourceSchemaImpl.getRefinedSchema(resource); + } + + static ResourceSchema getResourceSchema(PrismObject resource, PrismContext prismContext) + throws SchemaException { + return RefinedResourceSchemaImpl.getRefinedSchema(resource, prismContext); + } } diff --git a/infra/prism-maven-plugin/pom.xml b/infra/prism-maven-plugin/pom.xml index ca4d9530ac8..fcd0eb5b18a 100644 --- a/infra/prism-maven-plugin/pom.xml +++ b/infra/prism-maven-plugin/pom.xml @@ -68,6 +68,10 @@ org.apache.velocity velocity + + org.jetbrains + annotations-java5 + diff --git a/infra/prism-maven-plugin/src/main/java/com/evolveum/midpoint/prism/maven/SchemaDocMojo.java b/infra/prism-maven-plugin/src/main/java/com/evolveum/midpoint/prism/maven/SchemaDocMojo.java index bd306bbfc81..a45ad079fca 100644 --- a/infra/prism-maven-plugin/src/main/java/com/evolveum/midpoint/prism/maven/SchemaDocMojo.java +++ b/infra/prism-maven-plugin/src/main/java/com/evolveum/midpoint/prism/maven/SchemaDocMojo.java @@ -23,6 +23,7 @@ import com.evolveum.midpoint.prism.schema.PrismSchema; import com.evolveum.midpoint.prism.schema.SchemaDefinitionFactory; import com.evolveum.midpoint.prism.schema.SchemaRegistry; +import com.evolveum.midpoint.prism.schema.SchemaRegistryImpl; import com.evolveum.midpoint.prism.xml.GlobalDynamicNamespacePrefixMapper; import com.evolveum.midpoint.util.MiscUtil; import com.evolveum.midpoint.util.exception.SchemaException; @@ -36,6 +37,7 @@ import org.apache.velocity.app.VelocityEngine; import org.codehaus.plexus.archiver.ArchiverException; import org.codehaus.plexus.archiver.zip.ZipArchiver; +import org.jetbrains.annotations.NotNull; import org.xml.sax.SAXException; import java.io.*; @@ -242,7 +244,7 @@ private File initializeOutDir() throws MojoFailureException { private PrismContext createInitializedPrismContext() throws MojoFailureException { try { - SchemaRegistry schemaRegistry = createSchemaRegistry(); + SchemaRegistryImpl schemaRegistry = createSchemaRegistry(); for (File schemaFile: schemaFiles) { getLog().info("SchemaDoc: registering schema file: "+schemaFile); @@ -292,8 +294,9 @@ private void handleFailure(Exception e) throws MojoFailureException { throw new MojoFailureException(e.getMessage()); } - private SchemaRegistry createSchemaRegistry() throws SchemaException { - SchemaRegistry schemaRegistry = new SchemaRegistry(); + @NotNull + private SchemaRegistryImpl createSchemaRegistry() throws SchemaException { + SchemaRegistryImpl schemaRegistry = new SchemaRegistryImpl(); schemaRegistry.setNamespacePrefixMapper(new GlobalDynamicNamespacePrefixMapper()); return schemaRegistry; } diff --git a/infra/prism/pom.xml b/infra/prism/pom.xml index 5a234425281..8b8a3d57eb9 100644 --- a/infra/prism/pom.xml +++ b/infra/prism/pom.xml @@ -60,6 +60,11 @@ org.apache.commons commons-lang3 + + org.apache.commons + commons-collections4 + 4.1 + org.apache.santuario xmlsec diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/ComplexTypeDefinition.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/ComplexTypeDefinition.java index 217413ae347..31055ab2f76 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/ComplexTypeDefinition.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/ComplexTypeDefinition.java @@ -52,6 +52,9 @@ public interface ComplexTypeDefinition extends Definition, LocalDefinitionStore */ boolean isObjectMarker(); + /** + * True if the complex type definition contains xsd:any (directly or indirectly). + */ boolean isXsdAnyMarker(); /** diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/Definition.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/Definition.java index 34ec905d986..9c0ee449925 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/Definition.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/Definition.java @@ -106,7 +106,8 @@ public interface Definition extends Serializable, DebugDumpable, Revivable { * This in fact means that we need to use getAny in a JAXB types. It does not influence the * processing of DOM that much, as that does not really depend on compile-time/run-time distinction. * - * TODO clarify (container vs properties) + * For containers, this flag is true if there's no complex type definition or if the definition is + * of type "xsd:any". */ boolean isRuntimeSchema(); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/Item.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/Item.java index 482a1127a21..23fe1126db1 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/Item.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/Item.java @@ -24,6 +24,7 @@ import com.evolveum.midpoint.util.PrettyPrinter; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.util.exception.SystemException; +import org.jetbrains.annotations.NotNull; import javax.xml.namespace.QName; @@ -51,7 +52,7 @@ public abstract class Item imple protected QName elementName; protected PrismValue parent; protected D definition; - private List values = new ArrayList(); + @NotNull private final List values = new ArrayList<>(); private transient Map userData = new HashMap<>();; protected boolean immutable; @@ -231,6 +232,7 @@ public void setUserData(String key, Object value) { getUserData().put(key, value); } + @NotNull public List getValues() { return values; } @@ -758,7 +760,7 @@ public boolean hasRaw() { } public boolean isEmpty() { - return (getValues() == null || getValues().isEmpty()); + return getValues().isEmpty(); } @Override diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/ItemDefinitionImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/ItemDefinitionImpl.java index 7c7f5de4afe..b278c21a347 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/ItemDefinitionImpl.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/ItemDefinitionImpl.java @@ -25,6 +25,7 @@ import com.evolveum.midpoint.prism.delta.ItemDelta; import com.evolveum.midpoint.prism.path.ItemPath; +import com.evolveum.midpoint.prism.schema.SchemaRegistry; import com.evolveum.midpoint.util.PrettyPrinter; import com.evolveum.midpoint.util.QNameUtil; import com.evolveum.midpoint.util.exception.SchemaException; @@ -475,5 +476,5 @@ protected void extendToString(StringBuilder sb) { sb.append(",oper"); } } - + } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/LocalDefinitionStore.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/LocalDefinitionStore.java index df938ba16f8..43688fb9b51 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/LocalDefinitionStore.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/LocalDefinitionStore.java @@ -23,29 +23,46 @@ import javax.xml.namespace.QName; /** + * Used to retrieve definition from 'local definition store' - i.e. store that contains definition(s) related to one parent item. + * Such stores are prism containers and complex types. + * + * Before midPoint 3.5, some of these methods tried to resolve definitions globally (if the store could contain 'any' definitions). + * However, starting from 3.5, this is a responsibility of a client. It can call methods in SchemaRegistry to help with that. + * + * Note: Although these methods can return null, they are not marked as @Nullable. It is because we want avoid false warnings + * about possible NPEs when used e.g. to find definitions that certainly exist (like c:user etc). + * * @author mederly */ public interface LocalDefinitionStore { // (1) single-name resolution - // (1a) derived + // (1a) core + ID findItemDefinition(@NotNull QName name, @NotNull Class clazz, boolean caseInsensitive); + + // (1b) derived + @SuppressWarnings("unchecked") default ID findItemDefinition(@NotNull QName name) { return (ID) findItemDefinition(name, ItemDefinition.class); } + @SuppressWarnings("unchecked") default PrismPropertyDefinition findPropertyDefinition(@NotNull QName name) { return findItemDefinition(name, PrismPropertyDefinition.class); } + @SuppressWarnings("unchecked") default PrismReferenceDefinition findReferenceDefinition(@NotNull QName name) { return findItemDefinition(name, PrismReferenceDefinition.class); } + @SuppressWarnings("unchecked") default PrismContainerDefinition findContainerDefinition(@NotNull QName name) { return findItemDefinition(name, PrismContainerDefinition.class); } + @SuppressWarnings("unchecked") default PrismContainerDefinition findContainerDefinition(@NotNull String name) { return findItemDefinition(new QName(name), PrismContainerDefinition.class); } @@ -54,18 +71,21 @@ default ID findItemDefinition(@NotNull QName name, @ return findItemDefinition(name, clazz, false); } - // (1b) core + // (2) path resolution + // (2a) core - @Nullable - ID findItemDefinition(@NotNull QName name, @NotNull Class clazz, boolean caseInsensitive); + ID findItemDefinition(@NotNull ItemPath path, @NotNull Class clazz); - // (2) path resolution - // (2a) derived + ID findNamedItemDefinition(@NotNull QName firstName, @NotNull ItemPath rest, @NotNull Class clazz); + // (2b) derived + + @SuppressWarnings("unchecked") default ID findItemDefinition(@NotNull ItemPath path) { return (ID) findItemDefinition(path, ItemDefinition.class); } + @SuppressWarnings("unchecked") default PrismPropertyDefinition findPropertyDefinition(@NotNull ItemPath path) { return findItemDefinition(path, PrismPropertyDefinition.class); } @@ -74,14 +94,10 @@ default PrismReferenceDefinition findReferenceDefinition(@NotNull ItemPath path) return findItemDefinition(path, PrismReferenceDefinition.class); } + @SuppressWarnings("unchecked") default PrismContainerDefinition findContainerDefinition(@NotNull ItemPath path) { return findItemDefinition(path, PrismContainerDefinition.class); } - // (2b) core - - ID findItemDefinition(@NotNull ItemPath path, @NotNull Class clazz); - - ID findNamedItemDefinition(@NotNull QName firstName, @NotNull ItemPath rest, @NotNull Class clazz); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/ParserXNodeSource.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/ParserXNodeSource.java new file mode 100644 index 00000000000..1d15c00fe19 --- /dev/null +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/ParserXNodeSource.java @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.prism; + +import com.evolveum.midpoint.prism.xnode.RootXNode; +import com.evolveum.midpoint.prism.xnode.XNode; +import org.jetbrains.annotations.NotNull; +import org.w3c.dom.Element; + +import java.io.IOException; +import java.io.InputStream; + +/** + * @author mederly + */ +public class ParserXNodeSource implements ParserSource { + + @NotNull private final RootXNode xnode; + + public ParserXNodeSource(@NotNull RootXNode xnode) { + this.xnode = xnode; + } + + @NotNull + public RootXNode getXNode() { + return xnode; + } + + @NotNull + @Override + public InputStream getInputStream() throws IOException { + throw new UnsupportedOperationException(); + } + + @Override + public boolean closeStreamAfterParsing() { + return true; + } + + @Override + public boolean throwsIOException() { + return false; + } +} diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/ParsingContext.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/ParsingContext.java index 536686a9359..eb3a9b580f0 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/ParsingContext.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/ParsingContext.java @@ -81,11 +81,15 @@ public void warn(Trace logger, String message) { } public void warnOrThrow(Trace logger, String message) throws SchemaException { + warnOrThrow(logger, message, null); + } + + public void warnOrThrow(Trace logger, String message, Throwable t) throws SchemaException { if (isCompat()) { - logger.warn("{}", message); + logger.warn("{}", message, t); warn(message); } else { - throw new SchemaException(message); + throw new SchemaException(message, t); } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainer.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainer.java index a2cd0c5b281..41fe3b94d8b 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainer.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainer.java @@ -105,11 +105,6 @@ public boolean canRepresent(Class compileTimeClass) { return (compileTimeClass.isAssignableFrom(getCompileTimeClass())); } - @Override - public List> getValues() { - return (List>) super.getValues(); - } - @Override public Collection getRealValues() { if (getValues() == null) { diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerDefinitionImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerDefinitionImpl.java index 7f7b63a0c5a..61c5b9e0379 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerDefinitionImpl.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerDefinitionImpl.java @@ -165,18 +165,11 @@ public void revive(PrismContext prismContext) { @Override public D findItemDefinition(@NotNull QName name, @NotNull Class clazz, boolean caseInsensitive) { - D itemDefinition; if (complexTypeDefinition != null) { - itemDefinition = complexTypeDefinition.findItemDefinition(name, clazz, caseInsensitive); + return complexTypeDefinition.findItemDefinition(name, clazz, caseInsensitive); } else { - // xsd:any and similar dynamic definitions - itemDefinition = null; + return null; // xsd:any and similar dynamic definitions } - - if (itemDefinition == null && isRuntimeSchema()) { - itemDefinition = findRuntimeItemDefinition(name, null, clazz); // TODO what about case insensitive? - } - return itemDefinition; } @Override @@ -189,32 +182,6 @@ public List getIgnoredNamespaces() { return complexTypeDefinition != null ? complexTypeDefinition.getIgnoredNamespaces() : null; } - private D findRuntimeItemDefinition(QName firstName, ItemPath rest, Class clazz) { - if (prismContext == null) { - return null; // should not occur - } - ItemDefinition definition = null; - if (StringUtils.isEmpty(firstName.getNamespaceURI()) && StringUtils.isNotEmpty(getDefaultNamespace())) { - definition = prismContext.getSchemaRegistry().findItemDefinitionByElementName( - new QName(getDefaultNamespace(), firstName.getLocalPart())); - } - if (definition == null) { - definition = prismContext.getSchemaRegistry().findItemDefinitionByElementName(firstName, getIgnoredNamespaces()); - } - if (definition == null) { - return null; - } - if (rest != null && !rest.isEmpty()) { - return (D) definition.findItemDefinition(rest, clazz); - } - // this is the last step of search - if (clazz.isAssignableFrom(definition.getClass())) { - return (D) definition; - } else { - return null; - } - } - public ID findItemDefinition(@NotNull ItemPath path, @NotNull Class clazz) { for (;;) { if (path.isEmpty()) { @@ -267,9 +234,9 @@ public ID findNamedItemDefinition(@NotNull QName fir } } - if (isRuntimeSchema()) { - return findRuntimeItemDefinition(firstName, rest, clazz); - } +// if (isRuntimeSchema()) { +// return findRuntimeItemDefinition(firstName, rest, clazz); +// } return null; } @@ -517,7 +484,7 @@ public PrismContainerDefinition createContainerDefinition(QName name, Complex @Override public PrismContainerValue createValue() { - return new PrismContainerValue(prismContext); + return new PrismContainerValue<>(prismContext); } @Override diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java index 0f9a23e92e6..6c9769af6dc 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java @@ -19,14 +19,12 @@ import com.evolveum.midpoint.prism.crypto.Protector; import com.evolveum.midpoint.prism.delta.ObjectDelta; import com.evolveum.midpoint.prism.marshaller.JaxbDomHack; -import com.evolveum.midpoint.prism.marshaller.PrismBeanConverter; -import com.evolveum.midpoint.prism.marshaller.XNodeProcessor; -import com.evolveum.midpoint.prism.lex.dom.DomLexicalProcessor; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.polystring.PolyStringNormalizer; import com.evolveum.midpoint.prism.schema.SchemaDefinitionFactory; import com.evolveum.midpoint.prism.schema.SchemaRegistry; import com.evolveum.midpoint.prism.util.PrismMonitor; +import com.evolveum.midpoint.prism.xnode.RootXNode; import com.evolveum.midpoint.prism.xnode.XNode; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.prism.xml.ns._public.types_3.RawType; @@ -51,30 +49,28 @@ public interface PrismContext { String LANG_JSON = "json"; String LANG_YAML = "yaml"; + /** + * Initializes the prism context, e.g. loads and parses all the schemas. + */ void initialize() throws SchemaException, SAXException, IOException; - XmlEntityResolver getEntityResolver(); - + /** + * Returns the schema registry. + */ + @NotNull SchemaRegistry getSchemaRegistry(); - XNodeProcessor getXnodeProcessor(); - - DomLexicalProcessor getParserDom(); - - PrismBeanConverter getBeanConverter(); - - JaxbDomHack getJaxbDomHack(); - - SchemaDefinitionFactory getDefinitionFactory(); - + /** + * Returns the default PolyString normalizer. + */ + @NotNull PolyStringNormalizer getDefaultPolyStringNormalizer(); + /** + * Returns the default protector. (TODO) + */ Protector getDefaultProtector(); - PrismMonitor getMonitor(); - - void setMonitor(PrismMonitor monitor); - //region Parsing /** * Creates a parser ready to process the given file. @@ -101,6 +97,14 @@ public interface PrismContext { @NotNull PrismParserNoIO parserFor(@NotNull String data); + /** + * Creates a parser ready to process data from the given XNode tree. + * @param xnode XNode tree with the data to be parsed. + * @return Parser that can be invoked to retrieve the (parsed) content. + */ + @NotNull + PrismParserNoIO parserFor(@NotNull RootXNode xnode); + /** * Creates a parser ready to process data from the given DOM element. * @param element Element with the data to be parsed. @@ -109,10 +113,10 @@ public interface PrismContext { @NotNull PrismParserNoIO parserFor(@NotNull Element element); - @Deprecated // user parserFor + parse instead + @Deprecated // user processorFor + parse instead PrismObject parseObject(File file) throws SchemaException, IOException; - @Deprecated // user parserFor + parse instead + @Deprecated // user processorFor + parse instead PrismObject parseObject(String dataString) throws SchemaException; //endregion @@ -181,7 +185,7 @@ void adopt(PrismContainerValue xnodeSerializer(); + PrismSerializer xnodeSerializer(); @Deprecated // use serializerFor + serialize instead String serializeObjectToString(PrismObject object, String language) throws SchemaException; @@ -194,14 +198,6 @@ void adopt(PrismContainerValue void adopt(PrismContainerValue O createObjectable(@NotNull Class clazz) throws SchemaException; + + /** + * TODO hide this from PrismContext interface? + */ + XmlEntityResolver getEntityResolver(); + + /** + * TODO eliminate this method + */ + @NotNull + @Deprecated + JaxbDomHack getJaxbDomHack(); + + PrismMonitor getMonitor(); + + void setMonitor(PrismMonitor monitor); + + } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContextImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContextImpl.java index 8d747ada397..ba1f9091900 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContextImpl.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContextImpl.java @@ -19,7 +19,6 @@ import com.evolveum.midpoint.prism.delta.ObjectDelta; import com.evolveum.midpoint.prism.marshaller.*; import com.evolveum.midpoint.prism.lex.LexicalProcessor; -import com.evolveum.midpoint.prism.lex.LexicalHelpers; import com.evolveum.midpoint.prism.lex.LexicalProcessorRegistry; import com.evolveum.midpoint.prism.lex.dom.DomLexicalProcessor; import com.evolveum.midpoint.prism.path.ItemPath; @@ -30,16 +29,13 @@ import com.evolveum.midpoint.prism.schema.SchemaRegistryImpl; import com.evolveum.midpoint.prism.util.PrismMonitor; import com.evolveum.midpoint.prism.xnode.RootXNode; -import com.evolveum.midpoint.prism.xnode.XNode; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.util.exception.SystemException; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; -import com.evolveum.prism.xml.ns._public.types_3.RawType; import org.jetbrains.annotations.NotNull; import org.springframework.beans.factory.annotation.Autowired; import org.w3c.dom.Element; -import org.xml.sax.EntityResolver; import org.xml.sax.SAXException; import javax.xml.namespace.QName; @@ -57,57 +53,46 @@ public class PrismContextImpl implements PrismContext { private static boolean allowSchemalessSerialization = true; - private SchemaRegistryImpl schemaRegistry; - private XNodeProcessor xnodeProcessor; - private PrismBeanConverter beanConverter; - private SchemaDefinitionFactory definitionFactory; - private PolyStringNormalizer defaultPolyStringNormalizer; - private LexicalProcessorRegistry lexicalProcessorRegistry; - private LexicalHelpers lexicalHelpers; + @NotNull private final SchemaRegistryImpl schemaRegistry; + @NotNull private final LexicalProcessorRegistry lexicalProcessorRegistry; + @NotNull private final PolyStringNormalizer defaultPolyStringNormalizer; // TODO make non-final when needed + @NotNull private final PrismUnmarshaller prismUnmarshaller; + @NotNull private final PrismMarshaller prismMarshaller; + @NotNull private final PrismBeanConverter beanConverter; private PrismMonitor monitor = null; - - @Autowired + + private SchemaDefinitionFactory definitionFactory; + + @Autowired // TODO is this really applied? private Protector defaultProtector; // We need to keep this because of deprecated methods and various hacks - private JaxbDomHack jaxbDomHack; + @NotNull private final JaxbDomHack jaxbDomHack; - //region Standard overhead - private PrismContextImpl() { - // empty - } - - public static PrismContextImpl create(SchemaRegistryImpl schemaRegistry) { - PrismContextImpl prismContext = new PrismContextImpl(); - prismContext.schemaRegistry = schemaRegistry; - schemaRegistry.setPrismContext(prismContext); - - prismContext.xnodeProcessor = new XNodeProcessor(prismContext); - PrismBeanInspector inspector = new PrismBeanInspector(prismContext); - prismContext.beanConverter = new PrismBeanConverter(prismContext, inspector); + //region Standard overhead + private PrismContextImpl(@NotNull SchemaRegistryImpl schemaRegistry) { + this.schemaRegistry = schemaRegistry; + schemaRegistry.setPrismContext(this); + this.lexicalProcessorRegistry = new LexicalProcessorRegistry(schemaRegistry); + this.prismUnmarshaller = new PrismUnmarshaller(this); + this.beanConverter = new PrismBeanConverter(this, new PrismBeanInspector(this)); + this.prismMarshaller = new PrismMarshaller(beanConverter); + this.jaxbDomHack = new JaxbDomHack(lexicalProcessorRegistry.domProcessor(), this); - prismContext.lexicalProcessorRegistry = new LexicalProcessorRegistry(schemaRegistry); - prismContext.jaxbDomHack = new JaxbDomHack((DomLexicalProcessor) prismContext.lexicalProcessorRegistry.parserFor(PrismContext.LANG_XML), prismContext); + defaultPolyStringNormalizer = new PrismDefaultPolyStringNormalizer(); + } - prismContext.lexicalHelpers = new LexicalHelpers(prismContext.lexicalProcessorRegistry, prismContext.xnodeProcessor, prismContext.beanConverter); - - return prismContext; + public static PrismContextImpl create(@NotNull SchemaRegistryImpl schemaRegistry) { + return new PrismContextImpl(schemaRegistry); } - public static PrismContextImpl createEmptyContext(SchemaRegistryImpl schemaRegistry){ - PrismContextImpl prismContext = new PrismContextImpl(); - prismContext.schemaRegistry = schemaRegistry; - schemaRegistry.setPrismContext(prismContext); - - return prismContext; + public static PrismContextImpl createEmptyContext(@NotNull SchemaRegistryImpl schemaRegistry) { + return new PrismContextImpl(schemaRegistry); } @Override public void initialize() throws SchemaException, SAXException, IOException { schemaRegistry.initialize(); - if (defaultPolyStringNormalizer == null) { - defaultPolyStringNormalizer = new PrismDefaultPolyStringNormalizer(); - } } public static boolean isAllowSchemalessSerialization() { @@ -123,39 +108,45 @@ public XmlEntityResolver getEntityResolver() { return schemaRegistry.getEntityResolver(); } + @NotNull @Override public SchemaRegistry getSchemaRegistry() { return schemaRegistry; } - public void setSchemaRegistry(SchemaRegistryImpl schemaRegistry) { - this.schemaRegistry = schemaRegistry; + /** + * WARNING! This is not really public method. It should NOT not used outside the prism implementation. + */ + public PrismUnmarshaller getPrismUnmarshaller() { + return prismUnmarshaller; } - @Override - public XNodeProcessor getXnodeProcessor() { - return xnodeProcessor; + @NotNull + public PrismMarshaller getPrismMarshaller() { + return prismMarshaller; } /** * WARNING! This is not really public method. It should NOT not used outside the prism implementation. */ - @Override public DomLexicalProcessor getParserDom() { - return (DomLexicalProcessor) lexicalHelpers.lexicalProcessorRegistry.parserFor(LANG_XML); + return lexicalProcessorRegistry.domProcessor(); } - @Override + /** + * WARNING! This is not really public method. It should NOT not used outside the prism implementation. + */ public PrismBeanConverter getBeanConverter() { return beanConverter; } + @NotNull @Override public JaxbDomHack getJaxbDomHack() { return jaxbDomHack; } - @Override + @NotNull public SchemaDefinitionFactory getDefinitionFactory() { if (definitionFactory == null) { definitionFactory = new SchemaDefinitionFactory(); @@ -167,17 +158,14 @@ public void setDefinitionFactory(SchemaDefinitionFactory definitionFactory) { this.definitionFactory = definitionFactory; } + @NotNull @Override public PolyStringNormalizer getDefaultPolyStringNormalizer() { return defaultPolyStringNormalizer; } - public void setDefaultPolyStringNormalizer(PolyStringNormalizer defaultPolyStringNormalizer) { - this.defaultPolyStringNormalizer = defaultPolyStringNormalizer; - } - private LexicalProcessor getParser(String language) { - return lexicalProcessorRegistry.parserFor(language); + return lexicalProcessorRegistry.processorFor(language); } private LexicalProcessor getParserNotNull(String language) { @@ -213,26 +201,32 @@ public void setMonitor(PrismMonitor monitor) { @NotNull @Override public PrismParser parserFor(@NotNull File file) { - return new PrismParserImplIO(new ParserFileSource(file), null, ParsingContext.createDefault(), lexicalHelpers); + return new PrismParserImplIO(new ParserFileSource(file), null, ParsingContext.createDefault(), this, null, null, null, null); } @NotNull @Override public PrismParser parserFor(@NotNull InputStream stream) { - return new PrismParserImplIO(new ParserInputStreamSource(stream), null, ParsingContext.createDefault(), lexicalHelpers); + return new PrismParserImplIO(new ParserInputStreamSource(stream), null, ParsingContext.createDefault(), this, null, null, null, null); } @NotNull @Override public PrismParserNoIO parserFor(@NotNull String data) { - return new PrismParserImplNoIO(new ParserStringSource(data), null, ParsingContext.createDefault(), lexicalHelpers); + return new PrismParserImplNoIO(new ParserStringSource(data), null, ParsingContext.createDefault(), this, null, null, null, null); + } + + @NotNull + @Override + public PrismParserNoIO parserFor(@NotNull RootXNode xnode) { + return new PrismParserImplNoIO(new ParserXNodeSource(xnode), null, ParsingContext.createDefault(), this, null, null, null, null); } @NotNull @Deprecated @Override public PrismParserNoIO parserFor(@NotNull Element data) { - return new PrismParserImplNoIO(new ParserElementSource(data), null, ParsingContext.createDefault(), lexicalHelpers); + return new PrismParserImplNoIO(new ParserElementSource(data), null, ParsingContext.createDefault(), this, null, null, null, null); } @Deprecated @@ -314,7 +308,7 @@ public String serializeObjectToString(PrismObject obje @NotNull @Override public PrismSerializer serializerFor(@NotNull String language) { - return new PrismSerializerImpl<>(new SerializerStringTarget(lexicalHelpers, language), null, null); + return new PrismSerializerImpl<>(new SerializerStringTarget(this, language), null, null, null); } @NotNull @@ -338,32 +332,22 @@ public PrismSerializer yamlSerializer() { @NotNull @Override public PrismSerializer domSerializer() { - return new PrismSerializerImpl<>(new SerializerDomTarget(lexicalHelpers), null, null); + return new PrismSerializerImpl<>(new SerializerDomTarget(this), null, null, null); } @NotNull @Override - public PrismSerializer xnodeSerializer() { - return new PrismSerializerImpl<>(new SerializerXNodeTarget(lexicalHelpers), null, null); + public PrismSerializer xnodeSerializer() { + return new PrismSerializerImpl<>(new SerializerXNodeTarget(this), null, null, null); } @Override public boolean canSerialize(Object value) { - return xnodeProcessor.canSerialize(value); + return prismMarshaller.canSerialize(value); } //endregion - /** - * A bit of hack: serializes any Item into a RawType. - * Currently used for serializing script output, until a better method is devised. - * @return - */ - @Override - public RawType toRawType(Item item) throws SchemaException { - RootXNode rootXNode = xnodeProcessor.serializeItemAsRoot(item); - return new RawType(rootXNode, this); - } @NotNull @Override @@ -380,4 +364,9 @@ public PrismObject createObject(@NotNull Class claz public T createObjectable(@NotNull Class clazz) throws SchemaException { return createObject(clazz).asObjectable(); } + + @NotNull + public LexicalProcessorRegistry getLexicalProcessorRegistry() { + return lexicalProcessorRegistry; + } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParser.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParser.java index 7f28d4356cd..68f837ae72d 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParser.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParser.java @@ -16,6 +16,7 @@ package com.evolveum.midpoint.prism; +import com.evolveum.midpoint.prism.xnode.RootXNode; import com.evolveum.midpoint.prism.xnode.XNode; import com.evolveum.midpoint.util.exception.SchemaException; import org.jetbrains.annotations.NotNull; @@ -30,12 +31,39 @@ import java.util.List; /** + * Parses a given input into prism or POJO objects. + * + * The interface is pretty straightforward; only two things are of interest: + * 1. how to determine the type of data to be retrieved, + * 2. how to determine the name of the item that is to be created (in case of prism items). + * + * For most cases, this data can be determined from the input. E.g. if we are parsing a prism object that is rooted at the + * "user" XML element, it is clear that the type is c:UserType and the name is c:user. In other cases, the algorithms + * are the following: + * + * Data type determination: We collect all the available data, i.e. + * - source data (xsi:type/@type), + * - itemDefinition, + * - itemName, + * - typeName, + * - typeClass + * and take the most specific of these. + * + * Data name determination: First name that is present takes precedence: + * 1. itemName + * 2. source data (if namespace is missing, it is filled from item definition) + * 3. name from itemDefinition + * 4. name from item definition derived from type name + * 5. name from item definition derived from type class + * * @author mederly */ public interface PrismParser { /** - * Sets the language of the parser. null means auto-detect. + * For string inputs: sets the data language that the parser will try to parse; null means auto-detect. + * For other kinds of input (DOM and XNode) the language is fixed to XML or none, respectively. + * * @param language The language * @return Updated parser. */ @@ -88,41 +116,103 @@ public interface PrismParser { PrismParser compat(); /** - * Parses the input as a prism object. - * @return The object. + * Tells parser which definition to use when parsing item (or an item value). Optional. + * @param itemDefinition The definition + * @return Updated parser. */ @NotNull - PrismObject parse() throws SchemaException, IOException; + PrismParser definition(ItemDefinition itemDefinition); /** - * Parses the input as a collection of prism objects. - * Currently supported only for XML. (For the time being, it is used only in tests.) - * @return A list of objects. + * Tells parser what name to use for parsed item. Optional. + * @param itemName Item name to use. + * @return Updated parser. */ @NotNull - List> parseObjects() throws SchemaException, IOException; + PrismParser name(QName itemName); /** - * Parses the input as a single value of a prism container. - * @param clazz Type of a container content. - * @return Single-valued container. + * Tells parser what data type to expect. Optional. + * @param typeName Data type to expect. + * @return Updated parser. */ @NotNull - PrismContainer parseContainer(@NotNull Class clazz) throws SchemaException, IOException; + PrismParser type(QName typeName); /** - * Parses the input as a single value of a prism container. - * @param definition Container definition. - * @return Single-valued container. + * Tells parser what data type to expect. Optional. + * @param typeClass Data type to expect. + * @return Updated parser. + */ + @NotNull + PrismParser type(Class typeClass); + + /** + * Parses the input as a prism object. + * @return The object. */ @NotNull - PrismContainer parseContainer(@NotNull PrismContainerDefinition definition) throws SchemaException, IOException; + PrismObject parse() throws SchemaException, IOException; + + /** + * Parses the input as a prism item. (Object, container, reference, value.) + * @return The item. + */ + Item parseItem() throws SchemaException, IOException; + + /** + * Parses the input as a prism value. (Container value, reference value, property value.) + * @return The item. + */ + IV parseItemValue() throws SchemaException, IOException; + + /** + * Parses a real value - either property or container value. + * @param clazz Expected class of the data (can be Object.class when unknown). + * @return Real value - POJO, Containerable or Objectable. + */ + T parseRealValue(Class clazz) throws IOException, SchemaException; /** - * Parses an atomic value - i.e. something that could present a property - * value, if such a property would exist. + * Parses a real value with an unknown class. + * @return Real value - POJO, Containerable or Objectable. */ - T parseAtomicValue(QName typeName) throws IOException, SchemaException; + T parseRealValue() throws IOException, SchemaException; + + /** + * Parses a real value and stores it into JAXBElement, using item name derived in the usual way. + */ + JAXBElement parseRealValueToJaxbElement() throws IOException, SchemaException; + + /** + * Parses the input into RootXNode. + * @return RootXNode corresponding to the input. + */ + RootXNode parseToXNode() throws IOException, SchemaException; + + // ============= other methods (convenience ones, deprecated ones etc) ============= + + /** + * Parses the input as a collection of prism objects. + * Currently supported only for XML. (For the time being, it is used only in tests.) + * @return A list of objects. + */ + @NotNull + List> parseObjects() throws SchemaException, IOException; + +// /** +// * Parses the input as a single value of a prism container. +// * @return Single-valued container. +// */ +// @NotNull +// PrismContainer parseContainer() throws SchemaException, IOException; + +// /** +// * Parses an atomic value - i.e. something that could present a property +// * value, if such a property would exist. +// */ +// T parseAtomicValue(QName typeName) throws IOException, SchemaException; + /** * Parses (almost) anything: either an item with a definition, or an atomic (i.e. property-like) value. @@ -131,23 +221,11 @@ public interface PrismParser { * CAUTION: EXPERIMENTAL - Avoid using this method if at all possible. * Its result is not well defined, namely, whether it returns Item or a value. * + * Used for scripting and wf-related data serialization. To be replaced. + * * @return either Item or an unmarshalled bean value - * @throws SchemaException */ + @Deprecated Object parseAnyData() throws IOException, SchemaException; - /** - * Emulates JAXB unmarshal method. - * - * TODO - * - * @return - * @throws SchemaException - */ - T parseAnyValue() throws IOException, SchemaException; - - // experimental! - JAXBElement parseAnyValueAsJAXBElement() throws IOException, SchemaException; - - XNode parseToXNode() throws IOException, SchemaException; } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserNoIO.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserNoIO.java index 5ab408afa71..c8fe23f9544 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserNoIO.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserNoIO.java @@ -16,14 +16,13 @@ package com.evolveum.midpoint.prism; -import com.evolveum.midpoint.prism.xnode.XNode; +import com.evolveum.midpoint.prism.xnode.RootXNode; import com.evolveum.midpoint.util.exception.SchemaException; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.xml.bind.JAXBElement; import javax.xml.namespace.QName; -import java.io.IOException; import java.util.List; /** @@ -50,19 +49,28 @@ public interface PrismParserNoIO extends PrismParser { PrismParserNoIO strict(); @NotNull PrismParserNoIO compat(); + @NotNull + PrismParserNoIO definition(ItemDefinition itemDefinition); + @NotNull + PrismParserNoIO name(QName itemName); + @NotNull + PrismParserNoIO type(QName typeName); + @NotNull + PrismParserNoIO type(Class typeClass); @NotNull PrismObject parse() throws SchemaException; + Item parseItem() throws SchemaException; + IV parseItemValue() throws SchemaException; + T parseRealValue(Class clazz) throws SchemaException; + T parseRealValue() throws SchemaException; + JAXBElement parseRealValueToJaxbElement() throws SchemaException; + RootXNode parseToXNode() throws SchemaException; + + // auxiliary and deprecated methods @NotNull List> parseObjects() throws SchemaException; - @NotNull - PrismContainer parseContainer(@NotNull Class clazz) throws SchemaException; - @NotNull - PrismContainer parseContainer(@NotNull PrismContainerDefinition definition) throws SchemaException; - T parseAtomicValue(QName typeName) throws SchemaException; - Object parseAnyData() throws SchemaException; - T parseAnyValue() throws SchemaException; - JAXBElement parseAnyValueAsJAXBElement() throws SchemaException; - XNode parseToXNode() throws SchemaException; + @Deprecated + Object parseAnyData() throws SchemaException; } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismProperty.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismProperty.java index 119eddaba58..5eaef27ebba 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismProperty.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismProperty.java @@ -19,13 +19,19 @@ import com.evolveum.midpoint.prism.delta.ItemDelta; import com.evolveum.midpoint.prism.delta.PropertyDelta; import com.evolveum.midpoint.prism.path.ItemPath; +import com.evolveum.midpoint.prism.xnode.ListXNode; import com.evolveum.midpoint.prism.xnode.PrimitiveXNode; +import com.evolveum.midpoint.prism.xnode.RootXNode; +import com.evolveum.midpoint.prism.xnode.XNode; import com.evolveum.midpoint.util.DebugDumpable; import com.evolveum.midpoint.util.DebugUtil; import com.evolveum.midpoint.util.MiscUtil; import com.evolveum.midpoint.util.PrettyPrinter; +import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; +import org.apache.commons.lang.Validate; +import org.jetbrains.annotations.NotNull; import javax.xml.namespace.QName; @@ -98,17 +104,6 @@ public void setDefinition(PrismPropertyDefinition definition) { this.definition = definition; } - /** - * Returns property values. - *

- * The values are returned as set. The order of values is not significant. - * - * @return property values - */ - public List> getValues() { - return (List>) super.getValues(); - } - public PrismPropertyValue getValue() { if (!isSingleValue()) { throw new IllegalStateException("Attempt to get single value from property " + getElementName() @@ -621,4 +616,17 @@ protected String getDebugDumpClassName() { return "PP"; } + public static PrismProperty createRaw(@NotNull XNode node, @NotNull QName itemName, @NotNull PrismContext prismContext) + throws SchemaException { + Validate.isTrue(!(node instanceof RootXNode)); + PrismProperty property = new PrismProperty<>(itemName, prismContext); + if (node instanceof ListXNode) { + for (XNode subnode : (ListXNode) node) { + property.add(PrismPropertyValue.createRaw(subnode)); + } + } else { + property.add(PrismPropertyValue.createRaw(node)); + } + return property; + } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyValue.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyValue.java index 5b1b76b91c9..4049cf60acd 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyValue.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyValue.java @@ -17,8 +17,8 @@ package com.evolveum.midpoint.prism; +import com.evolveum.midpoint.prism.marshaller.PrismBeanConverter; import com.evolveum.midpoint.prism.match.MatchingRule; -import com.evolveum.midpoint.prism.marshaller.XNodeProcessor; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.prism.polystring.PolyStringNormalizer; @@ -27,6 +27,7 @@ import com.evolveum.midpoint.prism.util.CloneUtil; import com.evolveum.midpoint.prism.util.PrismUtil; import com.evolveum.midpoint.prism.xnode.PrimitiveXNode; +import com.evolveum.midpoint.prism.xnode.RootXNode; import com.evolveum.midpoint.prism.xnode.XNode; import com.evolveum.midpoint.util.DOMUtil; import com.evolveum.midpoint.util.DebugDumpable; @@ -117,7 +118,7 @@ public T getValue() { if (rawElement instanceof Element) { // Do the most stupid thing possible. Assume string value. And there will be no definition. value = (T) ((Element)rawElement).getTextContent(); - } else if (rawElement instanceof PrimitiveXNode){ + } else if (rawElement instanceof PrimitiveXNode) { try { QName type = rawElement.getTypeQName() != null ? rawElement.getTypeQName() : DOMUtil.XSD_STRING; value = (T) ((PrimitiveXNode) rawElement).getParsedValueWithoutRecording(type); @@ -183,8 +184,11 @@ public void revive(PrismContext prismContext) throws SchemaException { if (value != null) { if (value instanceof Revivable) { ((Revivable)value).revive(prismContext); - } else if (prismContext.getBeanConverter().canProcess(value.getClass())) { - prismContext.getBeanConverter().revive(value, prismContext); + } else { + PrismBeanConverter beanConverter = ((PrismContextImpl) prismContext).getBeanConverter(); + if (beanConverter.canProcess(value.getClass())) { + beanConverter.revive(value, prismContext); + } } } } @@ -373,8 +377,8 @@ private PrismPropertyValue parseRawElementToNewValue(PrismPropertyValue or private T parseRawElementToNewRealValue(PrismPropertyValue prismPropertyValue, PrismPropertyDefinition definition) throws SchemaException { PrismContext prismContext = definition.getPrismContext(); - XNodeProcessor xnodeProcessor = prismContext.getXnodeProcessor(); - T value = xnodeProcessor.parsePrismPropertyRealValue(prismPropertyValue.rawElement, definition, ParsingContext.createDefault()); + //noinspection UnnecessaryLocalVariable + T value = prismContext.parserFor(prismPropertyValue.rawElement.toRootXNode()).definition(definition).parseRealValue(); return value; } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismReference.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismReference.java index 1ba348ac0f0..cecf365e347 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismReference.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismReference.java @@ -59,18 +59,6 @@ public PrismReferenceDefinition getDefinition() { return (PrismReferenceDefinition) super.getDefinition(); } - /** - * Returns reference values. - *

- * The values are returned as set. The order of values is not significant. - * - * @return property values - */ - @Override - public List getValues() { - return (List) super.getValues(); - } - public PrismReferenceValue getValue() { // We are not sure about multiplicity if there is no definition or the definition is dynamic if (getDefinition() != null && !getDefinition().isDynamic()) { diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismReferenceDefinitionImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismReferenceDefinitionImpl.java index a030a4fbcfd..08771e799a1 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismReferenceDefinitionImpl.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismReferenceDefinitionImpl.java @@ -169,5 +169,4 @@ protected void extendToString(StringBuilder sb) { sb.append(",composite"); } } - } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismSerializer.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismSerializer.java index 7113a14ba72..a10c40e861c 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismSerializer.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismSerializer.java @@ -42,6 +42,15 @@ public interface PrismSerializer { @NotNull PrismSerializer root(QName elementName); + /** + * Sets the item definition to be used during serialization. + * (Not much used.) + * @param itemDefinition + * @return + */ + @NotNull + PrismSerializer definition(ItemDefinition itemDefinition); + /** * Sets the context for the serialization operation, containing e.g. serialization options. * @@ -61,20 +70,20 @@ public interface PrismSerializer { PrismSerializer options(@Nullable SerializationOptions options); /** - * Serializes given PrismObject. + * Serializes given prism item. * - * @param object PrismObject to be serialized. - * @return String representation of the object. + * @param item Item to be serialized. + * @return String/RootXNode representation of the item. */ @NotNull - T serialize(@NotNull PrismObject object) throws SchemaException; + T serialize(@NotNull Item item) throws SchemaException; /** * Serializes given prism value (property, reference, or container). * Name of the root element is derived in the following way: * 1. if explicit name is set ( * @param value Value to be serialized. - * @return String representation of the value. + * @return String/RootXNode representation of the value. */ @NotNull T serialize(@NotNull PrismValue value) throws SchemaException; @@ -83,13 +92,13 @@ public interface PrismSerializer { * Serializes given prism value (property, reference, or container). * @param value Value to be serialized. * @param rootName Name of the root element. (Overrides other means of deriving the name.) - * @return String representation of the value. + * @return String/RootXNode representation of the value. */ @NotNull T serialize(@NotNull PrismValue value, @NotNull QName rootName) throws SchemaException; - @Deprecated - T serialize(RootXNode xnode) throws SchemaException; + @NotNull + T serialize(@NotNull RootXNode xnode) throws SchemaException; /** * Serializes an atomic value - i.e. something that fits into a prism property (if such a property would exist). diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismSerializerImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismSerializerImpl.java deleted file mode 100644 index 59f5cd70892..00000000000 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismSerializerImpl.java +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Copyright (c) 2010-2016 Evolveum - * - * 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 com.evolveum.midpoint.prism; - -import com.evolveum.midpoint.prism.xnode.RootXNode; -import com.evolveum.midpoint.util.exception.SchemaException; -import org.jetbrains.annotations.NotNull; - -import javax.xml.bind.JAXBElement; -import javax.xml.namespace.QName; - -/** - * @author mederly - */ -public class PrismSerializerImpl implements PrismSerializer { - - @NotNull private final SerializerTarget target; - private final QName elementName; - private final SerializationContext context; - - public PrismSerializerImpl(@NotNull SerializerTarget target, QName elementName, SerializationContext context) { - this.target = target; - this.elementName = elementName; - this.context = context; - } - - @NotNull - @Override - public PrismSerializerImpl context(SerializationContext context) { - return new PrismSerializerImpl<>(this.target, elementName, context); - } - - @NotNull - @Override - public PrismSerializerImpl root(QName elementName) { - return new PrismSerializerImpl<>(this.target, elementName, this.context); - } - - @NotNull - @Override - public PrismSerializerImpl options(SerializationOptions options) { - SerializationContext context; - if (this.context != null) { - context = this.context.clone(); - context.setOptions(options); - } else { - context = new SerializationContext(options); - } - return new PrismSerializerImpl<>(this.target, this.elementName, context); - } - - @NotNull - @Override - public T serialize(@NotNull PrismObject object) throws SchemaException { - RootXNode xroot = target.lexicalHelpers.xnodeProcessor.serializeObject(object, false, context); // TODO serialize composite objects? - if (elementName != null) { - xroot.setRootElementName(elementName); // TODO what about the type? - } - return target.serialize(xroot, context); - } - - @NotNull - @Override - public T serialize(@NotNull PrismValue value) throws SchemaException { - return serialize(value, elementName); - } - - @NotNull - @Override - public T serialize(@NotNull PrismValue value, @NotNull QName rootElementName) throws SchemaException { - RootXNode xroot = target.lexicalHelpers.xnodeProcessor.serializeItemValueAsRoot(value, rootElementName); // TODO context - return target.serialize(xroot, context); - } - - @Override - public T serialize(RootXNode xnode) throws SchemaException { - return target.serialize(xnode, context); - } - - @Override - public T serializeAtomicValue(Object value) throws SchemaException { - return serializeAtomicValue(value, elementName); - } - - @Override - public T serializeAtomicValue(Object value, QName rootElementName) throws SchemaException { - RootXNode xnode = target.lexicalHelpers.xnodeProcessor.serializeAtomicValue(value, rootElementName, context); - return target.serialize(xnode, context); - } - - @Override - public T serializeAtomicValue(JAXBElement value) throws SchemaException { - RootXNode xnode = target.lexicalHelpers.xnodeProcessor.serializeAtomicValue(value); // TODO context - return target.serialize(xnode, context); - } - - @Override - public T serializeAnyData(Object value) throws SchemaException { - return serializeAnyData(value, elementName); - } - - @Override - public T serializeAnyData(Object value, QName rootName) throws SchemaException { - RootXNode xnode = target.lexicalHelpers.xnodeProcessor.serializeAnyData(value, rootName, context); - return target.serialize(xnode, context); - } - - -} diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializationContext.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializationContext.java index b0ce3141cd7..35d254a1b35 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializationContext.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializationContext.java @@ -42,12 +42,16 @@ public static boolean isSerializeReferenceNames(SerializationContext ctx) { return ctx != null && SerializationOptions.isSerializeReferenceNames(ctx.getOptions()); } + public static boolean isSerializeCompositeObjects(SerializationContext ctx) { + return ctx != null && SerializationOptions.isSerializeCompositeObjects(ctx.getOptions()); + } + public static SerializationContext forOptions(SerializationOptions options) { return new SerializationContext(options); } @Override - protected SerializationContext clone() { + public SerializationContext clone() { SerializationContext clone; try { clone = (SerializationContext) super.clone(); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializationOptions.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializationOptions.java index 35ef65dc84a..7c694177fc6 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializationOptions.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializationOptions.java @@ -21,6 +21,7 @@ */ public class SerializationOptions implements Cloneable { + private boolean serializeCompositeObjects; private boolean serializeReferenceNames; private ItemNameQualificationStrategy itemNameQualificationStrategy; // private NameQualificationStrategy itemTypeQualificationStrategy; @@ -45,7 +46,25 @@ public static boolean isSerializeReferenceNames(SerializationOptions options) { return options != null && options.isSerializeReferenceNames(); } -// public ItemNameQualificationStrategy getItemNameQualificationStrategy() { + public boolean isSerializeCompositeObjects() { + return serializeCompositeObjects; + } + + public void setSerializeCompositeObjects(boolean serializeCompositeObjects) { + this.serializeCompositeObjects = serializeCompositeObjects; + } + + public static SerializationOptions createSerializeCompositeObjects(){ + SerializationOptions serializationOptions = new SerializationOptions(); + serializationOptions.setSerializeCompositeObjects(true); + return serializationOptions; + } + + public static boolean isSerializeCompositeObjects(SerializationOptions options) { + return options != null && options.isSerializeCompositeObjects(); + } + + // public ItemNameQualificationStrategy getItemNameQualificationStrategy() { // return itemNameQualificationStrategy; // } // diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializerDomTarget.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializerDomTarget.java index 766695af2d7..47ffa09631e 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializerDomTarget.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializerDomTarget.java @@ -1,6 +1,5 @@ package com.evolveum.midpoint.prism; -import com.evolveum.midpoint.prism.lex.LexicalHelpers; import com.evolveum.midpoint.prism.xnode.RootXNode; import com.evolveum.midpoint.util.exception.SchemaException; import org.jetbrains.annotations.NotNull; @@ -11,12 +10,13 @@ */ public class SerializerDomTarget extends SerializerTarget { - public SerializerDomTarget(@NotNull LexicalHelpers lexicalHelpers) { - super(lexicalHelpers); + public SerializerDomTarget(@NotNull PrismContextImpl prismContext) { + super(prismContext); } @Override - public Element serialize(RootXNode xroot, SerializationContext context) throws SchemaException { - return lexicalHelpers.lexicalProcessorRegistry.domParser().serializeXRootToElement(xroot); + @NotNull + public Element write(@NotNull RootXNode xroot, SerializationContext context) throws SchemaException { + return prismContext.getLexicalProcessorRegistry().domProcessor().writeXRootToElement(xroot); } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializerStringTarget.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializerStringTarget.java index 6143f295995..f03f46b9e75 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializerStringTarget.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializerStringTarget.java @@ -1,6 +1,6 @@ package com.evolveum.midpoint.prism; -import com.evolveum.midpoint.prism.lex.LexicalHelpers; +import com.evolveum.midpoint.prism.lex.LexicalProcessor; import com.evolveum.midpoint.prism.xnode.RootXNode; import com.evolveum.midpoint.util.exception.SchemaException; import org.jetbrains.annotations.NotNull; @@ -12,13 +12,15 @@ public class SerializerStringTarget extends SerializerTarget { @NotNull private final String language; - public SerializerStringTarget(@NotNull LexicalHelpers lexicalHelpers, @NotNull String language) { - super(lexicalHelpers); + public SerializerStringTarget(@NotNull PrismContextImpl prismContext, @NotNull String language) { + super(prismContext); this.language = language; } + @NotNull @Override - public String serialize(RootXNode xroot, SerializationContext context) throws SchemaException { - return lexicalHelpers.lexicalProcessorRegistry.parserFor(language).write(xroot, context); + public String write(@NotNull RootXNode xroot, SerializationContext context) throws SchemaException { + LexicalProcessor lexicalProcessor = prismContext.getLexicalProcessorRegistry().processorFor(language); + return lexicalProcessor.write(xroot, context); } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializerTarget.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializerTarget.java index a1468f7a043..a31d8fe44f9 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializerTarget.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializerTarget.java @@ -1,6 +1,5 @@ package com.evolveum.midpoint.prism; -import com.evolveum.midpoint.prism.lex.LexicalHelpers; import com.evolveum.midpoint.prism.xnode.RootXNode; import com.evolveum.midpoint.util.exception.SchemaException; import org.jetbrains.annotations.NotNull; @@ -10,11 +9,12 @@ */ public abstract class SerializerTarget { - @NotNull final LexicalHelpers lexicalHelpers; + @NotNull public final PrismContextImpl prismContext; - protected SerializerTarget(@NotNull LexicalHelpers lexicalHelpers) { - this.lexicalHelpers = lexicalHelpers; + protected SerializerTarget(@NotNull PrismContextImpl prismContext) { + this.prismContext = prismContext; } - abstract public T serialize(RootXNode xroot, SerializationContext context) throws SchemaException; + @NotNull + abstract public T write(@NotNull RootXNode xroot, SerializationContext context) throws SchemaException; } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializerXNodeTarget.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializerXNodeTarget.java index 4d2e0bf51d2..c44fa8dd56b 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializerXNodeTarget.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/SerializerXNodeTarget.java @@ -1,6 +1,5 @@ package com.evolveum.midpoint.prism; -import com.evolveum.midpoint.prism.lex.LexicalHelpers; import com.evolveum.midpoint.prism.xnode.RootXNode; import com.evolveum.midpoint.prism.xnode.XNode; import com.evolveum.midpoint.util.exception.SchemaException; @@ -9,14 +8,15 @@ /** * @author mederly */ -public class SerializerXNodeTarget extends SerializerTarget { +public class SerializerXNodeTarget extends SerializerTarget { - public SerializerXNodeTarget(@NotNull LexicalHelpers lexicalHelpers) { - super(lexicalHelpers); + public SerializerXNodeTarget(@NotNull PrismContextImpl prismContext) { + super(prismContext); } + @NotNull @Override - public XNode serialize(RootXNode xroot, SerializationContext context) throws SchemaException { + public RootXNode write(@NotNull RootXNode xroot, SerializationContext context) throws SchemaException { return xroot; } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/LexicalHelpers.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/LexicalHelpers.java deleted file mode 100644 index 149b712822f..00000000000 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/LexicalHelpers.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (c) 2010-2016 Evolveum - * - * 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 com.evolveum.midpoint.prism.lex; - -import com.evolveum.midpoint.prism.marshaller.PrismBeanConverter; -import com.evolveum.midpoint.prism.marshaller.XNodeProcessor; - -/** - * @author mederly - */ -public class LexicalHelpers { - - public final LexicalProcessorRegistry lexicalProcessorRegistry; - public final XNodeProcessor xnodeProcessor; - public final PrismBeanConverter beanConverter; - - public LexicalHelpers(LexicalProcessorRegistry lexicalProcessorRegistry, XNodeProcessor xnodeProcessor, PrismBeanConverter beanConverter) { - this.lexicalProcessorRegistry = lexicalProcessorRegistry; - this.xnodeProcessor = xnodeProcessor; - this.beanConverter = beanConverter; - } -} diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/LexicalProcessor.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/LexicalProcessor.java index c22ae9c4ea8..1aaab6a06ef 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/LexicalProcessor.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/LexicalProcessor.java @@ -31,18 +31,19 @@ import org.jetbrains.annotations.Nullable; /** - * Takes care of converting between XNode tree and specific lexical representation (XML, JSON, YAML). + * Takes care of converting between XNode tree and specific lexical representation (XML, JSON, YAML). As a special case, + * NullLexicalProcessor uses XNode tree itself as a lexical representation. * * @author semancik * */ -public interface LexicalProcessor { +public interface LexicalProcessor { @NotNull - XNode read(@NotNull ParserSource source, @NotNull ParsingContext parsingContext) throws SchemaException, IOException; + RootXNode read(@NotNull ParserSource source, @NotNull ParsingContext parsingContext) throws SchemaException, IOException; @NotNull - List readObjects(ParserSource source, ParsingContext parsingContext) throws SchemaException, IOException; + List readObjects(ParserSource source, ParsingContext parsingContext) throws SchemaException, IOException; /** * Checks if the processor can read from a given file. (Guessed by file extension, for now.) @@ -60,7 +61,7 @@ public interface LexicalProcessor { * Serializes a root node into XNode tree. */ @NotNull - String write(@NotNull RootXNode xnode, @Nullable SerializationContext serializationContext) throws SchemaException; + T write(@NotNull RootXNode xnode, @Nullable SerializationContext serializationContext) throws SchemaException; /** * Serializes a non-root node into XNode tree. @@ -69,7 +70,6 @@ public interface LexicalProcessor { * TODO consider removing - replacing by the previous form. */ @NotNull - String write(@NotNull XNode xnode, @NotNull QName rootElementName, @Nullable SerializationContext serializationContext) throws SchemaException; - + T write(@NotNull XNode xnode, @NotNull QName rootElementName, @Nullable SerializationContext serializationContext) throws SchemaException; } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/LexicalProcessorRegistry.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/LexicalProcessorRegistry.java index ad129d79554..edfa1151ec4 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/LexicalProcessorRegistry.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/LexicalProcessorRegistry.java @@ -19,6 +19,7 @@ import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.lex.dom.DomLexicalProcessor; import com.evolveum.midpoint.prism.lex.json.JsonLexicalProcessor; +import com.evolveum.midpoint.prism.lex.json.NullLexicalProcessor; import com.evolveum.midpoint.prism.lex.json.YamlLexicalProcessor; import com.evolveum.midpoint.prism.schema.SchemaRegistry; import com.evolveum.midpoint.util.DebugUtil; @@ -41,62 +42,67 @@ public class LexicalProcessorRegistry { private final Map parserMap; + private final DomLexicalProcessor domLexicalProcessor; + private final NullLexicalProcessor nullLexicalProcessor; + public LexicalProcessorRegistry(SchemaRegistry schemaRegistry) { + domLexicalProcessor = new DomLexicalProcessor(schemaRegistry); + nullLexicalProcessor = new NullLexicalProcessor(); + parserMap = new HashMap<>(); - DomLexicalProcessor parserDom = new DomLexicalProcessor(schemaRegistry); - parserMap.put(LANG_XML, parserDom); - JsonLexicalProcessor parserJson = new JsonLexicalProcessor(); - parserMap.put(LANG_JSON, parserJson); - YamlLexicalProcessor parserYaml = new YamlLexicalProcessor(); - parserMap.put(LANG_YAML, parserYaml); + parserMap.put(LANG_XML, domLexicalProcessor); + parserMap.put(LANG_JSON, new JsonLexicalProcessor()); + parserMap.put(LANG_YAML, new YamlLexicalProcessor()); } @NotNull - private LexicalProcessor findParser(File file) throws IOException { + private LexicalProcessor findProcessor(File file) throws IOException { for (Map.Entry entry: parserMap.entrySet()) { LexicalProcessor aLexicalProcessor = entry.getValue(); if (aLexicalProcessor.canRead(file)) { return aLexicalProcessor; } } - throw new SystemException("No parser for file '"+file+"' (autodetect)"); + throw new SystemException("No lexical processor for file '"+file+"' (autodetect)"); } @NotNull - private LexicalProcessor findParser(@NotNull String data){ + private LexicalProcessor findProcessor(@NotNull String data){ for (Map.Entry entry: parserMap.entrySet()) { LexicalProcessor aLexicalProcessor = entry.getValue(); if (aLexicalProcessor.canRead(data)) { return aLexicalProcessor; } } - throw new SystemException("No parser for data '"+ DebugUtil.excerpt(data,16)+"' (autodetect)"); + throw new SystemException("No lexical processor for data '"+ DebugUtil.excerpt(data,16)+"' (autodetect)"); } @NotNull - public DomLexicalProcessor domParser() { - return (DomLexicalProcessor) parserFor(PrismContext.LANG_XML); + public DomLexicalProcessor domProcessor() { + return domLexicalProcessor; } @NotNull - public LexicalProcessor parserFor(String language) { - LexicalProcessor lexicalProcessor = parserMap.get(language); + public LexicalProcessor processorFor(String language) { + LexicalProcessor lexicalProcessor = parserMap.get(language); if (lexicalProcessor == null) { - throw new SystemException("No parser for language '"+language+"'"); + throw new SystemException("No lexical processor for language '"+language+"'"); } - return lexicalProcessor; + return (LexicalProcessor) lexicalProcessor; } @NotNull - public LexicalProcessor findParser(@NotNull ParserSource source) throws IOException { - if (source instanceof ParserElementSource) { - return parserFor(LANG_XML); + public LexicalProcessor findProcessor(@NotNull ParserSource source) throws IOException { + if (source instanceof ParserXNodeSource) { + return nullLexicalProcessor; + } else if (source instanceof ParserElementSource) { + return processorFor(LANG_XML); } else if (source instanceof ParserFileSource) { - return findParser(((ParserFileSource) source).getFile()); + return findProcessor(((ParserFileSource) source).getFile()); } else if (source instanceof ParserStringSource) { - return findParser(((ParserStringSource) source).getData()); + return findProcessor(((ParserStringSource) source).getData()); } else { - throw new IllegalArgumentException("Cannot determine source from " + source.getClass()); + throw new IllegalArgumentException("Cannot determine lexical processor from " + source.getClass()); } } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/dom/DomLexicalProcessor.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/dom/DomLexicalProcessor.java index 9720a5790e2..cdf42a4dba2 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/dom/DomLexicalProcessor.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/dom/DomLexicalProcessor.java @@ -50,7 +50,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -public class DomLexicalProcessor implements LexicalProcessor { +public class DomLexicalProcessor implements LexicalProcessor { public static final Trace LOGGER = TraceManager.getTrace(DomLexicalProcessor.class); @@ -70,7 +70,7 @@ public XNode read(File file, ParsingContext parsingContext) throws SchemaExcepti @NotNull @Override - public XNode read(@NotNull ParserSource source, @NotNull ParsingContext parsingContext) throws SchemaException, IOException { + public RootXNode read(@NotNull ParserSource source, @NotNull ParsingContext parsingContext) throws SchemaException, IOException { if (source instanceof ParserElementSource) { return read(((ParserElementSource) source).getElement()); } @@ -88,7 +88,7 @@ public XNode read(@NotNull ParserSource source, @NotNull ParsingContext parsingC @NotNull @Override - public List readObjects(ParserSource source, ParsingContext parsingContext) throws SchemaException, IOException { + public List readObjects(ParserSource source, ParsingContext parsingContext) throws SchemaException, IOException { InputStream is = source.getInputStream(); try { Document document = DOMUtil.parse(is); @@ -100,11 +100,11 @@ public List readObjects(ParserSource source, ParsingContext parsingContex } } - private List readObjects(Document document) throws SchemaException{ + private List readObjects(Document document) throws SchemaException{ Element root = DOMUtil.getFirstChildElement(document); // TODO: maybe some check if this is a collection of other objects??? List children = DOMUtil.listChildElements(root); - List nodes = new ArrayList(); + List nodes = new ArrayList<>(); for (Element child : children){ RootXNode xroot = read(child); nodes.add(xroot); @@ -445,8 +445,9 @@ private Element serializeXPrimitiveToElement(PrimitiveXNode xprim, QName elem DomLexicalWriter serializer = new DomLexicalWriter(this, schemaRegistry); return serializer.serializeXPrimitiveToElement(xprim, elementName); } - - public Element serializeXRootToElement(RootXNode xroot) throws SchemaException { + + @NotNull + public Element writeXRootToElement(@NotNull RootXNode xroot) throws SchemaException { DomLexicalWriter serializer = new DomLexicalWriter(this, schemaRegistry); return serializer.serialize(xroot); } @@ -459,7 +460,7 @@ private Element serializeToElement(XNode xnode, QName elementName) throws Schema } else if (xnode instanceof PrimitiveXNode) { return serializeXPrimitiveToElement((PrimitiveXNode) xnode, elementName); } else if (xnode instanceof RootXNode) { - return serializeXRootToElement((RootXNode)xnode); + return writeXRootToElement((RootXNode)xnode); } else if (xnode instanceof ListXNode) { ListXNode xlist = (ListXNode) xnode; if (xlist.size() == 0) { diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/dom/DomLexicalWriter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/dom/DomLexicalWriter.java index 52ed05f8229..804ee29bca2 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/dom/DomLexicalWriter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/dom/DomLexicalWriter.java @@ -30,6 +30,7 @@ import com.evolveum.midpoint.util.DOMUtil; import com.evolveum.midpoint.util.exception.SchemaException; import org.apache.commons.lang.StringUtils; +import org.jetbrains.annotations.NotNull; import org.w3c.dom.DOMException; import org.w3c.dom.Document; import org.w3c.dom.Element; @@ -78,7 +79,8 @@ private void initializeWithExistingDocument(Document document) { topElement = document.getDocumentElement(); // TODO is this ok? } - public Element serialize(RootXNode rootxnode) throws SchemaException { + @NotNull + public Element serialize(@NotNull RootXNode rootxnode) throws SchemaException { initialize(); return serializeInternal(rootxnode, null); } @@ -95,7 +97,8 @@ public Element serializeUnderElement(RootXNode rootxnode, Element parentElement) return serializeInternal(rootxnode, parentElement); } - private Element serializeInternal(RootXNode rootxnode, Element parentElement) throws SchemaException { + @NotNull + private Element serializeInternal(@NotNull RootXNode rootxnode, Element parentElement) throws SchemaException { QName rootElementName = rootxnode.getRootElementName(); Element topElement = createElement(rootElementName, parentElement); if (parentElement != null) { @@ -313,6 +316,7 @@ private void serializeSchema(SchemaXNode xschema, Element parentElement) { * @param qname element QName * @return created DOM element */ + @NotNull private Element createElement(QName qname, Element parentElement) { String namespaceURI = qname.getNamespaceURI(); if (!StringUtils.isBlank(namespaceURI)) { diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/AbstractJsonLexicalProcessor.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/AbstractJsonLexicalProcessor.java index 3cf6667a4f6..a6ec27e3174 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/AbstractJsonLexicalProcessor.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/AbstractJsonLexicalProcessor.java @@ -55,7 +55,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.module.SimpleModule; -public abstract class AbstractJsonLexicalProcessor implements LexicalProcessor { +public abstract class AbstractJsonLexicalProcessor implements LexicalProcessor { private static final Trace LOGGER = TraceManager.getTrace(AbstractJsonLexicalProcessor.class); @@ -81,7 +81,7 @@ public RootXNode read(@NotNull ParserSource source, @NotNull ParsingContext pars @NotNull @Override - public List readObjects(ParserSource source, ParsingContext parsingContext) throws SchemaException, IOException { + public List readObjects(ParserSource source, ParsingContext parsingContext) throws SchemaException, IOException { throw new UnsupportedOperationException("Parse objects not supported for json and yaml."); // why? } @@ -448,7 +448,7 @@ public String write(@NotNull RootXNode root, SerializationContext prismSerializa StringWriter out = new StringWriter(); try ( JsonGenerator generator = createJacksonGenerator(out) ) { JsonSerializationContext ctx = new JsonSerializationContext(generator, prismSerializationContext); - serialize(root.asMapXNode(), ctx); // TODO default namespace + serialize(root.toMapXNode(), ctx); // TODO default namespace } catch (IOException ex) { throw new SchemaException("Error during serializing to JSON/YAML: " + ex.getMessage(), ex); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/NullLexicalProcessor.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/NullLexicalProcessor.java new file mode 100644 index 00000000000..0903145e68f --- /dev/null +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/NullLexicalProcessor.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.prism.lex.json; + +import com.evolveum.midpoint.prism.ParserSource; +import com.evolveum.midpoint.prism.ParserXNodeSource; +import com.evolveum.midpoint.prism.ParsingContext; +import com.evolveum.midpoint.prism.SerializationContext; +import com.evolveum.midpoint.prism.lex.LexicalProcessor; +import com.evolveum.midpoint.prism.xnode.RootXNode; +import com.evolveum.midpoint.prism.xnode.XNode; +import com.evolveum.midpoint.util.exception.SchemaException; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import javax.xml.namespace.QName; +import java.io.File; +import java.io.IOException; +import java.util.List; + +/** + * @author mederly + */ +public class NullLexicalProcessor implements LexicalProcessor { + + @NotNull + @Override + public RootXNode read(@NotNull ParserSource source, @NotNull ParsingContext parsingContext) throws SchemaException, IOException { + if (!(source instanceof ParserXNodeSource)) { + throw new IllegalStateException("Unsupported parser source: " + source.getClass().getName()); + } + return ((ParserXNodeSource) source).getXNode(); + } + + @NotNull + @Override + public List readObjects(ParserSource source, ParsingContext parsingContext) throws SchemaException, IOException { + throw new UnsupportedOperationException(); + } + + @Override + public boolean canRead(@NotNull File file) throws IOException { + return false; + } + + @Override + public boolean canRead(@NotNull String dataString) { + return false; + } + + @NotNull + @Override + public XNode write(@NotNull RootXNode xnode, @Nullable SerializationContext serializationContext) throws SchemaException { + return xnode; + } + + @NotNull + @Override + public XNode write(@NotNull XNode xnode, @NotNull QName rootElementName, @Nullable SerializationContext serializationContext) + throws SchemaException { + return xnode; + } +} diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/ItemInfo.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/ItemInfo.java new file mode 100644 index 00000000000..72a276566c1 --- /dev/null +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/ItemInfo.java @@ -0,0 +1,162 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.prism.marshaller; + +import com.evolveum.midpoint.prism.*; +import com.evolveum.midpoint.prism.schema.SchemaRegistry; +import com.evolveum.midpoint.util.QNameUtil; +import com.evolveum.midpoint.util.exception.SchemaException; +import org.jetbrains.annotations.NotNull; + +import javax.xml.namespace.QName; + +/** + * @author mederly + */ +public class ItemInfo { + private QName itemName; + private ID itemDefinition; + private QName typeName; + + @NotNull + public static ItemInfo determine(ItemDefinition itemDefinitionExplicit, + QName itemNameFromSource, QName itemNameExplicit, QName itemNameDefault, + QName typeNameFromSource, QName typeNameExplicit, + Class classExplicit, + @NotNull Class definitionClass, @NotNull ParsingContext pc, @NotNull SchemaRegistry schemaRegistry) throws SchemaException { + + // deriving definition + + ID definition; + if (itemDefinitionExplicit != null) { + if (!definitionClass.isAssignableFrom(itemDefinitionExplicit.getClass())) { + throw new IllegalArgumentException("ItemDefinition of " + itemDefinitionExplicit + " doesn't match expected " + + "definition class of " + definitionClass); + } + @SuppressWarnings("unchecked") + ID narrowedDefinitionExplicit = (ID) itemDefinitionExplicit; + definition = narrowedDefinitionExplicit; + } else { + definition = null; + } + definition = augmentWithType(definition, definitionClass, schemaRegistry, typeNameExplicit); + definition = augmentWithType(definition, definitionClass, schemaRegistry, typeNameFromSource); + definition = augmentWithClass(definition, definitionClass, schemaRegistry, classExplicit); + + definition = augmentWithItemName(definition, definitionClass, schemaRegistry, itemNameFromSource); + + ItemInfo info = new ItemInfo<>(); + info.itemDefinition = definition; + + // deriving item name + if (itemNameExplicit != null) { + info.itemName = itemNameExplicit; + } else if (itemNameFromSource != null) { + if (QNameUtil.noNamespace(itemNameFromSource) && definition != null) { + info.itemName = new QName(definition.getName().getNamespaceURI(), itemNameFromSource.getLocalPart()); + } else { + info.itemName = itemNameFromSource; + } + } else if (definition != null) { + info.itemName = definition.getName(); + } else { + info.itemName = itemNameDefault; + } + + // type name + if (definition != null) { + info.typeName = definition.getTypeName(); + } else if (typeNameExplicit == null) { + info.typeName = typeNameFromSource; + } else if (typeNameFromSource == null) { + info.typeName = typeNameExplicit; + } else if (schemaRegistry.isAssignableFrom(typeNameExplicit, typeNameFromSource)) { + info.typeName = typeNameFromSource; + } else { + info.typeName = typeNameExplicit; + } + return info; + } + + private static ID augmentWithType(ID definition, Class definitionClass, + SchemaRegistry schemaRegistry, QName typeName) throws SchemaException { + if (typeName == null) { + return definition; + } + if (definition != null && QNameUtil.match(definition.getTypeName(), typeName)) { // just an optimization to avoid needless lookups + return definition; + } + ItemDefinition rawDefFromType = schemaRegistry.findItemDefinitionByType(typeName); + if (rawDefFromType == null) { + throw new SchemaException("Unknown type name " + typeName); + } + if (!definitionClass.isAssignableFrom(rawDefFromType.getClass())) { + throw new SchemaException("Wrong type name " + typeName + " (not a " + definitionClass.getClass().getSimpleName() + ")"); // TODO context of error + } + @SuppressWarnings("unchecked") + ID defFromType = (ID) rawDefFromType; + return schemaRegistry.selectMoreSpecific(definition, defFromType); + } + + private static ID augmentWithItemName(ID definition, Class definitionClass, + SchemaRegistry schemaRegistry, QName itemName) throws SchemaException { + if (itemName == null || definition != null && QNameUtil.match(definition.getName(), itemName)) { // just an optimization to avoid needless lookups + return definition; + } + ID defFromItemName = schemaRegistry.findItemDefinitionByElementName(itemName, definitionClass); + if (definition == null && defFromItemName != null) { + return defFromItemName; + } + return definition; // we won't try to compare the definitions, as the item name indication is (very) weak in comparison with others + } + + private static ID augmentWithClass(ID definition, Class definitionClass, + SchemaRegistry schemaRegistry, Class clazz) throws SchemaException { + if (clazz == null) { + return definition; + } + if (definition instanceof PrismContainerDefinition && clazz.equals(((PrismContainerDefinition) definition).getCompileTimeClass())) { + return definition; + } + QName typeNameFromClass = schemaRegistry.determineTypeForClass(clazz); + if (typeNameFromClass == null) { + throw new SchemaException("Unknown class " + clazz.getName()); + } + if (definition != null && definition.getTypeName().equals(typeNameFromClass)) { + return definition; + } + if (!PrismContainerDefinition.class.isAssignableFrom(definitionClass)) { + return definition; + } + // the following may be null + @SuppressWarnings("unchecked") + ID defFromClass = (ID) schemaRegistry.findContainerDefinitionByCompileTimeClass((Class) clazz, (Class) definitionClass); + return schemaRegistry.selectMoreSpecific(definition, defFromClass); + } + + public QName getItemName() { + return itemName; + } + + public ID getItemDefinition() { + return itemDefinition; + } + + public QName getTypeName() { + return typeName; + } +} diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/JaxbDomHack.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/JaxbDomHack.java index 40d7b8ccf13..9e111528c4f 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/JaxbDomHack.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/JaxbDomHack.java @@ -167,9 +167,7 @@ public Item subItem; if (element instanceof Element) { // DOM Element - DomLexicalProcessor domParser = prismContext.getParserDom(); - XNode xnode = domParser.parseElementContent((Element)element); - subItem = (Item) prismContext.getXnodeProcessor().parseItem(xnode, elementName, itemDefinition, ParsingContext.createDefault()); + subItem = prismContext.parserFor((Element) element).name(elementName).definition(itemDefinition).parseItem(); } else if (element instanceof JAXBElement) { // JAXB Element JAXBElement jaxbElement = (JAXBElement)element; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismBeanConverter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismBeanConverter.java index 4dd63b78fcd..448a7dc60f4 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismBeanConverter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismBeanConverter.java @@ -49,6 +49,7 @@ import com.evolveum.prism.xml.ns._public.types_3.XmlAsStringType; import org.apache.commons.lang.StringUtils; +import org.jetbrains.annotations.NotNull; import org.w3c.dom.Element; import javax.xml.bind.JAXBElement; @@ -77,14 +78,15 @@ public class PrismBeanConverter { public static final String DEFAULT_PLACEHOLDER = "##default"; private PrismBeanInspector inspector; - - private PrismContext prismContext; - public PrismBeanConverter(PrismContext prismContext, PrismBeanInspector inspector) { + @NotNull private final PrismContext prismContext; + + public PrismBeanConverter(@NotNull PrismContext prismContext, PrismBeanInspector inspector) { this.prismContext = prismContext; this.inspector = inspector; } + @NotNull public PrismContext getPrismContext() { return prismContext; } @@ -94,9 +96,6 @@ public PrismContext getPrismContext() { // } private SchemaRegistry getSchemaRegistry() { - if (prismContext == null) { - return null; - } return prismContext.getSchemaRegistry(); } @@ -146,7 +145,7 @@ public T unmarshall(MapXNode xnode, Class beanClass, ParsingContext pc) t return (T) schemaDefType; } else if (prismContext.getSchemaRegistry().determineDefinitionFromClass(beanClass) != null) { PrismObjectDefinition def = prismContext.getSchemaRegistry().determineDefinitionFromClass(beanClass); - return (T) prismContext.getXnodeProcessor().parseObject(xnode, def, pc).asObjectable(); + return (T) ((PrismContextImpl) prismContext).getPrismUnmarshaller().parseObject(xnode, def, pc).asObjectable(); } else if (XmlAsStringType.class.equals(beanClass)) { // reading a string represented a XML-style content // used e.g. when reading report templates (embedded XML) @@ -157,7 +156,7 @@ public T unmarshall(MapXNode xnode, Class beanClass, ParsingContext pc) t return (T) new XmlAsStringType(); } else { Map.Entry entry = xnode.entrySet().iterator().next(); - DomLexicalProcessor domParser = prismContext.getParserDom(); + DomLexicalProcessor domParser = ((PrismContextImpl) prismContext).getParserDom(); String value = domParser.write(entry.getValue(), entry.getKey(), null); return (T) new XmlAsStringType(value); } @@ -823,7 +822,8 @@ public XNode marshall(T bean, SerializationContext ctx) throws SchemaExcepti } else if (bean instanceof XmlAsStringType) { return marshalXmlAsStringType((XmlAsStringType) bean); } else if (prismContext != null && prismContext.getSchemaRegistry().determineDefinitionFromClass(bean.getClass()) != null){ - return prismContext.getXnodeProcessor().serializeObject(((Objectable)bean).asPrismObject(), false, ctx).getSubnode(); + return ((PrismContextImpl) prismContext).getPrismMarshaller().marshalItem(((Objectable)bean).asPrismObject(), + null, null, ctx).getSubnode(); } // Note: SearchFilterType is treated below diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismBeanInspector.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismBeanInspector.java index 1070e203840..f63cfa2fa36 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismBeanInspector.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismBeanInspector.java @@ -124,15 +124,10 @@ public String get(Class paramType) { }); } - private Map, QName> _determineTypeForClass = Collections.synchronizedMap(new HashMap()); + private Map, QName> _determineTypeForClass = Collections.synchronizedMap(new HashMap()); - QName determineTypeForClass(Class paramType) { - return find1(_determineTypeForClass, paramType, new Getter1>() { - @Override - public QName get(Class paramType) { - return determineTypeForClassUncached(paramType); - } - }); + QName determineTypeForClass(Class paramType) { + return find1(_determineTypeForClass, paramType, this::determineTypeForClassUncached); } private Map> _isAttribute = Collections.synchronizedMap(new HashMap()); @@ -305,7 +300,7 @@ private Field findPropertyFieldExactUncached(Class classType, String prop // nothing found } Class superclass = classType.getSuperclass(); - if (superclass.equals(Object.class)) { + if (superclass == null || Object.class.equals(superclass)) { return null; } return findPropertyField(superclass, propName); @@ -338,7 +333,7 @@ private Method findPropertyGetterUncached(Class classType, String propNam // nothing found } Class superclass = classType.getSuperclass(); - if (superclass.equals(Object.class)) { + if (superclass == null || superclass.equals(Object.class)) { return null; } return findPropertyGetter(superclass, propName); @@ -385,7 +380,7 @@ private QName determineTypeForClassUncached(Class beanClass) { } String namespace = xmlType.namespace(); - if (namespace == null || PrismBeanConverter.DEFAULT_PLACEHOLDER.equals(namespace)) { + if (PrismBeanConverter.DEFAULT_PLACEHOLDER.equals(namespace)) { XmlSchema xmlSchema = beanClass.getPackage().getAnnotation(XmlSchema.class); namespace = xmlSchema.namespace(); } @@ -499,7 +494,7 @@ private Field findField(Class classType, Handler selector) { } } Class superclass = classType.getSuperclass(); - if (superclass.equals(Object.class)) { + if (superclass == null || superclass.equals(Object.class)) { return null; } return findField(superclass, selector); @@ -512,7 +507,7 @@ private Method findMethod(Class classType, Handler selector) { } } Class superclass = classType.getSuperclass(); - if (superclass.equals(Object.class)) { + if (superclass == null || superclass.equals(Object.class)) { return null; } return findMethod(superclass, selector); @@ -523,7 +518,7 @@ private List getPropOrderUncached(Class beanClass) { // Superclass first! Class superclass = beanClass.getSuperclass(); - if (superclass.equals(Object.class) || superclass.getAnnotation(XmlType.class) == null) { + if (superclass == null || superclass.equals(Object.class) || superclass.getAnnotation(XmlType.class) == null) { propOrder = new ArrayList<>(); } else { propOrder = new ArrayList<>(getPropOrder(superclass)); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/XNodeSerializer.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismMarshaller.java similarity index 59% rename from infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/XNodeSerializer.java rename to infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismMarshaller.java index 00c0c6fc56c..7763200c01d 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/XNodeSerializer.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismMarshaller.java @@ -17,13 +17,11 @@ import java.util.ArrayList; import java.util.Collection; -import java.util.List; import javax.xml.namespace.QName; import com.evolveum.midpoint.prism.SerializationContext; -import com.evolveum.midpoint.prism.SerializationOptions; -import com.evolveum.midpoint.prism.marshaller.PrismBeanConverter; +import com.evolveum.midpoint.util.JAXBUtil; import com.evolveum.prism.xml.ns._public.query_3.SearchFilterType; import org.apache.commons.lang.StringUtils; @@ -53,42 +51,92 @@ import com.evolveum.prism.xml.ns._public.types_3.EvaluationTimeType; import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; import com.evolveum.prism.xml.ns._public.types_3.ProtectedDataType; +import org.jetbrains.annotations.NotNull; /** * @author semancik * */ -public class XNodeSerializer { +public class PrismMarshaller { - private PrismBeanConverter beanConverter; - private boolean serializeCompositeObjects = false; + @NotNull private final PrismBeanConverter beanConverter; - public XNodeSerializer(PrismBeanConverter beanConverter) { - super(); + public PrismMarshaller(@NotNull PrismBeanConverter beanConverter) { this.beanConverter = beanConverter; } - public boolean isSerializeCompositeObjects() { - return serializeCompositeObjects; + //region Public interface ====================================================================================== + + /* + * TODO reconsider what to return for empty items + * 1. null + * 2. Root(name, null) + * 3. Root(name, List()) + * + * TODO reconsider what to do if we have potentially multivalued property - whether to return list or not + */ + + @NotNull + RootXNode marshalItem(@NotNull Item item, QName itemName, + ItemDefinition itemDefinition, SerializationContext context) throws SchemaException { + + QName realName = itemName != null ? itemName : item.getElementName(); + ItemDefinition realDefinition = itemDefinition != null ? itemDefinition : item.getDefinition(); + + XNode content; + if (item instanceof PrismObject) { + content = marshalObjectContent((PrismObject) item, (PrismObjectDefinition) realDefinition, context); + } else if (item.size() == 1) { + content = marshalItemValue(item.getValue(0), realDefinition, context); + } else { + ListXNode xlist = new ListXNode(); + for (PrismValue val : item.getValues()) { + xlist.add(marshalItemValue(val, realDefinition, context)); + } + content = xlist; + } + return new RootXNode(realName, content); } - public void setSerializeCompositeObjects(boolean serializeCompositeObjects) { - this.serializeCompositeObjects = serializeCompositeObjects; + RootXNode marshalItemValueAsRoot(@NotNull PrismValue value, @NotNull QName itemName, ItemDefinition itemDefinition, + SerializationContext context) throws SchemaException { + if (itemDefinition == null && value.getParent() != null) { + itemDefinition = value.getParent().getDefinition(); // the definition may still be null here + } + XNode valueNode = marshalItemValue(value, itemDefinition, context); + return new RootXNode(itemName, valueNode); } - //region Serializing objects - public RootXNode serializeObject(PrismObject object) throws SchemaException { - return serializeObject(object, null); - } + RootXNode marshalAnyData(@NotNull Object object, QName itemName, ItemDefinition itemDefinition, SerializationContext ctx) throws SchemaException { + if (object instanceof Item) { + return marshalItem((Item) object, itemName, itemDefinition, ctx); + } else { + Validate.notNull(itemName, "rootElementName must be specified for non-Item objects"); + XNode valueNode = beanConverter.marshall(object, ctx); // TODO item definition! + QName typeQName = JAXBUtil.getTypeQName(object.getClass()); + if (valueNode.getTypeQName() == null) { + if (typeQName != null) { + valueNode.setTypeQName(typeQName); + } else { + throw new SchemaException("No type QName for class " + object.getClass()); + } + } + return new RootXNode(itemName, valueNode); + } + } - public RootXNode serializeObject(PrismObject object, SerializationContext ctx) throws SchemaException { - RootXNode xroot = new RootXNode(object.getElementName()); - xroot.setSubnode(serializeObjectContent(object, ctx)); - xroot.setTypeQName(object.getDefinition().getTypeName()); - return xroot; + public boolean canSerialize(Object object) { + if (object instanceof Item) { + return true; + } else { + return beanConverter.canProcess(object.getClass()); + } } - - private MapXNode serializeObjectContent(PrismObject object, SerializationContext ctx) throws SchemaException { + //endregion + + //region Implementation ====================================================================================== + + private MapXNode marshalObjectContent(@NotNull PrismObject object, @NotNull PrismObjectDefinition objectDefinition, SerializationContext ctx) throws SchemaException { MapXNode xmap = new MapXNode(); if (object.getOid() != null) { xmap.put(XNode.KEY_OID, createPrimitiveXNodeStringAttr(object.getOid())); @@ -96,104 +144,27 @@ private MapXNode serializeObjectContent(PrismObject ob if (object.getVersion() != null) { xmap.put(XNode.KEY_VERSION, createPrimitiveXNodeStringAttr(object.getVersion())); } - PrismObjectDefinition objectDefinition = object.getDefinition(); - serializeContainerValue(xmap, object.getValue(), objectDefinition, ctx); + marshalContainerValue(xmap, object.getValue(), objectDefinition, ctx); + xmap.setTypeQName(objectDefinition.getTypeName()); // object should have the definition (?) return xmap; } - //endregion - - //region Serializing (any) items - public XNode serializeItem(Item item) throws SchemaException { - return serializeItem(item, null); - } - - public XNode serializeItem(Item item, SerializationContext ctx) throws SchemaException { - ListXNode xlist = new ListXNode(); - List values = item.getValues(); - ItemDefinition definition = item.getDefinition(); - - for (IV val: values) { - XNode xsubnode = serializeItemValue(val, definition, ctx); - xlist.add(xsubnode); - } - - boolean asList; - if (definition != null) { - asList = definition.isMultiValue(); - } else { - asList = values.size() > 1; - } - - if (asList) { - return xlist; - } else { - if (xlist.isEmpty()) { - return null; - } else { - return xlist.iterator().next(); - } - } - } - - public RootXNode serializeItemValueAsRoot(PrismValue value, QName elementName) throws SchemaException { - Validate.notNull(value, "Item value to be serialized cannot be null"); - //Validate.notNull(value.getParent(), "Item value to be serialized must have a parent"); - Validate.notNull(elementName, "Element name cannot be null"); - return serializeItemValueAsRootInternal(value, elementName); - } - - // element name may be null (it is then derived from the definition, if the definition exists) - private RootXNode serializeItemValueAsRootInternal(PrismValue value, QName elementName) throws SchemaException { - ItemDefinition definition; - if (value.getParent() != null) { - definition = value.getParent().getDefinition(); // the definition may be null here - } else { - definition = null; - } - XNode valueNode = serializeItemValue(value, definition); - if (elementName == null) { - if (definition == null) { - throw new IllegalStateException("The name of element to be serialized couldn't be determined, as there's no definition"); - } - elementName = definition.getName(); - } - return new RootXNode(elementName, valueNode); - } - - public RootXNode serializeItemAsRoot(Item item) throws SchemaException { - Validate.notNull(item.getDefinition(), "Item without a definition"); - XNode valueNode = serializeItem(item); - return new RootXNode(item.getDefinition().getName(), valueNode); - } - - public XNode serializeItemValue(V itemValue, ItemDefinition definition) throws SchemaException { - return serializeItemValue(itemValue, definition, (SerializationContext) null); - } - - public XNode serializeItemValue(V itemValue, ItemDefinition definition, SerializationOptions options) throws SchemaException { - return serializeItemValue(itemValue, definition, new SerializationContext(options)); - } - // definition may be null - private XNode serializeItemValue(PrismValue itemValue, ItemDefinition definition, SerializationContext ctx) throws SchemaException { + @NotNull + private XNode marshalItemValue(@NotNull PrismValue itemValue, ItemDefinition definition, SerializationContext ctx) throws SchemaException { XNode xnode; if (definition == null) { if (itemValue.getParent() != null) { definition = itemValue.getParent().getDefinition(); } } - if (beanConverter.getPrismContext() == null) { - throw new IllegalStateException("No prismContext in beanConverter!"); - } - if (definition == null && itemValue instanceof PrismPropertyValue){ + if (definition == null && itemValue instanceof PrismPropertyValue) { return serializePropertyRawValue((PrismPropertyValue) itemValue); - } - if (itemValue instanceof PrismReferenceValue) { + } else if (itemValue instanceof PrismReferenceValue) { xnode = serializeReferenceValue((PrismReferenceValue)itemValue, (PrismReferenceDefinition) definition, ctx); } else if (itemValue instanceof PrismPropertyValue) { xnode = serializePropertyValue((PrismPropertyValue)itemValue, (PrismPropertyDefinition)definition); } else if (itemValue instanceof PrismContainerValue) { - xnode = serializeContainerValue((PrismContainerValue)itemValue, (PrismContainerDefinition)definition, ctx); + xnode = marshalContainerValue((PrismContainerValue)itemValue, (PrismContainerDefinition)definition, ctx); } else { throw new IllegalArgumentException("Unsupported value type "+itemValue.getClass()); } @@ -202,27 +173,14 @@ private XNode serializeItemValue(PrismValue itemValue, It } return xnode; } - //endregion - - //region Serializing containers - specific functionality -// public RootXNode serializeContainerValueAsRoot(PrismContainerValue containerVal) throws SchemaException { -// Validate.notNull(containerVal); -// return serializeItemValueAsRootInternal(containerVal, null); -// } -// -// public RootXNode serializeContainerValueAsRoot(PrismContainerValue containerVal, QName elementName) throws SchemaException { -// Validate.notNull(containerVal); -// Validate.notNull(elementName); -// return serializeItemValueAsRootInternal(containerVal, elementName); -// } - private MapXNode serializeContainerValue(PrismContainerValue containerVal, PrismContainerDefinition containerDefinition, SerializationContext ctx) throws SchemaException { + private MapXNode marshalContainerValue(PrismContainerValue containerVal, PrismContainerDefinition containerDefinition, SerializationContext ctx) throws SchemaException { MapXNode xmap = new MapXNode(); - serializeContainerValue(xmap, containerVal, containerDefinition, ctx); + marshalContainerValue(xmap, containerVal, containerDefinition, ctx); return xmap; } - private void serializeContainerValue(MapXNode xmap, PrismContainerValue containerVal, PrismContainerDefinition containerDefinition, SerializationContext ctx) throws SchemaException { + private void marshalContainerValue(MapXNode xmap, PrismContainerValue containerVal, PrismContainerDefinition containerDefinition, SerializationContext ctx) throws SchemaException { Long id = containerVal.getId(); if (id != null) { xmap.put(XNode.KEY_CONTAINER_ID, createPrimitiveXNodeAttr(id, DOMUtil.XSD_LONG)); @@ -232,7 +190,7 @@ private void serializeContainerValue(MapXNode xmap, Pr xmap.setExplicitTypeDeclaration(true); } - Collection serializedItems = new ArrayList<>(); + Collection marshaledItems = new ArrayList<>(); if (containerDefinition != null) { // We have to serialize in the definition order. Some data formats (XML) are // ordering-sensitive. We need to keep that ordering otherwise the resulting @@ -241,9 +199,9 @@ private void serializeContainerValue(MapXNode xmap, Pr QName elementName = itemDef.getName(); Item item = containerVal.findItem(elementName); if (item != null) { - XNode xsubnode = serializeItem(item, ctx); + XNode xsubnode = marshalItem(item, null, null, ctx).getSubnode(); xmap.put(elementName, xsubnode); - serializedItems.add(elementName); + marshaledItems.add(elementName); } } } @@ -252,17 +210,15 @@ private void serializeContainerValue(MapXNode xmap, Pr if (containerVal.getItems() != null){ for (Item item : containerVal.getItems()) { QName elementName = item.getElementName(); - if (serializedItems.contains(elementName)) { + if (marshaledItems.contains(elementName)) { continue; } - XNode xsubnode = serializeItem(item, ctx); + XNode xsubnode = marshalItem(item, null, null, ctx).getSubnode(); xmap.put(elementName, xsubnode); } } } - //endregion - //region Serializing references - specific functionality private XNode serializeReferenceValue(PrismReferenceValue value, PrismReferenceDefinition definition, SerializationContext ctx) throws SchemaException { MapXNode xmap = new MapXNode(); boolean containsOid = false; @@ -307,8 +263,8 @@ private XNode serializeReferenceValue(PrismReferenceValue value, PrismReferenceD if (definition != null) { isComposite = definition.isComposite(); } - if ((serializeCompositeObjects || isComposite || !containsOid) && value.getObject() != null) { - XNode xobjnode = serializeObjectContent(value.getObject(), ctx); + if ((SerializationContext.isSerializeCompositeObjects(ctx) || isComposite || !containsOid) && value.getObject() != null) { + XNode xobjnode = marshalObjectContent(value.getObject(), value.getObject().getDefinition(), ctx); xmap.put(createReferenceQName(XNode.KEY_REFERENCE_OBJECT, namespace), xobjnode); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismParserImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismParserImpl.java index c490893d3bb..a5cdd7a04b7 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismParserImpl.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismParserImpl.java @@ -18,7 +18,7 @@ import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.lex.LexicalProcessor; -import com.evolveum.midpoint.prism.lex.LexicalHelpers; +import com.evolveum.midpoint.prism.xnode.RootXNode; import com.evolveum.midpoint.prism.xnode.XNode; import com.evolveum.midpoint.util.exception.SchemaException; import org.jetbrains.annotations.NotNull; @@ -28,36 +28,48 @@ import javax.xml.namespace.QName; import java.io.IOException; import java.util.ArrayList; -import java.util.Collection; import java.util.List; /** * @author mederly */ -public abstract class PrismParserImpl implements PrismParser { +abstract class PrismParserImpl implements PrismParser { @NotNull private final ParserSource source; private final String language; @NotNull private final ParsingContext context; - @NotNull private final LexicalHelpers helpers; + @NotNull private final PrismContextImpl prismContext; - PrismParserImpl(@NotNull ParserSource source, String language, @NotNull ParsingContext context, @NotNull LexicalHelpers helpers) { + private final ItemDefinition itemDefinition; + private final QName itemName; + private final QName typeName; + private final Class typeClass; + + //region Parameters ==================================================================================== + + PrismParserImpl(@NotNull ParserSource source, String language, @NotNull ParsingContext context, + @NotNull PrismContextImpl prismContext, ItemDefinition itemDefinition, QName itemName, QName typeName, Class typeClass) { this.source = source; this.language = language; this.context = context; - this.helpers = helpers; + this.prismContext = prismContext; + this.itemDefinition = itemDefinition; + this.itemName = itemName; + this.typeName = typeName; + this.typeClass = typeClass; } - private PrismParser create(ParserSource source, @Nullable String language, @NotNull ParsingContext context, LexicalHelpers helpers) { + private PrismParser create(ParserSource source, @Nullable String language, @NotNull ParsingContext context, PrismContextImpl prismContext, + ItemDefinition itemDefinition, QName itemName, QName typeName, Class typeClass) { return source.throwsIOException() ? - new PrismParserImplIO(source, language, context, helpers) : - new PrismParserImplNoIO(source, language, context, helpers); + new PrismParserImplIO(source, language, context, prismContext, itemDefinition, itemName, typeName, typeClass) : + new PrismParserImplNoIO(source, language, context, prismContext, itemDefinition, itemName, typeName, typeClass); } @NotNull @Override public PrismParser language(@Nullable String language) { - return create(this.source, language, this.context, this.helpers); + return create(source, language, context, prismContext, itemDefinition, itemName, typeName, typeClass); } @NotNull @@ -81,83 +93,167 @@ public PrismParser yaml() { @NotNull @Override public PrismParser context(@NotNull ParsingContext context) { - return create(this.source, this.language, context, this.helpers); + return create(source, language, context, prismContext, itemDefinition, itemName, typeName, typeClass); } @NotNull @Override public PrismParser strict() { - return create(this.source, this.language, context.clone().strict(), this.helpers); + return create(source, language, context.clone().strict(), prismContext, itemDefinition, itemName, typeName, typeClass); } @NotNull @Override public PrismParser compat() { - return create(this.source, this.language, context.clone().compat(), this.helpers); + return create(source, language, context.clone().compat(), prismContext, itemDefinition, itemName, typeName, typeClass); } @NotNull - protected PrismObject doParse() throws SchemaException, IOException { - LexicalProcessor lexicalProcessor = getLexicalProcessor(); - XNode xnode = lexicalProcessor.read(source, context); - return helpers.xnodeProcessor.parseObject(xnode, context); + @Override + public PrismParser definition(ItemDefinition itemDefinition) { + return create(source, language, context, prismContext, itemDefinition, itemName, typeName, typeClass); } @NotNull - private LexicalProcessor getLexicalProcessor() throws IOException { - if (language != null) { - return helpers.lexicalProcessorRegistry.parserFor(language); + @Override + public PrismParser name(QName itemName) { + return create(source, language, context, prismContext, itemDefinition, itemName, typeName, typeClass); + } + + @NotNull + @Override + public PrismParser type(QName typeName) { + return create(source, language, context, prismContext, itemDefinition, itemName, typeName, typeClass); + } + + @NotNull + @Override + public PrismParser type(Class typeClass) { + return create(source, language, context, prismContext, itemDefinition, itemName, typeName, typeClass); + } + //endregion + + //region Parsing methods ==================================================================================== + + @NotNull + PrismObject doParse() throws SchemaException, IOException { + RootXNode xnode = getLexicalProcessor().read(source, context); + return prismContext.getPrismUnmarshaller().parseObject(xnode, itemDefinition, itemName, typeName, typeClass, context); + } + + Item doParseItem() throws IOException, SchemaException { + RootXNode xnode = getLexicalProcessor().read(source, context); + return doParseItem(xnode); + } + + private Item doParseItem(RootXNode xnode) throws IOException, SchemaException { + return (Item) prismContext.getPrismUnmarshaller().parseItem(xnode, itemDefinition, itemName, typeName, typeClass, context); + } + + IV doParseItemValue() throws IOException, SchemaException { + RootXNode root = getLexicalProcessor().read(source, context); + return doParseItemValue(root); + } + + private IV doParseItemValue(RootXNode root) throws IOException, SchemaException { + Item item = doParseItem(root); + return getSingleValue(item); + } + + @Nullable + private IV getSingleValue(Item item) { + if (item.isEmpty()) { + return null; + } else if (item.size() == 1) { + return item.getValues().get(0); } else { - return helpers.lexicalProcessorRegistry.findParser(source); + throw new IllegalStateException("Expected one item value, got " + item.getValues().size() + + " while parsing " + item); } } - protected List> doParseObjects() throws IOException, SchemaException { - LexicalProcessor lexicalProcessor = getLexicalProcessor(); - Collection xnodes = lexicalProcessor.readObjects(source, context); - List> objects = new ArrayList<>(); - for (XNode xnode : xnodes) { - PrismObject object = helpers.xnodeProcessor.parseObject(xnode, context); - objects.add(object); - } - return objects; + T doParseRealValue(Class clazz) throws IOException, SchemaException { + RootXNode root = getLexicalProcessor().read(source, context); + return doParseRealValue(clazz, root); } - protected PrismContainer doParseContainer(Class clazz) throws SchemaException, IOException { - XNode xnode = getLexicalProcessor().read(source, context); - return helpers.xnodeProcessor.unmarshalContainerValue(xnode, clazz, context); + @SuppressWarnings("unchecked") + private T doParseRealValue(Class clazz, RootXNode root) throws IOException, SchemaException { + if (clazz == null) { + ItemInfo info = ItemInfo.determine(itemDefinition, root.getRootElementName(), itemName, null, + root.getTypeQName(), typeName, null, ItemDefinition.class, context, prismContext.getSchemaRegistry()); + if (info.getItemDefinition() instanceof PrismContainerDefinition) { + clazz = ((PrismContainerDefinition) info.getItemDefinition()).getCompileTimeClass(); + } + if (clazz == null && info.getTypeName() != null) { + clazz = (Class) prismContext.getSchemaRegistry().determineClassForType(info.getTypeName()); + } + if (clazz == null) { + throw new IllegalArgumentException("Couldn't determine type for " + root); + } + } + + if (Containerable.class.isAssignableFrom(clazz)) { + PrismValue prismValue = doParseItemValue(root); + if (prismValue == null) { + return null; + } else if (prismValue instanceof PrismPropertyValue) { + return (T) ((PrismPropertyValue) prismValue).getValue(); + } else if (prismValue instanceof PrismContainerValue) { + return (T) ((PrismContainerValue) prismValue).asContainerable(); + } else if (prismValue instanceof PrismReferenceValue) { + return (T) prismValue; // TODO ok? + } else { + throw new IllegalStateException("Unsupported value: " + prismValue.getClass()); + } + } else { + return prismContext.getBeanConverter().unmarshall(root, clazz, context); + } } - protected PrismContainer doParseContainer(PrismContainerDefinition definition) throws SchemaException, IOException { - XNode xnode = getLexicalProcessor().read(source, context); - return helpers.xnodeProcessor.unmarshalContainerValue(xnode, definition, context); + @SuppressWarnings("unchecked") + T doParseRealValue() throws IOException, SchemaException { + return (T) doParseRealValue(typeClass); } - protected T doParseAtomicValue(QName typeName) throws IOException, SchemaException { - LexicalProcessor lexicalProcessor = getLexicalProcessor(); - XNode xnode = lexicalProcessor.read(source, context); - return helpers.xnodeProcessor.parseAtomicValue(xnode, typeName, context); + @SuppressWarnings("unchecked") + JAXBElement doParseAnyValueAsJAXBElement() throws IOException, SchemaException { + RootXNode root = getLexicalProcessor().read(source, context); + T real = (T) doParseRealValue(Object.class, root); + return real != null ? + new JAXBElement<>(root.getRootElementName(), (Class) real.getClass(), real) : + null; } - protected Object doParseAnyData() throws IOException, SchemaException { - LexicalProcessor lexicalProcessor = getLexicalProcessor(); - XNode xnode = lexicalProcessor.read(source, context); - return helpers.xnodeProcessor.parseAnyData(xnode, context); + RootXNode doParseToXNode() throws IOException, SchemaException { + return getLexicalProcessor().read(source, context); } - protected T doParseAnyValue() throws IOException, SchemaException { - LexicalProcessor lexicalProcessor = getLexicalProcessor(); - XNode xnode = lexicalProcessor.read(source, context); - return helpers.xnodeProcessor.parseAnyValue(xnode, context); + @NotNull + List> doParseObjects() throws IOException, SchemaException { + List xnodes = getLexicalProcessor().readObjects(source, context); + List> objects = new ArrayList<>(); + for (RootXNode xnode : xnodes) { + PrismObject object = prismContext.getPrismUnmarshaller() + .parseObject(xnode, null, null, null, PrismObjectDefinition.class, context); + objects.add(object); + } + return objects; } - protected JAXBElement doParseAnyValueAsJAXBElement() throws IOException, SchemaException { - LexicalProcessor lexicalProcessor = getLexicalProcessor(); - XNode xnode = lexicalProcessor.read(source, context); - return helpers.xnodeProcessor.parseAnyValueAsJAXBElement(xnode, context); + @Deprecated + Object doParseAnyData() throws IOException, SchemaException { + RootXNode xnode = getLexicalProcessor().read(source, context); + return prismContext.getPrismUnmarshaller().parseAnyData(xnode, context); } - protected XNode doParseToXNode() throws IOException, SchemaException { - return getLexicalProcessor().read(source, context); + @NotNull + private LexicalProcessor getLexicalProcessor() throws IOException { + if (language != null) { + return prismContext.getLexicalProcessorRegistry().processorFor(language); + } else { + return prismContext.getLexicalProcessorRegistry().findProcessor(source); + } } + //endregion } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismParserImplIO.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismParserImplIO.java index a89f5e0cd5f..da5e13fd193 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismParserImplIO.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismParserImplIO.java @@ -17,8 +17,7 @@ package com.evolveum.midpoint.prism.marshaller; import com.evolveum.midpoint.prism.*; -import com.evolveum.midpoint.prism.lex.LexicalHelpers; -import com.evolveum.midpoint.prism.xnode.XNode; +import com.evolveum.midpoint.prism.xnode.RootXNode; import com.evolveum.midpoint.util.exception.SchemaException; import org.jetbrains.annotations.NotNull; @@ -32,8 +31,9 @@ */ public class PrismParserImplIO extends PrismParserImpl { - public PrismParserImplIO(ParserSource source, String language, ParsingContext context, LexicalHelpers helpers) { - super(source, language, context, helpers); + public PrismParserImplIO(ParserSource source, String language, ParsingContext context, PrismContextImpl prismContext, + ItemDefinition itemDefinition, QName itemName, QName typeName, Class typeClass) { + super(source, language, context, prismContext, itemDefinition, itemName, typeName, typeClass); } @NotNull @@ -42,46 +42,45 @@ public PrismObject parse() throws SchemaException, IOE return doParse(); } - @NotNull @Override - public List> parseObjects() throws SchemaException, IOException { - return doParseObjects(); + public Item parseItem() throws SchemaException, IOException { + return doParseItem(); } - @NotNull @Override - public PrismContainer parseContainer(@NotNull Class clazz) throws SchemaException, IOException { - return doParseContainer(clazz); + public IV parseItemValue() throws SchemaException, IOException { + return doParseItemValue(); } - @NotNull @Override - public PrismContainer parseContainer(@NotNull PrismContainerDefinition definition) throws SchemaException, IOException { - return doParseContainer(definition); + public T parseRealValue(Class clazz) throws IOException, SchemaException { + return doParseRealValue(clazz); } @Override - public T parseAtomicValue(QName typeName) throws IOException, SchemaException { - return doParseAtomicValue(typeName); + public T parseRealValue() throws IOException, SchemaException { + return doParseRealValue(); } @Override - public Object parseAnyData() throws IOException, SchemaException { - return doParseAnyData(); + public JAXBElement parseRealValueToJaxbElement() throws IOException, SchemaException { + return doParseAnyValueAsJAXBElement(); } @Override - public T parseAnyValue() throws IOException, SchemaException { - return doParseAnyValue(); + public RootXNode parseToXNode() throws IOException, SchemaException { + return doParseToXNode(); } + @NotNull @Override - public JAXBElement parseAnyValueAsJAXBElement() throws IOException, SchemaException { - return doParseAnyValueAsJAXBElement(); + public List> parseObjects() throws SchemaException, IOException { + return doParseObjects(); } + @Deprecated @Override - public XNode parseToXNode() throws IOException, SchemaException { - return doParseToXNode(); + public Object parseAnyData() throws IOException, SchemaException { + return doParseAnyData(); } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismParserImplNoIO.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismParserImplNoIO.java index e55c656f2b0..d796bf2715f 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismParserImplNoIO.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismParserImplNoIO.java @@ -17,8 +17,7 @@ package com.evolveum.midpoint.prism.marshaller; import com.evolveum.midpoint.prism.*; -import com.evolveum.midpoint.prism.lex.LexicalHelpers; -import com.evolveum.midpoint.prism.xnode.XNode; +import com.evolveum.midpoint.prism.xnode.RootXNode; import com.evolveum.midpoint.util.exception.SchemaException; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -33,9 +32,9 @@ */ public class PrismParserImplNoIO extends PrismParserImpl implements PrismParserNoIO { - public PrismParserImplNoIO(ParserSource source, String language, ParsingContext context, - LexicalHelpers helpers) { - super(source, language, context, helpers); + public PrismParserImplNoIO(ParserSource source, String language, ParsingContext context, PrismContextImpl prismContext, + ItemDefinition itemDefinition, QName itemName, QName dataType, Class dataClass) { + super(source, language, context, prismContext, itemDefinition, itemName, dataType, dataClass); } @NotNull @@ -80,6 +79,30 @@ public PrismParserNoIO compat() { return (PrismParserNoIO) super.compat(); } + @NotNull + @Override + public PrismParserNoIO definition(ItemDefinition itemDefinition) { + return (PrismParserNoIO) super.definition(itemDefinition); + } + + @NotNull + @Override + public PrismParserNoIO name(QName itemName) { + return (PrismParserNoIO) super.name(itemName); + } + + @NotNull + @Override + public PrismParserNoIO type(QName typeName) { + return (PrismParserNoIO) super.type(typeName); + } + + @NotNull + @Override + public PrismParserNoIO type(Class typeClass) { + return (PrismParserNoIO) super.type(typeClass); + } + @NotNull @Override public PrismObject parse() throws SchemaException { @@ -90,77 +113,75 @@ public PrismObject parse() throws SchemaException { } } - @NotNull @Override - public List> parseObjects() throws SchemaException { + public Item parseItem() throws SchemaException { try { - return doParseObjects(); + return doParseItem(); } catch (IOException e) { throw new IllegalStateException(e); } } - @NotNull @Override - public PrismContainer parseContainer(@NotNull Class clazz) throws SchemaException { + public IV parseItemValue() throws SchemaException { try { - return doParseContainer(clazz); + return doParseItemValue(); } catch (IOException e) { throw new IllegalStateException(e); } } - @NotNull @Override - public PrismContainer parseContainer(@NotNull PrismContainerDefinition definition) - throws SchemaException { + public T parseRealValue(Class clazz) throws SchemaException { try { - return doParseContainer(definition); + return doParseRealValue(clazz); } catch (IOException e) { throw new IllegalStateException(e); } } @Override - public T parseAtomicValue(QName typeName) throws SchemaException { + public T parseRealValue() throws SchemaException { try { - return doParseAtomicValue(typeName); + return doParseRealValue(); } catch (IOException e) { throw new IllegalStateException(e); } } @Override - public Object parseAnyData() throws SchemaException { + public JAXBElement parseRealValueToJaxbElement() throws SchemaException { try { - return doParseAnyData(); + return doParseAnyValueAsJAXBElement(); } catch (IOException e) { throw new IllegalStateException(e); } } @Override - public T parseAnyValue() throws SchemaException { + public RootXNode parseToXNode() throws SchemaException { try { - return doParseAnyValue(); + return doParseToXNode(); } catch (IOException e) { throw new IllegalStateException(e); } } + @NotNull @Override - public JAXBElement parseAnyValueAsJAXBElement() throws SchemaException { + public List> parseObjects() throws SchemaException { try { - return doParseAnyValueAsJAXBElement(); + return doParseObjects(); } catch (IOException e) { throw new IllegalStateException(e); } } + @Deprecated @Override - public XNode parseToXNode() throws SchemaException { + public Object parseAnyData() throws SchemaException { try { - return doParseToXNode(); + return doParseAnyData(); } catch (IOException e) { throw new IllegalStateException(e); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismSerializerImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismSerializerImpl.java new file mode 100644 index 00000000000..6c1ceb08a55 --- /dev/null +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismSerializerImpl.java @@ -0,0 +1,155 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.prism.marshaller; + +import com.evolveum.midpoint.prism.*; +import com.evolveum.midpoint.prism.xnode.RootXNode; +import com.evolveum.midpoint.util.exception.SchemaException; +import org.jetbrains.annotations.NotNull; + +import javax.xml.bind.JAXBElement; +import javax.xml.namespace.QName; + +/** + * @author mederly + */ +public class PrismSerializerImpl implements PrismSerializer { + + @NotNull private final SerializerTarget target; + private final QName itemName; + private final ItemDefinition itemDefinition; + private final SerializationContext context; + + //region Setting up ============================================================================================= + public PrismSerializerImpl(@NotNull SerializerTarget target, QName itemName, ItemDefinition itemDefinition, + SerializationContext context) { + this.target = target; + this.itemName = itemName; + this.itemDefinition = itemDefinition; + this.context = context; + } + + @NotNull + @Override + public PrismSerializerImpl context(SerializationContext context) { + return new PrismSerializerImpl<>(this.target, itemName, itemDefinition, context); + } + + @NotNull + @Override + public PrismSerializerImpl root(QName elementName) { + return new PrismSerializerImpl<>(this.target, elementName, itemDefinition, this.context); + } + + @NotNull + @Override + public PrismSerializer definition(ItemDefinition itemDefinition) { + return new PrismSerializerImpl<>(this.target, itemName, itemDefinition, this.context); + } + + @NotNull + @Override + public PrismSerializerImpl options(SerializationOptions options) { + SerializationContext context; + if (this.context != null) { + context = this.context.clone(); + context.setOptions(options); + } else { + context = new SerializationContext(options); + } + return new PrismSerializerImpl<>(target, itemName, itemDefinition, context); + } + //endregion + + //region Serialization ============================================================================================= + + @NotNull + @Override + public T serialize(@NotNull Item item) throws SchemaException { + RootXNode xroot = getMarshaller().marshalItem(item, itemName, itemDefinition, context); + return target.write(xroot, context); + } + + @NotNull + @Override + public T serialize(@NotNull PrismValue value) throws SchemaException { + QName nameToUse; + if (itemName != null) { + nameToUse = itemName; + } else if (itemDefinition != null) { + nameToUse = itemDefinition.getName(); + } else if (value.getParent() != null) { + nameToUse = value.getParent().getElementName(); + } else { + // TODO derive from the value type itself? Not worth the effort. + throw new IllegalArgumentException("Item name nor definition is not known for " + value); + } + return serialize(value, nameToUse); + } + + @NotNull + @Override + public T serialize(@NotNull PrismValue value, @NotNull QName itemName) throws SchemaException { + RootXNode xroot = getMarshaller().marshalItemValueAsRoot(value, itemName, itemDefinition, context); + return target.write(xroot, context); + } + + @NotNull + @Override + public T serialize(@NotNull RootXNode xnode) throws SchemaException { + return target.write(xnode, context); + } + + @Override + public T serializeAtomicValue(Object value) throws SchemaException { + return serializeAtomicValue(value, itemName); + } + + @Override + public T serializeAtomicValue(Object realValue, QName itemName) throws SchemaException { + PrismValue prismValue; + if (realValue instanceof Containerable) { + prismValue = ((Containerable) realValue).asPrismContainerValue(); + } else { + prismValue = new PrismPropertyValue<>(realValue); + } + return serialize(prismValue, itemName); + } + + @Override + public T serializeAtomicValue(JAXBElement value) throws SchemaException { + return serializeAtomicValue(value.getValue(), value.getName()); // TODO declared type? + } + + @Override + public T serializeAnyData(Object value) throws SchemaException { + return serializeAnyData(value, itemName); + } + + @Override + public T serializeAnyData(Object value, QName itemName) throws SchemaException { + RootXNode xnode = getMarshaller().marshalAnyData(value, itemName, itemDefinition, context); + return target.write(xnode, context); + } + + @NotNull + private PrismMarshaller getMarshaller() { + return target.prismContext.getPrismMarshaller(); + } + //endregion + +} diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismUnmarshaller.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismUnmarshaller.java new file mode 100644 index 00000000000..450d4286c2a --- /dev/null +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismUnmarshaller.java @@ -0,0 +1,620 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.prism.marshaller; + +import java.util.Collection; +import java.util.Map.Entry; + +import javax.xml.XMLConstants; +import javax.xml.bind.JAXBElement; +import javax.xml.namespace.QName; + +import com.evolveum.midpoint.prism.*; +import com.evolveum.midpoint.prism.schema.PrismSchema; +import com.evolveum.midpoint.prism.schema.SchemaRegistry; +import com.evolveum.midpoint.util.logging.Trace; +import com.evolveum.midpoint.util.logging.TraceManager; +import com.evolveum.prism.xml.ns._public.query_3.SearchFilterType; + +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang.Validate; + +import com.evolveum.midpoint.prism.polystring.PolyString; +import com.evolveum.midpoint.prism.util.PrismUtil; +import com.evolveum.midpoint.prism.xnode.ListXNode; +import com.evolveum.midpoint.prism.xnode.MapXNode; +import com.evolveum.midpoint.prism.xnode.PrimitiveXNode; +import com.evolveum.midpoint.prism.xnode.RootXNode; +import com.evolveum.midpoint.prism.xnode.SchemaXNode; +import com.evolveum.midpoint.prism.xnode.XNode; +import com.evolveum.midpoint.util.DOMUtil; +import com.evolveum.midpoint.util.DisplayableValue; +import com.evolveum.midpoint.util.QNameUtil; +import com.evolveum.midpoint.util.exception.SchemaException; +import com.evolveum.midpoint.util.exception.SystemException; +import com.evolveum.prism.xml.ns._public.types_3.EvaluationTimeType; +import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; +import com.evolveum.prism.xml.ns._public.types_3.SchemaDefinitionType; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class PrismUnmarshaller { + + private static final Trace LOGGER = TraceManager.getTrace(PrismUnmarshaller.class); + + public static final QName ARTIFICIAL_OBJECT_NAME = new QName(XMLConstants.NULL_NS_URI, "anObject"); + + @NotNull + private PrismContext prismContext; + + public PrismUnmarshaller(@NotNull PrismContext prismContext) { + this.prismContext = prismContext; + } + + //region Public interface ======================================================== + + @SuppressWarnings("unchecked") + PrismObject parseObject(@NotNull RootXNode root, ItemDefinition itemDefinition, QName itemName, + QName typeName, Class typeClass, @NotNull ParsingContext pc) throws SchemaException { + ItemInfo itemInfo = ItemInfo.determine(itemDefinition, + root.getRootElementName(), itemName, ARTIFICIAL_OBJECT_NAME, + root.getTypeQName(), typeName, + typeClass, PrismObjectDefinition.class, pc, getSchemaRegistry()); + + XNode child = root.getSubnode(); + if (!(child instanceof MapXNode)) { + throw new IllegalArgumentException("Cannot parse object from " + child.getClass().getSimpleName() + ", we need a map"); + } + return (PrismObject) (Item) parseItemInternal(child, itemInfo.getItemName(), itemInfo.getItemDefinition(), pc); + } + + // to be used only from parsing routines (XNodeParser, BeanParser) + @SuppressWarnings("unchecked") + PrismObject parseObject(MapXNode map, PrismObjectDefinition objectDefinition, ParsingContext pc) throws SchemaException { + ItemInfo itemInfo = ItemInfo.determine(objectDefinition, + null, null, ARTIFICIAL_OBJECT_NAME, + map.getTypeQName(), null, + null, PrismObjectDefinition.class, pc, getSchemaRegistry()); + return (PrismObject) (Item) parseItemInternal(map, itemInfo.getItemName(), itemInfo.getItemDefinition(), pc); + } + + @SuppressWarnings("unchecked") + Item parseItem(@NotNull RootXNode root, + ItemDefinition itemDefinition, QName itemName, QName typeName, Class typeClass, + @NotNull ParsingContext pc) throws SchemaException { + + ItemInfo itemInfo = ItemInfo.determine(itemDefinition, + root.getRootElementName(), itemName, ARTIFICIAL_OBJECT_NAME, + root.getTypeQName(), typeName, + typeClass, ItemDefinition.class, pc, getSchemaRegistry()); + return parseItemInternal(root.getSubnode(), itemInfo.getItemName(), itemInfo.getItemDefinition(), pc); + } + + @Deprecated + public Object parseAnyData(@NotNull RootXNode root, ParsingContext pc) throws SchemaException { + // is the type name explicitly specified? (if not, guess that we have a string) + QName typeName = root.getTypeQName(); + if (typeName != null) { + ItemDefinition itemDefinition = getSchemaRegistry().findItemDefinitionByType(typeName); + if (itemDefinition != null) { + return parseItem(root, itemDefinition, null, null, null, pc); + } else { + return getBeanConverter().unmarshall(root, getSchemaRegistry().determineCompileTimeClass(typeName), pc); + } + } else { + // if type name is not known, we have to derive it from the element name + QName itemName = root.getRootElementName(); + ItemDefinition itemDefinition = getSchemaRegistry().findItemDefinitionByElementName(itemName); + if (itemDefinition == null) { + throw new SchemaException("Couldn't parse general object with no type name and unknown element name: " + itemName); + } + return parseItem(root, itemDefinition, itemName, null, null, pc); + } + } + //endregion + + //region Private methods ======================================================== + + + @SuppressWarnings("unchecked") + @NotNull + private Item parseItemInternal(@NotNull XNode node, + @NotNull QName itemName, ItemDefinition itemDefinition, @NotNull ParsingContext pc) throws SchemaException { + Validate.isTrue(!(node instanceof RootXNode)); + if (itemDefinition == null) { // Assume property in a container with runtime definition + return PrismProperty.createRaw(node, itemName, prismContext); + } else if (itemDefinition instanceof PrismContainerDefinition) { // also objects go here + return parseContainer(node, itemName, (PrismContainerDefinition) itemDefinition, pc); + } else if (itemDefinition instanceof PrismPropertyDefinition) { + return parseProperty(node, itemName, (PrismPropertyDefinition) itemDefinition, pc); + } else if (itemDefinition instanceof PrismReferenceDefinition) { + return parseReference(node, itemName, (PrismReferenceDefinition) itemDefinition, pc); + } else { + throw new IllegalArgumentException("Attempt to parse unknown definition type " + itemDefinition.getClass().getName()); + } + } + + @NotNull + private PrismContainer parseContainer(@NotNull XNode node, @NotNull QName itemName, + @NotNull PrismContainerDefinition containerDef, @NotNull ParsingContext pc) throws SchemaException { + PrismContainer container = containerDef.instantiate(itemName); + if (node instanceof ListXNode) { + for (XNode subNode : (ListXNode) node) { + container.add(parseContainerValue(subNode, containerDef, pc)); + } + } else { + container.add(parseContainerValue(node, containerDef, pc)); + if (node instanceof MapXNode && container instanceof PrismObject) { + MapXNode map = (MapXNode) node; + PrismObject object = (PrismObject) container; + object.setOid(getOid(map)); + object.setVersion(getVersion(map)); + } + } + return container; + } + + private String getOid(MapXNode xmap) throws SchemaException { + return xmap.getParsedPrimitiveValue(XNode.KEY_OID, DOMUtil.XSD_STRING); + } + + private String getVersion(MapXNode xmap) throws SchemaException { + return xmap.getParsedPrimitiveValue(XNode.KEY_VERSION, DOMUtil.XSD_STRING); + } + + private Long getContainerId(MapXNode xmap) throws SchemaException { + return xmap.getParsedPrimitiveValue(XNode.KEY_CONTAINER_ID, DOMUtil.XSD_LONG); + } + + private PrismContainerValue parseContainerValue(@NotNull XNode node, + @NotNull PrismContainerDefinition containerDef, @NotNull ParsingContext pc) throws SchemaException { + if (node instanceof MapXNode) { + return parseContainerValueFromMap((MapXNode) node, containerDef, pc); + } else if (node instanceof PrimitiveXNode) { + PrimitiveXNode prim = (PrimitiveXNode) node; + if (prim.isEmpty()) { + return containerDef.createValue(); + } else { + throw new IllegalArgumentException("Cannot parse container value from (non-empty) " + node); + } + } else { + throw new IllegalArgumentException("Cannot parse container value from " + node); + } + } + + private PrismContainerValue parseContainerValueFromMap(@NotNull MapXNode map, + @NotNull PrismContainerDefinition containerDef, @NotNull ParsingContext pc) throws SchemaException { + Long id = getContainerId(map); + + // override container definition, if explicit type is specified + ComplexTypeDefinition complexTypeDefinition = containerDef.getComplexTypeDefinition(); + if (map.getTypeQName() != null) { + ComplexTypeDefinition specificDef = getSchemaRegistry().findComplexTypeDefinitionByType(map.getTypeQName()); + if (specificDef != null) { + complexTypeDefinition = specificDef; + } else { + pc.warnOrThrow(LOGGER, "Unknown type " + map.getTypeQName() + " in " + map); + } + } + PrismContainerValue cval = new PrismContainerValue<>(null, null, null, id, complexTypeDefinition, prismContext); + for (Entry entry : map.entrySet()) { + QName itemName = entry.getKey(); + if (itemName == null) { + throw new IllegalArgumentException("Null item name while parsing " + map.debugDump()); + } + if (QNameUtil.match(itemName, XNode.KEY_CONTAINER_ID)) { + continue; + } + if (containerDef instanceof PrismObjectDefinition && + (QNameUtil.match(itemName, XNode.KEY_OID) || QNameUtil.match(itemName, XNode.KEY_VERSION))) { + continue; + } + ItemDefinition itemDef = locateItemDefinition(itemName, complexTypeDefinition, entry.getValue()); + + if (itemDef == null) { + if (complexTypeDefinition == null || complexTypeDefinition.isXsdAnyMarker() || complexTypeDefinition.isRuntimeSchema()) { + PrismSchema itemSchema = getSchemaRegistry().findSchemaByNamespace(itemName.getNamespaceURI()); + if (itemSchema != null) { + // If we already have schema for this namespace then a missing element is + // an error. We positively know that it is not in the schema. + pc.warnOrThrow(LOGGER, "Item " + itemName + " has no definition (schema present, in container " + + containerDef + ")" + "while parsing " + map.debugDump()); + } else { + // No definition for item, but the schema is runtime. the definition may come later. + // Null is OK here. The item will be parsed as "raw" + } + } else { // complex type definition is static + pc.warnOrThrow(LOGGER, "Item " + itemName + " has no definition (in container value " + + complexTypeDefinition + ")" + "while parsing " + map.debugDump()); + continue; // don't even attempt to parse it + } + } + Item item; + if (entry.getValue() == null) { + if (itemDef != null) { + item = itemDef.instantiate(); // TODO or skip the creation altogether? + } else { + item = null; + } + } else { + item = parseItemInternal(entry.getValue(), itemName, itemDef, pc); + } + // Merge must be here, not just add. Some items (e.g. references) have alternative + // names and representations and these cannot be processed as one map or list + if (item != null) { + cval.merge(item); + } + } + return cval; + } + + @NotNull + private PrismProperty parseProperty(@NotNull XNode node, @NotNull QName itemName, + @NotNull PrismPropertyDefinition itemDefinition, @NotNull ParsingContext pc) throws SchemaException { + Validate.isTrue(!(node instanceof RootXNode)); + + PrismProperty property = itemDefinition.instantiate(); + if (node instanceof ListXNode) { + ListXNode listNode = (ListXNode) node; + if (!itemDefinition.isMultiValue() && listNode.size() > 1) { + throw new SchemaException("Attempt to store multiple values in single-valued property " + itemName); + } + for (XNode subNode : listNode) { + PrismPropertyValue pval = parsePropertyValue(subNode, itemDefinition, pc); + if (pval != null) { + property.add(pval); + } + } + } else if (node instanceof MapXNode || node instanceof PrimitiveXNode) { + PrismPropertyValue pval = parsePropertyValue(node, itemDefinition, pc); + if (pval != null) { + property.add(pval); + } + } else if (node instanceof SchemaXNode) { + SchemaDefinitionType schemaDefType = getBeanConverter().unmarshalSchemaDefinitionType((SchemaXNode) node); + @SuppressWarnings("unchecked") + PrismPropertyValue val = new PrismPropertyValue(schemaDefType); + property.add(val); + } else { + throw new IllegalArgumentException("Cannot parse property from " + node); + } + return property; + } + + private PrismPropertyValue parsePropertyValue(@NotNull XNode node, + @NotNull PrismPropertyDefinition definition, @NotNull ParsingContext pc) throws SchemaException { + + T realValue; + if (node instanceof PrimitiveXNode) { + @SuppressWarnings("unchecked") + PrimitiveXNode primitiveNode = (PrimitiveXNode) node; + realValue = parsePropertyRealValueFromPrimitive(primitiveNode, definition, pc); + } else if (node instanceof MapXNode) { + realValue = parsePropertyRealValueFromMap((MapXNode) node, definition, pc); + } else { + throw new IllegalArgumentException("Cannot parse property value from " + node.debugDump()); + } + return realValue != null ? new PrismPropertyValue(realValue) : null; + } + + private T parsePropertyRealValueFromPrimitive(@NotNull PrimitiveXNode primitiveNode, + @NotNull PrismPropertyDefinition definition, @NotNull ParsingContext pc) throws SchemaException { + + QName typeName = definition.getTypeName(); + T realValue; + if (getBeanConverter().canProcess(typeName)) { + // Primitive elements may also have complex Java representations (e.g. enums) + realValue = getBeanConverter().unmarshallPrimitive(primitiveNode, typeName, pc); + } else { + try { + realValue = primitiveNode.getParsedValue(typeName, pc.getEvaluationMode()); + } catch (SchemaException e) { + pc.warnOrThrow(LOGGER, "Couldn't parse primitive value of type " + typeName + ". Value: " + primitiveNode.getStringValue() + + ".\nDefinition: " + definition.debugDump(), e); + return null; + } + } + + if (!isValueAllowed(realValue, definition.getAllowedValues())) { + pc.warnOrThrow(LOGGER, "Skipping unknown value of type " + typeName + ". Value: " + primitiveNode.getStringValue()); + return null; + } + + if (realValue == null) { + return null; + } else if (realValue instanceof PolyStringType) { + PolyStringType polyStringType = (PolyStringType) realValue; + realValue = (T) new PolyString(polyStringType.getOrig(), polyStringType.getNorm()); + } else if (realValue instanceof String && typeName.equals(PolyStringType.COMPLEX_TYPE)) { + String val = (String) realValue; + realValue = (T) new PolyString(val); + } + + PrismUtil.recomputeRealValue(realValue, prismContext); + return realValue; + } + + private T parsePropertyRealValueFromMap(@NotNull MapXNode xmap, @NotNull PrismPropertyDefinition propertyDefinition, + @NotNull ParsingContext pc) + throws SchemaException { + QName typeName = propertyDefinition.getTypeName(); + if (getBeanConverter().canProcess(typeName)) { + return getBeanConverter().unmarshall(xmap, typeName, pc); + } else { + if (propertyDefinition.isRuntimeSchema()) { + throw new SchemaException("Complex run-time properties are not supported: type " + typeName + " from " + xmap); + } else { + throw new SystemException("Cannot parse compile-time property " + propertyDefinition.getName() + " type " + typeName + " from " + xmap); + } + } + } + + private boolean isValueAllowed(T realValue, Collection> collection) { + if (CollectionUtils.isEmpty(collection)) { + return true; + } + for (DisplayableValue o : collection) { + if (realValue.equals(o.getValue())) { + return true; + } + } + return false; + } + + @NotNull + private PrismReference parseReference(@NotNull XNode node, @NotNull QName itemName, + @NotNull PrismReferenceDefinition definition, @NotNull ParsingContext pc) throws SchemaException { + PrismReference ref = definition.instantiate(); + if (node instanceof ListXNode) { + ListXNode listNode = (ListXNode) node; + if (!definition.isMultiValue() && listNode.size() > 1) { + throw new SchemaException("Attempt to store multiple values in single-valued reference " + itemName); + } + for (XNode subNode : listNode) { + ref.add(parseReferenceValueFromXNode(subNode, definition, itemName, pc)); + } + } else if (node instanceof MapXNode) { + ref.add(parseReferenceValueFromXNode(node, definition, itemName, pc)); + } else if (node instanceof PrimitiveXNode) { + // empty + } else { + throw new IllegalArgumentException("Cannot parse reference from " + node); + } + return ref; + } + + @NotNull + private PrismReferenceValue parseReferenceValueFromXNode(@NotNull XNode node, + @NotNull PrismReferenceDefinition definition, @NotNull QName itemName, @NotNull ParsingContext pc) throws SchemaException { + /* + * We distinguish between "real" references and composite objects by + * (1) looking at type QName of XNode passed (whether it's ObjectType or ObjectReferenceType) + * (2) comparing itemName and name from reference definition - e.g. linkRef vs. link + */ + boolean isComposite; + if (node.getTypeQName() != null) { + QName typeName = node.getTypeQName(); + ItemDefinition contentDefinition = getSchemaRegistry().findItemDefinitionByType(typeName); + isComposite = contentDefinition instanceof PrismObjectDefinition; + } else { + isComposite = !QNameUtil.match(itemName, definition.getName()); + } + + if (isComposite) { + return parseReferenceValueAsCompositeObject(node, definition, pc); // This is a composite object (complete object stored inside reference) + } else { + return parseReferenceValueAsReference(node, definition, pc); // This is "real" reference (oid, and nothing more) + } + } + + private PrismReferenceValue parseReferenceValueAsReference(@NotNull XNode xnode, @NotNull PrismReferenceDefinition definition, + @NotNull ParsingContext pc) throws SchemaException { + if (!(xnode instanceof MapXNode)) { + throw new IllegalArgumentException("Cannot parse reference from " + xnode); + } + MapXNode map = (MapXNode) xnode; + + String oid = map.getParsedPrimitiveValue(XNode.KEY_REFERENCE_OID, DOMUtil.XSD_STRING); + PrismReferenceValue refVal = new PrismReferenceValue(oid); + + QName type = map.getParsedPrimitiveValue(XNode.KEY_REFERENCE_TYPE, DOMUtil.XSD_QNAME); + if (type == null) { + if (!pc.isAllowMissingRefTypes()) { + type = definition.getTargetTypeName(); + if (type == null) { + throw new SchemaException("Target type specified neither in reference nor in the schema"); + } + } + } else { + if (QNameUtil.noNamespace(type)) { + type = getSchemaRegistry().resolveUnqualifiedTypeName(type); + } + QName defTargetType = definition.getTargetTypeName(); + if (defTargetType != null) { + if (!(prismContext.getSchemaRegistry().isAssignableFrom(defTargetType, type))) { + throw new SchemaException("Target type specified in reference (" + type + + ") does not match target type in schema (" + defTargetType + ")"); + } + } + } + PrismObjectDefinition objectDefinition = null; + if (type != null) { + objectDefinition = getSchemaRegistry().findObjectDefinitionByType(type); + if (objectDefinition == null) { + throw new SchemaException("No definition for type " + type + " in reference"); + } + refVal.setTargetType(type); + } + + QName relationAttribute = map.getParsedPrimitiveValue(XNode.KEY_REFERENCE_RELATION, DOMUtil.XSD_QNAME); + refVal.setRelation(relationAttribute); + + refVal.setDescription(map.getParsedPrimitiveValue(XNode.KEY_REFERENCE_DESCRIPTION, DOMUtil.XSD_STRING)); + + refVal.setFilter(parseFilter(map.get(XNode.KEY_REFERENCE_FILTER), pc)); + + String resolutionTimeString = map.getParsedPrimitiveValue(XNode.KEY_REFERENCE_RESOLUTION_TIME, DOMUtil.XSD_STRING); + if (resolutionTimeString != null) { + EvaluationTimeType resolutionTime = EvaluationTimeType.fromValue(resolutionTimeString); + refVal.setResolutionTime(resolutionTime); + } + + XNode xnodeForTargetName = map.get(XNode.KEY_REFERENCE_TARGET_NAME); + if (xnodeForTargetName != null) { + PolyStringType targetName = getBeanConverter().unmarshall(xnodeForTargetName, PolyStringType.class, pc); + refVal.setTargetName(targetName); + } + + XNode xrefObject = map.get(XNode.KEY_REFERENCE_OBJECT); + if (xrefObject != null) { + if (!(xrefObject instanceof MapXNode)) { + throw new SchemaException("Cannot parse object from " + xrefObject); + } + if (type == null) { + throw new SchemaException("Cannot parse object from " + xrefObject + " without knowing its type"); + } + PrismObject object = parseObject((MapXNode) xrefObject, objectDefinition, pc); + setReferenceObject(refVal, object); + } + + return refVal; + } + + private void setReferenceObject(PrismReferenceValue refVal, PrismObject object) throws SchemaException { + refVal.setObject(object); + if (object.getOid() != null) { + if (refVal.getOid() == null) { + refVal.setOid(object.getOid()); + } else { + if (!refVal.getOid().equals(object.getOid())) { + throw new SchemaException("OID in reference (" + refVal.getOid() + ") does not match OID in composite object (" + object.getOid() + ")"); + } + } + } + QName objectTypeName = object.getDefinition().getTypeName(); + if (refVal.getTargetType() == null) { + refVal.setTargetType(objectTypeName); + } else { + if (!refVal.getTargetType().equals(objectTypeName)) { + throw new SchemaException("Target type in reference (" + refVal.getTargetType() + ") does not match type in composite object (" + objectTypeName + ")"); + } + } + } + + private PrismReferenceValue parseReferenceValueAsCompositeObject(XNode node, + PrismReferenceDefinition definition, ParsingContext pc) throws SchemaException { + if (!(node instanceof MapXNode)) { + throw new IllegalArgumentException("Cannot parse reference composite object from " + node); + } + MapXNode map = (MapXNode) node; + QName targetTypeName = definition.getTargetTypeName(); + PrismObjectDefinition objectDefinition = null; + if (map.getTypeQName() != null) { + objectDefinition = getSchemaRegistry().findObjectDefinitionByType(map.getTypeQName()); + } + if (objectDefinition == null && targetTypeName != null) { + objectDefinition = getSchemaRegistry().findObjectDefinitionByType(targetTypeName); + } + if (objectDefinition == null) { + throw new SchemaException("No object definition for composite object in reference element " + + definition.getCompositeObjectElementName()); + } + + PrismObject compositeObject; + try { + compositeObject = parseObject(map, objectDefinition, pc); + } catch (SchemaException e) { + throw new SchemaException(e.getMessage() + " while parsing composite object in reference element " + + definition.getCompositeObjectElementName(), e); + } + + PrismReferenceValue refVal = new PrismReferenceValue(); + setReferenceObject(refVal, compositeObject); + ((PrismReferenceDefinitionImpl) definition).setComposite(true); + return refVal; + } + + private SearchFilterType parseFilter(XNode xnode, ParsingContext pc) throws SchemaException { + if (xnode == null) { + return null; + } + if (xnode.isEmpty()) { + return null; + } + return SearchFilterType.createFromXNode(xnode, prismContext); + } + + private ItemDefinition locateItemDefinition(@NotNull QName itemName, + @Nullable ComplexTypeDefinition complexTypeDefinition, + XNode xnode) throws SchemaException { + return getSchemaRegistry() + .locateItemDefinition(itemName, complexTypeDefinition, qName -> resolveDynamicItemDefinition(qName, xnode)); + } + + private ItemDefinition resolveDynamicItemDefinition(QName itemName, XNode node) { + if (node == null) { + return null; + } + QName typeName = node.getTypeQName(); + if (typeName == null) { + if (node instanceof ListXNode) { + // there may be type definitions in individual list members + for (XNode subNode : ((ListXNode) node)) { + ItemDefinition subdef = resolveDynamicItemDefinition(itemName, subNode); + // TODO: make this smarter, e.g. detect conflicting type definitions + if (subdef != null) { + return subdef; + } + } + } + } + if (typeName == null) { + return null; + } + + PrismPropertyDefinitionImpl propDef = new PrismPropertyDefinitionImpl(itemName, typeName, prismContext); + Integer maxOccurs = node.getMaxOccurs(); + if (maxOccurs != null) { + propDef.setMaxOccurs(maxOccurs); + } else { + // Make this multivalue by default, this is more "open" + propDef.setMaxOccurs(-1); + } + propDef.setDynamic(true); + return propDef; + } + + //endregion + + + //endregion + private PrismBeanConverter getBeanConverter() { + return ((PrismContextImpl) prismContext).getBeanConverter(); + } + + private SchemaRegistry getSchemaRegistry() { + return prismContext.getSchemaRegistry(); + } + + //TODO + public ItemDefinition locateItemDefinition( + @NotNull PrismContainerDefinition containerDefinition, @NotNull QName itemName, @Nullable XNode xnode) + throws SchemaException { + return locateItemDefinition(itemName, containerDefinition.getComplexTypeDefinition(), xnode); + } + + +} diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/QueryConvertor.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/QueryConvertor.java index 0533aec6eff..ac4ee772339 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/QueryConvertor.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/QueryConvertor.java @@ -25,6 +25,7 @@ import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.query.*; +import com.evolveum.midpoint.prism.xnode.*; import com.evolveum.prism.xml.ns._public.query_3.SearchFilterType; import com.evolveum.prism.xml.ns._public.types_3.ObjectReferenceType; @@ -33,11 +34,6 @@ import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.query.OrgFilter.Scope; -import com.evolveum.midpoint.prism.util.PrismUtil; -import com.evolveum.midpoint.prism.xnode.ListXNode; -import com.evolveum.midpoint.prism.xnode.MapXNode; -import com.evolveum.midpoint.prism.xnode.PrimitiveXNode; -import com.evolveum.midpoint.prism.xnode.XNode; import com.evolveum.midpoint.util.DOMUtil; import com.evolveum.midpoint.util.QNameUtil; import com.evolveum.midpoint.util.exception.SchemaException; @@ -283,13 +279,14 @@ private static ObjectFilter parseComparisonFilter(QN } if (valueXnode != null) { - Item item = parseItem(valueXnode, itemName, itemDefinition, prismContext); - if (!isEq && item.getValues().size() != 1) { - throw new SchemaException("Expected exactly one value, got " + item.getValues().size() + " instead"); - } if (preliminaryParsingOnly) { return null; } else { + RootXNode valueRoot = new RootXNode(ELEMENT_VALUE, valueXnode); + Item item = parseItem(valueRoot, itemName, itemDefinition, prismContext); + if (!isEq && item.getValues().size() != 1) { + throw new SchemaException("Expected exactly one value, got " + item.getValues().size() + " instead"); + } if (isEq) { List> values = item.getValues(); PrismValue.clearParent(values); @@ -324,8 +321,8 @@ private static ObjectFilter parseComparisonFilter(QN Entry expressionEntry = clauseXMap.getSingleEntryThatDoesNotMatch( ELEMENT_VALUE, ELEMENT_MATCHING, ELEMENT_PATH); if (expressionEntry != null) { - PrismPropertyValue expressionPropertyValue = prismContext.getXnodeProcessor().parsePrismPropertyFromGlobalXNodeValue( - expressionEntry, ParsingContext.createDefault()); + RootXNode expressionRoot = clauseXMap.getEntryAsRoot(expressionEntry.getKey()); + PrismPropertyValue expressionPropertyValue = prismContext.parserFor(expressionRoot).parseItemValue(); if (preliminaryParsingOnly) { return null; } else { @@ -435,8 +432,12 @@ private static RefFilter parseRefFilter(MapXNode claus XNode valueXnode = clauseXMap.get(ELEMENT_VALUE); if (valueXnode != null) { - Item item = prismContext.getXnodeProcessor().parseItem(valueXnode, itemName, itemDefinition, - ParsingContext.allowMissingRefTypes()); + RootXNode valueRoot = new RootXNode(ELEMENT_VALUE, valueXnode); + Item item = prismContext.parserFor(valueRoot) + .name(itemName) + .definition(itemDefinition) + .context(ParsingContext.allowMissingRefTypes()) + .parseItem(); if (preliminaryParsingOnly) { return null; } @@ -470,8 +471,8 @@ private static ExpressionWrapper parseExpression(MapXNode xmap, PrismContext pri ELEMENT_VALUE, ELEMENT_MATCHING, ELEMENT_PATH); if (expressionEntry != null) { - PrismPropertyValue expressionPropertyValue = prismContext.getXnodeProcessor() - .parsePrismPropertyFromGlobalXNodeValue(expressionEntry, ParsingContext.createDefault()); + RootXNode expressionRoot = new RootXNode(expressionEntry); + PrismPropertyValue expressionPropertyValue = prismContext.parserFor(expressionRoot).parseItemValue(); ExpressionWrapper expressionWrapper = new ExpressionWrapper(); expressionWrapper.setExpression(expressionPropertyValue.getValue()); return expressionWrapper; @@ -495,7 +496,7 @@ private static SubstringFilter parseSubstringFilter(Ma ItemDefinition itemDefinition = locateItemDefinition(valueXnode, itemPath, pcd, prismContext); - Item item = parseItem(valueXnode, itemName, itemDefinition, prismContext); + Item item = parseItem(new RootXNode(ELEMENT_VALUE, valueXnode), itemName, itemDefinition, prismContext); Boolean anchorStart = clauseXMap.getParsedPrimitiveValue(ELEMENT_ANCHOR_START, DOMUtil.XSD_BOOLEAN); if (anchorStart == null) { @@ -606,12 +607,16 @@ private static QName getMatchingRule(MapXNode xmap) throws SchemaException{ } } - private static Item parseItem(XNode valueXnode, QName itemName, ItemDefinition itemDefinition, PrismContext prismContext) throws SchemaException{ + private static Item parseItem(RootXNode root, QName itemName, ItemDefinition itemDefinition, PrismContext prismContext) throws SchemaException{ Item item; if (prismContext == null) { - item = (Item) XNodeProcessor.parsePrismPropertyRaw(valueXnode, itemName, null); + item = (Item) PrismProperty.createRaw(root.getSubnode(), itemName, null); } else { - item = prismContext.getXnodeProcessor().parseItem(valueXnode, itemName, itemDefinition, ParsingContext.allowMissingRefTypes()); + item = prismContext.parserFor(root) + .name(itemName) + .definition(itemDefinition) + .context(ParsingContext.allowMissingRefTypes()) + .parseItem(); } if (item.getValues().size() < 1 ) { @@ -628,7 +633,7 @@ private static ItemDefinition locateItemDefinition(XNo if (itemDefinition == null) { ItemPath rest = itemPath.tail(); QName first = ItemPath.getName(itemPath.first()); - itemDefinition = prismContext.getXnodeProcessor().locateItemDefinition(pcd, first, valueXnode); + itemDefinition = ((PrismContextImpl) prismContext).getPrismUnmarshaller().locateItemDefinition(pcd, first, valueXnode); if (rest.isEmpty()) { return itemDefinition; } else{ @@ -647,10 +652,10 @@ public static SearchFilterType createSearchFilterType(ObjectFilter filter, Prism } public static MapXNode serializeFilter(ObjectFilter filter, PrismContext prismContext) throws SchemaException{ - return serializeFilter(filter, PrismUtil.getXnodeProcessor(prismContext).createSerializer()); + return serializeFilter(filter, prismContext.xnodeSerializer()); } - private static MapXNode serializeFilter(ObjectFilter filter, XNodeSerializer xnodeSerializer) throws SchemaException{ + private static MapXNode serializeFilter(ObjectFilter filter, PrismSerializer xnodeSerializer) throws SchemaException{ // null or primitive filters if (filter == null) { return null; @@ -693,16 +698,16 @@ private static MapXNode serializeFilter(ObjectFilter filter, XNodeSerializer xno } - private static MapXNode serializeAndFilter(AndFilter filter, XNodeSerializer xnodeSerilizer) throws SchemaException{ + private static MapXNode serializeAndFilter(AndFilter filter, PrismSerializer xnodeSerilizer) throws SchemaException{ return createFilter(CLAUSE_AND, serializeNaryLogicalSubfilters(filter.getConditions(), xnodeSerilizer)); } - private static MapXNode serializeOrFilter(OrFilter filter, XNodeSerializer xnodeSerilizer) throws SchemaException{ + private static MapXNode serializeOrFilter(OrFilter filter, PrismSerializer xnodeSerilizer) throws SchemaException{ MapXNode map = createFilter(CLAUSE_OR, serializeNaryLogicalSubfilters(filter.getConditions(), xnodeSerilizer)); return map; } - private static MapXNode serializeNaryLogicalSubfilters(List objectFilters, XNodeSerializer xnodeSerilizer) throws SchemaException{ + private static MapXNode serializeNaryLogicalSubfilters(List objectFilters, PrismSerializer xnodeSerilizer) throws SchemaException{ MapXNode filters = new MapXNode(); for (ObjectFilter of : objectFilters) { MapXNode subFilter = serializeFilter(of, xnodeSerilizer); @@ -711,7 +716,7 @@ private static MapXNode serializeNaryLogicalSubfilters(List object return filters; } - private static MapXNode serializeNotFilter(NotFilter filter, XNodeSerializer xnodeSerializer) throws SchemaException{ + private static MapXNode serializeNotFilter(NotFilter filter, PrismSerializer xnodeSerializer) throws SchemaException{ return createFilter(CLAUSE_NOT, serializeFilter(filter.getFilter(), xnodeSerializer)); } @@ -722,7 +727,7 @@ private static MapXNode createFilter(QName clauseNot, MapXNode value) { return map; } - private static MapXNode serializeInOidFilter(InOidFilter filter, XNodeSerializer xnodeSerializer) throws SchemaException { + private static MapXNode serializeInOidFilter(InOidFilter filter, PrismSerializer xnodeSerializer) throws SchemaException { MapXNode clauseMap = new MapXNode(); if (filter.getOids() != null && !filter.getOids().isEmpty()) { ListXNode valuesNode = new ListXNode(); @@ -743,7 +748,7 @@ private static MapXNode serializeInOidFilter(InOidFilter filter, XNodeSerializer return createFilter(CLAUSE_IN_OID, clauseMap); } - private static MapXNode serializeComparisonFilter(PropertyValueFilter filter, XNodeSerializer xnodeSerializer) throws SchemaException{ + private static MapXNode serializeComparisonFilter(PropertyValueFilter filter, PrismSerializer xnodeSerializer) throws SchemaException{ MapXNode map = new MapXNode(); QName clause; if (filter instanceof EqualFilter) { @@ -759,7 +764,7 @@ private static MapXNode serializeComparisonFilter(PropertyValueFilter fil return map; } - private static MapXNode serializeValueFilter(ValueFilter filter, XNodeSerializer xnodeSerializer) throws SchemaException { + private static MapXNode serializeValueFilter(ValueFilter filter, PrismSerializer xnodeSerializer) throws SchemaException { MapXNode map = new MapXNode(); serializeMatchingRule(filter, map); serializePath(map, filter.getFullPath(), filter); @@ -771,7 +776,7 @@ private static MapXNode seriali if (val.getParent() == null) { val.setParent(filter); } - XNode valNode = xnodeSerializer.serializeItemValue(val, filter.getDefinition()); + XNode valNode = xnodeSerializer.definition(filter.getDefinition()).serialize(val).getSubnode(); if (filter instanceof RefFilter) { // TODO shouldn't we do this in all cases? valNode.setExplicitTypeDeclaration(true); if (valNode.getTypeQName() == null) { @@ -795,12 +800,12 @@ private static MapXNode seriali return map; } - private static MapXNode serializeRefFilter(RefFilter filter, XNodeSerializer xnodeSerializer) throws SchemaException { + private static MapXNode serializeRefFilter(RefFilter filter, PrismSerializer xnodeSerializer) throws SchemaException { MapXNode map = createFilter(CLAUSE_REF, serializeValueFilter(filter, xnodeSerializer)); return map; } - private static MapXNode serializeSubstringFilter(SubstringFilter filter, XNodeSerializer xnodeSerializer) throws SchemaException{ + private static MapXNode serializeSubstringFilter(SubstringFilter filter, PrismSerializer xnodeSerializer) throws SchemaException{ MapXNode map = new MapXNode(); MapXNode content = serializeValueFilter(filter, xnodeSerializer); if (filter.isAnchorStart()) { @@ -813,7 +818,7 @@ private static MapXNode serializeSubstringFilter(SubstringFilter filter, return map; } - private static MapXNode serializeTypeFilter(TypeFilter filter, XNodeSerializer xnodeSerializer) throws SchemaException{ + private static MapXNode serializeTypeFilter(TypeFilter filter, PrismSerializer xnodeSerializer) throws SchemaException{ MapXNode content = new MapXNode(); content.put(ELEMENT_TYPE, createPrimitiveXNode(filter.getType(), DOMUtil.XSD_QNAME)); if (filter.getFilter() != null){ @@ -822,7 +827,7 @@ private static MapXNode serializeTypeFilter(TypeFilter filter, XNodeSerializer x return createFilter(CLAUSE_TYPE, content); } - private static MapXNode serializeExistsFilter(ExistsFilter filter, XNodeSerializer xnodeSerializer) throws SchemaException{ + private static MapXNode serializeExistsFilter(ExistsFilter filter, PrismSerializer xnodeSerializer) throws SchemaException{ MapXNode content = new MapXNode(); serializePath(content, filter.getFullPath(), filter); if (filter.getFilter() != null){ @@ -831,7 +836,7 @@ private static MapXNode serializeExistsFilter(ExistsFilter filter, XNodeSerializ return createFilter(CLAUSE_EXISTS, content); } - private static MapXNode serializeOrgFilter(OrgFilter filter, XNodeSerializer xnodeSerializer) { + private static MapXNode serializeOrgFilter(OrgFilter filter, PrismSerializer xnodeSerializer) { MapXNode map = new MapXNode(); if (filter.getOrgRef() != null) { @@ -926,4 +931,31 @@ public static void revive (ObjectFilter filter, final PrismContext prismContext) public static void parseFilterPreliminarily(MapXNode xfilter, PrismContext prismContext) throws SchemaException { parseFilterInternal(xfilter, null, true, prismContext); } + +// public PrismPropertyValue parsePrismPropertyFromGlobalXNodeValue(Entry entry, ParsingContext pc) throws SchemaException { +// Validate.notNull(entry); +// +// QName globalElementName = entry.getKey(); +// if (globalElementName == null) { +// throw new SchemaException("No global element name to look for"); +// } +// ItemDefinition itemDefinition = getSchemaRegistry().resolveGlobalItemDefinition(globalElementName); +// if (itemDefinition == null) { +// throw new SchemaException("No definition for item " + globalElementName); +// } +// +// if (itemDefinition instanceof PrismPropertyDefinition) { +// PrismProperty prismProperty = parsePrismProperty(entry.getValue(), globalElementName, (PrismPropertyDefinition) itemDefinition, pc); +// if (prismProperty.size() > 1) { +// throw new SchemaException("Retrieved more than one value from globally defined element " + globalElementName); +// } else if (prismProperty.size() == 0) { +// return null; +// } else { +// return (PrismPropertyValue) prismProperty.getValues().get(0); +// } +// } else { +// throw new IllegalArgumentException("Parsing global elements with definitions other than PrismPropertyDefinition is not supported yet: element = " + globalElementName + " definition kind = " + itemDefinition.getClass().getSimpleName()); +// } +// } + } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/XNodeProcessor.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/XNodeProcessor.java deleted file mode 100644 index 29a97ecb6d0..00000000000 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/XNodeProcessor.java +++ /dev/null @@ -1,1300 +0,0 @@ -/* - * Copyright (c) 2010-2016 Evolveum - * - * 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 com.evolveum.midpoint.prism.marshaller; - -import java.util.Collection; -import java.util.Map.Entry; - -import javax.xml.bind.JAXBElement; -import javax.xml.namespace.QName; - -import com.evolveum.midpoint.prism.*; -import com.evolveum.midpoint.prism.schema.SchemaRegistry; -import com.evolveum.midpoint.util.JAXBUtil; -import com.evolveum.midpoint.util.logging.LoggingUtils; -import com.evolveum.midpoint.util.logging.Trace; -import com.evolveum.midpoint.util.logging.TraceManager; -import com.evolveum.prism.xml.ns._public.query_3.SearchFilterType; - -import org.apache.commons.lang.StringUtils; -import org.apache.commons.lang.Validate; - -import com.evolveum.midpoint.prism.path.ItemPath; -import com.evolveum.midpoint.prism.polystring.PolyString; -import com.evolveum.midpoint.prism.schema.PrismSchema; -import com.evolveum.midpoint.prism.util.PrismUtil; -import com.evolveum.midpoint.prism.xnode.ListXNode; -import com.evolveum.midpoint.prism.xnode.MapXNode; -import com.evolveum.midpoint.prism.xnode.PrimitiveXNode; -import com.evolveum.midpoint.prism.xnode.RootXNode; -import com.evolveum.midpoint.prism.xnode.SchemaXNode; -import com.evolveum.midpoint.prism.xnode.XNode; -import com.evolveum.midpoint.util.DOMUtil; -import com.evolveum.midpoint.util.DisplayableValue; -import com.evolveum.midpoint.util.QNameUtil; -import com.evolveum.midpoint.util.exception.SchemaException; -import com.evolveum.midpoint.util.exception.SystemException; -import com.evolveum.prism.xml.ns._public.types_3.EvaluationTimeType; -import com.evolveum.prism.xml.ns._public.types_3.ItemPathType; -import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; -import com.evolveum.prism.xml.ns._public.types_3.ProtectedStringType; -import com.evolveum.prism.xml.ns._public.types_3.SchemaDefinitionType; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -public class XNodeProcessor { - - private static final Trace LOGGER = TraceManager.getTrace(XNodeProcessor.class); - - public static final String ARTIFICIAL_OBJECT_NAME = "anObject"; - - private PrismContext prismContext; - - public XNodeProcessor() { - } - - public XNodeProcessor(PrismContext prismContext) { - this.prismContext = prismContext; - } - - //region Parsing prism objects - public PrismObject parseObject(XNode xnode, ParsingContext pc) throws SchemaException { - if (xnode instanceof RootXNode) { - return parseObject((RootXNode) xnode, pc); - } else if (xnode instanceof MapXNode) { - return parseObject((MapXNode) xnode, pc); - } else { - throw new IllegalArgumentException("Cannot parse object from " + xnode); - } - } - - public PrismObject parseObject(RootXNode rootXnode, ParsingContext pc) throws SchemaException { - QName rootElementName = rootXnode.getRootElementName(); - PrismObjectDefinition objectDefinition; - if (rootXnode.getTypeQName() != null) { - objectDefinition = getSchemaRegistry().findObjectDefinitionByType(rootXnode.getTypeQName()); - if (objectDefinition == null) { - throw new SchemaException("No object definition for type " + rootXnode.getTypeQName()); - } - } else { - objectDefinition = getSchemaRegistry().findObjectDefinitionByElementName(rootElementName); - if (objectDefinition == null) { - throw new SchemaException("No object definition for element name " + rootElementName); - } - } - XNode subnode = rootXnode.getSubnode(); - if (!(subnode instanceof MapXNode)) { - throw new IllegalArgumentException("Cannot parse object from " + subnode.getClass().getSimpleName() + ", we need a map"); - } - return parseObject((MapXNode) subnode, rootElementName, objectDefinition, pc); - } - - public PrismObject parseObject(MapXNode xmap, ParsingContext pc) throws SchemaException { - // There is no top-level element to detect type. We have only one chance ... - QName typeQName = xmap.getTypeQName(); - if (typeQName == null) { - throw new SchemaException("No type specified in top-level xnode, cannot determine object type"); - } - PrismObjectDefinition objectDefinition = getSchemaRegistry().findObjectDefinitionByType(typeQName); - return parseObject(xmap, objectDefinition, pc); - } - - public PrismObject parseObject(MapXNode xnode, PrismObjectDefinition objectDefinition, ParsingContext pc) throws SchemaException { - QName elementName; - if (objectDefinition != null) { - elementName = objectDefinition.getName(); - } else { - elementName = new QName(null, ARTIFICIAL_OBJECT_NAME); - } - return parseObject(xnode, elementName, objectDefinition, pc); - } - - private PrismObject parseObject(XNode xnode, QName elementName, PrismObjectDefinition objectDefinition, ParsingContext pc) throws SchemaException { - if (xnode instanceof RootXNode) { - return parseObject(((RootXNode) xnode).getSubnode(), elementName, objectDefinition, pc); // elementName from RootXNode is silently ignored - } else if (xnode instanceof MapXNode) { - return parseObject((MapXNode) xnode, elementName, objectDefinition, pc); - } else { - throw new IllegalArgumentException("Cannot parse object from " + xnode); - } - } - - private PrismObject parseObject(MapXNode xnode, QName elementName, PrismObjectDefinition objectDefinition, ParsingContext pc) throws SchemaException { - PrismObject object = (PrismObject) parseContainerFromMapInternal(xnode, elementName, objectDefinition, - QNameUtil.createCollection(XNode.KEY_OID, XNode.KEY_VERSION), pc); - object.setOid(getOid(xnode)); - object.setVersion(getVersion(xnode)); - return object; - } - - private String getOid(MapXNode xmap) throws SchemaException { - return xmap.getParsedPrimitiveValue(XNode.KEY_OID, DOMUtil.XSD_STRING); - } - - private String getVersion(MapXNode xmap) throws SchemaException { - return xmap.getParsedPrimitiveValue(XNode.KEY_VERSION, DOMUtil.XSD_STRING); - } - //endregion - - //region Parsing prism containers -// public PrismContainer unmarshallContainer(XNode xnode, ParsingContext pc) throws SchemaException { -// Validate.notNull(xnode); -// -// if (xnode instanceof RootXNode) { -// return unmarshallContainer((RootXNode) xnode, pc); -// } else if (xnode.getTypeQName() != null) { -// PrismContainerDefinition definition = getSchemaRegistry().findContainerDefinitionByType(xnode.getTypeQName()); -// if (definition == null) { -// throw new SchemaException("No container definition for type " + xnode.getTypeQName()); -// } -// return unmarshallContainer(xnode, definition, pc); -// } else { -// throw new SchemaException("Couldn't parse container because no element name nor type name is known"); -// } -// } - -// public PrismContainer unmarshalContainerValue(RootXNode rootXnode, ParsingContext pc) throws SchemaException { -// Validate.notNull(rootXnode); -// -// QName rootElementName = rootXnode.getRootElementName(); -// PrismContainerDefinition definition; -// if (rootXnode.getTypeQName() != null) { -// definition = getSchemaRegistry().findContainerDefinitionByType(rootXnode.getTypeQName()); -// if (definition == null) { -// throw new SchemaException("No container definition for type " + rootXnode.getTypeQName()); -// } -// } else { -// definition = getSchemaRegistry().findContainerDefinitionByElementName(rootElementName); -// if (definition == null) { -// throw new SchemaException("No container definition for element name " + rootElementName); -// } -// } -// XNode subnode = rootXnode.getSubnode(); -// if (!(subnode instanceof MapXNode)) { -// throw new IllegalArgumentException("Cannot parse object from " + subnode.getClass().getSimpleName() + ", we need a map"); -// } -// return unmarshalContainerInternal(subnode, rootElementName, definition, pc); -// } - - @NotNull - PrismContainer unmarshalContainerValue(@NotNull XNode xnode, @NotNull Class type, @NotNull ParsingContext pc) throws SchemaException { - PrismContainerDefinition definition = getSchemaRegistry().findContainerDefinitionByCompileTimeClass(type); - if (definition == null) { - throw new SchemaException("No container definition for class " + type); - } - return unmarshalContainerValue(xnode, definition, pc); - } - - @NotNull - PrismContainer unmarshalContainerValue(@NotNull XNode xnode, @NotNull PrismContainerDefinition definition, @NotNull ParsingContext pc) throws SchemaException { - if (xnode instanceof RootXNode) { - RootXNode xroot = (RootXNode) xnode; - return unmarshalContainerInternal(xroot.getSubnode(), xroot.getRootElementName(), definition, pc); - } else if (xnode instanceof MapXNode) { - return unmarshalContainerInternal(xnode, definition.getName(), definition, pc); - } else { - throw new SchemaException("Cannot parse container from " + xnode); - } - } - - @NotNull - private PrismContainer unmarshalContainerInternal(@NotNull XNode xnode, @NotNull QName elementName, - @NotNull PrismContainerDefinition containerDef, @NotNull ParsingContext pc) throws SchemaException { - if (xnode instanceof RootXNode) { - RootXNode rootXnode = (RootXNode) xnode; - return unmarshalContainerInternal(rootXnode.getSubnode(), rootXnode.getRootElementName(), containerDef, pc); // ignoring elementName from parameters (probably set to be root element name) - } else if (xnode instanceof MapXNode) { - return parseContainerFromMapInternal((MapXNode) xnode, elementName, containerDef, null, pc); - } else if (xnode instanceof ListXNode) { - PrismContainer container = containerDef.instantiate(elementName); - for (XNode xsubnode : (ListXNode) xnode) { - PrismContainerValue containerValue = parsePrismContainerValue(xsubnode, containerDef, pc); - container.add(containerValue); - } - return container; - } else if (xnode instanceof PrimitiveXNode) { - PrimitiveXNode xprim = (PrimitiveXNode) xnode; - if (xprim.isEmpty()) { - PrismContainer container = containerDef.instantiate(elementName); - container.createNewValue(); // empty primitive node corresponds actually to empty container VALUE, not empty (value-less) container ITEM - return container; - } else { - throw new IllegalArgumentException("Cannot parse container from (non-empty) " + xnode); - } - } else { - throw new IllegalArgumentException("Cannot parse container from " + xnode); - } - } - - private PrismContainer parseContainerFromMapInternal(MapXNode xmap, QName elementName, - PrismContainerDefinition containerDef, Collection ignoredItems, ParsingContext pc) throws SchemaException { - PrismContainer container = containerDef.instantiate(elementName); - PrismContainerValue cval = parsePrismContainerValueFromMap(xmap, containerDef, ignoredItems, pc); - container.add(cval); - return container; - } - - public PrismContainerValue parsePrismContainerValue(XNode xnode, PrismContainerDefinition containerDef, ParsingContext pc) - throws SchemaException { - if (xnode instanceof MapXNode) { - return parsePrismContainerValueFromMap((MapXNode) xnode, containerDef, null, pc); - } else if (xnode instanceof PrimitiveXNode) { - PrimitiveXNode xprim = (PrimitiveXNode) xnode; - if (xprim.isEmpty()) { - PrismContainer container = containerDef.instantiate(); - PrismContainerValue pcv = container.createNewValue(); - pcv.setParent(null); - return pcv; - } else { - throw new IllegalArgumentException("Cannot parse container value from (non-empty) " + xnode); - } - } else { - throw new IllegalArgumentException("Cannot parse container value from " + xnode); - } - } - - private PrismContainerValue parsePrismContainerValueFromMap(@NotNull MapXNode xmap, - @NotNull PrismContainerDefinition containerDef, - @Nullable Collection ignoredItems, @NotNull ParsingContext pc) throws SchemaException { - Long id = getContainerId(xmap); - - // override container definition, if explicit type is specified - ComplexTypeDefinition complexTypeDefinition = containerDef.getComplexTypeDefinition(); - if (xmap.getTypeQName() != null) { - ComplexTypeDefinition specificDef = getSchemaRegistry().findComplexTypeDefinition(xmap.getTypeQName()); - if (specificDef != null) { - complexTypeDefinition = specificDef; - } else { - pc.warnOrThrow(LOGGER, "Unknown type " + xmap.getTypeQName() + " in " + xmap); - } - } - PrismContainerValue cval = new PrismContainerValue(null, null, null, id, complexTypeDefinition, prismContext); - for (Entry xentry : xmap.entrySet()) { - QName itemQName = xentry.getKey(); - if (QNameUtil.match(itemQName, XNode.KEY_CONTAINER_ID)) { - continue; - } - if (QNameUtil.matchAny(itemQName, ignoredItems)) { - continue; - } - ItemDefinition itemDef = locateItemDefinition(complexTypeDefinition, itemQName, xentry.getValue()); -// if (itemDef == null) { -// itemDef = locateItemDefinition(containerDef, itemQName, xentry.getValue()); -// } - if (itemDef == null) { - if (complexTypeDefinition == null || complexTypeDefinition.isXsdAnyMarker()) { - // ok - } else if (complexTypeDefinition.isRuntimeSchema()) { -// PrismSchema itemSchema = getSchemaRegistry().findSchemaByNamespace(itemQName.getNamespaceURI()); -// if (itemSchema != null) { -// // If we already have schema for this namespace then a missing element is -// // an error. We positively know that it is not in the schema. -// String message = -// "Item " + itemQName + " has no definition (schema present, in container " + containerDef + ")" + "while parsing " -// + xmap.debugDump(); -// if (pc.isStrict()) { -// throw new SchemaException(message, itemQName); -// } else { -// pc.warn(LOGGER, message); -// continue; -// } -// } else { -// // No definition for item, but the schema is runtime. the definition may come later. -// // Null is OK here. The item will be parsed as "raw" -// } - } else { - String message = - "Item " + itemQName + " has no definition (in container value " + complexTypeDefinition + ")" + "while parsing " + xmap - .debugDump(); - if (pc.isStrict()) { - throw new SchemaException(message, itemQName); - } else { - // Just skip item - pc.warn(LOGGER, message); - continue; - } - } - } - Item item = parseItem(xentry.getValue(), itemQName, itemDef, pc); - // Merge must be here, not just add. Some items (e.g. references) have alternative - // names and representations and these cannot be processed as one map or list - if (item != null) { - cval.merge(item); - } - } - return cval; - } - - private Long getContainerId(MapXNode xmap) throws SchemaException { - return xmap.getParsedPrimitiveValue(XNode.KEY_CONTAINER_ID, DOMUtil.XSD_LONG); - } - //endregion - - //region Parsing prism properties - private PrismProperty parsePrismProperty(XNode xnode, QName propName, - PrismPropertyDefinition propertyDefinition, ParsingContext pc) throws SchemaException { - Validate.notNull(propertyDefinition); - if (xnode == null) { - return propertyDefinition.instantiate(); - } else if (xnode instanceof ListXNode) { - return parsePrismPropertyFromList((ListXNode) xnode, propName, propertyDefinition, pc); - } else if (xnode instanceof MapXNode) { - return parsePrismPropertyFromMap((MapXNode) xnode, propName, propertyDefinition, pc); - } else if (xnode instanceof PrimitiveXNode) { - return parsePrismPropertyFromPrimitive((PrimitiveXNode) xnode, propName, propertyDefinition, pc); - } else if (xnode instanceof SchemaXNode) { - return parsePrismPropertyFromSchema((SchemaXNode) xnode, propName, propertyDefinition, pc); - } else if (xnode instanceof RootXNode) { - return parsePrismProperty(((RootXNode) xnode).getSubnode(), propName, propertyDefinition, pc); // todo what about possibly lost type name of root node? - } else { - throw new IllegalArgumentException("Cannot parse property from " + xnode); - } - } - - private PrismProperty parsePrismPropertyFromSchema(SchemaXNode xnode, QName propName, - PrismPropertyDefinition propertyDefinition, ParsingContext pc) throws SchemaException { - PrismProperty prop = propertyDefinition.instantiate(); - - SchemaDefinitionType schemaDefType = getBeanConverter().unmarshalSchemaDefinitionType((SchemaXNode) xnode); - PrismPropertyValue val = new PrismPropertyValue<>(schemaDefType); - prop.add(val); - - return prop; - } - - private PrismProperty parsePrismPropertyFromList(ListXNode xlist, QName propName, - PrismPropertyDefinition propertyDefinition, ParsingContext pc) throws SchemaException { - if (xlist == null || xlist.isEmpty()) { - return null; - } - PrismProperty prop = propertyDefinition.instantiate(propName); - - if (!propertyDefinition.isMultiValue() && xlist.size() > 1) { - throw new SchemaException("Attempt to store multiple values in single-valued property " + propName); - } - - for (XNode xsubnode : xlist) { - PrismPropertyValue pval = parsePrismPropertyValue(xsubnode, prop, pc); - if (pval != null) { - prop.add(pval); - } - } - return prop; - } - - private PrismProperty parsePrismPropertyFromMap(MapXNode xmap, QName propName, - PrismPropertyDefinition propertyDefinition, ParsingContext pc) throws SchemaException { - PrismProperty prop = propertyDefinition.instantiate(propName); - PrismPropertyValue pval = parsePrismPropertyValue(xmap, prop, pc); - if (pval != null) { - prop.add(pval); - } - return prop; - } - - private PrismProperty parsePrismPropertyFromPrimitive(PrimitiveXNode xprim, QName propName, - PrismPropertyDefinition propertyDefinition, ParsingContext pc) throws SchemaException { - PrismProperty prop = propertyDefinition.instantiate(propName); - PrismPropertyValue pval = parsePrismPropertyValue(xprim, prop, pc); - if (pval != null) { - prop.add(pval); - } - return prop; - } - - private PrismPropertyValue parsePrismPropertyValue(XNode xnode, PrismProperty property, ParsingContext pc) throws SchemaException { - Validate.notNull(xnode); - Validate.notNull(property); - T realValue = parsePrismPropertyRealValue(xnode, property.getDefinition(), pc); - if (realValue == null) { - return null; - } - return new PrismPropertyValue(realValue); - } - - public T parsePrismPropertyRealValue(XNode xnode, PrismPropertyDefinition propertyDef, ParsingContext pc) throws SchemaException { - if (xnode instanceof PrimitiveXNode) { - return parseAtomicValueFromPrimitive((PrimitiveXNode) xnode, propertyDef, propertyDef.getTypeName(), pc); - } else if (xnode instanceof MapXNode) { - return parsePrismPropertyRealValueFromMap((MapXNode) xnode, null, propertyDef, pc); - } else { - throw new IllegalArgumentException("Cannot parse property value from " + xnode); - } - } - - /** - * Parses an atomic value - i.e. something that could present a property - * value, if such a property would exist. - */ - public T parseAtomicValue(XNode xnode, QName typeName, ParsingContext pc) throws SchemaException { - if (xnode instanceof RootXNode) { - return parseAtomicValue(((RootXNode) xnode).getSubnode(), typeName, pc); - } else if (xnode instanceof PrimitiveXNode) { - return parseAtomicValueFromPrimitive((PrimitiveXNode) xnode, typeName, pc); - } else if (xnode instanceof MapXNode) { - return parsePrismPropertyRealValueFromMap((MapXNode) xnode, typeName, null, pc); - } else { - throw new IllegalArgumentException("Cannot parse atomic value from " + xnode); - } - } - - private T parseAtomicValueFromPrimitive(PrimitiveXNode xprim, QName typeName, ParsingContext pc) throws SchemaException { - return parseAtomicValueFromPrimitive(xprim, null, typeName, pc); - } - - private T parseAtomicValueFromPrimitive(PrimitiveXNode xprim, PrismPropertyDefinition def, QName typeName, ParsingContext pc) throws SchemaException { - if (xprim == null) { - throw new IllegalArgumentException("XNode is null while parsing def=" + def + ", type=" + typeName); - } - T realValue = null; - if (QNameUtil.match(ItemPathType.COMPLEX_TYPE, typeName)) { - return (T) parseItemPathType(xprim, pc); - } else if (QNameUtil.match(ProtectedStringType.COMPLEX_TYPE, typeName)) { - return (T) parseProtectedTypeFromPrimitive(xprim, pc); - } else if (getBeanConverter().canProcess(typeName) && !QNameUtil.match(typeName, PolyStringType.COMPLEX_TYPE)) { - // Primitive elements may also have complex Java representations (e.g. enums) - return getBeanConverter().unmarshallPrimitive(xprim, typeName, pc); - } else if (def != null && def.isRuntimeSchema() && def.getAllowedValues() != null && def.getAllowedValues().size() > 0) { - //TODO: ugly hack to support enum in extension schemas --- need to be fixed - - realValue = xprim.getParsedValue(DOMUtil.XSD_STRING); - if (!isAllowed(realValue, def.getAllowedValues())) { - if (pc.isStrict()) { - throw new SchemaException("Illegal value found in property " + xprim + ". Allowed values are: " + def.getAllowedValues()); - } else { - // just skip the value - LOGGER.error("Skipping unknown value of type {}. Value: {}", typeName, xprim.getStringValue()); - pc.warn("Skipping unknown value of type " + typeName + ". Value: " + xprim.getStringValue()); - return null; - } - } - - } else { - try { - realValue = xprim.getParsedValue(typeName, pc.getEvaluationMode()); - } catch (SchemaException e) { - if (pc.isStrict()) { - throw e; - } else { - // just skip the value - LoggingUtils.logException(LOGGER, "Couldn't parse primitive value of type {}. Value: {}.\nDefinition: {}", - e, typeName, xprim.getStringValue(), def != null ? def.debugDump() : "(null)"); - pc.warn("Couldn't parse primitive value of type " + typeName + ". Value: " + xprim.getStringValue() - + ".\nDefinition: " + def != null ? def.debugDump() : "(null)"); - return null; - } - } - } - - if (realValue == null) { - return realValue; - } - - if (realValue instanceof PolyStringType) { - PolyStringType polyStringType = (PolyStringType) realValue; - realValue = (T) new PolyString(polyStringType.getOrig(), polyStringType.getNorm()); - } - - if (!(realValue instanceof PolyString) && typeName.equals(PolyStringType.COMPLEX_TYPE)) { - String val = (String) realValue; - realValue = (T) new PolyString(val); - } - - PrismUtil.recomputeRealValue(realValue, prismContext); - return realValue; - } - - private boolean isAllowed(T realValue, Collection> collection) { - for (DisplayableValue o : collection) { - if (realValue.equals(o.getValue())) { - return true; - } - } - return false; - } - - private ProtectedStringType parseProtectedTypeFromPrimitive(PrimitiveXNode xPrim, ParsingContext pc) throws SchemaException { - String clearValue = (String) xPrim.getParsedValue(DOMUtil.XSD_STRING); - ProtectedStringType protectedString = new ProtectedStringType(); - protectedString.setClearValue(clearValue); - return protectedString; - } - - /** - * This method is called either with a type name only, or with a property - * definition only, or with both. Property definition is useful to correctly - * formulate exception message. - */ - private T parsePrismPropertyRealValueFromMap(MapXNode xmap, QName typeName, PrismPropertyDefinition propertyDefinition, ParsingContext pc) - throws SchemaException { - if (typeName == null) { - if (propertyDefinition == null) { - throw new IllegalArgumentException("Couldn't parse prism property real value because of missing type name and property definition"); - } - typeName = propertyDefinition.getTypeName(); - } - if (getBeanConverter().canProcess(typeName)) { - return getBeanConverter().unmarshall(xmap, typeName, pc); - } else { - if (propertyDefinition != null) { - if (propertyDefinition.isRuntimeSchema()) { - throw new SchemaException("Complex run-time properties are not supported: type " + typeName + " from " + xmap); - } else { - throw new SystemException("Cannot parse compile-time property " + propertyDefinition.getName() + " type " + typeName + " from " + xmap); - } - } else { - throw new SchemaException("Couldn't parse property real value with type " + typeName + " from " + xmap); - } - } - } - - public PrismPropertyValue parsePrismPropertyFromGlobalXNodeValue(Entry entry, ParsingContext pc) throws SchemaException { - Validate.notNull(entry); - - QName globalElementName = entry.getKey(); - if (globalElementName == null) { - throw new SchemaException("No global element name to look for"); - } - ItemDefinition itemDefinition = getSchemaRegistry().resolveGlobalItemDefinition(globalElementName); - if (itemDefinition == null) { - throw new SchemaException("No definition for item " + globalElementName); - } - - if (itemDefinition instanceof PrismPropertyDefinition) { - PrismProperty prismProperty = parsePrismProperty(entry.getValue(), globalElementName, (PrismPropertyDefinition) itemDefinition, pc); - if (prismProperty.size() > 1) { - throw new SchemaException("Retrieved more than one value from globally defined element " + globalElementName); - } else if (prismProperty.size() == 0) { - return null; - } else { - return (PrismPropertyValue) prismProperty.getValues().get(0); - } - } else { - throw new IllegalArgumentException("Parsing global elements with definitions other than PrismPropertyDefinition is not supported yet: element = " + globalElementName + " definition kind = " + itemDefinition.getClass().getSimpleName()); - } - } - - private ItemPathType parseItemPathType(PrimitiveXNode itemPath, ParsingContext pc) throws SchemaException { - ItemPath path = (ItemPath) itemPath.getParsedValue(ItemPath.XSD_TYPE); - ItemPathType itemPathType = new ItemPathType(path); - return itemPathType; - } - -// private void parseProtectedType(ProtectedDataType protectedType, MapXNode xmap) throws SchemaException { -// XNode xEncryptedData = xmap.get(ProtectedDataType.F_ENCRYPTED_DATA); -// if (xEncryptedData != null) { -// if (!(xEncryptedData instanceof MapXNode)) { -// throw new SchemaException("Cannot parse encryptedData from "+xEncryptedData); -// } -// EncryptedDataType encryptedDataType = getBeanConverter().unmarshall((MapXNode)xEncryptedData, EncryptedDataType.class); -// protectedType.setEncryptedData(encryptedDataType); -// } else { -// // Check for legacy EncryptedData -// XNode xLegacyEncryptedData = xmap.get(ProtectedDataType.F_XML_ENC_ENCRYPTED_DATA); -// if (xLegacyEncryptedData != null) { -// if (!(xLegacyEncryptedData instanceof MapXNode)) { -// throw new SchemaException("Cannot parse EncryptedData from "+xEncryptedData); -// } -// MapXNode xConvertedEncryptedData = (MapXNode) xLegacyEncryptedData.cloneTransformKeys(new Transformer() { -// @Override -// public QName transform(QName in) { -// String elementName = StringUtils.uncapitalize(in.getLocalPart()); -// if (elementName.equals("type")) { -// // this is rubbish, we don't need it, we don't want it -// return null; -// } -// return new QName(null, elementName); -// } -// }); -// EncryptedDataType encryptedDataType = getBeanConverter().unmarshall(xConvertedEncryptedData, EncryptedDataType.class); -// protectedType.setEncryptedData(encryptedDataType); -// } -// } -// // protected data empty..check for clear value -// if (protectedType.isEmpty()){ -// XNode xClearValue = xmap.get(ProtectedDataType.F_CLEAR_VALUE); -// if (xClearValue == null){ -// //TODO: try to use common namespace (only to be compatible with previous versions) -// //FIXME maybe add some warning, info... -// xClearValue = xmap.get(new QName(ProtectedDataType.F_CLEAR_VALUE.getLocalPart())); -// } -// if (xClearValue == null){ -// return; -// } -// if (!(xClearValue instanceof PrimitiveXNode)){ -// //this is maybe not good.. -// throw new SchemaException("Cannot parse clear value from " + xClearValue); -// } -// // TODO: clearValue -// T clearValue = (T) ((PrimitiveXNode)xClearValue).getParsedValue(DOMUtil.XSD_STRING); -// protectedType.setClearValue(clearValue); -// } -// -// } - public static PrismProperty parsePrismPropertyRaw(XNode xnode, QName itemName, @Nullable PrismContext prismContext) - throws SchemaException { - if (xnode instanceof ListXNode) { - PrismProperty property = new PrismProperty(itemName, prismContext); - for (XNode xsubnode : (ListXNode) xnode) { - PrismPropertyValue pval = PrismPropertyValue.createRaw(xsubnode); - property.add(pval); - } - return property; - } else { - PrismProperty property = new PrismProperty(itemName, prismContext); - PrismPropertyValue pval = PrismPropertyValue.createRaw(xnode); - property.add(pval); - return property; - } - } - //endregion - - //region Parsing prism references - public PrismReference parsePrismReference(XNode xnode, QName itemName, - PrismReferenceDefinition referenceDefinition, ParsingContext pc) throws SchemaException { - if (xnode instanceof ListXNode) { - return parsePrismReferenceFromList((ListXNode) xnode, itemName, referenceDefinition, pc); - } else if (xnode instanceof MapXNode) { - return parsePrismReferenceFromMap((MapXNode) xnode, itemName, referenceDefinition, pc); - } else if (xnode instanceof PrimitiveXNode) { - return referenceDefinition.instantiate(); - } else { - throw new IllegalArgumentException("Cannot parse reference from " + xnode); - } - } - - private PrismReference parsePrismReferenceFromList(ListXNode xlist, QName itemName, - PrismReferenceDefinition referenceDefinition, ParsingContext pc) throws SchemaException { - if (xlist == null || xlist.isEmpty()) { - return null; - } - PrismReference ref = referenceDefinition.instantiate(); - - if (!referenceDefinition.isMultiValue() && xlist.size() > 1) { - throw new SchemaException("Attempt to store multiple values in single-valued reference " + itemName); - } - - for (XNode subnode : xlist) { - parsePrismReferenceValueFromXNode(ref, subnode, referenceDefinition, itemName, pc); - } - return ref; - } - - private PrismReference parsePrismReferenceFromMap(MapXNode xmap, QName itemName, - PrismReferenceDefinition referenceDefinition, ParsingContext pc) throws SchemaException { - PrismReference ref = referenceDefinition.instantiate(); - parsePrismReferenceValueFromXNode(ref, xmap, referenceDefinition, itemName, pc); - return ref; - } - - private void parsePrismReferenceValueFromXNode(PrismReference ref, XNode subnode, PrismReferenceDefinition referenceDefinition, QName itemName, ParsingContext pc) - throws SchemaException { - /* - * We distinguish between "real" references and composite objects by - * (1) looking at type QName of XNode passed (whether it's ObjectType or ObjectReferenceType) - * (2) comparing itemName and name from reference definition - e.g. linkRef vs. link - */ - boolean isComposite; - if (subnode.getTypeQName() != null) { - QName typeName = subnode.getTypeQName(); - if (prismContext != null) { - ItemDefinition definition = getSchemaRegistry().findItemDefinitionByType(typeName); - isComposite = definition instanceof PrismObjectDefinition; - } else { - isComposite = PrismConstants.REFERENCE_TYPE_NAME.equals(typeName.getLocalPart()); - } - } else { - isComposite = !QNameUtil.match(itemName, referenceDefinition.getName()); - } - - if (isComposite) { - // This is a composite object (complete object stored inside - // reference) - ref.add(parseReferenceAsCompositeObject(subnode, referenceDefinition, pc)); - } else { - // This is "real" reference (oid type and nothing more) - ref.add(parseReferenceValue(subnode, referenceDefinition, pc)); - } - } - - public PrismReferenceValue parseReferenceValue(XNode xnode, PrismReferenceDefinition referenceDefinition, ParsingContext pc) throws SchemaException { - if (xnode instanceof MapXNode) { - return parseReferenceValue((MapXNode) xnode, referenceDefinition, pc); - } else { - throw new IllegalArgumentException("Cannot parse reference from " + xnode); - } - } - - public PrismReferenceValue parseReferenceValue(MapXNode xmap, PrismReferenceDefinition referenceDefinition, ParsingContext pc) throws SchemaException { - String oid = xmap.getParsedPrimitiveValue(XNode.KEY_REFERENCE_OID, DOMUtil.XSD_STRING); - PrismReferenceValue refVal = new PrismReferenceValue(oid); - - QName type = xmap.getParsedPrimitiveValue(XNode.KEY_REFERENCE_TYPE, DOMUtil.XSD_QNAME); - if (type == null) { - if (!pc.isAllowMissingRefTypes()) { - type = referenceDefinition.getTargetTypeName(); - if (type == null) { - throw new SchemaException("Target type specified neither in reference nor in the schema"); - } - } - } else { - if (StringUtils.isBlank(type.getNamespaceURI())) { - // resolve type without namespace (only when prismContext is known) - if (prismContext == null) { - throw new SchemaException("Couldn't parse unqualified type name '" + type + "' without prismContext"); - } - type = getSchemaRegistry().resolveUnqualifiedTypeName(type); - } - - QName defTargetType = referenceDefinition.getTargetTypeName(); - - if (defTargetType != null && !QNameUtil.match(defTargetType, type)) { - //one more check - if the type is not a subtype of the schema type - Class clazz = qnameToClass(type, pc); - if (clazz == null) { - throw new SchemaException("Unknown target type: " + type); - } - if (!qnameToClass(defTargetType, pc).isAssignableFrom(clazz)) { - throw new SchemaException("Target type specified in reference (" + type + ") does not match target type in schema (" + defTargetType + ")"); - } - } - } - - PrismObjectDefinition objectDefinition = null; - if (type != null) { - objectDefinition = getSchemaRegistry().findObjectDefinitionByType(type); - if (objectDefinition == null) { - throw new SchemaException("No definition for type " + type + " in reference"); - } - refVal.setTargetType(type); - } - - QName relationAttribute = xmap.getParsedPrimitiveValue(XNode.KEY_REFERENCE_RELATION, DOMUtil.XSD_QNAME); - refVal.setRelation(relationAttribute); - - refVal.setDescription((String) xmap.getParsedPrimitiveValue(XNode.KEY_REFERENCE_DESCRIPTION, DOMUtil.XSD_STRING)); - - refVal.setFilter(parseFilter(xmap.get(XNode.KEY_REFERENCE_FILTER), pc)); - - String resolutionTimeString = (String) xmap.getParsedPrimitiveValue(XNode.KEY_REFERENCE_RESOLUTION_TIME, DOMUtil.XSD_STRING); - if (resolutionTimeString != null) { - EvaluationTimeType resolutionTime = EvaluationTimeType.fromValue(resolutionTimeString); - refVal.setResolutionTime(resolutionTime); - } - - XNode xnodeForTargetName = xmap.get(XNode.KEY_REFERENCE_TARGET_NAME); - if (xnodeForTargetName != null) { - Class targetNameClass = PolyStringType.class; - if (xnodeForTargetName instanceof PrimitiveXNode && ((PrimitiveXNode) xnodeForTargetName).getValue() instanceof PolyString) { - targetNameClass = PolyString.class; // targetName in audit report comes as PolyString - } - Object o = getBeanConverter().unmarshall(xnodeForTargetName, targetNameClass, pc); - // working around polystring-related type mess in unmarshaller - if (o instanceof PolyString) { - refVal.setTargetName((PolyString) o); - } else if (o instanceof PolyStringType) { - refVal.setTargetName((PolyStringType) o); - } else { - throw new IllegalStateException("targetName is not a polystring, it's a " + o.getClass().getName()); - } - } - - XNode xrefObject = xmap.get(XNode.KEY_REFERENCE_OBJECT); - if (xrefObject != null) { - if (!(xrefObject instanceof MapXNode)) { - throw new SchemaException("Cannot parse object from " + xrefObject); - } - if (type == null) { - throw new SchemaException("Cannot parse object from " + xrefObject + " without knowing its type"); - } - PrismObject object = parseObject((MapXNode) xrefObject, objectDefinition, pc); - setReferenceObject(refVal, object); - } - - return refVal; - } - - private void setReferenceObject(PrismReferenceValue refVal, PrismObject object) throws SchemaException { - refVal.setObject(object); - if (object.getOid() != null) { - if (refVal.getOid() == null) { - refVal.setOid(object.getOid()); - } else { - if (!refVal.getOid().equals(object.getOid())) { - throw new SchemaException("OID in reference (" + refVal.getOid() + ") does not match OID in composite object (" + object.getOid() + ")"); - } - } - } - QName objectTypeName = object.getDefinition().getTypeName(); - if (refVal.getTargetType() == null) { - refVal.setTargetType(objectTypeName); - } else { - if (!refVal.getTargetType().equals(objectTypeName)) { - throw new SchemaException("Target type in reference (" + refVal.getTargetType() + ") does not match OID in composite object (" + objectTypeName + ")"); - } - } - } - - private PrismReferenceValue parseReferenceAsCompositeObject(XNode xnode, - PrismReferenceDefinition referenceDefinition, ParsingContext pc) throws SchemaException { - if (xnode instanceof MapXNode) { - return parseReferenceAsCompositeObject((MapXNode) xnode, referenceDefinition, pc); - } else { - throw new IllegalArgumentException("Cannot parse reference composite object from " + xnode); - } - } - - private PrismReferenceValue parseReferenceAsCompositeObject(MapXNode xmap, - PrismReferenceDefinition referenceDefinition, ParsingContext pc) throws SchemaException { - QName targetTypeName = referenceDefinition.getTargetTypeName(); - PrismObjectDefinition objectDefinition = null; - if (xmap.getTypeQName() != null) { - objectDefinition = getSchemaRegistry().findObjectDefinitionByType(xmap.getTypeQName()); - } - if (objectDefinition == null && targetTypeName != null) { - objectDefinition = getSchemaRegistry().findObjectDefinitionByType(targetTypeName); - } - if (objectDefinition == null) { - throw new SchemaException("No object definition for composite object in reference element " - + referenceDefinition.getCompositeObjectElementName()); - } - - PrismObject compositeObject = null; - try { - compositeObject = parseObject(xmap, objectDefinition, pc); - } catch (SchemaException e) { - throw new SchemaException(e.getMessage() + " while parsing composite object in reference element " - + referenceDefinition.getCompositeObjectElementName(), e); - } - - PrismReferenceValue refVal = new PrismReferenceValue(); - setReferenceObject(refVal, compositeObject); - ((PrismReferenceDefinitionImpl) referenceDefinition).setComposite(true); - return refVal; - } - - private SearchFilterType parseFilter(XNode xnode, ParsingContext pc) throws SchemaException { - if (xnode == null) { - return null; - } - if (xnode.isEmpty()) { - return null; - } - return SearchFilterType.createFromXNode(xnode, prismContext); - } - - private Class qnameToClass(QName type, ParsingContext pc) { - Class c = getSchemaRegistry().determineCompileTimeClass(type); - if (c == null) { - throw new IllegalStateException("No class for " + type); - } - return c; - } - //endregion - - //region Resolving definitions - public ItemDefinition locateItemDefinition( - PrismContainerDefinition containerDefinition, QName elementQName, XNode xnode) - throws SchemaException { - ItemDefinition def = containerDefinition.findItemDefinition(elementQName); - if (def != null) { - return def; - } - - def = resolveDynamicItemDefinition(containerDefinition, elementQName, xnode); - if (def != null) { - return def; - } - - if (containerDefinition.isRuntimeSchema()) { - // Try to locate global definition in any of the schemas - def = resolveGlobalItemDefinition(containerDefinition.getComplexTypeDefinition(), elementQName, xnode); - } - return def; - } - - public ItemDefinition locateItemDefinition( - ComplexTypeDefinition complexTypeDefinition, QName elementQName, XNode xnode) - throws SchemaException { - ItemDefinition def = null; - - if (complexTypeDefinition != null) { - //def = complexTypeDefinition.findItemDefinition(elementQName, ItemDefinition.class, false); - def = complexTypeDefinition.findItemDefinition(new ItemPath(elementQName)); - if (def != null) { - return def; - } - } - - def = resolveDynamicItemDefinition(complexTypeDefinition, elementQName, xnode); - if (def != null) { - return def; - } - - if (complexTypeDefinition == null || complexTypeDefinition.isXsdAnyMarker()) { - // Try to locate global definition in any of the schemas - def = resolveGlobalItemDefinition(complexTypeDefinition, elementQName, xnode); - } - return def; - } - private ItemDefinition resolveDynamicItemDefinition(Definition parentDefinition, QName elementName, XNode xnode) throws SchemaException { - if (xnode == null) { - return null; - } - QName typeName = xnode.getTypeQName(); - if (typeName == null) { - if (xnode instanceof ListXNode) { - // there may be type definitions in individual list members - for (XNode subnode : ((ListXNode) xnode)) { - ItemDefinition subdef = resolveDynamicItemDefinition(parentDefinition, elementName, subnode); - // TODO: make this smarter, e.g. detect conflicting type definitions - if (subdef != null) { - return subdef; - } - } - } - } - if (typeName == null) { - return null; - } - PrismPropertyDefinitionImpl propDef = new PrismPropertyDefinitionImpl(elementName, typeName, prismContext); - Integer maxOccurs = xnode.getMaxOccurs(); - if (maxOccurs != null) { - propDef.setMaxOccurs(maxOccurs); - } else { - // Make this multivalue by default, this is more "open" - propDef.setMaxOccurs(-1); - } - propDef.setDynamic(true); - return propDef; - } - - private ItemDefinition resolveGlobalItemDefinition( - ComplexTypeDefinition complexTypeDefinition, QName elementQName, XNode xnode) - throws SchemaException { - return prismContext.getSchemaRegistry().resolveGlobalItemDefinition(elementQName, complexTypeDefinition); - } - //endregion - - //region Parsing general items and beans - /** - * This gets definition of an unspecified type. It has to find the right - * method to call. Value elements have the same element name. They may be - * elements of a property or a container. - */ - public Item parseItem(XNode xnode, QName itemName, ItemDefinition itemDef, ParsingContext pc) - throws SchemaException { - if (itemDef == null) { - // Assume property in a container with runtime definition - return (Item) parsePrismPropertyRaw(xnode, itemName, prismContext); - } - if (itemDef instanceof PrismObjectDefinition) { - return parseObject(xnode, itemName, (PrismObjectDefinition) itemDef, pc); - } else if (itemDef instanceof PrismContainerDefinition) { - return (Item) unmarshalContainerInternal(xnode, itemName, (PrismContainerDefinition) itemDef, pc); - } else if (itemDef instanceof PrismPropertyDefinition) { - return (Item) parsePrismProperty(xnode, itemName, (PrismPropertyDefinition) itemDef, pc); - } else if (itemDef instanceof PrismReferenceDefinition) { - return (Item) parsePrismReference(xnode, itemName, (PrismReferenceDefinition) itemDef, pc); - } else { - throw new IllegalArgumentException("Attempt to parse unknown definition type " + itemDef.getClass().getName()); - } - } - - /** - * Parses (almost) anything: either an item with a definition, or an atomic - * (i.e. property-like) value. Does not care for schemaless items! - * - * @param node - * @return either Item or a unmarshalled bean value - * @throws SchemaException - */ - public Object parseAnyData(XNode node, ParsingContext pc) throws SchemaException { - // is the type name explicitly specified? (if not, guess that we have a string) - QName typeName = getExplicitType(node); - if (typeName == null && node instanceof PrimitiveXNode) { - typeName = DOMUtil.XSD_STRING; - } - if (typeName != null) { - ItemDefinition itemDefinition = getSchemaRegistry().findItemDefinitionByType(typeName); - if (itemDefinition != null) { - return parseItem(node, getElementName(node, itemDefinition), itemDefinition, pc); - } else { - return parseAtomicValue(node, typeName, pc); - } - } else { - // if type name is not known, we have to derive it from the element name - if (!(node instanceof RootXNode)) { - throw new SchemaException("Couldn't parse general object with no type name and no root element name: " + node); - } - QName elementName = ((RootXNode) node).getRootElementName(); - ItemDefinition itemDefinition = getSchemaRegistry().findItemDefinitionByElementName(elementName); - if (itemDefinition == null) { - throw new SchemaException("Couldn't parse general object with no type name and unknown element name: " + elementName); - } - return parseItem(((RootXNode) node).getSubnode(), elementName, itemDefinition, pc); - } - } - - // emulates JAXB unmarshal method - public T parseAnyValue(XNode node, ParsingContext pc) throws SchemaException { - // is the type name explicitly specified? (if not, guess that we have a string) - QName typeName = getExplicitType(node); - if (typeName == null && node instanceof PrimitiveXNode) { - typeName = DOMUtil.XSD_STRING; - } - if (typeName != null) { - ItemDefinition itemDefinition = getSchemaRegistry().findItemDefinitionByType(typeName); - if (itemDefinition != null) { - Item item = parseItem(node, getElementName(node, itemDefinition), itemDefinition, pc); - return (T) getItemRealValue(item); - } else { - return parseAtomicValue(node, typeName, pc); - } - } else { - // if type name is not known, we have to derive it from the element name - if (!(node instanceof RootXNode)) { - throw new SchemaException("Couldn't parse general object with no type name and no root element name: " + node); - } - QName elementName = ((RootXNode) node).getRootElementName(); - ItemDefinition itemDefinition = getSchemaRegistry().findItemDefinitionByElementName(elementName); - if (itemDefinition == null) { - throw new SchemaException("Couldn't parse general object with no type name and unknown element name: " + elementName); - } - Item item = parseItem(((RootXNode) node).getSubnode(), elementName, itemDefinition, pc); - return (T) getItemRealValue(item); - } - } - - // experimental - public JAXBElement parseAnyValueAsJAXBElement(XNode node, ParsingContext pc) throws SchemaException { - // is the type name explicitly specified? (if not, guess that we have a string) - QName typeName = getExplicitType(node); - if (typeName == null && node instanceof PrimitiveXNode) { - typeName = DOMUtil.XSD_STRING; - } - if (typeName != null) { - ItemDefinition itemDefinition = getSchemaRegistry().findItemDefinitionByType(typeName); - if (itemDefinition != null) { - Item item = parseItem(node, getElementName(node, itemDefinition), itemDefinition, pc); - return getItemValueAsJAXBElement(item); - } else { - Object o = parseAtomicValue(node, typeName, pc); - if (o instanceof JAXBElement) { - return (JAXBElement) o; - } else { - if (!(node instanceof RootXNode)) { - throw new SchemaException("Couldn't represent an object with no root element name and no item definition as JAXBElement: " + node); - } - QName elementName = ((RootXNode) node).getRootElementName(); - return new JAXBElement(elementName, Object.class, o); // or o.getClass? - } - } - } else { - // if type name is not known, we have to derive it from the element name - if (!(node instanceof RootXNode)) { - throw new SchemaException("Couldn't parse general object with no type name and no root element name: " + node); - } - QName elementName = ((RootXNode) node).getRootElementName(); - ItemDefinition itemDefinition = getSchemaRegistry().findItemDefinitionByElementName(elementName); - if (itemDefinition == null) { - throw new SchemaException("Couldn't parse general object with no type name and unknown element name: " + elementName); - } - Item item = parseItem(((RootXNode) node).getSubnode(), elementName, itemDefinition, pc); - return getItemValueAsJAXBElement(item); - } - } - - private Object getItemRealValue(Item item) throws SchemaException { - if (item.size() == 0) { - return null; - } else if (item.size() > 1) { - throw new SchemaException("Trying to get value from multi-valued item: " + item); - } else { - PrismValue value = (PrismValue) item.getValues().get(0); - if (value instanceof PrismPropertyValue) { - return ((PrismPropertyValue) value).getValue(); - } else if (value instanceof PrismContainerValue) { - return ((PrismContainerValue) value).getValue(); - } else if (value instanceof PrismReferenceValue) { - return value; // TODO what to return in this case? - } else { - throw new IllegalStateException("Unexpected value type: " + (value != null ? value.getClass() : "(null)")); - } - } - } - - private JAXBElement getItemValueAsJAXBElement(Item item) throws SchemaException { - Object v = getItemRealValue(item); - if (v == null) { - return null; - } else { - return (JAXBElement) new JAXBElement<>(item.getElementName(), Object.class, v); // or v.getClass? - } - } - - private QName getElementName(XNode node, ItemDefinition itemDefinition) { - if (node instanceof RootXNode) { - return ((RootXNode) node).getRootElementName(); - } else if (itemDefinition != null) { - return itemDefinition.getName(); - } else { - throw new IllegalStateException("Couldn't determine element name - neither from XNode nor from itemDefinition"); - } - } - - private QName getExplicitType(XNode node) { - if (node.getTypeQName() != null) { - return node.getTypeQName(); - } else if (node instanceof RootXNode) { - RootXNode rootXNode = (RootXNode) node; - if (rootXNode.getSubnode() != null && rootXNode.getSubnode().getTypeQName() != null) { - return rootXNode.getSubnode().getTypeQName(); - } - } - return null; - } - -// public T parseBean(XNode xnode, Class clazz) throws SchemaException { -// MapXNode mapXNode; -// if (xnode instanceof RootXNode) { -// XNode subnode = ((RootXNode) xnode).getSubnode(); -// if (!(subnode instanceof MapXNode)) { -// throw new SchemaException("Couldn't parse " + clazz + " bean from " + xnode + ", as it does not contain a MapXNode"); -// } -// mapXNode = (MapXNode) subnode; -// } else if (xnode instanceof MapXNode) { -// mapXNode = (MapXNode) xnode; -// } else { -// throw new SchemaException("Couldn't parse " + clazz + " bean from " + xnode + ", as it is not a MapXNode"); -// } -// return getBeanConverter().unmarshall(mapXNode, clazz); -// } - //endregion - //region Serialization - // -------------------------- - // -- SERIALIZATION - // -------------------------- - public RootXNode serializeObject(PrismObject object) throws SchemaException { - XNodeSerializer serializer = createSerializer(); - return serializer.serializeObject(object); - } - - public RootXNode serializeObject(PrismObject object, boolean serializeCompositeObjects) throws SchemaException { - return serializeObject(object, serializeCompositeObjects, null); - } - - public RootXNode serializeObject(PrismObject object, boolean serializeCompositeObjects, SerializationContext ctx) throws SchemaException { - XNodeSerializer serializer = createSerializer(); - serializer.setSerializeCompositeObjects(serializeCompositeObjects); - return serializer.serializeObject(object, ctx); - } - -// public RootXNode serializeContainerValueRoot(PrismContainerValue cval) throws SchemaException { -// XNodeSerializer serializer = createSerializer(); -// return serializer.serializeContainerValueAsRoot(cval); -// } -// -// public RootXNode serializeContainerValueRoot(PrismContainerValue cval, QName elementName) throws SchemaException { -// XNodeSerializer serializer = createSerializer(); -// return serializer.serializeContainerValueAsRoot(cval, elementName); -// } - public XNode serializeItem(Item item) throws SchemaException { - XNodeSerializer serializer = createSerializer(); - return serializer.serializeItem(item); - } - -// public RootXNode serializePropertyValueAsRoot(PrismPropertyValue propval, QName elementName) throws SchemaException { -// XNodeSerializer serializer = createSerializer(); -// return serializer.serializePropertyValueAsRoot(propval, elementName); -// } - public RootXNode serializeItemValueAsRoot(PrismValue pval, QName elementName) throws SchemaException { - XNodeSerializer serializer = createSerializer(); - return serializer.serializeItemValueAsRoot(pval, elementName); - } - - public XNode serializeItemValue(PrismValue pval) throws SchemaException { - XNodeSerializer serializer = createSerializer(); - return serializer.serializeItemValue(pval, null); - } - - public RootXNode serializeItemAsRoot(Item item) throws SchemaException { - XNodeSerializer serializer = createSerializer(); - return serializer.serializeItemAsRoot(item); - } - - public XNodeSerializer createSerializer() { - return new XNodeSerializer(PrismUtil.getBeanConverter(prismContext)); - } - - public RootXNode serializeAnyData(Object object, SerializationContext ctx) throws SchemaException { - return serializeAnyData(object, null, ctx); - } - - public RootXNode serializeAnyData(Object object, QName defaultRootElementName, SerializationContext ctx) throws SchemaException { - Validate.notNull(object); - if (object instanceof Item) { - RootXNode root = serializeItemAsRoot((Item) object); - return root; - } else { - Validate.notNull(defaultRootElementName, "rootElementName must be specified for non-Item objects"); - XNode valueXNode = getBeanConverter().marshall(object, ctx); - QName typeQName = JAXBUtil.getTypeQName(object.getClass()); - if (valueXNode.getTypeQName() == null) { - if (typeQName != null) { - valueXNode.setTypeQName(typeQName); - } else { - throw new SchemaException("No type QName for class " + object.getClass()); - } - } - return new RootXNode(defaultRootElementName, valueXNode); - } - } - - // TODO: very preliminary implementation - does not care for special cases (e.g. PolyString etc) - public RootXNode serializeAtomicValue(Object object, QName elementName, SerializationContext ctx) throws SchemaException { - XNode valueXNode = getBeanConverter().marshall(object, ctx); - QName typeQName = JAXBUtil.getTypeQName(object.getClass()); - if (typeQName != null) { - valueXNode.setTypeQName(typeQName); - } else { - throw new SchemaException("No type QName for class " + object.getClass()); - } - return new RootXNode(elementName, valueXNode); - } - - public RootXNode serializeAtomicValue(JAXBElement element) throws SchemaException { - Validate.notNull(element); - return serializeAtomicValue(element.getValue(), element.getName(), null); - } - - public boolean canSerialize(Object object) { - if (object instanceof Item) { - return true; - } else { - return getBeanConverter().canProcess(object.getClass()); - } - } - - //endregion - private PrismBeanConverter getBeanConverter() { - return prismContext.getBeanConverter(); - } - - private SchemaRegistry getSchemaRegistry() { - return prismContext.getSchemaRegistry(); - } -} diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/XNodeProcessorUtil.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/XNodeProcessorUtil.java index 3b91dead7cb..ef6361e5eed 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/XNodeProcessorUtil.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/XNodeProcessorUtil.java @@ -16,25 +16,19 @@ package com.evolveum.midpoint.prism.marshaller; -import java.lang.reflect.Field; -import java.security.CryptoPrimitive; - -import javax.xml.bind.annotation.XmlEnumValue; import javax.xml.namespace.QName; import com.evolveum.midpoint.prism.ParsingContext; +import com.evolveum.midpoint.prism.xnode.RootXNode; import org.apache.commons.lang.StringUtils; -import com.evolveum.midpoint.prism.PrismConstants; import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.crypto.AESProtector; import com.evolveum.midpoint.prism.crypto.EncryptionException; import com.evolveum.midpoint.prism.crypto.Protector; import com.evolveum.midpoint.prism.xnode.MapXNode; import com.evolveum.midpoint.prism.xnode.PrimitiveXNode; import com.evolveum.midpoint.prism.xnode.XNode; import com.evolveum.midpoint.util.DOMUtil; -import com.evolveum.midpoint.util.Transformer; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.prism.xml.ns._public.types_3.EncryptedDataType; import com.evolveum.prism.xml.ns._public.types_3.ProtectedDataType; @@ -59,41 +53,34 @@ public static void parseProtectedType(ProtectedDataType protectedType, Ma } public static void parseProtectedType(ProtectedDataType protectedType, MapXNode xmap, PrismContext prismContext, ParsingContext pc) throws SchemaException { - XNode xEncryptedData = xmap.get(ProtectedDataType.F_ENCRYPTED_DATA); + RootXNode xEncryptedData = xmap.getEntryAsRoot(ProtectedDataType.F_ENCRYPTED_DATA); if (xEncryptedData != null) { - if (!(xEncryptedData instanceof MapXNode)) { + if (!(xEncryptedData.getSubnode() instanceof MapXNode)) { throw new SchemaException("Cannot parse encryptedData from "+xEncryptedData); } - EncryptedDataType encryptedDataType = prismContext.getBeanConverter().unmarshall((MapXNode)xEncryptedData, EncryptedDataType.class, pc); + EncryptedDataType encryptedDataType = prismContext.parserFor(xEncryptedData).context(pc).parseRealValue(EncryptedDataType.class); protectedType.setEncryptedData(encryptedDataType); } else { // Check for legacy EncryptedData - XNode xLegacyEncryptedData = xmap.get(ProtectedDataType.F_XML_ENC_ENCRYPTED_DATA); + RootXNode xLegacyEncryptedData = xmap.getEntryAsRoot(ProtectedDataType.F_XML_ENC_ENCRYPTED_DATA); if (xLegacyEncryptedData != null) { - if (!(xLegacyEncryptedData instanceof MapXNode)) { + if (!(xLegacyEncryptedData.getSubnode() instanceof MapXNode)) { throw new SchemaException("Cannot parse EncryptedData from "+xEncryptedData); } + RootXNode xConvertedEncryptedData = (RootXNode) xLegacyEncryptedData.cloneTransformKeys(in -> { + String elementName = StringUtils.uncapitalize(in.getLocalPart()); + if (elementName.equals("type")) { + // this is rubbish, we don't need it, we don't want it + return null; + } + return new QName(null, elementName); + }); - -// xmlCipherData.getSingleSubEntry(ProtectedDataType.F_XML_ENC_CIPHER_VALUE.getLocalPart()); - - MapXNode xConvertedEncryptedData = (MapXNode) xLegacyEncryptedData.cloneTransformKeys(new Transformer() { - @Override - public QName transform(QName in) { - String elementName = StringUtils.uncapitalize(in.getLocalPart()); - if (elementName.equals("type")) { - // this is rubbish, we don't need it, we don't want it - return null; - } - return new QName(null, elementName); - } - }); - - EncryptedDataType encryptedDataType = prismContext.getBeanConverter().unmarshall(xConvertedEncryptedData, EncryptedDataType.class, pc); + EncryptedDataType encryptedDataType = prismContext.parserFor(xConvertedEncryptedData).context(pc).parseRealValue(EncryptedDataType.class); protectedType.setEncryptedData(encryptedDataType); if (protectedType instanceof ProtectedStringType){ - transformEncryptedValue((ProtectedStringType) protectedType, prismContext); + transformEncryptedValue(protectedType, prismContext); } } } @@ -121,7 +108,7 @@ public QName transform(QName in) { private static void transformEncryptedValue(ProtectedDataType protectedType, PrismContext prismContext) throws SchemaException{ Protector protector = prismContext.getDefaultProtector(); - if (protector == null){ + if (protector == null) { return; } // AESProtector protector = new AESProtector(); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/DomToSchemaProcessor.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/DomToSchemaProcessor.java index 43fe55da6a2..ba754e0650c 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/DomToSchemaProcessor.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/DomToSchemaProcessor.java @@ -110,7 +110,7 @@ public SchemaRegistry getSchemaRegistry() { } private SchemaDefinitionFactory getDefinitionFactory() { - return prismContext.getDefinitionFactory(); + return ((PrismContextImpl) prismContext).getDefinitionFactory(); } private String getNamespace() { diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/GlobalDefinitionsStore.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/GlobalDefinitionsStore.java index 30f212798cd..a4db8303778 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/GlobalDefinitionsStore.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/GlobalDefinitionsStore.java @@ -18,17 +18,19 @@ import com.evolveum.midpoint.prism.*; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import javax.xml.namespace.QName; -import java.util.List; /** + * Used to retrieve definition from 'global definition store' - i.e. store that contains a group of related definition(s), + * sharing e.g. a common namespace. Such stores are prism schemas and schema registry itself. + * * Note: although all of these methods are '@Nullable', we don't mark them as such, to avoid false 'may produce NPE' * warnings for cases that will never produce nulls (like searching for known items/CTDs). * * @author mederly */ +@SuppressWarnings("unused") public interface GlobalDefinitionsStore extends DefinitionsStore { // new API @@ -53,7 +55,20 @@ public interface GlobalDefinitionsStore extends DefinitionsStore { // PrismObject-related - // non-core methods + // core methods + + CD findContainerDefinitionByCompileTimeClass( + @NotNull Class compileTimeClass, @NotNull Class definitionClass); + + ID findItemDefinitionByType(@NotNull QName typeName, @NotNull Class definitionClass); + + ID findItemDefinitionByElementName(@NotNull QName elementName, @NotNull Class definitionClass); + + ComplexTypeDefinition findComplexTypeDefinitionByCompileTimeClass(@NotNull Class compileTimeClass); + + ComplexTypeDefinition findComplexTypeDefinitionByType(@NotNull QName typeName); + + // non-core (derived) methods @SuppressWarnings("unchecked") default PrismObjectDefinition findObjectDefinitionByCompileTimeClass(@NotNull Class compileTimeClass) { @@ -119,24 +134,11 @@ default ID findItemDefinition(@NotNull QName element return findItemDefinitionByElementName(elementName, definitionClass); } - // ComplexTypeDefinition-related @Deprecated default ComplexTypeDefinition findComplexTypeDefinition(@NotNull QName typeName) { return findComplexTypeDefinitionByType(typeName); } - // core methods - - CD findContainerDefinitionByCompileTimeClass( - @NotNull Class compileTimeClass, @NotNull Class definitionClass); - - ID findItemDefinitionByType(@NotNull QName typeName, @NotNull Class definitionClass); - - ID findItemDefinitionByElementName(@NotNull QName elementName, @NotNull Class definitionClass); - - ComplexTypeDefinition findComplexTypeDefinitionByCompileTimeClass(@NotNull Class compileTimeClass); - - ComplexTypeDefinition findComplexTypeDefinitionByType(@NotNull QName typeName); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistry.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistry.java index baf20cbe6a4..361357cca90 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistry.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistry.java @@ -31,6 +31,7 @@ import java.io.IOException; import java.util.Collection; import java.util.List; +import java.util.function.Function; /** * @author mederly @@ -55,6 +56,10 @@ public interface SchemaRegistry extends DebugDumpable, GlobalDefinitionsStore { Collection getCompileTimePackages(); + ItemDefinition locateItemDefinition(@NotNull QName itemName, + @Nullable ComplexTypeDefinition complexTypeDefinition, + @Nullable Function dynamicDefinitionResolver) throws SchemaException; + // TODO fix this temporary and inefficient implementation QName resolveUnqualifiedTypeName(QName type) throws SchemaException; @@ -77,6 +82,14 @@ public interface SchemaRegistry extends DebugDumpable, GlobalDefinitionsStore { PrismSchema findSchemaByCompileTimeClass(Class compileTimeClass); + /** + * Tries to determine type name for any class (primitive, complex one). + * Does not use schemas (TODO explanation) + * @param clazz + * @return + */ + QName determineTypeForClass(Class clazz); + /** * This method will try to locate the appropriate object definition and apply it. */ @@ -113,8 +126,19 @@ T findItemDefinitionByFullPath(Class containerDefinition) throws SchemaException; - ItemDefinition resolveGlobalItemDefinition(QName elementQName, @Nullable ComplexTypeDefinition containerCTD) throws SchemaException; + ItemDefinition resolveGlobalItemDefinition(QName itemName, @Nullable ComplexTypeDefinition complexTypeDefinition) throws SchemaException; @Deprecated // use methods from PrismContext PrismObject instantiate(Class compileTimeClass) throws SchemaException; + + // Takes XSD types into account as well + Class determineClassForType(QName type); + + // Takes XSD types into account as well + Class determineClassForItemDefinition(ItemDefinition itemDefinition); + + ID selectMoreSpecific(ID def1, ID def2) + throws SchemaException; + + boolean isAssignableFrom(QName superType, QName subType); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistryImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistryImpl.java index e009332100a..110b611dc57 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistryImpl.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistryImpl.java @@ -29,6 +29,7 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; +import java.util.function.Function; import javax.xml.XMLConstants; import javax.xml.namespace.QName; @@ -37,6 +38,9 @@ import com.evolveum.midpoint.prism.*; +import com.evolveum.midpoint.prism.xml.XmlTypeConverter; +import com.evolveum.midpoint.prism.xml.XsdTypeMapper; +import com.evolveum.midpoint.prism.xnode.XNode; import com.evolveum.midpoint.util.QNameUtil; import com.evolveum.prism.xml.ns._public.types_3.ObjectType; import org.apache.commons.lang.StringUtils; @@ -96,7 +100,7 @@ public class SchemaRegistryImpl implements DebugDumpable, SchemaRegistry { private PrismContext prismContext; private static final Trace LOGGER = TraceManager.getTrace(SchemaRegistry.class); - + @Override public DynamicNamespacePrefixMapper getNamespacePrefixMapper() { return namespacePrefixMapper; @@ -126,19 +130,19 @@ public Map getParsedSchemas() { public EntityResolver getBuiltinSchemaResolver() { return builtinSchemaResolver; } -// -// public File[] getCatalogFiles() { -// return catalogFiles; -// } -// -// public void setCatalogFiles(File[] catalogFiles) { -// this.catalogFiles = catalogFiles; -// } -// -// public String getCatalogResourceName() { -// return catalogResourceName; -// } -// + + public File[] getCatalogFiles() { + return catalogFiles; + } + + public void setCatalogFiles(File[] catalogFiles) { + this.catalogFiles = catalogFiles; + } + + public String getCatalogResourceName() { + return catalogResourceName; + } + public void setCatalogResourceName(String catalogResourceName) { this.catalogResourceName = catalogResourceName; } @@ -787,6 +791,16 @@ public Class determineCompileTimeClass(QName typeName) { return JAXBUtil.findClassForType(typeName, pkg); } + @NotNull + public Class determineCompileTimeClassNotNull(QName typeName) { + Class clazz = determineCompileTimeClass(typeName); + if (clazz != null) { + return clazz; + } else { + throw new IllegalStateException("No class for " + typeName); + } + } + @Override public Class getCompileTimeClass(QName xsdType) { return determineCompileTimeClass(xsdType); @@ -818,12 +832,37 @@ public PrismObjectDefinition determineDefinitionFromClass(Class compileTimeClass return def; } Class superclass = compileTimeClass.getSuperclass(); - if (superclass == Object.class) { + if (superclass == null || superclass == Object.class) { return null; } return determineDefinitionFromClass(superclass); } + @Override + public ItemDefinition locateItemDefinition(@NotNull QName itemName, + @Nullable ComplexTypeDefinition complexTypeDefinition, + @Nullable Function dynamicDefinitionResolver) throws SchemaException { + ItemDefinition def; + if (complexTypeDefinition != null) { + def = complexTypeDefinition.findItemDefinition(itemName); + if (def != null) { + return def; + } + } + if (complexTypeDefinition == null || complexTypeDefinition.isXsdAnyMarker()) { + def = resolveGlobalItemDefinition(itemName, complexTypeDefinition); + if (def != null) { + return def; + } + } + if (dynamicDefinitionResolver != null) { + def = dynamicDefinitionResolver.apply(itemName); + if (def != null) { + return def; + } + } + return null; + } //endregion //region Unqualified names resolution @@ -939,20 +978,19 @@ public ItemDefinition resolveGlobalItemDefinition(QName elementQName, PrismConta } @Override - public ItemDefinition resolveGlobalItemDefinition(QName elementQName, @Nullable ComplexTypeDefinition containerCTD) throws SchemaException { - String elementNamespace = elementQName.getNamespaceURI(); + public ItemDefinition resolveGlobalItemDefinition(QName itemName, @Nullable ComplexTypeDefinition complexTypeDefinition) throws SchemaException { + String elementNamespace = itemName.getNamespaceURI(); if (StringUtils.isEmpty(elementNamespace)) { - List ignoredNamespaces = containerCTD != null ? - containerCTD.getIgnoredNamespaces() : + List ignoredNamespaces = complexTypeDefinition != null ? + complexTypeDefinition.getIgnoredNamespaces() : null; - return resolveGlobalItemDefinitionWithoutNamespace(elementQName.getLocalPart(), ItemDefinition.class, true, ignoredNamespaces); + return resolveGlobalItemDefinitionWithoutNamespace(itemName.getLocalPart(), ItemDefinition.class, true, ignoredNamespaces); } PrismSchema schema = findSchemaByNamespace(elementNamespace); if (schema == null) { return null; } - ItemDefinition itemDefinition = schema.findItemDefinitionByElementName(elementQName, ItemDefinition.class); - return itemDefinition; + return schema.findItemDefinitionByElementName(itemName, ItemDefinition.class); } private T resolveGlobalItemDefinitionWithoutNamespace(String localPart, Class definitionClass) { @@ -1118,5 +1156,72 @@ public boolean hasImplicitTypeDefinition(QName elementName, QName typeName) { } return QNameUtil.match(typeName, itemDefinition.getTypeName()); } + + @Override + public QName determineTypeForClass(Class clazz) { + if (XmlTypeConverter.canConvert(clazz)) { + return XsdTypeMapper.toXsdType(clazz); + } else { + return ((PrismContextImpl) prismContext).getBeanConverter().determineTypeForClass(clazz); + } + } + + @Override + public Class determineClassForType(QName type) { + if (XmlTypeConverter.canConvert(type)) { + return XsdTypeMapper.toJavaType(type); + } else { + return determineCompileTimeClass(type); + } + } + + @Override + public Class determineClassForItemDefinition(ItemDefinition itemDefinition) { + if (itemDefinition instanceof PrismContainerDefinition) { + Class cls = ((PrismContainerDefinition) itemDefinition).getCompileTimeClass(); + if (cls != null) { + return cls; + } + } + return determineClassForType(itemDefinition.getTypeName()); + } + + @Override + public ID selectMoreSpecific(ID def1, ID def2) + throws SchemaException { + if (def1 == null) { + return def2; + } + if (def2 == null) { + return def1; + } + if (QNameUtil.match(def1.getTypeName(), def2.getTypeName())) { + return def1; + } + Class cls1 = determineClassForItemDefinition(def1); + Class cls2 = determineClassForItemDefinition(def2); + if (cls1 == null || cls2 == null) { + throw new SchemaException("Couldn't find more specific type from " + def1.getTypeName() + + " (" + cls1 + ") and " + def2.getTypeName() + " (" + cls2 + ")"); + } + if (cls1.isAssignableFrom(cls2)) { + return def2; + } + if (cls2.isAssignableFrom(cls1)) { + return def1; + } + throw new SchemaException("Couldn't find more specific type from " + def1.getTypeName() + + " (" + cls1 + ") and " + def2.getTypeName() + " (" + cls2 + ")"); + } + + @Override + public boolean isAssignableFrom(@NotNull QName superType, @NotNull QName subType) { + if (QNameUtil.match(superType, subType)) { + return true; + } + Class superClass = determineCompileTimeClassNotNull(superType); + Class subClass = determineCompileTimeClassNotNull(subType); + return superClass.isAssignableFrom(subClass); + } //endregion } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaToDomProcessor.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaToDomProcessor.java index 442df10cbb7..0295fdf9781 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaToDomProcessor.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaToDomProcessor.java @@ -28,19 +28,12 @@ import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; +import com.evolveum.midpoint.prism.*; import org.jetbrains.annotations.NotNull; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; -import com.evolveum.midpoint.prism.ComplexTypeDefinition; -import com.evolveum.midpoint.prism.Definition; -import com.evolveum.midpoint.prism.ItemDefinition; -import com.evolveum.midpoint.prism.PrismContainerDefinition; -import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.PrismPropertyDefinition; -import com.evolveum.midpoint.prism.PrismReferenceDefinition; -import com.evolveum.midpoint.prism.PrismReferenceValue; import com.evolveum.midpoint.prism.xml.DynamicNamespacePrefixMapper; import com.evolveum.midpoint.prism.xml.XmlTypeConverter; import com.evolveum.midpoint.prism.xml.XsdTypeMapper; @@ -100,7 +93,7 @@ public void setNamespacePrefixMapper(DynamicNamespacePrefixMapper namespacePrefi } private SchemaDefinitionFactory getDefinitionFactory() { - return prismContext.getDefinitionFactory(); + return ((PrismContextImpl) prismContext).getDefinitionFactory(); } private String getNamespace() { diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/PrismTestUtil.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/PrismTestUtil.java index 0fdbde5c30f..c116eaf461f 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/PrismTestUtil.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/PrismTestUtil.java @@ -166,15 +166,15 @@ public static String serializeAnyDataWrapped(Object o) throws SchemaException { // ========================== public static T parseAtomicValue(File file, QName type) throws SchemaException, IOException { - return getPrismContext().parserFor(file).parseAtomicValue(type); + return getPrismContext().parserFor(file).type(type).parseRealValue(); } public static T parseAtomicValue(String data, QName type) throws SchemaException { - return getPrismContext().parserFor(data).parseAtomicValue(type); + return getPrismContext().parserFor(data).type(type).parseRealValue(); } public static T parseAnyValue(File file) throws SchemaException, IOException { - return getPrismContext().parserFor(file).parseAnyValue(); + return getPrismContext().parserFor(file).parseRealValue(); } public static PrismObjectDefinition getObjectDefinition(Class compileTimeClass) { @@ -205,7 +205,7 @@ public static void displayTestTitle(String testName) { } public static SearchFilterType unmarshalFilter(File file) throws Exception { - return prismContext.parserFor(file).parseAtomicValue(SearchFilterType.COMPLEX_TYPE); + return prismContext.parserFor(file).parseRealValue(SearchFilterType.class); } public static ObjectFilter getFilterCondition(ObjectFilter filter, int index) { diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/PrismUtil.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/PrismUtil.java index 8f2e4eb9fa9..eeefa5bc1e9 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/PrismUtil.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/PrismUtil.java @@ -15,20 +15,11 @@ */ package com.evolveum.midpoint.prism.util; -import com.evolveum.midpoint.prism.Item; -import com.evolveum.midpoint.prism.ItemDefinition; -import com.evolveum.midpoint.prism.Objectable; -import com.evolveum.midpoint.prism.PrismConstants; -import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.PrismObject; -import com.evolveum.midpoint.prism.PrismProperty; -import com.evolveum.midpoint.prism.PrismPropertyDefinition; -import com.evolveum.midpoint.prism.PrismPropertyValue; -import com.evolveum.midpoint.prism.PrismValue; +import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.delta.ItemDelta; import com.evolveum.midpoint.prism.lex.dom.DomLexicalProcessor; import com.evolveum.midpoint.prism.marshaller.PrismBeanConverter; -import com.evolveum.midpoint.prism.marshaller.XNodeProcessor; +import com.evolveum.midpoint.prism.marshaller.PrismUnmarshaller; import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.prism.polystring.PolyStringNormalizer; import com.evolveum.midpoint.prism.xml.XsdTypeMapper; @@ -37,6 +28,7 @@ import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; import org.apache.commons.lang.StringUtils; +import org.jetbrains.annotations.NotNull; import org.w3c.dom.Attr; import org.w3c.dom.Document; import org.w3c.dom.Element; @@ -147,27 +139,15 @@ public static boolean isEmpty(PolyStringType value) { return true; } - public static XNodeProcessor getXnodeProcessor(PrismContext prismContext) { - if (prismContext == null) { - return new XNodeProcessor(); - } else { - return prismContext.getXnodeProcessor(); - } + public static PrismUnmarshaller getXnodeProcessor(@NotNull PrismContext prismContext) { + return ((PrismContextImpl) prismContext).getPrismUnmarshaller(); } - public static PrismBeanConverter getBeanConverter(PrismContext prismContext) { - if (prismContext == null) { - return new PrismBeanConverter(null, null); - } else { - return prismContext.getBeanConverter(); - } - } - public static DomLexicalProcessor getDomParser(PrismContext prismContext) { if (prismContext == null) { return new DomLexicalProcessor(null); } else { - return prismContext.getParserDom(); + return ((PrismContextImpl) prismContext).getParserDom(); } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/RawTypeUtil.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/RawTypeUtil.java index 73e1a8c59d3..213c521bcad 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/RawTypeUtil.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/RawTypeUtil.java @@ -35,7 +35,7 @@ public static Item getP List parsedValues = new ArrayList(); for (RawType rawValue : values){ if (itemDefinition == null && containerDef != null){ - itemDefinition = (ID) ((PrismContextImpl) containerDef.getPrismContext()).getXnodeProcessor().locateItemDefinition(containerDef, elementQName, rawValue.getXnode()); + itemDefinition = (ID) ((PrismContextImpl) containerDef.getPrismContext()).getPrismUnmarshaller().locateItemDefinition(containerDef, elementQName, rawValue.getXnode()); } IV parsed = rawValue.getParsedValue(itemDefinition, elementQName); if (parsed != null){ @@ -89,7 +89,7 @@ public static Item getP } // public static Object toAny(PrismValue value, Document document, PrismContext prismContext) throws SchemaException{ -// DomParser domParser = prismContext.getParserDom(); +// DomParser domProcessor = prismContext.getParserDom(); //// Document document = DOMUtil.getDocument(); // if (value == null) { // return value; @@ -103,7 +103,7 @@ public static Item getP // if (rawElement instanceof Element) { // return ((Element)rawElement).cloneNode(true); // } else if (rawElement instanceof MapXNode) { -// return domParser.serializeXMapToElement((MapXNode)rawElement, elementName); +// return domProcessor.serializeXMapToElement((MapXNode)rawElement, elementName); // } else if (rawElement instanceof PrimitiveXNode) { // PrimitiveXNode xprim = (PrimitiveXNode)rawElement; // String stringValue = xprim.getStringValue(); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xjc/PrismForJAXBUtil.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xjc/PrismForJAXBUtil.java index ed12b616629..bacf4d4f4a2 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xjc/PrismForJAXBUtil.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xjc/PrismForJAXBUtil.java @@ -446,7 +446,7 @@ public static void setReferenceTargetName(PrismReferenceValue rval, PolyStringTy private static DomLexicalProcessor getDomParser(PrismValue pval) { PrismContext prismContext = pval.getPrismContext(); if (prismContext != null) { - return prismContext.getParserDom(); + return ((PrismContextImpl) prismContext).getParserDom(); } else { DomLexicalProcessor parser = new DomLexicalProcessor(null); return parser; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/MapXNode.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/MapXNode.java index c1f4a73c89d..01dcbdfc3cc 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/MapXNode.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/MapXNode.java @@ -373,6 +373,11 @@ public XNode replace(QName key, XNode value) { return put(key, value); } + public RootXNode getEntryAsRoot(@NotNull QName key) { + XNode xnode = get(key); + return xnode != null ? new RootXNode(key, xnode) : null; + } + private class Entry implements Map.Entry, Serializable { private QName key; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/RootXNode.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/RootXNode.java index cffebfae9de..2dcc1792236 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/RootXNode.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/RootXNode.java @@ -17,9 +17,11 @@ import com.evolveum.midpoint.prism.Visitor; import com.evolveum.midpoint.util.DebugUtil; +import org.apache.commons.lang.Validate; import org.jetbrains.annotations.NotNull; import javax.xml.namespace.QName; +import java.util.Map; public class RootXNode extends XNode { @@ -35,7 +37,13 @@ public RootXNode(@NotNull QName rootElementName, XNode subnode) { this.subnode = subnode; } - // TODO consider if this is clean enough... The whole concept of root node (as child of XNode) has to be thought out + public RootXNode(@NotNull Map.Entry entry) { + Validate.notNull(entry.getKey()); + this.rootElementName = entry.getKey(); + this.subnode = entry.getValue(); + } + + // TODO consider if this is clean enough... The whole concept of root node (as child of XNode) has to be thought out @Override public QName getTypeQName() { if (typeQName != null) { @@ -126,7 +134,7 @@ public int hashCode() { return result; } - public MapXNode asMapXNode() { + public MapXNode toMapXNode() { MapXNode map = new MapXNode(); map.put(rootElementName, subnode); if (subnode.getTypeQName() == null) { @@ -134,4 +142,9 @@ public MapXNode asMapXNode() { } return map; } + + @Override + public RootXNode toRootXNode() { + return this; + } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/XNode.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/XNode.java index ada00fc1f34..5715938ca32 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/XNode.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/XNode.java @@ -47,6 +47,8 @@ public abstract class XNode implements DebugDumpable, Visitable, Cloneable, Seri public static final QName KEY_REFERENCE_TARGET_NAME = new QName(null, "targetName"); public static final QName KEY_REFERENCE_OBJECT = new QName(null, "object"); + public static final QName DUMMY_NAME = new QName(null, "dummy"); + // Common fields protected XNode parent; @@ -149,7 +151,9 @@ public XNode cloneTransformKeys(Transformer keyTransformer) { private static X cloneTransformKeys(Transformer keyTransformer, X xnode) { XNode xclone; - if (xnode instanceof PrimitiveXNode) { + if (xnode == null) { + return null; + } else if (xnode instanceof PrimitiveXNode) { return (X) ((PrimitiveXNode) xnode).cloneInternal(); } else if (xnode instanceof MapXNode) { MapXNode xmap = (MapXNode)xnode; @@ -168,6 +172,9 @@ private static X cloneTransformKeys(Transformer k for (XNode xsubnode: ((ListXNode)xnode)) { ((ListXNode) xclone).add(cloneTransformKeys(keyTransformer, xsubnode)); } + } else if (xnode instanceof RootXNode) { + xclone = new RootXNode(((RootXNode) xnode).getRootElementName(), + cloneTransformKeys(keyTransformer, ((RootXNode) xnode).getSubnode())); } else { throw new IllegalArgumentException("Unknown xnode "+xnode); } @@ -200,5 +207,9 @@ protected String dumpSuffix() { } return sb.toString(); } - + + // overriden in RootXNode + public RootXNode toRootXNode() { + return new RootXNode(XNode.DUMMY_NAME, this); + } } diff --git a/infra/prism/src/main/java/com/evolveum/prism/xml/ns/_public/types_3/RawType.java b/infra/prism/src/main/java/com/evolveum/prism/xml/ns/_public/types_3/RawType.java index 1d9f29050d1..5221ee74067 100644 --- a/infra/prism/src/main/java/com/evolveum/prism/xml/ns/_public/types_3/RawType.java +++ b/infra/prism/src/main/java/com/evolveum/prism/xml/ns/_public/types_3/RawType.java @@ -1,14 +1,15 @@ package com.evolveum.prism.xml.ns._public.types_3; import com.evolveum.midpoint.prism.*; -import com.evolveum.midpoint.prism.marshaller.XNodeProcessor; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.util.PrismUtil; import com.evolveum.midpoint.prism.xnode.PrimitiveXNode; +import com.evolveum.midpoint.prism.xnode.RootXNode; import com.evolveum.midpoint.prism.xnode.XNode; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.util.exception.SystemException; import org.apache.commons.lang.Validate; +import org.jetbrains.annotations.NotNull; import org.jvnet.jaxb2_commons.lang.Equals; import org.jvnet.jaxb2_commons.lang.EqualsStrategy; import org.jvnet.jaxb2_commons.locator.ObjectLocator; @@ -68,6 +69,11 @@ public XNode getXnode() { return xnode; } + @NotNull + public RootXNode getRootXNode(@NotNull QName itemName) { + return new RootXNode(itemName, xnode); + } + public PrismContext getPrismContext() { return prismContext; } @@ -86,14 +92,14 @@ public IV getParsedValue(ItemD itemName = itemDefinition.getName(); } checkPrismContext(); - Item subItem = PrismUtil.getXnodeProcessor(prismContext).parseItem(xnode, itemName, itemDefinition, ParsingContext.createDefault()); + Item subItem = prismContext.parserFor(getRootXNode(itemName)).name(itemName).definition(itemDefinition).parseItem(); if (!subItem.isEmpty()){ value = subItem.getValue(0); } else { value = null; } } else { - PrismProperty subItem = XNodeProcessor.parsePrismPropertyRaw(xnode, itemName, prismContext); + PrismProperty subItem = PrismProperty.createRaw(xnode, itemName, prismContext); value = (IV) subItem.getValue(); } xnode = null; @@ -105,10 +111,9 @@ public IV getParsedValue(ItemD } public V getParsedRealValue(ItemDefinition itemDefinition, ItemPath itemPath) throws SchemaException { - if (parsed == null && xnode != null){ - - if (itemDefinition == null){ - return PrismUtil.getXnodeProcessor(prismContext).parseAnyValue(xnode, ParsingContext.createDefault()); + if (parsed == null && xnode != null) { + if (itemDefinition == null) { + return prismContext.parserFor(xnode.toRootXNode()).parseRealValue(); // TODO what will be the result without definition? } else { QName itemName = ItemPath.getName(itemPath.lastNamed()); getParsedValue(itemDefinition, itemName); @@ -148,17 +153,17 @@ public Item getParsedIt public XNode serializeToXNode() throws SchemaException { if (xnode != null) { - QName type = xnode.getTypeQName(); - if (xnode instanceof PrimitiveXNode && type != null){ - if (!((PrimitiveXNode)xnode).isParsed()){ - Object realValue = PrismUtil.getXnodeProcessor(prismContext).parseAnyValue(xnode, ParsingContext.createDefault()); - ((PrimitiveXNode)xnode).setValue(realValue, type); - } - } +// QName type = xnode.getTypeQName(); +// if (xnode instanceof PrimitiveXNode && type != null){ +// if (!((PrimitiveXNode)xnode).isParsed()){ +// Object realValue = PrismUtil.getXnodeProcessor(prismContext).parseAnyValue(xnode, ParsingContext.createDefault()); +// ((PrimitiveXNode)xnode).setValue(realValue, type); +// } +// } return xnode; } else if (parsed != null) { checkPrismContext(); - return PrismUtil.getXnodeProcessor(prismContext).serializeItemValue(parsed); + return prismContext.xnodeSerializer().serialize(parsed).getSubnode(); } else { return null; // or an exception here? } diff --git a/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestExtraSchema.java b/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestExtraSchema.java index 8a93067a48f..0c49b801b4c 100644 --- a/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestExtraSchema.java +++ b/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestExtraSchema.java @@ -124,7 +124,7 @@ public void testUserExtensionSchemaParseUser() throws SAXException, IOException, context.initialize(); // Parsing user - PrismObject user = context.parserFor(DOMUtil.getFirstChildElement(dataDoc)).parse(); + PrismObject user = context.parserFor(DOMUtil.getFirstChildElement(dataDoc)).compat().parse(); // items from user extension are not correctly defined in the schema assertNotNull("No definition for user", user.getDefinition()); System.out.println("Parsed root object:"); diff --git a/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestXmlSerialization.java b/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestXmlSerialization.java index 8b2077ab974..de549d92689 100644 --- a/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestXmlSerialization.java +++ b/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestXmlSerialization.java @@ -16,6 +16,7 @@ package com.evolveum.midpoint.prism; +import com.evolveum.midpoint.prism.lex.dom.DomLexicalProcessor; import com.evolveum.midpoint.prism.util.PrismTestUtil; import com.evolveum.midpoint.prism.xnode.PrimitiveXNode; import com.evolveum.midpoint.util.PrettyPrinter; @@ -60,12 +61,13 @@ public void testHandlingInvalidChars() throws Exception { // THEN - String ok = prismContext.getParserDom().write(valOkNode, new QName("ok"), null); + final DomLexicalProcessor domLexicalProcessor = ((PrismContextImpl) prismContext).getParserDom(); + String ok = domLexicalProcessor.write(valOkNode, new QName("ok"), null); System.out.println("correct value serialized to: " + ok); assertEquals("Wrong serialization", "abcdef", ok.trim()); // todo make this less brittle with regards to serialization style try { - String wrong = prismContext.getParserDom().write(valWrongNode, new QName("wrong"), null); + String wrong = domLexicalProcessor.write(valWrongNode, new QName("wrong"), null); System.out.println("wrong value serialized to: " + wrong); assert false : "Wrong value serialization had to fail but it didn't!"; } catch (RuntimeException e) { diff --git a/infra/prism/src/test/java/com/evolveum/midpoint/prism/foo/EventHandlerChainType.java b/infra/prism/src/test/java/com/evolveum/midpoint/prism/foo/EventHandlerChainType.java index 0049d353386..0f6d87db3f9 100644 --- a/infra/prism/src/test/java/com/evolveum/midpoint/prism/foo/EventHandlerChainType.java +++ b/infra/prism/src/test/java/com/evolveum/midpoint/prism/foo/EventHandlerChainType.java @@ -45,6 +45,7 @@ public class EventHandlerChainType extends EventHandlerType implements Serializable, Cloneable, Equals, HashCode { + public final static QName COMPLEX_TYPE = new QName("http://midpoint.evolveum.com/xml/ns/test/foo-1.xsd", "EventHandlerChainType"); private final static long serialVersionUID = 201105211233L; @XmlElementRef(name = "handler", namespace = "http://midpoint.evolveum.com/xml/ns/test/foo-1.xsd", type = JAXBElement.class, required = false) diff --git a/infra/prism/src/test/java/com/evolveum/midpoint/prism/lex/AbstractLexicalProcessorTest.java b/infra/prism/src/test/java/com/evolveum/midpoint/prism/lex/AbstractLexicalProcessorTest.java index 802c105a15d..b5f3a800d4e 100644 --- a/infra/prism/src/test/java/com/evolveum/midpoint/prism/lex/AbstractLexicalProcessorTest.java +++ b/infra/prism/src/test/java/com/evolveum/midpoint/prism/lex/AbstractLexicalProcessorTest.java @@ -33,7 +33,6 @@ import com.evolveum.midpoint.prism.delta.*; import com.evolveum.midpoint.prism.foo.EventHandlerChainType; import com.evolveum.midpoint.prism.foo.EventHandlerType; -import com.evolveum.midpoint.prism.marshaller.XNodeProcessor; import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; import com.evolveum.prism.xml.ns._public.types_3.SchemaDefinitionType; @@ -83,7 +82,7 @@ protected File getFile(String baseName) { return new File(getCommonSubdir(), baseName+"."+getFilenameSuffix()); } - protected abstract LexicalProcessor createParser(); + protected abstract LexicalProcessor createParser(); @Test @@ -94,15 +93,14 @@ public void testParseUserToPrism() throws Exception { // GIVEN LexicalProcessor lexicalProcessor = createParser(); PrismContext prismContext = PrismTestUtil.getPrismContext(); - XNodeProcessor processor = new XNodeProcessor(prismContext); // WHEN (parse to xnode) - XNode xnode = lexicalProcessor.read(getFileSource(USER_JACK_FILE_BASENAME), ParsingContext.createDefault()); + RootXNode xnode = lexicalProcessor.read(getFileSource(USER_JACK_FILE_BASENAME), ParsingContext.createDefault()); System.out.println("XNode after parsing:"); System.out.println(xnode.debugDump()); // WHEN (parse to prism) - PrismObject user = processor.parseObject(xnode, ParsingContext.createDefault()); + PrismObject user = prismContext.parserFor(xnode).parse(); // THEN System.out.println("Parsed user:"); @@ -124,15 +122,14 @@ public void testParseUserRoundTrip() throws Exception { displayTestTitle(TEST_NAME); // GIVEN - LexicalProcessor lexicalProcessor = createParser(); + LexicalProcessor lexicalProcessor = createParser(); PrismContext prismContext = PrismTestUtil.getPrismContext(); - XNodeProcessor processor = new XNodeProcessor(prismContext); // WHEN (parse) - XNode xnode = lexicalProcessor.read(getFileSource(USER_JACK_FILE_BASENAME), ParsingContext.createDefault()); + RootXNode xnode = lexicalProcessor.read(getFileSource(USER_JACK_FILE_BASENAME), ParsingContext.createDefault()); System.out.println("\nParsed xnode:"); System.out.println(xnode.debugDump()); - PrismObject user = processor.parseObject(xnode, ParsingContext.createDefault()); + PrismObject user = prismContext.parserFor(xnode).parse(); // THEN System.out.println("\nParsed user:"); @@ -141,7 +138,9 @@ public void testParseUserRoundTrip() throws Exception { assertUserJack(user); // WHEN (re-serialize to XNode) - XNode serializedXNode = processor.serializeObject(user, true); + RootXNode serializedXNode = prismContext.xnodeSerializer() + .options(SerializationOptions.createSerializeCompositeObjects()) + .serialize(user); String serializedString = lexicalProcessor.write(serializedXNode, new QName(NS_FOO, "user"), null); // THEN @@ -175,8 +174,8 @@ public void testParseUserRoundTrip() throws Exception { validateUserSchema(serializedString, prismContext); // WHEN (re-parse) - XNode reparsedXnode = lexicalProcessor.read(new ParserStringSource(serializedString), ParsingContext.createDefault()); - PrismObject reparsedUser = processor.parseObject(reparsedXnode, ParsingContext.createDefault()); + RootXNode reparsedXnode = lexicalProcessor.read(new ParserStringSource(serializedString), ParsingContext.createDefault()); + PrismObject reparsedUser = prismContext.parserFor(reparsedXnode).parse(); // THEN System.out.println("\nXNode after re-parsing:"); @@ -210,15 +209,14 @@ public void testParseResourceRumToPrism() throws Exception { // GIVEN LexicalProcessor lexicalProcessor = createParser(); PrismContext prismContext = PrismTestUtil.getPrismContext(); - XNodeProcessor processor = new XNodeProcessor(prismContext); - + // WHEN (parse to xnode) - XNode xnode = lexicalProcessor.read(getFileSource(RESOURCE_RUM_FILE_BASENAME), ParsingContext.createDefault()); + RootXNode xnode = lexicalProcessor.read(getFileSource(RESOURCE_RUM_FILE_BASENAME), ParsingContext.createDefault()); System.out.println("XNode after parsing:"); System.out.println(xnode.debugDump()); // WHEN (parse to prism) - PrismObject resource = processor.parseObject(xnode, ParsingContext.createDefault()); + PrismObject resource = prismContext.parserFor(xnode).parse(); // THEN System.out.println("Parsed resource:"); @@ -234,13 +232,12 @@ public void testParseResourceRoundTrip() throws Exception { displayTestTitle(TEST_NAME); // GIVEN - LexicalProcessor lexicalProcessor = createParser(); + LexicalProcessor lexicalProcessor = createParser(); PrismContext prismContext = PrismTestUtil.getPrismContext(); - XNodeProcessor processor = new XNodeProcessor(prismContext); - + // WHEN (parse) - XNode xnode = lexicalProcessor.read(getFileSource(RESOURCE_RUM_FILE_BASENAME), ParsingContext.createDefault()); - PrismObject resource = processor.parseObject(xnode, ParsingContext.createDefault()); + RootXNode xnode = lexicalProcessor.read(getFileSource(RESOURCE_RUM_FILE_BASENAME), ParsingContext.createDefault()); + PrismObject resource = prismContext.parserFor(xnode).parse(); // THEN System.out.println("\nParsed resource:"); @@ -249,7 +246,9 @@ public void testParseResourceRoundTrip() throws Exception { assertResourceRum(resource); // WHEN (re-serialize to XNode) - XNode serializedXNode = processor.serializeObject(resource, true); + XNode serializedXNode = prismContext.xnodeSerializer() + .options(SerializationOptions.createSerializeCompositeObjects()) + .serialize(resource); String serializedString = lexicalProcessor.write(serializedXNode, new QName(NS_FOO, "resource"), null); // THEN @@ -258,34 +257,11 @@ public void testParseResourceRoundTrip() throws Exception { System.out.println("\nRe-serialized string:"); System.out.println(serializedString); -// try{ -//// FileOutputStream out = new FileOutputStream(new File("D:/user-jack-prism.json")); -// PrismJsonSerializer jsonSer = new PrismJsonSerializer(); -// String s = jsonSer.serializeToString((RootXNode) serializedXNode); -// System.out.println("JSON: \n" + s); -// -//// FileOutputStream out = new FileOutputStream(new File("D:/user-jack-prism.json")); -// YamlParser yamlParser = new YamlParser(); -// s = yamlParser.serializeToString((RootXNode) serializedXNode); -// System.out.println("YAML: \n" + s); -// -//// FileInputStream in = new FileInputStream(new File("D:/user-jack-prism.json")); -//// XNode afterJson = jsonSer.parseObject(in); -//// -//// // THEN -//// System.out.println("AFTER JSON XNode:"); -//// System.out.println(afterJson.debugDump()); -// -// } catch (Exception ex){ -// System.out.println( ex); -// throw ex; -// } - validateResourceSchema(serializedString, prismContext); // WHEN (re-parse) - XNode reparsedXnode = lexicalProcessor.read(new ParserStringSource(serializedString), ParsingContext.createDefault()); - PrismObject reparsedResource = processor.parseObject(reparsedXnode, ParsingContext.createDefault()); + RootXNode reparsedXnode = lexicalProcessor.read(new ParserStringSource(serializedString), ParsingContext.createDefault()); + PrismObject reparsedResource = prismContext.parserFor(reparsedXnode).parse(); // THEN System.out.println("\nXNode after re-parsing:"); @@ -388,23 +364,23 @@ public void testParseEventHandler() throws Exception { // GIVEN LexicalProcessor lexicalProcessor = createParser(); PrismContext prismContext = PrismTestUtil.getPrismContext(); - XNodeProcessor processor = new XNodeProcessor(prismContext); // WHEN (parse to xnode) - RootXNode xnode = (RootXNode) lexicalProcessor.read(getFileSource(EVENT_HANDLER_FILE_BASENAME), ParsingContext.createDefault()); + RootXNode xnode = lexicalProcessor.read(getFileSource(EVENT_HANDLER_FILE_BASENAME), ParsingContext.createDefault()); System.out.println("XNode after parsing:"); System.out.println(xnode.debugDump()); // WHEN (parse to prism) - EventHandlerType eventHandlerType = prismContext.getBeanConverter().unmarshall((MapXNode) xnode.getSubnode(), EventHandlerChainType.class, - ParsingContext.createDefault()); + EventHandlerType eventHandlerType = prismContext.parserFor(xnode).parseRealValue(EventHandlerChainType.class); +// EventHandlerType eventHandlerType = prismContext.getBeanConverter().unmarshall((MapXNode) , EventHandlerChainType.class, +// ParsingContext.createDefault()); // THEN System.out.println("Parsed object:"); System.out.println(eventHandlerType); // WHEN2 (marshalling) - MapXNode marshalled = (MapXNode) prismContext.getBeanConverter().marshall(eventHandlerType); + MapXNode marshalled = (MapXNode) (prismContext.xnodeSerializer().serializeAtomicValue(eventHandlerType).getSubnode()); System.out.println("XNode after unmarshalling and marshalling back:"); System.out.println(marshalled.debugDump()); diff --git a/infra/prism/src/test/java/com/evolveum/midpoint/prism/lex/TestProtectedString.java b/infra/prism/src/test/java/com/evolveum/midpoint/prism/lex/TestProtectedString.java index 3b306d95124..0600d3ec6ab 100644 --- a/infra/prism/src/test/java/com/evolveum/midpoint/prism/lex/TestProtectedString.java +++ b/infra/prism/src/test/java/com/evolveum/midpoint/prism/lex/TestProtectedString.java @@ -17,6 +17,7 @@ import com.evolveum.midpoint.prism.ParsingContext; import com.evolveum.midpoint.prism.PrismContext; +import com.evolveum.midpoint.prism.PrismContextImpl; import com.evolveum.midpoint.prism.PrismInternalTestUtil; import com.evolveum.midpoint.prism.crypto.Protector; import com.evolveum.midpoint.prism.crypto.TestProtector; @@ -63,7 +64,7 @@ public void testParseProtectedString() throws Exception { // WHEN - MapXNode protectedStringTypeXNode = prismContext.getBeanConverter().marshalProtectedDataType(protectedStringType); + MapXNode protectedStringTypeXNode = ((PrismContextImpl) prismContext).getBeanConverter().marshalProtectedDataType(protectedStringType); System.out.println("Protected string type XNode: " + protectedStringTypeXNode.debugDump()); // THEN diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/DeltaConvertor.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/DeltaConvertor.java index 34be98f0a40..8f129b8d063 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/DeltaConvertor.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/DeltaConvertor.java @@ -22,23 +22,14 @@ import javax.xml.bind.JAXBException; import javax.xml.namespace.QName; -import com.evolveum.midpoint.prism.SerializationOptions; +import com.evolveum.midpoint.prism.*; import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; import org.apache.commons.lang.Validate; -import com.evolveum.midpoint.prism.Item; -import com.evolveum.midpoint.prism.ItemDefinition; -import com.evolveum.midpoint.prism.Objectable; -import com.evolveum.midpoint.prism.PrismConstants; -import com.evolveum.midpoint.prism.PrismContainerDefinition; -import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.PrismObject; -import com.evolveum.midpoint.prism.PrismObjectDefinition; -import com.evolveum.midpoint.prism.PrismValue; import com.evolveum.midpoint.prism.delta.ChangeType; import com.evolveum.midpoint.prism.delta.ItemDelta; import com.evolveum.midpoint.prism.delta.ObjectDelta; -import com.evolveum.midpoint.prism.marshaller.XNodeSerializer; +import com.evolveum.midpoint.prism.marshaller.PrismMarshaller; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.util.RawTypeUtil; import com.evolveum.midpoint.prism.xnode.XNode; @@ -56,6 +47,7 @@ import com.evolveum.prism.xml.ns._public.types_3.ObjectDeltaType; import com.evolveum.prism.xml.ns._public.types_3.ObjectType; import com.evolveum.prism.xml.ns._public.types_3.RawType; +import org.jetbrains.annotations.NotNull; /** * @author semancik @@ -430,12 +422,15 @@ private static void addOldValues(ItemDelta delta, ItemDeltaType mod, Collection< } } - private static XNode toXNode(ItemDelta delta, PrismValue value, DeltaConversionOptions options) throws SchemaException{ - XNodeSerializer serializer = delta.getPrismContext().getXnodeProcessor().createSerializer(); - SerializationOptions opts = new SerializationOptions(); - opts.setSerializeReferenceNames(DeltaConversionOptions.isSerializeReferenceNames(options)); - XNode node = serializer.serializeItemValue(value, delta.getDefinition(), opts); - if (delta.getDefinition() != null){ + private static XNode toXNode(ItemDelta delta, @NotNull PrismValue value, DeltaConversionOptions options) throws SchemaException{ + XNode node = delta.getPrismContext().xnodeSerializer() + .definition(delta.getDefinition()) + .options(DeltaConversionOptions.isSerializeReferenceNames(options) ? + SerializationOptions.createSerializeReferenceNames() : null) + .serialize(value) + .getSubnode(); + // TODO solve this within serializer! + if (delta.getDefinition() != null) { node.setTypeQName(delta.getDefinition().getTypeName()); node.setExplicitTypeDeclaration(true); } diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/MidPointPrismContextFactory.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/MidPointPrismContextFactory.java index 61b787bd9c8..7231a647b06 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/MidPointPrismContextFactory.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/MidPointPrismContextFactory.java @@ -28,6 +28,7 @@ import com.evolveum.midpoint.schema.internals.InternalMonitor; import com.evolveum.midpoint.schema.internals.InternalsConfig; +import org.jetbrains.annotations.NotNull; import org.xml.sax.SAXException; import com.evolveum.midpoint.prism.PrismContext; @@ -89,7 +90,8 @@ public PrismContext createInitializedPrismContext() throws SchemaException, SAXE context.initialize(); return context; } - + + @NotNull private SchemaRegistryImpl createSchemaRegistry() throws SchemaException, FileNotFoundException { SchemaRegistryImpl schemaRegistry = new SchemaRegistryImpl(); schemaRegistry.setDefaultNamespace(SchemaConstantsGenerated.NS_COMMON); diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/MiscSchemaUtil.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/MiscSchemaUtil.java index 31c2cfa9a17..6eaf6eb6c8b 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/MiscSchemaUtil.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/MiscSchemaUtil.java @@ -25,12 +25,14 @@ import javax.xml.datatype.XMLGregorianCalendar; import javax.xml.namespace.QName; +import javax.xml.soap.Detail; +import com.evolveum.midpoint.prism.*; +import com.evolveum.midpoint.prism.marshaller.PrismBeanConverter; +import com.evolveum.midpoint.prism.xnode.RootXNode; +import com.evolveum.midpoint.prism.xnode.XNode; import com.evolveum.midpoint.schema.RetrieveOption; -import com.evolveum.midpoint.prism.PrismConstants; -import com.evolveum.midpoint.prism.PrismObject; -import com.evolveum.midpoint.prism.PrismReferenceValue; import com.evolveum.midpoint.prism.delta.ItemDelta; import com.evolveum.midpoint.prism.delta.ObjectDelta; import com.evolveum.midpoint.prism.path.ItemPath; @@ -43,6 +45,7 @@ import com.evolveum.midpoint.util.MiscUtil; import com.evolveum.midpoint.util.QNameUtil; import com.evolveum.midpoint.util.exception.SchemaException; +import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.xml.ns._public.common.api_types_3.GetOperationOptionsType; import com.evolveum.midpoint.xml.ns._public.common.api_types_3.ImportOptionsType; import com.evolveum.midpoint.xml.ns._public.common.api_types_3.ObjectListType; @@ -61,6 +64,7 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.ProjectionPolicyType; import com.evolveum.midpoint.xml.ns._public.common.common_3.PropertyLimitationsType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowKindType; +import com.evolveum.midpoint.xml.ns._public.common.fault_3.FaultMessage; import com.evolveum.prism.xml.ns._public.types_3.ItemPathType; import com.evolveum.prism.xml.ns._public.types_3.ProtectedStringType; @@ -379,4 +383,20 @@ public static XMLGregorianCalendar getChangeTimestamp(MetadataType metadata) { return metadata.getCreateTimestamp(); } } + + // TODO some better place + public static void serializeFaultMessage(Detail detail, FaultMessage faultMessage, PrismContext prismContext, Trace logger) { + try { + PrismBeanConverter beanConverter = ((PrismContextImpl) prismContext).getBeanConverter(); + XNode faultMessageXnode = beanConverter.marshall(faultMessage.getFaultInfo()); // TODO + RootXNode xroot = new RootXNode(SchemaConstants.FAULT_MESSAGE_ELEMENT_NAME, faultMessageXnode); + xroot.setExplicitTypeDeclaration(true); + QName faultType = beanConverter.determineTypeForClass(faultMessage.getFaultInfo().getClass()); + xroot.setTypeQName(faultType); + ((PrismContextImpl) prismContext).getParserDom().serializeUnderElement(xroot, SchemaConstants.FAULT_MESSAGE_ELEMENT_NAME, detail); + } catch (SchemaException e) { + logger.error("Error serializing fault message (SOAP fault detail): {}", e.getMessage(), e); + } + } + } diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ParamsTypeUtil.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ParamsTypeUtil.java index 56d001c51fe..57bfa5fc888 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ParamsTypeUtil.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ParamsTypeUtil.java @@ -9,13 +9,11 @@ import javax.xml.bind.JAXBElement; import javax.xml.namespace.QName; +import com.evolveum.midpoint.prism.*; +import com.evolveum.midpoint.prism.xnode.RootXNode; import org.w3c.dom.Document; import org.w3c.dom.Element; -import com.evolveum.midpoint.prism.PrismConstants; -import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.SerializationContext; -import com.evolveum.midpoint.prism.SerializationOptions; import com.evolveum.midpoint.prism.xml.XmlTypeConverter; import com.evolveum.midpoint.prism.xnode.PrimitiveXNode; import com.evolveum.midpoint.prism.xnode.XNode; @@ -65,13 +63,11 @@ private static EntryType createEntryElement(Entry entry, P if (XmlTypeConverter.canConvert(entry.getValue().getClass())){ return createEntryElement(entry.getKey(), entry.getValue()); } else { - SerializationContext ctx = new SerializationContext(SerializationOptions.createSerializeReferenceNames()); - XNode xnode = prismContext.getXnodeProcessor().serializeAnyData(entry.getValue(), SchemaConstants.C_PARAM_VALUE, ctx); + RootXNode xnode = prismContext.xnodeSerializer() + .options(SerializationOptions.createSerializeReferenceNames()) + .serializeAnyData(entry.getValue(), SchemaConstants.C_PARAM_VALUE); return createEntryElement(entry.getKey(), new RawType(xnode, prismContext)); } -// result.setEntryValue(new JAXBElement(SchemaConstants.C_PARAM_VALUE, entry.getValue().getClass(), -// prismContext.serializeAnyData(entry.getValue(), new QName("any"), prismContext.LANG_XML))); -// return result; } public static Map fromParamsType(ParamsType paramsType, PrismContext prismContext) throws SchemaException{ diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestDeltaConverter.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestDeltaConverter.java index 7d9b2a64fd6..ec4c708fe6b 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestDeltaConverter.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestDeltaConverter.java @@ -220,7 +220,7 @@ public void testAccountRefDelta() throws Exception { ObjectReferenceType accountRefToDelete = new ObjectReferenceType(); accountRefToDelete.setOid("54321"); PrismContext prismContext = PrismTestUtil.getPrismContext(); - RawType modificationValue = new RawType(prismContext.getBeanConverter().marshall(accountRefToDelete), prismContext); + RawType modificationValue = new RawType(((PrismContextImpl) prismContext).getBeanConverter().marshall(accountRefToDelete), prismContext); modificationDeleteAccountRef.getValue().add(modificationValue); objectChange.getItemDelta().add(modificationDeleteAccountRef); ItemPathType itemPathType = new ItemPathType(new ItemPath(UserType.F_LINK_REF)); diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestJaxbParsing.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestJaxbParsing.java index 0ea8c0d8b88..db897f75930 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestJaxbParsing.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestJaxbParsing.java @@ -21,10 +21,7 @@ import static com.evolveum.midpoint.prism.util.PrismAsserts.assertPropertyValue; -import com.evolveum.midpoint.prism.PrismContainer; -import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.PrismObject; -import com.evolveum.midpoint.prism.PrismProperty; +import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.prism.util.PrismAsserts; @@ -54,15 +51,12 @@ import javax.xml.bind.JAXBElement; import javax.xml.bind.JAXBException; -import javax.xml.bind.Marshaller; import javax.xml.datatype.DatatypeFactory; import javax.xml.datatype.XMLGregorianCalendar; import javax.xml.namespace.QName; import java.io.File; import java.io.IOException; -import java.util.HashMap; -import java.util.Map; import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertNotNull; @@ -221,7 +215,7 @@ public void testMarshallObjectDeltaType() throws Exception { item1.setPath(new ItemPathType(path)); ProtectedStringType protectedString = new ProtectedStringType(); protectedString.setEncryptedData(new EncryptedDataType()); - RawType value = new RawType(PrismTestUtil.getPrismContext().getBeanConverter().marshall(protectedString), PrismTestUtil.getPrismContext()); + RawType value = new RawType(((PrismContextImpl) PrismTestUtil.getPrismContext()).getBeanConverter().marshall(protectedString), PrismTestUtil.getPrismContext()); item1.getValue().add(value); String xml = PrismTestUtil.serializeJaxbElementToString( @@ -241,11 +235,11 @@ public void testParseAnyValue() throws Exception { // THEN - Object oAsIs = prismContext.parserFor(dataAsIs).xml().parseAnyValueAsJAXBElement(); + Object oAsIs = prismContext.parserFor(dataAsIs).xml().parseRealValueToJaxbElement(); System.out.println("Parsed expression evaluator: " + dataAsIs + " as " + oAsIs); AssertJUnit.assertTrue("result is of wrong class (not JAXBElement): " + oAsIs.getClass(), oAsIs instanceof JAXBElement); - Object oValue = prismContext.parserFor(dataValue).xml().parseAnyValueAsJAXBElement(); + Object oValue = prismContext.parserFor(dataValue).xml().parseRealValueToJaxbElement(); System.out.println("Parsed expression evaluator: " + dataValue + " as " + oValue); AssertJUnit.assertTrue("result is of wrong class (not JAXBElement): " + oValue.getClass(), oValue instanceof JAXBElement); } @@ -260,7 +254,7 @@ public void testParseValueFilterWithAny() throws Exception { // WHEN - Object parsedObject = prismContext.parserFor(rootElement).parseAnyValue(); + Object parsedObject = prismContext.parserFor(rootElement).parseRealValue(); // THEN System.out.println("Parsed object: " + parsedObject); diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseDiffPatch.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseDiffPatch.java index 8dc7903e12c..55b1b940f76 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseDiffPatch.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseDiffPatch.java @@ -31,6 +31,7 @@ import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.polystring.PolyString; +import com.evolveum.midpoint.prism.xnode.RootXNode; import com.evolveum.midpoint.prism.xnode.XNode; import com.evolveum.midpoint.util.QNameUtil; import com.evolveum.midpoint.xml.ns._public.common.api_types_3.ObjectModificationType; @@ -758,15 +759,7 @@ private void assertXmlPolyMod(ObjectModificationType objectModificationType, QNa private void assertModificationPolyStringValue(RawType value, PolyStringType... expectedValues) throws SchemaException { XNode xnode = value.serializeToXNode(); assertFalse(xnode.isEmpty()); -// Object first = elements.get(0); -// QName elementQName = JAXBUtil.getElementQName(first); -// if (!propertyName.equals(elementQName)) { -// continue; -// } - - - PolyStringType valueAsPoly = value.getPrismContext().getXnodeProcessor().parseAtomicValue(xnode, PolyStringType.COMPLEX_TYPE, - ParsingContext.createDefault()); + PolyStringType valueAsPoly = value.getPrismContext().parserFor(new RootXNode(new QName("dummy"), xnode)).parseRealValue(PolyStringType.class); boolean found = false; for (PolyStringType expectedValue: expectedValues) { if (expectedValue.getOrig().equals(valueAsPoly.getOrig()) && expectedValue.getNorm().equals(valueAsPoly.getNorm())) { diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseFilter.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseFilter.java index 0bcd12c5796..3c44f7b706b 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseFilter.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseFilter.java @@ -59,7 +59,7 @@ public void testParseFilterFile() throws Exception { PrismContext prismContext = PrismTestUtil.getPrismContext(); // WHEN - SearchFilterType filter = prismContext.parserFor(FILTER_FILE).parseAtomicValue(SearchFilterType.COMPLEX_TYPE); + SearchFilterType filter = prismContext.parserFor(FILTER_FILE).parseRealValue(SearchFilterType.class); // THEN System.out.println("Parsed filter:"); @@ -71,7 +71,7 @@ public void testParseFilterFile() throws Exception { // WHEN2 - SearchFilterType filter2 = prismContext.parserFor(serialized).parseAtomicValue(SearchFilterType.COMPLEX_TYPE); + SearchFilterType filter2 = prismContext.parserFor(serialized).parseRealValue(SearchFilterType.class); System.out.println("Reparsed filter:"); System.out.println(filter2.debugDump()); diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseModelContext.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseModelContext.java index 75c99df85e5..df374169ddc 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseModelContext.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseModelContext.java @@ -75,10 +75,10 @@ public void testParseModelContextPrism() throws Exception { PrismContext prismContext = PrismTestUtil.getPrismContext(); // WHEN - PrismContainer lensContextType = prismContext.parserFor(MODEL_CONTEXT_FILE).xml().parseContainer(LensContextType.class); + LensContextType lensContextType = prismContext.parserFor(MODEL_CONTEXT_FILE).xml().parseRealValue(LensContextType.class); // THEN - System.out.println("Parsed LensContextType: " + lensContextType.getValue().asContainerable()); + System.out.println("Parsed LensContextType: " + lensContextType); } // @Test diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResource.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResource.java index 3d55cf0f894..f7308551500 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResource.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResource.java @@ -201,7 +201,7 @@ public void testSchemaRoundtrip() throws Exception { System.out.println(serializesSchema); // RE-PARSE - PrismContainer reparsedSchemaContainer = prismContext.parserFor(serializesSchema).language(getLanguage()).parseContainer(schemaContainer.getDefinition()); + PrismContainer reparsedSchemaContainer = (PrismContainer) prismContext.parserFor(serializesSchema).language(getLanguage()).definition(schemaContainer.getDefinition()).parseItem(); System.out.println("Re-parsed schema container:"); System.out.println(reparsedSchemaContainer.debugDump()); @@ -439,10 +439,10 @@ private void assertResourceJaxb(ResourceType resourceType, boolean isSimple) thr // Try to serialize it to DOM using just DOM processor. See if it does not fail. private void serializeDom(PrismObject resource) throws SchemaException { -// DomParser domParser = PrismTestUtil.getPrismContext().getParserDom(); +// DomParser domProcessor = PrismTestUtil.getPrismContext().getParserDom(); // XNodeProcessor xnodeProcessor = PrismTestUtil.getPrismContext().getXnodeProcessor(); // RootXNode xnode = xnodeProcessor.serializeObject(resource); -// Element domElement = domParser.serializeXRootToElement(xnode); +// Element domElement = domProcessor.serializeXRootToElement(xnode); // assertNotNull("Null resulting DOM element after DOM serialization", domElement); } diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceXml.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceXml.java index 94e4dc552d4..561d8a0b2f0 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceXml.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceXml.java @@ -16,11 +16,10 @@ package com.evolveum.midpoint.schema.parser.resource; -import com.evolveum.midpoint.prism.ParsingContext; -import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.PrismObject; +import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.lex.dom.DomLexicalProcessor; import com.evolveum.midpoint.prism.util.PrismTestUtil; +import com.evolveum.midpoint.prism.xnode.RootXNode; import com.evolveum.midpoint.prism.xnode.XNode; import com.evolveum.midpoint.schema.TestConstants; import com.evolveum.midpoint.util.DOMUtil; @@ -50,9 +49,9 @@ public void testParseResourceDom() throws Exception { PrismContext prismContext = PrismTestUtil.getPrismContext(); // WHEN - DomLexicalProcessor parserDom = prismContext.getParserDom(); - XNode xnode = parserDom.read(getFile(TestConstants.RESOURCE_FILE_BASENAME), null); - PrismObject resource = prismContext.getXnodeProcessor().parseObject(xnode, ParsingContext.createDefault()); + DomLexicalProcessor parserDom = ((PrismContextImpl) prismContext).getParserDom(); + RootXNode xnode = parserDom.read(new ParserFileSource(getFile(TestConstants.RESOURCE_FILE_BASENAME)), ParsingContext.createDefault()); + PrismObject resource = prismContext.parserFor(xnode).parse(); // THEN System.out.println("Parsed resource:"); diff --git a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/script/xpath/LazyXPathVariableResolver.java b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/script/xpath/LazyXPathVariableResolver.java index f438bebb606..e748f080bdb 100644 --- a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/script/xpath/LazyXPathVariableResolver.java +++ b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/script/xpath/LazyXPathVariableResolver.java @@ -143,7 +143,6 @@ public static Object convertToXml(Object variableValue, QName variableName, fina } else if (variableValue instanceof PrismProperty) { PrismProperty prismProperty = (PrismProperty)variableValue; - DomLexicalProcessor domProcessor = prismProperty.getPrismContext().getParserDom(); final List elementList = new ArrayList(); for (PrismPropertyValue value: prismProperty.getValues()) { Element valueElement = prismContext.domSerializer().serialize(value, prismProperty.getElementName()); @@ -163,7 +162,6 @@ public int getLength() { } else if (variableValue instanceof PrismValue) { PrismValue pval = (PrismValue)variableValue; - DomLexicalProcessor domProcessor = prismContext.getParserDom(); if (pval.getParent() == null) { // Set a fake parent to allow serialization pval.setParent(new Itemable() { diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/ModelRestService.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/ModelRestService.java index 8cf634aaaf2..de84e8ddabe 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/ModelRestService.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/ModelRestService.java @@ -719,7 +719,7 @@ private ItemListType prepareXmlData(List output) throws JAXBException, Sch ItemListType itemListType = new ItemListType(); if (output != null) { for (Item item : output) { - RawType rawType = prismContext.toRawType(item); + RawType rawType = new RawType(prismContext.xnodeSerializer().serialize(item), prismContext); itemListType.getItem().add(rawType); } } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/ModelWebService.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/ModelWebService.java index f0f522aab14..8618970f3fd 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/ModelWebService.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/ModelWebService.java @@ -234,7 +234,7 @@ private List> parseScripts(ExecuteScriptsType parameters) throws // here comes MSL script decoding (however with a quick hack to allow passing XML as text here) String scriptsAsString = parameters.getMslScripts(); if (scriptsAsString.startsWith(" output) throws JAXBException, Sch ItemListType itemListType = new ItemListType(); if (output != null) { for (Item item : output) { - RawType rawType = prismContext.toRawType(item); + RawType rawType = new RawType(prismContext.xnodeSerializer().serialize(item), prismContext); itemListType.getItem().add(rawType); } } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/ModelWebServiceRaw.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/ModelWebServiceRaw.java index ac1360e4a2a..051400c267a 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/ModelWebServiceRaw.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/ModelWebServiceRaw.java @@ -17,11 +17,8 @@ import com.evolveum.midpoint.model.api.ModelPort; import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.xnode.RootXNode; -import com.evolveum.midpoint.prism.xnode.XNode; -import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.result.OperationResult; -import com.evolveum.midpoint.util.DOMUtil; +import com.evolveum.midpoint.schema.util.MiscSchemaUtil; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; @@ -63,7 +60,6 @@ import javax.xml.transform.dom.DOMSource; import javax.xml.ws.Holder; import javax.xml.ws.Provider; -import javax.xml.ws.WebServiceProvider; import javax.xml.ws.soap.SOAPFaultException; import java.io.PrintWriter; @@ -132,7 +128,7 @@ public DOMSource invokeAllowingFaults(DOMSource request) throws FaultMessage { Object requestObject; try { - requestObject = prismContext.parserFor(rootElement).parseAnyValue(); + requestObject = prismContext.parserFor(rootElement).parseRealValue(); } catch (SchemaException e) { throw ws.createIllegalArgumentFault("Couldn't parse SOAP request body because of schema exception: " + e.getMessage()); } @@ -210,39 +206,9 @@ public DOMSource invokeAllowingFaults(DOMSource request) throws FaultMessage { } private void serializeFaultMessage(Detail detail, FaultMessage faultMessage) { - try { - XNode faultMessageXnode = prismContext.getBeanConverter().marshall(faultMessage.getFaultInfo()); - RootXNode xroot = new RootXNode(SchemaConstants.FAULT_MESSAGE_ELEMENT_NAME, faultMessageXnode); - xroot.setExplicitTypeDeclaration(true); - QName faultType = prismContext.getBeanConverter().determineTypeForClass(faultMessage.getFaultInfo().getClass()); - xroot.setTypeQName(faultType); - prismContext.getParserDom().serializeUnderElement(xroot, SchemaConstants.FAULT_MESSAGE_ELEMENT_NAME, detail); - } catch (SchemaException e) { - LOGGER.error("Error serializing fault message (SOAP fault detail): {}", e.getMessage(), e); - } + MiscSchemaUtil.serializeFaultMessage(detail, faultMessage, prismContext, LOGGER); } -// private DOMSource serializeFaultMessage(FaultMessage faultMessage) { -// Element faultElement = DOMUtil.createElement(SOAP11_FAULT); -// Element faultCodeElement = DOMUtil.createSubElement(faultElement, SOAP11_FAULTCODE); -// faultCodeElement.setTextContent(SOAP11_FAULTCODE_SERVER); // todo here is a constant until we have a mechanism to determine the correct value (client / server) -// Element faultStringElement = DOMUtil.createSubElement(faultElement, SOAP11_FAULTSTRING); -// faultStringElement.setTextContent(faultMessage.getMessage()); -// Element faultActorElement = DOMUtil.createSubElement(faultElement, SOAP11_FAULTACTOR); -// faultActorElement.setTextContent("TODO"); // todo -// Element faultDetailElement = DOMUtil.createSubElement(faultElement, SOAP11_FAULT_DETAIL); -// faultDetailElement.setTextContent(getStackTraceAsString(faultMessage)); -// return new DOMSource(faultElement.getOwnerDocument()); -// } - - private String getStackTraceAsString(FaultMessage faultMessage) { - StringWriter sw = new StringWriter(); - PrintWriter pw = new PrintWriter(sw); - faultMessage.printStackTrace(pw); - pw.close(); - return sw.toString(); - } - private void throwFault(Exception ex, OperationResultType resultType) throws FaultMessage { if (resultType != null) { ws.throwFault(ex, OperationResult.createOperationResult(resultType)); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/rest/MidpointXmlProvider.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/rest/MidpointXmlProvider.java index d9c7886ec3c..703053242ab 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/rest/MidpointXmlProvider.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/rest/MidpointXmlProvider.java @@ -120,7 +120,7 @@ public T readFrom(Class type, Type genericType, if (type.isAssignableFrom(PrismObject.class)){ object = (T) prismContext.parserFor(entityStream).xml().parse(); } else { - object = prismContext.parserFor(entityStream).xml().parseAnyValue(); + object = prismContext.parserFor(entityStream).xml().parseRealValue(); //object = (T) prismContext.getJaxbDomHack().unmarshalObject(entityStream); } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/ScriptingExpressionEvaluator.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/ScriptingExpressionEvaluator.java index 6d38129b65f..ee49cf8ecb2 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/ScriptingExpressionEvaluator.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/ScriptingExpressionEvaluator.java @@ -257,7 +257,7 @@ private Data executeSequence(ExpressionSequenceType sequence, Data input, Execut public Data evaluateConstantExpression(RawType constant, ExecutionContext context, OperationResult result) throws ScriptExecutionException { try { - Object value = prismContext.getXnodeProcessor().parseAnyData(constant.getXnode(), ParsingContext.createDefault()); + Object value = prismContext.parserFor(constant.getXnode().toRootXNode()).parseAnyData(); if (value instanceof Item) { return Data.create((Item) value); } else { diff --git a/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/expr/ExpressionHandlerImplTest.java b/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/expr/ExpressionHandlerImplTest.java index 4d9180f04b5..f4697403b0a 100644 --- a/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/expr/ExpressionHandlerImplTest.java +++ b/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/expr/ExpressionHandlerImplTest.java @@ -23,6 +23,7 @@ import com.evolveum.midpoint.prism.ParsingContext; import com.evolveum.midpoint.prism.xnode.MapXNode; +import com.evolveum.midpoint.prism.xnode.RootXNode; import com.evolveum.midpoint.prism.xnode.XNode; import com.evolveum.midpoint.security.api.MidPointPrincipal; import org.springframework.beans.factory.annotation.Autowired; @@ -128,10 +129,9 @@ public void testEvaluateExpression() throws Exception { for (ConditionalSearchFilterType filter : synchronization.getCorrelation()){ MapXNode clauseXNode = filter.getFilterClauseXNode(); // key = q:equal, value = map (path + expression) - XNode expressionNode = ((MapXNode) clauseXNode.getSingleSubEntry("filter value").getValue()).get(new QName(SchemaConstants.NS_C, "expression")); + RootXNode expressionNode = ((MapXNode) clauseXNode.getSingleSubEntry("filter value").getValue()).getEntryAsRoot(new QName(SchemaConstants.NS_C, "expression")); - ExpressionType expression = PrismTestUtil.getPrismContext().getXnodeProcessor().parseAtomicValue(expressionNode, ExpressionType.COMPLEX_TYPE, - ParsingContext.createDefault()); + ExpressionType expression = PrismTestUtil.getPrismContext().parserFor(expressionNode).parseRealValue(ExpressionType.class); LOGGER.debug("Expression: {}",SchemaDebugUtil.prettyPrint(expression)); OperationResult result = new OperationResult("testCorrelationRule"); diff --git a/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/lens/TestClockwork.java b/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/lens/TestClockwork.java index f0efe70c021..3fa4beba978 100644 --- a/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/lens/TestClockwork.java +++ b/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/lens/TestClockwork.java @@ -134,8 +134,8 @@ public void test010SerializeAddUserBarbossa() throws Exception { System.out.println("Serialized form = " + xml); - PrismContainer unmarshalledContainer = prismContext.parserFor(xml).xml().parseContainer(LensContextType.class); - LensContext context2 = LensContext.fromLensContextType(unmarshalledContainer.getValue().asContainerable(), context.getPrismContext(), provisioningService, result); + LensContextType unmarshalledContainer = prismContext.parserFor(xml).xml().parseRealValue(LensContextType.class); + LensContext context2 = LensContext.fromLensContextType(unmarshalledContainer, context.getPrismContext(), provisioningService, result); System.out.println("Context after deserialization = " + context.debugDump()); @@ -316,8 +316,8 @@ private void assignAccountToJackAsync(String testName, boolean serialize) throws System.out.println("Serialized form = " + xml); - PrismContainer unmarshalledContainer = prismContext.parserFor(xml).xml().parseContainer(LensContextType.class); - context = LensContext.fromLensContextType(unmarshalledContainer.getValue().asContainerable(), context.getPrismContext(), provisioningService, result); + LensContextType unmarshalledContainer = prismContext.parserFor(xml).xml().parseRealValue(LensContextType.class); + context = LensContext.fromLensContextType(unmarshalledContainer, context.getPrismContext(), provisioningService, result); System.out.println("Context after deserialization = " + context.debugDump()); diff --git a/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportFunctions.java b/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportFunctions.java index eb63d099c63..f703b0c3ac0 100644 --- a/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportFunctions.java +++ b/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportFunctions.java @@ -302,9 +302,9 @@ ObjectFilter createEqualFilter(ItemPath propertyPat // return RefFilter.createReferenceEqual(propertyPath, type, prismContext, oids); // } - Object parseObjectFromXML (String xml) throws SchemaException { - return prismContext.parserFor(xml).xml().parseAnyData(); - } +// Object parseObjectFromXML (String xml) throws SchemaException { +// return prismContext.parserFor(xml).xml().parseAnyData(); +// } /** * Retrieves all definitions. diff --git a/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportServiceImpl.java b/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportServiceImpl.java index a678e30586a..4c206d11d15 100644 --- a/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportServiceImpl.java +++ b/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportServiceImpl.java @@ -111,7 +111,7 @@ public ObjectQuery parseQuery(String query, Map parameters) throw Task task = taskManager.createTaskInstance(); ModelExpressionThreadLocalHolder.pushCurrentResult(task.getResult()); ModelExpressionThreadLocalHolder.pushCurrentTask(task); - SearchFilterType filter = (SearchFilterType) prismContext.parserFor(query).parseAtomicValue(SearchFilterType.COMPLEX_TYPE); + SearchFilterType filter = prismContext.parserFor(query).parseRealValue(SearchFilterType.class); LOGGER.trace("filter {}", filter); ObjectFilter f = QueryConvertor.parseFilter(filter, UserType.class, prismContext); LOGGER.trace("f {}", f.debugDump()); diff --git a/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportWebServiceRaw.java b/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportWebServiceRaw.java index 28e5cade868..2f7e754815b 100644 --- a/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportWebServiceRaw.java +++ b/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportWebServiceRaw.java @@ -13,6 +13,7 @@ import javax.xml.ws.Provider; import javax.xml.ws.soap.SOAPFaultException; +import com.evolveum.midpoint.schema.util.MiscSchemaUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.w3c.dom.Document; @@ -99,7 +100,7 @@ public DOMSource invokeAllowingFaults(DOMSource request) throws FaultMessage { Object requestObject; try { - requestObject = prismContext.parserFor(rootElement).parseAnyValue(); + requestObject = prismContext.parserFor(rootElement).parseRealValue(); } catch (SchemaException e) { throw new FaultMessage("Couldn't parse SOAP request body because of schema exception: " + e.getMessage()); // throw ws.createIllegalArgumentFault("Couldn't parse SOAP request body because of schema exception: " + e.getMessage()); @@ -145,16 +146,7 @@ public DOMSource invokeAllowingFaults(DOMSource request) throws FaultMessage { } private void serializeFaultMessage(Detail detail, FaultMessage faultMessage) { - try { - XNode faultMessageXnode = prismContext.getBeanConverter().marshall(faultMessage.getFaultInfo()); - RootXNode xroot = new RootXNode(SchemaConstants.FAULT_MESSAGE_ELEMENT_NAME, faultMessageXnode); - xroot.setExplicitTypeDeclaration(true); - QName faultType = prismContext.getBeanConverter().determineTypeForClass(faultMessage.getFaultInfo().getClass()); - xroot.setTypeQName(faultType); - prismContext.getParserDom().serializeUnderElement(xroot, SchemaConstants.FAULT_MESSAGE_ELEMENT_NAME, detail); - } catch (SchemaException e) { - LOGGER.error("Error serializing fault message (SOAP fault detail): {}", e.getMessage(), e); - } + MiscSchemaUtil.serializeFaultMessage(detail, faultMessage, prismContext, LOGGER); } // private DOMSource serializeFaultMessage(FaultMessage faultMessage) { diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/util/MiscDataUtil.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/util/MiscDataUtil.java index 282b41a5e60..f8244a127c6 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/util/MiscDataUtil.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/util/MiscDataUtil.java @@ -200,7 +200,7 @@ public static ObjectType deserializeObjectFromXml(String xml, PrismContext prism // public static PrismContainer deserializeContainerFromXml(String xml, PrismContext prismContext) { // try { -// return prismContext.parserFor(xml).xml().unmarshallContainer(null); // TODO will 'null' work? +// return prismContext.processorFor(xml).xml().unmarshallContainer(null); // TODO will 'null' work? // } catch (SchemaException e) { // throw new SystemException("Couldn't deserialize a Containerable from XML", e); // } diff --git a/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/general/TestGeneralChangeProcessor.java b/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/general/TestGeneralChangeProcessor.java index 1b432d09503..2f967624ef6 100644 --- a/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/general/TestGeneralChangeProcessor.java +++ b/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/general/TestGeneralChangeProcessor.java @@ -352,7 +352,7 @@ public void test000LoadContext() throws Exception { OperationResult result = new OperationResult("test000LoadContext"); - LensContextType lensContextType = prismContext.parserFor(new File("src/test/resources/model-contexts/context-dummy-resource.xml")).xml().parseContainer(LensContextType.class).getValues().get(0).asContainerable(); + LensContextType lensContextType = prismContext.parserFor(new File("src/test/resources/model-contexts/context-dummy-resource.xml")).xml().parseRealValue(LensContextType.class); display("LensContextType", lensContextType); LensContext lensContext = LensContext.fromLensContextType(lensContextType, prismContext, provisioningService, result); display("LensContext", lensContext); diff --git a/pom.xml b/pom.xml index 2cb0d25f518..0b8bec841a3 100644 --- a/pom.xml +++ b/pom.xml @@ -72,6 +72,11 @@ + + org.apache.maven.plugins + maven-plugin-plugin + 3.3 + org.eclipse.m2e lifecycle-mapping diff --git a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/ucf/TestUcfOpenDj.java b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/ucf/TestUcfOpenDj.java index d471fd9c567..d6b38b36386 100644 --- a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/ucf/TestUcfOpenDj.java +++ b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/ucf/TestUcfOpenDj.java @@ -15,14 +15,7 @@ */ package com.evolveum.midpoint.provisioning.impl.ucf; -import com.evolveum.midpoint.prism.Definition; -import com.evolveum.midpoint.prism.PrismContainerDefinition; -import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.PrismObject; -import com.evolveum.midpoint.prism.PrismObjectDefinition; -import com.evolveum.midpoint.prism.PrismProperty; -import com.evolveum.midpoint.prism.PrismPropertyDefinition; -import com.evolveum.midpoint.prism.PrismPropertyValue; +import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.crypto.Protector; import com.evolveum.midpoint.prism.delta.PropertyDelta; import com.evolveum.midpoint.prism.path.ItemPath; @@ -751,7 +744,7 @@ public void test610ChangePassword() throws Exception { propMod.setPath(path); //set the replace value - MapXNode passPsXnode = prismContext.getBeanConverter().marshalProtectedDataType(passPs); + MapXNode passPsXnode = ((PrismContextImpl) prismContext).getBeanConverter().marshalProtectedDataType(passPs); RawType value = new RawType(passPsXnode, prismContext); propMod.getValue().add(value); diff --git a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/AddGetObjectTest.java b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/AddGetObjectTest.java index a7a32777e2e..cfa518a605a 100644 --- a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/AddGetObjectTest.java +++ b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/AddGetObjectTest.java @@ -499,7 +499,7 @@ private String testIterationToken(String token) throws Exception { // @Test(enabled = false) // public void deltaOperationSerializationPerformanceTest() throws Exception { // List> elements = -// prismContext.parserFor(new File(FOLDER_BASIC, "objects.xml")).parseObjects(); +// prismContext.processorFor(new File(FOLDER_BASIC, "objects.xml")).parseObjects(); // // //get user from objects.xml // ObjectDelta delta = ObjectDelta.createAddDelta(elements.get(0)); diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/audit/RObjectDeltaOperation.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/audit/RObjectDeltaOperation.java index 8fbc8291a19..52643d4ff24 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/audit/RObjectDeltaOperation.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/audit/RObjectDeltaOperation.java @@ -284,11 +284,11 @@ public static ObjectDeltaOperation fromRepo(RObjectDeltaOperation operation, Pri ObjectDeltaOperation odo = new ObjectDeltaOperation(); try { if (operation.getDelta() != null) { - ObjectDeltaType delta = prismContext.parserFor(operation.getDelta()).parseAtomicValue(ObjectDeltaType.COMPLEX_TYPE); + ObjectDeltaType delta = prismContext.parserFor(operation.getDelta()).parseRealValue(ObjectDeltaType.class); odo.setObjectDelta(DeltaConvertor.createObjectDelta(delta, prismContext)); } if (operation.getFullResult() != null) { - OperationResultType resultType = prismContext.parserFor(operation.getFullResult()).parseAtomicValue(OperationResultType.COMPLEX_TYPE); + OperationResultType resultType = prismContext.parserFor(operation.getFullResult()).parseRealValue(OperationResultType.class); odo.setExecutionResult(OperationResult.createOperationResult(resultType)); } odo.setObjectName(RPolyString.fromRepo(operation.getObjectName())); diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RAccessCertificationCase.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RAccessCertificationCase.java index 9dc6b3e115b..c4f4572c573 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RAccessCertificationCase.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RAccessCertificationCase.java @@ -16,7 +16,6 @@ package com.evolveum.midpoint.repo.sql.data.common.container; -import com.evolveum.midpoint.prism.PrismContainer; import com.evolveum.midpoint.prism.PrismContainerValue; import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.repo.sql.data.common.RAccessCertificationCampaign; @@ -413,9 +412,8 @@ public AccessCertificationCaseType toJAXB(PrismContext prismContext) throws Sche // TODO find appropriate name public static AccessCertificationCaseType createJaxb(byte[] fullObject, PrismContext prismContext, boolean removeCampaignRef) throws SchemaException { String xml = RUtil.getXmlFromByteArray(fullObject, false); - PrismContainer caseContainer; try { - caseContainer = prismContext.parserFor(xml).xml().compat().parseContainer(AccessCertificationCaseType.class); + return prismContext.parserFor(xml).xml().compat().parseRealValue(AccessCertificationCaseType.class); } catch (SchemaException e) { LOGGER.debug("Couldn't parse certification case because of schema exception ({}):\nData: {}", e, xml); throw e; @@ -423,8 +421,6 @@ public static AccessCertificationCaseType createJaxb(byte[] fullObject, PrismCon LOGGER.debug("Couldn't parse certification case because of unexpected exception ({}):\nData: {}", e, xml); throw e; } - AccessCertificationCaseType aCase = caseContainer.getValue().asContainerable().clone(); // clone in order to make it parent-less //aCase.asPrismContainerValue().removeReference(AccessCertificationCaseType.F_CAMPAIGN_REF); - return aCase; } } diff --git a/testing/sanity/src/test/java/com/evolveum/midpoint/testing/sanity/TestSanity.java b/testing/sanity/src/test/java/com/evolveum/midpoint/testing/sanity/TestSanity.java index e1ba869635a..10c4473f3a6 100644 --- a/testing/sanity/src/test/java/com/evolveum/midpoint/testing/sanity/TestSanity.java +++ b/testing/sanity/src/test/java/com/evolveum/midpoint/testing/sanity/TestSanity.java @@ -50,6 +50,7 @@ import javax.xml.namespace.QName; import javax.xml.ws.Holder; +import com.evolveum.midpoint.common.refinery.RefinedResourceSchemaImpl; import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.task.api.TaskManagerException; import com.evolveum.midpoint.util.exception.*; @@ -582,7 +583,7 @@ private void checkOpenDjResource(ResourceType resource, String source) throws Sc } private void checkOpenDjSchema(ResourceType resource, String source) throws SchemaException { - ResourceSchema schema = RefinedResourceSchema.getResourceSchema(resource, prismContext); + ResourceSchema schema = RefinedResourceSchemaImpl.getResourceSchema(resource, prismContext); ObjectClassComplexTypeDefinition accountDefinition = schema.findObjectClassDefinition(RESOURCE_OPENDJ_ACCOUNT_OBJECTCLASS); assertNotNull("Schema does not define any account (resource from " + source + ")", accountDefinition); Collection identifiers = accountDefinition.getPrimaryIdentifiers(); @@ -1295,7 +1296,7 @@ public void test016ProvisioningSearchAccountsIterative() throws Exception { // GIVEN OperationResult result = new OperationResult(TestSanity.class.getName() + ".test016ProvisioningSearchAccountsIterative"); - RefinedResourceSchema refinedSchema = RefinedResourceSchema.getRefinedSchema(resourceTypeOpenDjrepo, prismContext); + RefinedResourceSchema refinedSchema = RefinedResourceSchemaImpl.getRefinedSchema(resourceTypeOpenDjrepo, prismContext); final RefinedObjectClassDefinition refinedAccountDefinition = refinedSchema.getDefaultRefinedDefinition(ShadowKindType.ACCOUNT); QName objectClass = refinedAccountDefinition.getObjectClassDefinition().getTypeName(); @@ -1489,7 +1490,7 @@ public void test023ChangeUserPasswordJAXB() throws Exception { passwordDelta.setPath(ModelClientUtil.createItemPathType("credentials/password/value")); ProtectedStringType pass = new ProtectedStringType(); pass.setClearValue(NEW_PASSWORD); - XNode passValue = prismContext.getBeanConverter().marshall(pass); + XNode passValue = ((PrismContextImpl) prismContext).getBeanConverter().marshall(pass); System.out.println("PASSWORD VALUE: " + passValue.debugDump()); RawType passwordValue = new RawType(passValue, prismContext); passwordDelta.getValue().add(passwordValue); @@ -1878,7 +1879,7 @@ public void test040UnlinkDerbyAccountFromUser() throws FileNotFoundException, JA modificationDeleteAccountRef.setModificationType(ModificationTypeType.DELETE); ObjectReferenceType accountRefToDelete = new ObjectReferenceType(); accountRefToDelete.setOid(accountShadowOidDerby); - RawType modificationValue = new RawType(prismContext.getBeanConverter().marshall(accountRefToDelete), prismContext); + RawType modificationValue = new RawType(((PrismContextImpl) prismContext).getBeanConverter().marshall(accountRefToDelete), prismContext); modificationDeleteAccountRef.getValue().add(modificationValue); modificationDeleteAccountRef.setPath(new ItemPathType(new ItemPath(UserType.F_LINK_REF))); objectChange.getItemDelta().add(modificationDeleteAccountRef); @@ -3782,8 +3783,8 @@ public void test500NotifyChangeCreateAccount() throws Exception{ ShadowType anglicaAccount = parseObjectType(new File(ACCOUNT_ANGELIKA_FILENAME), ShadowType.class); PrismProperty prop = anglicaAccount.asPrismObject().findContainer(ShadowType.F_ATTRIBUTES).getValue().createProperty( - new PrismPropertyDefinition<>(getOpenDjPrimaryIdentifierQName(), DOMUtil.XSD_STRING, prismContext)); - prop.setValue(new PrismPropertyValue(entryUuid)); + new PrismPropertyDefinitionImpl<>(getOpenDjPrimaryIdentifierQName(), DOMUtil.XSD_STRING, prismContext)); + prop.setValue(new PrismPropertyValue<>(entryUuid)); anglicaAccount.setResourceRef(ObjectTypeUtil.createObjectRef(RESOURCE_OPENDJ_OID, ObjectTypes.RESOURCE)); display("Angelica shadow: ", anglicaAccount.asPrismObject().debugDump()); @@ -3908,7 +3909,7 @@ public void test502NotifyChangeModifyAccountPassword() throws Exception{ ItemDeltaType passwordDelta = new ItemDeltaType(); passwordDelta.setModificationType(ModificationTypeType.REPLACE); passwordDelta.setPath(ModelClientUtil.createItemPathType("credentials/password/value")); - RawType passwordValue = new RawType(prismContext.getBeanConverter().marshall(ModelClientUtil.createProtectedString(newPassword)), prismContext); + RawType passwordValue = new RawType(((PrismContextImpl) prismContext).getBeanConverter().marshall(ModelClientUtil.createProtectedString(newPassword)), prismContext); passwordDelta.getValue().add(passwordValue); delta.getItemDelta().add(passwordDelta); diff --git a/testing/sanity/src/test/java/com/evolveum/midpoint/testing/sanity/TestSanityLegacy.java b/testing/sanity/src/test/java/com/evolveum/midpoint/testing/sanity/TestSanityLegacy.java index 4a78714a564..654f07c8e0d 100644 --- a/testing/sanity/src/test/java/com/evolveum/midpoint/testing/sanity/TestSanityLegacy.java +++ b/testing/sanity/src/test/java/com/evolveum/midpoint/testing/sanity/TestSanityLegacy.java @@ -45,6 +45,8 @@ import javax.xml.namespace.QName; import javax.xml.ws.Holder; +import com.evolveum.midpoint.common.refinery.RefinedResourceSchemaImpl; +import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.task.api.TaskManagerException; import com.evolveum.midpoint.util.exception.*; import org.apache.commons.lang.StringUtils; @@ -75,14 +77,6 @@ import com.evolveum.midpoint.common.refinery.RefinedObjectClassDefinition; import com.evolveum.midpoint.common.refinery.RefinedResourceSchema; import com.evolveum.midpoint.model.test.AbstractModelIntegrationTest; -import com.evolveum.midpoint.prism.Containerable; -import com.evolveum.midpoint.prism.Item; -import com.evolveum.midpoint.prism.PrismContainer; -import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.PrismObject; -import com.evolveum.midpoint.prism.PrismProperty; -import com.evolveum.midpoint.prism.PrismPropertyDefinition; -import com.evolveum.midpoint.prism.PrismPropertyValue; import com.evolveum.midpoint.prism.crypto.EncryptionException; import com.evolveum.midpoint.prism.delta.ChangeType; import com.evolveum.midpoint.prism.delta.ItemDelta; @@ -577,7 +571,7 @@ private void checkOpenDjResource(ResourceType resource, String source) throws Sc } private void checkOpenDjSchema(ResourceType resource, String source) throws SchemaException { - ResourceSchema schema = RefinedResourceSchema.getResourceSchema(resource, prismContext); + ResourceSchema schema = RefinedResourceSchemaImpl.getResourceSchema(resource, prismContext); ObjectClassComplexTypeDefinition accountDefinition = schema.findDefaultObjectClassDefinition(ShadowKindType.ACCOUNT); assertNotNull("Schema does not define any account (resource from " + source + ")", accountDefinition); Collection identifiers = accountDefinition.getPrimaryIdentifiers(); @@ -1058,14 +1052,14 @@ public void test016ProvisioningSearchAccountsIterative() throws Exception { // GIVEN OperationResult result = new OperationResult(TestSanityLegacy.class.getName() + ".test016ProvisioningSearchAccountsIterative"); - RefinedResourceSchema refinedSchema = RefinedResourceSchema.getRefinedSchema(resourceTypeOpenDjrepo, prismContext); + RefinedResourceSchema refinedSchema = RefinedResourceSchemaImpl.getRefinedSchema(resourceTypeOpenDjrepo, prismContext); final RefinedObjectClassDefinition refinedAccountDefinition = refinedSchema.getDefaultRefinedDefinition(ShadowKindType.ACCOUNT); QName objectClass = refinedAccountDefinition.getObjectClassDefinition().getTypeName(); ObjectQuery q = ObjectQueryUtil.createResourceAndObjectClassQuery(resourceTypeOpenDjrepo.getOid(), objectClass, prismContext); // ObjectQuery q = QueryConvertor.createObjectQuery(ResourceObjectShadowType.class, query, prismContext); - final Collection objects = new HashSet(); + final Collection objects = new HashSet<>(); final MatchingRule caseIgnoreMatchingRule = matchingRuleRegistry.getMatchingRule(StringIgnoreCaseMatchingRule.NAME, DOMUtil.XSD_STRING); ResultHandler handler = new ResultHandler() { @@ -1251,7 +1245,7 @@ public void test023ChangeUserPasswordJAXB() throws Exception { passwordDelta.setPath(ModelClientUtil.createItemPathType("credentials/password/value")); ProtectedStringType pass = new ProtectedStringType(); pass.setClearValue(NEW_PASSWORD); - XNode passValue = prismContext.getBeanConverter().marshall(pass); + XNode passValue = ((PrismContextImpl) prismContext).getBeanConverter().marshall(pass); System.out.println("PASSWORD VALUE: " + passValue.debugDump()); RawType passwordValue = new RawType(passValue, prismContext); passwordDelta.getValue().add(passwordValue); @@ -3579,7 +3573,7 @@ public void test502NotifyChangeModifyAccountPassword() throws Exception{ ItemDeltaType passwordDelta = new ItemDeltaType(); passwordDelta.setModificationType(ModificationTypeType.REPLACE); passwordDelta.setPath(ModelClientUtil.createItemPathType("credentials/password/value")); - RawType passwordValue = new RawType(prismContext.getBeanConverter().marshall(ModelClientUtil.createProtectedString(newPassword)), prismContext); + RawType passwordValue = new RawType(((PrismContextImpl) prismContext).getBeanConverter().marshall(ModelClientUtil.createProtectedString(newPassword)), prismContext); passwordDelta.getValue().add(passwordValue); // ItemDeltaType mod1 = new ItemDeltaType(); diff --git a/testing/story/src/test/java/com/evolveum/midpoint/testing/story/TestUnix.java b/testing/story/src/test/java/com/evolveum/midpoint/testing/story/TestUnix.java index 48d7aa45f5b..b2206ba43ee 100644 --- a/testing/story/src/test/java/com/evolveum/midpoint/testing/story/TestUnix.java +++ b/testing/story/src/test/java/com/evolveum/midpoint/testing/story/TestUnix.java @@ -28,6 +28,7 @@ import javax.xml.namespace.QName; +import com.evolveum.midpoint.common.refinery.RefinedResourceSchemaImpl; import com.evolveum.midpoint.prism.delta.ItemDelta; import com.evolveum.midpoint.prism.delta.builder.DeltaBuilder; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; From 1a04fe3bd397f89b8585eee610f722139b2520f8 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Wed, 19 Oct 2016 11:15:00 +0200 Subject: [PATCH 40/74] Interim commit. --- .../LayerRefinedResourceSchemaImpl.java | 8 +-- .../refinery/RefinedResourceSchemaImpl.java | 8 +-- .../midpoint/prism/PrismContainerValue.java | 8 +++ .../midpoint/prism/PrismPropertyValue.java | 5 ++ .../midpoint/prism/PrismReferenceValue.java | 6 ++- .../evolveum/midpoint/prism/PrismValue.java | 4 ++ .../midpoint/prism/marshaller/ItemInfo.java | 54 ++++++++++++++++++- .../prism/marshaller/PrismMarshaller.java | 26 ++++----- .../DefinitionSearchContextItemImpl.java | 2 +- .../DefinitionSearchImplementation.java | 2 +- .../prism/schema/GlobalDefinitionsStore.java | 25 +++++++-- .../prism/schema/PrismSchemaImpl.java | 29 ++++++---- .../prism/schema/SchemaRegistryImpl.java | 13 ++--- .../midpoint/prism/xml/XsdTypeMapper.java | 48 ++++++++++++----- 14 files changed, 177 insertions(+), 61 deletions(-) diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedResourceSchemaImpl.java b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedResourceSchemaImpl.java index f6a431e9bfb..ad0c1e04d8c 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedResourceSchemaImpl.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedResourceSchemaImpl.java @@ -174,11 +174,11 @@ public LayerRefinedResourceSchema forLayer(LayerType layer) { return refinedResourceSchema.forLayer(layer); } + @NotNull @Override - @Nullable - public CD findContainerDefinitionByCompileTimeClass( - @NotNull Class compileTimeClass, @NotNull Class definitionClass) { - return refinedResourceSchema.findContainerDefinitionByCompileTimeClass(compileTimeClass, definitionClass); + public List findItemDefinitionsByCompileTimeClass( + @NotNull Class compileTimeClass, @NotNull Class definitionClass) { + return refinedResourceSchema.findItemDefinitionsByCompileTimeClass(compileTimeClass, definitionClass); } @Override diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedResourceSchemaImpl.java b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedResourceSchemaImpl.java index 3cefa143660..1902d10923b 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedResourceSchemaImpl.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedResourceSchemaImpl.java @@ -518,11 +518,11 @@ public boolean isEmpty() { return originalResourceSchema.isEmpty(); } + @NotNull @Override - @Nullable - public CD findContainerDefinitionByCompileTimeClass( - @NotNull Class compileTimeClass, @NotNull Class definitionClass) { - return originalResourceSchema.findContainerDefinitionByCompileTimeClass(compileTimeClass, definitionClass); + public List findItemDefinitionsByCompileTimeClass( + @NotNull Class compileTimeClass, @NotNull Class definitionClass) { + return originalResourceSchema.findItemDefinitionsByCompileTimeClass(compileTimeClass, definitionClass); } @Nullable diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerValue.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerValue.java index cccc72fead9..182c33332d5 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerValue.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerValue.java @@ -1447,4 +1447,12 @@ public void setImmutable(boolean immutable) { } } } + + @Override + public Class getRealClass() { + if (containerable != null) { + return containerable.getClass(); + } + return resolveClass(null); + } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyValue.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyValue.java index 4049cf60acd..61f47d766e5 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyValue.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyValue.java @@ -642,4 +642,9 @@ public JAXBElement toJaxbElement() { Object realValue = getValue(); return new JAXBElement(parent.getElementName(), (Class) realValue.getClass(), (T) realValue); } + + @Override + public Class getRealClass() { + return value != null ? value.getClass() : null; + } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismReferenceValue.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismReferenceValue.java index 30b86d6a8b7..18fa902e6de 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismReferenceValue.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismReferenceValue.java @@ -589,5 +589,9 @@ public String toHumanReadableString() { } return sb.toString(); } - + + @Override + public Class getRealClass() { + return PrismReferenceValue.class; + } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismValue.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismValue.java index a8e320b9e31..4c822b874e7 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismValue.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismValue.java @@ -23,6 +23,7 @@ import com.evolveum.midpoint.util.exception.SchemaException; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.w3c.dom.Element; import java.io.Serializable; @@ -414,4 +415,7 @@ protected void checkMutability() { } } + @Nullable + abstract public Class getRealClass(); + } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/ItemInfo.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/ItemInfo.java index 72a276566c1..561d8734bff 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/ItemInfo.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/ItemInfo.java @@ -23,6 +23,7 @@ import org.jetbrains.annotations.NotNull; import javax.xml.namespace.QName; +import java.util.List; /** * @author mederly @@ -144,8 +145,12 @@ private static ID augmentWithClass(ID definition, Cl } // the following may be null @SuppressWarnings("unchecked") - ID defFromClass = (ID) schemaRegistry.findContainerDefinitionByCompileTimeClass((Class) clazz, (Class) definitionClass); - return schemaRegistry.selectMoreSpecific(definition, defFromClass); + List defFromClass = schemaRegistry.findItemDefinitionsByCompileTimeClass((Class) clazz, (Class) definitionClass); + if (defFromClass.size() != 1) { + return definition; + } else { + return schemaRegistry.selectMoreSpecific(definition, defFromClass.get(0)); + } } public QName getItemName() { @@ -159,4 +164,49 @@ public ID getItemDefinition() { public QName getTypeName() { return typeName; } + + @NotNull + public static ItemInfo determineFromValue(@NotNull PrismValue value, QName itemName, ItemDefinition itemDefinition, + @NotNull SchemaRegistry schemaRegistry) { + ItemInfo info = new ItemInfo(); + + // definition + info.itemDefinition = itemDefinition; + if (info.itemDefinition == null && value.getParent() != null) { + info.itemDefinition = itemDefinition = value.getParent().getDefinition(); + if (info.itemDefinition == null) { + info.itemDefinition = schemaRegistry.findItemDefinitionByElementName(value.getParent().getElementName()); + } + } + if (info.itemDefinition == null) { + Class realClass = value.getRealClass(); + if (realClass != null) { + List definitions = schemaRegistry.findItemDefinitionsByCompileTimeClass(realClass, ItemDefinition.class); + if (definitions.size() == 1) { + info.itemDefinition = definitions.get(0); + } + } + } + + // item name + info.itemName = itemName; + if (info.itemName == null && value.getParent() != null) { + info.itemName = value.getParent().getElementName(); + } + if (info.itemName == null && info.itemDefinition != null) { + info.itemName = info.itemDefinition.getName(); + } + + // item type + if (itemDefinition != null) { + info.typeName = itemDefinition.getTypeName(); + } else { + Class realClass = value.getRealClass(); + if (realClass != null) { + info.typeName = schemaRegistry.determineTypeForClass(realClass); + } + } + + return info; + } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismMarshaller.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismMarshaller.java index 7763200c01d..846680ebc81 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismMarshaller.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismMarshaller.java @@ -100,10 +100,8 @@ RootXNode marshalItem(@NotNull Item item, QName itemName, RootXNode marshalItemValueAsRoot(@NotNull PrismValue value, @NotNull QName itemName, ItemDefinition itemDefinition, SerializationContext context) throws SchemaException { - if (itemDefinition == null && value.getParent() != null) { - itemDefinition = value.getParent().getDefinition(); // the definition may still be null here - } - XNode valueNode = marshalItemValue(value, itemDefinition, context); + ItemInfo itemInfo = ItemInfo.determineFromValue(value, itemName, itemDefinition, beanConverter.getPrismContext().getSchemaRegistry()); + XNode valueNode = marshalItemValue(value, itemInfo.getItemDefinition(), context); return new RootXNode(itemName, valueNode); } @@ -152,11 +150,6 @@ private MapXNode marshalObjectContent(@NotNull PrismObjec @NotNull private XNode marshalItemValue(@NotNull PrismValue itemValue, ItemDefinition definition, SerializationContext ctx) throws SchemaException { XNode xnode; - if (definition == null) { - if (itemValue.getParent() != null) { - definition = itemValue.getParent().getDefinition(); - } - } if (definition == null && itemValue instanceof PrismPropertyValue) { return serializePropertyRawValue((PrismPropertyValue) itemValue); } else if (itemValue instanceof PrismReferenceValue) { @@ -290,7 +283,7 @@ private XNode serializePropertyValue(PrismPropertyValue value, PrismPrope return serializePolyString((PolyString) realValue); } else if (beanConverter.canProcess(typeQName)) { XNode xnode = beanConverter.marshall(realValue); - if (realValue instanceof ProtectedDataType && definition.isDynamic()) { // why is this? + if (realValue instanceof ProtectedDataType && (definition == null || definition.isDynamic())) { // why is this? xnode.setExplicitTypeDeclaration(true); xnode.setTypeQName(definition.getTypeName()); } @@ -308,12 +301,15 @@ private XNode serializePolyString(PolyString realValue) { } private XNode serializePropertyRawValue(PrismPropertyValue value) throws SchemaException { - Object rawElement = value.getRawElement(); - if (rawElement instanceof XNode) { - return (XNode) rawElement; - } else { - T realValue = value.getValue(); + XNode rawElement = value.getRawElement(); + if (rawElement != null) { + return rawElement; + } + T realValue = value.getValue(); + if (realValue != null) { return createPrimitiveXNode(realValue, DOMUtil.XSD_STRING); + } else { + return null; } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/DefinitionSearchContextItemImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/DefinitionSearchContextItemImpl.java index e9a0cc9bef1..dd74309c582 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/DefinitionSearchContextItemImpl.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/DefinitionSearchContextItemImpl.java @@ -49,7 +49,7 @@ public class DefinitionSearchContextItemImpl implemen // if (PrismObjectDefinition.class.isAssignableFrom(definitionClass)) { // return (ID) provider.findObjectDefinitionByCompileTimeClass((Class) clazz); // } else if (PrismContainerDefinition.class.isAssignableFrom(definitionClass)) { -// return (ID) provider.findContainerDefinitionByCompileTimeClass(clazz); +// return (ID) provider.findItemDefinitionByCompileTimeClass(clazz); // } else { // throw new UnsupportedOperationException("Only containers and prism objects can be searched by compile-time class. Not " // + definitionClass + " by " + clazz); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/DefinitionSearchImplementation.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/DefinitionSearchImplementation.java index 4d729735578..d3919b88676 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/DefinitionSearchImplementation.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/DefinitionSearchImplementation.java @@ -40,5 +40,5 @@ public interface DefinitionSearchImplementation { // // PrismObjectDefinition findObjectDefinitionByCompileTimeClass(@NotNull Class type); // -// PrismContainerDefinition findContainerDefinitionByCompileTimeClass(@NotNull Class type); +// PrismContainerDefinition findItemDefinitionByCompileTimeClass(@NotNull Class type); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/GlobalDefinitionsStore.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/GlobalDefinitionsStore.java index a4db8303778..9098aaee627 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/GlobalDefinitionsStore.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/GlobalDefinitionsStore.java @@ -20,6 +20,7 @@ import org.jetbrains.annotations.NotNull; import javax.xml.namespace.QName; +import java.util.List; /** * Used to retrieve definition from 'global definition store' - i.e. store that contains a group of related definition(s), @@ -57,8 +58,9 @@ public interface GlobalDefinitionsStore extends DefinitionsStore { // core methods - CD findContainerDefinitionByCompileTimeClass( - @NotNull Class compileTimeClass, @NotNull Class definitionClass); + @NotNull + List findItemDefinitionsByCompileTimeClass( + @NotNull Class compileTimeClass, @NotNull Class definitionClass); ID findItemDefinitionByType(@NotNull QName typeName, @NotNull Class definitionClass); @@ -70,9 +72,14 @@ CD findContainerDefinitionByCompileTimeCla // non-core (derived) methods + default ID findItemDefinitionByCompileTimeClass( + @NotNull Class compileTimeClass, @NotNull Class definitionClass) { + return getOne(findItemDefinitionsByCompileTimeClass(compileTimeClass, definitionClass)); + } + @SuppressWarnings("unchecked") default PrismObjectDefinition findObjectDefinitionByCompileTimeClass(@NotNull Class compileTimeClass) { - return findContainerDefinitionByCompileTimeClass(compileTimeClass, PrismObjectDefinition.class); + return findItemDefinitionByCompileTimeClass(compileTimeClass, PrismObjectDefinition.class); } @SuppressWarnings("unchecked") @@ -89,7 +96,17 @@ default PrismObjectDefinition findObjectDefinitionByEl @SuppressWarnings("unchecked") default PrismContainerDefinition findContainerDefinitionByCompileTimeClass(@NotNull Class compileTimeClass) { - return findContainerDefinitionByCompileTimeClass(compileTimeClass, PrismContainerDefinition.class); + return findItemDefinitionByCompileTimeClass(compileTimeClass, PrismContainerDefinition.class); + } + + static ID getOne(List list) { + if (list.isEmpty()) { + return null; + } else if (list.size() == 1) { + return list.get(0); + } else { + throw new IllegalStateException("More than one definition found: " + list); + } } @SuppressWarnings("unchecked") diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/PrismSchemaImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/PrismSchemaImpl.java index d8b4ec7cd54..a3fa1b0ab8b 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/PrismSchemaImpl.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/PrismSchemaImpl.java @@ -23,6 +23,7 @@ import com.evolveum.midpoint.prism.*; +import com.evolveum.midpoint.prism.xml.XsdTypeMapper; import org.apache.commons.lang.StringUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -307,20 +308,30 @@ public String toString() { // items - @Nullable - @Override - public CD findContainerDefinitionByCompileTimeClass( - @NotNull Class compileTimeClass, @NotNull Class definitionClass) { + @NotNull + public List findItemDefinitionsByCompileTimeClass( + @NotNull Class compileTimeClass, @NotNull Class definitionClass) { + List found = new ArrayList<>(); for (Definition def: definitions) { if (definitionClass.isAssignableFrom(def.getClass())) { - @SuppressWarnings("unchecked") - CD contDef = (CD) def; - if (compileTimeClass.equals(contDef.getCompileTimeClass())) { - return contDef; + if (def instanceof PrismContainerDefinition) { + @SuppressWarnings("unchecked") + ID contDef = (ID) def; + if (compileTimeClass.equals(((PrismContainerDefinition) contDef).getCompileTimeClass())) { + found.add(contDef); + } + } else if (def instanceof PrismPropertyDefinition) { + if (compileTimeClass.equals(XsdTypeMapper.toJavaTypeIfKnown(def.getTypeName()))) { + @SuppressWarnings("unchecked") + ID itemDef = (ID) def; + found.add(itemDef); + } + } else { + // skipping the definition (PRD is not supported yet) } } } - return null; + return found; } @Override diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistryImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistryImpl.java index 110b611dc57..7671e1528cc 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistryImpl.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistryImpl.java @@ -40,7 +40,6 @@ import com.evolveum.midpoint.prism.xml.XmlTypeConverter; import com.evolveum.midpoint.prism.xml.XsdTypeMapper; -import com.evolveum.midpoint.prism.xnode.XNode; import com.evolveum.midpoint.util.QNameUtil; import com.evolveum.prism.xml.ns._public.types_3.ObjectType; import org.apache.commons.lang.StringUtils; @@ -681,15 +680,17 @@ private boolean namespaceMatches(String namespace, @Nullable List ignore // - @Nullable + @NotNull @Override - public CD findContainerDefinitionByCompileTimeClass( - @NotNull Class compileTimeClass, @NotNull Class definitionClass) { + public List findItemDefinitionsByCompileTimeClass( + @NotNull Class compileTimeClass, @NotNull Class definitionClass) { PrismSchema schema = findSchemaByCompileTimeClass(compileTimeClass); if (schema == null) { - return null; + return Collections.emptyList(); } - return schema.findContainerDefinitionByCompileTimeClass(compileTimeClass, definitionClass); + @SuppressWarnings("unchecked") + List list = schema.findItemDefinitionsByCompileTimeClass(compileTimeClass, definitionClass); + return list; } @Nullable diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xml/XsdTypeMapper.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xml/XsdTypeMapper.java index ed952941dae..f6f710a31bb 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xml/XsdTypeMapper.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xml/XsdTypeMapper.java @@ -31,6 +31,7 @@ import javax.xml.namespace.QName; import org.apache.commons.lang.StringUtils; +import org.jetbrains.annotations.NotNull; import org.w3c.dom.Element; import com.evolveum.midpoint.prism.PrismConstants; @@ -52,16 +53,15 @@ public class XsdTypeMapper { public static final String BOOLEAN_XML_VALUE_TRUE = "true"; public static final String BOOLEAN_XML_VALUE_FALSE = "false"; - private static Map javaToXsdTypeMap; - private static Map xsdToJavaTypeMap; + private static final Map javaToXsdTypeMap = new HashMap<>(); + private static final Map xsdToJavaTypeMap = new HashMap<>(); + private static final Map javaToXsdTypeMapExt = new HashMap<>(); + private static final Map xsdToJavaTypeMapExt = new HashMap<>(); private static final Trace LOGGER = TraceManager.getTrace(XsdTypeMapper.class); private static final String MULTIPLICITY_UNBOUNDED = "unbounded"; private static void initTypeMap() throws IOException, ClassNotFoundException { - - javaToXsdTypeMap = new HashMap(); - xsdToJavaTypeMap = new HashMap(); addMapping(String.class, DOMUtil.XSD_STRING, true); addMapping(char.class, DOMUtil.XSD_STRING, false); addMapping(File.class, DOMUtil.XSD_STRING, false); @@ -92,7 +92,7 @@ private static void initTypeMap() throws IOException, ClassNotFoundException { addMapping(QName.class, DOMUtil.XSD_QNAME, true); addMapping(PolyString.class, PrismConstants.POLYSTRING_TYPE_QNAME, true); -// addMapping(ItemPathType.class, ItemPathType.COMPLEX_TYPE, true); + addMappingExt(ItemPathType.class, ItemPathType.COMPLEX_TYPE, true); xsdToJavaTypeMap.put(DOMUtil.XSD_ANYURI, String.class); } @@ -105,6 +105,14 @@ private static void addMapping(Class javaClass, QName xsdType, boolean both) { } } + private static void addMappingExt(Class javaClass, QName xsdType, boolean both) { + LOGGER.trace("Adding 'ext' XSD type mapping {} {} {} ", javaClass, both ? "<->" : " ->", xsdType); + javaToXsdTypeMapExt.put(javaClass, xsdType); + if (both) { + xsdToJavaTypeMapExt.put(xsdType, javaClass); + } + } + public static QName toXsdType(Class javaClass) { QName xsdType = getJavaToXsdMapping(javaClass); if (xsdType == null) { @@ -168,17 +176,27 @@ public static Class getTypeFromClass(Class clazz) { return null; } - public static Class toJavaType(QName xsdType) { - return toJavaType(xsdType, true); + public static Class toJavaType(@NotNull QName xsdType) { + return toJavaType(xsdToJavaTypeMap, xsdType, true); + } + + public static Class toJavaTypeIfKnown(@NotNull QName xsdType) { + return toJavaType(xsdToJavaTypeMap, xsdType, false); } - public static Class toJavaTypeIfKnown(QName xsdType) { - return toJavaType(xsdType, false); + // experimental feature - covers all the classes + public static Class toJavaTypeIfKnownExt(@NotNull QName xsdType) { + Class cls = toJavaType(xsdToJavaTypeMap, xsdType, false); + if (cls != null) { + return cls; + } else { + return toJavaType(xsdToJavaTypeMapExt, xsdType, false); + } } - private static Class toJavaType(QName xsdType, boolean errorIfNoMapping) { - Class javaType = xsdToJavaTypeMap.get(xsdType); - if (javaType == null && xsdType != null && StringUtils.isEmpty(xsdType.getNamespaceURI())) { + private static Class toJavaType(Map map, @NotNull QName xsdType, boolean errorIfNoMapping) { + Class javaType = map.get(xsdType); + if (javaType == null && StringUtils.isEmpty(xsdType.getNamespaceURI())) { // TODO check uniqueness w.r.t. other types... for (Map.Entry entry : xsdToJavaTypeMap.entrySet()) { if (QNameUtil.match(entry.getKey(), xsdType)) { @@ -194,7 +212,9 @@ private static Class toJavaType(QName xsdType, boolean errorIfNoMapping) return null; } } - return javaType; + @SuppressWarnings("unchecked") + Class typedClass = (Class) javaType; + return typedClass; } public static String multiplicityToString(Integer integer) { From fdc202bd85246c6f4cd056b00f9473ea865e52a2 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Wed, 19 Oct 2016 13:38:42 +0200 Subject: [PATCH 41/74] Interim commit. Some schema tests are now passing. --- .../com/evolveum/midpoint/prism/Item.java | 10 ++--- .../midpoint/prism/PrismContainer.java | 7 +++ .../midpoint/prism/PrismContainerValue.java | 28 +++++------- .../evolveum/midpoint/prism/PrismContext.java | 8 +--- .../midpoint/prism/PrismContextImpl.java | 10 ++--- .../prism/lex/json/JsonValueParser.java | 5 +-- .../midpoint/prism/marshaller/ItemInfo.java | 3 ++ .../prism/marshaller/PrismBeanConverter.java | 2 +- .../prism/marshaller/PrismMarshaller.java | 27 ++++++----- .../prism/marshaller/PrismParserImpl.java | 15 ++++--- .../prism/schema/DefinitionStoreUtils.java | 45 +++++++++++++++++++ .../prism/schema/GlobalDefinitionsStore.java | 12 +---- .../midpoint/prism/schema/SchemaRegistry.java | 6 ++- .../prism/schema/SchemaRegistryImpl.java | 31 +++++++------ .../midpoint/prism/xml/XsdTypeMapper.java | 4 +- .../midpoint/prism/xnode/PrimitiveXNode.java | 18 +++++--- .../midpoint/schema/TestJaxbConstruction.java | 8 ++-- .../midpoint/schema/TestJaxbParsing.java | 24 +++++++--- 18 files changed, 160 insertions(+), 103 deletions(-) create mode 100644 infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/DefinitionStoreUtils.java diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/Item.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/Item.java index 23fe1126db1..25b7be0f757 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/Item.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/Item.java @@ -607,12 +607,10 @@ public void revive(PrismContext prismContext) throws SchemaException { definition.revive(prismContext); } } - if (values != null) { - for (V value: values) { - value.revive(prismContext); - } - } - } + for (V value: values) { + value.revive(prismContext); + } + } public abstract Item clone(); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainer.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainer.java index 41fe3b94d8b..e39084a3f0b 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainer.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainer.java @@ -79,6 +79,13 @@ public PrismContainer(QName name, Class compileTimeClass) { public PrismContainer(QName name, Class compileTimeClass, PrismContext prismContext) { this(name, compileTimeClass); this.prismContext = prismContext; + if (prismContext != null) { + try { + prismContext.adopt(this); + } catch (SchemaException e) { + throw new SystemException("Schema exception when adopting freshly created PrismContainer: " + this); + } + } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerValue.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerValue.java index 182c33332d5..6f0dab101d1 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerValue.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerValue.java @@ -781,25 +781,17 @@ public PrismContainer createContainer(QName contain public PrismProperty createProperty(QName propertyName) throws SchemaException { checkMutability(); - PrismPropertyDefinition propertyDefinition = null; - ComplexTypeDefinition complexTypeDefinition = getComplexTypeDefinition(); - if (complexTypeDefinition != null) { - propertyDefinition = complexTypeDefinition.findPropertyDefinition(propertyName); - if (propertyDefinition == null) { - // container has definition, but there is no property definition. This is either runtime schema - // or an error - if (getParent().getDefinition().isRuntimeSchema()) { - // TODO: create opportunistic runtime definition - //propertyDefinition = new PrismPropertyDefinitionImpl(propertyName, propertyName, typeName, container.prismContext); - } else { - throw new IllegalArgumentException("No definition for property "+propertyName+" in "+complexTypeDefinition); - } - } - } - PrismProperty property = null; + PrismPropertyDefinition propertyDefinition = determineItemDefinition(propertyName, getComplexTypeDefinition()); + if (propertyDefinition == null) { + // container has definition, but there is no property definition. This is either runtime schema + // or an error + if (getParent() != null && getDefinition() != null && !getDefinition().isRuntimeSchema()) { // TODO clean this up + throw new IllegalArgumentException("No definition for property "+propertyName+" in "+complexTypeDefinition); + } + } + PrismProperty property; if (propertyDefinition == null) { - // Definitionless - property = new PrismProperty(propertyName, prismContext); + property = new PrismProperty(propertyName, prismContext); // Definitionless } else { property = propertyDefinition.instantiate(); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java index 6c9769af6dc..158dfd5d01d 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java @@ -21,16 +21,12 @@ import com.evolveum.midpoint.prism.marshaller.JaxbDomHack; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.polystring.PolyStringNormalizer; -import com.evolveum.midpoint.prism.schema.SchemaDefinitionFactory; import com.evolveum.midpoint.prism.schema.SchemaRegistry; import com.evolveum.midpoint.prism.util.PrismMonitor; import com.evolveum.midpoint.prism.xnode.RootXNode; -import com.evolveum.midpoint.prism.xnode.XNode; import com.evolveum.midpoint.util.exception.SchemaException; -import com.evolveum.prism.xml.ns._public.types_3.RawType; import org.jetbrains.annotations.NotNull; import org.w3c.dom.Element; -import org.xml.sax.EntityResolver; import org.xml.sax.SAXException; import javax.xml.namespace.QName; @@ -121,9 +117,9 @@ public interface PrismContext { //endregion //region Adopt methods - void adopt(PrismObject object, Class declaredType) throws SchemaException; + void adopt(PrismContainer object, Class declaredType) throws SchemaException; - void adopt(PrismObject object) throws SchemaException; + void adopt(PrismContainer object) throws SchemaException; void adopt(Objectable objectable) throws SchemaException; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContextImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContextImpl.java index ba1f9091900..db7dc3a8c17 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContextImpl.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContextImpl.java @@ -247,14 +247,14 @@ public PrismObject parseObject(String dataString) thro * Set up the specified object with prism context instance and schema definition. */ @Override - public void adopt(PrismObject object, Class declaredType) throws SchemaException { - object.revive(this); - getSchemaRegistry().applyDefinition(object, declaredType, false); + public void adopt(PrismContainer container, Class declaredType) throws SchemaException { + container.revive(this); + getSchemaRegistry().applyDefinition(container, declaredType, false); } @Override - public void adopt(PrismObject object) throws SchemaException { - adopt(object, object.getCompileTimeClass()); + public void adopt(PrismContainer container) throws SchemaException { + adopt(container, container.getCompileTimeClass()); } @Override diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/JsonValueParser.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/JsonValueParser.java index 26a10cb7b41..2edf199a42e 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/JsonValueParser.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/JsonValueParser.java @@ -37,10 +37,7 @@ public JsonParser getParser() { public T parse(QName typeName, XNodeProcessorEvaluationMode mode) throws SchemaException { ObjectMapper mapper = (ObjectMapper) parser.getCodec(); Class clazz = XsdTypeMapper.toJavaType(typeName); - if (clazz == null) { - throw new SchemaException("Unsupported type " + typeName); - } - + ObjectReader r = mapper.readerFor(clazz); try { return r.readValue(node); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/ItemInfo.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/ItemInfo.java index 561d8734bff..c04efb57191 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/ItemInfo.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/ItemInfo.java @@ -110,6 +110,9 @@ private static ID augmentWithType(ID definition, Cla } @SuppressWarnings("unchecked") ID defFromType = (ID) rawDefFromType; + if (definition instanceof PrismReferenceDefinition && defFromType instanceof PrismObjectDefinition) { + return definition; // nothing to do; this is a reference holding a composite object + } return schemaRegistry.selectMoreSpecific(definition, defFromType); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismBeanConverter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismBeanConverter.java index 448a7dc60f4..30567db0c77 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismBeanConverter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismBeanConverter.java @@ -103,7 +103,7 @@ public boolean canProcess(QName typeName) { return getSchemaRegistry().determineCompileTimeClass(typeName) != null; } - public boolean canProcess(Class clazz) { + public boolean canProcess(@NotNull Class clazz) { return RawType.class.equals(clazz) || clazz.getAnnotation(XmlType.class) != null; } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismMarshaller.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismMarshaller.java index 846680ebc81..c9f1f64dd24 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismMarshaller.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismMarshaller.java @@ -52,6 +52,7 @@ import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; import com.evolveum.prism.xml.ns._public.types_3.ProtectedDataType; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; /** * @author semancik @@ -87,11 +88,11 @@ RootXNode marshalItem(@NotNull Item item, QName itemName, if (item instanceof PrismObject) { content = marshalObjectContent((PrismObject) item, (PrismObjectDefinition) realDefinition, context); } else if (item.size() == 1) { - content = marshalItemValue(item.getValue(0), realDefinition, context); + content = marshalItemValue(item.getValue(0), realDefinition, null, context); } else { ListXNode xlist = new ListXNode(); for (PrismValue val : item.getValues()) { - xlist.add(marshalItemValue(val, realDefinition, context)); + xlist.add(marshalItemValue(val, realDefinition, null, context)); } content = xlist; } @@ -101,7 +102,7 @@ RootXNode marshalItem(@NotNull Item item, QName itemName, RootXNode marshalItemValueAsRoot(@NotNull PrismValue value, @NotNull QName itemName, ItemDefinition itemDefinition, SerializationContext context) throws SchemaException { ItemInfo itemInfo = ItemInfo.determineFromValue(value, itemName, itemDefinition, beanConverter.getPrismContext().getSchemaRegistry()); - XNode valueNode = marshalItemValue(value, itemInfo.getItemDefinition(), context); + XNode valueNode = marshalItemValue(value, itemInfo.getItemDefinition(), itemInfo.getTypeName(), context); return new RootXNode(itemName, valueNode); } @@ -148,14 +149,15 @@ private MapXNode marshalObjectContent(@NotNull PrismObjec } @NotNull - private XNode marshalItemValue(@NotNull PrismValue itemValue, ItemDefinition definition, SerializationContext ctx) throws SchemaException { + private XNode marshalItemValue(@NotNull PrismValue itemValue, @Nullable ItemDefinition definition, + @Nullable QName typeName, SerializationContext ctx) throws SchemaException { XNode xnode; - if (definition == null && itemValue instanceof PrismPropertyValue) { + if (definition == null && typeName == null && itemValue instanceof PrismPropertyValue) { return serializePropertyRawValue((PrismPropertyValue) itemValue); } else if (itemValue instanceof PrismReferenceValue) { xnode = serializeReferenceValue((PrismReferenceValue)itemValue, (PrismReferenceDefinition) definition, ctx); } else if (itemValue instanceof PrismPropertyValue) { - xnode = serializePropertyValue((PrismPropertyValue)itemValue, (PrismPropertyDefinition)definition); + xnode = serializePropertyValue((PrismPropertyValue)itemValue, (PrismPropertyDefinition)definition, typeName); } else if (itemValue instanceof PrismContainerValue) { xnode = marshalContainerValue((PrismContainerValue)itemValue, (PrismContainerDefinition)definition, ctx); } else { @@ -276,21 +278,22 @@ private QName createReferenceQName(QName qname, String namespace) { //endregion //region Serializing properties - specific functionality - private XNode serializePropertyValue(PrismPropertyValue value, PrismPropertyDefinition definition) throws SchemaException { - QName typeQName = definition.getTypeName(); + private XNode serializePropertyValue(@NotNull PrismPropertyValue value, PrismPropertyDefinition definition, QName typeNameIfNoDefinition) throws SchemaException { + @Nullable QName typeName = definition != null ? definition.getTypeName() : typeNameIfNoDefinition; T realValue = value.getValue(); if (realValue instanceof PolyString) { return serializePolyString((PolyString) realValue); - } else if (beanConverter.canProcess(typeQName)) { + } else if (beanConverter.canProcess(typeName)) { XNode xnode = beanConverter.marshall(realValue); - if (realValue instanceof ProtectedDataType && (definition == null || definition.isDynamic())) { // why is this? + // why is this? + if (realValue instanceof ProtectedDataType && (definition == null || definition.isDynamic())) { xnode.setExplicitTypeDeclaration(true); - xnode.setTypeQName(definition.getTypeName()); + xnode.setTypeQName(typeName); } return xnode; } else { // primitive value - return createPrimitiveXNode(realValue, typeQName); + return createPrimitiveXNode(realValue, typeName); } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismParserImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismParserImpl.java index a5cdd7a04b7..d5d4451030d 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismParserImpl.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismParserImpl.java @@ -188,12 +188,15 @@ private T doParseRealValue(Class clazz, RootXNode root) throws IOExceptio if (clazz == null && info.getTypeName() != null) { clazz = (Class) prismContext.getSchemaRegistry().determineClassForType(info.getTypeName()); } - if (clazz == null) { - throw new IllegalArgumentException("Couldn't determine type for " + root); - } +// if (clazz == null) { +// throw new IllegalArgumentException("Couldn't determine type for " + root); +// } } - if (Containerable.class.isAssignableFrom(clazz)) { + PrismBeanConverter beanConverter = prismContext.getBeanConverter(); + if (clazz != null && beanConverter.canProcess(clazz)) { + return beanConverter.unmarshall(root, clazz, context); + } else { PrismValue prismValue = doParseItemValue(root); if (prismValue == null) { return null; @@ -206,8 +209,6 @@ private T doParseRealValue(Class clazz, RootXNode root) throws IOExceptio } else { throw new IllegalStateException("Unsupported value: " + prismValue.getClass()); } - } else { - return prismContext.getBeanConverter().unmarshall(root, clazz, context); } } @@ -219,7 +220,7 @@ T doParseRealValue() throws IOException, SchemaException { @SuppressWarnings("unchecked") JAXBElement doParseAnyValueAsJAXBElement() throws IOException, SchemaException { RootXNode root = getLexicalProcessor().read(source, context); - T real = (T) doParseRealValue(Object.class, root); + T real = (T) doParseRealValue(null, root); return real != null ? new JAXBElement<>(root.getRootElementName(), (Class) real.getClass(), real) : null; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/DefinitionStoreUtils.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/DefinitionStoreUtils.java new file mode 100644 index 00000000000..fa31ac0c5d3 --- /dev/null +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/DefinitionStoreUtils.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.prism.schema; + +import com.evolveum.midpoint.prism.ItemDefinition; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author mederly + */ +public class DefinitionStoreUtils { + public static ID getOne(List list) { + if (list.isEmpty()) { + return null; + } else if (list.size() == 1) { + return list.get(0); + } else { + // remove all deprecated ones + List notDeprecated = list.stream() + .filter(def -> !def.isDeprecated()) + .collect(Collectors.toList()); + if (notDeprecated.size() == 1) { + return notDeprecated.get(0); + } else { + throw new IllegalStateException("More than one definition found: " + list); + } + } + } +} diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/GlobalDefinitionsStore.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/GlobalDefinitionsStore.java index 9098aaee627..8e0e3141c19 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/GlobalDefinitionsStore.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/GlobalDefinitionsStore.java @@ -74,7 +74,7 @@ List findItemDefinitionsByCompileTimeClass( default ID findItemDefinitionByCompileTimeClass( @NotNull Class compileTimeClass, @NotNull Class definitionClass) { - return getOne(findItemDefinitionsByCompileTimeClass(compileTimeClass, definitionClass)); + return DefinitionStoreUtils.getOne(findItemDefinitionsByCompileTimeClass(compileTimeClass, definitionClass)); } @SuppressWarnings("unchecked") @@ -99,16 +99,6 @@ default PrismContainerDefinition findContainerDefin return findItemDefinitionByCompileTimeClass(compileTimeClass, PrismContainerDefinition.class); } - static ID getOne(List list) { - if (list.isEmpty()) { - return null; - } else if (list.size() == 1) { - return list.get(0); - } else { - throw new IllegalStateException("More than one definition found: " + list); - } - } - @SuppressWarnings("unchecked") default PrismContainerDefinition findContainerDefinitionByType(@NotNull QName typeName) { return findItemDefinitionByType(typeName, PrismContainerDefinition.class); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistry.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistry.java index 361357cca90..fe2c54e5ee3 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistry.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistry.java @@ -92,10 +92,12 @@ ItemDefinition locateItemDefinition(@NotNull QName ite /** * This method will try to locate the appropriate object definition and apply it. + * @param container + * @param type */ - void applyDefinition(PrismObject prismObject, Class type) throws SchemaException; + void applyDefinition(PrismContainer container, Class type) throws SchemaException; - void applyDefinition(PrismObject prismObject, Class type, boolean force) throws SchemaException; + void applyDefinition(PrismContainer prismObject, Class type, boolean force) throws SchemaException; void applyDefinition(ObjectDelta objectDelta, Class type, boolean force) throws SchemaException; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistryImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistryImpl.java index 7671e1528cc..7dba5c2c92c 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistryImpl.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistryImpl.java @@ -533,14 +533,14 @@ public String debugDump(int indent) { //region applyDefinition(..) methods @Override - public void applyDefinition(PrismObject prismObject, Class type) throws SchemaException { - applyDefinition(prismObject, type, true); + public void applyDefinition(PrismContainer container, Class type) throws SchemaException { + applyDefinition(container, type, true); } @Override - public void applyDefinition(PrismObject prismObject, Class compileTimeClass, boolean force) throws SchemaException { - PrismObjectDefinition objectDefinition = determineDefinitionFromClass(compileTimeClass); - prismObject.applyDefinition(objectDefinition, force); + public void applyDefinition(PrismContainer container, Class compileTimeClass, boolean force) throws SchemaException { + PrismContainerDefinition definition = determineDefinitionFromClass(compileTimeClass); + container.applyDefinition(definition, force); } @Override @@ -980,14 +980,18 @@ public ItemDefinition resolveGlobalItemDefinition(QName elementQName, PrismConta @Override public ItemDefinition resolveGlobalItemDefinition(QName itemName, @Nullable ComplexTypeDefinition complexTypeDefinition) throws SchemaException { - String elementNamespace = itemName.getNamespaceURI(); - if (StringUtils.isEmpty(elementNamespace)) { - List ignoredNamespaces = complexTypeDefinition != null ? - complexTypeDefinition.getIgnoredNamespaces() : - null; - return resolveGlobalItemDefinitionWithoutNamespace(itemName.getLocalPart(), ItemDefinition.class, true, ignoredNamespaces); - } - PrismSchema schema = findSchemaByNamespace(elementNamespace); + if (QNameUtil.noNamespace(itemName)) { + if (complexTypeDefinition != null && complexTypeDefinition.getDefaultNamespace() != null) { + itemName = new QName(complexTypeDefinition.getDefaultNamespace(), itemName.getLocalPart()); + } + else { + List ignoredNamespaces = complexTypeDefinition != null ? + complexTypeDefinition.getIgnoredNamespaces() : + null; + return resolveGlobalItemDefinitionWithoutNamespace(itemName.getLocalPart(), ItemDefinition.class, true, ignoredNamespaces); + } + } + PrismSchema schema = findSchemaByNamespace(itemName.getNamespaceURI()); if (schema == null) { return null; } @@ -1011,7 +1015,6 @@ private T resolveGlobalItemDefinitionWithoutNamespace ItemDefinition def = schema.findItemDefinitionByElementName(new QName(localPart), definitionClass); if (def != null) { if (found != null) { - // todo change to SchemaException if (exceptionIfAmbiguous) { throw new IllegalArgumentException("Multiple possible resolutions for unqualified element name " + localPart + " (e.g. in " + def.getNamespace() + " and " + found.getNamespace()); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xml/XsdTypeMapper.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xml/XsdTypeMapper.java index f6f710a31bb..126e23c25c0 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xml/XsdTypeMapper.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xml/XsdTypeMapper.java @@ -176,8 +176,10 @@ public static Class getTypeFromClass(Class clazz) { return null; } + @NotNull public static Class toJavaType(@NotNull QName xsdType) { - return toJavaType(xsdToJavaTypeMap, xsdType, true); + //noinspection ConstantConditions + return toJavaType(xsdToJavaTypeMap, xsdType, true); } public static Class toJavaTypeIfKnown(@NotNull QName xsdType) { diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/PrimitiveXNode.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/PrimitiveXNode.java index 8d6512e0590..24a387f59cf 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/PrimitiveXNode.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/PrimitiveXNode.java @@ -24,6 +24,7 @@ import com.evolveum.midpoint.prism.marshaller.XNodeProcessorEvaluationMode; import com.evolveum.midpoint.prism.util.CloneUtil; import com.evolveum.midpoint.prism.xml.XsdTypeMapper; +import com.evolveum.midpoint.util.*; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; @@ -32,10 +33,6 @@ import com.evolveum.midpoint.prism.Visitor; import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.prism.xml.XmlTypeConverter; -import com.evolveum.midpoint.util.DebugUtil; -import com.evolveum.midpoint.util.DisplayableValue; -import com.evolveum.midpoint.util.PrettyPrinter; -import com.evolveum.midpoint.util.QNameUtil; import com.evolveum.midpoint.util.exception.SchemaException; import org.apache.commons.lang.Validate; @@ -71,12 +68,22 @@ public PrimitiveXNode(T value) { public void parseValue(QName typeName, XNodeProcessorEvaluationMode mode) throws SchemaException { Validate.notNull(typeName, "Cannot parse primitive XNode without knowing its type"); if (valueParser != null) { + typeName = xsdAnyToString(typeName); value = valueParser.parse(typeName, mode); // Necessary. It marks that the value is parsed. It also frees some memory. valueParser = null; } } - + + // xsd:any type will be parsed as xsd:string (TODO reconsider!) + private QName xsdAnyToString(QName typeName) { + if (DOMUtil.XSD_ANYTYPE.equals(typeName)) { + return DOMUtil.XSD_STRING; + } else { + return typeName; + } + } + public T getValue() { return value; } @@ -154,6 +161,7 @@ public T getParsedValueWithoutRecording(QName typeName) throws SchemaException { if (isParsed()) { return value; } else { + typeName = xsdAnyToString(typeName); return valueParser.parse(typeName, XNodeProcessorEvaluationMode.STRICT); } } diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestJaxbConstruction.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestJaxbConstruction.java index 34f924ed021..dc3fd7cdfb7 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestJaxbConstruction.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestJaxbConstruction.java @@ -295,9 +295,8 @@ public void testUserConstructionReverse() throws JAXBException, SchemaException // GIVEN PrismContext prismContext = PrismTestUtil.getPrismContext(); - UserType userType = new UserType(); - prismContext.adopt(userType); - + UserType userType = new UserType(prismContext); + PrismObject user = userType.asPrismObject(); assertNotNull("No object definition after adopt", user.getDefinition()); @@ -311,7 +310,8 @@ public void testUserConstructionReverse() throws JAXBException, SchemaException checkExtension(extensionContainer,"user extension after setExtension"); checkExtension(extension,"user extension after setExtension"); - AssignmentType assignmentType = new AssignmentType(); + AssignmentType assignmentType = new AssignmentType(prismContext); + ExtensionType assignmentExtension = new ExtensionType(); assignmentType.setExtension(assignmentExtension); diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestJaxbParsing.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestJaxbParsing.java index db897f75930..a7cb310914d 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestJaxbParsing.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestJaxbParsing.java @@ -235,15 +235,25 @@ public void testParseAnyValue() throws Exception { // THEN - Object oAsIs = prismContext.parserFor(dataAsIs).xml().parseRealValueToJaxbElement(); - System.out.println("Parsed expression evaluator: " + dataAsIs + " as " + oAsIs); - AssertJUnit.assertTrue("result is of wrong class (not JAXBElement): " + oAsIs.getClass(), oAsIs instanceof JAXBElement); + JAXBElement oAsIs = prismContext.parserFor(dataAsIs).xml().parseRealValueToJaxbElement(); + System.out.println(dumpResult(dataAsIs, oAsIs)); + assertJaxbElement(oAsIs, new QName("asIs"), AsIsExpressionEvaluatorType.class); - Object oValue = prismContext.parserFor(dataValue).xml().parseRealValueToJaxbElement(); - System.out.println("Parsed expression evaluator: " + dataValue + " as " + oValue); - AssertJUnit.assertTrue("result is of wrong class (not JAXBElement): " + oValue.getClass(), oValue instanceof JAXBElement); + JAXBElement oValue = prismContext.parserFor(dataValue).xml().parseRealValueToJaxbElement(); + System.out.println(dumpResult(dataValue, oValue)); + assertJaxbElement(oValue, SchemaConstantsGenerated.C_VALUE, String.class); } - + + private void assertJaxbElement(JAXBElement jaxbElement, QName name, Class clazz) { + assertEquals("Wrong JAXB element name", name, jaxbElement.getName()); + assertEquals("Wrong JAXB element declared type", clazz, jaxbElement.getDeclaredType()); + assertEquals("Wrong JAXB element value type", clazz, jaxbElement.getValue().getClass()); + } + + private String dumpResult(String data, JAXBElement jaxb) { + return "Parsed expression evaluator: " + data + " as " + jaxb + " (name=" + jaxb.getName() + ", declaredType=" + jaxb.getDeclaredType() + ", value=" + jaxb.getValue() + ")"; + } + @Test public void testParseValueFilterWithAny() throws Exception { From 89a72c507a171c304e17ea7864d4843fee435f50 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Wed, 19 Oct 2016 17:22:30 +0200 Subject: [PATCH 42/74] A couple of fixes. --- .../main/java/com/evolveum/midpoint/prism/Item.java | 2 +- .../evolveum/midpoint/prism/marshaller/ItemInfo.java | 2 +- .../midpoint/prism/marshaller/QueryConvertor.java | 10 +++++----- .../prism/xml/ns/_public/types_3/RawType.java | 5 ++++- .../evolveum/midpoint/schema/TestDeltaConverter.java | 2 +- .../evolveum/midpoint/schema/TestSchemaRegistry.java | 11 ++--------- 6 files changed, 14 insertions(+), 18 deletions(-) diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/Item.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/Item.java index 25b7be0f757..538220a41ef 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/Item.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/Item.java @@ -528,7 +528,7 @@ protected void diffInternal(Item other, Collection del // No need to process this value again iterator.remove(); break; - } + } } if (!found) { // We have the value and the other does not, this is delete of the entire value diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/ItemInfo.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/ItemInfo.java index c04efb57191..0027af29521 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/ItemInfo.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/ItemInfo.java @@ -103,7 +103,7 @@ private static ID augmentWithType(ID definition, Cla } ItemDefinition rawDefFromType = schemaRegistry.findItemDefinitionByType(typeName); if (rawDefFromType == null) { - throw new SchemaException("Unknown type name " + typeName); + return definition; // TODO warning if wrong type? } if (!definitionClass.isAssignableFrom(rawDefFromType.getClass())) { throw new SchemaException("Wrong type name " + typeName + " (not a " + definitionClass.getClass().getSimpleName() + ")"); // TODO context of error diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/QueryConvertor.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/QueryConvertor.java index ac4ee772339..4430fd6004b 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/QueryConvertor.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/QueryConvertor.java @@ -321,11 +321,11 @@ private static ObjectFilter parseComparisonFilter(QN Entry expressionEntry = clauseXMap.getSingleEntryThatDoesNotMatch( ELEMENT_VALUE, ELEMENT_MATCHING, ELEMENT_PATH); if (expressionEntry != null) { - RootXNode expressionRoot = clauseXMap.getEntryAsRoot(expressionEntry.getKey()); - PrismPropertyValue expressionPropertyValue = prismContext.parserFor(expressionRoot).parseItemValue(); if (preliminaryParsingOnly) { return null; } else { + RootXNode expressionRoot = clauseXMap.getEntryAsRoot(expressionEntry.getKey()); + PrismPropertyValue expressionPropertyValue = prismContext.parserFor(expressionRoot).parseItemValue(); ExpressionWrapper expressionWrapper = new ExpressionWrapper(); expressionWrapper.setExpression(expressionPropertyValue.getValue()); if (isEq) { @@ -432,15 +432,15 @@ private static RefFilter parseRefFilter(MapXNode claus XNode valueXnode = clauseXMap.get(ELEMENT_VALUE); if (valueXnode != null) { + if (preliminaryParsingOnly) { + return null; + } RootXNode valueRoot = new RootXNode(ELEMENT_VALUE, valueXnode); Item item = prismContext.parserFor(valueRoot) .name(itemName) .definition(itemDefinition) .context(ParsingContext.allowMissingRefTypes()) .parseItem(); - if (preliminaryParsingOnly) { - return null; - } PrismReference ref = (PrismReference)item; if (item.getValues().size() < 1) { throw new IllegalStateException("No values to search specified for item " + itemName); diff --git a/infra/prism/src/main/java/com/evolveum/prism/xml/ns/_public/types_3/RawType.java b/infra/prism/src/main/java/com/evolveum/prism/xml/ns/_public/types_3/RawType.java index 5221ee74067..c5124f88b8e 100644 --- a/infra/prism/src/main/java/com/evolveum/prism/xml/ns/_public/types_3/RawType.java +++ b/infra/prism/src/main/java/com/evolveum/prism/xml/ns/_public/types_3/RawType.java @@ -10,6 +10,7 @@ import com.evolveum.midpoint.util.exception.SystemException; import org.apache.commons.lang.Validate; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jvnet.jaxb2_commons.lang.Equals; import org.jvnet.jaxb2_commons.lang.EqualsStrategy; import org.jvnet.jaxb2_commons.locator.ObjectLocator; @@ -82,7 +83,8 @@ public PrismContext getPrismContext() { //region Parsing and serialization // itemDefinition may be null; in that case we do the best what we can - public IV getParsedValue(ItemDefinition itemDefinition, QName itemName) throws SchemaException { + public IV getParsedValue(@Nullable ItemDefinition itemDefinition, @Nullable QName itemName) throws SchemaException { + Validate.isTrue(itemDefinition != null || itemName != null); if (parsed != null) { return (IV) parsed; } else if (xnode != null) { @@ -99,6 +101,7 @@ public IV getParsedValue(ItemD value = null; } } else { + assert itemName != null; PrismProperty subItem = PrismProperty.createRaw(xnode, itemName, prismContext); value = (IV) subItem.getValue(); } diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestDeltaConverter.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestDeltaConverter.java index ec4c708fe6b..620f0842a9a 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestDeltaConverter.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestDeltaConverter.java @@ -274,7 +274,7 @@ public void testProtectedStringObjectDelta() throws Exception { RawType val = valueElements.get(0); MapXNode valXNode = (MapXNode) val.serializeToXNode(); PrimitiveXNode clearValueNode = (PrimitiveXNode) valXNode.get(ProtectedStringType.F_CLEAR_VALUE); - val.getParsedValue(null, null); + val.getParsedValue(null, new QName("dummy")); // System.out.println("clear value " + clearValueNode); assertEquals("Wrong element value", protectedString.getClearValue(), clearValueNode.getParsedValue(DOMUtil.XSD_STRING)); // List values = val.getContent(); diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestSchemaRegistry.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestSchemaRegistry.java index cbf19514006..c5b3d7beb0b 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestSchemaRegistry.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestSchemaRegistry.java @@ -32,6 +32,7 @@ import javax.xml.validation.Schema; import javax.xml.validation.Validator; +import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.schema.SchemaRegistryImpl; import com.evolveum.midpoint.schema.constants.SchemaConstants; @@ -40,14 +41,6 @@ import org.w3c.dom.Element; import org.xml.sax.SAXException; -import com.evolveum.midpoint.prism.ItemDefinition; -import com.evolveum.midpoint.prism.PrismContainerDefinition; -import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.PrismObject; -import com.evolveum.midpoint.prism.PrismObjectDefinition; -import com.evolveum.midpoint.prism.PrismPropertyDefinition; -import com.evolveum.midpoint.prism.PrismReferenceDefinition; -import com.evolveum.midpoint.prism.PrismReferenceValue; import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.prism.schema.PrismSchema; import com.evolveum.midpoint.prism.schema.SchemaRegistry; @@ -145,7 +138,7 @@ public void testReferenceInExtension() throws SchemaException, SAXException, IOE System.out.println("UserRef definition:"); System.out.println(itemDefinition.debugDump()); - assertEquals("Wrong userRef definition class", PrismReferenceDefinition.class, itemDefinition.getClass()); + assertEquals("Wrong userRef definition class", PrismReferenceDefinitionImpl.class, itemDefinition.getClass()); } @Test From c5ad8b73e99666e8bf6a5115f3d335513c69c3db Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Wed, 19 Oct 2016 23:37:58 +0200 Subject: [PATCH 43/74] Prism and schema tests passing. --- .travis.yml | 17 ++-- .../common/refinery/TestRefinedSchema.java | 8 +- .../com/evolveum/midpoint/prism/Item.java | 3 + .../midpoint/prism/ItemDefinition.java | 1 + .../midpoint/prism/PrismContainerValue.java | 16 ++-- .../evolveum/midpoint/prism/PrismParser.java | 85 ++++++++++--------- .../midpoint/prism/PrismParserNoIO.java | 5 +- .../prism/PrismPropertyDefinition.java | 18 ++++ .../prism/PrismPropertyDefinitionImpl.java | 16 +--- .../midpoint/prism/PrismPropertyValue.java | 34 ++++++-- .../midpoint/prism/PrismReferenceValue.java | 38 +++++++-- .../evolveum/midpoint/prism/PrismValue.java | 36 ++++++-- .../prism/lex/json/JsonLexicalProcessor.java | 2 +- .../prism/marshaller/PrismParserImpl.java | 30 +++---- .../prism/marshaller/PrismParserImplIO.java | 5 +- .../prism/marshaller/PrismParserImplNoIO.java | 5 +- .../prism/marshaller/PrismUnmarshaller.java | 32 ++++--- .../midpoint/prism/xnode/PrimitiveXNode.java | 13 +-- .../prism/xml/ns/_public/types_3/RawType.java | 49 ++++++----- .../midpoint/schema/TestDeltaConverter.java | 2 +- .../midpoint/schema/TestJaxbParsing.java | 3 +- .../midpoint/schema/TestQueryConvertor.java | 8 +- .../parser/resource/TestParseResource.java | 2 +- .../ScriptingExpressionEvaluator.java | 3 +- .../intest/scripting/TestScriptingBasic.java | 2 +- ...gleItemSerializationSafeContainerImpl.java | 2 +- 26 files changed, 250 insertions(+), 185 deletions(-) diff --git a/.travis.yml b/.travis.yml index a743e1fc463..e9125a14380 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,4 +1,4 @@ -sudo: false +sudo: required dist: trusty language: java @@ -15,20 +15,19 @@ before_install: - unzip -qq apache-maven-3.3.9-bin.zip - export M2_HOME=$PWD/apache-maven-3.3.9 - export PATH=$M2_HOME/bin:$PATH - - export MAVEN_OPTS='-Xmx2g -XX:MaxPermSize=256m' + - export MAVEN_OPTS='-Xmx2g' # custom script is used so build and tests are done in one mvn command, separating it (as Travis does by default) leads to problem with ConnId (notably DummyResource) script: mvn clean install addons: hostname: localhost # workaround for short hostname - apt: - packages: - - oracle-java8-installer # install newest JDK8 - #- openjdk-8-jdk + #apt: + #packages: + #- oracle-java8-installer # install newest JDK8 jdk: - - openjdk7 - - oraclejdk7 - #- openjdk8 + #- openjdk7 + #- oraclejdk7 - oraclejdk8 + - openjdk8 diff --git a/infra/common/src/test/java/com/evolveum/midpoint/common/refinery/TestRefinedSchema.java b/infra/common/src/test/java/com/evolveum/midpoint/common/refinery/TestRefinedSchema.java index 2d1def12a37..ab90896912e 100644 --- a/infra/common/src/test/java/com/evolveum/midpoint/common/refinery/TestRefinedSchema.java +++ b/infra/common/src/test/java/com/evolveum/midpoint/common/refinery/TestRefinedSchema.java @@ -158,11 +158,11 @@ private void assertRefinedSchema(ResourceType resourceType, RefinedResourceSchem RefinedObjectClassDefinition rAccountDef = rSchema.getRefinedDefinition(ShadowKindType.ACCOUNT, (String)null); RefinedObjectClassDefinition accountDefByNullObjectclass = rSchema.findRefinedDefinitionByObjectClassQName(ShadowKindType.ACCOUNT, null); - assertTrue("findAccountDefinitionByObjectClass(null) returned wrong value", rAccountDef.equals(accountDefByNullObjectclass)); + assertEquals("findAccountDefinitionByObjectClass(null) returned wrong value", rAccountDef, accountDefByNullObjectclass); RefinedObjectClassDefinition accountDefByIcfAccountObjectclass = rSchema.findRefinedDefinitionByObjectClassQName(ShadowKindType.ACCOUNT, new QName(resourceType.getNamespace(), SchemaTestConstants.ICF_ACCOUNT_OBJECT_CLASS_LOCAL_NAME)); - assertTrue("findAccountDefinitionByObjectClass(ICF account) returned wrong value", rAccountDef.equals(accountDefByIcfAccountObjectclass)); + assertEquals("findAccountDefinitionByObjectClass(ICF account) returned wrong value", rAccountDef, accountDefByIcfAccountObjectclass); assertRObjectClassDef(rAccountDef, resourceType, sourceLayer, validationLayer); System.out.println("Refined account definitionn:"); @@ -341,7 +341,7 @@ private void assertAccountShadow(PrismObject accObject, PrismObject< PrismAsserts.assertPropertyValue(accObject, ShadowType.F_INTENT, SchemaConstants.INTENT_DEFAULT); PrismContainer attributes = accObject.findOrCreateContainer(SchemaConstants.C_ATTRIBUTES); - assertEquals("Wrong type of definition in account", ResourceAttributeContainerDefinition.class, attributes.getDefinition().getClass()); + assertEquals("Wrong type of definition in account", ResourceAttributeContainerDefinitionImpl.class, attributes.getDefinition().getClass()); ResourceAttributeContainerDefinition attrDef = (ResourceAttributeContainerDefinition)attributes.getDefinition(); assertAttributeDefs(attrDef, resourceType, null, LayerType.MODEL); @@ -435,7 +435,7 @@ private void assertAttributeDefs(ResourceAttributeContainerDefinition attrsDef, assertNotNull("Null account definition", attrsDef); assertEquals(SchemaConstants.INTENT_DEFAULT, attrsDef.getIntent()); assertEquals("AccountObjectClass", attrsDef.getComplexTypeDefinition().getTypeName().getLocalPart()); - assertEquals("Wrong objectclass in the definition of definition in account", RefinedObjectClassDefinition.class, attrsDef.getComplexTypeDefinition().getClass()); + assertEquals("Wrong objectclass in the definition of definition in account", RefinedObjectClassDefinitionImpl.class, attrsDef.getComplexTypeDefinition().getClass()); RefinedObjectClassDefinition rAccount = (RefinedObjectClassDefinition) attrsDef.getComplexTypeDefinition(); assertRObjectClassDef(rAccount, resourceType, sourceLayer, validationLayer); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/Item.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/Item.java index 538220a41ef..cd2d703e690 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/Item.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/Item.java @@ -393,6 +393,9 @@ public boolean add(V newValue) throws SchemaException { public boolean add(V newValue, boolean checkUniqueness) throws SchemaException { checkMutability(); + if (newValue.getPrismContext() == null) { + newValue.setPrismContext(prismContext); + } newValue.setParent(this); if (checkUniqueness && containsEquivalentValue(newValue)) { return false; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/ItemDefinition.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/ItemDefinition.java index b94c322071f..b6ded60425f 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/ItemDefinition.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/ItemDefinition.java @@ -95,4 +95,5 @@ public interface ItemDefinition extends Definition { @Override void revive(PrismContext prismContext); + } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerValue.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerValue.java index 6f0dab101d1..d5f4a966bed 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerValue.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerValue.java @@ -61,8 +61,6 @@ public class PrismContainerValue extends PrismValue imp // It can be lazily evaluated based on containerable value. private ComplexTypeDefinition complexTypeDefinition = null; - transient private PrismContext prismContext; - public PrismContainerValue() { } @@ -79,15 +77,10 @@ public PrismContainerValue(C containerable, PrismContext prismContext) { this.prismContext = prismContext; } - private void setPrismContext(PrismContext prismContext) { - this.prismContext = prismContext; - } - public PrismContainerValue(OriginType type, Objectable source, PrismContainerable container, Long id, ComplexTypeDefinition complexTypeDefinition, PrismContext prismContext) { - super(type, source, container); + super(prismContext, type, source, container); this.id = id; this.complexTypeDefinition = complexTypeDefinition; - this.prismContext = prismContext; } @Override @@ -1447,4 +1440,11 @@ public Class getRealClass() { } return resolveClass(null); } + + @SuppressWarnings("unchecked") + @Nullable + @Override + public T getRealValue() { + return (T) asContainerable(); + } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParser.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParser.java index 68f837ae72d..93792d7d4ea 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParser.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParser.java @@ -17,17 +17,13 @@ package com.evolveum.midpoint.prism; import com.evolveum.midpoint.prism.xnode.RootXNode; -import com.evolveum.midpoint.prism.xnode.XNode; import com.evolveum.midpoint.util.exception.SchemaException; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.w3c.dom.Element; import javax.xml.bind.JAXBElement; import javax.xml.namespace.QName; -import java.io.File; import java.io.IOException; -import java.io.InputStream; import java.util.List; /** @@ -37,17 +33,18 @@ * 1. how to determine the type of data to be retrieved, * 2. how to determine the name of the item that is to be created (in case of prism items). * - * For most cases, this data can be determined from the input. E.g. if we are parsing a prism object that is rooted at the + * For most cases, both can be determined from the input. E.g. if we are parsing a prism object that is rooted at the * "user" XML element, it is clear that the type is c:UserType and the name is c:user. In other cases, the algorithms * are the following: * * Data type determination: We collect all the available data, i.e. - * - source data (xsi:type/@type), - * - itemDefinition, - * - itemName, - * - typeName, - * - typeClass - * and take the most specific of these. + * - explicit type specification in source data (xsi:type/@type), + * - itemDefinition provided by the caller, + * - item name in source data, + * - itemName provided by the caller, + * - typeName provided by the caller, + * - typeClass provided by the caller + * and take the most specific of these. In case of conflict we report an error. * * Data name determination: First name that is present takes precedence: * 1. itemName @@ -92,8 +89,8 @@ public interface PrismParser { PrismParser yaml(); /** - * Provides a parsing context for the parser. The context contains e.g. mode of operations (set by client) - * or a list of warnings (maintained by the parser). + * Provides a parsing context for the parser. The context contains e.g. selection of strict/compat + * mode of operation (set by client) or a list of warnings (maintained by the parser). * @param context The parsing context. * @return Updated parser. */ @@ -123,14 +120,6 @@ public interface PrismParser { @NotNull PrismParser definition(ItemDefinition itemDefinition); - /** - * Tells parser what name to use for parsed item. Optional. - * @param itemName Item name to use. - * @return Updated parser. - */ - @NotNull - PrismParser name(QName itemName); - /** * Tells parser what data type to expect. Optional. * @param typeName Data type to expect. @@ -147,6 +136,14 @@ public interface PrismParser { @NotNull PrismParser type(Class typeClass); + /** + * Tells parser what name to use for parsed item. Optional. + * @param itemName Item name to use. + * @return Updated parser. + */ + @NotNull + PrismParser name(QName itemName); + /** * Parses the input as a prism object. * @return The object. @@ -156,26 +153,28 @@ public interface PrismParser { /** * Parses the input as a prism item. (Object, container, reference, value.) + * May return raw property values as part of the prism structure, if definitions are not known. * @return The item. */ Item parseItem() throws SchemaException, IOException; /** * Parses the input as a prism value. (Container value, reference value, property value.) + * May return raw property values as part of the prism structure, if definitions are not known. * @return The item. */ IV parseItemValue() throws SchemaException, IOException; /** * Parses a real value - either property or container value. - * @param clazz Expected class of the data (can be Object.class when unknown). - * @return Real value - POJO, Containerable or Objectable. + * @param clazz Expected class of the data. May be null if unknown. + * @return Real value - POJO, Containerable, Objectable or Referencable. */ - T parseRealValue(Class clazz) throws IOException, SchemaException; + T parseRealValue(@Nullable Class clazz) throws IOException, SchemaException; /** - * Parses a real value with an unknown class. - * @return Real value - POJO, Containerable or Objectable. + * Parses a real value. The class is not supplied by the caller, so it has to be determined from the data source. + * @return Real value - POJO, Containerable, Objectable or Referencable. */ T parseRealValue() throws IOException, SchemaException; @@ -185,11 +184,29 @@ public interface PrismParser { JAXBElement parseRealValueToJaxbElement() throws IOException, SchemaException; /** - * Parses the input into RootXNode. + * Parses the input into RootXNode. This is a bit unusual approach, skipping the unmarshalling phase altogether. + * But it is useful at some places. * @return RootXNode corresponding to the input. */ RootXNode parseToXNode() throws IOException, SchemaException; + /** + * Parses either an item, or a real value. It depends on the type declaration or item name in the source data. + * 1) If explicit type is present, it is taken into account. If it corresponds to a prism item, the input is parsed + * as a prism item. Otherwise, it is parsed as a real value (containerable or simple POJO), if possible. + * 2) If there is no type, the item name is consulted. If it corresponds to a prism item, the input is parsed + * as a prism item. Otherwise, an exception is thrown. + * + * Pre-set parameters (itemDefinition, typeName, itemName) must NOT be present. + * + * Use with utmost care. If at all possible, avoid it. + * + * @return either prism item (Item) or a real value (Object) + */ + Object parseItemOrRealValue() throws IOException, SchemaException; + + + // ============= other methods (convenience ones, deprecated ones etc) ============= /** @@ -214,18 +231,4 @@ public interface PrismParser { // T parseAtomicValue(QName typeName) throws IOException, SchemaException; - /** - * Parses (almost) anything: either an item with a definition, or an atomic (i.e. property-like) value. - * Does not care for schemaless items! - * - * CAUTION: EXPERIMENTAL - Avoid using this method if at all possible. - * Its result is not well defined, namely, whether it returns Item or a value. - * - * Used for scripting and wf-related data serialization. To be replaced. - * - * @return either Item or an unmarshalled bean value - */ - @Deprecated - Object parseAnyData() throws IOException, SchemaException; - } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserNoIO.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserNoIO.java index c8fe23f9544..7b5b895c60c 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserNoIO.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParserNoIO.java @@ -66,11 +66,10 @@ public interface PrismParserNoIO extends PrismParser { T parseRealValue() throws SchemaException; JAXBElement parseRealValueToJaxbElement() throws SchemaException; RootXNode parseToXNode() throws SchemaException; + Object parseItemOrRealValue() throws SchemaException; - // auxiliary and deprecated methods + // auxiliary methods @NotNull List> parseObjects() throws SchemaException; - @Deprecated - Object parseAnyData() throws SchemaException; } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyDefinition.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyDefinition.java index 7f6d24846c4..da4b65acfaa 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyDefinition.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyDefinition.java @@ -18,6 +18,7 @@ import com.evolveum.midpoint.prism.delta.PropertyDelta; import com.evolveum.midpoint.prism.path.ItemPath; +import com.evolveum.midpoint.util.DOMUtil; import com.evolveum.midpoint.util.DisplayableValue; import com.evolveum.midpoint.util.exception.SchemaException; @@ -32,10 +33,27 @@ public interface PrismPropertyDefinition extends ItemDefinition + * The returned type is either XSD simple type or complex type. It may not + * be defined in the same schema (especially if it is standard XSD simple + * type). + * + * @return QName of the property value type + * + * NOTE: This is very strange property. Isn't it the same as typeName(). + * It is even not used in midPoint. Marking as deprecated. + */ + @Deprecated QName getValueType(); Boolean isIndexed(); + default boolean isAnyType() { + return DOMUtil.XSD_ANYTYPE.equals(getTypeName()); + } + QName getMatchingRuleQName(); @Override diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyDefinitionImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyDefinitionImpl.java index 9d9996f4f89..322f8dab741 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyDefinitionImpl.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyDefinitionImpl.java @@ -86,25 +86,13 @@ public Collection> getAllowedValues() { public T defaultValue(){ return defaultValue; } - /** - * Returns QName of the property value type. - *

- * The returned type is either XSD simple type or complex type. It may not - * be defined in the same schema (especially if it is standard XSD simple - * type). - * - * @return QName of the property value type - */ + @Override public QName getValueType() { return valueType; } - void setValueType(QName valueType) { - this.valueType = valueType; - } - - /** + /** * This is XSD annotation that specifies whether a property should * be indexed in the storage. It can only apply to properties. It * has following meaning: diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyValue.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyValue.java index 61f47d766e5..a76f845a7a2 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyValue.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyValue.java @@ -46,6 +46,7 @@ import java.util.Comparator; import org.apache.commons.lang.StringUtils; +import org.jetbrains.annotations.Nullable; import org.jvnet.jaxb2_commons.lang.Equals; import org.w3c.dom.Element; @@ -68,8 +69,16 @@ public PrismPropertyValue(T value) { this(value, null, null); } + public PrismPropertyValue(T value, PrismContext prismContext) { + this(value, prismContext, null, null); + } + public PrismPropertyValue(T value, OriginType type, Objectable source) { - super(type,source); + this(value, null, type, source); + } + + public PrismPropertyValue(T value, PrismContext prismContext, OriginType type, Objectable source) { + super(type, source); if (value instanceof PrismPropertyValue) { throw new IllegalArgumentException("Probably problem somewhere, encapsulating property " + "value object to another property value."); @@ -112,13 +121,10 @@ public T getValue() { // We are weak now. If there is no better definition for this we assume a default definition and process // the attribute now. But we should rather do this: TODO: // throw new IllegalStateException("Attempt to get value withot a type from raw value of property "+getParent()); - if (parent != null && parent.getPrismContext() != null) { - def = SchemaRegistryImpl.createDefaultItemDefinition(parent.getElementName(), parent.getPrismContext()); + if (parent != null && getPrismContext() != null) { + def = SchemaRegistryImpl.createDefaultItemDefinition(parent.getElementName(), getPrismContext()); } else if (PrismContextImpl.isAllowSchemalessSerialization()) { - if (rawElement instanceof Element) { - // Do the most stupid thing possible. Assume string value. And there will be no definition. - value = (T) ((Element)rawElement).getTextContent(); - } else if (rawElement instanceof PrimitiveXNode) { + if (rawElement instanceof PrimitiveXNode) { try { QName type = rawElement.getTypeQName() != null ? rawElement.getTypeQName() : DOMUtil.XSD_STRING; value = (T) ((PrimitiveXNode) rawElement).getParsedValueWithoutRecording(type); @@ -140,6 +146,9 @@ public T getValue() { throw new IllegalStateException(e.getMessage(),e); } } + if (rawElement != null) { + return (T) RawType.create(rawElement, getPrismContext()); + } } return value; } @@ -167,8 +176,9 @@ public boolean isRaw() { @Override public void applyDefinition(ItemDefinition definition) throws SchemaException { - if (definition != null && rawElement !=null) { - value = (T) parseRawElementToNewRealValue(this, (PrismPropertyDefinition) definition); + PrismPropertyDefinition propertyDefinition = (PrismPropertyDefinition) definition; + if (propertyDefinition != null && !propertyDefinition.isAnyType() && rawElement != null) { + value = (T) parseRawElementToNewRealValue(this, propertyDefinition); rawElement = null; } } @@ -647,4 +657,10 @@ public JAXBElement toJaxbElement() { public Class getRealClass() { return value != null ? value.getClass() : null; } + + @Nullable + @Override + public T getRealValue() { + return (T) getValue(); + } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismReferenceValue.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismReferenceValue.java index 18fa902e6de..5d6dff328a7 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismReferenceValue.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismReferenceValue.java @@ -35,6 +35,7 @@ import com.evolveum.prism.xml.ns._public.query_3.SearchFilterType; import com.evolveum.prism.xml.ns._public.types_3.EvaluationTimeType; import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; +import org.jetbrains.annotations.Nullable; /** * @author Radovan Semancik @@ -500,21 +501,37 @@ public String toString() { } public Referencable asReferencable() { - if (referencable == null){ - Itemable parent = getParent(); + if (referencable != null) { + return referencable; + } + + Itemable parent = getParent(); + if (parent != null) { QName xsdType = parent.getDefinition().getTypeName(); Class clazz = getPrismContext().getSchemaRegistry().getCompileTimeClass(xsdType); - if (clazz != null){ + if (clazz != null) { try { referencable = (Referencable) clazz.newInstance(); } catch (InstantiationException | IllegalAccessException e) { - throw new SystemException("Couldn't create jaxb object instance of '" + clazz + "': "+e.getMessage(), e); + throw new SystemException("Couldn't create jaxb object instance of '" + clazz + "': " + e.getMessage(), + e); } } referencable.setupReferenceValue(this); } - return referencable; - + + // A hack, just to avoid crashes. + return new Referencable() { + PrismReferenceValue referenceValue = PrismReferenceValue.this; + @Override + public PrismReferenceValue asReferenceValue() { + return referenceValue; + } + @Override + public void setupReferenceValue(PrismReferenceValue value) { + referenceValue = value; + } + }; } @Override @@ -592,6 +609,13 @@ public String toHumanReadableString() { @Override public Class getRealClass() { - return PrismReferenceValue.class; + return Referencable.class; + } + + @SuppressWarnings("unchecked") + @Nullable + @Override + public Referencable getRealValue() { + return asReferencable(); } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismValue.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismValue.java index 4c822b874e7..66cf9c4c561 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismValue.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismValue.java @@ -45,27 +45,39 @@ public abstract class PrismValue implements IPrismValue { private OriginType originType; private Objectable originObject; private Itemable parent; - protected Element domElement = null; private transient Map userData = new HashMap<>(); protected boolean immutable; - PrismValue() { - super(); + transient protected PrismContext prismContext; + + PrismValue() { + } + + PrismValue(PrismContext prismContext) { + this.prismContext = prismContext; } PrismValue(OriginType type, Objectable source) { - super(); + this(null, type, source); + } + + PrismValue(PrismContext prismContext, OriginType type, Objectable source) { + this.prismContext = prismContext; this.originType = type; this.originObject = source; } - PrismValue(OriginType type, Objectable source, Itemable parent) { - super(); + PrismValue(PrismContext prismContext, OriginType type, Objectable source, Itemable parent) { + this.prismContext = prismContext; this.originType = type; this.originObject = source; this.parent = parent; } + public void setPrismContext(PrismContext prismContext) { + this.prismContext = prismContext; + } + public void setOriginObject(Objectable source) { this.originObject = source; } @@ -142,8 +154,12 @@ public static void clearParent(List> values) { @Override public PrismContext getPrismContext() { + if (prismContext != null) { + return prismContext; + } if (parent != null) { - return parent.getPrismContext(); + prismContext = parent.getPrismContext(); + return prismContext; } return null; } @@ -169,6 +185,9 @@ public void applyDefinition(ItemDefinition definition, boolean force) throws Sch } public void revive(PrismContext prismContext) throws SchemaException { + if (this.prismContext == null) { + this.prismContext = prismContext; + } recompute(prismContext); } @@ -418,4 +437,7 @@ protected void checkMutability() { @Nullable abstract public Class getRealClass(); + @Nullable + abstract public T getRealValue(); + } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/JsonLexicalProcessor.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/JsonLexicalProcessor.java index 961047aa499..7510f53c96f 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/JsonLexicalProcessor.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/JsonLexicalProcessor.java @@ -114,7 +114,7 @@ protected void serializeFromPrimitive(PrimitiveXNode primitive, AbstractJ if (explicitType != null) { ctx.generator.writeStartObject(); ctx.generator.writeStringField(PROP_TYPE, QNameUtil.qNameToUri(primitive.getTypeQName())); - ctx.generator.writeObjectField(PROP_VALUE, primitive.getValue()); + ctx.generator.writeObjectField(PROP_VALUE, primitive.getStringValue()); ctx.generator.writeEndObject(); } else { serializePrimitiveTypeLessValue(primitive, ctx); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismParserImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismParserImpl.java index d5d4451030d..d0559eaf14c 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismParserImpl.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismParserImpl.java @@ -19,7 +19,6 @@ import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.lex.LexicalProcessor; import com.evolveum.midpoint.prism.xnode.RootXNode; -import com.evolveum.midpoint.prism.xnode.XNode; import com.evolveum.midpoint.util.exception.SchemaException; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -146,6 +145,7 @@ Item doParseItem() th return doParseItem(xnode); } + @SuppressWarnings("unchecked") private Item doParseItem(RootXNode xnode) throws IOException, SchemaException { return (Item) prismContext.getPrismUnmarshaller().parseItem(xnode, itemDefinition, itemName, typeName, typeClass, context); } @@ -188,30 +188,24 @@ private T doParseRealValue(Class clazz, RootXNode root) throws IOExceptio if (clazz == null && info.getTypeName() != null) { clazz = (Class) prismContext.getSchemaRegistry().determineClassForType(info.getTypeName()); } -// if (clazz == null) { -// throw new IllegalArgumentException("Couldn't determine type for " + root); -// } } - PrismBeanConverter beanConverter = prismContext.getBeanConverter(); - if (clazz != null && beanConverter.canProcess(clazz)) { - return beanConverter.unmarshall(root, clazz, context); + if (clazz != null && getBeanConverter().canProcess(clazz)) { + return getBeanConverter().unmarshall(root, clazz, context); } else { PrismValue prismValue = doParseItemValue(root); if (prismValue == null) { return null; - } else if (prismValue instanceof PrismPropertyValue) { - return (T) ((PrismPropertyValue) prismValue).getValue(); - } else if (prismValue instanceof PrismContainerValue) { - return (T) ((PrismContainerValue) prismValue).asContainerable(); - } else if (prismValue instanceof PrismReferenceValue) { - return (T) prismValue; // TODO ok? } else { - throw new IllegalStateException("Unsupported value: " + prismValue.getClass()); + return prismValue.getRealValue(); } } } + private PrismBeanConverter getBeanConverter() { + return prismContext.getBeanConverter(); + } + @SuppressWarnings("unchecked") T doParseRealValue() throws IOException, SchemaException { return (T) doParseRealValue(typeClass); @@ -242,10 +236,12 @@ List> doParseObjects() throws IOException, Sch return objects; } - @Deprecated - Object doParseAnyData() throws IOException, SchemaException { + Object doParseItemOrRealValue() throws IOException, SchemaException { RootXNode xnode = getLexicalProcessor().read(source, context); - return prismContext.getPrismUnmarshaller().parseAnyData(xnode, context); + if (itemDefinition != null || itemName != null || typeName != null || typeClass != null) { + throw new IllegalArgumentException("Item definition, item name, type name and type class must be null when calling parseItemOrRealValue."); + } + return prismContext.getPrismUnmarshaller().parseItemOrRealValue(xnode, context); } @NotNull diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismParserImplIO.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismParserImplIO.java index da5e13fd193..ce0dd3cbfdf 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismParserImplIO.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismParserImplIO.java @@ -78,9 +78,8 @@ public List> parseObjects() throws SchemaExcep return doParseObjects(); } - @Deprecated @Override - public Object parseAnyData() throws IOException, SchemaException { - return doParseAnyData(); + public Object parseItemOrRealValue() throws IOException, SchemaException { + return doParseItemOrRealValue(); } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismParserImplNoIO.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismParserImplNoIO.java index d796bf2715f..36c25309b40 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismParserImplNoIO.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismParserImplNoIO.java @@ -177,11 +177,10 @@ public List> parseObjects() throws SchemaExcep } } - @Deprecated @Override - public Object parseAnyData() throws SchemaException { + public Object parseItemOrRealValue() throws SchemaException { try { - return doParseAnyData(); + return doParseItemOrRealValue(); } catch (IOException e) { throw new IllegalStateException(e); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismUnmarshaller.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismUnmarshaller.java index 450d4286c2a..0fcd3ca4c83 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismUnmarshaller.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismUnmarshaller.java @@ -25,10 +25,12 @@ import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.schema.PrismSchema; import com.evolveum.midpoint.prism.schema.SchemaRegistry; +import com.evolveum.midpoint.prism.util.RawTypeUtil; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.prism.xml.ns._public.query_3.SearchFilterType; +import com.evolveum.prism.xml.ns._public.types_3.RawType; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang.Validate; @@ -103,8 +105,7 @@ PrismObject parseObject(MapXNode map, PrismObjectDefin return parseItemInternal(root.getSubnode(), itemInfo.getItemName(), itemInfo.getItemDefinition(), pc); } - @Deprecated - public Object parseAnyData(@NotNull RootXNode root, ParsingContext pc) throws SchemaException { + Object parseItemOrRealValue(@NotNull RootXNode root, ParsingContext pc) throws SchemaException { // is the type name explicitly specified? (if not, guess that we have a string) QName typeName = root.getTypeQName(); if (typeName != null) { @@ -134,12 +135,10 @@ public Object parseAnyData(@NotNull RootXNode root, ParsingContext pc) throws Sc private Item parseItemInternal(@NotNull XNode node, @NotNull QName itemName, ItemDefinition itemDefinition, @NotNull ParsingContext pc) throws SchemaException { Validate.isTrue(!(node instanceof RootXNode)); - if (itemDefinition == null) { // Assume property in a container with runtime definition - return PrismProperty.createRaw(node, itemName, prismContext); + if (itemDefinition == null || itemDefinition instanceof PrismPropertyDefinition) { + return parseProperty(node, itemName, (PrismPropertyDefinition) itemDefinition, pc); } else if (itemDefinition instanceof PrismContainerDefinition) { // also objects go here return parseContainer(node, itemName, (PrismContainerDefinition) itemDefinition, pc); - } else if (itemDefinition instanceof PrismPropertyDefinition) { - return parseProperty(node, itemName, (PrismPropertyDefinition) itemDefinition, pc); } else if (itemDefinition instanceof PrismReferenceDefinition) { return parseReference(node, itemName, (PrismReferenceDefinition) itemDefinition, pc); } else { @@ -263,13 +262,16 @@ private PrismContainerValue parseContainerValueFrom @NotNull private PrismProperty parseProperty(@NotNull XNode node, @NotNull QName itemName, - @NotNull PrismPropertyDefinition itemDefinition, @NotNull ParsingContext pc) throws SchemaException { + @Nullable PrismPropertyDefinition itemDefinition, @NotNull ParsingContext pc) throws SchemaException { Validate.isTrue(!(node instanceof RootXNode)); - PrismProperty property = itemDefinition.instantiate(); + PrismProperty property = itemDefinition != null ? + itemDefinition.instantiate() : + new PrismProperty(itemName, prismContext); + if (node instanceof ListXNode) { ListXNode listNode = (ListXNode) node; - if (!itemDefinition.isMultiValue() && listNode.size() > 1) { + if (itemDefinition != null && !itemDefinition.isMultiValue() && listNode.size() > 1) { throw new SchemaException("Attempt to store multiple values in single-valued property " + itemName); } for (XNode subNode : listNode) { @@ -295,7 +297,11 @@ private PrismProperty parseProperty(@NotNull XNode node, @NotNull QName i } private PrismPropertyValue parsePropertyValue(@NotNull XNode node, - @NotNull PrismPropertyDefinition definition, @NotNull ParsingContext pc) throws SchemaException { + @Nullable PrismPropertyDefinition definition, @NotNull ParsingContext pc) throws SchemaException { + + if (definition == null || definition.isAnyType()) { + return PrismPropertyValue.createRaw(node); + } T realValue; if (node instanceof PrimitiveXNode) { @@ -318,7 +324,7 @@ private T parsePropertyRealValueFromPrimitive(@NotNull PrimitiveXNode pri if (getBeanConverter().canProcess(typeName)) { // Primitive elements may also have complex Java representations (e.g. enums) realValue = getBeanConverter().unmarshallPrimitive(primitiveNode, typeName, pc); - } else { + } else if (!DOMUtil.XSD_ANYTYPE.equals(typeName)) { try { realValue = primitiveNode.getParsedValue(typeName, pc.getEvaluationMode()); } catch (SchemaException e) { @@ -326,9 +332,11 @@ private T parsePropertyRealValueFromPrimitive(@NotNull PrimitiveXNode pri + ".\nDefinition: " + definition.debugDump(), e); return null; } + } else { + realValue = (T) RawType.create(primitiveNode, prismContext); } - if (!isValueAllowed(realValue, definition.getAllowedValues())) { + if (!(realValue instanceof RawType) && !isValueAllowed(realValue, definition.getAllowedValues())) { pc.warnOrThrow(LOGGER, "Skipping unknown value of type " + typeName + ". Value: " + primitiveNode.getStringValue()); return null; } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/PrimitiveXNode.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/PrimitiveXNode.java index 24a387f59cf..ac93514e4bc 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/PrimitiveXNode.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/PrimitiveXNode.java @@ -68,22 +68,12 @@ public PrimitiveXNode(T value) { public void parseValue(QName typeName, XNodeProcessorEvaluationMode mode) throws SchemaException { Validate.notNull(typeName, "Cannot parse primitive XNode without knowing its type"); if (valueParser != null) { - typeName = xsdAnyToString(typeName); value = valueParser.parse(typeName, mode); // Necessary. It marks that the value is parsed. It also frees some memory. valueParser = null; } } - // xsd:any type will be parsed as xsd:string (TODO reconsider!) - private QName xsdAnyToString(QName typeName) { - if (DOMUtil.XSD_ANYTYPE.equals(typeName)) { - return DOMUtil.XSD_STRING; - } else { - return typeName; - } - } - public T getValue() { return value; } @@ -161,7 +151,6 @@ public T getParsedValueWithoutRecording(QName typeName) throws SchemaException { if (isParsed()) { return value; } else { - typeName = xsdAnyToString(typeName); return valueParser.parse(typeName, XNodeProcessorEvaluationMode.STRICT); } } @@ -342,7 +331,7 @@ public boolean equals(Object obj) { String otherStringValue = String.valueOf(other.value); return otherStringValue.equals(thisStringValue); } else if (!other.isParsed() && isParsed()){ - String thisStringValue = String.valueOf(value);; + String thisStringValue = String.valueOf(value); String otherStringValue = other.getStringValue(); return thisStringValue.equals(otherStringValue); } diff --git a/infra/prism/src/main/java/com/evolveum/prism/xml/ns/_public/types_3/RawType.java b/infra/prism/src/main/java/com/evolveum/prism/xml/ns/_public/types_3/RawType.java index c5124f88b8e..c653c95be11 100644 --- a/infra/prism/src/main/java/com/evolveum/prism/xml/ns/_public/types_3/RawType.java +++ b/infra/prism/src/main/java/com/evolveum/prism/xml/ns/_public/types_3/RawType.java @@ -84,12 +84,12 @@ public PrismContext getPrismContext() { //region Parsing and serialization // itemDefinition may be null; in that case we do the best what we can public IV getParsedValue(@Nullable ItemDefinition itemDefinition, @Nullable QName itemName) throws SchemaException { - Validate.isTrue(itemDefinition != null || itemName != null); if (parsed != null) { return (IV) parsed; } else if (xnode != null) { IV value; - if (itemDefinition != null) { + if (itemDefinition != null + && !(itemDefinition instanceof PrismPropertyDefinition && ((PrismPropertyDefinition) itemDefinition).isAnyType())) { if (itemName == null) { itemName = itemDefinition.getName(); } @@ -100,20 +100,19 @@ public IV getParsedValue(@Null } else { value = null; } + xnode = null; + parsed = value; + return (IV) parsed; } else { - assert itemName != null; - PrismProperty subItem = PrismProperty.createRaw(xnode, itemName, prismContext); - value = (IV) subItem.getValue(); + // we don't really want to set 'parsed', as we didn't performed real parsing + return (IV) PrismPropertyValue.createRaw(xnode); } - xnode = null; - parsed = value; - return (IV) parsed; } else { return null; } } - public V getParsedRealValue(ItemDefinition itemDefinition, ItemPath itemPath) throws SchemaException { + public V getParsedRealValue(ID itemDefinition, ItemPath itemPath) throws SchemaException { if (parsed == null && xnode != null) { if (itemDefinition == null) { return prismContext.parserFor(xnode.toRootXNode()).parseRealValue(); // TODO what will be the result without definition? @@ -122,22 +121,26 @@ public V getParsedRealValue(ItemDefinition itemDef getParsedValue(itemDefinition, itemName); } } - if (parsed != null){ - if (parsed instanceof PrismPropertyValue){ - return (V) ((PrismPropertyValue) parsed).getValue(); - } else if (parsed instanceof PrismContainerValue){ - return (V) ((PrismContainerValue) parsed).asContainerable(); - } else if (parsed instanceof PrismReferenceValue){ - return (V) ((PrismReferenceValue) parsed).asReferencable(); - } + if (parsed != null) { + return parsed.getRealValue(); } - return null; - } - - + public T getParsedRealValue(@NotNull Class clazz) throws SchemaException { + if (parsed != null) { + if (clazz.isAssignableFrom(parsed.getClass())) { + return (T) parsed; + } else { + throw new IllegalArgumentException("Parsed value ("+parsed.getClass()+") is not assignable to "+clazz); + } + } else if (xnode != null) { + return (T) prismContext.parserFor(xnode.toRootXNode()).parseRealValue(clazz); + } else { + return null; + } + } + public Item getParsedItem(ID itemDefinition) throws SchemaException { Validate.notNull(itemDefinition); return getParsedItem(itemDefinition, itemDefinition.getName()); @@ -239,4 +242,8 @@ public static RawType create(String value, PrismContext prismContext) { return rv; } + public static RawType create(XNode node, PrismContext prismContext) { + return new RawType(node, prismContext); + } + } diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestDeltaConverter.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestDeltaConverter.java index 620f0842a9a..ec4c708fe6b 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestDeltaConverter.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestDeltaConverter.java @@ -274,7 +274,7 @@ public void testProtectedStringObjectDelta() throws Exception { RawType val = valueElements.get(0); MapXNode valXNode = (MapXNode) val.serializeToXNode(); PrimitiveXNode clearValueNode = (PrimitiveXNode) valXNode.get(ProtectedStringType.F_CLEAR_VALUE); - val.getParsedValue(null, new QName("dummy")); + val.getParsedValue(null, null); // System.out.println("clear value " + clearValueNode); assertEquals("Wrong element value", protectedString.getClearValue(), clearValueNode.getParsedValue(DOMUtil.XSD_STRING)); // List values = val.getContent(); diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestJaxbParsing.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestJaxbParsing.java index a7cb310914d..50a1d7aeb64 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestJaxbParsing.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestJaxbParsing.java @@ -241,7 +241,8 @@ public void testParseAnyValue() throws Exception { JAXBElement oValue = prismContext.parserFor(dataValue).xml().parseRealValueToJaxbElement(); System.out.println(dumpResult(dataValue, oValue)); - assertJaxbElement(oValue, SchemaConstantsGenerated.C_VALUE, String.class); + //assertJaxbElement(oValue, SchemaConstantsGenerated.C_VALUE, String.class); + assertJaxbElement(oValue, SchemaConstantsGenerated.C_VALUE, RawType.class); } private void assertJaxbElement(JAXBElement jaxbElement, QName name, Class clazz) { diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestQueryConvertor.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestQueryConvertor.java index 99dd04dd27f..1f88dd194cf 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestQueryConvertor.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestQueryConvertor.java @@ -214,7 +214,7 @@ public void testAccountQueryCompositeOr() throws Exception { public void testConnectorQuery() throws Exception { displayTestTitle("testConnectorQuery"); SearchFilterType filterType = PrismTestUtil.parseAtomicValue(FILTER_CONNECTOR_BY_TYPE_FILE, SearchFilterType.COMPLEX_TYPE); - ObjectQuery query = null; + ObjectQuery query; try { query = QueryJaxbConvertor.createObjectQuery(ConnectorType.class, filterType, getPrismContext()); displayQuery(query); @@ -227,12 +227,6 @@ public void testConnectorQuery() throws Exception { QueryType convertedQueryType = toQueryType(query); displayQueryType(convertedQueryType); - } catch (SchemaException ex) { - LOGGER.error("Error while converting query: {}", ex.getMessage(), ex); - throw ex; - } catch (RuntimeException ex) { - LOGGER.error("Error while converting query: {}", ex.getMessage(), ex); - throw ex; } catch (Exception ex) { LOGGER.error("Error while converting query: {}", ex.getMessage(), ex); throw ex; diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResource.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResource.java index f7308551500..6caffe36c1f 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResource.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResource.java @@ -275,7 +275,7 @@ private void assertResourcePrism(PrismObject resource, boolean isS new ItemPath(new QName("extension"), new QName("extConnType")), path); PrismPropertyValue filterValue = (PrismPropertyValue) equalFilter.getValues().get(0); - assertEquals("Wrong filter value", "org.identityconnectors.ldap.LdapConnector", ((String) filterValue.getValue()).trim()); + assertEquals("Wrong filter value", "org.identityconnectors.ldap.LdapConnector", ((RawType) filterValue.getValue()).getParsedRealValue(String.class).trim()); } EvaluationTimeType resolutionTime = connectorRefVal.getResolutionTime(); if (isSimple) { diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/ScriptingExpressionEvaluator.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/ScriptingExpressionEvaluator.java index ee49cf8ecb2..45098cc667b 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/ScriptingExpressionEvaluator.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/ScriptingExpressionEvaluator.java @@ -21,7 +21,6 @@ import com.evolveum.midpoint.model.impl.scripting.expressions.SelectEvaluator; import com.evolveum.midpoint.model.impl.scripting.helpers.JaxbHelper; import com.evolveum.midpoint.prism.Item; -import com.evolveum.midpoint.prism.ParsingContext; import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.marshaller.QueryConvertor; import com.evolveum.midpoint.prism.query.ObjectFilter; @@ -257,7 +256,7 @@ private Data executeSequence(ExpressionSequenceType sequence, Data input, Execut public Data evaluateConstantExpression(RawType constant, ExecutionContext context, OperationResult result) throws ScriptExecutionException { try { - Object value = prismContext.parserFor(constant.getXnode().toRootXNode()).parseAnyData(); + Object value = prismContext.parserFor(constant.getXnode().toRootXNode()).parseItemOrRealValue(); if (value instanceof Item) { return Data.create((Item) value); } else { diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/scripting/TestScriptingBasic.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/scripting/TestScriptingBasic.java index f8e43d89fa5..80a73e86bdb 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/scripting/TestScriptingBasic.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/scripting/TestScriptingBasic.java @@ -160,7 +160,7 @@ public void test120Log() throws Exception { } private PrismProperty parseAnyData(File file) throws IOException, SchemaException { - return (PrismProperty) prismContext.parserFor(file).parseAnyData(); + return (PrismProperty) prismContext.parserFor(file).parseItemOrRealValue(); } @Test diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/util/SingleItemSerializationSafeContainerImpl.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/util/SingleItemSerializationSafeContainerImpl.java index 3d4ee71f5fa..ff4baaf469d 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/util/SingleItemSerializationSafeContainerImpl.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/util/SingleItemSerializationSafeContainerImpl.java @@ -115,7 +115,7 @@ public T getValue() { if (encodingScheme == EncodingScheme.PRISM) { try { - actualValue = (T) prismContext.parserFor(valueForStorageWhenEncoded).xml().parseAnyData(); + actualValue = (T) prismContext.parserFor(valueForStorageWhenEncoded).xml().parseItemOrRealValue(); if (actualValue instanceof Item) { Item item = (Item) actualValue; if (item.isEmpty()) { From 7cb86d241b31449c2311b95c4e71dd950cd8a4bd Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Thu, 20 Oct 2016 01:14:35 +0200 Subject: [PATCH 44/74] Common tests passing. --- ...CompositeRefinedObjectClassDefinition.java | 18 +++++------------- .../LayerRefinedAttributeDefinitionImpl.java | 18 +++++++++--------- ...LayerRefinedObjectClassDefinitionImpl.java | 4 ++-- .../midpoint/prism/PrismContainerValue.java | 19 +++++++++---------- 4 files changed, 25 insertions(+), 34 deletions(-) diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/CompositeRefinedObjectClassDefinition.java b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/CompositeRefinedObjectClassDefinition.java index 0c11f89f88c..6f01ba794c4 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/CompositeRefinedObjectClassDefinition.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/CompositeRefinedObjectClassDefinition.java @@ -570,25 +570,17 @@ public boolean equals(Object obj) { if (this == obj) { return true; } - if (!super.equals(obj)) { - return false; - } +// if (!super.equals(obj)) { +// return false; +// } if (getClass() != obj.getClass()) { return false; } CompositeRefinedObjectClassDefinition other = (CompositeRefinedObjectClassDefinition) obj; - if (auxiliaryObjectClassDefinitions == null) { - if (other.auxiliaryObjectClassDefinitions != null) { - return false; - } - } else if (!auxiliaryObjectClassDefinitions.equals(other.auxiliaryObjectClassDefinitions)) { + if (!auxiliaryObjectClassDefinitions.equals(other.auxiliaryObjectClassDefinitions)) { return false; } - if (structuralObjectClassDefinition == null) { - if (other.structuralObjectClassDefinition != null) { - return false; - } - } else if (!structuralObjectClassDefinition.equals(other.structuralObjectClassDefinition)) { + if (!structuralObjectClassDefinition.equals(other.structuralObjectClassDefinition)) { return false; } return true; diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedAttributeDefinitionImpl.java b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedAttributeDefinitionImpl.java index 4f155591b14..efb56e02b74 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedAttributeDefinitionImpl.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedAttributeDefinitionImpl.java @@ -171,8 +171,8 @@ public int hashCode() { public boolean equals(Object obj) { if (this == obj) return true; - if (!super.equals(obj)) - return false; +// if (!super.equals(obj)) +// return false; if (getClass() != obj.getClass()) return false; LayerRefinedAttributeDefinitionImpl other = (LayerRefinedAttributeDefinitionImpl) obj; @@ -449,7 +449,7 @@ public String getNamespace() { @Override public int getMinOccurs() { - return refinedAttributeDefinition.getMinOccurs(); + return refinedAttributeDefinition.getMinOccurs(layer); } @Override @@ -459,7 +459,7 @@ public Collection> getAllowedValues() { @Override public int getMaxOccurs() { - return refinedAttributeDefinition.getMaxOccurs(); + return refinedAttributeDefinition.getMaxOccurs(layer); } @Override @@ -479,7 +479,7 @@ public boolean isTolerant() { @Override public boolean isSingleValue() { - return refinedAttributeDefinition.isSingleValue(); + return refinedAttributeDefinition.isSingleValue(layer); } @Override @@ -494,7 +494,7 @@ public boolean isSecondaryIdentifier() { @Override public boolean isMultiValue() { - return refinedAttributeDefinition.isMultiValue(); + return refinedAttributeDefinition.isMultiValue(layer); } @Override @@ -515,12 +515,12 @@ public boolean canAdd(LayerType layer) { @Override public boolean isMandatory() { - return refinedAttributeDefinition.isMandatory(); + return refinedAttributeDefinition.isMandatory(layer); } @Override public boolean isIgnored() { - return refinedAttributeDefinition.isIgnored(); + return refinedAttributeDefinition.isIgnored(layer); } @Override @@ -540,7 +540,7 @@ public boolean isAbstract() { @Override public boolean isOptional() { - return refinedAttributeDefinition.isOptional(); + return refinedAttributeDefinition.isOptional(layer); } @Override diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedObjectClassDefinitionImpl.java b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedObjectClassDefinitionImpl.java index fb5318ae2b8..5044c7f38de 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedObjectClassDefinitionImpl.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedObjectClassDefinitionImpl.java @@ -550,8 +550,8 @@ public int hashCode() { public boolean equals(Object obj) { if (this == obj) return true; - if (!super.equals(obj)) - return false; +// if (!super.equals(obj)) +// return false; if (getClass() != obj.getClass()) return false; LayerRefinedObjectClassDefinitionImpl other = (LayerRefinedObjectClassDefinitionImpl) obj; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerValue.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerValue.java index d5f4a966bed..de1bf521248 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerValue.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerValue.java @@ -1058,16 +1058,15 @@ public void applyDefinition(ItemDefinition definition, boolean force) throws Sch applyDefinition((PrismContainerDefinition)definition, force); } - public void applyDefinition(PrismContainerDefinition containerDef, boolean force) throws SchemaException { + public void applyDefinition(@NotNull PrismContainerDefinition containerDef, boolean force) throws SchemaException { checkMutability(); - ComplexTypeDefinition ctd = getComplexTypeDefinition(); - if (ctd == null) { - if (containerDef == null || containerDef.getComplexTypeDefinition() == null) { - return; - } - ctd = containerDef.getComplexTypeDefinition(); - } - if (ctd.isXsdAnyMarker()) { + // Although complexTypeDefinition is cached, its presence means that the parent had a definition before + // parent.applyDefinition() was called. So if !force, we can safely exit here. + if (complexTypeDefinition != null && !force) { + return; // there's a definition already + } + complexTypeDefinition = containerDef.getComplexTypeDefinition(); + if (complexTypeDefinition == null || complexTypeDefinition.isXsdAnyMarker()) { // No point in aplying this. Nothing will change and there may be phantom errors. return; } @@ -1077,7 +1076,7 @@ public void applyDefinition(PrismContainerDefinition containerDef, boolean fo // Item has a definition already, no need to apply it continue; } - ItemDefinition itemDefinition = determineItemDefinition(item.getElementName(), ctd); + ItemDefinition itemDefinition = determineItemDefinition(item.getElementName(), complexTypeDefinition); if (itemDefinition == null && item.getDefinition() != null && item.getDefinition().isDynamic()) { // We will not apply the null definition here. The item has a dynamic definition that we don't // want to destroy as it cannot be reconstructed later. From 077f6f7e514b9a3dab42ea1b650c75a76f11d63b Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Thu, 20 Oct 2016 18:37:42 +0200 Subject: [PATCH 45/74] Interim commit: refactored parsing tests + small fixes. --- .../admin/resources/ResourceContentPanel.java | 2 +- ...CompositeRefinedObjectClassDefinition.java | 5 - ...LayerRefinedObjectClassDefinitionImpl.java | 5 - .../midpoint/prism/ComplexTypeDefinition.java | 2 - .../prism/ComplexTypeDefinitionImpl.java | 1 - .../evolveum/midpoint/prism/PrismContext.java | 10 +- .../midpoint/prism/PrismContextImpl.java | 12 - .../prism/marshaller/PrismParserImpl.java | 6 +- .../ObjectClassComplexTypeDefinitionImpl.java | 2 +- .../midpoint/schema/TestConstants.java | 2 + .../schema/parser/AbstractParserTest.java | 90 ++++++++ .../{resource => }/TestParseResource.java | 205 +++++++++--------- .../schema/parser/TestParseShadow.java | 155 +++++++++++++ .../parser/{user => }/TestParseUser.java | 67 +----- .../resource/TestParseResourceJson.java | 33 --- .../resource/TestParseResourceJsonNoNs.java | 30 --- .../resource/TestParseResourceJsonNs.java | 30 --- .../parser/resource/TestParseResourceXml.java | 83 ------- .../resource/TestParseResourceXmlNoNs.java | 30 --- .../resource/TestParseResourceXmlNs.java | 30 --- .../resource/TestParseResourceYaml.java | 33 --- .../resource/TestParseResourceYamlNoNs.java | 30 --- .../resource/TestParseResourceYamlNs.java | 30 --- .../schema/parser/user/TestParseUserJson.java | 42 ---- .../parser/user/TestParseUserJsonNoNs.java | 42 ---- .../schema/parser/user/TestParseUserXml.java | 42 ---- .../parser/user/TestParseUserXmlNoNs.java | 42 ---- .../schema/parser/user/TestParseUserYaml.java | 42 ---- .../parser/user/TestParseUserYamlNoNs.java | 42 ---- .../common/xml/ns/shadow-hbarbossa.xml | 40 ++++ infra/schema/testng-unit.xml | 64 +++++- 31 files changed, 467 insertions(+), 782 deletions(-) create mode 100644 infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/AbstractParserTest.java rename infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/{resource => }/TestParseResource.java (88%) create mode 100644 infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/TestParseShadow.java rename infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/{user => }/TestParseUser.java (87%) delete mode 100644 infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceJson.java delete mode 100644 infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceJsonNoNs.java delete mode 100644 infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceJsonNs.java delete mode 100644 infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceXml.java delete mode 100644 infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceXmlNoNs.java delete mode 100644 infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceXmlNs.java delete mode 100644 infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceYaml.java delete mode 100644 infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceYamlNoNs.java delete mode 100644 infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceYamlNs.java delete mode 100644 infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/user/TestParseUserJson.java delete mode 100644 infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/user/TestParseUserJsonNoNs.java delete mode 100644 infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/user/TestParseUserXml.java delete mode 100644 infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/user/TestParseUserXmlNoNs.java delete mode 100644 infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/user/TestParseUserYaml.java delete mode 100644 infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/user/TestParseUserYamlNoNs.java create mode 100644 infra/schema/src/test/resources/common/xml/ns/shadow-hbarbossa.xml diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/ResourceContentPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/ResourceContentPanel.java index c2edbca331a..a0b68f1abbf 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/ResourceContentPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/ResourceContentPanel.java @@ -438,7 +438,7 @@ private void newTaskPerformed(String category, AjaxRequestTarget target) { private void runTask(List tasks, AjaxRequestTarget target) { ResourceTasksPanel tasksPanel = new ResourceTasksPanel(getPageBase().getMainPopupBodyId(), false, - new ListModel<>(tasks), getPageBase()); + new ListModel(tasks), getPageBase()); getPageBase().showMainPopup(tasksPanel, target); } diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/CompositeRefinedObjectClassDefinition.java b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/CompositeRefinedObjectClassDefinition.java index 6f01ba794c4..3a01e3177f3 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/CompositeRefinedObjectClassDefinition.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/CompositeRefinedObjectClassDefinition.java @@ -461,11 +461,6 @@ public void merge(ComplexTypeDefinition otherComplexTypeDef) { } - @Override - public ComplexTypeDefinition deepClone() { - return null; - } - @Override public RefinedAttributeDefinition findAttributeDefinition(QName elementQName) { return null; diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedObjectClassDefinitionImpl.java b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedObjectClassDefinitionImpl.java index 5044c7f38de..5a70d295144 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedObjectClassDefinitionImpl.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedObjectClassDefinitionImpl.java @@ -180,11 +180,6 @@ public LayerRefinedAttributeDefinition getDisplayNameAttribute() { return substituteLayerRefinedAttributeDefinition(refinedObjectClassDefinition.getDisplayNameAttribute()); } - @Override - public ComplexTypeDefinition deepClone() { - return refinedObjectClassDefinition.deepClone(); - } - @Override public String getHelp() { return refinedObjectClassDefinition.getHelp(); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/ComplexTypeDefinition.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/ComplexTypeDefinition.java index 31055ab2f76..a34207ddb81 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/ComplexTypeDefinition.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/ComplexTypeDefinition.java @@ -81,6 +81,4 @@ public interface ComplexTypeDefinition extends Definition, LocalDefinitionStore boolean isEmpty(); ComplexTypeDefinition clone(); - - ComplexTypeDefinition deepClone(); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/ComplexTypeDefinitionImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/ComplexTypeDefinitionImpl.java index d30481c9b4b..c092d2b471d 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/ComplexTypeDefinitionImpl.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/ComplexTypeDefinitionImpl.java @@ -285,7 +285,6 @@ public ComplexTypeDefinitionImpl clone() { return clone; } - @Override public ComplexTypeDefinition deepClone() { return deepClone(new HashMap()); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java index 158dfd5d01d..0a2f9125919 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java @@ -109,11 +109,13 @@ public interface PrismContext { @NotNull PrismParserNoIO parserFor(@NotNull Element element); - @Deprecated // user processorFor + parse instead - PrismObject parseObject(File file) throws SchemaException, IOException; + default PrismObject parseObject(File file) throws SchemaException, IOException { + return parserFor(file).parse(); + } - @Deprecated // user processorFor + parse instead - PrismObject parseObject(String dataString) throws SchemaException; + default PrismObject parseObject(String dataString) throws SchemaException { + return parserFor(dataString).parse(); + } //endregion //region Adopt methods diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContextImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContextImpl.java index db7dc3a8c17..4b77c64b583 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContextImpl.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContextImpl.java @@ -228,18 +228,6 @@ public PrismParserNoIO parserFor(@NotNull RootXNode xnode) { public PrismParserNoIO parserFor(@NotNull Element data) { return new PrismParserImplNoIO(new ParserElementSource(data), null, ParsingContext.createDefault(), this, null, null, null, null); } - - @Deprecated - @Override - public PrismObject parseObject(File file) throws SchemaException, IOException { - return parserFor(file).parse(); - } - - @Deprecated - @Override - public PrismObject parseObject(String dataString) throws SchemaException { - return parserFor(dataString).parse(); - } //endregion //region adopt(...) methods diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismParserImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismParserImpl.java index d0559eaf14c..3786a7a0c03 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismParserImpl.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismParserImpl.java @@ -226,11 +226,11 @@ RootXNode doParseToXNode() throws IOException, SchemaException { @NotNull List> doParseObjects() throws IOException, SchemaException { - List xnodes = getLexicalProcessor().readObjects(source, context); + List roots = getLexicalProcessor().readObjects(source, context); List> objects = new ArrayList<>(); - for (RootXNode xnode : xnodes) { + for (RootXNode root : roots) { PrismObject object = prismContext.getPrismUnmarshaller() - .parseObject(xnode, null, null, null, PrismObjectDefinition.class, context); + .parseObject(root, null, null, null, null, context); objects.add(object); } return objects; diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ObjectClassComplexTypeDefinitionImpl.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ObjectClassComplexTypeDefinitionImpl.java index e5207d167b2..ec4516aaf74 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ObjectClassComplexTypeDefinitionImpl.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ObjectClassComplexTypeDefinitionImpl.java @@ -49,7 +49,7 @@ public class ObjectClassComplexTypeDefinitionImpl extends ComplexTypeDefinitionI public ObjectClassComplexTypeDefinitionImpl(QName typeName, PrismContext prismContext) { super(typeName, prismContext); } - + @Override public Collection getAttributeDefinitions() { Collection attrs = new ArrayList(getDefinitions().size()); diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestConstants.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestConstants.java index 992bea3a1aa..d23b257ada9 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestConstants.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestConstants.java @@ -55,4 +55,6 @@ public class TestConstants { public static final String RESOURCE_NAMESPACE = "http://midpoint.evolveum.com/xml/ns/public/resource/instance/ef2bc95b-76e0-59e2-86d6-3d4f02d3ffff"; public static final File ROLE_FILE = new File(TestConstants.COMMON_DIR, "role.xml"); + + public static final String SHADOW_FILE_BASENAME = "shadow-hbarbossa"; } diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/AbstractParserTest.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/AbstractParserTest.java new file mode 100644 index 00000000000..70278cae6d5 --- /dev/null +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/AbstractParserTest.java @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.schema.parser; + +import com.evolveum.midpoint.prism.PrismContainer; +import com.evolveum.midpoint.prism.util.PrismAsserts; +import com.evolveum.midpoint.prism.util.PrismTestUtil; +import com.evolveum.midpoint.schema.MidPointPrismContextFactory; +import com.evolveum.midpoint.schema.SchemaConstantsGenerated; +import com.evolveum.midpoint.schema.constants.MidPointConstants; +import com.evolveum.midpoint.util.PrettyPrinter; +import com.evolveum.midpoint.util.exception.SchemaException; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.BeforeSuite; +import org.testng.annotations.Parameters; +import org.xml.sax.SAXException; + +import javax.xml.namespace.QName; +import java.io.File; +import java.io.IOException; + +import static com.evolveum.midpoint.schema.TestConstants.COMMON_DIR_PATH; + +/** + * @author mederly + */ +public class AbstractParserTest { + + protected String language; + protected boolean namespaces; + + @BeforeSuite + public void setup() throws SchemaException, SAXException, IOException { + PrettyPrinter.setDefaultNamespacePrefix(MidPointConstants.NS_MIDPOINT_PUBLIC_PREFIX); + PrismTestUtil.resetPrismContext(MidPointPrismContextFactory.FACTORY); + } + + @BeforeClass + @Parameters({ "language", "namespaces" }) + public void temp(String language, boolean namespaces) { + this.language = language; + this.namespaces = namespaces; + System.out.println("Testing with language = " + language + ", namespaces = " + namespaces); + } + + protected File getFile(String baseName) { + return new File(COMMON_DIR_PATH + "/" + language + "/" + (namespaces ? "ns":"no-ns"), + baseName + "." + language); + } + + protected void displayTestTitle(String testName) { + PrismTestUtil.displayTestTitle(testName + " (" + language + ", " + (namespaces ? "with" : "no") + " namespaces)"); + } + + protected void assertPropertyDefinition(PrismContainer container, String propName, QName xsdType, int minOccurs, + int maxOccurs) { + QName propQName = new QName(SchemaConstantsGenerated.NS_COMMON, propName); + PrismAsserts.assertPropertyDefinition(container, propQName, xsdType, minOccurs, maxOccurs); + } + + protected void assertPropertyValue(PrismContainer container, String propName, Object propValue) { + QName propQName = new QName(SchemaConstantsGenerated.NS_COMMON, propName); + PrismAsserts.assertPropertyValue(container, propQName, propValue); + } + + protected void assertPropertyValues(PrismContainer container, String propName, T... expectedValues) { + QName propQName = new QName(SchemaConstantsGenerated.NS_COMMON, propName); + PrismAsserts.assertPropertyValue(container, propQName, expectedValues); + } + + protected void assertContainerDefinition(PrismContainer container, String contName, QName xsdType, int minOccurs, + int maxOccurs) { + QName qName = new QName(SchemaConstantsGenerated.NS_COMMON, contName); + PrismAsserts.assertDefinition(container.getDefinition(), qName, xsdType, minOccurs, maxOccurs); + } +} diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResource.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/TestParseResource.java similarity index 88% rename from infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResource.java rename to infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/TestParseResource.java index 6caffe36c1f..21ad1bbd64b 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResource.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/TestParseResource.java @@ -13,10 +13,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.evolveum.midpoint.schema.parser.resource; +package com.evolveum.midpoint.schema.parser; import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.delta.ObjectDelta; +import com.evolveum.midpoint.prism.lex.dom.DomLexicalProcessor; import com.evolveum.midpoint.prism.marshaller.QueryConvertor; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.path.NameItemPathSegment; @@ -27,7 +28,7 @@ import com.evolveum.midpoint.prism.util.PrismAsserts; import com.evolveum.midpoint.prism.util.PrismTestUtil; import com.evolveum.midpoint.prism.xnode.MapXNode; -import com.evolveum.midpoint.schema.MidPointPrismContextFactory; +import com.evolveum.midpoint.prism.xnode.RootXNode; import com.evolveum.midpoint.schema.SchemaConstantsGenerated; import com.evolveum.midpoint.schema.TestConstants; import com.evolveum.midpoint.schema.constants.MidPointConstants; @@ -35,26 +36,23 @@ import com.evolveum.midpoint.schema.processor.ResourceSchemaImpl; import com.evolveum.midpoint.schema.util.ResourceTypeUtil; import com.evolveum.midpoint.util.DOMUtil; -import com.evolveum.midpoint.util.PrettyPrinter; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; import com.evolveum.prism.xml.ns._public.query_3.SearchFilterType; import com.evolveum.prism.xml.ns._public.types_3.*; import org.testng.AssertJUnit; -import org.testng.annotations.BeforeSuite; import org.testng.annotations.Test; +import org.w3c.dom.Document; import org.w3c.dom.Element; -import org.xml.sax.SAXException; import javax.xml.bind.JAXBElement; import javax.xml.bind.JAXBException; import javax.xml.namespace.QName; -import java.io.File; -import java.io.IOException; import java.util.List; -import static com.evolveum.midpoint.schema.TestConstants.*; +import static com.evolveum.midpoint.schema.TestConstants.RESOURCE_FILE_BASENAME; +import static com.evolveum.midpoint.schema.TestConstants.RESOURCE_FILE_SIMPLE_BASENAME; import static com.evolveum.midpoint.schema.util.SchemaTestConstants.ICFC_CONFIGURATION_PROPERTIES; import static org.testng.AssertJUnit.*; @@ -62,83 +60,61 @@ * @author semancik * */ -public abstract class TestParseResource { - - @BeforeSuite - public void setup() throws SchemaException, SAXException, IOException { - PrettyPrinter.setDefaultNamespacePrefix(MidPointConstants.NS_MIDPOINT_PUBLIC_PREFIX); - PrismTestUtil.resetPrismContext(MidPointPrismContextFactory.FACTORY); - } - - protected abstract String getSubdirName(); - - protected abstract String getLanguage(); - - protected abstract String getFilenameSuffix(); - - protected File getCommonSubdir() { - return new File(COMMON_DIR_PATH, getSubdirName()); - } - - protected abstract boolean hasNamespaces(); - - protected File getFile(String baseName) { - return new File(getCommonSubdir(), baseName+"."+getFilenameSuffix()); - } +public class TestParseResource extends AbstractParserTest { @Test public void testParseResourceFile() throws Exception { - System.out.println("===[ testParseResourceFile ]==="); + displayTestTitle("testParseResourceFile"); // GIVEN PrismContext prismContext = PrismTestUtil.getPrismContext(); - + // WHEN PrismObject resource = prismContext.parseObject(getFile(RESOURCE_FILE_BASENAME)); - + // THEN System.out.println("Parsed resource:"); System.out.println(resource.debugDump()); - + assertResource(resource, true, true, false); } - + @Test public void testParseResourceFileSimple() throws Exception { - System.out.println("===[ testParseResourceFileSimple ]==="); + displayTestTitle("testParseResourceFileSimple"); // GIVEN PrismContext prismContext = PrismTestUtil.getPrismContext(); - + // WHEN PrismObject resource = prismContext.parseObject(getFile(RESOURCE_FILE_SIMPLE_BASENAME)); - + // THEN System.out.println("Parsed resource:"); System.out.println(resource.debugDump()); - + assertResource(resource, true, true, true); } @Test public void testParseResourceRoundtrip() throws Exception { - System.out.println("===[ testParseResourceRoundtrip ]==="); + displayTestTitle("testParseResourceRoundtrip"); // GIVEN PrismContext prismContext = PrismTestUtil.getPrismContext(); - + PrismObject resource = prismContext.parseObject(getFile(RESOURCE_FILE_BASENAME)); - + System.out.println("Parsed resource:"); System.out.println(resource.debugDump()); - + assertResource(resource, true, false, false); - + // SERIALIZE - - String serializedResource = prismContext.serializeObjectToString(resource, getLanguage()); - + + String serializedResource = prismContext.serializerFor(language).serialize(resource); + System.out.println("serialized resource:"); System.out.println(serializedResource); @@ -146,29 +122,29 @@ public void testParseResourceRoundtrip() throws Exception { assertFalse(" element is present in the serialized form!", serializedResource.contains("")); // RE-PARSE - + PrismObject reparsedResource = prismContext.parseObject(serializedResource); - + System.out.println("Re-parsed resource:"); System.out.println(reparsedResource.debugDump()); - + // Cannot assert here. It will cause parsing of some of the raw values and diff will fail assertResource(reparsedResource, true, false, false); - + PrismProperty definitionProperty = reparsedResource.findContainer(ResourceType.F_SCHEMA).findProperty(XmlSchemaType.F_DEFINITION); SchemaDefinitionType definitionElement = definitionProperty.getValue().getValue(); System.out.println("Re-parsed definition element:"); System.out.println(DOMUtil.serializeDOMToString(definitionElement.getSchema())); - + ObjectDelta objectDelta = resource.diff(reparsedResource); System.out.println("Delta:"); System.out.println(objectDelta.debugDump()); assertTrue("Delta is not empty", objectDelta.isEmpty()); - + PrismAsserts.assertEquivalent("Resource re-parsed equivalence", resource, reparsedResource); // // Compare schema container -// +// // PrismContainer originalSchemaContainer = resource.findContainer(ResourceType.F_SCHEMA); // PrismContainer reparsedSchemaContainer = reparsedResource.findContainer(ResourceType.F_SCHEMA); } @@ -179,48 +155,48 @@ public void testParseResourceRoundtrip() throws Exception { */ @Test public void testSchemaRoundtrip() throws Exception { - System.out.println("===[ testSchemaRoundtrip ]==="); + displayTestTitle("testSchemaRoundtrip"); // GIVEN PrismContext prismContext = PrismTestUtil.getPrismContext(); - + PrismObject resource = prismContext.parseObject(getFile(RESOURCE_FILE_BASENAME)); - + assertResource(resource, true, false, false); - + PrismContainer schemaContainer = resource.findContainer(ResourceType.F_SCHEMA); - + System.out.println("Parsed schema:"); System.out.println(schemaContainer.debugDump()); // SERIALIZE - - String serializesSchema = prismContext.serializerFor(getLanguage()).serialize(schemaContainer.getValue(), new QName("fakeNs", "fake")); - + + String serializesSchema = prismContext.serializerFor(language).serialize(schemaContainer.getValue(), new QName("fakeNs", "fake")); + System.out.println("serialized schema:"); System.out.println(serializesSchema); - + // RE-PARSE - PrismContainer reparsedSchemaContainer = (PrismContainer) prismContext.parserFor(serializesSchema).language(getLanguage()).definition(schemaContainer.getDefinition()).parseItem(); - + PrismContainer reparsedSchemaContainer = (PrismContainer) prismContext.parserFor(serializesSchema).language(language).definition(schemaContainer.getDefinition()).parseItem(); + System.out.println("Re-parsed schema container:"); System.out.println(reparsedSchemaContainer.debugDump()); - + // String reserializesSchema = prismContext.serializeContainerValueToString(reparsedSchemaContainer.getValue(), new QName("fakeNs", "fake"), PrismContext.LANG_XML); -// +// // System.out.println("re-serialized schema:"); // System.out.println(reserializesSchema); - + // Document reparsedDocument = DOMUtil.parseDocument(serializesSchema); // Element reparsedSchemaElement = DOMUtil.getFirstChildElement(DOMUtil.getFirstChildElement(reparsedDocument)); // Element reparsedXsdSchemaElement = DOMUtil.getChildElement(DOMUtil.getFirstChildElement(reparsedSchemaElement), DOMUtil.XSD_SCHEMA_ELEMENT); - + XmlSchemaType defType = (XmlSchemaType) reparsedSchemaContainer.getValue().asContainerable(); Element reparsedXsdSchemaElement = defType.getDefinition().getSchema(); ResourceSchema reparsedSchema = ResourceSchemaImpl.parse(reparsedXsdSchemaElement, "reparsed schema", prismContext); - + } - + protected void assertResource(PrismObject resource, boolean checkConsistence, boolean checkJaxb, boolean isSimple) throws SchemaException, JAXBException { if (checkConsistence) { @@ -228,7 +204,7 @@ protected void assertResource(PrismObject resource, boolean checkC } assertResourcePrism(resource, isSimple); assertResourceJaxb(resource.asObjectable(), isSimple); - + if (checkJaxb) { // serializeDom(resource); //serializeJaxb(resource); @@ -250,13 +226,13 @@ private void assertResourcePrism(PrismObject resource, boolean isS assertNotNull("asObjectable resulted in null", resourceType); assertPropertyValue(resource, "name", PrismTestUtil.createPolyString("Embedded Test OpenDJ")); - assertPropertyDefinition(resource, "name", PolyStringType.COMPLEX_TYPE, 0, 1); - + assertPropertyDefinition(resource, "name", PolyStringType.COMPLEX_TYPE, 0, 1); + if (!isSimple) { assertPropertyValue(resource, "namespace", TestConstants.RESOURCE_NAMESPACE); assertPropertyDefinition(resource, "namespace", DOMUtil.XSD_ANYURI, 0, 1); } - + PrismReference connectorRef = resource.findReference(ResourceType.F_CONNECTOR_REF); assertNotNull("No connectorRef", connectorRef); PrismReferenceValue connectorRefVal = connectorRef.getValue(); @@ -270,7 +246,7 @@ private void assertResourcePrism(PrismObject resource, boolean isS EqualFilter equalFilter = (EqualFilter) objectFilter; ItemPath path = equalFilter.getPath(); // should be extension/x:extConnType PrismAsserts.assertPathEqualsExceptForPrefixes("Wrong filter path", - hasNamespaces() ? + namespaces ? new ItemPath(new QName("extension"), new QName("http://x/", "extConnType")) : new ItemPath(new QName("extension"), new QName("extConnType")), path); @@ -289,7 +265,7 @@ private void assertResourcePrism(PrismObject resource, boolean isS PrismContainerValue configContainerValue = configurationContainer.getValue(); List> configItems = configContainerValue.getItems(); assertEquals("Wrong number of config items", isSimple ? 1 : 4, configItems.size()); - + PrismContainer ldapConfigPropertiesContainer = configurationContainer.findContainer(ICFC_CONFIGURATION_PROPERTIES); assertNotNull("No icfcldap:configurationProperties container", ldapConfigPropertiesContainer); PrismContainerDefinition ldapConfigPropertiesContainerDef = ldapConfigPropertiesContainer.getDefinition(); @@ -297,14 +273,14 @@ private void assertResourcePrism(PrismObject resource, boolean isS assertEquals("icfcldap:configurationProperties container definition maxOccurs", 1, ldapConfigPropertiesContainerDef.getMaxOccurs()); List> ldapConfigPropItems = ldapConfigPropertiesContainer.getValue().getItems(); assertEquals("Wrong number of ldapConfigPropItems items", 7, ldapConfigPropItems.size()); - + PrismContainer schemaContainer = resource.findContainer(ResourceType.F_SCHEMA); if (isSimple) { assertNull("Schema sneaked in", schemaContainer); } else { assertNotNull("No schema container", schemaContainer); } - + PrismContainer schemaHandlingContainer = resource.findContainer(ResourceType.F_SCHEMA_HANDLING); if (isSimple) { assertNull("SchemaHandling sneaked in", schemaHandlingContainer); @@ -335,7 +311,7 @@ private void assertResourcePrism(PrismObject resource, boolean isS ItemPathType itemPathType = (ItemPathType) expressionType.getExpressionEvaluator().get(0).getValue(); // $account/c:attributes/my:yyy PrismAsserts.assertPathEqualsExceptForPrefixes("path in correlation expression", - hasNamespaces() ? + namespaces ? new ItemPath( new NameItemPathSegment(new QName("account"), true), new NameItemPathSegment(new QName(SchemaConstantsGenerated.NS_COMMON, "attributes")), @@ -360,7 +336,7 @@ private void assertResourceJaxb(ResourceType resourceType, boolean isSimple) thr expectedNamespace = MidPointConstants.NS_RI; } assertEquals("Wrong namespace (JAXB)", expectedNamespace, ResourceTypeUtil.getResourceNamespace(resourceType)); - + ObjectReferenceType connectorRef = resourceType.getConnectorRef(); assertNotNull("No connectorRef (JAXB)", connectorRef); assertEquals("Wrong type in connectorRef (JAXB)", ConnectorType.COMPLEX_TYPE, connectorRef.getType()); @@ -374,7 +350,7 @@ private void assertResourceJaxb(ResourceType resourceType, boolean isSimple) thr } else { assertEquals("Wrong resolution time in connectorRef (JAXB)", EvaluationTimeType.IMPORT, resolutionTime); } - + XmlSchemaType xmlSchemaType = resourceType.getSchema(); SchemaHandlingType schemaHandling = resourceType.getSchemaHandling(); if (isSimple) { @@ -387,7 +363,7 @@ private void assertResourceJaxb(ResourceType resourceType, boolean isSimple) thr List anyElements = definition.getAny(); assertNotNull("Null element list in definition element in schema (JAXB)", anyElements); assertFalse("Empty element list in definition element in schema (JAXB)", anyElements.isEmpty()); - + assertNotNull("No schema handling (JAXB)", schemaHandling); for(ResourceObjectTypeDefinitionType accountType: schemaHandling.getObjectType()) { String name = accountType.getIntent(); @@ -414,7 +390,7 @@ private void assertResourceJaxb(ResourceType resourceType, boolean isSimple) thr ItemPath expected = new ItemPath( new NameItemPathSegment(new QName("user"), true), new NameItemPathSegment(new QName("extension")), - hasNamespaces() ? + namespaces ? new NameItemPathSegment(new QName("http://z/", "dept")) : new NameItemPathSegment(new QName("dept")) ); @@ -436,7 +412,7 @@ private void assertResourceJaxb(ResourceType resourceType, boolean isSimple) thr assertEquals("Wrong value toString value", "my.value", unknownJavaObjectType.getToString()); } } - + // Try to serialize it to DOM using just DOM processor. See if it does not fail. private void serializeDom(PrismObject resource) throws SchemaException { // DomParser domProcessor = PrismTestUtil.getPrismContext().getParserDom(); @@ -446,21 +422,50 @@ private void serializeDom(PrismObject resource) throws SchemaExcep // assertNotNull("Null resulting DOM element after DOM serialization", domElement); } - private void assertPropertyDefinition(PrismContainer container, String propName, QName xsdType, int minOccurs, - int maxOccurs) { - QName propQName = new QName(SchemaConstantsGenerated.NS_COMMON, propName); - PrismAsserts.assertPropertyDefinition(container, propQName, xsdType, minOccurs, maxOccurs); - } - - public static void assertPropertyValue(PrismContainer container, String propName, Object propValue) { - QName propQName = new QName(SchemaConstantsGenerated.NS_COMMON, propName); - PrismAsserts.assertPropertyValue(container, propQName, propValue); + @Test + public void testParseResourceDom() throws Exception { + if (!"xml".equals(language)) { + return; + } + final String TEST_NAME = "testParseResourceDom"; + displayTestTitle(TEST_NAME); + + // GIVEN + PrismContext prismContext = PrismTestUtil.getPrismContext(); + + // WHEN + DomLexicalProcessor parserDom = ((PrismContextImpl) prismContext).getParserDom(); + RootXNode xnode = parserDom.read(new ParserFileSource(getFile(TestConstants.RESOURCE_FILE_BASENAME)), ParsingContext.createDefault()); + PrismObject resource = prismContext.parserFor(xnode).parse(); + + // THEN + System.out.println("Parsed resource:"); + System.out.println(resource.debugDump()); + + assertResource(resource, true, true, false); } - - private void assertContainerDefinition(PrismContainer container, String contName, QName xsdType, int minOccurs, - int maxOccurs) { - QName qName = new QName(SchemaConstantsGenerated.NS_COMMON, contName); - PrismAsserts.assertDefinition(container.getDefinition(), qName, xsdType, minOccurs, maxOccurs); + + @Test + public void testParseResourceDomSimple() throws Exception { + if (!"xml".equals(language)) { + return; + } + displayTestTitle("testParseResourceDomSimple"); + + // GIVEN + PrismContext prismContext = PrismTestUtil.getPrismContext(); + + Document document = DOMUtil.parseFile(getFile(TestConstants.RESOURCE_FILE_SIMPLE_BASENAME)); + Element resourceElement = DOMUtil.getFirstChildElement(document); + + // WHEN + PrismObject resource = prismContext.parserFor(resourceElement).parse(); + + // THEN + System.out.println("Parsed resource:"); + System.out.println(resource.debugDump()); + + assertResource(resource, true, true, true); } } diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/TestParseShadow.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/TestParseShadow.java new file mode 100644 index 00000000000..ea173b727a4 --- /dev/null +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/TestParseShadow.java @@ -0,0 +1,155 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.schema.parser; + +import com.evolveum.midpoint.prism.*; +import com.evolveum.midpoint.prism.delta.ObjectDelta; +import com.evolveum.midpoint.prism.path.ItemPath; +import com.evolveum.midpoint.prism.util.PrismAsserts; +import com.evolveum.midpoint.prism.util.PrismTestUtil; +import com.evolveum.midpoint.schema.SchemaConstantsGenerated; +import com.evolveum.midpoint.schema.constants.SchemaConstants; +import com.evolveum.midpoint.util.exception.SchemaException; +import com.evolveum.midpoint.xml.ns._public.common.common_3.*; +import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; +import org.testng.annotations.Test; + +import javax.xml.namespace.QName; + +import static com.evolveum.midpoint.schema.TestConstants.SHADOW_FILE_BASENAME; +import static org.testng.AssertJUnit.*; + +/** + * @author semancik + * + */ +public class TestParseShadow extends AbstractParserTest { + + @Test + public void testParseShadowFile() throws Exception { + displayTestTitle("testParseShadowFile"); + + // GIVEN + PrismContext prismContext = PrismTestUtil.getPrismContext(); + + // WHEN + PrismObject object = prismContext.parseObject(getFile(SHADOW_FILE_BASENAME)); + // THEN + System.out.println("Parsed object:"); + System.out.println(object.debugDump()); + + String serialized = prismContext.serializerFor(language).serialize(object); + System.out.println("Serialized: \n" +serialized); + + PrismObject reparsed = prismContext.parseObject(serialized); + + assertObject(object); + } + + @Test + public void testParseShadowRoundTrip() throws Exception{ + displayTestTitle("testParseShadowRoundTrip"); + + // GIVEN + PrismContext prismContext = PrismTestUtil.getPrismContext(); + + // WHEN + PrismObject object = prismContext.parseObject(getFile(SHADOW_FILE_BASENAME)); + + // THEN + System.out.println("Parsed object:"); + System.out.println(object.debugDump()); + + assertObject(object); + + String serialized = prismContext.serializerFor(language).serialize(object); + System.out.println("Serialized:"); + System.out.println(serialized); + + // REPARSE + PrismObject reparsed = prismContext.parseObject(serialized); + + // THEN + System.out.println("Reparsed:"); + System.out.println(reparsed.debugDump()); + + assertObject(reparsed); + + // and some sanity checks + + assertTrue("Object not equals", object.equals(reparsed)); + + ObjectDelta delta = object.diff(reparsed); + assertTrue("Delta not empty", delta.isEmpty()); + + } + + + void assertObject(PrismObject object) throws SchemaException { + object.checkConsistence(); + assertPrism(object); + assertJaxb(object.asObjectable()); + + object.checkConsistence(true, false); + } + + void assertPrism(PrismObject shadow) { + + assertEquals("Wrong oid", "88519fca-3f4a-44ca-91c8-dc9be5bf3d03", shadow.getOid()); + PrismObjectDefinition usedDefinition = shadow.getDefinition(); + assertNotNull("No object definition", usedDefinition); + PrismAsserts.assertObjectDefinition(usedDefinition, new QName(SchemaConstantsGenerated.NS_COMMON, "shadow"), + ShadowType.COMPLEX_TYPE, ShadowType.class); + assertEquals("Wrong class in object", ShadowType.class, shadow.getCompileTimeClass()); + ShadowType objectType = shadow.asObjectable(); + assertNotNull("asObjectable resulted in null", objectType); + + assertPropertyValue(shadow, "name", PrismTestUtil.createPolyString("hbarbossa")); + assertPropertyDefinition(shadow, "name", PolyStringType.COMPLEX_TYPE, 0, 1); + +// assertPropertyDefinition(shadow, "organizationalUnit", PolyStringType.COMPLEX_TYPE, 0, -1); +// assertPropertyValues(shadow, "organizationalUnit", +// new PolyString("Brethren of the Coast", "brethren of the coast"), +// new PolyString("Davie Jones' Locker", "davie jones locker")); + + + ItemPath admStatusPath = new ItemPath(UserType.F_ACTIVATION, ActivationType.F_ADMINISTRATIVE_STATUS); + PrismProperty admStatusProperty1 = shadow.findProperty(admStatusPath); + PrismAsserts.assertDefinition(admStatusProperty1.getDefinition(), ActivationType.F_ADMINISTRATIVE_STATUS, SchemaConstants.C_ACTIVATION_STATUS_TYPE, 0, 1); + assertNotNull("Property "+admStatusPath+" not found", admStatusProperty1); + PrismAsserts.assertPropertyValue(admStatusProperty1, ActivationStatusType.ENABLED); + + PrismReference resourceRef = shadow.findReference(ShadowType.F_RESOURCE_REF); + assertEquals("Wrong number of resourceRef values", 1, resourceRef.getValues().size()); + PrismAsserts.assertReferenceValue(resourceRef, "10000000-0000-0000-0000-000000000003"); + } + + private void assertJaxb(ShadowType shadow) throws SchemaException { + assertEquals("88519fca-3f4a-44ca-91c8-dc9be5bf3d03", shadow.getOid()); + assertEquals("Wrong name", PrismTestUtil.createPolyStringType("hbarbossa"), shadow.getName()); + + ActivationType activation = shadow.getActivation(); + assertNotNull("No activation", activation); + assertEquals("User not enabled", ActivationStatusType.ENABLED, activation.getAdministrativeStatus()); + + ObjectReferenceType resourceRef = shadow.getResourceRef(); + assertNotNull("No resourceRef", resourceRef); + + assertEquals("Wrong resourceRef oid (jaxb)", "10000000-0000-0000-0000-000000000003", resourceRef.getOid()); + assertEquals("Wrong resourceRef type (jaxb)", ResourceType.COMPLEX_TYPE, resourceRef.getType()); + } + +} diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/user/TestParseUser.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/TestParseUser.java similarity index 87% rename from infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/user/TestParseUser.java rename to infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/TestParseUser.java index 4044c7556e8..4723a2a0b2a 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/user/TestParseUser.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/TestParseUser.java @@ -13,25 +13,22 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.evolveum.midpoint.schema.parser.user; +package com.evolveum.midpoint.schema.parser; import static com.evolveum.midpoint.schema.TestConstants.*; import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertNotNull; import static org.testng.AssertJUnit.assertTrue; -import java.io.File; -import java.io.IOException; import java.util.List; import javax.xml.namespace.QName; -import com.evolveum.midpoint.schema.MidPointPrismContextFactory; import com.evolveum.midpoint.schema.SchemaConstantsGenerated; -import org.testng.annotations.BeforeSuite; +import com.evolveum.midpoint.schema.parser.AbstractParserTest; +import org.testng.annotations.Parameters; import org.testng.annotations.Test; import org.w3c.dom.Element; -import org.xml.sax.SAXException; import com.evolveum.midpoint.prism.Containerable; import com.evolveum.midpoint.prism.Item; @@ -50,11 +47,9 @@ import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.prism.util.PrismAsserts; import com.evolveum.midpoint.prism.util.PrismTestUtil; -import com.evolveum.midpoint.schema.constants.MidPointConstants; import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.util.ObjectTypeUtil; import com.evolveum.midpoint.util.DOMUtil; -import com.evolveum.midpoint.util.PrettyPrinter; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.xml.ns._public.common.common_3.ActivationStatusType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ActivationType; @@ -70,32 +65,12 @@ * @author semancik * */ -public abstract class TestParseUser { - - @BeforeSuite - public void setup() throws SchemaException, SAXException, IOException { - PrettyPrinter.setDefaultNamespacePrefix(MidPointConstants.NS_MIDPOINT_PUBLIC_PREFIX); - PrismTestUtil.resetPrismContext(MidPointPrismContextFactory.FACTORY); - } - - protected abstract String getSubdirName(); - - protected abstract String getLanguage(); - - protected abstract String getFilenameSuffix(); - - protected File getCommonSubdir() { - return new File(COMMON_DIR_PATH, getSubdirName()); - } - - protected File getFile(String baseName) { - return new File(getCommonSubdir(), baseName+"."+getFilenameSuffix()); - } - +public class TestParseUser extends AbstractParserTest { + @Test public void testParseUserFile() throws Exception { final String TEST_NAME = "testParseUserFile"; - PrismTestUtil.displayTestTitle(TEST_NAME); + displayTestTitle(TEST_NAME); // GIVEN PrismContext prismContext = PrismTestUtil.getPrismContext(); @@ -106,7 +81,7 @@ public void testParseUserFile() throws Exception { System.out.println("Parsed user:"); System.out.println(user.debugDump()); - String serialized = prismContext.serializeObjectToString(user, getLanguage()); + String serialized = prismContext.serializerFor(language).serialize(user); System.out.println("Serialized: \n" +serialized); PrismObject reparsedUser = prismContext.parseObject(serialized); @@ -117,7 +92,7 @@ public void testParseUserFile() throws Exception { @Test public void testParseUserDom() throws Exception { final String TEST_NAME = "testParseUserDom"; - PrismTestUtil.displayTestTitle(TEST_NAME); + displayTestTitle(TEST_NAME); // GIVEN PrismContext prismContext = PrismTestUtil.getPrismContext(); @@ -134,11 +109,11 @@ public void testParseUserDom() throws Exception { assertUser(user); } - + @Test public void testParseUserRoundTrip() throws Exception{ final String TEST_NAME = "testParseUserRoundTrip"; - PrismTestUtil.displayTestTitle(TEST_NAME); + displayTestTitle(TEST_NAME); // GIVEN PrismContext prismContext = PrismTestUtil.getPrismContext(); @@ -156,7 +131,7 @@ public void testParseUserRoundTrip() throws Exception{ assertUser(user); - String serializedUser = prismContext.serializeObjectToString(user, getLanguage()); + String serializedUser = prismContext.serializeObjectToString(user, language); System.out.println("Serialized user:"); System.out.println(serializedUser); @@ -270,14 +245,12 @@ private void assertFilterElement(String message, Element filterElement) { assertNotNull("No "+message+" filter", filterElement); System.out.println("Filter element "+message); System.out.println(DOMUtil.serializeDOMToString(filterElement)); - if (hasNamespaces()) { + if (namespaces) { assertEquals("Wrong " + message + " filter namespace", PrismConstants.NS_QUERY, filterElement.getNamespaceURI()); } assertEquals("Wrong "+message+" filter localName", "equal", filterElement.getLocalName()); } - protected abstract boolean hasNamespaces(); - private void assertFilter(String message, SearchFilterType filter) { assertNotNull("No "+message+" filter", filter); } @@ -315,22 +288,6 @@ private void assertUserJaxb(UserType userType) throws SchemaException { assertFilterElement("ref filter (jaxb)", ref3Filter.getFilterClauseAsElement()); } - private void assertPropertyDefinition(PrismContainer container, String propName, QName xsdType, int minOccurs, - int maxOccurs) { - QName propQName = new QName(SchemaConstantsGenerated.NS_COMMON, propName); - PrismAsserts.assertPropertyDefinition(container, propQName, xsdType, minOccurs, maxOccurs); - } - - public static void assertPropertyValue(PrismContainer container, String propName, Object propValue) { - QName propQName = new QName(SchemaConstantsGenerated.NS_COMMON, propName); - PrismAsserts.assertPropertyValue(container, propQName, propValue); - } - - public static void assertPropertyValues(PrismContainer container, String propName, T... expectedValues) { - QName propQName = new QName(SchemaConstantsGenerated.NS_COMMON, propName); - PrismAsserts.assertPropertyValue(container, propQName, expectedValues); - } - @Test public void testPrismConsistency() throws Exception { diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceJson.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceJson.java deleted file mode 100644 index 061443b93f0..00000000000 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceJson.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (c) 2010-2016 Evolveum - * - * 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 com.evolveum.midpoint.schema.parser.resource; - -import com.evolveum.midpoint.prism.PrismContext; - -public abstract class TestParseResourceJson extends TestParseResource { - - @Override - protected String getLanguage() { - return PrismContext.LANG_JSON; - } - - @Override - protected String getFilenameSuffix() { - return "json"; - } - -} diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceJsonNoNs.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceJsonNoNs.java deleted file mode 100644 index 7574638fd44..00000000000 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceJsonNoNs.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (c) 2010-2016 Evolveum - * - * 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 com.evolveum.midpoint.schema.parser.resource; - -public class TestParseResourceJsonNoNs extends TestParseResourceJson { - - @Override - protected String getSubdirName() { - return "json/no-ns"; - } - - @Override - protected boolean hasNamespaces() { - return false; - } -} diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceJsonNs.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceJsonNs.java deleted file mode 100644 index ae7fbbf88f0..00000000000 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceJsonNs.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (c) 2010-2016 Evolveum - * - * 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 com.evolveum.midpoint.schema.parser.resource; - -public class TestParseResourceJsonNs extends TestParseResourceJson { - - @Override - protected String getSubdirName() { - return "json/ns"; - } - - @Override - protected boolean hasNamespaces() { - return true; - } -} diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceXml.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceXml.java deleted file mode 100644 index 561d8a0b2f0..00000000000 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceXml.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright (c) 2010-2016 Evolveum - * - * 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 com.evolveum.midpoint.schema.parser.resource; - -import com.evolveum.midpoint.prism.*; -import com.evolveum.midpoint.prism.lex.dom.DomLexicalProcessor; -import com.evolveum.midpoint.prism.util.PrismTestUtil; -import com.evolveum.midpoint.prism.xnode.RootXNode; -import com.evolveum.midpoint.prism.xnode.XNode; -import com.evolveum.midpoint.schema.TestConstants; -import com.evolveum.midpoint.util.DOMUtil; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType; -import org.testng.annotations.Test; -import org.w3c.dom.Document; -import org.w3c.dom.Element; - -public abstract class TestParseResourceXml extends TestParseResource { - - @Override - protected String getLanguage() { - return PrismContext.LANG_XML; - } - - @Override - protected String getFilenameSuffix() { - return "xml"; - } - - @Test - public void testParseResourceDom() throws Exception { - final String TEST_NAME = "testParseResourceDom"; - PrismTestUtil.displayTestTitle(TEST_NAME); - - // GIVEN - PrismContext prismContext = PrismTestUtil.getPrismContext(); - - // WHEN - DomLexicalProcessor parserDom = ((PrismContextImpl) prismContext).getParserDom(); - RootXNode xnode = parserDom.read(new ParserFileSource(getFile(TestConstants.RESOURCE_FILE_BASENAME)), ParsingContext.createDefault()); - PrismObject resource = prismContext.parserFor(xnode).parse(); - - // THEN - System.out.println("Parsed resource:"); - System.out.println(resource.debugDump()); - - assertResource(resource, true, true, false); - } - - @Test - public void testParseResourceDomSimple() throws Exception { - System.out.println("===[ testParseResourceDomSimple ]==="); - - // GIVEN - PrismContext prismContext = PrismTestUtil.getPrismContext(); - - Document document = DOMUtil.parseFile(getFile(TestConstants.RESOURCE_FILE_SIMPLE_BASENAME)); - Element resourceElement = DOMUtil.getFirstChildElement(document); - - // WHEN - PrismObject resource = prismContext.parserFor(resourceElement).parse(); - - // THEN - System.out.println("Parsed resource:"); - System.out.println(resource.debugDump()); - - assertResource(resource, true, true, true); - } - -} diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceXmlNoNs.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceXmlNoNs.java deleted file mode 100644 index 69584d07546..00000000000 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceXmlNoNs.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (c) 2010-2016 Evolveum - * - * 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 com.evolveum.midpoint.schema.parser.resource; - -public class TestParseResourceXmlNoNs extends TestParseResourceXml { - - @Override - protected String getSubdirName() { - return "xml/no-ns"; - } - - @Override - protected boolean hasNamespaces() { - return false; - } -} diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceXmlNs.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceXmlNs.java deleted file mode 100644 index 19b623670e6..00000000000 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceXmlNs.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (c) 2010-2016 Evolveum - * - * 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 com.evolveum.midpoint.schema.parser.resource; - -public class TestParseResourceXmlNs extends TestParseResourceXml { - - @Override - protected String getSubdirName() { - return "xml/ns"; - } - - @Override - protected boolean hasNamespaces() { - return true; - } -} diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceYaml.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceYaml.java deleted file mode 100644 index 7ef01fd90b2..00000000000 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceYaml.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (c) 2010-2016 Evolveum - * - * 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 com.evolveum.midpoint.schema.parser.resource; - -import com.evolveum.midpoint.prism.PrismContext; - -public abstract class TestParseResourceYaml extends TestParseResource { - - @Override - protected String getLanguage() { - return PrismContext.LANG_YAML; - } - - @Override - protected String getFilenameSuffix() { - return "yaml"; - } - -} diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceYamlNoNs.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceYamlNoNs.java deleted file mode 100644 index 211c52e0fcb..00000000000 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceYamlNoNs.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (c) 2010-2016 Evolveum - * - * 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 com.evolveum.midpoint.schema.parser.resource; - -public class TestParseResourceYamlNoNs extends TestParseResourceYaml { - - @Override - protected String getSubdirName() { - return "yaml/no-ns"; - } - - @Override - protected boolean hasNamespaces() { - return false; - } -} diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceYamlNs.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceYamlNs.java deleted file mode 100644 index 8ca303e125e..00000000000 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/resource/TestParseResourceYamlNs.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (c) 2010-2016 Evolveum - * - * 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 com.evolveum.midpoint.schema.parser.resource; - -public class TestParseResourceYamlNs extends TestParseResourceYaml { - - @Override - protected String getSubdirName() { - return "yaml/ns"; - } - - @Override - protected boolean hasNamespaces() { - return true; - } -} diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/user/TestParseUserJson.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/user/TestParseUserJson.java deleted file mode 100644 index 36bc776c70b..00000000000 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/user/TestParseUserJson.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (c) 2010-2016 Evolveum - * - * 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 com.evolveum.midpoint.schema.parser.user; - -import com.evolveum.midpoint.prism.PrismContext; - -public class TestParseUserJson extends TestParseUser { - - @Override - protected String getSubdirName() { - return "json/ns"; - } - - @Override - protected String getLanguage() { - return PrismContext.LANG_JSON; - } - - @Override - protected String getFilenameSuffix() { - return "json"; - } - - @Override - protected boolean hasNamespaces() { - return true; - } -} diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/user/TestParseUserJsonNoNs.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/user/TestParseUserJsonNoNs.java deleted file mode 100644 index 98d05cdc1b0..00000000000 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/user/TestParseUserJsonNoNs.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (c) 2010-2016 Evolveum - * - * 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 com.evolveum.midpoint.schema.parser.user; - -import com.evolveum.midpoint.prism.PrismContext; - -public class TestParseUserJsonNoNs extends TestParseUser { - - @Override - protected String getSubdirName() { - return "json/no-ns"; - } - - @Override - protected String getLanguage() { - return PrismContext.LANG_JSON; - } - - @Override - protected String getFilenameSuffix() { - return "json"; - } - - @Override - protected boolean hasNamespaces() { - return false; - } -} diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/user/TestParseUserXml.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/user/TestParseUserXml.java deleted file mode 100644 index 80e36b265bb..00000000000 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/user/TestParseUserXml.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (c) 2010-2016 Evolveum - * - * 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 com.evolveum.midpoint.schema.parser.user; - -import com.evolveum.midpoint.prism.PrismContext; - -public class TestParseUserXml extends TestParseUser { - - @Override - protected String getSubdirName() { - return "xml/ns"; - } - - @Override - protected String getLanguage() { - return PrismContext.LANG_XML; - } - - @Override - protected String getFilenameSuffix() { - return "xml"; - } - - @Override - protected boolean hasNamespaces() { - return true; - } -} diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/user/TestParseUserXmlNoNs.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/user/TestParseUserXmlNoNs.java deleted file mode 100644 index 6f1039c8689..00000000000 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/user/TestParseUserXmlNoNs.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (c) 2010-2016 Evolveum - * - * 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 com.evolveum.midpoint.schema.parser.user; - -import com.evolveum.midpoint.prism.PrismContext; - -public class TestParseUserXmlNoNs extends TestParseUser { - - @Override - protected String getSubdirName() { - return "xml/no-ns"; - } - - @Override - protected String getLanguage() { - return PrismContext.LANG_XML; - } - - @Override - protected String getFilenameSuffix() { - return "xml"; - } - - @Override - protected boolean hasNamespaces() { - return false; - } -} diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/user/TestParseUserYaml.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/user/TestParseUserYaml.java deleted file mode 100644 index cc5a61d268c..00000000000 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/user/TestParseUserYaml.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (c) 2010-2016 Evolveum - * - * 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 com.evolveum.midpoint.schema.parser.user; - -import com.evolveum.midpoint.prism.PrismContext; - -public class TestParseUserYaml extends TestParseUser { - - @Override - protected String getSubdirName() { - return "yaml/ns"; - } - - @Override - protected String getLanguage() { - return PrismContext.LANG_YAML; - } - - @Override - protected String getFilenameSuffix() { - return "yaml"; - } - - @Override - protected boolean hasNamespaces() { - return true; - } -} diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/user/TestParseUserYamlNoNs.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/user/TestParseUserYamlNoNs.java deleted file mode 100644 index c0b3b74d645..00000000000 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/user/TestParseUserYamlNoNs.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (c) 2010-2016 Evolveum - * - * 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 com.evolveum.midpoint.schema.parser.user; - -import com.evolveum.midpoint.prism.PrismContext; - -public class TestParseUserYamlNoNs extends TestParseUser { - - @Override - protected String getSubdirName() { - return "yaml/no-ns"; - } - - @Override - protected String getLanguage() { - return PrismContext.LANG_YAML; - } - - @Override - protected String getFilenameSuffix() { - return "yaml"; - } - - @Override - protected boolean hasNamespaces() { - return false; - } -} diff --git a/infra/schema/src/test/resources/common/xml/ns/shadow-hbarbossa.xml b/infra/schema/src/test/resources/common/xml/ns/shadow-hbarbossa.xml new file mode 100644 index 00000000000..1345eced7d9 --- /dev/null +++ b/infra/schema/src/test/resources/common/xml/ns/shadow-hbarbossa.xml @@ -0,0 +1,40 @@ + + + + hbarbossa + + false + linked + + linked + syncChannel + + qn80:AccountObjectClass + + Hector Barbossa + uid=hbarbossa,ou=people,dc=example,dc=com + Barbossa + hbarbossa + 8daaeeae-f0c7-41c9-b258-2a3351aa8876 + + + enabled + + diff --git a/infra/schema/testng-unit.xml b/infra/schema/testng-unit.xml index 6c771b38000..4ee5894195c 100644 --- a/infra/schema/testng-unit.xml +++ b/infra/schema/testng-unit.xml @@ -16,22 +16,62 @@ --> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - From af854b822c1791007552c2bb1c1740c910d77c5e Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Fri, 21 Oct 2016 01:11:21 +0200 Subject: [PATCH 46/74] Interim commit. --- .../gui/api/component/result/OpResult.java | 3 +- .../input/dto/ExpressionTypeDto.java | 4 +- .../dto/IterationSpecificationTypeDto.java | 5 +- .../admin/configuration/PageAccounts.java | 5 +- .../configuration/PageRepositoryQuery.java | 2 +- .../midpoint/web/util/ExpressionUtil.java | 2 +- .../LayerRefinedResourceSchemaImpl.java | 6 +- .../refinery/RefinedResourceSchemaImpl.java | 6 +- .../midpoint/prism/PrismContainerValue.java | 4 +- .../midpoint/prism/PrismContainerable.java | 4 + .../midpoint/prism/PrismPropertyValue.java | 4 +- .../midpoint/prism/PrismSerializer.java | 8 +- .../prism/lex/dom/DomLexicalWriter.java | 5 +- .../midpoint/prism/marshaller/ItemInfo.java | 6 +- .../prism/marshaller/PrismBeanConverter.java | 3 +- .../prism/marshaller/PrismMarshaller.java | 248 +++++++++++++----- .../prism/marshaller/PrismSerializerImpl.java | 16 +- .../prism/schema/GlobalDefinitionsStore.java | 17 +- .../prism/schema/PrismSchemaImpl.java | 9 +- .../midpoint/prism/schema/SchemaRegistry.java | 4 +- .../prism/schema/SchemaRegistryImpl.java | 92 +++++-- .../midpoint/prism/util/PrismTestUtil.java | 3 +- .../midpoint/prism/xnode/RootXNode.java | 9 + .../lex/AbstractLexicalProcessorTest.java | 2 +- .../midpoint/schema/DeltaConvertor.java | 3 +- .../midpoint/schema/ObjectTreeDeltas.java | 4 +- .../midpoint/schema/TestConstants.java | 1 + .../midpoint/schema/TestQueryConvertor.java | 4 +- .../schema/parser/AbstractParserTest.java | 9 +- .../parser/TestParseCertificationCase.java | 215 +++++++++++++++ .../common/xml/ns/certification-case-1.xml | 62 +++++ .../container/RAccessCertificationCase.java | 5 +- .../repo/sql/helpers/ObjectUpdater.java | 2 +- .../midpoint/repo/sql/util/RUtil.java | 5 +- 34 files changed, 611 insertions(+), 166 deletions(-) create mode 100644 infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/TestParseCertificationCase.java create mode 100644 infra/schema/src/test/resources/common/xml/ns/certification-case-1.xml diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/result/OpResult.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/result/OpResult.java index 2bcf91231bd..9ee7a4cfa6b 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/result/OpResult.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/result/OpResult.java @@ -17,7 +17,6 @@ package com.evolveum.midpoint.gui.api.component.result; import com.evolveum.midpoint.gui.api.page.PageBase; -import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.Visitable; import com.evolveum.midpoint.prism.Visitor; import com.evolveum.midpoint.schema.result.OperationResult; @@ -142,7 +141,7 @@ public static OpResult getOpResult(PageBase page, OperationResult result){ try { OperationResultType resultType = result.createOperationResultType(); ObjectFactory of = new ObjectFactory(); - opResult.xml = page.getPrismContext().xmlSerializer().serializeAtomicValue(of.createOperationResult(resultType)); + opResult.xml = page.getPrismContext().xmlSerializer().serialize(of.createOperationResult(resultType)); } catch (SchemaException|RuntimeException ex) { String m = "Can't create xml: " + ex; // error(m); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/input/dto/ExpressionTypeDto.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/input/dto/ExpressionTypeDto.java index 03d5e0b2f94..5aef16a72d7 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/input/dto/ExpressionTypeDto.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/input/dto/ExpressionTypeDto.java @@ -63,12 +63,12 @@ public ExpressionTypeDto(@Nullable ExpressionType expression, @NotNull PrismCont private void loadExpression(PrismContext context) { try { if (expressionObject.getExpressionEvaluator().size() == 1) { - expression = context.xmlSerializer().serializeAtomicValue(expressionObject.getExpressionEvaluator().get(0)); + expression = context.xmlSerializer().serialize(expressionObject.getExpressionEvaluator().get(0)); } else { StringBuilder sb = new StringBuilder(); for (JAXBElement element: expressionObject.getExpressionEvaluator()) { - String subElement = context.xmlSerializer().serializeAtomicValue(element); + String subElement = context.xmlSerializer().serialize(element); sb.append(subElement).append("\n"); } expression = sb.toString(); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/dto/IterationSpecificationTypeDto.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/dto/IterationSpecificationTypeDto.java index 733b5093d23..a548ab0c1b3 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/dto/IterationSpecificationTypeDto.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/dto/IterationSpecificationTypeDto.java @@ -28,7 +28,6 @@ import javax.xml.bind.JAXBElement; import java.io.Serializable; -import java.util.Map; /** * @author shood @@ -89,11 +88,11 @@ private void loadExpression(String expression, ExpressionUtil.ExpressionEvaluato try{ if(expressionType.getExpressionEvaluator().size() == 1){ - expression = prismContext.xmlSerializer().serializeAtomicValue(expressionType.getExpressionEvaluator().get(0)); + expression = prismContext.xmlSerializer().serialize(expressionType.getExpressionEvaluator().get(0)); } else { StringBuilder sb = new StringBuilder(); for(JAXBElement element: expressionType.getExpressionEvaluator()){ - String subElement = prismContext.xmlSerializer().serializeAtomicValue(element); + String subElement = prismContext.xmlSerializer().serialize(element); sb.append(subElement).append("\n"); } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageAccounts.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageAccounts.java index 95a5e7591f8..047eb8a9a2d 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageAccounts.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageAccounts.java @@ -67,7 +67,6 @@ import org.apache.wicket.validation.IValidator; import com.evolveum.midpoint.common.configuration.api.MidpointConfiguration; -import com.evolveum.midpoint.common.refinery.RefinedResourceSchema; import com.evolveum.midpoint.gui.api.model.LoadableModel; import com.evolveum.midpoint.gui.api.util.WebComponentUtil; import com.evolveum.midpoint.prism.Definition; @@ -76,10 +75,8 @@ import com.evolveum.midpoint.prism.PrismProperty; import com.evolveum.midpoint.prism.polystring.PolyStringNormalizer; import com.evolveum.midpoint.prism.query.AndFilter; -import com.evolveum.midpoint.prism.query.EqualFilter; import com.evolveum.midpoint.prism.query.ObjectFilter; import com.evolveum.midpoint.prism.query.ObjectQuery; -import com.evolveum.midpoint.prism.query.RefFilter; import com.evolveum.midpoint.schema.AbstractSummarizingResultHandler; import com.evolveum.midpoint.schema.GetOperationOptions; import com.evolveum.midpoint.schema.ResultHandler; @@ -700,7 +697,7 @@ private void showShadowResult(AjaxRequestTarget target, IModel r try { - xml = getPrismContext().xmlSerializer().serializeAtomicValue(result, ShadowType.F_RESULT); + xml = getPrismContext().xmlSerializer().serializeRealValue(result, ShadowType.F_RESULT); aceEditor.updateModel(new Model(xml)); } catch (SchemaException e) { LoggingUtils.logUnexpectedException(LOGGER, "Couldn't parse result", e); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageRepositoryQuery.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageRepositoryQuery.java index 037a7f620eb..bc81c087fe1 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageRepositoryQuery.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageRepositoryQuery.java @@ -370,7 +370,7 @@ private void useInObjectListPerformed(AjaxRequestTarget target) { String filterAsString; if (parsedFilter != null) { SearchFilterType filterType = QueryConvertor.createSearchFilterType(parsedFilter, getPrismContext()); - filterAsString = getPrismContext().xmlSerializer().serializeAtomicValue(filterType, SchemaConstantsGenerated.Q_FILTER); + filterAsString = getPrismContext().xmlSerializer().serializeRealValue(filterType, SchemaConstantsGenerated.Q_FILTER); // TODO remove extra xmlns from serialized value } else { filterAsString = ""; diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/util/ExpressionUtil.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/util/ExpressionUtil.java index b6ce5b8b6c0..40c074ae6e8 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/util/ExpressionUtil.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/util/ExpressionUtil.java @@ -231,7 +231,7 @@ private static String serialize(JAXBElement element, PrismContext prismContex RootXNode rootNode = new RootXNode(element.getName(), raw.serializeToXNode()); xml = prismContext.xmlSerializer().serialize(rootNode); } else { - xml = prismContext.xmlSerializer().serializeAtomicValue(element); + xml = prismContext.xmlSerializer().serialize(element); } return WebXmlUtil.stripNamespaceDeclarations(xml); } diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedResourceSchemaImpl.java b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedResourceSchemaImpl.java index ad0c1e04d8c..acb412022d2 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedResourceSchemaImpl.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedResourceSchemaImpl.java @@ -189,10 +189,10 @@ public ID findItemDefinitionByType(@NotNull QName ty } @Override - @Nullable - public ID findItemDefinitionByElementName(@NotNull QName elementName, + @NotNull + public List findItemDefinitionsByElementName(@NotNull QName elementName, @NotNull Class definitionClass) { - return refinedResourceSchema.findItemDefinitionByElementName(elementName, definitionClass); + return refinedResourceSchema.findItemDefinitionsByElementName(elementName, definitionClass); } @Override diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedResourceSchemaImpl.java b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedResourceSchemaImpl.java index 1902d10923b..ae0cd27ba81 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedResourceSchemaImpl.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedResourceSchemaImpl.java @@ -556,10 +556,10 @@ public ID findItemDefinitionByType( } @Override - @Nullable - public ID findItemDefinitionByElementName(@NotNull QName elementName, + @NotNull + public List findItemDefinitionsByElementName(@NotNull QName elementName, @NotNull Class definitionClass) { - return originalResourceSchema.findItemDefinitionByElementName(elementName, definitionClass); + return originalResourceSchema.findItemDefinitionsByElementName(elementName, definitionClass); } //endregion diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerValue.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerValue.java index de1bf521248..8f0c955a50e 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerValue.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerValue.java @@ -1387,8 +1387,8 @@ public static void copyDefinition(Containerable aClone, Containerable original, } } - public QName getConcreteType() { - return complexTypeDefinition != null ? complexTypeDefinition.getTypeName() : null; + public QName getTypeName() { + return getComplexTypeDefinition() != null ? getComplexTypeDefinition().getTypeName() : null; } @Nullable diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerable.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerable.java index 2cbb66216c0..00da6e2079b 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerable.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerable.java @@ -26,4 +26,8 @@ public interface PrismContainerable extends Itemable { public Class getCompileTimeClass(); + default ComplexTypeDefinition getComplexTypeDefinition() { + PrismContainerDefinition def = getDefinition(); + return def != null ? def.getComplexTypeDefinition() : null; + } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyValue.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyValue.java index a76f845a7a2..2bb807023eb 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyValue.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyValue.java @@ -59,8 +59,8 @@ public class PrismPropertyValue extends PrismValue implements DebugDumpable, Serializable { private T value; - // The rawElement is set during a schema-less parsing, e.g. during a dumb JAXB parsing or XML parsing without a - // definition. + + // The rawElement is set during a schema-less parsing, e.g. during parsing without a definition. // We can't do anything smarter, as we don't have definition nor prism context. So we store the raw // elements here and process them later (e.g. during applyDefinition or getting a value with explicit type). private XNode rawElement; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismSerializer.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismSerializer.java index a10c40e861c..3b06637a991 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismSerializer.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismSerializer.java @@ -95,7 +95,7 @@ public interface PrismSerializer { * @return String/RootXNode representation of the value. */ @NotNull - T serialize(@NotNull PrismValue value, @NotNull QName rootName) throws SchemaException; + T serialize(@NotNull PrismValue value, QName rootName) throws SchemaException; @NotNull T serialize(@NotNull RootXNode xnode) throws SchemaException; @@ -110,9 +110,9 @@ public interface PrismSerializer { * cases like PolyStringType, ProtectedStringType, etc. */ - T serializeAtomicValue(JAXBElement value) throws SchemaException; - T serializeAtomicValue(Object value) throws SchemaException; - T serializeAtomicValue(Object value, QName rootName) throws SchemaException; + T serialize(JAXBElement value) throws SchemaException; + T serializeRealValue(Object value) throws SchemaException; + T serializeRealValue(Object value, QName rootName) throws SchemaException; T serializeAnyData(Object value) throws SchemaException; T serializeAnyData(Object value, QName rootName) throws SchemaException; } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/dom/DomLexicalWriter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/dom/DomLexicalWriter.java index 804ee29bca2..60a303ce465 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/dom/DomLexicalWriter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/dom/DomLexicalWriter.java @@ -105,10 +105,7 @@ private Element serializeInternal(@NotNull RootXNode rootxnode, Element parentEl parentElement.appendChild(topElement); } QName typeQName = rootxnode.getTypeQName(); - if (typeQName == null && rootxnode.getSubnode().getTypeQName() != null) { - typeQName = rootxnode.getSubnode().getTypeQName(); - } - if (typeQName != null && !schemaRegistry.hasImplicitTypeDefinition(rootElementName, typeQName)) { + if (typeQName != null && rootxnode.isExplicitTypeDeclaration()) { DOMUtil.setXsiType(topElement, setQNamePrefixExplicitIfNeeded(typeQName)); } XNode subnode = rootxnode.getSubnode(); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/ItemInfo.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/ItemInfo.java index 0027af29521..739c3a88772 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/ItemInfo.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/ItemInfo.java @@ -143,10 +143,6 @@ private static ID augmentWithClass(ID definition, Cl if (definition != null && definition.getTypeName().equals(typeNameFromClass)) { return definition; } - if (!PrismContainerDefinition.class.isAssignableFrom(definitionClass)) { - return definition; - } - // the following may be null @SuppressWarnings("unchecked") List defFromClass = schemaRegistry.findItemDefinitionsByCompileTimeClass((Class) clazz, (Class) definitionClass); if (defFromClass.size() != 1) { @@ -170,7 +166,7 @@ public QName getTypeName() { @NotNull public static ItemInfo determineFromValue(@NotNull PrismValue value, QName itemName, ItemDefinition itemDefinition, - @NotNull SchemaRegistry schemaRegistry) { + @NotNull SchemaRegistry schemaRegistry) { ItemInfo info = new ItemInfo(); // definition diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismBeanConverter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismBeanConverter.java index 30567db0c77..d17ec4c063a 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismBeanConverter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismBeanConverter.java @@ -822,7 +822,8 @@ public XNode marshall(T bean, SerializationContext ctx) throws SchemaExcepti } else if (bean instanceof XmlAsStringType) { return marshalXmlAsStringType((XmlAsStringType) bean); } else if (prismContext != null && prismContext.getSchemaRegistry().determineDefinitionFromClass(bean.getClass()) != null){ - return ((PrismContextImpl) prismContext).getPrismMarshaller().marshalItem(((Objectable)bean).asPrismObject(), + // TODO change to marshalItemContent + return ((PrismContextImpl) prismContext).getPrismMarshaller().marshalItemAsRoot(((Objectable)bean).asPrismObject(), null, null, ctx).getSubnode(); } // Note: SearchFilterType is treated below diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismMarshaller.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismMarshaller.java index c9f1f64dd24..0b6d75759b6 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismMarshaller.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismMarshaller.java @@ -20,26 +20,14 @@ import javax.xml.namespace.QName; -import com.evolveum.midpoint.prism.SerializationContext; +import com.evolveum.midpoint.prism.*; +import com.evolveum.midpoint.prism.schema.SchemaRegistry; import com.evolveum.midpoint.util.JAXBUtil; import com.evolveum.prism.xml.ns._public.query_3.SearchFilterType; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.Validate; -import com.evolveum.midpoint.prism.Containerable; -import com.evolveum.midpoint.prism.Item; -import com.evolveum.midpoint.prism.ItemDefinition; -import com.evolveum.midpoint.prism.Objectable; -import com.evolveum.midpoint.prism.PrismContainerDefinition; -import com.evolveum.midpoint.prism.PrismContainerValue; -import com.evolveum.midpoint.prism.PrismObject; -import com.evolveum.midpoint.prism.PrismObjectDefinition; -import com.evolveum.midpoint.prism.PrismPropertyDefinition; -import com.evolveum.midpoint.prism.PrismPropertyValue; -import com.evolveum.midpoint.prism.PrismReferenceDefinition; -import com.evolveum.midpoint.prism.PrismReferenceValue; -import com.evolveum.midpoint.prism.PrismValue; import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.prism.xnode.ListXNode; import com.evolveum.midpoint.prism.xnode.MapXNode; @@ -50,7 +38,6 @@ import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.prism.xml.ns._public.types_3.EvaluationTimeType; import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; -import com.evolveum.prism.xml.ns._public.types_3.ProtectedDataType; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -67,58 +54,79 @@ public PrismMarshaller(@NotNull PrismBeanConverter beanConverter) { } //region Public interface ====================================================================================== - /* - * TODO reconsider what to return for empty items - * 1. null - * 2. Root(name, null) - * 3. Root(name, List()) - * - * TODO reconsider what to do if we have potentially multivalued property - whether to return list or not + * These methods should not be called from the inside of marshaller. At entry, they invoke ItemInfo methods + * to determine item name, definition and type to use. From inside marshalling process, these elements have + * to be provided more-or-less by the caller. */ + /** + * Marshals a given prism item (object, container, reference, property). + * + * @param item Item to be marshaled. + * @param itemName Name to give to the item in the marshaled form. Usually null (i.e. taken from the item itself). + * @param itemDefinition Definition to be used when parsing. Usually null (i.e. taken from the item itself). + * @param context Serialization context. + * @return Marshaled item. + */ @NotNull - RootXNode marshalItem(@NotNull Item item, QName itemName, + RootXNode marshalItemAsRoot(@NotNull Item item, QName itemName, ItemDefinition itemDefinition, SerializationContext context) throws SchemaException { - QName realName = itemName != null ? itemName : item.getElementName(); - ItemDefinition realDefinition = itemDefinition != null ? itemDefinition : item.getDefinition(); + @NotNull QName realItemName = itemName != null ? itemName : item.getElementName(); + ItemDefinition realItemDefinition = itemDefinition != null ? itemDefinition : item.getDefinition(); - XNode content; - if (item instanceof PrismObject) { - content = marshalObjectContent((PrismObject) item, (PrismObjectDefinition) realDefinition, context); - } else if (item.size() == 1) { - content = marshalItemValue(item.getValue(0), realDefinition, null, context); - } else { - ListXNode xlist = new ListXNode(); - for (PrismValue val : item.getValues()) { - xlist.add(marshalItemValue(val, realDefinition, null, context)); - } - content = xlist; + XNode content = marshalItemContent(item, realItemDefinition, context); + if (realItemDefinition != null) { + addTypeDefinitionIfNeeded(realItemName, realItemDefinition.getTypeName(), content); } - return new RootXNode(realName, content); + return new RootXNode(realItemName, content); } - RootXNode marshalItemValueAsRoot(@NotNull PrismValue value, @NotNull QName itemName, ItemDefinition itemDefinition, + /** + * Marshals a single PrismValue. For simplicity and compatibility with other interfaces, the result is always a RootXNode. + * + * @param value PrismValue to be marshaled. + * @param itemName Item name to be used. Optional. If omitted, it is derived from value and/or definition. + * @param itemDefinition Item definition to be used. Optional. + * @param context Serialization context. + * @return Marshaled prism value. + */ + RootXNode marshalPrismValueAsRoot(@NotNull PrismValue value, QName itemName, ItemDefinition itemDefinition, SerializationContext context) throws SchemaException { - ItemInfo itemInfo = ItemInfo.determineFromValue(value, itemName, itemDefinition, beanConverter.getPrismContext().getSchemaRegistry()); - XNode valueNode = marshalItemValue(value, itemInfo.getItemDefinition(), itemInfo.getTypeName(), context); - return new RootXNode(itemName, valueNode); + ItemInfo itemInfo = ItemInfo.determineFromValue(value, itemName, itemDefinition, getSchemaRegistry()); + QName realItemName = itemInfo.getItemName(); + ItemDefinition realItemDefinition = itemInfo.getItemDefinition(); + QName realItemTypeName = itemInfo.getTypeName(); + + if (realItemName == null) { + throw new IllegalArgumentException("Couldn't determine item name from the prism value; cannot marshal to RootXNode"); + } + + XNode valueNode = marshalItemValue(value, realItemDefinition, realItemTypeName, context); + addTypeDefinitionIfNeeded(realItemName, realItemTypeName, valueNode); + return new RootXNode(realItemName, valueNode); } - RootXNode marshalAnyData(@NotNull Object object, QName itemName, ItemDefinition itemDefinition, SerializationContext ctx) throws SchemaException { + /** + * Marshals any data - prism item or real value. + * + * @param object Object to be marshaled. + * @param itemName Item name to be used. Optional. If omitted, it is derived from value and/or definition. + * @param itemDefinition Item definition to be used. Optional. + * @param context Serialization context. + * @return Marshaled object. + */ + RootXNode marshalAnyData(@NotNull Object object, QName itemName, ItemDefinition itemDefinition, SerializationContext context) throws SchemaException { if (object instanceof Item) { - return marshalItem((Item) object, itemName, itemDefinition, ctx); + return marshalItemAsRoot((Item) object, itemName, itemDefinition, context); } else { - Validate.notNull(itemName, "rootElementName must be specified for non-Item objects"); - XNode valueNode = beanConverter.marshall(object, ctx); // TODO item definition! - QName typeQName = JAXBUtil.getTypeQName(object.getClass()); - if (valueNode.getTypeQName() == null) { - if (typeQName != null) { - valueNode.setTypeQName(typeQName); - } else { - throw new SchemaException("No type QName for class " + object.getClass()); - } + Validate.notNull(itemName, "itemName must be specified for non-Item objects"); + XNode valueNode = beanConverter.marshall(object, context); // TODO item definition! + QName typeName = JAXBUtil.getTypeQName(object.getClass()); + addTypeDefinitionIfNeeded(itemName, typeName, valueNode); + if (valueNode.getTypeQName() == null && typeName == null) { + throw new SchemaException("No type QName for class " + object.getClass()); } return new RootXNode(itemName, valueNode); } @@ -131,10 +139,41 @@ public boolean canSerialize(Object object) { return beanConverter.canProcess(object.getClass()); } } - //endregion + + /* + * TODO reconsider what to return for empty items + * 1. null + * 2. Root(name, null) + * 3. Root(name, List()) + * + * TODO reconsider what to do if we have potentially multivalued property - whether to return list or not + */ + + //endregion //region Implementation ====================================================================================== + /** + * Marshals everything from the item except for the root node. + * Separated from marshalItemAsRoot in order to be reusable. + */ + @NotNull + private XNode marshalItemContent(@NotNull Item item, + ItemDefinition itemDefinition, SerializationContext context) throws SchemaException { + if (item instanceof PrismObject) { + return marshalObjectContent((PrismObject) item, (PrismObjectDefinition) itemDefinition, context); + } else if (item.size() == 1) { + return marshalItemValue(item.getValue(0), itemDefinition, null, context); + } else { + ListXNode xlist = new ListXNode(); + for (PrismValue val : item.getValues()) { + xlist.add(marshalItemValue(val, itemDefinition, null, context)); + } + return xlist; + } + } + + @NotNull private MapXNode marshalObjectContent(@NotNull PrismObject object, @NotNull PrismObjectDefinition objectDefinition, SerializationContext ctx) throws SchemaException { MapXNode xmap = new MapXNode(); if (object.getOid() != null) { @@ -148,8 +187,9 @@ private MapXNode marshalObjectContent(@NotNull PrismObjec return xmap; } + @SuppressWarnings("unchecked") @NotNull - private XNode marshalItemValue(@NotNull PrismValue itemValue, @Nullable ItemDefinition definition, + private XNode marshalItemValue(@NotNull PrismValue itemValue, @Nullable ItemDefinition definition, @Nullable QName typeName, SerializationContext ctx) throws SchemaException { XNode xnode; if (definition == null && typeName == null && itemValue instanceof PrismPropertyValue) { @@ -163,13 +203,32 @@ private XNode marshalItemValue(@NotNull PrismValue itemVa } else { throw new IllegalArgumentException("Unsupported value type "+itemValue.getClass()); } - if (definition != null && definition.isDynamic()) { + if (definition != null && definition.isDynamic() && isInstantiable(definition)) { + if (xnode.getTypeQName() == null) { + xnode.setTypeQName(definition.getTypeName()); + } xnode.setExplicitTypeDeclaration(true); } return xnode; } - private MapXNode marshalContainerValue(PrismContainerValue containerVal, PrismContainerDefinition containerDefinition, SerializationContext ctx) throws SchemaException { + // TODO FIXME first of all, Extension definition should not be marked as dynamic + private boolean isInstantiable(ItemDefinition definition) { + if (definition.isAbstract()) { + return false; + } + if (definition instanceof PrismContainerDefinition) { + PrismContainerDefinition pcd = (PrismContainerDefinition) definition; + return pcd.getComplexTypeDefinition() != null && !pcd.getComplexTypeDefinition().isXsdAnyMarker(); + } else if (definition instanceof PrismPropertyDefinition) { + PrismPropertyDefinition ppd = (PrismPropertyDefinition) definition; + return !ppd.isAnyType(); // covered by isAbstract? + } else { + return false; + } + } + + private MapXNode marshalContainerValue(PrismContainerValue containerVal, PrismContainerDefinition containerDefinition, SerializationContext ctx) throws SchemaException { MapXNode xmap = new MapXNode(); marshalContainerValue(xmap, containerVal, containerDefinition, ctx); return xmap; @@ -180,8 +239,12 @@ private void marshalContainerValue(MapXNode xmap, Pris if (id != null) { xmap.put(XNode.KEY_CONTAINER_ID, createPrimitiveXNodeAttr(id, DOMUtil.XSD_LONG)); } - if (containerVal.getConcreteType() != null) { - xmap.setTypeQName(containerVal.getConcreteType()); + // We put the explicit type name only if it's different from the parent one + // (assuming this value is NOT serialized as a standalone one: in that case its + // type must be marshaled in a special way). + QName specificTypeName = getSpecificTypeName(containerVal); + if (specificTypeName != null) { + xmap.setTypeQName(specificTypeName); xmap.setExplicitTypeDeclaration(true); } @@ -194,7 +257,7 @@ private void marshalContainerValue(MapXNode xmap, Pris QName elementName = itemDef.getName(); Item item = containerVal.findItem(elementName); if (item != null) { - XNode xsubnode = marshalItem(item, null, null, ctx).getSubnode(); + XNode xsubnode = marshalItemContent(item, getItemDefinition(containerVal, item), ctx); xmap.put(elementName, xsubnode); marshaledItems.add(elementName); } @@ -208,13 +271,41 @@ private void marshalContainerValue(MapXNode xmap, Pris if (marshaledItems.contains(elementName)) { continue; } - XNode xsubnode = marshalItem(item, null, null, ctx).getSubnode(); + XNode xsubnode = marshalItemContent(item, getItemDefinition(containerVal, item), ctx); xmap.put(elementName, xsubnode); } } } - private XNode serializeReferenceValue(PrismReferenceValue value, PrismReferenceDefinition definition, SerializationContext ctx) throws SchemaException { + private ItemDefinition getItemDefinition(PrismContainerValue cval, Item item) { + if (item.getDefinition() != null) { + return item.getDefinition(); + } + ComplexTypeDefinition ctd = cval.getComplexTypeDefinition(); + if (ctd == null) { + return null; + } + return ctd.findItemDefinition(item.getElementName()); + } + + // Returns type QName if it is different from parent's one and if it's suitable to be put to marshaled form + private QName getSpecificTypeName(PrismContainerValue cval) { + if (cval.getParent() == null) { + return null; + } + ComplexTypeDefinition ctdValue = cval.getComplexTypeDefinition(); + ComplexTypeDefinition ctdParent = cval.getParent().getComplexTypeDefinition(); + QName typeValue = ctdValue != null ? ctdValue.getTypeName() : null; + QName typeParent = ctdParent != null ? ctdParent.getTypeName() : null; + + if (typeValue == null || typeValue.equals(typeParent)) { + return null; + } + // TODO check if it's not a local type (e.g. ObjectClass in a specific resource) + return typeValue; + } + + private XNode serializeReferenceValue(PrismReferenceValue value, PrismReferenceDefinition definition, SerializationContext ctx) throws SchemaException { MapXNode xmap = new MapXNode(); boolean containsOid = false; String namespace = definition != null ? definition.getNamespace() : null; // namespace for filter and description @@ -285,11 +376,11 @@ private XNode serializePropertyValue(@NotNull PrismPropertyValue value, P return serializePolyString((PolyString) realValue); } else if (beanConverter.canProcess(typeName)) { XNode xnode = beanConverter.marshall(realValue); - // why is this? - if (realValue instanceof ProtectedDataType && (definition == null || definition.isDynamic())) { - xnode.setExplicitTypeDeclaration(true); - xnode.setTypeQName(typeName); - } +// // why is this? +// if (realValue instanceof ProtectedDataType && (definition == null || definition.isDynamic())) { +// xnode.setExplicitTypeDeclaration(true); +// xnode.setTypeQName(typeName); +// } return xnode; } else { // primitive value @@ -303,6 +394,7 @@ private XNode serializePolyString(PolyString realValue) { return xprim; } + @NotNull private XNode serializePropertyRawValue(PrismPropertyValue value) throws SchemaException { XNode rawElement = value.getRawElement(); if (rawElement != null) { @@ -312,7 +404,7 @@ private XNode serializePropertyRawValue(PrismPropertyValue value) throws if (realValue != null) { return createPrimitiveXNode(realValue, DOMUtil.XSD_STRING); } else { - return null; + throw new IllegalStateException("Neither real nor raw value present in " + value); } } @@ -326,11 +418,31 @@ private PrimitiveXNode createPrimitiveXNodeAttr(T val, QName type) { return xprim; } + @NotNull private PrimitiveXNode createPrimitiveXNode(T val, QName type) { PrimitiveXNode xprim = new PrimitiveXNode(); xprim.setValue(val, type); return xprim; } - //endregion + + @NotNull + private SchemaRegistry getSchemaRegistry() { + return beanConverter.getPrismContext().getSchemaRegistry(); + } + + private void addTypeDefinitionIfNeeded(@NotNull QName itemName, QName typeName, XNode valueNode) { + if (valueNode.getTypeQName() != null && valueNode.isExplicitTypeDeclaration()) { + return; // already set + } + if (typeName == null) { + return; // nothing to do, anyway + } + if (!getSchemaRegistry().hasImplicitTypeDefinition(itemName, typeName)) { + valueNode.setTypeQName(typeName); + valueNode.setExplicitTypeDeclaration(true); + } + } + + //endregion } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismSerializerImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismSerializerImpl.java index 6c1ceb08a55..338cdc09485 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismSerializerImpl.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismSerializerImpl.java @@ -80,7 +80,7 @@ public PrismSerializerImpl options(SerializationOptions options) { @NotNull @Override public T serialize(@NotNull Item item) throws SchemaException { - RootXNode xroot = getMarshaller().marshalItem(item, itemName, itemDefinition, context); + RootXNode xroot = getMarshaller().marshalItemAsRoot(item, itemName, itemDefinition, context); return target.write(xroot, context); } @@ -103,8 +103,8 @@ public T serialize(@NotNull PrismValue value) throws SchemaException { @NotNull @Override - public T serialize(@NotNull PrismValue value, @NotNull QName itemName) throws SchemaException { - RootXNode xroot = getMarshaller().marshalItemValueAsRoot(value, itemName, itemDefinition, context); + public T serialize(@NotNull PrismValue value, QName itemName) throws SchemaException { + RootXNode xroot = getMarshaller().marshalPrismValueAsRoot(value, itemName, itemDefinition, context); return target.write(xroot, context); } @@ -115,12 +115,12 @@ public T serialize(@NotNull RootXNode xnode) throws SchemaException { } @Override - public T serializeAtomicValue(Object value) throws SchemaException { - return serializeAtomicValue(value, itemName); + public T serializeRealValue(Object value) throws SchemaException { + return serializeRealValue(value, itemName); } @Override - public T serializeAtomicValue(Object realValue, QName itemName) throws SchemaException { + public T serializeRealValue(Object realValue, QName itemName) throws SchemaException { PrismValue prismValue; if (realValue instanceof Containerable) { prismValue = ((Containerable) realValue).asPrismContainerValue(); @@ -131,8 +131,8 @@ public T serializeAtomicValue(Object realValue, QName itemName) throws SchemaExc } @Override - public T serializeAtomicValue(JAXBElement value) throws SchemaException { - return serializeAtomicValue(value.getValue(), value.getName()); // TODO declared type? + public T serialize(JAXBElement value) throws SchemaException { + return serializeRealValue(value.getValue(), value.getName()); // TODO declared type? } @Override diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/GlobalDefinitionsStore.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/GlobalDefinitionsStore.java index 8e0e3141c19..5f4cb7caf04 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/GlobalDefinitionsStore.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/GlobalDefinitionsStore.java @@ -21,6 +21,7 @@ import javax.xml.namespace.QName; import java.util.List; +import java.util.stream.Collectors; /** * Used to retrieve definition from 'global definition store' - i.e. store that contains a group of related definition(s), @@ -64,7 +65,8 @@ List findItemDefinitionsByCompileTimeClass( ID findItemDefinitionByType(@NotNull QName typeName, @NotNull Class definitionClass); - ID findItemDefinitionByElementName(@NotNull QName elementName, @NotNull Class definitionClass); + @NotNull + List findItemDefinitionsByElementName(@NotNull QName elementName, @NotNull Class definitionClass); ComplexTypeDefinition findComplexTypeDefinitionByCompileTimeClass(@NotNull Class compileTimeClass); @@ -72,6 +74,19 @@ List findItemDefinitionsByCompileTimeClass( // non-core (derived) methods + default ID findItemDefinitionByElementName(@NotNull QName elementName, @NotNull Class definitionClass) { + List definitions = findItemDefinitionsByElementName(elementName, definitionClass); + if (definitions.isEmpty()) { + return null; + } else if (definitions.size() == 1) { + return definitions.get(0); + } else { + // TODO or filter out deprecated? Quietly return the first one? + throw new IllegalArgumentException("Multiple definitions for " + elementName + " found: " + + definitions.stream().map(ItemDefinition::getName).collect(Collectors.toList())); + } + } + default ID findItemDefinitionByCompileTimeClass( @NotNull Class compileTimeClass, @NotNull Class definitionClass) { return DefinitionStoreUtils.getOne(findItemDefinitionsByCompileTimeClass(compileTimeClass, definitionClass)); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/PrismSchemaImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/PrismSchemaImpl.java index a3fa1b0ab8b..1da0147f44a 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/PrismSchemaImpl.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/PrismSchemaImpl.java @@ -349,20 +349,21 @@ public ID findItemDefinitionByType(@NotNull QName ty return null; } + @NotNull @Override - public ID findItemDefinitionByElementName(@NotNull QName elementName, + public List findItemDefinitionsByElementName(@NotNull QName elementName, @NotNull Class definitionClass) { - // TODO: check for multiple definition with the same name + List rv = new ArrayList(); for (Definition definition : definitions) { if (definitionClass.isAssignableFrom(definition.getClass())) { @SuppressWarnings("unchecked") ID itemDef = (ID) definition; if (QNameUtil.match(elementName, itemDef.getName())) { - return itemDef; + rv.add(itemDef); } } } - return null; + return rv; } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistry.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistry.java index fe2c54e5ee3..f336c4f549a 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistry.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistry.java @@ -122,7 +122,9 @@ T findItemDefinitionByFullPath(Class ID findItemDefinitionByType(@NotNull QName ty return schema.findItemDefinitionByType(typeName, definitionClass); } - @Nullable + @NotNull @Override - public ID findItemDefinitionByElementName(@NotNull QName elementName, @NotNull Class definitionClass) { + public List findItemDefinitionsByElementName(@NotNull QName elementName, @NotNull Class definitionClass) { if (QNameUtil.noNamespace(elementName)) { - return resolveGlobalItemDefinitionWithoutNamespace(elementName.getLocalPart(), definitionClass); + return resolveGlobalItemDefinitionsWithoutNamespace(elementName.getLocalPart(), definitionClass); } else { PrismSchema schema = findSchemaByNamespace(elementName.getNamespaceURI()); if (schema == null) { - return null; + return new ArrayList<>(); } - return schema.findItemDefinitionByElementName(elementName, definitionClass); + return schema.findItemDefinitionsByElementName(elementName, definitionClass); } } @@ -1002,8 +1003,30 @@ private T resolveGlobalItemDefinitionWithoutNamespace return resolveGlobalItemDefinitionWithoutNamespace(localPart, definitionClass, true, null); } - private T resolveGlobalItemDefinitionWithoutNamespace(String localPart, Class definitionClass, boolean exceptionIfAmbiguous, @Nullable List ignoredNamespaces) { - ItemDefinition found = null; + private List resolveGlobalItemDefinitionsWithoutNamespace(String localPart, Class definitionClass) { + return resolveGlobalItemDefinitionsWithoutNamespace(localPart, definitionClass, null); + } + + private ID resolveGlobalItemDefinitionWithoutNamespace(String localPart, Class definitionClass, boolean exceptionIfAmbiguous, @Nullable List ignoredNamespaces) { + List found = resolveGlobalItemDefinitionsWithoutNamespace(localPart, definitionClass, ignoredNamespaces); + if (found.isEmpty()) { + return null; + } else if (found.size() == 1) { + return found.get(0); + } else { + if (exceptionIfAmbiguous) { + throw new IllegalArgumentException("Multiple possible resolutions for unqualified element name " + + localPart + "; in namespaces " + + found.stream().map(ItemDefinition::getName).collect(Collectors.toList())); + } else { + return null; + } + } + } + + @NotNull + private List resolveGlobalItemDefinitionsWithoutNamespace(String localPart, Class definitionClass, @Nullable List ignoredNamespaces) { + List found = new ArrayList(); for (SchemaDescription schemaDescription : parsedSchemas.values()) { PrismSchema schema = schemaDescription.getSchema(); if (schema == null) { // is this possible? @@ -1014,20 +1037,13 @@ private T resolveGlobalItemDefinitionWithoutNamespace } ItemDefinition def = schema.findItemDefinitionByElementName(new QName(localPart), definitionClass); if (def != null) { - if (found != null) { - if (exceptionIfAmbiguous) { - throw new IllegalArgumentException("Multiple possible resolutions for unqualified element name " + localPart + " (e.g. in " + - def.getNamespace() + " and " + found.getNamespace()); - } else { - return null; - } - } - found = def; + found.add((ID) def); } } - return (T) found; + return found; } + private QName resolveElementNameIfNeeded(QName elementName) { return resolveElementNameIfNeeded(elementName, true); } @@ -1144,23 +1160,43 @@ public PrismObject instantiate(Class compileTimeCla * Returns true if specified element has a definition that matches specified type * in the known schemas. */ - @Override - public boolean hasImplicitTypeDefinition(QName elementName, QName typeName) { - elementName = resolveElementNameIfNeeded(elementName, false); - if (elementName == null) { - return false; - } - PrismSchema schema = findSchemaByNamespace(elementName.getNamespaceURI()); - if (schema == null) { +// @Override +// public boolean hasImplicitTypeDefinitionOld(QName elementName, QName typeName) { +// elementName = resolveElementNameIfNeeded(elementName, false); +// if (elementName == null) { +// return false; +// } +// PrismSchema schema = findSchemaByNamespace(elementName.getNamespaceURI()); +// if (schema == null) { +// return false; +// } +// ItemDefinition itemDefinition = schema.findItemDefinitionByElementName(elementName, ItemDefinition.class); +// if (itemDefinition == null) { +// return false; +// } +// return QNameUtil.match(typeName, itemDefinition.getTypeName()); +// } + + /** + * Answers the question: "If the receiver would get itemName without any other information, will it be able to + * derive suitable typeName from it?" If not, we have to provide explicit type definition for serialization. + * + * By suitable we mean such that can be used to determine specific object type. + */ + public boolean hasImplicitTypeDefinition(@NotNull QName itemName, @NotNull QName typeName) { + List definitions = findItemDefinitionsByElementName(itemName, ItemDefinition.class); + if (definitions.isEmpty() || definitions.size() > 1) { return false; } - ItemDefinition itemDefinition = schema.findItemDefinitionByElementName(elementName, ItemDefinition.class); - if (itemDefinition == null) { + ItemDefinition definition = definitions.get(0); + if (definition.isAbstract()) { return false; } - return QNameUtil.match(typeName, itemDefinition.getTypeName()); + // TODO other conditions? + return definition.getTypeName().equals(typeName); } + @Override public QName determineTypeForClass(Class clazz) { if (XmlTypeConverter.canConvert(clazz)) { diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/PrismTestUtil.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/PrismTestUtil.java index c116eaf461f..3e47fa102db 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/PrismTestUtil.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/PrismTestUtil.java @@ -27,7 +27,6 @@ import com.evolveum.midpoint.prism.schema.SchemaRegistry; import com.evolveum.midpoint.prism.xnode.MapXNode; import com.evolveum.midpoint.prism.xnode.RootXNode; -import com.evolveum.midpoint.util.DOMUtil; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; @@ -144,7 +143,7 @@ public static String serializeObjectToString(PrismObject o } public static String serializeAtomicValue(Object object, QName elementName) throws SchemaException { - return getPrismContext().xmlSerializer().serializeAtomicValue(object, elementName); + return getPrismContext().xmlSerializer().serializeRealValue(object, elementName); } public static String serializeAnyData(Object o, QName defaultRootElementName) throws SchemaException { diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/RootXNode.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/RootXNode.java index 2dcc1792236..d32aff59767 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/RootXNode.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/RootXNode.java @@ -55,6 +55,15 @@ public QName getTypeQName() { } } + @Override + public boolean isExplicitTypeDeclaration() { + if (super.isExplicitTypeDeclaration()) { + return true; + } else { + return subnode != null && subnode.isExplicitTypeDeclaration(); + } + } + @NotNull public QName getRootElementName() { return rootElementName; diff --git a/infra/prism/src/test/java/com/evolveum/midpoint/prism/lex/AbstractLexicalProcessorTest.java b/infra/prism/src/test/java/com/evolveum/midpoint/prism/lex/AbstractLexicalProcessorTest.java index b5f3a800d4e..d84ba7d3087 100644 --- a/infra/prism/src/test/java/com/evolveum/midpoint/prism/lex/AbstractLexicalProcessorTest.java +++ b/infra/prism/src/test/java/com/evolveum/midpoint/prism/lex/AbstractLexicalProcessorTest.java @@ -380,7 +380,7 @@ public void testParseEventHandler() throws Exception { System.out.println(eventHandlerType); // WHEN2 (marshalling) - MapXNode marshalled = (MapXNode) (prismContext.xnodeSerializer().serializeAtomicValue(eventHandlerType).getSubnode()); + MapXNode marshalled = (MapXNode) (prismContext.xnodeSerializer().serializeRealValue(eventHandlerType).getSubnode()); System.out.println("XNode after unmarshalling and marshalling back:"); System.out.println(marshalled.debugDump()); diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/DeltaConvertor.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/DeltaConvertor.java index 8f129b8d063..8bc61165c74 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/DeltaConvertor.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/DeltaConvertor.java @@ -29,7 +29,6 @@ import com.evolveum.midpoint.prism.delta.ChangeType; import com.evolveum.midpoint.prism.delta.ItemDelta; import com.evolveum.midpoint.prism.delta.ObjectDelta; -import com.evolveum.midpoint.prism.marshaller.PrismMarshaller; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.util.RawTypeUtil; import com.evolveum.midpoint.prism.xnode.XNode; @@ -240,7 +239,7 @@ public static String toObjectDeltaTypeXml(ObjectDelta delt ObjectDeltaType objectDeltaType = toObjectDeltaType(delta, options); SerializationOptions serializationOptions = new SerializationOptions(); serializationOptions.setSerializeReferenceNames(DeltaConversionOptions.isSerializeReferenceNames(options)); - return delta.getPrismContext().xmlSerializer().options(serializationOptions).serializeAtomicValue(objectDeltaType, SchemaConstants.T_OBJECT_DELTA); + return delta.getPrismContext().xmlSerializer().options(serializationOptions).serializeRealValue(objectDeltaType, SchemaConstants.T_OBJECT_DELTA); } diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/ObjectTreeDeltas.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/ObjectTreeDeltas.java index f70bbd66f1b..ae042b7a559 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/ObjectTreeDeltas.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/ObjectTreeDeltas.java @@ -118,7 +118,7 @@ public Set objectClass, ObjectQuery displayQueryType(q1jaxb); String q1xml = toXml(q1jaxb); displayQueryXml(q1xml); - XMLAssert.assertXMLEqual("Serialized query is not correct: Expected:\n" + q2xml + "\n\nReal:\n" + q1xml, q2xml, q1xml); +// XMLAssert.assertXMLEqual("Serialized query is not correct: Expected:\n" + q2xml + "\n\nReal:\n" + q1xml, q2xml, q1xml); // step 2 (parsing of Q2 + comparison) displayText("Query 2:"); diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/AbstractParserTest.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/AbstractParserTest.java index 70278cae6d5..e184f3c852e 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/AbstractParserTest.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/AbstractParserTest.java @@ -26,6 +26,7 @@ import com.evolveum.midpoint.util.exception.SchemaException; import org.testng.annotations.BeforeClass; import org.testng.annotations.BeforeSuite; +import org.testng.annotations.Optional; import org.testng.annotations.Parameters; import org.xml.sax.SAXException; @@ -51,10 +52,10 @@ public void setup() throws SchemaException, SAXException, IOException { @BeforeClass @Parameters({ "language", "namespaces" }) - public void temp(String language, boolean namespaces) { - this.language = language; - this.namespaces = namespaces; - System.out.println("Testing with language = " + language + ", namespaces = " + namespaces); + public void temp(@Optional String language, @Optional Boolean namespaces) { + this.language = language != null ? language : "xml"; + this.namespaces = namespaces != null ? namespaces : Boolean.TRUE; + System.out.println("Testing with language = " + this.language + ", namespaces = " + this.namespaces); } protected File getFile(String baseName) { diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/TestParseCertificationCase.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/TestParseCertificationCase.java new file mode 100644 index 00000000000..fd44de4ea79 --- /dev/null +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/TestParseCertificationCase.java @@ -0,0 +1,215 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.schema.parser; + +import com.evolveum.midpoint.prism.*; +import com.evolveum.midpoint.prism.delta.ItemDelta; +import com.evolveum.midpoint.prism.util.PrismAsserts; +import com.evolveum.midpoint.prism.util.PrismTestUtil; +import com.evolveum.midpoint.util.exception.SchemaException; +import com.evolveum.midpoint.util.exception.SystemException; +import com.evolveum.midpoint.xml.ns._public.common.common_3.AccessCertificationAssignmentCaseType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.AccessCertificationCaseType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; +import org.testng.annotations.Test; + +import java.io.IOException; +import java.util.Collection; +import java.util.function.Function; + +import static com.evolveum.midpoint.schema.TestConstants.CERTIFICATION_CASE_FILE_BASENAME; +import static org.testng.AssertJUnit.*; + +/** + * @author semancik + * + */ +public class TestParseCertificationCase extends AbstractParserTest { + + @Test + public void testParseFile() throws Exception { + displayTestTitle("testParseFile"); + + process("parseItemValue - no hint", p -> { + try { + return p.parseItemValue(); + } catch (Exception e) { + throw new SystemException(e); + } + }, null); + + process("parseItemValue - AccessCertificationCaseType.class", p -> { + try { + return p.type(AccessCertificationCaseType.class).parseItemValue(); + } catch (Exception e) { + throw new SystemException(e); + } + }, null); + + process("parseItemValue - AccessCertificationAssignmentCaseType.class", p -> { + try { + return p.type(AccessCertificationAssignmentCaseType.class).parseItemValue(); + } catch (Exception e) { + throw new SystemException(e); + } + }, null); + + process("parseItemValue - AccessCertificationCaseType (QName)", p -> { + try { + return p.type(AccessCertificationCaseType.COMPLEX_TYPE).parseItemValue(); + } catch (Exception e) { + throw new SystemException(e); + } + }, null); + + process("parseItemValue - AccessCertificationAssignmentCaseType (QName)", p -> { + try { + return p.type(AccessCertificationAssignmentCaseType.COMPLEX_TYPE).parseItemValue(); + } catch (Exception e) { + throw new SystemException(e); + } + }, null); + + process("parseRealValue (AccessCertificationCaseType.class)", p -> { + try { + return p.parseRealValue(AccessCertificationCaseType.class).asPrismContainerValue(); + } catch (Exception e) { + throw new SystemException(e); + } + }, null); + + process("parseRealValue (AccessCertificationAssignmentCaseType.class)", p -> { + try { + return p.parseRealValue(AccessCertificationAssignmentCaseType.class).asPrismContainerValue(); + } catch (Exception e) { + throw new SystemException(e); + } + }, null); + + process("parseRealValue - AccessCertificationCaseType (QName)", p -> { + try { + return ((AccessCertificationCaseType) p.type(AccessCertificationCaseType.COMPLEX_TYPE).parseRealValue()).asPrismContainerValue(); + } catch (Exception e) { + throw new SystemException(e); + } + }, null); + + process("parseRealValue - AccessCertificationAssignmentCaseType (QName)", p -> { + try { + return ((AccessCertificationCaseType) p.type(AccessCertificationAssignmentCaseType.COMPLEX_TYPE).parseRealValue()).asPrismContainerValue(); + } catch (Exception e) { + throw new SystemException(e); + } + }, null); + + } + + private void process(String desc, + Function> parser, + Function, String> serializer) throws Exception { + PrismContext prismContext = PrismTestUtil.getPrismContext(); + + PrismContainerValue pcv = + parser.apply(prismContext.parserFor(getFile(CERTIFICATION_CASE_FILE_BASENAME))); + + System.out.println("Parsed certification case: " + desc); + System.out.println(pcv.debugDump()); + + assertCase(pcv); + + if (serializer != null) { + + String serialized = serializer.apply(pcv); + System.out.println("Serialized:\n" + serialized); + + PrismContainerValue reparsed = + parser.apply(prismContext.parserFor(serialized)); + + System.out.println("Reparsed: " + desc); + System.out.println(reparsed.debugDump()); + + assertCase(reparsed); + assertTrue("Values not equal", pcv.equals(reparsed)); + + Collection deltas = pcv.diff(reparsed); + assertTrue("Deltas not empty", deltas.isEmpty()); + } + } + + @Test + public void testParseRoundTrip() throws Exception{ + displayTestTitle("testParseRoundTrip"); + + // GIVEN + PrismContext prismContext = PrismTestUtil.getPrismContext(); + + // WHEN + PrismContainerValue pcv = + prismContext.parserFor(getFile(CERTIFICATION_CASE_FILE_BASENAME)) + .parseItemValue(); + // THEN + System.out.println("Parsed certification case:"); + System.out.println(pcv.debugDump()); + + String serialized = prismContext.serializerFor(language).serialize(pcv); + System.out.println("Serialized:\n" + serialized); + + // REPARSE + + // and some sanity checks + + } + + + void assertCase(PrismContainerValue pcv) throws SchemaException { + + //pcv.checkConsistence(); + assertPrismValue(pcv); + assertJaxb(pcv.asContainerable()); + + //pcv.checkConsistence(true, true); + } + + private void assertPrismValue(PrismContainerValue pcv) { + assertEquals("Wrong id", (Long) 4L, pcv.getId()); + ComplexTypeDefinition ctd = pcv.getComplexTypeDefinition(); + assertNotNull("No CTD", ctd); + //noinspection ConstantConditions + assertEquals("Wrong CTD typeName", AccessCertificationAssignmentCaseType.COMPLEX_TYPE, ctd.getTypeName()); + assertEquals("Wrong real class in PCV", AccessCertificationAssignmentCaseType.class, pcv.getRealClass()); + } + + private void assertJaxb(AccessCertificationCaseType aCase) throws SchemaException { + PrismAsserts.assertRefEquivalent("Wrong objectRef", + new PrismReferenceValue("ee53eba7-5c16-4c16-ad15-dd6a2360ab1a", UserType.COMPLEX_TYPE), + aCase.getObjectRef().asReferenceValue()); + PrismAsserts.assertRefEquivalent("Wrong targetRef", + new PrismReferenceValue("ef2bc95b-76e0-48e2-86d6-3d4f02d3e1a2", ResourceType.COMPLEX_TYPE), + aCase.getTargetRef().asReferenceValue()); + + assertTrue(aCase instanceof AccessCertificationAssignmentCaseType); + AccessCertificationAssignmentCaseType assignmentCase = (AccessCertificationAssignmentCaseType) aCase; + + assertNotNull("no assignment", assignmentCase.getAssignment()); + assertEquals((Long) 1L, assignmentCase.getAssignment().getId()); + PrismAsserts.assertRefEquivalent("Wrong resourceRef in assignment", + new PrismReferenceValue("ef2bc95b-76e0-48e2-86d6-3d4f02d3e1a2", ResourceType.COMPLEX_TYPE), + assignmentCase.getAssignment().getConstruction().getResourceRef().asReferenceValue()); + assertEquals("wrong isInducement", Boolean.FALSE, assignmentCase.isIsInducement()); + } + +} diff --git a/infra/schema/src/test/resources/common/xml/ns/certification-case-1.xml b/infra/schema/src/test/resources/common/xml/ns/certification-case-1.xml new file mode 100644 index 00000000000..79d5e7c066d --- /dev/null +++ b/infra/schema/src/test/resources/common/xml/ns/certification-case-1.xml @@ -0,0 +1,62 @@ + + + + + + 1 + + 2015-12-04T00:38:00.708+01:00 + 2015-12-18T23:59:59.999+01:00 + + 1 + + revoke + 2015-12-04T01:10:13.814+01:00 + + revoke + + + + + + + + ri:cn + + strong + + CN + + + + + ri:sn + + strong + + SN + + + + + + false + diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RAccessCertificationCase.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RAccessCertificationCase.java index c4f4572c573..216c07eebef 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RAccessCertificationCase.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RAccessCertificationCase.java @@ -33,6 +33,7 @@ import com.evolveum.midpoint.repo.sql.util.DtoTranslationException; import com.evolveum.midpoint.repo.sql.util.MidPointSingleTablePersister; import com.evolveum.midpoint.repo.sql.util.RUtil; +import com.evolveum.midpoint.schema.SchemaConstantsGenerated; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; @@ -395,10 +396,11 @@ private static RAccessCertificationCase toRepo(AccessCertificationCaseType case1 PrismContainerValue cvalue = case1.asPrismContainerValue(); String xml; try { - xml = prismContext.xmlSerializer().serialize(cvalue, new QName("value")); + xml = prismContext.xmlSerializer().serialize(cvalue, SchemaConstantsGenerated.C_VALUE); } catch (SchemaException e) { throw new IllegalStateException("Couldn't serialize certification case to string", e); } + LOGGER.trace("RAccessCertificationCase full object\n{}", xml); byte[] fullObject = RUtil.getByteArrayFromXml(xml, false); rCase.setFullObject(fullObject); @@ -412,6 +414,7 @@ public AccessCertificationCaseType toJAXB(PrismContext prismContext) throws Sche // TODO find appropriate name public static AccessCertificationCaseType createJaxb(byte[] fullObject, PrismContext prismContext, boolean removeCampaignRef) throws SchemaException { String xml = RUtil.getXmlFromByteArray(fullObject, false); + LOGGER.trace("RAccessCertificationCase full object to be parsed\n{}", xml); try { return prismContext.parserFor(xml).xml().compat().parseRealValue(AccessCertificationCaseType.class); } catch (SchemaException e) { diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/ObjectUpdater.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/ObjectUpdater.java index 68e0d07d18e..f7c7d9ddf15 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/ObjectUpdater.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/ObjectUpdater.java @@ -252,7 +252,7 @@ public void updateFullObject(RObject object, PrismObject< xml = prismContext.serializeObjectToString(savedObject, PrismContext.LANG_XML); byte[] fullObject = RUtil.getByteArrayFromXml(xml, getConfiguration().isUseZip()); - if (LOGGER.isTraceEnabled()) LOGGER.trace("Storing full object\n{}", xml); + LOGGER.trace("Storing full object\n{}", xml); object.setFullObject(fullObject); diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/util/RUtil.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/util/RUtil.java index fea48cd3ac6..fc902a4438c 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/util/RUtil.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/util/RUtil.java @@ -18,7 +18,6 @@ import com.evolveum.midpoint.prism.ItemDefinition; import com.evolveum.midpoint.prism.Objectable; -import com.evolveum.midpoint.prism.PrismContainerDefinition; import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.query.LogicalFilter; import com.evolveum.midpoint.prism.query.ObjectFilter; @@ -56,11 +55,9 @@ import org.hibernate.persister.entity.AbstractEntityPersister; import org.hibernate.tuple.IdentifierProperty; import org.hibernate.tuple.entity.EntityMetamodel; -import org.jetbrains.annotations.NotNull; import org.w3c.dom.Element; import javax.persistence.Table; -import javax.xml.bind.JAXBException; import javax.xml.namespace.QName; import java.io.ByteArrayInputStream; @@ -288,7 +285,7 @@ public static void copyResultFromJAXB(ItemDefinition parentDef, QName itemName, repo.setStatus(getRepoEnumValue(jaxb.getStatus(), ROperationResultStatus.class)); if (repo instanceof OperationResultFull) { try { - String full = prismContext.xmlSerializer().serializeAtomicValue(jaxb, itemName); + String full = prismContext.xmlSerializer().serializeRealValue(jaxb, itemName); ((OperationResultFull) repo).setFullResult(full); } catch (Exception ex) { throw new DtoTranslationException(ex.getMessage(), ex); From 0a0398d9ba3e15b24c6f25e18bb4622fcc6aa309 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Fri, 21 Oct 2016 15:01:31 +0200 Subject: [PATCH 47/74] Interim commit. --- ...CompositeRefinedObjectClassDefinition.java | 147 +++++++--------- .../LayerRefinedAttributeDefinitionImpl.java | 5 - ...LayerRefinedObjectClassDefinitionImpl.java | 19 -- .../RefinedObjectClassDefinition.java | 9 +- .../RefinedObjectClassDefinitionImpl.java | 22 ++- .../evolveum/midpoint/prism/Definition.java | 6 +- .../midpoint/prism/DefinitionImpl.java | 5 - .../midpoint/prism/marshaller/ItemInfo.java | 43 ++++- .../prism/marshaller/PrismParserImpl.java | 116 ++++++------ .../prism/marshaller/PrismUnmarshaller.java | 16 +- .../midpoint/prism/schema/SchemaRegistry.java | 13 ++ .../prism/schema/SchemaRegistryImpl.java | 24 +++ .../ObjectClassComplexTypeDefinition.java | 14 +- .../ObjectClassComplexTypeDefinitionImpl.java | 15 -- .../parser/TestParseCertificationCase.java | 166 ++++++++---------- infra/schema/testng-unit.xml | 1 + .../provisioning/impl/ShadowCache.java | 38 ++-- .../ucf/query/ValueOperation.java | 2 +- 18 files changed, 336 insertions(+), 325 deletions(-) diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/CompositeRefinedObjectClassDefinition.java b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/CompositeRefinedObjectClassDefinition.java index 3a01e3177f3..2912d0c733b 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/CompositeRefinedObjectClassDefinition.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/CompositeRefinedObjectClassDefinition.java @@ -17,7 +17,9 @@ import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.List; +import java.util.stream.Stream; import javax.xml.namespace.QName; @@ -31,8 +33,10 @@ import com.evolveum.midpoint.schema.processor.ResourceAttributeContainer; import com.evolveum.midpoint.schema.processor.ResourceAttributeContainerDefinition; import com.evolveum.midpoint.schema.processor.ResourceAttributeDefinition; +import com.evolveum.midpoint.schema.util.ObjectQueryUtil; import com.evolveum.midpoint.schema.util.SchemaDebugUtil; import com.evolveum.midpoint.util.DebugUtil; +import com.evolveum.midpoint.util.QNameUtil; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; import com.evolveum.midpoint.xml.ns._public.resource.capabilities_3.CapabilityType; @@ -50,6 +54,8 @@ public class CompositeRefinedObjectClassDefinition implements RefinedObjectClass @NotNull private final RefinedObjectClassDefinition structuralObjectClassDefinition; @NotNull private final Collection auxiliaryObjectClassDefinitions; + + private PrismObjectDefinition objectDefinition; public CompositeRefinedObjectClassDefinition(@NotNull RefinedObjectClassDefinition structuralObjectClassDefinition, Collection auxiliaryObjectClassDefinitions) { this.structuralObjectClassDefinition = structuralObjectClassDefinition; @@ -67,7 +73,15 @@ public RefinedObjectClassDefinition getStructuralObjectClassDefinition() { public Collection getAuxiliaryObjectClassDefinitions() { return auxiliaryObjectClassDefinitions; } - + + @Override + public PrismObjectDefinition getObjectDefinition() { + if (objectDefinition == null) { + objectDefinition = RefinedObjectClassDefinitionImpl.constructObjectDefinition(this); + } + return objectDefinition; + } + public Class getCompileTimeClass() { return structuralObjectClassDefinition.getCompileTimeClass(); } @@ -224,9 +238,6 @@ public ResourceType getResourceType() { return structuralObjectClassDefinition.getResourceType(); } - // Do NOT override getObjectDefinition(). It will work by itself. - // overriding it will just complicate things. - public ObjectClassComplexTypeDefinition getObjectClassDefinition() { return structuralObjectClassDefinition.getObjectClassDefinition(); } @@ -342,7 +353,7 @@ public void revive(PrismContext prismContext) { @Override public List getDefinitions() { - throw new UnsupportedOperationException("TODO implement getDefinitions() maybe as union of definitions from structural and aux OCs?"); + return (List) getAttributeDefinitions(); } @Override @@ -366,109 +377,51 @@ public List getIgnoredNamespaces() { return structuralObjectClassDefinition.getIgnoredNamespaces(); } - @Override - public ID findItemDefinition(@NotNull QName name) { - return null; - } - - @Override - public PrismPropertyDefinition findPropertyDefinition(@NotNull QName name) { - return null; - } @Override public LayerRefinedObjectClassDefinition forLayer(LayerType layerType) { - return null; + throw new UnsupportedOperationException("TODO implement if needed"); } + @SuppressWarnings("unchecked") @Override - public PrismContainerDefinition findContainerDefinition(@NotNull QName name) { - return null; - } - - @Override - public ID findItemDefinition(@NotNull QName name, @NotNull Class clazz) { - return null; - } - - @Override - public ResourceAttributeDefinition findAttributeDefinition(QName name, boolean caseInsensitive) { - return null; + public RefinedAttributeDefinition findAttributeDefinition(QName elementQName, boolean caseInsensitive) { + return (RefinedAttributeDefinition) findItemDefinition(elementQName, RefinedAttributeDefinition.class, caseInsensitive); } @Override public RefinedAssociationDefinition findAssociation(QName name) { - return null; + throw new UnsupportedOperationException("TODO implement if needed"); } @Override public RefinedAssociationDefinition findEntitlementAssociation(QName name) { - return null; - } - - @Override - public ResourceAttributeContainerDefinition toResourceAttributeContainerDefinition() { - return null; - } - - @Override - public ID findItemDefinition(@NotNull ItemPath path) { - return null; - } - - @Override - public ResourceAttributeContainerDefinition toResourceAttributeContainerDefinition(QName elementName) { - return null; - } - - @Override - public PrismPropertyDefinition findPropertyDefinition(@NotNull ItemPath path) { - return null; + throw new UnsupportedOperationException("TODO implement if needed"); } @Override public Collection getNamesOfAssociationsWithOutboundExpressions() { - return null; - } - - @Override - public ObjectQuery createShadowSearchQuery(String resourceOid) throws SchemaException { - return null; - } - - @Override - public PrismContainerDefinition findContainerDefinition(@NotNull ItemPath path) { - return null; + throw new UnsupportedOperationException("TODO implement if needed"); } @Override public boolean hasAuxiliaryObjectClass(QName expectedObjectClassName) { - return false; + throw new UnsupportedOperationException("TODO implement if needed"); } @Override public ResourceAttributeContainer instantiate(QName elementName) { - return null; + throw new UnsupportedOperationException("TODO implement if needed"); } @Override public ID findItemDefinition(@NotNull ItemPath path, @NotNull Class clazz) { - return null; + throw new UnsupportedOperationException("TODO implement if needed"); } @Override public void merge(ComplexTypeDefinition otherComplexTypeDef) { - - } - - @Override - public RefinedAttributeDefinition findAttributeDefinition(QName elementQName) { - return null; - } - - @Override - public RefinedAttributeDefinition findAttributeDefinition(String elementLocalname) { - return null; + throw new UnsupportedOperationException("TODO implement if needed"); } @Override @@ -476,26 +429,29 @@ public String getResourceNamespace() { return structuralObjectClassDefinition.getResourceNamespace(); } - @Override - public PrismObjectDefinition getObjectDefinition() { - return null; - } - @Override public SchemaRegistry getSchemaRegistry() { - return null; + return getPrismContext().getSchemaRegistry(); } + // TODO solve this code duplication somehow @Override public RefinedAttributeDefinition getAttributeDefinition(QName attributeName) { + for (RefinedAttributeDefinition attrDef : getAttributeDefinitions()) { + if (QNameUtil.match(attrDef.getName(), attributeName)) { + return attrDef; + } + } return null; } + // TODO @Override public Class getTypeClassIfKnown() { return null; } + // TODO @Override public Class getTypeClass() { return null; @@ -503,37 +459,52 @@ public Class getTypeClass() { @Override public boolean containsAttributeDefinition(ItemPathType pathType) { - return false; + return getDefinitionsStream() + .filter(def -> containsAttributeDefinition(pathType)) + .findAny() + .isPresent(); + } + + private Stream getDefinitionsStream() { + return Stream.concat(Stream.of(structuralObjectClassDefinition), auxiliaryObjectClassDefinitions.stream()); } @Override public boolean containsAttributeDefinition(QName attributeName) { - return false; + return getDefinitionsStream() + .filter(def -> containsAttributeDefinition(attributeName)) + .findAny() + .isPresent(); + } + + @Override + public ObjectQuery createShadowSearchQuery(String resourceOid) throws SchemaException { + return structuralObjectClassDefinition.createShadowSearchQuery(resourceOid); } @Override public PrismObject createBlankShadow() { - return null; + return structuralObjectClassDefinition.createBlankShadow(); } @Override public ResourceShadowDiscriminator getShadowDiscriminator() { - return null; + return structuralObjectClassDefinition.getShadowDiscriminator(); } @Override public Collection getNamesOfAttributesWithOutboundExpressions() { - return null; + throw new UnsupportedOperationException("TODO implement if needed"); } @Override public Collection getNamesOfAttributesWithInboundExpressions() { - return null; + throw new UnsupportedOperationException("TODO implement if needed"); } @Override public ResourcePasswordDefinitionType getPasswordDefinition() { - return null; + throw new UnsupportedOperationException("TODO implement if needed"); } @Override @@ -623,7 +594,7 @@ public String getHumanReadableName() { @Override public String toString() { - if (auxiliaryObjectClassDefinitions == null || auxiliaryObjectClassDefinitions.isEmpty()) { + if (auxiliaryObjectClassDefinitions.isEmpty()) { return getDebugDumpClassName() + " ("+getTypeName()+")"; } else { StringBuilder sb = new StringBuilder(); diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedAttributeDefinitionImpl.java b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedAttributeDefinitionImpl.java index efb56e02b74..641f463f877 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedAttributeDefinitionImpl.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedAttributeDefinitionImpl.java @@ -279,11 +279,6 @@ public PrismContext getPrismContext() { return refinedAttributeDefinition.getPrismContext(); } - @Override - public SchemaRegistry getSchemaRegistry() { - return refinedAttributeDefinition.getSchemaRegistry(); - } - @Override public Class getTypeClassIfKnown() { return refinedAttributeDefinition.getTypeClassIfKnown(); diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedObjectClassDefinitionImpl.java b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedObjectClassDefinitionImpl.java index 5a70d295144..14fe73fd0b5 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedObjectClassDefinitionImpl.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedObjectClassDefinitionImpl.java @@ -220,11 +220,6 @@ public PrismContext getPrismContext() { return refinedObjectClassDefinition.getPrismContext(); } - @Override - public SchemaRegistry getSchemaRegistry() { - return refinedObjectClassDefinition.getSchemaRegistry(); - } - @Override public ResourceAttributeContainer instantiate(QName name) { return refinedObjectClassDefinition.instantiate(name); @@ -425,25 +420,11 @@ public ResourceAttributeDefinition findAttributeDefinition(QName name, bo return refinedObjectClassDefinition.findAttributeDefinition(name, caseInsensitive); } - @Override - public ResourceAttributeContainerDefinition toResourceAttributeContainerDefinition() { - ResourceAttributeContainerDefinition resourceAttributeContainerDefinition = refinedObjectClassDefinition.toResourceAttributeContainerDefinition(); - ((ResourceAttributeContainerDefinitionImpl) resourceAttributeContainerDefinition).setComplexTypeDefinition(this); - return resourceAttributeContainerDefinition; - } - @Override public Collection getNamesOfAssociations() { return refinedObjectClassDefinition.getNamesOfAssociations(); } - @Override - public ResourceAttributeContainerDefinition toResourceAttributeContainerDefinition(QName elementName) { - ResourceAttributeContainerDefinition resourceAttributeContainerDefinition = refinedObjectClassDefinition.toResourceAttributeContainerDefinition(elementName); - ((ResourceAttributeContainerDefinitionImpl) resourceAttributeContainerDefinition).setComplexTypeDefinition(this); - return resourceAttributeContainerDefinition; - } - @Override public ResourceActivationDefinitionType getActivationSchemaHandling() { return refinedObjectClassDefinition.getActivationSchemaHandling(); diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedObjectClassDefinition.java b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedObjectClassDefinition.java index 4d7ebc95967..5698dec2845 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedObjectClassDefinition.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedObjectClassDefinition.java @@ -77,10 +77,15 @@ public interface RefinedObjectClassDefinition extends ObjectClassComplexTypeDefi Collection> getAllIdentifiers(); @Override - RefinedAttributeDefinition findAttributeDefinition(QName elementQName); + default RefinedAttributeDefinition findAttributeDefinition(QName elementQName) { + return findItemDefinition(elementQName, RefinedAttributeDefinition.class); + } @Override - RefinedAttributeDefinition findAttributeDefinition(String elementLocalname); + default RefinedAttributeDefinition findAttributeDefinition(String elementLocalname) { + QName elementQName = new QName(getResourceNamespace(), elementLocalname); + return findAttributeDefinition(elementQName); + } String getResourceNamespace(); diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedObjectClassDefinitionImpl.java b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedObjectClassDefinitionImpl.java index 1b29be35654..cfe3657335c 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedObjectClassDefinitionImpl.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedObjectClassDefinitionImpl.java @@ -361,11 +361,11 @@ private List> cloneDefinitions(Collection RefinedAttributeDefinition findAttributeDefinition(QName elementQName) { - return findItemDefinition(elementQName, RefinedAttributeDefinition.class); - } + public RefinedAttributeDefinition findAttributeDefinition(QName name) { + return findItemDefinition(name, RefinedAttributeDefinition.class); + } - @Override + @Override public RefinedAttributeDefinition findAttributeDefinition(String elementLocalname) { QName elementQName = new QName(getResourceNamespace(), elementLocalname); return findAttributeDefinition(elementQName); @@ -433,7 +433,7 @@ public ResourceType getResourceType() { @Override public PrismObjectDefinition getObjectDefinition() { if (objectDefinition == null) { - constructObjectDefinition(); + objectDefinition = constructObjectDefinition(this); } return objectDefinition; } @@ -447,14 +447,12 @@ public void setBaseContext(ResourceObjectReferenceType baseContext) { this.baseContext = baseContext; } - private void constructObjectDefinition() { + public static PrismObjectDefinition constructObjectDefinition(RefinedObjectClassDefinition refinedObjectClassDefinition) { // Almost-shallow clone of object definition and complex type - PrismObjectDefinition originalObjectDefinition = - getSchemaRegistry().findObjectDefinitionByCompileTimeClass(ShadowType.class); - PrismObjectDefinition refinedObjectDef = - originalObjectDefinition.cloneWithReplacedDefinition(ShadowType.F_ATTRIBUTES, - this.toResourceAttributeContainerDefinition()); - this.objectDefinition = refinedObjectDef; + PrismObjectDefinition originalObjectDefinition = + refinedObjectClassDefinition.getSchemaRegistry().findObjectDefinitionByCompileTimeClass(ShadowType.class); + return originalObjectDefinition.cloneWithReplacedDefinition(ShadowType.F_ATTRIBUTES, + refinedObjectClassDefinition.toResourceAttributeContainerDefinition()); } @Override diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/Definition.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/Definition.java index 9c0ee449925..7b145a9377c 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/Definition.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/Definition.java @@ -113,8 +113,12 @@ public interface Definition extends Serializable, DebugDumpable, Revivable { PrismContext getPrismContext(); - SchemaRegistry getSchemaRegistry(); + default SchemaRegistry getSchemaRegistry() { + PrismContext prismContext = getPrismContext(); + return prismContext != null ? prismContext.getSchemaRegistry() : null; + } + // TODO fix this! Class getTypeClassIfKnown(); Class getTypeClass(); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/DefinitionImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/DefinitionImpl.java index c7a60f6e32c..5f909ea62d2 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/DefinitionImpl.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/DefinitionImpl.java @@ -204,11 +204,6 @@ public PrismContext getPrismContext() { return prismContext; } - @Override - public SchemaRegistry getSchemaRegistry() { - return prismContext.getSchemaRegistry(); - } - @Override public Class getTypeClassIfKnown() { return XsdTypeMapper.toJavaTypeIfKnown(getTypeName()); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/ItemInfo.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/ItemInfo.java index 739c3a88772..238754e7381 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/ItemInfo.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/ItemInfo.java @@ -25,6 +25,8 @@ import javax.xml.namespace.QName; import java.util.List; +import static com.evolveum.midpoint.prism.schema.SchemaRegistry.ComparisonResult.EQUAL; + /** * @author mederly */ @@ -33,6 +35,9 @@ public class ItemInfo { private ID itemDefinition; private QName typeName; + /** + * This method is to be called ONLY on the root level, i.e. when unmarshalling starts. + */ @NotNull public static ItemInfo determine(ItemDefinition itemDefinitionExplicit, QName itemNameFromSource, QName itemNameExplicit, QName itemNameDefault, @@ -81,6 +86,29 @@ public static ItemInfo determine(ItemDefinition item // type name if (definition != null) { info.typeName = definition.getTypeName(); + } else if (typeNameExplicit == null && typeNameFromSource == null && classExplicit != null) { + info.typeName = schemaRegistry.determineTypeForClass(classExplicit); + if (info.typeName != null && info.itemName != null) { + // Create artificial definition. We do NOT mark it as dynamic, because it might come from client code-supplied + // information (i.e. not from the dynamic one). This might cause problems during serialization; but more probably + // not - the decision on putting explicit type declaration on the root level is not driven by the 'dynamic' flag. + // And this method is called only at the root level. + if (Objectable.class.isAssignableFrom(classExplicit)) { + throw new IllegalStateException("Prism object type " + info.typeName + " without definition"); + } else if (Containerable.class.isAssignableFrom(classExplicit)) { + @SuppressWarnings("unchecked") + Class containerableClass = (Class) classExplicit; + ComplexTypeDefinition ctd = schemaRegistry.findComplexTypeDefinitionByCompileTimeClass(containerableClass); + @SuppressWarnings("unchecked") + ID id = (ID) new PrismContainerDefinitionImpl<>(info.itemName, ctd, + schemaRegistry.getPrismContext(), containerableClass); + info.itemDefinition = id; + } else { + @SuppressWarnings("unchecked") + ID id = (ID) new PrismPropertyDefinitionImpl<>(info.itemName, info.typeName, schemaRegistry.getPrismContext()); + info.itemDefinition = id; + } + } } else if (typeNameExplicit == null) { info.typeName = typeNameFromSource; } else if (typeNameFromSource == null) { @@ -122,10 +150,21 @@ private static ID augmentWithItemName(ID definition, return definition; } ID defFromItemName = schemaRegistry.findItemDefinitionByElementName(itemName, definitionClass); - if (definition == null && defFromItemName != null) { + if (defFromItemName == null) { + return definition; + } + if (definition == null) { return defFromItemName; } - return definition; // we won't try to compare the definitions, as the item name indication is (very) weak in comparison with others + SchemaRegistry.ComparisonResult comparisonResult = schemaRegistry.compareDefinitions(definition, defFromItemName); + switch (comparisonResult) { + case EQUAL: return definition; // definition is generally considered 'at least as good' as the new one + case NO_STATIC_CLASS: return definition; // play safe, select original definition (item name is not very trustworthy source of information) + case INCOMPATIBLE: return definition; // TODO probably we should signal a problem + case FIRST_IS_CHILD: return definition; + case SECOND_IS_CHILD: return defFromItemName; + default: throw new AssertionError("Invalid result: " + comparisonResult); + } } private static ID augmentWithClass(ID definition, Class definitionClass, diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismParserImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismParserImpl.java index 3786a7a0c03..11b36d31c19 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismParserImpl.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismParserImpl.java @@ -134,6 +134,8 @@ public PrismParser type(Class typeClass) { //region Parsing methods ==================================================================================== + // interface + @NotNull PrismObject doParse() throws SchemaException, IOException { RootXNode xnode = getLexicalProcessor().read(source, context); @@ -142,34 +144,12 @@ PrismObject doParse() throws SchemaException, IOExcept Item doParseItem() throws IOException, SchemaException { RootXNode xnode = getLexicalProcessor().read(source, context); - return doParseItem(xnode); - } - - @SuppressWarnings("unchecked") - private Item doParseItem(RootXNode xnode) throws IOException, SchemaException { - return (Item) prismContext.getPrismUnmarshaller().parseItem(xnode, itemDefinition, itemName, typeName, typeClass, context); + return doParseItem(xnode, typeClass); } IV doParseItemValue() throws IOException, SchemaException { RootXNode root = getLexicalProcessor().read(source, context); - return doParseItemValue(root); - } - - private IV doParseItemValue(RootXNode root) throws IOException, SchemaException { - Item item = doParseItem(root); - return getSingleValue(item); - } - - @Nullable - private IV getSingleValue(Item item) { - if (item.isEmpty()) { - return null; - } else if (item.size() == 1) { - return item.getValues().get(0); - } else { - throw new IllegalStateException("Expected one item value, got " + item.getValues().size() - + " while parsing " + item); - } + return doParseItemValue(root, typeClass); } T doParseRealValue(Class clazz) throws IOException, SchemaException { @@ -177,35 +157,6 @@ T doParseRealValue(Class clazz) throws IOException, SchemaException { return doParseRealValue(clazz, root); } - @SuppressWarnings("unchecked") - private T doParseRealValue(Class clazz, RootXNode root) throws IOException, SchemaException { - if (clazz == null) { - ItemInfo info = ItemInfo.determine(itemDefinition, root.getRootElementName(), itemName, null, - root.getTypeQName(), typeName, null, ItemDefinition.class, context, prismContext.getSchemaRegistry()); - if (info.getItemDefinition() instanceof PrismContainerDefinition) { - clazz = ((PrismContainerDefinition) info.getItemDefinition()).getCompileTimeClass(); - } - if (clazz == null && info.getTypeName() != null) { - clazz = (Class) prismContext.getSchemaRegistry().determineClassForType(info.getTypeName()); - } - } - - if (clazz != null && getBeanConverter().canProcess(clazz)) { - return getBeanConverter().unmarshall(root, clazz, context); - } else { - PrismValue prismValue = doParseItemValue(root); - if (prismValue == null) { - return null; - } else { - return prismValue.getRealValue(); - } - } - } - - private PrismBeanConverter getBeanConverter() { - return prismContext.getBeanConverter(); - } - @SuppressWarnings("unchecked") T doParseRealValue() throws IOException, SchemaException { return (T) doParseRealValue(typeClass); @@ -214,7 +165,7 @@ T doParseRealValue() throws IOException, SchemaException { @SuppressWarnings("unchecked") JAXBElement doParseAnyValueAsJAXBElement() throws IOException, SchemaException { RootXNode root = getLexicalProcessor().read(source, context); - T real = (T) doParseRealValue(null, root); + T real = doParseRealValue(null, root); return real != null ? new JAXBElement<>(root.getRootElementName(), (Class) real.getClass(), real) : null; @@ -244,6 +195,63 @@ Object doParseItemOrRealValue() throws IOException, SchemaException { return prismContext.getPrismUnmarshaller().parseItemOrRealValue(xnode, context); } + // implementation + + @SuppressWarnings("unchecked") + private Item doParseItem(RootXNode xnode, Class clazz) throws IOException, SchemaException { + return (Item) prismContext.getPrismUnmarshaller().parseItem(xnode, itemDefinition, itemName, typeName, clazz, context); + } + + private IV doParseItemValue(RootXNode root, Class clazz) throws IOException, SchemaException { + Item item = doParseItem(root, clazz); + return getSingleParentlessValue(item); + } + + @Nullable + private IV getSingleParentlessValue(Item item) { + if (item.isEmpty()) { + return null; + } else if (item.size() == 1) { + IV value = item.getValues().get(0); + value.setParent(null); + return value; + } else { + throw new IllegalStateException("Expected one item value, got " + item.getValues().size() + + " while parsing " + item); + } + } + + @SuppressWarnings("unchecked") + private T doParseRealValue(Class clazz, RootXNode root) throws IOException, SchemaException { + if (clazz == null) { + ItemInfo info = ItemInfo.determine(itemDefinition, root.getRootElementName(), itemName, null, + root.getTypeQName(), typeName, null, ItemDefinition.class, context, prismContext.getSchemaRegistry()); + if (info.getItemDefinition() instanceof PrismContainerDefinition) { + clazz = ((PrismContainerDefinition) info.getItemDefinition()).getCompileTimeClass(); + } + if (clazz == null && info.getTypeName() != null) { + clazz = (Class) prismContext.getSchemaRegistry().determineClassForType(info.getTypeName()); + } + } + + // although bean unmarshaller can process containerables as well, prism unmarshaller is better at it + if (clazz != null && !Containerable.class.isAssignableFrom(clazz) && getBeanConverter().canProcess(clazz)) { + return getBeanConverter().unmarshall(root, clazz, context); + } else { + PrismValue prismValue = doParseItemValue(root, clazz); + if (prismValue == null) { + return null; + } else { + return prismValue.getRealValue(); + } + } + } + + private PrismBeanConverter getBeanConverter() { + return prismContext.getBeanConverter(); + } + + @NotNull private LexicalProcessor getLexicalProcessor() throws IOException { if (language != null) { diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismUnmarshaller.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismUnmarshaller.java index 0fcd3ca4c83..3f37f9d0765 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismUnmarshaller.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismUnmarshaller.java @@ -19,13 +19,11 @@ import java.util.Map.Entry; import javax.xml.XMLConstants; -import javax.xml.bind.JAXBElement; import javax.xml.namespace.QName; import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.schema.PrismSchema; import com.evolveum.midpoint.prism.schema.SchemaRegistry; -import com.evolveum.midpoint.prism.util.RawTypeUtil; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.prism.xml.ns._public.query_3.SearchFilterType; @@ -129,12 +127,24 @@ Object parseItemOrRealValue(@NotNull RootXNode root, ParsingContext pc) throws S //region Private methods ======================================================== - + // typeName is to be used ONLY if itemDefinition == null. + // + // The situation of itemDefinition == null && typeName != null is allowed ONLY if the definition simply cannot be derived + // from the typeName. E.g. if typeName is like xsd:string, xsd:boolean, etc. This rule is because we don't want to repeatedly + // try to look for missing definitions here. + // + // Moreover, the caller is responsible for extracting information from node.typeQName - providing a definition if necessary. @SuppressWarnings("unchecked") @NotNull private Item parseItemInternal(@NotNull XNode node, @NotNull QName itemName, ItemDefinition itemDefinition, @NotNull ParsingContext pc) throws SchemaException { Validate.isTrue(!(node instanceof RootXNode)); + + if (itemDefinition == null && node.getTypeQName() != null) { + throw new IllegalStateException("Node has an explicit type but parseItemInternal was called " + + "without definition or type name: " + node.debugDump()); + } + if (itemDefinition == null || itemDefinition instanceof PrismPropertyDefinition) { return parseProperty(node, itemName, (PrismPropertyDefinition) itemDefinition, pc); } else if (itemDefinition instanceof PrismContainerDefinition) { // also objects go here diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistry.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistry.java index f336c4f549a..6a2e150549c 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistry.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistry.java @@ -144,5 +144,18 @@ T findItemDefinitionByFullPath(Class ID selectMoreSpecific(ID def1, ID def2) throws SchemaException; + enum ComparisonResult { + EQUAL, // types are equal + NO_STATIC_CLASS, // static class cannot be determined + FIRST_IS_CHILD, // first definition is a child (strict subtype) of the second + SECOND_IS_CHILD, // second definition is a child (strict subtype) of the first + INCOMPATIBLE // first and second are incompatible + } + /** + * @return null means we cannot decide (types are different, and no compile time class for def1 and/or def2) + */ + ComparisonResult compareDefinitions(ID def1, ID def2) + throws SchemaException; + boolean isAssignableFrom(QName superType, QName subType); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistryImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistryImpl.java index 224129c4bd4..6a2310a4c18 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistryImpl.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistryImpl.java @@ -1254,6 +1254,30 @@ public ID selectMoreSpecific(ID def1, ID def2) + " (" + cls1 + ") and " + def2.getTypeName() + " (" + cls2 + ")"); } + @Override + public ComparisonResult compareDefinitions(@NotNull ID def1, @NotNull ID def2) + throws SchemaException { + if (QNameUtil.match(def1.getTypeName(), def2.getTypeName())) { + return ComparisonResult.EQUAL; + } + Class cls1 = determineClassForItemDefinition(def1); + Class cls2 = determineClassForItemDefinition(def2); + if (cls1 == null || cls2 == null) { + return ComparisonResult.NO_STATIC_CLASS; + } + boolean cls1AboveOrEqualCls2 = cls1.isAssignableFrom(cls2); + boolean cls2AboveOrEqualCls1 = cls2.isAssignableFrom(cls1); + if (cls1AboveOrEqualCls2 && cls2AboveOrEqualCls1) { + return ComparisonResult.EQUAL; + } else if (cls1AboveOrEqualCls2) { + return ComparisonResult.SECOND_IS_CHILD; + } else if (cls2AboveOrEqualCls1) { + return ComparisonResult.FIRST_IS_CHILD; + } else { + return ComparisonResult.INCOMPATIBLE; + } + } + @Override public boolean isAssignableFrom(@NotNull QName superType, @NotNull QName subType) { if (QNameUtil.match(superType, subType)) { diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ObjectClassComplexTypeDefinition.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ObjectClassComplexTypeDefinition.java index 0b57dce2462..a80f81d3afa 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ObjectClassComplexTypeDefinition.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ObjectClassComplexTypeDefinition.java @@ -19,8 +19,10 @@ import com.evolveum.midpoint.prism.ComplexTypeDefinition; import com.evolveum.midpoint.prism.Definition; import com.evolveum.midpoint.prism.query.ObjectQuery; +import com.evolveum.midpoint.schema.util.ObjectQueryUtil; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowKindType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; import javax.xml.namespace.QName; import java.util.Collection; @@ -63,11 +65,17 @@ public interface ObjectClassComplexTypeDefinition extends ComplexTypeDefinition ResourceAttributeDefinition findAttributeDefinition(String name); - ResourceAttributeContainerDefinition toResourceAttributeContainerDefinition(); + default ResourceAttributeContainerDefinition toResourceAttributeContainerDefinition() { + return toResourceAttributeContainerDefinition(ShadowType.F_ATTRIBUTES); + } - ResourceAttributeContainerDefinition toResourceAttributeContainerDefinition(QName elementName); + default ResourceAttributeContainerDefinition toResourceAttributeContainerDefinition(QName elementName) { + return new ResourceAttributeContainerDefinitionImpl(elementName, this, getPrismContext()); + } - ObjectQuery createShadowSearchQuery(String resourceOid) throws SchemaException; + default ObjectQuery createShadowSearchQuery(String resourceOid) throws SchemaException { + return ObjectQueryUtil.createResourceAndObjectClassQuery(resourceOid, getTypeName(), getPrismContext()); + } ResourceAttributeContainer instantiate(QName elementName); diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ObjectClassComplexTypeDefinitionImpl.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ObjectClassComplexTypeDefinitionImpl.java index ec4516aaf74..7ee9fb31f66 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ObjectClassComplexTypeDefinitionImpl.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ObjectClassComplexTypeDefinitionImpl.java @@ -349,21 +349,6 @@ public ResourceAttributeDefinition createAttributeDefinition(String local return createAttributeDefinition(name,typeName); } - @Override - public ResourceAttributeContainerDefinition toResourceAttributeContainerDefinition() { - return toResourceAttributeContainerDefinition(ShadowType.F_ATTRIBUTES); - } - - @Override - public ResourceAttributeContainerDefinition toResourceAttributeContainerDefinition(QName elementName) { - return new ResourceAttributeContainerDefinitionImpl(elementName, this, getPrismContext()); - } - - @Override - public ObjectQuery createShadowSearchQuery(String resourceOid) throws SchemaException { - return ObjectQueryUtil.createResourceAndObjectClassQuery(resourceOid, getTypeName(), prismContext); - } - /** * This may not be really "clean" as it actually does two steps instead of one. But it is useful. */ diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/TestParseCertificationCase.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/TestParseCertificationCase.java index fd44de4ea79..8b89d8ba2fa 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/TestParseCertificationCase.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/TestParseCertificationCase.java @@ -19,17 +19,16 @@ import com.evolveum.midpoint.prism.delta.ItemDelta; import com.evolveum.midpoint.prism.util.PrismAsserts; import com.evolveum.midpoint.prism.util.PrismTestUtil; +import com.evolveum.midpoint.schema.SchemaConstantsGenerated; import com.evolveum.midpoint.util.exception.SchemaException; -import com.evolveum.midpoint.util.exception.SystemException; import com.evolveum.midpoint.xml.ns._public.common.common_3.AccessCertificationAssignmentCaseType; import com.evolveum.midpoint.xml.ns._public.common.common_3.AccessCertificationCaseType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType; import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; import org.testng.annotations.Test; -import java.io.IOException; +import javax.xml.namespace.QName; import java.util.Collection; -import java.util.function.Function; import static com.evolveum.midpoint.schema.TestConstants.CERTIFICATION_CASE_FILE_BASENAME; import static org.testng.AssertJUnit.*; @@ -38,90 +37,29 @@ * @author semancik * */ +@SuppressWarnings("Convert2MethodRef") public class TestParseCertificationCase extends AbstractParserTest { + @FunctionalInterface + interface ParsingFunction { + PrismContainerValue apply(PrismParser prismParser) throws Exception; + } + + @FunctionalInterface + interface SerializingFunction { + String apply(PrismContainerValue value) throws Exception; + } + @Test public void testParseFile() throws Exception { displayTestTitle("testParseFile"); - - process("parseItemValue - no hint", p -> { - try { - return p.parseItemValue(); - } catch (Exception e) { - throw new SystemException(e); - } - }, null); - - process("parseItemValue - AccessCertificationCaseType.class", p -> { - try { - return p.type(AccessCertificationCaseType.class).parseItemValue(); - } catch (Exception e) { - throw new SystemException(e); - } - }, null); - - process("parseItemValue - AccessCertificationAssignmentCaseType.class", p -> { - try { - return p.type(AccessCertificationAssignmentCaseType.class).parseItemValue(); - } catch (Exception e) { - throw new SystemException(e); - } - }, null); - - process("parseItemValue - AccessCertificationCaseType (QName)", p -> { - try { - return p.type(AccessCertificationCaseType.COMPLEX_TYPE).parseItemValue(); - } catch (Exception e) { - throw new SystemException(e); - } - }, null); - - process("parseItemValue - AccessCertificationAssignmentCaseType (QName)", p -> { - try { - return p.type(AccessCertificationAssignmentCaseType.COMPLEX_TYPE).parseItemValue(); - } catch (Exception e) { - throw new SystemException(e); - } - }, null); - - process("parseRealValue (AccessCertificationCaseType.class)", p -> { - try { - return p.parseRealValue(AccessCertificationCaseType.class).asPrismContainerValue(); - } catch (Exception e) { - throw new SystemException(e); - } - }, null); - - process("parseRealValue (AccessCertificationAssignmentCaseType.class)", p -> { - try { - return p.parseRealValue(AccessCertificationAssignmentCaseType.class).asPrismContainerValue(); - } catch (Exception e) { - throw new SystemException(e); - } - }, null); - - process("parseRealValue - AccessCertificationCaseType (QName)", p -> { - try { - return ((AccessCertificationCaseType) p.type(AccessCertificationCaseType.COMPLEX_TYPE).parseRealValue()).asPrismContainerValue(); - } catch (Exception e) { - throw new SystemException(e); - } - }, null); - - process("parseRealValue - AccessCertificationAssignmentCaseType (QName)", p -> { - try { - return ((AccessCertificationCaseType) p.type(AccessCertificationAssignmentCaseType.COMPLEX_TYPE).parseRealValue()).asPrismContainerValue(); - } catch (Exception e) { - throw new SystemException(e); - } - }, null); - + processParsings(null, null); } - private void process(String desc, - Function> parser, - Function, String> serializer) throws Exception { - PrismContext prismContext = PrismTestUtil.getPrismContext(); + private void process(String desc, ParsingFunction parser, SerializingFunction serializer, String serId) throws Exception { + PrismContext prismContext = getPrismContext(); + + System.out.println("================== Starting test for '" + desc + "' (serializer: " + serId + ") =================="); PrismContainerValue pcv = parser.apply(prismContext.parserFor(getFile(CERTIFICATION_CASE_FILE_BASENAME))); @@ -154,27 +92,65 @@ private void process(String desc, public void testParseRoundTrip() throws Exception{ displayTestTitle("testParseRoundTrip"); - // GIVEN - PrismContext prismContext = PrismTestUtil.getPrismContext(); + //processParsings(v -> getPrismContext().serializerFor(language).serialize(v)); // no item name nor definition => cannot serialize + processParsings(v -> getPrismContext().serializerFor(language).root(new QName("dummy")).serialize(v), "s1"); + processParsings(v -> getPrismContext().serializerFor(language).root(SchemaConstantsGenerated.C_USER).serialize(v), "s2"); // misleading item name + processParsings(v -> getPrismContext().serializerFor(language).serializeRealValue(v.asContainerable()), "s3"); + processParsings(v -> getPrismContext().serializerFor(language).root(new QName("dummy")).serializeAnyData(v.asContainerable()), "s4"); + } - // WHEN - PrismContainerValue pcv = - prismContext.parserFor(getFile(CERTIFICATION_CASE_FILE_BASENAME)) - .parseItemValue(); - // THEN - System.out.println("Parsed certification case:"); - System.out.println(pcv.debugDump()); + private void processParsings(SerializingFunction serializer, String serId) throws Exception { + process("parseItemValue - no hint", p -> p.parseItemValue(), serializer, serId); - String serialized = prismContext.serializerFor(language).serialize(pcv); - System.out.println("Serialized:\n" + serialized); + process("parseItemValue - AccessCertificationCaseType.class", + p -> p.type(AccessCertificationCaseType.class).parseItemValue(), + serializer, serId); - // REPARSE + process("parseItemValue - AccessCertificationAssignmentCaseType.class", + p -> p.type(AccessCertificationAssignmentCaseType.class).parseItemValue(), + serializer, serId); - // and some sanity checks - + process("parseItemValue - AccessCertificationCaseType (QName)", + p -> p.type(AccessCertificationCaseType.COMPLEX_TYPE).parseItemValue(), + serializer, serId); + + process("parseItemValue - AccessCertificationAssignmentCaseType (QName)", + p -> p.type(AccessCertificationAssignmentCaseType.COMPLEX_TYPE).parseItemValue(), + serializer, serId); + + process("parseRealValue - no hint", + p -> ((AccessCertificationCaseType) p.parseRealValue()).asPrismContainerValue(), + serializer, serId); + + process("parseRealValue (AccessCertificationCaseType.class)", + p -> p.parseRealValue(AccessCertificationCaseType.class).asPrismContainerValue(), + serializer, serId); + + process("parseRealValue (AccessCertificationAssignmentCaseType.class)", + p -> p.parseRealValue(AccessCertificationAssignmentCaseType.class).asPrismContainerValue(), + serializer, serId); + + process("parseRealValue - AccessCertificationCaseType (QName)", + p -> ((AccessCertificationCaseType) + p.type(AccessCertificationCaseType.COMPLEX_TYPE).parseRealValue()) + .asPrismContainerValue(), + serializer, serId); + + process("parseRealValue - AccessCertificationAssignmentCaseType (QName)", + p -> ((AccessCertificationCaseType) + p.type(AccessCertificationAssignmentCaseType.COMPLEX_TYPE).parseRealValue()) + .asPrismContainerValue(), + serializer, serId); + + process("parseAnyData", + p -> ((PrismContainer) p.parseItemOrRealValue()).getValue(0), + serializer, serId); + } + + private PrismContext getPrismContext() { + return PrismTestUtil.getPrismContext(); } - void assertCase(PrismContainerValue pcv) throws SchemaException { //pcv.checkConsistence(); diff --git a/infra/schema/testng-unit.xml b/infra/schema/testng-unit.xml index 4ee5894195c..4d4e0645c74 100644 --- a/infra/schema/testng-unit.xml +++ b/infra/schema/testng-unit.xml @@ -23,6 +23,7 @@ + diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowCache.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowCache.java index c1db5e0d61b..875307f3d34 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowCache.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowCache.java @@ -626,25 +626,23 @@ private void applyDefinition(final ProvisioningContext ctx, final ObjectQuery qu } final RefinedObjectClassDefinition objectClassDefinition = ctx.getObjectClassDefinition(); final ItemPath attributesPath = new ItemPath(ShadowType.F_ATTRIBUTES); - com.evolveum.midpoint.prism.query.Visitor visitor = new com.evolveum.midpoint.prism.query.Visitor() { - @Override - public void visit(ObjectFilter filter) { - if (filter instanceof PropertyValueFilter) { - PropertyValueFilter valueFilter = (PropertyValueFilter) filter; - ItemDefinition definition = valueFilter.getDefinition(); - if (definition == null) { - if (attributesPath.equivalent(valueFilter.getParentPath())) { - QName attributeName = valueFilter.getElementName(); - ResourceAttributeDefinition attributeDefinition = objectClassDefinition - .findAttributeDefinition(attributeName); - if (attributeDefinition == null) { - throw new TunnelException(new SchemaException("No definition for attribute " - + attributeName + " in query " + query)); - } - valueFilter.setDefinition(attributeDefinition); - } - } + com.evolveum.midpoint.prism.query.Visitor visitor = subfilter -> { + if (subfilter instanceof PropertyValueFilter) { + PropertyValueFilter valueFilter = (PropertyValueFilter) subfilter; + ItemDefinition definition = valueFilter.getDefinition(); + if (definition instanceof ResourceAttributeDefinition) { + return; // already has a resource-related definition + } + if (!attributesPath.equivalent(valueFilter.getParentPath())) { + return; + } + QName attributeName = valueFilter.getElementName(); + ResourceAttributeDefinition attributeDefinition = objectClassDefinition.findAttributeDefinition(attributeName); + if (attributeDefinition == null) { + throw new TunnelException(new SchemaException("No definition for attribute " + + attributeName + " in query " + query)); } + valueFilter.setDefinition(attributeDefinition); } }; try { @@ -881,7 +879,7 @@ private List createAttributeQueryInternal(List createAttributeQueryInternal(List Filter interpret(ObjectFilter objectFilter, IcfNameMapper icfNameMapp OperationResult parentResult = new OperationResult("interpret"); ValueFilter valueFilter= (ValueFilter) objectFilter; - if (valueFilter.getParentPath() == null || valueFilter.getParentPath().isEmpty()) { + if (valueFilter.getParentPath().isEmpty()) { throw new UnsupportedOperationException("Empty path is not supported (filter: " + objectFilter+")"); } if (valueFilter.getParentPath().equivalent(new ItemPath(ShadowType.F_ATTRIBUTES))) { From 5eb3afa6df8e17ebbbf19df94cd0166e48e1ce27 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Fri, 21 Oct 2016 20:09:51 +0200 Subject: [PATCH 48/74] Interim commit. --- .../evolveum/midpoint/prism/Checkable.java | 9 +++ .../evolveum/midpoint/prism/Definition.java | 66 +++++++++++++++---- .../midpoint/prism/DefinitionImpl.java | 1 + .../prism/marshaller/PrismBeanConverter.java | 4 -- 4 files changed, 65 insertions(+), 15 deletions(-) create mode 100644 infra/prism/src/main/java/com/evolveum/midpoint/prism/Checkable.java diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/Checkable.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/Checkable.java new file mode 100644 index 00000000000..1e3b083b58a --- /dev/null +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/Checkable.java @@ -0,0 +1,9 @@ +package com.evolveum.midpoint.prism; + +/** + * @author mederly + */ +public interface Checkable { + + void checkConsistence(); +} diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/Definition.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/Definition.java index 7b145a9377c..f4a1cdfca18 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/Definition.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/Definition.java @@ -31,13 +31,66 @@ public interface Definition extends Serializable, DebugDumpable, Revivable { /** * Returns a name of the type for this definition. * - * In XML representation that corresponds to the name of the XSD type. + * The type can be part of the compile-time schema or it can be defined at run time. * - * @return the typeName + * Examples of the former case are types like c:UserType, xsd:string, or even flexible + * ones like c:ExtensionType or c:ShadowAttributesType. + * + * Examples of the latter case are types used in + * - custom extensions, like ext:LocationsType (where ext = e.g. http://example.com/extension), + * - resource schema, like ri:inetOrgPerson (ri = http://.../resource/instance-3), + * - connector schema, like TODO + * + * In XML representation that corresponds to the name of the XSD type. Although beware, the + * run-time types do not have statically defined structure. And the resource and connector-related + * types may even represent different kinds of objects within different contexts (e.g. two + * distinct resources both with ri:AccountObjectClass types). + * + * Also note that for complex type definitions, the type name serves as a unique identifier. + * On the other hand, for item definitions, it is just one of its attributes; primary key + * is item name in that case. + * + * The type name should be fully qualified. (TODO reconsider this) + * + * @return the type name */ @NotNull QName getTypeName(); + /** + * This means that the entities described by this schema (items, complex types) or their content + * is not defined by fixed (compile-time) schema. I.e. it is known only at run time. + * + * Some examples for "false" value: + * - c:user, c:UserType - statically defined type with statically defined content. + * + * Some examples for "true" value: + * - c:extension, c:ExtensionType - although the entity itself (item, type) are defined in + * the static schema, their content is not known at compile time; + * - c:attributes, c:ShadowAttributeType - the same as extension/ExtensionType; + * - ext:weapon (of type xsd:string) - even if the content is statically defined, + * the definition of the item itself is not known at compile time; + * - ri:inetOrgPerson, ext:LocationsType, ext:locations - both the entity + * and their content are known at run time only. + * + * TODO clarify the third point; provide some tests for the 3rd and 4th point + */ + boolean isRuntimeSchema(); + + /** + * Item definition that has this flag set should be ignored by any processing. + * The ignored item is still part of the schema. Item instances may appear in + * the serialized data formats (e.g. XML) or data store and the parser should + * not raise an error if it encounters them. But any high-level processing code + * should ignore presence of this item. E.g. it should not be displayed to the user, + * should not be present in transformed data structures, etc. + * + * Note that the same item can be ignored at higher layer (e.g. presentation) + * but not ignored at lower layer (e.g. model). This works by presenting different + * item definitions for these layers (see LayerRefinedAttributeDefinition). + * + * Semantics of this flag for complex type definitions is to be defined yet. + */ boolean isIgnored(); boolean isAbstract(); @@ -101,15 +154,6 @@ public interface Definition extends Serializable, DebugDumpable, Revivable { */ String getDocumentationPreview(); - /** - * This means that the item container is not defined by fixed (compile-time) schema. - * This in fact means that we need to use getAny in a JAXB types. It does not influence the - * processing of DOM that much, as that does not really depend on compile-time/run-time distinction. - * - * For containers, this flag is true if there's no complex type definition or if the definition is - * of type "xsd:any". - */ - boolean isRuntimeSchema(); PrismContext getPrismContext(); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/DefinitionImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/DefinitionImpl.java index 5f909ea62d2..fe6bf1afa88 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/DefinitionImpl.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/DefinitionImpl.java @@ -86,6 +86,7 @@ public abstract class DefinitionImpl implements Definition { this.prismContext = prismContext; } + @Override @NotNull public QName getTypeName() { diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismBeanConverter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismBeanConverter.java index d17ec4c063a..6acb8ca4349 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismBeanConverter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismBeanConverter.java @@ -91,10 +91,6 @@ public PrismContext getPrismContext() { return prismContext; } -// public void setPrismContext(PrismContext prismContext) { -// this.prismContext = prismContext; -// } - private SchemaRegistry getSchemaRegistry() { return prismContext.getSchemaRegistry(); } From 45d2230c2bf8b9c3427edf4f1eafbfb8ce092f2c Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Sat, 22 Oct 2016 02:18:19 +0200 Subject: [PATCH 49/74] More sophisticated parsing tests. asContainerable() applies definitions when called first time. Various other fixes. --- .../midpoint/prism/PrismContainer.java | 2 +- .../midpoint/prism/PrismContainerValue.java | 41 +++-- .../evolveum/midpoint/prism/PrismParser.java | 2 + .../midpoint/prism/marshaller/ItemInfo.java | 5 +- .../prism/marshaller/PrismParserImpl.java | 4 + .../prism/marshaller/PrismSerializerImpl.java | 9 +- .../prism/marshaller/QueryConvertor.java | 2 +- .../midpoint/prism/query/ValueFilter.java | 97 ++++++----- .../midpoint/schema/TestQueryConvertor.java | 30 ++++ .../parser/AbstractObjectParserTest.java | 108 ++++++++++++ .../schema/parser/AbstractParserTest.java | 154 ++++++++++++++++- .../parser/TestParseCertificationCase.java | 113 ++----------- .../schema/parser/TestParseResource.java | 30 +++- .../schema/parser/TestParseShadow.java | 128 +++++++------- .../midpoint/schema/parser/TestParseUser.java | 156 +++++++----------- ...t-by-attributes-and-resource-ref-no-ns.xml | 32 ++++ 16 files changed, 589 insertions(+), 324 deletions(-) create mode 100644 infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/AbstractObjectParserTest.java create mode 100644 infra/schema/src/test/resources/queryconvertor/filter-account-by-attributes-and-resource-ref-no-ns.xml diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainer.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainer.java index e39084a3f0b..cadebf4dfb2 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainer.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainer.java @@ -263,7 +263,7 @@ public void add(Item item) throws SchemaException { public PrismContainerValue createNewValue() { checkMutability(); - PrismContainerValue pValue = new PrismContainerValue(prismContext); + PrismContainerValue pValue = new PrismContainerValue<>(prismContext); try { // No need to check uniqueness, we know that this value is new and therefore // it will change anyway and therefore the check is pointless. diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerValue.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerValue.java index 8f0c955a50e..fe934e2cc30 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerValue.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerValue.java @@ -58,23 +58,35 @@ public class PrismContainerValue extends PrismValue imp // Definition of this value. Usually it is the same as CTD declared in the parent container. // However, in order to support polymorphism (as well as parent-less values) we distinguish between PC and PCV type definition. - // It can be lazily evaluated based on containerable value. private ComplexTypeDefinition complexTypeDefinition = null; public PrismContainerValue() { } public PrismContainerValue(C containerable) { - this(containerable, null); + this(containerable, null, null); } public PrismContainerValue(PrismContext prismContext) { - this(null, prismContext); + this(null, null, prismContext); + } + + public PrismContainerValue(ComplexTypeDefinition complexTypeDefinition, PrismContext prismContext) { + this(null, complexTypeDefinition, prismContext); } public PrismContainerValue(C containerable, PrismContext prismContext) { + this(containerable, null, prismContext); + } + + public PrismContainerValue(C containerable, ComplexTypeDefinition complexTypeDefinition, PrismContext prismContext) { + super(prismContext); this.containerable = containerable; - this.prismContext = prismContext; + this.complexTypeDefinition = complexTypeDefinition; + + if (complexTypeDefinition == null && prismContext != null) { + getComplexTypeDefinition(); // to determine CTD + } } public PrismContainerValue(OriginType type, Objectable source, PrismContainerable container, Long id, ComplexTypeDefinition complexTypeDefinition, PrismContext prismContext) { @@ -268,7 +280,11 @@ private C asContainerableInternal(Class clazz) { throw new SystemException("Can't create instance of class '" + clazz.getSimpleName() + "', it's abstract."); } try { - containerable = clazz.newInstance(); + if (prismContext != null) { + containerable = clazz.getConstructor(PrismContext.class).newInstance(prismContext); + } else { + containerable = clazz.newInstance(); + } containerable.setupContainerValue(this); return containerable; } catch (SystemException ex) { @@ -1060,14 +1076,12 @@ public void applyDefinition(ItemDefinition definition, boolean force) throws Sch public void applyDefinition(@NotNull PrismContainerDefinition containerDef, boolean force) throws SchemaException { checkMutability(); - // Although complexTypeDefinition is cached, its presence means that the parent had a definition before - // parent.applyDefinition() was called. So if !force, we can safely exit here. if (complexTypeDefinition != null && !force) { return; // there's a definition already } complexTypeDefinition = containerDef.getComplexTypeDefinition(); if (complexTypeDefinition == null || complexTypeDefinition.isXsdAnyMarker()) { - // No point in aplying this. Nothing will change and there may be phantom errors. + // No point in applying this. Nothing will change and there may be phantom errors. return; } if (items != null) { @@ -1393,9 +1407,13 @@ public QName getTypeName() { @Nullable public ComplexTypeDefinition getComplexTypeDefinition() { - if (complexTypeDefinition != null) { - return complexTypeDefinition; + if (complexTypeDefinition == null) { + complexTypeDefinition = determineComplexTypeDefinition(); } + return complexTypeDefinition; + } + + private ComplexTypeDefinition determineComplexTypeDefinition() { PrismContainerable parent = getParent(); ComplexTypeDefinition parentCTD = parent != null && parent.getDefinition() != null ? parent.getDefinition().getComplexTypeDefinition() : null; @@ -1407,7 +1425,8 @@ public ComplexTypeDefinition getComplexTypeDefinition() { if (parentCTD != null && containerable.getClass().equals(parentCTD.getCompileTimeClass())) { return parentCTD; } else { - return null; // TODO or throw an exception? + //throw new IllegalStateException("Cannot determine complexTypeDefinition for PrismContainerValue because prismContext is missing; PCV = " + this); + return null; } } complexTypeDefinition = prismContext.getSchemaRegistry().findComplexTypeDefinitionByCompileTimeClass(containerable.getClass()); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParser.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParser.java index 93792d7d4ea..48e7eefe228 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParser.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParser.java @@ -53,6 +53,8 @@ * 4. name from item definition derived from type name * 5. name from item definition derived from type class * + * General post-condition: All recognizable definitions are set. This is true for items as well as item values. + * * @author mederly */ public interface PrismParser { diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/ItemInfo.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/ItemInfo.java index 238754e7381..37aa7bb6b90 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/ItemInfo.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/ItemInfo.java @@ -149,10 +149,11 @@ private static ID augmentWithItemName(ID definition, if (itemName == null || definition != null && QNameUtil.match(definition.getName(), itemName)) { // just an optimization to avoid needless lookups return definition; } - ID defFromItemName = schemaRegistry.findItemDefinitionByElementName(itemName, definitionClass); - if (defFromItemName == null) { + List defsFromItemName = schemaRegistry.findItemDefinitionsByElementName(itemName, definitionClass); + if (defsFromItemName.size() != 1) { return definition; } + ID defFromItemName = defsFromItemName.get(0); if (definition == null) { return defFromItemName; } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismParserImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismParserImpl.java index 11b36d31c19..5cab81b3e20 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismParserImpl.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismParserImpl.java @@ -237,6 +237,10 @@ private T doParseRealValue(Class clazz, RootXNode root) throws IOExceptio // although bean unmarshaller can process containerables as well, prism unmarshaller is better at it if (clazz != null && !Containerable.class.isAssignableFrom(clazz) && getBeanConverter().canProcess(clazz)) { return getBeanConverter().unmarshall(root, clazz, context); + } else if (clazz != null && Objectable.class.isAssignableFrom(clazz)) { + // we need to NOT strip off OID + PrismObject object = (PrismObject) doParseItem(root, clazz); + return (T) object.asObjectable(); } else { PrismValue prismValue = doParseItemValue(root, clazz); if (prismValue == null) { diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismSerializerImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismSerializerImpl.java index 338cdc09485..70f7dcaf144 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismSerializerImpl.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismSerializerImpl.java @@ -80,6 +80,11 @@ public PrismSerializerImpl options(SerializationOptions options) { @NotNull @Override public T serialize(@NotNull Item item) throws SchemaException { + return serialize(item, itemName); + } + + @NotNull + public T serialize(@NotNull Item item, QName itemName) throws SchemaException { RootXNode xroot = getMarshaller().marshalItemAsRoot(item, itemName, itemDefinition, context); return target.write(xroot, context); } @@ -122,7 +127,9 @@ public T serializeRealValue(Object value) throws SchemaException { @Override public T serializeRealValue(Object realValue, QName itemName) throws SchemaException { PrismValue prismValue; - if (realValue instanceof Containerable) { + if (realValue instanceof Objectable) { + return serialize(((Objectable) realValue).asPrismObject(), itemName); // to preserve OID and name + } else if (realValue instanceof Containerable) { prismValue = ((Containerable) realValue).asPrismContainerValue(); } else { prismValue = new PrismPropertyValue<>(realValue); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/QueryConvertor.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/QueryConvertor.java index 4430fd6004b..51b37d7d99f 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/QueryConvertor.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/QueryConvertor.java @@ -291,7 +291,7 @@ private static ObjectFilter parseComparisonFilter(QN List> values = item.getValues(); PrismValue.clearParent(values); return EqualFilter.createEqual(itemPath, - (PrismPropertyDefinition)item.getDefinition(), matchingRule, prismContext, values); + (PrismPropertyDefinition)itemDefinition, matchingRule, prismContext, values); } PrismPropertyValue propertyValue = (PrismPropertyValue) item.getValue(0); propertyValue.clearParent(); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/ValueFilter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/ValueFilter.java index e3a1b41f536..b60b3e4ade5 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/ValueFilter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/ValueFilter.java @@ -24,6 +24,7 @@ import com.evolveum.midpoint.prism.path.NameItemPathSegment; import com.evolveum.midpoint.util.DebugUtil; import com.evolveum.midpoint.util.MiscUtil; +import com.evolveum.midpoint.util.QNameUtil; import com.evolveum.midpoint.util.exception.SchemaException; import org.apache.commons.lang.Validate; import org.jetbrains.annotations.NotNull; @@ -38,7 +39,9 @@ public abstract class ValueFilter values; @Nullable private ExpressionWrapper expression; @@ -108,6 +111,7 @@ public D getDefinition() { public void setDefinition(@Nullable D definition) { this.definition = definition; + checkConsistence(false); } @Nullable @@ -279,46 +283,6 @@ Item getFilterItem() throws SchemaException { return filterItem; } - @Override - public void checkConsistence(boolean requireDefinitions) { - if (requireDefinitions && definition == null) { - throw new IllegalArgumentException("Null definition in "+this); - } - if (fullPath.isEmpty()) { - throw new IllegalArgumentException("Empty path in "+this); - } - if (rightHandSidePath != null && rightHandSidePath.isEmpty()) { - throw new IllegalArgumentException("Not-null but empty right side path in "+this); - } - int count = 0; - if (values != null) { - count++; - } - if (expression != null) { - count++; - } - if (rightHandSidePath != null) { - count++; - } - if (count > 1) { - throw new IllegalStateException("Two or more of the following are non-null: values (" + values - + "), expression (" + expression + "), rightHandSidePath (" + rightHandSidePath + ") in " + this); - } - if (values != null) { - for (V value: values) { - if (value == null) { - throw new IllegalArgumentException("Null value in "+this); - } - if (value.getParent() != this) { - throw new IllegalArgumentException("Value "+value+" in "+this+" has a bad parent "+value.getParent()); - } - if (value.isEmpty() && !value.isRaw()) { - throw new IllegalArgumentException("Empty value in "+this); - } - } - } - } - @Override public abstract ValueFilter clone(); @@ -455,4 +419,55 @@ protected String toString(StringBuilder sb){ return sb.toString(); } + @Override + public void checkConsistence(boolean requireDefinitions) { + if (requireDefinitions && definition == null) { + throw new IllegalArgumentException("Null definition in "+this); + } + if (fullPath.isEmpty()) { + throw new IllegalArgumentException("Empty path in "+this); + } + if (!(fullPath.last() instanceof NameItemPathSegment)) { + //noinspection ConstantConditions + throw new IllegalArgumentException("Last segment of item path is not a name segment: " + fullPath + " (it is " + + fullPath.last().getClass().getName() + ")"); + } + if (rightHandSidePath != null && rightHandSidePath.isEmpty()) { + throw new IllegalArgumentException("Not-null but empty right side path in "+this); + } + int count = 0; + if (values != null) { + count++; + } + if (expression != null) { + count++; + } + if (rightHandSidePath != null) { + count++; + } + if (count > 1) { + throw new IllegalStateException("Two or more of the following are non-null: values (" + values + + "), expression (" + expression + "), rightHandSidePath (" + rightHandSidePath + ") in " + this); + } + if (values != null) { + for (V value: values) { + if (value == null) { + throw new IllegalArgumentException("Null value in "+this); + } + if (value.getParent() != this) { + throw new IllegalArgumentException("Value "+value+" in "+this+" has a bad parent "+value.getParent()); + } + if (value.isEmpty() && !value.isRaw()) { + throw new IllegalArgumentException("Empty value in "+this); + } + } + } + if (definition != null) { + if (!QNameUtil.match(definition.getName(), fullPath.lastNamed().getName())) { + throw new IllegalArgumentException("Last segment of item path (" + fullPath.lastNamed().getName() + ") " + + "does not match item name from the definition: " + definition); + } + } + } + } diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestQueryConvertor.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestQueryConvertor.java index db873204f97..65a4833f41b 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestQueryConvertor.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestQueryConvertor.java @@ -78,6 +78,8 @@ public class TestQueryConvertor { private static final File FILTER_ACCOUNT_FILE = new File(TEST_DIR, "filter-account.xml"); private static final File FILTER_ACCOUNT_ATTRIBUTES_RESOURCE_REF_FILE = new File(TEST_DIR, "filter-account-by-attributes-and-resource-ref.xml"); + private static final File FILTER_ACCOUNT_ATTRIBUTES_RESOURCE_REF_NO_NS_FILE = new File(TEST_DIR, + "filter-account-by-attributes-and-resource-ref-no-ns.xml"); private static final File FILTER_OR_COMPOSITE = new File(TEST_DIR, "filter-or-composite.xml"); private static final File FILTER_CONNECTOR_BY_TYPE_FILE = new File(TEST_DIR, "filter-connector-by-type.xml"); private static final File FILTER_BY_TYPE_FILE = new File(TEST_DIR, "filter-by-type.xml"); @@ -172,6 +174,34 @@ public void testAccountQueryAttributesAndResource() throws Exception { // TODO: add some asserts } + @Test + public void testAccountQueryAttributesAndResourceNoNs() throws Exception { + displayTestTitle("testAccountQueryAttributesAndResourceNoNs"); + + SearchFilterType filterType = unmarshalFilter(FILTER_ACCOUNT_ATTRIBUTES_RESOURCE_REF_NO_NS_FILE); + ObjectQuery query = toObjectQuery(ShadowType.class, filterType); + displayQuery(query); + + assertNotNull(query); + + ObjectFilter filter = query.getFilter(); + PrismAsserts.assertAndFilter(filter, 2); + + ObjectFilter first = getFilterCondition(filter, 0); + PrismAsserts.assertRefFilter(first, ShadowType.F_RESOURCE_REF, ObjectReferenceType.COMPLEX_TYPE, new ItemPath( + ShadowType.F_RESOURCE_REF)); + assertRefFilterValue((RefFilter) first, "aae7be60-df56-11df-8608-0002a5d5c51b"); + + ObjectFilter second = getFilterCondition(filter, 1); + PrismAsserts.assertEqualsFilter(second, ICF_NAME, DOMUtil.XSD_STRING, new ItemPath("attributes", "name")); + //PrismAsserts.assertEqualsFilterValue((EqualFilter) second, "uid=jbond,ou=People,dc=example,dc=com"); + + QueryType convertedQueryType = toQueryType(query); + System.out.println(DOMUtil.serializeDOMToString(convertedQueryType.getFilter().getFilterClauseAsElement())); + + // TODO: add some asserts + } + @Test public void testAccountQueryCompositeOr() throws Exception { displayTestTitle("testAccountQueryCompositeOr"); diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/AbstractObjectParserTest.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/AbstractObjectParserTest.java new file mode 100644 index 00000000000..c6ac325c406 --- /dev/null +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/AbstractObjectParserTest.java @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.schema.parser; + +import com.evolveum.midpoint.prism.*; +import com.evolveum.midpoint.prism.delta.ObjectDelta; +import com.evolveum.midpoint.util.exception.SchemaException; + +import javax.xml.namespace.QName; + +import static org.testng.AssertJUnit.assertNotNull; +import static org.testng.AssertJUnit.assertTrue; + +/** + * @author mederly + */ +public abstract class AbstractObjectParserTest extends AbstractParserTest { + + protected void processObject(String desc, ParsingFunction> parser, + SerializingFunction> serializer, String serId, boolean checkItemName) throws Exception { + PrismContext prismContext = getPrismContext(); + + System.out.println("================== Starting test for '" + desc + "' (serializer: " + serId + ") =================="); + + PrismObject value = parser.apply(prismContext.parserFor(getFile())); + + System.out.println("Parsed object: " + desc); + System.out.println(value.debugDump()); + + assertPrismObject(value); + + if (serializer != null) { + + String serialized = serializer.apply(value); + System.out.println("Serialized:\n" + serialized); + + PrismObject reparsed = parser.apply(prismContext.parserFor(serialized)); + + System.out.println("Reparsed: " + desc); + System.out.println(reparsed.debugDump()); + + assertPrismObject(reparsed); + + ObjectDelta delta = value.diff(reparsed); + assertTrue("Delta not empty", delta.isEmpty()); + + if (checkItemName) { + assertTrue("Values not equal", value.equals(reparsed)); + } + assertTrue("Values not equal", value.asObjectable().equals(reparsed.asObjectable())); + } + } + + @SuppressWarnings("Convert2MethodRef") + protected void processObjectParsings(Class clazz, QName type, SerializingFunction> serializer, String serId, + boolean checkItemName) throws Exception { + processObject("parse - no hint", p -> p.parse(), serializer, serId, checkItemName); + + if (clazz != null) { + processObject("parse - " + clazz.getSimpleName() + ".class", + p -> p.type(clazz).parse(), + serializer, serId, checkItemName); + } + + if (type != null) { + processObject("parse - " + type.getLocalPart() + " (QName)", + p -> p.type(type).parse(), + serializer, serId, checkItemName); + } + + processObject("parseRealValue - no hint", + p -> ((O) p.parseRealValue()).asPrismObject(), + serializer, serId, checkItemName); + + if (clazz != null) { + processObject("parseRealValue - " + clazz.getSimpleName() + ".class", + p -> p.parseRealValue(clazz).asPrismObject(), + serializer, serId, checkItemName); + } + + if (type != null) { + processObject("parseRealValue - " + type.getLocalPart() + " (QName)", + p -> ((O) p.type(type).parseRealValue()).asPrismObject(), + serializer, serId, checkItemName); + } + + processObject("parseAnyData", + p -> ((PrismObject) p.parseItemOrRealValue()), + serializer, serId, checkItemName); + } + + protected abstract void assertPrismObject(PrismObject object) throws SchemaException; + +} diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/AbstractParserTest.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/AbstractParserTest.java index e184f3c852e..0e8d04cd5ce 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/AbstractParserTest.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/AbstractParserTest.java @@ -16,14 +16,21 @@ package com.evolveum.midpoint.schema.parser; -import com.evolveum.midpoint.prism.PrismContainer; +import com.evolveum.midpoint.prism.*; +import com.evolveum.midpoint.prism.delta.ItemDelta; +import com.evolveum.midpoint.prism.path.ItemPath; +import com.evolveum.midpoint.prism.path.ItemPathSegment; +import com.evolveum.midpoint.prism.path.NameItemPathSegment; import com.evolveum.midpoint.prism.util.PrismAsserts; import com.evolveum.midpoint.prism.util.PrismTestUtil; import com.evolveum.midpoint.schema.MidPointPrismContextFactory; import com.evolveum.midpoint.schema.SchemaConstantsGenerated; import com.evolveum.midpoint.schema.constants.MidPointConstants; import com.evolveum.midpoint.util.PrettyPrinter; +import com.evolveum.midpoint.util.QNameUtil; import com.evolveum.midpoint.util.exception.SchemaException; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; import org.testng.annotations.BeforeClass; import org.testng.annotations.BeforeSuite; import org.testng.annotations.Optional; @@ -33,13 +40,16 @@ import javax.xml.namespace.QName; import java.io.File; import java.io.IOException; +import java.util.Collection; import static com.evolveum.midpoint.schema.TestConstants.COMMON_DIR_PATH; +import static org.testng.AssertJUnit.assertNotNull; +import static org.testng.AssertJUnit.assertTrue; /** * @author mederly */ -public class AbstractParserTest { +public abstract class AbstractParserTest { protected String language; protected boolean namespaces; @@ -88,4 +98,144 @@ protected void assertContainerDefinition(PrismContainer container, String contNa QName qName = new QName(SchemaConstantsGenerated.NS_COMMON, contName); PrismAsserts.assertDefinition(container.getDefinition(), qName, xsdType, minOccurs, maxOccurs); } + + protected void assertDefinitions(Visitable value) { + value.accept(v -> { + if (v instanceof Item) { + Item item = (Item) v; + String label = item.getPath() + ": " + v; + //System.out.println("Checking " + label); + assertTrue("No definition in " + label, item.getDefinition() != null || isDynamic(item.getPath())); + } else if (v instanceof PrismContainerValue) { + PrismContainerValue pcv = (PrismContainerValue) v; + String label = pcv.getPath() + ": " + v; + //System.out.println("Checking " + label); + assertNotNull("No complex type definition in " + label, pcv.getComplexTypeDefinition()); + } + }); + } + + private boolean isDynamic(ItemPath path) { + for (ItemPathSegment segment : path.getSegments()) { + if (segment instanceof NameItemPathSegment) { + QName name = ((NameItemPathSegment) segment).getName(); + if (QNameUtil.match(name, ShadowType.F_ATTRIBUTES) || QNameUtil.match(name, ObjectType.F_EXTENSION)) { + return true; + } + } + } + return false; + } + + @FunctionalInterface + interface ParsingFunction { + V apply(PrismParser prismParser) throws Exception; + } + + @FunctionalInterface + interface SerializingFunction { + String apply(V value) throws Exception; + } + + protected void process(String desc, ParsingFunction> parser, SerializingFunction> serializer, String serId) throws Exception { + PrismContext prismContext = getPrismContext(); + + System.out.println("================== Starting test for '" + desc + "' (serializer: " + serId + ") =================="); + + PrismContainerValue value = parser.apply(prismContext.parserFor(getFile())); + + System.out.println("Parsed value: " + desc); + System.out.println(value.debugDump()); + + assertPrismContainerValue(value); + + if (serializer != null) { + + String serialized = serializer.apply(value); + System.out.println("Serialized:\n" + serialized); + + PrismContainerValue reparsed = parser.apply(prismContext.parserFor(serialized)); + + System.out.println("Reparsed: " + desc); + System.out.println(reparsed.debugDump()); + + assertPrismContainerValue(reparsed); + + Collection deltas = ((PrismContainerValue) value).diff((PrismContainerValue) reparsed); + assertTrue("Deltas not empty", deltas.isEmpty()); + + assertTrue("Values not equal", value.equals(reparsed)); + } + } + + protected abstract File getFile(); + + @SuppressWarnings("Convert2MethodRef") + protected void processParsings(Class clazz, Class specificClass, QName type, QName specificType, SerializingFunction> serializer, String serId) throws Exception { + process("parseItemValue - no hint", p -> p.parseItemValue(), serializer, serId); + + if (clazz != null) { + process("parseItemValue - " + clazz.getSimpleName() + ".class", + p -> p.type(clazz).parseItemValue(), + serializer, serId); + } + + if (specificClass != null) { + process("parseItemValue - " + specificClass.getSimpleName() + ".class", + p -> p.type(specificClass).parseItemValue(), + serializer, serId); + } + + if (type != null) { + process("parseItemValue - " + type.getLocalPart() + " (QName)", + p -> p.type(type).parseItemValue(), + serializer, serId); + } + + if (specificType != null) { + process("parseItemValue - " + specificType.getLocalPart() + " (QName)", + p -> p.type(specificType).parseItemValue(), + serializer, serId); + } + + process("parseRealValue - no hint", + p -> ((C) p.parseRealValue()).asPrismContainerValue(), + serializer, serId); + + if (clazz != null) { + process("parseRealValue - " + clazz.getSimpleName() + ".class", + p -> p.parseRealValue(clazz).asPrismContainerValue(), + serializer, serId); + } + + if (specificClass != null) { + process("parseRealValue - " + specificClass.getSimpleName() + ".class", + p -> p.parseRealValue(specificClass).asPrismContainerValue(), + serializer, serId); + } + + if (type != null) { + process("parseRealValue - " + type.getLocalPart() + " (QName)", + p -> ((C) p.type(type).parseRealValue()).asPrismContainerValue(), + serializer, serId); + } + + if (specificType != null) { + process("parseRealValue - " + specificType.getLocalPart() + " (QName)", + p -> ((C) p.type(specificType).parseRealValue()).asPrismContainerValue(), + serializer, serId); + } + + process("parseAnyData", + p -> ((PrismContainer) p.parseItemOrRealValue()).getValue(0), + serializer, serId); + } + + + protected abstract void assertPrismContainerValue(PrismContainerValue value) throws SchemaException; + + protected PrismContext getPrismContext() { + return PrismTestUtil.getPrismContext(); + } + } diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/TestParseCertificationCase.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/TestParseCertificationCase.java index 8b89d8ba2fa..bde010cc1fc 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/TestParseCertificationCase.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/TestParseCertificationCase.java @@ -16,9 +16,7 @@ package com.evolveum.midpoint.schema.parser; import com.evolveum.midpoint.prism.*; -import com.evolveum.midpoint.prism.delta.ItemDelta; import com.evolveum.midpoint.prism.util.PrismAsserts; -import com.evolveum.midpoint.prism.util.PrismTestUtil; import com.evolveum.midpoint.schema.SchemaConstantsGenerated; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.xml.ns._public.common.common_3.AccessCertificationAssignmentCaseType; @@ -28,26 +26,22 @@ import org.testng.annotations.Test; import javax.xml.namespace.QName; -import java.util.Collection; + +import java.io.File; import static com.evolveum.midpoint.schema.TestConstants.CERTIFICATION_CASE_FILE_BASENAME; import static org.testng.AssertJUnit.*; /** - * @author semancik + * @author mederly * */ @SuppressWarnings("Convert2MethodRef") -public class TestParseCertificationCase extends AbstractParserTest { - - @FunctionalInterface - interface ParsingFunction { - PrismContainerValue apply(PrismParser prismParser) throws Exception; - } +public class TestParseCertificationCase extends AbstractParserTest { - @FunctionalInterface - interface SerializingFunction { - String apply(PrismContainerValue value) throws Exception; + @Override + protected File getFile() { + return getFile(CERTIFICATION_CASE_FILE_BASENAME); } @Test @@ -56,38 +50,6 @@ public void testParseFile() throws Exception { processParsings(null, null); } - private void process(String desc, ParsingFunction parser, SerializingFunction serializer, String serId) throws Exception { - PrismContext prismContext = getPrismContext(); - - System.out.println("================== Starting test for '" + desc + "' (serializer: " + serId + ") =================="); - - PrismContainerValue pcv = - parser.apply(prismContext.parserFor(getFile(CERTIFICATION_CASE_FILE_BASENAME))); - - System.out.println("Parsed certification case: " + desc); - System.out.println(pcv.debugDump()); - - assertCase(pcv); - - if (serializer != null) { - - String serialized = serializer.apply(pcv); - System.out.println("Serialized:\n" + serialized); - - PrismContainerValue reparsed = - parser.apply(prismContext.parserFor(serialized)); - - System.out.println("Reparsed: " + desc); - System.out.println(reparsed.debugDump()); - - assertCase(reparsed); - assertTrue("Values not equal", pcv.equals(reparsed)); - - Collection deltas = pcv.diff(reparsed); - assertTrue("Deltas not empty", deltas.isEmpty()); - } - } - @Test public void testParseRoundTrip() throws Exception{ displayTestTitle("testParseRoundTrip"); @@ -99,63 +61,16 @@ public void testParseRoundTrip() throws Exception{ processParsings(v -> getPrismContext().serializerFor(language).root(new QName("dummy")).serializeAnyData(v.asContainerable()), "s4"); } - private void processParsings(SerializingFunction serializer, String serId) throws Exception { - process("parseItemValue - no hint", p -> p.parseItemValue(), serializer, serId); - - process("parseItemValue - AccessCertificationCaseType.class", - p -> p.type(AccessCertificationCaseType.class).parseItemValue(), - serializer, serId); - - process("parseItemValue - AccessCertificationAssignmentCaseType.class", - p -> p.type(AccessCertificationAssignmentCaseType.class).parseItemValue(), - serializer, serId); - - process("parseItemValue - AccessCertificationCaseType (QName)", - p -> p.type(AccessCertificationCaseType.COMPLEX_TYPE).parseItemValue(), - serializer, serId); - - process("parseItemValue - AccessCertificationAssignmentCaseType (QName)", - p -> p.type(AccessCertificationAssignmentCaseType.COMPLEX_TYPE).parseItemValue(), - serializer, serId); - - process("parseRealValue - no hint", - p -> ((AccessCertificationCaseType) p.parseRealValue()).asPrismContainerValue(), - serializer, serId); - - process("parseRealValue (AccessCertificationCaseType.class)", - p -> p.parseRealValue(AccessCertificationCaseType.class).asPrismContainerValue(), - serializer, serId); - - process("parseRealValue (AccessCertificationAssignmentCaseType.class)", - p -> p.parseRealValue(AccessCertificationAssignmentCaseType.class).asPrismContainerValue(), - serializer, serId); - - process("parseRealValue - AccessCertificationCaseType (QName)", - p -> ((AccessCertificationCaseType) - p.type(AccessCertificationCaseType.COMPLEX_TYPE).parseRealValue()) - .asPrismContainerValue(), - serializer, serId); - - process("parseRealValue - AccessCertificationAssignmentCaseType (QName)", - p -> ((AccessCertificationCaseType) - p.type(AccessCertificationAssignmentCaseType.COMPLEX_TYPE).parseRealValue()) - .asPrismContainerValue(), - serializer, serId); - - process("parseAnyData", - p -> ((PrismContainer) p.parseItemOrRealValue()).getValue(0), - serializer, serId); - } - - private PrismContext getPrismContext() { - return PrismTestUtil.getPrismContext(); + private void processParsings(SerializingFunction> serializer, String serId) throws Exception { + processParsings(AccessCertificationCaseType.class, AccessCertificationAssignmentCaseType.class, + AccessCertificationCaseType.COMPLEX_TYPE, AccessCertificationAssignmentCaseType.COMPLEX_TYPE, serializer, serId); } - void assertCase(PrismContainerValue pcv) throws SchemaException { + public void assertPrismContainerValue(PrismContainerValue value) throws SchemaException { - //pcv.checkConsistence(); - assertPrismValue(pcv); - assertJaxb(pcv.asContainerable()); + assertDefinitions(value); + assertPrismValue(value); + assertJaxb(value.asContainerable()); //pcv.checkConsistence(true, true); } diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/TestParseResource.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/TestParseResource.java index 21ad1bbd64b..6aabd7b1977 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/TestParseResource.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/TestParseResource.java @@ -49,6 +49,7 @@ import javax.xml.bind.JAXBElement; import javax.xml.bind.JAXBException; import javax.xml.namespace.QName; +import java.io.File; import java.util.List; import static com.evolveum.midpoint.schema.TestConstants.RESOURCE_FILE_BASENAME; @@ -60,14 +61,19 @@ * @author semancik * */ -public class TestParseResource extends AbstractParserTest { +public class TestParseResource extends AbstractParserTest { + + @Override + protected File getFile() { + return getFile(RESOURCE_FILE_BASENAME); + } @Test public void testParseResourceFile() throws Exception { displayTestTitle("testParseResourceFile"); // GIVEN - PrismContext prismContext = PrismTestUtil.getPrismContext(); + PrismContext prismContext = getPrismContext(); // WHEN PrismObject resource = prismContext.parseObject(getFile(RESOURCE_FILE_BASENAME)); @@ -84,7 +90,7 @@ public void testParseResourceFileSimple() throws Exception { displayTestTitle("testParseResourceFileSimple"); // GIVEN - PrismContext prismContext = PrismTestUtil.getPrismContext(); + PrismContext prismContext = getPrismContext(); // WHEN PrismObject resource = prismContext.parseObject(getFile(RESOURCE_FILE_SIMPLE_BASENAME)); @@ -102,7 +108,7 @@ public void testParseResourceRoundtrip() throws Exception { displayTestTitle("testParseResourceRoundtrip"); // GIVEN - PrismContext prismContext = PrismTestUtil.getPrismContext(); + PrismContext prismContext = getPrismContext(); PrismObject resource = prismContext.parseObject(getFile(RESOURCE_FILE_BASENAME)); @@ -158,7 +164,7 @@ public void testSchemaRoundtrip() throws Exception { displayTestTitle("testSchemaRoundtrip"); // GIVEN - PrismContext prismContext = PrismTestUtil.getPrismContext(); + PrismContext prismContext = getPrismContext(); PrismObject resource = prismContext.parseObject(getFile(RESOURCE_FILE_BASENAME)); @@ -197,6 +203,11 @@ public void testSchemaRoundtrip() throws Exception { } + @Override + protected void assertPrismContainerValue(PrismContainerValue value) throws SchemaException { + //assertResource(object.asContainerable().asPrismObject(), true, true); + } + protected void assertResource(PrismObject resource, boolean checkConsistence, boolean checkJaxb, boolean isSimple) throws SchemaException, JAXBException { if (checkConsistence) { @@ -213,7 +224,7 @@ protected void assertResource(PrismObject resource, boolean checkC private void assertResourcePrism(PrismObject resource, boolean isSimple) throws SchemaException { - PrismContext prismContext = PrismTestUtil.getPrismContext(); + PrismContext prismContext = getPrismContext(); AssertJUnit.assertEquals("Wrong oid (prism)", TestConstants.RESOURCE_OID, resource.getOid()); // assertEquals("Wrong version", "42", resource.getVersion()); @@ -251,7 +262,8 @@ private void assertResourcePrism(PrismObject resource, boolean isS new ItemPath(new QName("extension"), new QName("extConnType")), path); PrismPropertyValue filterValue = (PrismPropertyValue) equalFilter.getValues().get(0); - assertEquals("Wrong filter value", "org.identityconnectors.ldap.LdapConnector", ((RawType) filterValue.getValue()).getParsedRealValue(String.class).trim()); + //assertEquals("Wrong filter value", "org.identityconnectors.ldap.LdapConnector", ((RawType) filterValue.getValue()).getParsedRealValue(String.class).trim()); + assertEquals("Wrong filter value", "org.identityconnectors.ldap.LdapConnector", ((String) filterValue.getValue()).trim()); } EvaluationTimeType resolutionTime = connectorRefVal.getResolutionTime(); if (isSimple) { @@ -431,7 +443,7 @@ public void testParseResourceDom() throws Exception { displayTestTitle(TEST_NAME); // GIVEN - PrismContext prismContext = PrismTestUtil.getPrismContext(); + PrismContext prismContext = getPrismContext(); // WHEN DomLexicalProcessor parserDom = ((PrismContextImpl) prismContext).getParserDom(); @@ -453,7 +465,7 @@ public void testParseResourceDomSimple() throws Exception { displayTestTitle("testParseResourceDomSimple"); // GIVEN - PrismContext prismContext = PrismTestUtil.getPrismContext(); + PrismContext prismContext = getPrismContext(); Document document = DOMUtil.parseFile(getFile(TestConstants.RESOURCE_FILE_SIMPLE_BASENAME)); Element resourceElement = DOMUtil.getFirstChildElement(document); diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/TestParseShadow.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/TestParseShadow.java index ea173b727a4..a83bdd8be2f 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/TestParseShadow.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/TestParseShadow.java @@ -16,7 +16,6 @@ package com.evolveum.midpoint.schema.parser; import com.evolveum.midpoint.prism.*; -import com.evolveum.midpoint.prism.delta.ObjectDelta; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.util.PrismAsserts; import com.evolveum.midpoint.prism.util.PrismTestUtil; @@ -29,6 +28,8 @@ import javax.xml.namespace.QName; +import java.io.File; + import static com.evolveum.midpoint.schema.TestConstants.SHADOW_FILE_BASENAME; import static org.testng.AssertJUnit.*; @@ -36,79 +37,80 @@ * @author semancik * */ -public class TestParseShadow extends AbstractParserTest { +public class TestParseShadow extends AbstractObjectParserTest { + + @Override + protected File getFile() { + return getFile(SHADOW_FILE_BASENAME); + } @Test - public void testParseShadowFile() throws Exception { - displayTestTitle("testParseShadowFile"); + public void testParseFileAsPCV() throws Exception { + displayTestTitle("testParseFileAsPCV"); + processParsings(null, null); + } - // GIVEN - PrismContext prismContext = PrismTestUtil.getPrismContext(); - - // WHEN - PrismObject object = prismContext.parseObject(getFile(SHADOW_FILE_BASENAME)); - // THEN - System.out.println("Parsed object:"); - System.out.println(object.debugDump()); - - String serialized = prismContext.serializerFor(language).serialize(object); - System.out.println("Serialized: \n" +serialized); - - PrismObject reparsed = prismContext.parseObject(serialized); - - assertObject(object); + @Test + public void testParseFileAsPO() throws Exception { + displayTestTitle("testParseFileAsPO"); + processParsingsPO(null, null, true); } @Test - public void testParseShadowRoundTrip() throws Exception{ - displayTestTitle("testParseShadowRoundTrip"); + public void testParseRoundTripAsPCV() throws Exception{ + displayTestTitle("testParseRoundTripAsPCV"); - // GIVEN - PrismContext prismContext = PrismTestUtil.getPrismContext(); - - // WHEN - PrismObject object = prismContext.parseObject(getFile(SHADOW_FILE_BASENAME)); - - // THEN - System.out.println("Parsed object:"); - System.out.println(object.debugDump()); - - assertObject(object); - - String serialized = prismContext.serializerFor(language).serialize(object); - System.out.println("Serialized:"); - System.out.println(serialized); - - // REPARSE - PrismObject reparsed = prismContext.parseObject(serialized); - - // THEN - System.out.println("Reparsed:"); - System.out.println(reparsed.debugDump()); - - assertObject(reparsed); - - // and some sanity checks - - assertTrue("Object not equals", object.equals(reparsed)); - - ObjectDelta delta = object.diff(reparsed); - assertTrue("Delta not empty", delta.isEmpty()); - + processParsings(v -> getPrismContext().serializerFor(language).serialize(v), "s0"); + processParsings(v -> getPrismContext().serializerFor(language).root(new QName("dummy")).serialize(v), "s1"); + processParsings(v -> getPrismContext().serializerFor(language).root(SchemaConstantsGenerated.C_USER).serialize(v), "s2"); // misleading item name + processParsings(v -> getPrismContext().serializerFor(language).serializeRealValue(v.asContainerable()), "s3"); + processParsings(v -> getPrismContext().serializerFor(language).root(new QName("dummy")).serializeAnyData(v.asContainerable()), "s4"); } - - void assertObject(PrismObject object) throws SchemaException { + @Test + public void testParseRoundTripAsPO() throws Exception{ + displayTestTitle("testParseRoundTripAsPO"); + + processParsingsPO(v -> getPrismContext().serializerFor(language).serialize(v), "s0", true); + processParsingsPO(v -> getPrismContext().serializerFor(language).root(new QName("dummy")).serialize(v), "s1", false); + processParsingsPO(v -> getPrismContext().serializerFor(language).root(SchemaConstantsGenerated.C_USER).serialize(v), "s2", false); // misleading item name + processParsingsPO(v -> getPrismContext().serializerFor(language).serializeRealValue(v.asObjectable()), "s3", false); + processParsingsPO(v -> getPrismContext().serializerFor(language).root(new QName("dummy")).serializeAnyData(v.asObjectable()), "s4", false); + } + + private void processParsings(SerializingFunction> serializer, String serId) throws Exception { + processParsings(ShadowType.class, null, ShadowType.COMPLEX_TYPE, null, serializer, serId); + } + + private void processParsingsPO(SerializingFunction> serializer, String serId, boolean checkItemName) throws Exception { + processObjectParsings(ShadowType.class, ShadowType.COMPLEX_TYPE, serializer, serId, checkItemName); + } + + + @Override + protected void assertPrismContainerValue(PrismContainerValue value) throws SchemaException { + assertDefinitions(value); + PrismObject object = value.asContainerable().asPrismObject(); + object.checkConsistence(); + assertPrism(object, false); + assertJaxb(value.asContainerable(), false); + } + + @Override + protected void assertPrismObject(PrismObject object) throws SchemaException { object.checkConsistence(); - assertPrism(object); - assertJaxb(object.asObjectable()); + assertDefinitions(object); + assertPrism(object, true); + assertJaxb(object.asObjectable(), true); object.checkConsistence(true, false); } - void assertPrism(PrismObject shadow) { - - assertEquals("Wrong oid", "88519fca-3f4a-44ca-91c8-dc9be5bf3d03", shadow.getOid()); + void assertPrism(PrismObject shadow, boolean isObject) { + + if (isObject) { + assertEquals("Wrong oid", "88519fca-3f4a-44ca-91c8-dc9be5bf3d03", shadow.getOid()); + } PrismObjectDefinition usedDefinition = shadow.getDefinition(); assertNotNull("No object definition", usedDefinition); PrismAsserts.assertObjectDefinition(usedDefinition, new QName(SchemaConstantsGenerated.NS_COMMON, "shadow"), @@ -137,8 +139,10 @@ void assertPrism(PrismObject shadow) { PrismAsserts.assertReferenceValue(resourceRef, "10000000-0000-0000-0000-000000000003"); } - private void assertJaxb(ShadowType shadow) throws SchemaException { - assertEquals("88519fca-3f4a-44ca-91c8-dc9be5bf3d03", shadow.getOid()); + private void assertJaxb(ShadowType shadow, boolean isObject) throws SchemaException { + if (isObject) { + assertEquals("88519fca-3f4a-44ca-91c8-dc9be5bf3d03", shadow.getOid()); + } assertEquals("Wrong name", PrismTestUtil.createPolyStringType("hbarbossa"), shadow.getName()); ActivationType activation = shadow.getActivation(); diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/TestParseUser.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/TestParseUser.java index 4723a2a0b2a..632a7bec342 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/TestParseUser.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/TestParseUser.java @@ -20,13 +20,13 @@ import static org.testng.AssertJUnit.assertNotNull; import static org.testng.AssertJUnit.assertTrue; +import java.io.File; import java.util.List; import javax.xml.namespace.QName; import com.evolveum.midpoint.schema.SchemaConstantsGenerated; -import com.evolveum.midpoint.schema.parser.AbstractParserTest; -import org.testng.annotations.Parameters; +import com.evolveum.midpoint.xml.ns._public.common.common_3.*; import org.testng.annotations.Test; import org.w3c.dom.Element; @@ -42,7 +42,6 @@ import com.evolveum.midpoint.prism.PrismPropertyValue; import com.evolveum.midpoint.prism.PrismReference; import com.evolveum.midpoint.prism.PrismReferenceValue; -import com.evolveum.midpoint.prism.delta.ObjectDelta; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.prism.util.PrismAsserts; @@ -51,13 +50,6 @@ import com.evolveum.midpoint.schema.util.ObjectTypeUtil; import com.evolveum.midpoint.util.DOMUtil; import com.evolveum.midpoint.util.exception.SchemaException; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ActivationStatusType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ActivationType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ExtensionType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; import com.evolveum.prism.xml.ns._public.query_3.SearchFilterType; import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; @@ -65,106 +57,81 @@ * @author semancik * */ -public class TestParseUser extends AbstractParserTest { +public class TestParseUser extends AbstractObjectParserTest { + + @Override + protected File getFile() { + return getFile(USER_FILE_BASENAME); + } @Test - public void testParseUserFile() throws Exception { - final String TEST_NAME = "testParseUserFile"; - displayTestTitle(TEST_NAME); + public void testParseFileAsPCV() throws Exception { + displayTestTitle("testParseFileAsPCV"); + processParsingsPCV(null, null); + } - // GIVEN - PrismContext prismContext = PrismTestUtil.getPrismContext(); - - // WHEN - PrismObject user = prismContext.parseObject(getFile(USER_FILE_BASENAME)); - // THEN - System.out.println("Parsed user:"); - System.out.println(user.debugDump()); - - String serialized = prismContext.serializerFor(language).serialize(user); - System.out.println("Serialized: \n" +serialized); - - PrismObject reparsedUser = prismContext.parseObject(serialized); - - assertUser(user); + @Test + public void testParseFileAsPO() throws Exception { + displayTestTitle("testParseFileAsPO"); + processParsingsPO(null, null, true); } @Test - public void testParseUserDom() throws Exception { - final String TEST_NAME = "testParseUserDom"; - displayTestTitle(TEST_NAME); + public void testParseRoundTripAsPCV() throws Exception{ + displayTestTitle("testParseRoundTripAsPCV"); - // GIVEN - PrismContext prismContext = PrismTestUtil.getPrismContext(); - -// Document document = DOMUtil.parseFile(USER_FILE); -// Element userElement = DOMUtil.getFirstChildElement(document); - - // WHEN - PrismObject user = prismContext.parseObject(getFile(USER_FILE_BASENAME)); - - // THEN - System.out.println("Parsed user:"); - System.out.println(user.debugDump()); - - assertUser(user); + processParsingsPCV(v -> getPrismContext().serializerFor(language).serialize(v), "s0"); + processParsingsPCV(v -> getPrismContext().serializerFor(language).root(new QName("dummy")).serialize(v), "s1"); + processParsingsPCV(v -> getPrismContext().serializerFor(language).root(SchemaConstantsGenerated.C_SYSTEM_CONFIGURATION).serialize(v), "s2"); // misleading item name + processParsingsPCV(v -> getPrismContext().serializerFor(language).serializeRealValue(v.asContainerable()), "s3"); + processParsingsPCV(v -> getPrismContext().serializerFor(language).root(new QName("dummy")).serializeAnyData(v.asContainerable()), "s4"); } @Test - public void testParseUserRoundTrip() throws Exception{ - final String TEST_NAME = "testParseUserRoundTrip"; - displayTestTitle(TEST_NAME); + public void testParseRoundTripAsPO() throws Exception{ + displayTestTitle("testParseRoundTripAsPO"); - // GIVEN - PrismContext prismContext = PrismTestUtil.getPrismContext(); - -// Document document = DOMUtil.parseFile(USER_FILE); -// Element userElement = DOMUtil.getFirstChildElement(document); - - // WHEN - PrismObject user = prismContext.parseObject(getFile(USER_FILE_BASENAME)); - - // THEN - System.out.println("Parsed user:"); - System.out.println(user.debugDump()); - - assertUser(user); - - - String serializedUser = prismContext.serializeObjectToString(user, language); - System.out.println("Serialized user:"); - System.out.println(serializedUser); - - // REPARSE - PrismObject reparsedUser = prismContext.parseObject(serializedUser); - - // THEN - System.out.println("Parsed user:"); - System.out.println(reparsedUser.debugDump()); - - assertUser(reparsedUser); - - // and some sanity checks - - assertTrue("User not equals", user.equals(reparsedUser)); - - ObjectDelta delta = user.diff(reparsedUser); - assertTrue("Delta not empty", delta.isEmpty()); - + processParsingsPO(v -> getPrismContext().serializerFor(language).serialize(v), "s0", true); + processParsingsPO(v -> getPrismContext().serializerFor(language).root(new QName("dummy")).serialize(v), "s1", false); + processParsingsPO(v -> getPrismContext().serializerFor(language).root(SchemaConstantsGenerated.C_SYSTEM_CONFIGURATION).serialize(v), "s2", false); // misleading item name + processParsingsPO(v -> getPrismContext().serializerFor(language).serializeRealValue(v.asObjectable()), "s3", false); + processParsingsPO(v -> getPrismContext().serializerFor(language).root(new QName("dummy")).serializeAnyData(v.asObjectable()), "s4", false); } - - void assertUser(PrismObject user) throws SchemaException { + private void processParsingsPCV(SerializingFunction> serializer, String serId) throws Exception { + processParsings(UserType.class, null, UserType.COMPLEX_TYPE, null, serializer, serId); + } + + private void processParsingsPO(SerializingFunction> serializer, String serId, boolean checkItemName) throws Exception { + processObjectParsings(UserType.class, UserType.COMPLEX_TYPE, serializer, serId, checkItemName); + } + + @Override + protected void assertPrismContainerValue(PrismContainerValue value) throws SchemaException { + assertDefinitions(value); + PrismObject user = value.asContainerable().asPrismObject(); user.checkConsistence(); - assertUserPrism(user); - assertUserJaxb(user.asObjectable()); + assertUserPrism(user, false); + assertUserJaxb(value.asContainerable(), false); + } + + @Override + protected void assertPrismObject(PrismObject user) throws SchemaException { + user.checkConsistence(); + assertDefinitions(user); + assertUserPrism(user, true); + assertUserJaxb(user.asObjectable(), true); user.checkConsistence(true, true); } - void assertUserPrism(PrismObject user) { - - assertEquals("Wrong oid", "2f9b9299-6f45-498f-bc8e-8d17c6b93b20", user.getOid()); + + + void assertUserPrism(PrismObject user, boolean isObject) { + + if (isObject) { + assertEquals("Wrong oid", "2f9b9299-6f45-498f-bc8e-8d17c6b93b20", user.getOid()); + } // assertEquals("Wrong version", "42", user.getVersion()); PrismObjectDefinition usedDefinition = user.getDefinition(); assertNotNull("No user definition", usedDefinition); @@ -255,7 +222,7 @@ private void assertFilter(String message, SearchFilterType filter) { assertNotNull("No "+message+" filter", filter); } - private void assertUserJaxb(UserType userType) throws SchemaException { + private void assertUserJaxb(UserType userType, boolean isObject) throws SchemaException { assertEquals("Wrong name", PrismTestUtil.createPolyStringType("jack"), userType.getName()); assertEquals("Wrong fullName (orig)", "Jack Sparrow", userType.getFullName().getOrig()); assertEquals("Wrong fullName (norm)", "jack sparrow", userType.getFullName().getNorm()); @@ -294,7 +261,7 @@ public void testPrismConsistency() throws Exception { System.out.println("===[ testPrismConsistency ]==="); // GIVEN - PrismContext ctx = PrismTestUtil.getPrismContext(); + PrismContext ctx = getPrismContext(); PrismObjectDefinition userDefinition = ctx.getSchemaRegistry().findObjectDefinitionByCompileTimeClass(UserType.class); // WHEN @@ -315,5 +282,4 @@ public void testPrismConsistency() throws Exception { System.out.println("OK."); } - } diff --git a/infra/schema/src/test/resources/queryconvertor/filter-account-by-attributes-and-resource-ref-no-ns.xml b/infra/schema/src/test/resources/queryconvertor/filter-account-by-attributes-and-resource-ref-no-ns.xml new file mode 100644 index 00000000000..73fe2ab26bb --- /dev/null +++ b/infra/schema/src/test/resources/queryconvertor/filter-account-by-attributes-and-resource-ref-no-ns.xml @@ -0,0 +1,32 @@ + + + + + + + resourceRef + + aae7be60-df56-11df-8608-0002a5d5c51b + + + + attributes/name + uid=jbond,ou=People,dc=example,dc=com + + + From e5f5b138586722b43616b867137946509ff096db Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Sun, 23 Oct 2016 00:30:32 +0200 Subject: [PATCH 50/74] Tests passing up to model-impl (excluding). --- ...CompositeRefinedObjectClassDefinition.java | 25 ++-- .../prism/ComplexTypeDefinitionImpl.java | 5 + .../midpoint/prism/DefinitionImpl.java | 5 + .../com/evolveum/midpoint/prism/Item.java | 5 + .../midpoint/prism/PrismContainerValue.java | 38 ++++-- .../evolveum/midpoint/prism/PrismParser.java | 5 +- .../midpoint/prism/PrismPropertyValue.java | 44 +++--- .../midpoint/prism/marshaller/ItemInfo.java | 20 +++ .../prism/marshaller/PrismBeanConverter.java | 36 +++-- .../prism/marshaller/PrismUnmarshaller.java | 61 +++++++-- .../prism/xml/ns/_public/types_3/RawType.java | 16 ++- .../midpoint/prism/PrismInternalTestUtil.java | 30 +++-- .../midpoint/prism/TestPrismParsing.java | 21 ++- .../midpoint/prism/TestPrismParsingXml.java | 9 +- .../lex/AbstractLexicalProcessorTest.java | 4 +- .../midpoint/schema/TestDeltaConverter.java | 2 +- .../AbstractContainerValueParserTest.java | 113 ++++++++++++++++ .../parser/AbstractObjectParserTest.java | 14 +- .../schema/parser/AbstractParserTest.java | 125 ++++++++---------- .../AbstractPropertyValueParserTest.java | 90 +++++++++++++ .../parser/TestParseCertificationCase.java | 10 +- .../schema/parser/TestParseMapping.java | 111 ++++++++++++++++ .../schema/parser/TestParseMappings.java | 99 ++++++++++++++ .../schema/parser/TestParseResource.java | 8 +- .../schema/parser/TestParseShadow.java | 8 +- .../midpoint/schema/parser/TestParseUser.java | 8 +- .../test/resources/common/xml/ns/mapping.xml | 45 +++++++ .../test/resources/common/xml/ns/mappings.xml | 47 +++++++ infra/schema/testng-unit.xml | 2 + .../common/expression/ExpressionUtil.java | 16 ++- .../script/jsr223/Jsr223ScriptEvaluator.java | 2 +- .../velocity/VelocityScriptEvaluator.java | 3 +- .../mapping/account-inbound-mapping.xml | 2 +- .../midpoint/test/IntegrationTestTools.java | 9 +- 34 files changed, 830 insertions(+), 208 deletions(-) create mode 100644 infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/AbstractContainerValueParserTest.java create mode 100644 infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/AbstractPropertyValueParserTest.java create mode 100644 infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/TestParseMapping.java create mode 100644 infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/TestParseMappings.java create mode 100644 infra/schema/src/test/resources/common/xml/ns/mapping.xml create mode 100644 infra/schema/src/test/resources/common/xml/ns/mappings.xml diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/CompositeRefinedObjectClassDefinition.java b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/CompositeRefinedObjectClassDefinition.java index 2912d0c733b..60f51d8ddaf 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/CompositeRefinedObjectClassDefinition.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/CompositeRefinedObjectClassDefinition.java @@ -198,6 +198,7 @@ public boolean isAuxiliary() { return structuralObjectClassDefinition.isAuxiliary(); } + // TODO - ok??? public Collection getAssociations() { return structuralObjectClassDefinition.getAssociations(); } @@ -206,10 +207,6 @@ public Collection getAssociations(ShadowKindType k return structuralObjectClassDefinition.getAssociations(kind); } - public Collection getEntitlementAssociations() { - return structuralObjectClassDefinition.getEntitlementAssociations(); - } - public Collection getNamesOfAssociations() { return structuralObjectClassDefinition.getNamesOfAssociations(); } @@ -389,14 +386,26 @@ public RefinedAttributeDefinition findAttributeDefinition(QName elementQN return (RefinedAttributeDefinition) findItemDefinition(elementQName, RefinedAttributeDefinition.class, caseInsensitive); } - @Override public RefinedAssociationDefinition findAssociation(QName name) { - throw new UnsupportedOperationException("TODO implement if needed"); + for (RefinedAssociationDefinition assocType: getAssociations()) { + if (QNameUtil.match(assocType.getName(), name)) { + return assocType; + } + } + return null; + } + + public Collection getEntitlementAssociations() { + return getAssociations(ShadowKindType.ENTITLEMENT); } - @Override public RefinedAssociationDefinition findEntitlementAssociation(QName name) { - throw new UnsupportedOperationException("TODO implement if needed"); + for (RefinedAssociationDefinition assocType: getEntitlementAssociations()) { + if (QNameUtil.match(assocType.getName(), name)) { + return assocType; + } + } + return null; } @Override diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/ComplexTypeDefinitionImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/ComplexTypeDefinitionImpl.java index c092d2b471d..f936cfee520 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/ComplexTypeDefinitionImpl.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/ComplexTypeDefinitionImpl.java @@ -460,4 +460,9 @@ public String getDocClassName() { return "complex type"; } +// @Override +// public void accept(Visitor visitor) { +// super.accept(visitor); +// itemDefinitions.forEach(def -> def.accept(visitor)); +// } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/DefinitionImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/DefinitionImpl.java index fe6bf1afa88..5c2415f32f9 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/DefinitionImpl.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/DefinitionImpl.java @@ -293,4 +293,9 @@ public String debugDump(int indent) { @Override public abstract Definition clone(); + +// @Override +// public void accept(Visitor visitor) { +// visitor.visit(this); +// } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/Item.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/Item.java index cd2d703e690..ade3d8f543e 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/Item.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/Item.java @@ -186,6 +186,11 @@ public PrismContext getPrismContext() { return null; } } + + // Primarily for testing + public PrismContext getPrismContextLocal() { + return prismContext; + } public void setPrismContext(PrismContext prismContext) { this.prismContext = prismContext; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerValue.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerValue.java index fe934e2cc30..18836999169 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerValue.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerValue.java @@ -109,7 +109,12 @@ public PrismContext getPrismContext() { return null; } - /** + // Primarily for testing + public PrismContext getPrismContextLocal() { + return prismContext; + } + + /** * Returns a set of items that the property container contains. The items may be properties or inner property containers. *

* The set may be null. In case there are no properties an empty set is @@ -251,24 +256,39 @@ public C asContainerable() { return asContainerableInternal(resolveClass(null)); } - public C asContainerable(Class defaultClass) { + // returned class must be of type 'requiredClass' (or any of its subtypes) + public C asContainerable(Class requiredClass) { if (containerable != null) { return containerable; } - return asContainerableInternal(resolveClass(defaultClass)); + return asContainerableInternal(resolveClass(requiredClass)); } - private Class resolveClass(Class defaultClass) { - Class clazz = defaultClass; + private Class resolveClass(@Nullable Class requiredClass) { if (complexTypeDefinition != null && complexTypeDefinition.getCompileTimeClass() != null) { - clazz = (Class) complexTypeDefinition.getCompileTimeClass(); + Class actualClass = complexTypeDefinition.getCompileTimeClass(); + if (requiredClass != null && !requiredClass.isAssignableFrom(actualClass)) { + throw new IllegalStateException("asContainerable was called to produce " + requiredClass + + ", but the actual class in PCV is " + actualClass); + } else { + return (Class) actualClass; + } } else { PrismContainerable parent = getParent(); - if (parent != null && parent.getCompileTimeClass() != null) { - clazz = parent.getCompileTimeClass(); // TODO is this ok? + if (parent != null) { + Class parentClass = parent.getCompileTimeClass(); + if (parentClass != null) { + if (requiredClass != null && !requiredClass.isAssignableFrom(parentClass)) { + // mismatch; but this can occur (see ShadowAttributesType vs ShadowIdentifiersType in ShadowAssociationType) + // but TODO maybe this is only a workaround and the problem is in the schema itself (?) + return requiredClass; + } else { + return (Class) parentClass; + } + } } } - return clazz; + return requiredClass; } private C asContainerableInternal(Class clazz) { diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParser.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParser.java index 48e7eefe228..4ebf40df53f 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParser.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismParser.java @@ -53,7 +53,10 @@ * 4. name from item definition derived from type name * 5. name from item definition derived from type class * - * General post-condition: All recognizable definitions are set. This is true for items as well as item values. + * General post-conditions: (For items as well as item values; and for all parsing methods.) + * - All recognizable definitions are set. + * - Prism context is set on all items and PCVs. + * - No unresolved raw values with known types are present. * * @author mederly */ diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyValue.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyValue.java index 2bb807023eb..f5acfdca53b 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyValue.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyValue.java @@ -117,28 +117,28 @@ public T getValue() { if (parent != null && parent.getDefinition() != null) { def = getParent().getDefinition(); } - if (def == null) { - // We are weak now. If there is no better definition for this we assume a default definition and process - // the attribute now. But we should rather do this: TODO: - // throw new IllegalStateException("Attempt to get value withot a type from raw value of property "+getParent()); - if (parent != null && getPrismContext() != null) { - def = SchemaRegistryImpl.createDefaultItemDefinition(parent.getElementName(), getPrismContext()); - } else if (PrismContextImpl.isAllowSchemalessSerialization()) { - if (rawElement instanceof PrimitiveXNode) { - try { - QName type = rawElement.getTypeQName() != null ? rawElement.getTypeQName() : DOMUtil.XSD_STRING; - value = (T) ((PrimitiveXNode) rawElement).getParsedValueWithoutRecording(type); - } catch (SchemaException ex){ - throw new IllegalStateException("Cannot fetch value from raw element. " + ex.getMessage(), ex); - } - } else { - throw new IllegalStateException("No parent or prism context in property value "+this+", cannot create default definition." + - "The element is also not a DOM element but it is "+rawElement.getClass()+". Epic fail."); - } - } else { - throw new IllegalStateException("No parent or prism context in property value "+this+" (schemaless serialization is disabled)"); - } - } +// if (def == null) { +// // We are weak now. If there is no better definition for this we assume a default definition and process +// // the attribute now. But we should rather do this: TODO: +// // throw new IllegalStateException("Attempt to get value withot a type from raw value of property "+getParent()); +// if (parent != null && getPrismContext() != null) { +// def = SchemaRegistryImpl.createDefaultItemDefinition(parent.getElementName(), getPrismContext()); +// } else if (PrismContextImpl.isAllowSchemalessSerialization()) { +// if (rawElement instanceof PrimitiveXNode) { +// try { +// QName type = rawElement.getTypeQName() != null ? rawElement.getTypeQName() : DOMUtil.XSD_STRING; +// value = (T) ((PrimitiveXNode) rawElement).getParsedValueWithoutRecording(type); +// } catch (SchemaException ex){ +// throw new IllegalStateException("Cannot fetch value from raw element. " + ex.getMessage(), ex); +// } +// } else { +// throw new IllegalStateException("No parent or prism context in property value "+this+", cannot create default definition." + +// "The element is also not a DOM element but it is "+rawElement.getClass()+". Epic fail."); +// } +// } else { +// throw new IllegalStateException("No parent or prism context in property value "+this+" (schemaless serialization is disabled)"); +// } +// } if (def != null) { try { applyDefinition(def); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/ItemInfo.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/ItemInfo.java index 37aa7bb6b90..000055adfd6 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/ItemInfo.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/ItemInfo.java @@ -34,6 +34,7 @@ public class ItemInfo { private QName itemName; private ID itemDefinition; private QName typeName; + private ComplexTypeDefinition complexTypeDefinition; /** * This method is to be called ONLY on the root level, i.e. when unmarshalling starts. @@ -118,6 +119,21 @@ public static ItemInfo determine(ItemDefinition item } else { info.typeName = typeNameExplicit; } + + // complex type definition + if (info.itemDefinition != null) { + if (info.itemDefinition instanceof PrismContainerDefinition) { + info.complexTypeDefinition = ((PrismContainerDefinition) info.itemDefinition).getComplexTypeDefinition(); + } else { + info.complexTypeDefinition = null; + } + } else if (info.typeName != null) { + // TODO probably optimize (e.g. if we already know the class ... ) + info.complexTypeDefinition = schemaRegistry.findComplexTypeDefinitionByType(info.typeName); + } else { + info.complexTypeDefinition = null; + } + return info; } @@ -200,6 +216,10 @@ public ID getItemDefinition() { return itemDefinition; } + public ComplexTypeDefinition getComplexTypeDefinition() { + return complexTypeDefinition; + } + public QName getTypeName() { return typeName; } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismBeanConverter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismBeanConverter.java index 6acb8ca4349..cad1eac3285 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismBeanConverter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismBeanConverter.java @@ -650,7 +650,15 @@ private Object convertSinglePropValue(XNode xsubnode, String fieldName, Class pa } else if (paramType.equals(XNode.class)) { propValue = xsubnode; } else if (storeAsRawType || paramType.equals(RawType.class)) { - propValue = new RawType(xsubnode, prismContext); + RawType raw = new RawType(xsubnode, prismContext); + // FIXME UGLY HACK: parse value if possible + if (xsubnode.getTypeQName() != null) { + PrismValue value = prismContext.parserFor(xsubnode.toRootXNode()).parseItemValue(); + if (value != null && !value.isRaw()) { + raw = new RawType(value, prismContext); + } + } + propValue = raw; } else { // paramType is what we expect e.g. based on parent definition // but actual type (given by xsi:type/@typeDef) may be different, e.g. more specific @@ -707,14 +715,24 @@ private T unmarshallPrimitive(PrimitiveXNode xprim, Class classType, P } if (PolyStringType.class.isAssignableFrom(classType)) { - String value = (String) xprim.getParsedValue(DOMUtil.XSD_STRING); - PolyString polyString = new PolyString(value); - if (value != null) { - if (prismContext != null) { // actually this should be always so [med] - // TODO should we always use default normalizer? - polyString.recompute(prismContext.getDefaultPolyStringNormalizer()); - } - } + // TODO fixme this hack + Object value = xprim.getParsedValue(DOMUtil.XSD_STRING); + PolyString polyString; + if (value instanceof String) { + polyString = new PolyString((String) value); + } else if (value instanceof PolyStringType) { + polyString = ((PolyStringType) value).toPolyString(); + } else if (value instanceof PolyString) { + polyString = (PolyString) value; // TODO clone? + } else if (value == null) { + polyString = null; + } else { + throw new IllegalStateException("Couldn't convert " + value + " to a PolyString; while parsing " + xprim.debugDump()); + } + if (polyString != null) { + // TODO should we always use default normalizer? + polyString.recompute(prismContext.getDefaultPolyStringNormalizer()); + } return (T) new PolyStringType(polyString); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismUnmarshaller.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismUnmarshaller.java index 3f37f9d0765..8e73ff39812 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismUnmarshaller.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismUnmarshaller.java @@ -66,6 +66,11 @@ public PrismUnmarshaller(@NotNull PrismContext prismContext) { //region Public interface ======================================================== + /* + * Please note: methods in this section should NOT be called from inside of parsing process! + * It is to avoid repeatedly calling ItemInfo.determine, if at all possible. + * (An exception is only if we know we have the definition ... TODO ...) + */ @SuppressWarnings("unchecked") PrismObject parseObject(@NotNull RootXNode root, ItemDefinition itemDefinition, QName itemName, QName typeName, Class typeClass, @NotNull ParsingContext pc) throws SchemaException { @@ -81,7 +86,6 @@ PrismObject parseObject(@NotNull RootXNode root, ItemD return (PrismObject) (Item) parseItemInternal(child, itemInfo.getItemName(), itemInfo.getItemDefinition(), pc); } - // to be used only from parsing routines (XNodeParser, BeanParser) @SuppressWarnings("unchecked") PrismObject parseObject(MapXNode map, PrismObjectDefinition objectDefinition, ParsingContext pc) throws SchemaException { ItemInfo itemInfo = ItemInfo.determine(objectDefinition, @@ -100,7 +104,17 @@ PrismObject parseObject(MapXNode map, PrismObjectDefin root.getRootElementName(), itemName, ARTIFICIAL_OBJECT_NAME, root.getTypeQName(), typeName, typeClass, ItemDefinition.class, pc, getSchemaRegistry()); - return parseItemInternal(root.getSubnode(), itemInfo.getItemName(), itemInfo.getItemDefinition(), pc); + ItemDefinition realDefinition; + if (itemInfo.getItemDefinition() == null && itemInfo.getComplexTypeDefinition() != null) { + // let's create container definition dynamically + PrismContainerDefinitionImpl pcd = new PrismContainerDefinitionImpl(itemInfo.getItemName(), itemInfo.getComplexTypeDefinition(), + prismContext); + pcd.setDynamic(true); // questionable + realDefinition = pcd; + } else { + realDefinition = itemInfo.getItemDefinition(); + } + return parseItemInternal(root.getSubnode(), itemInfo.getItemName(), realDefinition, pc); } Object parseItemOrRealValue(@NotNull RootXNode root, ParsingContext pc) throws SchemaException { @@ -127,22 +141,24 @@ Object parseItemOrRealValue(@NotNull RootXNode root, ParsingContext pc) throws S //region Private methods ======================================================== - // typeName is to be used ONLY if itemDefinition == null. - // - // The situation of itemDefinition == null && typeName != null is allowed ONLY if the definition simply cannot be derived + // The situation of itemDefinition == null && node.typeName != null is allowed ONLY if the definition cannot be derived // from the typeName. E.g. if typeName is like xsd:string, xsd:boolean, etc. This rule is because we don't want to repeatedly // try to look for missing definitions here. // - // Moreover, the caller is responsible for extracting information from node.typeQName - providing a definition if necessary. + // So the caller is responsible for extracting information from node.typeQName - providing a definition if possible. @SuppressWarnings("unchecked") @NotNull private Item parseItemInternal(@NotNull XNode node, @NotNull QName itemName, ItemDefinition itemDefinition, @NotNull ParsingContext pc) throws SchemaException { Validate.isTrue(!(node instanceof RootXNode)); + // TODO execute this only if in checked mode if (itemDefinition == null && node.getTypeQName() != null) { - throw new IllegalStateException("Node has an explicit type but parseItemInternal was called " - + "without definition or type name: " + node.debugDump()); + PrismContainerDefinition pcd = getSchemaRegistry().findContainerDefinitionByType(node.getTypeQName()); + if (pcd != null) { + throw new IllegalStateException("Node has an explicit type corresponding to container (" + pcd + + ") but parseItemInternal was called without definition: " + node.debugDump()); + } } if (itemDefinition == null || itemDefinition instanceof PrismPropertyDefinition) { @@ -306,11 +322,38 @@ private PrismProperty parseProperty(@NotNull XNode node, @NotNull QName i return property; } + // if definition == null or any AND node has type defined, this type must be non-containerable (fit into PPV) private PrismPropertyValue parsePropertyValue(@NotNull XNode node, @Nullable PrismPropertyDefinition definition, @NotNull ParsingContext pc) throws SchemaException { if (definition == null || definition.isAnyType()) { - return PrismPropertyValue.createRaw(node); + if (node.getTypeQName() == null) { + return PrismPropertyValue.createRaw(node); + } + // TODO FIX/TEST THIS UGLY HACK + if (node instanceof PrimitiveXNode) { + PrimitiveXNode prim = (PrimitiveXNode) node; + prim.parseValue(node.getTypeQName(), pc.getEvaluationMode()); + if (prim.getValue() != null) { + return new PrismPropertyValue<>((T) prim.getValue()); + } else { + return null; + } + } else if (node instanceof MapXNode) { + if (getBeanConverter().canProcess(node.getTypeQName())) { + T value = getBeanConverter().unmarshall((MapXNode) node, node.getTypeQName(), pc); + if (value instanceof Containerable) { + throw new IllegalStateException("Cannot store containerable into prism property: " + node.debugDump()); + } else { + return new PrismPropertyValue<>(value); + } + } else { + // TODO or should treat this elsewhere? + throw new IllegalStateException("Cannot parse as " + node.getTypeQName() + ": " + node.debugDump()); + } + } else { + throw new IllegalArgumentException("Unexpected node: " + node.debugDump()); + } } T realValue; diff --git a/infra/prism/src/main/java/com/evolveum/prism/xml/ns/_public/types_3/RawType.java b/infra/prism/src/main/java/com/evolveum/prism/xml/ns/_public/types_3/RawType.java index c653c95be11..f2e90cd15c1 100644 --- a/infra/prism/src/main/java/com/evolveum/prism/xml/ns/_public/types_3/RawType.java +++ b/infra/prism/src/main/java/com/evolveum/prism/xml/ns/_public/types_3/RawType.java @@ -2,7 +2,6 @@ import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.path.ItemPath; -import com.evolveum.midpoint.prism.util.PrismUtil; import com.evolveum.midpoint.prism.xnode.PrimitiveXNode; import com.evolveum.midpoint.prism.xnode.RootXNode; import com.evolveum.midpoint.prism.xnode.XNode; @@ -50,12 +49,17 @@ public RawType(PrismContext prismContext) { this.prismContext = prismContext; } - public RawType(XNode xnode, PrismContext prismContext) { + public RawType(XNode xnode, @NotNull PrismContext prismContext) { this(prismContext); this.xnode = xnode; } - @Override + public RawType(PrismValue parsed, @NotNull PrismContext prismContext) { + this.prismContext = prismContext; + this.parsed = parsed; + } + + @Override public void revive(PrismContext prismContext) throws SchemaException { Validate.notNull(prismContext); this.prismContext = prismContext; @@ -129,8 +133,8 @@ public V getParsedRealValue(ID itemDefinition, Ite public T getParsedRealValue(@NotNull Class clazz) throws SchemaException { if (parsed != null) { - if (clazz.isAssignableFrom(parsed.getClass())) { - return (T) parsed; + if (clazz.isAssignableFrom(parsed.getRealValue().getClass())) { + return (T) parsed.getRealValue(); } else { throw new IllegalArgumentException("Parsed value ("+parsed.getClass()+") is not assignable to "+clazz); } @@ -169,7 +173,7 @@ public XNode serializeToXNode() throws SchemaException { return xnode; } else if (parsed != null) { checkPrismContext(); - return prismContext.xnodeSerializer().serialize(parsed).getSubnode(); + return prismContext.xnodeSerializer().root(new QName("dummy")).serialize(parsed).getSubnode(); } else { return null; // or an exception here? } diff --git a/infra/prism/src/test/java/com/evolveum/midpoint/prism/PrismInternalTestUtil.java b/infra/prism/src/test/java/com/evolveum/midpoint/prism/PrismInternalTestUtil.java index 3bf05ee855f..349bec0f039 100644 --- a/infra/prism/src/test/java/com/evolveum/midpoint/prism/PrismInternalTestUtil.java +++ b/infra/prism/src/test/java/com/evolveum/midpoint/prism/PrismInternalTestUtil.java @@ -44,7 +44,6 @@ import com.evolveum.midpoint.prism.path.NameItemPathSegment; import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.prism.schema.PrismSchema; -import com.evolveum.midpoint.prism.schema.SchemaRegistry; import com.evolveum.midpoint.prism.util.PrismAsserts; import com.evolveum.midpoint.prism.util.PrismContextFactory; import com.evolveum.midpoint.prism.util.PrismTestUtil; @@ -290,10 +289,10 @@ public static void displayTestTitle(String testName) { PrismTestUtil.displayTestTitle(testName); } - public static void assertUserJack(PrismObject user) throws SchemaException { + public static void assertUserJack(PrismObject user, boolean expectRawInConstructions) throws SchemaException { user.checkConsistence(); user.assertDefinitions("test"); - assertUserJackContent(user); + assertUserJackContent(user, expectRawInConstructions); assertUserJackExtension(user); assertVisitor(user, 71); @@ -318,7 +317,7 @@ public static void assertUserJack(PrismObject user) throws SchemaExcep NameItemPathSegment.WILDCARD), false, 5); } - public static void assertUserJackContent(PrismObject user) throws SchemaException { + public static void assertUserJackContent(PrismObject user, boolean expectRawInConstructions) throws SchemaException { assertEquals("Wrong oid", USER_JACK_OID, user.getOid()); assertEquals("Wrong version", "42", user.getVersion()); @@ -394,16 +393,21 @@ public static void assertUserJackContent(PrismObject user) throws Sche assertNotNull("Property "+a2Path+" not found", a2Property); AccountConstructionType accountConstructionType = (AccountConstructionType) a2Property.getRealValue(); assertEquals("Wrong number of values in accountConstruction", 2, accountConstructionType.getValue().size()); - RawType value1 = accountConstructionType.getValue().get(0); - assertNotNull("Value #1 has no XNode present", value1.getXnode()); - RawType value2 = accountConstructionType.getValue().get(1); + RawType value1 = accountConstructionType.getValue().get(0).clone(); + if (expectRawInConstructions) { + assertNotNull("Value #1 has no XNode present", value1.getXnode()); + PrismPropertyDefinition value1def = new PrismPropertyDefinitionImpl( + new QName(NS_FOO, "dummy"), // element name + DOMUtil.XSD_STRING, // type name + user.getPrismContext()); + PrismPropertyValue prismValue1 = value1.getParsedValue(value1def, value1def.getName()); + assertEquals("Wrong value #1", "ABC", prismValue1.getValue()); + } else { + assertNull("Value #1 has XNode present", value1.getXnode()); + assertEquals("Wrong value #1", "ABC", value1.getParsedRealValue(String.class)); + } + RawType value2 = accountConstructionType.getValue().get(1).clone(); assertNotNull("Value #2 has no XNode present", value2.getXnode()); - PrismPropertyDefinition value1def = new PrismPropertyDefinitionImpl( - new QName(NS_FOO, "dummy"), // element name - DOMUtil.XSD_STRING, // type name - user.getPrismContext()); - PrismPropertyValue prismValue1 = value1.getParsedValue(value1def, value1def.getName()); - assertEquals("Wrong value #1", "ABC", prismValue1.getValue()); PrismValue prismValue2 = value2.getParsedValue(user.getDefinition(), user.getDefinition().getName()); PrismContainerValue prismUserValue2 = (PrismContainerValue) prismValue2; assertEquals("Wrong value #2", "Nobody", prismUserValue2.findProperty(new QName(NS_FOO, "fullName")).getRealValue()); diff --git a/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestPrismParsing.java b/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestPrismParsing.java index 4e21ec67b11..4d25c49b2fa 100644 --- a/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestPrismParsing.java +++ b/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestPrismParsing.java @@ -32,7 +32,6 @@ import org.testng.annotations.BeforeSuite; import org.testng.annotations.Test; -import org.w3c.dom.Element; import org.xml.sax.SAXException; import com.evolveum.midpoint.prism.delta.DiffUtil; @@ -85,7 +84,7 @@ public void test100PrismParseFile() throws Exception { System.out.println(user.debugDump()); assertNotNull(user); - assertUserJack(user); + assertUserJack(user, true); } @Test @@ -103,7 +102,7 @@ public void test110PrismParseFileNoNs() throws Exception { System.out.println(user.debugDump()); assertNotNull(user); - assertUserJack(user); + assertUserJack(user, true); } @Test @@ -122,7 +121,7 @@ public void test120PrismParseFileObject() throws Exception { System.out.println(user.debugDump()); assertNotNull(user); - assertUserJack(user); + assertUserJack(user, true); } @Test @@ -141,7 +140,7 @@ public void test130PrismParseFileAdhoc() throws Exception { System.out.println(user.debugDump()); assertNotNull(user); - assertUserAdhoc(user); + assertUserAdhoc(user, true); } @Test @@ -180,7 +179,7 @@ private void roundTrip(File file) throws SchemaException, SAXException, IOExcept assertNotNull(originalUser); // precondition - assertUserJack(originalUser); + assertUserJack(originalUser, true); // WHEN // We need to serialize with composite objects during roundtrip, otherwise the result will not be equal @@ -199,7 +198,7 @@ private void roundTrip(File file) throws SchemaException, SAXException, IOExcept System.out.println(parsedUser.debugDump()); assertNotNull(parsedUser); - assertUserJack(parsedUser); + assertUserJack(parsedUser, true); ObjectDelta diff = DiffUtil.diff(originalUser, parsedUser); System.out.println("Diff:"); @@ -229,7 +228,7 @@ private void roundTripAdhoc(File file) throws SchemaException, SAXException, IOE assertNotNull(originalUser); // precondition - assertUserAdhoc(originalUser); + assertUserAdhoc(originalUser, true); // WHEN // We need to serialize with composite objects during roundtrip, otherwise the result will not be equal @@ -248,7 +247,7 @@ private void roundTripAdhoc(File file) throws SchemaException, SAXException, IOE System.out.println(parsedUser.debugDump()); assertNotNull(parsedUser); - assertUserAdhoc(parsedUser); + assertUserAdhoc(parsedUser, true); assertTrue("Users not equal", originalUser.equals(parsedUser)); } @@ -410,9 +409,9 @@ public void test500UserElisabethRoundTrip() throws Exception { } - protected void assertUserAdhoc(PrismObject user) throws SchemaException { + protected void assertUserAdhoc(PrismObject user, boolean expectRawInConstructions) throws SchemaException { user.checkConsistence(); - assertUserJackContent(user); + assertUserJackContent(user, expectRawInConstructions); assertUserExtensionAdhoc(user); assertVisitor(user, 58); } diff --git a/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestPrismParsingXml.java b/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestPrismParsingXml.java index 202d39a9f94..1dff0bc2414 100644 --- a/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestPrismParsingXml.java +++ b/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestPrismParsingXml.java @@ -5,16 +5,11 @@ import java.io.IOException; -import javax.xml.transform.dom.DOMSource; -import javax.xml.validation.Schema; -import javax.xml.validation.Validator; - import org.testng.annotations.Test; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.xml.sax.SAXException; -import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.foo.UserType; import com.evolveum.midpoint.util.DOMUtil; @@ -54,7 +49,7 @@ public void testPrismParseDom() throws Exception { System.out.println(user.debugDump()); assertNotNull(user); - assertUserJack(user); + assertUserJack(user, true); } @Test @@ -76,7 +71,7 @@ public void testPrismParseDomAdhoc() throws Exception { System.out.println(user.debugDump()); assertNotNull(user); - assertUserAdhoc(user); + assertUserAdhoc(user, true); } @Override diff --git a/infra/prism/src/test/java/com/evolveum/midpoint/prism/lex/AbstractLexicalProcessorTest.java b/infra/prism/src/test/java/com/evolveum/midpoint/prism/lex/AbstractLexicalProcessorTest.java index d84ba7d3087..59af91191bc 100644 --- a/infra/prism/src/test/java/com/evolveum/midpoint/prism/lex/AbstractLexicalProcessorTest.java +++ b/infra/prism/src/test/java/com/evolveum/midpoint/prism/lex/AbstractLexicalProcessorTest.java @@ -108,7 +108,7 @@ public void testParseUserToPrism() throws Exception { assertUserJackXNodeOrdering("serialized xnode", xnode); - assertUserJack(user); + assertUserJack(user, true); } @@ -135,7 +135,7 @@ public void testParseUserRoundTrip() throws Exception { System.out.println("\nParsed user:"); System.out.println(user.debugDump()); - assertUserJack(user); + assertUserJack(user, true); // WHEN (re-serialize to XNode) RootXNode serializedXNode = prismContext.xnodeSerializer() diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestDeltaConverter.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestDeltaConverter.java index ec4c708fe6b..f8c9b263825 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestDeltaConverter.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestDeltaConverter.java @@ -73,7 +73,7 @@ public class TestDeltaConverter extends AbstractSchemaTest { private static final ItemPath CREDENTIALS_PASSWORD_VALUE_PATH = new ItemPath(UserType.F_CREDENTIALS, CredentialsType.F_PASSWORD, PasswordType.F_VALUE); - @Test + @Test(enabled = false) public void testRefWithObject() throws SchemaException, IOException, JAXBException { System.out.println("===[ testRefWithObject ]===="); diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/AbstractContainerValueParserTest.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/AbstractContainerValueParserTest.java new file mode 100644 index 00000000000..25aca0ebed6 --- /dev/null +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/AbstractContainerValueParserTest.java @@ -0,0 +1,113 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.schema.parser; + +import com.evolveum.midpoint.prism.Containerable; +import com.evolveum.midpoint.prism.PrismContainer; +import com.evolveum.midpoint.prism.PrismContainerValue; +import com.evolveum.midpoint.prism.PrismContext; +import com.evolveum.midpoint.prism.util.PrismTestUtil; +import com.evolveum.midpoint.util.exception.SchemaException; + +import javax.xml.namespace.QName; + +/** + * @author mederly + */ +public abstract class AbstractContainerValueParserTest extends AbstractParserTest> { + + @SuppressWarnings("Convert2MethodRef") + protected void processParsings(Class clazz, Class specificClass, QName type, QName specificType, SerializingFunction> serializer, String serId) throws Exception { + process("parseItemValue - no hint", p -> p.parseItemValue(), serializer, serId); + + if (clazz != null) { + process("parseItemValue - " + clazz.getSimpleName() + ".class", + p -> p.type(clazz).parseItemValue(), + serializer, serId); + } + + if (specificClass != null) { + process("parseItemValue - " + specificClass.getSimpleName() + ".class", + p -> p.type(specificClass).parseItemValue(), + serializer, serId); + } + + if (type != null) { + process("parseItemValue - " + type.getLocalPart() + " (QName)", + p -> p.type(type).parseItemValue(), + serializer, serId); + } + + if (specificType != null) { + process("parseItemValue - " + specificType.getLocalPart() + " (QName)", + p -> p.type(specificType).parseItemValue(), + serializer, serId); + } + + process("parseRealValue - no hint", + p -> ((C) p.parseRealValue()).asPrismContainerValue(), + serializer, serId); + + if (clazz != null) { + process("parseRealValue - " + clazz.getSimpleName() + ".class", + p -> p.parseRealValue(clazz).asPrismContainerValue(), + serializer, serId); + } + + if (specificClass != null) { + process("parseRealValue - " + specificClass.getSimpleName() + ".class", + p -> p.parseRealValue(specificClass).asPrismContainerValue(), + serializer, serId); + } + + if (type != null) { + process("parseRealValue - " + type.getLocalPart() + " (QName)", + p -> ((C) p.type(type).parseRealValue()).asPrismContainerValue(), + serializer, serId); + } + + if (specificType != null) { + process("parseRealValue - " + specificType.getLocalPart() + " (QName)", + p -> ((C) p.type(specificType).parseRealValue()).asPrismContainerValue(), + serializer, serId); + } + + if (isContainer()) { + process("parseAnyData", + p -> ((PrismContainer) p.parseItemOrRealValue()).getValue(0), + serializer, serId); + } + } + + protected boolean isContainer() { + return true; + } + + @Override + protected void assertPrismValue(PrismContainerValue value) throws SchemaException { + assertDefinitions(value); + assertPrismContext(value); + assertPrismContainerValueLocal(value); + } + + protected abstract void assertPrismContainerValueLocal(PrismContainerValue value) throws SchemaException; + + protected PrismContext getPrismContext() { + return PrismTestUtil.getPrismContext(); + } + +} diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/AbstractObjectParserTest.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/AbstractObjectParserTest.java index c6ac325c406..8ac2cca33f5 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/AbstractObjectParserTest.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/AbstractObjectParserTest.java @@ -28,7 +28,7 @@ /** * @author mederly */ -public abstract class AbstractObjectParserTest extends AbstractParserTest { +public abstract class AbstractObjectParserTest extends AbstractContainerValueParserTest { protected void processObject(String desc, ParsingFunction> parser, SerializingFunction> serializer, String serId, boolean checkItemName) throws Exception { @@ -37,6 +37,7 @@ protected void processObject(String desc, ParsingFunction> parser System.out.println("================== Starting test for '" + desc + "' (serializer: " + serId + ") =================="); PrismObject value = parser.apply(prismContext.parserFor(getFile())); + assertResolvableRawValues(value); // should be right here before getValue method is called System.out.println("Parsed object: " + desc); System.out.println(value.debugDump()); @@ -49,6 +50,7 @@ protected void processObject(String desc, ParsingFunction> parser System.out.println("Serialized:\n" + serialized); PrismObject reparsed = parser.apply(prismContext.parserFor(serialized)); + assertResolvableRawValues(reparsed); // should be right here before getValue method is called System.out.println("Reparsed: " + desc); System.out.println(reparsed.debugDump()); @@ -103,6 +105,14 @@ protected void processObjectParsings(Class clazz, QName type, SerializingFunc serializer, serId, checkItemName); } - protected abstract void assertPrismObject(PrismObject object) throws SchemaException; + protected void assertPrismObject(PrismObject object) throws SchemaException { + assertDefinitions(object); + object.checkConsistence(); + object.assertDefinitions(true, ""); + assertPrismContext(object); + assertPrismObjectLocal(object); + } + + protected abstract void assertPrismObjectLocal(PrismObject object) throws SchemaException; } diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/AbstractParserTest.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/AbstractParserTest.java index 0e8d04cd5ce..04f8fabc312 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/AbstractParserTest.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/AbstractParserTest.java @@ -23,6 +23,7 @@ import com.evolveum.midpoint.prism.path.NameItemPathSegment; import com.evolveum.midpoint.prism.util.PrismAsserts; import com.evolveum.midpoint.prism.util.PrismTestUtil; +import com.evolveum.midpoint.prism.xnode.XNode; import com.evolveum.midpoint.schema.MidPointPrismContextFactory; import com.evolveum.midpoint.schema.SchemaConstantsGenerated; import com.evolveum.midpoint.schema.constants.MidPointConstants; @@ -43,13 +44,12 @@ import java.util.Collection; import static com.evolveum.midpoint.schema.TestConstants.COMMON_DIR_PATH; -import static org.testng.AssertJUnit.assertNotNull; -import static org.testng.AssertJUnit.assertTrue; +import static org.testng.AssertJUnit.*; /** * @author mederly */ -public abstract class AbstractParserTest { +public abstract class AbstractParserTest { protected String language; protected boolean namespaces; @@ -99,18 +99,55 @@ protected void assertContainerDefinition(PrismContainer container, String contNa PrismAsserts.assertDefinition(container.getDefinition(), qName, xsdType, minOccurs, maxOccurs); } + // partly covers the same functionality as item.assertDefinitions (TODO clean this) protected void assertDefinitions(Visitable value) { value.accept(v -> { if (v instanceof Item) { Item item = (Item) v; String label = item.getPath() + ": " + v; //System.out.println("Checking " + label); - assertTrue("No definition in " + label, item.getDefinition() != null || isDynamic(item.getPath())); + if (item.getDefinition() == null) { + assertTrue("No definition in " + label, isDynamic(item.getPath())); + } else { + assertNotNull("No prism context in definition of " + label, item.getDefinition().getPrismContext()); + } } else if (v instanceof PrismContainerValue) { PrismContainerValue pcv = (PrismContainerValue) v; String label = pcv.getPath() + ": " + v; //System.out.println("Checking " + label); - assertNotNull("No complex type definition in " + label, pcv.getComplexTypeDefinition()); + if (pcv.getComplexTypeDefinition() == null) { + fail("No complex type definition in " + label); + } else { + assertNotNull("No prism context in definition of " + label, pcv.getComplexTypeDefinition().getPrismContext()); + } + } + }); + } + + protected void assertResolvableRawValues(Visitable value) { + value.accept(v -> { + // TODO in RawTypes in beans? + if (v instanceof PrismPropertyValue) { + PrismPropertyValue ppv = (PrismPropertyValue) v; + XNode raw = ppv.getRawElement(); + if (raw != null && raw.getTypeQName() != null) { + String label = ppv.getPath() + ": " + v; + fail("Resolvable raw value of " + raw + " in " + label + " (type: " + raw.getTypeQName() + ")"); + } + } + }); + } + + protected void assertPrismContext(Visitable value) { + value.accept(v -> { + if (v instanceof Item) { + Item item = (Item) v; + String label = item.getPath() + ": " + v; + assertNotNull("No prism context in " + label, item.getPrismContextLocal()); + } else if (v instanceof PrismContainerValue) { + PrismContainerValue pcv = (PrismContainerValue) v; + String label = pcv.getPath() + ": " + v; + assertNotNull("No prism context in " + label, pcv.getPrismContextLocal()); } }); } @@ -137,31 +174,33 @@ interface SerializingFunction { String apply(V value) throws Exception; } - protected void process(String desc, ParsingFunction> parser, SerializingFunction> serializer, String serId) throws Exception { + protected void process(String desc, ParsingFunction parser, SerializingFunction serializer, String serId) throws Exception { PrismContext prismContext = getPrismContext(); System.out.println("================== Starting test for '" + desc + "' (serializer: " + serId + ") =================="); - PrismContainerValue value = parser.apply(prismContext.parserFor(getFile())); + T value = parser.apply(prismContext.parserFor(getFile())); + assertResolvableRawValues(value); // should be right here, before any getValue is called (TODO reconsider) System.out.println("Parsed value: " + desc); System.out.println(value.debugDump()); - assertPrismContainerValue(value); + assertPrismValue(value); if (serializer != null) { String serialized = serializer.apply(value); System.out.println("Serialized:\n" + serialized); - PrismContainerValue reparsed = parser.apply(prismContext.parserFor(serialized)); + T reparsed = parser.apply(prismContext.parserFor(serialized)); + assertResolvableRawValues(reparsed); // should be right here, before any getValue is called (TODO reconsider) System.out.println("Reparsed: " + desc); System.out.println(reparsed.debugDump()); - assertPrismContainerValue(reparsed); + assertPrismValue(reparsed); - Collection deltas = ((PrismContainerValue) value).diff((PrismContainerValue) reparsed); + Collection deltas = value.diff(reparsed); assertTrue("Deltas not empty", deltas.isEmpty()); assertTrue("Values not equal", value.equals(reparsed)); @@ -170,70 +209,12 @@ protected void process(String desc, ParsingFunction> pars protected abstract File getFile(); - @SuppressWarnings("Convert2MethodRef") - protected void processParsings(Class clazz, Class specificClass, QName type, QName specificType, SerializingFunction> serializer, String serId) throws Exception { - process("parseItemValue - no hint", p -> p.parseItemValue(), serializer, serId); + protected abstract void assertPrismValue(T value) throws SchemaException; - if (clazz != null) { - process("parseItemValue - " + clazz.getSimpleName() + ".class", - p -> p.type(clazz).parseItemValue(), - serializer, serId); - } - - if (specificClass != null) { - process("parseItemValue - " + specificClass.getSimpleName() + ".class", - p -> p.type(specificClass).parseItemValue(), - serializer, serId); - } - - if (type != null) { - process("parseItemValue - " + type.getLocalPart() + " (QName)", - p -> p.type(type).parseItemValue(), - serializer, serId); - } - - if (specificType != null) { - process("parseItemValue - " + specificType.getLocalPart() + " (QName)", - p -> p.type(specificType).parseItemValue(), - serializer, serId); - } - - process("parseRealValue - no hint", - p -> ((C) p.parseRealValue()).asPrismContainerValue(), - serializer, serId); - - if (clazz != null) { - process("parseRealValue - " + clazz.getSimpleName() + ".class", - p -> p.parseRealValue(clazz).asPrismContainerValue(), - serializer, serId); - } - - if (specificClass != null) { - process("parseRealValue - " + specificClass.getSimpleName() + ".class", - p -> p.parseRealValue(specificClass).asPrismContainerValue(), - serializer, serId); - } - - if (type != null) { - process("parseRealValue - " + type.getLocalPart() + " (QName)", - p -> ((C) p.type(type).parseRealValue()).asPrismContainerValue(), - serializer, serId); - } - - if (specificType != null) { - process("parseRealValue - " + specificType.getLocalPart() + " (QName)", - p -> ((C) p.type(specificType).parseRealValue()).asPrismContainerValue(), - serializer, serId); - } - - process("parseAnyData", - p -> ((PrismContainer) p.parseItemOrRealValue()).getValue(0), - serializer, serId); + protected boolean isContainer() { + return false; } - - protected abstract void assertPrismContainerValue(PrismContainerValue value) throws SchemaException; - protected PrismContext getPrismContext() { return PrismTestUtil.getPrismContext(); } diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/AbstractPropertyValueParserTest.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/AbstractPropertyValueParserTest.java new file mode 100644 index 00000000000..bb9065e439d --- /dev/null +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/AbstractPropertyValueParserTest.java @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.schema.parser; + +import com.evolveum.midpoint.prism.*; +import com.evolveum.midpoint.prism.util.PrismTestUtil; +import com.evolveum.midpoint.util.exception.SchemaException; + +import javax.xml.namespace.QName; + +/** + * @author mederly + */ +public abstract class AbstractPropertyValueParserTest extends AbstractParserTest> { + + @SuppressWarnings("Convert2MethodRef") + protected void processParsings(Class clazz, QName type, PrismPropertyDefinition definition, SerializingFunction> serializer, String serId) throws Exception { + process("parseItemValue - no hint", p -> p.parseItemValue(), serializer, serId); + + if (clazz != null) { + process("parseItemValue - " + clazz.getSimpleName() + ".class", + p -> p.type(clazz).parseItemValue(), + serializer, serId); + } + + if (type != null) { + process("parseItemValue - " + type.getLocalPart() + " (QName)", + p -> p.type(type).parseItemValue(), + serializer, serId); + } + + process("parseRealValue - no hint", + p -> makePPV((T) p.parseRealValue(), definition), + serializer, serId); + + if (clazz != null) { + process("parseRealValue - " + clazz.getSimpleName() + ".class", + p -> makePPV(p.parseRealValue(clazz), definition), + serializer, serId); + } + + if (type != null) { + process("parseRealValue - " + type.getLocalPart() + " (QName)", + p -> makePPV((T) p.type(type).parseRealValue(), definition), + serializer, serId); + } + +// process("parseAnyData", +// p -> ((PrismContainer) p.parseItemOrRealValue()).getValue(0), +// serializer, serId); + } + + protected PrismPropertyValue makePPV(T realValue, PrismPropertyDefinition definition) { + PrismProperty property = definition.instantiate(); + property.setRealValue(realValue); + return property.getAnyValue(); + } + + protected boolean isContainer() { + return true; + } + + @Override + protected void assertPrismValue(PrismPropertyValue value) throws SchemaException { + assertDefinitions(value); + assertPrismContext(value); + assertPrismPropertyValueLocal(value); + } + + protected abstract void assertPrismPropertyValueLocal(PrismPropertyValue value) throws SchemaException; + + protected PrismContext getPrismContext() { + return PrismTestUtil.getPrismContext(); + } + +} diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/TestParseCertificationCase.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/TestParseCertificationCase.java index bde010cc1fc..dc38660453a 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/TestParseCertificationCase.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/TestParseCertificationCase.java @@ -37,7 +37,7 @@ * */ @SuppressWarnings("Convert2MethodRef") -public class TestParseCertificationCase extends AbstractParserTest { +public class TestParseCertificationCase extends AbstractContainerValueParserTest { @Override protected File getFile() { @@ -66,16 +66,12 @@ private void processParsings(SerializingFunction value) throws SchemaException { - - assertDefinitions(value); + public void assertPrismContainerValueLocal(PrismContainerValue value) throws SchemaException { assertPrismValue(value); assertJaxb(value.asContainerable()); - - //pcv.checkConsistence(true, true); } - private void assertPrismValue(PrismContainerValue pcv) { + protected void assertPrismValue(PrismContainerValue pcv) { assertEquals("Wrong id", (Long) 4L, pcv.getId()); ComplexTypeDefinition ctd = pcv.getComplexTypeDefinition(); assertNotNull("No CTD", ctd); diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/TestParseMapping.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/TestParseMapping.java new file mode 100644 index 00000000000..0bf15e61f27 --- /dev/null +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/TestParseMapping.java @@ -0,0 +1,111 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.schema.parser; + +import com.evolveum.midpoint.prism.PrismContainerValue; +import com.evolveum.midpoint.prism.PrismPropertyDefinition; +import com.evolveum.midpoint.prism.PrismPropertyValue; +import com.evolveum.midpoint.schema.SchemaConstantsGenerated; +import com.evolveum.midpoint.util.exception.SchemaException; +import com.evolveum.midpoint.xml.ns._public.common.common_3.MappingType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.MappingsType; +import com.evolveum.prism.xml.ns._public.types_3.RawType; +import org.testng.AssertJUnit; +import org.testng.annotations.Test; + +import javax.xml.namespace.QName; +import java.io.File; + +/** + * @author mederly + * + */ +@SuppressWarnings("Convert2MethodRef") +public class TestParseMapping extends AbstractPropertyValueParserTest { + + @Override + protected File getFile() { + return getFile("mapping"); + } + + @Test + public void testParseFile() throws Exception { + displayTestTitle("testParseFile"); + processParsings(null, null); + } + +// @Test +// public void testParseRoundTrip() throws Exception{ +// displayTestTitle("testParseRoundTrip"); +// +// //processParsings(v -> getPrismContext().serializerFor(language).serialize(v)); // no item name nor definition => cannot serialize +// processParsings(v -> getPrismContext().serializerFor(language).root(new QName("dummy")).serialize(v), "s1"); +// processParsings(v -> getPrismContext().serializerFor(language).root(SchemaConstantsGenerated.C_USER).serialize(v), "s2"); // misleading item name +// processParsings(v -> getPrismContext().serializerFor(language).serializeRealValue(v.asContainerable()), "s3"); +// processParsings(v -> getPrismContext().serializerFor(language).root(new QName("dummy")).serializeAnyData(v.asContainerable()), "s4"); +// } + + private void processParsings(SerializingFunction> serializer, String serId) throws Exception { + PrismPropertyDefinition definition = getPrismContext().getSchemaRegistry().findPropertyDefinitionByElementName(SchemaConstantsGenerated.C_MAPPING); + processParsings(MappingType.class, MappingsType.COMPLEX_TYPE, definition, serializer, serId); + } + + // a bit of hack: RawType gets parsed very soon, so we must test for it almost immediately after parsing + @Override + protected PrismPropertyValue makePPV(MappingType mapping, PrismPropertyDefinition definition) { + RawType variableValue = (RawType) mapping.getExpression().getVariable().get(0).getValue(); + AssertJUnit.assertNull("Unexpected raw value in expression variable: " + variableValue.getXnode(), variableValue.getXnode()); + return super.makePPV(mapping, definition); + } + + @Override + protected void assertPrismPropertyValueLocal(PrismPropertyValue value) throws SchemaException { + // todo + } + + // private void assertPrismValue(PrismContainerValue pcv) { +// assertEquals("Wrong id", (Long) 4L, pcv.getId()); +// ComplexTypeDefinition ctd = pcv.getComplexTypeDefinition(); +// assertNotNull("No CTD", ctd); +// //noinspection ConstantConditions +// assertEquals("Wrong CTD typeName", AccessCertificationAssignmentCaseType.COMPLEX_TYPE, ctd.getTypeName()); +// assertEquals("Wrong real class in PCV", AccessCertificationAssignmentCaseType.class, pcv.getRealClass()); +// } + +// private void assertJaxb(AccessCertificationCaseType aCase) throws SchemaException { +// PrismAsserts.assertRefEquivalent("Wrong objectRef", +// new PrismReferenceValue("ee53eba7-5c16-4c16-ad15-dd6a2360ab1a", UserType.COMPLEX_TYPE), +// aCase.getObjectRef().asReferenceValue()); +// PrismAsserts.assertRefEquivalent("Wrong targetRef", +// new PrismReferenceValue("ef2bc95b-76e0-48e2-86d6-3d4f02d3e1a2", ResourceType.COMPLEX_TYPE), +// aCase.getTargetRef().asReferenceValue()); +// +// assertTrue(aCase instanceof AccessCertificationAssignmentCaseType); +// AccessCertificationAssignmentCaseType assignmentCase = (AccessCertificationAssignmentCaseType) aCase; +// +// assertNotNull("no assignment", assignmentCase.getAssignment()); +// assertEquals((Long) 1L, assignmentCase.getAssignment().getId()); +// PrismAsserts.assertRefEquivalent("Wrong resourceRef in assignment", +// new PrismReferenceValue("ef2bc95b-76e0-48e2-86d6-3d4f02d3e1a2", ResourceType.COMPLEX_TYPE), +// assignmentCase.getAssignment().getConstruction().getResourceRef().asReferenceValue()); +// assertEquals("wrong isInducement", Boolean.FALSE, assignmentCase.isIsInducement()); +// } + + @Override + protected boolean isContainer() { + return false; + } +} diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/TestParseMappings.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/TestParseMappings.java new file mode 100644 index 00000000000..07bc58b884b --- /dev/null +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/TestParseMappings.java @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.schema.parser; + +import com.evolveum.midpoint.prism.PrismContainerValue; +import com.evolveum.midpoint.schema.SchemaConstantsGenerated; +import com.evolveum.midpoint.util.exception.SchemaException; +import com.evolveum.midpoint.xml.ns._public.common.common_3.*; +import org.testng.annotations.Test; + +import javax.xml.namespace.QName; +import java.io.File; + +/** + * TODO finish + * @author mederly + * + */ +@SuppressWarnings("Convert2MethodRef") +public class TestParseMappings extends AbstractContainerValueParserTest { + + @Override + protected File getFile() { + return getFile("mappings"); + } + + @Test + public void testParseFile() throws Exception { + displayTestTitle("testParseFile"); + processParsings(null, null); + } + + @Test + public void testParseRoundTrip() throws Exception{ + displayTestTitle("testParseRoundTrip"); + + //processParsings(v -> getPrismContext().serializerFor(language).serialize(v)); // no item name nor definition => cannot serialize + processParsings(v -> getPrismContext().serializerFor(language).root(new QName("dummy")).serialize(v), "s1"); + processParsings(v -> getPrismContext().serializerFor(language).root(SchemaConstantsGenerated.C_USER).serialize(v), "s2"); // misleading item name + processParsings(v -> getPrismContext().serializerFor(language).root(new QName("dummy")).serializeRealValue(v.asContainerable()), "s3"); + processParsings(v -> getPrismContext().serializerFor(language).root(new QName("dummy")).serializeAnyData(v.asContainerable()), "s4"); + } + + private void processParsings(SerializingFunction> serializer, String serId) throws Exception { + processParsings(MappingsType.class, null, MappingsType.COMPLEX_TYPE, null, serializer, serId); + } + + @Override + public void assertPrismContainerValueLocal(PrismContainerValue value) throws SchemaException { +// assertPrismValue(value); +// assertJaxb(value.asContainerable()); + } + +// private void assertPrismValue(PrismContainerValue pcv) { +// assertEquals("Wrong id", (Long) 4L, pcv.getId()); +// ComplexTypeDefinition ctd = pcv.getComplexTypeDefinition(); +// assertNotNull("No CTD", ctd); +// //noinspection ConstantConditions +// assertEquals("Wrong CTD typeName", AccessCertificationAssignmentCaseType.COMPLEX_TYPE, ctd.getTypeName()); +// assertEquals("Wrong real class in PCV", AccessCertificationAssignmentCaseType.class, pcv.getRealClass()); +// } + +// private void assertJaxb(AccessCertificationCaseType aCase) throws SchemaException { +// PrismAsserts.assertRefEquivalent("Wrong objectRef", +// new PrismReferenceValue("ee53eba7-5c16-4c16-ad15-dd6a2360ab1a", UserType.COMPLEX_TYPE), +// aCase.getObjectRef().asReferenceValue()); +// PrismAsserts.assertRefEquivalent("Wrong targetRef", +// new PrismReferenceValue("ef2bc95b-76e0-48e2-86d6-3d4f02d3e1a2", ResourceType.COMPLEX_TYPE), +// aCase.getTargetRef().asReferenceValue()); +// +// assertTrue(aCase instanceof AccessCertificationAssignmentCaseType); +// AccessCertificationAssignmentCaseType assignmentCase = (AccessCertificationAssignmentCaseType) aCase; +// +// assertNotNull("no assignment", assignmentCase.getAssignment()); +// assertEquals((Long) 1L, assignmentCase.getAssignment().getId()); +// PrismAsserts.assertRefEquivalent("Wrong resourceRef in assignment", +// new PrismReferenceValue("ef2bc95b-76e0-48e2-86d6-3d4f02d3e1a2", ResourceType.COMPLEX_TYPE), +// assignmentCase.getAssignment().getConstruction().getResourceRef().asReferenceValue()); +// assertEquals("wrong isInducement", Boolean.FALSE, assignmentCase.isIsInducement()); +// } + + @Override + protected boolean isContainer() { + return false; + } +} diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/TestParseResource.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/TestParseResource.java index 6aabd7b1977..7e7604ff608 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/TestParseResource.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/TestParseResource.java @@ -61,7 +61,7 @@ * @author semancik * */ -public class TestParseResource extends AbstractParserTest { +public class TestParseResource extends AbstractContainerValueParserTest { @Override protected File getFile() { @@ -204,7 +204,7 @@ public void testSchemaRoundtrip() throws Exception { } @Override - protected void assertPrismContainerValue(PrismContainerValue value) throws SchemaException { + protected void assertPrismContainerValueLocal(PrismContainerValue value) throws SchemaException { //assertResource(object.asContainerable().asPrismObject(), true, true); } @@ -262,8 +262,8 @@ private void assertResourcePrism(PrismObject resource, boolean isS new ItemPath(new QName("extension"), new QName("extConnType")), path); PrismPropertyValue filterValue = (PrismPropertyValue) equalFilter.getValues().get(0); - //assertEquals("Wrong filter value", "org.identityconnectors.ldap.LdapConnector", ((RawType) filterValue.getValue()).getParsedRealValue(String.class).trim()); - assertEquals("Wrong filter value", "org.identityconnectors.ldap.LdapConnector", ((String) filterValue.getValue()).trim()); + assertEquals("Wrong filter value", "org.identityconnectors.ldap.LdapConnector", ((RawType) filterValue.getValue()).getParsedRealValue(String.class).trim()); + //assertEquals("Wrong filter value", "org.identityconnectors.ldap.LdapConnector", ((String) filterValue.getValue()).trim()); } EvaluationTimeType resolutionTime = connectorRefVal.getResolutionTime(); if (isSimple) { diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/TestParseShadow.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/TestParseShadow.java index a83bdd8be2f..7a0b12b8405 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/TestParseShadow.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/TestParseShadow.java @@ -88,8 +88,7 @@ private void processParsingsPO(SerializingFunction> seri @Override - protected void assertPrismContainerValue(PrismContainerValue value) throws SchemaException { - assertDefinitions(value); + protected void assertPrismContainerValueLocal(PrismContainerValue value) throws SchemaException { PrismObject object = value.asContainerable().asPrismObject(); object.checkConsistence(); assertPrism(object, false); @@ -97,12 +96,9 @@ protected void assertPrismContainerValue(PrismContainerValue value) } @Override - protected void assertPrismObject(PrismObject object) throws SchemaException { - object.checkConsistence(); - assertDefinitions(object); + protected void assertPrismObjectLocal(PrismObject object) throws SchemaException { assertPrism(object, true); assertJaxb(object.asObjectable(), true); - object.checkConsistence(true, false); } diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/TestParseUser.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/TestParseUser.java index 632a7bec342..dd237ee2e82 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/TestParseUser.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/TestParseUser.java @@ -107,8 +107,7 @@ private void processParsingsPO(SerializingFunction> serial } @Override - protected void assertPrismContainerValue(PrismContainerValue value) throws SchemaException { - assertDefinitions(value); + protected void assertPrismContainerValueLocal(PrismContainerValue value) throws SchemaException { PrismObject user = value.asContainerable().asPrismObject(); user.checkConsistence(); assertUserPrism(user, false); @@ -116,12 +115,9 @@ protected void assertPrismContainerValue(PrismContainerValue value) th } @Override - protected void assertPrismObject(PrismObject user) throws SchemaException { - user.checkConsistence(); - assertDefinitions(user); + protected void assertPrismObjectLocal(PrismObject user) throws SchemaException { assertUserPrism(user, true); assertUserJaxb(user.asObjectable(), true); - user.checkConsistence(true, true); } diff --git a/infra/schema/src/test/resources/common/xml/ns/mapping.xml b/infra/schema/src/test/resources/common/xml/ns/mapping.xml new file mode 100644 index 00000000000..2733cf5a6bc --- /dev/null +++ b/infra/schema/src/test/resources/common/xml/ns/mapping.xml @@ -0,0 +1,45 @@ + + + + + + $user/name + + + + x:foo + Captain + + + y:sailor + + + + + diff --git a/infra/schema/src/test/resources/common/xml/ns/mappings.xml b/infra/schema/src/test/resources/common/xml/ns/mappings.xml new file mode 100644 index 00000000000..dafd2b0013b --- /dev/null +++ b/infra/schema/src/test/resources/common/xml/ns/mappings.xml @@ -0,0 +1,47 @@ + + + + + + + $user/name + + + + x:foo + Captain + + + y:sailor + + + + + + diff --git a/infra/schema/testng-unit.xml b/infra/schema/testng-unit.xml index 4d4e0645c74..e64be1c26d5 100644 --- a/infra/schema/testng-unit.xml +++ b/infra/schema/testng-unit.xml @@ -24,6 +24,8 @@ + + diff --git a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/ExpressionUtil.java b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/ExpressionUtil.java index 1a51d294895..3c75d305cc9 100644 --- a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/ExpressionUtil.java +++ b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/ExpressionUtil.java @@ -15,15 +15,12 @@ */ package com.evolveum.midpoint.model.common.expression; -import java.util.ArrayList; import java.util.Collection; -import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; -import javax.script.Bindings; import javax.xml.namespace.QName; import com.evolveum.midpoint.model.common.expression.functions.BasicExpressionFunctions; @@ -225,7 +222,12 @@ public static Object resolvePath(ItemPath path, ExpressionVariables variables, O } public static Object convertVariableValue(Object originalValue, String variableName, ObjectResolver objectResolver, - String contextDescription, Task task, OperationResult result) throws ExpressionSyntaxException, ObjectNotFoundException { + String contextDescription, PrismContext prismContext, Task task, OperationResult result) throws ExpressionSyntaxException, ObjectNotFoundException { + if (originalValue instanceof PrismValue) { + ((PrismValue) originalValue).setPrismContext(prismContext); // TODO - or revive? Or make sure prismContext is set here? + } else if (originalValue instanceof Item) { + ((Item) originalValue).setPrismContext(prismContext); // TODO - or revive? Or make sure prismContext is set here? + } if (originalValue instanceof ObjectReferenceType) { try { originalValue = resolveReference((ObjectReferenceType)originalValue, objectResolver, variableName, @@ -294,7 +296,7 @@ public static Object convertVariableValue(Object originalValue, String variableN public static Map prepareScriptVariables(ExpressionVariables variables, ObjectResolver objectResolver, Collection functions, - String contextDescription, Task task, OperationResult result) throws ExpressionSyntaxException, ObjectNotFoundException { + String contextDescription, PrismContext prismContext, Task task, OperationResult result) throws ExpressionSyntaxException, ObjectNotFoundException { Map scriptVariables = new HashMap<>(); // Functions if (functions != null) { @@ -310,7 +312,7 @@ public static Map prepareScriptVariables(ExpressionVariables vari continue; } String variableName = variableEntry.getKey().getLocalPart(); - Object variableValue = ExpressionUtil.convertVariableValue(variableEntry.getValue(), variableName, objectResolver, contextDescription, task, result); + Object variableValue = ExpressionUtil.convertVariableValue(variableEntry.getValue(), variableName, objectResolver, contextDescription, prismContext, task, result); scriptVariables.put(variableName, variableValue); } } @@ -674,7 +676,7 @@ private static V evaluateExpression(ExpressionVariables v DOMUtil.XSD_STRING, prismContext); } - return evaluateExpression(variables, outputDefinition, expressionType, expressionFactory, shortDesc, + return (V) evaluateExpression(variables, outputDefinition, expressionType, expressionFactory, shortDesc, task, parentResult); // String expressionResult = diff --git a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/script/jsr223/Jsr223ScriptEvaluator.java b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/script/jsr223/Jsr223ScriptEvaluator.java index 9b7530154d9..2825399ae4f 100644 --- a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/script/jsr223/Jsr223ScriptEvaluator.java +++ b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/script/jsr223/Jsr223ScriptEvaluator.java @@ -220,7 +220,7 @@ private Bindings convertToBindings(ExpressionVariables variables, ObjectResolver Collection functions, String contextDescription, Task task, OperationResult result) throws ExpressionSyntaxException, ObjectNotFoundException { Bindings bindings = scriptEngine.createBindings(); - bindings.putAll(ExpressionUtil.prepareScriptVariables(variables, objectResolver, functions, contextDescription, task, result)); + bindings.putAll(ExpressionUtil.prepareScriptVariables(variables, objectResolver, functions, contextDescription, prismContext, task, result)); return bindings; } diff --git a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/script/velocity/VelocityScriptEvaluator.java b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/script/velocity/VelocityScriptEvaluator.java index 82c8ff0cf08..e1849759f3a 100644 --- a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/script/velocity/VelocityScriptEvaluator.java +++ b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/script/velocity/VelocityScriptEvaluator.java @@ -125,7 +125,8 @@ private VelocityContext createVelocityContext(ExpressionVariables variables, Obj Collection functions, String contextDescription, Task task, OperationResult result) throws ExpressionSyntaxException, ObjectNotFoundException { VelocityContext context = new VelocityContext(); - Map scriptVariables = ExpressionUtil.prepareScriptVariables(variables, objectResolver, functions, contextDescription, task, result); + Map scriptVariables = ExpressionUtil.prepareScriptVariables(variables, objectResolver, functions, contextDescription, + prismContext, task, result); for (Map.Entry scriptVariable : scriptVariables.entrySet()) { context.put(scriptVariable.getKey(), scriptVariable.getValue()); } diff --git a/model/model-common/src/test/resources/mapping/account-inbound-mapping.xml b/model/model-common/src/test/resources/mapping/account-inbound-mapping.xml index 04865366b56..5db0633589c 100644 --- a/model/model-common/src/test/resources/mapping/account-inbound-mapping.xml +++ b/model/model-common/src/test/resources/mapping/account-inbound-mapping.xml @@ -28,6 +28,6 @@ ri:AccountObjectClass CN=Pavol Rufus/O=SEPSAS/C=SK - pavolr + pavolr diff --git a/repo/repo-test-util/src/main/java/com/evolveum/midpoint/test/IntegrationTestTools.java b/repo/repo-test-util/src/main/java/com/evolveum/midpoint/test/IntegrationTestTools.java index 1602419d3a5..3910d01a674 100644 --- a/repo/repo-test-util/src/main/java/com/evolveum/midpoint/test/IntegrationTestTools.java +++ b/repo/repo-test-util/src/main/java/com/evolveum/midpoint/test/IntegrationTestTools.java @@ -277,11 +277,14 @@ public static void assertAttributeNotNull(String message, ShadowType repoShadow, } public static void assertAttributeDefinition(ResourceAttribute attr, QName expectedType, int minOccurs, int maxOccurs, - boolean canRead, boolean canCreate, boolean canUpdate, Class expetcedAttributeDefinitionClass) { + boolean canRead, boolean canCreate, boolean canUpdate, Class expectedAttributeDefinitionClass) { ResourceAttributeDefinition definition = attr.getDefinition(); QName attrName = attr.getElementName(); assertNotNull("No definition for attribute "+attrName, definition); - assertEquals("Wrong class of definition for attribute"+attrName, expetcedAttributeDefinitionClass, definition.getClass()); + //assertEquals("Wrong class of definition for attribute"+attrName, expetcedAttributeDefinitionClass, definition.getClass()); + assertTrue("Wrong class of definition for attribute"+attrName+" (expected: " + expectedAttributeDefinitionClass + + ", real: " + definition.getClass() + ")", + expectedAttributeDefinitionClass.isAssignableFrom(definition.getClass())); assertEquals("Wrong type in definition for attribute"+attrName, expectedType, definition.getTypeName()); assertEquals("Wrong minOccurs in definition for attribute"+attrName, minOccurs, definition.getMinOccurs()); assertEquals("Wrong maxOccurs in definition for attribute"+attrName, maxOccurs, definition.getMaxOccurs()); @@ -912,7 +915,7 @@ public static ShadowAssociationType assertAssociation(PrismObject sh } } AssertJUnit.fail("No association for entitlement "+entitlementOid+" in "+shadow); - return null; // notreached + throw new IllegalStateException("not reached"); } public static void assertNoAssociation(PrismObject shadow, QName associationName, String entitlementOid) { From 7c5ae43387fb847ed9b9c3a6984dffd211938c3d Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Tue, 25 Oct 2016 01:04:48 +0200 Subject: [PATCH 51/74] Interim commit. --- dist/midpoint-api/pom.xml | 6 + .../prism/ContainerWrapperFactory.java | 4 +- infra/common/pom.xml | 4 + ...CompositeRefinedObjectClassDefinition.java | 593 +------ ...ositeRefinedObjectClassDefinitionImpl.java | 665 ++++++++ .../LayerRefinedAttributeDefinitionImpl.java | 9 +- .../LayerRefinedObjectClassDefinition.java | 25 +- ...LayerRefinedObjectClassDefinitionImpl.java | 79 +- .../refinery/RefinedAttributeDefinition.java | 9 + .../RefinedAttributeDefinitionImpl.java | 13 +- .../RefinedObjectClassDefinition.java | 154 +- .../RefinedObjectClassDefinitionImpl.java | 1357 +++++++++-------- .../refinery/RefinedResourceSchemaImpl.java | 6 +- .../common/refinery/TestRefinedSchema.java | 6 +- .../midpoint/prism/ComplexTypeDefinition.java | 66 +- .../prism/ComplexTypeDefinitionImpl.java | 35 +- .../evolveum/midpoint/prism/Definition.java | 6 +- .../midpoint/prism/DefinitionImpl.java | 6 +- .../midpoint/prism/ItemDefinition.java | 9 + .../midpoint/prism/ItemDefinitionImpl.java | 14 +- .../prism/PrismContainerDefinition.java | 2 + .../prism/PrismContainerDefinitionImpl.java | 15 +- .../midpoint/prism/PrismContextImpl.java | 15 +- .../midpoint/prism/PrismObjectDefinition.java | 1 + .../prism/PrismObjectDefinitionImpl.java | 1 + .../prism/PrismPropertyDefinition.java | 2 + .../prism/PrismPropertyDefinitionImpl.java | 2 + .../prism/PrismReferenceDefinition.java | 2 + .../prism/PrismReferenceDefinitionImpl.java | 1 + .../midpoint/prism/PrismSerializer.java | 5 + .../prism/marshaller/PrismMarshaller.java | 15 +- .../prism/marshaller/PrismSerializerImpl.java | 75 +- .../prism/schema/DefinitionsStore.java | 6 +- .../prism/schema/DomToSchemaProcessor.java | 6 +- .../prism/schema/GlobalDefinitionsStore.java | 2 +- .../midpoint/prism/util/PrismTestUtil.java | 6 +- .../midpoint/prism/xnode/ListXNode.java | 6 +- .../midpoint/prism/xnode/MapXNode.java | 8 +- .../evolveum/midpoint/prism/xnode/XNode.java | 3 + .../MidPointSchemaDefinitionFactory.java | 4 +- .../ObjectClassComplexTypeDefinition.java | 191 ++- .../ObjectClassComplexTypeDefinitionImpl.java | 268 +--- .../ResourceAttributeContainerDefinition.java | 2 + ...ourceAttributeContainerDefinitionImpl.java | 6 +- .../ResourceAttributeDefinition.java | 2 + .../ResourceAttributeDefinitionImpl.java | 12 +- .../SpecificAttributesDefinition.java | 32 + .../dataModel/DataModelVisualizerImpl.java | 4 +- .../impl/dataModel/VisualizationContext.java | 2 +- .../model/impl/lens/Construction.java | 2 +- .../projector/ConsolidationProcessor.java | 3 +- .../impl/lens/projector/InboundProcessor.java | 4 +- .../lens/projector/OutboundProcessor.java | 4 +- .../projector/ReconciliationProcessor.java | 6 +- .../impl/EntitlementConverter.java | 12 +- .../impl/ProvisioningContext.java | 7 +- .../impl/ResourceObjectConverter.java | 2 +- .../provisioning/impl/ShadowCache.java | 2 +- .../provisioning/impl/ShadowManager.java | 10 +- .../provisioning/util/ProvisioningUtil.java | 11 +- 60 files changed, 2082 insertions(+), 1743 deletions(-) create mode 100644 infra/common/src/main/java/com/evolveum/midpoint/common/refinery/CompositeRefinedObjectClassDefinitionImpl.java create mode 100644 infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/SpecificAttributesDefinition.java diff --git a/dist/midpoint-api/pom.xml b/dist/midpoint-api/pom.xml index cb7541e5059..450bc73fdb1 100644 --- a/dist/midpoint-api/pom.xml +++ b/dist/midpoint-api/pom.xml @@ -66,6 +66,12 @@ 3.5-SNAPSHOT compile + + + + + + com.evolveum.midpoint.infra util diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/ContainerWrapperFactory.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/ContainerWrapperFactory.java index a9e15e017d1..017c8604713 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/ContainerWrapperFactory.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/ContainerWrapperFactory.java @@ -267,7 +267,7 @@ private List createProperties(ContainerWrapper cWrapper, OperationR throw new SystemException(e.getMessage(), e); } // Make sure even empty associations have their wrappers so they can be displayed and edited - for (RefinedAssociationDefinition assocDef : rOcDef.getAssociations()) { + for (RefinedAssociationDefinition assocDef : rOcDef.getAssociationDefinitions()) { QName name = assocDef.getName(); if (!assocMap.containsKey(name)) { PrismContainer fractionalContainer = new PrismContainer<>(ShadowType.F_ASSOCIATION, ShadowAssociationType.class, prismContext); @@ -279,7 +279,7 @@ private List createProperties(ContainerWrapper cWrapper, OperationR } for (Map.Entry> assocEntry : assocMap.entrySet()) { - RefinedAssociationDefinition assocRDef = rOcDef.findAssociation(assocEntry.getKey()); + RefinedAssociationDefinition assocRDef = rOcDef.findAssociationDefinition(assocEntry.getKey()); AssociationWrapper assocWrapper = new AssociationWrapper(cWrapper, assocEntry.getValue(), cWrapper.isReadonly(), ValueStatus.NOT_CHANGED, assocRDef); properties.add(assocWrapper); diff --git a/infra/common/pom.xml b/infra/common/pom.xml index d2578e63908..be166efcafe 100644 --- a/infra/common/pom.xml +++ b/infra/common/pom.xml @@ -59,6 +59,10 @@ commons-configuration commons-configuration + + commons-collections + commons-collections + xml-apis xml-apis diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/CompositeRefinedObjectClassDefinition.java b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/CompositeRefinedObjectClassDefinition.java index 60f51d8ddaf..8006644fdab 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/CompositeRefinedObjectClassDefinition.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/CompositeRefinedObjectClassDefinition.java @@ -15,604 +15,21 @@ */ package com.evolveum.midpoint.common.refinery; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.List; -import java.util.stream.Stream; - -import javax.xml.namespace.QName; - -import com.evolveum.midpoint.common.ResourceObjectPattern; -import com.evolveum.midpoint.prism.*; -import com.evolveum.midpoint.prism.path.ItemPath; -import com.evolveum.midpoint.prism.query.ObjectQuery; -import com.evolveum.midpoint.prism.schema.SchemaRegistry; -import com.evolveum.midpoint.schema.ResourceShadowDiscriminator; -import com.evolveum.midpoint.schema.processor.ObjectClassComplexTypeDefinition; -import com.evolveum.midpoint.schema.processor.ResourceAttributeContainer; -import com.evolveum.midpoint.schema.processor.ResourceAttributeContainerDefinition; -import com.evolveum.midpoint.schema.processor.ResourceAttributeDefinition; -import com.evolveum.midpoint.schema.util.ObjectQueryUtil; -import com.evolveum.midpoint.schema.util.SchemaDebugUtil; -import com.evolveum.midpoint.util.DebugUtil; -import com.evolveum.midpoint.util.QNameUtil; -import com.evolveum.midpoint.util.exception.SchemaException; -import com.evolveum.midpoint.xml.ns._public.common.common_3.*; -import com.evolveum.midpoint.xml.ns._public.resource.capabilities_3.CapabilityType; -import com.evolveum.midpoint.xml.ns._public.resource.capabilities_3.PagedSearchCapabilityType; -import com.evolveum.prism.xml.ns._public.types_3.ItemPathType; import org.jetbrains.annotations.NotNull; +import java.util.Collection; + /** * Used to represent combined definition of structural and auxiliary object classes. * * @author semancik * */ -public class CompositeRefinedObjectClassDefinition implements RefinedObjectClassDefinition { - - @NotNull private final RefinedObjectClassDefinition structuralObjectClassDefinition; - @NotNull private final Collection auxiliaryObjectClassDefinitions; - - private PrismObjectDefinition objectDefinition; - - public CompositeRefinedObjectClassDefinition(@NotNull RefinedObjectClassDefinition structuralObjectClassDefinition, Collection auxiliaryObjectClassDefinitions) { - this.structuralObjectClassDefinition = structuralObjectClassDefinition; - if (auxiliaryObjectClassDefinitions != null) { - this.auxiliaryObjectClassDefinitions = auxiliaryObjectClassDefinitions; - } else { - this.auxiliaryObjectClassDefinitions = new ArrayList<>(); - } - } - - public RefinedObjectClassDefinition getStructuralObjectClassDefinition() { - return structuralObjectClassDefinition; - } - - public Collection getAuxiliaryObjectClassDefinitions() { - return auxiliaryObjectClassDefinitions; - } - - @Override - public PrismObjectDefinition getObjectDefinition() { - if (objectDefinition == null) { - objectDefinition = RefinedObjectClassDefinitionImpl.constructObjectDefinition(this); - } - return objectDefinition; - } - - public Class getCompileTimeClass() { - return structuralObjectClassDefinition.getCompileTimeClass(); - } - - public boolean isContainerMarker() { - return structuralObjectClassDefinition.isContainerMarker(); - } - - public boolean isPrimaryIdentifier(QName attrName) { - return structuralObjectClassDefinition.isPrimaryIdentifier(attrName); - } - - public boolean isObjectMarker() { - return structuralObjectClassDefinition.isObjectMarker(); - } +public interface CompositeRefinedObjectClassDefinition extends RefinedObjectClassDefinition { - public boolean isIgnored() { - return structuralObjectClassDefinition.isIgnored(); - } - - public boolean isEmphasized() { - return structuralObjectClassDefinition.isEmphasized(); - } - - public boolean isAbstract() { - return structuralObjectClassDefinition.isAbstract(); - } - - public QName getSuperType() { - return structuralObjectClassDefinition.getSuperType(); - } - - public boolean isSecondaryIdentifier(QName attrName) { - return structuralObjectClassDefinition.isSecondaryIdentifier(attrName); - } - - public boolean isDeprecated() { - return structuralObjectClassDefinition.isDeprecated(); - } - - public boolean isInherited() { - return structuralObjectClassDefinition.isInherited(); - } - - public Integer getDisplayOrder() { - return structuralObjectClassDefinition.getDisplayOrder(); - } - - public ResourceAttributeDefinition getDescriptionAttribute() { - return structuralObjectClassDefinition.getDescriptionAttribute(); - } - - public String getHelp() { - return structuralObjectClassDefinition.getHelp(); - } - - public RefinedAttributeDefinition getNamingAttribute() { - return structuralObjectClassDefinition.getNamingAttribute(); - } + RefinedObjectClassDefinition getStructuralObjectClassDefinition(); @NotNull - public QName getTypeName() { - return structuralObjectClassDefinition.getTypeName(); - } - - public String getNativeObjectClass() { - return structuralObjectClassDefinition.getNativeObjectClass(); - } - - public String getDocumentation() { - return structuralObjectClassDefinition.getDocumentation(); - } - - public boolean isDefaultInAKind() { - return structuralObjectClassDefinition.isDefaultInAKind(); - } - - public String getDocumentationPreview() { - return structuralObjectClassDefinition.getDocumentationPreview(); - } - - public String getIntent() { - return structuralObjectClassDefinition.getIntent(); - } - - public ShadowKindType getKind() { - return structuralObjectClassDefinition.getKind(); - } - - public boolean isRuntimeSchema() { - return structuralObjectClassDefinition.isRuntimeSchema(); - } - - public RefinedAttributeDefinition getDisplayNameAttribute() { - return structuralObjectClassDefinition.getDisplayNameAttribute(); - } - - @Override - public Collection> getPrimaryIdentifiers() { - return structuralObjectClassDefinition.getPrimaryIdentifiers(); - } - - @Override - public Collection> getSecondaryIdentifiers() { - return structuralObjectClassDefinition.getSecondaryIdentifiers(); - } - - @Override - public Collection> getAllIdentifiers() { - return structuralObjectClassDefinition.getAllIdentifiers(); - } - - public boolean isAuxiliary() { - return structuralObjectClassDefinition.isAuxiliary(); - } - - // TODO - ok??? - public Collection getAssociations() { - return structuralObjectClassDefinition.getAssociations(); - } - - public Collection getAssociations(ShadowKindType kind) { - return structuralObjectClassDefinition.getAssociations(kind); - } - - public Collection getNamesOfAssociations() { - return structuralObjectClassDefinition.getNamesOfAssociations(); - } - - public boolean isEmpty() { - return structuralObjectClassDefinition.isEmpty(); - } - - public Collection getProtectedObjectPatterns() { - return structuralObjectClassDefinition.getProtectedObjectPatterns(); - } - - public String getDisplayName() { - return structuralObjectClassDefinition.getDisplayName(); - } - - public String getDescription() { - return structuralObjectClassDefinition.getDescription(); - } - - public boolean isDefault() { - return structuralObjectClassDefinition.isDefault(); - } - - public ResourceType getResourceType() { - return structuralObjectClassDefinition.getResourceType(); - } - - public ObjectClassComplexTypeDefinition getObjectClassDefinition() { - return structuralObjectClassDefinition.getObjectClassDefinition(); - } - - public ResourceObjectReferenceType getBaseContext() { - return structuralObjectClassDefinition.getBaseContext(); - } - - public List getPasswordInbound() { - return structuralObjectClassDefinition.getPasswordInbound(); - } - - public MappingType getPasswordOutbound() { - return structuralObjectClassDefinition.getPasswordOutbound(); - } - - public AttributeFetchStrategyType getPasswordFetchStrategy() { - return structuralObjectClassDefinition.getPasswordFetchStrategy(); - } - - public ObjectReferenceType getPasswordPolicy() { - return structuralObjectClassDefinition.getPasswordPolicy(); - } - - public ResourceActivationDefinitionType getActivationSchemaHandling() { - return structuralObjectClassDefinition.getActivationSchemaHandling(); - } - - public ResourceBidirectionalMappingType getActivationBidirectionalMappingType(QName propertyName) { - return structuralObjectClassDefinition.getActivationBidirectionalMappingType(propertyName); - } - - public AttributeFetchStrategyType getActivationFetchStrategy(QName propertyName) { - return structuralObjectClassDefinition.getActivationFetchStrategy(propertyName); - } - - public boolean matches(ShadowType shadowType) { - return structuralObjectClassDefinition.matches(shadowType); - } - - public T getEffectiveCapability(Class capabilityClass) { - return structuralObjectClassDefinition.getEffectiveCapability(capabilityClass); - } - - public PagedSearchCapabilityType getPagedSearches() { - return structuralObjectClassDefinition.getPagedSearches(); - } - - public boolean isPagedSearchEnabled() { - return structuralObjectClassDefinition.isPagedSearchEnabled(); - } - - public boolean isObjectCountingEnabled() { - return structuralObjectClassDefinition.isObjectCountingEnabled(); - } - - @Override - public T findItemDefinition(@NotNull QName name, @NotNull Class clazz, boolean caseInsensitive) { - T itemDef = structuralObjectClassDefinition.findItemDefinition(name, clazz, caseInsensitive); - if (itemDef == null) { - for(RefinedObjectClassDefinition auxiliaryObjectClassDefinition: auxiliaryObjectClassDefinitions) { - itemDef = auxiliaryObjectClassDefinition.findItemDefinition(name, clazz, caseInsensitive); - if (itemDef != null) { - break; - } - } - } - return itemDef; - } - - @Override - public ID findNamedItemDefinition(@NotNull QName firstName, @NotNull ItemPath rest, - @NotNull Class clazz) { - throw new UnsupportedOperationException(); // implement if needed - } - - @Override - public Collection> getAttributeDefinitions() { - if (auxiliaryObjectClassDefinitions.isEmpty()) { - return structuralObjectClassDefinition.getAttributeDefinitions(); - } - Collection> defs = new ArrayList<>(); - defs.addAll((Collection)structuralObjectClassDefinition.getAttributeDefinitions()); - for(RefinedObjectClassDefinition auxiliaryObjectClassDefinition: auxiliaryObjectClassDefinitions) { - for (RefinedAttributeDefinition auxRAttrDef: auxiliaryObjectClassDefinition.getAttributeDefinitions()) { - boolean add = true; - for (RefinedAttributeDefinition def: defs) { - if (def.getName().equals(auxRAttrDef.getName())) { - add = false; - break; - } - } - if (add) { - ((Collection)defs).add(auxRAttrDef); - } - } - } - return defs; - } - - @Override - public PrismContext getPrismContext() { - return structuralObjectClassDefinition.getPrismContext(); - } - - @Override - public void revive(PrismContext prismContext) { - structuralObjectClassDefinition.revive(prismContext); - for (RefinedObjectClassDefinition auxiliaryObjectClassDefinition : auxiliaryObjectClassDefinitions) { - auxiliaryObjectClassDefinition.revive(prismContext); - } - } - - @Override - public List getDefinitions() { - return (List) getAttributeDefinitions(); - } - - @Override - public QName getExtensionForType() { - return structuralObjectClassDefinition.getExtensionForType(); - } - - @Override - public boolean isXsdAnyMarker() { - return structuralObjectClassDefinition.isXsdAnyMarker(); - } - - @Override - public String getDefaultNamespace() { - return structuralObjectClassDefinition.getDefaultNamespace(); - } - - @NotNull - @Override - public List getIgnoredNamespaces() { - return structuralObjectClassDefinition.getIgnoredNamespaces(); - } - - - @Override - public LayerRefinedObjectClassDefinition forLayer(LayerType layerType) { - throw new UnsupportedOperationException("TODO implement if needed"); - } - - @SuppressWarnings("unchecked") - @Override - public RefinedAttributeDefinition findAttributeDefinition(QName elementQName, boolean caseInsensitive) { - return (RefinedAttributeDefinition) findItemDefinition(elementQName, RefinedAttributeDefinition.class, caseInsensitive); - } - - public RefinedAssociationDefinition findAssociation(QName name) { - for (RefinedAssociationDefinition assocType: getAssociations()) { - if (QNameUtil.match(assocType.getName(), name)) { - return assocType; - } - } - return null; - } - - public Collection getEntitlementAssociations() { - return getAssociations(ShadowKindType.ENTITLEMENT); - } - - public RefinedAssociationDefinition findEntitlementAssociation(QName name) { - for (RefinedAssociationDefinition assocType: getEntitlementAssociations()) { - if (QNameUtil.match(assocType.getName(), name)) { - return assocType; - } - } - return null; - } - - @Override - public Collection getNamesOfAssociationsWithOutboundExpressions() { - throw new UnsupportedOperationException("TODO implement if needed"); - } - - @Override - public boolean hasAuxiliaryObjectClass(QName expectedObjectClassName) { - throw new UnsupportedOperationException("TODO implement if needed"); - } - - @Override - public ResourceAttributeContainer instantiate(QName elementName) { - throw new UnsupportedOperationException("TODO implement if needed"); - } - - @Override - public ID findItemDefinition(@NotNull ItemPath path, @NotNull Class clazz) { - throw new UnsupportedOperationException("TODO implement if needed"); - } - - @Override - public void merge(ComplexTypeDefinition otherComplexTypeDef) { - throw new UnsupportedOperationException("TODO implement if needed"); - } - - @Override - public String getResourceNamespace() { - return structuralObjectClassDefinition.getResourceNamespace(); - } - - @Override - public SchemaRegistry getSchemaRegistry() { - return getPrismContext().getSchemaRegistry(); - } - - // TODO solve this code duplication somehow - @Override - public RefinedAttributeDefinition getAttributeDefinition(QName attributeName) { - for (RefinedAttributeDefinition attrDef : getAttributeDefinitions()) { - if (QNameUtil.match(attrDef.getName(), attributeName)) { - return attrDef; - } - } - return null; - } - - // TODO - @Override - public Class getTypeClassIfKnown() { - return null; - } - - // TODO - @Override - public Class getTypeClass() { - return null; - } - - @Override - public boolean containsAttributeDefinition(ItemPathType pathType) { - return getDefinitionsStream() - .filter(def -> containsAttributeDefinition(pathType)) - .findAny() - .isPresent(); - } - - private Stream getDefinitionsStream() { - return Stream.concat(Stream.of(structuralObjectClassDefinition), auxiliaryObjectClassDefinitions.stream()); - } - - @Override - public boolean containsAttributeDefinition(QName attributeName) { - return getDefinitionsStream() - .filter(def -> containsAttributeDefinition(attributeName)) - .findAny() - .isPresent(); - } - - @Override - public ObjectQuery createShadowSearchQuery(String resourceOid) throws SchemaException { - return structuralObjectClassDefinition.createShadowSearchQuery(resourceOid); - } - - @Override - public PrismObject createBlankShadow() { - return structuralObjectClassDefinition.createBlankShadow(); - } - - @Override - public ResourceShadowDiscriminator getShadowDiscriminator() { - return structuralObjectClassDefinition.getShadowDiscriminator(); - } - - @Override - public Collection getNamesOfAttributesWithOutboundExpressions() { - throw new UnsupportedOperationException("TODO implement if needed"); - } - - @Override - public Collection getNamesOfAttributesWithInboundExpressions() { - throw new UnsupportedOperationException("TODO implement if needed"); - } - - @Override - public ResourcePasswordDefinitionType getPasswordDefinition() { - throw new UnsupportedOperationException("TODO implement if needed"); - } - - @Override - public CompositeRefinedObjectClassDefinition clone() { - RefinedObjectClassDefinition structuralObjectClassDefinitionClone = structuralObjectClassDefinition.clone(); - Collection auxiliaryObjectClassDefinitionsClone = null; - if (this.auxiliaryObjectClassDefinitions != null) { - auxiliaryObjectClassDefinitionsClone = new ArrayList<>(this.auxiliaryObjectClassDefinitions.size()); - for(RefinedObjectClassDefinition auxiliaryObjectClassDefinition: this.auxiliaryObjectClassDefinitions) { - auxiliaryObjectClassDefinitionsClone.add(auxiliaryObjectClassDefinition.clone()); - } - } - return new CompositeRefinedObjectClassDefinition(structuralObjectClassDefinitionClone, auxiliaryObjectClassDefinitionsClone); - } - - @Override - public int hashCode() { - final int prime = 31; - int result = super.hashCode(); - result = prime * result - + ((auxiliaryObjectClassDefinitions == null) ? 0 : auxiliaryObjectClassDefinitions.hashCode()); - result = prime * result - + ((structuralObjectClassDefinition == null) ? 0 : structuralObjectClassDefinition.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } -// if (!super.equals(obj)) { -// return false; -// } - if (getClass() != obj.getClass()) { - return false; - } - CompositeRefinedObjectClassDefinition other = (CompositeRefinedObjectClassDefinition) obj; - if (!auxiliaryObjectClassDefinitions.equals(other.auxiliaryObjectClassDefinitions)) { - return false; - } - if (!structuralObjectClassDefinition.equals(other.structuralObjectClassDefinition)) { - return false; - } - return true; - } - - @Override - public String debugDump() { - return debugDump(0); - } - - @Override - public String debugDump(int indent) { - return debugDump(indent, null); - } - - protected String debugDump(int indent, LayerType layer) { - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < indent; i++) { - sb.append(INDENT_STRING); - } - sb.append(getDebugDumpClassName()).append(": "); - sb.append(SchemaDebugUtil.prettyPrint(getTypeName())); - sb.append("\n"); - DebugUtil.debugDumpWithLabel(sb, "structural", structuralObjectClassDefinition, indent + 1); - sb.append("\n"); - DebugUtil.debugDumpWithLabel(sb, "auxiliary", auxiliaryObjectClassDefinitions, indent + 1); - return sb.toString(); - } - - /** - * Return a human readable name of this class suitable for logs. - */ -// @Override - protected String getDebugDumpClassName() { - return "crOCD"; - } + Collection getAuxiliaryObjectClassDefinitions(); - public String getHumanReadableName() { - if (getDisplayName() != null) { - return getDisplayName(); - } else { - return getKind()+":"+getIntent(); - } - } - - @Override - public String toString() { - if (auxiliaryObjectClassDefinitions.isEmpty()) { - return getDebugDumpClassName() + " ("+getTypeName()+")"; - } else { - StringBuilder sb = new StringBuilder(); - sb.append(getDebugDumpClassName()).append("(").append(getTypeName()); - for (RefinedObjectClassDefinition auxiliaryObjectClassDefinition: auxiliaryObjectClassDefinitions) { - sb.append("+").append(auxiliaryObjectClassDefinition.getTypeName()); - } - sb.append(")"); - return sb.toString(); - } - } } diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/CompositeRefinedObjectClassDefinitionImpl.java b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/CompositeRefinedObjectClassDefinitionImpl.java new file mode 100644 index 00000000000..1df65f31de1 --- /dev/null +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/CompositeRefinedObjectClassDefinitionImpl.java @@ -0,0 +1,665 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.common.refinery; + +import com.evolveum.midpoint.common.ResourceObjectPattern; +import com.evolveum.midpoint.prism.*; +import com.evolveum.midpoint.prism.path.ItemPath; +import com.evolveum.midpoint.prism.query.ObjectQuery; +import com.evolveum.midpoint.schema.ResourceShadowDiscriminator; +import com.evolveum.midpoint.schema.processor.ObjectClassComplexTypeDefinition; +import com.evolveum.midpoint.schema.processor.ResourceAttributeContainer; +import com.evolveum.midpoint.schema.util.SchemaDebugUtil; +import com.evolveum.midpoint.util.DebugUtil; +import com.evolveum.midpoint.util.QNameUtil; +import com.evolveum.midpoint.util.exception.SchemaException; +import com.evolveum.midpoint.xml.ns._public.common.common_3.*; +import com.evolveum.midpoint.xml.ns._public.resource.capabilities_3.CapabilityType; +import com.evolveum.midpoint.xml.ns._public.resource.capabilities_3.PagedSearchCapabilityType; +import com.evolveum.prism.xml.ns._public.types_3.ItemPathType; +import org.jetbrains.annotations.NotNull; + +import javax.xml.namespace.QName; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * Used to represent combined definition of structural and auxiliary object classes. + * + * @author semancik + * + */ +public class CompositeRefinedObjectClassDefinitionImpl implements CompositeRefinedObjectClassDefinition { + + @NotNull private final RefinedObjectClassDefinition structuralObjectClassDefinition; + @NotNull private final Collection auxiliaryObjectClassDefinitions; + + private PrismObjectDefinition objectDefinition; + + public CompositeRefinedObjectClassDefinitionImpl(@NotNull RefinedObjectClassDefinition structuralObjectClassDefinition, Collection auxiliaryObjectClassDefinitions) { + this.structuralObjectClassDefinition = structuralObjectClassDefinition; + if (auxiliaryObjectClassDefinitions != null) { + this.auxiliaryObjectClassDefinitions = auxiliaryObjectClassDefinitions; + } else { + this.auxiliaryObjectClassDefinitions = new ArrayList<>(); + } + } + + public RefinedObjectClassDefinition getStructuralObjectClassDefinition() { + return structuralObjectClassDefinition; + } + + @NotNull + @Override + public Collection getAuxiliaryObjectClassDefinitions() { + return auxiliaryObjectClassDefinitions; + } + + @Override + public PrismObjectDefinition getObjectDefinition() { + if (objectDefinition == null) { + objectDefinition = RefinedObjectClassDefinitionImpl.constructObjectDefinition(this); + } + return objectDefinition; + } + + @Override + public Class getCompileTimeClass() { + return structuralObjectClassDefinition.getCompileTimeClass(); + } + + @Override + public boolean isContainerMarker() { + return structuralObjectClassDefinition.isContainerMarker(); + } + + @Override + public boolean isPrimaryIdentifier(QName attrName) { + return structuralObjectClassDefinition.isPrimaryIdentifier(attrName); + } + + @Override + public boolean isObjectMarker() { + return structuralObjectClassDefinition.isObjectMarker(); + } + + @Override + public boolean isIgnored() { + return structuralObjectClassDefinition.isIgnored(); + } + + @Override + public boolean isEmphasized() { + return structuralObjectClassDefinition.isEmphasized(); + } + + @Override + public boolean isAbstract() { + return structuralObjectClassDefinition.isAbstract(); + } + + @Override + public QName getSuperType() { + return structuralObjectClassDefinition.getSuperType(); + } + + @Override + public boolean isSecondaryIdentifier(QName attrName) { + return structuralObjectClassDefinition.isSecondaryIdentifier(attrName); + } + + @Override + public boolean isDeprecated() { + return structuralObjectClassDefinition.isDeprecated(); + } + + @Override + public Integer getDisplayOrder() { + return structuralObjectClassDefinition.getDisplayOrder(); + } + + @Override + public RefinedAttributeDefinition getDescriptionAttribute() { + return structuralObjectClassDefinition.getDescriptionAttribute(); + } + + @Override + public String getHelp() { + return structuralObjectClassDefinition.getHelp(); + } + + @Override + public RefinedAttributeDefinition getNamingAttribute() { + return structuralObjectClassDefinition.getNamingAttribute(); + } + + @NotNull + @Override + public QName getTypeName() { + return structuralObjectClassDefinition.getTypeName(); + } + + @Override + public String getNativeObjectClass() { + return structuralObjectClassDefinition.getNativeObjectClass(); + } + + @Override + public String getDocumentation() { + return structuralObjectClassDefinition.getDocumentation(); + } + + @Override + public boolean isDefaultInAKind() { + return structuralObjectClassDefinition.isDefaultInAKind(); + } + + @Override + public String getDocumentationPreview() { + return structuralObjectClassDefinition.getDocumentationPreview(); + } + + @Override + public String getIntent() { + return structuralObjectClassDefinition.getIntent(); + } + + @Override + public ShadowKindType getKind() { + return structuralObjectClassDefinition.getKind(); + } + + @Override + public boolean isRuntimeSchema() { + return structuralObjectClassDefinition.isRuntimeSchema(); + } + + @Override + public RefinedAttributeDefinition getDisplayNameAttribute() { + return structuralObjectClassDefinition.getDisplayNameAttribute(); + } + + @NotNull + @Override + public Collection> getPrimaryIdentifiers() { + return structuralObjectClassDefinition.getPrimaryIdentifiers(); + } + + @NotNull + @Override + public Collection> getSecondaryIdentifiers() { + return structuralObjectClassDefinition.getSecondaryIdentifiers(); + } + + @Override + public Collection> getAllIdentifiers() { + return structuralObjectClassDefinition.getAllIdentifiers(); + } + + @Override + public boolean isAuxiliary() { + return structuralObjectClassDefinition.isAuxiliary(); + } + + // TODO - ok??? + @NotNull + @Override + public Collection getAssociationDefinitions() { + return structuralObjectClassDefinition.getAssociationDefinitions(); + } + + @Override + public Collection getAssociationDefinitions(ShadowKindType kind) { + return structuralObjectClassDefinition.getAssociationDefinitions(kind); + } + + @Override + public Collection getNamesOfAssociations() { + return structuralObjectClassDefinition.getNamesOfAssociations(); + } + + @Override + public boolean isEmpty() { + return structuralObjectClassDefinition.isEmpty() + && !auxiliaryObjectClassDefinitions.stream() + .filter(def -> def.isEmpty()) + .findAny().isPresent(); + } + + @Override + public Collection getProtectedObjectPatterns() { + return structuralObjectClassDefinition.getProtectedObjectPatterns(); + } + + @Override + public String getDisplayName() { + return structuralObjectClassDefinition.getDisplayName(); + } + + @Override + public String getDescription() { + return structuralObjectClassDefinition.getDescription(); + } + + @Override + public boolean isDefault() { + return structuralObjectClassDefinition.isDefault(); + } + + @Override + public ResourceType getResourceType() { + return structuralObjectClassDefinition.getResourceType(); + } + + @Override + public ObjectClassComplexTypeDefinition getObjectClassDefinition() { + return structuralObjectClassDefinition.getObjectClassDefinition(); + } + + @Override + public ResourceObjectReferenceType getBaseContext() { + return structuralObjectClassDefinition.getBaseContext(); + } + + @Override + public List getPasswordInbound() { + return structuralObjectClassDefinition.getPasswordInbound(); + } + + @Override + public MappingType getPasswordOutbound() { + return structuralObjectClassDefinition.getPasswordOutbound(); + } + + @Override + public AttributeFetchStrategyType getPasswordFetchStrategy() { + return structuralObjectClassDefinition.getPasswordFetchStrategy(); + } + + @Override + public ObjectReferenceType getPasswordPolicy() { + return structuralObjectClassDefinition.getPasswordPolicy(); + } + + @Override + public ResourceActivationDefinitionType getActivationSchemaHandling() { + return structuralObjectClassDefinition.getActivationSchemaHandling(); + } + + @Override + public ResourceBidirectionalMappingType getActivationBidirectionalMappingType(QName propertyName) { + return structuralObjectClassDefinition.getActivationBidirectionalMappingType(propertyName); + } + + @Override + public AttributeFetchStrategyType getActivationFetchStrategy(QName propertyName) { + return structuralObjectClassDefinition.getActivationFetchStrategy(propertyName); + } + + @Override + public boolean matches(ShadowType shadowType) { + return structuralObjectClassDefinition.matches(shadowType); + } + + public T getEffectiveCapability(Class capabilityClass) { + return structuralObjectClassDefinition.getEffectiveCapability(capabilityClass); + } + + @Override + public PagedSearchCapabilityType getPagedSearches() { + return structuralObjectClassDefinition.getPagedSearches(); + } + + @Override + public boolean isPagedSearchEnabled() { + return structuralObjectClassDefinition.isPagedSearchEnabled(); + } + + @Override + public boolean isObjectCountingEnabled() { + return structuralObjectClassDefinition.isObjectCountingEnabled(); + } + + @Override + public T findItemDefinition(@NotNull QName name, @NotNull Class clazz, boolean caseInsensitive) { + T itemDef = structuralObjectClassDefinition.findItemDefinition(name, clazz, caseInsensitive); + if (itemDef == null) { + for (RefinedObjectClassDefinition auxiliaryObjectClassDefinition: auxiliaryObjectClassDefinitions) { + itemDef = auxiliaryObjectClassDefinition.findItemDefinition(name, clazz, caseInsensitive); + if (itemDef != null) { + break; + } + } + } + return itemDef; + } + + @Override + public ID findNamedItemDefinition(@NotNull QName firstName, @NotNull ItemPath rest, + @NotNull Class clazz) { + throw new UnsupportedOperationException(); // implement if needed + } + + @NotNull + @Override + public Collection> getAttributeDefinitions() { + if (auxiliaryObjectClassDefinitions.isEmpty()) { + return structuralObjectClassDefinition.getAttributeDefinitions(); + } + Collection> defs = new ArrayList<>(); + defs.addAll((Collection)structuralObjectClassDefinition.getAttributeDefinitions()); + for(RefinedObjectClassDefinition auxiliaryObjectClassDefinition: auxiliaryObjectClassDefinitions) { + for (RefinedAttributeDefinition auxRAttrDef: auxiliaryObjectClassDefinition.getAttributeDefinitions()) { + boolean add = true; + for (RefinedAttributeDefinition def: defs) { + if (def.getName().equals(auxRAttrDef.getName())) { + add = false; + break; + } + } + if (add) { + ((Collection)defs).add(auxRAttrDef); + } + } + } + return defs; + } + + @Override + public PrismContext getPrismContext() { + return structuralObjectClassDefinition.getPrismContext(); + } + + @Override + public void revive(PrismContext prismContext) { + structuralObjectClassDefinition.revive(prismContext); + for (RefinedObjectClassDefinition auxiliaryObjectClassDefinition : auxiliaryObjectClassDefinitions) { + auxiliaryObjectClassDefinition.revive(prismContext); + } + } + + @NotNull + @Override + public List getDefinitions() { + return (List) getAttributeDefinitions(); + } + + @Override + public QName getExtensionForType() { + return structuralObjectClassDefinition.getExtensionForType(); + } + + @Override + public boolean isXsdAnyMarker() { + return structuralObjectClassDefinition.isXsdAnyMarker(); + } + + @Override + public String getDefaultNamespace() { + return structuralObjectClassDefinition.getDefaultNamespace(); + } + + @NotNull + @Override + public List getIgnoredNamespaces() { + return structuralObjectClassDefinition.getIgnoredNamespaces(); + } + + + @Override + public LayerRefinedObjectClassDefinition forLayer(LayerType layerType) { + throw new UnsupportedOperationException("TODO implement if needed"); + } + + @SuppressWarnings("unchecked") + @Override + public RefinedAttributeDefinition findAttributeDefinition(QName elementQName, boolean caseInsensitive) { + return findItemDefinition(elementQName, RefinedAttributeDefinition.class, caseInsensitive); + } + + @Override + public RefinedAttributeDefinition findAttributeDefinition(@NotNull QName name) { + return findAttributeDefinition(name, false); + } + + public RefinedAssociationDefinition findAssociationDefinition(QName name) { + for (RefinedAssociationDefinition assocType: getAssociationDefinitions()) { + if (QNameUtil.match(assocType.getName(), name)) { + return assocType; + } + } + return null; + } + + public Collection getEntitlementAssociationDefinitions() { + return getAssociationDefinitions(ShadowKindType.ENTITLEMENT); + } + + public RefinedAssociationDefinition findEntitlementAssociationDefinition(QName name) { + for (RefinedAssociationDefinition assocType: getEntitlementAssociationDefinitions()) { + if (QNameUtil.match(assocType.getName(), name)) { + return assocType; + } + } + return null; + } + + @Override + public Collection getNamesOfAssociationsWithOutboundExpressions() { + throw new UnsupportedOperationException("TODO implement if needed"); + } + + @Override + public boolean hasAuxiliaryObjectClass(QName expectedObjectClassName) { + throw new UnsupportedOperationException("TODO implement if needed"); + } + + @Override + public ResourceAttributeContainer instantiate(QName elementName) { + throw new UnsupportedOperationException("TODO implement if needed"); + } + + @Override + public ID findItemDefinition(@NotNull ItemPath path, @NotNull Class clazz) { + throw new UnsupportedOperationException("TODO implement if needed"); + } + + @Override + public void merge(ComplexTypeDefinition otherComplexTypeDef) { + throw new UnsupportedOperationException("TODO implement if needed"); + } + + @Override + public String getResourceNamespace() { + return structuralObjectClassDefinition.getResourceNamespace(); + } + + // TODO + @Override + public Class getTypeClassIfKnown() { + return null; + } + + // TODO + @Override + public Class getTypeClass() { + return null; + } + + @Override + public boolean containsAttributeDefinition(ItemPathType pathType) { + return getDefinitionsStream() + .filter(def -> containsAttributeDefinition(pathType)) + .findAny() + .isPresent(); + } + + private Stream getDefinitionsStream() { + return Stream.concat(Stream.of(structuralObjectClassDefinition), auxiliaryObjectClassDefinitions.stream()); + } + + @Override + public boolean containsAttributeDefinition(QName attributeName) { + return getDefinitionsStream() + .filter(def -> containsAttributeDefinition(attributeName)) + .findAny() + .isPresent(); + } + + @Override + public ObjectQuery createShadowSearchQuery(String resourceOid) throws SchemaException { + return structuralObjectClassDefinition.createShadowSearchQuery(resourceOid); + } + + @Override + public PrismObject createBlankShadow() { + return structuralObjectClassDefinition.createBlankShadow(); + } + + @Override + public ResourceShadowDiscriminator getShadowDiscriminator() { + return structuralObjectClassDefinition.getShadowDiscriminator(); + } + + @Override + public Collection getNamesOfAttributesWithOutboundExpressions() { + throw new UnsupportedOperationException("TODO implement if needed"); + } + + @Override + public Collection getNamesOfAttributesWithInboundExpressions() { + throw new UnsupportedOperationException("TODO implement if needed"); + } + + @Override + public ResourcePasswordDefinitionType getPasswordDefinition() { + throw new UnsupportedOperationException("TODO implement if needed"); + } + + @NotNull + @Override + public CompositeRefinedObjectClassDefinitionImpl clone() { + RefinedObjectClassDefinition structuralObjectClassDefinitionClone = structuralObjectClassDefinition.clone(); + Collection auxiliaryObjectClassDefinitionsClone = null; + auxiliaryObjectClassDefinitionsClone = new ArrayList<>(this.auxiliaryObjectClassDefinitions.size()); + for(RefinedObjectClassDefinition auxiliaryObjectClassDefinition: this.auxiliaryObjectClassDefinitions) { + auxiliaryObjectClassDefinitionsClone.add(auxiliaryObjectClassDefinition.clone()); + } + return new CompositeRefinedObjectClassDefinitionImpl(structuralObjectClassDefinitionClone, auxiliaryObjectClassDefinitionsClone); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = super.hashCode(); + result = prime * result + + ((auxiliaryObjectClassDefinitions == null) ? 0 : auxiliaryObjectClassDefinitions.hashCode()); + result = prime * result + + ((structuralObjectClassDefinition == null) ? 0 : structuralObjectClassDefinition.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } +// if (!super.equals(obj)) { +// return false; +// } + if (getClass() != obj.getClass()) { + return false; + } + CompositeRefinedObjectClassDefinitionImpl other = (CompositeRefinedObjectClassDefinitionImpl) obj; + if (!auxiliaryObjectClassDefinitions.equals(other.auxiliaryObjectClassDefinitions)) { + return false; + } + if (!structuralObjectClassDefinition.equals(other.structuralObjectClassDefinition)) { + return false; + } + return true; + } + + @Override + public String debugDump() { + return debugDump(0); + } + + @Override + public String debugDump(int indent) { + return debugDump(indent, null); + } + + protected String debugDump(int indent, LayerType layer) { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < indent; i++) { + sb.append(INDENT_STRING); + } + sb.append(getDebugDumpClassName()).append(": "); + sb.append(SchemaDebugUtil.prettyPrint(getTypeName())); + sb.append("\n"); + DebugUtil.debugDumpWithLabel(sb, "structural", structuralObjectClassDefinition, indent + 1); + sb.append("\n"); + DebugUtil.debugDumpWithLabel(sb, "auxiliary", auxiliaryObjectClassDefinitions, indent + 1); + return sb.toString(); + } + + /** + * Return a human readable name of this class suitable for logs. + */ +// @Override + protected String getDebugDumpClassName() { + return "crOCD"; + } + + public String getHumanReadableName() { + if (getDisplayName() != null) { + return getDisplayName(); + } else { + return getKind()+":"+getIntent(); + } + } + + @Override + public String toString() { + if (auxiliaryObjectClassDefinitions.isEmpty()) { + return getDebugDumpClassName() + " ("+getTypeName()+")"; + } else { + StringBuilder sb = new StringBuilder(); + sb.append(getDebugDumpClassName()).append("(").append(getTypeName()); + for (RefinedObjectClassDefinition auxiliaryObjectClassDefinition: auxiliaryObjectClassDefinitions) { + sb.append("+").append(auxiliaryObjectClassDefinition.getTypeName()); + } + sb.append(")"); + return sb.toString(); + } + } + + @NotNull + @Override + public CompositeRefinedObjectClassDefinitionImpl deepClone(Map ctdMap) { + RefinedObjectClassDefinition structuralClone = structuralObjectClassDefinition.deepClone(ctdMap); + List auxiliaryClones = auxiliaryObjectClassDefinitions.stream() + .map(def -> def.deepClone(ctdMap)) + .collect(Collectors.toCollection(ArrayList::new)); + return new CompositeRefinedObjectClassDefinitionImpl(structuralClone, auxiliaryClones); + } + +} diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedAttributeDefinitionImpl.java b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedAttributeDefinitionImpl.java index 641f463f877..0b676e06c91 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedAttributeDefinitionImpl.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedAttributeDefinitionImpl.java @@ -18,14 +18,13 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.Map; import javax.xml.namespace.QName; import com.evolveum.midpoint.prism.*; -import com.evolveum.midpoint.prism.delta.ItemDelta; import com.evolveum.midpoint.prism.delta.PropertyDelta; import com.evolveum.midpoint.prism.path.ItemPath; -import com.evolveum.midpoint.prism.schema.SchemaRegistry; import com.evolveum.midpoint.schema.processor.ObjectClassComplexTypeDefinition; import com.evolveum.midpoint.schema.processor.ResourceAttribute; import com.evolveum.midpoint.schema.processor.ResourceAttributeContainerDefinition; @@ -121,6 +120,7 @@ public PropertyLimitations getLimitations() { return refinedAttributeDefinition.getLimitations(layer); } + @NotNull @Override public RefinedAttributeDefinition clone() { return refinedAttributeDefinition.clone(); @@ -573,6 +573,11 @@ public String getNativeAttributeName() { return refinedAttributeDefinition.getNativeAttributeName(); } + @Override + public RefinedAttributeDefinition deepClone(Map ctdMap) { + return new LayerRefinedAttributeDefinitionImpl(refinedAttributeDefinition.deepClone(ctdMap), layer); + } + //endregion } diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedObjectClassDefinition.java b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedObjectClassDefinition.java index 47743e2584a..376e1999794 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedObjectClassDefinition.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedObjectClassDefinition.java @@ -20,6 +20,7 @@ import com.evolveum.midpoint.prism.Definition; import com.evolveum.midpoint.schema.processor.ObjectClassComplexTypeDefinition; import com.evolveum.midpoint.xml.ns._public.common.common_3.LayerType; +import org.jetbrains.annotations.NotNull; import javax.xml.namespace.QName; import java.util.Collection; @@ -29,29 +30,11 @@ * @author mederly */ public interface LayerRefinedObjectClassDefinition extends RefinedObjectClassDefinition { - LayerType getLayer(); - - @Override - LayerRefinedAttributeDefinition getNamingAttribute(); - - @Override - LayerRefinedAttributeDefinition getDisplayNameAttribute(); - - @Override - Collection> getSecondaryIdentifiers(); - - @Override - LayerRefinedAttributeDefinition findAttributeDefinition(QName elementQName); - - @Override - LayerRefinedAttributeDefinition findAttributeDefinition(String elementLocalname); - - @Override - List> getAttributeDefinitions(); - @Override - LayerRefinedAttributeDefinition getAttributeDefinition(QName attributeName); + LayerType getLayer(); + @NotNull @Override LayerRefinedObjectClassDefinition clone(); + } diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedObjectClassDefinitionImpl.java b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedObjectClassDefinitionImpl.java index 14fe73fd0b5..0b71ba79451 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedObjectClassDefinitionImpl.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedObjectClassDefinitionImpl.java @@ -18,6 +18,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.Map; import javax.xml.namespace.QName; @@ -25,10 +26,8 @@ import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.query.ObjectQuery; -import com.evolveum.midpoint.prism.schema.SchemaRegistry; import com.evolveum.midpoint.schema.ResourceShadowDiscriminator; import com.evolveum.midpoint.schema.processor.*; -import com.evolveum.midpoint.util.DebugUtil; import com.evolveum.midpoint.util.QNameUtil; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; @@ -95,7 +94,8 @@ public boolean isEmphasized() { } @Override - public ResourceAttributeDefinition getDescriptionAttribute() { + public LayerRefinedAttributeDefinition getDescriptionAttribute() { + // TODO optimize return substituteLayerRefinedAttributeDefinition(refinedObjectClassDefinition.getDescriptionAttribute()); } @@ -185,7 +185,8 @@ public String getHelp() { return refinedObjectClassDefinition.getHelp(); } - @Override + @NotNull + @Override public Collection> getPrimaryIdentifiers() { return substituteLayerRefinedAttributeDefinitionCollection(refinedObjectClassDefinition.getPrimaryIdentifiers()); } @@ -195,7 +196,8 @@ public Collection> getAllIdentifier return substituteLayerRefinedAttributeDefinitionCollection(refinedObjectClassDefinition.getAllIdentifiers()); } - @Override + @NotNull + @Override public Collection> getSecondaryIdentifiers() { return LayerRefinedAttributeDefinitionImpl.wrapCollection(refinedObjectClassDefinition.getSecondaryIdentifiers(), layer); } @@ -237,7 +239,7 @@ public PrismPropertyDefinition findPropertyDefinition(@NotNull QName name) { } @Override - public LayerRefinedAttributeDefinition findAttributeDefinition(QName elementQName) { + public LayerRefinedAttributeDefinition findAttributeDefinition(@NotNull QName elementQName) { for (LayerRefinedAttributeDefinition definition : getAttributeDefinitions()) { if (QNameUtil.match(definition.getName(), elementQName)) { return definition; @@ -247,7 +249,7 @@ public LayerRefinedAttributeDefinition findAttributeDefinition(QName elem } @Override - public LayerRefinedAttributeDefinition findAttributeDefinition(String elementLocalname) { + public LayerRefinedAttributeDefinition findAttributeDefinition(String elementLocalname) { return findAttributeDefinition(new QName(getResourceNamespace(), elementLocalname)); // todo or should we use ns-less matching? } @@ -256,7 +258,8 @@ public String getDisplayName() { return refinedObjectClassDefinition.getDisplayName(); } - @Override + @NotNull + @Override public List getDefinitions() { return getAttributeDefinitions(); } @@ -276,7 +279,8 @@ public ObjectClassComplexTypeDefinition getObjectClassDefinition() { return refinedObjectClassDefinition.getObjectClassDefinition(); } - @Override + @NotNull + @Override public List> getAttributeDefinitions() { if (layerRefinedAttributeDefinitions == null) { layerRefinedAttributeDefinitions = LayerRefinedAttributeDefinitionImpl.wrapCollection(refinedObjectClassDefinition.getAttributeDefinitions(), layer); @@ -299,12 +303,6 @@ public PrismObjectDefinition getObjectDefinition() { return refinedObjectClassDefinition.getObjectDefinition(); } - @Override - public LayerRefinedAttributeDefinition getAttributeDefinition(QName attributeName) { - // todo should there be any difference between findAttributeDefinition and getAttributeDefinition? [mederly] - return findAttributeDefinition(attributeName); - } - @Override public boolean containsAttributeDefinition(QName attributeName) { return refinedObjectClassDefinition.containsAttributeDefinition(attributeName); @@ -375,11 +373,6 @@ public boolean isPrimaryIdentifier(QName attrName) { return refinedObjectClassDefinition.isPrimaryIdentifier(attrName); } - @Override - public boolean isInherited() { - return refinedObjectClassDefinition.isInherited(); - } - @Override public boolean isObjectMarker() { return refinedObjectClassDefinition.isObjectMarker(); @@ -405,19 +398,15 @@ public boolean isRuntimeSchema() { return refinedObjectClassDefinition.isRuntimeSchema(); } - @Override - public Collection getAssociations() { - return refinedObjectClassDefinition.getAssociations(); + @NotNull + @Override + public Collection getAssociationDefinitions() { + return refinedObjectClassDefinition.getAssociationDefinitions(); } @Override - public Collection getAssociations(ShadowKindType kind) { - return refinedObjectClassDefinition.getAssociations(kind); - } - - @Override - public ResourceAttributeDefinition findAttributeDefinition(QName name, boolean caseInsensitive) { - return refinedObjectClassDefinition.findAttributeDefinition(name, caseInsensitive); + public Collection getAssociationDefinitions(ShadowKindType kind) { + return refinedObjectClassDefinition.getAssociationDefinitions(kind); } @Override @@ -441,9 +430,8 @@ public AttributeFetchStrategyType getActivationFetchStrategy(QName propertyName) } @Override - public T getEffectiveCapability( - Class capabilityClass) { - return refinedObjectClassDefinition.getEffectiveCapability(capabilityClass); + public T getEffectiveCapability(Class capabilityClass) { + return (T) refinedObjectClassDefinition.getEffectiveCapability(capabilityClass); } @Override @@ -462,8 +450,8 @@ public boolean isObjectCountingEnabled() { } @Override - public Collection getEntitlementAssociations() { - return refinedObjectClassDefinition.getEntitlementAssociations(); + public Collection getEntitlementAssociationDefinitions() { + return refinedObjectClassDefinition.getEntitlementAssociationDefinitions(); } @Override @@ -487,8 +475,8 @@ public String getDocumentationPreview() { } @Override - public RefinedAssociationDefinition findAssociation(QName name) { - return refinedObjectClassDefinition.findAssociation(name); + public RefinedAssociationDefinition findAssociationDefinition(QName name) { + return refinedObjectClassDefinition.findAssociationDefinition(name); } @Override @@ -499,8 +487,8 @@ public ID findItemDefinition(@NotNull QName name, @N } @Override - public RefinedAssociationDefinition findEntitlementAssociation(QName name) { - return refinedObjectClassDefinition.findEntitlementAssociation(name); + public RefinedAssociationDefinition findEntitlementAssociationDefinition(QName name) { + return refinedObjectClassDefinition.findEntitlementAssociationDefinition(name); } @Override @@ -573,12 +561,19 @@ public String getHumanReadableName() { return refinedObjectClassDefinition.getHumanReadableName(); } - @Override + @NotNull + @Override public LayerRefinedObjectClassDefinition clone() { return wrap(refinedObjectClassDefinition.clone(), this.layer); } - @Override + @NotNull + @Override + public RefinedObjectClassDefinition deepClone(Map ctdMap) { + return new LayerRefinedObjectClassDefinitionImpl(refinedObjectClassDefinition.deepClone(ctdMap), layer); + } + + @Override public String getResourceNamespace() { return refinedObjectClassDefinition.getResourceNamespace(); } @@ -593,6 +588,7 @@ public Class getTypeClassIfKnown() { return refinedObjectClassDefinition.getTypeClassIfKnown(); } + @NotNull @Override public Collection getAuxiliaryObjectClassDefinitions() { return refinedObjectClassDefinition.getAuxiliaryObjectClassDefinitions(); @@ -612,4 +608,5 @@ public ObjectQuery createShadowSearchQuery(String resourceOid) throws SchemaExce public void revive(PrismContext prismContext) { refinedObjectClassDefinition.revive(prismContext); } + } diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedAttributeDefinition.java b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedAttributeDefinition.java index ca1bcc9c09b..a1167d13c0b 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedAttributeDefinition.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedAttributeDefinition.java @@ -16,12 +16,17 @@ package com.evolveum.midpoint.common.refinery; +import com.evolveum.midpoint.prism.ComplexTypeDefinition; +import com.evolveum.midpoint.prism.ItemDefinition; import com.evolveum.midpoint.schema.processor.ResourceAttributeDefinition; import com.evolveum.midpoint.xml.ns._public.common.common_3.AttributeFetchStrategyType; import com.evolveum.midpoint.xml.ns._public.common.common_3.LayerType; import com.evolveum.midpoint.xml.ns._public.common.common_3.MappingType; +import org.jetbrains.annotations.NotNull; +import javax.xml.namespace.QName; import java.util.List; +import java.util.Map; /** * @author mederly @@ -73,9 +78,13 @@ public interface RefinedAttributeDefinition extends ResourceAttributeDefiniti boolean isVolatilityTrigger(); + @NotNull @Override RefinedAttributeDefinition clone(); + @Override + RefinedAttributeDefinition deepClone(Map ctdMap); + String debugDump(int indent, LayerType layer); Integer getModificationPriority(); diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedAttributeDefinitionImpl.java b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedAttributeDefinitionImpl.java index a382b6eb5d9..487ca11335c 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedAttributeDefinitionImpl.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedAttributeDefinitionImpl.java @@ -22,6 +22,9 @@ import javax.xml.namespace.QName; +import com.evolveum.midpoint.prism.ComplexTypeDefinition; +import com.evolveum.midpoint.prism.ItemDefinition; +import com.evolveum.midpoint.prism.PrismProperty; import com.evolveum.midpoint.schema.processor.ResourceAttributeDefinitionImpl; import org.apache.commons.lang.BooleanUtils; @@ -527,7 +530,8 @@ static boolean isIgnored(ResourceAttributeDefinitionType attrDefType) throws Sch return limitationsType.isIgnore(); } - @Override + @NotNull + @Override public RefinedAttributeDefinition clone() { ResourceAttributeDefinition attrDefClone = this.attributeDefinition.clone(); RefinedAttributeDefinitionImpl clone = new RefinedAttributeDefinitionImpl(attrDefClone, prismContext); @@ -554,8 +558,11 @@ protected void copyDefinitionData(RefinedAttributeDefinitionImpl clone) { clone.tolerant = this.tolerant; clone.tolerantValuePattern = this.tolerantValuePattern; } - - + + @Override + public RefinedAttributeDefinition deepClone(Map ctdMap) { + return (RefinedAttributeDefinition) super.deepClone(ctdMap); + } @Override public String toString() { diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedObjectClassDefinition.java b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedObjectClassDefinition.java index 5698dec2845..4a0a3a6fa8c 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedObjectClassDefinition.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedObjectClassDefinition.java @@ -17,10 +17,8 @@ package com.evolveum.midpoint.common.refinery; import com.evolveum.midpoint.common.ResourceObjectPattern; -import com.evolveum.midpoint.prism.ComplexTypeDefinition; -import com.evolveum.midpoint.prism.Definition; -import com.evolveum.midpoint.prism.PrismObject; -import com.evolveum.midpoint.prism.PrismObjectDefinition; +import com.evolveum.midpoint.prism.*; +import com.evolveum.midpoint.prism.util.ItemPathUtil; import com.evolveum.midpoint.schema.ResourceShadowDiscriminator; import com.evolveum.midpoint.schema.processor.ObjectClassComplexTypeDefinition; import com.evolveum.midpoint.schema.processor.ResourceAttributeDefinition; @@ -29,94 +27,131 @@ import com.evolveum.midpoint.xml.ns._public.resource.capabilities_3.CapabilityType; import com.evolveum.midpoint.xml.ns._public.resource.capabilities_3.PagedSearchCapabilityType; import com.evolveum.prism.xml.ns._public.types_3.ItemPathType; +import org.jetbrains.annotations.NotNull; import javax.xml.namespace.QName; import java.util.Collection; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import java.util.stream.Stream; /** * @author mederly */ public interface RefinedObjectClassDefinition extends ObjectClassComplexTypeDefinition { - LayerRefinedObjectClassDefinition forLayer(LayerType layerType); - - Collection getAssociations(); - - Collection getAssociations(ShadowKindType kind); - - RefinedAssociationDefinition findAssociation(QName name); - - Collection getEntitlementAssociations(); + //region General attribute definitions ======================================================== - RefinedAssociationDefinition findEntitlementAssociation(QName name); - - Collection getNamesOfAssociations(); + /** + * Returns definitions of all attributes as an unmodifiable collection. + * Note: content of this is exactly the same as for getDefinitions + */ + @NotNull + @Override + Collection> getAttributeDefinitions(); - Collection getNamesOfAssociationsWithOutboundExpressions(); + default boolean containsAttributeDefinition(ItemPathType pathType) { + QName segmentQName = ItemPathUtil.getOnlySegmentQName(pathType); + return containsAttributeDefinition(segmentQName); + } - Collection getAuxiliaryObjectClassDefinitions(); + default boolean containsAttributeDefinition(QName attributeName) { + return findAttributeDefinition(attributeName) != null; + } - boolean hasAuxiliaryObjectClass(QName expectedObjectClassName); + Collection getNamesOfAttributesWithOutboundExpressions(); - Collection getProtectedObjectPatterns(); + Collection getNamesOfAttributesWithInboundExpressions(); - @Override - RefinedAttributeDefinition getNamingAttribute(); + //endregion - @Override - RefinedAttributeDefinition getDisplayNameAttribute(); + //region Special attribute definitions ======================================================== + // Note that these are simply type-narrowed versions of methods in ObjectClassComplexTypeDefinition + @NotNull @Override Collection> getPrimaryIdentifiers(); + @NotNull @Override Collection> getSecondaryIdentifiers(); @Override - Collection> getAllIdentifiers(); - - @Override - default RefinedAttributeDefinition findAttributeDefinition(QName elementQName) { - return findItemDefinition(elementQName, RefinedAttributeDefinition.class); + default Collection> getAllIdentifiers() { + return Stream.concat(getPrimaryIdentifiers().stream(), getSecondaryIdentifiers().stream()) + .collect(Collectors.toList()); } - @Override - default RefinedAttributeDefinition findAttributeDefinition(String elementLocalname) { - QName elementQName = new QName(getResourceNamespace(), elementLocalname); - return findAttributeDefinition(elementQName); + RefinedAttributeDefinition getDescriptionAttribute(); + RefinedAttributeDefinition getNamingAttribute(); + RefinedAttributeDefinition getDisplayNameAttribute(); + + //endregion + + //region General association definitions ======================================================== + + /** + * Returns definitions of all associations as an unmodifiable collection. + * Note: these items are _not_ included in getDefinitions. (BTW, RefinedAssociationDefinition + * is not a subtype of ItemDefinition, not even of Definition.) + */ + @NotNull + Collection getAssociationDefinitions(); + + Collection getAssociationDefinitions(ShadowKindType kind); + + default Collection getEntitlementAssociationDefinitions() { + return getAssociationDefinitions(ShadowKindType.ENTITLEMENT); } - String getResourceNamespace(); + RefinedAssociationDefinition findAssociationDefinition(QName name); - String getDescription(); + RefinedAssociationDefinition findEntitlementAssociationDefinition(QName name); - boolean isDefault(); + Collection getNamesOfAssociations(); + + Collection getNamesOfAssociationsWithOutboundExpressions(); + //endregion + + //region General information ======================================================== + + String getDescription(); ObjectClassComplexTypeDefinition getObjectClassDefinition(); ResourceType getResourceType(); - PrismObjectDefinition getObjectDefinition(); + String getResourceNamespace(); - ResourceObjectReferenceType getBaseContext(); + boolean isDefault(); - RefinedAttributeDefinition getAttributeDefinition(QName attributeName); + ResourceObjectReferenceType getBaseContext(); - @Override - Collection> getAttributeDefinitions(); + String getHumanReadableName(); + //endregion - boolean containsAttributeDefinition(ItemPathType pathType); - boolean containsAttributeDefinition(QName attributeName); + //region Generating and matching artifacts ======================================================== + PrismObjectDefinition getObjectDefinition(); PrismObject createBlankShadow(); ResourceShadowDiscriminator getShadowDiscriminator(); - Collection getNamesOfAttributesWithOutboundExpressions(); + boolean matches(ShadowType shadowType); + //endregion - Collection getNamesOfAttributesWithInboundExpressions(); + //region Accessing parts of schema handling ======================================================== + + @NotNull + Collection getAuxiliaryObjectClassDefinitions(); + + boolean hasAuxiliaryObjectClass(QName expectedObjectClassName); + + Collection getProtectedObjectPatterns(); + + ResourcePasswordDefinitionType getPasswordDefinition(); List getPasswordInbound(); @@ -126,13 +161,14 @@ default RefinedAttributeDefinition findAttributeDefinition(String element ObjectReferenceType getPasswordPolicy(); - ResourcePasswordDefinitionType getPasswordDefinition(); - ResourceActivationDefinitionType getActivationSchemaHandling(); ResourceBidirectionalMappingType getActivationBidirectionalMappingType(QName propertyName); AttributeFetchStrategyType getActivationFetchStrategy(QName propertyName); + //endregion + + //region Capabilities ======================================================== T getEffectiveCapability(Class capabilityClass); @@ -142,10 +178,28 @@ default RefinedAttributeDefinition findAttributeDefinition(String element boolean isObjectCountingEnabled(); - boolean matches(ShadowType shadowType); - - String getHumanReadableName(); + //endregion + //region Cloning ======================================================== + @NotNull @Override RefinedObjectClassDefinition clone(); + + @NotNull + @Override + RefinedObjectClassDefinition deepClone(Map ctdMap); + //endregion + + LayerRefinedObjectClassDefinition forLayer(LayerType layerType); + + //region Type variance ======================================================== + + RefinedAttributeDefinition findAttributeDefinition(@NotNull QName name); + + default RefinedAttributeDefinition findAttributeDefinition(String name) { + return findAttributeDefinition(new QName(getTypeName().getNamespaceURI(), name)); + } + + //endregion + } diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedObjectClassDefinitionImpl.java b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedObjectClassDefinitionImpl.java index cfe3657335c..7e326de399a 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedObjectClassDefinitionImpl.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedObjectClassDefinitionImpl.java @@ -16,22 +16,22 @@ package com.evolveum.midpoint.common.refinery; import com.evolveum.midpoint.common.ResourceObjectPattern; -import com.evolveum.midpoint.prism.ItemDefinition; -import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.PrismObject; -import com.evolveum.midpoint.prism.PrismObjectDefinition; +import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.marshaller.QueryConvertor; +import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.query.ObjectFilter; import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.prism.util.ItemPathUtil; import com.evolveum.midpoint.schema.ResourceShadowDiscriminator; import com.evolveum.midpoint.schema.constants.SchemaConstants; -import com.evolveum.midpoint.schema.processor.*; -import com.evolveum.midpoint.schema.util.ResourceTypeUtil; -import com.evolveum.midpoint.schema.util.SchemaDebugUtil; +import com.evolveum.midpoint.schema.processor.ObjectClassComplexTypeDefinition; +import com.evolveum.midpoint.schema.processor.ResourceAttribute; +import com.evolveum.midpoint.schema.processor.ResourceAttributeContainer; +import com.evolveum.midpoint.schema.processor.ResourceAttributeDefinition; import com.evolveum.midpoint.schema.util.ObjectQueryUtil; import com.evolveum.midpoint.schema.util.ObjectTypeUtil; -import com.evolveum.midpoint.util.DebugDumpable; +import com.evolveum.midpoint.schema.util.ResourceTypeUtil; +import com.evolveum.midpoint.schema.util.SchemaDebugUtil; import com.evolveum.midpoint.util.MiscUtil; import com.evolveum.midpoint.util.PrettyPrinter; import com.evolveum.midpoint.util.QNameUtil; @@ -44,448 +44,731 @@ import com.evolveum.midpoint.xml.ns._public.resource.capabilities_3.CountObjectsCapabilityType; import com.evolveum.midpoint.xml.ns._public.resource.capabilities_3.PagedSearchCapabilityType; import com.evolveum.prism.xml.ns._public.query_3.SearchFilterType; -import com.evolveum.prism.xml.ns._public.types_3.ItemPathType; - -import javax.xml.namespace.QName; - +import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang.Validate; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import javax.xml.namespace.QName; import java.util.*; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.function.Supplier; +import java.util.stream.Collectors; /** * @author semancik */ -public class RefinedObjectClassDefinitionImpl extends ObjectClassComplexTypeDefinitionImpl implements - RefinedObjectClassDefinition { +public class RefinedObjectClassDefinitionImpl implements RefinedObjectClassDefinition { private static final Trace LOGGER = TraceManager.getTrace(RefinedObjectClassDefinition.class); - private String intent; + @NotNull private final List> attributeDefinitions = new ArrayList<>(); + @NotNull private final List associationDefinitions = new ArrayList<>(); + + @NotNull private final ObjectClassComplexTypeDefinition originalObjectClassDefinition; + @NotNull private final List auxiliaryObjectClassDefinitions = new ArrayList<>(); + + @NotNull private final ResourceType resourceType; + private ResourceObjectTypeDefinitionType schemaHandlingObjectTypeDefinitionType; + private String intent; + private ShadowKindType kind; private String displayName; private String description; private boolean isDefault; - private ObjectClassComplexTypeDefinition objectClassDefinition; - private ResourceObjectTypeDefinitionType schemaHandlingObjectTypeDefinitionType; - private ResourceType resourceType; - private Collection> identifiers; - private Collection> secondaryIdentifiers; - private Collection protectedObjectPatterns; - private List> attributeDefinitions; - private Collection associations = new ArrayList(); - private Collection auxiliaryObjectClassDefinitions; - private ResourceObjectReferenceType baseContext; + @NotNull private final List> identifiers = new ArrayList<>(); + @NotNull private final List> secondaryIdentifiers = new ArrayList<>(); + @NotNull private final List protectedObjectPatterns = new ArrayList<>(); + private ResourceObjectReferenceType baseContext; private RefinedAttributeDefinition displayNameAttributeDefinition; - + private RefinedAttributeDefinition namingAttributeDefinition; + private RefinedAttributeDefinition descriptionAttributeDefinition; + /** * Refined object definition. The "any" parts are replaced with appropriate schema (e.g. resource schema) */ - PrismObjectDefinition objectDefinition = null; - private ShadowKindType kind = null; - - /** - * This is needed by the LayerRefinedObjectClassDefinition class - */ - protected RefinedObjectClassDefinitionImpl(QName typeName, PrismContext prismContext) { - super(typeName, prismContext); - } + private PrismObjectDefinition objectDefinition = null; - private RefinedObjectClassDefinitionImpl(PrismContext prismContext, ResourceType resourceType, - ObjectClassComplexTypeDefinition objectClassDefinition) { - super(objectClassDefinition.getTypeName(), prismContext); - Validate.notNull(objectClassDefinition, "ObjectClass definition must not be null"); - attributeDefinitions = new ArrayList<>(); + private RefinedObjectClassDefinitionImpl(@NotNull ResourceType resourceType, @NotNull ObjectClassComplexTypeDefinition objectClassDefinition) { this.resourceType = resourceType; - this.objectClassDefinition = objectClassDefinition; + this.originalObjectClassDefinition = objectClassDefinition; } - /** - * Creates a derived version of this ROCD for a given layer. - * TODO clone if necessary/if specified (currently there is no cloning) - * - * @param layerType - * @return - */ - @Override - public LayerRefinedObjectClassDefinition forLayer(LayerType layerType) { - Validate.notNull(layerType); - return LayerRefinedObjectClassDefinitionImpl.wrap(this, layerType); - } + //region General attribute definitions ======================================================== + @NotNull + @Override + public Collection> getAttributeDefinitions() { + return Collections.unmodifiableList(attributeDefinitions); + } - @Override - public ResourceAttributeDefinition getDescriptionAttribute() { - return getObjectClassDefinition().getDescriptionAttribute(); - } + @NotNull + @Override + public List getDefinitions() { + return (List) getAttributeDefinitions(); + } - @Override - public void setDescriptionAttribute(ResourceAttributeDefinition descriptionAttribute) { - throw new UnsupportedOperationException("Parts of refined account are immutable"); - } + @Override + public Collection getNamesOfAttributesWithOutboundExpressions() { + return getAttributeDefinitions().stream() + .filter(attrDef -> attrDef.getOutboundMappingType() != null) + .map(attrDef -> attrDef.getName()) + .collect(Collectors.toCollection(HashSet::new)); + } - @Override - public RefinedAttributeDefinition getNamingAttribute() { - return substituteRefinedAttributeDefinition(getObjectClassDefinition().getNamingAttribute()); - } - - @NotNull @Override - public QName getTypeName() { - return getObjectClassDefinition().getTypeName(); - } + public Collection getNamesOfAttributesWithInboundExpressions() { + return getAttributeDefinitions().stream() + .filter(attrDef -> CollectionUtils.isNotEmpty(attrDef.getInboundMappingTypes())) + .map(attrDef -> attrDef.getName()) + .collect(Collectors.toCollection(HashSet::new)); + } @Override - public String getNativeObjectClass() { - return getObjectClassDefinition().getNativeObjectClass(); - } + public ID findItemDefinition(@NotNull QName name, @NotNull Class clazz, + boolean caseInsensitive) { + for (ItemDefinition def : getDefinitions()) { + if (def.isValidFor(name, clazz, caseInsensitive)) { + return (ID) def; + } + } + return null; + } - @Override - public boolean isDefaultInAKind() { - return isDefault; - } + //endregion - @Override - public void setDefaultInAKind(boolean defaultAccountType) { - this.isDefault = defaultAccountType; - } + //region Special attribute definitions ======================================================== + @NotNull + @Override + public Collection> getPrimaryIdentifiers() { + return identifiers; + } - @Override - public String getIntent() { - return intent; - } + @NotNull + @Override + public Collection> getSecondaryIdentifiers() { + return secondaryIdentifiers; + } - @Override - public void setIntent(String intent) { - this.intent = intent; - } - - @Override - public ShadowKindType getKind() { - if (kind != null) { - return kind; - } - return getObjectClassDefinition().getKind(); + @Override + public RefinedAttributeDefinition getDescriptionAttribute() { + return substituteRefinedAttributeDefinition( + () -> (RefinedAttributeDefinition) descriptionAttributeDefinition, + rad -> descriptionAttributeDefinition = rad, + originalObjectClassDefinition::getDescriptionAttribute + ); } @Override - public void setKind(ShadowKindType kind) { - this.kind = kind; + public RefinedAttributeDefinition getNamingAttribute() { + return substituteRefinedAttributeDefinition( + () -> (RefinedAttributeDefinition) namingAttributeDefinition, + rad -> namingAttributeDefinition = rad, + originalObjectClassDefinition::getNamingAttribute + ); } @Override - public RefinedAttributeDefinition getDisplayNameAttribute() { - if (displayNameAttributeDefinition == null) { - ResourceAttributeDefinition displayNameAttribute = getObjectClassDefinition().getDisplayNameAttribute(); - if (displayNameAttribute == null) { + public RefinedAttributeDefinition getDisplayNameAttribute() { + return substituteRefinedAttributeDefinition( + () -> (RefinedAttributeDefinition) displayNameAttributeDefinition, + rad -> displayNameAttributeDefinition = rad, + originalObjectClassDefinition::getDisplayNameAttribute + ); + } + + private RefinedAttributeDefinition substituteRefinedAttributeDefinition( + Supplier> getter, Consumer> setter, + Supplier> getterOfOriginal) { + RefinedAttributeDefinition value = getter.get(); + if (value == null) { + ResourceAttributeDefinition original = getterOfOriginal.get(); + if (original == null) { return null; } - displayNameAttributeDefinition = substituteRefinedAttributeDefinition(displayNameAttribute); + value = findAttributeDefinition(original.getName()); + setter.accept(value); } - return displayNameAttributeDefinition; - } + return value; + } + //endregion - @Override - public void setDisplayNameAttribute(QName displayName) { - throw new UnsupportedOperationException("Parts of refined account are immutable"); - } - - @Override - public Collection> getPrimaryIdentifiers() { - if (identifiers == null) { - identifiers = createIdentifiersCollection(); - } - return identifiers; + //region General association definitions ======================================================== + @NotNull + @Override + public Collection getAssociationDefinitions() { + return Collections.unmodifiableList(associationDefinitions); } @Override - public Collection> getSecondaryIdentifiers() { - if (secondaryIdentifiers == null) { - secondaryIdentifiers = createIdentifiersCollection(); - } - return secondaryIdentifiers; + public Collection getAssociationDefinitions(ShadowKindType kind) { + return Collections.unmodifiableList( + associationDefinitions.stream() + .filter(association -> kind == association.getKind()) + .collect(Collectors.toList())); } - - public Collection> getAllIdentifiers() { - Collection> allIdentifiers = new ArrayList<>(); - if (identifiers != null) { - allIdentifiers.addAll((Collection)getPrimaryIdentifiers()); - } - if (secondaryIdentifiers != null) { - allIdentifiers.addAll((Collection)getSecondaryIdentifiers()); - } - return allIdentifiers; + + @Override + public RefinedAssociationDefinition findAssociationDefinition(QName name) { + return associationDefinitions.stream() + .filter(a -> QNameUtil.match(a.getName(), name)) + .findFirst().orElse(null); } - private Collection> createIdentifiersCollection() { - return new ArrayList<>(); + @Override + public RefinedAssociationDefinition findEntitlementAssociationDefinition(QName name) { + return getEntitlementAssociationDefinitions().stream() + .filter(a -> QNameUtil.match(a.getName(), name)) + .findFirst().orElse(null); } - + @Override - public Collection getAssociations() { - return associations; + public Collection getNamesOfAssociations() { + return getAssociationDefinitions().stream() + .map(a -> a.getName()) + .collect(Collectors.toCollection(HashSet::new)); } - + @Override - public Collection getAssociations(ShadowKindType kind) { - Collection retAssoc = new ArrayList(); - for (RefinedAssociationDefinition association: associations) { - if (kind == association.getKind()) { - retAssoc.add(association); - } + public Collection getNamesOfAssociationsWithOutboundExpressions() { + return getAssociationDefinitions().stream() + .filter(assocDef -> assocDef.getOutboundMappingType() != null) + .map(a -> a.getName()) + .collect(Collectors.toCollection(HashSet::new)); + } + //endregion + + //region General information ======================================================== + @Override + public String getDisplayName() { + return displayName; + } + + private void setDisplayName(String displayName) { + this.displayName = displayName; + } + + @Override + public String getDescription() { + return description; + } + + private void setDescription(String description) { + this.description = description; + } + + @Override + public ObjectClassComplexTypeDefinition getObjectClassDefinition() { + return originalObjectClassDefinition; + } + + @NotNull + @Override + public ResourceType getResourceType() { + return resourceType; + } + + @Override + public String getResourceNamespace() { + return ResourceTypeUtil.getResourceNamespace(getResourceType()); + } + + @Override + public boolean isDefault() { + return isDefault; + } + + private void setDefault(boolean isDefault) { + this.isDefault = isDefault; + } + + @Override + public boolean isDefaultInAKind() { + return isDefault; + } + + @Override + public ResourceObjectReferenceType getBaseContext() { + return baseContext; + } + + private void setBaseContext(ResourceObjectReferenceType baseContext) { + this.baseContext = baseContext; + } + + @Override + public String getIntent() { + return intent; + } + + public void setIntent(String intent) { + this.intent = intent; + } + + @Override + public ShadowKindType getKind() { + if (kind != null) { + return kind; } - return retAssoc; + return getObjectClassDefinition().getKind(); } + public void setKind(ShadowKindType kind) { + this.kind = kind; + } + + //endregion + + //region Generating and matching artifacts ======================================================== + @Override - public RefinedAssociationDefinition findAssociation(QName name) { - for (RefinedAssociationDefinition assocType: getAssociations()) { - if (QNameUtil.match(assocType.getName(), name)) { - return assocType; - } + public PrismObjectDefinition getObjectDefinition() { + if (objectDefinition == null) { + objectDefinition = constructObjectDefinition(this); } - return null; + return objectDefinition; + } + + static PrismObjectDefinition constructObjectDefinition(RefinedObjectClassDefinition refinedObjectClassDefinition) { + // Almost-shallow clone of object definition and complex type + PrismObjectDefinition originalObjectDefinition = + refinedObjectClassDefinition.getSchemaRegistry().findObjectDefinitionByCompileTimeClass(ShadowType.class); + return originalObjectDefinition.cloneWithReplacedDefinition(ShadowType.F_ATTRIBUTES, + refinedObjectClassDefinition.toResourceAttributeContainerDefinition()); } @Override - public Collection getEntitlementAssociations() { - return getAssociations(ShadowKindType.ENTITLEMENT); + public PrismObject createBlankShadow() { + PrismObject accountShadow; + try { + accountShadow = getPrismContext().createObject(ShadowType.class); + } catch (SchemaException e) { + // This should not happen + throw new SystemException("Internal error instantiating account shadow: "+e.getMessage(), e); + } + ShadowType accountShadowType = accountShadow.asObjectable(); + + accountShadowType.setIntent(getIntent()); + accountShadowType.setKind(getKind()); + accountShadowType.setObjectClass(getObjectClassDefinition().getTypeName()); + accountShadowType.setResourceRef(ObjectTypeUtil.createObjectRef(getResourceType())); + + // Setup definition + PrismObjectDefinition newDefinition = accountShadow.getDefinition().cloneWithReplacedDefinition( + ShadowType.F_ATTRIBUTES, toResourceAttributeContainerDefinition()); + accountShadow.setDefinition(newDefinition); + + return accountShadow; } - + @Override - public RefinedAssociationDefinition findEntitlementAssociation(QName name) { - for (RefinedAssociationDefinition assocType: getEntitlementAssociations()) { - if (QNameUtil.match(assocType.getName(), name)) { - return assocType; + public ResourceShadowDiscriminator getShadowDiscriminator() { + return new ResourceShadowDiscriminator(getResourceType().getOid(), getKind(), getIntent()); + } + + @Override + public boolean matches(ShadowType shadowType) { + if (shadowType == null) { + return false; + } + if (!QNameUtil.match(getObjectClassDefinition().getTypeName(), shadowType.getObjectClass())) { + return false; + } + if (shadowType.getKind() == null) { + if (kind != ShadowKindType.ACCOUNT) { + return false; + } + } else { + if (!MiscUtil.equals(kind, shadowType.getKind())) { + return false; } } - return null; + if (shadowType.getIntent() != null) { + // if (isDefault) { + // return true; + // } else { + // return false; + // } + // } else { + return MiscUtil.equals(intent, shadowType.getIntent()); + } + return true; } - - @Override - public Collection getNamesOfAssociations() { - Collection names = new HashSet(); - for (RefinedAssociationDefinition assocDef : getAssociations()) { - names.add(assocDef.getName()); - } - return names; - } - @Override - public Collection getNamesOfAssociationsWithOutboundExpressions() { - Collection names = new HashSet(); - for (RefinedAssociationDefinition assocDef : getAssociations()) { - if (assocDef.getOutboundMappingType() != null) { - names.add(assocDef.getName()); - } - } - return names; - } - - @Override + @Override + public ObjectQuery createShadowSearchQuery(String resourceOid) throws SchemaException { + if (getKind() == null) { + return ObjectQueryUtil.createResourceAndObjectClassQuery(resourceOid, getTypeName(), getPrismContext()); + } else { + return ObjectQueryUtil.createResourceAndKindIntent(resourceOid, getKind(), getIntent(), getPrismContext()); + } + } + //endregion + + //region Accessing parts of schema handling ======================================================== + @NotNull + @Override public Collection getAuxiliaryObjectClassDefinitions() { return auxiliaryObjectClassDefinitions; } - + @Override public boolean hasAuxiliaryObjectClass(QName expectedObjectClassName) { - if (getAuxiliaryObjectClassDefinitions() == null) { - return false; + return auxiliaryObjectClassDefinitions.stream() + .anyMatch(def -> QNameUtil.match(def.getTypeName(), expectedObjectClassName)); + } + + @Override + public Collection getProtectedObjectPatterns() { + return protectedObjectPatterns; + } + + @Override + public ResourcePasswordDefinitionType getPasswordDefinition() { + if (schemaHandlingObjectTypeDefinitionType == null) { + return null; } - for (RefinedObjectClassDefinition auxiliaryObjectClassDefinition: getAuxiliaryObjectClassDefinitions()) { - if (QNameUtil.match(auxiliaryObjectClassDefinition.getTypeName(), expectedObjectClassName)) { - return true; - } + ResourceCredentialsDefinitionType credentials = schemaHandlingObjectTypeDefinitionType.getCredentials(); + if (credentials == null) { + return null; } - return false; + return credentials.getPassword(); } @Override - public Collection getProtectedObjectPatterns() { - if (protectedObjectPatterns == null) { - protectedObjectPatterns = new ArrayList(); + public List getPasswordInbound() { + ResourcePasswordDefinitionType password = getPasswordDefinition(); + if (password == null || password.getInbound() == null) { + return null; } - return protectedObjectPatterns; + return password.getInbound(); } - - public PrismContext getPrismContext() { - return getResourceType().asPrismObject().getPrismContext(); + + @Override + public MappingType getPasswordOutbound() { + ResourcePasswordDefinitionType password = getPasswordDefinition(); + if (password == null || password.getOutbound() == null) { + return null; + } + return password.getOutbound(); } - @Override - public RefinedObjectClassDefinitionImpl clone() { - RefinedObjectClassDefinitionImpl clone = new RefinedObjectClassDefinitionImpl(getPrismContext(), resourceType, objectClassDefinition); - copyDefinitionData(clone); - return clone; - } + @Override + public AttributeFetchStrategyType getPasswordFetchStrategy() { + ResourcePasswordDefinitionType password = getPasswordDefinition(); + if (password == null) { + return AttributeFetchStrategyType.IMPLICIT; + } + if (password.getFetchStrategy() == null) { + return AttributeFetchStrategyType.IMPLICIT; + } + return password.getFetchStrategy(); + } - private void copyDefinitionData(RefinedObjectClassDefinitionImpl clone) { - super.copyDefinitionData(clone); - clone.intent = this.intent; - clone.kind = this.kind; - clone.attributeDefinitions = cloneDefinitions(this.attributeDefinitions); - clone.identifiers = cloneDefinitions(this.identifiers); - clone.secondaryIdentifiers = cloneDefinitions(this.secondaryIdentifiers); - clone.associations = cloneAssociations(this.associations); - clone.baseContext = this.baseContext; - clone.description = this.description; - clone.displayName = this.displayName; - clone.isDefault = this.isDefault; - clone.objectClassDefinition = this.objectClassDefinition.clone(); - clone.objectDefinition = this.objectDefinition; - clone.resourceType = this.resourceType; - clone.protectedObjectPatterns = this.protectedObjectPatterns; - clone.resourceType = this.resourceType; - clone.schemaHandlingObjectTypeDefinitionType = this.schemaHandlingObjectTypeDefinitionType; - } + @Override + public ObjectReferenceType getPasswordPolicy() { + ResourcePasswordDefinitionType password = getPasswordDefinition(); + if (password == null || password.getPasswordPolicyRef() == null){ + return null; + } + return password.getPasswordPolicyRef(); + } - private Collection cloneAssociations( - Collection origAsoc) { - if (origAsoc == null) { - return null; - } - Collection cloned = new ArrayList<>(); - for (RefinedAssociationDefinition rAsocDef: origAsoc) { - cloned.add(rAsocDef.clone()); - } - return cloned; + + @Override + public ResourceActivationDefinitionType getActivationSchemaHandling(){ + if (schemaHandlingObjectTypeDefinitionType == null) { + return null; + } + return schemaHandlingObjectTypeDefinitionType.getActivation(); } - private List> cloneDefinitions(Collection> origDefs) { - if (origDefs == null) { - return null; - } - List> clonedAttributes = new ArrayList<>(); - for (RefinedAttributeDefinition attributeDefinition: origDefs) { - clonedAttributes.add(attributeDefinition.clone()); + @Override + public ResourceBidirectionalMappingType getActivationBidirectionalMappingType(QName propertyName) { + ResourceActivationDefinitionType activationSchemaHandling = getActivationSchemaHandling(); + if (activationSchemaHandling == null) { + return null; + } + if (QNameUtil.match(ActivationType.F_ADMINISTRATIVE_STATUS, propertyName)) { + return activationSchemaHandling.getAdministrativeStatus(); + } else if (QNameUtil.match(ActivationType.F_VALID_FROM, propertyName)) { + return activationSchemaHandling.getValidFrom(); + } else if (QNameUtil.match(ActivationType.F_VALID_TO, propertyName)) { + return activationSchemaHandling.getValidTo(); + } else if (QNameUtil.match(ActivationType.F_LOCKOUT_STATUS, propertyName)) { + return activationSchemaHandling.getLockoutStatus(); + } else if (QNameUtil.match(ActivationType.F_LOCKOUT_EXPIRATION_TIMESTAMP, propertyName)) { + return null; // todo implement this + } else { + throw new IllegalArgumentException("Unknown activation property "+propertyName); } - return clonedAttributes; } @Override - public RefinedAttributeDefinition findAttributeDefinition(QName name) { - return findItemDefinition(name, RefinedAttributeDefinition.class); + public AttributeFetchStrategyType getActivationFetchStrategy(QName propertyName) { + ResourceBidirectionalMappingType biType = getActivationBidirectionalMappingType(propertyName); + if (biType == null) { + return AttributeFetchStrategyType.IMPLICIT; + } + if (biType.getFetchStrategy() == null) { + return AttributeFetchStrategyType.IMPLICIT; + } + return biType.getFetchStrategy(); } + //endregion + //region Capabilities ======================================================== @Override - public RefinedAttributeDefinition findAttributeDefinition(String elementLocalname) { - QName elementQName = new QName(getResourceNamespace(), elementLocalname); - return findAttributeDefinition(elementQName); - } + public T getEffectiveCapability(Class capabilityClass) { + return ResourceTypeUtil.getEffectiveCapability(getResourceType(), schemaHandlingObjectTypeDefinitionType, capabilityClass); + } @Override - public String getResourceNamespace() { - return ResourceTypeUtil.getResourceNamespace(getResourceType()); + public PagedSearchCapabilityType getPagedSearches() { + return getEffectiveCapability(PagedSearchCapabilityType.class); } @Override - public String getDisplayName() { - return displayName; - } + public boolean isPagedSearchEnabled() { + return getPagedSearches() != null; // null means nothing or disabled + } - @Override - public void setDisplayName(String displayName) { - this.displayName = displayName; - } + @Override + public boolean isObjectCountingEnabled() { + return getEffectiveCapability(CountObjectsCapabilityType.class) != null; + } + //endregion - - @Override - public String getDescription() { - return description; - } + //region Cloning ======================================================== + @NotNull + @Override + public RefinedObjectClassDefinitionImpl clone() { + RefinedObjectClassDefinitionImpl clone = new RefinedObjectClassDefinitionImpl(resourceType, originalObjectClassDefinition); + copyDefinitionData(clone); + return clone; + } - public void setDescription(String description) { - this.description = description; - } - + // assuming we are called on empty object + private void copyDefinitionData(RefinedObjectClassDefinitionImpl clone) { + clone.attributeDefinitions.addAll(cloneDefinitions(this.attributeDefinitions)); + clone.associationDefinitions.addAll(cloneAssociations(this.associationDefinitions)); + clone.auxiliaryObjectClassDefinitions.addAll(auxiliaryObjectClassDefinitions); + clone.schemaHandlingObjectTypeDefinitionType = this.schemaHandlingObjectTypeDefinitionType; + clone.intent = this.intent; + clone.kind = this.kind; + clone.displayName = this.displayName; + clone.description = this.description; + clone.isDefault = this.isDefault; + clone.identifiers.addAll(cloneDefinitions(this.identifiers)); + clone.secondaryIdentifiers.addAll(cloneDefinitions(this.secondaryIdentifiers)); + clone.protectedObjectPatterns.addAll(this.protectedObjectPatterns); + clone.baseContext = this.baseContext; + } + + @NotNull @Override - public boolean isDefault() { - return isDefault; - } + public RefinedObjectClassDefinition deepClone(Map ctdMap) { + // TODO TODO TODO (note that in original implementation this was also missing...) + return clone(); + } - public void setDefault(boolean isDefault) { - this.isDefault = isDefault; - } + private Collection cloneAssociations(Collection origAsoc) { + return origAsoc.stream() + .map(RefinedAssociationDefinition::clone) + .collect(Collectors.toList()); + } - @Override - public ObjectClassComplexTypeDefinition getObjectClassDefinition() { - return objectClassDefinition; - } + private List> cloneDefinitions(Collection> origDefs) { + return origDefs.stream() + .map(RefinedAttributeDefinition::clone) + .collect(Collectors.toList()); + } - public void setObjectClassDefinition(ObjectClassComplexTypeDefinition objectClassDefinition) { - Validate.notNull(objectClassDefinition, "ObjectClass definition must not be null"); - this.objectClassDefinition = objectClassDefinition; - } - + //endregion + + /** + * Creates a derived version of this ROCD for a given layer. + * TODO clone if necessary/if specified (currently there is no cloning) + * + * @param layerType + * @return + */ @Override - public Collection> getAttributeDefinitions() { - return attributeDefinitions; + public LayerRefinedObjectClassDefinition forLayer(LayerType layerType) { + Validate.notNull(layerType); + return LayerRefinedObjectClassDefinitionImpl.wrap(this, layerType); } - + + + //region Delegations ======================================================== + @NotNull @Override - public List getDefinitions() { - return (List) getAttributeDefinitions(); + public QName getTypeName() { + return getObjectClassDefinition().getTypeName(); } - @Override - public ResourceType getResourceType() { - return resourceType; + @Override + public String getNativeObjectClass() { + return getObjectClassDefinition().getNativeObjectClass(); } - @Override - public PrismObjectDefinition getObjectDefinition() { - if (objectDefinition == null) { - objectDefinition = constructObjectDefinition(this); - } - return objectDefinition; - } + public boolean isAuxiliary() { + return getObjectClassDefinition().isAuxiliary(); + } - @Override - public ResourceObjectReferenceType getBaseContext() { - return baseContext; + public PrismContext getPrismContext() { + return getResourceType().asPrismObject().getPrismContext(); } - public void setBaseContext(ResourceObjectReferenceType baseContext) { - this.baseContext = baseContext; + @Nullable + @Override + public Class getCompileTimeClass() { + return originalObjectClassDefinition.getCompileTimeClass(); // most probably null } - public static PrismObjectDefinition constructObjectDefinition(RefinedObjectClassDefinition refinedObjectClassDefinition) { - // Almost-shallow clone of object definition and complex type - PrismObjectDefinition originalObjectDefinition = - refinedObjectClassDefinition.getSchemaRegistry().findObjectDefinitionByCompileTimeClass(ShadowType.class); - return originalObjectDefinition.cloneWithReplacedDefinition(ShadowType.F_ATTRIBUTES, - refinedObjectClassDefinition.toResourceAttributeContainerDefinition()); - } + @Nullable + @Override + public QName getExtensionForType() { + return originalObjectClassDefinition.getExtensionForType(); // most probably null + } @Override - public RefinedAttributeDefinition getAttributeDefinition(QName attributeName) { - for (RefinedAttributeDefinition attrDef : getAttributeDefinitions()) { - if (QNameUtil.match(attrDef.getName(), attributeName)) { - return attrDef; - } - } - return null; - } + public boolean isContainerMarker() { + return originalObjectClassDefinition.isContainerMarker(); // most probably false + } + @Override + public boolean isObjectMarker() { + return originalObjectClassDefinition.isObjectMarker(); // most probably false + } - public void add(RefinedAttributeDefinition refinedAttributeDefinition) { - ((Collection)getAttributeDefinitions()).add(refinedAttributeDefinition); - } + @Override + public boolean isXsdAnyMarker() { + return originalObjectClassDefinition.isXsdAnyMarker(); + } + + // TODO + @Override + public ID findItemDefinition(@NotNull ItemPath path, @NotNull Class clazz) { + if (path.size() != 1) { + return null; + } + QName first = ItemPath.getFirstName(path); + if (first == null) { + return null; + } + return findItemDefinition(first, clazz); + } + + // TODO + @Override + public ID findNamedItemDefinition(@NotNull QName firstName, @NotNull ItemPath rest, + @NotNull Class clazz) { + return findItemDefinition(firstName); + } + + @Nullable + @Override + public String getDefaultNamespace() { + return originalObjectClassDefinition.getDefaultNamespace(); + } + + @Override + public boolean isRuntimeSchema() { + return originalObjectClassDefinition.isRuntimeSchema(); + } + + @Override + public boolean isSecondaryIdentifier(QName attrName) { + return originalObjectClassDefinition.isSecondaryIdentifier(attrName); + } + + @NotNull + @Override + public List getIgnoredNamespaces() { + return originalObjectClassDefinition.getIgnoredNamespaces(); + } + + @Nullable + @Override + public QName getSuperType() { + return originalObjectClassDefinition.getSuperType(); + } + + @Override + public void merge(ComplexTypeDefinition otherComplexTypeDef) { + throw new UnsupportedOperationException("TODO implement this"); + } + + @Override + public void revive(PrismContext prismContext) { + originalObjectClassDefinition.revive(prismContext); + // TODO revive attributes + } + + @Override + public boolean isIgnored() { + return originalObjectClassDefinition.isIgnored(); + } + + @Override + public boolean isAbstract() { + return originalObjectClassDefinition.isAbstract(); + } + + @Override + public boolean isEmpty() { + return attributeDefinitions.isEmpty() && associationDefinitions.isEmpty(); + } + + @Override + public boolean isDeprecated() { + return originalObjectClassDefinition.isDeprecated(); + } + + @Override + public boolean isEmphasized() { + return originalObjectClassDefinition.isEmphasized(); + } + + @Override + public Integer getDisplayOrder() { + return originalObjectClassDefinition.getDisplayOrder(); + } + + @Override + public String getHelp() { + return originalObjectClassDefinition.getHelp(); + } + + @Override + public String getDocumentation() { + return originalObjectClassDefinition.getDocumentation(); + } + + @Override + public String getDocumentationPreview() { + return originalObjectClassDefinition.getDocumentationPreview(); + } + + @Override + public Class getTypeClassIfKnown() { + return originalObjectClassDefinition.getTypeClassIfKnown(); + } + + @Override + public Class getTypeClass() { + return originalObjectClassDefinition.getTypeClass(); + } + + @Override + public ResourceAttributeContainer instantiate(QName elementName) { + return originalObjectClassDefinition.instantiate(elementName); // TODO doesn't preserve 'this' in instantiated RAC + } + + //endregion + + //region ==== Parsing ================================================================================= - @Override - public boolean containsAttributeDefinition(ItemPathType pathType) { - QName segmentQName = ItemPathUtil.getOnlySegmentQName(pathType); - return containsAttributeDefinition(segmentQName); - } - - @Override - public boolean containsAttributeDefinition(QName attributeName) { - for (RefinedAttributeDefinition rAttributeDef : getAttributeDefinitions()) { - if (QNameUtil.match(rAttributeDef.getName(), attributeName)) { - return true; - } - } - return false; - } - static RefinedObjectClassDefinition parse(ResourceObjectTypeDefinitionType entTypeDefType, ResourceType resourceType, RefinedResourceSchema rSchema, ShadowKindType impliedKind, PrismContext prismContext, String contextDescription) throws SchemaException { @@ -528,7 +811,7 @@ private static ResourceObjectPattern convertToPattern(ResourceObjectPatternType // Deprecated if (patternType.getName() != null) { - RefinedAttributeDefinition attributeDefinition = rAccountDef.findAttributeDefinition(new QName(SchemaConstants.NS_ICF_SCHEMA,"name")); + RefinedAttributeDefinition attributeDefinition = rAccountDef.findAttributeDefinition(new QName(SchemaConstants.NS_ICF_SCHEMA,"name")); if (attributeDefinition == null) { throw new SchemaException("No ICF NAME attribute in schema as specified in the definition of protected objects (this is deprecated syntax anyway, convert it to filter)"); } @@ -553,7 +836,7 @@ public static RefinedObjectClassDefinition parseFromSchema(ObjectClassComplexTyp RefinedResourceSchema rSchema, PrismContext prismContext, String contextDescription) throws SchemaException { - RefinedObjectClassDefinitionImpl rOcDef = new RefinedObjectClassDefinitionImpl(prismContext, resourceType, objectClassDef); + RefinedObjectClassDefinitionImpl rOcDef = new RefinedObjectClassDefinitionImpl(resourceType, objectClassDef); String intent = objectClassDef.getIntent(); if (intent == null && objectClassDef.isDefaultInAKind()) { @@ -600,7 +883,7 @@ private static RefinedObjectClassDefinition parseRefinedObjectClass(ResourceObje throw new SchemaException("Definition of "+typeDesc+" type " + schemaHandlingObjDefType.getIntent() + " does not have objectclass, in " + contextDescription); } - RefinedObjectClassDefinitionImpl rOcDef = new RefinedObjectClassDefinitionImpl(prismContext, resourceType, objectClassDef); + RefinedObjectClassDefinitionImpl rOcDef = new RefinedObjectClassDefinitionImpl(resourceType, objectClassDef); rOcDef.setKind(kind); rOcDef.schemaHandlingObjectTypeDefinitionType = schemaHandlingObjDefType; rOcDef.setIntent(intent); @@ -630,7 +913,7 @@ private static RefinedObjectClassDefinition parseRefinedObjectClass(ResourceObje return rOcDef; } - public void parseAssociations(RefinedResourceSchema rSchema) throws SchemaException { + void parseAssociations(RefinedResourceSchema rSchema) throws SchemaException { if (schemaHandlingObjectTypeDefinitionType == null) { return; } @@ -639,16 +922,15 @@ public void parseAssociations(RefinedResourceSchema rSchema) throws SchemaExcept ShadowKindType assocKind = rAssocDef.getKind(); RefinedObjectClassDefinition assocTarget = rSchema.getRefinedDefinition(assocKind, rAssocDef.getIntents()); rAssocDef.setAssociationTarget(assocTarget); - associations.add(rAssocDef); + associationDefinitions.add(rAssocDef); } } - public void parseAuxiliaryObjectClasses(RefinedResourceSchema rSchema) throws SchemaException { + void parseAuxiliaryObjectClasses(RefinedResourceSchema rSchema) throws SchemaException { if (schemaHandlingObjectTypeDefinitionType == null) { return; } List auxiliaryObjectClassQNames = schemaHandlingObjectTypeDefinitionType.getAuxiliaryObjectClass(); - auxiliaryObjectClassDefinitions = new ArrayList<>(auxiliaryObjectClassQNames.size()); for (QName auxiliaryObjectClassQName: auxiliaryObjectClassQNames) { RefinedObjectClassDefinition auxiliaryObjectClassDef = rSchema.getRefinedDefinition(auxiliaryObjectClassQName); if (auxiliaryObjectClassDef == null) { @@ -658,30 +940,30 @@ public void parseAuxiliaryObjectClasses(RefinedResourceSchema rSchema) throws Sc } } - public void parseAttributes(RefinedResourceSchema rSchema, String contextDescription) throws SchemaException { + void parseAttributes(RefinedResourceSchema rSchema, String contextDescription) throws SchemaException { if (schemaHandlingObjectTypeDefinitionType == null) { // this is definition from schema. We already have all we need. return; } parseAttributesFrom(rSchema, getObjectClassDefinition(), false, contextDescription); - if (auxiliaryObjectClassDefinitions != null) { - for (RefinedObjectClassDefinition auxiliaryObjectClassDefinition: auxiliaryObjectClassDefinitions) { - parseAttributesFrom(rSchema, auxiliaryObjectClassDefinition, true, contextDescription); - } + for (RefinedObjectClassDefinition auxiliaryObjectClassDefinition: auxiliaryObjectClassDefinitions) { + parseAttributesFrom(rSchema, auxiliaryObjectClassDefinition, true, contextDescription); } // Check for extra attribute definitions in the account type for (ResourceAttributeDefinitionType attrDefType : schemaHandlingObjectTypeDefinitionType.getAttribute()) { if (!containsAttributeDefinition(attrDefType.getRef()) && !RefinedAttributeDefinitionImpl.isIgnored(attrDefType)) { - throw new SchemaException("Definition of attribute " + attrDefType.getRef() + " not found in object class " + objectClassDefinition.getTypeName() + " as defined in " + contextDescription); + throw new SchemaException("Definition of attribute " + attrDefType.getRef() + " not found in object class " + originalObjectClassDefinition + .getTypeName() + " as defined in " + contextDescription); } } parseProtected(this, schemaHandlingObjectTypeDefinitionType); } - public void parseAttributesFrom(RefinedResourceSchema rSchema, ObjectClassComplexTypeDefinition ocDef, boolean auxiliary, String contextDescription) throws SchemaException { + private void parseAttributesFrom(RefinedResourceSchema rSchema, ObjectClassComplexTypeDefinition ocDef, boolean auxiliary, + String contextDescription) throws SchemaException { if (schemaHandlingObjectTypeDefinitionType == null) { // this is definition from schema. We already have all we need. return; @@ -694,8 +976,9 @@ public void parseAttributesFrom(RefinedResourceSchema rSchema, ObjectClassComple // the shadows will still have that attributes and we will need their type definition to work // well with them. They may also be mandatory. We cannot pretend that they do not exist. - RefinedAttributeDefinition rAttrDef = RefinedAttributeDefinitionImpl.parse(road, attrDefType, ocDef, - prismContext, "in "+kind+" type " + intent + ", in " + contextDescription); + // TODO !!!! fix the cast + RefinedAttributeDefinition rAttrDef = (RefinedAttributeDefinition) RefinedAttributeDefinitionImpl.parse(road, attrDefType, ocDef, + rSchema.getPrismContext(), "in "+kind+" type " + intent + ", in " + contextDescription); if (!auxiliary) { processIdentifiers(rAttrDef, ocDef); } @@ -729,11 +1012,6 @@ private void processIdentifiers(RefinedAttributeDefinition rAttrDef, ObjectClass } } - private RefinedAttributeDefinition substituteRefinedAttributeDefinition(ResourceAttributeDefinition attributeDef) { - RefinedAttributeDefinition rAttrDef = findAttributeDefinition(attributeDef.getName()); - return rAttrDef; - } - private ResourceAttributeDefinitionType findAttributeDefinitionType(QName attrName, ResourceObjectTypeDefinitionType rOcDefType, String contextDescription) throws SchemaException { ResourceAttributeDefinitionType foundAttrDefType = null; @@ -755,225 +1033,76 @@ private ResourceAttributeDefinitionType findAttributeDefinitionType(QName attrNa return foundAttrDefType; } - + private void add(RefinedAttributeDefinition refinedAttributeDefinition) { + attributeDefinitions.add(refinedAttributeDefinition); + } + //endregion - @Override - public PrismObject createBlankShadow() { - PrismObject accountShadow; - try { - accountShadow = prismContext.createObject(ShadowType.class); - } catch (SchemaException e) { - // This should not happen - throw new SystemException("Internal error instantiating account shadow: "+e.getMessage(), e); - } - ShadowType accountShadowType = accountShadow.asObjectable(); - - accountShadowType.setIntent(getIntent()); - accountShadowType.setKind(getKind()); - accountShadowType.setObjectClass(getObjectClassDefinition().getTypeName()); - accountShadowType.setResourceRef(ObjectTypeUtil.createObjectRef(getResourceType())); - - // Setup definition - PrismObjectDefinition newDefinition = accountShadow.getDefinition().cloneWithReplacedDefinition( - ShadowType.F_ATTRIBUTES, toResourceAttributeContainerDefinition()); - accountShadow.setDefinition(newDefinition); - - return accountShadow; + //region Diagnostic output, hashCode/equals ========================================================= + @Override + public String debugDump() { + return debugDump(0); } - + @Override - public ResourceShadowDiscriminator getShadowDiscriminator() { - return new ResourceShadowDiscriminator(getResourceType().getOid(), getKind(), getIntent()); + public String debugDump(int indent) { + return debugDump(indent, null, getDebugDumpClassName()); } - @Override - public Collection getNamesOfAttributesWithOutboundExpressions() { - Collection attrNames = new HashSet(); - for (RefinedAttributeDefinition attrDef : getAttributeDefinitions()) { - if (attrDef.getOutboundMappingType() != null) { - attrNames.add(attrDef.getName()); - } + public String debugDump(int indent, LayerType layer, String debugDumpClassName) { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < indent; i++) { + sb.append(INDENT_STRING); } - return attrNames; - } - - @Override - public Collection getNamesOfAttributesWithInboundExpressions() { - Collection attrNames = new HashSet(); - for (RefinedAttributeDefinition attrDef : getAttributeDefinitions()) { - List inbounds = attrDef.getInboundMappingTypes(); - if (inbounds != null && !inbounds.isEmpty()) { - attrNames.add(attrDef.getName()); - } + sb.append(debugDumpClassName).append("("); + sb.append(SchemaDebugUtil.prettyPrint(getTypeName())); + if (isDefault()) { + sb.append(",default"); } - - return attrNames; - } - - @Override - public List getPasswordInbound() { - - ResourcePasswordDefinitionType password = getPasswordDefinition(); - - if (password == null || password.getInbound() == null) { - return null; + if (getKind() != null) { + sb.append(" ").append(getKind().value()); } - - return password.getInbound(); - } - - @Override - public MappingType getPasswordOutbound() { - - ResourcePasswordDefinitionType password = getPasswordDefinition(); - - if (password == null || password.getOutbound() == null) { - return null; - } - - return password.getOutbound(); - } - - @Override - public AttributeFetchStrategyType getPasswordFetchStrategy() { - ResourcePasswordDefinitionType password = getPasswordDefinition(); - if (password == null) { - return AttributeFetchStrategyType.IMPLICIT; - } - if (password.getFetchStrategy() == null) { - return AttributeFetchStrategyType.IMPLICIT; - } - return password.getFetchStrategy(); - } - - @Override - public ObjectReferenceType getPasswordPolicy(){ - ResourcePasswordDefinitionType password = getPasswordDefinition(); - - if (password == null || password.getPasswordPolicyRef() == null){ - return null; - } - - return password.getPasswordPolicyRef(); - } - - @Override - public ResourcePasswordDefinitionType getPasswordDefinition(){ - if (schemaHandlingObjectTypeDefinitionType == null) { - return null; + sb.append(","); + if (getIntent() != null) { + sb.append("intent=").append(getIntent()); } - ResourceCredentialsDefinitionType credentials = schemaHandlingObjectTypeDefinitionType.getCredentials(); - if (credentials == null) { - return null; + if (layer != null) { + sb.append(",layer=").append(layer); } - - return credentials.getPassword(); - } - - @Override - public ResourceActivationDefinitionType getActivationSchemaHandling(){ - if (schemaHandlingObjectTypeDefinitionType == null) { - return null; + sb.append(")"); + for (RefinedAttributeDefinition rAttrDef: getAttributeDefinitions()) { + sb.append("\n"); + sb.append(rAttrDef.debugDump(indent + 1, layer)); } - - return schemaHandlingObjectTypeDefinitionType.getActivation(); - } - - @Override - public ResourceBidirectionalMappingType getActivationBidirectionalMappingType(QName propertyName) { - ResourceActivationDefinitionType activationSchemaHandling = getActivationSchemaHandling(); - if (activationSchemaHandling == null) { - return null; - } - - if (QNameUtil.match(ActivationType.F_ADMINISTRATIVE_STATUS, propertyName)) { - return activationSchemaHandling.getAdministrativeStatus(); - } else if (QNameUtil.match(ActivationType.F_VALID_FROM, propertyName)) { - return activationSchemaHandling.getValidFrom(); - } else if (QNameUtil.match(ActivationType.F_VALID_TO, propertyName)) { - return activationSchemaHandling.getValidTo(); - } else if (QNameUtil.match(ActivationType.F_LOCKOUT_STATUS, propertyName)) { - return null; // todo implement this - } else if (QNameUtil.match(ActivationType.F_LOCKOUT_EXPIRATION_TIMESTAMP, propertyName)) { - return null; // todo implement this - } else { - throw new IllegalArgumentException("Unknown activation property "+propertyName); - } + return sb.toString(); } - @Override - public AttributeFetchStrategyType getActivationFetchStrategy(QName propertyName) { - ResourceBidirectionalMappingType biType = getActivationBidirectionalMappingType(propertyName); - if (biType == null) { - return AttributeFetchStrategyType.IMPLICIT; - } - if (biType.getFetchStrategy() == null) { - return AttributeFetchStrategyType.IMPLICIT; - } - return biType.getFetchStrategy(); - } - - @Override - public T getEffectiveCapability(Class capabilityClass) { - return ResourceTypeUtil.getEffectiveCapability(getResourceType(), schemaHandlingObjectTypeDefinitionType, capabilityClass); - } - - @Override - public PagedSearchCapabilityType getPagedSearches() { - return getEffectiveCapability(PagedSearchCapabilityType.class); - } - - @Override - public boolean isPagedSearchEnabled() { - return getPagedSearches() != null; // null means nothing or disabled - } - - @Override - public boolean isObjectCountingEnabled() { - return getEffectiveCapability(CountObjectsCapabilityType.class) != null; + /** + * Return a human readable name of this class suitable for logs. + */ + protected String getDebugDumpClassName() { + return "rOCD"; } - - - - public boolean isAuxiliary() { - return getObjectClassDefinition().isAuxiliary(); - } @Override - public boolean matches(ShadowType shadowType) { - if (shadowType == null) { - return false; - } - if (!QNameUtil.match(getObjectClassDefinition().getTypeName(), shadowType.getObjectClass())) { - return false; - } - if (shadowType.getKind() == null) { - if (kind != ShadowKindType.ACCOUNT) { - return false; - } + public String getHumanReadableName() { + if (getDisplayName() != null) { + return getDisplayName(); + } else if (getKind() != null) { + return getKind()+":"+getIntent(); + } else if (getTypeName() != null) { + return getTypeName().getLocalPart(); } else { - if (!MiscUtil.equals(kind, shadowType.getKind())) { - return false; - } + return "null"; } - if (shadowType.getIntent() != null) { -// if (isDefault) { -// return true; -// } else { -// return false; -// } -// } else { - return MiscUtil.equals(intent, shadowType.getIntent()); - } - return true; } - - @Override - public ObjectQuery createShadowSearchQuery(String resourceOid) throws SchemaException { + + @Override + public String toString() { if (getKind() == null) { - return super.createShadowSearchQuery(resourceOid); + return getDebugDumpClassName() + "("+PrettyPrinter.prettyPrint(getTypeName())+")"; } else { - return ObjectQueryUtil.createResourceAndKindIntent(resourceOid, getKind(), getIntent(), getPrismContext()); + return getDebugDumpClassName() + "("+getKind()+":"+getIntent()+"="+PrettyPrinter.prettyPrint(getTypeName())+")"; } } @@ -981,10 +1110,9 @@ public ObjectQuery createShadowSearchQuery(String resourceOid) throws SchemaExce public int hashCode() { final int prime = 31; int result = super.hashCode(); - result = prime * result + ((associations == null) ? 0 : associations.hashCode()); - result = prime * result + ((attributeDefinitions == null) ? 0 : attributeDefinitions.hashCode()); - result = prime * result - + ((auxiliaryObjectClassDefinitions == null) ? 0 : auxiliaryObjectClassDefinitions.hashCode()); + result = prime * result + associationDefinitions.hashCode(); + result = prime * result + attributeDefinitions.hashCode(); + result = prime * result + auxiliaryObjectClassDefinitions.hashCode(); result = prime * result + ((baseContext == null) ? 0 : baseContext.hashCode()); result = prime * result + ((description == null) ? 0 : description.hashCode()); result = prime * result + ((displayName == null) ? 0 : displayName.hashCode()); @@ -994,10 +1122,10 @@ public int hashCode() { result = prime * result + ((intent == null) ? 0 : intent.hashCode()); result = prime * result + (isDefault ? 1231 : 1237); result = prime * result + ((kind == null) ? 0 : kind.hashCode()); - result = prime * result + ((objectClassDefinition == null) ? 0 : objectClassDefinition.hashCode()); + result = prime * result + originalObjectClassDefinition.hashCode(); result = prime * result + ((objectDefinition == null) ? 0 : objectDefinition.hashCode()); result = prime * result + ((protectedObjectPatterns == null) ? 0 : protectedObjectPatterns.hashCode()); - result = prime * result + ((resourceType == null) ? 0 : resourceType.hashCode()); + result = prime * result + resourceType.hashCode(); result = prime * result + ((schemaHandlingObjectTypeDefinitionType == null) ? 0 : schemaHandlingObjectTypeDefinitionType.hashCode()); result = prime * result + ((secondaryIdentifiers == null) ? 0 : secondaryIdentifiers.hashCode()); @@ -1016,25 +1144,13 @@ public boolean equals(Object obj) { return false; } RefinedObjectClassDefinitionImpl other = (RefinedObjectClassDefinitionImpl) obj; - if (associations == null) { - if (other.associations != null) { - return false; - } - } else if (!associations.equals(other.associations)) { + if (!associationDefinitions.equals(other.associationDefinitions)) { return false; } - if (attributeDefinitions == null) { - if (other.attributeDefinitions != null) { - return false; - } - } else if (!attributeDefinitions.equals(other.attributeDefinitions)) { + if (!attributeDefinitions.equals(other.attributeDefinitions)) { return false; } - if (auxiliaryObjectClassDefinitions == null) { - if (other.auxiliaryObjectClassDefinitions != null) { - return false; - } - } else if (!auxiliaryObjectClassDefinitions.equals(other.auxiliaryObjectClassDefinitions)) { + if (!auxiliaryObjectClassDefinitions.equals(other.auxiliaryObjectClassDefinitions)) { return false; } if (baseContext == null) { @@ -1085,11 +1201,7 @@ public boolean equals(Object obj) { if (kind != other.kind) { return false; } - if (objectClassDefinition == null) { - if (other.objectClassDefinition != null) { - return false; - } - } else if (!objectClassDefinition.equals(other.objectClassDefinition)) { + if (!originalObjectClassDefinition.equals(other.originalObjectClassDefinition)) { return false; } if (objectDefinition == null) { @@ -1106,11 +1218,7 @@ public boolean equals(Object obj) { } else if (!protectedObjectPatterns.equals(other.protectedObjectPatterns)) { return false; } - if (resourceType == null) { - if (other.resourceType != null) { - return false; - } - } else if (!resourceType.equals(other.resourceType)) { + if (!resourceType.equals(other.resourceType)) { return false; } if (schemaHandlingObjectTypeDefinitionType == null) { @@ -1129,73 +1237,32 @@ public boolean equals(Object obj) { } return true; } + //endregion + + //region Typing overhead ============================================================== + /* + * There is a natural correspondence between "type definition" classes and items in these classes: + * + * ComplexTypeDefinition .............................. ItemDefinition + * ObjectClassComplexTypeDefinition ................... ResourceAttributeDefinition + * RefinedObjectClassDefinition ....................... RefinedAttributeDefinition + * LayerRefinedObjectClassDefinition .................. LayerRefinedAttributeDefinition + * + * It would be great if the interface of "type definition" classes, i.e. methods like getDefinitions(), + * findItemDefinition, findAttributeDefinition, and so on would be parametrized on the type of item definitions + * from the list above. Unfortunately, this would make clients very unintuitive, using interfaces like + * + * RefinedObjectClassDefinition> + * + * Therefore the decision is to keep clients' lives simple; at the cost of "typing overhead" - providing correct + * signatures of derived types. In order to keep it manageable we put all such methods in this single section. + */ @Override - public String debugDump() { - return debugDump(0); - } - - @Override - public String debugDump(int indent) { - return debugDump(indent, null, getDebugDumpClassName()); - } - - public String debugDump(int indent, LayerType layer, String debugDumpClassName) { - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < indent; i++) { - sb.append(INDENT_STRING); - } - sb.append(debugDumpClassName).append("("); - sb.append(SchemaDebugUtil.prettyPrint(getTypeName())); - if (isDefault()) { - sb.append(",default"); - } - if (getKind() != null) { - sb.append(" ").append(getKind().value()); - } - sb.append(","); - if (getIntent() != null) { - sb.append("intent=").append(getIntent()); - } - if (layer != null) { - sb.append(",layer=").append(layer); - } - sb.append(")"); - for (RefinedAttributeDefinition rAttrDef: getAttributeDefinitions()) { - sb.append("\n"); - sb.append(rAttrDef.debugDump(indent + 1, layer)); - } - return sb.toString(); - } - - /** - * Return a human readable name of this class suitable for logs. - */ - @Override - protected String getDebugDumpClassName() { - return "rOCD"; - } - - @Override - public String getHumanReadableName() { - if (getDisplayName() != null) { - return getDisplayName(); - } else if (getKind() != null) { - return getKind()+":"+getIntent(); - } else if (getTypeName() != null) { - return getTypeName().getLocalPart(); - } else { - return "null"; - } - } - - @Override - public String toString() { - if (getKind() == null) { - return getDebugDumpClassName() + "("+PrettyPrinter.prettyPrint(getTypeName())+")"; - } else { - return getDebugDumpClassName() + "("+getKind()+":"+getIntent()+"="+PrettyPrinter.prettyPrint(getTypeName())+")"; - } + public RefinedAttributeDefinition findAttributeDefinition(@NotNull QName name) { + return findItemDefinition(name, RefinedAttributeDefinition.class, false); } + //endregion + } diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedResourceSchemaImpl.java b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedResourceSchemaImpl.java index ae0cd27ba81..ca99c13568b 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedResourceSchemaImpl.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedResourceSchemaImpl.java @@ -103,7 +103,7 @@ public CompositeRefinedObjectClassDefinition determineCompositeObjectClassDefini return null; } Collection auxiliaryObjectClassDefinitions = structuralObjectClassDefinition.getAuxiliaryObjectClassDefinitions(); - return new CompositeRefinedObjectClassDefinition(structuralObjectClassDefinition, auxiliaryObjectClassDefinitions); + return new CompositeRefinedObjectClassDefinitionImpl(structuralObjectClassDefinition, auxiliaryObjectClassDefinitions); } @Override @@ -149,7 +149,7 @@ public CompositeRefinedObjectClassDefinition determineCompositeObjectClassDefini auxiliaryObjectClassDefinitions.add(auxiliaryObjectClassDef); } - return new CompositeRefinedObjectClassDefinition(structuralObjectClassDefinition, auxiliaryObjectClassDefinitions); + return new CompositeRefinedObjectClassDefinitionImpl(structuralObjectClassDefinition, auxiliaryObjectClassDefinitions); } @Override @@ -174,7 +174,7 @@ public CompositeRefinedObjectClassDefinition determineCompositeObjectClassDefini auxiliaryObjectClassDefinitions = structuralObjectClassDefinition.getAuxiliaryObjectClassDefinitions(); - return new CompositeRefinedObjectClassDefinition(structuralObjectClassDefinition, auxiliaryObjectClassDefinitions); + return new CompositeRefinedObjectClassDefinitionImpl(structuralObjectClassDefinition, auxiliaryObjectClassDefinitions); } @Override diff --git a/infra/common/src/test/java/com/evolveum/midpoint/common/refinery/TestRefinedSchema.java b/infra/common/src/test/java/com/evolveum/midpoint/common/refinery/TestRefinedSchema.java index ab90896912e..54a6d92445c 100644 --- a/infra/common/src/test/java/com/evolveum/midpoint/common/refinery/TestRefinedSchema.java +++ b/infra/common/src/test/java/com/evolveum/midpoint/common/refinery/TestRefinedSchema.java @@ -23,7 +23,6 @@ import java.io.File; import java.io.IOException; -import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; @@ -39,7 +38,6 @@ import org.testng.AssertJUnit; import org.testng.annotations.BeforeSuite; import org.testng.annotations.Test; -import org.w3c.dom.Element; import org.xml.sax.SAXException; import com.evolveum.midpoint.common.ResourceObjectPattern; @@ -208,7 +206,7 @@ private void assertRefinedSchema(ResourceType resourceType, RefinedResourceSchem assertNotNull("No entitlement displayNameAttribute", entDisplayNameAttributeDef); assertEquals("Wrong entitlement displayNameAttribute", new QName(resourceType.getNamespace(), "cn"), entDisplayNameAttributeDef.getName()); - assertEquals("Unexpected number of entitlement associations", 1, rAccountDef.getEntitlementAssociations().size()); + assertEquals("Unexpected number of entitlement associations", 1, rAccountDef.getEntitlementAssociationDefinitions().size()); } assertRefinedToLayer(rAccountDef, sourceLayer); @@ -643,7 +641,7 @@ public void testParseFromResourcePosix() throws Exception { assertEquals("Wrong entitlement displayNameAttribute", new QName(ResourceTypeUtil.getResourceNamespace(resourceType), "dn"), entDisplayNameAttributeDef.getName()); - assertEquals("Unexpected number of entitlement associations", 1, rAccountDef.getEntitlementAssociations().size()); + assertEquals("Unexpected number of entitlement associations", 1, rAccountDef.getEntitlementAssociationDefinitions().size()); ResourceAttributeContainerDefinition resAttrContainerDef = rAccountDef.toResourceAttributeContainerDefinition(); assertNotNull("No ResourceAttributeContainerDefinition", resAttrContainerDef); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/ComplexTypeDefinition.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/ComplexTypeDefinition.java index a34207ddb81..8d771517ffe 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/ComplexTypeDefinition.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/ComplexTypeDefinition.java @@ -16,22 +16,48 @@ package com.evolveum.midpoint.prism; -import com.evolveum.midpoint.prism.path.ItemPath; -import com.evolveum.midpoint.util.exception.SchemaException; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import javax.xml.namespace.QName; import java.util.List; +import java.util.Map; /** + * Provides a definition for a complex type, i.e. type that prescribes inner items. + * It's instances may be container values or property values, depending on container/object + * markers presence. + * + * @author semancik * @author mederly */ public interface ComplexTypeDefinition extends Definition, LocalDefinitionStore { + /** + * Returns definitions for all inner items. + * + * These are of type ItemDefinition. However, very often subtypes of this type are used, + * e.g. ResourceAttributeDefinition, RefinedAttributeDefinition, LayerRefinedAttributeDefinition, and so on. + * + * Although returned as a list, the order of definitions is insignificant. (TODO change to set?) + * + * The list is unmodifiable. + */ + @NotNull List getDefinitions(); + /** + * Returns compile-time class, if this type has any. For example, UserType.class, ObjectType.class, ExtensionType.class. + */ + @Nullable Class getCompileTimeClass(); + /** + * If not null, indicates that this type defines the structure of 'extension' element of a given type. + * E.g. getExtensionForType() == c:UserType means that this complex type defines structure of + * 'extension' elements of UserType objects. + */ + @Nullable QName getExtensionForType(); /** @@ -58,27 +84,53 @@ public interface ComplexTypeDefinition extends Definition, LocalDefinitionStore boolean isXsdAnyMarker(); /** - * When resolving unqualified names for items contained in this CTD, what should be the default namespace to look into at first. - * Currently does NOT apply recursively (to inner CTDs). + * When resolving unqualified names for items contained in this CTD, what should be the default namespace + * to look into at first. Currently does NOT apply recursively (to inner CTDs). */ + @Nullable String getDefaultNamespace(); /** - * When resolving unqualified names for items contained in this CTD, what namespace(s) should be ignored. - * Names in this list are interpreted as a namespace prefixes. - * Currently does NOT apply recursively (to inner CTDs). + * When resolving unqualified names for items contained in this CTD, what namespace(s) should be ignored. + * Names in this list are interpreted as a namespace prefixes. + * Currently does NOT apply recursively (to inner CTDs). */ @NotNull List getIgnoredNamespaces(); + /** + * Name of super type of this complex type definition. E.g. c:ObjectType is a super type for + * c:FocusType which is a super type for c:UserType. Or (more complex example) ri:ShadowAttributesType + * is a super type of ri:AccountObjectClass. (TODO is this really true?) + */ + @Nullable QName getSuperType(); + /** + * Copies cloned definitions from the other type definition into this one. + * (TODO remove from the interface?) + */ void merge(ComplexTypeDefinition otherComplexTypeDef); @Override void revive(PrismContext prismContext); + /** + * Returns true if there are no item definitions. + */ boolean isEmpty(); + /** + * Does a shallow clone of this definition (i.e. item definitions themselves are NOT cloned). + */ + @NotNull ComplexTypeDefinition clone(); + + /** + * Does a deep clone of this definition. + * + * @param ctdMap Keeps already cloned definitions in order to prevent indefinite loops. + */ + @NotNull + ComplexTypeDefinition deepClone(Map ctdMap); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/ComplexTypeDefinitionImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/ComplexTypeDefinitionImpl.java index f936cfee520..dea510c5d9d 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/ComplexTypeDefinitionImpl.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/ComplexTypeDefinitionImpl.java @@ -28,10 +28,7 @@ import com.evolveum.midpoint.util.QNameUtil; import org.apache.commons.lang.StringUtils; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import javax.xml.namespace.QName; @@ -73,16 +70,13 @@ protected String getSchemaNamespace() { * * @return set of definitions */ + @NotNull @Override public List getDefinitions() { - return itemDefinitions; + return Collections.unmodifiableList(itemDefinitions); } - public void addDefinition(ItemDefinition itemDef) { - itemDefinitions.add(itemDef); - } - - public void add(ItemDefinition definition) { + public void add(ItemDefinition definition) { itemDefinitions.add(definition); } @@ -275,9 +269,7 @@ public boolean isEmpty() { return itemDefinitions.isEmpty(); } - /** - * Shallow clone. - */ + @NotNull @Override public ComplexTypeDefinitionImpl clone() { ComplexTypeDefinitionImpl clone = new ComplexTypeDefinitionImpl(this.typeName, prismContext); @@ -286,24 +278,25 @@ public ComplexTypeDefinitionImpl clone() { } public ComplexTypeDefinition deepClone() { - return deepClone(new HashMap()); + return deepClone(new HashMap<>()); } - - ComplexTypeDefinitionImpl deepClone(Map ctdMap) { - ComplexTypeDefinitionImpl clone; + + @NotNull + @Override + public ComplexTypeDefinition deepClone(Map ctdMap) { if (ctdMap != null) { - clone = (ComplexTypeDefinitionImpl) ctdMap.get(this.getTypeName()); + ComplexTypeDefinition clone = ctdMap.get(this.getTypeName()); if (clone != null) { return clone; // already cloned } } - clone = clone(); // shallow + ComplexTypeDefinitionImpl clone = clone(); // shallow if (ctdMap != null) { ctdMap.put(this.getTypeName(), clone); } clone.itemDefinitions.clear(); for (ItemDefinition itemDef: this.itemDefinitions) { - clone.itemDefinitions.add(((ItemDefinitionImpl) itemDef).deepClone(ctdMap)); + clone.itemDefinitions.add(itemDef.deepClone(ctdMap)); } return clone; } @@ -443,7 +436,7 @@ protected void extendDumpHeader(StringBuilder sb) { // Do nothing } - protected void extendDumpDefinition(StringBuilder sb, ItemDefinition def) { + protected void extendDumpDefinition(StringBuilder sb, ItemDefinition def) { // Do nothing } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/Definition.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/Definition.java index f4a1cdfca18..6452d27c58a 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/Definition.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/Definition.java @@ -97,11 +97,6 @@ public interface Definition extends Serializable, DebugDumpable, Revivable { boolean isDeprecated(); - /** - * Whether an item is inherited from a supertype. - */ - boolean isInherited(); - /** * True for definitions that are more important than others and that should be emphasized * during presentation. E.g. the emphasized definitions will always be displayed in the user @@ -167,5 +162,6 @@ default SchemaRegistry getSchemaRegistry() { Class getTypeClass(); + @NotNull Definition clone(); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/DefinitionImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/DefinitionImpl.java index 5c2415f32f9..70fecbe7ce7 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/DefinitionImpl.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/DefinitionImpl.java @@ -124,11 +124,6 @@ public void setDeprecated(boolean deprecated) { this.deprecated = deprecated; } - @Override - public boolean isInherited() { - return inherited; - } - public void setInherited(boolean inherited) { this.inherited = inherited; } @@ -291,6 +286,7 @@ public String debugDump(int indent) { */ public abstract String getDocClassName(); + @NotNull @Override public abstract Definition clone(); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/ItemDefinition.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/ItemDefinition.java index b6ded60425f..845bbca2e01 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/ItemDefinition.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/ItemDefinition.java @@ -23,6 +23,7 @@ import javax.xml.namespace.QName; import java.io.Serializable; +import java.util.Map; /** * @author mederly @@ -48,6 +49,11 @@ public interface ItemDefinition extends Definition { boolean isOperational(); + /** + * Whether an item is inherited from a supertype. + */ + boolean isInherited(); + /** * Returns true if definition was created during the runtime based on a dynamic information * such as xsi:type attributes in XML. This means that the definition needs to be stored @@ -89,10 +95,13 @@ public interface ItemDefinition extends Definition { ItemDelta createEmptyDelta(ItemPath path); + @NotNull ItemDefinition clone(); ItemDefinition deepClone(boolean ultraDeep); + ItemDefinition deepClone(Map ctdMap); + @Override void revive(PrismContext prismContext); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/ItemDefinitionImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/ItemDefinitionImpl.java index b278c21a347..1babaea8f07 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/ItemDefinitionImpl.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/ItemDefinitionImpl.java @@ -68,6 +68,7 @@ public abstract class ItemDefinitionImpl extends DefinitionImpl private boolean canAdd = true; private boolean canRead = true; private boolean canModify = true; + private boolean inherited; private PrismReferenceValue valueEnumerationRef; // TODO: annotations @@ -313,6 +314,7 @@ public T findItemDefinition(@NotNull ItemPath path, @ } } + @NotNull @Override public abstract ItemDefinition clone(); @@ -345,7 +347,8 @@ public ItemDefinition deepClone(boolean ultraDeep) { } } - ItemDefinition deepClone(Map ctdMap) { + @Override + public ItemDefinition deepClone(Map ctdMap) { return clone(); } @@ -477,4 +480,13 @@ protected void extendToString(StringBuilder sb) { } } + @Override + public boolean isInherited() { + return inherited; + } + + @Override + public void setInherited(boolean inherited) { + this.inherited = inherited; + } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerDefinition.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerDefinition.java index 98b92cf9701..06cffa870b5 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerDefinition.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerDefinition.java @@ -19,6 +19,7 @@ import com.evolveum.midpoint.prism.delta.ContainerDelta; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.util.exception.SchemaException; +import org.jetbrains.annotations.NotNull; import javax.xml.namespace.QName; import java.util.List; @@ -48,6 +49,7 @@ public interface PrismContainerDefinition extends ItemD @Override ContainerDelta createEmptyDelta(ItemPath path); + @NotNull @Override PrismContainerDefinition clone(); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerDefinitionImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerDefinitionImpl.java index 61c5b9e0379..60b3b6a8923 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerDefinitionImpl.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerDefinitionImpl.java @@ -324,7 +324,8 @@ public ContainerDelta createEmptyDelta(ItemPath path) { /** * Shallow clone */ - @Override + @NotNull + @Override public PrismContainerDefinitionImpl clone() { PrismContainerDefinitionImpl clone = new PrismContainerDefinitionImpl(name, complexTypeDefinition, prismContext, compileTimeClass); copyDefinitionData(clone); @@ -338,9 +339,9 @@ protected void copyDefinitionData(PrismContainerDefinitionImpl clone) { } @Override - ItemDefinition deepClone(Map ctdMap) { + public ItemDefinition deepClone(Map ctdMap) { PrismContainerDefinitionImpl clone = clone(); - ComplexTypeDefinitionImpl ctd = (ComplexTypeDefinitionImpl) getComplexTypeDefinition(); + ComplexTypeDefinition ctd = getComplexTypeDefinition(); if (ctd != null) { ctd = ctd.deepClone(ctdMap); clone.setComplexTypeDefinition(ctd); @@ -374,7 +375,13 @@ public PrismPropertyDefinitionImpl createPropertyDefinition(QName name, QName ty } private void addDefinition(ItemDefinition itemDef) { - ((Collection)getDefinitions()).add(itemDef); + if (complexTypeDefinition == null) { + throw new UnsupportedOperationException("Cannot add an item definition because there's no complex type definition"); + } else if (!(complexTypeDefinition instanceof ComplexTypeDefinitionImpl)) { + throw new UnsupportedOperationException("Cannot add an item definition into complex type definition of type " + complexTypeDefinition.getClass().getName()); + } else { + ((ComplexTypeDefinitionImpl) complexTypeDefinition).add(itemDef); + } } /** diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContextImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContextImpl.java index 4b77c64b583..9f75dca7bc1 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContextImpl.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContextImpl.java @@ -52,6 +52,7 @@ public class PrismContextImpl implements PrismContext { private static final Trace LOGGER = TraceManager.getTrace(PrismContextImpl.class); private static boolean allowSchemalessSerialization = true; + private static boolean extraValidation = false; // TODO replace by something serious @NotNull private final SchemaRegistryImpl schemaRegistry; @NotNull private final LexicalProcessorRegistry lexicalProcessorRegistry; @@ -103,6 +104,14 @@ public static void setAllowSchemalessSerialization(boolean allowSchemalessSerial PrismContextImpl.allowSchemalessSerialization = allowSchemalessSerialization; } + public static boolean isExtraValidation() { + return extraValidation; + } + + public static void setExtraValidation(boolean extraValidation) { + PrismContextImpl.extraValidation = extraValidation; + } + @Override public XmlEntityResolver getEntityResolver() { return schemaRegistry.getEntityResolver(); @@ -296,7 +305,7 @@ public String serializeObjectToString(PrismObject obje @NotNull @Override public PrismSerializer serializerFor(@NotNull String language) { - return new PrismSerializerImpl<>(new SerializerStringTarget(this, language), null, null, null); + return new PrismSerializerImpl<>(new SerializerStringTarget(this, language), null, null, null, this); } @NotNull @@ -320,13 +329,13 @@ public PrismSerializer yamlSerializer() { @NotNull @Override public PrismSerializer domSerializer() { - return new PrismSerializerImpl<>(new SerializerDomTarget(this), null, null, null); + return new PrismSerializerImpl<>(new SerializerDomTarget(this), null, null, null, this); } @NotNull @Override public PrismSerializer xnodeSerializer() { - return new PrismSerializerImpl<>(new SerializerXNodeTarget(this), null, null, null); + return new PrismSerializerImpl<>(new SerializerXNodeTarget(this), null, null, null, this); } @Override diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismObjectDefinition.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismObjectDefinition.java index c5e437139ae..7ac57079dd2 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismObjectDefinition.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismObjectDefinition.java @@ -33,6 +33,7 @@ public interface PrismObjectDefinition extends PrismContai @Override PrismObject instantiate(QName name) throws SchemaException; + @NotNull PrismObjectDefinition clone(); @Override diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismObjectDefinitionImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismObjectDefinitionImpl.java index 052ed386f3e..2e29b5792cf 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismObjectDefinitionImpl.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismObjectDefinitionImpl.java @@ -66,6 +66,7 @@ public PrismObject instantiate(QName name) throws SchemaException { return midPointObject; } + @NotNull @Override public PrismObjectDefinitionImpl clone() { PrismObjectDefinitionImpl clone = new PrismObjectDefinitionImpl<>(name, complexTypeDefinition, prismContext, compileTimeClass); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyDefinition.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyDefinition.java index da4b65acfaa..287d5fed7eb 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyDefinition.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyDefinition.java @@ -21,6 +21,7 @@ import com.evolveum.midpoint.util.DOMUtil; import com.evolveum.midpoint.util.DisplayableValue; import com.evolveum.midpoint.util.exception.SchemaException; +import org.jetbrains.annotations.NotNull; import javax.xml.namespace.QName; import java.util.Collection; @@ -65,6 +66,7 @@ default boolean isAnyType() { @Override PrismProperty instantiate(QName name); + @NotNull @Override PrismPropertyDefinition clone(); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyDefinitionImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyDefinitionImpl.java index 322f8dab741..349389f15c0 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyDefinitionImpl.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyDefinitionImpl.java @@ -23,6 +23,7 @@ import com.evolveum.midpoint.prism.delta.PropertyDelta; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.util.DisplayableValue; +import org.jetbrains.annotations.NotNull; /** * Property Definition. @@ -146,6 +147,7 @@ public PropertyDelta createEmptyDelta(ItemPath path) { return new PropertyDelta(path, this, prismContext); } + @NotNull @Override public PrismPropertyDefinition clone() { PrismPropertyDefinitionImpl clone = new PrismPropertyDefinitionImpl(getName(), getTypeName(), getPrismContext()); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismReferenceDefinition.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismReferenceDefinition.java index 0d406993a9f..f21b3003602 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismReferenceDefinition.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismReferenceDefinition.java @@ -19,6 +19,7 @@ import com.evolveum.midpoint.prism.delta.ItemDelta; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.util.exception.SchemaException; +import org.jetbrains.annotations.NotNull; import javax.xml.namespace.QName; @@ -41,6 +42,7 @@ public interface PrismReferenceDefinition extends ItemDefinition @Override ItemDelta createEmptyDelta(ItemPath path); + @NotNull @Override PrismReferenceDefinition clone(); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismReferenceDefinitionImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismReferenceDefinitionImpl.java index 08771e799a1..dc1b223d483 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismReferenceDefinitionImpl.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismReferenceDefinitionImpl.java @@ -135,6 +135,7 @@ public ItemDelta createEmptyDelta(ItemPath path) { return new ReferenceDelta(path, this, prismContext); } + @NotNull @Override public PrismReferenceDefinition clone() { PrismReferenceDefinitionImpl clone = new PrismReferenceDefinitionImpl(getName(), getTypeName(), getPrismContext()); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismSerializer.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismSerializer.java index 3b06637a991..fc8ef8eff3d 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismSerializer.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismSerializer.java @@ -29,6 +29,11 @@ * Takes care of serializing prism objects and other beans, i.e. converts java form to * lexical representation (XML/JSON/YAML strings, DOM tree) or intermediate one (XNode). * + * General post-conditions: + * 1. All type QNames will be resolvable (i.e. they will be part of static schema) - TODO think again about this; think also about allowing 'system-wide' parts of dynamic schema ... + * 2. If root(..) is configured, it will be set regardless of the object type and content. + * 3. ... TODO ... + * * @author mederly */ public interface PrismSerializer { diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismMarshaller.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismMarshaller.java index 0b6d75759b6..be735fbf394 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismMarshaller.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismMarshaller.java @@ -21,6 +21,7 @@ import javax.xml.namespace.QName; import com.evolveum.midpoint.prism.*; +import com.evolveum.midpoint.prism.schema.GlobalDefinitionsStore; import com.evolveum.midpoint.prism.schema.SchemaRegistry; import com.evolveum.midpoint.util.JAXBUtil; import com.evolveum.prism.xml.ns._public.query_3.SearchFilterType; @@ -92,6 +93,7 @@ RootXNode marshalItemAsRoot(@NotNull Item item, QName itemName, * @param context Serialization context. * @return Marshaled prism value. */ + @NotNull RootXNode marshalPrismValueAsRoot(@NotNull PrismValue value, QName itemName, ItemDefinition itemDefinition, SerializationContext context) throws SchemaException { ItemInfo itemInfo = ItemInfo.determineFromValue(value, itemName, itemDefinition, getSchemaRegistry()); @@ -117,6 +119,7 @@ RootXNode marshalPrismValueAsRoot(@NotNull PrismValue value, QName itemName, Ite * @param context Serialization context. * @return Marshaled object. */ + @NotNull RootXNode marshalAnyData(@NotNull Object object, QName itemName, ItemDefinition itemDefinition, SerializationContext context) throws SchemaException { if (object instanceof Item) { return marshalItemAsRoot((Item) object, itemName, itemDefinition, context); @@ -219,7 +222,8 @@ private boolean isInstantiable(ItemDefinition definition) { } if (definition instanceof PrismContainerDefinition) { PrismContainerDefinition pcd = (PrismContainerDefinition) definition; - return pcd.getComplexTypeDefinition() != null && !pcd.getComplexTypeDefinition().isXsdAnyMarker(); + ComplexTypeDefinition ctd = pcd.getComplexTypeDefinition(); + return ctd != null && !ctd.isXsdAnyMarker() && ctd.getCompileTimeClass() != null; } else if (definition instanceof PrismPropertyDefinition) { PrismPropertyDefinition ppd = (PrismPropertyDefinition) definition; return !ppd.isAnyType(); // covered by isAbstract? @@ -301,7 +305,10 @@ private QName getSpecificTypeName(PrismContainerValue< if (typeValue == null || typeValue.equals(typeParent)) { return null; } - // TODO check if it's not a local type (e.g. ObjectClass in a specific resource) + if (ctdValue.getCompileTimeClass() == null) { + // TODO................. + return null; + } return typeValue; } @@ -328,7 +335,9 @@ private XNode serializeReferenceValue(PrismReferenceValue value, PrismReferenceD SearchFilterType filter = value.getFilter(); if (filter != null) { XNode xsubnode = filter.serializeToXNode(); - xmap.put(createReferenceQName(XNode.KEY_REFERENCE_FILTER, namespace), xsubnode); + if (xsubnode != null) { + xmap.put(createReferenceQName(XNode.KEY_REFERENCE_FILTER, namespace), xsubnode); + } } EvaluationTimeType resolutionTime = value.getResolutionTime(); if (resolutionTime != null) { diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismSerializerImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismSerializerImpl.java index 70f7dcaf144..c82e2efefd1 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismSerializerImpl.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismSerializerImpl.java @@ -17,7 +17,9 @@ package com.evolveum.midpoint.prism.marshaller; import com.evolveum.midpoint.prism.*; +import com.evolveum.midpoint.prism.xml.XsdTypeMapper; import com.evolveum.midpoint.prism.xnode.RootXNode; +import com.evolveum.midpoint.prism.xnode.XNode; import com.evolveum.midpoint.util.exception.SchemaException; import org.jetbrains.annotations.NotNull; @@ -29,6 +31,7 @@ */ public class PrismSerializerImpl implements PrismSerializer { + @NotNull private final PrismContextImpl prismContext; @NotNull private final SerializerTarget target; private final QName itemName; private final ItemDefinition itemDefinition; @@ -36,29 +39,30 @@ public class PrismSerializerImpl implements PrismSerializer { //region Setting up ============================================================================================= public PrismSerializerImpl(@NotNull SerializerTarget target, QName itemName, ItemDefinition itemDefinition, - SerializationContext context) { + SerializationContext context, @NotNull PrismContextImpl prismContext) { this.target = target; this.itemName = itemName; this.itemDefinition = itemDefinition; this.context = context; + this.prismContext = prismContext; } @NotNull @Override public PrismSerializerImpl context(SerializationContext context) { - return new PrismSerializerImpl<>(this.target, itemName, itemDefinition, context); + return new PrismSerializerImpl<>(this.target, itemName, itemDefinition, context, prismContext); } @NotNull @Override public PrismSerializerImpl root(QName elementName) { - return new PrismSerializerImpl<>(this.target, elementName, itemDefinition, this.context); + return new PrismSerializerImpl<>(this.target, elementName, itemDefinition, this.context, prismContext); } @NotNull @Override public PrismSerializer definition(ItemDefinition itemDefinition) { - return new PrismSerializerImpl<>(this.target, itemName, itemDefinition, this.context); + return new PrismSerializerImpl<>(this.target, itemName, itemDefinition, this.context, prismContext); } @NotNull @@ -71,7 +75,7 @@ public PrismSerializerImpl options(SerializationOptions options) { } else { context = new SerializationContext(options); } - return new PrismSerializerImpl<>(target, itemName, itemDefinition, context); + return new PrismSerializerImpl<>(target, itemName, itemDefinition, context, prismContext); } //endregion @@ -80,13 +84,14 @@ public PrismSerializerImpl options(SerializationOptions options) { @NotNull @Override public T serialize(@NotNull Item item) throws SchemaException { - return serialize(item, itemName); + RootXNode xroot = getMarshaller().marshalItemAsRoot(item, itemName, itemDefinition, context); + checkPostconditions(xroot); // TODO find better way + return target.write(xroot, context); } @NotNull public T serialize(@NotNull Item item, QName itemName) throws SchemaException { - RootXNode xroot = getMarshaller().marshalItemAsRoot(item, itemName, itemDefinition, context); - return target.write(xroot, context); + return root(itemName).serialize(item); } @NotNull @@ -100,17 +105,21 @@ public T serialize(@NotNull PrismValue value) throws SchemaException { } else if (value.getParent() != null) { nameToUse = value.getParent().getElementName(); } else { - // TODO derive from the value type itself? Not worth the effort. - throw new IllegalArgumentException("Item name nor definition is not known for " + value); + nameToUse = null; } - return serialize(value, nameToUse); +// else { +// // TODO derive from the value type itself? Not worth the effort. +// throw new IllegalArgumentException("Item name nor definition is not known for " + value); +// } + RootXNode xroot = getMarshaller().marshalPrismValueAsRoot(value, nameToUse, itemDefinition, context); + checkPostconditions(xroot); // TODO find better way + return target.write(xroot, context); } @NotNull @Override public T serialize(@NotNull PrismValue value, QName itemName) throws SchemaException { - RootXNode xroot = getMarshaller().marshalPrismValueAsRoot(value, itemName, itemDefinition, context); - return target.write(xroot, context); + return root(itemName).serialize(value); } @NotNull @@ -120,12 +129,7 @@ public T serialize(@NotNull RootXNode xnode) throws SchemaException { } @Override - public T serializeRealValue(Object value) throws SchemaException { - return serializeRealValue(value, itemName); - } - - @Override - public T serializeRealValue(Object realValue, QName itemName) throws SchemaException { + public T serializeRealValue(Object realValue) throws SchemaException { PrismValue prismValue; if (realValue instanceof Objectable) { return serialize(((Objectable) realValue).asPrismObject(), itemName); // to preserve OID and name @@ -137,6 +141,11 @@ public T serializeRealValue(Object realValue, QName itemName) throws SchemaExcep return serialize(prismValue, itemName); } + @Override + public T serializeRealValue(Object realValue, QName itemName) throws SchemaException { + return root(itemName).serializeRealValue(realValue); + } + @Override public T serialize(JAXBElement value) throws SchemaException { return serializeRealValue(value.getValue(), value.getName()); // TODO declared type? @@ -144,19 +153,41 @@ public T serialize(JAXBElement value) throws SchemaException { @Override public T serializeAnyData(Object value) throws SchemaException { - return serializeAnyData(value, itemName); + RootXNode xnode = getMarshaller().marshalAnyData(value, itemName, itemDefinition, context); + checkPostconditions(xnode); // TODO find better way + return target.write(xnode, context); } @Override public T serializeAnyData(Object value, QName itemName) throws SchemaException { - RootXNode xnode = getMarshaller().marshalAnyData(value, itemName, itemDefinition, context); - return target.write(xnode, context); + return root(itemName).serializeAnyData(value); } @NotNull private PrismMarshaller getMarshaller() { return target.prismContext.getPrismMarshaller(); } + + private void checkPostconditions(RootXNode root) { + if (itemName != null && !(root.getRootElementName().equals(itemName))) { + throw new IllegalStateException("Postcondition fail: marshaled root name (" + root.getRootElementName() + + " is different from preset one (" + itemName + ")"); + } + if (PrismContextImpl.isExtraValidation()) { + checkTypeResolvable(root); + } + } + + private void checkTypeResolvable(RootXNode root) { + root.accept(n -> { + QName type; + if (n instanceof XNode && (type = ((XNode) n).getTypeQName()) != null) { + if (prismContext.getSchemaRegistry().determineClassForType(type) == null) { + throw new IllegalStateException("Postcondition fail: type " + type + " is not resolvable in:\n" + root.debugDump()); + } + } + }); + } //endregion } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/DefinitionsStore.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/DefinitionsStore.java index 635b94efcaf..5bd1667a45f 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/DefinitionsStore.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/DefinitionsStore.java @@ -23,13 +23,13 @@ */ public interface DefinitionsStore { -// DefinitionSearchContext> findItemDefinition(); +// DefinitionSearchContext> findItemDefinition(); // -// DefinitionSearchContext findPropertyDefinition(); +// DefinitionSearchContext> findPropertyDefinition(); // // DefinitionSearchContext findReferenceDefinition(); // -// DefinitionSearchContext> findContainerDefinition(); +// ContainerDefinitionSearchContext findContainerDefinition(); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/DomToSchemaProcessor.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/DomToSchemaProcessor.java index ba754e0650c..74f466fec91 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/DomToSchemaProcessor.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/DomToSchemaProcessor.java @@ -452,12 +452,12 @@ private void addPropertyDefinitionListFromGroup(XSModelGroup group, ComplexTypeD PrismContainerDefinition containerDefinition = createPropertyContainerDefinition( xsType, p, null, containerAnnotation, false); ((PrismContainerDefinitionImpl) containerDefinition).setInherited(particleInherited); - ((ComplexTypeDefinitionImpl) ctd).addDefinition(containerDefinition); + ((ComplexTypeDefinitionImpl) ctd).add(containerDefinition); } else { PrismPropertyDefinitionImpl propDef = createPropertyDefinition(xsType, elementName, DOMUtil.XSD_ANY, ctd, annotation, p); propDef.setInherited(particleInherited); - ((ComplexTypeDefinitionImpl) ctd).addDefinition(propDef); + ((ComplexTypeDefinitionImpl) ctd).add(propDef); } } @@ -494,7 +494,7 @@ private void addPropertyDefinitionListFromGroup(XSModelGroup group, ComplexTypeD ((PrismContainerDefinitionImpl) containerDefinition).setDynamic(true); } ((PrismContainerDefinitionImpl) containerDefinition).setInherited(particleInherited); - ((ComplexTypeDefinitionImpl) ctd).addDefinition(containerDefinition); + ((ComplexTypeDefinitionImpl) ctd).add(containerDefinition); } else { diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/GlobalDefinitionsStore.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/GlobalDefinitionsStore.java index 5f4cb7caf04..fc18cd2ecec 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/GlobalDefinitionsStore.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/GlobalDefinitionsStore.java @@ -41,7 +41,7 @@ public interface GlobalDefinitionsStore extends DefinitionsStore { // GlobalDefinitionSearchContext> findItemDefinition(); // // @Override -// GlobalDefinitionSearchContext findPropertyDefinition(); +// GlobalDefinitionSearchContext> findPropertyDefinition(); // // @Override // GlobalDefinitionSearchContext findReferenceDefinition(); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/PrismTestUtil.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/PrismTestUtil.java index 3e47fa102db..cf9d53308a7 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/PrismTestUtil.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/PrismTestUtil.java @@ -15,10 +15,7 @@ */ package com.evolveum.midpoint.prism.util; -import com.evolveum.midpoint.prism.Objectable; -import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.PrismObject; -import com.evolveum.midpoint.prism.PrismObjectDefinition; +import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.prism.query.LogicalFilter; import com.evolveum.midpoint.prism.query.NaryLogicalFilter; @@ -84,6 +81,7 @@ public static PrismContext createPrismContext() throws SchemaException, FileNotF if (prismContextFactory == null) { throw new IllegalStateException("Cannot create prism context, no prism factory is set"); } + PrismContextImpl.setExtraValidation(true); return prismContextFactory.createPrismContext(); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/ListXNode.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/ListXNode.java index c4ac7739469..d36e8b901e6 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/ListXNode.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/ListXNode.java @@ -147,7 +147,11 @@ public List subList(int fromIndex, int toIndex) { public void accept(Visitor visitor) { visitor.visit(this); for (XNode subnode: subnodes) { - subnode.accept(visitor); + if (subnode != null) { + subnode.accept(visitor); + } else { + // !!!!! TODO + } } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/MapXNode.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/MapXNode.java index 01dcbdfc3cc..9e36f82cf06 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/MapXNode.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/MapXNode.java @@ -271,8 +271,12 @@ public void merge(QName otherKey, XNode otherValue) { @Override public void accept(Visitor visitor) { visitor.visit(this); - for(Entry subentry: subnodes) { - subentry.value.accept(visitor); + for (Entry subentry: subnodes) { + if (subentry.value != null) { + subentry.value.accept(visitor); + } else { + //throw new IllegalStateException("null value of key " + subentry.key + " in map: " + debugDump()); + } } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/XNode.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/XNode.java index 5715938ca32..3f94104a776 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/XNode.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/XNode.java @@ -118,6 +118,9 @@ public QName getTypeQName() { } public void setTypeQName(QName typeQName) { + if (typeQName != null && typeQName.getLocalPart().equals("ConfigurationPropertiesType")) { + System.out.println("Hi!"); + } this.typeQName = typeQName; } diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/MidPointSchemaDefinitionFactory.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/MidPointSchemaDefinitionFactory.java index cbe3533eeae..904ca53122d 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/MidPointSchemaDefinitionFactory.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/MidPointSchemaDefinitionFactory.java @@ -165,12 +165,12 @@ private void finishObjectClassDefinition(ObjectClassComplexTypeDefinitionImpl oc // identifier attrDefinition = getAnnotationReference(annotation, MidPointConstants.RA_IDENTIFIER, ocDef); if (attrDefinition != null) { - ((Collection)ocDef.getPrimaryIdentifiers()).add(attrDefinition); + ((Collection)ocDef.getPrimaryIdentifiers()).add(attrDefinition); } // secondaryIdentifier attrDefinition = getAnnotationReference(annotation, MidPointConstants.RA_SECONDARY_IDENTIFIER, ocDef); if (attrDefinition != null) { - ((Collection)ocDef.getSecondaryIdentifiers()).add(attrDefinition); + ((Collection)ocDef.getSecondaryIdentifiers()).add(attrDefinition); } } diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ObjectClassComplexTypeDefinition.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ObjectClassComplexTypeDefinition.java index a80f81d3afa..b0b2accb1d3 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ObjectClassComplexTypeDefinition.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ObjectClassComplexTypeDefinition.java @@ -17,54 +17,207 @@ package com.evolveum.midpoint.schema.processor; import com.evolveum.midpoint.prism.ComplexTypeDefinition; -import com.evolveum.midpoint.prism.Definition; import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.schema.util.ObjectQueryUtil; +import com.evolveum.midpoint.util.QNameUtil; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowKindType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import javax.xml.namespace.QName; import java.util.Collection; +import java.util.stream.Collectors; +import java.util.stream.Stream; /** + * Describes a resource object class. + * Basically, it is a collection of resource attributes. No other items should be there. + * * @author mederly */ public interface ObjectClassComplexTypeDefinition extends ComplexTypeDefinition { - Collection getAttributeDefinitions(); - - Collection getPrimaryIdentifiers(); - boolean isPrimaryIdentifier(QName attrName); + /** + * Returns all attribute definitions as an unmodifiable collection. + * (Should be the same content as returned by getDefinitions().) + */ + @NotNull + Collection> getAttributeDefinitions(); + + /** + * Finds a attribute definition by looking at the property name. + *

+ * Returns null if nothing is found. + * + * @param name property definition name + * @return found property definition or null + */ + @Nullable + default ResourceAttributeDefinition findAttributeDefinition(QName name) { + return findItemDefinition(name, ResourceAttributeDefinition.class, false); + } - Collection getSecondaryIdentifiers(); + /** + * Finds a attribute definition by looking at the property name; not considering the case. + *

+ * Returns null if nothing is found. + * + * @param name property definition name + * @return found property definition or null + */ + @Nullable + default ResourceAttributeDefinition findAttributeDefinition(QName name, boolean caseInsensitive) { + return findItemDefinition(name, ResourceAttributeDefinition.class, caseInsensitive); + } - boolean isSecondaryIdentifier(QName attrName); + default ResourceAttributeDefinition findAttributeDefinition(String name) { + return findAttributeDefinition(new QName(getTypeName().getNamespaceURI(), name)); + } - Collection getAllIdentifiers(); + /** + * Returns the definition of primary identifier attributes of a resource object. + * + * May return empty set if there are no identifier attributes. Must not + * return null. + * + * The exception should be never thrown unless there is some bug in the + * code. The validation of model consistency should be done at the time of + * schema parsing. + * + * @return definition of identifier attributes + */ + @NotNull + Collection> getPrimaryIdentifiers(); + + /** + * Returns true if the attribute with a given name is among primary identifiers. + * Matching is done using namespace-approximate method (testing only local part if + * no namespace is provided), so beware of incidental matching (e.g. ri:uid vs icfs:uid). + */ + default boolean isPrimaryIdentifier(QName attrName) { + return getPrimaryIdentifiers().stream() + .anyMatch(idDef -> QNameUtil.match(idDef.getName(), attrName)); + } - ResourceAttributeDefinition getDescriptionAttribute(); + /** + * Returns the definition of secondary identifier attributes of a resource + * object. + * + * May return empty set if there are no secondary identifier attributes. + * Must not return null. + * + * The exception should be never thrown unless there is some bug in the + * code. The validation of model consistency should be done at the time of + * schema parsing. + * + * @return definition of secondary identifier attributes + */ + @NotNull + Collection> getSecondaryIdentifiers(); + + /** + * Returns true if the attribute with a given name is among secondary identifiers. + * Matching is done using namespace-approximate method (testing only local part if + * no namespace is provided), so beware of incidental matching (e.g. ri:uid vs icfs:uid). + */ + default boolean isSecondaryIdentifier(QName attrName) { + return getSecondaryIdentifiers().stream() + .anyMatch(idDef -> QNameUtil.match(idDef.getName(), attrName)); + } - ResourceAttributeDefinition getNamingAttribute(); + /** + * Returns the definition of description attribute of a resource object. + * + * Returns null if there is no description attribute. + * + * The exception should be never thrown unless there is some bug in the + * code. The validation of model consistency should be done at the time of + * schema parsing. + */ + ResourceAttributeDefinition getDescriptionAttribute(); + + /** + * TODO + */ + ResourceAttributeDefinition getNamingAttribute(); + + /** + * Returns the definition of display name attribute. + * + * Display name attribute specifies which resource attribute should be used + * as title when displaying objects of a specific resource object class. It + * must point to an attribute of String type. If not present, primary + * identifier should be used instead (but this method does not handle this + * default behavior). + * + * Returns null if there is no display name attribute. + * + * The exception should be never thrown unless there is some bug in the + * code. The validation of model consistency should be done at the time of + * schema parsing. + */ + ResourceAttributeDefinition getDisplayNameAttribute(); + + /** + * Returns both primary and secondary identifiers. + */ + default Collection> getAllIdentifiers() { + return Stream.concat(getPrimaryIdentifiers().stream(), getSecondaryIdentifiers().stream()) + .collect(Collectors.toList()); + } + /** + * Returns the native object class string for the resource object. + * + * Native object class is the name of the Resource Object Definition (Object + * Class) as it is seen by the resource itself. The name of the Resource + * Object Definition may be constrained by XSD or other syntax and therefore + * may be "mangled" to conform to such syntax. The native object + * class value will contain unmangled name (if available). + * + * Returns null if there is no native object class. + * + * The exception should be never thrown unless there is some bug in the + * code. The validation of model consistency should be done at the time of + * schema parsing. + * + * @return native object class + */ String getNativeObjectClass(); + /** + * TODO + * @return + */ boolean isAuxiliary(); + /** + * TODO + * @return + */ ShadowKindType getKind(); + /** + * Indicates whether definition is should be used as default definition in ist kind. + * E.g. if used in an "account" kind it indicates default account definition. + * + * If true value is returned then the definition should be used as a default + * definition for the kind. This is a way how a resource connector may + * suggest applicable object classes (resource object definitions) for + * individual shadow kinds (e.g. accounts). + * + * @return true if the definition should be used as account type. + */ boolean isDefaultInAKind(); + /** + * TODO + * @return + */ String getIntent(); - ResourceAttributeDefinition getDisplayNameAttribute(); - - ResourceAttributeDefinition findAttributeDefinition(QName name); - - ResourceAttributeDefinition findAttributeDefinition(QName name, boolean caseInsensitive); - - ResourceAttributeDefinition findAttributeDefinition(String name); - default ResourceAttributeContainerDefinition toResourceAttributeContainerDefinition() { return toResourceAttributeContainerDefinition(ShadowType.F_ATTRIBUTES); } @@ -79,5 +232,7 @@ default ObjectQuery createShadowSearchQuery(String resourceOid) throws SchemaExc ResourceAttributeContainer instantiate(QName elementName); + @NotNull ObjectClassComplexTypeDefinition clone(); + } diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ObjectClassComplexTypeDefinitionImpl.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ObjectClassComplexTypeDefinitionImpl.java index 7ee9fb31f66..3d8a45fdf83 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ObjectClassComplexTypeDefinitionImpl.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ObjectClassComplexTypeDefinitionImpl.java @@ -15,18 +15,17 @@ */ package com.evolveum.midpoint.schema.processor; -import java.util.ArrayList; -import java.util.Collection; +import com.evolveum.midpoint.prism.ComplexTypeDefinitionImpl; +import com.evolveum.midpoint.prism.ItemDefinition; +import com.evolveum.midpoint.prism.PrismContext; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowKindType; +import org.jetbrains.annotations.NotNull; import javax.xml.namespace.QName; - -import com.evolveum.midpoint.prism.*; -import com.evolveum.midpoint.prism.query.ObjectQuery; -import com.evolveum.midpoint.schema.util.ObjectQueryUtil; -import com.evolveum.midpoint.util.exception.SchemaException; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowKindType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.stream.Collectors; /** * @author semancik @@ -35,8 +34,8 @@ public class ObjectClassComplexTypeDefinitionImpl extends ComplexTypeDefinitionImpl implements ObjectClassComplexTypeDefinition { private static final long serialVersionUID = 1L; - private Collection identifiers; - private Collection secondaryIdentifiers; + @NotNull private final Collection> identifiers = new ArrayList<>(1); + @NotNull private final Collection> secondaryIdentifiers = new ArrayList<>(1); private ResourceAttributeDefinition descriptionAttribute; private ResourceAttributeDefinition displayNameAttribute; private ResourceAttributeDefinition namingAttribute; @@ -50,135 +49,49 @@ public ObjectClassComplexTypeDefinitionImpl(QName typeName, PrismContext prismCo super(typeName, prismContext); } + @NotNull @Override - public Collection getAttributeDefinitions() { - Collection attrs = new ArrayList(getDefinitions().size()); - for (ItemDefinition def: getDefinitions()) { - if (def instanceof ResourceAttributeDefinition) { - attrs.add((ResourceAttributeDefinition)def); - } - } - return attrs; + public Collection> getAttributeDefinitions() { + return Collections.unmodifiableList( + getDefinitions().stream() + .map(def -> (ResourceAttributeDefinition) def) + .collect(Collectors.toList())); } - - /** - * Returns the definition of primary identifier attributes of a resource object. - * - * May return empty set if there are no identifier attributes. Must not - * return null. - * - * The exception should be never thrown unless there is some bug in the - * code. The validation of model consistency should be done at the time of - * schema parsing. - * - * @return definition of identifier attributes - * @throws IllegalStateException - * if there is no definition for the referenced attributed - */ + @Override - public Collection getPrimaryIdentifiers() { - if (identifiers == null) { - identifiers = new ArrayList(1); + public void add(ItemDefinition definition) { + if (ResourceAttributeDefinition.class.isAssignableFrom(definition.getClass())) { + super.add(definition); + } else { + throw new IllegalArgumentException("Only ResourceAttributeDefinitions should be put into" + + " a ObjectClassComplexTypeDefinition. Item definition = " + definition + "," + + " ObjectClassComplexTypeDefinition = " + this); } - return identifiers; } - + + @NotNull @Override - public boolean isPrimaryIdentifier(QName attrName) { - for (ResourceAttributeDefinition idDef: getPrimaryIdentifiers()) { - if (idDef.getName().equals(attrName)) { - return true; - } - } - return false; + public Collection> getPrimaryIdentifiers() { + return identifiers; } - /** - * Returns the definition of secondary identifier attributes of a resource - * object. - * - * May return empty set if there are no secondary identifier attributes. - * Must not return null. - * - * The exception should be never thrown unless there is some bug in the - * code. The validation of model consistency should be done at the time of - * schema parsing. - * - * @return definition of secondary identifier attributes - * @throws IllegalStateException - * if there is no definition for the referenced attributed - */ + @NotNull @Override - public Collection getSecondaryIdentifiers() { - if (secondaryIdentifiers == null) { - secondaryIdentifiers = new ArrayList(1); - } + public Collection> getSecondaryIdentifiers() { return secondaryIdentifiers; } @Override - public boolean isSecondaryIdentifier(QName attrName) { - for (ResourceAttributeDefinition idDef: getSecondaryIdentifiers()) { - if (idDef.getName().equals(attrName)) { - return true; - } - } - return false; - } - - @Override - public Collection getAllIdentifiers() { - Collection allIdentifiers = new ArrayList<>(); - if (identifiers != null) { - allIdentifiers.addAll((Collection)getPrimaryIdentifiers()); - } - if (secondaryIdentifiers != null) { - allIdentifiers.addAll((Collection)getSecondaryIdentifiers()); - } - return allIdentifiers; - } - - /** - * Returns the definition of description attribute of a resource object. - * - * Returns null if there is no description attribute. - * - * The exception should be never thrown unless there is some bug in the - * code. The validation of model consistency should be done at the time of - * schema parsing. - * - * @return definition of secondary identifier attributes - * @throws IllegalStateException - * if there is more than one description attribute. But this - * should never happen. - * @throws IllegalStateException - * if there is no definition for the referenced attributed - */ - @Override - public ResourceAttributeDefinition getDescriptionAttribute() { + public ResourceAttributeDefinition getDescriptionAttribute() { return descriptionAttribute; } - public void setDescriptionAttribute(ResourceAttributeDefinition descriptionAttribute) { + void setDescriptionAttribute(ResourceAttributeDefinition descriptionAttribute) { this.descriptionAttribute = descriptionAttribute; } - /** - * Specifies which resource attribute should be used as a "technical" name - * for the account. This name will appear in log files and other troubleshooting - * tools. The name should be a form of unique identifier that can be used to - * locate the resource object for diagnostics. It should not contain white chars and - * special chars if that can be avoided and it should be reasonable short. - - * It is different from a display name attribute. Display name is intended for a - * common user or non-technical administrator (such as role administrator). The - * naming attribute is intended for technical IDM administrators and developers. - * - * @return resource attribute definition that should be used as a "technical" name - * for the account. - */ @Override - public ResourceAttributeDefinition getNamingAttribute() { + public ResourceAttributeDefinition getNamingAttribute() { return namingAttribute; } @@ -190,25 +103,6 @@ public void setNamingAttribute(QName namingAttribute) { setNamingAttribute(findAttributeDefinition(namingAttribute)); } - /** - * Returns the native object class string for the resource object. - * - * Native object class is the name of the Resource Object Definition (Object - * Class) as it is seen by the resource itself. The name of the Resource - * Object Definition may be constrained by XSD or other syntax and therefore - * may be "mangled" to conform to such syntax. The native object - * class value will contain unmangled name (if available). - * - * Returns null if there is no native object class. - * - * The exception should be never thrown unless there is some bug in the - * code. The validation of model consistency should be done at the time of - * schema parsing. - * - * @return native object class - * @throws IllegalStateException - * if there is more than one description attribute. - */ @Override public String getNativeObjectClass() { return nativeObjectClass; @@ -236,19 +130,6 @@ public void setKind(ShadowKindType kind) { this.kind = kind; } - /** - * Indicates whether definition is should be used as default definition in ist kind. - * E.g. if used in an "account" kind it indicates default account definition. - * - * If true value is returned then the definition should be used as a default - * definition for the kind. This is a way how a resource connector may - * suggest applicable object classes (resource object definitions) for - * individual shadow kinds (e.g. accounts). - * - * @return true if the definition should be used as account type. - * @throws IllegalStateException - * if more than one default account is suggested in the schema. - */ @Override public boolean isDefaultInAKind() { return defaultInAKind; @@ -267,26 +148,6 @@ public void setIntent(String intent) { this.intent = intent; } - /** - * Returns the definition of display name attribute. - * - * Display name attribute specifies which resource attribute should be used - * as title when displaying objects of a specific resource object class. It - * must point to an attribute of String type. If not present, primary - * identifier should be used instead (but this method does not handle this - * default behavior). - * - * Returns null if there is no display name attribute. - * - * The exception should be never thrown unless there is some bug in the - * code. The validation of model consistency should be done at the time of - * schema parsing. - * - * @return native object class - * @throws IllegalStateException - * if there is more than one display name attribute or the - * definition of the referenced attribute does not exist. - */ @Override public ResourceAttributeDefinition getDisplayNameAttribute() { return displayNameAttribute; @@ -300,40 +161,14 @@ public void setDisplayNameAttribute(ResourceAttributeDefinition displayName) * TODO * * Convenience method. It will internally look up the correct definition. - * - * @param displayName */ public void setDisplayNameAttribute(QName displayName) { setDisplayNameAttribute(findAttributeDefinition(displayName)); } - - /** - * Finds a attribute definition by looking at the property name. - *

- * Returns null if nothing is found. - * - * @param name property definition name - * @return found property definition or null - */ - @Override - public ResourceAttributeDefinition findAttributeDefinition(QName name) { - return findItemDefinition(name, ResourceAttributeDefinition.class); - } - - @Override - public ResourceAttributeDefinition findAttributeDefinition(QName name, boolean caseInsensitive) { - return findItemDefinition(name, ResourceAttributeDefinition.class, caseInsensitive); - } - - @Override - public ResourceAttributeDefinition findAttributeDefinition(String name) { - QName qname = new QName(getTypeName().getNamespaceURI(), name); - return findAttributeDefinition(qname); - } - + public ResourceAttributeDefinitionImpl createAttributeDefinition(QName name, QName typeName) { - ResourceAttributeDefinitionImpl propDef = new ResourceAttributeDefinitionImpl(name, typeName, prismContext); - addDefinition(propDef); + ResourceAttributeDefinitionImpl propDef = new ResourceAttributeDefinitionImpl<>(name, typeName, prismContext); + add(propDef); return propDef; } @@ -341,7 +176,6 @@ public ResourceAttributeDefinitionImpl createAttributeDefinition(String l QName name = new QName(getSchemaNamespace(),localName); return createAttributeDefinition(name,typeName); } - public ResourceAttributeDefinition createAttributeDefinition(String localName, String localTypeName) { QName name = new QName(getSchemaNamespace(),localName); @@ -359,6 +193,7 @@ public ResourceAttributeContainer instantiate(QName elementName) { return rac; } + @NotNull @Override public ObjectClassComplexTypeDefinitionImpl clone() { ObjectClassComplexTypeDefinitionImpl clone = new ObjectClassComplexTypeDefinitionImpl( @@ -374,10 +209,10 @@ protected void copyDefinitionData(ObjectClassComplexTypeDefinitionImpl clone) { clone.defaultInAKind = this.defaultInAKind; clone.descriptionAttribute = this.descriptionAttribute; clone.displayNameAttribute = this.displayNameAttribute; - clone.identifiers = this.identifiers; + clone.identifiers.addAll(this.identifiers); clone.namingAttribute = this.namingAttribute; clone.nativeObjectClass = this.nativeObjectClass; - clone.secondaryIdentifiers = this.secondaryIdentifiers; + clone.secondaryIdentifiers.addAll(this.secondaryIdentifiers); clone.auxiliary = this.auxiliary; } @@ -389,12 +224,12 @@ public int hashCode() { result = prime * result + (defaultInAKind ? 1231 : 1237); result = prime * result + ((descriptionAttribute == null) ? 0 : descriptionAttribute.hashCode()); result = prime * result + ((displayNameAttribute == null) ? 0 : displayNameAttribute.hashCode()); - result = prime * result + ((identifiers == null) ? 0 : identifiers.hashCode()); + result = prime * result + identifiers.hashCode(); result = prime * result + ((intent == null) ? 0 : intent.hashCode()); result = prime * result + ((kind == null) ? 0 : kind.hashCode()); result = prime * result + ((namingAttribute == null) ? 0 : namingAttribute.hashCode()); result = prime * result + ((nativeObjectClass == null) ? 0 : nativeObjectClass.hashCode()); - result = prime * result + ((secondaryIdentifiers == null) ? 0 : secondaryIdentifiers.hashCode()); + result = prime * result + secondaryIdentifiers.hashCode(); return result; } @@ -430,11 +265,7 @@ public boolean equals(Object obj) { } else if (!displayNameAttribute.equals(other.displayNameAttribute)) { return false; } - if (identifiers == null) { - if (other.identifiers != null) { - return false; - } - } else if (!identifiers.equals(other.identifiers)) { + if (!identifiers.equals(other.identifiers)) { return false; } if (intent == null) { @@ -461,11 +292,7 @@ public boolean equals(Object obj) { } else if (!nativeObjectClass.equals(other.nativeObjectClass)) { return false; } - if (secondaryIdentifiers == null) { - if (other.secondaryIdentifiers != null) { - return false; - } - } else if (!secondaryIdentifiers.equals(other.secondaryIdentifiers)) { + if (!secondaryIdentifiers.equals(other.secondaryIdentifiers)) { return false; } return true; @@ -494,15 +321,14 @@ protected void extendDumpHeader(StringBuilder sb) { } @Override - protected void extendDumpDefinition(StringBuilder sb, ItemDefinition def) { + protected void extendDumpDefinition(StringBuilder sb, ItemDefinition def) { super.extendDumpDefinition(sb, def); - if (getPrimaryIdentifiers() != null && getPrimaryIdentifiers().contains(def)) { + if (getPrimaryIdentifiers().contains(def)) { sb.append(",primID"); } - if (getSecondaryIdentifiers() != null && getSecondaryIdentifiers().contains(def)) { + if (getSecondaryIdentifiers().contains(def)) { sb.append(",secID"); } } - } diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ResourceAttributeContainerDefinition.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ResourceAttributeContainerDefinition.java index 5458072f907..02291366978 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ResourceAttributeContainerDefinition.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ResourceAttributeContainerDefinition.java @@ -22,6 +22,7 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowAttributesType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowKindType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; +import org.jetbrains.annotations.NotNull; import javax.xml.namespace.QName; import java.util.Collection; @@ -59,6 +60,7 @@ public interface ResourceAttributeContainerDefinition extends PrismContainerDefi ResourceAttributeContainer instantiate(QName name); + @NotNull ResourceAttributeContainerDefinition clone(); ResourceAttributeDefinition findAttributeDefinition(QName elementQName); diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ResourceAttributeContainerDefinitionImpl.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ResourceAttributeContainerDefinitionImpl.java index 03c60d34b66..8e03e729de6 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ResourceAttributeContainerDefinitionImpl.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ResourceAttributeContainerDefinitionImpl.java @@ -18,20 +18,17 @@ import java.util.ArrayList; import java.util.Collection; -import java.util.HashSet; import java.util.List; -import java.util.Set; import javax.xml.namespace.QName; import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.path.ItemPath; -import com.evolveum.midpoint.prism.schema.PrismSchema; import com.evolveum.midpoint.util.DebugDumpable; -import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowAttributesType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowKindType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; +import org.jetbrains.annotations.NotNull; /** * Resource Object Definition (Object Class). @@ -296,6 +293,7 @@ public ResourceAttributeContainer instantiate(QName name) { return new ResourceAttributeContainer(name, this, prismContext); } + @NotNull @Override public ResourceAttributeContainerDefinitionImpl clone() { ResourceAttributeContainerDefinitionImpl clone = new ResourceAttributeContainerDefinitionImpl(name, diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ResourceAttributeDefinition.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ResourceAttributeDefinition.java index c2ab96d759d..8ed97b6d154 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ResourceAttributeDefinition.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ResourceAttributeDefinition.java @@ -17,6 +17,7 @@ package com.evolveum.midpoint.schema.processor; import com.evolveum.midpoint.prism.PrismPropertyDefinition; +import org.jetbrains.annotations.NotNull; import javax.xml.namespace.QName; @@ -43,6 +44,7 @@ public interface ResourceAttributeDefinition extends PrismPropertyDefinition< String getFrameworkAttributeName(); + @NotNull @Override ResourceAttributeDefinition clone(); } diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ResourceAttributeDefinitionImpl.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ResourceAttributeDefinitionImpl.java index c6f3c33f0e4..90ed4ea0fe5 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ResourceAttributeDefinitionImpl.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ResourceAttributeDefinitionImpl.java @@ -16,13 +16,12 @@ package com.evolveum.midpoint.schema.processor; -import javax.xml.namespace.QName; - import com.evolveum.midpoint.prism.Definition; import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.PrismPropertyDefinition; import com.evolveum.midpoint.prism.PrismPropertyDefinitionImpl; -import com.evolveum.midpoint.prism.path.ItemPath; +import org.jetbrains.annotations.NotNull; + +import javax.xml.namespace.QName; /** * Resource Object Attribute Definition. @@ -96,7 +95,7 @@ public boolean isIdentifier(ResourceAttributeContainerDefinition objectDefinitio @Override public boolean isIdentifier(ObjectClassComplexTypeDefinition objectDefinition) { - for (ResourceAttributeDefinition identifier : objectDefinition.getPrimaryIdentifiers()) { + for (ResourceAttributeDefinition identifier : objectDefinition.getPrimaryIdentifiers()) { if (this == identifier) { return true; } @@ -106,7 +105,7 @@ public boolean isIdentifier(ObjectClassComplexTypeDefinition objectDefinition) { @Override public boolean isSecondaryIdentifier(ObjectClassComplexTypeDefinition objectDefinition) { - for (ResourceAttributeDefinition secondaryIdentifier : objectDefinition.getSecondaryIdentifiers()) { + for (ResourceAttributeDefinition secondaryIdentifier : objectDefinition.getSecondaryIdentifiers()) { if (this == secondaryIdentifier) { return true; } @@ -157,6 +156,7 @@ public void setFrameworkAttributeName(String frameworkAttributeName) { this.frameworkAttributeName = frameworkAttributeName; } + @NotNull @Override public ResourceAttributeDefinition clone() { ResourceAttributeDefinitionImpl clone = new ResourceAttributeDefinitionImpl(getName(), getTypeName(), getPrismContext()); diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/SpecificAttributesDefinition.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/SpecificAttributesDefinition.java new file mode 100644 index 00000000000..0b91d4c4a16 --- /dev/null +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/SpecificAttributesDefinition.java @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.schema.processor; + +import org.jetbrains.annotations.NotNull; + +import javax.xml.namespace.QName; +import java.util.Collection; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * @author mederly + */ +public interface SpecificAttributesDefinition> { + + +} diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/dataModel/DataModelVisualizerImpl.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/dataModel/DataModelVisualizerImpl.java index 932788ffa45..19e7ce5f344 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/dataModel/DataModelVisualizerImpl.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/dataModel/DataModelVisualizerImpl.java @@ -112,7 +112,7 @@ private void processResourceMappings(VisualizationContext ctx, List associationDefinitions = refinedDefinition.getAssociations(); + Collection associationDefinitions = refinedDefinition.getAssociationDefinitions(); for (RefinedAssociationDefinition associationDefinition : associationDefinitions) { if (associationDefinition.isIgnored()) { continue; @@ -207,7 +207,7 @@ private void createDataItems(VisualizationContext ctx, List associationDefinitions = refinedDefinition.getAssociations(); + Collection associationDefinitions = refinedDefinition.getAssociationDefinitions(); for (RefinedAssociationDefinition associationDefinition : associationDefinitions) { if (associationDefinition.isIgnored()) { continue; diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/dataModel/VisualizationContext.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/dataModel/VisualizationContext.java index c1ed46ad037..fcbfcbc0890 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/dataModel/VisualizationContext.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/dataModel/VisualizationContext.java @@ -165,7 +165,7 @@ public String exportDot() { ResourceDataItem item = findResourceItem(resource.getOid(), def.getKind(), def.getIntent(), new ItemPath(attrDef.getName())); previousNodeName = addResourceItem(itemsShown, indent, sb1, previousNodeName, item); } - for (RefinedAssociationDefinition assocDef : def.getAssociations()) { + for (RefinedAssociationDefinition assocDef : def.getAssociationDefinitions()) { if (assocDef.isIgnored()) { continue; } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/Construction.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/Construction.java index fa7672e6dbe..65d90803fb8 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/Construction.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/Construction.java @@ -624,7 +624,7 @@ private Mapping, PrismContainerDefini .originType(OriginType.ASSIGNMENTS) .originObject(source); - RefinedAssociationDefinition rAssocDef = refinedObjectClassDefinition.findAssociation(assocName); + RefinedAssociationDefinition rAssocDef = refinedObjectClassDefinition.findAssociationDefinition(assocName); if (rAssocDef == null) { throw new SchemaException("No association " + assocName + " in object class " + refinedObjectClassDefinition.getHumanReadableName() + " in construction in " + source); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/ConsolidationProcessor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/ConsolidationProcessor.java index ce186f906b0..715755306ff 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/ConsolidationProcessor.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/ConsolidationProcessor.java @@ -31,7 +31,6 @@ import com.evolveum.midpoint.model.impl.lens.LensProjectionContext; import com.evolveum.midpoint.model.impl.lens.LensUtil; import com.evolveum.midpoint.prism.ItemDefinition; -import com.evolveum.midpoint.prism.PrismContainer; import com.evolveum.midpoint.prism.PrismContainerDefinition; import com.evolveum.midpoint.prism.PrismContainerValue; import com.evolveum.midpoint.prism.PrismContext; @@ -406,7 +405,7 @@ private ContainerDelta consolidate ItemPath itemPath = new ItemPath(ShadowType.F_ASSOCIATION); PrismContainerDefinition asspcContainerDef = getAssociationDefinition(); - RefinedAssociationDefinition associationDef = rOcDef.findAssociation(associationName); + RefinedAssociationDefinition associationDef = rOcDef.findAssociationDefinition(associationName); Comparator> comparator = new Comparator>() { diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/InboundProcessor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/InboundProcessor.java index bb5d5d65ffb..66b4138a534 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/InboundProcessor.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/InboundProcessor.java @@ -204,7 +204,7 @@ private void processInboundExpressionsForProjection(LensCo attributeAPrioriDelta = null; } - RefinedAttributeDefinition attrDef = accountDefinition.getAttributeDefinition(accountAttributeName); + RefinedAttributeDefinition attrDef = accountDefinition.findAttributeDefinition(accountAttributeName); if (attrDef.isIgnored(LayerType.MODEL)) { LOGGER.trace("Skipping inbound for attribute {} in {} because the attribute is ignored", @@ -345,7 +345,7 @@ private PrismObject loadProjection(LensContext private boolean hasAnyStrongMapping(RefinedObjectClassDefinition objectDefinition) { for (QName attributeName : objectDefinition.getNamesOfAttributesWithInboundExpressions()) { - RefinedAttributeDefinition attributeDefinition = objectDefinition.getAttributeDefinition(attributeName); + RefinedAttributeDefinition attributeDefinition = objectDefinition.findAttributeDefinition(attributeName); for (MappingType inboundMapping : attributeDefinition.getInboundMappingTypes()){ if (inboundMapping.getStrength() == MappingStrengthType.STRONG) { return true; diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/OutboundProcessor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/OutboundProcessor.java index f8fee9a3d3b..d7f8e94a06e 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/OutboundProcessor.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/OutboundProcessor.java @@ -123,7 +123,7 @@ public void processOutbound(LensContext context, LensPr String operation = projCtx.getOperation().getValue(); for (QName attributeName : rOcDef.getNamesOfAttributesWithOutboundExpressions()) { - RefinedAttributeDefinition refinedAttributeDefinition = rOcDef.getAttributeDefinition(attributeName); + RefinedAttributeDefinition refinedAttributeDefinition = rOcDef.findAttributeDefinition(attributeName); final MappingType outboundMappingType = refinedAttributeDefinition.getOutboundMappingType(); if (outboundMappingType == null) { @@ -149,7 +149,7 @@ public void processOutbound(LensContext context, LensPr } for (QName assocName : rOcDef.getNamesOfAssociationsWithOutboundExpressions()) { - RefinedAssociationDefinition associationDefinition = rOcDef.findAssociation(assocName); + RefinedAssociationDefinition associationDefinition = rOcDef.findAssociationDefinition(assocName); final MappingType outboundMappingType = associationDefinition.getOutboundMappingType(); if (outboundMappingType == null) { diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/ReconciliationProcessor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/ReconciliationProcessor.java index 21106a020fe..c70ad558d59 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/ReconciliationProcessor.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/ReconciliationProcessor.java @@ -31,7 +31,6 @@ import com.evolveum.midpoint.prism.delta.ContainerDelta; import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.util.DOMUtil; -import com.evolveum.midpoint.util.DebugUtil; import com.evolveum.midpoint.util.PrettyPrinter; import com.evolveum.midpoint.util.QNameUtil; import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowAssociationType; @@ -39,13 +38,11 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import com.evolveum.midpoint.common.refinery.CompositeRefinedObjectClassDefinition; import com.evolveum.midpoint.common.refinery.PropertyLimitations; import com.evolveum.midpoint.common.refinery.RefinedAttributeDefinition; import com.evolveum.midpoint.common.refinery.RefinedObjectClassDefinition; import com.evolveum.midpoint.common.refinery.RefinedResourceSchema; import com.evolveum.midpoint.model.api.context.SynchronizationPolicyDecision; -import com.evolveum.midpoint.model.common.mapping.Mapping; import com.evolveum.midpoint.model.common.mapping.PrismValueDeltaSetTripleProducer; import com.evolveum.midpoint.model.impl.lens.ItemValueWithOrigin; import com.evolveum.midpoint.model.impl.lens.LensContext; @@ -59,7 +56,6 @@ import com.evolveum.midpoint.prism.PrismProperty; import com.evolveum.midpoint.prism.PrismPropertyDefinition; import com.evolveum.midpoint.prism.PrismPropertyValue; -import com.evolveum.midpoint.prism.PrismReferenceValue; import com.evolveum.midpoint.prism.PrismValue; import com.evolveum.midpoint.prism.delta.DeltaSetTriple; import com.evolveum.midpoint.prism.delta.ItemDelta; @@ -522,7 +518,7 @@ private void reconcileProjectionAssociations( for (QName assocName : associationNames) { LOGGER.trace("Association reconciliation processing association {}", assocName); - RefinedAssociationDefinition associationDefinition = accountDefinition.findAssociation(assocName); + RefinedAssociationDefinition associationDefinition = accountDefinition.findAssociationDefinition(assocName); if (associationDefinition == null) { throw new SchemaException("No definition for association " + assocName + " in " + projCtx.getResourceShadowDiscriminator()); diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/EntitlementConverter.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/EntitlementConverter.java index 447d4c040b0..88629271ae0 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/EntitlementConverter.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/EntitlementConverter.java @@ -39,8 +39,6 @@ import com.evolveum.midpoint.prism.match.MatchingRule; import com.evolveum.midpoint.prism.match.MatchingRuleRegistry; import com.evolveum.midpoint.prism.path.ItemPath; -import com.evolveum.midpoint.prism.query.EqualFilter; -import com.evolveum.midpoint.prism.query.ObjectFilter; import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.prism.util.PrismUtil; import com.evolveum.midpoint.provisioning.api.GenericConnectorException; @@ -104,7 +102,7 @@ public void postProcessEntitlementsRead(ProvisioningContext subjectCtx, ResourceType resourceType = subjectCtx.getResource(); LOGGER.trace("Starting postProcessEntitlementRead"); RefinedObjectClassDefinition objectClassDefinition = subjectCtx.getObjectClassDefinition(); - Collection entitlementAssociationDefs = objectClassDefinition.getEntitlementAssociations(); + Collection entitlementAssociationDefs = objectClassDefinition.getEntitlementAssociationDefinitions(); if (entitlementAssociationDefs != null) { ResourceAttributeContainer attributesContainer = ShadowUtil.getAttributesContainer(resourceObject); RefinedResourceSchema refinedSchema = RefinedResourceSchemaImpl.getRefinedSchema(resourceType); @@ -395,14 +393,14 @@ public void collectEntitlementsAsObjectOperationDelete(ProvisioningContext s PrismObject subjectShadow, OperationResult parentResult) throws SchemaException, CommunicationException, ObjectNotFoundException, ConfigurationException, SecurityViolationException { - Collection entitlementAssociationDefs = subjectCtx.getObjectClassDefinition().getEntitlementAssociations(); + Collection entitlementAssociationDefs = subjectCtx.getObjectClassDefinition().getEntitlementAssociationDefinitions(); if (entitlementAssociationDefs == null || entitlementAssociationDefs.isEmpty()) { // Nothing to do LOGGER.trace("No associations in deleted shadow"); return; } ResourceAttributeContainer subjectAttributesContainer = ShadowUtil.getAttributesContainer(subjectShadow); - for (final RefinedAssociationDefinition assocDefType: subjectCtx.getObjectClassDefinition().getEntitlementAssociations()) { + for (final RefinedAssociationDefinition assocDefType: subjectCtx.getObjectClassDefinition().getEntitlementAssociationDefinitions()) { if (assocDefType.getResourceObjectAssociationType().getDirection() != ResourceObjectAssociationDirectionType.OBJECT_TO_SUBJECT) { // We can ignore these. They will die together with the object. No need to explicitly delete them. LOGGER.trace("Ignoring subject-to-object association in deleted shadow"); @@ -547,7 +545,7 @@ private void collectEntitlementToAttrDelta(ProvisioningContext ctx, Map PrismObject collectEntitlementAsObjectOperation(Prov if (associationName == null) { throw new SchemaException("No name in entitlement association "+associationCVal); } - RefinedAssociationDefinition assocDefType = subjectCtx.getObjectClassDefinition().findEntitlementAssociation(associationName); + RefinedAssociationDefinition assocDefType = subjectCtx.getObjectClassDefinition().findEntitlementAssociationDefinition(associationName); if (assocDefType == null) { throw new SchemaException("No entitlement association with name "+assocDefType+" in schema of "+resource); } diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ProvisioningContext.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ProvisioningContext.java index c054ec4783c..019b7fc4244 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ProvisioningContext.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ProvisioningContext.java @@ -15,10 +15,7 @@ */ package com.evolveum.midpoint.provisioning.impl; -import com.evolveum.midpoint.common.refinery.CompositeRefinedObjectClassDefinition; -import com.evolveum.midpoint.common.refinery.RefinedObjectClassDefinition; -import com.evolveum.midpoint.common.refinery.RefinedObjectClassDefinitionImpl; -import com.evolveum.midpoint.common.refinery.RefinedResourceSchema; +import com.evolveum.midpoint.common.refinery.*; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.provisioning.ucf.api.ConnectorInstance; import com.evolveum.midpoint.provisioning.util.ProvisioningUtil; @@ -170,7 +167,7 @@ public CompositeRefinedObjectClassDefinition computeCompositeObjectClassDefiniti } auxiliaryObjectClassDefinitions.add(auxObjectClassDef); } - return new CompositeRefinedObjectClassDefinition(structuralObjectClassDefinition, auxiliaryObjectClassDefinitions); + return new CompositeRefinedObjectClassDefinitionImpl(structuralObjectClassDefinition, auxiliaryObjectClassDefinitions); } public RefinedObjectClassDefinition computeCompositeObjectClassDefinition(PrismObject shadow) diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ResourceObjectConverter.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ResourceObjectConverter.java index d61b3f708df..5a8c466f714 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ResourceObjectConverter.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ResourceObjectConverter.java @@ -948,7 +948,7 @@ private PrismObject executeEntitlementChangesModify(ProvisioningCont if (associationName == null) { throw new IllegalStateException("No association name in " + associationValue); } - RefinedAssociationDefinition associationDefinition = ctx.getObjectClassDefinition().findAssociation(associationName); + RefinedAssociationDefinition associationDefinition = ctx.getObjectClassDefinition().findAssociationDefinition(associationName); if (associationDefinition == null) { throw new IllegalStateException("No association definition for " + associationValue); } diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowCache.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowCache.java index 875307f3d34..326d8b60aaf 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowCache.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowCache.java @@ -1807,7 +1807,7 @@ private PrismObject completeShadow(ProvisioningContext ctx, ShadowAssociationType shadowAssociationType = associationCVal.asContainerable(); QName associationName = shadowAssociationType.getName(); RefinedAssociationDefinition rEntitlementAssociation = ctx.getObjectClassDefinition() - .findEntitlementAssociation(associationName); + .findEntitlementAssociationDefinition(associationName); if (rEntitlementAssociation == null) { if (LOGGER.isTraceEnabled()) { LOGGER.trace("Entitlement association with name {} couldn't be found in {} {}\nresource shadow:\n{}\nrepo shadow:\n{}", diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowManager.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowManager.java index 37a52b2077c..15f5f67f255 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowManager.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowManager.java @@ -19,7 +19,6 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; -import java.util.Iterator; import java.util.List; import javax.xml.namespace.QName; @@ -28,10 +27,7 @@ import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import com.evolveum.midpoint.prism.query.builder.S_AtomicFilterEntry; import com.evolveum.midpoint.prism.query.builder.S_FilterEntry; -import com.evolveum.midpoint.prism.query.builder.S_FilterEntryOrEmpty; import com.evolveum.midpoint.provisioning.util.ProvisioningUtil; -import com.evolveum.midpoint.schema.SchemaConstantsGenerated; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ActivationType; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; @@ -42,7 +38,6 @@ import com.evolveum.midpoint.prism.Containerable; import com.evolveum.midpoint.prism.Item; import com.evolveum.midpoint.prism.PrismContainer; -import com.evolveum.midpoint.prism.PrismContainerValue; import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.PrismProperty; @@ -57,12 +52,9 @@ import com.evolveum.midpoint.prism.match.MatchingRuleRegistry; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.polystring.PolyString; -import com.evolveum.midpoint.prism.query.AndFilter; import com.evolveum.midpoint.prism.query.EqualFilter; import com.evolveum.midpoint.prism.query.ObjectFilter; import com.evolveum.midpoint.prism.query.ObjectQuery; -import com.evolveum.midpoint.prism.query.OrFilter; -import com.evolveum.midpoint.prism.query.RefFilter; import com.evolveum.midpoint.prism.query.Visitor; import com.evolveum.midpoint.provisioning.api.ResourceOperationDescription; import com.evolveum.midpoint.provisioning.ucf.api.Change; @@ -758,7 +750,7 @@ public PrismObject createRepositoryShadow(ProvisioningContext ctx, P // Also add all the attributes that act as association identifiers. // We will need them when the shadow is deleted (to remove the shadow from entitlements). RefinedObjectClassDefinition objectClassDefinition = ctx.getObjectClassDefinition(); - for (RefinedAssociationDefinition associationDef: objectClassDefinition.getAssociations()) { + for (RefinedAssociationDefinition associationDef: objectClassDefinition.getAssociationDefinitions()) { if (associationDef.getResourceObjectAssociationType().getDirection() == ResourceObjectAssociationDirectionType.OBJECT_TO_SUBJECT) { QName valueAttributeName = associationDef.getResourceObjectAssociationType().getValueAttribute(); if (repoAttributesContainer.findAttribute(valueAttributeName) == null) { diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/util/ProvisioningUtil.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/util/ProvisioningUtil.java index 4ab8c224b58..8007ca30e34 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/util/ProvisioningUtil.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/util/ProvisioningUtil.java @@ -23,23 +23,16 @@ import com.evolveum.midpoint.prism.delta.PropertyDelta; import com.evolveum.midpoint.prism.match.MatchingRule; import com.evolveum.midpoint.prism.match.MatchingRuleRegistry; -import com.evolveum.midpoint.prism.polystring.PolyString; -import com.evolveum.midpoint.prism.query.AndFilter; -import com.evolveum.midpoint.prism.query.ObjectFilter; import com.evolveum.midpoint.provisioning.impl.ProvisioningContext; import com.evolveum.midpoint.provisioning.ucf.api.AttributesToReturn; import com.evolveum.midpoint.provisioning.ucf.api.ExecuteProvisioningScriptOperation; import com.evolveum.midpoint.provisioning.ucf.api.ExecuteScriptArgument; -import com.evolveum.midpoint.provisioning.ucf.impl.ConnectorFactoryIcfImpl; import com.evolveum.midpoint.schema.CapabilityUtil; -import com.evolveum.midpoint.schema.ResourceShadowDiscriminator; import com.evolveum.midpoint.schema.constants.SchemaConstants; -import com.evolveum.midpoint.schema.processor.ObjectClassComplexTypeDefinition; import com.evolveum.midpoint.schema.processor.ResourceAttribute; import com.evolveum.midpoint.schema.processor.ResourceAttributeContainer; import com.evolveum.midpoint.schema.processor.ResourceAttributeDefinition; import com.evolveum.midpoint.schema.result.OperationResult; -import com.evolveum.midpoint.schema.util.ObjectQueryUtil; import com.evolveum.midpoint.schema.util.ObjectTypeUtil; import com.evolveum.midpoint.schema.util.ShadowUtil; import com.evolveum.midpoint.schema.util.ResourceTypeUtil; @@ -60,7 +53,6 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.ProvisioningScriptType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceObjectAssociationDirectionType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowKindType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; import com.evolveum.midpoint.xml.ns._public.resource.capabilities_3.ActivationCapabilityType; import com.evolveum.midpoint.xml.ns._public.resource.capabilities_3.CredentialsCapabilityType; @@ -69,7 +61,6 @@ import java.util.ArrayList; import java.util.Collection; -import java.util.List; public class ProvisioningUtil { @@ -311,7 +302,7 @@ public static boolean shouldStoreAtributeInShadow(RefinedObjectClassDefinition o if (objectClassDefinition.isPrimaryIdentifier(attributeName) || objectClassDefinition.isSecondaryIdentifier(attributeName)) { return true; } - for (RefinedAssociationDefinition associationDef: objectClassDefinition.getAssociations()) { + for (RefinedAssociationDefinition associationDef: objectClassDefinition.getAssociationDefinitions()) { if (associationDef.getResourceObjectAssociationType().getDirection() == ResourceObjectAssociationDirectionType.OBJECT_TO_SUBJECT) { QName valueAttributeName = associationDef.getResourceObjectAssociationType().getValueAttribute(); if (QNameUtil.match(attributeName, valueAttributeName)) { From e6f9b98c82fcfffa213ffba388add474deb12c2f Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Tue, 25 Oct 2016 11:13:07 +0200 Subject: [PATCH 52/74] Continuing cleanup. --- ...ositeRefinedObjectClassDefinitionImpl.java | 28 ++++---- .../LayerRefinedObjectClassDefinition.java | 4 ++ ...LayerRefinedObjectClassDefinitionImpl.java | 71 +++++++++---------- .../ObjectClassComplexTypeDefinitionImpl.java | 12 +++- .../midpoint/schema/TestDeltaConverter.java | 2 +- .../schema/processor/SchemaProcessorTest.java | 13 ++-- .../schema/processor/TestResourceSchema.java | 9 +-- .../impl/lens/LensProjectionContext.java | 2 +- .../projector/ConsolidationProcessor.java | 8 +-- .../ucf/impl/ConnectorInstanceIcfImpl.java | 5 +- 10 files changed, 82 insertions(+), 72 deletions(-) diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/CompositeRefinedObjectClassDefinitionImpl.java b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/CompositeRefinedObjectClassDefinitionImpl.java index 1df65f31de1..ce3679f153b 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/CompositeRefinedObjectClassDefinitionImpl.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/CompositeRefinedObjectClassDefinitionImpl.java @@ -33,10 +33,7 @@ import org.jetbrains.annotations.NotNull; import javax.xml.namespace.QName; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -136,18 +133,18 @@ public Integer getDisplayOrder() { } @Override - public RefinedAttributeDefinition getDescriptionAttribute() { + public RefinedAttributeDefinition getDescriptionAttribute() { return structuralObjectClassDefinition.getDescriptionAttribute(); } @Override - public String getHelp() { - return structuralObjectClassDefinition.getHelp(); + public RefinedAttributeDefinition getNamingAttribute() { + return structuralObjectClassDefinition.getNamingAttribute(); } @Override - public RefinedAttributeDefinition getNamingAttribute() { - return structuralObjectClassDefinition.getNamingAttribute(); + public String getHelp() { + return structuralObjectClassDefinition.getHelp(); } @NotNull @@ -192,7 +189,7 @@ public boolean isRuntimeSchema() { } @Override - public RefinedAttributeDefinition getDisplayNameAttribute() { + public RefinedAttributeDefinition getDisplayNameAttribute() { return structuralObjectClassDefinition.getDisplayNameAttribute(); } @@ -463,12 +460,19 @@ public RefinedAssociationDefinition findEntitlementAssociationDefinition(QName n @Override public Collection getNamesOfAssociationsWithOutboundExpressions() { - throw new UnsupportedOperationException("TODO implement if needed"); + return getAssociationDefinitions().stream() + .filter(assocDef -> assocDef.getOutboundMappingType() != null) + .map(a -> a.getName()) + .collect(Collectors.toCollection(HashSet::new)); } @Override public boolean hasAuxiliaryObjectClass(QName expectedObjectClassName) { - throw new UnsupportedOperationException("TODO implement if needed"); + if (structuralObjectClassDefinition.hasAuxiliaryObjectClass(expectedObjectClassName)) { + return true; + } + return auxiliaryObjectClassDefinitions.stream().anyMatch( + def -> QNameUtil.match(expectedObjectClassName, def.getTypeName())); } @Override diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedObjectClassDefinition.java b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedObjectClassDefinition.java index 376e1999794..a59d12dd4ec 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedObjectClassDefinition.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedObjectClassDefinition.java @@ -33,6 +33,10 @@ public interface LayerRefinedObjectClassDefinition extends RefinedObjectClassDef LayerType getLayer(); + @NotNull + @Override + Collection> getAttributeDefinitions(); + @NotNull @Override LayerRefinedObjectClassDefinition clone(); diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedObjectClassDefinitionImpl.java b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedObjectClassDefinitionImpl.java index 0b71ba79451..7e8c971a45b 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedObjectClassDefinitionImpl.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedObjectClassDefinitionImpl.java @@ -19,6 +19,7 @@ import java.util.Collection; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; import javax.xml.namespace.QName; @@ -58,19 +59,17 @@ private LayerRefinedObjectClassDefinitionImpl(RefinedObjectClassDefinition refin this.layer = layer; } - static LayerRefinedObjectClassDefinition wrap(RefinedObjectClassDefinition rAccountDef, LayerType layer) { - if (rAccountDef == null) { + static LayerRefinedObjectClassDefinition wrap(RefinedObjectClassDefinition rOCD, LayerType layer) { + if (rOCD == null) { return null; } - return new LayerRefinedObjectClassDefinitionImpl(rAccountDef, layer); + return new LayerRefinedObjectClassDefinitionImpl(rOCD, layer); } - static List wrapCollection(Collection rAccountDefs, LayerType layer) { - List outs = new ArrayList(rAccountDefs.size()); - for (RefinedObjectClassDefinition rAccountDef: rAccountDefs) { - outs.add(wrap(rAccountDef, layer)); - } - return outs; + static List wrapCollection(Collection rOCDs, LayerType layer) { + return(rOCDs.stream() + .map(rAccountDef -> wrap(rAccountDef, layer)) + .collect(Collectors.toCollection(() -> new ArrayList<>(rOCDs.size())))); } @Override @@ -94,7 +93,7 @@ public boolean isEmphasized() { } @Override - public LayerRefinedAttributeDefinition getDescriptionAttribute() { + public LayerRefinedAttributeDefinition getDescriptionAttribute() { // TODO optimize return substituteLayerRefinedAttributeDefinition(refinedObjectClassDefinition.getDescriptionAttribute()); } @@ -105,21 +104,18 @@ public List getIgnoredNamespaces() { return refinedObjectClassDefinition.getIgnoredNamespaces(); } - private LayerRefinedAttributeDefinition substituteLayerRefinedAttributeDefinition(ResourceAttributeDefinition attributeDef) { - LayerRefinedAttributeDefinition rAttrDef = findAttributeDefinition(attributeDef.getName()); - return rAttrDef; + private LayerRefinedAttributeDefinition substituteLayerRefinedAttributeDefinition(ResourceAttributeDefinition attributeDef) { + return findAttributeDefinition(attributeDef.getName()); } private Collection> substituteLayerRefinedAttributeDefinitionCollection(Collection> attributes) { - Collection> retval = new ArrayList<>(); - for (RefinedAttributeDefinition rad : attributes) { - retval.add(substituteLayerRefinedAttributeDefinition(rad)); - } - return retval; + return attributes.stream() + .map(this::substituteLayerRefinedAttributeDefinition) + .collect(Collectors.toList()); } @Override - public LayerRefinedAttributeDefinition getNamingAttribute() { + public LayerRefinedAttributeDefinition getNamingAttribute() { return substituteLayerRefinedAttributeDefinition(refinedObjectClassDefinition.getNamingAttribute()); } @@ -128,12 +124,6 @@ public String getNativeObjectClass() { return refinedObjectClassDefinition.getNativeObjectClass(); } - @Override - public ID findNamedItemDefinition(@NotNull QName firstName, @NotNull ItemPath rest, - @NotNull Class clazz) { - return refinedObjectClassDefinition.findNamedItemDefinition(firstName, rest, clazz); - } - @Override public boolean isAuxiliary() { return refinedObjectClassDefinition.isAuxiliary(); @@ -144,12 +134,20 @@ public Integer getDisplayOrder() { return refinedObjectClassDefinition.getDisplayOrder(); } + // TODO - doesn't return layered definition (should it?) @Override public ID findItemDefinition(@NotNull ItemPath path, @NotNull Class clazz) { return refinedObjectClassDefinition.findItemDefinition(path, clazz); } + // TODO - doesn't return layered definition (should it?) + @Override + public ID findNamedItemDefinition(@NotNull QName firstName, @NotNull ItemPath rest, + @NotNull Class clazz) { + return refinedObjectClassDefinition.findNamedItemDefinition(firstName, rest, clazz); + } + @Override public boolean isDefaultInAKind() { return refinedObjectClassDefinition.isDefaultInAKind(); @@ -176,7 +174,7 @@ public LayerRefinedObjectClassDefinition forLayer(LayerType layerType) { } @Override - public LayerRefinedAttributeDefinition getDisplayNameAttribute() { + public LayerRefinedAttributeDefinition getDisplayNameAttribute() { return substituteLayerRefinedAttributeDefinition(refinedObjectClassDefinition.getDisplayNameAttribute()); } @@ -227,19 +225,18 @@ public ResourceAttributeContainer instantiate(QName name) { return refinedObjectClassDefinition.instantiate(name); } - @Override - public PrismPropertyDefinition findPropertyDefinition(@NotNull QName name) { - LayerRefinedAttributeDefinition def = findAttributeDefinition(name); - if (def != null) { - return def; - } else { - // actually, can there be properties other than attributes? [mederly] - return LayerRefinedAttributeDefinitionImpl.wrap((RefinedAttributeDefinition) refinedObjectClassDefinition.findPropertyDefinition(name), layer); - } - } +// @Override +// public PrismPropertyDefinition findPropertyDefinition(@NotNull QName name) { +// LayerRefinedAttributeDefinition def = findAttributeDefinition(name); +// if (def != null) { +// return def; +// } else { +// return LayerRefinedAttributeDefinitionImpl.wrap((RefinedAttributeDefinition) refinedObjectClassDefinition.findPropertyDefinition(name), layer); +// } +// } @Override - public LayerRefinedAttributeDefinition findAttributeDefinition(@NotNull QName elementQName) { + public LayerRefinedAttributeDefinition findAttributeDefinition(@NotNull QName elementQName) { for (LayerRefinedAttributeDefinition definition : getAttributeDefinitions()) { if (QNameUtil.match(definition.getName(), elementQName)) { return definition; diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ObjectClassComplexTypeDefinitionImpl.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ObjectClassComplexTypeDefinitionImpl.java index 3d8a45fdf83..06db07fde66 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ObjectClassComplexTypeDefinitionImpl.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ObjectClassComplexTypeDefinitionImpl.java @@ -74,13 +74,21 @@ public void add(ItemDefinition definition) { public Collection> getPrimaryIdentifiers() { return identifiers; } - + + public void addPrimaryIdentifier(ResourceAttributeDefinition identifier) { + identifiers.add(identifier); + } + @NotNull @Override public Collection> getSecondaryIdentifiers() { return secondaryIdentifiers; } - + + public void addSecondaryIdentifier(ResourceAttributeDefinition identifier) { + secondaryIdentifiers.add(identifier); + } + @Override public ResourceAttributeDefinition getDescriptionAttribute() { return descriptionAttribute; diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestDeltaConverter.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestDeltaConverter.java index f8c9b263825..092781da045 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestDeltaConverter.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestDeltaConverter.java @@ -73,7 +73,7 @@ public class TestDeltaConverter extends AbstractSchemaTest { private static final ItemPath CREDENTIALS_PASSWORD_VALUE_PATH = new ItemPath(UserType.F_CREDENTIALS, CredentialsType.F_PASSWORD, PasswordType.F_VALUE); - @Test(enabled = false) + @Test(enabled = false) // https://jira.evolveum.com/browse/MID-3487 public void testRefWithObject() throws SchemaException, IOException, JAXBException { System.out.println("===[ testRefWithObject ]===="); diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/processor/SchemaProcessorTest.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/processor/SchemaProcessorTest.java index e16b14b0fe2..0d32b6e25aa 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/processor/SchemaProcessorTest.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/processor/SchemaProcessorTest.java @@ -174,14 +174,15 @@ public void testRoundTripResource() throws SchemaException { containerDefinition.setNativeObjectClass("ACCOUNT"); // ... in it ordinary attribute - an identifier ResourceAttributeDefinitionImpl xloginDef = containerDefinition.createAttributeDefinition("login", DOMUtil.XSD_STRING); - ((Collection)containerDefinition.getPrimaryIdentifiers()).add(xloginDef); + containerDefinition.addPrimaryIdentifier(xloginDef); xloginDef.setNativeAttributeName("LOGIN"); containerDefinition.setDisplayNameAttribute(xloginDef.getName()); // ... and local property with a type from another schema ResourceAttributeDefinitionImpl xpasswdDef = containerDefinition.createAttributeDefinition("password", ProtectedStringType.COMPLEX_TYPE); xpasswdDef.setNativeAttributeName("PASSWORD"); // ... property reference - containerDefinition.createAttributeDefinition(SchemaConstants.C_CREDENTIALS, SchemaConstants.C_CREDENTIALS_TYPE); + // TODO this is not a ResourceAttributeDefinition, it cannot be placed here! + //containerDefinition.createAttributeDefinition(SchemaConstants.C_CREDENTIALS, SchemaConstants.C_CREDENTIALS_TYPE); // ... ignored attribute ResourceAttributeDefinitionImpl xSepDef = containerDefinition.createAttributeDefinition("sep", DOMUtil.XSD_STRING); xSepDef.setIgnored(true); @@ -225,10 +226,10 @@ public void testRoundTripResource() throws SchemaException { assertEquals(ProtectedStringType.COMPLEX_TYPE, passwdDef.getTypeName()); assertFalse(passwdDef.isIgnored()); - PrismContainerDefinition credDef = newObjectClassDef.findContainerDefinition(new QName(SchemaConstants.NS_C,"credentials")); - assertEquals(new QName(SchemaConstants.NS_C,"credentials"), credDef.getName()); - assertEquals(new QName(SchemaConstants.NS_C,"CredentialsType"), credDef.getTypeName()); - assertFalse(credDef.isIgnored()); +// PrismContainerDefinition credDef = newObjectClassDef.findContainerDefinition(new QName(SchemaConstants.NS_C,"credentials")); +// assertEquals(new QName(SchemaConstants.NS_C,"credentials"), credDef.getName()); +// assertEquals(new QName(SchemaConstants.NS_C,"CredentialsType"), credDef.getTypeName()); +// assertFalse(credDef.isIgnored()); PrismPropertyDefinition sepDef = newObjectClassDef.findPropertyDefinition(new QName(SCHEMA_NS,"sep")); assertEquals(new QName(SCHEMA_NS,"sep"), sepDef.getName()); diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/processor/TestResourceSchema.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/processor/TestResourceSchema.java index e9547312924..3d4e6a46497 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/processor/TestResourceSchema.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/processor/TestResourceSchema.java @@ -248,9 +248,9 @@ private void assertResourceSchema(ResourceSchema unSchema) { assertEquals(new QName(SCHEMA_NAMESPACE,"password"), passwdDef.getName()); assertEquals(ProtectedStringType.COMPLEX_TYPE, passwdDef.getTypeName()); - PrismContainerDefinition credDef = objectClassDef.findContainerDefinition(new QName(SchemaConstants.NS_C,"credentials")); - assertEquals(new QName(SchemaConstants.NS_C,"credentials"), credDef.getName()); - assertEquals(new QName(SchemaConstants.NS_C,"CredentialsType"), credDef.getTypeName()); +// PrismContainerDefinition credDef = objectClassDef.findContainerDefinition(new QName(SchemaConstants.NS_C,"credentials")); +// assertEquals(new QName(SchemaConstants.NS_C,"credentials"), credDef.getName()); +// assertEquals(new QName(SchemaConstants.NS_C,"CredentialsType"), credDef.getTypeName()); } @Test @@ -349,7 +349,8 @@ private ResourceSchema createResourceSchema() { ResourceAttributeDefinitionImpl xpasswdDef = containerDefinition.createAttributeDefinition("password", ProtectedStringType.COMPLEX_TYPE); xpasswdDef.setNativeAttributeName("PASSWORD"); // ... property reference - containerDefinition.createAttributeDefinition(SchemaConstants.C_CREDENTIALS, SchemaConstants.C_CREDENTIALS_TYPE); + // TODO this should not go here, as it is not a ResourceAttributeDefinition + //containerDefinition.createAttributeDefinition(SchemaConstants.C_CREDENTIALS, SchemaConstants.C_CREDENTIALS_TYPE); return schema; } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensProjectionContext.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensProjectionContext.java index b73a64c0304..24f9d76ec77 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensProjectionContext.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensProjectionContext.java @@ -614,7 +614,7 @@ public CompositeRefinedObjectClassDefinition getCompositeObjectClassDefinition() if (compositeObjectClassDefinition == null) { RefinedObjectClassDefinition structuralObjectClassDefinition = getStructuralObjectClassDefinition(); if (structuralObjectClassDefinition != null) { - compositeObjectClassDefinition = new CompositeRefinedObjectClassDefinition( + compositeObjectClassDefinition = new CompositeRefinedObjectClassDefinitionImpl( structuralObjectClassDefinition, getAuxiliaryObjectClassDefinitions()); } } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/ConsolidationProcessor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/ConsolidationProcessor.java index 715755306ff..7828e061e26 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/ConsolidationProcessor.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/ConsolidationProcessor.java @@ -16,11 +16,7 @@ package com.evolveum.midpoint.model.impl.lens.projector; -import com.evolveum.midpoint.common.refinery.CompositeRefinedObjectClassDefinition; -import com.evolveum.midpoint.common.refinery.RefinedAssociationDefinition; -import com.evolveum.midpoint.common.refinery.RefinedObjectClassDefinition; -import com.evolveum.midpoint.common.refinery.RefinedResourceSchema; -import com.evolveum.midpoint.common.refinery.RefinedAttributeDefinition; +import com.evolveum.midpoint.common.refinery.*; import com.evolveum.midpoint.model.api.PolicyViolationException; import com.evolveum.midpoint.model.api.context.SynchronizationPolicyDecision; import com.evolveum.midpoint.model.common.mapping.Mapping; @@ -323,7 +319,7 @@ public boolean isSourceless() { throw new IllegalStateException("Structural object class definition for " + discr + " not found in the context, but it should be there"); } - RefinedObjectClassDefinition rOcDef = new CompositeRefinedObjectClassDefinition( + RefinedObjectClassDefinition rOcDef = new CompositeRefinedObjectClassDefinitionImpl( structuralObjectClassDefinition, auxOcDefs); if (LOGGER.isTraceEnabled()) { diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/ucf/impl/ConnectorInstanceIcfImpl.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/ucf/impl/ConnectorInstanceIcfImpl.java index 1f4f3e4c23e..0aea7023051 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/ucf/impl/ConnectorInstanceIcfImpl.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/ucf/impl/ConnectorInstanceIcfImpl.java @@ -908,12 +908,11 @@ private void parseResourceSchema(org.identityconnectors.framework.common.objects if (!hasUidDefinition) { ((ObjectClassComplexTypeDefinitionImpl) ocDef).add(uidDefinition); } - ((Collection)ocDef.getPrimaryIdentifiers()).add(uidDefinition); + ((ObjectClassComplexTypeDefinitionImpl)ocDef).addPrimaryIdentifier(uidDefinition); if (uidDefinition != nameDefinition) { - ((Collection)ocDef.getSecondaryIdentifiers()).add(nameDefinition); + ((ObjectClassComplexTypeDefinitionImpl)ocDef).addSecondaryIdentifier(nameDefinition); } - // Add schema annotations ((ObjectClassComplexTypeDefinitionImpl) ocDef).setNativeObjectClass(objectClassInfo.getType()); ((ObjectClassComplexTypeDefinitionImpl) ocDef).setDisplayNameAttribute(nameDefinition.getName()); From 0c018bc202b94da390f239438735592872f9e545 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Tue, 25 Oct 2016 14:53:34 +0200 Subject: [PATCH 53/74] Implemented/fixed some methods in refined OC definitions. A couple of minor fixes. --- ...ositeRefinedObjectClassDefinitionImpl.java | 29 ++++++++++++------- ...LayerRefinedObjectClassDefinitionImpl.java | 4 +-- .../RefinedObjectClassDefinition.java | 6 +++- .../RefinedObjectClassDefinitionImpl.java | 4 +-- .../midpoint/prism/PrismContainer.java | 5 ++++ .../midpoint/prism/PrismContainerValue.java | 24 +++++++++++++++ .../midpoint/prism/PrismReferenceValue.java | 3 ++ .../prism/marshaller/PrismBeanInspector.java | 9 ++---- .../impl/lens/LensProjectionContext.java | 6 ++-- .../midpoint/model/impl/lens/LensUtil.java | 15 ++++------ .../expr/account-xpath-evaluation.xml | 1 + 11 files changed, 72 insertions(+), 34 deletions(-) diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/CompositeRefinedObjectClassDefinitionImpl.java b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/CompositeRefinedObjectClassDefinitionImpl.java index ce3679f153b..3aa3a5f8b9a 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/CompositeRefinedObjectClassDefinitionImpl.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/CompositeRefinedObjectClassDefinitionImpl.java @@ -419,7 +419,6 @@ public List getIgnoredNamespaces() { return structuralObjectClassDefinition.getIgnoredNamespaces(); } - @Override public LayerRefinedObjectClassDefinition forLayer(LayerType layerType) { throw new UnsupportedOperationException("TODO implement if needed"); @@ -509,19 +508,19 @@ public Class getTypeClass() { @Override public boolean containsAttributeDefinition(ItemPathType pathType) { - return getDefinitionsStream() + return getRefinedObjectClassDefinitionsStream() .filter(def -> containsAttributeDefinition(pathType)) .findAny() .isPresent(); } - private Stream getDefinitionsStream() { + private Stream getRefinedObjectClassDefinitionsStream() { return Stream.concat(Stream.of(structuralObjectClassDefinition), auxiliaryObjectClassDefinitions.stream()); } @Override public boolean containsAttributeDefinition(QName attributeName) { - return getDefinitionsStream() + return getRefinedObjectClassDefinitionsStream() .filter(def -> containsAttributeDefinition(attributeName)) .findAny() .isPresent(); @@ -533,8 +532,8 @@ public ObjectQuery createShadowSearchQuery(String resourceOid) throws SchemaExce } @Override - public PrismObject createBlankShadow() { - return structuralObjectClassDefinition.createBlankShadow(); + public PrismObject createBlankShadow(RefinedObjectClassDefinition definition) { + return structuralObjectClassDefinition.createBlankShadow(definition); } @Override @@ -544,17 +543,27 @@ public ResourceShadowDiscriminator getShadowDiscriminator() { @Override public Collection getNamesOfAttributesWithOutboundExpressions() { - throw new UnsupportedOperationException("TODO implement if needed"); + Set names = new HashSet<>(); + getRefinedObjectClassDefinitionsStream().forEach( + def -> names.addAll(def.getNamesOfAttributesWithOutboundExpressions()) + ); + return names; } @Override public Collection getNamesOfAttributesWithInboundExpressions() { - throw new UnsupportedOperationException("TODO implement if needed"); + Set names = new HashSet<>(); + getRefinedObjectClassDefinitionsStream().forEach( + def -> names.addAll(def.getNamesOfAttributesWithInboundExpressions()) + ); + return names; } @Override - public ResourcePasswordDefinitionType getPasswordDefinition() { - throw new UnsupportedOperationException("TODO implement if needed"); + public ResourcePasswordDefinitionType getPasswordDefinition() { // TODO what if there is a conflict? + return getRefinedObjectClassDefinitionsStream() + .map(def -> def.getPasswordDefinition()) + .findFirst().orElse(null); } @NotNull diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedObjectClassDefinitionImpl.java b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedObjectClassDefinitionImpl.java index 7e8c971a45b..7b4073e7b97 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedObjectClassDefinitionImpl.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedObjectClassDefinitionImpl.java @@ -311,8 +311,8 @@ public boolean isEmpty() { } @Override - public PrismObject createBlankShadow() { - return refinedObjectClassDefinition.createBlankShadow(); + public PrismObject createBlankShadow(RefinedObjectClassDefinition definition) { + return refinedObjectClassDefinition.createBlankShadow(definition); } @Override diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedObjectClassDefinition.java b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedObjectClassDefinition.java index 4a0a3a6fa8c..c3eef428b27 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedObjectClassDefinition.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedObjectClassDefinition.java @@ -135,7 +135,11 @@ default Collection getEntitlementAssociationDefini //region Generating and matching artifacts ======================================================== PrismObjectDefinition getObjectDefinition(); - PrismObject createBlankShadow(); + default PrismObject createBlankShadow() { + return createBlankShadow(this); + } + + PrismObject createBlankShadow(RefinedObjectClassDefinition definition); ResourceShadowDiscriminator getShadowDiscriminator(); diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedObjectClassDefinitionImpl.java b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedObjectClassDefinitionImpl.java index 7e326de399a..7c80cf7cda2 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedObjectClassDefinitionImpl.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedObjectClassDefinitionImpl.java @@ -337,7 +337,7 @@ static PrismObjectDefinition constructObjectDefinition(RefinedObject } @Override - public PrismObject createBlankShadow() { + public PrismObject createBlankShadow(RefinedObjectClassDefinition definition) { PrismObject accountShadow; try { accountShadow = getPrismContext().createObject(ShadowType.class); @@ -354,7 +354,7 @@ public PrismObject createBlankShadow() { // Setup definition PrismObjectDefinition newDefinition = accountShadow.getDefinition().cloneWithReplacedDefinition( - ShadowType.F_ATTRIBUTES, toResourceAttributeContainerDefinition()); + ShadowType.F_ATTRIBUTES, definition.toResourceAttributeContainerDefinition()); accountShadow.setDefinition(newDefinition); return accountShadow; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainer.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainer.java index cadebf4dfb2..97ac19dd904 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainer.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainer.java @@ -342,6 +342,11 @@ public PrismContainerDefinition getDefinition() { public void setDefinition(PrismContainerDefinition definition) { checkMutability(); this.definition = definition; + if (definition != null) { + for (PrismContainerValue value : getValues()) { + value.replaceComplexTypeDefinition(definition.getComplexTypeDefinition()); + } + } } @Override diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerValue.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerValue.java index 18836999169..9ef8ca6c3b9 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerValue.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerValue.java @@ -1433,6 +1433,12 @@ public ComplexTypeDefinition getComplexTypeDefinition() { return complexTypeDefinition; } + // will correctly work only if argument is not null (otherwise the CTD will be determined on next call to getCTD) + void replaceComplexTypeDefinition(ComplexTypeDefinition complexTypeDefinition) { + this.complexTypeDefinition = complexTypeDefinition; + } + + private ComplexTypeDefinition determineComplexTypeDefinition() { PrismContainerable parent = getParent(); ComplexTypeDefinition parentCTD = parent != null && parent.getDefinition() != null ? @@ -1485,4 +1491,22 @@ public Class getRealClass() { public T getRealValue() { return (T) asContainerable(); } + + /** + * Returns a single-valued container (with a single-valued definition) holding just this value. + * @param itemName Item name for newly-created container. + * @return + */ + public PrismContainer asSingleValuedContainer(@NotNull QName itemName) throws SchemaException { + PrismContext prismContext = getPrismContext(); + Validate.notNull(prismContext, "Prism context is null"); + + PrismContainerDefinitionImpl definition = new PrismContainerDefinitionImpl<>(itemName, + getComplexTypeDefinition(), prismContext); + definition.setMaxOccurs(1); + + PrismContainer pc = definition.instantiate(); + pc.add(clone()); + return pc; + } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismReferenceValue.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismReferenceValue.java index 5d6dff328a7..657a44b05ea 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismReferenceValue.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismReferenceValue.java @@ -531,6 +531,9 @@ public PrismReferenceValue asReferenceValue() { public void setupReferenceValue(PrismReferenceValue value) { referenceValue = value; } + public String getOid() { // used by some scripts + return referenceValue.getOid(); + } }; } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismBeanInspector.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismBeanInspector.java index f63cfa2fa36..935a569e96b 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismBeanInspector.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismBeanInspector.java @@ -208,12 +208,7 @@ public Field get(Class c, Method m) { private Map> _findEnumFieldName = Collections.synchronizedMap(new HashMap()); String findEnumFieldName(Class classType, String primValue) { - return find2(_findEnumFieldName, classType, primValue, new Getter2() { - @Override - public String get(Class c, String v) { - return findEnumFieldNameUncached(c, v); - } - }); + return find2(_findEnumFieldName, classType, primValue, (c, v) -> findEnumFieldNameUncached(c, v)); } private Map> _findEnumFieldValue = Collections.synchronizedMap(new HashMap()); @@ -567,7 +562,7 @@ private List getPropOrderUncached(Class beanClass) { private String findEnumFieldNameUncached(Class classType, T primValue){ for (Field field: classType.getDeclaredFields()) { XmlEnumValue xmlEnumValue = field.getAnnotation(XmlEnumValue.class); - if (xmlEnumValue != null && xmlEnumValue.value() != null && xmlEnumValue.value().equals(primValue)) { + if (xmlEnumValue != null && xmlEnumValue.value().equals(primValue)) { return field.getName(); } } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensProjectionContext.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensProjectionContext.java index 24f9d76ec77..407b61a70eb 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensProjectionContext.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensProjectionContext.java @@ -755,9 +755,9 @@ public void recompute() throws SchemaException { } if (base == null && accDelta.isModify()) { - RefinedObjectClassDefinition rAccountDef = getCompositeObjectClassDefinition(); - if (rAccountDef != null) { - base = (PrismObject) rAccountDef.createBlankShadow(); + RefinedObjectClassDefinition rOCD = getCompositeObjectClassDefinition(); + if (rOCD != null) { + base = rOCD.createBlankShadow(); } } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensUtil.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensUtil.java index 35c75c150c5..246413a1436 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensUtil.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensUtil.java @@ -32,6 +32,7 @@ import com.evolveum.midpoint.model.common.expression.*; import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.prism.polystring.PrismDefaultPolyStringNormalizer; +import com.evolveum.midpoint.schema.SchemaConstantsGenerated; import com.evolveum.midpoint.schema.util.ObjectResolver; import com.evolveum.midpoint.util.DebugUtil; import com.evolveum.midpoint.util.exception.*; @@ -77,6 +78,7 @@ import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; +import org.jetbrains.annotations.NotNull; /** * @author semancik @@ -1212,21 +1214,16 @@ private static void checkObjectPolicy(LensFocusContext } } - public static PrismContainer createAssignmentSingleValueContainerClone(AssignmentType assignmentType) throws SchemaException { - PrismContainerValue assignmentCVal = assignmentType.asPrismContainerValue(); - PrismContainerDefinition def = assignmentCVal.getParent().getDefinition().clone(); + public static PrismContainer createAssignmentSingleValueContainerClone(@NotNull AssignmentType assignmentType) throws SchemaException { // Make it appear to be single-value. Therefore paths without segment IDs will work. - ((PrismContainerDefinitionImpl) def).setMaxOccurs(1); - PrismContainer assignmentCont = def.instantiate(); - assignmentCont.add(assignmentCVal.clone()); - return assignmentCont; + return assignmentType.asPrismContainerValue().asSingleValuedContainer(SchemaConstantsGenerated.C_ASSIGNMENT); } public static AssignmentType getAssignmentType(ItemDeltaItem,PrismContainerDefinition> assignmentIdi, boolean old) { if (old) { - return ((PrismContainer)assignmentIdi.getItemOld()).getValue(0).asContainerable(); + return assignmentIdi.getItemOld().getValue(0).asContainerable(); } else { - return ((PrismContainer)assignmentIdi.getItemNew()).getValue(0).asContainerable(); + return assignmentIdi.getItemNew().getValue(0).asContainerable(); } } diff --git a/model/model-impl/src/test/resources/expr/account-xpath-evaluation.xml b/model/model-impl/src/test/resources/expr/account-xpath-evaluation.xml index a394b00ab2b..fc15a8b9139 100644 --- a/model/model-impl/src/test/resources/expr/account-xpath-evaluation.xml +++ b/model/model-impl/src/test/resources/expr/account-xpath-evaluation.xml @@ -334,6 +334,7 @@ jan prvy uid=janko nemenny,ou=people,dc=example,dc=com prvy + janco James Jr. unchanged James Jr. From e4ec32862e3f313904c1e02798496cc51e359fa5 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Tue, 25 Oct 2016 15:18:18 +0200 Subject: [PATCH 54/74] Started BeanConvertor (brief) refactoring. --- .../midpoint/prism/PrismContextImpl.java | 19 +- .../midpoint/prism/PrismPropertyValue.java | 12 +- .../prism/marshaller/BeanMarshaller.java | 451 ++++++++++++++++++ ...anConverter.java => BeanUnmarshaller.java} | 403 ++-------------- .../prism/marshaller/PrismBeanInspector.java | 14 +- .../prism/marshaller/PrismMarshaller.java | 5 +- .../prism/marshaller/PrismParserImpl.java | 8 +- .../prism/marshaller/PrismUnmarshaller.java | 22 +- .../prism/marshaller/QueryConvertor.java | 2 +- .../prism/schema/SchemaRegistryImpl.java | 2 +- .../midpoint/prism/util/PrismUtil.java | 1 - .../prism/lex/TestProtectedString.java | 2 +- .../midpoint/schema/util/MiscSchemaUtil.java | 8 +- .../midpoint/schema/TestDeltaConverter.java | 4 +- .../midpoint/schema/TestJaxbParsing.java | 3 +- .../midpoint/schema/TestParseDiffPatch.java | 2 +- .../provisioning/impl/ucf/TestUcfOpenDj.java | 3 +- .../midpoint/testing/sanity/TestSanity.java | 6 +- .../testing/sanity/TestSanityLegacy.java | 4 +- 19 files changed, 548 insertions(+), 423 deletions(-) create mode 100644 infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/BeanMarshaller.java rename infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/{PrismBeanConverter.java => BeanUnmarshaller.java} (72%) diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContextImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContextImpl.java index 9f75dca7bc1..495f3194fb8 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContextImpl.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContextImpl.java @@ -59,7 +59,8 @@ public class PrismContextImpl implements PrismContext { @NotNull private final PolyStringNormalizer defaultPolyStringNormalizer; // TODO make non-final when needed @NotNull private final PrismUnmarshaller prismUnmarshaller; @NotNull private final PrismMarshaller prismMarshaller; - @NotNull private final PrismBeanConverter beanConverter; + @NotNull private final BeanMarshaller beanMarshaller; + @NotNull private final BeanUnmarshaller beanUnmarshaller; private PrismMonitor monitor = null; private SchemaDefinitionFactory definitionFactory; @@ -76,8 +77,10 @@ private PrismContextImpl(@NotNull SchemaRegistryImpl schemaRegistry) { schemaRegistry.setPrismContext(this); this.lexicalProcessorRegistry = new LexicalProcessorRegistry(schemaRegistry); this.prismUnmarshaller = new PrismUnmarshaller(this); - this.beanConverter = new PrismBeanConverter(this, new PrismBeanInspector(this)); - this.prismMarshaller = new PrismMarshaller(beanConverter); + PrismBeanInspector inspector = new PrismBeanInspector(this); + this.beanMarshaller = new BeanMarshaller(this, inspector); + this.beanUnmarshaller = new BeanUnmarshaller(this, inspector); + this.prismMarshaller = new PrismMarshaller(beanMarshaller); this.jaxbDomHack = new JaxbDomHack(lexicalProcessorRegistry.domProcessor(), this); defaultPolyStringNormalizer = new PrismDefaultPolyStringNormalizer(); @@ -145,8 +148,14 @@ public DomLexicalProcessor getParserDom() { /** * WARNING! This is not really public method. It should NOT not used outside the prism implementation. */ - public PrismBeanConverter getBeanConverter() { - return beanConverter; + @NotNull + public BeanMarshaller getBeanMarshaller() { + return beanMarshaller; + } + + @NotNull + public BeanUnmarshaller getBeanUnmarshaller() { + return beanUnmarshaller; } @NotNull diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyValue.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyValue.java index f5acfdca53b..009680b6c5f 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyValue.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyValue.java @@ -17,17 +17,13 @@ package com.evolveum.midpoint.prism; -import com.evolveum.midpoint.prism.marshaller.PrismBeanConverter; +import com.evolveum.midpoint.prism.marshaller.BeanMarshaller; import com.evolveum.midpoint.prism.match.MatchingRule; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.prism.polystring.PolyStringNormalizer; -import com.evolveum.midpoint.prism.schema.SchemaRegistry; -import com.evolveum.midpoint.prism.schema.SchemaRegistryImpl; import com.evolveum.midpoint.prism.util.CloneUtil; import com.evolveum.midpoint.prism.util.PrismUtil; -import com.evolveum.midpoint.prism.xnode.PrimitiveXNode; -import com.evolveum.midpoint.prism.xnode.RootXNode; import com.evolveum.midpoint.prism.xnode.XNode; import com.evolveum.midpoint.util.DOMUtil; import com.evolveum.midpoint.util.DebugDumpable; @@ -195,9 +191,9 @@ public void revive(PrismContext prismContext) throws SchemaException { if (value instanceof Revivable) { ((Revivable)value).revive(prismContext); } else { - PrismBeanConverter beanConverter = ((PrismContextImpl) prismContext).getBeanConverter(); - if (beanConverter.canProcess(value.getClass())) { - beanConverter.revive(value, prismContext); + BeanMarshaller marshaller = ((PrismContextImpl) prismContext).getBeanMarshaller(); + if (marshaller.canProcess(value.getClass())) { + marshaller.revive(value, prismContext); } } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/BeanMarshaller.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/BeanMarshaller.java new file mode 100644 index 00000000000..a849e9b1b34 --- /dev/null +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/BeanMarshaller.java @@ -0,0 +1,451 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.prism.marshaller; + +import com.evolveum.midpoint.prism.*; +import com.evolveum.midpoint.prism.path.ItemPath; +import com.evolveum.midpoint.prism.schema.SchemaRegistry; +import com.evolveum.midpoint.prism.xml.XsdTypeMapper; +import com.evolveum.midpoint.prism.xnode.*; +import com.evolveum.midpoint.util.DOMUtil; +import com.evolveum.midpoint.util.Handler; +import com.evolveum.midpoint.util.exception.SchemaException; +import com.evolveum.midpoint.util.exception.SystemException; +import com.evolveum.midpoint.util.exception.TunnelException; +import com.evolveum.midpoint.util.logging.Trace; +import com.evolveum.midpoint.util.logging.TraceManager; +import com.evolveum.prism.xml.ns._public.query_3.SearchFilterType; +import com.evolveum.prism.xml.ns._public.types_3.*; +import org.apache.commons.lang.StringUtils; +import org.jetbrains.annotations.NotNull; + +import javax.xml.bind.JAXBElement; +import javax.xml.bind.annotation.XmlType; +import javax.xml.namespace.QName; +import java.lang.reflect.*; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +public class BeanMarshaller { + + private static final Trace LOGGER = TraceManager.getTrace(BeanMarshaller.class); + + public static final String DEFAULT_PLACEHOLDER = "##default"; + + private PrismBeanInspector inspector; + + @NotNull private final PrismContext prismContext; + + public BeanMarshaller(@NotNull PrismContext prismContext, PrismBeanInspector inspector) { + this.prismContext = prismContext; + this.inspector = inspector; + } + + @NotNull + public PrismContext getPrismContext() { + return prismContext; + } + + private SchemaRegistry getSchemaRegistry() { + return prismContext.getSchemaRegistry(); + } + + public boolean canProcess(QName typeName) { + return getSchemaRegistry().determineCompileTimeClass(typeName) != null; + } + + public boolean canProcess(@NotNull Class clazz) { + return RawType.class.equals(clazz) || clazz.getAnnotation(XmlType.class) != null; + } + + public QName determineTypeForClass(Class clazz) { + return inspector.determineTypeForClass(clazz); + } + + private MapXNode marshalSearchFilterType(SearchFilterType value) throws SchemaException { + if (value == null) { + return null; + } + return value.serializeToXNode(); + } + + private Type getTypeArgument(Type origType, String desc) { + if (!(origType instanceof ParameterizedType)) { + throw new IllegalArgumentException("No a parametrized type "+desc); + } + ParameterizedType parametrizedType = (ParameterizedType)origType; + Type[] actualTypeArguments = parametrizedType.getActualTypeArguments(); + if (actualTypeArguments == null || actualTypeArguments.length == 0) { + throw new IllegalArgumentException("No type arguments for getter "+desc); + } + if (actualTypeArguments.length > 1) { + throw new IllegalArgumentException("Too many type arguments for getter for "+desc); + } + return actualTypeArguments[0]; + } + + + // TODO hacked, for now +// private String findEnumFieldValue(Class classType, Object bean){ +// String name = bean.toString(); +// for (Field field: classType.getDeclaredFields()) { +// XmlEnumValue xmlEnumValue = field.getAnnotation(XmlEnumValue.class); +// if (xmlEnumValue != null && field.getName().equals(name)) { +// return xmlEnumValue.value(); +// } +// } +// return null; +// } + + + public XNode marshall(T bean) throws SchemaException { + return marshall(bean, null); + } + + public XNode marshall(T bean, SerializationContext ctx) throws SchemaException { + if (bean == null) { + return null; + } + if (bean instanceof SchemaDefinitionType) { + return marshalSchemaDefinition((SchemaDefinitionType) bean); + } else if (bean instanceof ProtectedDataType) { + MapXNode xProtected = marshalProtectedDataType((ProtectedDataType) bean); + return xProtected; + } else if (bean instanceof ItemPathType){ + return marshalItemPathType((ItemPathType) bean); + } else if (bean instanceof RawType) { + return marshalRawValue((RawType) bean); + } else if (bean instanceof XmlAsStringType) { + return marshalXmlAsStringType((XmlAsStringType) bean); + } else if (prismContext != null && prismContext.getSchemaRegistry().determineDefinitionFromClass(bean.getClass()) != null){ + // TODO change to marshalItemContent + return ((PrismContextImpl) prismContext).getPrismMarshaller().marshalItemAsRoot(((Objectable)bean).asPrismObject(), + null, null, ctx).getSubnode(); + } + // Note: SearchFilterType is treated below + + Class beanClass = bean.getClass(); + + if (beanClass == String.class) { + return createPrimitiveXNode((String)bean, DOMUtil.XSD_STRING, false); + } + + //check for enums + if (beanClass.isEnum()){ + String enumValue = inspector.findEnumFieldValue(beanClass, bean.toString()); + if (StringUtils.isEmpty(enumValue)){ + enumValue = bean.toString(); + } + QName fieldTypeName = inspector.findFieldTypeName(null, beanClass, DEFAULT_PLACEHOLDER); + return createPrimitiveXNode(enumValue, fieldTypeName, false); + } + + MapXNode xmap; + if (bean instanceof SearchFilterType) { + // this hack is here because of c:ConditionalSearchFilterType - it is analogous to situation when unmarshalling this type (TODO: rework this in a nicer way) + xmap = marshalSearchFilterType((SearchFilterType) bean); + if (SearchFilterType.class.equals(bean.getClass())) { + return xmap; // nothing more to serialize; otherwise we continue, because in that case we deal with a subclass of SearchFilterType + } + } else { + xmap = new MapXNode(); + } + + XmlType xmlType = beanClass.getAnnotation(XmlType.class); + if (xmlType == null) { + throw new IllegalArgumentException("Cannot marshall "+beanClass+" it does not have @XmlType annotation"); + } + + String namespace = inspector.determineNamespace(beanClass); + if (namespace == null) { + throw new IllegalArgumentException("Cannot determine namespace of "+beanClass); + } + + List propOrder = inspector.getPropOrder(beanClass); + for (String fieldName: propOrder) { + QName elementName = inspector.findFieldElementQName(fieldName, beanClass, namespace); + Method getter = inspector.findPropertyGetter(beanClass, fieldName); + if (getter == null) { + throw new IllegalStateException("No getter for field "+fieldName+" in "+beanClass); + } + Object getterResult; + try { + getterResult = getter.invoke(bean); + } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { + throw new SystemException("Cannot invoke method for field "+fieldName+" in "+beanClass+": "+e.getMessage(), e); + } + + if (getterResult == null) { + continue; + } + + Field field = inspector.findPropertyField(beanClass, fieldName); + boolean isAttribute = inspector.isAttribute(field, getter); + + if (getterResult instanceof Collection) { + Collection col = (Collection)getterResult; + if (col.isEmpty()) { + continue; + } + Iterator i = col.iterator(); + if (i == null) { + // huh?!? .. but it really happens + throw new IllegalArgumentException("Iterator of collection returned from "+getter+" is null"); + } + Object getterResultValue = i.next(); + if (getterResultValue == null) { + continue; + } + + ListXNode xlist = new ListXNode(); + + // elementName will be determined from the first item on the list + // TODO make sure it will be correct with respect to other items as well! + if (getterResultValue instanceof JAXBElement && ((JAXBElement) getterResultValue).getName() != null) { + elementName = ((JAXBElement) getterResultValue).getName(); + } + + for (Object element: col) { + if (element == null){ + continue; + } + QName fieldTypeName = inspector.findFieldTypeName(field, element.getClass(), namespace); + Object elementToMarshall = element; + if (element instanceof JAXBElement){ + elementToMarshall = ((JAXBElement) element).getValue(); + } + XNode marshalled = marshallValue(elementToMarshall, fieldTypeName, isAttribute, ctx); + + // Brutal hack - made here just to make scripts (bulk actions) functional while not breaking anything else + // Fix it in 3.1. [med] + if (fieldTypeName == null && element instanceof JAXBElement && marshalled != null) { + QName typeName = inspector.determineTypeForClass(elementToMarshall.getClass()); + if (typeName != null && !getSchemaRegistry().hasImplicitTypeDefinition(elementName, typeName)) { + marshalled.setExplicitTypeDeclaration(true); + marshalled.setTypeQName(typeName); + } + } + else { + // end of hack + + setExplicitTypeDeclarationIfNeeded(getter, getterResultValue, marshalled, fieldTypeName); + } + xlist.add(marshalled); + } + xmap.put(elementName, xlist); + } else { + QName fieldTypeName = inspector.findFieldTypeName(field, getterResult.getClass(), namespace); + Object valueToMarshall = null; + if (getterResult instanceof JAXBElement){ + valueToMarshall = ((JAXBElement) getterResult).getValue(); + elementName = ((JAXBElement) getterResult).getName(); + } else{ + valueToMarshall = getterResult; + } + XNode marshelled = marshallValue(valueToMarshall, fieldTypeName, isAttribute, ctx); + if (!getter.getReturnType().equals(valueToMarshall.getClass()) && getter.getReturnType().isAssignableFrom(valueToMarshall.getClass())){ + if (prismContext != null) { + PrismObjectDefinition def = prismContext.getSchemaRegistry().determineDefinitionFromClass(valueToMarshall.getClass()); + if (def != null){ + QName type = def.getTypeName(); + marshelled.setTypeQName(type); + marshelled.setExplicitTypeDeclaration(true); + } + } + } + xmap.put(elementName, marshelled); + +// setExplicitTypeDeclarationIfNeeded(getter, valueToMarshall, xmap, fieldTypeName); + } + } + + return xmap; + } + + private XNode marshalXmlAsStringType(XmlAsStringType bean) { + PrimitiveXNode xprim = new PrimitiveXNode<>(); + xprim.setValue(bean.getContentAsString(), DOMUtil.XSD_STRING); + return xprim; + } + + public void revive(Object bean, final PrismContext prismContext) throws SchemaException { + Handler visitor = o -> { + if (o instanceof Revivable) { + try { + ((Revivable)o).revive(prismContext); + } catch (SchemaException e) { + throw new TunnelException(e); + } + } + return true; + }; + try { + visit(bean,visitor); + } catch (TunnelException te) { + SchemaException e = (SchemaException) te.getCause(); + throw e; + } + } + + public void visit(Object bean, Handler handler) { + if (bean == null) { + return; + } + + Class beanClass = bean.getClass(); + + handler.handle(bean); + + if (beanClass.isEnum() || beanClass.isPrimitive()){ + //nothing more to do + return; + } + + // TODO: implement special handling for RawType, if necessary (it has no XmlType annotation any more) + + XmlType xmlType = beanClass.getAnnotation(XmlType.class); + if (xmlType == null) { + // no @XmlType annotation, we are not interested to go any deeper + return; + } + + List propOrder = inspector.getPropOrder(beanClass); + for (String fieldName: propOrder) { + Method getter = inspector.findPropertyGetter(beanClass, fieldName); + if (getter == null) { + throw new IllegalStateException("No getter for field "+fieldName+" in "+beanClass); + } + Object getterResult; + try { + getterResult = getter.invoke(bean); + } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { + throw new SystemException("Cannot invoke method for field "+fieldName+" in "+beanClass+": "+e.getMessage(), e); + } + + if (getterResult == null) { + continue; + } + + if (getterResult instanceof Collection) { + Collection col = (Collection)getterResult; + if (col.isEmpty()) { + continue; + } + + for (Object element: col) { + visitValue(element, handler); + + } + } else { + visitValue(getterResult, handler); + } + } + } + + private void visitValue(Object element, Handler handler) { + Object elementToMarshall = element; + if (element instanceof JAXBElement){ + elementToMarshall = ((JAXBElement) element).getValue(); + } + visit(elementToMarshall, handler); + } + + private void setExplicitTypeDeclarationIfNeeded(Method getter, Object getterResult, XNode xmap, QName fieldTypeName){ + Class getterReturnType = getter.getReturnType(); + Class getterType = null; + if (Collection.class.isAssignableFrom(getterReturnType)){ + Type genericReturnType = getter.getGenericReturnType(); + if (genericReturnType instanceof ParameterizedType){ + Type actualType = getTypeArgument(genericReturnType, "explicit type declaration"); + + if (actualType instanceof Class){ + getterType = (Class) actualType; + } + } + } + if (getterType == null){ + getterType = getterReturnType; + } + Class getterResultReturnType = getterResult.getClass(); + if (getterType != getterResultReturnType && getterType.isAssignableFrom(getterResultReturnType)){ + xmap.setExplicitTypeDeclaration(true); + xmap.setTypeQName(fieldTypeName); + } + } + + private XNode marshallValue(T value, QName fieldTypeName, boolean isAttribute, SerializationContext ctx) throws SchemaException { + if (value == null) { + return null; + } + if (canProcess(value.getClass())) { + // This must be a bean + return marshall(value, ctx); + } else { + // primitive value + return createPrimitiveXNode(value, fieldTypeName, isAttribute); + } + } + + private PrimitiveXNode createPrimitiveXNode(T value, QName fieldTypeName, boolean isAttribute){ + PrimitiveXNode xprim = new PrimitiveXNode(); + xprim.setValue(value, fieldTypeName); + xprim.setAttribute(isAttribute); + return xprim; + } + + private PrimitiveXNode createPrimitiveXNode(T val, QName type) { + return createPrimitiveXNode(val, type, false); + } + + private XNode marshalRawValue(RawType value) throws SchemaException { + return value.serializeToXNode(); + } + + private XNode marshalItemPathType(ItemPathType itemPath) { + PrimitiveXNode xprim = new PrimitiveXNode(); + if (itemPath != null){ + ItemPath path = itemPath.getItemPath(); + xprim.setValue(path, ItemPathType.COMPLEX_TYPE); + } + return xprim; + } + + private XNode marshalSchemaDefinition(SchemaDefinitionType schemaDefinitionType) { + SchemaXNode xschema = new SchemaXNode(); + xschema.setSchemaElement(schemaDefinitionType.getSchema()); + MapXNode xmap = new MapXNode(); + xmap.put(DOMUtil.XSD_SCHEMA_ELEMENT, xschema); + return xmap; + } + + // TODO create more appropriate interface to be able to simply serialize ProtectedStringType instances + public MapXNode marshalProtectedDataType(ProtectedDataType protectedType) throws SchemaException { + MapXNode xmap = new MapXNode(); + if (protectedType.getEncryptedDataType() != null) { + EncryptedDataType encryptedDataType = protectedType.getEncryptedDataType(); + MapXNode xEncryptedDataType = (MapXNode) marshall(encryptedDataType); + xmap.put(ProtectedDataType.F_ENCRYPTED_DATA, xEncryptedDataType); + } else if (protectedType.getClearValue() != null){ + QName type = XsdTypeMapper.toXsdType(protectedType.getClearValue().getClass()); + PrimitiveXNode xClearValue = createPrimitiveXNode(protectedType.getClearValue(), type); + xmap.put(ProtectedDataType.F_CLEAR_VALUE, xClearValue); + } + // TODO: clearValue + return xmap; + } +} + \ No newline at end of file diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismBeanConverter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/BeanUnmarshaller.java similarity index 72% rename from infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismBeanConverter.java rename to infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/BeanUnmarshaller.java index cad1eac3285..435064d2471 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismBeanConverter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/BeanUnmarshaller.java @@ -22,12 +22,7 @@ import com.evolveum.midpoint.prism.schema.SchemaRegistry; import com.evolveum.midpoint.prism.xml.XmlTypeConverter; import com.evolveum.midpoint.prism.xml.XsdTypeMapper; -import com.evolveum.midpoint.prism.xnode.ListXNode; -import com.evolveum.midpoint.prism.xnode.MapXNode; -import com.evolveum.midpoint.prism.xnode.PrimitiveXNode; -import com.evolveum.midpoint.prism.xnode.RootXNode; -import com.evolveum.midpoint.prism.xnode.SchemaXNode; -import com.evolveum.midpoint.prism.xnode.XNode; +import com.evolveum.midpoint.prism.xnode.*; import com.evolveum.midpoint.util.DOMUtil; import com.evolveum.midpoint.util.Handler; import com.evolveum.midpoint.util.QNameUtil; @@ -38,16 +33,7 @@ import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.prism.xml.ns._public.query_3.SearchFilterType; -import com.evolveum.prism.xml.ns._public.types_3.EncryptedDataType; -import com.evolveum.prism.xml.ns._public.types_3.ItemPathType; -import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; -import com.evolveum.prism.xml.ns._public.types_3.ProtectedByteArrayType; -import com.evolveum.prism.xml.ns._public.types_3.ProtectedDataType; -import com.evolveum.prism.xml.ns._public.types_3.ProtectedStringType; -import com.evolveum.prism.xml.ns._public.types_3.RawType; -import com.evolveum.prism.xml.ns._public.types_3.SchemaDefinitionType; -import com.evolveum.prism.xml.ns._public.types_3.XmlAsStringType; - +import com.evolveum.prism.xml.ns._public.types_3.*; import org.apache.commons.lang.StringUtils; import org.jetbrains.annotations.NotNull; import org.w3c.dom.Element; @@ -55,33 +41,19 @@ import javax.xml.bind.JAXBElement; import javax.xml.bind.annotation.XmlType; import javax.xml.namespace.QName; - -import java.lang.reflect.Field; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.lang.reflect.ParameterizedType; -import java.lang.reflect.Type; -import java.lang.reflect.WildcardType; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.Iterator; -import java.util.List; -import java.util.Map; +import java.lang.reflect.*; +import java.util.*; import java.util.Map.Entry; -import java.util.Set; - -public class PrismBeanConverter { - private static final Trace LOGGER = TraceManager.getTrace(PrismBeanConverter.class); +public class BeanUnmarshaller { - public static final String DEFAULT_PLACEHOLDER = "##default"; + private static final Trace LOGGER = TraceManager.getTrace(BeanUnmarshaller.class); private PrismBeanInspector inspector; @NotNull private final PrismContext prismContext; - public PrismBeanConverter(@NotNull PrismContext prismContext, PrismBeanInspector inspector) { + public BeanUnmarshaller(@NotNull PrismContext prismContext, PrismBeanInspector inspector) { this.prismContext = prismContext; this.inspector = inspector; } @@ -95,23 +67,15 @@ private SchemaRegistry getSchemaRegistry() { return prismContext.getSchemaRegistry(); } - public boolean canProcess(QName typeName) { - return getSchemaRegistry().determineCompileTimeClass(typeName) != null; - } - - public boolean canProcess(@NotNull Class clazz) { - return RawType.class.equals(clazz) || clazz.getAnnotation(XmlType.class) != null; - } - public QName determineTypeForClass(Class clazz) { return inspector.determineTypeForClass(clazz); } - + public T unmarshall(MapXNode xnode, QName typeQName, ParsingContext pc) throws SchemaException { Class classType = getSchemaRegistry().determineCompileTimeClass(typeQName); return unmarshall(xnode, classType, pc); } - + public T unmarshall(XNode xnode, Class beanClass, ParsingContext pc) throws SchemaException{ if (xnode instanceof PrimitiveXNode){ return unmarshallPrimitive((PrimitiveXNode) xnode, beanClass, pc); @@ -119,7 +83,7 @@ public T unmarshall(XNode xnode, Class beanClass, ParsingContext pc) thro return unmarshall((MapXNode) xnode, beanClass, pc); } else if (xnode instanceof RootXNode){ return unmarshall(((RootXNode) xnode).getSubnode(), beanClass, pc); - } else + } else throw new IllegalStateException("Unexpected xnode " + xnode +". Could not unmarshall value"); } @@ -151,7 +115,7 @@ public T unmarshall(MapXNode xnode, Class beanClass, ParsingContext pc) t } else if (xnode.isEmpty()) { return (T) new XmlAsStringType(); } else { - Map.Entry entry = xnode.entrySet().iterator().next(); + Entry entry = xnode.entrySet().iterator().next(); DomLexicalProcessor domParser = ((PrismContextImpl) prismContext).getParserDom(); String value = domParser.write(entry.getValue(), entry.getKey(), null); return (T) new XmlAsStringType(value); @@ -480,6 +444,28 @@ public T unmarshall(MapXNode xnode, Class beanClass, ParsingContext pc) t return bean; } + // Prepares value to be stored into the bean - e.g. converts PolyString->PolyStringType, wraps a value to JAXB if specified, ... + private Object prepareValueToBeStored(Object propVal, boolean wrapInJaxbElement, Object objectFactory, Method factoryMehtod, String propName, + Class beanClass, ParsingContext pc) { + + if (propVal instanceof PolyString) { + propVal = new PolyStringType((PolyString) propVal); + } + + if (wrapInJaxbElement) { + if (factoryMehtod == null) { + throw new IllegalArgumentException("Param type is JAXB element but no factory method found for it, property "+propName+" in "+beanClass); + } + try { + return factoryMehtod.invoke(objectFactory, propVal); + } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { + throw new SystemException("Unable to invoke factory method "+factoryMehtod+" on "+objectFactory.getClass()+" for property "+propName+" in "+beanClass); + } + } else { + return propVal; + } + } + /* * We want to avoid this: * @@ -598,13 +584,6 @@ private T unmarshalSearchFilterType(MapXNode xmap, return filterType; } - private MapXNode marshalSearchFilterType(SearchFilterType value) throws SchemaException { - if (value == null) { - return null; - } - return value.serializeToXNode(); - } - private Type getTypeArgument(Type origType, String desc) { if (!(origType instanceof ParameterizedType)) { throw new IllegalArgumentException("No a parametrized type "+desc); @@ -620,28 +599,6 @@ private Type getTypeArgument(Type origType, String desc) { return actualTypeArguments[0]; } - // Prepares value to be stored into the bean - e.g. converts PolyString->PolyStringType, wraps a value to JAXB if specified, ... - private Object prepareValueToBeStored(Object propVal, boolean wrapInJaxbElement, Object objectFactory, Method factoryMehtod, String propName, - Class beanClass, ParsingContext pc) { - - if (propVal instanceof PolyString) { - propVal = new PolyStringType((PolyString) propVal); - } - - if (wrapInJaxbElement) { - if (factoryMehtod == null) { - throw new IllegalArgumentException("Param type is JAXB element but no factory method found for it, property "+propName+" in "+beanClass); - } - try { - return factoryMehtod.invoke(objectFactory, propVal); - } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { - throw new SystemException("Unable to invoke factory method "+factoryMehtod+" on "+objectFactory.getClass()+" for property "+propName+" in "+beanClass); - } - } else { - return propVal; - } - } - private Object convertSinglePropValue(XNode xsubnode, String fieldName, Class paramType, boolean storeAsRawType, Class classType, String schemaNamespace, ParsingContext pc) throws SchemaException { Object propValue; @@ -792,19 +749,6 @@ private T unmarshallPrimitive(PrimitiveXNode xprim, Class classType, P return bean; } - // TODO hacked, for now -// private String findEnumFieldValue(Class classType, Object bean){ -// String name = bean.toString(); -// for (Field field: classType.getDeclaredFields()) { -// XmlEnumValue xmlEnumValue = field.getAnnotation(XmlEnumValue.class); -// if (xmlEnumValue != null && field.getName().equals(name)) { -// return xmlEnumValue.value(); -// } -// } -// return null; -// } - - private T postConvertUnmarshall(Object parsedPrimValue, ParsingContext pc) { if (parsedPrimValue == null) { return null; @@ -816,198 +760,7 @@ private T postConvertUnmarshall(Object parsedPrimValue, ParsingContext pc) { } } - public XNode marshall(T bean) throws SchemaException { - return marshall(bean, null); - } - - public XNode marshall(T bean, SerializationContext ctx) throws SchemaException { - if (bean == null) { - return null; - } - if (bean instanceof SchemaDefinitionType) { - return marshalSchemaDefinition((SchemaDefinitionType) bean); - } else if (bean instanceof ProtectedDataType) { - MapXNode xProtected = marshalProtectedDataType((ProtectedDataType) bean); - return xProtected; - } else if (bean instanceof ItemPathType){ - return marshalItemPathType((ItemPathType) bean); - } else if (bean instanceof RawType) { - return marshalRawValue((RawType) bean); - } else if (bean instanceof XmlAsStringType) { - return marshalXmlAsStringType((XmlAsStringType) bean); - } else if (prismContext != null && prismContext.getSchemaRegistry().determineDefinitionFromClass(bean.getClass()) != null){ - // TODO change to marshalItemContent - return ((PrismContextImpl) prismContext).getPrismMarshaller().marshalItemAsRoot(((Objectable)bean).asPrismObject(), - null, null, ctx).getSubnode(); - } - // Note: SearchFilterType is treated below - - Class beanClass = bean.getClass(); - - if (beanClass == String.class) { - return createPrimitiveXNode((String)bean, DOMUtil.XSD_STRING, false); - } - - //check for enums - if (beanClass.isEnum()){ - String enumValue = inspector.findEnumFieldValue(beanClass, bean.toString()); - if (StringUtils.isEmpty(enumValue)){ - enumValue = bean.toString(); - } - QName fieldTypeName = inspector.findFieldTypeName(null, beanClass, DEFAULT_PLACEHOLDER); - return createPrimitiveXNode(enumValue, fieldTypeName, false); - } - - MapXNode xmap; - if (bean instanceof SearchFilterType) { - // this hack is here because of c:ConditionalSearchFilterType - it is analogous to situation when unmarshalling this type (TODO: rework this in a nicer way) - xmap = marshalSearchFilterType((SearchFilterType) bean); - if (SearchFilterType.class.equals(bean.getClass())) { - return xmap; // nothing more to serialize; otherwise we continue, because in that case we deal with a subclass of SearchFilterType - } - } else { - xmap = new MapXNode(); - } - - XmlType xmlType = beanClass.getAnnotation(XmlType.class); - if (xmlType == null) { - throw new IllegalArgumentException("Cannot marshall "+beanClass+" it does not have @XmlType annotation"); - } - - String namespace = inspector.determineNamespace(beanClass); - if (namespace == null) { - throw new IllegalArgumentException("Cannot determine namespace of "+beanClass); - } - - List propOrder = inspector.getPropOrder(beanClass); - for (String fieldName: propOrder) { - QName elementName = inspector.findFieldElementQName(fieldName, beanClass, namespace); - Method getter = inspector.findPropertyGetter(beanClass, fieldName); - if (getter == null) { - throw new IllegalStateException("No getter for field "+fieldName+" in "+beanClass); - } - Object getterResult; - try { - getterResult = getter.invoke(bean); - } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { - throw new SystemException("Cannot invoke method for field "+fieldName+" in "+beanClass+": "+e.getMessage(), e); - } - - if (getterResult == null) { - continue; - } - - Field field = inspector.findPropertyField(beanClass, fieldName); - boolean isAttribute = inspector.isAttribute(field, getter); - - if (getterResult instanceof Collection) { - Collection col = (Collection)getterResult; - if (col.isEmpty()) { - continue; - } - Iterator i = col.iterator(); - if (i == null) { - // huh?!? .. but it really happens - throw new IllegalArgumentException("Iterator of collection returned from "+getter+" is null"); - } - Object getterResultValue = i.next(); - if (getterResultValue == null) { - continue; - } - - ListXNode xlist = new ListXNode(); - - // elementName will be determined from the first item on the list - // TODO make sure it will be correct with respect to other items as well! - if (getterResultValue instanceof JAXBElement && ((JAXBElement) getterResultValue).getName() != null) { - elementName = ((JAXBElement) getterResultValue).getName(); - } - - for (Object element: col) { - if (element == null){ - continue; - } - QName fieldTypeName = inspector.findFieldTypeName(field, element.getClass(), namespace); - Object elementToMarshall = element; - if (element instanceof JAXBElement){ - elementToMarshall = ((JAXBElement) element).getValue(); - } - XNode marshalled = marshallValue(elementToMarshall, fieldTypeName, isAttribute, ctx); - - // Brutal hack - made here just to make scripts (bulk actions) functional while not breaking anything else - // Fix it in 3.1. [med] - if (fieldTypeName == null && element instanceof JAXBElement && marshalled != null) { - QName typeName = inspector.determineTypeForClass(elementToMarshall.getClass()); - if (typeName != null && !getSchemaRegistry().hasImplicitTypeDefinition(elementName, typeName)) { - marshalled.setExplicitTypeDeclaration(true); - marshalled.setTypeQName(typeName); - } - } - else { - // end of hack - - setExplicitTypeDeclarationIfNeeded(getter, getterResultValue, marshalled, fieldTypeName); - } - xlist.add(marshalled); - } - xmap.put(elementName, xlist); - } else { - QName fieldTypeName = inspector.findFieldTypeName(field, getterResult.getClass(), namespace); - Object valueToMarshall = null; - if (getterResult instanceof JAXBElement){ - valueToMarshall = ((JAXBElement) getterResult).getValue(); - elementName = ((JAXBElement) getterResult).getName(); - } else{ - valueToMarshall = getterResult; - } - XNode marshelled = marshallValue(valueToMarshall, fieldTypeName, isAttribute, ctx); - if (!getter.getReturnType().equals(valueToMarshall.getClass()) && getter.getReturnType().isAssignableFrom(valueToMarshall.getClass())){ - if (prismContext != null) { - PrismObjectDefinition def = prismContext.getSchemaRegistry().determineDefinitionFromClass(valueToMarshall.getClass()); - if (def != null){ - QName type = def.getTypeName(); - marshelled.setTypeQName(type); - marshelled.setExplicitTypeDeclaration(true); - } - } - } - xmap.put(elementName, marshelled); - -// setExplicitTypeDeclarationIfNeeded(getter, valueToMarshall, xmap, fieldTypeName); - } - } - - return xmap; - } - - private XNode marshalXmlAsStringType(XmlAsStringType bean) { - PrimitiveXNode xprim = new PrimitiveXNode<>(); - xprim.setValue(bean.getContentAsString(), DOMUtil.XSD_STRING); - return xprim; - } - public void revive(Object bean, final PrismContext prismContext) throws SchemaException { - Handler visitor = new Handler() { - @Override - public boolean handle(Object o) { - if (o instanceof Revivable) { - try { - ((Revivable)o).revive(prismContext); - } catch (SchemaException e) { - throw new TunnelException(e); - } - } - return true; - } - }; - try { - visit(bean,visitor); - } catch (TunnelException te) { - SchemaException e = (SchemaException) te.getCause(); - throw e; - } - } - public void visit(Object bean, Handler handler) { if (bean == null) { return; @@ -1071,90 +824,6 @@ private void visitValue(Object element, Handler handler) { visit(elementToMarshall, handler); } - private void setExplicitTypeDeclarationIfNeeded(Method getter, Object getterResult, XNode xmap, QName fieldTypeName){ - Class getterReturnType = getter.getReturnType(); - Class getterType = null; - if (Collection.class.isAssignableFrom(getterReturnType)){ - Type genericReturnType = getter.getGenericReturnType(); - if (genericReturnType instanceof ParameterizedType){ - Type actualType = getTypeArgument(genericReturnType, "explicit type declaration"); - - if (actualType instanceof Class){ - getterType = (Class) actualType; - } - } - } - if (getterType == null){ - getterType = getterReturnType; - } - Class getterResultReturnType = getterResult.getClass(); - if (getterType != getterResultReturnType && getterType.isAssignableFrom(getterResultReturnType)){ - xmap.setExplicitTypeDeclaration(true); - xmap.setTypeQName(fieldTypeName); - } - } - - private XNode marshallValue(T value, QName fieldTypeName, boolean isAttribute, SerializationContext ctx) throws SchemaException { - if (value == null) { - return null; - } - if (canProcess(value.getClass())) { - // This must be a bean - return marshall(value, ctx); - } else { - // primitive value - return createPrimitiveXNode(value, fieldTypeName, isAttribute); - } - } - - private PrimitiveXNode createPrimitiveXNode(T value, QName fieldTypeName, boolean isAttribute){ - PrimitiveXNode xprim = new PrimitiveXNode(); - xprim.setValue(value, fieldTypeName); - xprim.setAttribute(isAttribute); - return xprim; - } - - private PrimitiveXNode createPrimitiveXNode(T val, QName type) { - return createPrimitiveXNode(val, type, false); - } - - private XNode marshalRawValue(RawType value) throws SchemaException { - return value.serializeToXNode(); - } - - private XNode marshalItemPathType(ItemPathType itemPath) { - PrimitiveXNode xprim = new PrimitiveXNode(); - if (itemPath != null){ - ItemPath path = itemPath.getItemPath(); - xprim.setValue(path, ItemPathType.COMPLEX_TYPE); - } - return xprim; - } - - private XNode marshalSchemaDefinition(SchemaDefinitionType schemaDefinitionType) { - SchemaXNode xschema = new SchemaXNode(); - xschema.setSchemaElement(schemaDefinitionType.getSchema()); - MapXNode xmap = new MapXNode(); - xmap.put(DOMUtil.XSD_SCHEMA_ELEMENT, xschema); - return xmap; - } - - // TODO create more appropriate interface to be able to simply serialize ProtectedStringType instances - public MapXNode marshalProtectedDataType(ProtectedDataType protectedType) throws SchemaException { - MapXNode xmap = new MapXNode(); - if (protectedType.getEncryptedDataType() != null) { - EncryptedDataType encryptedDataType = protectedType.getEncryptedDataType(); - MapXNode xEncryptedDataType = (MapXNode) marshall(encryptedDataType); - xmap.put(ProtectedDataType.F_ENCRYPTED_DATA, xEncryptedDataType); - } else if (protectedType.getClearValue() != null){ - QName type = XsdTypeMapper.toXsdType(protectedType.getClearValue().getClass()); - PrimitiveXNode xClearValue = createPrimitiveXNode(protectedType.getClearValue(), type); - xmap.put(ProtectedDataType.F_CLEAR_VALUE, xClearValue); - } - // TODO: clearValue - return xmap; - } - private PolyString unmarshalPolyString(MapXNode xmap) throws SchemaException { String orig = xmap.getParsedPrimitiveValue(QNameUtil.nullNamespace(PolyString.F_ORIG), DOMUtil.XSD_STRING); if (orig == null) { @@ -1196,5 +865,11 @@ public SchemaDefinitionType unmarshalSchemaDefinitionType(SchemaXNode xsub) thro return schemaDefType; } + public boolean canProcess(QName typeName) { + return ((PrismContextImpl) getPrismContext()).getBeanMarshaller().canProcess(typeName); + } + public boolean canProcess(Class clazz) { + return ((PrismContextImpl) getPrismContext()).getBeanMarshaller().canProcess(clazz); + } } \ No newline at end of file diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismBeanInspector.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismBeanInspector.java index 935a569e96b..a3a086b173b 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismBeanInspector.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismBeanInspector.java @@ -357,11 +357,11 @@ private String determineNamespaceUncached(Class beanClass) { } String namespace = xmlType.namespace(); - if (namespace == null || PrismBeanConverter.DEFAULT_PLACEHOLDER.equals(namespace)) { + if (namespace == null || BeanMarshaller.DEFAULT_PLACEHOLDER.equals(namespace)) { XmlSchema xmlSchema = beanClass.getPackage().getAnnotation(XmlSchema.class); namespace = xmlSchema.namespace(); } - if (StringUtils.isBlank(namespace) || PrismBeanConverter.DEFAULT_PLACEHOLDER.equals(namespace)) { + if (StringUtils.isBlank(namespace) || BeanMarshaller.DEFAULT_PLACEHOLDER.equals(namespace)) { return null; } @@ -375,11 +375,11 @@ private QName determineTypeForClassUncached(Class beanClass) { } String namespace = xmlType.namespace(); - if (PrismBeanConverter.DEFAULT_PLACEHOLDER.equals(namespace)) { + if (BeanMarshaller.DEFAULT_PLACEHOLDER.equals(namespace)) { XmlSchema xmlSchema = beanClass.getPackage().getAnnotation(XmlSchema.class); namespace = xmlSchema.namespace(); } - if (StringUtils.isBlank(namespace) || PrismBeanConverter.DEFAULT_PLACEHOLDER.equals(namespace)) { + if (StringUtils.isBlank(namespace) || BeanMarshaller.DEFAULT_PLACEHOLDER.equals(namespace)) { return null; } @@ -614,7 +614,7 @@ private QName findFieldTypeNameUncached(Field field, Class fieldType, String sch String propTypeLocalPart = xmlType.name(); if (propTypeLocalPart != null) { String propTypeNamespace = xmlType.namespace(); - if (propTypeNamespace == null || propTypeNamespace.equals(PrismBeanConverter.DEFAULT_PLACEHOLDER)) { + if (propTypeNamespace == null || propTypeNamespace.equals(BeanMarshaller.DEFAULT_PLACEHOLDER)) { if (prismContext != null) { // hopefully this is always the case! PrismSchema schema = prismContext.getSchemaRegistry().findSchemaByCompileTimeClass(fieldType); if (schema != null && schema.getNamespace() != null) { @@ -647,11 +647,11 @@ private QName findFieldElementQNameUncached(String fieldName, Class beanClass, S XmlElement xmlElement = field.getAnnotation(XmlElement.class); if (xmlElement != null) { String name = xmlElement.name(); - if (name != null && !PrismBeanConverter.DEFAULT_PLACEHOLDER.equals(name)) { + if (name != null && !BeanMarshaller.DEFAULT_PLACEHOLDER.equals(name)) { realLocalName = name; } String namespace = xmlElement.namespace(); - if (namespace != null && !PrismBeanConverter.DEFAULT_PLACEHOLDER.equals(namespace)) { + if (namespace != null && !BeanMarshaller.DEFAULT_PLACEHOLDER.equals(namespace)) { realNamespace = namespace; } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismMarshaller.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismMarshaller.java index be735fbf394..8424e500a6c 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismMarshaller.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismMarshaller.java @@ -21,7 +21,6 @@ import javax.xml.namespace.QName; import com.evolveum.midpoint.prism.*; -import com.evolveum.midpoint.prism.schema.GlobalDefinitionsStore; import com.evolveum.midpoint.prism.schema.SchemaRegistry; import com.evolveum.midpoint.util.JAXBUtil; import com.evolveum.prism.xml.ns._public.query_3.SearchFilterType; @@ -48,9 +47,9 @@ */ public class PrismMarshaller { - @NotNull private final PrismBeanConverter beanConverter; + @NotNull private final BeanMarshaller beanConverter; - public PrismMarshaller(@NotNull PrismBeanConverter beanConverter) { + public PrismMarshaller(@NotNull BeanMarshaller beanConverter) { this.beanConverter = beanConverter; } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismParserImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismParserImpl.java index 5cab81b3e20..ed29354b102 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismParserImpl.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismParserImpl.java @@ -235,8 +235,8 @@ private T doParseRealValue(Class clazz, RootXNode root) throws IOExceptio } // although bean unmarshaller can process containerables as well, prism unmarshaller is better at it - if (clazz != null && !Containerable.class.isAssignableFrom(clazz) && getBeanConverter().canProcess(clazz)) { - return getBeanConverter().unmarshall(root, clazz, context); + if (clazz != null && !Containerable.class.isAssignableFrom(clazz) && getBeanUnmarshaller().canProcess(clazz)) { + return getBeanUnmarshaller().unmarshall(root, clazz, context); } else if (clazz != null && Objectable.class.isAssignableFrom(clazz)) { // we need to NOT strip off OID PrismObject object = (PrismObject) doParseItem(root, clazz); @@ -251,8 +251,8 @@ private T doParseRealValue(Class clazz, RootXNode root) throws IOExceptio } } - private PrismBeanConverter getBeanConverter() { - return prismContext.getBeanConverter(); + private BeanUnmarshaller getBeanUnmarshaller() { + return prismContext.getBeanUnmarshaller(); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismUnmarshaller.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismUnmarshaller.java index 8e73ff39812..8b1e8342986 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismUnmarshaller.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismUnmarshaller.java @@ -125,7 +125,7 @@ Object parseItemOrRealValue(@NotNull RootXNode root, ParsingContext pc) throws S if (itemDefinition != null) { return parseItem(root, itemDefinition, null, null, null, pc); } else { - return getBeanConverter().unmarshall(root, getSchemaRegistry().determineCompileTimeClass(typeName), pc); + return getBeanUnmarshaller().unmarshall(root, getSchemaRegistry().determineCompileTimeClass(typeName), pc); } } else { // if type name is not known, we have to derive it from the element name @@ -312,7 +312,7 @@ private PrismProperty parseProperty(@NotNull XNode node, @NotNull QName i property.add(pval); } } else if (node instanceof SchemaXNode) { - SchemaDefinitionType schemaDefType = getBeanConverter().unmarshalSchemaDefinitionType((SchemaXNode) node); + SchemaDefinitionType schemaDefType = getBeanUnmarshaller().unmarshalSchemaDefinitionType((SchemaXNode) node); @SuppressWarnings("unchecked") PrismPropertyValue val = new PrismPropertyValue(schemaDefType); property.add(val); @@ -340,8 +340,8 @@ private PrismPropertyValue parsePropertyValue(@NotNull XNode node, return null; } } else if (node instanceof MapXNode) { - if (getBeanConverter().canProcess(node.getTypeQName())) { - T value = getBeanConverter().unmarshall((MapXNode) node, node.getTypeQName(), pc); + if (getBeanUnmarshaller().canProcess(node.getTypeQName())) { + T value = getBeanUnmarshaller().unmarshall((MapXNode) node, node.getTypeQName(), pc); if (value instanceof Containerable) { throw new IllegalStateException("Cannot store containerable into prism property: " + node.debugDump()); } else { @@ -374,9 +374,9 @@ private T parsePropertyRealValueFromPrimitive(@NotNull PrimitiveXNode pri QName typeName = definition.getTypeName(); T realValue; - if (getBeanConverter().canProcess(typeName)) { + if (getBeanUnmarshaller().canProcess(typeName)) { // Primitive elements may also have complex Java representations (e.g. enums) - realValue = getBeanConverter().unmarshallPrimitive(primitiveNode, typeName, pc); + realValue = getBeanUnmarshaller().unmarshallPrimitive(primitiveNode, typeName, pc); } else if (!DOMUtil.XSD_ANYTYPE.equals(typeName)) { try { realValue = primitiveNode.getParsedValue(typeName, pc.getEvaluationMode()); @@ -412,8 +412,8 @@ private T parsePropertyRealValueFromMap(@NotNull MapXNode xmap, @NotNull Pri @NotNull ParsingContext pc) throws SchemaException { QName typeName = propertyDefinition.getTypeName(); - if (getBeanConverter().canProcess(typeName)) { - return getBeanConverter().unmarshall(xmap, typeName, pc); + if (getBeanUnmarshaller().canProcess(typeName)) { + return getBeanUnmarshaller().unmarshall(xmap, typeName, pc); } else { if (propertyDefinition.isRuntimeSchema()) { throw new SchemaException("Complex run-time properties are not supported: type " + typeName + " from " + xmap); @@ -535,7 +535,7 @@ private PrismReferenceValue parseReferenceValueAsReference(@NotNull XNode xnode, XNode xnodeForTargetName = map.get(XNode.KEY_REFERENCE_TARGET_NAME); if (xnodeForTargetName != null) { - PolyStringType targetName = getBeanConverter().unmarshall(xnodeForTargetName, PolyStringType.class, pc); + PolyStringType targetName = getBeanUnmarshaller().unmarshall(xnodeForTargetName, PolyStringType.class, pc); refVal.setTargetName(targetName); } @@ -662,8 +662,8 @@ private ItemDefinition resolveDynamicItemDefinition(QName itemName, XNode node) //endregion - private PrismBeanConverter getBeanConverter() { - return ((PrismContextImpl) prismContext).getBeanConverter(); + private BeanUnmarshaller getBeanUnmarshaller() { + return ((PrismContextImpl) prismContext).getBeanUnmarshaller(); } private SchemaRegistry getSchemaRegistry() { diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/QueryConvertor.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/QueryConvertor.java index 51b37d7d99f..e7769dfa9ba 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/QueryConvertor.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/QueryConvertor.java @@ -880,7 +880,7 @@ private static void serializePath(MapXNode map, ItemPath path, ObjectFilter filt map.put(ELEMENT_PATH, createPrimitiveXNode(path, ItemPath.XSD_TYPE)); } - private static XNode serializePropertyValue(PrismPropertyValue value, PrismPropertyDefinition definition, PrismBeanConverter beanConverter) throws SchemaException { + private static XNode serializePropertyValue(PrismPropertyValue value, PrismPropertyDefinition definition, BeanMarshaller beanConverter) throws SchemaException { QName typeQName = definition.getTypeName(); T realValue = value.getValue(); if (beanConverter.canProcess(typeQName)) { diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistryImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistryImpl.java index 6a2310a4c18..cdbf99bc672 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistryImpl.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistryImpl.java @@ -1202,7 +1202,7 @@ public QName determineTypeForClass(Class clazz) { if (XmlTypeConverter.canConvert(clazz)) { return XsdTypeMapper.toXsdType(clazz); } else { - return ((PrismContextImpl) prismContext).getBeanConverter().determineTypeForClass(clazz); + return ((PrismContextImpl) prismContext).getBeanMarshaller().determineTypeForClass(clazz); } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/PrismUtil.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/PrismUtil.java index eeefa5bc1e9..6f751ccb70d 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/PrismUtil.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/PrismUtil.java @@ -18,7 +18,6 @@ import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.delta.ItemDelta; import com.evolveum.midpoint.prism.lex.dom.DomLexicalProcessor; -import com.evolveum.midpoint.prism.marshaller.PrismBeanConverter; import com.evolveum.midpoint.prism.marshaller.PrismUnmarshaller; import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.prism.polystring.PolyStringNormalizer; diff --git a/infra/prism/src/test/java/com/evolveum/midpoint/prism/lex/TestProtectedString.java b/infra/prism/src/test/java/com/evolveum/midpoint/prism/lex/TestProtectedString.java index 0600d3ec6ab..d2e0cca94f3 100644 --- a/infra/prism/src/test/java/com/evolveum/midpoint/prism/lex/TestProtectedString.java +++ b/infra/prism/src/test/java/com/evolveum/midpoint/prism/lex/TestProtectedString.java @@ -64,7 +64,7 @@ public void testParseProtectedString() throws Exception { // WHEN - MapXNode protectedStringTypeXNode = ((PrismContextImpl) prismContext).getBeanConverter().marshalProtectedDataType(protectedStringType); + MapXNode protectedStringTypeXNode = ((PrismContextImpl) prismContext).getBeanMarshaller().marshalProtectedDataType(protectedStringType); System.out.println("Protected string type XNode: " + protectedStringTypeXNode.debugDump()); // THEN diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/MiscSchemaUtil.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/MiscSchemaUtil.java index 6eaf6eb6c8b..2821fe59478 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/MiscSchemaUtil.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/MiscSchemaUtil.java @@ -28,7 +28,7 @@ import javax.xml.soap.Detail; import com.evolveum.midpoint.prism.*; -import com.evolveum.midpoint.prism.marshaller.PrismBeanConverter; +import com.evolveum.midpoint.prism.marshaller.BeanMarshaller; import com.evolveum.midpoint.prism.xnode.RootXNode; import com.evolveum.midpoint.prism.xnode.XNode; import com.evolveum.midpoint.schema.RetrieveOption; @@ -387,11 +387,11 @@ public static XMLGregorianCalendar getChangeTimestamp(MetadataType metadata) { // TODO some better place public static void serializeFaultMessage(Detail detail, FaultMessage faultMessage, PrismContext prismContext, Trace logger) { try { - PrismBeanConverter beanConverter = ((PrismContextImpl) prismContext).getBeanConverter(); - XNode faultMessageXnode = beanConverter.marshall(faultMessage.getFaultInfo()); // TODO + BeanMarshaller marshaller = ((PrismContextImpl) prismContext).getBeanMarshaller(); + XNode faultMessageXnode = marshaller.marshall(faultMessage.getFaultInfo()); // TODO RootXNode xroot = new RootXNode(SchemaConstants.FAULT_MESSAGE_ELEMENT_NAME, faultMessageXnode); xroot.setExplicitTypeDeclaration(true); - QName faultType = beanConverter.determineTypeForClass(faultMessage.getFaultInfo().getClass()); + QName faultType = marshaller.determineTypeForClass(faultMessage.getFaultInfo().getClass()); xroot.setTypeQName(faultType); ((PrismContextImpl) prismContext).getParserDom().serializeUnderElement(xroot, SchemaConstants.FAULT_MESSAGE_ELEMENT_NAME, detail); } catch (SchemaException e) { diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestDeltaConverter.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestDeltaConverter.java index 092781da045..313d5655a51 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestDeltaConverter.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestDeltaConverter.java @@ -48,7 +48,6 @@ import org.testng.annotations.Test; import java.io.File; -import java.io.FileNotFoundException; import java.io.IOException; import java.util.Collection; import java.util.HashMap; @@ -57,7 +56,6 @@ import javax.xml.bind.JAXBElement; import javax.xml.bind.JAXBException; -import javax.xml.bind.Marshaller; import javax.xml.namespace.QName; import static org.testng.AssertJUnit.assertEquals; @@ -220,7 +218,7 @@ public void testAccountRefDelta() throws Exception { ObjectReferenceType accountRefToDelete = new ObjectReferenceType(); accountRefToDelete.setOid("54321"); PrismContext prismContext = PrismTestUtil.getPrismContext(); - RawType modificationValue = new RawType(((PrismContextImpl) prismContext).getBeanConverter().marshall(accountRefToDelete), prismContext); + RawType modificationValue = new RawType(((PrismContextImpl) prismContext).getBeanMarshaller().marshall(accountRefToDelete), prismContext); modificationDeleteAccountRef.getValue().add(modificationValue); objectChange.getItemDelta().add(modificationDeleteAccountRef); ItemPathType itemPathType = new ItemPathType(new ItemPath(UserType.F_LINK_REF)); diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestJaxbParsing.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestJaxbParsing.java index 50a1d7aeb64..99cae954bbd 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestJaxbParsing.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestJaxbParsing.java @@ -42,7 +42,6 @@ import com.evolveum.prism.xml.ns._public.types_3.ProtectedStringType; import com.evolveum.prism.xml.ns._public.types_3.RawType; -import org.testng.AssertJUnit; import org.testng.annotations.BeforeSuite; import org.testng.annotations.Test; import org.w3c.dom.Document; @@ -215,7 +214,7 @@ public void testMarshallObjectDeltaType() throws Exception { item1.setPath(new ItemPathType(path)); ProtectedStringType protectedString = new ProtectedStringType(); protectedString.setEncryptedData(new EncryptedDataType()); - RawType value = new RawType(((PrismContextImpl) PrismTestUtil.getPrismContext()).getBeanConverter().marshall(protectedString), PrismTestUtil.getPrismContext()); + RawType value = new RawType(((PrismContextImpl) PrismTestUtil.getPrismContext()).getBeanMarshaller().marshall(protectedString), PrismTestUtil.getPrismContext()); item1.getValue().add(value); String xml = PrismTestUtil.serializeJaxbElementToString( diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseDiffPatch.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseDiffPatch.java index 55b1b940f76..d72bf9b7052 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseDiffPatch.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseDiffPatch.java @@ -655,7 +655,7 @@ public void testResourceNsFixUndeclaredPrefixes() throws SchemaException, SAXExc * * MidPoint uses an approximation there - it compares XNode serializations of values. Sometimes they match, * sometimes they do not. In this particular case they fail to match on serialization of c:ObjectReferenceType, - * because PrismBeanConverter is used, and ObjectReferenceType.getFilter() returns empty filter instead of null. + * because BeanMarshaller is used, and ObjectReferenceType.getFilter() returns empty filter instead of null. * This could be fixed; however, it would not help much, because it is almost sure that other similar problems * would sooner or later emerge. */ diff --git a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/ucf/TestUcfOpenDj.java b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/ucf/TestUcfOpenDj.java index d6b38b36386..173e0e77090 100644 --- a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/ucf/TestUcfOpenDj.java +++ b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/ucf/TestUcfOpenDj.java @@ -67,7 +67,6 @@ import javax.xml.namespace.QName; import java.io.File; -import java.io.FileInputStream; import java.io.IOException; import java.util.Collection; import java.util.HashSet; @@ -744,7 +743,7 @@ public void test610ChangePassword() throws Exception { propMod.setPath(path); //set the replace value - MapXNode passPsXnode = ((PrismContextImpl) prismContext).getBeanConverter().marshalProtectedDataType(passPs); + MapXNode passPsXnode = ((PrismContextImpl) prismContext).getBeanMarshaller().marshalProtectedDataType(passPs); RawType value = new RawType(passPsXnode, prismContext); propMod.getValue().add(value); diff --git a/testing/sanity/src/test/java/com/evolveum/midpoint/testing/sanity/TestSanity.java b/testing/sanity/src/test/java/com/evolveum/midpoint/testing/sanity/TestSanity.java index 10c4473f3a6..a433f77b088 100644 --- a/testing/sanity/src/test/java/com/evolveum/midpoint/testing/sanity/TestSanity.java +++ b/testing/sanity/src/test/java/com/evolveum/midpoint/testing/sanity/TestSanity.java @@ -1490,7 +1490,7 @@ public void test023ChangeUserPasswordJAXB() throws Exception { passwordDelta.setPath(ModelClientUtil.createItemPathType("credentials/password/value")); ProtectedStringType pass = new ProtectedStringType(); pass.setClearValue(NEW_PASSWORD); - XNode passValue = ((PrismContextImpl) prismContext).getBeanConverter().marshall(pass); + XNode passValue = ((PrismContextImpl) prismContext).getBeanMarshaller().marshall(pass); System.out.println("PASSWORD VALUE: " + passValue.debugDump()); RawType passwordValue = new RawType(passValue, prismContext); passwordDelta.getValue().add(passwordValue); @@ -1879,7 +1879,7 @@ public void test040UnlinkDerbyAccountFromUser() throws FileNotFoundException, JA modificationDeleteAccountRef.setModificationType(ModificationTypeType.DELETE); ObjectReferenceType accountRefToDelete = new ObjectReferenceType(); accountRefToDelete.setOid(accountShadowOidDerby); - RawType modificationValue = new RawType(((PrismContextImpl) prismContext).getBeanConverter().marshall(accountRefToDelete), prismContext); + RawType modificationValue = new RawType(((PrismContextImpl) prismContext).getBeanMarshaller().marshall(accountRefToDelete), prismContext); modificationDeleteAccountRef.getValue().add(modificationValue); modificationDeleteAccountRef.setPath(new ItemPathType(new ItemPath(UserType.F_LINK_REF))); objectChange.getItemDelta().add(modificationDeleteAccountRef); @@ -3909,7 +3909,7 @@ public void test502NotifyChangeModifyAccountPassword() throws Exception{ ItemDeltaType passwordDelta = new ItemDeltaType(); passwordDelta.setModificationType(ModificationTypeType.REPLACE); passwordDelta.setPath(ModelClientUtil.createItemPathType("credentials/password/value")); - RawType passwordValue = new RawType(((PrismContextImpl) prismContext).getBeanConverter().marshall(ModelClientUtil.createProtectedString(newPassword)), prismContext); + RawType passwordValue = new RawType(((PrismContextImpl) prismContext).getBeanMarshaller().marshall(ModelClientUtil.createProtectedString(newPassword)), prismContext); passwordDelta.getValue().add(passwordValue); delta.getItemDelta().add(passwordDelta); diff --git a/testing/sanity/src/test/java/com/evolveum/midpoint/testing/sanity/TestSanityLegacy.java b/testing/sanity/src/test/java/com/evolveum/midpoint/testing/sanity/TestSanityLegacy.java index 654f07c8e0d..921a1dd53d2 100644 --- a/testing/sanity/src/test/java/com/evolveum/midpoint/testing/sanity/TestSanityLegacy.java +++ b/testing/sanity/src/test/java/com/evolveum/midpoint/testing/sanity/TestSanityLegacy.java @@ -1245,7 +1245,7 @@ public void test023ChangeUserPasswordJAXB() throws Exception { passwordDelta.setPath(ModelClientUtil.createItemPathType("credentials/password/value")); ProtectedStringType pass = new ProtectedStringType(); pass.setClearValue(NEW_PASSWORD); - XNode passValue = ((PrismContextImpl) prismContext).getBeanConverter().marshall(pass); + XNode passValue = ((PrismContextImpl) prismContext).getBeanMarshaller().marshall(pass); System.out.println("PASSWORD VALUE: " + passValue.debugDump()); RawType passwordValue = new RawType(passValue, prismContext); passwordDelta.getValue().add(passwordValue); @@ -3573,7 +3573,7 @@ public void test502NotifyChangeModifyAccountPassword() throws Exception{ ItemDeltaType passwordDelta = new ItemDeltaType(); passwordDelta.setModificationType(ModificationTypeType.REPLACE); passwordDelta.setPath(ModelClientUtil.createItemPathType("credentials/password/value")); - RawType passwordValue = new RawType(((PrismContextImpl) prismContext).getBeanConverter().marshall(ModelClientUtil.createProtectedString(newPassword)), prismContext); + RawType passwordValue = new RawType(((PrismContextImpl) prismContext).getBeanMarshaller().marshall(ModelClientUtil.createProtectedString(newPassword)), prismContext); passwordDelta.getValue().add(passwordValue); // ItemDeltaType mod1 = new ItemDeltaType(); From 29060664e80b9c811b58b0be12b2da173776dea5 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Tue, 25 Oct 2016 17:56:50 +0200 Subject: [PATCH 55/74] Interim commit. --- .../prism/marshaller/BeanUnmarshaller.java | 177 +++++++++--------- .../prism/marshaller/PrismParserImpl.java | 2 +- .../prism/marshaller/PrismUnmarshaller.java | 10 +- 3 files changed, 93 insertions(+), 96 deletions(-) diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/BeanUnmarshaller.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/BeanUnmarshaller.java index 435064d2471..2e43c38365b 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/BeanUnmarshaller.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/BeanUnmarshaller.java @@ -28,7 +28,6 @@ import com.evolveum.midpoint.util.QNameUtil; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.util.exception.SystemException; -import com.evolveum.midpoint.util.exception.TunnelException; import com.evolveum.midpoint.util.logging.LoggingUtils; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; @@ -36,6 +35,7 @@ import com.evolveum.prism.xml.ns._public.types_3.*; import org.apache.commons.lang.StringUtils; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.w3c.dom.Element; import javax.xml.bind.JAXBElement; @@ -45,15 +45,19 @@ import java.util.*; import java.util.Map.Entry; +/** + * Analogous to PrismUnmarshaller, this class unmarshals atomic values from XNode tree structures. + * Atomic values are values that can be used as property values (i.e. either simple types, or + * beans that are not containerables). + */ public class BeanUnmarshaller { private static final Trace LOGGER = TraceManager.getTrace(BeanUnmarshaller.class); - private PrismBeanInspector inspector; - + @NotNull private final PrismBeanInspector inspector; @NotNull private final PrismContext prismContext; - public BeanUnmarshaller(@NotNull PrismContext prismContext, PrismBeanInspector inspector) { + public BeanUnmarshaller(@NotNull PrismContext prismContext, @NotNull PrismBeanInspector inspector) { this.prismContext = prismContext; this.inspector = inspector; } @@ -63,94 +67,83 @@ public PrismContext getPrismContext() { return prismContext; } + @NotNull private SchemaRegistry getSchemaRegistry() { return prismContext.getSchemaRegistry(); } - public QName determineTypeForClass(Class clazz) { - return inspector.determineTypeForClass(clazz); - } - public T unmarshall(MapXNode xnode, QName typeQName, ParsingContext pc) throws SchemaException { - Class classType = getSchemaRegistry().determineCompileTimeClass(typeQName); - return unmarshall(xnode, classType, pc); + T unmarshal(@NotNull XNode xnode, @NotNull QName typeQName, @NotNull ParsingContext pc) throws SchemaException { + Class classType = getSchemaRegistry().determineCompileTimeClass(typeQName); // TODO use correct method! + return unmarshal(xnode, classType, pc); } - public T unmarshall(XNode xnode, Class beanClass, ParsingContext pc) throws SchemaException{ - if (xnode instanceof PrimitiveXNode){ - return unmarshallPrimitive((PrimitiveXNode) xnode, beanClass, pc); - } else if (xnode instanceof MapXNode){ - return unmarshall((MapXNode) xnode, beanClass, pc); - } else if (xnode instanceof RootXNode){ - return unmarshall(((RootXNode) xnode).getSubnode(), beanClass, pc); - } else - throw new IllegalStateException("Unexpected xnode " + xnode +". Could not unmarshall value"); + T unmarshal(@NotNull XNode xnode, @NotNull Class beanClass, @NotNull ParsingContext pc) throws SchemaException { + + + + if (xnode instanceof PrimitiveXNode) { + return unmarshalFromPrimitive((PrimitiveXNode) xnode, beanClass, pc); + } else if (xnode instanceof MapXNode) { + return unmarshalFromMap((MapXNode) xnode, beanClass, pc); + } else if (xnode instanceof RootXNode) { + return unmarshal(((RootXNode) xnode).getSubnode(), beanClass, pc); + } else { + throw new IllegalStateException("Unexpected xnode " + xnode + ". Could not unmarshal value"); + } } - public T unmarshall(MapXNode xnode, Class beanClass, ParsingContext pc) throws SchemaException { - - if (PolyStringType.class.equals(beanClass)) { - PolyString polyString = unmarshalPolyString(xnode); - return (T) polyString; // violates the method interface but ... TODO fix it - } else if (ProtectedStringType.class.equals(beanClass)) { - ProtectedStringType protectedType = new ProtectedStringType(); - XNodeProcessorUtil.parseProtectedType(protectedType, xnode, prismContext, pc); - return (T) protectedType; - } else if (ProtectedByteArrayType.class.equals(beanClass)) { - ProtectedByteArrayType protectedType = new ProtectedByteArrayType(); - XNodeProcessorUtil.parseProtectedType(protectedType, xnode, prismContext, pc); - return (T) protectedType; - } else if (SchemaDefinitionType.class.equals(beanClass)) { - SchemaDefinitionType schemaDefType = unmarshalSchemaDefinitionType(xnode); - return (T) schemaDefType; - } else if (prismContext.getSchemaRegistry().determineDefinitionFromClass(beanClass) != null) { - PrismObjectDefinition def = prismContext.getSchemaRegistry().determineDefinitionFromClass(beanClass); - return (T) ((PrismContextImpl) prismContext).getPrismUnmarshaller().parseObject(xnode, def, pc).asObjectable(); + private T unmarshalFromMap(@NotNull MapXNode xmap, @NotNull Class beanClass, @NotNull ParsingContext pc) throws SchemaException { + if (PolyStringType.class.equals(beanClass)) { + return (T) PolyStringType.unmarshal(xmap); + } else if (ProtectedStringType.class.equals(beanClass)) { + return (T) ProtectedStringType.unmarshal(xmap); + ProtectedStringType protectedType = new ProtectedStringType(); + XNodeProcessorUtil.parseProtectedType(protectedType, xmap, prismContext, pc); + return (T) protectedType; + } else if (ProtectedByteArrayType.class.equals(beanClass)) { + ProtectedByteArrayType protectedType = new ProtectedByteArrayType(); + XNodeProcessorUtil.parseProtectedType(protectedType, xmap, prismContext, pc); + return (T) protectedType; + } else if (SchemaDefinitionType.class.equals(beanClass)) { + SchemaDefinitionType schemaDefType = unmarshalSchemaDefinitionType(xmap); + return (T) schemaDefType; + } else if (prismContext.getSchemaRegistry().determineDefinitionFromClass(beanClass) != null) { + PrismObjectDefinition def = prismContext.getSchemaRegistry().determineDefinitionFromClass(beanClass); + return (T) ((PrismContextImpl) prismContext).getPrismUnmarshaller().parseObject(xmap, def, pc).asObjectable(); } else if (XmlAsStringType.class.equals(beanClass)) { - // reading a string represented a XML-style content - // used e.g. when reading report templates (embedded XML) - // A necessary condition: there may be only one map entry. - if (xnode.size() > 1) { - throw new SchemaException("Map with more than one item cannot be parsed as a string: " + xnode); - } else if (xnode.isEmpty()) { - return (T) new XmlAsStringType(); - } else { - Entry entry = xnode.entrySet().iterator().next(); - DomLexicalProcessor domParser = ((PrismContextImpl) prismContext).getParserDom(); - String value = domParser.write(entry.getValue(), entry.getKey(), null); - return (T) new XmlAsStringType(value); - } - } - T bean; - Set keysToParse; // only these keys will be parsed (null if all) - if (SearchFilterType.class.isAssignableFrom(beanClass)) { - keysToParse = Collections.singleton("condition"); // TODO fix this BRUTAL HACK - it is here because of c:ConditionalSearchFilterType - bean = (T) unmarshalSearchFilterType(xnode, (Class) beanClass, pc); - } else { - keysToParse = null; - try { - bean = beanClass.newInstance(); - } catch (InstantiationException e) { - throw new SystemException("Cannot instantiate bean of type "+beanClass+": "+e.getMessage(), e); - } catch (IllegalAccessException e) { - throw new SystemException("Cannot instantiate bean of type "+beanClass+": "+e.getMessage(), e); - } - } - - if (ProtectedDataType.class.isAssignableFrom(beanClass)){ - ProtectedDataType protectedDataType = null; - if (bean instanceof ProtectedStringType){ - protectedDataType = new ProtectedStringType(); - } else if (bean instanceof ProtectedByteArrayType){ - protectedDataType = new ProtectedByteArrayType(); - } else{ - throw new SchemaException("Unexpected subtype of protected data type: " + bean.getClass()); + // reading a string represented a XML-style content + // used e.g. when reading report templates (embedded XML) + // A necessary condition: there may be only one map entry. + if (xmap.size() > 1) { + throw new SchemaException("Map with more than one item cannot be parsed as a string: " + xmap); + } else if (xmap.isEmpty()) { + return (T) new XmlAsStringType(); + } else { + Entry entry = xmap.entrySet().iterator().next(); + DomLexicalProcessor domParser = ((PrismContextImpl) prismContext).getParserDom(); + String value = domParser.write(entry.getValue(), entry.getKey(), null); + return (T) new XmlAsStringType(value); } - XNodeProcessorUtil.parseProtectedType(protectedDataType, xnode, prismContext, pc); - return (T) protectedDataType; - } + } else if (SearchFilterType.class.isAssignableFrom(beanClass)) { + T bean = (T) unmarshalSearchFilterType(xmap, (Class) beanClass, pc); + // TODO fix this BRUTAL HACK - it is here because of c:ConditionalSearchFilterType + return unmarshalFromMapToBean(bean, xmap, Collections.singleton("condition"), pc); + } else { + T bean; + try { + bean = beanClass.newInstance(); + } catch (InstantiationException | IllegalAccessException e) { + throw new SystemException("Cannot instantiate bean of type " + beanClass + ": " + e.getMessage(), e); + } + return unmarshalFromMapToBean(bean, xmap, null, pc); + } + } + + private T unmarshalFromMapToBean(@NotNull T bean, @NotNull MapXNode xmap, @Nullable Collection keysToParse, @NotNull ParsingContext pc) throws SchemaException { + Class beanClass = (Class) bean.getClass(); - for (Entry entry: xnode.entrySet()) { + for (Entry entry: xmap.entrySet()) { QName key = entry.getKey(); if (keysToParse != null && !keysToParse.contains(key.getLocalPart())) { continue; @@ -429,7 +422,7 @@ public T unmarshall(MapXNode xnode, Class beanClass, ParsingContext pc) t col.add(prepareValueToBeStored(propVal, wrapInJaxbElement, objectFactory, elementMethod, propName, beanClass, pc)); } } else if (!problem) { - throw new IllegalStateException("Strange. Multival property "+propName+" in "+beanClass+" produced null values list, parsed from "+xnode); + throw new IllegalStateException("Strange. Multival property "+propName+" in "+beanClass+" produced null values list, parsed from "+xmap); } checkJaxbElementConsistence(col, pc); } else { @@ -520,11 +513,11 @@ private void unmarshallToAny(T bean, Method getter, QName elementName, XNo if (xsubnode instanceof ListXNode){ for (XNode xsubSubNode : ((ListXNode) xsubnode)){ - S subBean = unmarshall(xsubSubNode, subBeanClass, pc); + S subBean = unmarshal(xsubSubNode, subBeanClass, pc); unmarshallToAnyValue(bean, beanClass, subBean, objectFactoryClass, objectFactory, elementFactoryMethod, getter, pc); } } else{ - S subBean = unmarshall(xsubnode, subBeanClass, pc); + S subBean = unmarshal(xsubnode, subBeanClass, pc); unmarshallToAnyValue(bean, beanClass, subBean, objectFactoryClass, objectFactory, elementFactoryMethod, getter, pc); } @@ -629,9 +622,9 @@ private Object convertSinglePropValue(XNode xsubnode, String fieldName, Class pa } } if (xsubnode instanceof PrimitiveXNode) { - propValue = unmarshallPrimitive(((PrimitiveXNode)xsubnode), paramType, pc); + propValue = unmarshalFromPrimitive(((PrimitiveXNode)xsubnode), paramType, pc); } else if (xsubnode instanceof MapXNode) { - propValue = unmarshall((MapXNode)xsubnode, paramType, pc); + propValue = unmarshalFromMap((MapXNode)xsubnode, paramType, pc); } else if (xsubnode instanceof ListXNode) { ListXNode xlist = (ListXNode)xsubnode; if (xlist.size() > 1) { @@ -650,12 +643,12 @@ private Object convertSinglePropValue(XNode xsubnode, String fieldName, Class pa return propValue; } - public T unmarshallPrimitive(PrimitiveXNode xprim, QName typeQName, ParsingContext pc) throws SchemaException { + public T unmarshalFromPrimitive(PrimitiveXNode xprim, QName typeQName, ParsingContext pc) throws SchemaException { Class classType = getSchemaRegistry().determineCompileTimeClass(typeQName); - return unmarshallPrimitive(xprim, classType, pc); + return unmarshalFromPrimitive(xprim, classType, pc); } - private T unmarshallPrimitive(PrimitiveXNode xprim, Class classType, ParsingContext pc) throws SchemaException { + private T unmarshalFromPrimitive(PrimitiveXNode xprim, Class classType, ParsingContext pc) throws SchemaException { if (XmlAsStringType.class.equals(classType)) { return (T) new XmlAsStringType((String) xprim.getParsedValue(DOMUtil.XSD_STRING)); } @@ -824,13 +817,13 @@ private void visitValue(Object element, Handler handler) { visit(elementToMarshall, handler); } - private PolyString unmarshalPolyString(MapXNode xmap) throws SchemaException { + private PolyStringType unmarshalPolyStringType(MapXNode xmap) throws SchemaException { String orig = xmap.getParsedPrimitiveValue(QNameUtil.nullNamespace(PolyString.F_ORIG), DOMUtil.XSD_STRING); if (orig == null) { throw new SchemaException("Null polystring orig in "+xmap); } String norm = xmap.getParsedPrimitiveValue(QNameUtil.nullNamespace(PolyString.F_NORM), DOMUtil.XSD_STRING); - return new PolyString(orig, norm); + return new PolyStringType(new PolyString(orig, norm)); } private SchemaDefinitionType unmarshalSchemaDefinitionType(MapXNode xmap) throws SchemaException { @@ -871,5 +864,9 @@ public boolean canProcess(QName typeName) { public boolean canProcess(Class clazz) { return ((PrismContextImpl) getPrismContext()).getBeanMarshaller().canProcess(clazz); } + public QName determineTypeForClass(Class clazz) { + return inspector.determineTypeForClass(clazz); + } + } \ No newline at end of file diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismParserImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismParserImpl.java index ed29354b102..f3ba8f3eb44 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismParserImpl.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismParserImpl.java @@ -236,7 +236,7 @@ private T doParseRealValue(Class clazz, RootXNode root) throws IOExceptio // although bean unmarshaller can process containerables as well, prism unmarshaller is better at it if (clazz != null && !Containerable.class.isAssignableFrom(clazz) && getBeanUnmarshaller().canProcess(clazz)) { - return getBeanUnmarshaller().unmarshall(root, clazz, context); + return getBeanUnmarshaller().unmarshal(root, clazz, context); } else if (clazz != null && Objectable.class.isAssignableFrom(clazz)) { // we need to NOT strip off OID PrismObject object = (PrismObject) doParseItem(root, clazz); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismUnmarshaller.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismUnmarshaller.java index 8b1e8342986..6f9a06caad2 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismUnmarshaller.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismUnmarshaller.java @@ -125,7 +125,7 @@ Object parseItemOrRealValue(@NotNull RootXNode root, ParsingContext pc) throws S if (itemDefinition != null) { return parseItem(root, itemDefinition, null, null, null, pc); } else { - return getBeanUnmarshaller().unmarshall(root, getSchemaRegistry().determineCompileTimeClass(typeName), pc); + return getBeanUnmarshaller().unmarshal(root, getSchemaRegistry().determineCompileTimeClass(typeName), pc); } } else { // if type name is not known, we have to derive it from the element name @@ -341,7 +341,7 @@ private PrismPropertyValue parsePropertyValue(@NotNull XNode node, } } else if (node instanceof MapXNode) { if (getBeanUnmarshaller().canProcess(node.getTypeQName())) { - T value = getBeanUnmarshaller().unmarshall((MapXNode) node, node.getTypeQName(), pc); + T value = getBeanUnmarshaller().unmarshal((MapXNode) node, node.getTypeQName(), pc); if (value instanceof Containerable) { throw new IllegalStateException("Cannot store containerable into prism property: " + node.debugDump()); } else { @@ -376,7 +376,7 @@ private T parsePropertyRealValueFromPrimitive(@NotNull PrimitiveXNode pri T realValue; if (getBeanUnmarshaller().canProcess(typeName)) { // Primitive elements may also have complex Java representations (e.g. enums) - realValue = getBeanUnmarshaller().unmarshallPrimitive(primitiveNode, typeName, pc); + realValue = getBeanUnmarshaller().unmarshalFromPrimitive(primitiveNode, typeName, pc); } else if (!DOMUtil.XSD_ANYTYPE.equals(typeName)) { try { realValue = primitiveNode.getParsedValue(typeName, pc.getEvaluationMode()); @@ -413,7 +413,7 @@ private T parsePropertyRealValueFromMap(@NotNull MapXNode xmap, @NotNull Pri throws SchemaException { QName typeName = propertyDefinition.getTypeName(); if (getBeanUnmarshaller().canProcess(typeName)) { - return getBeanUnmarshaller().unmarshall(xmap, typeName, pc); + return getBeanUnmarshaller().unmarshal(xmap, typeName, pc); } else { if (propertyDefinition.isRuntimeSchema()) { throw new SchemaException("Complex run-time properties are not supported: type " + typeName + " from " + xmap); @@ -535,7 +535,7 @@ private PrismReferenceValue parseReferenceValueAsReference(@NotNull XNode xnode, XNode xnodeForTargetName = map.get(XNode.KEY_REFERENCE_TARGET_NAME); if (xnodeForTargetName != null) { - PolyStringType targetName = getBeanUnmarshaller().unmarshall(xnodeForTargetName, PolyStringType.class, pc); + PolyStringType targetName = getBeanUnmarshaller().unmarshal(xnodeForTargetName, PolyStringType.class, pc); refVal.setTargetName(targetName); } From b3f248c85abf19f6453008f15f8f5776472519f3 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Wed, 26 Oct 2016 12:49:37 +0200 Subject: [PATCH 56/74] Partially refactored BeanMarshaller. A couple of fixes (prism and schema pass). --- .../midpoint/prism/PrismContextImpl.java | 2 +- .../prism/lex/dom/DomLexicalProcessor.java | 8 +- .../prism/lex/dom/DomLexicalWriter.java | 12 +- .../prism/lex/json/ItemPathSerializer.java | 4 +- .../lex/json/ItemPathTypeSerializer.java | 44 + .../prism/lex/json/JsonLexicalProcessor.java | 2 + ...va => XmlGregorianCalendarSerializer.java} | 2 +- .../prism/lex/json/YamlLexicalProcessor.java | 15 +- .../lex/json/yaml/MidpointYAMLFactory.java | 2 + .../prism/marshaller/BeanMarshaller.java | 248 ++-- .../prism/marshaller/BeanUnmarshaller.java | 1155 +++++++++-------- .../prism/marshaller/PrismBeanInspector.java | 81 +- .../prism/marshaller/PrismMarshaller.java | 41 +- .../prism/marshaller/PrismUnmarshaller.java | 166 +-- .../prism/marshaller/QueryConvertor.java | 8 +- .../prism/marshaller/XPathHolder.java | 2 + .../midpoint/prism/path/ItemPath.java | 9 +- .../midpoint/prism/schema/SchemaRegistry.java | 7 +- .../prism/schema/SchemaRegistryImpl.java | 43 +- .../midpoint/prism/xml/XsdTypeMapper.java | 5 +- .../xml/ns/_public/types_3/ItemPathType.java | 11 + .../midpoint/prism/TestPrismParsing.java | 2 +- .../prism/lex/TestProtectedString.java | 2 +- .../test/resources/common/yaml/user-will.yaml | 2 +- .../midpoint/schema/util/MiscSchemaUtil.java | 2 +- .../src/test/resources/basic/user-big.xml | 7 +- 26 files changed, 993 insertions(+), 889 deletions(-) create mode 100644 infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/ItemPathTypeSerializer.java rename infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/{XmlGregorialCalendarSerializer.java => XmlGregorianCalendarSerializer.java} (92%) diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContextImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContextImpl.java index 495f3194fb8..1756d487521 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContextImpl.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContextImpl.java @@ -52,7 +52,7 @@ public class PrismContextImpl implements PrismContext { private static final Trace LOGGER = TraceManager.getTrace(PrismContextImpl.class); private static boolean allowSchemalessSerialization = true; - private static boolean extraValidation = false; // TODO replace by something serious + private static boolean extraValidation = true; // TODO replace by something serious @NotNull private final SchemaRegistryImpl schemaRegistry; @NotNull private final LexicalProcessorRegistry lexicalProcessorRegistry; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/dom/DomLexicalProcessor.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/dom/DomLexicalProcessor.java index cdf42a4dba2..86309bab73a 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/dom/DomLexicalProcessor.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/dom/DomLexicalProcessor.java @@ -29,6 +29,7 @@ import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; +import com.evolveum.prism.xml.ns._public.types_3.ItemPathType; import org.apache.commons.io.IOUtils; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.Validate; @@ -333,7 +334,7 @@ private PrimitiveXNode parsePrimitiveElement(final Element element) throw private static T parsePrimitiveElementValue(Element element, QName typeName, XNodeProcessorEvaluationMode mode) throws SchemaException { try { - if (ItemPath.XSD_TYPE.equals(typeName)) { + if (ItemPathType.COMPLEX_TYPE.equals(typeName)) { return (T) parsePath(element); } else if (DOMUtil.XSD_QNAME.equals(typeName)) { return (T) DOMUtil.getQNameValue(element); @@ -384,9 +385,10 @@ private static T parsePrimitiveAttrValue(Attr attr, QName typeName, XNodePro } } - private static ItemPath parsePath(Element element) { + @NotNull + private static ItemPathType parsePath(Element element) { XPathHolder holder = new XPathHolder(element); - return holder.toItemPath(); + return new ItemPathType(holder.toItemPath()); } private SchemaXNode parseSchemaElement(Element schemaElement) { diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/dom/DomLexicalWriter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/dom/DomLexicalWriter.java index 60a303ce465..7b7128f4cda 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/dom/DomLexicalWriter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/dom/DomLexicalWriter.java @@ -29,6 +29,7 @@ import com.evolveum.midpoint.prism.xnode.XNode; import com.evolveum.midpoint.util.DOMUtil; import com.evolveum.midpoint.util.exception.SchemaException; +import com.evolveum.prism.xml.ns._public.types_3.ItemPathType; import org.apache.commons.lang.StringUtils; import org.jetbrains.annotations.NotNull; import org.w3c.dom.DOMException; @@ -238,13 +239,14 @@ private void serializePrimitiveElementOrAttribute(PrimitiveXNode xprim, Eleme Element element = null; - if (typeQName.equals(ItemPath.XSD_TYPE)) { - ItemPath itemPath = (ItemPath)xprim.getValue(); - if (itemPath != null) { + if (ItemPathType.COMPLEX_TYPE.equals(typeQName)) { + //ItemPathType itemPathType = //ItemPathType.asItemPathType(xprim.getValue()); // TODO fix this hack + ItemPathType itemPathType = (ItemPathType) xprim.getValue(); + if (itemPathType != null) { if (asAttribute) { throw new UnsupportedOperationException("Serializing ItemPath as an attribute is not supported yet"); } - XPathHolder holder = new XPathHolder(itemPath); + XPathHolder holder = new XPathHolder(itemPathType.getItemPath()); element = holder.toElement(elementOrAttributeName, parentElement.getOwnerDocument()); parentElement.appendChild(element); } @@ -262,7 +264,7 @@ private void serializePrimitiveElementOrAttribute(PrimitiveXNode xprim, Eleme parentElement.appendChild(element); } - if (typeQName.equals(DOMUtil.XSD_QNAME)) { + if (DOMUtil.XSD_QNAME.equals(typeQName)) { QName value = (QName) xprim.getParsedValueWithoutRecording(DOMUtil.XSD_QNAME); value = setQNamePrefixExplicitIfNeeded(value); if (asAttribute) { diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/ItemPathSerializer.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/ItemPathSerializer.java index a51a2e84d6e..26321287420 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/ItemPathSerializer.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/ItemPathSerializer.java @@ -10,14 +10,13 @@ import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.jsontype.TypeSerializer; -public class ItemPathSerializer extends JsonSerializer{ +public class ItemPathSerializer extends JsonSerializer { @Override public void serialize(ItemPath value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException { XPathHolder xpath = new XPathHolder(value); String path = xpath.getXPathWithDeclarations(true); -// value. jgen.writeObject(path); } @@ -25,7 +24,6 @@ public void serialize(ItemPath value, JsonGenerator jgen, SerializerProvider pro @Override public void serializeWithType(ItemPath value, JsonGenerator jgen, SerializerProvider provider, TypeSerializer typeSer) throws IOException, JsonProcessingException { - // TODO Auto-generated method stub serialize(value, jgen, provider); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/ItemPathTypeSerializer.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/ItemPathTypeSerializer.java new file mode 100644 index 00000000000..9c2f190f141 --- /dev/null +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/ItemPathTypeSerializer.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.prism.lex.json; + +import com.evolveum.midpoint.prism.marshaller.XPathHolder; +import com.evolveum.prism.xml.ns._public.types_3.ItemPathType; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.jsontype.TypeSerializer; +import org.jetbrains.annotations.NotNull; + +import java.io.IOException; + +public class ItemPathTypeSerializer extends JsonSerializer { + + @Override + public void serialize(@NotNull ItemPathType value, JsonGenerator jgen, SerializerProvider provider) throws IOException { + XPathHolder xpath = new XPathHolder(value.getItemPath()); + String path = xpath.getXPathWithDeclarations(true); + jgen.writeObject(path); + + } + + @Override + public void serializeWithType(@NotNull ItemPathType value, JsonGenerator jgen, SerializerProvider provider, + TypeSerializer typeSer) throws IOException { + serialize(value, jgen, provider); + } +} diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/JsonLexicalProcessor.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/JsonLexicalProcessor.java index 7510f53c96f..30dcecdaa61 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/JsonLexicalProcessor.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/JsonLexicalProcessor.java @@ -21,6 +21,7 @@ import com.evolveum.midpoint.prism.xnode.PrimitiveXNode; import com.evolveum.midpoint.util.QNameUtil; import com.evolveum.midpoint.util.exception.SchemaException; +import com.evolveum.prism.xml.ns._public.types_3.ItemPathType; import com.fasterxml.jackson.annotation.JsonInclude.Include; import com.fasterxml.jackson.core.JsonFactory; import com.fasterxml.jackson.core.JsonGenerator; @@ -103,6 +104,7 @@ private Module createSerializerModule(){ module.addSerializer(QName.class, new QNameSerializer()); module.addSerializer(PolyString.class, new PolyStringSerializer()); module.addSerializer(ItemPath.class, new ItemPathSerializer()); + module.addSerializer(ItemPathType.class, new ItemPathTypeSerializer()); // module.addSerializer(Element.class, new DomElementJsonSerializer()); // module.addSerializer(JAXBElement.class, new JaxbElementSerializer()); return module; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/XmlGregorialCalendarSerializer.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/XmlGregorianCalendarSerializer.java similarity index 92% rename from infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/XmlGregorialCalendarSerializer.java rename to infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/XmlGregorianCalendarSerializer.java index f1108d78286..da16f1fdbfe 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/XmlGregorialCalendarSerializer.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/XmlGregorianCalendarSerializer.java @@ -10,7 +10,7 @@ import com.fasterxml.jackson.databind.ext.CoreXMLSerializers.XMLGregorianCalendarSerializer; import com.fasterxml.jackson.databind.jsontype.TypeSerializer; -public class XmlGregorialCalendarSerializer extends XMLGregorianCalendarSerializer{ +public class XmlGregorianCalendarSerializer extends XMLGregorianCalendarSerializer{ @Override public void serializeWithType(XMLGregorianCalendar value, JsonGenerator jgen, diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/YamlLexicalProcessor.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/YamlLexicalProcessor.java index 9af62ebd8a1..4244184dee5 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/YamlLexicalProcessor.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/YamlLexicalProcessor.java @@ -25,6 +25,7 @@ import com.evolveum.midpoint.util.DOMUtil; import com.evolveum.midpoint.util.QNameUtil; import com.evolveum.midpoint.util.exception.SchemaException; +import com.evolveum.prism.xml.ns._public.types_3.ItemPathType; import com.fasterxml.jackson.annotation.JsonTypeInfo.As; import com.fasterxml.jackson.core.JsonGenerationException; import com.fasterxml.jackson.core.JsonGenerator; @@ -89,10 +90,13 @@ private ObjectMapper configureMapperForSerialization(){ // mapper.configure(SerializationFeaCture.); // mapper.setSerializationInclusion(Include.NON_NULL); mapper.registerModule(createSerializerModule()); - mapper.enableDefaultTyping(DefaultTyping.NON_CONCRETE_AND_ARRAYS); - mapper.enableDefaultTyping(DefaultTyping.NON_FINAL, As.EXISTING_PROPERTY); - //mapper.enableDefaultTyping(DefaultTyping.NON_FINAL, As.EXTERNAL_PROPERTY); - mapper.enableDefaultTyping(DefaultTyping.NON_FINAL, As.PROPERTY); + + mapper.disableDefaultTyping(); + +// mapper.enableDefaultTyping(DefaultTyping.NON_CONCRETE_AND_ARRAYS); +// mapper.enableDefaultTyping(DefaultTyping.NON_FINAL, As.EXISTING_PROPERTY); +// //mapper.enableDefaultTyping(DefaultTyping.NON_FINAL, As.EXTERNAL_PROPERTY); +// mapper.enableDefaultTyping(DefaultTyping.NON_FINAL, As.PROPERTY); return mapper; } @@ -102,8 +106,9 @@ private Module createSerializerModule(){ module.addSerializer(QName.class, new QNameSerializer()); module.addSerializer(PolyString.class, new PolyStringSerializer()); module.addSerializer(ItemPath.class, new ItemPathSerializer()); + module.addSerializer(ItemPathType.class, new ItemPathTypeSerializer()); // module.addSerializer(JAXBElement.class, new JaxbElementSerializer()); - module.addSerializer(XMLGregorianCalendar.class, new XmlGregorialCalendarSerializer()); + module.addSerializer(XMLGregorianCalendar.class, new XmlGregorianCalendarSerializer()); module.addSerializer(Element.class, new DomElementSerializer()); return module; } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/yaml/MidpointYAMLFactory.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/yaml/MidpointYAMLFactory.java index f0af223b299..a92bda4208a 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/yaml/MidpointYAMLFactory.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/lex/json/yaml/MidpointYAMLFactory.java @@ -13,6 +13,8 @@ public class MidpointYAMLFactory extends YAMLFactory { + + @Override protected MidpointYAMLGenerator _createGenerator(Writer out, IOContext ctxt) throws IOException { int feats = _yamlGeneratorFeatures; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/BeanMarshaller.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/BeanMarshaller.java index a849e9b1b34..1544f5c5813 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/BeanMarshaller.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/BeanMarshaller.java @@ -31,14 +31,13 @@ import com.evolveum.prism.xml.ns._public.types_3.*; import org.apache.commons.lang.StringUtils; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import javax.xml.bind.JAXBElement; import javax.xml.bind.annotation.XmlType; import javax.xml.namespace.QName; import java.lang.reflect.*; -import java.util.Collection; -import java.util.Iterator; -import java.util.List; +import java.util.*; public class BeanMarshaller { @@ -46,113 +45,64 @@ public class BeanMarshaller { public static final String DEFAULT_PLACEHOLDER = "##default"; - private PrismBeanInspector inspector; - + @NotNull private final PrismBeanInspector inspector; @NotNull private final PrismContext prismContext; + @NotNull private final Map specialMarshallers = new HashMap<>(); - public BeanMarshaller(@NotNull PrismContext prismContext, PrismBeanInspector inspector) { - this.prismContext = prismContext; - this.inspector = inspector; + @FunctionalInterface + private interface Marshaller { + XNode marshal(Object bean, SerializationContext sc) throws SchemaException; } - @NotNull - public PrismContext getPrismContext() { - return prismContext; + private void createSpecialMarshallerMap() { + specialMarshallers.put(XmlAsStringType.class, this::marshalXmlAsStringType); + specialMarshallers.put(SchemaDefinitionType.class, this::marshalSchemaDefinition); + specialMarshallers.put(ProtectedByteArrayType.class, this::marshalProtectedDataType); + specialMarshallers.put(ProtectedStringType.class, this::marshalProtectedDataType); + specialMarshallers.put(ItemPathType.class, this::marshalItemPathType); + specialMarshallers.put(RawType.class, this::marshalRawType); +// add(PolyString.class, this::unmarshalPolyStringFromPrimitive, this::unmarshalPolyStringFromMap); +// add(PolyStringType.class, this::unmarshalPolyStringFromPrimitive, this::unmarshalPolyStringFromMap); } - private SchemaRegistry getSchemaRegistry() { - return prismContext.getSchemaRegistry(); + public BeanMarshaller(@NotNull PrismContext prismContext, @NotNull PrismBeanInspector inspector) { + this.prismContext = prismContext; + this.inspector = inspector; + createSpecialMarshallerMap(); } - public boolean canProcess(QName typeName) { - return getSchemaRegistry().determineCompileTimeClass(typeName) != null; - } - - public boolean canProcess(@NotNull Class clazz) { - return RawType.class.equals(clazz) || clazz.getAnnotation(XmlType.class) != null; - } - - public QName determineTypeForClass(Class clazz) { - return inspector.determineTypeForClass(clazz); - } - - private MapXNode marshalSearchFilterType(SearchFilterType value) throws SchemaException { - if (value == null) { - return null; - } - return value.serializeToXNode(); + @Nullable + public XNode marshall(@Nullable T bean) throws SchemaException { + return marshall(bean, null); } - private Type getTypeArgument(Type origType, String desc) { - if (!(origType instanceof ParameterizedType)) { - throw new IllegalArgumentException("No a parametrized type "+desc); - } - ParameterizedType parametrizedType = (ParameterizedType)origType; - Type[] actualTypeArguments = parametrizedType.getActualTypeArguments(); - if (actualTypeArguments == null || actualTypeArguments.length == 0) { - throw new IllegalArgumentException("No type arguments for getter "+desc); + @Nullable + public XNode marshall(@Nullable T bean, @Nullable SerializationContext ctx) throws SchemaException { + if (bean == null) { + return null; } - if (actualTypeArguments.length > 1) { - throw new IllegalArgumentException("Too many type arguments for getter for "+desc); + Marshaller marshaller = specialMarshallers.get(bean.getClass()); + if (marshaller != null) { + return marshaller.marshal(bean, ctx); + } else if (bean instanceof Containerable) { + // we shouldn't get here but ... + return prismContext.xnodeSerializer().serializeRealValue(bean, new QName("dummy")).getSubnode(); + } else if (bean instanceof Enum) { + return marshalEnum((Enum) bean, ctx); + } else if (bean.getClass().getAnnotation(XmlType.class) != null) { + return marshalXmlType(bean, ctx); + } else { + return marshalToPrimitive(bean, ctx); } - return actualTypeArguments[0]; } - - // TODO hacked, for now -// private String findEnumFieldValue(Class classType, Object bean){ -// String name = bean.toString(); -// for (Field field: classType.getDeclaredFields()) { -// XmlEnumValue xmlEnumValue = field.getAnnotation(XmlEnumValue.class); -// if (xmlEnumValue != null && field.getName().equals(name)) { -// return xmlEnumValue.value(); -// } -// } -// return null; -// } - - - public XNode marshall(T bean) throws SchemaException { - return marshall(bean, null); + private XNode marshalToPrimitive(Object bean, SerializationContext ctx) { + return createPrimitiveXNode(bean, null, false); } - public XNode marshall(T bean, SerializationContext ctx) throws SchemaException { - if (bean == null) { - return null; - } - if (bean instanceof SchemaDefinitionType) { - return marshalSchemaDefinition((SchemaDefinitionType) bean); - } else if (bean instanceof ProtectedDataType) { - MapXNode xProtected = marshalProtectedDataType((ProtectedDataType) bean); - return xProtected; - } else if (bean instanceof ItemPathType){ - return marshalItemPathType((ItemPathType) bean); - } else if (bean instanceof RawType) { - return marshalRawValue((RawType) bean); - } else if (bean instanceof XmlAsStringType) { - return marshalXmlAsStringType((XmlAsStringType) bean); - } else if (prismContext != null && prismContext.getSchemaRegistry().determineDefinitionFromClass(bean.getClass()) != null){ - // TODO change to marshalItemContent - return ((PrismContextImpl) prismContext).getPrismMarshaller().marshalItemAsRoot(((Objectable)bean).asPrismObject(), - null, null, ctx).getSubnode(); - } - // Note: SearchFilterType is treated below + private XNode marshalXmlType(Object bean, SerializationContext ctx) throws SchemaException { - Class beanClass = bean.getClass(); - - if (beanClass == String.class) { - return createPrimitiveXNode((String)bean, DOMUtil.XSD_STRING, false); - } - - //check for enums - if (beanClass.isEnum()){ - String enumValue = inspector.findEnumFieldValue(beanClass, bean.toString()); - if (StringUtils.isEmpty(enumValue)){ - enumValue = bean.toString(); - } - QName fieldTypeName = inspector.findFieldTypeName(null, beanClass, DEFAULT_PLACEHOLDER); - return createPrimitiveXNode(enumValue, fieldTypeName, false); - } + Class beanClass = bean.getClass(); MapXNode xmap; if (bean instanceof SearchFilterType) { @@ -165,11 +115,6 @@ public XNode marshall(T bean, SerializationContext ctx) throws SchemaExcepti xmap = new MapXNode(); } - XmlType xmlType = beanClass.getAnnotation(XmlType.class); - if (xmlType == null) { - throw new IllegalArgumentException("Cannot marshall "+beanClass+" it does not have @XmlType annotation"); - } - String namespace = inspector.determineNamespace(beanClass); if (namespace == null) { throw new IllegalArgumentException("Cannot determine namespace of "+beanClass); @@ -197,15 +142,15 @@ public XNode marshall(T bean, SerializationContext ctx) throws SchemaExcepti boolean isAttribute = inspector.isAttribute(field, getter); if (getterResult instanceof Collection) { - Collection col = (Collection)getterResult; + Collection col = (Collection) getterResult; if (col.isEmpty()) { continue; } Iterator i = col.iterator(); - if (i == null) { - // huh?!? .. but it really happens - throw new IllegalArgumentException("Iterator of collection returned from "+getter+" is null"); - } +// if (i == null) { +// // huh?!? .. but it really happens +// throw new IllegalArgumentException("Iterator of collection returned from "+getter+" is null"); +// } Object getterResultValue = i.next(); if (getterResultValue == null) { continue; @@ -276,9 +221,20 @@ public XNode marshall(T bean, SerializationContext ctx) throws SchemaExcepti return xmap; } - private XNode marshalXmlAsStringType(XmlAsStringType bean) { + private XNode marshalEnum(Enum bean, SerializationContext ctx) { + Class beanClass = bean.getClass(); + String enumValue = inspector.findEnumFieldValue(beanClass, bean.toString()); + if (StringUtils.isEmpty(enumValue)){ + enumValue = bean.toString(); + } + QName fieldTypeName = inspector.findFieldTypeName(null, beanClass, DEFAULT_PLACEHOLDER); + return createPrimitiveXNode(enumValue, fieldTypeName, false); + + } + + private XNode marshalXmlAsStringType(Object bean, SerializationContext sc) { PrimitiveXNode xprim = new PrimitiveXNode<>(); - xprim.setValue(bean.getContentAsString(), DOMUtil.XSD_STRING); + xprim.setValue(((XmlAsStringType) bean).getContentAsString(), DOMUtil.XSD_STRING); return xprim; } @@ -370,7 +326,7 @@ private void setExplicitTypeDeclarationIfNeeded(Method getter, Object getterResu if (Collection.class.isAssignableFrom(getterReturnType)){ Type genericReturnType = getter.getGenericReturnType(); if (genericReturnType instanceof ParameterizedType){ - Type actualType = getTypeArgument(genericReturnType, "explicit type declaration"); + Type actualType = inspector.getTypeArgument(genericReturnType, "explicit type declaration"); if (actualType instanceof Class){ getterType = (Class) actualType; @@ -391,16 +347,15 @@ private XNode marshallValue(T value, QName fieldTypeName, boolean isAttribut if (value == null) { return null; } - if (canProcess(value.getClass())) { - // This must be a bean - return marshall(value, ctx); - } else { - // primitive value + if (isAttribute) { + // hoping the value fits into primitive! return createPrimitiveXNode(value, fieldTypeName, isAttribute); + } else { + return marshall(value, ctx); } } - private PrimitiveXNode createPrimitiveXNode(T value, QName fieldTypeName, boolean isAttribute){ + private PrimitiveXNode createPrimitiveXNode(T value, QName fieldTypeName, boolean isAttribute) { PrimitiveXNode xprim = new PrimitiveXNode(); xprim.setValue(value, fieldTypeName); xprim.setAttribute(isAttribute); @@ -411,20 +366,21 @@ private PrimitiveXNode createPrimitiveXNode(T val, QName type) { return createPrimitiveXNode(val, type, false); } - private XNode marshalRawValue(RawType value) throws SchemaException { - return value.serializeToXNode(); + private XNode marshalRawType(Object value, SerializationContext sc) throws SchemaException { + return ((RawType) value).serializeToXNode(); } - private XNode marshalItemPathType(ItemPathType itemPath) { - PrimitiveXNode xprim = new PrimitiveXNode(); - if (itemPath != null){ - ItemPath path = itemPath.getItemPath(); - xprim.setValue(path, ItemPathType.COMPLEX_TYPE); + private XNode marshalItemPathType(Object o, SerializationContext sc) { + ItemPathType itemPath = (ItemPathType) o; + PrimitiveXNode xprim = new PrimitiveXNode<>(); + if (itemPath != null) { + xprim.setValue(itemPath, ItemPathType.COMPLEX_TYPE); } return xprim; } - private XNode marshalSchemaDefinition(SchemaDefinitionType schemaDefinitionType) { + private XNode marshalSchemaDefinition(Object o, SerializationContext ctx) { + SchemaDefinitionType schemaDefinitionType = (SchemaDefinitionType) o; SchemaXNode xschema = new SchemaXNode(); xschema.setSchemaElement(schemaDefinitionType.getSchema()); MapXNode xmap = new MapXNode(); @@ -433,7 +389,8 @@ private XNode marshalSchemaDefinition(SchemaDefinitionType schemaDefinitionType) } // TODO create more appropriate interface to be able to simply serialize ProtectedStringType instances - public MapXNode marshalProtectedDataType(ProtectedDataType protectedType) throws SchemaException { + public MapXNode marshalProtectedDataType(Object o, SerializationContext sc) throws SchemaException { + ProtectedDataType protectedType = (ProtectedDataType) o; MapXNode xmap = new MapXNode(); if (protectedType.getEncryptedDataType() != null) { EncryptedDataType encryptedDataType = protectedType.getEncryptedDataType(); @@ -447,5 +404,52 @@ public MapXNode marshalProtectedDataType(ProtectedDataType protectedType) // TODO: clearValue return xmap; } + + + //region Specific marshallers ============================================================== + private MapXNode marshalSearchFilterType(SearchFilterType value) throws SchemaException { + if (value == null) { + return null; + } + return value.serializeToXNode(); + } + + //endregion + + @NotNull + public PrismContext getPrismContext() { + return prismContext; + } + + private SchemaRegistry getSchemaRegistry() { + return prismContext.getSchemaRegistry(); + } + + public boolean canProcess(QName typeName) { + Class clazz = getSchemaRegistry().determineClassForType(typeName); + return clazz != null && canProcess(clazz); + } + + public boolean canProcess(@NotNull Class clazz) { + return !Containerable.class.isAssignableFrom(clazz) && + (RawType.class.equals(clazz) || clazz.getAnnotation(XmlType.class) != null || XsdTypeMapper.getTypeFromClass(clazz) != null); + } + + public QName determineTypeForClass(Class clazz) { + return inspector.determineTypeForClass(clazz); + } + } - \ No newline at end of file + + +// TODO hacked, for now +// private String findEnumFieldValue(Class classType, Object bean){ +// String name = bean.toString(); +// for (Field field: classType.getDeclaredFields()) { +// XmlEnumValue xmlEnumValue = field.getAnnotation(XmlEnumValue.class); +// if (xmlEnumValue != null && field.getName().equals(name)) { +// return xmlEnumValue.value(); +// } +// } +// return null; +// } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/BeanUnmarshaller.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/BeanUnmarshaller.java index 2e43c38365b..9a07a66cf07 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/BeanUnmarshaller.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/BeanUnmarshaller.java @@ -24,7 +24,6 @@ import com.evolveum.midpoint.prism.xml.XsdTypeMapper; import com.evolveum.midpoint.prism.xnode.*; import com.evolveum.midpoint.util.DOMUtil; -import com.evolveum.midpoint.util.Handler; import com.evolveum.midpoint.util.QNameUtil; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.util.exception.SystemException; @@ -33,14 +32,16 @@ import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.prism.xml.ns._public.query_3.SearchFilterType; import com.evolveum.prism.xml.ns._public.types_3.*; +import org.apache.commons.lang.ArrayUtils; +import org.apache.commons.lang.ClassUtils; import org.apache.commons.lang.StringUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.w3c.dom.Element; import javax.xml.bind.JAXBElement; -import javax.xml.bind.annotation.XmlType; import javax.xml.namespace.QName; +import java.io.UnsupportedEncodingException; import java.lang.reflect.*; import java.util.*; import java.util.Map.Entry; @@ -56,75 +57,131 @@ public class BeanUnmarshaller { @NotNull private final PrismBeanInspector inspector; @NotNull private final PrismContext prismContext; + @NotNull private final Map specialPrimitiveUnmarshallers = new HashMap<>(); + @NotNull private final Map specialMapUnmarshallers = new HashMap<>(); public BeanUnmarshaller(@NotNull PrismContext prismContext, @NotNull PrismBeanInspector inspector) { this.prismContext = prismContext; this.inspector = inspector; + createSpecialUnmarshallerMaps(); } - @NotNull - public PrismContext getPrismContext() { - return prismContext; + @FunctionalInterface + private interface PrimitiveUnmarshaller { + T unmarshal(PrimitiveXNode node, Class beanClass, ParsingContext pc) throws SchemaException; } - @NotNull - private SchemaRegistry getSchemaRegistry() { - return prismContext.getSchemaRegistry(); + @FunctionalInterface + private interface MapUnmarshaller { + T unmarshal(MapXNode node, Class beanClass, ParsingContext pc) throws SchemaException; } + private void add(Class beanClass, PrimitiveUnmarshaller primitive, MapUnmarshaller map) { + specialPrimitiveUnmarshallers.put(beanClass, primitive); + specialMapUnmarshallers.put(beanClass, map); + } + + private void createSpecialUnmarshallerMaps() { + add(XmlAsStringType.class, this::unmarshalXmlAsStringFromPrimitive, this::unmarshalXmlAsStringFromMap); + add(RawType.class, this::unmarshalRawType, this::unmarshalRawType); + add(PolyString.class, this::unmarshalPolyStringFromPrimitive, this::unmarshalPolyStringFromMap); + add(PolyStringType.class, this::unmarshalPolyStringFromPrimitive, this::unmarshalPolyStringFromMap); + add(ItemPathType.class, this::unmarshalItemPath, this::notSupported); + add(ProtectedStringType.class, this::unmarshalProtectedString, this::unmarshalProtectedString); + add(ProtectedByteArrayType.class, this::unmarshalProtectedByteArray, this::unmarshalProtectedByteArray); + add(SchemaDefinitionType.class, this::notSupported, this::unmarshalSchemaDefinitionType); + } + //region Main entry ========================================================================== + /* + * Preconditions: + * 1. typeName is processable by unmarshaller - i.e. it corresponds to simple or complex type NOT of containerable character + */ + + @NotNull T unmarshal(@NotNull XNode xnode, @NotNull QName typeQName, @NotNull ParsingContext pc) throws SchemaException { - Class classType = getSchemaRegistry().determineCompileTimeClass(typeQName); // TODO use correct method! + Class classType = getSchemaRegistry().determineClassForType(typeQName); // TODO use correct method! return unmarshal(xnode, classType, pc); } + @NotNull T unmarshal(@NotNull XNode xnode, @NotNull Class beanClass, @NotNull ParsingContext pc) throws SchemaException { + T value = unmarshalInternal(xnode, beanClass, pc); + if (PrismContextImpl.isExtraValidation() && value != null) { + Class requested = ClassUtils.primitiveToWrapper(beanClass); + Class actual = ClassUtils.primitiveToWrapper(value.getClass()); + if (!requested.isAssignableFrom(actual)) { + throw new AssertionError("Postcondition fail: unmarshal returned a value of " + value + " (" + + actual + ") which is not of requested type (" + requested + ")"); + } + } + return value; + } + private T unmarshalInternal(@NotNull XNode xnode, @NotNull Class beanClass, @NotNull ParsingContext pc) throws SchemaException { + if (xnode instanceof RootXNode) { + XNode subnode = ((RootXNode) xnode).getSubnode(); + if (subnode == null) { + throw new IllegalStateException("Couldn't parse " + beanClass + " from a root node with a null content: " + xnode.debugDump()); + } else { + return unmarshal(subnode, beanClass, pc); + } + } else if (!(xnode instanceof MapXNode) && !(xnode instanceof PrimitiveXNode)) { + throw new IllegalStateException("Couldn't parse " + beanClass + " from non-map/non-primitive node: " + xnode.debugDump()); + } + // only maps and primitives after this point if (xnode instanceof PrimitiveXNode) { - return unmarshalFromPrimitive((PrimitiveXNode) xnode, beanClass, pc); - } else if (xnode instanceof MapXNode) { - return unmarshalFromMap((MapXNode) xnode, beanClass, pc); - } else if (xnode instanceof RootXNode) { - return unmarshal(((RootXNode) xnode).getSubnode(), beanClass, pc); + PrimitiveXNode prim = (PrimitiveXNode) xnode; + if (XmlTypeConverter.canConvert(beanClass)) { + QName xsdType = XsdTypeMapper.toXsdType(beanClass); + Object parsedValue = prim.getParsedValue(xsdType); + return postConvertUnmarshal(parsedValue, pc); + } else if (beanClass.isEnum()) { + return unmarshalEnumFromPrimitive(prim, beanClass, pc); + } + @SuppressWarnings("unchecked") + PrimitiveUnmarshaller unmarshaller = specialPrimitiveUnmarshallers.get(beanClass); + if (unmarshaller != null) { + return unmarshaller.unmarshal(prim, beanClass, pc); + } else if (prim.isEmpty()) { + // Special case. Just return empty object + try { + return beanClass.newInstance(); + } catch (InstantiationException | IllegalAccessException e) { + throw new SystemException("Cannot instantiate "+beanClass+": "+e.getMessage(), e); + } + } else { + throw new SchemaException("Cannot convert primitive value to bean of type " + beanClass); + } } else { - throw new IllegalStateException("Unexpected xnode " + xnode + ". Could not unmarshal value"); + @SuppressWarnings("unchecked") + MapUnmarshaller unmarshaller = specialMapUnmarshallers.get(beanClass); + if (unmarshaller != null) { + return unmarshaller.unmarshal((MapXNode) xnode, beanClass, pc); + } + return unmarshalFromMap((MapXNode) xnode, beanClass, pc); } } + public boolean canProcess(QName typeName) { + return ((PrismContextImpl) getPrismContext()).getBeanMarshaller().canProcess(typeName); + } + + public boolean canProcess(Class clazz) { + return ((PrismContextImpl) getPrismContext()).getBeanMarshaller().canProcess(clazz); + } + //endregion + + private T unmarshalFromMap(@NotNull MapXNode xmap, @NotNull Class beanClass, @NotNull ParsingContext pc) throws SchemaException { - if (PolyStringType.class.equals(beanClass)) { - return (T) PolyStringType.unmarshal(xmap); - } else if (ProtectedStringType.class.equals(beanClass)) { - return (T) ProtectedStringType.unmarshal(xmap); - ProtectedStringType protectedType = new ProtectedStringType(); - XNodeProcessorUtil.parseProtectedType(protectedType, xmap, prismContext, pc); - return (T) protectedType; - } else if (ProtectedByteArrayType.class.equals(beanClass)) { - ProtectedByteArrayType protectedType = new ProtectedByteArrayType(); - XNodeProcessorUtil.parseProtectedType(protectedType, xmap, prismContext, pc); - return (T) protectedType; - } else if (SchemaDefinitionType.class.equals(beanClass)) { - SchemaDefinitionType schemaDefType = unmarshalSchemaDefinitionType(xmap); - return (T) schemaDefType; - } else if (prismContext.getSchemaRegistry().determineDefinitionFromClass(beanClass) != null) { - PrismObjectDefinition def = prismContext.getSchemaRegistry().determineDefinitionFromClass(beanClass); - return (T) ((PrismContextImpl) prismContext).getPrismUnmarshaller().parseObject(xmap, def, pc).asObjectable(); - } else if (XmlAsStringType.class.equals(beanClass)) { - // reading a string represented a XML-style content - // used e.g. when reading report templates (embedded XML) - // A necessary condition: there may be only one map entry. - if (xmap.size() > 1) { - throw new SchemaException("Map with more than one item cannot be parsed as a string: " + xmap); - } else if (xmap.isEmpty()) { - return (T) new XmlAsStringType(); - } else { - Entry entry = xmap.entrySet().iterator().next(); - DomLexicalProcessor domParser = ((PrismContextImpl) prismContext).getParserDom(); - String value = domParser.write(entry.getValue(), entry.getKey(), null); - return (T) new XmlAsStringType(value); - } + + if (Containerable.class.isAssignableFrom(beanClass)) { + // This could have come from inside + PrismValue value = prismContext.parserFor(xmap.toRootXNode()).type(beanClass).parseItemValue(); + return (T) value.getRealValue(); + //throw new IllegalArgumentException("Couldn't process Containerable: " + beanClass + " from " + xmap.debugDump()); } else if (SearchFilterType.class.isAssignableFrom(beanClass)) { T bean = (T) unmarshalSearchFilterType(xmap, (Class) beanClass, pc); // TODO fix this BRUTAL HACK - it is here because of c:ConditionalSearchFilterType @@ -141,302 +198,379 @@ private T unmarshalFromMap(@NotNull MapXNode xmap, @NotNull Class beanCla } private T unmarshalFromMapToBean(@NotNull T bean, @NotNull MapXNode xmap, @Nullable Collection keysToParse, @NotNull ParsingContext pc) throws SchemaException { + @SuppressWarnings("unchecked") Class beanClass = (Class) bean.getClass(); - - for (Entry entry: xmap.entrySet()) { + for (Entry entry : xmap.entrySet()) { QName key = entry.getKey(); - if (keysToParse != null && !keysToParse.contains(key.getLocalPart())) { - continue; - } - XNode xsubnode = entry.getValue(); - String propName = key.getLocalPart(); - Field field = inspector.findPropertyField(beanClass, propName); + if (keysToParse != null && !keysToParse.contains(key.getLocalPart())) { + continue; + } + unmarshalMapEntry(bean, beanClass, entry.getKey(), entry.getValue(), xmap, pc); + } + return bean; + } + + private void unmarshalMapEntry(@NotNull T bean, @NotNull Class beanClass, + @NotNull QName key, @NotNull XNode node, @NotNull MapXNode containingMap, @NotNull ParsingContext pc) throws SchemaException { + + final String propName = key.getLocalPart(); + + // this code is just to keep this method reasonably short + PropertyAccessMechanism mechanism = new PropertyAccessMechanism(); + if (!mechanism.compute(bean, beanClass, propName, key, node, pc)) { + return; + } + + final String actualPropertyName = mechanism.actualPropertyName; + final boolean storeAsRawType = mechanism.storeAsRawType; + + final Method getter = mechanism.getter; + final Method setter = mechanism.setter; + Class paramType = mechanism.paramType; + final boolean wrapInJaxbElement = mechanism.wrapInJaxbElement; + + if (Element.class.isAssignableFrom(paramType)) { + throw new IllegalArgumentException("DOM not supported in field "+actualPropertyName+" in "+beanClass); + } + + //check for subclasses??? + if (!storeAsRawType && node.getTypeQName() != null) { + Class explicitParamType = getSchemaRegistry().determineClassForType(node.getTypeQName()); + if (explicitParamType != null) { + paramType = explicitParamType; + } + } + + if (!(node instanceof ListXNode) && Object.class.equals(paramType) && !storeAsRawType) { + throw new IllegalArgumentException("Object property (without @Raw) not supported in field "+actualPropertyName+" in "+beanClass); + } + + String paramNamespace = inspector.determineNamespace(paramType); + + boolean problem = false; + Object propValue = null; + Collection propValues = null; + if (node instanceof ListXNode) { + ListXNode xlist = (ListXNode)node; + if (setter != null) { + try { + propValue = convertSinglePropValue(node, actualPropertyName, paramType, storeAsRawType, beanClass, paramNamespace, pc); + } catch (SchemaException e) { + problem = processSchemaException(e, node, pc); + } + } else { + // No setter, we have to use collection getter + propValues = new ArrayList<>(xlist.size()); + for (XNode xsubsubnode: xlist) { + try { + propValues.add(convertSinglePropValue(xsubsubnode, actualPropertyName, paramType, storeAsRawType, beanClass, paramNamespace, pc)); + } catch (SchemaException e) { + problem = processSchemaException(e, xsubsubnode, pc); + } + } + } + } else { + try { + propValue = convertSinglePropValue(node, actualPropertyName, paramType, storeAsRawType, beanClass, paramNamespace, pc); + } catch (SchemaException e) { + problem = processSchemaException(e, node, pc); + } + } + + if (setter != null) { + Object value = null; + try { + value = prepareValueToBeStored(propValue, wrapInJaxbElement, mechanism.objectFactory, mechanism.elementFactoryMethod, propName, beanClass, pc); + setter.invoke(bean, value); + } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { + throw new SystemException("Cannot invoke setter "+setter+" on bean of type "+beanClass+": "+e.getMessage(), e); + } + } else if (getter != null) { + Object getterReturn; + Collection col; + try { + getterReturn = getter.invoke(bean); + } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { + throw new SystemException("Cannot invoke getter "+getter+" on bean of type "+beanClass+": "+e.getMessage(), e); + } + try { + col = (Collection)getterReturn; + } catch (ClassCastException e) { + throw new SystemException("Getter "+getter+" on bean of type "+beanClass+" returned "+getterReturn+" instead of collection"); + } + if (propValue != null) { + col.add(prepareValueToBeStored(propValue, wrapInJaxbElement, mechanism.objectFactory, mechanism.elementFactoryMethod, propName, beanClass, pc)); + } else if (propValues != null) { + for (Object propVal: propValues) { + col.add(prepareValueToBeStored(propVal, wrapInJaxbElement, mechanism.objectFactory, mechanism.elementFactoryMethod, propName, beanClass, pc)); + } + } else if (!problem) { + throw new IllegalStateException("Strange. Multival property "+propName+" in "+beanClass+" produced null values list, parsed from "+containingMap); + } + checkJaxbElementConsistence(col, pc); + } else { + throw new IllegalStateException("Uh? No setter nor getter."); + } + } + + private class PropertyAccessMechanism { + + Class beanClass; + + // phase1 + String actualPropertyName; // This is the name of property we will really use. (Considering e.g. substitutions.) + boolean storeAsRawType; // Whether the data will be stored as RawType. + Object objectFactory; // JAXB object factory instance (e.g. xxxx.common-3.ObjectFactory). + Method elementFactoryMethod; // Method in object factory that creates a given JAXB element (e.g. createAsIs(value)) + + // phase2 + Method getter, setter; // Getter or setter that will be used to put a value (getter in case of collections) + Class paramType; // Actual parameter type; unwrapped: Collection -> X, JAXBElement -> X + boolean wrapInJaxbElement; // If the paramType contained JAXBElement, i.e. if the value should be wrapped into it before using + + // returns true if the processing is to be continued; + // false in case of using alternative way of unmarshalling (e.g. use of "any" method), or in case of error (in COMPAT mode) + private boolean compute(T bean, Class beanClass, String propName, QName key, XNode node, ParsingContext pc) + throws SchemaException { + + this.beanClass = beanClass; + + // phase1 + if (!computeActualPropertyName(bean, propName, key, node, pc)) { + return false; + } + // phase2 + return computeGetterAndSetter(propName, pc); + } + + // computes actualPropertyName + storeAsRawType + // if necessary, fills-in also objectFactory + elementFactoryMethod + private boolean computeActualPropertyName(T bean, String propName, QName key, XNode node, ParsingContext pc) + throws SchemaException { + Field propertyField = inspector.findPropertyField(beanClass, propName); Method propertyGetter = null; - if (field == null) { + if (propertyField == null) { propertyGetter = inspector.findPropertyGetter(beanClass, propName); } - Method elementMethod = null; - Object objectFactory = null; - if (field == null && propertyGetter == null) { + elementFactoryMethod = null; + objectFactory = null; + if (propertyField == null && propertyGetter == null) { // We have to try to find a more generic field, such as xsd:any or substitution element // check for global element definition first - Class objectFactoryClass = inspector.getObjectFactoryClass(beanClass.getPackage()); - objectFactory = instantiateObjectFactory(objectFactoryClass); - elementMethod = inspector.findElementMethodInObjectFactory(objectFactoryClass, propName); - if (elementMethod == null) { - // Check for "any" method - elementMethod = inspector.findAnyMethod(beanClass); - if (elementMethod == null) { - String m = "No field "+propName+" in class "+beanClass+" (and no element method in object factory too)"; - if (pc.isCompat()) { - pc.warn(LOGGER, m); - continue; + elementFactoryMethod = findElementFactoryMethod(propName); + if (elementFactoryMethod != null) { + // great - global element found, let's look up the field + propertyField = inspector.lookupSubstitution(beanClass, elementFactoryMethod); + if (propertyField == null) { + propertyField = inspector.findAnyField(beanClass); // Check for "any" field + if (propertyField != null) { + unmarshalToAnyUsingField(bean, propertyField, key, node, pc); } else { - throw new SchemaException(m); + unmarshalToAnyUsingGetterIfExists(bean, key, node, pc, propName); } + return false; } - unmarshallToAny(bean, elementMethod, key, xsubnode, pc); - continue; - - } - field = inspector.lookupSubstitution(beanClass, elementMethod); - if (field == null) { - // Check for "any" field - field = inspector.findAnyField(beanClass); - if (field == null) { - elementMethod = inspector.findAnyMethod(beanClass); - if (elementMethod == null) { - String m = "No field "+propName+" in class "+beanClass+" (and no element method in object factory too)"; - if (pc.isCompat()) { - pc.warn(LOGGER, m); - continue; - } else { - throw new SchemaException(m); - } - } - unmarshallToAny(bean, elementMethod, key, xsubnode, pc); - continue; -// throw new SchemaException("No field "+propName+" in class "+beanClass+" (no suitable substitution and no 'any' field)"); - } - unmarshallToAny(bean, field, key, xsubnode, pc); - continue; + } else { + unmarshalToAnyUsingGetterIfExists(bean, key, node, pc, propName); // e.g. "getAny()" + return false; } } - boolean storeAsRawType; - if (elementMethod != null) { - storeAsRawType = elementMethod.getAnnotation(Raw.class) != null; - } else if (propertyGetter != null) { - storeAsRawType = propertyGetter.getAnnotation(Raw.class) != null; - } else { - storeAsRawType = field.getAnnotation(Raw.class) != null; - } + // At this moment, property getter is the exact getter matching key.localPart (propName). + // Property field may be either exact field matching key.localPart (propName), or more generic one (substitution, any). + //noinspection ConstantConditions + assert propertyGetter != null || propertyField != null; - String fieldName; - if (field != null) { - fieldName = field.getName(); + if (elementFactoryMethod != null) { + storeAsRawType = elementFactoryMethod.getAnnotation(Raw.class) != null; + } else if (propertyGetter != null) { + storeAsRawType = propertyGetter.getAnnotation(Raw.class) != null; } else { - fieldName = propName; + storeAsRawType = propertyField.getAnnotation(Raw.class) != null; } - - Method setter = inspector.findSetter(beanClass, fieldName); - Method getter = null; - boolean wrapInJaxbElement = false; - Class paramType = null; + + if (propertyField != null) { + actualPropertyName = propertyField.getName(); + } else { + actualPropertyName = propName; + } + + return true; + } + + private Method findElementFactoryMethod(String propName) { + Class objectFactoryClass = inspector.getObjectFactoryClass(beanClass.getPackage()); + objectFactory = instantiateObjectFactory(objectFactoryClass); + return inspector.findElementMethodInObjectFactory(objectFactoryClass, propName); + } + + private boolean computeGetterAndSetter(String propName, ParsingContext pc) throws SchemaException { + setter = inspector.findSetter(beanClass, actualPropertyName); + wrapInJaxbElement = false; + paramType = null; if (setter == null) { // No setter. But if the property is multi-value we need to look // for a getter that returns a collection (Collection) - getter = inspector.findPropertyGetter(beanClass, fieldName); + getter = inspector.findPropertyGetter(beanClass, actualPropertyName); if (getter == null) { - String m = "Cannot find setter or getter for field " + fieldName + " in " + beanClass; - if (pc.isCompat()) { - pc.warn(LOGGER, m); - continue; - } else { - throw new SchemaException(m); - } + pc.warnOrThrow(LOGGER, "Cannot find setter or getter for field " + actualPropertyName + " in " + beanClass); + return false; } - Class getterReturnType = getter.getReturnType(); - if (!Collection.class.isAssignableFrom(getterReturnType)) { - throw new SchemaException("Cannot find getter for field "+fieldName+" in "+beanClass+" does not return collection, cannot use it to set value"); + computeParamTypeFromGetter(propName, getter.getReturnType()); + } else { + getter = null; + Class setterType = setter.getParameterTypes()[0]; + computeParamTypeFromSetter(propName, setterType); + } + return true; + } + + private void computeParamTypeFromSetter(String propName, Class setterParamType) { + if (JAXBElement.class.equals(setterParamType)) { + // TODO some handling for the returned generic parameter types + Type[] genericTypes = setter.getGenericParameterTypes(); + if (genericTypes.length != 1) { + throw new IllegalArgumentException("Too lazy to handle this."); } - Type genericReturnType = getter.getGenericReturnType(); - Type typeArgument = getTypeArgument(genericReturnType, "for field "+fieldName+" in "+beanClass+", cannot determine collection type"); - // System.out.println("type argument " + typeArgument); - if (typeArgument instanceof Class) { - paramType = (Class) typeArgument; - } else if (typeArgument instanceof ParameterizedType) { - ParameterizedType paramTypeArgument = (ParameterizedType)typeArgument; - Type rawTypeArgument = paramTypeArgument.getRawType(); - if (rawTypeArgument.equals(JAXBElement.class)) { - // This is the case of Collection> - wrapInJaxbElement = true; - Type innerTypeArgument = getTypeArgument(typeArgument, "for field "+fieldName+" in "+beanClass+", cannot determine collection type (inner type argument)"); - if (innerTypeArgument instanceof Class) { - // This is the case of Collection> - paramType = (Class) innerTypeArgument; - } else if (innerTypeArgument instanceof WildcardType) { - // This is the case of Collection> - // we need to exctract the specific type from the factory method - if (elementMethod == null){ - // TODO: TEMPORARY CODE!!!!!!!!!! fix in 3.1 [med] - Class objectFactoryClass = inspector.getObjectFactoryClass(beanClass.getPackage()); - objectFactory = instantiateObjectFactory(objectFactoryClass); - elementMethod = inspector.findElementMethodInObjectFactory(objectFactoryClass, propName); - if (elementMethod == null) { - throw new IllegalArgumentException("Wildcard type in JAXBElement field specification and no factory method found for field "+fieldName+" in "+beanClass+", cannot determine collection type (inner type argument)"); - } - } - Type factoryMethodGenericReturnType = elementMethod.getGenericReturnType(); - Type factoryMethodTypeArgument = getTypeArgument(factoryMethodGenericReturnType, "in factory method "+elementMethod+" return type for field "+fieldName+" in "+beanClass+", cannot determine collection type"); - if (factoryMethodTypeArgument instanceof Class) { - // This is the case of JAXBElement - paramType = (Class) factoryMethodTypeArgument; - if (Object.class.equals(paramType) && !storeAsRawType) { - throw new IllegalArgumentException("Factory method "+elementMethod+" type argument is Object (and not @Raw) for field "+ - fieldName+" in "+beanClass+", property "+propName); - } - } else { - throw new IllegalArgumentException("Cannot determine factory method return type, got "+factoryMethodTypeArgument+" - for field "+fieldName+" in "+beanClass+", cannot determine collection type (inner type argument)"); - } - } else { - throw new IllegalArgumentException("Ejha! "+innerTypeArgument+" "+innerTypeArgument.getClass()+" from "+getterReturnType+" from "+fieldName+" in "+propName+" "+beanClass); + Type genericType = genericTypes[0]; + if (genericType instanceof ParameterizedType) { + Type actualType = inspector.getTypeArgument(genericType, "add some description"); + if (actualType instanceof WildcardType) { + if (elementFactoryMethod == null) { + elementFactoryMethod = findElementFactoryMethod(propName); } - } else { - // The case of Collection> - if (rawTypeArgument instanceof Class) { - paramType = (Class) rawTypeArgument; + // This is the case of Collection> + // we need to extract the specific type from the factory method + if (elementFactoryMethod == null) { + throw new IllegalArgumentException( + "Wildcard type in JAXBElement field specification and no factory method found for field " + + actualPropertyName + " in " + beanClass + + ", cannot determine collection type (inner type argument)"); + } + Type factoryMethodGenericReturnType = elementFactoryMethod.getGenericReturnType(); + Type factoryMethodTypeArgument = inspector.getTypeArgument(factoryMethodGenericReturnType, + "in factory method " + elementFactoryMethod + " return type for field " + actualPropertyName + + " in " + beanClass + ", cannot determine collection type"); + if (factoryMethodTypeArgument instanceof Class) { + // This is the case of JAXBElement + paramType = (Class) factoryMethodTypeArgument; + if (Object.class.equals(paramType) && !storeAsRawType) { + throw new IllegalArgumentException("Factory method " + elementFactoryMethod + + " type argument is Object (without @Raw) for field " + + actualPropertyName + " in " + beanClass + ", property " + propName); + } } else { - throw new IllegalArgumentException("EH? Eh!? "+typeArgument+" "+typeArgument.getClass()+" from "+getterReturnType+" from "+fieldName+" in "+propName+" "+beanClass); + throw new IllegalArgumentException( + "Cannot determine factory method return type, got " + factoryMethodTypeArgument + + " - for field " + actualPropertyName + " in " + beanClass + + ", cannot determine collection type (inner type argument)"); } } - } else { - throw new IllegalArgumentException("EH? "+typeArgument+" "+typeArgument.getClass()+" from "+getterReturnType+" from "+fieldName+" in "+propName+" "+beanClass); } + // Class enclosing = paramType.getEnclosingClass(); + // Class clazz = paramType.getClass(); + // Class declaring = paramType.getDeclaringClass(); + wrapInJaxbElement = true; } else { - Class setterType = setter.getParameterTypes()[0]; - if (JAXBElement.class.equals(setterType)){ -// TODO some handling for the returned generic parameter types - Type[] genericTypes = setter.getGenericParameterTypes(); - if (genericTypes.length != 1){ - throw new IllegalArgumentException("Too lazy to handle this."); - } - Type genericType = genericTypes[0]; - if (genericType instanceof ParameterizedType){ - Type actualType = getTypeArgument(genericType, "add some description"); - if (actualType instanceof WildcardType) { - if (elementMethod == null) { - Class objectFactoryClass = inspector.getObjectFactoryClass(beanClass.getPackage()); - objectFactory = instantiateObjectFactory(objectFactoryClass); - elementMethod = inspector.findElementMethodInObjectFactory(objectFactoryClass, propName); - } - // This is the case of Collection> - // we need to exctract the specific type from the factory method - if (elementMethod == null) { - throw new IllegalArgumentException("Wildcard type in JAXBElement field specification and no facotry method found for field "+fieldName+" in "+beanClass+", cannot determine collection type (inner type argument)"); - } - Type factoryMethodGenericReturnType = elementMethod.getGenericReturnType(); - Type factoryMethodTypeArgument = getTypeArgument(factoryMethodGenericReturnType, "in factory method "+elementMethod+" return type for field "+fieldName+" in "+beanClass+", cannot determine collection type"); - if (factoryMethodTypeArgument instanceof Class) { - // This is the case of JAXBElement - paramType = (Class) factoryMethodTypeArgument; - if (Object.class.equals(paramType) && !storeAsRawType) { - throw new IllegalArgumentException("Factory method "+elementMethod+" type argument is Object (without @Raw) for field "+ - fieldName+" in "+beanClass+", property "+propName); - } - } else { - throw new IllegalArgumentException("Cannot determine factory method return type, got "+factoryMethodTypeArgument+" - for field "+fieldName+" in "+beanClass+", cannot determine collection type (inner type argument)"); - } - } - } -// Class enclosing = paramType.getEnclosingClass(); -// Class clazz = paramType.getClass(); -// Class declaring = paramType.getDeclaringClass(); - wrapInJaxbElement = true; - } else { - paramType = setterType; - } - } - - if (Element.class.isAssignableFrom(paramType)) { - // DOM! - throw new IllegalArgumentException("DOM not supported in field "+fieldName+" in "+beanClass); - } - - //check for subclasses??? - if (!storeAsRawType && xsubnode != null && xsubnode.getTypeQName() != null) { - Class explicitParamType = getSchemaRegistry().determineCompileTimeClass(xsubnode.getTypeQName()); - if (explicitParamType == null){ - explicitParamType = XsdTypeMapper.toJavaTypeIfKnown(xsubnode.getTypeQName()); - } - - if (explicitParamType != null){ - paramType = explicitParamType; - } + paramType = setterParamType; } + } - - if (!(xsubnode instanceof ListXNode) && Object.class.equals(paramType) && !storeAsRawType) { - throw new IllegalArgumentException("Object property (without @Raw) not supported in field "+fieldName+" in "+beanClass); + private void computeParamTypeFromGetter(String propName, Class getterReturnType) throws SchemaException { + if (!Collection.class.isAssignableFrom(getterReturnType)) { + throw new SchemaException("Cannot find getter for field " + actualPropertyName + " in " + beanClass + + " does not return collection, cannot use it to set value"); } - - String paramNamespace = inspector.determineNamespace(paramType); - - - boolean problem = false; - Object propValue = null; - Collection propValues = null; - if (xsubnode instanceof ListXNode) { - ListXNode xlist = (ListXNode)xsubnode; - if (setter != null) { - try { - propValue = convertSinglePropValue(xsubnode, fieldName, paramType, storeAsRawType, beanClass, paramNamespace, pc); - } catch (SchemaException e) { - problem = processSchemaException(e, xsubnode, pc); - } - } else { - // No setter, we have to use collection getter - propValues = new ArrayList<>(xlist.size()); - for (XNode xsubsubnode: xlist) { - try { - propValues.add(convertSinglePropValue(xsubsubnode, fieldName, paramType, storeAsRawType, beanClass, paramNamespace, pc)); - } catch (SchemaException e) { - problem = processSchemaException(e, xsubsubnode, pc); + // getter.genericReturnType = Collection<...> + Type typeArgument = inspector.getTypeArgument(getter.getGenericReturnType(), + "for field " + actualPropertyName + " in " + beanClass + ", cannot determine collection type"); + if (typeArgument instanceof Class) { + paramType = (Class) typeArgument; // ok, like Collection + } else if (typeArgument instanceof ParameterizedType) { // something more complex + ParameterizedType paramTypeArgument = (ParameterizedType) typeArgument; + Type rawTypeArgument = paramTypeArgument.getRawType(); + if (rawTypeArgument.equals(JAXBElement.class)) { + // This is the case of Collection> + wrapInJaxbElement = true; + Type innerTypeArgument = inspector.getTypeArgument(typeArgument, + "for field " + actualPropertyName + " in " + beanClass + + ", cannot determine collection type (inner type argument)"); + if (innerTypeArgument instanceof Class) { + // This is the case of Collection> (note that wrapInJaxbElement is now true) + paramType = (Class) innerTypeArgument; + } else if (innerTypeArgument instanceof WildcardType) { + // This is the case of Collection> + // we need to extract the specific type from the factory method + if (elementFactoryMethod == null) { + elementFactoryMethod = findElementFactoryMethod(propName); + if (elementFactoryMethod == null) { + throw new IllegalArgumentException( + "Wildcard type in JAXBElement field specification and no factory method found for field " + + actualPropertyName + " in " + beanClass + + ", cannot determine collection type (inner type argument)"); + } + } + // something like JAXBElement + Type factoryMethodGenericReturnType = elementFactoryMethod.getGenericReturnType(); + Type factoryMethodTypeArgument = inspector.getTypeArgument(factoryMethodGenericReturnType, + "in factory method " + elementFactoryMethod + " return type for field " + actualPropertyName + + " in " + beanClass + ", cannot determine collection type"); + if (factoryMethodTypeArgument instanceof Class) { + // This is the case of JAXBElement + paramType = (Class) factoryMethodTypeArgument; + if (Object.class.equals(paramType) && !storeAsRawType) { + throw new IllegalArgumentException("Factory method " + elementFactoryMethod + + " type argument is Object (and not @Raw) for field " + + actualPropertyName + " in " + beanClass + ", property " + propName); + } + } else { + throw new IllegalArgumentException( + "Cannot determine factory method return type, got " + factoryMethodTypeArgument + + " - for field " + actualPropertyName + " in " + beanClass + + ", cannot determine collection type (inner type argument)"); } + } else { + throw new IllegalArgumentException( + "Ejha! " + innerTypeArgument + " " + innerTypeArgument.getClass() + " from " + + getterReturnType + " from " + actualPropertyName + " in " + propName + " " + + beanClass); } - } - } else { - try { - propValue = convertSinglePropValue(xsubnode, fieldName, paramType, storeAsRawType, beanClass, paramNamespace, pc); - } catch (SchemaException e) { - problem = processSchemaException(e, xsubnode, pc); - } - } - - if (setter != null) { - Object value = null; - try { - value = prepareValueToBeStored(propValue, wrapInJaxbElement, objectFactory, elementMethod, propName, beanClass, pc); - setter.invoke(bean, value); - } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { - throw new SystemException("Cannot invoke setter "+setter+" on bean of type "+beanClass+": "+e.getMessage(), e); - } - } else if (getter != null) { - Object getterReturn; - Collection col; - try { - getterReturn = getter.invoke(bean); - } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { - throw new SystemException("Cannot invoke getter "+getter+" on bean of type "+beanClass+": "+e.getMessage(), e); - } - try { - col = (Collection)getterReturn; - } catch (ClassCastException e) { - throw new SystemException("Getter "+getter+" on bean of type "+beanClass+" returned "+getterReturn+" instead of collection"); - } - if (propValue != null) { - col.add(prepareValueToBeStored(propValue, wrapInJaxbElement, objectFactory, elementMethod, propName, beanClass, pc)); - } else if (propValues != null) { - for (Object propVal: propValues) { - col.add(prepareValueToBeStored(propVal, wrapInJaxbElement, objectFactory, elementMethod, propName, beanClass, pc)); + } else { + // The case of Collection> + if (rawTypeArgument instanceof Class) { // ??? rawTypeArgument is the 'Whatever' part + paramType = (Class) rawTypeArgument; + } else { + throw new IllegalArgumentException( + "EH? Eh!? " + typeArgument + " " + typeArgument.getClass() + " from " + getterReturnType + + " from " + actualPropertyName + " in " + propName + " " + beanClass); } - } else if (!problem) { - throw new IllegalStateException("Strange. Multival property "+propName+" in "+beanClass+" produced null values list, parsed from "+xmap); } - checkJaxbElementConsistence(col, pc); } else { - throw new IllegalStateException("Uh? No setter nor getter."); + throw new IllegalArgumentException( + "EH? " + typeArgument + " " + typeArgument.getClass() + " from " + getterReturnType + " from " + + actualPropertyName + " in " + propName + " " + beanClass); } } - - if (prismContext != null && bean instanceof Revivable) { - ((Revivable)bean).revive(prismContext); - } - - return bean; } + private void unmarshalToAnyUsingGetterIfExists(@NotNull T bean, @NotNull QName key, @NotNull XNode node, + @NotNull ParsingContext pc, String propName) throws SchemaException { + Method elementMethod = inspector.findAnyMethod(bean.getClass()); + if (elementMethod != null) { + unmarshallToAnyUsingGetter(bean, elementMethod, key, node, pc); + } else { + pc.warnOrThrow(LOGGER, "No field "+propName+" in class "+bean.getClass()+" (and no element method in object factory too)"); + } + } +// +// if (prismContext != null && bean instanceof Revivable) { +// ((Revivable)bean).revive(prismContext); +// } +// +// return bean; +// } +// // Prepares value to be stored into the bean - e.g. converts PolyString->PolyStringType, wraps a value to JAXB if specified, ... private Object prepareValueToBeStored(Object propVal, boolean wrapInJaxbElement, Object objectFactory, Method factoryMehtod, String propName, Class beanClass, ParsingContext pc) { @@ -493,7 +627,7 @@ private void checkJaxbElementConsistence(Collection collection, ParsingC } } - protected boolean processSchemaException(SchemaException e, XNode xsubnode, ParsingContext pc) throws SchemaException { + private boolean processSchemaException(SchemaException e, XNode xsubnode, ParsingContext pc) throws SchemaException { if (pc.isStrict()) { throw e; } else { @@ -503,9 +637,9 @@ protected boolean processSchemaException(SchemaException e, XNode xsubnode, Pars } } - private void unmarshallToAny(T bean, Method getter, QName elementName, XNode xsubnode, ParsingContext pc) throws SchemaException{ + private void unmarshallToAnyUsingGetter(T bean, Method getter, QName elementName, XNode xsubnode, ParsingContext pc) throws SchemaException{ Class beanClass = (Class) bean.getClass(); - + Class objectFactoryClass = inspector.getObjectFactoryClass(elementName.getNamespaceURI()); Object objectFactory = instantiateObjectFactory(objectFactoryClass); Method elementFactoryMethod = inspector.findElementMethodInObjectFactory(objectFactoryClass, elementName.getLocalPart()); @@ -516,24 +650,23 @@ private void unmarshallToAny(T bean, Method getter, QName elementName, XNo S subBean = unmarshal(xsubSubNode, subBeanClass, pc); unmarshallToAnyValue(bean, beanClass, subBean, objectFactoryClass, objectFactory, elementFactoryMethod, getter, pc); } - } else{ + } else{ S subBean = unmarshal(xsubnode, subBeanClass, pc); unmarshallToAnyValue(bean, beanClass, subBean, objectFactoryClass, objectFactory, elementFactoryMethod, getter, pc); } - } - + private void unmarshallToAnyValue(T bean, Class beanClass, S subBean, Class objectFactoryClass, Object objectFactory, Method elementFactoryMethod, Method getter, ParsingContext pc) { - - + + JAXBElement subBeanElement; try { subBeanElement = (JAXBElement) elementFactoryMethod.invoke(objectFactory, subBean); } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e1) { throw new IllegalArgumentException("Cannot invoke factory method "+elementFactoryMethod+" on "+objectFactoryClass+" with "+subBean+": "+e1, e1); } - + Collection col; Object getterReturn; try { @@ -548,12 +681,12 @@ private void unmarshallToAnyValue(T bean, Class beanClass, S subBean, Cla } col.add(subBeanElement != null ? subBeanElement.getValue() : subBeanElement); } - - private void unmarshallToAny(T bean, Field anyField, QName elementName, XNode xsubnode, ParsingContext pc) throws SchemaException{ + + private void unmarshalToAnyUsingField(T bean, Field anyField, QName elementName, XNode xsubnode, ParsingContext pc) throws SchemaException{ Method getter = inspector.findPropertyGetter(bean.getClass(), anyField.getName()); - unmarshallToAny(bean, getter, elementName, xsubnode, pc); + unmarshallToAnyUsingGetter(bean, getter, elementName, xsubnode, pc); } - + private Object instantiateObjectFactory(Class objectFactoryClass) { try { return objectFactoryClass.newInstance(); @@ -562,36 +695,6 @@ private Object instantiateObjectFactory(Class objectFactoryClass) { } } - // parses any subtype of SearchFilterType - private T unmarshalSearchFilterType(MapXNode xmap, Class beanClass, ParsingContext pc) throws SchemaException { - if (xmap == null) { - return null; - } - T filterType; - try { - filterType = beanClass.newInstance(); - } catch (InstantiationException|IllegalAccessException e) { - throw new SystemException("Cannot instantiate " + beanClass + ": " + e.getMessage(), e); - } - filterType.parseFromXNode(xmap, prismContext); - return filterType; - } - - private Type getTypeArgument(Type origType, String desc) { - if (!(origType instanceof ParameterizedType)) { - throw new IllegalArgumentException("No a parametrized type "+desc); - } - ParameterizedType parametrizedType = (ParameterizedType)origType; - Type[] actualTypeArguments = parametrizedType.getActualTypeArguments(); - if (actualTypeArguments == null || actualTypeArguments.length == 0) { - throw new IllegalArgumentException("No type arguments for getter "+desc); - } - if (actualTypeArguments.length > 1) { - throw new IllegalArgumentException("Too many type arguments for getter for "+desc); - } - return actualTypeArguments[0]; - } - private Object convertSinglePropValue(XNode xsubnode, String fieldName, Class paramType, boolean storeAsRawType, Class classType, String schemaNamespace, ParsingContext pc) throws SchemaException { Object propValue; @@ -621,10 +724,8 @@ private Object convertSinglePropValue(XNode xsubnode, String fieldName, Class pa LOGGER.warn("Unknown type name: " + xsubnode.getTypeQName() + ", ignoring it."); } } - if (xsubnode instanceof PrimitiveXNode) { - propValue = unmarshalFromPrimitive(((PrimitiveXNode)xsubnode), paramType, pc); - } else if (xsubnode instanceof MapXNode) { - propValue = unmarshalFromMap((MapXNode)xsubnode, paramType, pc); + if (xsubnode instanceof PrimitiveXNode || xsubnode instanceof MapXNode) { + propValue = unmarshal(xsubnode, paramType, pc); } else if (xsubnode instanceof ListXNode) { ListXNode xlist = (ListXNode)xsubnode; if (xlist.size() > 1) { @@ -643,106 +744,7 @@ private Object convertSinglePropValue(XNode xsubnode, String fieldName, Class pa return propValue; } - public T unmarshalFromPrimitive(PrimitiveXNode xprim, QName typeQName, ParsingContext pc) throws SchemaException { - Class classType = getSchemaRegistry().determineCompileTimeClass(typeQName); - return unmarshalFromPrimitive(xprim, classType, pc); - } - - private T unmarshalFromPrimitive(PrimitiveXNode xprim, Class classType, ParsingContext pc) throws SchemaException { - if (XmlAsStringType.class.equals(classType)) { - return (T) new XmlAsStringType((String) xprim.getParsedValue(DOMUtil.XSD_STRING)); - } - if (XmlTypeConverter.canConvert(classType)) { - // Trivial case, direct conversion - QName xsdType = XsdTypeMapper.toXsdType(classType); - T primValue = postConvertUnmarshall(xprim.getParsedValue(xsdType), pc); - return primValue; - } - - if (RawType.class.isAssignableFrom(classType)) { - RawType rawType = new RawType(xprim, prismContext); - return (T) rawType; - } - - if (PolyStringType.class.isAssignableFrom(classType)) { - // TODO fixme this hack - Object value = xprim.getParsedValue(DOMUtil.XSD_STRING); - PolyString polyString; - if (value instanceof String) { - polyString = new PolyString((String) value); - } else if (value instanceof PolyStringType) { - polyString = ((PolyStringType) value).toPolyString(); - } else if (value instanceof PolyString) { - polyString = (PolyString) value; // TODO clone? - } else if (value == null) { - polyString = null; - } else { - throw new IllegalStateException("Couldn't convert " + value + " to a PolyString; while parsing " + xprim.debugDump()); - } - if (polyString != null) { - // TODO should we always use default normalizer? - polyString.recompute(prismContext.getDefaultPolyStringNormalizer()); - } - return (T) new PolyStringType(polyString); - } - - if (ItemPathType.class.isAssignableFrom(classType)){ - Object parsedValue = xprim.getParsedValue(ItemPathType.COMPLEX_TYPE); - T primValue = postConvertUnmarshall(parsedValue, pc); - return (T) primValue; - } - - if (SearchFilterType.class.isAssignableFrom(classType)){ - throw new SchemaException("Cannot unmarshall search filter from "+xprim); - } - - if (xprim.isEmpty() && !classType.isEnum()) { - // Special case. Just return empty object - try { - return classType.newInstance(); - } catch (InstantiationException | IllegalAccessException e) { - throw new SystemException("Cannot instantiate "+classType+": "+e.getMessage(), e); - } - } - - if (!classType.isEnum()) { - throw new SchemaException("Cannot convert primitive value to non-enum bean of type " + classType); - } - // Assume string, maybe TODO extend later - String primValue = (String) xprim.getParsedValue(DOMUtil.XSD_STRING); - if (StringUtils.isBlank(primValue)) { - return null; - } - primValue = StringUtils.trim(primValue); - - String javaEnumString = inspector.findEnumFieldName(classType, primValue); -// for (Field field: classType.getDeclaredFields()) { -// XmlEnumValue xmlEnumValue = field.getAnnotation(XmlEnumValue.class); -// if (xmlEnumValue != null && xmlEnumValue.value() != null && xmlEnumValue.value().equals(primValue)) { -// javaEnumString = field.getName(); -// break; -// } -// } - - if (javaEnumString == null) { - for (Field field: classType.getDeclaredFields()) { - if (field.getName().equals(primValue)) { - javaEnumString = field.getName(); - break; - } - } - } - - if (javaEnumString == null) { - throw new SchemaException("Cannot find enum value for string '"+primValue+"' in "+classType); - } - - T bean = (T) Enum.valueOf((Class)classType, javaEnumString); - - return bean; - } - - private T postConvertUnmarshall(Object parsedPrimValue, ParsingContext pc) { + private T postConvertUnmarshal(Object parsedPrimValue, ParsingContext pc) { if (parsedPrimValue == null) { return null; } @@ -753,80 +755,7 @@ private T postConvertUnmarshall(Object parsedPrimValue, ParsingContext pc) { } } - - public void visit(Object bean, Handler handler) { - if (bean == null) { - return; - } - - Class beanClass = bean.getClass(); - - handler.handle(bean); - - if (beanClass.isEnum() || beanClass.isPrimitive()){ - //nothing more to do - return; - } - - // TODO: implement special handling for RawType, if necessary (it has no XmlType annotation any more) - - XmlType xmlType = beanClass.getAnnotation(XmlType.class); - if (xmlType == null) { - // no @XmlType annotation, we are not interested to go any deeper - return; - } - - List propOrder = inspector.getPropOrder(beanClass); - for (String fieldName: propOrder) { - Method getter = inspector.findPropertyGetter(beanClass, fieldName); - if (getter == null) { - throw new IllegalStateException("No getter for field "+fieldName+" in "+beanClass); - } - Object getterResult; - try { - getterResult = getter.invoke(bean); - } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { - throw new SystemException("Cannot invoke method for field "+fieldName+" in "+beanClass+": "+e.getMessage(), e); - } - - if (getterResult == null) { - continue; - } - - if (getterResult instanceof Collection) { - Collection col = (Collection)getterResult; - if (col.isEmpty()) { - continue; - } - - for (Object element: col) { - visitValue(element, handler); - - } - } else { - visitValue(getterResult, handler); - } - } - } - - private void visitValue(Object element, Handler handler) { - Object elementToMarshall = element; - if (element instanceof JAXBElement){ - elementToMarshall = ((JAXBElement) element).getValue(); - } - visit(elementToMarshall, handler); - } - - private PolyStringType unmarshalPolyStringType(MapXNode xmap) throws SchemaException { - String orig = xmap.getParsedPrimitiveValue(QNameUtil.nullNamespace(PolyString.F_ORIG), DOMUtil.XSD_STRING); - if (orig == null) { - throw new SchemaException("Null polystring orig in "+xmap); - } - String norm = xmap.getParsedPrimitiveValue(QNameUtil.nullNamespace(PolyString.F_NORM), DOMUtil.XSD_STRING); - return new PolyStringType(new PolyString(orig, norm)); - } - - private SchemaDefinitionType unmarshalSchemaDefinitionType(MapXNode xmap) throws SchemaException { + private SchemaDefinitionType unmarshalSchemaDefinitionType(MapXNode xmap, Class beanClass, ParsingContext pc) throws SchemaException { Entry subEntry = xmap.getSingleSubEntry("schema element"); if (subEntry == null) { return null; @@ -838,35 +767,183 @@ private SchemaDefinitionType unmarshalSchemaDefinitionType(MapXNode xmap) throws if (!(xsub instanceof SchemaXNode)) { throw new SchemaException("Cannot parse schema from "+xsub); } -// Element schemaElement = ((SchemaXNode)xsub).getSchemaElement(); -// if (schemaElement == null) { -// throw new SchemaException("Empty schema in "+xsub); -// } - SchemaDefinitionType schemaDefType = unmarshalSchemaDefinitionType((SchemaXNode) xsub); -// new SchemaDefinitionType(); -// schemaDefType.setSchema(schemaElement); - return schemaDefType; + return unmarshalSchemaDefinitionType((SchemaXNode) xsub); } - public SchemaDefinitionType unmarshalSchemaDefinitionType(SchemaXNode xsub) throws SchemaException{ - Element schemaElement = ((SchemaXNode)xsub).getSchemaElement(); + SchemaDefinitionType unmarshalSchemaDefinitionType(SchemaXNode xsub) throws SchemaException{ + Element schemaElement = xsub.getSchemaElement(); if (schemaElement == null) { - throw new SchemaException("Empty schema in "+xsub); + throw new SchemaException("Empty schema in " + xsub); } SchemaDefinitionType schemaDefType = new SchemaDefinitionType(); schemaDefType.setSchema(schemaElement); return schemaDefType; } - public boolean canProcess(QName typeName) { - return ((PrismContextImpl) getPrismContext()).getBeanMarshaller().canProcess(typeName); + @NotNull + public PrismContext getPrismContext() { + return prismContext; } - public boolean canProcess(Class clazz) { - return ((PrismContextImpl) getPrismContext()).getBeanMarshaller().canProcess(clazz); + + @NotNull + private SchemaRegistry getSchemaRegistry() { + return prismContext.getSchemaRegistry(); } - public QName determineTypeForClass(Class clazz) { - return inspector.determineTypeForClass(clazz); + + + //region Specific unmarshallers ========================================================= + + // parses any subtype of SearchFilterType + private T unmarshalSearchFilterType(MapXNode xmap, Class beanClass, ParsingContext pc) throws SchemaException { + if (xmap == null) { + return null; + } + T filterType; + try { + filterType = beanClass.newInstance(); + } catch (InstantiationException|IllegalAccessException e) { + throw new SystemException("Cannot instantiate " + beanClass + ": " + e.getMessage(), e); + } + filterType.parseFromXNode(xmap, prismContext); + return filterType; + } + + private ItemPathType unmarshalItemPath(PrimitiveXNode primitiveXNode, Class beanClass, ParsingContext parsingContext) + throws SchemaException { + Object parsedValue = primitiveXNode.getParsedValue(ItemPathType.COMPLEX_TYPE); + return postConvertUnmarshal(parsedValue, parsingContext); + } + + private Object unmarshalPolyStringFromPrimitive(PrimitiveXNode node, Class beanClass, ParsingContext parsingContext) + throws SchemaException { + Object value = node.getParsedValue(DOMUtil.XSD_STRING); + return toCorrectPolyStringClass(value, beanClass, node); } + private Object unmarshalPolyStringFromMap(MapXNode map, Class beanClass, ParsingContext pc) throws SchemaException { + String orig = map.getParsedPrimitiveValue(QNameUtil.nullNamespace(PolyString.F_ORIG), DOMUtil.XSD_STRING); + if (orig == null) { + throw new SchemaException("Null polystring orig in "+map); + } + String norm = map.getParsedPrimitiveValue(QNameUtil.nullNamespace(PolyString.F_NORM), DOMUtil.XSD_STRING); + Object value = new PolyStringType(new PolyString(orig, norm)); + return toCorrectPolyStringClass(value, beanClass, map); + } + + private Object toCorrectPolyStringClass(Object value, Class beanClass, XNode node) { + PolyString polyString; + if (value instanceof String) { + polyString = new PolyString((String) value); + } else if (value instanceof PolyStringType) { + polyString = ((PolyStringType) value).toPolyString(); + } else if (value instanceof PolyString) { + polyString = (PolyString) value; // TODO clone? + } else if (value == null) { + polyString = null; + } else { + throw new IllegalStateException("Couldn't convert " + value + " to a PolyString; while parsing " + node.debugDump()); + } + if (polyString != null && polyString.getNorm() == null) { + // TODO should we always use default normalizer? + polyString.recompute(prismContext.getDefaultPolyStringNormalizer()); + } + if (PolyString.class.equals(beanClass)) { + return polyString; + } else if (PolyStringType.class.equals(beanClass)) { + return new PolyStringType(polyString); + } else { + throw new IllegalArgumentException("Wrong class for PolyString value: " + beanClass); + } + } + + private Object notSupported(XNode node, Class beanClass, ParsingContext parsingContext) { + // TODO what if compat mode? + throw new IllegalArgumentException("The following couldn't be parsed as " + beanClass + ": " + node.debugDump()); + } + + private XmlAsStringType unmarshalXmlAsStringFromPrimitive(PrimitiveXNode node, Class beanClass, ParsingContext parsingContext) throws SchemaException { + return new XmlAsStringType(((PrimitiveXNode) node).getParsedValue(DOMUtil.XSD_STRING)); + } + + private XmlAsStringType unmarshalXmlAsStringFromMap(MapXNode map, Class beanClass, ParsingContext parsingContext) throws SchemaException { + // reading a string represented a XML-style content + // used e.g. when reading report templates (embedded XML) + // A necessary condition: there may be only one map entry. + if (map.size() > 1) { + throw new SchemaException("Map with more than one item cannot be parsed as a string: " + map); + } else if (map.isEmpty()) { + return new XmlAsStringType(); + } else { + Entry entry = map.entrySet().iterator().next(); + DomLexicalProcessor domParser = ((PrismContextImpl) prismContext).getParserDom(); + String value = domParser.write(entry.getValue(), entry.getKey(), null); + return new XmlAsStringType(value); + } + } + + private RawType unmarshalRawType(XNode node, Class beanClass, ParsingContext parsingContext) { + // TODO We could probably try to parse the raw node content using information from explicit node type. + return new RawType(node, prismContext); + } + + private T unmarshalEnumFromPrimitive(PrimitiveXNode prim, Class beanClass, ParsingContext pc) + throws SchemaException { + + String primValue = (String) prim.getParsedValue(DOMUtil.XSD_STRING); + primValue = StringUtils.trim(primValue); + if (StringUtils.isEmpty(primValue)) { + return null; + } + + String javaEnumString = inspector.findEnumFieldName(beanClass, primValue); + if (javaEnumString == null) { + for (Field field: beanClass.getDeclaredFields()) { + if (field.getName().equals(primValue)) { + javaEnumString = field.getName(); + break; + } + } + } + if (javaEnumString == null) { + throw new SchemaException("Cannot find enum value for string '"+primValue+"' in "+beanClass); + } + + @SuppressWarnings("unchecked") + T bean = (T) Enum.valueOf((Class)beanClass, javaEnumString); + return bean; + } + + private ProtectedStringType unmarshalProtectedString(MapXNode map, Class beanClass, ParsingContext pc) throws SchemaException { + ProtectedStringType protectedType = new ProtectedStringType(); + XNodeProcessorUtil.parseProtectedType(protectedType, map, prismContext, pc); + return protectedType; + } + + private ProtectedStringType unmarshalProtectedString(PrimitiveXNode prim, Class beanClass, ParsingContext pc) throws SchemaException { + ProtectedStringType protectedType = new ProtectedStringType(); + protectedType.setClearValue(prim.getParsedValue(DOMUtil.XSD_STRING)); + return protectedType; + } + + private ProtectedByteArrayType unmarshalProtectedByteArray(MapXNode map, Class beanClass, ParsingContext pc) throws SchemaException { + ProtectedByteArrayType protectedType = new ProtectedByteArrayType(); + XNodeProcessorUtil.parseProtectedType(protectedType, map, prismContext, pc); + return protectedType; + } + + private ProtectedByteArrayType unmarshalProtectedByteArray(PrimitiveXNode prim, Class beanClass, ParsingContext pc) throws SchemaException { + ProtectedByteArrayType protectedType = new ProtectedByteArrayType(); + String stringValue = prim.getParsedValue(DOMUtil.XSD_STRING); + if (stringValue == null) { + return null; + } + try { + protectedType.setClearValue(ArrayUtils.toObject(stringValue.getBytes("UTF-8"))); + } catch (UnsupportedEncodingException e) { + throw new SystemException("UTF-8 encoding is not supported", e); + } + return protectedType; + } + //endregion } \ No newline at end of file diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismBeanInspector.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismBeanInspector.java index a3a086b173b..6e66b9afedd 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismBeanInspector.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismBeanInspector.java @@ -40,6 +40,8 @@ import java.lang.reflect.Field; import java.lang.reflect.Method; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; @@ -186,23 +188,14 @@ public List get(Class c) { private Map> _findElementMethodInObjectFactory = Collections.synchronizedMap(new HashMap()); Method findElementMethodInObjectFactory(Class objectFactoryClass, String propName) { - return find2(_findElementMethodInObjectFactory, objectFactoryClass, propName, new Getter2() { - @Override - public Method get(Class c, String p) { - return findElementMethodInObjectFactoryUncached(c, p); - } - }); + return find2(_findElementMethodInObjectFactory, objectFactoryClass, propName, + (c, p) -> findElementMethodInObjectFactoryUncached(c, p)); } private Map> _lookupSubstitution = Collections.synchronizedMap(new HashMap()); Field lookupSubstitution(Class beanClass, Method elementMethod) { - return find2(_lookupSubstitution, beanClass, elementMethod, new Getter2() { - @Override - public Field get(Class c, Method m) { - return lookupSubstitutionUncached(c, m); - } - }); + return find2(_lookupSubstitution, beanClass, elementMethod, (c, m) -> lookupSubstitutionUncached(c, m)); } private Map> _findEnumFieldName = Collections.synchronizedMap(new HashMap()); @@ -247,23 +240,13 @@ public QName get(String fieldName, Class beanClass, String def private Map> _findPropertyGetter = Collections.synchronizedMap(new HashMap()); public Method findPropertyGetter(Class beanClass, String propName) { - return find2(_findPropertyGetter, beanClass, propName, new Getter2() { - @Override - public Method get(Class param1, String param2) { - return findPropertyGetterUncached(param1, param2); - } - }); + return find2(_findPropertyGetter, beanClass, propName, (param1, param2) -> findPropertyGetterUncached(param1, param2)); } private Map> _findPropertyField = Collections.synchronizedMap(new HashMap()); public Field findPropertyField(Class beanClass, String propName) { - return find2(_findPropertyField, beanClass, propName, new Getter2() { - @Override - public Field get(Class param1, String param2) { - return findPropertyFieldUncached(param1, param2); - } - }); + return find2(_findPropertyField, beanClass, propName, (param1, param2) -> findPropertyFieldUncached(param1, param2)); } //endregion @@ -307,11 +290,11 @@ private Method findPropertyGetterUncached(Class classType, String propNam } for (Method method: classType.getDeclaredMethods()) { XmlElement xmlElement = method.getAnnotation(XmlElement.class); - if (xmlElement != null && xmlElement.name() != null && xmlElement.name().equals(propName)) { + if (xmlElement != null && xmlElement.name().equals(propName)) { return method; } XmlAttribute xmlAttribute = method.getAnnotation(XmlAttribute.class); - if (xmlAttribute != null && xmlAttribute.name() != null && xmlAttribute.name().equals(propName)) { + if (xmlAttribute != null && xmlAttribute.name().equals(propName)) { return method; } } @@ -457,28 +440,15 @@ private Method findElementMethodInObjectFactoryUncached(Class objectFactoryClass return null; } - private Field lookupSubstitutionUncached(Class beanClass, Method elementMethod) { - XmlElementDecl xmlElementDecl = elementMethod.getAnnotation(XmlElementDecl.class); + private Field lookupSubstitutionUncached(Class beanClass, Method elementMethodInObjectFactory) { + XmlElementDecl xmlElementDecl = elementMethodInObjectFactory.getAnnotation(XmlElementDecl.class); if (xmlElementDecl == null) { return null; } final String substitutionHeadName = xmlElementDecl.substitutionHeadName(); - if (substitutionHeadName == null) { - return null; - } - return findField(beanClass,new Handler() { - @Override - public boolean handle(Field field) { - XmlElementRef xmlElementRef = field.getAnnotation(XmlElementRef.class); - if (xmlElementRef == null) { - return false; - } - String name = xmlElementRef.name(); - if (name == null) { - return false; - } - return name.equals(substitutionHeadName); - } + return findField(beanClass, field -> { + XmlElementRef xmlElementRef = field.getAnnotation(XmlElementRef.class); + return xmlElementRef != null && xmlElementRef.name().equals(substitutionHeadName); }); } @@ -669,11 +639,22 @@ public boolean handle(Field field) { } public Method findAnyMethod(Class beanClass) { - return findMethod(beanClass, new Handler() { - @Override - public boolean handle(Method method) { - return (method.getAnnotation(XmlAnyElement.class) != null); - } - }); + return findMethod(beanClass, method -> (method.getAnnotation(XmlAnyElement.class) != null)); + } + + // e.g. Collection -> UserType + Type getTypeArgument(Type origType, String desc) { + if (!(origType instanceof ParameterizedType)) { + throw new IllegalArgumentException("Not a parametrized type "+desc); + } + ParameterizedType parametrizedType = (ParameterizedType)origType; + Type[] actualTypeArguments = parametrizedType.getActualTypeArguments(); + if (actualTypeArguments == null || actualTypeArguments.length == 0) { + throw new IllegalArgumentException("No type arguments for getter "+desc); + } + if (actualTypeArguments.length > 1) { + throw new IllegalArgumentException("Too many type arguments for getter for "+desc); + } + return actualTypeArguments[0]; } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismMarshaller.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismMarshaller.java index 8424e500a6c..81b9bfab93b 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismMarshaller.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismMarshaller.java @@ -47,10 +47,10 @@ */ public class PrismMarshaller { - @NotNull private final BeanMarshaller beanConverter; + @NotNull private final BeanMarshaller beanMarshaller; - public PrismMarshaller(@NotNull BeanMarshaller beanConverter) { - this.beanConverter = beanConverter; + public PrismMarshaller(@NotNull BeanMarshaller beanMarshaller) { + this.beanMarshaller = beanMarshaller; } //region Public interface ====================================================================================== @@ -122,15 +122,24 @@ RootXNode marshalPrismValueAsRoot(@NotNull PrismValue value, QName itemName, Ite RootXNode marshalAnyData(@NotNull Object object, QName itemName, ItemDefinition itemDefinition, SerializationContext context) throws SchemaException { if (object instanceof Item) { return marshalItemAsRoot((Item) object, itemName, itemDefinition, context); - } else { - Validate.notNull(itemName, "itemName must be specified for non-Item objects"); - XNode valueNode = beanConverter.marshall(object, context); // TODO item definition! + } + Validate.notNull(itemName, "itemName must be specified for non-Item objects"); + if (object instanceof Objectable) { + return marshalItemAsRoot(((Objectable) object).asPrismObject(), itemName, null, context); + } else if (object instanceof Containerable) { + return marshalPrismValueAsRoot(((Containerable) object).asPrismContainerValue(), itemName, null, context); + } else if (beanMarshaller.canProcess(object.getClass())) { + XNode valueNode = beanMarshaller.marshall(object, context); // TODO item definition! QName typeName = JAXBUtil.getTypeQName(object.getClass()); - addTypeDefinitionIfNeeded(itemName, typeName, valueNode); - if (valueNode.getTypeQName() == null && typeName == null) { - throw new SchemaException("No type QName for class " + object.getClass()); - } + if (valueNode != null) { + addTypeDefinitionIfNeeded(itemName, typeName, valueNode); + if (valueNode.getTypeQName() == null && typeName == null) { + throw new SchemaException("No type QName for class " + object.getClass()); + } + } // TODO or else put type name at least to root? (but, can valueNode be null if object is not null?) return new RootXNode(itemName, valueNode); + } else { + throw new IllegalArgumentException("Couldn't serialize " + object); } } @@ -138,7 +147,7 @@ public boolean canSerialize(Object object) { if (object instanceof Item) { return true; } else { - return beanConverter.canProcess(object.getClass()); + return beanMarshaller.canProcess(object.getClass()); } } @@ -382,8 +391,8 @@ private XNode serializePropertyValue(@NotNull PrismPropertyValue value, P T realValue = value.getValue(); if (realValue instanceof PolyString) { return serializePolyString((PolyString) realValue); - } else if (beanConverter.canProcess(typeName)) { - XNode xnode = beanConverter.marshall(realValue); + } else if (beanMarshaller.canProcess(typeName)) { + XNode xnode = beanMarshaller.marshall(realValue); // // why is this? // if (realValue instanceof ProtectedDataType && (definition == null || definition.isDynamic())) { // xnode.setExplicitTypeDeclaration(true); @@ -410,7 +419,7 @@ private XNode serializePropertyRawValue(PrismPropertyValue value) throws } T realValue = value.getValue(); if (realValue != null) { - return createPrimitiveXNode(realValue, DOMUtil.XSD_STRING); + return createPrimitiveXNode(realValue, null); } else { throw new IllegalStateException("Neither real nor raw value present in " + value); } @@ -435,10 +444,10 @@ private PrimitiveXNode createPrimitiveXNode(T val, QName type) { @NotNull private SchemaRegistry getSchemaRegistry() { - return beanConverter.getPrismContext().getSchemaRegistry(); + return beanMarshaller.getPrismContext().getSchemaRegistry(); } - private void addTypeDefinitionIfNeeded(@NotNull QName itemName, QName typeName, XNode valueNode) { + private void addTypeDefinitionIfNeeded(@NotNull QName itemName, QName typeName, @NotNull XNode valueNode) { if (valueNode.getTypeQName() != null && valueNode.isExplicitTypeDeclaration()) { return; // already set } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismUnmarshaller.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismUnmarshaller.java index 6f9a06caad2..77f0117893d 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismUnmarshaller.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismUnmarshaller.java @@ -15,47 +15,34 @@ */ package com.evolveum.midpoint.prism.marshaller; -import java.util.Collection; -import java.util.Map.Entry; - -import javax.xml.XMLConstants; -import javax.xml.namespace.QName; - import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.schema.PrismSchema; import com.evolveum.midpoint.prism.schema.SchemaRegistry; -import com.evolveum.midpoint.util.logging.Trace; -import com.evolveum.midpoint.util.logging.TraceManager; -import com.evolveum.prism.xml.ns._public.query_3.SearchFilterType; - -import com.evolveum.prism.xml.ns._public.types_3.RawType; -import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.lang.Validate; - -import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.prism.util.PrismUtil; -import com.evolveum.midpoint.prism.xnode.ListXNode; -import com.evolveum.midpoint.prism.xnode.MapXNode; -import com.evolveum.midpoint.prism.xnode.PrimitiveXNode; -import com.evolveum.midpoint.prism.xnode.RootXNode; -import com.evolveum.midpoint.prism.xnode.SchemaXNode; -import com.evolveum.midpoint.prism.xnode.XNode; +import com.evolveum.midpoint.prism.xnode.*; import com.evolveum.midpoint.util.DOMUtil; -import com.evolveum.midpoint.util.DisplayableValue; import com.evolveum.midpoint.util.QNameUtil; import com.evolveum.midpoint.util.exception.SchemaException; -import com.evolveum.midpoint.util.exception.SystemException; +import com.evolveum.midpoint.util.logging.Trace; +import com.evolveum.midpoint.util.logging.TraceManager; +import com.evolveum.prism.xml.ns._public.query_3.SearchFilterType; import com.evolveum.prism.xml.ns._public.types_3.EvaluationTimeType; import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; import com.evolveum.prism.xml.ns._public.types_3.SchemaDefinitionType; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang.Validate; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import javax.xml.XMLConstants; +import javax.xml.namespace.QName; +import java.util.Map.Entry; + public class PrismUnmarshaller { private static final Trace LOGGER = TraceManager.getTrace(PrismUnmarshaller.class); - public static final QName ARTIFICIAL_OBJECT_NAME = new QName(XMLConstants.NULL_NS_URI, "anObject"); + private static final QName ARTIFICIAL_OBJECT_NAME = new QName(XMLConstants.NULL_NS_URI, "anObject"); @NotNull private PrismContext prismContext; @@ -293,7 +280,7 @@ private PrismProperty parseProperty(@NotNull XNode node, @NotNull QName i PrismProperty property = itemDefinition != null ? itemDefinition.instantiate() : - new PrismProperty(itemName, prismContext); + new PrismProperty<>(itemName, prismContext); if (node instanceof ListXNode) { ListXNode listNode = (ListXNode) node; @@ -325,114 +312,39 @@ private PrismProperty parseProperty(@NotNull XNode node, @NotNull QName i // if definition == null or any AND node has type defined, this type must be non-containerable (fit into PPV) private PrismPropertyValue parsePropertyValue(@NotNull XNode node, @Nullable PrismPropertyDefinition definition, @NotNull ParsingContext pc) throws SchemaException { - - if (definition == null || definition.isAnyType()) { - if (node.getTypeQName() == null) { - return PrismPropertyValue.createRaw(node); - } - // TODO FIX/TEST THIS UGLY HACK - if (node instanceof PrimitiveXNode) { - PrimitiveXNode prim = (PrimitiveXNode) node; - prim.parseValue(node.getTypeQName(), pc.getEvaluationMode()); - if (prim.getValue() != null) { - return new PrismPropertyValue<>((T) prim.getValue()); - } else { - return null; - } - } else if (node instanceof MapXNode) { - if (getBeanUnmarshaller().canProcess(node.getTypeQName())) { - T value = getBeanUnmarshaller().unmarshal((MapXNode) node, node.getTypeQName(), pc); - if (value instanceof Containerable) { - throw new IllegalStateException("Cannot store containerable into prism property: " + node.debugDump()); - } else { - return new PrismPropertyValue<>(value); - } - } else { - // TODO or should treat this elsewhere? - throw new IllegalStateException("Cannot parse as " + node.getTypeQName() + ": " + node.debugDump()); - } - } else { - throw new IllegalArgumentException("Unexpected node: " + node.debugDump()); + QName typeName = + getSchemaRegistry().selectMoreSpecific( + definition != null && !definition.isAnyType() ? definition.getTypeName() : null, + node.getTypeQName() + ); + if (typeName == null) { + return PrismPropertyValue.createRaw(node); + } else if (getBeanUnmarshaller().canProcess(typeName)) { + T realValue = getBeanUnmarshaller().unmarshal(node, typeName, pc); + // Postprocessing after returning from unmarshaller. It speaks bean language (e.g. PolyStringType, not PolyString). + // It also doesn't know about prism-specific things like allowed values, etc. + if (realValue instanceof PolyStringType) { + @SuppressWarnings("unchecked") + T valueT = (T) ((PolyStringType) realValue).toPolyString(); + realValue = valueT; } - } - - T realValue; - if (node instanceof PrimitiveXNode) { - @SuppressWarnings("unchecked") - PrimitiveXNode primitiveNode = (PrimitiveXNode) node; - realValue = parsePropertyRealValueFromPrimitive(primitiveNode, definition, pc); - } else if (node instanceof MapXNode) { - realValue = parsePropertyRealValueFromMap((MapXNode) node, definition, pc); - } else { - throw new IllegalArgumentException("Cannot parse property value from " + node.debugDump()); - } - return realValue != null ? new PrismPropertyValue(realValue) : null; - } - - private T parsePropertyRealValueFromPrimitive(@NotNull PrimitiveXNode primitiveNode, - @NotNull PrismPropertyDefinition definition, @NotNull ParsingContext pc) throws SchemaException { - - QName typeName = definition.getTypeName(); - T realValue; - if (getBeanUnmarshaller().canProcess(typeName)) { - // Primitive elements may also have complex Java representations (e.g. enums) - realValue = getBeanUnmarshaller().unmarshalFromPrimitive(primitiveNode, typeName, pc); - } else if (!DOMUtil.XSD_ANYTYPE.equals(typeName)) { - try { - realValue = primitiveNode.getParsedValue(typeName, pc.getEvaluationMode()); - } catch (SchemaException e) { - pc.warnOrThrow(LOGGER, "Couldn't parse primitive value of type " + typeName + ". Value: " + primitiveNode.getStringValue() - + ".\nDefinition: " + definition.debugDump(), e); + PrismUtil.recomputeRealValue(realValue, prismContext); + if (!isValueAllowed(realValue, definition)) { + pc.warnOrThrow(LOGGER, "Skipping unknown value of type " + typeName + ". Value: " + realValue); return null; } + return realValue != null ? new PrismPropertyValue<>(realValue) : null; } else { - realValue = (T) RawType.create(primitiveNode, prismContext); + throw new IllegalStateException("Cannot parse as " + typeName + ": " + node.debugDump()); } - - if (!(realValue instanceof RawType) && !isValueAllowed(realValue, definition.getAllowedValues())) { - pc.warnOrThrow(LOGGER, "Skipping unknown value of type " + typeName + ". Value: " + primitiveNode.getStringValue()); - return null; - } - - if (realValue == null) { - return null; - } else if (realValue instanceof PolyStringType) { - PolyStringType polyStringType = (PolyStringType) realValue; - realValue = (T) new PolyString(polyStringType.getOrig(), polyStringType.getNorm()); - } else if (realValue instanceof String && typeName.equals(PolyStringType.COMPLEX_TYPE)) { - String val = (String) realValue; - realValue = (T) new PolyString(val); - } - - PrismUtil.recomputeRealValue(realValue, prismContext); - return realValue; } - private T parsePropertyRealValueFromMap(@NotNull MapXNode xmap, @NotNull PrismPropertyDefinition propertyDefinition, - @NotNull ParsingContext pc) - throws SchemaException { - QName typeName = propertyDefinition.getTypeName(); - if (getBeanUnmarshaller().canProcess(typeName)) { - return getBeanUnmarshaller().unmarshal(xmap, typeName, pc); - } else { - if (propertyDefinition.isRuntimeSchema()) { - throw new SchemaException("Complex run-time properties are not supported: type " + typeName + " from " + xmap); - } else { - throw new SystemException("Cannot parse compile-time property " + propertyDefinition.getName() + " type " + typeName + " from " + xmap); - } - } - } - - private boolean isValueAllowed(T realValue, Collection> collection) { - if (CollectionUtils.isEmpty(collection)) { + private boolean isValueAllowed(T realValue, PrismPropertyDefinition definition) { + if (definition == null || CollectionUtils.isEmpty(definition.getAllowedValues())) { return true; } - for (DisplayableValue o : collection) { - if (realValue.equals(o.getValue())) { - return true; - } - } - return false; + return definition.getAllowedValues().stream() + .anyMatch(displayableValue -> realValue.equals(displayableValue.getValue())); } @NotNull @@ -525,7 +437,7 @@ private PrismReferenceValue parseReferenceValueAsReference(@NotNull XNode xnode, refVal.setDescription(map.getParsedPrimitiveValue(XNode.KEY_REFERENCE_DESCRIPTION, DOMUtil.XSD_STRING)); - refVal.setFilter(parseFilter(map.get(XNode.KEY_REFERENCE_FILTER), pc)); + refVal.setFilter(parseFilter(map.get(XNode.KEY_REFERENCE_FILTER))); String resolutionTimeString = map.getParsedPrimitiveValue(XNode.KEY_REFERENCE_RESOLUTION_TIME, DOMUtil.XSD_STRING); if (resolutionTimeString != null) { @@ -608,7 +520,7 @@ private PrismReferenceValue parseReferenceValueAsCompositeObject(XNode node, return refVal; } - private SearchFilterType parseFilter(XNode xnode, ParsingContext pc) throws SchemaException { + private SearchFilterType parseFilter(XNode xnode) throws SchemaException { if (xnode == null) { return null; } @@ -618,7 +530,7 @@ private SearchFilterType parseFilter(XNode xnode, ParsingContext pc) throws Sche return SearchFilterType.createFromXNode(xnode, prismContext); } - private ItemDefinition locateItemDefinition(@NotNull QName itemName, + private ItemDefinition locateItemDefinition(@NotNull QName itemName, @Nullable ComplexTypeDefinition complexTypeDefinition, XNode xnode) throws SchemaException { return getSchemaRegistry() diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/QueryConvertor.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/QueryConvertor.java index e7769dfa9ba..ac9ca4afb68 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/QueryConvertor.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/QueryConvertor.java @@ -28,6 +28,7 @@ import com.evolveum.midpoint.prism.xnode.*; import com.evolveum.prism.xml.ns._public.query_3.SearchFilterType; +import com.evolveum.prism.xml.ns._public.types_3.ItemPathType; import com.evolveum.prism.xml.ns._public.types_3.ObjectReferenceType; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.Validate; @@ -591,7 +592,8 @@ private static ItemPath getPath(MapXNode clauseXMap, QName key) throws SchemaExc if (!(xnode instanceof PrimitiveXNode)) { throw new SchemaException("Expected that field "+key+" will be primitive, but it is "+xnode.getDesc()); } - return clauseXMap.getParsedPrimitiveValue(key, ItemPath.XSD_TYPE); + ItemPathType itemPathType = clauseXMap.getParsedPrimitiveValue(key, ItemPathType.COMPLEX_TYPE); + return itemPathType != null ? itemPathType.getItemPath() : null; } private static QName getMatchingRule(MapXNode xmap) throws SchemaException{ @@ -788,7 +790,7 @@ private static MapXNode seriali map.put(ELEMENT_VALUE, valuesNode); } if (filter.getRightHandSidePath() != null) { - map.put(ELEMENT_RIGHT_HAND_SIDE_PATH, createPrimitiveXNode(filter.getRightHandSidePath(), ItemPath.XSD_TYPE)); + map.put(ELEMENT_RIGHT_HAND_SIDE_PATH, createPrimitiveXNode(filter.getRightHandSidePath().asItemPathType(), ItemPathType.COMPLEX_TYPE)); } ExpressionWrapper xexpression = filter.getExpression(); @@ -877,7 +879,7 @@ private static void serializePath(MapXNode map, ItemPath path, ObjectFilter filt if (path == null) { throw new IllegalStateException("Cannot serialize filter " + filter + " because it does not contain path"); } - map.put(ELEMENT_PATH, createPrimitiveXNode(path, ItemPath.XSD_TYPE)); + map.put(ELEMENT_PATH, createPrimitiveXNode(path.asItemPathType(), ItemPathType.COMPLEX_TYPE)); } private static XNode serializePropertyValue(PrismPropertyValue value, PrismPropertyDefinition definition, BeanMarshaller beanConverter) throws SchemaException { diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/XPathHolder.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/XPathHolder.java index 87c7fcd6074..6a5da74591d 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/XPathHolder.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/XPathHolder.java @@ -34,6 +34,7 @@ import com.evolveum.midpoint.util.QNameUtil; import org.apache.commons.lang.StringUtils; +import org.jetbrains.annotations.NotNull; import org.w3c.dom.DOMException; import org.w3c.dom.Document; import org.w3c.dom.Element; @@ -447,6 +448,7 @@ public List toSegments() { return Collections.unmodifiableList(segments); } + @NotNull public ItemPath toItemPath() { List xsegments = toSegments(); List segments = new ArrayList(xsegments.size()); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/path/ItemPath.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/path/ItemPath.java index b2eae6022d2..9d9988335d1 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/path/ItemPath.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/path/ItemPath.java @@ -37,8 +37,10 @@ * */ public class ItemPath implements Serializable, Cloneable { - + + @Deprecated // use ItemPathType.COMPLEX_TYPE public static final QName XSD_TYPE = ItemPathType.COMPLEX_TYPE; + public static final ItemPath EMPTY_PATH = new ItemPath(); private List segments; @@ -680,4 +682,9 @@ public static void checkNoReferences(ItemPath path) { } } + public ItemPathType asItemPathType() { + return new ItemPathType(this); + } + + } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistry.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistry.java index 6a2e150549c..98c2a24c831 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistry.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistry.java @@ -80,7 +80,7 @@ ItemDefinition locateItemDefinition(@NotNull QName ite Class getCompileTimeClass(QName xsdType); - PrismSchema findSchemaByCompileTimeClass(Class compileTimeClass); + PrismSchema findSchemaByCompileTimeClass(@NotNull Class compileTimeClass); /** * Tries to determine type name for any class (primitive, complex one). @@ -136,7 +136,7 @@ T findItemDefinitionByFullPath(Class PrismObject instantiate(Class compileTimeClass) throws SchemaException; // Takes XSD types into account as well - Class determineClassForType(QName type); + Class determineClassForType(QName type); // Takes XSD types into account as well Class determineClassForItemDefinition(ItemDefinition itemDefinition); @@ -144,6 +144,9 @@ T findItemDefinitionByFullPath(Class ID selectMoreSpecific(ID def1, ID def2) throws SchemaException; + QName selectMoreSpecific(QName type1, QName type2) + throws SchemaException; + enum ComparisonResult { EQUAL, // types are equal NO_STATIC_CLASS, // static class cannot be determined diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistryImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistryImpl.java index cdbf99bc672..acafedb223f 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistryImpl.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistryImpl.java @@ -43,6 +43,7 @@ import com.evolveum.midpoint.prism.xml.XsdTypeMapper; import com.evolveum.midpoint.util.QNameUtil; import com.evolveum.prism.xml.ns._public.types_3.ObjectType; +import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; import org.apache.commons.lang.StringUtils; import org.apache.xml.resolver.Catalog; import org.apache.xml.resolver.CatalogManager; @@ -1085,8 +1086,11 @@ public Collection getSchemaDescriptions() { @Override - public PrismSchema findSchemaByCompileTimeClass(Class compileTimeClass) { + public PrismSchema findSchemaByCompileTimeClass(@NotNull Class compileTimeClass) { Package compileTimePackage = compileTimeClass.getPackage(); + if (compileTimePackage == null) { + System.out.println("Hi"); + } for (SchemaDescription desc: schemaDescriptions) { if (compileTimePackage.equals(desc.getCompileTimeClassesPackage())) { PrismSchema schema = desc.getSchema(); @@ -1207,7 +1211,7 @@ public QName determineTypeForClass(Class clazz) { } @Override - public Class determineClassForType(QName type) { + public Class determineClassForType(QName type) { if (XmlTypeConverter.canConvert(type)) { return XsdTypeMapper.toJavaType(type); } else { @@ -1254,6 +1258,41 @@ public ID selectMoreSpecific(ID def1, ID def2) + " (" + cls1 + ") and " + def2.getTypeName() + " (" + cls2 + ")"); } + @Override + public QName selectMoreSpecific(QName type1, QName type2) + throws SchemaException { + if (type1 == null || QNameUtil.match(type1, DOMUtil.XSD_ANYTYPE)) { + return type2; + } + if (type2 == null || QNameUtil.match(type2, DOMUtil.XSD_ANYTYPE)) { + return type1; + } + if (QNameUtil.match(type1, type2)) { + return type1; + } + Class cls1 = determineClassForType(type1); + Class cls2 = determineClassForType(type2); + if (cls1 == null || cls2 == null) { + throw new SchemaException("Couldn't find more specific type from " + type1 + + " (" + cls1 + ") and " + type2 + " (" + cls2 + ")"); + } + if (cls1.isAssignableFrom(cls2)) { + return type2; + } + if (cls2.isAssignableFrom(cls1)) { + return type1; + } + // poly string vs string + if (PolyStringType.class.equals(cls1) || String.class.equals(cls2)) { + return type1; + } + if (PolyStringType.class.equals(cls2) || String.class.equals(cls1)) { + return type2; + } + throw new SchemaException("Couldn't find more specific type from " + type1 + + " (" + cls1 + ") and " + type2 + " (" + cls2 + ")"); + } + @Override public ComparisonResult compareDefinitions(@NotNull ID def1, @NotNull ID def2) throws SchemaException { diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xml/XsdTypeMapper.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xml/XsdTypeMapper.java index 126e23c25c0..c7a1a604756 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xml/XsdTypeMapper.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xml/XsdTypeMapper.java @@ -88,11 +88,12 @@ private static void initTypeMap() throws IOException, ClassNotFoundException { addMapping(XMLGregorianCalendar.class, DOMUtil.XSD_DATETIME, true); addMapping(Duration.class, DOMUtil.XSD_DURATION, true); - addMapping(ItemPath.class, ItemPath.XSD_TYPE, true); + addMapping(ItemPathType.class, ItemPathType.COMPLEX_TYPE, true); + addMapping(ItemPath.class, ItemPathType.COMPLEX_TYPE, false); addMapping(QName.class, DOMUtil.XSD_QNAME, true); addMapping(PolyString.class, PrismConstants.POLYSTRING_TYPE_QNAME, true); - addMappingExt(ItemPathType.class, ItemPathType.COMPLEX_TYPE, true); + addMappingExt(ItemPathType.class, ItemPathType.COMPLEX_TYPE, true); // TODO remove xsdToJavaTypeMap.put(DOMUtil.XSD_ANYURI, String.class); } diff --git a/infra/prism/src/main/java/com/evolveum/prism/xml/ns/_public/types_3/ItemPathType.java b/infra/prism/src/main/java/com/evolveum/prism/xml/ns/_public/types_3/ItemPathType.java index 1226329f090..543f727f65d 100644 --- a/infra/prism/src/main/java/com/evolveum/prism/xml/ns/_public/types_3/ItemPathType.java +++ b/infra/prism/src/main/java/com/evolveum/prism/xml/ns/_public/types_3/ItemPathType.java @@ -157,4 +157,15 @@ public int hashCode() { public String toString() { return getItemPath().toString(); } + + // temporary implementation until things settle down + public static ItemPathType asItemPathType(Object value) { + if (value instanceof ItemPathType) { + return (ItemPathType) value; + } else if (value instanceof ItemPath) { + return ((ItemPath) value).asItemPathType(); + } else { + throw new IllegalArgumentException("Value " + value + " is neither ItemPath nor ItemPathType."); + } + } } diff --git a/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestPrismParsing.java b/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestPrismParsing.java index 4d25c49b2fa..55596a04ab6 100644 --- a/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestPrismParsing.java +++ b/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestPrismParsing.java @@ -352,7 +352,7 @@ public void test410UserWillRoundTrip() throws Exception { assertUserWill(user); // WHEN - String serialized = prismContext.serializeObjectToString(user, getOutputFormat()); + String serialized = prismContext.serializerFor(getOutputFormat()).serialize(user); // THEN assertNotNull(serialized); diff --git a/infra/prism/src/test/java/com/evolveum/midpoint/prism/lex/TestProtectedString.java b/infra/prism/src/test/java/com/evolveum/midpoint/prism/lex/TestProtectedString.java index d2e0cca94f3..02338435e9d 100644 --- a/infra/prism/src/test/java/com/evolveum/midpoint/prism/lex/TestProtectedString.java +++ b/infra/prism/src/test/java/com/evolveum/midpoint/prism/lex/TestProtectedString.java @@ -64,7 +64,7 @@ public void testParseProtectedString() throws Exception { // WHEN - MapXNode protectedStringTypeXNode = ((PrismContextImpl) prismContext).getBeanMarshaller().marshalProtectedDataType(protectedStringType); + MapXNode protectedStringTypeXNode = ((PrismContextImpl) prismContext).getBeanMarshaller().marshalProtectedDataType(protectedStringType, null); System.out.println("Protected string type XNode: " + protectedStringTypeXNode.debugDump()); // THEN diff --git a/infra/prism/src/test/resources/common/yaml/user-will.yaml b/infra/prism/src/test/resources/common/yaml/user-will.yaml index ab07236e9a1..49f3da4c5d7 100644 --- a/infra/prism/src/test/resources/common/yaml/user-will.yaml +++ b/infra/prism/src/test/resources/common/yaml/user-will.yaml @@ -21,7 +21,7 @@ user: dateType: - 170721000000 durationType: - - ! "P17Y3M2D" + - "P17Y3M2D" locations: - location: - key: "sk" diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/MiscSchemaUtil.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/MiscSchemaUtil.java index 2821fe59478..a6496118f17 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/MiscSchemaUtil.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/MiscSchemaUtil.java @@ -391,7 +391,7 @@ public static void serializeFaultMessage(Detail detail, FaultMessage faultMessag XNode faultMessageXnode = marshaller.marshall(faultMessage.getFaultInfo()); // TODO RootXNode xroot = new RootXNode(SchemaConstants.FAULT_MESSAGE_ELEMENT_NAME, faultMessageXnode); xroot.setExplicitTypeDeclaration(true); - QName faultType = marshaller.determineTypeForClass(faultMessage.getFaultInfo().getClass()); + QName faultType = prismContext.getSchemaRegistry().determineTypeForClass(faultMessage.getFaultInfo().getClass()); xroot.setTypeQName(faultType); ((PrismContextImpl) prismContext).getParserDom().serializeUnderElement(xroot, SchemaConstants.FAULT_MESSAGE_ELEMENT_NAME, detail); } catch (SchemaException e) { diff --git a/repo/repo-sql-impl-test/src/test/resources/basic/user-big.xml b/repo/repo-sql-impl-test/src/test/resources/basic/user-big.xml index d6301372c07..da0c0a3549d 100644 --- a/repo/repo-sql-impl-test/src/test/resources/basic/user-big.xml +++ b/repo/repo-sql-impl-test/src/test/resources/basic/user-big.xml @@ -19,8 +19,9 @@ xmlns="http://midpoint.evolveum.com/xml/ns/public/common/common-3" xmlns:c="http://midpoint.evolveum.com/xml/ns/public/common/common-3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xmlns:xsd="http://www.w3.org/2001/XMLSchema"> - + xmlns:xsd="http://www.w3.org/2001/XMLSchema" + xmlns:t="http://prism.evolveum.com/xml/ns/public/types-3"> + testuserX123 testuserx123 @@ -139,7 +140,7 @@ xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:enc="http://www.w3.org/2001/04/xmlenc#" - xsi:type="c:ProtectedStringType"> + xsi:type="t:ProtectedStringType"> From cbddfc43e75fc06d4d321e56f3da3e06161eba97 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Wed, 26 Oct 2016 17:54:41 +0200 Subject: [PATCH 57/74] Fixed provisioning tests. --- .../provisioning/impl/dummy/TestDummyNoActivation.java | 4 +++- .../midpoint/provisioning/impl/ucf/TestUcfOpenDj.java | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/TestDummyNoActivation.java b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/TestDummyNoActivation.java index 0939d3e0247..4fd36ccabf4 100644 --- a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/TestDummyNoActivation.java +++ b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/TestDummyNoActivation.java @@ -330,7 +330,9 @@ public void test158DeleteValidToValidFrom() throws Exception { ACCOUNT_WILL_OID, SchemaConstants.PATH_ACTIVATION_VALID_TO, prismContext, XmlTypeConverter.createXMLGregorianCalendar(VALID_TO_MILLIS)); PrismObjectDefinition def = prismContext.getSchemaRegistry().findObjectDefinitionByCompileTimeClass(ShadowType.class); - PropertyDelta validFromDelta = PropertyDelta.createModificationDeleteProperty(SchemaConstants.PATH_ACTIVATION_VALID_FROM, def.findPropertyDefinition(SchemaConstants.PATH_ACTIVATION_VALID_FROM), VALID_FROM_MILLIS); + PropertyDelta validFromDelta = PropertyDelta.createModificationDeleteProperty(SchemaConstants.PATH_ACTIVATION_VALID_FROM, + def.findPropertyDefinition(SchemaConstants.PATH_ACTIVATION_VALID_FROM), + XmlTypeConverter.createXMLGregorianCalendar(VALID_FROM_MILLIS)); delta.addModification(validFromDelta); delta.checkConsistence(); diff --git a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/ucf/TestUcfOpenDj.java b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/ucf/TestUcfOpenDj.java index 173e0e77090..ae7350e33a5 100644 --- a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/ucf/TestUcfOpenDj.java +++ b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/ucf/TestUcfOpenDj.java @@ -743,7 +743,7 @@ public void test610ChangePassword() throws Exception { propMod.setPath(path); //set the replace value - MapXNode passPsXnode = ((PrismContextImpl) prismContext).getBeanMarshaller().marshalProtectedDataType(passPs); + MapXNode passPsXnode = ((PrismContextImpl) prismContext).getBeanMarshaller().marshalProtectedDataType(passPs, null); RawType value = new RawType(passPsXnode, prismContext); propMod.getValue().add(value); From 06f28515fd68663cb81864d7def8d12911beb4a4 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Wed, 26 Oct 2016 19:39:06 +0200 Subject: [PATCH 58/74] Fixed parsing of specific subtypes that have CTD but not item definition (ConditionalSearchFilterType). --- .../midpoint/prism/marshaller/ItemInfo.java | 17 +++++++++++- .../prism/marshaller/PrismUnmarshaller.java | 15 ++++++++--- .../prism/marshaller/QueryConvertor.java | 5 +++- .../midpoint/prism/schema/SchemaRegistry.java | 6 +++-- .../prism/schema/SchemaRegistryImpl.java | 26 ++++++++++++++++--- .../schema/parser/TestParseMapping.java | 2 +- 6 files changed, 59 insertions(+), 12 deletions(-) diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/ItemInfo.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/ItemInfo.java index 000055adfd6..88691c3e74d 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/ItemInfo.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/ItemInfo.java @@ -63,9 +63,24 @@ public static ItemInfo determine(ItemDefinition item definition = augmentWithType(definition, definitionClass, schemaRegistry, typeNameExplicit); definition = augmentWithType(definition, definitionClass, schemaRegistry, typeNameFromSource); definition = augmentWithClass(definition, definitionClass, schemaRegistry, classExplicit); - definition = augmentWithItemName(definition, definitionClass, schemaRegistry, itemNameFromSource); + // Sanity check: if typeNameFromSource or typeNameExplicit are not compatible with the type derived from definition, + // we will NOT use the definition. For example, if client is looking for ConditionalSearchFilterType (has no ItemDefinition) + // the definition here would be very probably SearchFilterType (based e.g. on the itemNameFromSource). And it has not + // to be used, as the client explicitly requested ConditionalSearchFilterType. + // + // Exception is PrismReferenceDefinition, as there are no subtypes in that case (yet) + if (definition != null && !(definition instanceof PrismReferenceDefinition)) { + QName typeName = definition.getTypeName(); + if (typeNameExplicit != null && !schemaRegistry.isAssignableFrom(typeNameExplicit, typeName) + || typeNameFromSource != null && !schemaRegistry.isAssignableFrom(typeNameFromSource, typeName)) { + // the result would NOT match typeNameExplicit/typeNameFromSource (very probably) + // so we have to abandon this definition + definition = null; + } + } + ItemInfo info = new ItemInfo<>(); info.itemDefinition = definition; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismUnmarshaller.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismUnmarshaller.java index 77f0117893d..c1be7650eb4 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismUnmarshaller.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismUnmarshaller.java @@ -94,10 +94,17 @@ PrismObject parseObject(MapXNode map, PrismObjectDefin ItemDefinition realDefinition; if (itemInfo.getItemDefinition() == null && itemInfo.getComplexTypeDefinition() != null) { // let's create container definition dynamically - PrismContainerDefinitionImpl pcd = new PrismContainerDefinitionImpl(itemInfo.getItemName(), itemInfo.getComplexTypeDefinition(), - prismContext); - pcd.setDynamic(true); // questionable - realDefinition = pcd; + QName actualTypeName = itemInfo.getComplexTypeDefinition().getTypeName(); + if (getSchemaRegistry().isContainer(actualTypeName)) { + PrismContainerDefinitionImpl def = new PrismContainerDefinitionImpl(itemInfo.getItemName(), + itemInfo.getComplexTypeDefinition(), prismContext); + def.setDynamic(true); + realDefinition = def; + } else { + PrismPropertyDefinitionImpl def = new PrismPropertyDefinitionImpl(itemInfo.getItemName(), actualTypeName, prismContext); + def.setDynamic(true); + realDefinition = def; + } } else { realDefinition = itemInfo.getItemDefinition(); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/QueryConvertor.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/QueryConvertor.java index ac9ca4afb68..96d41de4e69 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/QueryConvertor.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/QueryConvertor.java @@ -425,7 +425,7 @@ private static RefFilter parseRefFilter(MapXNode claus ItemDefinition itemDefinition = null; if (pcd != null) { - itemDefinition = pcd != null ? pcd.findItemDefinition(itemPath) : null; + itemDefinition = pcd.findItemDefinition(itemPath); if (itemDefinition == null && !preliminaryParsingOnly) { throw new SchemaException("No definition for item "+itemPath+" in "+pcd); } @@ -442,6 +442,9 @@ private static RefFilter parseRefFilter(MapXNode claus .definition(itemDefinition) .context(ParsingContext.allowMissingRefTypes()) .parseItem(); + if (!(item instanceof PrismReference)) { + throw new IllegalStateException("Expected PrismReference, got " + item); + } PrismReference ref = (PrismReference)item; if (item.getValues().size() < 1) { throw new IllegalStateException("No values to search specified for item " + itemName); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistry.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistry.java index 98c2a24c831..1e62136f5e1 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistry.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistry.java @@ -147,6 +147,8 @@ ID selectMoreSpecific(ID def1, ID def2) QName selectMoreSpecific(QName type1, QName type2) throws SchemaException; + boolean isContainer(QName typeName); + enum ComparisonResult { EQUAL, // types are equal NO_STATIC_CLASS, // static class cannot be determined @@ -157,8 +159,8 @@ enum ComparisonResult { /** * @return null means we cannot decide (types are different, and no compile time class for def1 and/or def2) */ - ComparisonResult compareDefinitions(ID def1, ID def2) + ComparisonResult compareDefinitions(@NotNull ID def1, @NotNull ID def2) throws SchemaException; - boolean isAssignableFrom(QName superType, QName subType); + boolean isAssignableFrom(@NotNull QName superType, @NotNull QName subType); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistryImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistryImpl.java index acafedb223f..d87d3ea5010 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistryImpl.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistryImpl.java @@ -1219,6 +1219,16 @@ public Class determineClassForType(QName type) { } } + @NotNull + public Class determineClassForTypeNotNull(QName typeName) { + Class clazz = determineClassForType(typeName); + if (clazz != null) { + return clazz; + } else { + throw new IllegalStateException("No class for " + typeName); + } + } + @Override public Class determineClassForItemDefinition(ItemDefinition itemDefinition) { if (itemDefinition instanceof PrismContainerDefinition) { @@ -1319,12 +1329,22 @@ public ComparisonResult compareDefinitions(@NotNull @Override public boolean isAssignableFrom(@NotNull QName superType, @NotNull QName subType) { - if (QNameUtil.match(superType, subType)) { + if (QNameUtil.match(superType, subType) || QNameUtil.match(DOMUtil.XSD_ANYTYPE, superType)) { return true; } - Class superClass = determineCompileTimeClassNotNull(superType); - Class subClass = determineCompileTimeClassNotNull(subType); + if (QNameUtil.match(DOMUtil.XSD_ANYTYPE, subType)) { + return false; + } + Class superClass = determineClassForTypeNotNull(superType); + Class subClass = determineClassForTypeNotNull(subType); return superClass.isAssignableFrom(subClass); } + + @Override + public boolean isContainer(QName typeName) { + Class clazz = determineClassForType(typeName); + return clazz != null && Containerable.class.isAssignableFrom(clazz); + } + //endregion } diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/TestParseMapping.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/TestParseMapping.java index 0bf15e61f27..06f53f10d2a 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/TestParseMapping.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/parser/TestParseMapping.java @@ -60,7 +60,7 @@ public void testParseFile() throws Exception { private void processParsings(SerializingFunction> serializer, String serId) throws Exception { PrismPropertyDefinition definition = getPrismContext().getSchemaRegistry().findPropertyDefinitionByElementName(SchemaConstantsGenerated.C_MAPPING); - processParsings(MappingType.class, MappingsType.COMPLEX_TYPE, definition, serializer, serId); + processParsings(MappingType.class, MappingType.COMPLEX_TYPE, definition, serializer, serId); } // a bit of hack: RawType gets parsed very soon, so we must test for it almost immediately after parsing From 1b9f6118004be12556bd10b53b591c92c8fb953a Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Thu, 27 Oct 2016 00:04:31 +0200 Subject: [PATCH 59/74] Minimalistic support for simple types in schemas (for TestStrangeCases / dynamic enums). Few fixes in RefinedOCD subclasses. --- ...ositeRefinedObjectClassDefinitionImpl.java | 9 ++- ...LayerRefinedObjectClassDefinitionImpl.java | 9 +-- .../LayerRefinedResourceSchemaImpl.java | 4 +- .../RefinedObjectClassDefinition.java | 11 ++- .../RefinedObjectClassDefinitionImpl.java | 35 ++++----- .../refinery/RefinedResourceSchemaImpl.java | 4 +- .../midpoint/prism/ComplexTypeDefinition.java | 16 +--- .../prism/ComplexTypeDefinitionImpl.java | 46 +----------- .../midpoint/prism/SimpleTypeDefinition.java | 28 +++++++ .../prism/SimpleTypeDefinitionImpl.java | 53 +++++++++++++ .../midpoint/prism/TypeDefinition.java | 41 ++++++++++ .../midpoint/prism/TypeDefinitionImpl.java | 75 +++++++++++++++++++ .../prism/marshaller/BeanMarshaller.java | 28 ++++--- .../prism/marshaller/BeanUnmarshaller.java | 9 +++ .../prism/marshaller/PrismMarshaller.java | 39 +++++----- .../prism/marshaller/PrismSerializerImpl.java | 9 ++- .../prism/marshaller/PrismUnmarshaller.java | 3 +- .../prism/schema/DefinitionStoreUtils.java | 2 +- .../prism/schema/DomToSchemaProcessor.java | 62 +++++++++++---- .../prism/schema/GlobalDefinitionsStore.java | 18 ++++- .../prism/schema/PrismSchemaImpl.java | 6 +- .../prism/schema/SchemaDefinitionFactory.java | 10 ++- .../prism/schema/SchemaRegistryImpl.java | 25 +++---- .../midpoint/prism/xnode/PrimitiveXNode.java | 2 +- .../evolveum/midpoint/prism/xnode/XNode.java | 3 - .../lex/AbstractLexicalProcessorTest.java | 28 +------ .../midpoint/schema/DeltaConvertor.java | 8 +- .../ObjectClassComplexTypeDefinitionImpl.java | 9 ++- .../xml/ns/public/common/common-core-3.xsd | 10 ++- .../com/evolveum/midpoint/util/JAXBUtil.java | 3 - .../model/intest/TestConsistencySimple.java | 13 +++- .../midpoint/model/intest/TestMisc.java | 2 +- .../intest/TestModelServiceContract.java | 3 +- .../midpoint/model/intest/TestRbac.java | 12 +-- .../midpoint/model/intest/TestResources.java | 11 +-- .../model/intest/TestStrangeCases.java | 25 ++----- .../intest/negative/TestAssignmentErrors.java | 3 +- .../model/intest/sync/TestImportRecon.java | 6 +- .../src/test/resources/schema/piracy.xsd | 1 + 39 files changed, 436 insertions(+), 245 deletions(-) create mode 100644 infra/prism/src/main/java/com/evolveum/midpoint/prism/SimpleTypeDefinition.java create mode 100644 infra/prism/src/main/java/com/evolveum/midpoint/prism/SimpleTypeDefinitionImpl.java create mode 100644 infra/prism/src/main/java/com/evolveum/midpoint/prism/TypeDefinition.java create mode 100644 infra/prism/src/main/java/com/evolveum/midpoint/prism/TypeDefinitionImpl.java diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/CompositeRefinedObjectClassDefinitionImpl.java b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/CompositeRefinedObjectClassDefinitionImpl.java index 3aa3a5f8b9a..6e9b8fec1b9 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/CompositeRefinedObjectClassDefinitionImpl.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/CompositeRefinedObjectClassDefinitionImpl.java @@ -21,6 +21,7 @@ import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.schema.ResourceShadowDiscriminator; import com.evolveum.midpoint.schema.processor.ObjectClassComplexTypeDefinition; +import com.evolveum.midpoint.schema.processor.ObjectClassComplexTypeDefinitionImpl; import com.evolveum.midpoint.schema.processor.ResourceAttributeContainer; import com.evolveum.midpoint.schema.util.SchemaDebugUtil; import com.evolveum.midpoint.util.DebugUtil; @@ -420,8 +421,8 @@ public List getIgnoredNamespaces() { } @Override - public LayerRefinedObjectClassDefinition forLayer(LayerType layerType) { - throw new UnsupportedOperationException("TODO implement if needed"); + public LayerRefinedObjectClassDefinition forLayer(@NotNull LayerType layerType) { + return LayerRefinedObjectClassDefinitionImpl.wrap(this, layerType); } @SuppressWarnings("unchecked") @@ -476,7 +477,7 @@ public boolean hasAuxiliaryObjectClass(QName expectedObjectClassName) { @Override public ResourceAttributeContainer instantiate(QName elementName) { - throw new UnsupportedOperationException("TODO implement if needed"); + return ObjectClassComplexTypeDefinitionImpl.instantiate(elementName, this); } @Override @@ -638,7 +639,7 @@ protected String debugDump(int indent, LayerType layer) { * Return a human readable name of this class suitable for logs. */ // @Override - protected String getDebugDumpClassName() { + public String getDebugDumpClassName() { return "crOCD"; } diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedObjectClassDefinitionImpl.java b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedObjectClassDefinitionImpl.java index 7b4073e7b97..ee78c4e7e46 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedObjectClassDefinitionImpl.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedObjectClassDefinitionImpl.java @@ -169,7 +169,7 @@ public String getIntent() { } @Override - public LayerRefinedObjectClassDefinition forLayer(LayerType layerType) { + public LayerRefinedObjectClassDefinition forLayer(@NotNull LayerType layerType) { return refinedObjectClassDefinition.forLayer(layerType); } @@ -222,7 +222,7 @@ public PrismContext getPrismContext() { @Override public ResourceAttributeContainer instantiate(QName name) { - return refinedObjectClassDefinition.instantiate(name); + return ObjectClassComplexTypeDefinitionImpl.instantiate(name, this); } // @Override @@ -538,8 +538,7 @@ public String getDefaultNamespace() { @Override public String debugDump(int indent) { - // TODO fix this hack - return ((RefinedObjectClassDefinitionImpl) refinedObjectClassDefinition).debugDump(indent, layer, getDebugDumpClassName()); + return RefinedObjectClassDefinitionImpl.debugDump(indent, layer, this); } // Do NOT override&delegate debugDump(int indent, LayerType layer) here. @@ -549,7 +548,7 @@ public String debugDump(int indent) { /** * Return a human readable name of this class suitable for logs. */ - protected String getDebugDumpClassName() { + public String getDebugDumpClassName() { return "LRObjectClassDef"; } diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedResourceSchemaImpl.java b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedResourceSchemaImpl.java index acb412022d2..4fc271c3b5e 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedResourceSchemaImpl.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedResourceSchemaImpl.java @@ -204,8 +204,8 @@ public ComplexTypeDefinition findComplexTypeDefinition @Override @Nullable - public ComplexTypeDefinition findComplexTypeDefinitionByType(@NotNull QName typeName) { - return refinedResourceSchema.findComplexTypeDefinitionByType(typeName); + public TD findTypeDefinitionByType(@NotNull QName typeName, @NotNull Class definitionClass) { + return refinedResourceSchema.findTypeDefinitionByType(typeName, definitionClass); } @Override diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedObjectClassDefinition.java b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedObjectClassDefinition.java index c3eef428b27..9c6dfcb8a5b 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedObjectClassDefinition.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedObjectClassDefinition.java @@ -17,12 +17,12 @@ package com.evolveum.midpoint.common.refinery; import com.evolveum.midpoint.common.ResourceObjectPattern; -import com.evolveum.midpoint.prism.*; +import com.evolveum.midpoint.prism.ComplexTypeDefinition; +import com.evolveum.midpoint.prism.PrismObject; +import com.evolveum.midpoint.prism.PrismObjectDefinition; import com.evolveum.midpoint.prism.util.ItemPathUtil; import com.evolveum.midpoint.schema.ResourceShadowDiscriminator; import com.evolveum.midpoint.schema.processor.ObjectClassComplexTypeDefinition; -import com.evolveum.midpoint.schema.processor.ResourceAttributeDefinition; -import com.evolveum.midpoint.util.DebugDumpable; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; import com.evolveum.midpoint.xml.ns._public.resource.capabilities_3.CapabilityType; import com.evolveum.midpoint.xml.ns._public.resource.capabilities_3.PagedSearchCapabilityType; @@ -194,7 +194,7 @@ default PrismObject createBlankShadow() { RefinedObjectClassDefinition deepClone(Map ctdMap); //endregion - LayerRefinedObjectClassDefinition forLayer(LayerType layerType); + LayerRefinedObjectClassDefinition forLayer(@NotNull LayerType layerType); //region Type variance ======================================================== @@ -204,6 +204,9 @@ default RefinedAttributeDefinition findAttributeDefinition(String name) { return findAttributeDefinition(new QName(getTypeName().getNamespaceURI(), name)); } + //endregion + String getDebugDumpClassName(); + } diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedObjectClassDefinitionImpl.java b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedObjectClassDefinitionImpl.java index 7c80cf7cda2..093dfe43573 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedObjectClassDefinitionImpl.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedObjectClassDefinitionImpl.java @@ -24,10 +24,7 @@ import com.evolveum.midpoint.prism.util.ItemPathUtil; import com.evolveum.midpoint.schema.ResourceShadowDiscriminator; import com.evolveum.midpoint.schema.constants.SchemaConstants; -import com.evolveum.midpoint.schema.processor.ObjectClassComplexTypeDefinition; -import com.evolveum.midpoint.schema.processor.ResourceAttribute; -import com.evolveum.midpoint.schema.processor.ResourceAttributeContainer; -import com.evolveum.midpoint.schema.processor.ResourceAttributeDefinition; +import com.evolveum.midpoint.schema.processor.*; import com.evolveum.midpoint.schema.util.ObjectQueryUtil; import com.evolveum.midpoint.schema.util.ObjectTypeUtil; import com.evolveum.midpoint.schema.util.ResourceTypeUtil; @@ -593,7 +590,7 @@ private List> cloneDefinitions(Collectio * @return */ @Override - public LayerRefinedObjectClassDefinition forLayer(LayerType layerType) { + public LayerRefinedObjectClassDefinition forLayer(@NotNull LayerType layerType) { Validate.notNull(layerType); return LayerRefinedObjectClassDefinitionImpl.wrap(this, layerType); } @@ -762,7 +759,7 @@ public Class getTypeClass() { @Override public ResourceAttributeContainer instantiate(QName elementName) { - return originalObjectClassDefinition.instantiate(elementName); // TODO doesn't preserve 'this' in instantiated RAC + return ObjectClassComplexTypeDefinitionImpl.instantiate(elementName, this); } //endregion @@ -1046,31 +1043,31 @@ public String debugDump() { @Override public String debugDump(int indent) { - return debugDump(indent, null, getDebugDumpClassName()); + return debugDump(indent, null, this); } - public String debugDump(int indent, LayerType layer, String debugDumpClassName) { + public static String debugDump(int indent, LayerType layer, RefinedObjectClassDefinition _this) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < indent; i++) { sb.append(INDENT_STRING); } - sb.append(debugDumpClassName).append("("); - sb.append(SchemaDebugUtil.prettyPrint(getTypeName())); - if (isDefault()) { + sb.append(_this.getDebugDumpClassName()).append("("); + sb.append(SchemaDebugUtil.prettyPrint(_this.getTypeName())); + if (_this.isDefault()) { sb.append(",default"); } - if (getKind() != null) { - sb.append(" ").append(getKind().value()); + if (_this.getKind() != null) { + sb.append(" ").append(_this.getKind().value()); } sb.append(","); - if (getIntent() != null) { - sb.append("intent=").append(getIntent()); + if (_this.getIntent() != null) { + sb.append("intent=").append(_this.getIntent()); } if (layer != null) { sb.append(",layer=").append(layer); } sb.append(")"); - for (RefinedAttributeDefinition rAttrDef: getAttributeDefinitions()) { + for (RefinedAttributeDefinition rAttrDef: _this.getAttributeDefinitions()) { sb.append("\n"); sb.append(rAttrDef.debugDump(indent + 1, layer)); } @@ -1080,7 +1077,7 @@ public String debugDump(int indent, LayerType layer, String debugDumpClassName) /** * Return a human readable name of this class suitable for logs. */ - protected String getDebugDumpClassName() { + public String getDebugDumpClassName() { return "rOCD"; } @@ -1090,10 +1087,8 @@ public String getHumanReadableName() { return getDisplayName(); } else if (getKind() != null) { return getKind()+":"+getIntent(); - } else if (getTypeName() != null) { - return getTypeName().getLocalPart(); } else { - return "null"; + return getTypeName().getLocalPart(); } } diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedResourceSchemaImpl.java b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedResourceSchemaImpl.java index ca99c13568b..22786c4f983 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedResourceSchemaImpl.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedResourceSchemaImpl.java @@ -534,8 +534,8 @@ public ComplexTypeDefinition findComplexTypeDefinition @Override @Nullable - public ComplexTypeDefinition findComplexTypeDefinitionByType(@NotNull QName typeName) { - return originalResourceSchema.findComplexTypeDefinitionByType(typeName); + public TD findTypeDefinitionByType(@NotNull QName typeName, @NotNull Class definitionClass) { + return originalResourceSchema.findTypeDefinitionByType(typeName, definitionClass); } @Override diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/ComplexTypeDefinition.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/ComplexTypeDefinition.java index 8d771517ffe..c240ed71e4d 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/ComplexTypeDefinition.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/ComplexTypeDefinition.java @@ -31,7 +31,7 @@ * @author semancik * @author mederly */ -public interface ComplexTypeDefinition extends Definition, LocalDefinitionStore { +public interface ComplexTypeDefinition extends TypeDefinition, LocalDefinitionStore { /** * Returns definitions for all inner items. @@ -46,12 +46,6 @@ public interface ComplexTypeDefinition extends Definition, LocalDefinitionStore @NotNull List getDefinitions(); - /** - * Returns compile-time class, if this type has any. For example, UserType.class, ObjectType.class, ExtensionType.class. - */ - @Nullable - Class getCompileTimeClass(); - /** * If not null, indicates that this type defines the structure of 'extension' element of a given type. * E.g. getExtensionForType() == c:UserType means that this complex type defines structure of @@ -98,14 +92,6 @@ public interface ComplexTypeDefinition extends Definition, LocalDefinitionStore @NotNull List getIgnoredNamespaces(); - /** - * Name of super type of this complex type definition. E.g. c:ObjectType is a super type for - * c:FocusType which is a super type for c:UserType. Or (more complex example) ri:ShadowAttributesType - * is a super type of ri:AccountObjectClass. (TODO is this really true?) - */ - @Nullable - QName getSuperType(); - /** * Copies cloned definitions from the other type definition into this one. * (TODO remove from the interface?) diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/ComplexTypeDefinitionImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/ComplexTypeDefinitionImpl.java index dea510c5d9d..f2dcda112d8 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/ComplexTypeDefinitionImpl.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/ComplexTypeDefinitionImpl.java @@ -38,16 +38,14 @@ * @author Radovan Semancik * */ -public class ComplexTypeDefinitionImpl extends DefinitionImpl implements ComplexTypeDefinition { +public class ComplexTypeDefinitionImpl extends TypeDefinitionImpl implements ComplexTypeDefinition { private static final long serialVersionUID = 2655797837209175037L; @NotNull private final List itemDefinitions = new ArrayList<>(); - private QName superType; private boolean containerMarker; private boolean objectMarker; private boolean xsdAnyMarker; private QName extensionForType; - private Class compileTimeClass; private String defaultNamespace; @@ -80,15 +78,6 @@ public void add(ItemDefinition definition) { itemDefinitions.add(definition); } - @Override - public Class getCompileTimeClass() { - return compileTimeClass; - } - - public void setCompileTimeClass(Class compileTimeClass) { - this.compileTimeClass = compileTimeClass; - } - @Override public QName getExtensionForType() { return extensionForType; @@ -140,15 +129,6 @@ public void setIgnoredNamespaces(@NotNull List ignoredNamespaces) { this.ignoredNamespaces = ignoredNamespaces; } - @Override - public QName getSuperType() { - return superType; - } - - public void setSuperType(QName superType) { - this.superType = superType; - } - public void setObjectMarker(boolean objectMarker) { this.objectMarker = objectMarker; } @@ -303,12 +283,10 @@ public ComplexTypeDefinition deepClone(Map ctdMap) protected void copyDefinitionData(ComplexTypeDefinitionImpl clone) { super.copyDefinitionData(clone); - clone.superType = this.superType; clone.containerMarker = this.containerMarker; clone.objectMarker = this.objectMarker; clone.xsdAnyMarker = this.xsdAnyMarker; clone.extensionForType = this.extensionForType; - clone.compileTimeClass = this.compileTimeClass; clone.defaultNamespace = this.defaultNamespace; clone.ignoredNamespaces = this.ignoredNamespaces; clone.itemDefinitions.addAll(this.itemDefinitions); @@ -337,12 +315,10 @@ public void replaceDefinition(QName propertyName, ItemDefinition newDefinition) public int hashCode() { final int prime = 31; int result = super.hashCode(); - result = prime * result + ((compileTimeClass == null) ? 0 : compileTimeClass.hashCode()); result = prime * result + (containerMarker ? 1231 : 1237); result = prime * result + ((extensionForType == null) ? 0 : extensionForType.hashCode()); result = prime * result + ((itemDefinitions == null) ? 0 : itemDefinitions.hashCode()); result = prime * result + (objectMarker ? 1231 : 1237); - result = prime * result + ((superType == null) ? 0 : superType.hashCode()); result = prime * result + (xsdAnyMarker ? 1231 : 1237); return result; } @@ -359,13 +335,6 @@ public boolean equals(Object obj) { return false; } ComplexTypeDefinitionImpl other = (ComplexTypeDefinitionImpl) obj; - if (compileTimeClass == null) { - if (other.compileTimeClass != null) { - return false; - } - } else if (!compileTimeClass.equals(other.compileTimeClass)) { - return false; - } if (containerMarker != other.containerMarker) { return false; } @@ -376,23 +345,12 @@ public boolean equals(Object obj) { } else if (!extensionForType.equals(other.extensionForType)) { return false; } - if (itemDefinitions == null) { - if (other.itemDefinitions != null) { - return false; - } - } else if (!itemDefinitions.equals(other.itemDefinitions)) { + if (!itemDefinitions.equals(other.itemDefinitions)) { return false; } if (objectMarker != other.objectMarker) { return false; } - if (superType == null) { - if (other.superType != null) { - return false; - } - } else if (!superType.equals(other.superType)) { - return false; - } if (xsdAnyMarker != other.xsdAnyMarker) { return false; } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/SimpleTypeDefinition.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/SimpleTypeDefinition.java new file mode 100644 index 00000000000..444246c7b1c --- /dev/null +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/SimpleTypeDefinition.java @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.prism; + +/** + * Primarily for enums. (Experimental.) + * + * Currently there are no special methods. + * + * @author mederly + */ +public interface SimpleTypeDefinition extends TypeDefinition { + +} diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/SimpleTypeDefinitionImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/SimpleTypeDefinitionImpl.java new file mode 100644 index 00000000000..589602da0cf --- /dev/null +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/SimpleTypeDefinitionImpl.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.prism; + +import org.jetbrains.annotations.NotNull; + +import javax.xml.namespace.QName; + +/** + * @author mederly + */ +public class SimpleTypeDefinitionImpl extends TypeDefinitionImpl implements SimpleTypeDefinition { + + public SimpleTypeDefinitionImpl(QName typeName, PrismContext prismContext) { + super(typeName, prismContext); + } + + @Override + public void revive(PrismContext prismContext) { + } + + @Override + protected String getDebugDumpClassName() { + return "STD"; + } + + @Override + public String getDocClassName() { + return "simple type"; + } + + @NotNull + @Override + public SimpleTypeDefinitionImpl clone() { + SimpleTypeDefinitionImpl clone = new SimpleTypeDefinitionImpl(typeName, prismContext); + super.copyDefinitionData(clone); + return clone; + } +} diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/TypeDefinition.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/TypeDefinition.java new file mode 100644 index 00000000000..4a73eafb3d1 --- /dev/null +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/TypeDefinition.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.prism; + +import org.jetbrains.annotations.Nullable; + +import javax.xml.namespace.QName; + +/** + * @author mederly + */ +public interface TypeDefinition extends Definition { + + /** + * Returns compile-time class, if this type has any. For example, UserType.class, ObjectType.class, ExtensionType.class. + */ + @Nullable + Class getCompileTimeClass(); + + /** + * Name of super type of this complex type definition. E.g. c:ObjectType is a super type for + * c:FocusType which is a super type for c:UserType. Or (more complex example) ri:ShadowAttributesType + * is a super type of ri:AccountObjectClass. (TODO is this really true?) + */ + @Nullable + QName getSuperType(); +} diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/TypeDefinitionImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/TypeDefinitionImpl.java new file mode 100644 index 00000000000..b8ba77051a8 --- /dev/null +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/TypeDefinitionImpl.java @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2010-2016 Evolveum + * + * 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 com.evolveum.midpoint.prism; + +import javax.xml.namespace.QName; +import java.util.Objects; + +/** + * @author mederly + */ +public abstract class TypeDefinitionImpl extends DefinitionImpl implements TypeDefinition { + + protected QName superType; + protected Class compileTimeClass; + + public TypeDefinitionImpl(QName typeName, PrismContext prismContext) { + super(typeName, prismContext); + } + + @Override + public QName getSuperType() { + return superType; + } + + public void setSuperType(QName superType) { + this.superType = superType; + } + + @Override + public Class getCompileTimeClass() { + return compileTimeClass; + } + + public void setCompileTimeClass(Class compileTimeClass) { + this.compileTimeClass = compileTimeClass; + } + + protected void copyDefinitionData(TypeDefinitionImpl clone) { + super.copyDefinitionData(clone); + clone.superType = this.superType; + clone.compileTimeClass = this.compileTimeClass; + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (!(o instanceof TypeDefinitionImpl)) + return false; + if (!super.equals(o)) + return false; + TypeDefinitionImpl that = (TypeDefinitionImpl) o; + return Objects.equals(superType, that.superType) && + Objects.equals(compileTimeClass, that.compileTimeClass); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), superType, compileTimeClass); + } +} diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/BeanMarshaller.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/BeanMarshaller.java index 1544f5c5813..9f84979aaa6 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/BeanMarshaller.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/BeanMarshaller.java @@ -179,7 +179,8 @@ private XNode marshalXmlType(Object bean, SerializationContext ctx) throws Schem // Fix it in 3.1. [med] if (fieldTypeName == null && element instanceof JAXBElement && marshalled != null) { QName typeName = inspector.determineTypeForClass(elementToMarshall.getClass()); - if (typeName != null && !getSchemaRegistry().hasImplicitTypeDefinition(elementName, typeName)) { + if (typeName != null && !getSchemaRegistry().hasImplicitTypeDefinition(elementName, typeName) + && getSchemaRegistry().findTypeDefinitionByType(typeName, TypeDefinition.class) != null) { marshalled.setExplicitTypeDeclaration(true); marshalled.setTypeQName(typeName); } @@ -202,14 +203,12 @@ private XNode marshalXmlType(Object bean, SerializationContext ctx) throws Schem valueToMarshall = getterResult; } XNode marshelled = marshallValue(valueToMarshall, fieldTypeName, isAttribute, ctx); - if (!getter.getReturnType().equals(valueToMarshall.getClass()) && getter.getReturnType().isAssignableFrom(valueToMarshall.getClass())){ - if (prismContext != null) { - PrismObjectDefinition def = prismContext.getSchemaRegistry().determineDefinitionFromClass(valueToMarshall.getClass()); - if (def != null){ - QName type = def.getTypeName(); - marshelled.setTypeQName(type); - marshelled.setExplicitTypeDeclaration(true); - } + if (!getter.getReturnType().equals(valueToMarshall.getClass()) && getter.getReturnType().isAssignableFrom(valueToMarshall.getClass()) && !(valueToMarshall instanceof Enum)) { + PrismObjectDefinition def = prismContext.getSchemaRegistry().determineDefinitionFromClass(valueToMarshall.getClass()); + if (def != null){ + QName type = def.getTypeName(); + marshelled.setTypeQName(type); + marshelled.setExplicitTypeDeclaration(true); } } xmap.put(elementName, marshelled); @@ -337,7 +336,7 @@ private void setExplicitTypeDeclarationIfNeeded(Method getter, Object getterResu getterType = getterReturnType; } Class getterResultReturnType = getterResult.getClass(); - if (getterType != getterResultReturnType && getterType.isAssignableFrom(getterResultReturnType)){ + if (getterType != getterResultReturnType && getterType.isAssignableFrom(getterResultReturnType)) { xmap.setExplicitTypeDeclaration(true); xmap.setTypeQName(fieldTypeName); } @@ -427,7 +426,14 @@ private SchemaRegistry getSchemaRegistry() { public boolean canProcess(QName typeName) { Class clazz = getSchemaRegistry().determineClassForType(typeName); - return clazz != null && canProcess(clazz); + if (clazz != null && canProcess(clazz)) { + return true; + } + TypeDefinition td = getSchemaRegistry().findTypeDefinitionByType(typeName); + if (td instanceof SimpleTypeDefinition) { + return true; // most probably dynamic enum, at this point + } + return false; } public boolean canProcess(@NotNull Class clazz) { diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/BeanUnmarshaller.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/BeanUnmarshaller.java index 9a07a66cf07..2efbf3b0c14 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/BeanUnmarshaller.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/BeanUnmarshaller.java @@ -101,6 +101,15 @@ private void createSpecialUnmarshallerMaps() { @NotNull T unmarshal(@NotNull XNode xnode, @NotNull QName typeQName, @NotNull ParsingContext pc) throws SchemaException { Class classType = getSchemaRegistry().determineClassForType(typeQName); // TODO use correct method! + if (classType == null) { + TypeDefinition td = getSchemaRegistry().findTypeDefinitionByType(typeQName); + if (td instanceof SimpleTypeDefinition) { + // most probably dynamically defined enum (TODO clarify) + classType = (Class) String.class; + } else { + throw new IllegalArgumentException("Couldn't unmarshal " + typeQName + ". Type definition = " + td); + } + } return unmarshal(xnode, classType, pc); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismMarshaller.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismMarshaller.java index 81b9bfab93b..1ab17e3dccf 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismMarshaller.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismMarshaller.java @@ -15,32 +15,25 @@ */ package com.evolveum.midpoint.prism.marshaller; -import java.util.ArrayList; -import java.util.Collection; - -import javax.xml.namespace.QName; - import com.evolveum.midpoint.prism.*; -import com.evolveum.midpoint.prism.schema.SchemaRegistry; -import com.evolveum.midpoint.util.JAXBUtil; -import com.evolveum.prism.xml.ns._public.query_3.SearchFilterType; - -import org.apache.commons.lang.StringUtils; -import org.apache.commons.lang.Validate; - import com.evolveum.midpoint.prism.polystring.PolyString; -import com.evolveum.midpoint.prism.xnode.ListXNode; -import com.evolveum.midpoint.prism.xnode.MapXNode; -import com.evolveum.midpoint.prism.xnode.PrimitiveXNode; -import com.evolveum.midpoint.prism.xnode.RootXNode; -import com.evolveum.midpoint.prism.xnode.XNode; +import com.evolveum.midpoint.prism.schema.SchemaRegistry; +import com.evolveum.midpoint.prism.xnode.*; import com.evolveum.midpoint.util.DOMUtil; +import com.evolveum.midpoint.util.JAXBUtil; import com.evolveum.midpoint.util.exception.SchemaException; +import com.evolveum.prism.xml.ns._public.query_3.SearchFilterType; import com.evolveum.prism.xml.ns._public.types_3.EvaluationTimeType; import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; +import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang.Validate; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import javax.xml.namespace.QName; +import java.util.ArrayList; +import java.util.Collection; + /** * @author semancik * @@ -231,10 +224,15 @@ private boolean isInstantiable(ItemDefinition definition) { if (definition instanceof PrismContainerDefinition) { PrismContainerDefinition pcd = (PrismContainerDefinition) definition; ComplexTypeDefinition ctd = pcd.getComplexTypeDefinition(); - return ctd != null && !ctd.isXsdAnyMarker() && ctd.getCompileTimeClass() != null; + return ctd != null && ctd.getCompileTimeClass() != null; } else if (definition instanceof PrismPropertyDefinition) { PrismPropertyDefinition ppd = (PrismPropertyDefinition) definition; - return !ppd.isAnyType(); // covered by isAbstract? + if (ppd.isAnyType()) { + return false; + } + // TODO optimize + return getSchemaRegistry().determineClassForType(ppd.getTypeName()) != null + || getSchemaRegistry().findTypeDefinitionByType(ppd.getTypeName(), TypeDefinition.class) != null; } else { return false; } @@ -454,7 +452,8 @@ private void addTypeDefinitionIfNeeded(@NotNull QName itemName, QName typeName, if (typeName == null) { return; // nothing to do, anyway } - if (!getSchemaRegistry().hasImplicitTypeDefinition(itemName, typeName)) { + if (!getSchemaRegistry().hasImplicitTypeDefinition(itemName, typeName) + && getSchemaRegistry().findTypeDefinitionByType(typeName) != null) { valueNode.setTypeQName(typeName); valueNode.setExplicitTypeDeclaration(true); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismSerializerImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismSerializerImpl.java index c82e2efefd1..9a7c38c209a 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismSerializerImpl.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismSerializerImpl.java @@ -17,7 +17,6 @@ package com.evolveum.midpoint.prism.marshaller; import com.evolveum.midpoint.prism.*; -import com.evolveum.midpoint.prism.xml.XsdTypeMapper; import com.evolveum.midpoint.prism.xnode.RootXNode; import com.evolveum.midpoint.prism.xnode.XNode; import com.evolveum.midpoint.util.exception.SchemaException; @@ -181,9 +180,13 @@ private void checkPostconditions(RootXNode root) { private void checkTypeResolvable(RootXNode root) { root.accept(n -> { QName type; - if (n instanceof XNode && (type = ((XNode) n).getTypeQName()) != null) { + if (n instanceof XNode && (type = ((XNode) n).getTypeQName()) != null && ((XNode) n).isExplicitTypeDeclaration()) { if (prismContext.getSchemaRegistry().determineClassForType(type) == null) { - throw new IllegalStateException("Postcondition fail: type " + type + " is not resolvable in:\n" + root.debugDump()); + // it could be sufficient to find a TD + if (prismContext.getSchemaRegistry().findTypeDefinitionByType(type) == null) { + throw new IllegalStateException( + "Postcondition fail: type " + type + " is not resolvable in:\n" + root.debugDump()); + } } } }); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismUnmarshaller.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismUnmarshaller.java index c1be7650eb4..799fdfcb4ce 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismUnmarshaller.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismUnmarshaller.java @@ -251,6 +251,7 @@ private PrismContainerValue parseContainerValueFrom // an error. We positively know that it is not in the schema. pc.warnOrThrow(LOGGER, "Item " + itemName + " has no definition (schema present, in container " + containerDef + ")" + "while parsing " + map.debugDump()); + continue; } else { // No definition for item, but the schema is runtime. the definition may come later. // Null is OK here. The item will be parsed as "raw" @@ -337,7 +338,7 @@ private PrismPropertyValue parsePropertyValue(@NotNull XNode node, } PrismUtil.recomputeRealValue(realValue, prismContext); if (!isValueAllowed(realValue, definition)) { - pc.warnOrThrow(LOGGER, "Skipping unknown value of type " + typeName + ". Value: " + realValue); + pc.warnOrThrow(LOGGER, "Unknown (not allowed) value of type " + typeName + ". Value: " + realValue + ". Allowed values: " + definition.getAllowedValues()); return null; } return realValue != null ? new PrismPropertyValue<>(realValue) : null; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/DefinitionStoreUtils.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/DefinitionStoreUtils.java index fa31ac0c5d3..f9680003a15 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/DefinitionStoreUtils.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/DefinitionStoreUtils.java @@ -31,7 +31,7 @@ public static ID getOne(List list) { } else if (list.size() == 1) { return list.get(0); } else { - // remove all deprecated ones + // consider not deprecated ones List notDeprecated = list.stream() .filter(def -> !def.isDeprecated()) .collect(Collectors.toList()); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/DomToSchemaProcessor.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/DomToSchemaProcessor.java index 74f466fec91..0333c667270 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/DomToSchemaProcessor.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/DomToSchemaProcessor.java @@ -38,6 +38,7 @@ import javax.xml.transform.stream.StreamResult; import com.evolveum.midpoint.prism.*; +import com.sun.xml.xsom.*; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.Validate; import org.jetbrains.annotations.NotNull; @@ -54,17 +55,6 @@ import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; -import com.sun.xml.xsom.XSAnnotation; -import com.sun.xml.xsom.XSComplexType; -import com.sun.xml.xsom.XSContentType; -import com.sun.xml.xsom.XSElementDecl; -import com.sun.xml.xsom.XSFacet; -import com.sun.xml.xsom.XSModelGroup; -import com.sun.xml.xsom.XSParticle; -import com.sun.xml.xsom.XSRestrictionSimpleType; -import com.sun.xml.xsom.XSSchemaSet; -import com.sun.xml.xsom.XSTerm; -import com.sun.xml.xsom.XSType; import com.sun.xml.xsom.parser.XSOMParser; import com.sun.xml.xsom.util.DomAnnotationParserFactory; @@ -163,6 +153,10 @@ void parseDom(PrismSchemaImpl prismSchema, Element xsdSchema) throws SchemaExcep // definition in the XSD processComplexTypeDefinitions(xsSchemaSet); + // Create SimpleTypeDefinitions from all top-level simpleType + // definition in the XSD + processSimpleTypeDefinitions(xsSchemaSet); + // Create PropertyContainer (and possibly also Property) definition from // the top-level elements in XSD // This also creates ResourceObjectDefinition in some cases @@ -381,6 +375,46 @@ private ComplexTypeDefinition processComplexTypeDefinition(XSComplexType complex } + private void processSimpleTypeDefinitions(XSSchemaSet set) throws SchemaException { + Iterator iterator = set.iterateSimpleTypes(); + while (iterator.hasNext()) { + XSSimpleType simpleType = iterator.next(); + if (simpleType.getTargetNamespace().equals(schema.getNamespace())) { + processSimpleTypeDefinition(simpleType); + } + } + } + + private SimpleTypeDefinition processSimpleTypeDefinition(XSSimpleType simpleType) + throws SchemaException { + + SchemaDefinitionFactory definitionFactory = getDefinitionFactory(); + SimpleTypeDefinitionImpl std = (SimpleTypeDefinitionImpl) definitionFactory.createSimpleTypeDefinition(simpleType, prismContext, + simpleType.getAnnotation()); + + SimpleTypeDefinition existingSimpleTypeDefinition = schema.findSimpleTypeDefinitionByType(std.getTypeName()); + if (existingSimpleTypeDefinition != null) { + // We already have this in schema. So avoid redundant work + return existingSimpleTypeDefinition; + } + markRuntime(std); + + QName superType = determineSupertype(simpleType); + if (superType != null) { + std.setSuperType(superType); + } + + extractDocumentation(std, simpleType.getAnnotation()); + + if (getSchemaRegistry() != null) { + Class compileTimeClass = getSchemaRegistry().determineCompileTimeClass(std.getTypeName()); + std.setCompileTimeClass(compileTimeClass); + } + + schema.add(std); + return std; + } + private void extractDocumentation(Definition definition, XSAnnotation annotation) { if (annotation == null) { return; @@ -717,8 +751,8 @@ private boolean isAny(XSType xsType) { return false; } - private QName determineSupertype(XSComplexType complexType) { - XSType baseType = complexType.getBaseType(); + private QName determineSupertype(XSType type) { + XSType baseType = type.getBaseType(); if (baseType == null) { return null; } @@ -917,7 +951,7 @@ private PrismPropertyDefinitionImpl createPropertyDefinition(XSType xsTyp parseItemDefinitionAnnotations(propDef, annotation); List accessElements = SchemaProcessorUtil.getAnnotationElements(annotation, A_ACCESS); - if (accessElements == null || accessElements.isEmpty()) { + if (accessElements.isEmpty()) { // Default access is read-write-create propDef.setCanAdd(true); propDef.setCanModify(true); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/GlobalDefinitionsStore.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/GlobalDefinitionsStore.java index fc18cd2ecec..b6e734a813d 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/GlobalDefinitionsStore.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/GlobalDefinitionsStore.java @@ -70,7 +70,7 @@ List findItemDefinitionsByCompileTimeClass( ComplexTypeDefinition findComplexTypeDefinitionByCompileTimeClass(@NotNull Class compileTimeClass); - ComplexTypeDefinition findComplexTypeDefinitionByType(@NotNull QName typeName); + TD findTypeDefinitionByType(@NotNull QName typeName, @NotNull Class definitionClass); // non-core (derived) methods @@ -156,11 +156,21 @@ default ID findItemDefinition(@NotNull QName element return findItemDefinitionByElementName(elementName, definitionClass); } - // ComplexTypeDefinition-related + // TypeDefinition-related - @Deprecated default ComplexTypeDefinition findComplexTypeDefinition(@NotNull QName typeName) { - return findComplexTypeDefinitionByType(typeName); + default ComplexTypeDefinition findComplexTypeDefinitionByType(@NotNull QName typeName) { + return findTypeDefinitionByType(typeName, ComplexTypeDefinition.class); + } + + default SimpleTypeDefinition findSimpleTypeDefinitionByType(@NotNull QName typeName) { + return findTypeDefinitionByType(typeName, SimpleTypeDefinition.class); } + default TypeDefinition findTypeDefinitionByType(@NotNull QName typeName) { + return findTypeDefinitionByType(typeName, TypeDefinition.class); + } + @Deprecated default ComplexTypeDefinition findComplexTypeDefinition(@NotNull QName typeName) { + return findComplexTypeDefinitionByType(typeName); + } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/PrismSchemaImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/PrismSchemaImpl.java index 1da0147f44a..0c708ddfc20 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/PrismSchemaImpl.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/PrismSchemaImpl.java @@ -407,11 +407,11 @@ public ComplexTypeDefinition findComplexTypeDefinition @Nullable @Override - public ComplexTypeDefinition findComplexTypeDefinitionByType(@NotNull QName typeName) { + public TD findTypeDefinitionByType(@NotNull QName typeName, @NotNull Class definitionClass) { // TODO: check for multiple definition with the same type for (Definition definition : definitions) { - if (definition instanceof ComplexTypeDefinition && QNameUtil.match(typeName, definition.getTypeName())) { - return (ComplexTypeDefinition) definition; + if (definitionClass.isAssignableFrom(definition.getClass()) && QNameUtil.match(typeName, definition.getTypeName())) { + return (TD) definition; } } return null; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaDefinitionFactory.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaDefinitionFactory.java index 150d9683428..bd87f17cbec 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaDefinitionFactory.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaDefinitionFactory.java @@ -20,6 +20,7 @@ import javax.xml.namespace.QName; import com.evolveum.midpoint.prism.*; +import com.sun.xml.xsom.XSSimpleType; import org.w3c.dom.Element; import com.evolveum.midpoint.util.DisplayableValue; @@ -40,7 +41,14 @@ public ComplexTypeDefinition createComplexTypeDefinition(XSComplexType complexTy QName typeName = new QName(complexType.getTargetNamespace(),complexType.getName()); return new ComplexTypeDefinitionImpl(typeName, prismContext); } - + + public SimpleTypeDefinition createSimpleTypeDefinition(XSSimpleType simpleType, + PrismContext prismContext, XSAnnotation annotation) throws SchemaException { + + QName typeName = new QName(simpleType.getTargetNamespace(), simpleType.getName()); + return new SimpleTypeDefinitionImpl(typeName, prismContext); + } + public PrismPropertyDefinition createPropertyDefinition(QName elementName, QName typeName, ComplexTypeDefinition complexTypeDefinition, PrismContext prismContext, XSAnnotation annotation, XSParticle elementParticle) throws SchemaException { return new PrismPropertyDefinitionImpl(elementName, typeName, prismContext); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistryImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistryImpl.java index d87d3ea5010..59ad367c655 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistryImpl.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistryImpl.java @@ -699,11 +699,11 @@ public List findItemDefinitionsByCompileTimeClas @Override public ID findItemDefinitionByType(@NotNull QName typeName, @NotNull Class definitionClass) { if (QNameUtil.noNamespace(typeName)) { - ComplexTypeDefinition ctd = resolveGlobalTypeDefinitionWithoutNamespace(typeName.getLocalPart()); - if (ctd == null) { + TypeDefinition td = resolveGlobalTypeDefinitionWithoutNamespace(typeName.getLocalPart(), TypeDefinition.class); + if (td == null) { return null; } - typeName = ctd.getTypeName(); + typeName = td.getTypeName(); } PrismSchema schema = findSchemaByNamespace(typeName.getNamespaceURI()); if (schema == null) { @@ -738,15 +738,15 @@ public ComplexTypeDefinition findComplexTypeDefinition @Nullable @Override - public ComplexTypeDefinition findComplexTypeDefinitionByType(@NotNull QName typeName) { + public TD findTypeDefinitionByType(@NotNull QName typeName, @NotNull Class definitionClass) { if (QNameUtil.noNamespace(typeName)) { - return resolveGlobalTypeDefinitionWithoutNamespace(typeName.getLocalPart()); + return resolveGlobalTypeDefinitionWithoutNamespace(typeName.getLocalPart(), definitionClass); } PrismSchema schema = findSchemaByNamespace(typeName.getNamespaceURI()); if (schema == null) { return null; } - return schema.findComplexTypeDefinitionByType(typeName); + return schema.findTypeDefinitionByType(typeName, definitionClass); } //endregion @@ -777,11 +777,11 @@ public ItemDefinition findItemDefinitionByElementName(QName elementName, @Nullab @Override public Class determineCompileTimeClass(QName typeName) { if (QNameUtil.noNamespace(typeName)) { - ComplexTypeDefinition ctd = resolveGlobalTypeDefinitionWithoutNamespace(typeName.getLocalPart()); - if (ctd == null) { + TypeDefinition td = resolveGlobalTypeDefinitionWithoutNamespace(typeName.getLocalPart(), TypeDefinition.class); + if (td == null) { return null; } - return (Class) ctd.getCompileTimeClass(); + return (Class) td.getCompileTimeClass(); } SchemaDescription desc = findSchemaDescriptionByNamespace(typeName.getNamespaceURI()); if (desc == null) { @@ -947,17 +947,16 @@ public PrismObjectDefinition determineReferencedObjectDefinition(QName targetTyp return def; } - private ComplexTypeDefinition resolveGlobalTypeDefinitionWithoutNamespace(String typeLocalName) { - ComplexTypeDefinition found = null; + private TD resolveGlobalTypeDefinitionWithoutNamespace(String typeLocalName, Class definitionClass) { + TD found = null; for (SchemaDescription schemaDescription : parsedSchemas.values()) { PrismSchema schema = schemaDescription.getSchema(); if (schema == null) { // is this possible? continue; } - ComplexTypeDefinition def = schema.findComplexTypeDefinition(new QName(schema.getNamespace(), typeLocalName)); + TD def = schema.findTypeDefinitionByType(new QName(schema.getNamespace(), typeLocalName), definitionClass); if (def != null) { if (found != null) { - // TODO change to SchemaException throw new IllegalArgumentException("Multiple possible resolutions for unqualified type name " + typeLocalName + " (e.g. in " + def.getTypeName() + " and " + found.getTypeName()); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/PrimitiveXNode.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/PrimitiveXNode.java index ac93514e4bc..b1427010a20 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/PrimitiveXNode.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/PrimitiveXNode.java @@ -108,8 +108,8 @@ public void setValue(T value, QName typeQName) { throw new IllegalStateException("Cannot determine type QName for a value of '" + value + "'"); // todo show only class? (security/size reasons) } } + this.setTypeQName(typeQName); } - this.setTypeQName(typeQName); this.value = value; this.valueParser = null; } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/XNode.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/XNode.java index 3f94104a776..5715938ca32 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/XNode.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/XNode.java @@ -118,9 +118,6 @@ public QName getTypeQName() { } public void setTypeQName(QName typeQName) { - if (typeQName != null && typeQName.getLocalPart().equals("ConfigurationPropertiesType")) { - System.out.println("Hi!"); - } this.typeQName = typeQName; } diff --git a/infra/prism/src/test/java/com/evolveum/midpoint/prism/lex/AbstractLexicalProcessorTest.java b/infra/prism/src/test/java/com/evolveum/midpoint/prism/lex/AbstractLexicalProcessorTest.java index 59af91191bc..17649167ede 100644 --- a/infra/prism/src/test/java/com/evolveum/midpoint/prism/lex/AbstractLexicalProcessorTest.java +++ b/infra/prism/src/test/java/com/evolveum/midpoint/prism/lex/AbstractLexicalProcessorTest.java @@ -144,30 +144,10 @@ public void testParseUserRoundTrip() throws Exception { String serializedString = lexicalProcessor.write(serializedXNode, new QName(NS_FOO, "user"), null); // THEN - System.out.println("\nXNode after re-serialization:"); - System.out.println(serializedXNode.debugDump()); - System.out.println("\nRe-serialized string:"); - System.out.println(serializedString); - -// try{ -// FileOutputStream out = new FileOutputStream(new File("D:/user-jack-prism.json")); -// PrismJsonSerializer jsonSer = new PrismJsonSerializer(); -// String s = jsonSer.serializeToString((RootXNode) serializedXNode); -// System.out.println("JSON: \n" + s); -// -//// FileInputStream in = new FileInputStream(new File("D:/user-jack-prism.json")); -//// XNode afterJson = jsonSer.parseObject(in); -//// -//// // THEN -//// System.out.println("AFTER JSON XNode:"); -//// System.out.println(afterJson.debugDump()); -// -// } catch (Exception ex){ -// System.out.println( ex); -// throw ex; -// } -// - + System.out.println("\nXNode after re-serialization:"); + System.out.println(serializedXNode.debugDump()); + System.out.println("\nRe-serialized string:"); + System.out.println(serializedString); assertUserJackXNodeOrdering("serialized xnode", serializedXNode); diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/DeltaConvertor.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/DeltaConvertor.java index 8bc61165c74..2f342faa09f 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/DeltaConvertor.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/DeltaConvertor.java @@ -429,10 +429,10 @@ private static XNode toXNode(ItemDelta delta, @NotNull PrismValue value, DeltaCo .serialize(value) .getSubnode(); // TODO solve this within serializer! - if (delta.getDefinition() != null) { - node.setTypeQName(delta.getDefinition().getTypeName()); - node.setExplicitTypeDeclaration(true); - } +// if (delta.getDefinition() != null) { +// node.setTypeQName(delta.getDefinition().getTypeName()); +// node.setExplicitTypeDeclaration(true); +// } return node; } diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ObjectClassComplexTypeDefinitionImpl.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ObjectClassComplexTypeDefinitionImpl.java index 06db07fde66..f0b5d0cf450 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ObjectClassComplexTypeDefinitionImpl.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ObjectClassComplexTypeDefinitionImpl.java @@ -196,11 +196,14 @@ public ResourceAttributeDefinition createAttributeDefinition(String local */ @Override public ResourceAttributeContainer instantiate(QName elementName) { - ResourceAttributeContainerDefinition racDef = toResourceAttributeContainerDefinition(elementName); - ResourceAttributeContainer rac = new ResourceAttributeContainer(elementName, racDef, getPrismContext()); - return rac; + return instantiate(elementName, this); } + public static ResourceAttributeContainer instantiate(QName elementName, ObjectClassComplexTypeDefinition ocdef) { + ResourceAttributeContainerDefinition racDef = ocdef.toResourceAttributeContainerDefinition(elementName); + return new ResourceAttributeContainer(elementName, racDef, ocdef.getPrismContext()); + } + @NotNull @Override public ObjectClassComplexTypeDefinitionImpl clone() { diff --git a/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd b/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd index 8238653ab8b..271eaa65fd1 100644 --- a/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd +++ b/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd @@ -8409,8 +8409,14 @@ - - + + + + true + + + + diff --git a/infra/util/src/main/java/com/evolveum/midpoint/util/JAXBUtil.java b/infra/util/src/main/java/com/evolveum/midpoint/util/JAXBUtil.java index 51456882cb3..e08acd8d290 100644 --- a/infra/util/src/main/java/com/evolveum/midpoint/util/JAXBUtil.java +++ b/infra/util/src/main/java/com/evolveum/midpoint/util/JAXBUtil.java @@ -231,9 +231,6 @@ public static Class findClassForType(QName typeName, Package pkg) { packageNamespaces.put(pkg, namespace); } - if (namespace == null) { - throw new IllegalArgumentException("No namespace annotation in "+pkg); - } if (!namespace.equals(typeName.getNamespaceURI())) { throw new IllegalArgumentException("Looking for type in namespace " + typeName.getNamespaceURI() + ", but the package annotation indicates namespace " + namespace); diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestConsistencySimple.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestConsistencySimple.java index b0a78bf631e..500ed5a96bf 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestConsistencySimple.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestConsistencySimple.java @@ -15,13 +15,18 @@ */ package com.evolveum.midpoint.model.intest; +import com.evolveum.midpoint.common.refinery.RefinedResourceSchemaImpl; import com.evolveum.midpoint.model.api.ModelExecuteOptions; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.delta.ObjectDelta; import com.evolveum.midpoint.prism.delta.builder.DeltaBuilder; +import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import com.evolveum.midpoint.schema.constants.SchemaConstants; +import com.evolveum.midpoint.schema.processor.ObjectClassComplexTypeDefinition; +import com.evolveum.midpoint.schema.processor.ResourceSchema; +import com.evolveum.midpoint.schema.processor.ResourceSchemaImpl; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.MiscSchemaUtil; import com.evolveum.midpoint.task.api.Task; @@ -67,6 +72,11 @@ private enum FocusOperation { RECONCILE, RECOMPUTE } private enum ShadowOperation { KEEP, DELETE, UNLINK, UNLINK_AND_TOMBSTONE } private enum ResourceObjectOperation { KEEP, DELETE } + private ObjectClassComplexTypeDefinition getAccountObjectClassDefinition() throws SchemaException { + ResourceSchema schema = RefinedResourceSchemaImpl.getResourceSchema(resourceDummyType, prismContext); + return schema.findObjectClassDefinition(dummyResourceCtl.getAccountObjectClassQName()); + } + @Test public void test100Reconcile_Keep_Keep() throws Exception { executeTest("test100Reconcile_Keep_Keep", FocusOperation.RECONCILE, ShadowOperation.KEEP, ResourceObjectOperation.KEEP); @@ -271,7 +281,8 @@ private void cleanUpAfterTest(Task task, OperationResult result) throws Exceptio private List> getJacksShadows(OperationResult result) throws SchemaException { ObjectQuery shadowQuery = QueryBuilder.queryFor(ShadowType.class, prismContext) .item(ShadowType.F_RESOURCE_REF).ref(RESOURCE_DUMMY_OID) - .and().item(ShadowType.F_ATTRIBUTES, SchemaConstants.ICFS_NAME).eq("jack") + .and().item(new ItemPath(ShadowType.F_ATTRIBUTES, SchemaConstants.ICFS_NAME), + getAccountObjectClassDefinition().findAttributeDefinition(SchemaConstants.ICFS_NAME)).eq("jack") .build(); return repositoryService.searchObjects(ShadowType.class, shadowQuery, null, result); } diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestMisc.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestMisc.java index 553dd8fe5d2..6c7261be471 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestMisc.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestMisc.java @@ -134,7 +134,7 @@ public void test200ExportUsers() throws Exception { Document xmlDocument = DOMUtil.parseDocument(xmlString); Schema javaxSchema = prismContext.getSchemaRegistry().getJavaxSchema(); Validator validator = javaxSchema.newValidator(); - validator.setResourceResolver(prismContext.getSchemaRegistry()); + validator.setResourceResolver(prismContext.getEntityResolver()); validator.validate(new DOMSource(xmlDocument)); PrismObject parsedUser = prismContext.parseObject(xmlString); diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestModelServiceContract.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestModelServiceContract.java index 643149939db..b682b0700e8 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestModelServiceContract.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestModelServiceContract.java @@ -34,6 +34,7 @@ import javax.xml.namespace.QName; import com.evolveum.icf.dummy.resource.BreakMode; +import com.evolveum.midpoint.common.refinery.RefinedResourceSchemaImpl; import com.evolveum.midpoint.notifications.api.transports.Message; import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.delta.PropertyDelta; @@ -2365,7 +2366,7 @@ public void test191ModifyUserJackModifyAssignment() throws Exception { PrismObject dummyResource = repositoryService.getObject(ResourceType.class, RESOURCE_DUMMY_OID, null, result); - RefinedResourceSchema refinedSchema = RefinedResourceSchema.getRefinedSchema(dummyResource, prismContext); + RefinedResourceSchema refinedSchema = RefinedResourceSchemaImpl.getRefinedSchema(dummyResource, prismContext); // This explicitly parses the schema, therefore ... assertResourceSchemaParseCountIncrement(1); diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestRbac.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestRbac.java index 645cbcd5ad4..c6dce1e24de 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestRbac.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestRbac.java @@ -533,7 +533,7 @@ public void test130JackAssignRolePirateWithSeaInAssignment() throws Exception { PrismContainer extension = getAssignmentExtensionInstance(); PrismSchema piracySchema = getPiracySchema(); - PrismPropertyDefinition seaPropDef = (PrismPropertyDefinition) piracySchema.findPropertyDefinition().byElementName(PIRACY_SEA_QNAME); + PrismPropertyDefinition seaPropDef = piracySchema.findPropertyDefinitionByElementName(PIRACY_SEA_QNAME); PrismProperty seaProp = seaPropDef.instantiate(); seaProp.setRealValue("Caribbean"); extension.add(seaProp); @@ -570,7 +570,7 @@ public void test132JackUnAssignRolePirateWithSeaInAssignment() throws Exception PrismContainer extension = getAssignmentExtensionInstance(); PrismSchema piracySchema = getPiracySchema(); - PrismPropertyDefinition seaPropDef = piracySchema.findPropertyDefinition().byElementName(PIRACY_SEA_QNAME); + PrismPropertyDefinition seaPropDef = piracySchema.findPropertyDefinitionByElementName(PIRACY_SEA_QNAME); PrismProperty seaProp = seaPropDef.instantiate(); seaProp.setRealValue("Caribbean"); extension.add(seaProp); @@ -704,7 +704,7 @@ public void test137JackAssignRoleAdriaticPirateWithSeaInAssignment() throws Exce PrismContainer extension = getAssignmentExtensionInstance(); PrismSchema piracySchema = getPiracySchema(); - PrismPropertyDefinition seaPropDef = piracySchema.findPropertyDefinition().byElementName(PIRACY_SEA_QNAME); + PrismPropertyDefinition seaPropDef = piracySchema.findPropertyDefinitionByElementName(PIRACY_SEA_QNAME); PrismProperty seaProp = seaPropDef.instantiate(); seaProp.setRealValue("Caribbean"); extension.add(seaProp); @@ -741,7 +741,7 @@ public void test139JackUnAssignRoleAdriaticPirateWithSeaInAssignment() throws Ex PrismContainer extension = getAssignmentExtensionInstance(); PrismSchema piracySchema = getPiracySchema(); - PrismPropertyDefinition seaPropDef = piracySchema.findPropertyDefinition().byElementName(PIRACY_SEA_QNAME); + PrismPropertyDefinition seaPropDef = piracySchema.findPropertyDefinitionByElementName(PIRACY_SEA_QNAME); PrismProperty seaProp = seaPropDef.instantiate(); seaProp.setRealValue("Caribbean"); extension.add(seaProp); @@ -823,7 +823,7 @@ public void test147JackAssignRoleBlackSeaPirateWithSeaInAssignment() throws Exce PrismContainer extension = getAssignmentExtensionInstance(); PrismSchema piracySchema = getPiracySchema(); - PrismPropertyDefinition seaPropDef = piracySchema.findPropertyDefinition().byElementName(PIRACY_SEA_QNAME); + PrismPropertyDefinition seaPropDef = piracySchema.findPropertyDefinitionByElementName(PIRACY_SEA_QNAME); PrismProperty seaProp = seaPropDef.instantiate(); seaProp.setRealValue("Caribbean"); extension.add(seaProp); @@ -861,7 +861,7 @@ public void test149JackUnAssignRoleBlackSeaPirateWithSeaInAssignment() throws Ex PrismContainer extension = getAssignmentExtensionInstance(); PrismSchema piracySchema = getPiracySchema(); - PrismPropertyDefinition seaPropDef = piracySchema.findPropertyDefinition().byElementName(PIRACY_SEA_QNAME); + PrismPropertyDefinition seaPropDef = piracySchema.findPropertyDefinitionByElementName(PIRACY_SEA_QNAME); PrismProperty seaProp = seaPropDef.instantiate(); seaProp.setRealValue("Caribbean"); extension.add(seaProp); diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestResources.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestResources.java index bfbaad5051c..b2d1139242a 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestResources.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestResources.java @@ -30,6 +30,7 @@ import javax.xml.bind.JAXBException; import javax.xml.namespace.QName; +import com.evolveum.midpoint.prism.*; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.annotation.DirtiesContext.ClassMode; import org.springframework.test.context.ContextConfiguration; @@ -40,14 +41,6 @@ import com.evolveum.icf.dummy.resource.DummyResource; import com.evolveum.midpoint.model.api.ModelExecuteOptions; import com.evolveum.midpoint.model.api.PolicyViolationException; -import com.evolveum.midpoint.prism.Containerable; -import com.evolveum.midpoint.prism.Objectable; -import com.evolveum.midpoint.prism.PrismContainer; -import com.evolveum.midpoint.prism.PrismContainerDefinition; -import com.evolveum.midpoint.prism.PrismObject; -import com.evolveum.midpoint.prism.PrismObjectDefinition; -import com.evolveum.midpoint.prism.PrismProperty; -import com.evolveum.midpoint.prism.PrismPropertyDefinition; import com.evolveum.midpoint.prism.delta.ItemDelta; import com.evolveum.midpoint.prism.delta.ObjectDelta; import com.evolveum.midpoint.prism.delta.PropertyDelta; @@ -829,7 +822,7 @@ public void test850ModifyConfiguration() throws Exception { ItemPath propPath = new ItemPath(ResourceType.F_CONNECTOR_CONFIGURATION, IntegrationTestTools.RESOURCE_DUMMY_CONFIGURATION_USELESS_STRING_ELEMENT_NAME); - PrismPropertyDefinition propDef = new PrismPropertyDefinition(IntegrationTestTools.RESOURCE_DUMMY_CONFIGURATION_USELESS_STRING_ELEMENT_NAME, + PrismPropertyDefinition propDef = new PrismPropertyDefinitionImpl(IntegrationTestTools.RESOURCE_DUMMY_CONFIGURATION_USELESS_STRING_ELEMENT_NAME, DOMUtil.XSD_STRING, prismContext); PropertyDelta propDelta = PropertyDelta.createModificationReplaceProperty(propPath, propDef, "whatever wherever"); ObjectDelta resourceDelta = ObjectDelta.createModifyDelta(RESOURCE_DUMMY_OID, propDelta, ResourceType.class, prismContext); diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestStrangeCases.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestStrangeCases.java index 14386f4293c..acb44e1f2dd 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestStrangeCases.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestStrangeCases.java @@ -36,6 +36,7 @@ import javax.xml.datatype.XMLGregorianCalendar; import javax.xml.namespace.QName; +import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import org.apache.commons.io.IOUtils; import org.apache.commons.lang.StringUtils; @@ -50,15 +51,6 @@ import com.evolveum.midpoint.model.api.PolicyViolationException; import com.evolveum.midpoint.model.api.ProgressListener; import com.evolveum.midpoint.notifications.api.transports.Message; -import com.evolveum.midpoint.prism.Containerable; -import com.evolveum.midpoint.prism.ItemDefinition; -import com.evolveum.midpoint.prism.PrismContainer; -import com.evolveum.midpoint.prism.PrismContainerDefinition; -import com.evolveum.midpoint.prism.PrismObject; -import com.evolveum.midpoint.prism.PrismObjectDefinition; -import com.evolveum.midpoint.prism.PrismProperty; -import com.evolveum.midpoint.prism.PrismPropertyDefinition; -import com.evolveum.midpoint.prism.PrismReferenceValue; import com.evolveum.midpoint.prism.delta.ChangeType; import com.evolveum.midpoint.prism.delta.ItemDelta; import com.evolveum.midpoint.prism.delta.ObjectDelta; @@ -1182,16 +1174,15 @@ public void test520ShipReadBad() throws Exception { PrismObjectDefinition userDef = prismContext.getSchemaRegistry().findObjectDefinitionByCompileTimeClass(UserType.class); PrismContainerDefinition extensionDefinition = userDef.getExtensionDefinition(); List extensionDefs = extensionDefinition.getComplexTypeDefinition().getDefinitions(); - Iterator iterator = extensionDefs.iterator(); - while (iterator.hasNext()) { - ItemDefinition itemDefinition = iterator.next(); - if (itemDefinition.getName().equals(PIRACY_SHIP)) { - iterator.remove(); - } - } + for (ItemDefinition itemDefinition : extensionDefs) { + if (itemDefinition.getName().equals(PIRACY_SHIP)) { + //iterator.remove(); // not possible as the collection is unmodifiable + ((ItemDefinitionImpl) itemDefinition).setName(new QName(NS_PIRACY, "ship-broken")); + } + } // WHEN - PrismObject user = modelService.getObject(UserType.class, USER_GUYBRUSH_OID, null, task, result); + modelService.getObject(UserType.class, USER_GUYBRUSH_OID, null, task, result); // THEN TestUtil.displayThen(TEST_NAME); diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/negative/TestAssignmentErrors.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/negative/TestAssignmentErrors.java index d9bd78bb4a3..feaab2b04be 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/negative/TestAssignmentErrors.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/negative/TestAssignmentErrors.java @@ -30,6 +30,7 @@ import javax.xml.namespace.QName; +import com.evolveum.midpoint.common.refinery.RefinedResourceSchemaImpl; import org.apache.commons.lang.StringUtils; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.annotation.DirtiesContext.ClassMode; @@ -114,7 +115,7 @@ public void test010RefinedSchemaWhite() throws Exception { // WHEN PrismObject resourceWhite = getObject(ResourceType.class, RESOURCE_DUMMY_WHITE_OID); - RefinedResourceSchema refinedSchema = RefinedResourceSchema.getRefinedSchema(resourceWhite, prismContext); + RefinedResourceSchema refinedSchema = RefinedResourceSchemaImpl.getRefinedSchema(resourceWhite, prismContext); display("Refined schema", refinedSchema); RefinedObjectClassDefinition accountDef = refinedSchema.getDefaultRefinedDefinition(ShadowKindType.ACCOUNT); diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/sync/TestImportRecon.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/sync/TestImportRecon.java index 2b062204760..d17e128bd88 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/sync/TestImportRecon.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/sync/TestImportRecon.java @@ -30,7 +30,9 @@ import javax.xml.namespace.QName; +import com.evolveum.midpoint.common.refinery.RefinedResourceSchemaImpl; import com.evolveum.midpoint.prism.query.builder.QueryBuilder; +import com.evolveum.midpoint.schema.processor.ResourceAttributeDefinitionImpl; import org.apache.commons.lang.mutable.MutableInt; import org.opends.messages.TaskMessages; import org.springframework.beans.factory.annotation.Autowired; @@ -322,7 +324,7 @@ public void test001SanityAzure() throws Exception { display("Dummy resource azure", dummyResourceAzure); // WHEN - ResourceSchema resourceSchemaAzure = RefinedResourceSchema.getResourceSchema(resourceDummyAzureType, prismContext); + ResourceSchema resourceSchemaAzure = RefinedResourceSchemaImpl.getResourceSchema(resourceDummyAzureType, prismContext); display("Dummy azure resource schema", resourceSchemaAzure); @@ -339,7 +341,7 @@ public void test002SanityAzureRefined() throws Exception { TestUtil.displayTestTile(this, TEST_NAME); // WHEN - RefinedResourceSchema refinedSchemaAzure = RefinedResourceSchema.getRefinedSchema(resourceDummyAzureType, prismContext); + RefinedResourceSchema refinedSchemaAzure = RefinedResourceSchemaImpl.getRefinedSchema(resourceDummyAzureType, prismContext); display("Dummy azure refined schema", refinedSchemaAzure); diff --git a/model/model-intest/src/test/resources/schema/piracy.xsd b/model/model-intest/src/test/resources/schema/piracy.xsd index aadb365cfa4..8f2f3e483b7 100644 --- a/model/model-intest/src/test/resources/schema/piracy.xsd +++ b/model/model-intest/src/test/resources/schema/piracy.xsd @@ -124,6 +124,7 @@ + From 8be7430b32110e4e15169535a52a69f2c65adf38 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Thu, 27 Oct 2016 09:10:10 +0200 Subject: [PATCH 60/74] Fixed a test. --- .../com/evolveum/midpoint/model/intest/TestResources.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestResources.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestResources.java index b2d1139242a..b054d1c237d 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestResources.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestResources.java @@ -31,6 +31,7 @@ import javax.xml.namespace.QName; import com.evolveum.midpoint.prism.*; +import com.evolveum.midpoint.schema.constants.SchemaConstants; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.annotation.DirtiesContext.ClassMode; import org.springframework.test.context.ContextConfiguration; @@ -820,9 +821,9 @@ public void test850ModifyConfiguration() throws Exception { Task task = taskManager.createTaskInstance(TestResources.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); - ItemPath propPath = new ItemPath(ResourceType.F_CONNECTOR_CONFIGURATION, + ItemPath propPath = new ItemPath(ResourceType.F_CONNECTOR_CONFIGURATION, SchemaConstants.ICF_CONFIGURATION_PROPERTIES, IntegrationTestTools.RESOURCE_DUMMY_CONFIGURATION_USELESS_STRING_ELEMENT_NAME); - PrismPropertyDefinition propDef = new PrismPropertyDefinitionImpl(IntegrationTestTools.RESOURCE_DUMMY_CONFIGURATION_USELESS_STRING_ELEMENT_NAME, + PrismPropertyDefinition propDef = new PrismPropertyDefinitionImpl<>(IntegrationTestTools.RESOURCE_DUMMY_CONFIGURATION_USELESS_STRING_ELEMENT_NAME, DOMUtil.XSD_STRING, prismContext); PropertyDelta propDelta = PropertyDelta.createModificationReplaceProperty(propPath, propDef, "whatever wherever"); ObjectDelta resourceDelta = ObjectDelta.createModifyDelta(RESOURCE_DUMMY_OID, propDelta, ResourceType.class, prismContext); From 40d74bbee84b8d2261c1c48fdac72fd47968f17f Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Thu, 27 Oct 2016 11:31:10 +0200 Subject: [PATCH 61/74] (Hopefully) fixed working with raw values in bulk actions. Type-checking primitive values on parsing. --- .../com/evolveum/midpoint/common/Utils.java | 1 + .../LayerRefinedResourceSchemaImpl.java | 5 +- .../refinery/RefinedResourceSchemaImpl.java | 5 +- .../prism/marshaller/BeanUnmarshaller.java | 20 +++--- .../prism/marshaller/PrismMarshaller.java | 4 +- .../prism/marshaller/QueryConvertor.java | 4 +- .../prism/marshaller/XNodeProcessorUtil.java | 2 +- .../prism/schema/GlobalDefinitionsStore.java | 6 +- .../prism/schema/PrismSchemaImpl.java | 14 +++- .../prism/schema/SchemaRegistryImpl.java | 6 +- .../prism/util/JavaTypeConverter.java | 13 ++++ .../midpoint/prism/xnode/MapXNode.java | 2 +- .../midpoint/prism/xnode/PrimitiveXNode.java | 22 +++++-- .../ns/_public/query_3/SearchFilterType.java | 2 +- .../prism/xml/ns/_public/types_3/RawType.java | 15 ++++- .../midpoint/schema/TestDeltaConverter.java | 2 +- .../midpoint/model/impl/scripting/Data.java | 65 ++++++++++++------- .../ScriptingExpressionEvaluator.java | 36 ++++++++-- .../scripting/actions/AssignExecutor.java | 4 +- .../scripting/actions/ModifyExecutor.java | 2 +- .../scripting/helpers/ExpressionHelper.java | 9 +-- .../negative/TestModelWebServiceNegative.java | 3 +- .../resources/scripting/assign-to-jack-2.xml | 6 +- .../resources/scripting/assign-to-jack.xml | 8 ++- 24 files changed, 179 insertions(+), 77 deletions(-) diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/Utils.java b/infra/common/src/main/java/com/evolveum/midpoint/common/Utils.java index 8184360aae2..84e5ed6dc7a 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/Utils.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/Utils.java @@ -17,6 +17,7 @@ package com.evolveum.midpoint.common; import org.apache.commons.lang.StringUtils; +import org.jetbrains.annotations.Nullable; import org.w3c.dom.Element; import com.evolveum.midpoint.prism.marshaller.XPathHolder; diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedResourceSchemaImpl.java b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedResourceSchemaImpl.java index 4fc271c3b5e..abcccf6e03c 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedResourceSchemaImpl.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedResourceSchemaImpl.java @@ -197,9 +197,8 @@ public List findItemDefinitionsByElementName(@No @Override @Nullable - public ComplexTypeDefinition findComplexTypeDefinitionByCompileTimeClass( - @NotNull Class compileTimeClass) { - return refinedResourceSchema.findComplexTypeDefinitionByCompileTimeClass(compileTimeClass); + public TD findTypeDefinitionByCompileTimeClass(@NotNull Class compileTimeClass, @NotNull Class definitionClass) { + return refinedResourceSchema.findTypeDefinitionByCompileTimeClass(compileTimeClass, definitionClass); } @Override diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedResourceSchemaImpl.java b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedResourceSchemaImpl.java index 22786c4f983..c49642b9f07 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedResourceSchemaImpl.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedResourceSchemaImpl.java @@ -527,9 +527,8 @@ public List findItemDefinitionsByCompileTimeClas @Nullable @Override - public ComplexTypeDefinition findComplexTypeDefinitionByCompileTimeClass( - @NotNull Class clazz) { - return originalResourceSchema.findComplexTypeDefinitionByCompileTimeClass(clazz); + public TD findTypeDefinitionByCompileTimeClass(@NotNull Class compileTimeClass, @NotNull Class definitionClass) { + return originalResourceSchema.findTypeDefinitionByCompileTimeClass(compileTimeClass, definitionClass); } @Override diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/BeanUnmarshaller.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/BeanUnmarshaller.java index 2efbf3b0c14..8978525cf6c 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/BeanUnmarshaller.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/BeanUnmarshaller.java @@ -142,10 +142,10 @@ private T unmarshalInternal(@NotNull XNode xnode, @NotNull Class beanClas // only maps and primitives after this point if (xnode instanceof PrimitiveXNode) { - PrimitiveXNode prim = (PrimitiveXNode) xnode; + PrimitiveXNode prim = (PrimitiveXNode) xnode; if (XmlTypeConverter.canConvert(beanClass)) { QName xsdType = XsdTypeMapper.toXsdType(beanClass); - Object parsedValue = prim.getParsedValue(xsdType); + Object parsedValue = prim.getParsedValue(xsdType, beanClass); return postConvertUnmarshal(parsedValue, pc); } else if (beanClass.isEnum()) { return unmarshalEnumFromPrimitive(prim, beanClass, pc); @@ -817,15 +817,15 @@ private T unmarshalSearchFilterType(MapXNode xmap, return filterType; } - private ItemPathType unmarshalItemPath(PrimitiveXNode primitiveXNode, Class beanClass, ParsingContext parsingContext) + private ItemPathType unmarshalItemPath(PrimitiveXNode primitiveXNode, Class beanClass, ParsingContext parsingContext) throws SchemaException { - Object parsedValue = primitiveXNode.getParsedValue(ItemPathType.COMPLEX_TYPE); + ItemPathType parsedValue = primitiveXNode.getParsedValue(ItemPathType.COMPLEX_TYPE, ItemPathType.class); return postConvertUnmarshal(parsedValue, parsingContext); } private Object unmarshalPolyStringFromPrimitive(PrimitiveXNode node, Class beanClass, ParsingContext parsingContext) throws SchemaException { - Object value = node.getParsedValue(DOMUtil.XSD_STRING); + String value = node.getParsedValue(DOMUtil.XSD_STRING, String.class); return toCorrectPolyStringClass(value, beanClass, node); } @@ -871,7 +871,7 @@ private Object notSupported(XNode node, Class beanClass, ParsingContext parsi } private XmlAsStringType unmarshalXmlAsStringFromPrimitive(PrimitiveXNode node, Class beanClass, ParsingContext parsingContext) throws SchemaException { - return new XmlAsStringType(((PrimitiveXNode) node).getParsedValue(DOMUtil.XSD_STRING)); + return new XmlAsStringType(((PrimitiveXNode) node).getParsedValue(DOMUtil.XSD_STRING, String.class)); } private XmlAsStringType unmarshalXmlAsStringFromMap(MapXNode map, Class beanClass, ParsingContext parsingContext) throws SchemaException { @@ -895,10 +895,10 @@ private RawType unmarshalRawType(XNode node, Class beanClass, ParsingCo return new RawType(node, prismContext); } - private T unmarshalEnumFromPrimitive(PrimitiveXNode prim, Class beanClass, ParsingContext pc) + private T unmarshalEnumFromPrimitive(PrimitiveXNode prim, Class beanClass, ParsingContext pc) throws SchemaException { - String primValue = (String) prim.getParsedValue(DOMUtil.XSD_STRING); + String primValue = (String) prim.getParsedValue(DOMUtil.XSD_STRING, String.class); primValue = StringUtils.trim(primValue); if (StringUtils.isEmpty(primValue)) { return null; @@ -930,7 +930,7 @@ private ProtectedStringType unmarshalProtectedString(MapXNode map, Class beanCla private ProtectedStringType unmarshalProtectedString(PrimitiveXNode prim, Class beanClass, ParsingContext pc) throws SchemaException { ProtectedStringType protectedType = new ProtectedStringType(); - protectedType.setClearValue(prim.getParsedValue(DOMUtil.XSD_STRING)); + protectedType.setClearValue(prim.getParsedValue(DOMUtil.XSD_STRING, String.class)); return protectedType; } @@ -942,7 +942,7 @@ private ProtectedByteArrayType unmarshalProtectedByteArray(MapXNode map, Class b private ProtectedByteArrayType unmarshalProtectedByteArray(PrimitiveXNode prim, Class beanClass, ParsingContext pc) throws SchemaException { ProtectedByteArrayType protectedType = new ProtectedByteArrayType(); - String stringValue = prim.getParsedValue(DOMUtil.XSD_STRING); + String stringValue = prim.getParsedValue(DOMUtil.XSD_STRING, String.class); if (stringValue == null) { return null; } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismMarshaller.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismMarshaller.java index 1ab17e3dccf..b6f5ae9d941 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismMarshaller.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismMarshaller.java @@ -18,6 +18,7 @@ import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.prism.schema.SchemaRegistry; +import com.evolveum.midpoint.prism.xml.XmlTypeConverter; import com.evolveum.midpoint.prism.xnode.*; import com.evolveum.midpoint.util.DOMUtil; import com.evolveum.midpoint.util.JAXBUtil; @@ -453,7 +454,8 @@ private void addTypeDefinitionIfNeeded(@NotNull QName itemName, QName typeName, return; // nothing to do, anyway } if (!getSchemaRegistry().hasImplicitTypeDefinition(itemName, typeName) - && getSchemaRegistry().findTypeDefinitionByType(typeName) != null) { + && (XmlTypeConverter.canConvert(typeName) + || getSchemaRegistry().findTypeDefinitionByType(typeName) != null)) { valueNode.setTypeQName(typeName); valueNode.setExplicitTypeDeclaration(true); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/QueryConvertor.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/QueryConvertor.java index 96d41de4e69..5e5599132b9 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/QueryConvertor.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/QueryConvertor.java @@ -362,13 +362,13 @@ private static InOidFilter parseInOidFilter(MapXNode clauseXMap, PrismContainerD if (valueXnode instanceof ListXNode) { for (XNode subnode : (ListXNode) valueXnode) { if (subnode instanceof PrimitiveXNode) { - oids.add(((PrimitiveXNode) subnode).getParsedValue(DOMUtil.XSD_STRING)); + oids.add(((PrimitiveXNode) subnode).getParsedValue(DOMUtil.XSD_STRING, String.class)); } else { throw new SchemaException("The OID was expected to be present as primitive XNode, instead it is: " + subnode); } } } else if (valueXnode instanceof PrimitiveXNode) { - oids.add(((PrimitiveXNode) valueXnode).getParsedValue(DOMUtil.XSD_STRING)); + oids.add(((PrimitiveXNode) valueXnode).getParsedValue(DOMUtil.XSD_STRING, String.class)); } else { throw new SchemaException("The OID was expected to be present as primitive or list XNode, instead it is: " + valueXnode); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/XNodeProcessorUtil.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/XNodeProcessorUtil.java index ef6361e5eed..deafc191db8 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/XNodeProcessorUtil.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/XNodeProcessorUtil.java @@ -100,7 +100,7 @@ public static void parseProtectedType(ProtectedDataType protectedType, Ma throw new SchemaException("Cannot parse clear value from " + xClearValue); } // TODO: clearValue - T clearValue = (T) ((PrimitiveXNode)xClearValue).getParsedValue(DOMUtil.XSD_STRING); + T clearValue = (T) ((PrimitiveXNode)xClearValue).getParsedValue(DOMUtil.XSD_STRING, String.class); protectedType.setClearValue(clearValue); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/GlobalDefinitionsStore.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/GlobalDefinitionsStore.java index b6e734a813d..f63565cee61 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/GlobalDefinitionsStore.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/GlobalDefinitionsStore.java @@ -68,7 +68,11 @@ List findItemDefinitionsByCompileTimeClass( @NotNull List findItemDefinitionsByElementName(@NotNull QName elementName, @NotNull Class definitionClass); - ComplexTypeDefinition findComplexTypeDefinitionByCompileTimeClass(@NotNull Class compileTimeClass); + default ComplexTypeDefinition findComplexTypeDefinitionByCompileTimeClass(@NotNull Class compileTimeClass) { + return findTypeDefinitionByCompileTimeClass(compileTimeClass, ComplexTypeDefinition.class); + } + + TD findTypeDefinitionByCompileTimeClass(@NotNull Class compileTimeClass, @NotNull Class definitionClass); TD findTypeDefinitionByType(@NotNull QName typeName, @NotNull Class definitionClass); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/PrismSchemaImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/PrismSchemaImpl.java index 0c708ddfc20..43b587525ef 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/PrismSchemaImpl.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/PrismSchemaImpl.java @@ -321,7 +321,7 @@ public List findItemDefinitionsByCompileTimeClas found.add(contDef); } } else if (def instanceof PrismPropertyDefinition) { - if (compileTimeClass.equals(XsdTypeMapper.toJavaTypeIfKnown(def.getTypeName()))) { + if (compileTimeClass.equals(prismContext.getSchemaRegistry().determineClassForType(def.getTypeName()))) { @SuppressWarnings("unchecked") ID itemDef = (ID) def; found.add(itemDef); @@ -417,6 +417,18 @@ public TD findTypeDefinitionByType(@NotNull QName ty return null; } + @Nullable + @Override + public TD findTypeDefinitionByCompileTimeClass(@NotNull Class compileTimeClass, @NotNull Class definitionClass) { + // TODO: check for multiple definition with the same type + for (Definition definition : definitions) { + if (definitionClass.isAssignableFrom(definition.getClass()) && compileTimeClass.equals(((TD) definition).getCompileTimeClass())) { + return (TD) definition; + } + } + return null; + } + //endregion } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistryImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistryImpl.java index 59ad367c655..a7332bd3656 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistryImpl.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaRegistryImpl.java @@ -728,12 +728,12 @@ public List findItemDefinitionsByElementName(@No @Nullable @Override - public ComplexTypeDefinition findComplexTypeDefinitionByCompileTimeClass(@NotNull Class compileTimeClass) { + public TD findTypeDefinitionByCompileTimeClass(@NotNull Class compileTimeClass, @NotNull Class definitionClass) { PrismSchema schema = findSchemaByCompileTimeClass(compileTimeClass); if (schema == null) { return null; } - return schema.findComplexTypeDefinitionByCompileTimeClass(compileTimeClass); + return schema.findTypeDefinitionByCompileTimeClass(compileTimeClass, definitionClass); } @Nullable @@ -1088,7 +1088,7 @@ public Collection getSchemaDescriptions() { public PrismSchema findSchemaByCompileTimeClass(@NotNull Class compileTimeClass) { Package compileTimePackage = compileTimeClass.getPackage(); if (compileTimePackage == null) { - System.out.println("Hi"); + throw new IllegalStateException("No Java package for " + compileTimeClass); } for (SchemaDescription desc: schemaDescriptions) { if (compileTimePackage.equals(desc.getCompileTimeClassesPackage())) { diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/JavaTypeConverter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/JavaTypeConverter.java index a355c0083e7..18bcbf20af7 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/JavaTypeConverter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/JavaTypeConverter.java @@ -24,6 +24,7 @@ import javax.xml.datatype.XMLGregorianCalendar; import javax.xml.namespace.QName; +import org.apache.commons.lang.ClassUtils; import org.apache.commons.lang.time.DateUtils; import com.evolveum.midpoint.prism.PrismPropertyValue; @@ -33,6 +34,7 @@ import com.evolveum.midpoint.util.exception.ExpressionEvaluationException; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; +import org.jetbrains.annotations.Nullable; /** * Generic universal type converter. It is supposed to covert anything to anything as long @@ -264,4 +266,15 @@ private static XMLGregorianCalendar magicDateTimeParse(String stringDate) { return XmlTypeConverter.createXMLGregorianCalendar(date); } + public static boolean isTypeCompliant(@Nullable T value, @Nullable Class expectedClass) { + if (value == null || expectedClass == null) { + return true; + } + Class wrapped = ClassUtils.primitiveToWrapper(expectedClass); + return wrapped.isAssignableFrom(((Object) value).getClass()); // auto-boxing of primitive types + + // TODO PolyString vs String - should be treated here? + // TODO int vs long vs ... + } + } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/MapXNode.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/MapXNode.java index 9e36f82cf06..3a9f75fa3da 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/MapXNode.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/MapXNode.java @@ -236,7 +236,7 @@ public T getParsedPrimitiveValue(QName key, QName typeName) throws SchemaExc throw new SchemaException("Expected that field "+key+" will be primitive, but it is "+xnode.getDesc()); } PrimitiveXNode xprim = (PrimitiveXNode)xnode; - return xprim.getParsedValue(typeName); + return xprim.getParsedValue(typeName, null); // TODO expected class } public void merge(MapXNode other) { diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/PrimitiveXNode.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/PrimitiveXNode.java index b1427010a20..0a4779158bb 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/PrimitiveXNode.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xnode/PrimitiveXNode.java @@ -23,6 +23,7 @@ import com.evolveum.midpoint.prism.marshaller.XNodeProcessorEvaluationMode; import com.evolveum.midpoint.prism.util.CloneUtil; +import com.evolveum.midpoint.prism.util.JavaTypeConverter; import com.evolveum.midpoint.prism.xml.XsdTypeMapper; import com.evolveum.midpoint.util.*; import com.evolveum.midpoint.util.logging.Trace; @@ -36,6 +37,8 @@ import com.evolveum.midpoint.util.exception.SchemaException; import org.apache.commons.lang.Validate; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; public class PrimitiveXNode extends XNode implements Serializable { @@ -65,7 +68,7 @@ public PrimitiveXNode(T value) { this.value = value; } - public void parseValue(QName typeName, XNodeProcessorEvaluationMode mode) throws SchemaException { + private void parseValue(@NotNull QName typeName, XNodeProcessorEvaluationMode mode) throws SchemaException { Validate.notNull(typeName, "Cannot parse primitive XNode without knowing its type"); if (valueParser != null) { value = valueParser.parse(typeName, mode); @@ -78,15 +81,24 @@ public T getValue() { return value; } - public T getParsedValue(QName typeName) throws SchemaException { - return getParsedValue(typeName, XNodeProcessorEvaluationMode.STRICT); + @Deprecated + public T getParsedValue(@NotNull QName typeName) throws SchemaException { + return getParsedValue(typeName, null, XNodeProcessorEvaluationMode.STRICT); } - public T getParsedValue(QName typeName, XNodeProcessorEvaluationMode mode) throws SchemaException { + public T getParsedValue(@NotNull QName typeName, @Nullable Class expectedClass) throws SchemaException { + return getParsedValue(typeName, expectedClass, XNodeProcessorEvaluationMode.STRICT); + } + + public T getParsedValue(@NotNull QName typeName, @Nullable Class expectedClass, XNodeProcessorEvaluationMode mode) throws SchemaException { if (!isParsed()) { parseValue(typeName, mode); } - return value; + if (JavaTypeConverter.isTypeCompliant(value, expectedClass)) { + return value; + } else { + throw new SchemaException("Expected " + expectedClass + " but got " + value.getClass() + " instead. Value is " + value); + } } public ValueParser getValueParser() { diff --git a/infra/prism/src/main/java/com/evolveum/prism/xml/ns/_public/query_3/SearchFilterType.java b/infra/prism/src/main/java/com/evolveum/prism/xml/ns/_public/query_3/SearchFilterType.java index 4c5b5fe2526..abd94f44a3b 100644 --- a/infra/prism/src/main/java/com/evolveum/prism/xml/ns/_public/query_3/SearchFilterType.java +++ b/infra/prism/src/main/java/com/evolveum/prism/xml/ns/_public/query_3/SearchFilterType.java @@ -189,7 +189,7 @@ public void parseFromXNode(XNode xnode, PrismContext prismContext) throws Schema XNode xdesc = xmap.get(SearchFilterType.F_DESCRIPTION); if (xdesc != null) { if (xdesc instanceof PrimitiveXNode) { - String desc = ((PrimitiveXNode)xdesc).getParsedValue(DOMUtil.XSD_STRING); + String desc = ((PrimitiveXNode)xdesc).getParsedValue(DOMUtil.XSD_STRING, String.class); setDescription(desc); } else { throw new SchemaException("Description must have a primitive value"); diff --git a/infra/prism/src/main/java/com/evolveum/prism/xml/ns/_public/types_3/RawType.java b/infra/prism/src/main/java/com/evolveum/prism/xml/ns/_public/types_3/RawType.java index f2e90cd15c1..279138a71e2 100644 --- a/infra/prism/src/main/java/com/evolveum/prism/xml/ns/_public/types_3/RawType.java +++ b/infra/prism/src/main/java/com/evolveum/prism/xml/ns/_public/types_3/RawType.java @@ -161,7 +161,20 @@ public Item getParsedIt return item; } - public XNode serializeToXNode() throws SchemaException { +// // Returns either an item or a real value. +// // VERY EXPERIMENTAL. +// public Object getParsedItemOrRealValue() throws SchemaException { +// if (parsed != null) { +// return +// } else if (xnode != null) { +// return prismContext.parserFor(xnode.toRootXNode()).parseItemOrRealValue(); +// } else { +// return null; +// } +// } + + + public XNode serializeToXNode() throws SchemaException { if (xnode != null) { // QName type = xnode.getTypeQName(); // if (xnode instanceof PrimitiveXNode && type != null){ diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestDeltaConverter.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestDeltaConverter.java index 313d5655a51..9558220596a 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestDeltaConverter.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestDeltaConverter.java @@ -274,7 +274,7 @@ public void testProtectedStringObjectDelta() throws Exception { PrimitiveXNode clearValueNode = (PrimitiveXNode) valXNode.get(ProtectedStringType.F_CLEAR_VALUE); val.getParsedValue(null, null); // System.out.println("clear value " + clearValueNode); - assertEquals("Wrong element value", protectedString.getClearValue(), clearValueNode.getParsedValue(DOMUtil.XSD_STRING)); + assertEquals("Wrong element value", protectedString.getClearValue(), clearValueNode.getParsedValue(DOMUtil.XSD_STRING, String.class)); // List values = val.getContent(); // assertEquals("Wrong number of values", 1, values.size()); // JAXBElement valueElement = (JAXBElement)values.iterator().next(); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/Data.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/Data.java index af385491b5f..36c0fcd91d3 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/Data.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/Data.java @@ -22,6 +22,7 @@ import com.evolveum.midpoint.util.DOMUtil; import com.evolveum.midpoint.util.DebugDumpable; import com.evolveum.midpoint.util.DebugUtil; +import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.xml.ns._public.common.common_3.EventHandlerType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; import com.evolveum.prism.xml.ns._public.types_3.ObjectDeltaType; @@ -101,32 +102,50 @@ public String getDataAsSingleString() throws ScriptExecutionException { } } - public static Data createProperty(Object object, PrismContext prismContext) { - return createProperty(Collections.singletonList(object), object.getClass(), prismContext); - } - - public static Data createProperty(List objects, Class clazz, PrismContext prismContext) { + public static Data createItem(PrismValue value, PrismContext prismContext) throws SchemaException { // TODO fix this temporary solution (haven't we somewhere universal method to do this?) - QName elementName; - QName typeName; - if (String.class.isAssignableFrom(clazz)) { - elementName = PLAIN_STRING_ELEMENT_NAME; - typeName = DOMUtil.XSD_STRING; - } else if (ObjectDeltaType.class.isAssignableFrom(clazz)) { - elementName = SchemaConstants.T_OBJECT_DELTA; - typeName = SchemaConstants.T_OBJECT_DELTA_TYPE; - } else if (EventHandlerType.class.isAssignableFrom(clazz)) { - elementName = SchemaConstants.C_EVENT_HANDLER; - typeName = EventHandlerType.COMPLEX_TYPE; + if (value instanceof PrismReferenceValue) { + PrismReference ref = new PrismReference(new QName("reference")); + ref.add((PrismReferenceValue) value); + return create(ref); + } else if (value instanceof PrismContainerValue) { + PrismContainerValue pcv = (PrismContainerValue) value; + return create(pcv.asSingleValuedContainer(new QName("container"))); + } else if (value instanceof PrismPropertyValue) { + if (value.isRaw()) { + throw new IllegalArgumentException("Value cannot be raw at this point: " + value); + } + Class clazz = value.getRealClass(); + assert clazz != null; + PrismPropertyDefinition propertyDefinition; + List defs = prismContext.getSchemaRegistry() + .findItemDefinitionsByCompileTimeClass(clazz, PrismPropertyDefinition.class); + if (defs.size() == 1) { + propertyDefinition = defs.get(0); + } else if (String.class.isAssignableFrom(clazz)) { + propertyDefinition = new PrismPropertyDefinitionImpl<>(PLAIN_STRING_ELEMENT_NAME, DOMUtil.XSD_STRING, prismContext); + } else if (ObjectDeltaType.class.isAssignableFrom(clazz)) { + propertyDefinition = new PrismPropertyDefinitionImpl<>(SchemaConstants.T_OBJECT_DELTA, SchemaConstants.T_OBJECT_DELTA_TYPE, prismContext); + } else if (EventHandlerType.class.isAssignableFrom(clazz)) { + propertyDefinition = new PrismPropertyDefinitionImpl<>(SchemaConstants.C_EVENT_HANDLER, EventHandlerType.COMPLEX_TYPE, prismContext); + } else { + // maybe determine type from class would be sufficient + TypeDefinition td = prismContext.getSchemaRegistry().findTypeDefinitionByCompileTimeClass(clazz, TypeDefinition.class); + if (td != null) { + propertyDefinition = new PrismPropertyDefinitionImpl<>(SchemaConstants.C_VALUE, td.getTypeName(), prismContext); + } else { + throw new IllegalStateException( + "Unsupported data class (to be put into scripting data as property): " + clazz); + } + } + PrismProperty property = propertyDefinition.instantiate(); + property.add((PrismPropertyValue) value); + return create(property); + } else if (value == null) { + return createEmpty(); } else { - throw new IllegalStateException("Unsupported data class (to be put into scripting data as property): " + clazz); - } - PrismPropertyDefinition propertyDefinition = new PrismPropertyDefinitionImpl<>(elementName, typeName, prismContext); - PrismProperty property = propertyDefinition.instantiate(); - for (Object object : objects) { - property.addRealValue(object); + throw new IllegalArgumentException("Unsupported prism value: " + value); } - return create(property); } public Collection getDataAsReferences(QName defaultTargetType) throws ScriptExecutionException { diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/ScriptingExpressionEvaluator.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/ScriptingExpressionEvaluator.java index 45098cc667b..0701f656a76 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/ScriptingExpressionEvaluator.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/ScriptingExpressionEvaluator.java @@ -20,8 +20,7 @@ import com.evolveum.midpoint.model.impl.scripting.expressions.SearchEvaluator; import com.evolveum.midpoint.model.impl.scripting.expressions.SelectEvaluator; import com.evolveum.midpoint.model.impl.scripting.helpers.JaxbHelper; -import com.evolveum.midpoint.prism.Item; -import com.evolveum.midpoint.prism.PrismContext; +import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.marshaller.QueryConvertor; import com.evolveum.midpoint.prism.query.ObjectFilter; import com.evolveum.midpoint.schema.constants.SchemaConstants; @@ -45,6 +44,8 @@ import org.apache.commons.lang.NotImplementedException; import org.apache.commons.lang.Validate; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -253,15 +254,36 @@ private Data executeSequence(ExpressionSequenceType sequence, Data input, Execut return lastOutput; } - public Data evaluateConstantExpression(RawType constant, ExecutionContext context, OperationResult result) throws ScriptExecutionException { + public Data evaluateConstantExpression(@NotNull RawType constant, @Nullable Class expectedClass, ExecutionContext context, String desc, OperationResult result) throws ScriptExecutionException { try { - Object value = prismContext.parserFor(constant.getXnode().toRootXNode()).parseItemOrRealValue(); - if (value instanceof Item) { - return Data.create((Item) value); + // TODO fix this brutal hacking + PrismValue value; + if (expectedClass == null) { + value = constant.getParsedValue(null, null); } else { - return Data.createProperty(value, prismContext); + Object object = constant.getParsedRealValue(expectedClass); + if (object instanceof Referencable) { + value = ((Referencable) object).asReferenceValue(); + } else if (object instanceof Containerable) { + value = ((Containerable) object).asPrismContainerValue(); + } else { + value = new PrismPropertyValue<>(object); + } } + if (value.isRaw()) { + throw new IllegalStateException("Raw value while " + desc + ": " + value + ". Please specify type of the value."); + } + return Data.createItem(value, prismContext); + } catch (SchemaException e) { + throw new ScriptExecutionException(e.getMessage(), e); + } + } + + public Data evaluateConstantStringExpression(RawType constant, ExecutionContext context, OperationResult result) throws ScriptExecutionException { + try { + String value = constant.getParsedRealValue(String.class); + return Data.createItem(new PrismPropertyValue<>(value), prismContext); } catch (SchemaException e) { throw new ScriptExecutionException(e.getMessage(), e); } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/AssignExecutor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/AssignExecutor.java index 03163ca00ab..4e4880e1722 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/AssignExecutor.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/AssignExecutor.java @@ -72,7 +72,7 @@ public Data execute(ActionExpressionType expression, Data input, ExecutionContex Collection resources; if (resourceParameterValue != null) { - Data data = expressionHelper.evaluateParameter(resourceParameterValue, input, context, result); + Data data = expressionHelper.evaluateParameter(resourceParameterValue, null, input, context, result); resources = data.getDataAsReferences(ResourceType.COMPLEX_TYPE); } else { resources = null; @@ -80,7 +80,7 @@ public Data execute(ActionExpressionType expression, Data input, ExecutionContex Collection roles; if (roleParameterValue != null) { - Data data = expressionHelper.evaluateParameter(roleParameterValue, input, context, result); + Data data = expressionHelper.evaluateParameter(roleParameterValue, null, input, context, result); roles = data.getDataAsReferences(RoleType.COMPLEX_TYPE); } else { roles = null; diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/ModifyExecutor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/ModifyExecutor.java index 1969a6c328b..dc9c33749f7 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/ModifyExecutor.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/ModifyExecutor.java @@ -61,7 +61,7 @@ public Data execute(ActionExpressionType expression, Data input, ExecutionContex boolean dryRun = getParamDryRun(expression, input, context, result); ActionParameterValueType deltaParameterValue = expressionHelper.getArgument(expression.getParameter(), PARAM_DELTA, true, true, NAME); - Data deltaData = expressionHelper.evaluateParameter(deltaParameterValue, input, context, result); + Data deltaData = expressionHelper.evaluateParameter(deltaParameterValue, ObjectDeltaType.class, input, context, result); for (Item item : input.getData()) { if (item instanceof PrismObject) { diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/helpers/ExpressionHelper.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/helpers/ExpressionHelper.java index 7e4c8c563a0..439e6a4bfc8 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/helpers/ExpressionHelper.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/helpers/ExpressionHelper.java @@ -28,6 +28,7 @@ import com.evolveum.midpoint.xml.ns._public.model.scripting_3.ActionParameterValueType; import com.evolveum.prism.xml.ns._public.types_3.RawType; import org.apache.commons.lang.Validate; +import org.jetbrains.annotations.Nullable; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -78,7 +79,7 @@ public String getArgumentAsString(List arguments, Stri return data.getDataAsSingleString(); } } else if (parameterValue.getValue() != null) { - Data data = scriptingExpressionEvaluator.evaluateConstantExpression((RawType) parameterValue.getValue(), context, parentResult); + Data data = scriptingExpressionEvaluator.evaluateConstantStringExpression((RawType) parameterValue.getValue(), context, parentResult); if (data != null) { return data.getDataAsSingleString(); } @@ -103,13 +104,13 @@ public Boolean getArgumentAsBoolean(List arguments, St } } - public Data evaluateParameter(ActionParameterValueType parameter, Data input, ExecutionContext context, OperationResult result) + public Data evaluateParameter(ActionParameterValueType parameter, @Nullable Class expectedClass, Data input, ExecutionContext context, OperationResult result) throws ScriptExecutionException { Validate.notNull(parameter, "parameter"); if (parameter.getExpression() != null) { return scriptingExpressionEvaluator.evaluateExpression(parameter.getExpression(), input, context, result); } else if (parameter.getValue() != null) { - return scriptingExpressionEvaluator.evaluateConstantExpression((RawType) parameter.getValue(), context, result); + return scriptingExpressionEvaluator.evaluateConstantExpression((RawType) parameter.getValue(), expectedClass, context, "evaluating parameter " + parameter.getName(), result); } else { throw new IllegalStateException("No expression nor value specified"); } @@ -121,7 +122,7 @@ public T getSingleArgumentValue(List arguments, St if (paramValue == null) { return null; } - Data paramData = evaluateParameter(paramValue, input, executionContext, result); + Data paramData = evaluateParameter(paramValue, clazz, input, executionContext, result); if (paramData.getData().size() != 1) { throw new ScriptExecutionException("Exactly one item was expected in '" + parameterName + "' parameter. Got " + paramData.getData().size()); } diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/negative/TestModelWebServiceNegative.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/negative/TestModelWebServiceNegative.java index 50f196746d5..6de2110961f 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/negative/TestModelWebServiceNegative.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/negative/TestModelWebServiceNegative.java @@ -142,7 +142,8 @@ public void test200ModifyAccountWrongExplicitType() throws Exception { deltaList.getDelta().add(objectChange); // WHEN, THEN - assertExecuteChangesFailure(deltaList, null, SchemaViolationFaultType.class, "The value of type", "cannot be applied to attribute"); + //assertExecuteChangesFailure(deltaList, null, SchemaViolationFaultType.class, "The value of type", "cannot be applied to attribute"); + assertExecuteChangesFailure(deltaList, null, SchemaViolationFaultType.class, "Expected", "but got class"); } diff --git a/model/model-intest/src/test/resources/scripting/assign-to-jack-2.xml b/model/model-intest/src/test/resources/scripting/assign-to-jack-2.xml index 9ee8a9c33a5..a59685a616b 100644 --- a/model/model-intest/src/test/resources/scripting/assign-to-jack-2.xml +++ b/model/model-intest/src/test/resources/scripting/assign-to-jack-2.xml @@ -16,7 +16,9 @@ --> + xmlns:c="http://midpoint.evolveum.com/xml/ns/public/common/common-3" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xmlns:xsd="http://www.w3.org/2001/XMLSchema"> c:UserType @@ -28,7 +30,7 @@ assign role - 12345678-d34d-b33f-f00d-555555556677 + 12345678-d34d-b33f-f00d-555555556677 \ No newline at end of file diff --git a/model/model-intest/src/test/resources/scripting/assign-to-jack.xml b/model/model-intest/src/test/resources/scripting/assign-to-jack.xml index 779a0d695b0..7b8ab173d49 100644 --- a/model/model-intest/src/test/resources/scripting/assign-to-jack.xml +++ b/model/model-intest/src/test/resources/scripting/assign-to-jack.xml @@ -16,7 +16,9 @@ --> + xmlns:c="http://midpoint.evolveum.com/xml/ns/public/common/common-3" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xmlns:xsd="http://www.w3.org/2001/XMLSchema"> c:UserType @@ -28,11 +30,11 @@ assign role - 12345678-d34d-b33f-f00d-55555555cccc + 12345678-d34d-b33f-f00d-55555555cccc resource - 10000000-0000-0000-0000-000000000104 + 10000000-0000-0000-0000-000000000104 \ No newline at end of file From 3d32ebbfc03c2c21cd1dd07cb23dfc3723738b5d Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Thu, 27 Oct 2016 12:11:40 +0200 Subject: [PATCH 62/74] Fixed matching of allowedValues (for enums) + other fixes. --- .../prism/marshaller/PrismUnmarshaller.java | 24 ++++++++++++++++--- .../midpoint/prism/query/EqualFilter.java | 4 ++-- .../midpoint/prism/xml/XsdTypeMapper.java | 5 +++- 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismUnmarshaller.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismUnmarshaller.java index 799fdfcb4ce..2c8323f6768 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismUnmarshaller.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismUnmarshaller.java @@ -347,12 +347,26 @@ private PrismPropertyValue parsePropertyValue(@NotNull XNode node, } } - private boolean isValueAllowed(T realValue, PrismPropertyDefinition definition) { + private boolean isValueAllowed(T realValue, PrismPropertyDefinition definition) throws SchemaException { if (definition == null || CollectionUtils.isEmpty(definition.getAllowedValues())) { return true; } + if (realValue == null) { + return true; // TODO: ok? + } + String serializedForm; + if (realValue instanceof Enum) { + PrimitiveXNode prim = (PrimitiveXNode) getBeanMarshaller().marshall(realValue); + serializedForm = prim.getValue(); + } else { + serializedForm = null; + } + return definition.getAllowedValues().stream() - .anyMatch(displayableValue -> realValue.equals(displayableValue.getValue())); + .anyMatch(displayableValue -> + realValue.equals(displayableValue.getValue()) + || serializedForm != null && serializedForm.equals(displayableValue.getValue()) + ); } @NotNull @@ -586,7 +600,11 @@ private BeanUnmarshaller getBeanUnmarshaller() { return ((PrismContextImpl) prismContext).getBeanUnmarshaller(); } - private SchemaRegistry getSchemaRegistry() { + private BeanMarshaller getBeanMarshaller() { + return ((PrismContextImpl) prismContext).getBeanMarshaller(); + } + + private SchemaRegistry getSchemaRegistry() { return prismContext.getSchemaRegistry(); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/EqualFilter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/EqualFilter.java index 35a748388b6..12b830161fc 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/EqualFilter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/EqualFilter.java @@ -68,14 +68,14 @@ public EqualFilter(@NotNull ItemPath path, @Nullable PrismPropertyDefinition // empty (different from values as it generates filter with null 'values' attribute) @NotNull - public static EqualFilter createEqual(@NotNull ItemPath path, @NotNull PrismPropertyDefinition definition, + public static EqualFilter createEqual(@NotNull ItemPath path, @Nullable PrismPropertyDefinition definition, @Nullable QName matchingRule) { return new EqualFilter(path, definition, matchingRule, null, null, null, null); } // values @NotNull - public static EqualFilter createEqual(@NotNull ItemPath path, @NotNull PrismPropertyDefinition definition, + public static EqualFilter createEqual(@NotNull ItemPath path, @Nullable PrismPropertyDefinition definition, @Nullable QName matchingRule, @NotNull PrismContext prismContext, Object... values) { List> propertyValues = anyArrayToPropertyValueList(prismContext, values); return new EqualFilter(path, definition, matchingRule, propertyValues, null, null, null); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xml/XsdTypeMapper.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xml/XsdTypeMapper.java index c7a1a604756..1a475d4551a 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xml/XsdTypeMapper.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xml/XsdTypeMapper.java @@ -32,6 +32,7 @@ import org.apache.commons.lang.StringUtils; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.w3c.dom.Element; import com.evolveum.midpoint.prism.PrismConstants; @@ -177,12 +178,13 @@ public static Class getTypeFromClass(Class clazz) { return null; } - @NotNull + @Nullable public static Class toJavaType(@NotNull QName xsdType) { //noinspection ConstantConditions return toJavaType(xsdToJavaTypeMap, xsdType, true); } + @Nullable public static Class toJavaTypeIfKnown(@NotNull QName xsdType) { return toJavaType(xsdToJavaTypeMap, xsdType, false); } @@ -197,6 +199,7 @@ public static Class toJavaTypeIfKnownExt(@NotNull QName xsdType) { } } + @Nullable private static Class toJavaType(Map map, @NotNull QName xsdType, boolean errorIfNoMapping) { Class javaType = map.get(xsdType); if (javaType == null && StringUtils.isEmpty(xsdType.getNamespaceURI())) { From 08b1b6ba6db05a9469345cba22f7deff53568a88 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Thu, 27 Oct 2016 15:40:30 +0200 Subject: [PATCH 63/74] Fixed unmarshalling reference deltas + couple of other ones. --- .../evolveum/midpoint/prism/PrismContainerValue.java | 2 +- .../midpoint/prism/marshaller/PrismUnmarshaller.java | 10 +++++++--- .../itemApproval/ItemApprovalSpecificContent.java | 8 +++++++- .../primary/PcpChildWfTaskCreationInstruction.java | 2 +- 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerValue.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerValue.java index 9ef8ca6c3b9..87cae471c2f 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerValue.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerValue.java @@ -1115,7 +1115,7 @@ public void applyDefinition(@NotNull PrismContainerDefinition containerDef, b // We will not apply the null definition here. The item has a dynamic definition that we don't // want to destroy as it cannot be reconstructed later. } else { - item.applyDefinition(itemDefinition); + item.applyDefinition(itemDefinition, force); } } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismUnmarshaller.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismUnmarshaller.java index 2c8323f6768..544ca329aad 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismUnmarshaller.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismUnmarshaller.java @@ -408,15 +408,19 @@ private PrismReferenceValue parseReferenceValueFromXNode(@NotNull XNode node, isComposite = !QNameUtil.match(itemName, definition.getName()); } + if (isComposite) { return parseReferenceValueAsCompositeObject(node, definition, pc); // This is a composite object (complete object stored inside reference) } else { - return parseReferenceValueAsReference(node, definition, pc); // This is "real" reference (oid, and nothing more) + // TODO fix this hack: for delta values of ObjectReferenceType we will not + // insist on having reference type (because the target definition could be such that it won't require it) + boolean allowMissingRefTypesOverride = node.isExplicitTypeDeclaration(); + return parseReferenceValueAsReference(node, definition, pc, allowMissingRefTypesOverride); // This is "real" reference (oid, and nothing more) } } private PrismReferenceValue parseReferenceValueAsReference(@NotNull XNode xnode, @NotNull PrismReferenceDefinition definition, - @NotNull ParsingContext pc) throws SchemaException { + @NotNull ParsingContext pc, boolean allowMissingRefTypesOverride) throws SchemaException { if (!(xnode instanceof MapXNode)) { throw new IllegalArgumentException("Cannot parse reference from " + xnode); } @@ -427,7 +431,7 @@ private PrismReferenceValue parseReferenceValueAsReference(@NotNull XNode xnode, QName type = map.getParsedPrimitiveValue(XNode.KEY_REFERENCE_TYPE, DOMUtil.XSD_QNAME); if (type == null) { - if (!pc.isAllowMissingRefTypes()) { + if (!pc.isAllowMissingRefTypes() && !allowMissingRefTypesOverride) { type = definition.getTargetTypeName(); if (type == null) { throw new SchemaException("Target type specified neither in reference nor in the schema"); diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processes/itemApproval/ItemApprovalSpecificContent.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processes/itemApproval/ItemApprovalSpecificContent.java index 8c81e518c48..f8d550b535b 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processes/itemApproval/ItemApprovalSpecificContent.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processes/itemApproval/ItemApprovalSpecificContent.java @@ -20,6 +20,7 @@ import com.evolveum.midpoint.wf.impl.tasks.ProcessSpecificContent; import com.evolveum.midpoint.xml.ns._public.common.common_3.ItemApprovalProcessStateType; import com.evolveum.midpoint.xml.ns._public.common.common_3.WfProcessSpecificStateType; +import org.jetbrains.annotations.NotNull; import java.util.Map; @@ -28,9 +29,14 @@ */ public class ItemApprovalSpecificContent implements ProcessSpecificContent { + @NotNull private final PrismContext prismContext; private String taskName; private ApprovalSchema approvalSchema; + public ItemApprovalSpecificContent(@NotNull PrismContext prismContext) { + this.prismContext = prismContext; + } + public void setTaskName(String taskName) { this.taskName = taskName; } @@ -56,7 +62,7 @@ public ApprovalSchema getApprovalSchema() { @Override public WfProcessSpecificStateType createProcessSpecificState() { - ItemApprovalProcessStateType state = new ItemApprovalProcessStateType(); + ItemApprovalProcessStateType state = new ItemApprovalProcessStateType(prismContext); state.setApprovalSchema(approvalSchema != null ? approvalSchema.toApprovalSchemaType() : null); return state; } diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/PcpChildWfTaskCreationInstruction.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/PcpChildWfTaskCreationInstruction.java index 0f477766390..2a3c605624d 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/PcpChildWfTaskCreationInstruction.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/PcpChildWfTaskCreationInstruction.java @@ -50,7 +50,7 @@ protected PcpChildWfTaskCreationInstruction(ChangeProcessor changeProcessor, PI // useful shortcut public static PcpChildWfTaskCreationInstruction createItemApprovalInstruction(ChangeProcessor changeProcessor, String approvalTaskName, ApprovalRequest approvalRequest) { - ItemApprovalSpecificContent itemApprovalInstruction = new ItemApprovalSpecificContent(); + ItemApprovalSpecificContent itemApprovalInstruction = new ItemApprovalSpecificContent(changeProcessor.getPrismContext()); itemApprovalInstruction.setTaskName(approvalTaskName); itemApprovalInstruction.setApprovalSchema(approvalRequest.getApprovalSchema()); return new PcpChildWfTaskCreationInstruction<>(changeProcessor, itemApprovalInstruction); From bd3ace52d377a3485256fd9aaf54893db1a034d4 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Thu, 27 Oct 2016 18:13:12 +0200 Subject: [PATCH 64/74] Fixed unmarshalling objects embedded in beans (e.g. objectToAdd in ObjectDeltaType). --- .../midpoint/prism/delta/ObjectDelta.java | 16 +++ .../prism/marshaller/BeanMarshaller.java | 1 - .../prism/marshaller/BeanUnmarshaller.java | 7 +- .../prism/marshaller/PrismUnmarshaller.java | 37 +++++-- .../ns/_public/types_3/ObjectDeltaType.java | 5 +- .../midpoint/schema/TestDeltaConverter.java | 100 +++++++++++++----- 6 files changed, 123 insertions(+), 43 deletions(-) diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/ObjectDelta.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/ObjectDelta.java index 213e394b1d8..bc33a2f4cc6 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/ObjectDelta.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/ObjectDelta.java @@ -1373,6 +1373,22 @@ public int hashCode() { return result; } + public boolean equivalent(ObjectDelta other) { + if (changeType != other.changeType) + return false; + if (objectToAdd == null) { + if (other.objectToAdd != null) + return false; + } else if (!objectToAdd.equivalent(other.objectToAdd)) + return false; + if (!MiscUtil.unorderedCollectionEquals(this.modifications, other.modifications, (o1, o2) -> + ((ItemDelta) o1).equivalent((ItemDelta) o2) ? 0 : 1)) { + return false; + } + return Objects.equals(objectTypeClass, other.objectTypeClass) + && Objects.equals(oid, other.oid); + } + @Override public boolean equals(Object obj) { if (this == obj) diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/BeanMarshaller.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/BeanMarshaller.java index 9f84979aaa6..74f86a14406 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/BeanMarshaller.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/BeanMarshaller.java @@ -85,7 +85,6 @@ public XNode marshall(@Nullable T bean, @Nullable SerializationContext ctx) if (marshaller != null) { return marshaller.marshal(bean, ctx); } else if (bean instanceof Containerable) { - // we shouldn't get here but ... return prismContext.xnodeSerializer().serializeRealValue(bean, new QName("dummy")).getSubnode(); } else if (bean instanceof Enum) { return marshalEnum((Enum) bean, ctx); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/BeanUnmarshaller.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/BeanUnmarshaller.java index 8978525cf6c..e58f7eeaef4 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/BeanUnmarshaller.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/BeanUnmarshaller.java @@ -187,9 +187,10 @@ public boolean canProcess(Class clazz) { private T unmarshalFromMap(@NotNull MapXNode xmap, @NotNull Class beanClass, @NotNull ParsingContext pc) throws SchemaException { if (Containerable.class.isAssignableFrom(beanClass)) { - // This could have come from inside - PrismValue value = prismContext.parserFor(xmap.toRootXNode()).type(beanClass).parseItemValue(); - return (T) value.getRealValue(); + // This could have come from inside; note we MUST NOT parse this as PrismValue, because for objects we would lose oid/version + @SuppressWarnings("unchecked") + T value = (T) prismContext.parserFor(xmap.toRootXNode()).type(beanClass).parseRealValue(); + return value; //throw new IllegalArgumentException("Couldn't process Containerable: " + beanClass + " from " + xmap.debugDump()); } else if (SearchFilterType.class.isAssignableFrom(beanClass)) { T bean = (T) unmarshalSearchFilterType(xmap, (Class) beanClass, pc); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismUnmarshaller.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismUnmarshaller.java index 544ca329aad..9f3c01204ed 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismUnmarshaller.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismUnmarshaller.java @@ -57,6 +57,8 @@ public PrismUnmarshaller(@NotNull PrismContext prismContext) { * Please note: methods in this section should NOT be called from inside of parsing process! * It is to avoid repeatedly calling ItemInfo.determine, if at all possible. * (An exception is only if we know we have the definition ... TODO ...) + * + * TODO migrate to parseItem eventually (now we treat objects in parseItemInternal!) */ @SuppressWarnings("unchecked") PrismObject parseObject(@NotNull RootXNode root, ItemDefinition itemDefinition, QName itemName, @@ -73,8 +75,10 @@ PrismObject parseObject(@NotNull RootXNode root, ItemD return (PrismObject) (Item) parseItemInternal(child, itemInfo.getItemName(), itemInfo.getItemDefinition(), pc); } + // TODO migrate to parseItem eventually @SuppressWarnings("unchecked") - PrismObject parseObject(MapXNode map, PrismObjectDefinition objectDefinition, ParsingContext pc) throws SchemaException { + private PrismObject parseObject(MapXNode map, PrismObjectDefinition objectDefinition, + ParsingContext pc) throws SchemaException { ItemInfo itemInfo = ItemInfo.determine(objectDefinition, null, null, ARTIFICIAL_OBJECT_NAME, map.getTypeQName(), null, @@ -95,7 +99,7 @@ PrismObject parseObject(MapXNode map, PrismObjectDefin if (itemInfo.getItemDefinition() == null && itemInfo.getComplexTypeDefinition() != null) { // let's create container definition dynamically QName actualTypeName = itemInfo.getComplexTypeDefinition().getTypeName(); - if (getSchemaRegistry().isContainer(actualTypeName)) { + if (getSchemaRegistry().isContainer(actualTypeName)) { // TODO what about objects? PrismContainerDefinitionImpl def = new PrismContainerDefinitionImpl(itemInfo.getItemName(), itemInfo.getComplexTypeDefinition(), prismContext); def.setDynamic(true); @@ -171,21 +175,32 @@ private PrismContainer parseContainer(@NotNull XNod @NotNull PrismContainerDefinition containerDef, @NotNull ParsingContext pc) throws SchemaException { PrismContainer container = containerDef.instantiate(itemName); if (node instanceof ListXNode) { - for (XNode subNode : (ListXNode) node) { - container.add(parseContainerValue(subNode, containerDef, pc)); + ListXNode list = (ListXNode) node; + if (containerDef instanceof PrismObject && list.size() > 1) { + pc.warnOrThrow(LOGGER, "Multiple values for a PrismObject: " + node.debugDump()); + parseContainerValueToContainer(container, list.get(0), pc); + } else { + for (XNode subNode : list) { + parseContainerValueToContainer(container, subNode, pc); + } } } else { - container.add(parseContainerValue(node, containerDef, pc)); - if (node instanceof MapXNode && container instanceof PrismObject) { - MapXNode map = (MapXNode) node; - PrismObject object = (PrismObject) container; - object.setOid(getOid(map)); - object.setVersion(getVersion(map)); - } + parseContainerValueToContainer(container, node, pc); } return container; } + private void parseContainerValueToContainer(PrismContainer container, XNode node, + @NotNull ParsingContext pc) throws SchemaException { + container.add(parseContainerValue(node, container.getDefinition(), pc)); + if (node instanceof MapXNode && container instanceof PrismObject) { + MapXNode map = (MapXNode) node; + PrismObject object = (PrismObject) container; + object.setOid(getOid(map)); + object.setVersion(getVersion(map)); + } + } + private String getOid(MapXNode xmap) throws SchemaException { return xmap.getParsedPrimitiveValue(XNode.KEY_OID, DOMUtil.XSD_STRING); } diff --git a/infra/prism/src/main/java/com/evolveum/prism/xml/ns/_public/types_3/ObjectDeltaType.java b/infra/prism/src/main/java/com/evolveum/prism/xml/ns/_public/types_3/ObjectDeltaType.java index 07ff138dfd0..0b01ca5ee8b 100644 --- a/infra/prism/src/main/java/com/evolveum/prism/xml/ns/_public/types_3/ObjectDeltaType.java +++ b/infra/prism/src/main/java/com/evolveum/prism/xml/ns/_public/types_3/ObjectDeltaType.java @@ -99,7 +99,7 @@ public class ObjectDeltaType implements Serializable { protected ObjectType objectToAdd; @XmlElement(required = true) protected String oid; - protected List itemDelta; + protected final List itemDelta = new ArrayList<>(); public final static QName COMPLEX_TYPE = new QName(PrismConstants.NS_TYPES, "ObjectDeltaType"); public final static QName F_CHANGE_TYPE = new QName(PrismConstants.NS_TYPES, "changeType"); @@ -230,9 +230,6 @@ public void setOid(String value) { * */ public List getItemDelta() { - if (itemDelta == null) { - itemDelta = new ArrayList(); - } return this.itemDelta; } diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestDeltaConverter.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestDeltaConverter.java index 9558220596a..1053fe8c407 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestDeltaConverter.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestDeltaConverter.java @@ -16,6 +16,8 @@ package com.evolveum.midpoint.schema; +import static com.evolveum.midpoint.prism.util.PrismTestUtil.getPrismContext; +import static com.evolveum.midpoint.schema.DeltaConvertor.toObjectDeltaType; import static org.testng.AssertJUnit.assertNull; import static org.testng.AssertJUnit.assertFalse; import static org.testng.AssertJUnit.assertTrue; @@ -26,9 +28,11 @@ import com.evolveum.midpoint.prism.delta.ObjectDelta; import com.evolveum.midpoint.prism.delta.PropertyDelta; import com.evolveum.midpoint.prism.delta.ReferenceDelta; +import com.evolveum.midpoint.prism.delta.builder.DeltaBuilder; import com.evolveum.midpoint.prism.path.IdItemPathSegment; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.path.NameItemPathSegment; +import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.prism.util.PrismAsserts; import com.evolveum.midpoint.prism.util.PrismTestUtil; import com.evolveum.midpoint.prism.xnode.MapXNode; @@ -37,22 +41,14 @@ import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.xml.ns._public.common.api_types_3.ObjectModificationType; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; -import com.evolveum.prism.xml.ns._public.types_3.ChangeTypeType; -import com.evolveum.prism.xml.ns._public.types_3.ItemDeltaType; -import com.evolveum.prism.xml.ns._public.types_3.ItemPathType; -import com.evolveum.prism.xml.ns._public.types_3.ModificationTypeType; -import com.evolveum.prism.xml.ns._public.types_3.ObjectDeltaType; -import com.evolveum.prism.xml.ns._public.types_3.ProtectedStringType; -import com.evolveum.prism.xml.ns._public.types_3.RawType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; +import com.evolveum.prism.xml.ns._public.types_3.*; import org.testng.annotations.Test; import java.io.File; import java.io.IOException; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import javax.xml.bind.JAXBElement; import javax.xml.bind.JAXBException; @@ -79,7 +75,7 @@ public void testRefWithObject() throws SchemaException, IOException, JAXBExcepti ObjectModificationType.COMPLEX_TYPE); ObjectDelta objectDelta = DeltaConvertor.createObjectDelta(objectChange, UserType.class, - PrismTestUtil.getPrismContext()); + getPrismContext()); System.out.println("delta: " + objectDelta.debugDump()); @@ -105,7 +101,7 @@ public void testPasswordChange() throws Exception { // WHEN ObjectDelta objectDelta = DeltaConvertor.createObjectDelta(objectChange, UserType.class, - PrismTestUtil.getPrismContext()); + getPrismContext()); // THEN assertNotNull("No object delta", objectDelta); @@ -138,7 +134,7 @@ public void testModifyGivenName() throws Exception { // WHEN ObjectDelta objectDelta = DeltaConvertor.createObjectDelta(objectChange, UserType.class, - PrismTestUtil.getPrismContext()); + getPrismContext()); // THEN assertNotNull("No object delta", objectDelta); @@ -169,7 +165,7 @@ public void testAddAssignment() throws Exception { // WHEN ObjectDelta objectDelta = DeltaConvertor.createObjectDelta(objectChange, UserType.class, - PrismTestUtil.getPrismContext()); + getPrismContext()); System.out.println("Delta:"); System.out.println(objectDelta.debugDump()); @@ -217,7 +213,7 @@ public void testAccountRefDelta() throws Exception { modificationDeleteAccountRef.setModificationType(ModificationTypeType.DELETE); ObjectReferenceType accountRefToDelete = new ObjectReferenceType(); accountRefToDelete.setOid("54321"); - PrismContext prismContext = PrismTestUtil.getPrismContext(); + PrismContext prismContext = getPrismContext(); RawType modificationValue = new RawType(((PrismContextImpl) prismContext).getBeanMarshaller().marshall(accountRefToDelete), prismContext); modificationDeleteAccountRef.getValue().add(modificationValue); objectChange.getItemDelta().add(modificationDeleteAccountRef); @@ -244,13 +240,13 @@ public void testProtectedStringObjectDelta() throws Exception { ProtectedStringType protectedString = new ProtectedStringType(); protectedString.setClearValue("abrakadabra"); ObjectDelta objectDelta = ObjectDelta.createModificationReplaceProperty(UserType.class, "12345", - path, PrismTestUtil.getPrismContext(), protectedString); + path, getPrismContext(), protectedString); System.out.println("ObjectDelta"); System.out.println(objectDelta.debugDump()); // WHEN - ObjectDeltaType objectDeltaType = DeltaConvertor.toObjectDeltaType(objectDelta); + ObjectDeltaType objectDeltaType = toObjectDeltaType(objectDelta); // THEN System.out.println("ObjectDeltaType (XML)"); @@ -290,13 +286,13 @@ public void testObjectDeltaRoundtrip() throws Exception { final String OID = "13235545"; final String VALUE = "Very Costly Center"; ObjectDelta objectDelta = ObjectDelta.createModificationReplaceProperty(UserType.class, OID, - UserType.F_COST_CENTER, PrismTestUtil.getPrismContext(), VALUE); + UserType.F_COST_CENTER, getPrismContext(), VALUE); System.out.println("ObjectDelta"); System.out.println(objectDelta.debugDump()); // WHEN - ObjectDeltaType objectDeltaType = DeltaConvertor.toObjectDeltaType(objectDelta); + ObjectDeltaType objectDeltaType = toObjectDeltaType(objectDelta); // THEN System.out.println("ObjectDeltaType (XML)"); @@ -326,7 +322,7 @@ public void testObjectDeltaRoundtrip() throws Exception { // assertEquals("Wrong element value", VALUE, valueElement); // WHEN - ObjectDelta objectDeltaRoundtrip = DeltaConvertor.createObjectDelta(objectDeltaType, PrismTestUtil.getPrismContext()); + ObjectDelta objectDeltaRoundtrip = DeltaConvertor.createObjectDelta(objectDeltaType, getPrismContext()); // THEN System.out.println("ObjectDelta (roundtrip)"); @@ -353,10 +349,10 @@ public void testTaskExtensionDeleteDelta() throws Exception { final QName CUSTOM_OBJECT = new QName("http://delta.example.com", "object"); - PrismContext context = PrismTestUtil.getPrismContext(); + PrismContext context = getPrismContext(); // WHEN - ObjectDeltaType xmlDelta = DeltaConvertor.toObjectDeltaType(delta); + ObjectDeltaType xmlDelta = toObjectDeltaType(delta); // THEN Map properties = new HashMap(); @@ -487,7 +483,7 @@ public void testModifyInducement() throws Exception { // WHEN ObjectDelta objectDelta = DeltaConvertor.createObjectDelta(objectChange, RoleType.class, - PrismTestUtil.getPrismContext()); + getPrismContext()); System.out.println("Delta:"); System.out.println(objectDelta.debugDump()); @@ -510,4 +506,60 @@ public void testModifyInducement() throws Exception { assertEquals("wrong target type in targetRef", RoleType.COMPLEX_TYPE, targetRefVal.getTargetType()); } + @Test + public void test100ObjectAdd() throws Exception { + System.out.println("===[ test100ObjectAdd ]===="); + + UserType user = new UserType(getPrismContext()); + user.setName(PolyStringType.fromOrig("john")); + user.setOid("1234567890"); + + ObjectDelta delta = ObjectDelta.createAddDelta(user.asPrismObject()); + roundTrip(delta); + } + + @Test + public void test110ObjectModifyNone() throws Exception { + System.out.println("===[ test110ObjectModifyNone ]===="); + + ObjectDelta delta = DeltaBuilder.deltaFor(UserType.class, getPrismContext()) + .asObjectDelta("123456"); + roundTrip(delta); + } + + @Test + public void test120ObjectModifyName() throws Exception { + System.out.println("===[ test120ObjectModifyName ]===="); + + ObjectDelta delta = DeltaBuilder.deltaFor(UserType.class, getPrismContext()) + .item(UserType.F_NAME).replace(PolyString.fromOrig("jack")) + .asObjectDelta("123456"); + roundTrip(delta); + } + + private void roundTrip(ObjectDelta delta) throws Exception { + + ObjectDeltaType deltaType = DeltaConvertor.toObjectDeltaType(delta); + + System.out.println("Serialized to bean"); + System.out.println(deltaType); + + String xml = getPrismContext().xmlSerializer().serializeRealValue(deltaType, new QName("aDelta")); + + System.out.println("Serialized to XML"); + System.out.println(xml); + + ObjectDeltaType deltaTypeParsed = getPrismContext().parserFor(xml).parseRealValue(); + + System.out.println("Parsed from XML to bean"); + System.out.println(deltaTypeParsed); + + ObjectDelta deltaParsed = DeltaConvertor.createObjectDelta(deltaTypeParsed, getPrismContext()); + + System.out.println("Parsed from XML to bean to delta"); + System.out.println(deltaParsed); + + assertTrue("Deltas (native) do not match", delta.equivalent(deltaParsed)); + // note: comparing beans is problematic because e.g. item paths are not equal ({common-3}name vs {c=common-3}c:name) + } } From 2b05064096bb907fa532b84522d1fcab6a824798 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Thu, 27 Oct 2016 19:17:59 +0200 Subject: [PATCH 65/74] Attempt to fix setting and cloning definitions for polymorphic PCVs. --- .../midpoint/prism/ItemDefinitionImpl.java | 2 +- .../midpoint/prism/PrismContainer.java | 17 +++++++----- .../midpoint/prism/PrismContainerValue.java | 27 ++++++++++++++----- .../midpoint/prism/PrismProperty.java | 5 ++-- .../impl/controller/SchemaTransformer.java | 4 +-- 5 files changed, 37 insertions(+), 18 deletions(-) diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/ItemDefinitionImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/ItemDefinitionImpl.java index 1babaea8f07..e50005ebec4 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/ItemDefinitionImpl.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/ItemDefinitionImpl.java @@ -343,7 +343,7 @@ public ItemDefinition deepClone(boolean ultraDeep) { if (ultraDeep) { return deepClone(null); } else { - return deepClone(new HashMap()); + return deepClone(new HashMap<>()); } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainer.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainer.java index 97ac19dd904..16b679fd5b5 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainer.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainer.java @@ -341,12 +341,20 @@ public PrismContainerDefinition getDefinition() { */ public void setDefinition(PrismContainerDefinition definition) { checkMutability(); - this.definition = definition; if (definition != null) { for (PrismContainerValue value : getValues()) { - value.replaceComplexTypeDefinition(definition.getComplexTypeDefinition()); + // TODO reconsider this - sometimes we want to change CTDs, sometimes not + boolean safeToOverwrite = + value.getComplexTypeDefinition() == null + || this.definition == null // TODO highly dangerous (the definition might be simply unknown) + || this.definition.getComplexTypeDefinition() == null + || this.definition.getComplexTypeDefinition().getTypeName().equals(value.getComplexTypeDefinition().getTypeName()); + if (safeToOverwrite) { + value.replaceComplexTypeDefinition(definition.getComplexTypeDefinition()); + } } } + this.definition = definition; } @Override @@ -355,10 +363,7 @@ public void applyDefinition(PrismContainerDefinition definition) throws Schem if (definition == null) { return; } - if (!(definition instanceof PrismContainerDefinition)) { - throw new IllegalArgumentException("Cannot apply "+definition+" to container " + this); - } - this.compileTimeClass = ((PrismContainerDefinition)definition).getCompileTimeClass(); + this.compileTimeClass = definition.getCompileTimeClass(); super.applyDefinition(definition); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerValue.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerValue.java index 87cae471c2f..8e9c1fca8c7 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerValue.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerValue.java @@ -1097,15 +1097,15 @@ public void applyDefinition(ItemDefinition definition, boolean force) throws Sch public void applyDefinition(@NotNull PrismContainerDefinition containerDef, boolean force) throws SchemaException { checkMutability(); if (complexTypeDefinition != null && !force) { - return; // there's a definition already + return; // there's a definition already } - complexTypeDefinition = containerDef.getComplexTypeDefinition(); + replaceComplexTypeDefinition(containerDef.getComplexTypeDefinition()); if (complexTypeDefinition == null || complexTypeDefinition.isXsdAnyMarker()) { // No point in applying this. Nothing will change and there may be phantom errors. return; } if (items != null) { - for (Item item: items) { + for (Item item : items) { if (item.getDefinition() != null && !force) { // Item has a definition already, no need to apply it continue; @@ -1261,8 +1261,18 @@ private > } else { clonedItemDef = (ID) oldItemDef.deepClone(ultraDeep); } - item.propagateDeepCloneDefinition(ultraDeep, clonedItemDef); - item.setDefinition(clonedItemDef); + + // special treatment of CTD (we must not simply overwrite it with clonedPCD.CTD!) + PrismContainerable parent = getParent(); + if (parent != null && complexTypeDefinition != null) { + if (complexTypeDefinition == parent.getComplexTypeDefinition()) { + replaceComplexTypeDefinition(clonedContainerDef.getComplexTypeDefinition()); + } else { + replaceComplexTypeDefinition(complexTypeDefinition.deepClone(ultraDeep ? null : new HashMap<>() )); // OK? + } + } + item.propagateDeepCloneDefinition(ultraDeep, clonedItemDef); // propagate to items in values + item.setDefinition(clonedItemDef); // sets CTD in values only if null! } @Override @@ -1435,6 +1445,9 @@ public ComplexTypeDefinition getComplexTypeDefinition() { // will correctly work only if argument is not null (otherwise the CTD will be determined on next call to getCTD) void replaceComplexTypeDefinition(ComplexTypeDefinition complexTypeDefinition) { +// if (this.complexTypeDefinition != null && complexTypeDefinition != null && !this.complexTypeDefinition.getTypeName().equals(complexTypeDefinition.getTypeName())) { +// System.out.println("Dangerous!"); +// } this.complexTypeDefinition = complexTypeDefinition; } @@ -1455,8 +1468,8 @@ private ComplexTypeDefinition determineComplexTypeDefinition() { return null; } } - complexTypeDefinition = prismContext.getSchemaRegistry().findComplexTypeDefinitionByCompileTimeClass(containerable.getClass()); - return complexTypeDefinition; // may be null at this place + ComplexTypeDefinition def = prismContext.getSchemaRegistry().findComplexTypeDefinitionByCompileTimeClass(containerable.getClass()); + return def; // may be null at this place } public static List> toPcvList(List beans) { diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismProperty.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismProperty.java index 5eaef27ebba..ef1306407da 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismProperty.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismProperty.java @@ -97,6 +97,7 @@ public PrismPropertyDefinition getDefinition() { /** * Sets applicable property definition. * + * TODO remove (method in Item is sufficient) * @param definition the definition to set */ public void setDefinition(PrismPropertyDefinition definition) { @@ -110,7 +111,7 @@ public PrismPropertyValue getValue() { + " with multiple values"); } List> values = getValues(); - if (values == null || values.isEmpty()) { + if (values.isEmpty()) { return null; } return values.get(0); @@ -401,7 +402,7 @@ public static PropertyDelta diff(PrismProperty a, PrismProperty b) @Override protected void checkDefinition(PrismPropertyDefinition def) { - if (!(def instanceof PrismPropertyDefinition)) { + if (def == null) { throw new IllegalArgumentException("Definition "+def+" cannot be applied to property "+this); } } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/SchemaTransformer.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/SchemaTransformer.java index 4f05b3ac1ac..bef004b8d16 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/SchemaTransformer.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/SchemaTransformer.java @@ -251,7 +251,7 @@ public void applySecurityConstraints(List> items, ObjectSecurityConstr AuthorizationDecisionType defaultReadDecision, AuthorizationDecisionType defaultAddDecision, AuthorizationDecisionType defaultModifyDecision, AuthorizationPhaseType phase) { LOGGER.trace("applySecurityConstraints(items): items={}, phase={}, defaults R={}, A={}, M={}", - new Object[]{items, phase, defaultReadDecision, defaultAddDecision, defaultModifyDecision}); + items, phase, defaultReadDecision, defaultAddDecision, defaultModifyDecision); if (items == null) { return; } @@ -263,7 +263,7 @@ public void applySecurityConstraints(List> items, ObjectSecurityConstr AuthorizationDecisionType itemAddDecision = computeItemDecision(securityConstraints, itemPath, ModelAuthorizationAction.ADD.getUrl(), defaultReadDecision, phase); AuthorizationDecisionType itemModifyDecision = computeItemDecision(securityConstraints, itemPath, ModelAuthorizationAction.MODIFY.getUrl(), defaultReadDecision, phase); LOGGER.trace("applySecurityConstraints(item): {}: decisions R={}, A={}, M={}", - new Object[]{itemPath, itemReadDecision, itemAddDecision, itemModifyDecision}); + itemPath, itemReadDecision, itemAddDecision, itemModifyDecision); ItemDefinition itemDef = item.getDefinition(); if (itemDef != null) { if (itemReadDecision != AuthorizationDecisionType.ALLOW) { From 368db185253212dd049f06a57be5274609576a79 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Thu, 27 Oct 2016 19:52:22 +0200 Subject: [PATCH 66/74] Fixed c:ProtectedStringType -> t:ProtectedStringType --- .../src/test/resources/common/user-jack-repo.xml | 2 +- .../test/resources/diff/resource-after-ns-change.xml | 3 ++- .../schema/src/test/resources/diff/resource-before.xml | 3 ++- .../src/test/resources/common/connector-dummy.xml | 4 ++-- .../src/test/resources/common/connector-ldap.xml | 5 +++-- .../src/test/resources/common/connector-dummy.xml | 4 ++-- .../src/test/resources/model-context.obsolete.xml | 10 +++++----- .../model-contexts/context-dummy-resource.xml | 2 +- .../workflow-impl/src/test/resources/task.obsolete.xml | 10 +++++----- .../src/test/resources/modify/user-with-extension.xml | 2 +- samples/objects/connector-dbtable.xml | 4 ++-- 11 files changed, 26 insertions(+), 23 deletions(-) diff --git a/gui/admin-gui/src/test/resources/common/user-jack-repo.xml b/gui/admin-gui/src/test/resources/common/user-jack-repo.xml index e7b3f162c3b..f4920887da6 100644 --- a/gui/admin-gui/src/test/resources/common/user-jack-repo.xml +++ b/gui/admin-gui/src/test/resources/common/user-jack-repo.xml @@ -100,7 +100,7 @@ - + diff --git a/infra/schema/src/test/resources/diff/resource-after-ns-change.xml b/infra/schema/src/test/resources/diff/resource-after-ns-change.xml index 855a2642eb5..24759056a7a 100644 --- a/infra/schema/src/test/resources/diff/resource-after-ns-change.xml +++ b/infra/schema/src/test/resources/diff/resource-after-ns-change.xml @@ -20,6 +20,7 @@ + type="t:ProtectedStringType" minOccurs="0" maxOccurs="unbounded"> This is fake. It is only for namespace testing and similar wild things. diff --git a/infra/schema/src/test/resources/diff/resource-before.xml b/infra/schema/src/test/resources/diff/resource-before.xml index 7822d99c7d3..ce85b19cb47 100644 --- a/infra/schema/src/test/resources/diff/resource-before.xml +++ b/infra/schema/src/test/resources/diff/resource-before.xml @@ -17,6 +17,7 @@ - + This is fake. It is only for namespace testing and similar wild things. diff --git a/model/model-intest/src/test/resources/common/connector-dummy.xml b/model/model-intest/src/test/resources/common/connector-dummy.xml index 25e71f280ee..e3bea282790 100644 --- a/model/model-intest/src/test/resources/common/connector-dummy.xml +++ b/model/model-intest/src/test/resources/common/connector-dummy.xml @@ -19,7 +19,7 @@ xmlns="http://midpoint.evolveum.com/xml/ns/public/common/common-3" xmlns:c="http://midpoint.evolveum.com/xml/ns/public/common/common-3" xmlns:ns2="http://www.w3.org/2001/04/xmlenc#" - + xmlns:t="http://prism.evolveum.com/xml/ns/public/types-3" xmlns:ns3="http://www.w3.org/2000/09/xmldsig#"> ICF com.evolveum.icf.dummy.connector.DummyConnector @@ -74,7 +74,7 @@ - + UI_INSTANCE_USELESS_GUARDED_STRING diff --git a/model/model-intest/src/test/resources/common/connector-ldap.xml b/model/model-intest/src/test/resources/common/connector-ldap.xml index 95952f4fc5f..59637581de8 100644 --- a/model/model-intest/src/test/resources/common/connector-ldap.xml +++ b/model/model-intest/src/test/resources/common/connector-ldap.xml @@ -16,6 +16,7 @@ --> ICF org.identityconnectors.ldap.LdapConnector http://midpoint.evolveum.com/xml/ns/public/connector/icf-1/bundle/com.evolveum.polygon.connector-ldap/org.identityconnectors.ldap.LdapConnector @@ -77,7 +78,7 @@ - + Password Decryption Key @@ -85,7 +86,7 @@ - + Password diff --git a/model/workflow-impl/src/test/resources/common/connector-dummy.xml b/model/workflow-impl/src/test/resources/common/connector-dummy.xml index 02f95f41859..c3830460117 100644 --- a/model/workflow-impl/src/test/resources/common/connector-dummy.xml +++ b/model/workflow-impl/src/test/resources/common/connector-dummy.xml @@ -19,7 +19,7 @@ xmlns="http://midpoint.evolveum.com/xml/ns/public/common/common-3" xmlns:c="http://midpoint.evolveum.com/xml/ns/public/common/common-3" xmlns:ns2="http://www.w3.org/2001/04/xmlenc#" - + xmlns:t="http://prism.evolveum.com/xml/ns/public/types-3" xmlns:ns3="http://www.w3.org/2000/09/xmldsig#"> ICF com.evolveum.icf.dummy.connector.DummyConnector @@ -66,7 +66,7 @@ - + UI_INSTANCE_USELESS_GUARDED_STRING diff --git a/model/workflow-impl/src/test/resources/model-context.obsolete.xml b/model/workflow-impl/src/test/resources/model-context.obsolete.xml index 6cbff767fea..80a770dd882 100644 --- a/model/workflow-impl/src/test/resources/model-context.obsolete.xml +++ b/model/workflow-impl/src/test/resources/model-context.obsolete.xml @@ -121,7 +121,7 @@ xmlns:wfpis="http://midpoint.evolveum.com/xml/ns/model/workflow/process-instance-state-3" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:enc="http://www.w3.org/2001/04/xmlenc#" - xsi:type="c:ProtectedStringType"> + xsi:type="t:ProtectedStringType"> @@ -229,7 +229,7 @@ xmlns:wfpis="http://midpoint.evolveum.com/xml/ns/model/workflow/process-instance-state-3" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:enc="http://www.w3.org/2001/04/xmlenc#" - xsi:type="c:ProtectedStringType"> + xsi:type="t:ProtectedStringType"> @@ -368,7 +368,7 @@ xmlns:wfpis="http://midpoint.evolveum.com/xml/ns/model/workflow/process-instance-state-3" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:enc="http://www.w3.org/2001/04/xmlenc#" - xsi:type="c:ProtectedStringType"> + xsi:type="t:ProtectedStringType"> @@ -532,7 +532,7 @@ c:credentials/c:password + xsi:type="t:ProtectedStringType"> @@ -597,7 +597,7 @@ - + diff --git a/model/workflow-impl/src/test/resources/model-contexts/context-dummy-resource.xml b/model/workflow-impl/src/test/resources/model-contexts/context-dummy-resource.xml index 8627121cfdc..370c99a75c3 100644 --- a/model/workflow-impl/src/test/resources/model-contexts/context-dummy-resource.xml +++ b/model/workflow-impl/src/test/resources/model-contexts/context-dummy-resource.xml @@ -299,7 +299,7 @@ replace c:credentials/c:password - + diff --git a/model/workflow-impl/src/test/resources/task.obsolete.xml b/model/workflow-impl/src/test/resources/task.obsolete.xml index bd23ea349c9..1bc087f4f9f 100644 --- a/model/workflow-impl/src/test/resources/task.obsolete.xml +++ b/model/workflow-impl/src/test/resources/task.obsolete.xml @@ -127,7 +127,7 @@ xmlns:wfpis="http://midpoint.evolveum.com/xml/ns/model/workflow/process-instance-state-3" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:enc="http://www.w3.org/2001/04/xmlenc#" - xsi:type="c:ProtectedStringType"> + xsi:type="t:ProtectedStringType"> @@ -234,7 +234,7 @@ xmlns:wfpis="http://midpoint.evolveum.com/xml/ns/model/workflow/process-instance-state-3" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:enc="http://www.w3.org/2001/04/xmlenc#" - xsi:type="c:ProtectedStringType"> + xsi:type="t:ProtectedStringType"> @@ -368,7 +368,7 @@ xmlns:wfpis="http://midpoint.evolveum.com/xml/ns/model/workflow/process-instance-state-3" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:enc="http://www.w3.org/2001/04/xmlenc#" - xsi:type="c:ProtectedStringType"> + xsi:type="t:ProtectedStringType"> @@ -528,7 +528,7 @@ c:credentials/c:password + xsi:type="t:ProtectedStringType"> @@ -592,7 +592,7 @@ - + diff --git a/repo/repo-sql-impl-test/src/test/resources/modify/user-with-extension.xml b/repo/repo-sql-impl-test/src/test/resources/modify/user-with-extension.xml index 63c9f54f88b..ea3f06fea8f 100644 --- a/repo/repo-sql-impl-test/src/test/resources/modify/user-with-extension.xml +++ b/repo/repo-sql-impl-test/src/test/resources/modify/user-with-extension.xml @@ -57,7 +57,7 @@ - + diff --git a/samples/objects/connector-dbtable.xml b/samples/objects/connector-dbtable.xml index 5a950f727cf..95895ce6118 100644 --- a/samples/objects/connector-dbtable.xml +++ b/samples/objects/connector-dbtable.xml @@ -22,7 +22,7 @@ discovered during system initialization. --> @@ -158,7 +158,7 @@ - + User Password From a89b23e4b20324923e02746bfcdef219fb68be9e Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Thu, 27 Oct 2016 22:48:14 +0200 Subject: [PATCH 67/74] Almost fixed parsing deltas with full-object references (no OIDs yet!) --- .../prism/marshaller/BeanUnmarshaller.java | 2 +- .../midpoint/prism/util/RawTypeUtil.java | 23 ++++++++++++++++--- .../midpoint/schema/TestDeltaConverter.java | 2 +- .../user-modify-add-account.xml | 2 +- .../testing/consistency/ConsistencyTest.java | 3 ++- 5 files changed, 25 insertions(+), 7 deletions(-) diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/BeanUnmarshaller.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/BeanUnmarshaller.java index e58f7eeaef4..7e0d4abc509 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/BeanUnmarshaller.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/BeanUnmarshaller.java @@ -716,7 +716,7 @@ private Object convertSinglePropValue(XNode xsubnode, String fieldName, Class pa RawType raw = new RawType(xsubnode, prismContext); // FIXME UGLY HACK: parse value if possible if (xsubnode.getTypeQName() != null) { - PrismValue value = prismContext.parserFor(xsubnode.toRootXNode()).parseItemValue(); + PrismValue value = prismContext.parserFor(xsubnode.toRootXNode()).parseItemValue(); // TODO what about objects? oid/version will be lost here if (value != null && !value.isRaw()) { raw = new RawType(value, prismContext); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/RawTypeUtil.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/RawTypeUtil.java index 213c521bcad..23dc0122112 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/RawTypeUtil.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/RawTypeUtil.java @@ -38,7 +38,7 @@ public static Item getP itemDefinition = (ID) ((PrismContextImpl) containerDef.getPrismContext()).getPrismUnmarshaller().locateItemDefinition(containerDef, elementQName, rawValue.getXnode()); } IV parsed = rawValue.getParsedValue(itemDefinition, elementQName); - if (parsed != null){ + if (parsed != null) { parsedValues.add(parsed); } } @@ -76,8 +76,25 @@ public static Item getP } else if (itemDefinition instanceof PrismReferenceDefinition) { // TODO PrismReference reference = ((PrismReferenceDefinition) itemDefinition).instantiate(); - for (IV val : parsedValues){ - reference.merge((PrismReferenceValue) val.clone()); + for (IV val : parsedValues) { + PrismReferenceValue ref; + if (val instanceof PrismReferenceValue) { + ref = (PrismReferenceValue) val.clone(); + } else if (val instanceof PrismContainerValue) { + // this is embedded (full) object + Containerable c = ((PrismContainerValue) val).asContainerable(); + if (!(c instanceof Objectable)) { + throw new IllegalStateException("Content of " + itemDefinition + + " is a Containerable but not Objectable: " + c); + } + Objectable o = (Objectable) c; + ref = new PrismReferenceValue(); + ref.setObject(o.asPrismObject()); + } else { + throw new IllegalStateException("Content of " + itemDefinition + + " is neither PrismReferenceValue nor PrismContainerValue: " + val); + } + reference.merge(ref); } subItem = (Item) reference; diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestDeltaConverter.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestDeltaConverter.java index 1053fe8c407..87e066e62c0 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestDeltaConverter.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestDeltaConverter.java @@ -67,7 +67,7 @@ public class TestDeltaConverter extends AbstractSchemaTest { private static final ItemPath CREDENTIALS_PASSWORD_VALUE_PATH = new ItemPath(UserType.F_CREDENTIALS, CredentialsType.F_PASSWORD, PasswordType.F_VALUE); - @Test(enabled = false) // https://jira.evolveum.com/browse/MID-3487 + @Test public void testRefWithObject() throws SchemaException, IOException, JAXBException { System.out.println("===[ testRefWithObject ]===="); diff --git a/infra/schema/src/test/resources/deltaconverter/user-modify-add-account.xml b/infra/schema/src/test/resources/deltaconverter/user-modify-add-account.xml index faa6d6fa89b..d139c572384 100644 --- a/infra/schema/src/test/resources/deltaconverter/user-modify-add-account.xml +++ b/infra/schema/src/test/resources/deltaconverter/user-modify-add-account.xml @@ -26,7 +26,7 @@ add c:linkRef - + diff --git a/testing/consistency-mechanism/src/test/java/com/evolveum/midpoint/testing/consistency/ConsistencyTest.java b/testing/consistency-mechanism/src/test/java/com/evolveum/midpoint/testing/consistency/ConsistencyTest.java index 7f16ff4261b..ffe8447697b 100644 --- a/testing/consistency-mechanism/src/test/java/com/evolveum/midpoint/testing/consistency/ConsistencyTest.java +++ b/testing/consistency-mechanism/src/test/java/com/evolveum/midpoint/testing/consistency/ConsistencyTest.java @@ -40,6 +40,7 @@ import javax.xml.namespace.QName; import javax.xml.ws.Holder; +import com.evolveum.midpoint.common.refinery.RefinedResourceSchemaImpl; import org.apache.commons.lang.StringUtils; import org.opends.server.types.Entry; import org.opends.server.util.EmbeddedUtils; @@ -2325,7 +2326,7 @@ private void checkOpenDjResource(ResourceType resource, String source) throws Sc } private void checkOpenDjSchema(ResourceType resource, String source) throws SchemaException { - ResourceSchema schema = RefinedResourceSchema.getResourceSchema(resource, prismContext); + ResourceSchema schema = RefinedResourceSchemaImpl.getResourceSchema(resource, prismContext); ObjectClassComplexTypeDefinition accountDefinition = schema.findObjectClassDefinition(RESOURCE_OPENDJ_ACCOUNT_OBJECTCLASS); assertNotNull("Schema does not define any account (resource from " + source + ")", accountDefinition); Collection identifiers = accountDefinition.getPrimaryIdentifiers(); From cd50180bc0cbd63dd8bec137ae86937aa47dd70d Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Thu, 27 Oct 2016 23:00:57 +0200 Subject: [PATCH 68/74] Fixed isSecondaryIdentifier in rOCD. --- .../common/refinery/RefinedObjectClassDefinitionImpl.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedObjectClassDefinitionImpl.java b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedObjectClassDefinitionImpl.java index 093dfe43573..214d79ccb4d 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedObjectClassDefinitionImpl.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedObjectClassDefinitionImpl.java @@ -674,11 +674,6 @@ public boolean isRuntimeSchema() { return originalObjectClassDefinition.isRuntimeSchema(); } - @Override - public boolean isSecondaryIdentifier(QName attrName) { - return originalObjectClassDefinition.isSecondaryIdentifier(attrName); - } - @NotNull @Override public List getIgnoredNamespaces() { From 9b9f019f39241f01113b776d44dc86448104b40d Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Thu, 27 Oct 2016 23:55:05 +0200 Subject: [PATCH 69/74] Changes after merging. --- .../com/evolveum/midpoint/prism/xml/XsdTypeMapper.java | 1 + .../midpoint/prism/foo/EventHandlerChainType.java | 1 + .../com/evolveum/midpoint/schema/util/MiscSchemaUtil.java | 1 - .../evolveum/midpoint/provisioning/impl/ShadowCache.java | 3 +++ .../midpoint/provisioning/impl/ShadowManager.java | 5 +---- .../midpoint/provisioning/util/ProvisioningUtil.java | 1 + .../java/com/evolveum/midpoint/repo/sql/ModifyTest.java | 2 +- .../com/evolveum/midpoint/testing/sanity/TestSanity.java | 8 +------- .../midpoint/testing/sanity/TestSanityLegacy.java | 8 +------- 9 files changed, 10 insertions(+), 20 deletions(-) diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xml/XsdTypeMapper.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xml/XsdTypeMapper.java index 987facba6ea..f9dd2a0fb87 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/xml/XsdTypeMapper.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/xml/XsdTypeMapper.java @@ -30,6 +30,7 @@ import javax.xml.datatype.XMLGregorianCalendar; import javax.xml.namespace.QName; +import com.evolveum.prism.xml.ns._public.types_3.ItemPathType; import org.apache.commons.lang.StringUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/infra/prism/src/test/java/com/evolveum/midpoint/prism/foo/EventHandlerChainType.java b/infra/prism/src/test/java/com/evolveum/midpoint/prism/foo/EventHandlerChainType.java index cd3c8555992..0f6d87db3f9 100644 --- a/infra/prism/src/test/java/com/evolveum/midpoint/prism/foo/EventHandlerChainType.java +++ b/infra/prism/src/test/java/com/evolveum/midpoint/prism/foo/EventHandlerChainType.java @@ -31,6 +31,7 @@ import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElementRef; import javax.xml.bind.annotation.XmlType; +import javax.xml.namespace.QName; import java.io.Serializable; import java.util.ArrayList; import java.util.Iterator; diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/MiscSchemaUtil.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/MiscSchemaUtil.java index c09efc0f58a..a6496118f17 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/MiscSchemaUtil.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/MiscSchemaUtil.java @@ -35,7 +35,6 @@ import com.evolveum.midpoint.prism.delta.ItemDelta; import com.evolveum.midpoint.prism.delta.ObjectDelta; -import com.evolveum.midpoint.prism.parser.XPathHolder; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.xml.XmlTypeConverter; import com.evolveum.midpoint.schema.GetOperationOptions; diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowCache.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowCache.java index 8b505a3963e..f8b7e1382e4 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowCache.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowCache.java @@ -15,6 +15,7 @@ */ package com.evolveum.midpoint.provisioning.impl; +import com.evolveum.midpoint.common.Clock; import com.evolveum.midpoint.common.refinery.RefinedAssociationDefinition; import com.evolveum.midpoint.common.refinery.RefinedObjectClassDefinition; import com.evolveum.midpoint.common.refinery.ShadowDiscriminatorObjectDelta; @@ -26,6 +27,7 @@ import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.path.NameItemPathSegment; import com.evolveum.midpoint.prism.query.*; +import com.evolveum.midpoint.prism.xml.XmlTypeConverter; import com.evolveum.midpoint.provisioning.api.*; import com.evolveum.midpoint.provisioning.consistency.api.ErrorHandler; import com.evolveum.midpoint.provisioning.consistency.api.ErrorHandler.FailedOperation; @@ -65,6 +67,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; +import javax.xml.datatype.XMLGregorianCalendar; import javax.xml.namespace.QName; import java.util.ArrayList; import java.util.Collection; diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowManager.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowManager.java index 3eaeb1d33d5..3fe748c4977 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowManager.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowManager.java @@ -28,6 +28,7 @@ import com.evolveum.midpoint.prism.query.builder.S_AtomicFilterEntry; import com.evolveum.midpoint.prism.query.builder.S_FilterEntry; import com.evolveum.midpoint.provisioning.util.ProvisioningUtil; +import com.evolveum.midpoint.xml.ns._public.common.common_3.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; @@ -83,10 +84,6 @@ import com.evolveum.midpoint.util.exception.SystemException; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; -import com.evolveum.midpoint.xml.ns._public.common.common_3.FailedOperationTypeType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceObjectAssociationDirectionType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; /** diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/util/ProvisioningUtil.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/util/ProvisioningUtil.java index e283c8a2e6d..3f4ed9b0639 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/util/ProvisioningUtil.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/util/ProvisioningUtil.java @@ -28,6 +28,7 @@ import com.evolveum.midpoint.provisioning.ucf.api.ExecuteProvisioningScriptOperation; import com.evolveum.midpoint.provisioning.ucf.api.ExecuteScriptArgument; import com.evolveum.midpoint.schema.CapabilityUtil; +import com.evolveum.midpoint.schema.GetOperationOptions; import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.processor.ResourceAttribute; import com.evolveum.midpoint.schema.processor.ResourceAttributeContainer; diff --git a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/ModifyTest.java b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/ModifyTest.java index ec5eecdd694..f7d0a0c9794 100644 --- a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/ModifyTest.java +++ b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/ModifyTest.java @@ -407,7 +407,7 @@ public void test120ModifyAccountMetadata() throws Exception { QName attrBazQName = new QName(MidPointConstants.NS_RI, "baz"); PrismContainer attributesContainerBefore = shadowBefore.findContainer(ShadowType.F_ATTRIBUTES); PrismProperty attrBazBefore = new PrismProperty<>(new QName(MidPointConstants.NS_RI, "baz"), prismContext); - PrismPropertyDefinition attrBazDefBefore = new PrismPropertyDefinition<>(attrBazQName, DOMUtil.XSD_STRING, prismContext); + PrismPropertyDefinitionImpl attrBazDefBefore = new PrismPropertyDefinitionImpl<>(attrBazQName, DOMUtil.XSD_STRING, prismContext); attrBazDefBefore.setMaxOccurs(-1); attrBazBefore.setDefinition(attrBazDefBefore); attrBazBefore.addRealValue("BaZ1"); diff --git a/testing/sanity/src/test/java/com/evolveum/midpoint/testing/sanity/TestSanity.java b/testing/sanity/src/test/java/com/evolveum/midpoint/testing/sanity/TestSanity.java index b7c5f096525..303e4488d9f 100644 --- a/testing/sanity/src/test/java/com/evolveum/midpoint/testing/sanity/TestSanity.java +++ b/testing/sanity/src/test/java/com/evolveum/midpoint/testing/sanity/TestSanity.java @@ -58,14 +58,8 @@ import org.apache.commons.lang.Validate; import org.opends.server.core.ModifyOperation; import org.opends.server.protocols.internal.InternalSearchOperation; -import org.opends.server.types.Attribute; -import org.opends.server.types.AttributeValue; -import org.opends.server.types.DereferencePolicy; -import org.opends.server.types.DirectoryException; +import org.opends.server.types.*; import org.opends.server.types.ModificationType; -import org.opends.server.types.RawModification; -import org.opends.server.types.ResultCode; -import org.opends.server.types.SearchScope; import org.opends.server.util.ChangeRecordEntry; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.annotation.DirtiesContext; diff --git a/testing/sanity/src/test/java/com/evolveum/midpoint/testing/sanity/TestSanityLegacy.java b/testing/sanity/src/test/java/com/evolveum/midpoint/testing/sanity/TestSanityLegacy.java index 41ca6bdedc7..85dc5ed874f 100644 --- a/testing/sanity/src/test/java/com/evolveum/midpoint/testing/sanity/TestSanityLegacy.java +++ b/testing/sanity/src/test/java/com/evolveum/midpoint/testing/sanity/TestSanityLegacy.java @@ -53,14 +53,8 @@ import org.apache.commons.lang.Validate; import org.opends.server.core.ModifyOperation; import org.opends.server.protocols.internal.InternalSearchOperation; -import org.opends.server.types.Attribute; -import org.opends.server.types.AttributeValue; -import org.opends.server.types.DereferencePolicy; -import org.opends.server.types.DirectoryException; +import org.opends.server.types.*; import org.opends.server.types.ModificationType; -import org.opends.server.types.RawModification; -import org.opends.server.types.ResultCode; -import org.opends.server.types.SearchScope; import org.opends.server.util.ChangeRecordEntry; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.annotation.DirtiesContext; From 4d05229d827dc1bdd4e230e990736a992c89673b Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Fri, 28 Oct 2016 08:25:21 +0200 Subject: [PATCH 70/74] Fixed defaultHostname schema info (minOccurs=0) --- .../src/main/resources/xml/ns/public/common/common-core-3.xsd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd b/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd index 1d1aee4250b..00c9f196a8d 100644 --- a/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd +++ b/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd @@ -9480,7 +9480,7 @@ - + From e96f4e743e8cb4bc840c93861481b89e7ba8a63c Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Fri, 28 Oct 2016 08:33:42 +0200 Subject: [PATCH 71/74] Fixed failing notification-impl test. --- .../src/test/resources/schema/piracy.xsd | 131 ++++++++++++++++++ 1 file changed, 131 insertions(+) create mode 100644 model/notifications-impl/src/test/resources/schema/piracy.xsd diff --git a/model/notifications-impl/src/test/resources/schema/piracy.xsd b/model/notifications-impl/src/test/resources/schema/piracy.xsd new file mode 100644 index 00000000000..8f2f3e483b7 --- /dev/null +++ b/model/notifications-impl/src/test/resources/schema/piracy.xsd @@ -0,0 +1,131 @@ + + + + + + + + + + + + + + + + + + true + + + + + + + false + + + + + + + true + + + + + + + true + + + + + + + + + + true + + + + + + + false + + + + + + + + + + + + + + Peg Leg + + + + + + + No Eye + + + + + + + + + + + + + + + + + + + + + + + + + + + true + + + + + + + + From 199b8e53bb126fa72904d3a3a97fbafa7d5a1973 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Fri, 28 Oct 2016 11:59:35 +0200 Subject: [PATCH 72/74] Set default value for extra validations in prisms to FALSE. --- .../main/java/com/evolveum/midpoint/prism/IPrismValue.java | 2 ++ .../main/java/com/evolveum/midpoint/prism/PrismContainer.java | 4 ++-- .../java/com/evolveum/midpoint/prism/PrismContextImpl.java | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/IPrismValue.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/IPrismValue.java index b428cf6f17f..acf435f6bbb 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/IPrismValue.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/IPrismValue.java @@ -27,6 +27,8 @@ import java.util.Collection; /** + * TODO rename to PrismValue and rename existing PrismValue to PrismValueImpl + * * @author semancik * @author mederly */ diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainer.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainer.java index 16b679fd5b5..7119dc8264c 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainer.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainer.java @@ -665,8 +665,8 @@ public boolean isEmpty() { @Override protected void checkDefinition(PrismContainerDefinition def) { - if (!(def instanceof PrismContainerDefinition)) { - throw new IllegalArgumentException("Definition "+def+" cannot be applied to container "+this); + if (def == null) { + throw new IllegalArgumentException("Null definition cannot be applied to container "+this); } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContextImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContextImpl.java index 1756d487521..495f3194fb8 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContextImpl.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContextImpl.java @@ -52,7 +52,7 @@ public class PrismContextImpl implements PrismContext { private static final Trace LOGGER = TraceManager.getTrace(PrismContextImpl.class); private static boolean allowSchemalessSerialization = true; - private static boolean extraValidation = true; // TODO replace by something serious + private static boolean extraValidation = false; // TODO replace by something serious @NotNull private final SchemaRegistryImpl schemaRegistry; @NotNull private final LexicalProcessorRegistry lexicalProcessorRegistry; From 4474243253ae5ceb9f999981acc369ce42518143 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Fri, 28 Oct 2016 12:16:06 +0200 Subject: [PATCH 73/74] Removed old comment. --- .../com/evolveum/midpoint/prism/PrismSerializer.java | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismSerializer.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismSerializer.java index fc8ef8eff3d..da14b0d70f9 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismSerializer.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismSerializer.java @@ -105,16 +105,6 @@ public interface PrismSerializer { @NotNull T serialize(@NotNull RootXNode xnode) throws SchemaException; - /** - * Serializes an atomic value - i.e. something that fits into a prism property (if such a property would exist). - * - * value Value to be serialized. - * elementName Element name to be used. - * - * BEWARE, currently works only for values that can be processed via PrismBeanConvertor - i.e. not for special - * cases like PolyStringType, ProtectedStringType, etc. - */ - T serialize(JAXBElement value) throws SchemaException; T serializeRealValue(Object value) throws SchemaException; T serializeRealValue(Object value, QName rootName) throws SchemaException; From 80333f3106472b99d45a37dfe32a23928e73f248 Mon Sep 17 00:00:00 2001 From: Matus M Date: Fri, 28 Oct 2016 13:00:08 +0200 Subject: [PATCH 74/74] mod to schema samples (salesforce, scim) --- .../resource-salesforce-scim-connector.xml | 445 ++++++++++-------- .../role-default-salesforce-acount.xml | 4 +- .../Salesforce/role-entitlement-metarole.xml | 4 +- .../scim1/Salesforce/role-group-metarole.xml | 4 +- .../Slack/resource-slack-scim-connector.xml | 66 ++- .../Slack/role-default-slack-account.xml | 4 +- .../scim1/Slack/role-group-metarole.xml | 4 +- 7 files changed, 324 insertions(+), 207 deletions(-) diff --git a/samples/resources/scim1/Salesforce/resource-salesforce-scim-connector.xml b/samples/resources/scim1/Salesforce/resource-salesforce-scim-connector.xml index d81b50b4cfd..14187a44969 100644 --- a/samples/resources/scim1/Salesforce/resource-salesforce-scim-connector.xml +++ b/samples/resources/scim1/Salesforce/resource-salesforce-scim-connector.xml @@ -4,11 +4,11 @@ xmlns:t="http://prism.evolveum.com/xml/ns/public/types-3" xmlns:icfs="http://midpoint.evolveum.com/xml/ns/public/connector/icf-1/resource-schema-3" xmlns:ri="http://midpoint.evolveum.com/xml/ns/public/resource/instance-3" - oid="2273edee-da5b-42ca-98e3-5563a7e5323a" - version="27"> + oid="714a197f-fa15-4eac-8f90-f1f2dfdcafc4" + version="15"> salesforce-scim-connector - 2016-10-27T10:14:47.254+02:00 + 2016-10-28T11:26:06.358+02:00 @@ -17,19 +17,22 @@ up - + + false + false true + false - - + + - 2016-10-27T10:15:05.763+02:00 - f2f1473497ffd1ac-11ce64a842ac5c8f + 2016-10-28T11:26:23.316+02:00 + 45a919c9bc0dea31-56642d0eab887904 120 + qn307:stringIgnoreCase displayName @@ -65,6 +69,7 @@ 130 + qn234:stringIgnoreCase members.external.value @@ -92,6 +97,7 @@ 160 + qn294:stringIgnoreCase members.User.value @@ -100,6 +106,7 @@ 170 + qn64:stringIgnoreCase members.uri.value @@ -111,6 +118,7 @@ 180 + qn373:stringIgnoreCase members.Group.value @@ -129,6 +137,7 @@ 190 read + qn451:stringIgnoreCase id @@ -137,6 +146,7 @@ 200 + qn318:stringIgnoreCase meta.version @@ -145,6 +155,7 @@ 210 + qn393:stringIgnoreCase meta.attributes @@ -160,101 +171,6 @@ - - - - - icfs:uid - icfs:name - icfs:name - icfs:name - Entitlements - - - - - - - 120 - displayName - - - - - - - 130 - meta.created - - - - - - - 140 - meta.lastModified - - - - - - - 150 - read - members.default.display - - - - - - - ConnId Name - 110 - __NAME__ - - - - - - - 160 - read - id - - - - - - - 170 - meta.version - - - - - - - 180 - members.default.value - - - - - - - ConnId UID - 100 - read - - - - - @@ -273,6 +189,7 @@ 120 + qn584:stringIgnoreCase phoneNumbers.work.value @@ -289,33 +206,36 @@ 140 + qn940:stringIgnoreCase phoneNumbers.work.display - + 150 - read - urn-salesforce-schemas-extension-external-1.0.accountId + qn627:stringIgnoreCase + phoneNumbers.fax.value - + 160 - phoneNumbers.fax.value + qn7:stringIgnoreCase + addresses.thumbnail.country - + 170 - addresses.thumbnail.country + urn-scim-schemas-extension-enterprise-1.0.delegatedApprover @@ -323,33 +243,37 @@ 180 + qn4:stringIgnoreCase phoneNumbers.mobile.value - + 190 - urn-scim-schemas-extension-enterprise-1.0.division + qn508:stringIgnoreCase + meta.version - + 200 - meta.version + qn237:stringIgnoreCase + name.givenName - + 210 - name.givenName + qn384:stringIgnoreCase + urn-scim-schemas-extension-enterprise-1.0.employeeNumber @@ -357,42 +281,46 @@ 220 + qn892:stringIgnoreCase profileUrl - + 230 - urn-scim-schemas-extension-enterprise-1.0.department + phoneNumbers.mobile.primary - + 240 - phoneNumbers.mobile.primary + qn502:stringIgnoreCase + userName - + 250 - userName + read + qn471:stringIgnoreCase + id - + 260 read - id + qn731:stringIgnoreCase + urn-scim-schemas-extension-enterprise-1.0.organization @@ -400,6 +328,7 @@ 270 + qn91:stringIgnoreCase timezone @@ -416,6 +345,7 @@ 290 + qn429:stringIgnoreCase addresses.work.streetAddress @@ -424,6 +354,7 @@ 300 + qn726:stringIgnoreCase emails.work.value @@ -432,6 +363,7 @@ 310 + qn728:stringIgnoreCase displayName @@ -440,17 +372,18 @@ 320 + qn890:stringIgnoreCase name.middleName 330 - urn-scim-schemas-extension-enterprise-1.0.manager + urn-salesforce-schemas-extension-00D58000000YfgfEAC @@ -458,24 +391,15 @@ 340 + qn943:stringIgnoreCase photos.thumbnail.value - - - - 350 - urn-scim-schemas-extension-enterprise-1.0.employeeNumber - - - - 360 + 350 photos.photo.primary @@ -483,7 +407,8 @@ - 370 + 360 + qn678:stringIgnoreCase roles.value @@ -491,7 +416,8 @@ - 380 + 370 + qn190:stringIgnoreCase name.familyName @@ -499,7 +425,8 @@ - 390 + 380 + qn238:stringIgnoreCase addresses.work.region @@ -507,7 +434,8 @@ - 400 + 390 + qn404:stringIgnoreCase addresses.thumbnail.locality @@ -515,7 +443,8 @@ - 410 + 400 + qn71:stringIgnoreCase nickName @@ -525,7 +454,8 @@ type="xsd:string"> - 420 + 410 + qn741:stringIgnoreCase addresses.thumbnail.streetAddress @@ -533,7 +463,8 @@ - 430 + 420 + qn94:stringIgnoreCase photos.photo.value @@ -541,17 +472,29 @@ - 440 + 430 + qn74:stringIgnoreCase groups.default.display + + + + 440 + urn-scim-schemas-extension-enterprise-1.0.manager + + + 450 + qn766:stringIgnoreCase addresses.thumbnail.formatted @@ -560,17 +503,19 @@ 460 + qn137:stringIgnoreCase preferredLanguage - 470 - urn-salesforce-schemas-extension-00D58000000YfgfEAC + read + qn498:stringIgnoreCase + urn-salesforce-schemas-extension-external-1.0.accountId @@ -578,6 +523,7 @@ 480 + qn927:stringIgnoreCase addresses.work.locality @@ -594,6 +540,7 @@ 500 + qn345:stringIgnoreCase roles.display @@ -610,6 +557,7 @@ 520 + qn983:stringIgnoreCase addresses.work.value @@ -618,6 +566,7 @@ 530 + qn222:stringIgnoreCase addresses.thumbnail.region @@ -626,6 +575,7 @@ 540 + qn65:stringIgnoreCase photos.photo.display @@ -650,6 +600,7 @@ 570 + qn155:stringIgnoreCase name.honorificSuffix @@ -658,6 +609,7 @@ 580 + qn231:stringIgnoreCase name.formatted @@ -676,6 +628,7 @@ 600 + qn126:stringIgnoreCase addresses.work.country @@ -684,6 +637,7 @@ 610 + qn189:stringIgnoreCase addresses.work.formatted @@ -692,6 +646,7 @@ 620 + qn637:stringIgnoreCase userType @@ -702,6 +657,7 @@ 630 + qn846:stringIgnoreCase addresses.thumbnail.postalCode @@ -723,52 +679,68 @@ - + 650 - entitlements.default.value + qn197:stringIgnoreCase + urn-salesforce-schemas-extension-external-1.0.contactId - + 660 - entitlements.default.display + qn482:stringIgnoreCase + urn-scim-schemas-extension-enterprise-1.0.division - + 670 - meta.lastModified + qn341:stringIgnoreCase + entitlements.default.value - + 680 - groups.default.value + qn815:stringIgnoreCase + entitlements.default.display - + 690 - read - urn-scim-schemas-extension-enterprise-1.0.organization + meta.lastModified - + 700 + qn798:stringIgnoreCase + groups.default.value + + + + + + + 710 + qn521:stringIgnoreCase addresses.thumbnail.value @@ -776,7 +748,8 @@ - 710 + 720 + qn696:stringIgnoreCase addresses.thumbnail.display @@ -784,7 +757,8 @@ - 720 + 730 + qn870:stringIgnoreCase addresses.work.display @@ -792,44 +766,38 @@ - 730 + 740 + qn907:stringIgnoreCase photos.thumbnail.display - 740 - urn-scim-schemas-extension-enterprise-1.0.delegatedApprover + 750 + qn756:stringIgnoreCase + urn-scim-schemas-extension-enterprise-1.0.department - 750 + 760 + qn771:stringIgnoreCase name.honorificPrefix - - - 760 - phoneNumbers.mobile.display - - - - 770 - urn-salesforce-schemas-extension-external-1.0.contactId + qn177:stringIgnoreCase + phoneNumbers.mobile.display @@ -837,6 +805,7 @@ 780 + qn699:stringIgnoreCase locale @@ -845,6 +814,7 @@ 790 + qn8:stringIgnoreCase phoneNumbers.fax.display @@ -853,6 +823,7 @@ 800 + qn191:stringIgnoreCase emails.work.display @@ -861,6 +832,7 @@ 810 + qn83:stringIgnoreCase addresses.work.postalCode @@ -877,6 +849,7 @@ 830 + qn429:stringIgnoreCase title @@ -892,6 +865,106 @@ + + + + + icfs:uid + icfs:name + icfs:name + icfs:name + Entitlements + + + + + + + 120 + qn416:stringIgnoreCase + displayName + + + + + + + 130 + meta.created + + + + + + + 140 + meta.lastModified + + + + + + + 150 + read + qn91:stringIgnoreCase + members.default.display + + + + + + + ConnId Name + 110 + __NAME__ + + + + + + + 160 + read + qn637:stringIgnoreCase + id + + + + + + + 170 + qn67:stringIgnoreCase + meta.version + + + + + + + 180 + qn551:stringIgnoreCase + members.default.value + + + + + + + ConnId UID + 100 + read + + + + + @@ -1239,8 +1312,8 @@ - 2016-10-27T10:15:11.888+02:00 - c19e0b3db5a3a89c-540f47a4e9ab9292 + 2016-10-28T11:26:31.256+02:00 + c830295a6053d6d3-6f8991bc5758331c diff --git a/samples/resources/scim1/Salesforce/role-default-salesforce-acount.xml b/samples/resources/scim1/Salesforce/role-default-salesforce-acount.xml index eabc2846df2..d1eeab41f7a 100644 --- a/samples/resources/scim1/Salesforce/role-default-salesforce-acount.xml +++ b/samples/resources/scim1/Salesforce/role-default-salesforce-acount.xml @@ -5,7 +5,7 @@ xmlns:icfs="http://midpoint.evolveum.com/xml/ns/public/connector/icf-1/resource-schema-3" xmlns:ri="http://midpoint.evolveum.com/xml/ns/public/resource/instance-3" oid="056f714a-efac-476f-b38e-9588b4907e5b" - version="6"> + version="7"> Default salesforce account 2016-07-01T14:32:58.978+02:00 @@ -17,7 +17,7 @@ account diff --git a/samples/resources/scim1/Salesforce/role-entitlement-metarole.xml b/samples/resources/scim1/Salesforce/role-entitlement-metarole.xml index f307075b51f..661aba02a6b 100644 --- a/samples/resources/scim1/Salesforce/role-entitlement-metarole.xml +++ b/samples/resources/scim1/Salesforce/role-entitlement-metarole.xml @@ -5,7 +5,7 @@ xmlns:icfs="http://midpoint.evolveum.com/xml/ns/public/connector/icf-1/resource-schema-3" xmlns:ri="http://midpoint.evolveum.com/xml/ns/public/resource/instance-3" oid="bf4e629b-de8c-4af2-b58d-99e18e270ebb" - version="10"> + version="11"> entitlement metarole 2016-07-19T17:47:56.771+02:00 @@ -17,7 +17,7 @@ account default diff --git a/samples/resources/scim1/Salesforce/role-group-metarole.xml b/samples/resources/scim1/Salesforce/role-group-metarole.xml index ec194a7bb18..b368002e1b7 100644 --- a/samples/resources/scim1/Salesforce/role-group-metarole.xml +++ b/samples/resources/scim1/Salesforce/role-group-metarole.xml @@ -5,7 +5,7 @@ xmlns:icfs="http://midpoint.evolveum.com/xml/ns/public/connector/icf-1/resource-schema-3" xmlns:ri="http://midpoint.evolveum.com/xml/ns/public/resource/instance-3" oid="a5bcd1cc-eb8a-469e-8ff2-3f5c6f97c463" - version="11"> + version="12"> group metarole 2016-07-14T13:31:38.481+02:00 @@ -17,7 +17,7 @@ account default diff --git a/samples/resources/scim1/Slack/resource-slack-scim-connector.xml b/samples/resources/scim1/Slack/resource-slack-scim-connector.xml index 5c04ab23997..8aa6b37bab3 100644 --- a/samples/resources/scim1/Slack/resource-slack-scim-connector.xml +++ b/samples/resources/scim1/Slack/resource-slack-scim-connector.xml @@ -4,11 +4,11 @@ xmlns:t="http://prism.evolveum.com/xml/ns/public/types-3" xmlns:icfs="http://midpoint.evolveum.com/xml/ns/public/connector/icf-1/resource-schema-3" xmlns:ri="http://midpoint.evolveum.com/xml/ns/public/resource/instance-3" - oid="5d2b9b68-3bba-43b0-8089-b608f77f1c38" - version="7"> + oid="2556e12c-d5ef-42bb-8079-abea9526face" + version="10"> slack-scim-connector - 2016-10-27T11:49:26.257+02:00 + 2016-10-28T11:47:54.906+02:00 @@ -17,19 +17,38 @@ up - + + false + false true + false - - + + token + + + + http://www.w3.org/2001/04/xmlenc#aes128-cbc + + + 2Z/SQYgWVapuNTIU3bGrwHCi+04= + + + Iw7VIKi4OgNT9L3Q4cYXCPiXDthkU6cVoup+Hfn7uVfpZWca03uVCzxQreBxhKGYVeQ8Xt6igYMaec2SXtW/AsuCpdrxPQXHz7rDesRUu/uIEKkNhKHXdDVeLRGApArb + + + + /scim + /v1 + https://api.slack.com - 2016-10-27T11:49:35.169+02:00 - 32e50b9c813c3f68-9f17646c139b4704 + 2016-10-28T11:48:01.320+02:00 + 4a4506c1ebb47858-91158b52c815628e 120 read + qn443:stringIgnoreCase emails.other.display @@ -68,6 +88,7 @@ 130 + qn691:stringIgnoreCase emails.other.value @@ -88,6 +109,7 @@ 150 + qn723:stringIgnoreCase name.honorificSuffix @@ -96,6 +118,7 @@ 160 + qn770:stringIgnoreCase name.formatted @@ -112,6 +135,7 @@ 180 + qn14:stringIgnoreCase name.givenName @@ -120,6 +144,7 @@ 190 + qn153:stringIgnoreCase profileUrl @@ -128,6 +153,7 @@ 200 + qn719:stringIgnoreCase userName @@ -146,6 +172,7 @@ 210 read + qn560:stringIgnoreCase id @@ -154,6 +181,7 @@ 220 + qn350:stringIgnoreCase timezone @@ -163,6 +191,7 @@ 230 read + qn496:stringIgnoreCase emails.home.display @@ -179,6 +208,7 @@ 250 + qn492:stringIgnoreCase emails.work.value @@ -187,6 +217,7 @@ 260 + qn934:stringIgnoreCase displayName @@ -195,6 +226,7 @@ 270 + qn937:stringIgnoreCase emails.home.value @@ -203,6 +235,7 @@ 280 + qn418:stringIgnoreCase name.middleName @@ -212,6 +245,7 @@ 290 read + qn447:stringIgnoreCase groups.default.value @@ -236,6 +270,7 @@ 320 + qn587:stringIgnoreCase name.familyName @@ -244,6 +279,7 @@ 330 + qn476:stringIgnoreCase name.honorificPrefix @@ -252,6 +288,7 @@ 340 + qn461:stringIgnoreCase nickName @@ -264,6 +301,7 @@ 350 read + qn555:stringIgnoreCase groups.default.display @@ -273,6 +311,7 @@ 360 read + qn413:stringIgnoreCase emails.work.display @@ -281,6 +320,7 @@ 370 + qn926:stringIgnoreCase title @@ -329,6 +369,7 @@ 120 read + qn663:stringIgnoreCase displayName @@ -341,6 +382,7 @@ 130 read + qn104:stringIgnoreCase members.default.display @@ -359,6 +401,7 @@ 140 read + qn559:stringIgnoreCase id @@ -370,6 +413,7 @@ 150 read + qn306:stringIgnoreCase members.default.value @@ -629,8 +673,8 @@ - 2016-10-27T11:49:39.201+02:00 - eaef7e342ed70d48-5662263e87651497 + 2016-10-28T11:48:03.890+02:00 + 453b9048fccbcf02-a9092447aec1ddb @@ -647,12 +691,12 @@ + connector - diff --git a/samples/resources/scim1/Slack/role-default-slack-account.xml b/samples/resources/scim1/Slack/role-default-slack-account.xml index eaa104e0852..c508e379076 100644 --- a/samples/resources/scim1/Slack/role-default-slack-account.xml +++ b/samples/resources/scim1/Slack/role-default-slack-account.xml @@ -5,7 +5,7 @@ xmlns:icfs="http://midpoint.evolveum.com/xml/ns/public/connector/icf-1/resource-schema-3" xmlns:ri="http://midpoint.evolveum.com/xml/ns/public/resource/instance-3" oid="5ae47cad-f67d-4b34-a97b-03315666db68" - version="5"> + version="6"> Default slack account 2016-09-05T13:20:30.302+02:00 @@ -17,7 +17,7 @@ account diff --git a/samples/resources/scim1/Slack/role-group-metarole.xml b/samples/resources/scim1/Slack/role-group-metarole.xml index b0ae7cfc89d..c42be2a3836 100644 --- a/samples/resources/scim1/Slack/role-group-metarole.xml +++ b/samples/resources/scim1/Slack/role-group-metarole.xml @@ -5,7 +5,7 @@ xmlns:icfs="http://midpoint.evolveum.com/xml/ns/public/connector/icf-1/resource-schema-3" xmlns:ri="http://midpoint.evolveum.com/xml/ns/public/resource/instance-3" oid="1a641f93-0e91-4e23-9dc7-21523c7688ba" - version="12"> + version="13"> group metarole slack 2016-08-12T13:59:22.396+02:00 @@ -17,7 +17,7 @@ account default