/*!
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software
* Foundation.
*
* You should have received a copy of the GNU Lesser General Public License along with this
* program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
* or from the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU Lesser General Public License for more details.
*
* Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved.
*/
package org.pentaho.reporting.designer.core.versionchecker;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.pentaho.reporting.designer.core.settings.WorkspaceSettings;
import org.pentaho.versionchecker.BasicVersionCheckerProvider;
import org.pentaho.versionchecker.IVersionCheckErrorHandler;
import org.pentaho.versionchecker.IVersionCheckResultHandler;
import org.pentaho.versionchecker.VersionChecker;
import javax.swing.*;
import java.awt.*;
import java.io.ByteArrayInputStream;
import java.util.ArrayList;
import java.util.List;
public class VersionCheckerUtility {
private static final Log logger = LogFactory.getLog( VersionCheckerUtility.class );
private VersionCheckerUtility() {
}
public static void handlerVersionCheck( final Frame parent ) {
if ( VersionCheckerUtility.isInitialCheck() ) {
VersionCheckerUtility.setCheckVersion( VersionCheckerUtility.getUserApprovalForVersionChecker( parent ) );
}
if ( VersionCheckerUtility.getCheckVersion() ) {
VersionCheckerUtility.checkVersion( parent, false, true );
}
}
private static void setCheckVersion( final boolean checkVersion ) {
WorkspaceSettings.getInstance().setUseVersionChecker( checkVersion );
}
private static boolean isInitialCheck() {
return WorkspaceSettings.getInstance().isInitialVersionCheck();
}
private static boolean getCheckVersion() {
return WorkspaceSettings.getInstance().isUseVersionChecker();
}
private static boolean getUserApprovalForVersionChecker( final Frame owner ) {
final VersionCheckerEnableDialog dialog = new VersionCheckerEnableDialog( owner );
return dialog.performEdit();
}
public static void checkVersion( final Component parent, final boolean forcePrompt, final boolean exitOnLaunch ) {
final BasicVersionCheckerProvider dataProvider = new BasicVersionCheckerProvider( VersionCheckerUtility.class );
final boolean gaOnly = !WorkspaceSettings.getInstance().isNotifyForAllBuilds();
if ( gaOnly ) {
dataProvider.setVersionRequestFlags( BasicVersionCheckerProvider.DEPTH_GA_MASK );
} else {
dataProvider.setVersionRequestFlags( BasicVersionCheckerProvider.DEPTH_ALL_MASK );
}
final VersionChecker vc = new VersionChecker();
vc.setDataProvider( dataProvider );
vc.addResultHandler( new InternalResultHandler( parent, forcePrompt, exitOnLaunch ) );
vc.addErrorHandler( new NoPromptErrorHandler() );
// start new thread; do not run in event thread
final Thread vcThread = new Thread( new VersionCheckerRunnable( vc ) );
vcThread.setDaemon( true );
vcThread.start();
}
private static class VersionCheckerRunnable implements Runnable {
private VersionChecker vc;
public VersionCheckerRunnable( final VersionChecker vc ) {
if ( vc == null ) {
throw new NullPointerException();
}
this.vc = vc;
}
public void run() {
vc.performCheck( false );
}
}
private static class InternalResultHandler implements IVersionCheckResultHandler {
private Component parent;
private final boolean forcePrompt;
private final boolean exitOnLaunch;
protected InternalResultHandler( final Component parent, final boolean forcePrompt, final boolean exitOnLaunch ) {
this.parent = parent;
this.forcePrompt = forcePrompt;
this.exitOnLaunch = exitOnLaunch;
}
public void processResults( final String result ) {
try {
final SAXReader reader = new SAXReader();
final Document templateDoc = reader.read( new ByteArrayInputStream( result.getBytes() ) );
final List<UpdateInfo> updates = new ArrayList<UpdateInfo>();
final List updateElements = templateDoc.getRootElement().selectNodes( "/vercheck/product/update" );//NON-NLS
for ( int i = 0; i < updateElements.size(); i++ ) {
final Element updateElement = (Element) updateElements.get( i );
final String version = updateElement.attributeValue( "version" );//NON-NLS
final String type = updateElement.attributeValue( "type" );//NON-NLS
//final String os = updateElement.attributeValue("os");
final String downloadUrl = updateElement.selectSingleNode( "downloadurl" ).getText();//NON-NLS
final UpdateInfo info = new UpdateInfo( version, type, downloadUrl );
updates.add( info );
}
if ( updates.isEmpty() ) {
if ( forcePrompt ) {
JOptionPane.showMessageDialog( parent,
"No update is available at this time.", "Version Update Info",
JOptionPane.INFORMATION_MESSAGE );
}
return;
}
if ( ( forcePrompt ||
!updates.get( updates.size() - 1 ).getVersion().equals(
WorkspaceSettings.getInstance().getLastPromptedVersionUpdate() ) ) ) {
final UpdateInfo[] updateInfos = updates.toArray( new UpdateInfo[ updates.size() ] );
VersionConfirmationDialog.performUpdateAvailable( parent, updateInfos, exitOnLaunch );
}
} catch ( Exception e ) {
// we cannot give errors
logger.error( "The version checker encountered an error", e );
JOptionPane.showMessageDialog( parent,
"No update is available at this time.", "Version Update Info",
JOptionPane.INFORMATION_MESSAGE );
}
}
}
private static class NoPromptErrorHandler implements IVersionCheckErrorHandler {
public void handleException( final Exception e ) {
// Disable the logging via the configuration.
logger.error( "The version checker encountered an error", e );
}
}
}