package org.projectusus.core.statistics;
import static com.google.common.base.Predicates.equalTo;
import static com.google.common.collect.Collections2.transform;
import static com.google.common.collect.Iterables.getOnlyElement;
import static com.google.common.collect.Sets.filter;
import static com.google.common.collect.Sets.newHashSet;
import static org.projectusus.core.statistics.CockpitExtensionPref.ON_BY_DEFAULT;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;
import org.osgi.service.prefs.BackingStoreException;
import org.osgi.service.prefs.Preferences;
import org.projectusus.core.ExtensionCollector;
import org.projectusus.core.UsusCorePlugin;
import com.google.common.base.Function;
import com.google.common.base.Predicate;
public class RegisteredCockpitExtensionsCollector {
private static final String STATISTICS_EXTENSIONS = "statistics-extensions"; //$NON-NLS-1$
private static final String ENABLED = "enabled"; //$NON-NLS-1$
private static final Function<CockpitExtension, CockpitExtensionPref> toExtensionPref = new Function<CockpitExtension, CockpitExtensionPref>() {
public CockpitExtensionPref apply( CockpitExtension extension ) {
return new CockpitExtensionPref( extension.getClass().getName(), extension.getLabel() );
}
};
private RegisteredCockpitExtensionsCollector() {
super();
}
public static Set<CockpitExtension> getEnabled() {
final SortedSet<CockpitExtensionPref> allStates = getExtensionsStates();
return filter( allExtensions(), new Predicate<CockpitExtension>() {
public boolean apply( CockpitExtension extension ) {
return isEnabled( extension, allStates );
}
} );
}
private static boolean isEnabled( CockpitExtension extension, Set<CockpitExtensionPref> allStates ) {
CockpitExtensionPref extensionPref = findByClassName( allStates, extension.getClass().getName() );
return extensionPref == null ? ON_BY_DEFAULT : extensionPref.isOn();
}
public static Set<CockpitExtension> allExtensions() {
return new ExtensionCollector<CockpitExtension>( CockpitExtension.EXTENSION_POINT_ID ).allExtensions();
}
private static Set<CockpitExtensionPref> getAllPresentExtensions() {
return newHashSet( transform( allExtensions(), toExtensionPref ) );
}
public static SortedSet<CockpitExtensionPref> getExtensionsStates() {
Set<CockpitExtensionPref> extensions = getAllPresentExtensions();
Set<CockpitExtensionPref> known = getAllKnownExtensions();
for( CockpitExtensionPref extension : extensions ) {
CockpitExtensionPref pref = findByClassName( known, extension.getClassName() );
if( pref != null ) {
extension.setOn( pref.isOn() );
}
}
return sort( extensions );
}
private static CockpitExtensionPref findByClassName( Set<CockpitExtensionPref> extensions, String className ) {
Set<CockpitExtensionPref> filtered = filter( extensions, equalTo( new CockpitExtensionPref( className, ON_BY_DEFAULT ) ) );
return getOnlyElement( filtered, null );
}
private static SortedSet<CockpitExtensionPref> sort( Set<CockpitExtensionPref> extensions ) {
TreeSet<CockpitExtensionPref> sorted = new TreeSet<CockpitExtensionPref>( new CockpitExtensionPrefComparator() );
sorted.addAll( extensions );
return sorted;
}
private static Set<CockpitExtensionPref> getAllKnownExtensions() {
Set<CockpitExtensionPref> known = newHashSet();
Preferences preferences = loadPreferences();
for( String className : childrenNames( preferences ) ) {
Preferences node = preferences.node( className );
boolean on = node.getBoolean( ENABLED, ON_BY_DEFAULT );
known.add( new CockpitExtensionPref( className, on ) );
}
return known;
}
private static Preferences loadPreferences() {
return UsusCorePlugin.getDefault().getPreferences().node( STATISTICS_EXTENSIONS );
}
public static void saveExtensionsStates( Set<CockpitExtensionPref> states ) {
Preferences preferences = loadPreferences();
for( String string : childrenNames( preferences ) ) {
preferences.remove( string );
}
for( CockpitExtensionPref extensionPref : states ) {
Preferences node = preferences.node( extensionPref.getClassName() );
node.putBoolean( ENABLED, extensionPref.isOn() );
}
}
private static String[] childrenNames( Preferences extensions ) {
try {
return extensions.childrenNames();
} catch( BackingStoreException exception ) {
log( exception );
return new String[0];
}
}
private static void log( Throwable throwable ) {
UsusCorePlugin.log( throwable );
}
}