001/*
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements.  See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License.  You may obtain a copy of the License at
008 *
009 *      http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017package org.apache.wicket.mock;
018
019import java.io.Serializable;
020import java.util.ArrayList;
021import java.util.Collections;
022import java.util.HashMap;
023import java.util.List;
024import java.util.Map;
025import java.util.Set;
026import java.util.UUID;
027import java.util.concurrent.CopyOnWriteArraySet;
028
029import org.apache.wicket.Session;
030import org.apache.wicket.request.Request;
031import org.apache.wicket.session.ISessionStore;
032
033/**
034 * Session store that holds one session.
035 * 
036 * @author Matej Knopp
037 */
038public class MockSessionStore implements ISessionStore
039{
040        /**
041         * Construct.
042         */
043        public MockSessionStore()
044        {
045        }
046
047        private String sessionId;
048        private final Map<String, Serializable> attributes = new HashMap<>();
049        private final Set<UnboundListener> unboundListeners = new CopyOnWriteArraySet<>();
050        private final Set<BindListener> bindListeners = new CopyOnWriteArraySet<>();
051
052        private Session session;
053
054        @Override
055        public void bind(Request request, Session newSession)
056        {
057                session = newSession;
058        }
059
060        @Override
061        public void destroy()
062        {
063                cleanup();
064        }
065
066        @Override
067        public Serializable getAttribute(Request request, String name)
068        {
069                return attributes.get(name);
070        }
071
072        @Override
073        public List<String> getAttributeNames(Request request)
074        {
075                return Collections.unmodifiableList(new ArrayList<>(attributes.keySet()));
076        }
077
078        @Override
079        public String getSessionId(Request request, boolean create)
080        {
081                if (create && sessionId == null)
082                {
083                        sessionId = UUID.randomUUID().toString();
084                }
085                return sessionId;
086        }
087
088        private void cleanup()
089        {
090                sessionId = null;
091                attributes.clear();
092                session = null;
093        }
094
095        @Override
096        public void invalidate(Request request)
097        {
098                String sessId = sessionId;
099                if (session != null)
100                {
101                        session.onInvalidate();
102                }
103                cleanup();
104                for (UnboundListener l : unboundListeners)
105                {
106                        l.sessionUnbound(sessId);
107                }
108
109        }
110
111        @Override
112        public Session lookup(Request request)
113        {
114                return session;
115        }
116
117        @Override
118        public void registerUnboundListener(UnboundListener listener)
119        {
120                unboundListeners.add(listener);
121        }
122
123        @Override
124        public void removeAttribute(Request request, String name)
125        {
126                attributes.remove(name);
127        }
128
129        @Override
130        public final Set<UnboundListener> getUnboundListener()
131        {
132                return Collections.unmodifiableSet(unboundListeners);
133        }
134
135        @Override
136        public void setAttribute(Request request, String name, Serializable value)
137        {
138                attributes.put(name, value);
139        }
140
141        @Override
142        public void unregisterUnboundListener(UnboundListener listener)
143        {
144                unboundListeners.remove(listener);
145        }
146
147        @Override
148        public void registerBindListener(BindListener listener)
149        {
150                bindListeners.add(listener);
151        }
152
153        @Override
154        public void unregisterBindListener(BindListener listener)
155        {
156                bindListeners.remove(listener);
157        }
158
159        @Override
160        public Set<BindListener> getBindListeners()
161        {
162                return Collections.unmodifiableSet(bindListeners);
163        }
164
165        @Override
166        public void flushSession(Request request, Session session)
167        {
168                this.session = session;
169        }
170
171}