/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with this * work for additional information regarding copyright ownership. The ASF * licenses this file to You under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package org.apache.sling.launchpad.testservices.serversidetests; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import java.util.HashMap; import org.apache.sling.api.resource.ModifiableValueMap; import org.apache.sling.api.resource.Resource; import org.apache.sling.api.resource.ResourceResolver; import org.apache.sling.api.resource.ResourceResolverFactory; import org.apache.sling.api.resource.ValueMap; import org.apache.sling.junit.annotations.SlingAnnotationsTestRunner; import org.apache.sling.junit.annotations.TestReference; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; /** Test (and demonstrate) the Sling Resource CRUD functionality */ @RunWith(SlingAnnotationsTestRunner.class) public class WriteableResourcesTest { @TestReference private ResourceResolverFactory resourceResolverFactory; private ResourceResolver resolver; private Resource testRoot; @SuppressWarnings("serial") private static class Props extends HashMap<String, Object> { Props(String ... keyValue) { for(int i=0 ; i< keyValue.length; i+=2) { put(keyValue[i], keyValue[i+1]); } } } @Before public void setup() throws Exception { resolver = resourceResolverFactory.getAdministrativeResourceResolver(null); assertNotNull("Expecting non-null ResourceResolver", resolver); final Resource root = resolver.getResource("/"); assertNotNull("Expecting non-null root Resource", root); final String path = getClass().getSimpleName() + "_" + System.currentTimeMillis(); testRoot = resolver.create(root, path, null); } @After public void cleanup() throws Exception { resolver.delete(testRoot); resolver.close(); } private void assertValueMap(ValueMap m, String ... keyValue) { assertNotNull("Expecting non-null ValueMap", m); for(int i=0 ; i< keyValue.length; i+=2) { final String key = keyValue[i]; final String value = keyValue[i+1]; assertEquals("Expecting " + key + "=" + value, value, m.get(key, String.class)); } } @Test public void testSimpleCRUD() throws Exception { // Create a child resource of testRoot, with title and text properties final Props props = new Props("title", "hello", "text", "world"); final String fullPath = resolver.create(testRoot, "child_" + System.currentTimeMillis(), props).getPath(); resolver.commit(); { // Retrieve and check child resource final Resource r = resolver.getResource(fullPath); assertNotNull("Expecting Resource at " + fullPath, r); final ModifiableValueMap m = r.adaptTo(ModifiableValueMap.class); assertValueMap(m, "title", "hello", "text", "world"); // Update child resource m.put("more", "fun"); m.put("title", "changed"); resolver.commit(); } { // Retrieve and check updated resource final Resource r = resolver.getResource(fullPath); assertNotNull("Expecting modified Resource at " + fullPath, r); assertValueMap(r.adaptTo(ValueMap.class), "title", "changed", "more", "fun", "text", "world"); } { // Delete test resource and check that it's gone final Resource r = resolver.getResource(fullPath); assertNotNull("Expecting non-null resource to delete, at " + fullPath, r); resolver.delete(r); resolver.commit(); assertNull("Expecting " + fullPath + " to be deleted", resolver.getResource(fullPath)); } } }