package org.projectusus.core.filerelations.model; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import net.sourceforge.c4j.ContractReference; import org.eclipse.jdt.core.IJavaElement; @ContractReference( contractClassName = "PackagenameContract" ) public class Packagename { private static Map<String, Packagename> allPackages = new HashMap<String, Packagename>(); public static final String COLOR_PREFIX = "PACKAGE"; //$NON-NLS-1$ private String name; private Set<ClassDescriptor> classesInPackage = new HashSet<ClassDescriptor>(); private final IJavaElement javaElement; public static void clear() { allPackages = new HashMap<String, Packagename>(); } public static Packagename of( String name, IJavaElement javaElement ) { if( allPackages.containsKey( name ) ) { return allPackages.get( name ); } Packagename newPackage = new Packagename( name, javaElement ); allPackages.put( name, newPackage ); return newPackage; } public static Set<Packagename> getAll() { return new HashSet<Packagename>( allPackages.values() ); } private Packagename( String name, IJavaElement javaElement ) { this.name = name; this.javaElement = javaElement; } public void addClass( ClassDescriptor clazz ) { classesInPackage.add( clazz ); } public void removeClass( ClassDescriptor clazz ) { classesInPackage.remove( clazz ); if( classesInPackage.isEmpty() ) { allPackages.remove( name ); } } public boolean containsClass( ClassDescriptor clazz ) { return classesInPackage.contains( clazz ); } public int numberOfClasses() { return classesInPackage.size(); } @Override public boolean equals( Object obj ) { return (obj instanceof Packagename) && name.equals( ((Packagename)obj).name ); } @Override public int hashCode() { return name == null ? 0 : name.hashCode(); } @Override public String toString() { return name; } public IJavaElement getJavaElement() { return javaElement; } public Relation<Packagename> getRelationTo( Packagename target ) { return new Relation<Packagename>( this, target ); } public String getDisplayName() { return getJavaElement().getElementName(); } public String getOSPath() { return getJavaElement().getPath().toOSString(); } public Set<ClassDescriptor> getClassesInPackage() { return Collections.unmodifiableSet( classesInPackage ); } }