// Copyright (c) 2009-2010 by the projectusus.org contributors
// This software is released under the terms and conditions
// of the Eclipse Public License (EPL) 1.0.
// See http://www.eclipse.org/legal/epl-v10.html for details.
package org.projectusus.core.internal.proportions.rawdata;
import static org.projectusus.core.internal.proportions.rawdata.JDTSupport.getCompilationUnit;
import net.sourceforge.c4j.ContractReference;
import org.eclipse.core.resources.IFile;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.dom.AbstractTypeDeclaration;
import org.eclipse.jdt.core.dom.Initializer;
import org.eclipse.jdt.core.dom.MethodDeclaration;
import org.projectusus.core.IMetricsResultVisitor;
import org.projectusus.core.basis.JavaModelPath;
import org.projectusus.core.basis.MetricsResults;
import org.projectusus.core.filerelations.model.ASTNodeHelper;
import org.projectusus.core.filerelations.model.ClassDescriptor;
import org.projectusus.core.filerelations.model.Classname;
import org.projectusus.core.filerelations.model.WrappedTypeBinding;
@ContractReference( contractClassName = "FileRawDataContract" )
public class FileRawData extends RawData<Integer, ClassRawData> {
private MetricsResults data;
private final IFile file;
private final ASTNodeHelper nodeHelper;
public FileRawData( IFile file, ASTNodeHelper nodeHelper ) {
super(); // sagt AL ;)
this.file = file;
this.nodeHelper = nodeHelper;
data = new MetricsResults();
}
@Override
public String toString() {
return "Data for " + file.getFullPath() + ", " + getRawDataElementCount() + " classes"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
public void putData( WrappedTypeBinding boundType, MethodDeclaration methodDecl, String dataKey, Object value ) {
ClassRawData classRawData = getOrCreateClassRawData( boundType, methodDecl );
if( classRawData != null ) {
classRawData.putData( methodDecl, dataKey, value );
}
}
public void putData( WrappedTypeBinding boundType, Initializer initializer, String dataKey, Object value ) {
ClassRawData classRawData = getOrCreateClassRawData( boundType, initializer );
if( classRawData != null ) {
classRawData.putData( initializer, dataKey, value );
}
}
public void putData( WrappedTypeBinding boundType, AbstractTypeDeclaration node, String dataKey, Object value ) {
ClassRawData classRawData = getOrCreateClassRawData( boundType, node );
if( classRawData != null ) {
classRawData.putData( dataKey, value );
}
}
private ClassRawData getOrCreateClassRawData( WrappedTypeBinding boundType, AbstractTypeDeclaration node ) {
return getOrCreateClassRawData( boundType, nodeHelper.getStartPositionFor( node ), nodeHelper.calcLineNumberFor( node ), node.getName().toString() );
}
private ClassRawData getOrCreateClassRawData( WrappedTypeBinding typeBinding, int start, int lineNumber, String name ) {
Integer startObject = Integer.valueOf( start );
ClassRawData rawData = super.getRawData( startObject );
if( rawData == null ) {
rawData = new ClassRawData( typeBinding, name, nodeHelper, start, lineNumber );
super.addRawData( startObject, rawData );
}
return rawData;
}
private ClassRawData getOrCreateClassRawData( WrappedTypeBinding boundType, MethodDeclaration node ) {
return getOrCreateClassRawData( boundType, nodeHelper.findEnclosingClassOf( node ) );
}
private ClassRawData getOrCreateClassRawData( WrappedTypeBinding boundType, Initializer node ) {
return getOrCreateClassRawData( boundType, nodeHelper.findEnclosingClassOf( node ) );
}
private ClassRawData getClassRawData( IJavaElement element ) {
ICompilationUnit compilationUnit = getCompilationUnit( element );
if( compilationUnit != null ) {
try {
return getClassRawData( element, compilationUnit );
} catch( JavaModelException e ) {
// catch silently
}
}
return null;
}
private ClassRawData getClassRawData( IJavaElement element, ICompilationUnit compilationUnit ) throws JavaModelException {
for( Integer startPosition : getAllKeys() ) {
IJavaElement foundElement = compilationUnit.getElementAt( startPosition.intValue() );
if( element.equals( foundElement ) ) {
return super.getRawData( startPosition );
}
}
return null;
}
private ClassRawData findClass( Classname classname ) {
for( ClassRawData classRD : getAllRawDataElements() ) {
if( classRD.isCalled( classname ) ) {
return classRD;
}
}
return null;
}
public void dropRawData() {
for( ClassRawData classRD : getAllRawDataElements() ) {
classRD.dropRawData();
}
removeAll();
}
public void acceptAndGuide( IMetricsResultVisitor visitor ) {
visitor.inspectFile( file, data );
JavaModelPath path = visitor.getPath();
if( path.isRestrictedToType() ) {
this.getClassRawData( path.getType() ).acceptAndGuide( visitor );
} else {
for( ClassRawData classRD : getAllRawDataElements() ) {
classRD.acceptAndGuide( visitor );
}
}
}
public void removeRelationIfTargetIsGone( ClassDescriptor descriptor ) {
ClassRawData classRawData = findClass( descriptor.getClassname() );
if( classRawData == null ) {
descriptor.removeFromPool();
}
}
}