/***************************************************
*
* cismet GmbH, Saarbruecken, Germany
*
* ... and it just works.
*
****************************************************/
package de.cismet.cismap.commons.gui.featureinfowidget;
import org.apache.log4j.Logger;
import org.openide.util.Lookup;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import de.cismet.cismap.commons.LayerInfoProvider;
/**
* DOCUMENT ME!
*
* @author martin.scholl@cismet.de
* @version $Revision$, $Date$
*/
public final class FeatureInfoDisplayRepository {
//~ Static fields/initializers ---------------------------------------------
private static final transient Logger LOG = Logger.getLogger(FeatureInfoDisplayRepository.class);
//~ Instance fields --------------------------------------------------------
private final transient Map<FeatureInfoDisplayKey, FeatureInfoDisplay> repo;
//~ Constructors -----------------------------------------------------------
/**
* Creates a new FeatureInfoDisplayRepository object.
*/
public FeatureInfoDisplayRepository() {
final Lookup.Result<FeatureInfoDisplay> result = Lookup.getDefault().lookupResult(FeatureInfoDisplay.class);
final Collection<? extends FeatureInfoDisplay> instances = result.allInstances();
if (LOG.isDebugEnabled()) {
LOG.debug("found " + instances.size() + " instances of FeatureInfoDisplay"); // NOI18N
}
final Map<FeatureInfoDisplayKey, FeatureInfoDisplay> map =
new HashMap<FeatureInfoDisplayKey, FeatureInfoDisplay>(instances.size());
for (final FeatureInfoDisplay display : instances) {
if (LOG.isDebugEnabled()) {
LOG.debug("found entry: " + display.getDisplayKey() + " -> " + display.getClass()); // NOI18N
}
map.put(display.getDisplayKey(), display);
}
repo = Collections.unmodifiableMap(map);
}
//~ Methods ----------------------------------------------------------------
/**
* DOCUMENT ME!
*
* @param layerclass DOCUMENT ME!
* @param layerinfo DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public FeatureInfoDisplay getDisplay(final Class layerclass, final LayerInfoProvider layerinfo) {
final String server = layerinfo.getServerURI();
final String layer = layerinfo.getLayerURI();
FeatureInfoDisplay display = repo.get(new FeatureInfoDisplayKey(layerclass, server, layer));
if (display == null) {
display = repo.get(new FeatureInfoDisplayKey(layerclass, server, FeatureInfoDisplayKey.ANY_SERVER));
if (display == null) {
display = repo.get(new FeatureInfoDisplayKey(
layerclass,
FeatureInfoDisplayKey.ANY_SERVER,
FeatureInfoDisplayKey.ANY_SERVER));
if (display == null) {
if (LOG.isDebugEnabled()) {
LOG.debug("did not find any registered repo: layerclass: " + layerclass // NOI18N
+ " || layerinfo: " + layerinfo); // NOI18N
}
// TODO return null || infoDisplay || StandardInfoDisplay
}
}
}
try {
return display.getClass().newInstance();
} catch (final Exception ex) {
LOG.error("Cannot instantiate the required display class: " + display.getClass().getName() // NOI18N
+ ". The origin object will be used.", // NOI18N
ex);
return display;
}
}
}