/***************************************************
*
* cismet GmbH, Saarbruecken, Germany
*
* ... and it just works.
*
****************************************************/
/*
* AbstractFeatureInfoDisplay.java
*
* Created on 5. April 2006, 15:42
*/
package de.cismet.cismap.commons.gui.featureinfowidget.displays;
import calpa.html.CalCons;
import calpa.html.CalHTMLPane;
import calpa.html.CalHTMLPreferences;
import calpa.html.DefaultCalHTMLObserver;
import org.apache.log4j.Logger;
import org.openide.util.Exceptions;
import org.openide.util.lookup.ServiceProvider;
import java.applet.AppletContext;
import java.awt.BorderLayout;
import java.awt.ComponentOrientation;
import java.awt.EventQueue;
import java.awt.Image;
import java.awt.event.MouseEvent;
import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.net.MalformedURLException;
import java.net.URL;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JTabbedPane;
import javax.swing.SwingWorker;
import javax.swing.event.HyperlinkEvent;
import javax.swing.event.HyperlinkListener;
import de.cismet.cismap.commons.gui.featureinfowidget.AbstractFeatureInfoDisplay;
import de.cismet.cismap.commons.gui.featureinfowidget.FeatureInfoDisplay;
import de.cismet.cismap.commons.gui.featureinfowidget.FeatureInfoDisplayKey;
import de.cismet.cismap.commons.interaction.CismapBroker;
import de.cismet.cismap.commons.interaction.events.MapClickedEvent;
import de.cismet.cismap.commons.raster.wms.WMSLayer;
import de.cismet.cismap.commons.retrieval.RetrievalEvent;
import de.cismet.cismap.commons.retrieval.RetrievalListener;
import de.cismet.cismap.commons.retrieval.UniversalRetrieval;
import de.cismet.commons.security.AccessHandler;
import de.cismet.commons.security.AccessHandler.ACCESS_METHODS;
import de.cismet.security.WebAccessManager;
import de.cismet.security.handler.WSSAccessHandler;
import de.cismet.tools.gui.FXWebViewPanel;
/**
* DOCUMENT ME!
*
* @author thorsten.hell@cismet.de
* @version $Revision$, $Date$
*/
@ServiceProvider(service = FeatureInfoDisplay.class)
public class OGCWMSGetFeatureInfoRequestHtmlDisplay extends AbstractFeatureInfoDisplay<WMSLayer>
implements RetrievalListener,
HyperlinkListener {
//~ Static fields/initializers ---------------------------------------------
private static final Logger LOG = Logger.getLogger(OGCWMSGetFeatureInfoRequestHtmlDisplay.class);
//~ Instance fields --------------------------------------------------------
WMSLayer wmsLayer = null;
UniversalRetrieval ur = null;
private final Icon icoProgress = new ImageIcon(getClass().getResource(
"/de/cismet/cismap/commons/gui/featureinfowidget/res/progress.png")); // NOI18N
private final Icon icoProgress64 = new ImageIcon(getClass().getResource(
"/de/cismet/cismap/commons/gui/featureinfowidget/res/progress64.png")); // NOI18N
private final Icon icoInfo = new ImageIcon(getClass().getResource(
"/de/cismet/cismap/commons/gui/featureinfowidget/res/info.png")); // NOI18N
private final DefaultCalHTMLObserver htmlObserver = new DefaultCalHTMLObserver() {
@Override
public void statusUpdate(final CalHTMLPane calHTMLPane,
final int i,
final URL uRL,
final int i0,
final String string) {
super.statusUpdate(calHTMLPane, i, uRL, i0, string);
if (LOG.isDebugEnabled()) {
LOG.debug("StatusUpdate" + i + uRL); // NOI18N
}
}
@Override
public void linkActivatedUpdate(final CalHTMLPane calHTMLPane,
final URL uRL,
final String string,
final String string0) {
super.linkActivatedUpdate(calHTMLPane, uRL, string, string0);
}
@Override
public void linkFocusedUpdate(final CalHTMLPane calHTMLPane, final URL uRL) {
super.linkFocusedUpdate(calHTMLPane, uRL);
}
};
private calpa.html.CalHTMLPane calpaHtmlPane;
private final CalHTMLPreferences htmlPrefs;
private AppletContext appletContext;
private boolean shiftDown;
private JTabbedPane tabbedparent;
private String urlBuffer;
private SwingWorker currentWorker;
private FXPanelWrapper fxBrowserPanel;
private boolean fxIniterror = false;
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton cmdOpenExternal;
private javax.swing.JTextPane htmlPane_;
private javax.swing.JPanel pnlWebView;
private javax.swing.JToolBar tbRight;
// End of variables declaration//GEN-END:variables
//~ Constructors -----------------------------------------------------------
/**
* Creates new form AbstractFeatureInfoDisplay.
*/
public OGCWMSGetFeatureInfoRequestHtmlDisplay() {
super(new FeatureInfoDisplayKey(
WMSLayer.class,
FeatureInfoDisplayKey.ANY_SERVER,
FeatureInfoDisplayKey.ANY_LAYER));
htmlPrefs = new CalHTMLPreferences();
htmlPrefs.setAutomaticallyFollowHyperlinks(false);
htmlPrefs.setHandleFormSubmission(false);
htmlPrefs.setOptimizeDisplay(CalCons.OPTIMIZE_ALL);
htmlPrefs.setDisplayErrorDialogs(false);
htmlPrefs.setLoadImages(true);
initComponents();
/*
*If something wents wrong with the initialistion of the JavaFX WebView we fall back to calpa to ensure backward
* compatibilty
*/
try {
if (System.getProperty("java.version").startsWith("1.6")) {
fxIniterror = true;
initCalpaAsFallback();
} else {
fxBrowserPanel = new FXPanelWrapper();
pnlWebView.add(fxBrowserPanel, BorderLayout.CENTER);
}
} catch (Error e) {
fxIniterror = true;
LOG.warn("Error initialising JavaFX WebView. Using Calpa as Fallback", e);
initCalpaAsFallback();
} catch (Exception ex) {
fxIniterror = true;
LOG.warn("Excpetion initialising JavaFX WebView. Using Calpa as Fallback", ex);
initCalpaAsFallback();
}
}
//~ Methods ----------------------------------------------------------------
/**
* DOCUMENT ME!
*/
private void initCalpaAsFallback() {
calpaHtmlPane = new CalHTMLPane(htmlPrefs, htmlObserver, "cismap");
pnlWebView.removeAll();
pnlWebView.add(calpaHtmlPane, BorderLayout.CENTER);
}
@Override
public void init(final WMSLayer layer, final JTabbedPane parentTabbedPane) {
this.wmsLayer = layer;
this.tabbedparent = parentTabbedPane;
}
@Override
public void showFeatureInfo(final MapClickedEvent mce) {
showContent((int)mce.getX(), (int)mce.getY());
}
/**
* DOCUMENT ME!
*
* @param x DOCUMENT ME!
* @param y DOCUMENT ME!
*/
private void showContent(final int x, final int y) {
final String url = wmsLayer.getParentServiceLayer().getGetFeatureInfoUrl(x, y, wmsLayer);
if (LOG.isDebugEnabled()) {
LOG.debug("showContet of " + url); // NOI18N
}
urlBuffer = url;
if ((currentWorker != null) && !currentWorker.isCancelled()) {
currentWorker.cancel(true);
}
if (LOG.isDebugEnabled()) {
LOG.debug("before FeatureInfoRetriever creation"); // NOI18N
}
currentWorker = new FeatureInfoRetriever(url);
if (LOG.isDebugEnabled()) {
LOG.debug("afterFeatureInfoCreation"); // NOI18N
}
CismapBroker.getInstance().execute(currentWorker);
}
@Override
public void retrievalStarted(final RetrievalEvent e) {
}
@Override
public void retrievalProgress(final RetrievalEvent e) {
}
@Override
public void retrievalError(final RetrievalEvent e) {
}
@Override
public void retrievalComplete(final RetrievalEvent e) {
if (tabbedparent != null) {
tabbedparent.setIconAt(tabbedparent.indexOfComponent(this), icoInfo);
}
if (e.getRetrievedObject() instanceof String) {
if (fxIniterror) {
calpaHtmlPane.showHTMLDocument(e.getRetrievedObject().toString());
} else {
try {
fxBrowserPanel.getJfxPanel().loadContent(e.getRetrievedObject().toString());
} catch (final Exception loadContentEx) {
LOG.error("Problem during loadContent of fxBrowserPanel.getJfxPanel():" + loadContentEx);
}
}
if (LOG.isDebugEnabled()) {
LOG.debug("String:" + e.getRetrievedObject().toString()); // NOI18N
}
} else if (e.getRetrievedObject() instanceof Image) {
if (LOG.isDebugEnabled()) {
LOG.debug("Image:" + e.getRetrievedObject()); // NOI18N
}
}
}
@Override
public void retrievalAborted(final RetrievalEvent e) {
}
/**
* Called when a hypertext link is updated.
*
* @param event e the event responsible for the update
*/
@Override
public void hyperlinkUpdate(final HyperlinkEvent event) {
if (LOG.isDebugEnabled()) {
LOG.debug("hyperlinkUpdate: " + event); // NOI18N
}
if (event.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {
if (shiftDown) {
openUrlInExternalBrowser(event.getURL().toExternalForm());
} else {
final UniversalRetrieval ur = new UniversalRetrieval(event.getURL().toExternalForm());
ur.addRetrievalListener(this);
ur.retrieve(false);
}
}
}
/**
* DOCUMENT ME!
*
* @param url DOCUMENT ME!
*/
private void openUrlInExternalBrowser(final String url) {
try {
if (appletContext == null) {
de.cismet.tools.BrowserLauncher.openURL(url);
} else {
final java.net.URL u = new java.net.URL(url);
appletContext.showDocument(u, "cismetBrowser"); // NOI18N
}
} catch (final Exception e) {
LOG.warn("Error while opening: " + url + ".\nNew try.", e); // NOI18N
// Nochmal zur Sicherheit mit dem BrowserLauncher probieren
try {
de.cismet.tools.BrowserLauncher.openURL(url);
} catch (final Exception e2) {
LOG.warn("Second try also failed. Error while opening: " + url + "\nLast try.", e2); // NOI18N
try {
de.cismet.tools.BrowserLauncher.openURL("file://" + url); // NOI18N
} catch (final Exception e3) {
LOG.error("Third try also failed. Error while opening: file://" + url, e3); // NOI18N
}
}
}
}
/**
* This method is called from within the constructor to initialize the form. WARNING: Do NOT modify this code. The
* content of this method is always regenerated by the Form Editor.
*/
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
htmlPane_ = new javax.swing.JTextPane();
tbRight = new javax.swing.JToolBar();
tbRight.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
cmdOpenExternal = new javax.swing.JButton();
pnlWebView = new javax.swing.JPanel();
htmlPane_.setEditable(false);
htmlPane_.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
@Override
public void mouseMoved(final java.awt.event.MouseEvent evt) {
htmlPane_MouseMoved(evt);
}
});
htmlPane_.addKeyListener(new java.awt.event.KeyAdapter() {
@Override
public void keyPressed(final java.awt.event.KeyEvent evt) {
htmlPane_KeyPressed(evt);
}
});
setLayout(new java.awt.BorderLayout());
tbRight.setFloatable(false);
cmdOpenExternal.setIcon(new javax.swing.ImageIcon(
getClass().getResource("/de/cismet/cismap/commons/gui/featureinfowidget/res/extWindow.png"))); // NOI18N
cmdOpenExternal.setText(org.openide.util.NbBundle.getMessage(
OGCWMSGetFeatureInfoRequestHtmlDisplay.class,
"OGCWMSGetFeatureInfoRequestHtmlDisplay.cmdOpenExternal.text")); // NOI18N
cmdOpenExternal.setToolTipText(org.openide.util.NbBundle.getMessage(
OGCWMSGetFeatureInfoRequestHtmlDisplay.class,
"OGCWMSGetFeatureInfoRequestHtmlDisplay.cmdOpenExternal.toolTipText")); // NOI18N
cmdOpenExternal.setBorderPainted(false);
cmdOpenExternal.addActionListener(new java.awt.event.ActionListener() {
@Override
public void actionPerformed(final java.awt.event.ActionEvent evt) {
cmdOpenExternalActionPerformed(evt);
}
});
tbRight.add(cmdOpenExternal);
add(tbRight, java.awt.BorderLayout.NORTH);
pnlWebView.setLayout(new java.awt.BorderLayout());
add(pnlWebView, java.awt.BorderLayout.CENTER);
} // </editor-fold>//GEN-END:initComponents
/**
* DOCUMENT ME!
*
* @param evt DOCUMENT ME!
*/
private void cmdOpenExternalActionPerformed(final java.awt.event.ActionEvent evt) { //GEN-FIRST:event_cmdOpenExternalActionPerformed
if (urlBuffer != null) {
try {
// ToDo muss in WebAccessManger
final AccessHandler handler = WebAccessManager.getInstance().getHandlerForURL(new URL(urlBuffer));
if (handler != null) {
if (handler instanceof WSSAccessHandler) {
if (LOG.isDebugEnabled()) {
LOG.debug("handler is wss handler --> creating wss get request"); // NOI18N
}
final String wssRequest = ((WSSAccessHandler)handler).createGetRequest(urlBuffer);
if (LOG.isDebugEnabled()) {
LOG.debug("created wss request: " + wssRequest); // NOI18N
}
openUrlInExternalBrowser(wssRequest);
return;
} else if (LOG.isDebugEnabled()) {
LOG.debug("No special handler --> default access via open URL"); // NOI18N
}
} else if (LOG.isDebugEnabled()) {
LOG.debug("no handler available for given url default access via openURL"); // NOI18N
}
openUrlInExternalBrowser(urlBuffer);
} catch (final Exception ex) {
LOG.error("Error while creating url for featureinfo", ex); // NOI18N
}
} else {
openUrlInExternalBrowser("http://www.cismet.de"); // NOI18N
}
} //GEN-LAST:event_cmdOpenExternalActionPerformed
/**
* DOCUMENT ME!
*
* @param evt DOCUMENT ME!
*/
private void htmlPane_MouseMoved(final java.awt.event.MouseEvent evt) { //GEN-FIRST:event_htmlPane_MouseMoved
shiftDown = (evt.getModifiers() & MouseEvent.SHIFT_MASK) == MouseEvent.SHIFT_MASK;
} //GEN-LAST:event_htmlPane_MouseMoved
/**
* DOCUMENT ME!
*
* @param evt DOCUMENT ME!
*/
private void htmlPane_KeyPressed(final java.awt.event.KeyEvent evt) { //GEN-FIRST:event_htmlPane_KeyPressed
} //GEN-LAST:event_htmlPane_KeyPressed
//~ Inner Classes ----------------------------------------------------------
/**
* DOCUMENT ME!
*
* @version $Revision$, $Date$
*/
class FeatureInfoRetriever extends SwingWorker<String, Void> {
//~ Instance fields ----------------------------------------------------
private String url;
//~ Constructors -------------------------------------------------------
/**
* Creates a new FeatureInfoRetriever object.
*
* @param url DOCUMENT ME!
*/
FeatureInfoRetriever(final String url) {
this.url = url;
}
//~ Methods ------------------------------------------------------------
@Override
protected String doInBackground() throws Exception {
if (LOG.isDebugEnabled()) {
LOG.debug("FeatureInfoRetriever started"); // NOI18N
}
try {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
if (tabbedparent != null) {
tabbedparent.setIconAt(
tabbedparent.indexOfComponent(OGCWMSGetFeatureInfoRequestHtmlDisplay.this),
icoProgress);
}
}
});
final URL baseUrl;
final String parameter;
if (url.indexOf('?') != -1) {
baseUrl = new URL(url.substring(0, url.indexOf('?')));
parameter = url.substring(url.indexOf('?') + 1, url.length());
} else {
baseUrl = new URL(url);
parameter = "";
}
if (isCancelled()) {
return null;
}
final BufferedInputStream in = new BufferedInputStream(WebAccessManager.getInstance().doRequest(
baseUrl,
parameter,
ACCESS_METHODS.GET_REQUEST));
if (isCancelled()) {
return null;
}
final ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
int c;
while ((c = in.read()) != -1) {
if (isCancelled()) {
return null;
}
byteArrayOut.write(c);
}
return byteArrayOut.toString();
} catch (final Exception ex) {
LOG.error("Error while fetching FeatureInfos", ex); // NOI18N
return null;
}
}
@Override
protected void done() {
super.done();
if (isCancelled()) {
LOG.warn("FeatureInfoRetriever was canceled"); // NOI18N
return;
}
try {
if (tabbedparent != null) {
tabbedparent.setIconAt(tabbedparent.indexOfComponent(OGCWMSGetFeatureInfoRequestHtmlDisplay.this),
icoInfo);
}
final String result = get();
// ToDo more generic it should be possible to display images
if (fxIniterror) {
calpaHtmlPane.showHTMLDocument(result);
} else {
fxBrowserPanel.getJfxPanel().loadContent(result);
}
if (LOG.isDebugEnabled()) {
LOG.debug("String:" + result); // NOI18N
}
} catch (final Exception ex) {
LOG.error("Error while processing data of FeatureInfoRetriever", ex); // NOI18N
return;
}
}
}
}