| /*========================================================================= |
| * Copyright (c) 2010-2014 Pivotal Software, Inc. All Rights Reserved. |
| * This product is protected by U.S. and international copyright |
| * and intellectual property laws. Pivotal products are covered by |
| * one or more patents listed at http://www.pivotal.io/patents. |
| *========================================================================= |
| */ |
| package com.gemstone.gemfire.modules.session.filter.attributes; |
| |
| import com.gemstone.gemfire.DataSerializable; |
| import com.gemstone.gemfire.Instantiator; |
| import org.slf4j.Logger; |
| import org.slf4j.LoggerFactory; |
| |
| /** |
| * This class implements delayed attribute delta propagation. Updates to |
| * attributes are only propagated once the session goes out of scope - i.e. as |
| * the request is done being processed. |
| */ |
| public class DeltaQueuedSessionAttributes extends AbstractDeltaSessionAttributes { |
| |
| private static final Logger LOG = |
| LoggerFactory.getLogger(DeltaQueuedSessionAttributes.class.getName()); |
| |
| private Trigger trigger = Trigger.SET; |
| |
| private enum Trigger { |
| SET, |
| SET_AND_GET; |
| } |
| |
| /** |
| * Register ourselves for de-serialization |
| */ |
| static { |
| Instantiator.register( |
| new Instantiator(DeltaQueuedSessionAttributes.class, 3479) { |
| @Override |
| public DataSerializable newInstance() { |
| return new DeltaQueuedSessionAttributes(); |
| } |
| }); |
| } |
| |
| /** |
| * Default constructor |
| */ |
| public DeltaQueuedSessionAttributes() { |
| } |
| |
| public void setReplicationTrigger(String trigger) { |
| this.trigger = Trigger.valueOf(trigger.toUpperCase()); |
| } |
| |
| @Override |
| public Object getAttribute(String attr) { |
| if (trigger == Trigger.SET_AND_GET) { |
| deltas.put(attr, new DeltaEvent(session, attr)); |
| } |
| return super.getAttribute(attr); |
| } |
| |
| /** |
| * {@inheritDoc} Put an attribute, setting the dirty flag. The changes are |
| * flushed at the end of filter processing. |
| */ |
| @Override |
| public Object putAttribute(String attr, Object value) { |
| Object obj = attributes.put(attr, value); |
| deltas.put(attr, new DeltaEvent(true, attr, value)); |
| return obj; |
| } |
| |
| /** |
| * {@inheritDoc} Remove an attribute, setting the dirty flag. The changes are |
| * flushed at the end of filter processing. |
| */ |
| @Override |
| public Object removeAttribute(String attr) { |
| Object obj = attributes.remove(attr); |
| deltas.put(attr, new DeltaEvent(false, attr, null)); |
| return obj; |
| } |
| } |