/* * 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.internal.filter.attributes; import org.apache.geode.DataSerializer; import org.apache.geode.Delta; import org.apache.geode.InvalidDeltaException; import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; import java.util.Collections; import java.util.HashMap; import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * This abstract class contains the structures and methods to handle delta updates to attributes. */ public abstract class AbstractDeltaSessionAttributes extends AbstractSessionAttributes implements Delta { private static final Logger LOG = LoggerFactory.getLogger(AbstractDeltaSessionAttributes.class.getName()); /** * This map holds the updates to attributes */ protected transient Map<String, DeltaEvent> deltas = Collections.synchronizedMap(new HashMap<String, DeltaEvent>()); @Override public boolean hasDelta() { return true; } @Override public void toDelta(DataOutput out) throws IOException { out.writeInt(maxInactiveInterval); out.writeLong(lastAccessedTime); synchronized (deltas) { DataSerializer.writeInteger(deltas.size(), out); for (Map.Entry<String, DeltaEvent> e : deltas.entrySet()) { DataSerializer.writeString(e.getKey(), out); DataSerializer.writeObject(e.getValue(), out); } deltas.clear(); } out.writeUTF(jvmOwnerId); } @Override public void fromDelta(DataInput in) throws IOException, InvalidDeltaException { maxInactiveInterval = in.readInt(); lastAccessedTime = in.readLong(); Map<String, DeltaEvent> localDeltas = new HashMap<String, DeltaEvent>(); try { int size = DataSerializer.readInteger(in); for (int i = 0; i < size; i++) { String key = DataSerializer.readString(in); DeltaEvent evt = DataSerializer.readObject(in); localDeltas.put(key, evt); } } catch (ClassNotFoundException ex) { LOG.error("Unable to de-serialize delta events", ex); return; } LOG.debug("Processing {} delta events for {}", localDeltas.size(), session); for (DeltaEvent e : localDeltas.values()) { if (e.isUpdate()) { attributes.put(e.getName(), e.getValue()); if (session.getNativeSession() != null) { session.getNativeSession().setAttribute(e.getName(), e.getValue()); } } else { attributes.remove(e.getName()); if (session.getNativeSession() != null) { session.getNativeSession().setAttribute(e.getName(), null); } } } jvmOwnerId = in.readUTF(); } }