• # Distribution

    Posté par . En réponse au lien Java sur le bureau: parce que les webapps, ça va bien 5 minutes. Évalué à 4.

    Pour mon expérience, le dernier article (sur la distribution) était le plus intéressant.

    Notamment :

    Distributing applications on a couple of computers inside the same company is not an issue. A lot of products are available for automating the pushing of files onto computers. Issues might start to appear when you need to coordinate the deployment across different physical sites.

    Je ne suis pas tout à fait d'accord. Je travaille dans une petite équipe, plutôt indépendante, faisant partie d'un gros groupe, avec sa politique de distribution de logiciels. Nous, on fait les nôtres, sur le côté. C'est volontaire, et assumé, on est un peu électrons libres transversaux, pour mettre de l'huile dans les rouages quand il faut. Et bien sûr, il n'en faut pas trop non plus.

    Bref, donc on doit distribuer des logiciels. Et s'intégrer à « l'AppStore » du groupe, c'est difficile, voir pas désirable du tout, car nos logiciels ne doivent pas être installés par tout le monde.

    Pendant 10 ans (!), j'ai développé et maintenu deux applications Java/Swing, déployé avec JavaWebStart. J'ai trouvé plein de limites à Swing, et j'ai dû hacker des composants (faire de la pseudo-réflexivité dessus) pour arriver à mes fins. Par exemple, pour que le menu déroulant d'une combobox ne soit pas limité en largeur à la taille de la combobox, mais affiche le maximum d'informations :

    import java.awt.BorderLayout;
    import java.awt.Component;
    import java.awt.Dimension;
    import java.awt.Insets;
    import javax.swing.JComboBox;
    import javax.swing.JList;
    import javax.swing.ListModel;
    import javax.swing.event.PopupMenuEvent;
    import javax.swing.event.PopupMenuListener;
    import javax.swing.plaf.basic.BasicComboPopup;
    /**
     * This is a workaround for the combobox popup, whose width is equal to the component width.
     * To display very large content, it's really annoying, so this listener resize the popup if necessary.
     */
    public class ComboBoxPopupResizerListener implements PopupMenuListener {
     private final JComboBox<?> comboBox;
     /**
     * Build the listener.
     * @param comboBox The combobox whose popup will be resized.
     */
     public ComboBoxPopupResizerListener(JComboBox<?> comboBox) {
     this.comboBox = comboBox;
     }
     @Override
     @SuppressWarnings("unchecked")
     public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
     // Copy paste from http://forum.java.sun.com/thread.jspa?threadID=522572&messageID=2501520
     BasicComboPopup popup = (BasicComboPopup) this.comboBox.getUI().getAccessibleChild(this.comboBox, 0);//Popup
     if (popup == null) {
     return;
     }
     int preferredWidth = (int) Math.max(this.comboBox.getPreferredSize().getWidth(), this.comboBox.getWidth());
     Component comp = popup.getComponent(0);//JScrollPane
     // Compute height by rendering the first element
     JList<Object> popupList = popup.getList();
     ListModel<Object> popupListModel = popupList.getModel();
     int modelSize = popupListModel.getSize();
     int height;
     if (modelSize > 0) {
     // Fetch the insets to add to the rendered component
     Insets insets = popup.getInsets();
     modelSize = Math.min(modelSize, this.comboBox.getMaximumRowCount());
     height = (int) popupList.getCellRenderer()
     .getListCellRendererComponent(popupList, popupListModel.getElementAt(0), 0, false, false)
     .getPreferredSize().getHeight() * modelSize
     + insets.bottom + insets.top;
     } else {
     height = (int) this.comboBox.getPreferredSize().getHeight();
     }
     popup.setPreferredSize(new Dimension(preferredWidth, height));
     popup.setLayout(new BorderLayout());
     popup.add(comp, BorderLayout.CENTER);
     }
     @Override
     public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
     }
     @Override
     public void popupMenuCanceled(PopupMenuEvent e) {
     }
    }

    C'est beau comme un camion avec des roues de vélo, mais je m'en suis servi partout.

    Ensuite JavaWebStart, c'est pas si beau et tout joli. C'est plein de bugs chiants, comme « tiens, je crois que le cache est pas à jour, mais faut lancer l'application deux fois pour que ça force la mise-à-jour, lalala ». On a dû plusieurs fois demander aux utilisateurs de supprimer le cache et de recommencer.
    La signature de l'application est compliquée aussi, mais ça, évidemment, c'est le problème de toute application. Le Web résout ça, en délégant cette partie au serveur, donc à l'administrateur système, et pas au développeur.

    Enfin, la sécurité des communications. En Swing, ben... on fait ce qu'on veut. C'est bien, mais il faut aussi réinventer la roue : transmission des informations via TLS, authentification, etc. En Web, c'est déjà dedans. Alors évidemment, quand on a besoin du TCP brut, ou pire, de l'UDP, c'est plus dur.

    Donc on est parti sur une réécriture en Web. Parce que ça marche, c'est « mature », ça se distribue facilement. Bien sûr, c'est pas tout rose. La multitude de frameworks est décourageante. La vitesse de dépréciation aussi. Mon application Swing, elle marche depuis 10 ans, même sur des ordinateurs récents. C'est solide, ça tient la route, ça se casse pas tout seul.

    Il y a beaucoup d'aspect des applications Web que je n'aime pas. C'est bloaté à mort, c'est souvent un gâchis de ressources monumentales. Pour beaucoup de choses, je préfère une application de bureau. Mais il ne faut pas renier pour autant les fabuleuses avancées de cette plateforme : le Web remplit beaucoup de cas d'utilisation aujourd'hui, pour la plus grande peine des utilisateurs de VisualBasic.