// 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.statistics;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.ISafeRunnable;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.SafeRunner;
import org.projectusus.core.IMetricsResultVisitor;
import org.projectusus.core.IMetricsWriter;
import org.projectusus.core.IUsusModel;
import org.projectusus.core.IUsusModelForAdapter;
import org.projectusus.core.IUsusModelListener;
import org.projectusus.core.UsusCorePlugin;
import org.projectusus.core.basis.CodeProportion;
import org.projectusus.core.filerelations.model.ASTNodeHelper;
import org.projectusus.core.filerelations.model.ClassDescriptor;
import org.projectusus.core.filerelations.model.ClassDescriptorCleanup;
import org.projectusus.core.filerelations.model.Packagename;
import org.projectusus.core.internal.proportions.model.UsusModelCache;
import org.projectusus.core.internal.proportions.rawdata.MetricsAccessor;
class UsusModel implements IUsusModel, IUsusModelForAdapter {
private static UsusModel instance = new UsusModel( new ASTNodeHelper() );
private final Set<IUsusModelListener> listeners;
private UsusModelCache cache;
private final MetricsAccessor metrics;
private boolean needsFullRecompute;
public static UsusModel ususModel() {
return instance;
}
private UsusModel( ASTNodeHelper converter ) {
cache = new UsusModelCache();
listeners = new HashSet<IUsusModelListener>();
metrics = new MetricsAccessor( converter );
needsFullRecompute = true;
}
// //////////////////////////////////
public void refreshCodeProportions() {
updateAfterComputationRun( true, new NullProgressMonitor() );
}
public void updateAfterComputationRun( boolean computationSuccessful, IProgressMonitor monitor ) {
needsFullRecompute = !computationSuccessful;
metrics.cleanupRelations( monitor );
runStatisticsExtensions();
notifyListeners();
}
private void runStatisticsExtensions() {
cache = new UsusModelCache();
for( final CockpitExtension cockpitExtension : RegisteredCockpitExtensionsCollector.getEnabled() ) {
ISafeRunnable runnable = new ISafeRunnable() {
public void handleException( Throwable exception ) {
UsusCorePlugin.log( exception );
}
public void run() throws Exception {
cockpitExtension.visit();
cache.refresh( cockpitExtension.getCodeProportion() );
}
};
SafeRunner.run( runnable );
}
}
public void dropRawData( IProject project ) {
metrics.dropRawData( project );
}
public void dropRawData( IFile file ) {
metrics.dropRawData( file );
}
public void acceptAndGuide( IMetricsResultVisitor visitor ) {
metrics.acceptAndGuide( visitor );
}
public IMetricsWriter getMetricsWriter() {
return metrics;
}
// interface of IUsusModel
// ////////////////////////
public List<CodeProportion> getCodeProportions() {
return cache.getEntries();
}
// //////////////////////////////////
public void addUsusModelListener( IUsusModelListener listener ) {
listeners.add( listener );
}
public void removeUsusModelListener( IUsusModelListener listener ) {
listeners.remove( listener );
}
// internal
// ////////
private void notifyListeners() {
for( IUsusModelListener listener : listeners ) {
listener.ususModelChanged();
}
}
public boolean needsFullRecompute() {
return needsFullRecompute;
}
public static void clear( ASTNodeHelper converter ) {
instance = new UsusModel( converter );
ClassDescriptor.clear();
ClassDescriptorCleanup.clear();
Packagename.clear();
}
public void aboutToStartFullRecompute() {
needsFullRecompute = false;
}
}