package org.projectusus.ui.internal;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.projectusus.core.IUsusModelListener;
import org.projectusus.core.basis.CodeProportion;
import org.projectusus.core.statistics.UsusModelProvider;
public class AnalysisDisplayModel {
private static AnalysisDisplayModel instance;
private final Set<IDisplayModelListener> listeners;
private Snapshot snapshot = new Snapshot();
private IUsusModelListener listener;
private final DisplayCategories displayCategories;
public static AnalysisDisplayModel displayModel() {
if( instance == null ) {
instance = new AnalysisDisplayModel();
}
return instance;
}
private AnalysisDisplayModel() {
super();
listeners = new HashSet<IDisplayModelListener>();
displayCategories = new DisplayCategories();
initModelListener();
}
public Snapshot getSnapshot() {
return snapshot;
}
private void initModelListener() {
listener = new IUsusModelListener() {
public void ususModelChanged() {
handleUsusModelChanged();
}
};
UsusModelProvider.ususModel().addUsusModelListener( listener );
}
protected void handleUsusModelChanged() {
displayCategories.replaceCategories( createMetricsCategory() );
fireUpdateCategories();
}
public IDisplayCategory[] getCategories() {
return displayCategories.getCategories();
}
private MetricStatisticsCategory createMetricsCategory() {
List<CodeProportion> codeProportions = UsusModelProvider.ususModel().getCodeProportions();
List<AnalysisDisplayEntry> result = new ArrayList<AnalysisDisplayEntry>();
for( CodeProportion codeProportion : codeProportions ) {
result.add( displayEntryFor( codeProportion ) );
}
return new MetricStatisticsCategory( result.toArray( new AnalysisDisplayEntry[result.size()] ) );
}
private AnalysisDisplayEntry displayEntryFor( CodeProportion codeProportion ) {
displayCategories.getAllEntries();
for( AnalysisDisplayEntry entry : displayCategories.getAllEntries() ) {
if( entry.matches( codeProportion ) ) {
entry.setCodeProportion( codeProportion );
return entry;
}
}
return new AnalysisDisplayEntry( codeProportion );
}
public List<AnalysisDisplayEntry> getEntriesOfAllCategories() {
return displayCategories.getAllEntries();
}
public void createSnapshot() {
for( AnalysisDisplayEntry entry : getEntriesOfAllCategories() ) {
entry.createSnapshot();
}
snapshot = new Snapshot();
fireSnapshotCreated();
}
public void addModelListener( IDisplayModelListener listen ) {
listeners.add( listen );
}
public void removeModelListener( IDisplayModelListener listen ) {
listeners.remove( listen );
}
// internal
// ////////
private void fireUpdateCategories() {
for( IDisplayModelListener listen : listeners ) {
listen.updateCategories( this );
}
}
private void fireSnapshotCreated() {
for( IDisplayModelListener listen : listeners ) {
listen.snapshotCreated( snapshot );
listen.updateCategories( this );
}
}
}