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}