/*
* 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 java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.*;
public class MetaPackage implements Comparable<MetaPackage>
{
private String packageName;
private List<MetaPackage> childPackages = new CopyOnWriteArrayList<>();
private List<MetaClass> packageClasses = new CopyOnWriteArrayList<>();
// support navigating back up the tree
private MetaPackage parentPackage = null;
private boolean hasCompiledClasses = false;
public MetaPackage(String packageName)
{
this.packageName = packageName;
}
public List<MetaPackage> getChildPackages()
{
MetaPackage[] asArray = childPackages.toArray(new MetaPackage[childPackages.size()]);
Arrays.sort(asArray);
return new ArrayList<>(Arrays.asList(asArray));
}
public void addChildPackage(MetaPackage child)
{
child.setParentPackage(this);
childPackages.add(child);
}
public MetaPackage getChildPackage(String name)
{
for (MetaPackage mp : childPackages)
{
if (mp.getName().equals(name))
{
return mp;
}
}
return null;
}
public List<MetaClass> getPackageClasses()
{
MetaClass[] asArray = packageClasses.toArray(new MetaClass[packageClasses.size()]);
Arrays.sort(asArray);
return new ArrayList<>(Arrays.asList(asArray));
}
public List<String> getPackageComponents()
{
List<String> components = new ArrayList<>();
if (packageName.indexOf('.') == -1)
{
components.add(packageName);
}
else
{
components.addAll(Arrays.asList(packageName.split("\\.")));
}
return components;
}
public void addClass(MetaClass metaClass)
{
packageClasses.add(metaClass);
}
public String getName()
{
return packageName;
}
@Override
public String toString()
{
String str;
if (S_EMPTY.equals(packageName))
{
str = DEFAULT_PACKAGE_NAME;
}
else
{
str = getName();
}
return str;
}
@Override
public int compareTo(MetaPackage other)
{
return this.getName().compareTo(other.getName());
}
@Override
public int hashCode()
{
return toString().hashCode();
}
@Override
public boolean equals(Object obj)
{
if (obj == null)
{
return false;
}
else
{
return toString().equals(obj.toString());
}
}
public MetaPackage getParentPackage()
{
return parentPackage;
}
public void setParentPackage(MetaPackage parentPackage)
{
this.parentPackage = parentPackage;
}
public boolean hasCompiledClasses()
{
return hasCompiledClasses;
}
public void setHasCompiledClasses()
{
if (!hasCompiledClasses)
{
hasCompiledClasses = true;
// percolate upwards
if (parentPackage != null && !parentPackage.hasCompiledClasses)
{
parentPackage.setHasCompiledClasses();
}
}
}
}