/*
* Licensed to the Apache Software Foundation (ASF) under one or more contributor license
* agreements. See the NOTICE file distributed with this work for additional information regarding
* copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the License. You may obtain a
* copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/
package org.apache.geode.modules.session.catalina.callback;
import org.apache.geode.cache.Declarable;
import org.apache.geode.cache.EntryEvent;
import org.apache.geode.cache.Operation;
import org.apache.geode.cache.util.CacheListenerAdapter;
import org.apache.geode.modules.session.catalina.DeltaSessionInterface;
import org.apache.geode.modules.util.ContextMapper;
import javax.servlet.http.HttpSession;
import java.util.Properties;
import org.apache.catalina.session.ManagerBase;
public class SessionExpirationCacheListener extends CacheListenerAdapter<String, HttpSession>
implements Declarable {
public void afterDestroy(EntryEvent<String, HttpSession> event) {
// A Session expired. If it was destroyed by GemFire expiration, process it.
// If it was destroyed via Session.invalidate, ignore it since it has
// already been processed.
DeltaSessionInterface session = null;
if (event.getOperation() == Operation.EXPIRE_DESTROY) {
session = (DeltaSessionInterface) event.getOldValue();
} else {
/*
* This comes into play when we're dealing with an empty client proxy. We need the actual
* destroyed object to come back from the server so that any associated listeners can fire
* correctly. Having the destroyed object come back as the callback arg depends on setting the
* property gemfire.EXPIRE_SENDS_ENTRY_AS_CALLBACK.
*/
Object callback = event.getCallbackArgument();
if (callback != null && callback instanceof DeltaSessionInterface) {
session = (DeltaSessionInterface) callback;
ManagerBase m = ContextMapper.getContext(session.getContextName());
if (m != null) {
session.setOwner(m);
}
}
}
if (session != null) {
session.processExpired();
}
}
public void init(Properties p) {}
public boolean equals(Object obj) {
// This method is only implemented so that RegionAttributesCreation.sameAs
// works properly.
if (this == obj) {
return true;
}
if (obj == null || !(obj instanceof SessionExpirationCacheListener)) {
return false;
}
return true;
}
}