Coverage Report - org.apache.tapestry5.internal.services.ApplicationStateManagerImpl
 
Classes in this File Line Coverage Branch Coverage Complexity
ApplicationStateManagerImpl
100%
26/26
100%
8/8
0
ApplicationStateManagerImpl$1
100%
2/2
N/A
0
ApplicationStateManagerImpl$ApplicationStateAdapter
100%
9/9
N/A
0
 
 1  
 // Copyright 2007, 2008 The Apache Software Foundation
 2  
 //
 3  
 // Licensed under the Apache License, Version 2.0 (the "License");
 4  
 // you may not use this file except in compliance with the License.
 5  
 // You may obtain a copy of the License at
 6  
 //
 7  
 //     http://www.apache.org/licenses/LICENSE-2.0
 8  
 //
 9  
 // Unless required by applicable law or agreed to in writing, software
 10  
 // distributed under the License is distributed on an "AS IS" BASIS,
 11  
 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 12  
 // See the License for the specific language governing permissions and
 13  
 // limitations under the License.
 14  
 
 15  
 package org.apache.tapestry5.internal.services;
 16  
 
 17  
 import org.apache.tapestry5.ioc.ObjectLocator;
 18  
 import static org.apache.tapestry5.ioc.internal.util.CollectionFactory.newConcurrentMap;
 19  
 import org.apache.tapestry5.services.*;
 20  
 
 21  
 import java.util.Map;
 22  
 
 23  26
 public class ApplicationStateManagerImpl implements ApplicationStateManager
 24  
 {
 25  
     static final String DEFAULT_STRATEGY = "session";
 26  
 
 27  
     static class ApplicationStateAdapter<T>
 28  
     {
 29  
         private final Class<T> ssoClass;
 30  
 
 31  
         private final ApplicationStatePersistenceStrategy strategy;
 32  
 
 33  
         private final ApplicationStateCreator<T> creator;
 34  
 
 35  
         ApplicationStateAdapter(Class<T> ssoClass, ApplicationStatePersistenceStrategy strategy,
 36  
                                 ApplicationStateCreator<T> creator)
 37  24
         {
 38  24
             this.ssoClass = ssoClass;
 39  24
             this.strategy = strategy;
 40  24
             this.creator = creator;
 41  24
         }
 42  
 
 43  
         T getOrCreate()
 44  
         {
 45  118
             return strategy.get(ssoClass, creator);
 46  
         }
 47  
 
 48  
         void set(T sso)
 49  
         {
 50  16
             strategy.set(ssoClass, sso);
 51  16
         }
 52  
 
 53  
         boolean exists()
 54  
         {
 55  8
             return strategy.exists(ssoClass);
 56  
         }
 57  
     }
 58  
 
 59  
     /**
 60  
      * The map will be extended periodically as new ASOs, not in the configuration, are encountered. Thut is is thread
 61  
      * safe.
 62  
      */
 63  18
     private final Map<Class, ApplicationStateAdapter> classToAdapter = newConcurrentMap();
 64  
 
 65  
     private final ApplicationStatePersistenceStrategySource source;
 66  
 
 67  
     private final ObjectLocator locator;
 68  
 
 69  
     @SuppressWarnings("unchecked")
 70  
     public ApplicationStateManagerImpl(Map<Class, ApplicationStateContribution> configuration,
 71  
                                        ApplicationStatePersistenceStrategySource source, ObjectLocator locator)
 72  18
     {
 73  18
         this.source = source;
 74  18
         this.locator = locator;
 75  
 
 76  18
         for (Class asoClass : configuration.keySet())
 77  
         {
 78  12
             ApplicationStateContribution contribution = configuration.get(asoClass);
 79  
 
 80  12
             ApplicationStateAdapter adapter = newAdapter(asoClass, contribution.getStrategy(),
 81  
                                                          contribution.getCreator());
 82  
 
 83  12
             classToAdapter.put(asoClass, adapter);
 84  12
         }
 85  
 
 86  18
     }
 87  
 
 88  
     @SuppressWarnings("unchecked")
 89  
     private <T> ApplicationStateAdapter<T> newAdapter(final Class<T> ssoClass, String strategyName,
 90  
                                                       ApplicationStateCreator<T> creator)
 91  
     {
 92  24
         if (creator == null)
 93  
         {
 94  14
             creator = new ApplicationStateCreator<T>()
 95  
             {
 96  14
                 public T create()
 97  
                 {
 98  26
                     return locator.autobuild(ssoClass);
 99  
                 }
 100  
             };
 101  
         }
 102  
 
 103  24
         ApplicationStatePersistenceStrategy strategy = source.get(strategyName);
 104  
 
 105  24
         return new ApplicationStateAdapter(ssoClass, strategy, creator);
 106  
     }
 107  
 
 108  
     @SuppressWarnings("unchecked")
 109  
     private <T> ApplicationStateAdapter<T> getAdapter(Class<T> ssoClass)
 110  
     {
 111  140
         ApplicationStateAdapter<T> result = classToAdapter.get(ssoClass);
 112  
 
 113  
         // Not found is completely OK, we'll define it on the fly.
 114  
 
 115  140
         if (result == null)
 116  
         {
 117  12
             result = newAdapter(ssoClass, DEFAULT_STRATEGY, null);
 118  12
             classToAdapter.put(ssoClass, result);
 119  
         }
 120  
 
 121  140
         return result;
 122  
     }
 123  
 
 124  
     public <T> T get(Class<T> ssoClass)
 125  
     {
 126  116
         return getAdapter(ssoClass).getOrCreate();
 127  
     }
 128  
 
 129  
     public <T> T getIfExists(Class<T> ssoClass)
 130  
     {
 131  4
         ApplicationStateAdapter<T> adapter = getAdapter(ssoClass);
 132  
 
 133  4
         return adapter.exists() ? adapter.getOrCreate() : null;
 134  
     }
 135  
 
 136  
     public <T> void set(Class<T> ssoClass, T sso)
 137  
     {
 138  16
         getAdapter(ssoClass).set(sso);
 139  16
     }
 140  
 
 141  
     public <T> boolean exists(Class<T> ssoClass)
 142  
     {
 143  4
         return getAdapter(ssoClass).exists();
 144  
     }
 145  
 
 146  
 }