keycloak
クラス | 公開メンバ関数 | 関数 | 静的非公開メンバ関数 | 非公開変数類 | 静的非公開変数類 | 全メンバ一覧
org.keycloak.models.sessions.infinispan.InfinispanKeycloakTransaction クラス
org.keycloak.models.sessions.infinispan.InfinispanKeycloakTransaction の継承関係図
Inheritance graph
org.keycloak.models.sessions.infinispan.InfinispanKeycloakTransaction 連携図
Collaboration graph

クラス

enum  CacheOperation
 
interface  CacheTask
 
class  CacheTaskWithValue
 

公開メンバ関数

void begin ()
 
void commit ()
 
void rollback ()
 
void setRollbackOnly ()
 
boolean getRollbackOnly ()
 
boolean isActive ()
 

関数

public< K, V > void put (Cache< K, V > cache, K key, V value)
 
public< K, V > void put (Cache< K, V > cache, K key, V value, long lifespan, TimeUnit lifespanUnit)
 
public< K, V > void putIfAbsent (Cache< K, V > cache, K key, V value)
 
public< K, V > void replace (Cache< K, V > cache, K key, V value)
 
public< K, V > void notify (ClusterProvider clusterProvider, String taskKey, ClusterEvent event, boolean ignoreSender)
 
public< K, V > void remove (Cache< K, V > cache, K key)
 
public< K, V > V get (Cache< K, V > cache, K key)
 

静的非公開メンバ関数

static< K, V > Object getTaskKey (Cache< K, V > cache, K key)
 
static< K, V > Cache< K, V > decorateCache (Cache< K, V > cache)
 

非公開変数類

boolean active
 
boolean rollback
 
final Map< Object, CacheTasktasks = new LinkedHashMap<>()
 

静的非公開変数類

static final Logger log = Logger.getLogger(InfinispanKeycloakTransaction.class)
 

詳解

著者
Stian Thorgersen

クラス詳解

◆ org::keycloak::models::sessions::infinispan::InfinispanKeycloakTransaction::CacheOperation

enum org::keycloak::models::sessions::infinispan::InfinispanKeycloakTransaction::CacheOperation
org.keycloak.models.sessions.infinispan.InfinispanKeycloakTransaction.CacheOperation 連携図
Collaboration graph
列挙値
ADD
ADD_IF_ABSENT
ADD_WITH_LIFESPAN
REMOVE
REPLACE

関数詳解

◆ begin()

void org.keycloak.models.sessions.infinispan.InfinispanKeycloakTransaction.begin ( )
inline

org.keycloak.models.KeycloakTransactionを実装しています。

46  {
47  active = true;
48  }
boolean active
Definition: InfinispanKeycloakTransaction.java:41

◆ commit()

void org.keycloak.models.sessions.infinispan.InfinispanKeycloakTransaction.commit ( )
inline

org.keycloak.models.KeycloakTransactionを実装しています。

51  {
52  if (rollback) {
53  throw new RuntimeException("Rollback only!");
54  }
55 
56  tasks.values().forEach(CacheTask::execute);
57  }
final Map< Object, CacheTask > tasks
Definition: InfinispanKeycloakTransaction.java:43
void rollback()
Definition: InfinispanKeycloakTransaction.java:60

◆ decorateCache()

static <K, V> Cache<K, V> org.keycloak.models.sessions.infinispan.InfinispanKeycloakTransaction.decorateCache ( Cache< K, V >  cache)
inlinestaticprivate
249  {
250  return cache.getAdvancedCache()
251  .withFlags(Flag.IGNORE_RETURN_VALUES, Flag.SKIP_REMOTE_LOOKUP);
252  }

◆ get()

public<K, V> V org.keycloak.models.sessions.infinispan.InfinispanKeycloakTransaction.get ( Cache< K, V >  cache,
key 
)
inlinepackage
204  {
205  Object taskKey = getTaskKey(cache, key);
206  CacheTask current = tasks.get(taskKey);
207  if (current != null) {
208  if (current instanceof CacheTaskWithValue) {
209  return ((CacheTaskWithValue<V>) current).getValue();
210  }
211  return null;
212  }
213 
214  // Should we have per-transaction cache for lookups?
215  return cache.get(key);
216  }
final Map< Object, CacheTask > tasks
Definition: InfinispanKeycloakTransaction.java:43
static< K, V > Object getTaskKey(Cache< K, V > cache, K key)
Definition: InfinispanKeycloakTransaction.java:218

◆ getRollbackOnly()

boolean org.keycloak.models.sessions.infinispan.InfinispanKeycloakTransaction.getRollbackOnly ( )
inline

org.keycloak.models.KeycloakTransactionを実装しています。

70  {
71  return rollback;
72  }
void rollback()
Definition: InfinispanKeycloakTransaction.java:60

◆ getTaskKey()

static <K, V> Object org.keycloak.models.sessions.infinispan.InfinispanKeycloakTransaction.getTaskKey ( Cache< K, V >  cache,
key 
)
inlinestaticprivate
218  {
219  if (key instanceof String) {
220  return new StringBuilder(cache.getName())
221  .append("::")
222  .append(key).toString();
223  } else {
224  return key;
225  }
226  }

◆ isActive()

boolean org.keycloak.models.sessions.infinispan.InfinispanKeycloakTransaction.isActive ( )
inline

org.keycloak.models.KeycloakTransactionを実装しています。

75  {
76  return active;
77  }
boolean active
Definition: InfinispanKeycloakTransaction.java:41

◆ notify()

public<K, V> void org.keycloak.models.sessions.infinispan.InfinispanKeycloakTransaction.notify ( ClusterProvider  clusterProvider,
String  taskKey,
ClusterEvent  event,
boolean  ignoreSender 
)
inlinepackage
170  {
171  log.tracev("Adding cache operation SEND_EVENT: {0}", event);
172 
173  String theTaskKey = taskKey;
174  int i = 1;
175  while (tasks.containsKey(theTaskKey)) {
176  theTaskKey = taskKey + "-" + (i++);
177  }
178 
179  tasks.put(taskKey, () -> clusterProvider.notify(taskKey, event, ignoreSender, ClusterProvider.DCNotify.ALL_DCS));
180  }
final Map< Object, CacheTask > tasks
Definition: InfinispanKeycloakTransaction.java:43
static final Logger log
Definition: InfinispanKeycloakTransaction.java:35

◆ put() [1/2]

public<K, V> void org.keycloak.models.sessions.infinispan.InfinispanKeycloakTransaction.put ( Cache< K, V >  cache,
key,
value 
)
inlinepackage
79  {
80  log.tracev("Adding cache operation: {0} on {1}", CacheOperation.ADD, key);
81 
82  Object taskKey = getTaskKey(cache, key);
83  if (tasks.containsKey(taskKey)) {
84  throw new IllegalStateException("Can't add session: task in progress for session");
85  } else {
86  tasks.put(taskKey, new CacheTaskWithValue<V>(value) {
87  @Override
88  public void execute() {
89  decorateCache(cache).put(key, value);
90  }
91 
92  @Override
93  public String toString() {
94  return String.format("CacheTaskWithValue: Operation 'put' for key %s", key);
95  }
96  });
97  }
98  }
static< K, V > Cache< K, V > decorateCache(Cache< K, V > cache)
Definition: InfinispanKeycloakTransaction.java:249
final Map< Object, CacheTask > tasks
Definition: InfinispanKeycloakTransaction.java:43
static< K, V > Object getTaskKey(Cache< K, V > cache, K key)
Definition: InfinispanKeycloakTransaction.java:218
static final Logger log
Definition: InfinispanKeycloakTransaction.java:35

◆ put() [2/2]

public<K, V> void org.keycloak.models.sessions.infinispan.InfinispanKeycloakTransaction.put ( Cache< K, V >  cache,
key,
value,
long  lifespan,
TimeUnit  lifespanUnit 
)
inlinepackage
100  {
101  log.tracev("Adding cache operation: {0} on {1}", CacheOperation.ADD_WITH_LIFESPAN, key);
102 
103  Object taskKey = getTaskKey(cache, key);
104  if (tasks.containsKey(taskKey)) {
105  throw new IllegalStateException("Can't add session: task in progress for session");
106  } else {
107  tasks.put(taskKey, new CacheTaskWithValue<V>(value) {
108  @Override
109  public void execute() {
110  decorateCache(cache).put(key, value, lifespan, lifespanUnit);
111  }
112 
113  @Override
114  public String toString() {
115  return String.format("CacheTaskWithValue: Operation 'put' for key %s, lifespan %d TimeUnit %s", key, lifespan, lifespanUnit.toString());
116  }
117  });
118  }
119  }
static< K, V > Cache< K, V > decorateCache(Cache< K, V > cache)
Definition: InfinispanKeycloakTransaction.java:249
final Map< Object, CacheTask > tasks
Definition: InfinispanKeycloakTransaction.java:43
static< K, V > Object getTaskKey(Cache< K, V > cache, K key)
Definition: InfinispanKeycloakTransaction.java:218
static final Logger log
Definition: InfinispanKeycloakTransaction.java:35

◆ putIfAbsent()

public<K, V> void org.keycloak.models.sessions.infinispan.InfinispanKeycloakTransaction.putIfAbsent ( Cache< K, V >  cache,
key,
value 
)
inlinepackage
121  {
122  log.tracev("Adding cache operation: {0} on {1}", CacheOperation.ADD_IF_ABSENT, key);
123 
124  Object taskKey = getTaskKey(cache, key);
125  if (tasks.containsKey(taskKey)) {
126  throw new IllegalStateException("Can't add session: task in progress for session");
127  } else {
128  tasks.put(taskKey, new CacheTaskWithValue<V>(value) {
129  @Override
130  public void execute() {
131  V existing = cache.putIfAbsent(key, value);
132  if (existing != null) {
133  throw new IllegalStateException("There is already existing value in cache for key " + key);
134  }
135  }
136 
137  @Override
138  public String toString() {
139  return String.format("CacheTaskWithValue: Operation 'putIfAbsent' for key %s", key);
140  }
141  });
142  }
143  }
final Map< Object, CacheTask > tasks
Definition: InfinispanKeycloakTransaction.java:43
static< K, V > Object getTaskKey(Cache< K, V > cache, K key)
Definition: InfinispanKeycloakTransaction.java:218
static final Logger log
Definition: InfinispanKeycloakTransaction.java:35

◆ remove()

public<K, V> void org.keycloak.models.sessions.infinispan.InfinispanKeycloakTransaction.remove ( Cache< K, V >  cache,
key 
)
inlinepackage
182  {
183  log.tracev("Adding cache operation: {0} on {1}", CacheOperation.REMOVE, key);
184 
185  Object taskKey = getTaskKey(cache, key);
186 
187  // TODO:performance Eventual performance optimization could be to skip "cache.remove" if item was added in this transaction (EG. authenticationSession valid for single request due to automatic SSO login)
188  tasks.put(taskKey, new CacheTask() {
189 
190  @Override
191  public void execute() {
192  decorateCache(cache).remove(key);
193  }
194 
195  @Override
196  public String toString() {
197  return String.format("CacheTask: Operation 'remove' for key %s", key);
198  }
199 
200  });
201  }
static< K, V > Cache< K, V > decorateCache(Cache< K, V > cache)
Definition: InfinispanKeycloakTransaction.java:249
final Map< Object, CacheTask > tasks
Definition: InfinispanKeycloakTransaction.java:43
static< K, V > Object getTaskKey(Cache< K, V > cache, K key)
Definition: InfinispanKeycloakTransaction.java:218
static final Logger log
Definition: InfinispanKeycloakTransaction.java:35

◆ replace()

public<K, V> void org.keycloak.models.sessions.infinispan.InfinispanKeycloakTransaction.replace ( Cache< K, V >  cache,
key,
value 
)
inlinepackage
145  {
146  log.tracev("Adding cache operation: {0} on {1}", CacheOperation.REPLACE, key);
147 
148  Object taskKey = getTaskKey(cache, key);
149  CacheTask current = tasks.get(taskKey);
150  if (current != null) {
151  if (current instanceof CacheTaskWithValue) {
152  ((CacheTaskWithValue<V>) current).setValue(value);
153  }
154  } else {
155  tasks.put(taskKey, new CacheTaskWithValue<V>(value) {
156  @Override
157  public void execute() {
158  decorateCache(cache).replace(key, value);
159  }
160 
161  @Override
162  public String toString() {
163  return String.format("CacheTaskWithValue: Operation 'replace' for key %s", key);
164  }
165 
166  });
167  }
168  }
static< K, V > Cache< K, V > decorateCache(Cache< K, V > cache)
Definition: InfinispanKeycloakTransaction.java:249
final Map< Object, CacheTask > tasks
Definition: InfinispanKeycloakTransaction.java:43
static< K, V > Object getTaskKey(Cache< K, V > cache, K key)
Definition: InfinispanKeycloakTransaction.java:218
static final Logger log
Definition: InfinispanKeycloakTransaction.java:35

◆ rollback()

void org.keycloak.models.sessions.infinispan.InfinispanKeycloakTransaction.rollback ( )
inline

org.keycloak.models.KeycloakTransactionを実装しています。

60  {
61  tasks.clear();
62  }
final Map< Object, CacheTask > tasks
Definition: InfinispanKeycloakTransaction.java:43

◆ setRollbackOnly()

void org.keycloak.models.sessions.infinispan.InfinispanKeycloakTransaction.setRollbackOnly ( )
inline

org.keycloak.models.KeycloakTransactionを実装しています。

65  {
66  rollback = true;
67  }
void rollback()
Definition: InfinispanKeycloakTransaction.java:60

メンバ詳解

◆ active

boolean org.keycloak.models.sessions.infinispan.InfinispanKeycloakTransaction.active
private

◆ log

final Logger org.keycloak.models.sessions.infinispan.InfinispanKeycloakTransaction.log = Logger.getLogger(InfinispanKeycloakTransaction.class)
staticprivate

◆ rollback

boolean org.keycloak.models.sessions.infinispan.InfinispanKeycloakTransaction.rollback
private

◆ tasks

final Map<Object, CacheTask> org.keycloak.models.sessions.infinispan.InfinispanKeycloakTransaction.tasks = new LinkedHashMap<>()
private

このクラス詳解は次のファイルから抽出されました: