package cideplus.ui.configuration.popup.action;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceVisitor;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IObjectActionDelegate;
import org.eclipse.ui.IWorkbenchPart;
import cideplus.model.ASTNodeReference;
import cideplus.model.Feature;
import cideplus.ui.configuration.ICompilationUnitFeaturesManager;
import cideplus.ui.configuration.FeaturesConfigurationUtil;
import cideplus.ui.configuration.IFeaturesManager;
public class StatisticsAction implements IObjectActionDelegate {
private IJavaProject project;
private Shell shell;
private class Statitics {
Feature feature;
int bytesCounted = 0;
int nodesCounted = 0;
int nodesCountedNonOverriden = 0;
int bytesCountedNonOverriden = 0;
public boolean isForFeature(Feature feature){
if(this.feature == null){
return true;
} else {
return this.feature.equals(feature);
}
}
@Override
public String toString() {
String result;
if(feature != null){
result = "Feature "+feature.getName()+"\n";
} else {
result = "Totals \n";
}
result += " Bytes (Non overriden/total): "+bytesCountedNonOverriden+" / " +bytesCounted+"\n" +
" Nodes (Non overriden/total): "+nodesCountedNonOverriden+" / " +nodesCounted;
return result;
}
}
public void setActivePart(IAction action, IWorkbenchPart targetPart) {
shell = targetPart.getSite().getShell();
}
public void run(IAction action) {
try {
FeaturesConfigurationUtil.clean();
List<Statitics> doStatitics = doStatitics(new NullProgressMonitor());
StringBuilder result = new StringBuilder();
for (Statitics statitics : doStatitics) {
result.append(statitics);
result.append("\n");
}
MessageDialog.openInformation(shell, "Statitics", result.toString());
} catch (Exception e) {
MessageDialog.openError(shell, "Erro", e.getMessage());
}
}
private List<Statitics> doStatitics(final IProgressMonitor monitor) throws CoreException {
final List<Statitics> statiticsList = new ArrayList<StatisticsAction.Statitics>();
statiticsList.add(new Statitics());//adicionar uma estatistica para o conjunto geral
final IFeaturesManager featuresManager = FeaturesConfigurationUtil.getFeaturesManager(project.getProject());
Set<Feature> features;
try {
features = featuresManager.getFeatures();
} catch (IOException e1) {
throw new RuntimeException(e1);
}
for (Feature feature : features) {
//para cada feature.. gerar uma estatistica
Statitics s = new Statitics();
s.feature = feature;
statiticsList.add(s);
}
project.getProject().accept(new IResourceVisitor() {
public boolean visit(IResource resource) throws CoreException {
if(resource instanceof IFolder || resource instanceof IProject){
return true;
}
if(resource.getName().endsWith("feat") && !resource.getName().equals(FeaturesConfigurationUtil.FEATURES_FILE)){
IPath path = resource.getProjectRelativePath().removeFileExtension().addFileExtension("java");
IFile file = (IFile) project.getProject().findMember(path);
if(file != null && file.exists()){
//System.out.println(file);
IJavaElement java = JavaCore.create(file, project);
if(java instanceof ICompilationUnit){
try {
ICompilationUnitFeaturesManager manager = featuresManager.getManagerForFile((ICompilationUnit)java);
for (Statitics statitics : statiticsList) {
//gerar todas as estatisticas para o compilationUnit
statitics.bytesCounted += countBytes(manager, statitics);
statitics.nodesCounted += countNodes(manager, statitics);
statitics.bytesCountedNonOverriden += countBytesNonOverriden(manager, statitics);
statitics.nodesCountedNonOverriden += countNodesNonOverriden(manager, statitics);
}
} catch (Exception e) {
throw new RuntimeException(e);
}
} else {
throw new RuntimeException("No java element found for "+file);
}
}
//FeaturesConfigurationUtil.getFeaturesManager(project.getProject()).getManagerForFile(file)
//statitics.bytesCounted += countBytes(file.getContents());
}
return false;
}
});
return statiticsList;
}
private int countNodesNonOverriden(ICompilationUnitFeaturesManager manager, Statitics statitics) {
return countNodes(manager, getNonOverridenNodeReferences(manager), statitics);
}
private int countBytesNonOverriden(ICompilationUnitFeaturesManager manager, Statitics statitics) {
return countBytes(manager, getNonOverridenNodeReferences(manager), statitics);
}
private Set<ASTNodeReference> getNonOverridenNodeReferences(ICompilationUnitFeaturesManager manager) {
Set<ASTNodeReference> nodeReferences = copy(manager.getNodeReferences());
for (Iterator<ASTNodeReference> iterator = nodeReferences.iterator(); iterator.hasNext();) {
ASTNodeReference astNodeReference = iterator.next();
for (ASTNodeReference astNodeReference2 : nodeReferences) {
if(astNodeReference.isChild(astNodeReference2)){
iterator.remove();
break;
}
}
}
return nodeReferences;
}
private Set<ASTNodeReference> copy(Set<ASTNodeReference> nodeReferences) {
Set<ASTNodeReference> set = new HashSet<ASTNodeReference>();
set.addAll(nodeReferences);
return set;
}
private int countNodes(ICompilationUnitFeaturesManager manager, Statitics statitics) {
return countNodes(manager, manager.getNodeReferences(), statitics);
}
private int countNodes(ICompilationUnitFeaturesManager manager, Set<ASTNodeReference> nodeReferences, Statitics statitics) {
int count = 0;
for (ASTNodeReference astNodeReference : nodeReferences) {
Set<Feature> features = manager.getFeatures(astNodeReference);
for (Feature feature : features) {
if(statitics.isForFeature(feature)){
//se as estatiticas que estao sendo calculadas, s�o para determinada feature, aplicar o valor e passar para o proximo n�
count += 1;
break;
}
}
}
return count;
}
private int countBytes(ICompilationUnitFeaturesManager manager, Statitics statitics) {
return countBytes(manager, manager.getNodeReferences(), statitics);
}
private int countBytes(ICompilationUnitFeaturesManager manager, Set<ASTNodeReference> nodeReferences, Statitics statitics) {
int count = 0;
for (ASTNodeReference astNodeReference : nodeReferences) {
Set<Feature> features = manager.getFeatures(astNodeReference);
for (Feature feature : features) {
if(statitics.isForFeature(feature)){
//se as estatiticas que estao sendo calculadas, s�o para determinada feature, aplicar o valor e passar para o proximo n�
count += astNodeReference.getByteCount();
break;
}
}
}
return count;
}
public void selectionChanged(IAction action, ISelection selection) {
if(selection instanceof IJavaProject){
project = (IJavaProject) selection;
} else if (selection instanceof IStructuredSelection){
project = (IJavaProject) ((IStructuredSelection)selection).getFirstElement();
}
}
}