package org.projectusus.ui.dependencygraph.nodes; import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.Set; import org.eclipse.core.resources.IFile; import org.eclipse.core.runtime.PlatformObject; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.ui.ISharedImages; import org.projectusus.core.filerelations.model.ClassDescriptor; import org.projectusus.core.filerelations.model.Packagename; import ch.akuhn.foreach.Collect; import ch.akuhn.foreach.ForEach; import com.google.common.base.Function; import com.google.common.collect.Collections2; public class ClassRepresenter extends PlatformObject implements GraphNode { private final ClassDescriptor clazz; public static Set<GraphNode> getAllClassRepresenters() { return transformToRepresenterSet( ClassDescriptor.getAll() ); } public static Set<GraphNode> transformToRepresenterSet( Set<ClassDescriptor> classes ) { // return foreachVersion( classes ); return standardJavaVersion( classes ); // return versionWithGoogleCollection( classes ); } private static Set<GraphNode> foreachVersion( Set<ClassDescriptor> classes ) { for( Collect<ClassDescriptor> each : ForEach.collect( classes ) ) { each.yield = new ClassRepresenter( each.value ); } return new HashSet<GraphNode>( ForEach.<List<GraphNode>> result() ); } private static Set<GraphNode> standardJavaVersion( Set<ClassDescriptor> classes ) { Set<GraphNode> result = new HashSet<GraphNode>(); for( ClassDescriptor classDescriptor : classes ) { result.add( new ClassRepresenter( classDescriptor ) ); } return result; } private static Set<GraphNode> versionWithGoogleCollection( Set<ClassDescriptor> classes ) { Function<ClassDescriptor, ClassRepresenter> function = new Function<ClassDescriptor, ClassRepresenter>() { public ClassRepresenter apply( ClassDescriptor descriptor ) { return new ClassRepresenter( descriptor ); } }; return new HashSet<GraphNode>( Collections2.transform( classes, function ) ); } public ClassRepresenter( ClassDescriptor clazz ) { this.clazz = clazz; } public Set<GraphNode> getChildren() { return transformToRepresenterSet( clazz.getChildren() ); } public Set<GraphNode> getParents() { return transformToRepresenterSet( clazz.getParents() ); } @Override public boolean equals( Object obj ) { return obj instanceof ClassRepresenter && clazz.equals( ((ClassRepresenter)obj).clazz ); } public int getFilterValue() { return getChildrenAndParentsInOtherPackages().size(); } private Set<ClassDescriptor> getChildrenAndParentsInOtherPackages() { Set<ClassDescriptor> result = clazz.getChildrenInOtherPackages(); result.addAll( clazz.getParentsInOtherPackages() ); return result; } public boolean isVisibleForLimitWithOtherNodes( boolean restricting, Set<GraphNode> others ) { if( !restricting ) { return true; } if( getFilterValue() == 0 ) { return false; } for( GraphNode graphNode : others ) { ClassRepresenter otherRepresenter = (ClassRepresenter)graphNode; if( hasConnectionTo( otherRepresenter ) ) { return true; } } return false; } public boolean hasConnectionTo( ClassRepresenter otherRepresenter ) { return getChildrenAndParentsInOtherPackages().contains( otherRepresenter.clazz ); } public IFile getFile() { return clazz.getFile(); } public String getEdgeEndLabel() { return ""; //$NON-NLS-1$ } public String getEdgeMiddleLabel() { return ""; //$NON-NLS-1$ } public String getEdgeStartLabel() { return ""; //$NON-NLS-1$ } @Override public int hashCode() { return clazz.hashCode(); } public boolean isPackageOneOf( Collection<Packagename> packages ) { return packages.contains( getPackagename() ); } public Packagename getPackagename() { return clazz.getPackagename(); } public boolean isAtEitherEndOf( Packagename source, Packagename dest ) { return connects( source, clazz.getChildren(), dest ) || connects( dest, clazz.getParents(), source ); } private boolean connects( Packagename classPackage, Set<ClassDescriptor> relateds, Packagename relatedPackage ) { if( clazz.getPackagename().equals( classPackage ) ) { for( ClassDescriptor related : relateds ) { if( related.getPackagename().equals( relatedPackage ) ) { return true; } } } return false; } public Packagename getRelatedPackage() { return clazz.getPackagename(); } public boolean isInDifferentPackageThan( GraphNode destination ) { return !getRelatedPackage().equals( destination.getRelatedPackage() ); } public String getDisplayText() { return clazz.getClassname().toString(); } public String getImageName() { return ISharedImages.IMG_OBJS_CLASS; } public String getTooltipText() { return new PackageRepresenter( getRelatedPackage() ).getTooltipText(); } public boolean represents( IJavaElement javaElement ) { return javaElement.getResource().equals( getFile() ); } @Override public Object getAdapter( @SuppressWarnings( "rawtypes" ) Class adapter ) { if( adapter.equals( IJavaElement.class ) ) { return JavaCore.create( getFile() ); } return super.getAdapter( adapter ); } }