/* * 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.repo.sql; import static org.testng.AssertJUnit.assertNotNull; import static org.testng.AssertJUnit.assertNull; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.PrismObjectDefinition; import com.evolveum.midpoint.prism.PrismPropertyDefinition; import com.evolveum.midpoint.prism.delta.PropertyDelta; 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; import com.evolveum.midpoint.repo.api.RepoAddOptions; import com.evolveum.midpoint.schema.MidPointPrismContextFactory; import com.evolveum.midpoint.schema.constants.MidPointConstants; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.test.util.MidPointAsserts; import com.evolveum.midpoint.util.PrettyPrinter; import com.evolveum.midpoint.util.exception.ObjectNotFoundException; 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.CapabilitiesType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; 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.SystemConfigurationType; import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.ContextConfiguration; import org.testng.AssertJUnit; import org.testng.annotations.BeforeSuite; import org.testng.annotations.Test; import org.xml.sax.SAXException; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.List; /** * @author lazyman */ @ContextConfiguration(locations = {"../../../../../ctx-test.xml"}) @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS) public class AddOverwriteTest extends BaseSQLRepoTest { private static final Trace LOGGER = TraceManager.getTrace(AddOverwriteTest.class); private static final String ORG_STRUCT_OBJECTS = "src/test/resources/orgstruct/org-monkey-island.xml"; private static final String IMPORT_OVERWRITE = "src/test/resources/basic/import-overwrite.xml"; private static final File RESOURCE_OPENDJ_FILE = new File("src/test/resources/basic/resource-opendj.xml"); private static final String RESOURCE_OPENDJ_OID = "10000000-0000-0000-0000-000000000003"; private static final String ORG_OID = "00000000-8888-6666-0000-100000000001"; @BeforeSuite public void setup() throws SchemaException, SAXException, IOException { PrettyPrinter.setDefaultNamespacePrefix(MidPointConstants.NS_MIDPOINT_PUBLIC_PREFIX); PrismTestUtil.resetPrismContext(MidPointPrismContextFactory.FACTORY); } @Test public void addWithOverwrite() throws Exception { List<PrismObject<?>> objects = prismContext.parserFor(new File(ORG_STRUCT_OBJECTS)).parseObjects(); OperationResult opResult = new OperationResult("Import file"); for (PrismObject o : objects) { repositoryService.addObject(o, null, opResult); } opResult.recordSuccess(); opResult.recomputeStatus(); AssertJUnit.assertTrue(opResult.isSuccess()); //get carla, check oid and version PrismObject carla = getCarla(opResult); final String oid = carla.getOid(); PrismAsserts.assertPropertyValue(carla, ObjectType.F_NAME, PrismTestUtil.createPolyString("carla")); PrismAsserts.assertPropertyValue(carla, UserType.F_GIVEN_NAME, PrismTestUtil.createPolyString("Carla")); AssertJUnit.assertEquals("0", carla.getVersion()); AssertJUnit.assertNotNull(oid); //reimport carla, oid should stay the same, version must be incremented objects = prismContext.parserFor(new File(IMPORT_OVERWRITE)).parseObjects(); PrismObject newCarla = objects.get(0); newCarla.setOid(oid); String newOid = repositoryService.addObject(newCarla, RepoAddOptions.createOverwrite(), opResult); AssertJUnit.assertEquals(oid, newOid); carla = getCarla(opResult); PrismAsserts.assertPropertyValue(carla, ObjectType.F_NAME, PrismTestUtil.createPolyString("carla")); PrismAsserts.assertPropertyValue(carla, UserType.F_GIVEN_NAME, PrismTestUtil.createPolyString("Carla imported")); AssertJUnit.assertEquals("1", carla.getVersion()); AssertJUnit.assertEquals(oid, carla.getOid()); } private PrismObject getCarla(OperationResult opResult) throws Exception { final String CARLA_NAME = "carla"; PrismObjectDefinition userObjectDef = prismContext.getSchemaRegistry().findObjectDefinitionByCompileTimeClass(UserType.class); ObjectQuery query = QueryBuilder.queryFor(UserType.class, prismContext) .item(UserType.F_NAME).eq(CARLA_NAME) .build(); List<PrismObject<UserType>> users = repositoryService.searchObjects(UserType.class, query, null, opResult); AssertJUnit.assertEquals(1, users.size()); return users.get(0); } @Test(expectedExceptions = ObjectNotFoundException.class) public void test090GetVersionNonExisting() throws Exception { OperationResult result = new OperationResult("get version"); try { repositoryService.getVersion(SystemConfigurationType.class, "989", result); AssertJUnit.fail(); } finally { result.recomputeStatus(); AssertJUnit.assertTrue(!result.isUnknown()); } } @Test public void test091GetVersion() throws Exception { OperationResult result = new OperationResult("get version"); String version = repositoryService.getVersion(OrgType.class, ORG_OID, result); AssertJUnit.assertEquals("0", version); PrismObjectDefinition def = prismContext.getSchemaRegistry().findObjectDefinitionByCompileTimeClass(OrgType.class); Collection deltas = new ArrayList(); deltas.add(PropertyDelta.createAddDelta(def, OrgType.F_ORG_TYPE, "asdf")); repositoryService.modifyObject(OrgType.class, ORG_OID, deltas, result); version = repositoryService.getVersion(OrgType.class, ORG_OID, result); AssertJUnit.assertEquals("1", version); result.recomputeStatus(); AssertJUnit.assertTrue(result.isSuccess()); } @Test public void addWithOverwriteResource() throws Exception { // GIVEN SchemaRegistry reg= prismContext.getSchemaRegistry(); PrismPropertyDefinition def = reg.findPropertyDefinitionByElementName(CapabilitiesType.F_NATIVE); PrismObject<ResourceType> resource = prismContext.parseObject(RESOURCE_OPENDJ_FILE); OperationResult opResult = new OperationResult("Import resource"); repositoryService.addObject(resource, null, opResult); opResult.computeStatus(); AssertJUnit.assertTrue(opResult.isSuccess()); PrismObject<ResourceType> resourceAfterAdd = repositoryService.getObject(ResourceType.class, RESOURCE_OPENDJ_OID, null, opResult); MidPointAsserts.assertOid(resourceAfterAdd, RESOURCE_OPENDJ_OID); MidPointAsserts.assertVersion(resourceAfterAdd, 0); // Precondition assertNotNull("no schema", resourceAfterAdd.asObjectable().getSchema()); assertNotNull("no capabilities", resourceAfterAdd.asObjectable().getCapabilities()); resource.asObjectable().setSchema(null); resource.asObjectable().setCapabilities(null); // WHEN repositoryService.addObject(resource, RepoAddOptions.createOverwrite(), opResult); // THEN opResult.computeStatus(); AssertJUnit.assertTrue(opResult.isSuccess()); PrismObject<ResourceType> resourceAfterOverwrite = repositoryService.getObject(ResourceType.class, RESOURCE_OPENDJ_OID, null, opResult); MidPointAsserts.assertOid(resourceAfterOverwrite, RESOURCE_OPENDJ_OID); MidPointAsserts.assertVersion(resourceAfterOverwrite, 1); assertNull("schema not gone", resourceAfterOverwrite.asObjectable().getSchema()); assertNull("capabilities not gone", resourceAfterOverwrite.asObjectable().getCapabilities()); } }