/*
* Copyright (c) 2013-2015 Chris Newland.
* Licensed under https://github.com/AdoptOpenJDK/jitwatch/blob/master/LICENSE-BSD
* Instructions: https://github.com/AdoptOpenJDK/jitwatch/wiki
*/
package org.adoptopenjdk.jitwatch.model;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.C_DOT;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.DEBUG_LOGGING;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.S_EMPTY;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.S_ESCAPED_DOT;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class PackageManager
{
private static final Logger logger = LoggerFactory.getLogger(PackageManager.class);
// class name -> MetaClass
private Map<String, MetaClass> metaClasses;
// package name -> MetaPackage
private Map<String, MetaPackage> metaPackages;
private List<MetaPackage> roots;
public PackageManager()
{
clear();
}
public final void clear()
{
metaClasses = new ConcurrentHashMap<>();
metaPackages = new ConcurrentHashMap<>();
roots = new CopyOnWriteArrayList<>();
}
public void addMetaClass(MetaClass metaClass)
{
metaClasses.put(metaClass.getFullyQualifiedName(), metaClass);
}
public MetaClass getMetaClass(String className)
{
MetaClass result = null;
if (className != null)
{
result = metaClasses.get(className);
}
return result;
}
public MetaPackage getMetaPackage(String packageName)
{
MetaPackage result = null;
if (packageName != null)
{
result = metaPackages.get(packageName);
}
return result;
}
public MetaPackage buildPackage(String packageName)
{
if (DEBUG_LOGGING)
{
logger.debug("Building package {}", packageName);
}
String[] parts = packageName.split(S_ESCAPED_DOT);
StringBuilder builder = new StringBuilder();
MetaPackage mp = null;
MetaPackage parent = null;
int depth = 0;
for (String part : parts)
{
if (builder.length() > 0)
{
builder.append(C_DOT);
}
builder.append(part);
String nameBuild = builder.toString();
mp = metaPackages.get(nameBuild);
if (mp == null)
{
mp = new MetaPackage(nameBuild);
if (depth == 0)
{
roots.add(mp);
}
else
{
parent.addChildPackage(mp);
}
storePackage(nameBuild, mp);
}
parent = mp;
depth++;
}
if (mp == null)
{
// default package ""
mp = new MetaPackage(S_EMPTY);
storePackage(S_EMPTY, mp);
}
return mp;
}
private void storePackage(String name, MetaPackage metaPackage)
{
metaPackages.put(name, metaPackage);
}
public List<MetaPackage> getRootPackages()
{
return roots;
}
}