blob: 98bbaf74266b6ddcc629efdfd1e85d13a8313ab1 [file] [log] [blame]
/*
* Copyright (c) 2018 Eike Stepper (Berlin, Germany) and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Eike Stepper - initial API and implementation
*/
package org.eclipse.net4j.internal.trace;
import org.eclipse.net4j.trace.Element.BufferElement;
import org.eclipse.net4j.util.ReflectUtil;
import org.eclipse.internal.net4j.buffer.Buffer;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import java.util.concurrent.atomic.AtomicInteger;
/**
* @author Eike Stepper
*/
public final class ElementCounters
{
public static final ElementCounters INSTANCE = new ElementCounters();
private final Map<String, AtomicInteger> map = new HashMap<String, AtomicInteger>();
private ElementCounters()
{
}
public int nextID(String type)
{
AtomicInteger counter = map.get(type);
if (counter == null)
{
counter = new AtomicInteger();
map.put(type, counter);
}
return counter.incrementAndGet();
}
public void load(Properties properties)
{
String lastBufferID = (String)properties.remove(BufferElement.TYPE);
if (lastBufferID != null)
{
AtomicInteger lastID = getBufferCounter();
lastID.set(Integer.parseInt(lastBufferID));
}
map.clear();
for (Map.Entry<Object, Object> entry : properties.entrySet())
{
String type = (String)entry.getKey();
int counter = Integer.parseInt((String)entry.getValue());
map.put(type, new AtomicInteger(counter));
}
}
public void save(Properties properties)
{
for (Map.Entry<String, AtomicInteger> entry : map.entrySet())
{
String type = entry.getKey();
AtomicInteger counter = entry.getValue();
properties.setProperty(type, Integer.toString(counter.get()));
}
AtomicInteger lastID = getBufferCounter();
int lastBufferID = lastID.get();
properties.setProperty(BufferElement.TYPE, Integer.toString(lastBufferID));
}
private static AtomicInteger getBufferCounter()
{
return (AtomicInteger)ReflectUtil.getValue(ReflectUtil.getField(Buffer.class, "lastID"), null);
}
}