Author: bdelacretaz
Date: Tue May  5 15:38:04 2009
New Revision: 771821

URL: http://svn.apache.org/viewvc?rev=771821&view=rev
Log:
SLING-904 - make ConfigurationAdmin an optional dependency of the osgiworker 
bundle

Added:
    
incubator/sling/trunk/contrib/extensions/jcrinstall/osgiworker/src/main/java/org/apache/sling/jcr/jcrinstall/osgiworker/impl/MissingServiceException.java
   (with props)
    
incubator/sling/trunk/contrib/extensions/jcrinstall/osgiworker/src/main/java/org/apache/sling/jcr/jcrinstall/osgiworker/impl/ServiceProxy.java
   (with props)
    
incubator/sling/trunk/contrib/launchpad/testing/src/test/java/org/apache/sling/launchpad/webapp/integrationtest/jcrinstall/SimpleConfigTest.java
   (with props)
Modified:
    
incubator/sling/trunk/contrib/extensions/jcrinstall/osgiworker/src/main/java/org/apache/sling/jcr/jcrinstall/osgiworker/impl/ConfigResourceProcessor.java
    
incubator/sling/trunk/contrib/extensions/jcrinstall/osgiworker/src/main/java/org/apache/sling/jcr/jcrinstall/osgiworker/impl/OsgiControllerImpl.java
    
incubator/sling/trunk/contrib/extensions/jcrinstall/osgiworker/src/main/java/org/apache/sling/jcr/jcrinstall/osgiworker/impl/OsgiControllerTaskExecutor.java
    
incubator/sling/trunk/contrib/extensions/jcrinstall/osgiworker/src/main/java/org/apache/sling/jcr/jcrinstall/osgiworker/impl/OsgiResourceProcessorList.java
    
incubator/sling/trunk/contrib/extensions/jcrinstall/osgiworker/src/test/java/org/apache/sling/jcr/jcrinstall/osgiworker/impl/ConfigResourceProcessorTest.java
    
incubator/sling/trunk/contrib/launchpad/testing/src/test/java/org/apache/sling/launchpad/webapp/integrationtest/jcrinstall/JcrinstallTestBase.java

Modified: 
incubator/sling/trunk/contrib/extensions/jcrinstall/osgiworker/src/main/java/org/apache/sling/jcr/jcrinstall/osgiworker/impl/ConfigResourceProcessor.java
URL: 
http://svn.apache.org/viewvc/incubator/sling/trunk/contrib/extensions/jcrinstall/osgiworker/src/main/java/org/apache/sling/jcr/jcrinstall/osgiworker/impl/ConfigResourceProcessor.java?rev=771821&r1=771820&r2=771821&view=diff
==============================================================================
--- 
incubator/sling/trunk/contrib/extensions/jcrinstall/osgiworker/src/main/java/org/apache/sling/jcr/jcrinstall/osgiworker/impl/ConfigResourceProcessor.java
 (original)
+++ 
incubator/sling/trunk/contrib/extensions/jcrinstall/osgiworker/src/main/java/org/apache/sling/jcr/jcrinstall/osgiworker/impl/ConfigResourceProcessor.java
 Tue May  5 15:38:04 2009
@@ -41,12 +41,12 @@
     private static final String ALIAS_KEY = "_alias_factory_pid";
     public static final String CONFIG_PATH_KEY = "_jcr_config_path";
     public static final String CONFIG_EXTENSION = ".cfg";
-    private final ConfigurationAdmin configurationAdmin;
     private final Logger log = LoggerFactory.getLogger(this.getClass());
     private final DictionaryReader reader = new DictionaryReader();
+    private final ServiceProxy serviceProxy;
     
-    ConfigResourceProcessor(ConfigurationAdmin ca) {
-        configurationAdmin = ca;
+    ConfigResourceProcessor(ServiceProxy sp) {
+        serviceProxy = sp;
     }
     
     public void dispose() {
@@ -125,7 +125,14 @@
     }
 
     /** Get or create configuration */
-    Configuration getConfiguration(ConfigurationPid cp, boolean 
createIfNeeded) throws IOException, InvalidSyntaxException {
+    Configuration getConfiguration(ConfigurationPid cp, boolean 
createIfNeeded) 
+    throws IOException, InvalidSyntaxException, MissingServiceException 
+    {
+       final ConfigurationAdmin configurationAdmin = 
serviceProxy.getConfigurationAdmin();
+       if(configurationAdmin == null) {
+               throw new MissingServiceException(ConfigurationAdmin.class);
+       }
+       
         Configuration result = null;
         
         if (cp.getFactoryPid() == null) {

Added: 
incubator/sling/trunk/contrib/extensions/jcrinstall/osgiworker/src/main/java/org/apache/sling/jcr/jcrinstall/osgiworker/impl/MissingServiceException.java
URL: 
http://svn.apache.org/viewvc/incubator/sling/trunk/contrib/extensions/jcrinstall/osgiworker/src/main/java/org/apache/sling/jcr/jcrinstall/osgiworker/impl/MissingServiceException.java?rev=771821&view=auto
==============================================================================
--- 
incubator/sling/trunk/contrib/extensions/jcrinstall/osgiworker/src/main/java/org/apache/sling/jcr/jcrinstall/osgiworker/impl/MissingServiceException.java
 (added)
+++ 
incubator/sling/trunk/contrib/extensions/jcrinstall/osgiworker/src/main/java/org/apache/sling/jcr/jcrinstall/osgiworker/impl/MissingServiceException.java
 Tue May  5 15:38:04 2009
@@ -0,0 +1,29 @@
+/*
+ * 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.jcr.jcrinstall.osgiworker.impl;
+
+/** Thrown when a required service is missing to execute a task,
+ *     in which case the task can be retried later
+ */
+...@suppresswarnings("serial")
+class MissingServiceException extends Exception {
+       MissingServiceException(Class<?> serviceClass) {
+               super(serviceClass.getName());
+       }
+}

Propchange: 
incubator/sling/trunk/contrib/extensions/jcrinstall/osgiworker/src/main/java/org/apache/sling/jcr/jcrinstall/osgiworker/impl/MissingServiceException.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
incubator/sling/trunk/contrib/extensions/jcrinstall/osgiworker/src/main/java/org/apache/sling/jcr/jcrinstall/osgiworker/impl/MissingServiceException.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision Rev URL

Modified: 
incubator/sling/trunk/contrib/extensions/jcrinstall/osgiworker/src/main/java/org/apache/sling/jcr/jcrinstall/osgiworker/impl/OsgiControllerImpl.java
URL: 
http://svn.apache.org/viewvc/incubator/sling/trunk/contrib/extensions/jcrinstall/osgiworker/src/main/java/org/apache/sling/jcr/jcrinstall/osgiworker/impl/OsgiControllerImpl.java?rev=771821&r1=771820&r2=771821&view=diff
==============================================================================
--- 
incubator/sling/trunk/contrib/extensions/jcrinstall/osgiworker/src/main/java/org/apache/sling/jcr/jcrinstall/osgiworker/impl/OsgiControllerImpl.java
 (original)
+++ 
incubator/sling/trunk/contrib/extensions/jcrinstall/osgiworker/src/main/java/org/apache/sling/jcr/jcrinstall/osgiworker/impl/OsgiControllerImpl.java
 Tue May  5 15:38:04 2009
@@ -35,10 +35,9 @@
 import org.osgi.framework.SynchronousBundleListener;
 import org.osgi.service.cm.ConfigurationAdmin;
 import org.osgi.service.component.ComponentContext;
+import org.osgi.service.log.LogService;
 import org.osgi.service.packageadmin.PackageAdmin;
 import org.osgi.service.startlevel.StartLevel;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 /** OsgiController service
  *
@@ -53,12 +52,11 @@
  *      name="service.vendor"
  *      value="The Apache Software Foundation"
 */
-public class OsgiControllerImpl implements OsgiController, 
SynchronousBundleListener {
+public class OsgiControllerImpl implements OsgiController, 
SynchronousBundleListener, ServiceProxy {
 
        private BundleContext bundleContext;
     private Storage storage;
     private OsgiResourceProcessorList processors;
-    private final Logger log = LoggerFactory.getLogger(this.getClass());
     private ResourceOverrideRules roRules;
     private final List<Callable<Object>> tasks = new 
LinkedList<Callable<Object>>();
     private final OsgiControllerTaskExecutor executor = new 
OsgiControllerTaskExecutor();
@@ -68,7 +66,7 @@
     /** Storage key: digest of an InstallableData */
     public static final String KEY_DIGEST = "data.digest";
 
-    /** @scr.reference */
+    /** @scr.reference cardinality="0..1" policy="dynamic" */
     private ConfigurationAdmin configAdmin;
 
     /** @scr.reference */
@@ -77,22 +75,33 @@
     /** @scr.reference */
     protected StartLevel startLevel;
     
+    /** @scr.reference */
+    protected LogService logService;
+    
     /** Default value for getLastModified() */
     public static final long LAST_MODIFIED_NOT_FOUND = -1;
 
     protected void activate(ComponentContext context) throws IOException {
        bundleContext = context.getBundleContext();
-        processors = new OsgiResourceProcessorList(context.getBundleContext(), 
packageAdmin, startLevel, configAdmin);
+        processors = new OsgiResourceProcessorList(context.getBundleContext(), 
packageAdmin, startLevel, this);
         storage = new 
Storage(context.getBundleContext().getDataFile(STORAGE_FILENAME));
     }
 
     protected void deactivate(ComponentContext oldContext) {
+       if(logService != null) {
+               logService.log(LogService.LOG_WARNING, 
+                               OsgiController.class.getName() 
+                               + " service deactivated - this warning can be 
ignored if system is shutting down");
+       }
+       
        bundleContext = null;
         if(storage != null) {
             try {
                 storage.saveToFile();
             } catch(IOException ioe) {
-                log.warn("IOException in Storage.saveToFile()", ioe);
+               if(logService != null) {
+                       logService.log(LogService.LOG_WARNING, "IOException in 
Storage.saveToFile()", ioe);
+               }
             }
         }
         
@@ -149,7 +158,9 @@
        
        // Ready to work?
         if(processors == null) {
-            log.info("Not activated yet, cannot executeScheduledOperations");
+               if(logService != null) {
+                logService.log(LogService.LOG_INFO, "Not activated yet, cannot 
executeScheduledOperations");
+               }
             return;
         }
         
@@ -166,14 +177,27 @@
             }
             
             // Now execute all our tasks in a separate thread
-            log.debug("Executing {} queued tasks", tasks.size());
+               if(logService != null) {
+                logService.log(LogService.LOG_DEBUG, "Executing " + 
tasks.size() + " queued tasks");
+               }
             final long start = System.currentTimeMillis();
-            executor.execute(tasks);
-            log.debug("Done executing queued tasks ({} msec)", 
System.currentTimeMillis() - start);
+            
+            // execute returns the list of tasks that could not be executed 
but should be retried later
+            // and those have been removed from the tasks list
+            tasks.addAll(executor.execute(tasks));
+            
+               if(logService != null) {
+                logService.log(LogService.LOG_DEBUG, 
+                               "Done executing queued tasks (" + 
(System.currentTimeMillis() - start) + " msec)");
+               }
                }
        }
 
        public void setResourceOverrideRules(ResourceOverrideRules r) {
         roRules = r;
     }
+
+       public ConfigurationAdmin getConfigurationAdmin() {
+               return configAdmin;
+       }
 }
\ No newline at end of file

Modified: 
incubator/sling/trunk/contrib/extensions/jcrinstall/osgiworker/src/main/java/org/apache/sling/jcr/jcrinstall/osgiworker/impl/OsgiControllerTaskExecutor.java
URL: 
http://svn.apache.org/viewvc/incubator/sling/trunk/contrib/extensions/jcrinstall/osgiworker/src/main/java/org/apache/sling/jcr/jcrinstall/osgiworker/impl/OsgiControllerTaskExecutor.java?rev=771821&r1=771820&r2=771821&view=diff
==============================================================================
--- 
incubator/sling/trunk/contrib/extensions/jcrinstall/osgiworker/src/main/java/org/apache/sling/jcr/jcrinstall/osgiworker/impl/OsgiControllerTaskExecutor.java
 (original)
+++ 
incubator/sling/trunk/contrib/extensions/jcrinstall/osgiworker/src/main/java/org/apache/sling/jcr/jcrinstall/osgiworker/impl/OsgiControllerTaskExecutor.java
 Tue May  5 15:38:04 2009
@@ -18,6 +18,7 @@
  */
 package org.apache.sling.jcr.jcrinstall.osgiworker.impl;
 
+import java.util.LinkedList;
 import java.util.List;
 import java.util.concurrent.Callable;
 
@@ -29,9 +30,10 @@
 class OsgiControllerTaskExecutor {
     private final Logger log = LoggerFactory.getLogger(this.getClass());
     static int counter;
-
+    
        /** Execute the given tasks in a new thread, return when done */
-       void execute(final List<Callable<Object>> tasks) throws 
InterruptedException {
+    List<Callable<Object>> execute(final List<Callable<Object>> tasks) throws 
InterruptedException {
+       final List<Callable<Object>> remainingTasks = new 
LinkedList<Callable<Object>>();
                final String threadName = getClass().getSimpleName() + " #" + 
(++counter);
                final Thread t = new Thread(threadName) {
                        @Override
@@ -41,6 +43,9 @@
                                        try {
                                                c.call();
                                                log.debug("Task execution 
successful: " + c);
+                                       } catch(MissingServiceException mse) {
+                                               log.info("Task execution 
deferred due to " + mse + ", task=" + c);
+                                               remainingTasks.add(c);
                                        } catch(Exception e) {
                                                log.warn("Task execution 
failed: " + c, e);
                                        }
@@ -50,5 +55,6 @@
                t.setDaemon(true);
                t.start();
                t.join();
+               return remainingTasks;
        }
 }

Modified: 
incubator/sling/trunk/contrib/extensions/jcrinstall/osgiworker/src/main/java/org/apache/sling/jcr/jcrinstall/osgiworker/impl/OsgiResourceProcessorList.java
URL: 
http://svn.apache.org/viewvc/incubator/sling/trunk/contrib/extensions/jcrinstall/osgiworker/src/main/java/org/apache/sling/jcr/jcrinstall/osgiworker/impl/OsgiResourceProcessorList.java?rev=771821&r1=771820&r2=771821&view=diff
==============================================================================
--- 
incubator/sling/trunk/contrib/extensions/jcrinstall/osgiworker/src/main/java/org/apache/sling/jcr/jcrinstall/osgiworker/impl/OsgiResourceProcessorList.java
 (original)
+++ 
incubator/sling/trunk/contrib/extensions/jcrinstall/osgiworker/src/main/java/org/apache/sling/jcr/jcrinstall/osgiworker/impl/OsgiResourceProcessorList.java
 Tue May  5 15:38:04 2009
@@ -23,7 +23,6 @@
 import org.apache.sling.jcr.jcrinstall.osgiworker.InstallableData;
 import org.apache.sling.jcr.jcrinstall.osgiworker.OsgiResourceProcessor;
 import org.osgi.framework.BundleContext;
-import org.osgi.service.cm.ConfigurationAdmin;
 import org.osgi.service.packageadmin.PackageAdmin;
 import org.osgi.service.startlevel.StartLevel;
 import org.slf4j.Logger;
@@ -36,9 +35,9 @@
 class OsgiResourceProcessorList extends LinkedList<OsgiResourceProcessor> {
     private final Logger log = LoggerFactory.getLogger(getClass());
     
-       OsgiResourceProcessorList(BundleContext ctx, PackageAdmin pa, 
StartLevel sa, ConfigurationAdmin ca) {
+       OsgiResourceProcessorList(BundleContext ctx, PackageAdmin pa, 
StartLevel sa, ServiceProxy sp) {
         add(new BundleResourceProcessor(ctx, pa, sa));
-        add(new ConfigResourceProcessor(ca));
+        add(new ConfigResourceProcessor(sp));
        }
        
        OsgiResourceProcessor getProcessor(String uri, InstallableData data) {

Added: 
incubator/sling/trunk/contrib/extensions/jcrinstall/osgiworker/src/main/java/org/apache/sling/jcr/jcrinstall/osgiworker/impl/ServiceProxy.java
URL: 
http://svn.apache.org/viewvc/incubator/sling/trunk/contrib/extensions/jcrinstall/osgiworker/src/main/java/org/apache/sling/jcr/jcrinstall/osgiworker/impl/ServiceProxy.java?rev=771821&view=auto
==============================================================================
--- 
incubator/sling/trunk/contrib/extensions/jcrinstall/osgiworker/src/main/java/org/apache/sling/jcr/jcrinstall/osgiworker/impl/ServiceProxy.java
 (added)
+++ 
incubator/sling/trunk/contrib/extensions/jcrinstall/osgiworker/src/main/java/org/apache/sling/jcr/jcrinstall/osgiworker/impl/ServiceProxy.java
 Tue May  5 15:38:04 2009
@@ -0,0 +1,28 @@
+/*
+ * 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.jcr.jcrinstall.osgiworker.impl;
+
+import org.osgi.service.cm.ConfigurationAdmin;
+
+/** Proxy for services that might not be always available, allows
+ *     classes which are not OSGi services to access such services easily
+ */
+interface ServiceProxy {
+       ConfigurationAdmin getConfigurationAdmin();
+}

Propchange: 
incubator/sling/trunk/contrib/extensions/jcrinstall/osgiworker/src/main/java/org/apache/sling/jcr/jcrinstall/osgiworker/impl/ServiceProxy.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
incubator/sling/trunk/contrib/extensions/jcrinstall/osgiworker/src/main/java/org/apache/sling/jcr/jcrinstall/osgiworker/impl/ServiceProxy.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision Rev URL

Modified: 
incubator/sling/trunk/contrib/extensions/jcrinstall/osgiworker/src/test/java/org/apache/sling/jcr/jcrinstall/osgiworker/impl/ConfigResourceProcessorTest.java
URL: 
http://svn.apache.org/viewvc/incubator/sling/trunk/contrib/extensions/jcrinstall/osgiworker/src/test/java/org/apache/sling/jcr/jcrinstall/osgiworker/impl/ConfigResourceProcessorTest.java?rev=771821&r1=771820&r2=771821&view=diff
==============================================================================
--- 
incubator/sling/trunk/contrib/extensions/jcrinstall/osgiworker/src/test/java/org/apache/sling/jcr/jcrinstall/osgiworker/impl/ConfigResourceProcessorTest.java
 (original)
+++ 
incubator/sling/trunk/contrib/extensions/jcrinstall/osgiworker/src/test/java/org/apache/sling/jcr/jcrinstall/osgiworker/impl/ConfigResourceProcessorTest.java
 Tue May  5 15:38:04 2009
@@ -41,7 +41,12 @@
         final String data = "foo = bar";
         final MockInstallableData id = new MockInstallableData(path, data);
         final ConfigurationAdmin ca = mockery.mock(ConfigurationAdmin.class);
-        final ConfigResourceProcessor p = new ConfigResourceProcessor(ca);
+        final ServiceProxy sp = new ServiceProxy() {
+                       public ConfigurationAdmin getConfigurationAdmin() {
+                               return ca;
+                       }
+        };
+        final ConfigResourceProcessor p = new ConfigResourceProcessor(sp);
         final Configuration c = mockery.mock(Configuration.class);
         final String pid = "dummyConfigPid";
         

Modified: 
incubator/sling/trunk/contrib/launchpad/testing/src/test/java/org/apache/sling/launchpad/webapp/integrationtest/jcrinstall/JcrinstallTestBase.java
URL: 
http://svn.apache.org/viewvc/incubator/sling/trunk/contrib/launchpad/testing/src/test/java/org/apache/sling/launchpad/webapp/integrationtest/jcrinstall/JcrinstallTestBase.java?rev=771821&r1=771820&r2=771821&view=diff
==============================================================================
--- 
incubator/sling/trunk/contrib/launchpad/testing/src/test/java/org/apache/sling/launchpad/webapp/integrationtest/jcrinstall/JcrinstallTestBase.java
 (original)
+++ 
incubator/sling/trunk/contrib/launchpad/testing/src/test/java/org/apache/sling/launchpad/webapp/integrationtest/jcrinstall/JcrinstallTestBase.java
 Tue May  5 15:38:04 2009
@@ -42,6 +42,10 @@
        protected int scaleFactor;
        protected int defaultBundlesTimeout;
        
+       static interface StringCondition {
+               boolean eval(String input);
+       }
+       
     private class ShutdownThread extends Thread {
         @Override
         public void run() {
@@ -106,6 +110,23 @@
                        + " after waiting " + delta / 1000.0 + " seconds");
     }
     
+    protected void assertContentWithTimeout(String message, String contentUrl, 
String expectedContentType, 
+               StringCondition condition, int timeoutSeconds) throws 
IOException 
+    {
+       final long start = System.currentTimeMillis();
+       final long timeout = start + timeoutSeconds * 1000L;
+       while(System.currentTimeMillis() < timeout) {
+               final String content = getContent(contentUrl, 
expectedContentType);
+               if(condition.eval(content)) {
+                       return;
+               }
+               sleep(200);
+       }
+       final long delta = System.currentTimeMillis() - start;
+       fail(message + ": StringCondition did not return true" 
+                       + " after waiting " + delta / 1000.0 + " seconds");
+    }
+    
     protected void sleep(long millis) {
        try {
                Thread.sleep(millis);

Added: 
incubator/sling/trunk/contrib/launchpad/testing/src/test/java/org/apache/sling/launchpad/webapp/integrationtest/jcrinstall/SimpleConfigTest.java
URL: 
http://svn.apache.org/viewvc/incubator/sling/trunk/contrib/launchpad/testing/src/test/java/org/apache/sling/launchpad/webapp/integrationtest/jcrinstall/SimpleConfigTest.java?rev=771821&view=auto
==============================================================================
--- 
incubator/sling/trunk/contrib/launchpad/testing/src/test/java/org/apache/sling/launchpad/webapp/integrationtest/jcrinstall/SimpleConfigTest.java
 (added)
+++ 
incubator/sling/trunk/contrib/launchpad/testing/src/test/java/org/apache/sling/launchpad/webapp/integrationtest/jcrinstall/SimpleConfigTest.java
 Tue May  5 15:38:04 2009
@@ -0,0 +1,84 @@
+/*
+ * 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.webapp.integrationtest.jcrinstall;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+/** Simple test of the jcrinstall configuration feature: create 
+ *     sling:OsgiConfig nodes and check that the corresponding configs
+ *  are available at /system/console/config
+ *
+ */
+public class SimpleConfigTest extends JcrinstallTestBase {
+       
+       static class ConfigCondition implements 
JcrinstallTestBase.StringCondition {
+               private final String expectedValue;
+               private final boolean expectValueInContent;
+               
+               ConfigCondition(String expectedValue, boolean 
expectValueInContent) {
+                       this.expectedValue = expectedValue;
+                       this.expectValueInContent = expectValueInContent;
+               }
+               public boolean eval(String input) {
+                       final boolean contains = input.contains(expectedValue);
+                       return expectValueInContent ? contains : !contains;
+               }
+       };
+       
+       public void testSimpleConfig() throws IOException {
+               final String uniqueId = getClass().getName() + 
System.currentTimeMillis(); 
+               final String key = getClass().getName() + ".key";
+               final String value = getClass().getName() + "." + uniqueId;
+               final String keyValue = key + "=" + value;
+               
+               final String configUrl = HTTP_BASE_URL + 
"/system/console/config";
+               final String contentType = CONTENT_TYPE_HTML;
+               final int timeoutSeconds = 4;
+               
+               assertContentWithTimeout("Before test, config must not exist", 
configUrl, 
+                               contentType, new ConfigCondition(keyValue, 
false), timeoutSeconds);
+               
+               // Create an OSGi config using a sling:OsgiConfig node
+               final String configPath = "/apps/" + getClass().getSimpleName() 
+ "/install";
+               testClient.mkdirs(HTTP_BASE_URL, configPath);
+               final Map<String, String> nodeProperties = new HashMap<String, 
String>();
+               nodeProperties.put("jcr:primaryType", "sling:OsgiConfig");
+               nodeProperties.put(key, value);
+               final String toDelete = testClient.createNode(HTTP_BASE_URL + 
configPath + "/" + uniqueId, nodeProperties);
+               assertContentWithTimeout("Config must be present after creating 
config node", configUrl, 
+                               contentType, new ConfigCondition(keyValue, 
true), timeoutSeconds);
+               
+               // Update config node, verify that config is updated
+               final String newValue = getClass().getName() + ".NEW." + 
System.currentTimeMillis();
+               final String newKeyValue = key + "=" + newValue;
+               nodeProperties.put(key, newValue);
+               testClient.createNode(HTTP_BASE_URL + configPath + "/" + 
uniqueId, nodeProperties);
+               assertContentWithTimeout("Config must be modified after node 
update", configUrl, 
+                               contentType, new ConfigCondition(newKeyValue, 
true), timeoutSeconds);
+               assertContentWithTimeout("Old value must be gone after update", 
configUrl, 
+                               contentType, new ConfigCondition(keyValue, 
false), timeoutSeconds);
+               
+               // Delete and verify that the config is gone
+               testClient.delete(toDelete);
+               assertContentWithTimeout("Old config must be gone after 
removing config node", configUrl, 
+                               contentType, new ConfigCondition(keyValue, 
false), timeoutSeconds);
+               assertContentWithTimeout("New config must be gone after 
removing config node", configUrl, 
+                               contentType, new ConfigCondition(newKeyValue, 
false), timeoutSeconds);
+       }
+}

Propchange: 
incubator/sling/trunk/contrib/launchpad/testing/src/test/java/org/apache/sling/launchpad/webapp/integrationtest/jcrinstall/SimpleConfigTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
incubator/sling/trunk/contrib/launchpad/testing/src/test/java/org/apache/sling/launchpad/webapp/integrationtest/jcrinstall/SimpleConfigTest.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision Rev URL


Reply via email to