/*
* Copyright 2004-2010 Information & Software Engineering Group (188/1)
* Institute of Software Technology and Interactive Systems
* Vienna University of Technology, Austria
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.ifs.tuwien.ac.at/dm/somtoolbox/license.html
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package at.tuwien.ifs.somtoolbox.visualization;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.logging.Logger;
import org.apache.commons.lang.ArrayUtils;
import at.tuwien.ifs.somtoolbox.apps.viewer.MapPNode;
import at.tuwien.ifs.somtoolbox.data.SharedSOMVisualisationData;
import at.tuwien.ifs.somtoolbox.input.SOMInputReader;
import at.tuwien.ifs.somtoolbox.util.StringUtils;
import at.tuwien.ifs.somtoolbox.util.SubClassFinder;
/**
* @author Rudolf Mayer
* @version $Id: Visualizations.java 3738 2010-08-05 17:25:03Z mayer $
*/
public class Visualizations {
private static final String[] EXCLUDE_CLASSES = new String[] { "SmoothedCountHistograms",
"SearchResultHistogramVisualizer" };
public static BackgroundImageVisualizer[] singleton;
public static int maxVariants = 0;
private static Integer initFrom = null;
public static BackgroundImageVisualizer[] getAvailableVisualizations() {
if (singleton == null) {
ArrayList<BackgroundImageVisualizer> visClasses = new ArrayList<BackgroundImageVisualizer>();
ArrayList<String> visClassNames = new ArrayList<String>();
ArrayList<Class<? extends BackgroundImageVisualizer>> viss = SubClassFinder.findSubclassesOf(BackgroundImageVisualizer.class);
for (Class<? extends BackgroundImageVisualizer> vis : viss) {
// Ignore abstract classes and interfaces
if (Modifier.isAbstract(vis.getModifiers()) || Modifier.isInterface(vis.getModifiers())) {
continue;
}
// Ignore exclude classes
if (StringUtils.equalsAny(vis.getSimpleName(), EXCLUDE_CLASSES)) {
continue;
}
// Ignore 3D vis (without directly referencing them)
boolean is3DVis = false;
final Class<?>[] interfaces = vis.getInterfaces();
for (Class<?> i : interfaces) {
if (i.getSimpleName().equals("TerrainHeightGenerator")) {
is3DVis = true;
break;
}
}
if (is3DVis) {
continue;
}
try {
visClasses.add(vis.newInstance());
visClassNames.add(vis.getSimpleName());
} catch (Exception e) {
Logger.getLogger("at.tuwien.ifs.somtoolbox.visualization").severe(
"Error loading visualisation class : " + vis.getName());
e.printStackTrace();
}
}
if (visClasses.size() == 0) {
Logger.getLogger("at.tuwien.ifs.somtoolbox.visualization").severe(
"Did not find any matching visualisation classes. Aborting.");
System.exit(-1);
} else {
Logger.getLogger("at.tuwien.ifs.somtoolbox.visualization").info(
"Found " + visClasses.size() + " visualisation classes.");
}
singleton = visClasses.toArray(new BackgroundImageVisualizer[visClasses.size()]);
Arrays.sort(singleton);
Logger.getLogger("at.tuwien.ifs.somtoolbox.visualization").info(
"Registered total of " + singleton.length + " visualisations "
+ StringUtils.toString(visClassNames) + ".");
}
return singleton;
}
public static BackgroundImageVisualizer[] getReadyVisualizations() {
ArrayList<BackgroundImageVisualizer> vis = new ArrayList<BackgroundImageVisualizer>();
for (BackgroundImageVisualizer v : getAvailableVisualizations()) {
if (ArrayUtils.isEmpty(v.needsAdditionalFiles())) { // only take vis that have all files
vis.add(v);
// System.out.println("adding " + v);
} else {
// System.out.println("skipping " + v);
}
}
return vis.toArray(new BackgroundImageVisualizer[vis.size()]);
}
public static String[] getReadyVisualizationNames() {
BackgroundImageVisualizer[] readyVisualizations = getReadyVisualizations();
ArrayList<String> names = new ArrayList<String>(readyVisualizations.length * 2);
for (BackgroundImageVisualizer readyVisualization : readyVisualizations) {
BackgroundImageVisualizer vis = readyVisualization;
for (int j = 0; j < vis.getNumberOfVisualizations(); j++) {
names.add(readyVisualization.getVisualizationShortName(j));
}
}
return names.toArray(new String[names.size()]);
}
public static void initVisualizations(SharedSOMVisualisationData inputObjects, SOMInputReader reader,
int defaultPaletteIndex, Palette defaultPalette, Palette[] palettes) {
initVisualizations(inputObjects, reader, null);
}
/**
* Initialises all registered visualisation - sets the {@link SharedSOMVisualisationData} input objects, the
* {@link MapPNode} map, and default palettes.
*/
public static void initVisualizations(SharedSOMVisualisationData inputObjects, SOMInputReader reader, MapPNode map) {
// only initialise if we did not do it before, or if we have new data (indicated by a new hashcode of
// SharedSOMVisualisationData
if (inputObjects != null && initFrom != null && inputObjects.dataHashCode() == initFrom) {
Logger.getLogger("at.tuwien.ifs.somtoolbox.visualization").info(
"Not initialising visualisations again, provided data is still the same.");
return;
}
Logger.getLogger("at.tuwien.ifs.somtoolbox.visualization").info("Initialising visualisations...");
initFrom = inputObjects.dataHashCode();
maxVariants = 0;
BackgroundImageVisualizer[] visualizations = getAvailableVisualizations();
for (BackgroundImageVisualizer visualization : visualizations) {
visualization.setSOMData(reader);
visualization.setInputObjects(inputObjects);
visualization.setMap(map);
maxVariants = Math.max(maxVariants, visualization.getNumberOfVisualizations());
}
}
/**
* Tries to locate a visualisation by the given name.
*
* @param name the name of the visualisation.
* @return the visualisation matching the given name, or <code>null</code> otherwise.
*/
public static BackgroundImageVisualizerInstance getVisualizationByName(String name) {
BackgroundImageVisualizer[] availableVisualizations = getAvailableVisualizations();
for (BackgroundImageVisualizer vis : availableVisualizations) {
for (int j = 0; j < vis.getNumberOfVisualizations(); j++) {
if (vis.getVisualizationName(j).equals(name) || vis.getVisualizationShortName(j).equals(name)) {
return new BackgroundImageVisualizerInstance(vis, j);
}
}
}
return null;
}
public static String getVisualizationShortName(String longName) {
BackgroundImageVisualizerInstance vis = getVisualizationByName(longName);
return vis.getVis().getVisualizationShortName(vis.getVariant());
}
public static String[] getAvailableVisualizationNames() {
BackgroundImageVisualizer[] availableVisualizations = getAvailableVisualizations();
ArrayList<String> names = new ArrayList<String>(availableVisualizations.length * 2);
for (BackgroundImageVisualizer vis : availableVisualizations) {
for (int j = 0; j < vis.getNumberOfVisualizations(); j++) {
names.add(vis.getVisualizationName(j) + " (or " + vis.getVisualizationShortName(j) + " )");
}
}
return names.toArray(new String[names.size()]);
}
}