001 /*
002 GRANITE DATA SERVICES
003 Copyright (C) 2012 GRANITE DATA SERVICES S.A.S.
004
005 This file is part of Granite Data Services.
006
007 Granite Data Services is free software; you can redistribute it and/or modify
008 it under the terms of the GNU Library General Public License as published by
009 the Free Software Foundation; either version 2 of the License, or (at your
010 option) any later version.
011
012 Granite Data Services is distributed in the hope that it will be useful, but
013 WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
014 FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
015 for more details.
016
017 You should have received a copy of the GNU Library General Public License
018 along with this library; if not, see <http://www.gnu.org/licenses/>.
019 */
020
021 package org.granite.client.tide.impl;
022
023 import java.util.ArrayList;
024 import java.util.List;
025 import java.util.Map;
026 import java.util.Map.Entry;
027 import java.util.concurrent.ConcurrentHashMap;
028
029 import org.granite.client.tide.Resettable;
030 import org.granite.client.tide.ViewScope;
031
032 /**
033 * @author William DRAI
034 */
035 public class DefaultViewScope implements ViewScope {
036
037 private Map<String, Object> instanceCache = new ConcurrentHashMap<String, Object>();
038
039 private GlobalResetter resetter = null;
040 private Map<String, BeanResetter> resettersMap = new ConcurrentHashMap<String, BeanResetter>();
041
042 private String viewId = null;
043
044 public DefaultViewScope() {
045 }
046
047 public String getViewId() {
048 return viewId;
049 }
050 public void setViewId(String viewId) {
051 this.viewId = viewId;
052 }
053
054 public Object get(String name) {
055 return instanceCache.get(name);
056 }
057
058 public void put(String name, Object instance) {
059 instanceCache.put(name, instance);
060 }
061
062 public Object remove(String name) {
063 Object instance = instanceCache.remove(name);
064
065 if (instance instanceof Resettable)
066 ((Resettable)instance).reset();
067
068 if (resettersMap.containsKey(name)) {
069 resettersMap.get(name).reset(instance);
070 resettersMap.remove(name);
071 }
072
073 if (resetter != null)
074 resetter.reset(name, instance);
075
076 return instance;
077 }
078
079 public void reset(Class<?> type) {
080 List<String> names = new ArrayList<String>();
081
082 for (Entry<String, Object> entry : instanceCache.entrySet()) {
083 if (type.isInstance(entry.getValue()))
084 names.add(entry.getKey());
085 }
086
087 for (String name : names)
088 remove(name);
089 }
090
091 public void reset() {
092 for (Entry<String, Object> entry : instanceCache.entrySet()) {
093 if (entry.getValue() instanceof Resettable)
094 ((Resettable)entry.getValue()).reset();
095
096 if (resettersMap.containsKey(entry.getKey()))
097 resettersMap.get(entry.getKey()).reset(entry.getValue());
098
099 if (resetter != null)
100 resetter.reset(entry.getKey(), entry.getValue());
101 }
102
103 instanceCache.clear();
104 resettersMap.clear();
105 }
106
107 public void setResetter(GlobalResetter resetter) {
108 this.resetter = resetter;
109 }
110
111 public void addResetter(String name, BeanResetter resetter) {
112 this.resettersMap.put(name, resetter);
113 }
114
115 }