org.eclipse.jetty.util.AttributesMap Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of ehcache Show documentation
Show all versions of ehcache Show documentation
Ehcache is an open source, standards-based cache used to boost performance,
offload the database and simplify scalability. Ehcache is robust, proven and full-featured and
this has made it the most widely-used Java-based cache.
The newest version!
//
// ========================================================================
// Copyright (c) 1995-2021 Mort Bay Consulting Pty Ltd and others.
// ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0
// and Apache License v2.0 which accompanies this distribution.
//
// The Eclipse Public License is available at
// http://www.eclipse.org/legal/epl-v10.html
//
// The Apache License v2.0 is available at
// http://www.opensource.org/licenses/apache2.0.php
//
// You may elect to redistribute this code under either of these licenses.
// ========================================================================
//
package org.eclipse.jetty.util;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.atomic.AtomicReference;
import org.eclipse.jetty.util.component.Dumpable;
public class AttributesMap implements Attributes, Dumpable
{
private final AtomicReference> _map = new AtomicReference<>();
public AttributesMap()
{
}
public AttributesMap(AttributesMap attributes)
{
ConcurrentMap map = attributes.map();
if (map != null)
_map.set(new ConcurrentHashMap<>(map));
}
private ConcurrentMap map()
{
return _map.get();
}
private ConcurrentMap ensureMap()
{
while (true)
{
ConcurrentMap map = map();
if (map != null)
return map;
map = new ConcurrentHashMap<>();
if (_map.compareAndSet(null, map))
return map;
}
}
@Override
public void removeAttribute(String name)
{
Map map = map();
if (map != null)
map.remove(name);
}
@Override
public void setAttribute(String name, Object attribute)
{
if (attribute == null)
removeAttribute(name);
else
ensureMap().put(name, attribute);
}
@Override
public Object getAttribute(String name)
{
Map map = map();
return map == null ? null : map.get(name);
}
@Override
public Enumeration getAttributeNames()
{
return Collections.enumeration(getAttributeNameSet());
}
@Override
public Set getAttributeNameSet()
{
return keySet();
}
public Set> getAttributeEntrySet()
{
Map map = map();
return map == null ? Collections.emptySet() : map.entrySet();
}
public static Enumeration getAttributeNamesCopy(Attributes attrs)
{
if (attrs instanceof AttributesMap)
return Collections.enumeration(((AttributesMap)attrs).keySet());
List names = new ArrayList<>(Collections.list(attrs.getAttributeNames()));
return Collections.enumeration(names);
}
@Override
public void clearAttributes()
{
Map map = map();
if (map != null)
map.clear();
}
public int size()
{
Map map = map();
return map == null ? 0 : map.size();
}
@Override
public String toString()
{
Map map = map();
return map == null ? "{}" : map.toString();
}
private Set keySet()
{
Map map = map();
return map == null ? Collections.emptySet() : map.keySet();
}
public void addAll(Attributes attributes)
{
Enumeration e = attributes.getAttributeNames();
while (e.hasMoreElements())
{
String name = e.nextElement();
setAttribute(name, attributes.getAttribute(name));
}
}
@Override
public String dump()
{
return Dumpable.dump(this);
}
@Override
public void dump(Appendable out, String indent) throws IOException
{
Dumpable.dumpObjects(out, indent, String.format("%s@%x", this.getClass().getSimpleName(), hashCode()), map());
}
}