|
What this is
Other links
The source code/* * Sun Public License Notice * * The contents of this file are subject to the Sun Public License * Version 1.0 (the "License"). You may not use this file except in * compliance with the License. A copy of the License is available at * http://www.sun.com/ * * The Original Code is NetBeans. The Initial Developer of the Original * Code is Sun Microsystems, Inc. Portions Copyright 1997-2004 Sun * Microsystems, Inc. All Rights Reserved. */ package org.netbeans.modules.autoupdate; import java.io.File; import java.net.URL; import java.util.ArrayList; import java.util.Collection; import java.util.Date; import java.text.SimpleDateFormat; import java.text.ParsePosition; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import org.openide.ErrorManager; import org.w3c.dom.*; import org.xml.sax.*; import org.openide.util.*; /** Serves for building an UpdateCache from XML Document * @author Petr Hrebejk */ class XMLUpdates extends Updates { /** XML Element tag names */ private static final String TAG_MODULE_UPDATES = "module_updates"; // NOI18N private static final String TAG_MODULE = "module"; // NOI18N private static final String TAG_MODULE_GROUP = "module_group"; // NOI18N private static final String TAG_NOTIFICATION = "notification"; // NOI18N private static final String ATTR_NOTIFICATION_URL = "url"; // NOI18N private static final String TAG_ERROR = "error"; // NOI18N private static final String TAG_AUTH_ERROR = "auth_error"; // NOI18N private static final String TAG_OTHER_ERROR = "other_error"; // NOI18N private static final String ATTR_MESSAGE_ERROR = "message"; // NOI18N /** List of all modules */ private ArrayList modules; private HashMap checkOnceMore; /** The tree structure of Modules and Groups */ private ModuleGroup rootGroup; private int pError = NO_ERROR; private String errorMess = null; /** The timeStamp of downloaded xml */ private Date timeStamp = null; /** Text of the notification if any */ private String notificationText = null; /** URL of the notification if any */ private URL notificationURL = null; /** The URL of the document */ private URL xmlURL; /** The list of files in case of installing downloaded modules */ private File[] files; /** Temporary list of files to be installed as group */ private static ArrayList groupFiles = new ArrayList(); /** Is timer process to install group of selected files set? */ private static boolean timerSet = false; /** Does installation of group of selected files start? */ private static boolean groupStarted = false; private static int oldGroupSize = 0; /** The XML Document */ private Document document = null; private InputSource xmlInputSource = null; private AutoupdateType currentAT = null; /** Creates new Updates */ XMLUpdates(URL xmlURL) { this.xmlURL = xmlURL; } /** Create new Updates for files list - used * for installing downloaded modules */ XMLUpdates(File[] files) { this.files = files; } /** Start wizard for whole group of files requesting * installation at once. * Timer process is used to wait for all requests. */ static void startGroupUpdates( File file ) { if ( groupStarted ) new XMLUpdates( new File[]{ file } ).go(); else { groupFiles.add( file ); setTimer(); } } private static void setTimer() { if ( ! timerSet ) { timerSet = true; oldGroupSize = groupFiles.size(); org.openide.util.RequestProcessor.getDefault().post( new Runnable() { public void run() { if ( oldGroupSize < groupFiles.size() ) { oldGroupSize = groupFiles.size(); org.openide.util.RequestProcessor.getDefault().post( this, 500 ); } else { timerSet = false; groupStarted = true; File[] arrFiles = new File[ groupFiles.size() ]; Iterator it = groupFiles.iterator(); for ( int j = 0; it.hasNext(); j++ ) { File fn = (File)it.next(); if ( fn != null ) { arrFiles[j] = fn; } } groupFiles.clear(); groupStarted = false; new XMLUpdates( arrFiles ).go(); } } }, 500); } } private void go() { HashMap allUpdates = new HashMap(); allUpdates.put(this, this); Wizard wiz = Wizard.go( allUpdates, 1 ); if ( wiz != null ) { checkDownloadedModules(); wiz.refreshUpdatePanel(); } } /** Checks for updates in separate thread. Displays progress in a dialog */ public void checkUpdates( final Wizard.Validator validator ) { checkUpdates(validator, ""); // NOI18N } /** Checks for updates in separate thread. Displays progress in a dialog */ public void checkUpdates( final Wizard.Validator validator, String ucname ) { checkUpdates( validator, AutoupdateType.find( ucname ) ); } /** Checks for updates in separate thread. Displays progress in a dialog */ public void checkUpdates( final Wizard.Validator validator, final AutoupdateType at ) { currentAT = at; pError = NO_ERROR; checkCanceled = false; final java.awt.Dialog connDialog = ConnectingDialog.getDialog( at != null ? at.getName() : null ); Runnable task = new Runnable () { public void run() { try { parseDocument(); Settings.getShared().setLastCheck( new Date() ); if ( pError == NO_ERROR && document != null ) buildStructures(); else { if (pError == NO_ERROR) pError = UNKNOWN_ERROR; } //Settings.getShared().setLastStamp( getTimeStamp() ); validator.setValid( true ); int countOfAvailableModules = 0; if (getModules () != null) countOfAvailableModules = getModules ().size (); if (countOfAvailableModules == 0 && pError == NO_ERROR) { // wrong, display warning and don't forward errorMess = at.getName (); pError = NO_AVAILABLE_MODULES; } } catch (Exception x) { // bugfix #39049, check if a proxy is available pError = NO_NETWORK; ErrorManager.getDefault ().notify (ErrorManager.INFORMATIONAL, x); } finally { if (connDialog != null) { ConnectingDialog.closeDialog(connDialog); } } } }; Wizard.getRequestProcessor().post( task ); connDialog.show(); if (ConnectingDialog.isCanceled()) { cancelCheck(); } } public void cancelCheck() { checkCanceled = true; if ( xmlInputSource != null) { try { if (xmlInputSource.getByteStream() != null) xmlInputSource.getByteStream().close(); } catch (java.io.IOException e) { } } } /** Gets the root of the module/module group tree * @return The group in the root of the tree. */ public ModuleGroup getRootGroup() { return rootGroup; } /** Gets the linear structure of all module updates i.e. Collection */ public Collection getModules() { return modules; } /** Gets the state of pError the file was not parsed */ public boolean isError() { return ( pError > NO_ERROR ); } /** Gets the state of pError the file was not parsed */ public int getError() { return pError; } /** Gets the server error message if there is any */ public String getErrorMessage() { return errorMess; } /** Returns the time stamp of the downloaded XML file */ public Date getTimeStamp() { return timeStamp; } /** Returns notification text if specified otherwise null */ public String getNotificationText() { return notificationText; } /** Returns notification URL if specified otherwise null */ public URL getNotificationURL() { return notificationURL; } /** Builds structures for downloaded modules, the structures are onbly * linear */ void checkDownloadedModules() { modules = new ArrayList(); rootGroup = new ModuleGroup(); checkOnceMore = new HashMap(); for ( int i = 0; i < files.length; i++ ) { ModuleUpdate update = ModuleUpdate.getModuleUpdate( files[i] ); if ( update != null ) { if ( update.isUpdateAvailable() ) { modules.add( update ); rootGroup.addItem( update ); } else if ( update instanceof L10NUpdate ) { checkOnceMore.put( update, rootGroup ); } } } checkAvailablesOnceMore(); } void checkAvailablesOnceMore() { Iterator it = checkOnceMore.entrySet().iterator(); while ( it.hasNext() ) { Map.Entry entry = (Map.Entry) it.next(); L10NUpdate update = (L10NUpdate) entry.getKey(); if ( update.isRemoteModuleAvailable( modules ) ) { modules.add( update ); ( (ModuleGroup) entry.getValue() ).addItem( update ); } } } /** Calls static parsing method in XMLDataObject to parse the * document */ private void parseDocument() { if ( checkCanceled ) return; String showStr = System.getProperty("autoupdate.show.url"); // NOI18N if ( showStr != null && Boolean.valueOf( showStr ).booleanValue() ) System.out.println("URL : " + xmlURL ); // NOI18N try { java.net.HttpURLConnection.setFollowRedirects( true ); //document = XMLDataObject.parse( xmlURL, new ErrorCatcher() ); xmlInputSource = new InputSource( xmlURL.toExternalForm() ); if ( checkCanceled ) return; document = org.netbeans.updater.XMLUtil.parse( xmlInputSource, false, false, new ErrorCatcher(), org.netbeans.updater.XMLUtil.createAUResolver () ); } catch ( SAXException e ) { pError = PARSE_ERROR; showParseError(e); } catch ( java.io.IOException e ) { pError = NO_NETWORK; showParseError(e); } } private void showParseError(Throwable t) { ErrorManager.getDefault().annotate(t, ErrorManager.UNKNOWN, "URL: " + xmlURL, null, null, null); // NOI18N ErrorManager.getDefault().notify(ErrorManager.INFORMATIONAL, t); } /** Builds the linear and the tree structure of module updates. */ private void buildStructures() { if ( checkCanceled ) return; if ( document.getDocumentElement() == null ) { // System.out.println( "WARNING |
... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.