[freenet-cvs] r17770 - in trunk/apps/thingamablog/src/net/sf/thingamablog: blog gui/properties xml

dieppe at freenetproject.org dieppe at freenetproject.org
Sun Feb 10 03:51:07 UTC 2008


Author: dieppe
Date: 2008-02-10 03:51:06 +0000 (Sun, 10 Feb 2008)
New Revision: 17770

Modified:
   trunk/apps/thingamablog/src/net/sf/thingamablog/blog/TBWeblog.java
   trunk/apps/thingamablog/src/net/sf/thingamablog/gui/properties/TBGeneralPanel.java
   trunk/apps/thingamablog/src/net/sf/thingamablog/gui/properties/TBWizardDialog.java
   trunk/apps/thingamablog/src/net/sf/thingamablog/xml/TBPersistFactory.java
Log:
Update : same as the first patch, but clean.


Modified: trunk/apps/thingamablog/src/net/sf/thingamablog/blog/TBWeblog.java
===================================================================
--- trunk/apps/thingamablog/src/net/sf/thingamablog/blog/TBWeblog.java	2008-02-09 20:27:58 UTC (rev 17769)
+++ trunk/apps/thingamablog/src/net/sf/thingamablog/blog/TBWeblog.java	2008-02-10 03:51:06 UTC (rev 17770)
@@ -89,6 +89,9 @@
 	private String archivePath = basePath;
 	private String mediaPath = basePath;
 	
+        // Should be internet or freenet
+        private String type;
+        
 	//private Vector outdatedTopLevelPages = new Vector();
 	private Vector outdatedCategoryPages = new Vector();
 	private Vector outdatedArchivePages = new Vector();
@@ -114,9 +117,6 @@
 	private File homeDir;
 	private File tmplDir;
 	private File outputDir;
-
-        // Should be internet or freenet
-        private String type;
 	
 	
 	/**
@@ -1398,7 +1398,7 @@
     }
 
     public void setType(String type) {
-        this.type=type;
+        this.type = type;
     }
     
     public String getType() {

Modified: trunk/apps/thingamablog/src/net/sf/thingamablog/gui/properties/TBGeneralPanel.java
===================================================================
--- trunk/apps/thingamablog/src/net/sf/thingamablog/gui/properties/TBGeneralPanel.java	2008-02-09 20:27:58 UTC (rev 17769)
+++ trunk/apps/thingamablog/src/net/sf/thingamablog/gui/properties/TBGeneralPanel.java	2008-02-10 03:51:06 UTC (rev 17770)
@@ -30,277 +30,295 @@
 /**
  * @author Bob Tantlinger
  *
- *
- *
+ * 
+ * 
  */
-public class TBGeneralPanel extends PropertyPanel {
+public class TBGeneralPanel extends PropertyPanel
+{
     /**
-     *
+     * 
      */
     private static final long serialVersionUID = 1L;
-    
+
     private static final I18n i18n = I18n.getInstance("net.sf.thingamablog.gui.properties");
     
     private TBWeblog weblog;
+	
+	private JTextField titleField;
+	private JTextArea descrArea;
+	private JTextField basePathField;
+	private JTextField urlField;
+	private JTextField arcUrlField;
+	private JTextField mediaUrlField;
+	
+	private JComboBox localeCombo;
+	private JComboBox dateFormatCombo;
+	private JComboBox timeFormatCombo;
+        private JComboBox typeCombo;
+	
+	private static Locale LOCS[] = DateFormat.getAvailableLocales();
+        private static String TYPE[] = {"internet","freenet"};
+        
+	private String[] getDateFormats(Locale locale) {
+		String s = i18n.str("DateFormatOptions",locale);
+		return tokenize(s);
+	}
+	private String[] getTimeFormats(Locale locale) {
+		String s = i18n.str("TimeFormatOptions",locale);
+		return tokenize(s);
+	}
+	private String[] tokenize(String s) {
+		StringTokenizer st = new StringTokenizer(s,"|");
+		String[] formats = new String[st.countTokens()];
+		for (int i = 0; i < formats.length; i++) {
+			formats[i] = st.nextToken();
+		}
+		return formats;
+	}
+	/*
+	private static final String DATE_FORMATS[] =
+	{
+		"EEEE, MMMM dd, yyyy", //$NON-NLS-1$
+		"EEE, MMM dd, yyyy", //$NON-NLS-1$
+		"EEEE, dd MMMM, yyyy", //$NON-NLS-1$
+		"EEEE dd MMMM yyyy", //$NON-NLS-1$
+		"EEEE",
+		"MMMM dd, yyyy", //$NON-NLS-1$
+		"MMMM dd yyyy", //$NON-NLS-1$		
+    	
+		"MM/dd/yyyy",    		 //$NON-NLS-1$
+		"MM/dd/yy", //$NON-NLS-1$
+		"dd/MM/yyyy", //$NON-NLS-1$
+		"dd/MM/yy", //$NON-NLS-1$
+    	
+		"dd MMMM yyyy", //$NON-NLS-1$
+		"dd MMMM", //$NON-NLS-1$
+    	    	
+		"yyyy-MM-dd", //$NON-NLS-1$
+		"yy-MM-dd", //$NON-NLS-1$
+		"yy.MM.dd", //$NON-NLS-1$
+		"yyyy.MM.dd", //$NON-NLS-1$
+		"EEEE, MM/dd/yyyy", //$NON-NLS-1$
+		"EEE, MM/dd/yyyy" //$NON-NLS-1$
+	};
     
-    private JTextField titleField;
-    private JTextArea descrArea;
-    private JTextField basePathField;
-    private JTextField urlField;
-    private JTextField arcUrlField;
-    private JTextField mediaUrlField;
-    
-    private JComboBox localeCombo;
-    private JComboBox dateFormatCombo;
-    private JComboBox timeFormatCombo;
-    private JComboBox typeCombo;
-    
-    private static Locale LOCS[] = DateFormat.getAvailableLocales();
-    private static String TYPE[] = {"internet","freenet"};
-    
-    private String[] getDateFormats(Locale locale) {
-        String s = i18n.str("DateFormatOptions",locale);
-        return tokenize(s);
+	private static final SimpleDateFormat GMT_TIME_FORMAT = 
+		new SimpleDateFormat("k:mm.ss z"); //$NON-NLS-1$
+	private static final String TIME_FORMATS[] =
+	{
+		"h:mm a", //$NON-NLS-1$
+		"h:mm.ss a", //$NON-NLS-1$
+		"h:mm a z", //$NON-NLS-1$
+		"h:mm.ss a z", //$NON-NLS-1$
+		"h:mm a zzzz", //$NON-NLS-1$
+		"h:mm.ss a zzzz", //$NON-NLS-1$
+		"k:mm", //$NON-NLS-1$
+		"k:mm.ss", //$NON-NLS-1$
+		//GMT_TIME_FORMAT       
+	};	
+    */
+	
+    public TBGeneralPanel(TBWeblog blog)
+    {
+    	weblog = blog;
+    	
+    	TextEditPopupManager popupMan = TextEditPopupManager.getInstance();
+		titleField = new JTextField();
+		titleField.setText(weblog.getTitle());
+		popupMan.registerJTextComponent(titleField);
+		
+		descrArea = new JTextArea(3, 2);
+		//descrArea.setMinimumSize(descrArea.getPreferredSize());		
+		descrArea.setLineWrap(true);
+		descrArea.setWrapStyleWord(true);
+		descrArea.setText(weblog.getDescription());
+		popupMan.registerJTextComponent(descrArea);
+
+		
+		//DateFormat.getAvailableLocales()
+		localeCombo = new JComboBox(LOCS);
+		//localeCombo = new JComboBox();
+		localeCombo.setSelectedItem(weblog.getLocale());
+		localeCombo.setRenderer(new ComboRenderer());
+		localeCombo.addActionListener(new ActionListener()
+		{
+			public void actionPerformed(ActionEvent e)
+			{
+				String[] dateFormats = getDateFormats((Locale)localeCombo.getSelectedItem());
+				replaceComboItem(dateFormatCombo,dateFormats);
+				String[] timeFormats = getTimeFormats((Locale)localeCombo.getSelectedItem());
+				replaceComboItem(timeFormatCombo,timeFormats);								
+			}
+		});
+		
+		dateFormatCombo = new JComboBox(getDateFormats(weblog.getLocale()));
+		dateFormatCombo.setSelectedItem(weblog.getPageGenerator().getDateFormat());
+		dateFormatCombo.setRenderer(new ComboRenderer());
+		
+		timeFormatCombo = new JComboBox(getTimeFormats(weblog.getLocale()));
+		timeFormatCombo.setSelectedItem(weblog.getPageGenerator().getTimeFormat());
+		timeFormatCombo.setRenderer(new ComboRenderer());
+		
+                typeCombo = new JComboBox(TYPE);
+                typeCombo.setSelectedItem(weblog.getType());
+                
+		basePathField = new JTextField();
+		basePathField.setText(weblog.getBasePath());
+		popupMan.registerJTextComponent(basePathField);
+		
+		urlField = new JTextField();
+		urlField.setText(weblog.getBaseUrl());
+		popupMan.registerJTextComponent(urlField);
+		
+		arcUrlField = new JTextField();
+		arcUrlField.setText(weblog.getArchiveUrl());
+		popupMan.registerJTextComponent(arcUrlField);
+		
+		mediaUrlField = new JTextField();
+		mediaUrlField.setText(weblog.getMediaUrl());
+		popupMan.registerJTextComponent(mediaUrlField);
+		
+		setLayout(new BorderLayout(5, 5));
+		setBorder(new EmptyBorder(5, 5, 5, 5));
+		LabelledItemPanel lip1 = new LabelledItemPanel();
+		lip1.setBorder(new TitledBorder(i18n.str("weblog"))); //$NON-NLS-1$
+		lip1.addItem(i18n.str("site_title"), titleField); //$NON-NLS-1$
+		//JPanel descPanel = new JPanel(new BorderLayout());
+		//descPanel.add(new JScrollPane(descrArea), BorderLayout.CENTER);
+		//lip1.addItem("Description", descPanel);
+		lip1.addItem(i18n.str("description"), new JScrollPane(descrArea)); //$NON-NLS-1$
+		lip1.addItem(i18n.str("language"), localeCombo); //$NON-NLS-1$
+		lip1.addItem(i18n.str("date_format"), dateFormatCombo); //$NON-NLS-1$
+		lip1.addItem(i18n.str("time_format"), timeFormatCombo); //$NON-NLS-1$
+		lip1.addItem(i18n.str("type"), typeCombo);
+                
+		LabelledItemPanel lip2 = new LabelledItemPanel();
+		lip2.setBorder(new TitledBorder(i18n.str("location"))); //$NON-NLS-1$
+		lip2.addItem(i18n.str("base_path"), basePathField); //$NON-NLS-1$
+		lip2.addItem(i18n.str("base_url"), urlField); //$NON-NLS-1$
+		lip2.addItem(i18n.str("archive_url"), arcUrlField); //$NON-NLS-1$
+		lip2.addItem(i18n.str("media_url"), mediaUrlField); //$NON-NLS-1$
+		
+		add(lip1, BorderLayout.CENTER);
+		add(lip2, BorderLayout.SOUTH);
+					 	
     }
-    private String[] getTimeFormats(Locale locale) {
-        String s = i18n.str("TimeFormatOptions",locale);
-        return tokenize(s);
-    }
-    private String[] tokenize(String s) {
-        StringTokenizer st = new StringTokenizer(s,"|");
-        String[] formats = new String[st.countTokens()];
-        for (int i = 0; i < formats.length; i++) {
-            formats[i] = st.nextToken();
-        }
-        return formats;
-    }
-        /*
-        private static final String DATE_FORMATS[] =
-        {
-                "EEEE, MMMM dd, yyyy", //$NON-NLS-1$
-                "EEE, MMM dd, yyyy", //$NON-NLS-1$
-                "EEEE, dd MMMM, yyyy", //$NON-NLS-1$
-                "EEEE dd MMMM yyyy", //$NON-NLS-1$
-                "EEEE",
-                "MMMM dd, yyyy", //$NON-NLS-1$
-                "MMMM dd yyyy", //$NON-NLS-1$
-         
-                "MM/dd/yyyy",    		 //$NON-NLS-1$
-                "MM/dd/yy", //$NON-NLS-1$
-                "dd/MM/yyyy", //$NON-NLS-1$
-                "dd/MM/yy", //$NON-NLS-1$
-         
-                "dd MMMM yyyy", //$NON-NLS-1$
-                "dd MMMM", //$NON-NLS-1$
-         
-                "yyyy-MM-dd", //$NON-NLS-1$
-                "yy-MM-dd", //$NON-NLS-1$
-                "yy.MM.dd", //$NON-NLS-1$
-                "yyyy.MM.dd", //$NON-NLS-1$
-                "EEEE, MM/dd/yyyy", //$NON-NLS-1$
-                "EEE, MM/dd/yyyy" //$NON-NLS-1$
-        };
-         
-        private static final SimpleDateFormat GMT_TIME_FORMAT =
-                new SimpleDateFormat("k:mm.ss z"); //$NON-NLS-1$
-        private static final String TIME_FORMATS[] =
-        {
-                "h:mm a", //$NON-NLS-1$
-                "h:mm.ss a", //$NON-NLS-1$
-                "h:mm a z", //$NON-NLS-1$
-                "h:mm.ss a z", //$NON-NLS-1$
-                "h:mm a zzzz", //$NON-NLS-1$
-                "h:mm.ss a zzzz", //$NON-NLS-1$
-                "k:mm", //$NON-NLS-1$
-                "k:mm.ss", //$NON-NLS-1$
-                //GMT_TIME_FORMAT
-        };
-         */
-    
-    public TBGeneralPanel(TBWeblog blog) {
-        weblog = blog;
-        
-        TextEditPopupManager popupMan = TextEditPopupManager.getInstance();
-        titleField = new JTextField();
-        titleField.setText(weblog.getTitle());
-        popupMan.registerJTextComponent(titleField);
-        
-        descrArea = new JTextArea(3, 2);
-        //descrArea.setMinimumSize(descrArea.getPreferredSize());
-        descrArea.setLineWrap(true);
-        descrArea.setWrapStyleWord(true);
-        descrArea.setText(weblog.getDescription());
-        popupMan.registerJTextComponent(descrArea);
-        
-        
-        //DateFormat.getAvailableLocales()
-        localeCombo = new JComboBox(LOCS);
-        //localeCombo = new JComboBox();
-        localeCombo.setSelectedItem(weblog.getLocale());
-        localeCombo.setRenderer(new ComboRenderer());
-        localeCombo.addActionListener(new ActionListener() {
-            public void actionPerformed(ActionEvent e) {
-                String[] dateFormats = getDateFormats((Locale)localeCombo.getSelectedItem());
-                replaceComboItem(dateFormatCombo,dateFormats);
-                String[] timeFormats = getTimeFormats((Locale)localeCombo.getSelectedItem());
-                replaceComboItem(timeFormatCombo,timeFormats);
-            }
-        });
-        
-        dateFormatCombo = new JComboBox(getDateFormats(weblog.getLocale()));
-        dateFormatCombo.setSelectedItem(weblog.getPageGenerator().getDateFormat());
-        dateFormatCombo.setRenderer(new ComboRenderer());
-        
-        timeFormatCombo = new JComboBox(getTimeFormats(weblog.getLocale()));
-        timeFormatCombo.setSelectedItem(weblog.getPageGenerator().getTimeFormat());
-        timeFormatCombo.setRenderer(new ComboRenderer());
-        
-        typeCombo = new JComboBox(TYPE);
-        typeCombo.setSelectedItem(weblog.getType());
-        
-        basePathField = new JTextField();
-        basePathField.setText(weblog.getBasePath());
-        popupMan.registerJTextComponent(basePathField);
-        
-        urlField = new JTextField();
-        urlField.setText(weblog.getBaseUrl());
-        popupMan.registerJTextComponent(urlField);
-        
-        arcUrlField = new JTextField();
-        arcUrlField.setText(weblog.getArchiveUrl());
-        popupMan.registerJTextComponent(arcUrlField);
-        
-        mediaUrlField = new JTextField();
-        mediaUrlField.setText(weblog.getMediaUrl());
-        popupMan.registerJTextComponent(mediaUrlField);
-        
-        setLayout(new BorderLayout(5, 5));
-        setBorder(new EmptyBorder(5, 5, 5, 5));
-        LabelledItemPanel lip1 = new LabelledItemPanel();
-        lip1.setBorder(new TitledBorder(i18n.str("weblog"))); //$NON-NLS-1$
-        lip1.addItem(i18n.str("site_title"), titleField); //$NON-NLS-1$
-        //JPanel descPanel = new JPanel(new BorderLayout());
-        //descPanel.add(new JScrollPane(descrArea), BorderLayout.CENTER);
-        //lip1.addItem("Description", descPanel);
-        lip1.addItem(i18n.str("description"), new JScrollPane(descrArea)); //$NON-NLS-1$
-        lip1.addItem(i18n.str("language"), localeCombo); //$NON-NLS-1$
-        lip1.addItem(i18n.str("date_format"), dateFormatCombo); //$NON-NLS-1$
-        lip1.addItem(i18n.str("time_format"), timeFormatCombo); //$NON-NLS-1$
-        lip1.addItem(i18n.str("type"), typeCombo);
-        
-        LabelledItemPanel lip2 = new LabelledItemPanel();
-        lip2.setBorder(new TitledBorder(i18n.str("location"))); //$NON-NLS-1$
-        lip2.addItem(i18n.str("base_path"), basePathField); //$NON-NLS-1$
-        lip2.addItem(i18n.str("base_url"), urlField); //$NON-NLS-1$
-        lip2.addItem(i18n.str("archive_url"), arcUrlField); //$NON-NLS-1$
-        lip2.addItem(i18n.str("media_url"), mediaUrlField); //$NON-NLS-1$       
-        
-        add(lip1, BorderLayout.CENTER);
-        add(lip2, BorderLayout.SOUTH);
-        
-    }
     private void replaceComboItem(JComboBox combo, String[] items) {
-        combo.removeAllItems();
-        for (int i = 0; i < items.length; i++) {
-            combo.addItem(items[i]);
-        }
-    }
+    	combo.removeAllItems();
+    	for (int i = 0; i < items.length; i++) {
+    		combo.addItem(items[i]);
+    	}
+	}
     
     /* (non-Javadoc)
      * @see net.sf.thingamablog.gui.properties.PropertyPanel#savePropertiesToWeblog()
      */
-    public void saveProperties() {
-        weblog.setPublishAll(true);
+    public void saveProperties()
+    {
+        weblog.setPublishAll(true);        
         weblog.setBlogUrls(
-                basePathField.getText(), urlField.getText(),
-                arcUrlField.getText(), mediaUrlField.getText());
+        	basePathField.getText(), urlField.getText(), 
+        	arcUrlField.getText(), mediaUrlField.getText());
         weblog.setLocale((Locale)localeCombo.getSelectedItem());
         weblog.setTitle(titleField.getText());
         weblog.setDescription(descrArea.getText());
         weblog.getPageGenerator().setDateFormat(dateFormatCombo.getSelectedItem().toString());
-        weblog.getPageGenerator().setTimeFormat(timeFormatCombo.getSelectedItem().toString());
-        weblog.setType(typeCombo.getSelectedItem().toString());
+		weblog.getPageGenerator().setTimeFormat(timeFormatCombo.getSelectedItem().toString());
+                weblog.setType(typeCombo.getSelectedItem().toString());
     }
     
+
     
-    
-    public boolean isValidData() {
-        String base = urlField.getText();
-        String arc = arcUrlField.getText();
-        String media = mediaUrlField.getText();
-        
-        if(basePathField.getText() == null || basePathField.getText().equals("")) //$NON-NLS-1$
-        {
-            JOptionPane.showMessageDialog(this,
-                    i18n.str("no_base_path_prompt"), //$NON-NLS-1$
-                    i18n.str("warning"), JOptionPane.WARNING_MESSAGE); //$NON-NLS-1$
-            return false;
-        }
-        
-        if(typeCombo.getSelectedItem().equals("internet") && (!isValidUrl(base) || !isValidUrl(arc) || !isValidUrl(media)))
-            return false;
-        
-        if(typeCombo.getSelectedItem().equals("freenet") && (!isValidKey(base) || !isValidKey(arc) || !isValidKey(media)))
-            return false;
-        
-        if(!arc.startsWith(base)) {
-            JOptionPane.showMessageDialog(this,
-                    i18n.str("bad_arc_url_prompt"), //$NON-NLS-1$
-                    i18n.str("warning"), JOptionPane.WARNING_MESSAGE); //$NON-NLS-1$
-            
-            return false;
-        }
-        
-        if(!media.startsWith(base)) {
-            JOptionPane.showMessageDialog(this,
-                    i18n.str("bad_media_url_prompt"), //$NON-NLS-1$
-                    i18n.str("warning"), JOptionPane.WARNING_MESSAGE); //$NON-NLS-1$
-            
-            return false;
-        }
-        
-        return true;
+    public boolean isValidData()
+    {
+		String base = urlField.getText();
+		String arc = arcUrlField.getText();
+		String media = mediaUrlField.getText();
+		
+		if(basePathField.getText() == null || basePathField.getText().equals("")) //$NON-NLS-1$
+		{		
+			JOptionPane.showMessageDialog(this,
+				i18n.str("no_base_path_prompt"), //$NON-NLS-1$
+				i18n.str("warning"), JOptionPane.WARNING_MESSAGE); //$NON-NLS-1$
+				return false;
+		}
+		
+		if(typeCombo.getSelectedItem().toString().equals("internet") && (!isValidUrl(base) || !isValidUrl(arc) || !isValidUrl(media)))
+			return false;	
+		
+                if(typeCombo.getSelectedItem().toString().equals("freenet") && (!isValidSSK(base)) || !isValidSSK(arc) || !isValidSSK(media))
+                        return false;
+                
+		if(!arc.startsWith(base))
+		{
+			JOptionPane.showMessageDialog(this,
+				i18n.str("bad_arc_url_prompt"), //$NON-NLS-1$
+				i18n.str("warning"), JOptionPane.WARNING_MESSAGE); //$NON-NLS-1$
+			
+			return false;	
+		}
+		
+		if(!media.startsWith(base))
+		{
+			JOptionPane.showMessageDialog(this,
+				i18n.str("bad_media_url_prompt"), //$NON-NLS-1$
+				i18n.str("warning"), JOptionPane.WARNING_MESSAGE); //$NON-NLS-1$
+			
+			return false;	
+		}
+		
+		return true;
     }
     
-    private boolean isValidUrl(String u) {
-        try {
-            new URL(u);
-        } catch(Exception ex)//malformed url
-        {
-            JOptionPane.showMessageDialog(this,
-                    u + i18n.str("invalid_url_prompt"), //$NON-NLS-1$
-                    i18n.str("warning"), JOptionPane.WARNING_MESSAGE); //$NON-NLS-1$
-            return false;
-        }
-        return true;
+    private boolean isValidUrl(String u)
+    {
+    	try
+    	{
+    		new URL(u);
+    	}
+    	catch(Exception ex)//malformed url
+    	{
+			JOptionPane.showMessageDialog(this,
+				u + i18n.str("invalid_url_prompt"), //$NON-NLS-1$
+				i18n.str("warning"), JOptionPane.WARNING_MESSAGE); //$NON-NLS-1$
+    		return false;
+    	}
+    	return true;    	
     }
     
-    private boolean isValidKey(String key) {
-        // TODO : Check if the key match a USK key
+    private boolean isValidSSK(String u)
+    {
+        // TODO : Check if u match a SSK key
         return true;
     }
+
     
-    private class ComboRenderer extends DefaultListCellRenderer {
-        /**
-         *
+	private class ComboRenderer extends DefaultListCellRenderer
+	{
+		/**
+         * 
          */
         private static final long serialVersionUID = 1L;
         private Date date = new Date();
-        
-        public Component getListCellRendererComponent(JList list,
-                Object value, int index, boolean isSelected, boolean cellHasFocus) {
-            if(value instanceof Locale) {
-                Locale loc = (Locale)value;
-                value = loc.getDisplayName();
-            } else {
-                Locale loc = (Locale)localeCombo.getSelectedItem();
-                SimpleDateFormat df = new SimpleDateFormat(value.toString(),loc);
-                value = df.format(date);
-            }
-            
-            return super.getListCellRendererComponent(
-                    list, value, index, isSelected, cellHasFocus);
-        }
-    }
-    
+		
+		public Component getListCellRendererComponent(JList list,
+			Object value, int index, boolean isSelected, boolean cellHasFocus)
+		{
+			if(value instanceof Locale)
+			{
+				Locale loc = (Locale)value;
+				value = loc.getDisplayName();
+			}
+			else 
+			{
+				Locale loc = (Locale)localeCombo.getSelectedItem();
+				SimpleDateFormat df = new SimpleDateFormat(value.toString(),loc);
+				value = df.format(date);				
+			}
+			
+			return super.getListCellRendererComponent(
+				list, value, index, isSelected, cellHasFocus);
+		}
+	}
+
 }

Modified: trunk/apps/thingamablog/src/net/sf/thingamablog/gui/properties/TBWizardDialog.java
===================================================================
--- trunk/apps/thingamablog/src/net/sf/thingamablog/gui/properties/TBWizardDialog.java	2008-02-09 20:27:58 UTC (rev 17769)
+++ trunk/apps/thingamablog/src/net/sf/thingamablog/gui/properties/TBWizardDialog.java	2008-02-10 03:51:06 UTC (rev 17770)
@@ -52,200 +52,216 @@
 /**
  * @author Bob Tantlinger
  *
- *
- *
+ * 
+ * 
  */
-public class TBWizardDialog extends JDialog {
+public class TBWizardDialog extends JDialog
+{
     /**
-     *
+     * 
      */
     private static final long serialVersionUID = 1L;
-    
+
     private static final I18n i18n = I18n.getInstance("net.sf.thingamablog.gui.properties"); //$NON-NLS-1$
     
     private static final String CANCEL = i18n.str("cancel"); //$NON-NLS-1$
-    private static final String FINISH = i18n.str("finish");	 //$NON-NLS-1$
-    
-    private CardLayout wizLayout;
-    private JPanel wizPanel;
-    
-    private PropertyPanel starterPanel;
-    private TitleDescrPanel titlePanel;
-    private CategoriesPanel catPanel;
-    private AuthorsPanel authPanel;
+	private static final String FINISH = i18n.str("finish");	 //$NON-NLS-1$
+	
+	private CardLayout wizLayout;
+	private JPanel wizPanel;
+	
+	private PropertyPanel starterPanel;
+	private TitleDescrPanel titlePanel;
+	private CategoriesPanel catPanel;
+	private AuthorsPanel authPanel;
     private PropertyPanel emailPanel;
-    private PropertyPanel templPanel;
-    private PropertyPanel transportPanel;
-    private PropertyPanel donePanel;
-    private Vector panels = new Vector();
+	private PropertyPanel templPanel;
+	private PropertyPanel transportPanel;
+	private PropertyPanel donePanel;
+	private Vector panels = new Vector();	
+		
+	private JButton nextButton, backButton, doneButton;
+	
+	private boolean isCancelled;
+	
+	private TBWeblog weblog;
     
-    private JButton nextButton, backButton, doneButton;
+	private TextEditPopupManager popupManager = TextEditPopupManager.getInstance();
     
-    private boolean isCancelled;
-    
-    private TBWeblog weblog;
-    
-    private TextEditPopupManager popupManager = TextEditPopupManager.getInstance();
-    
     private TemplatePack selectedPack;
-    
-    public TBWizardDialog(Frame f, File dir, WeblogBackend backend) {
-        super(f, true);
-        setTitle(i18n.str("new_weblog")); //$NON-NLS-1$
+	
+	public TBWizardDialog(Frame f, File dir, WeblogBackend backend)
+	{
+		super(f, true);
+		setTitle(i18n.str("new_weblog")); //$NON-NLS-1$
+		
+		WindowAdapter windowAdapter = new WindowAdapter()
+		{
+			public void windowClosing(WindowEvent windowEvent)
+			{
+				cancelDialog();
+			}
+		};
+		addWindowListener(windowAdapter);
+		
+		weblog = new TBWeblog(dir);
+		weblog.setBackend(backend);
+		weblog.setPublishTransport(new net.sf.thingamablog.transport.FTPTransport());
+		//weblog.setAuthorStore(authStore);
+		//weblog.setCategoryStore(catStore);
+		
+		wizLayout = new CardLayout();
+		wizPanel = new JPanel(wizLayout);
+		
+		starterPanel = new StarterPanel();
+		starterPanel.setBorder(new EmptyBorder(10, 10, 10, 10));
+		panels.add(starterPanel);
+		
+		titlePanel = new TitleDescrPanel();
+		titlePanel.setBorder(new EmptyBorder(10, 10, 10, 10));
+		panels.add(titlePanel);
+		
+		catPanel = new CategoriesPanel();
+		catPanel.setBorder(new EmptyBorder(10, 10, 10, 10));
+		panels.add(catPanel);
+		
+		authPanel = new AuthorsPanel();
+		authPanel.setBorder(new EmptyBorder(10, 10, 10, 10));
+		panels.add(authPanel);
         
-        WindowAdapter windowAdapter = new WindowAdapter() {
-            public void windowClosing(WindowEvent windowEvent) {
-                cancelDialog();
-            }
-        };
-        addWindowListener(windowAdapter);
-        
-        weblog = new TBWeblog(dir);
-        weblog.setBackend(backend);
-        weblog.setPublishTransport(new net.sf.thingamablog.transport.FTPTransport());
-        //weblog.setAuthorStore(authStore);
-        //weblog.setCategoryStore(catStore);
-        
-        wizLayout = new CardLayout();
-        wizPanel = new JPanel(wizLayout);
-        
-        starterPanel = new StarterPanel();
-        starterPanel.setBorder(new EmptyBorder(10, 10, 10, 10));
-        panels.add(starterPanel);
-        
-        titlePanel = new TitleDescrPanel();
-        titlePanel.setBorder(new EmptyBorder(10, 10, 10, 10));
-        panels.add(titlePanel);
-        
-        catPanel = new CategoriesPanel();
-        catPanel.setBorder(new EmptyBorder(10, 10, 10, 10));
-        panels.add(catPanel);
-        
-        authPanel = new AuthorsPanel();
-        authPanel.setBorder(new EmptyBorder(10, 10, 10, 10));
-        panels.add(authPanel);
-        
         emailPanel = new EmailPanel();
         emailPanel.setBorder(new EmptyBorder(10, 10, 10, 10));
         panels.add(emailPanel);
-        
-        templPanel = new TemplatePanel();
-        templPanel.setBorder(new EmptyBorder(10, 10, 10, 10));
-        panels.add(templPanel);
-        
-        transportPanel = new TransportPanel();
-        transportPanel.setBorder(new EmptyBorder(10, 10, 10, 10));
-        panels.add(transportPanel);
-        
-        donePanel = new DonePanel();
-        donePanel.setBorder(new EmptyBorder(10, 10, 10, 10));
-        panels.add(donePanel);
-        
-        wizPanel.add(starterPanel, "1"); //$NON-NLS-1$
-        wizPanel.add(titlePanel, "2"); //$NON-NLS-1$
-        wizPanel.add(catPanel, "3"); //$NON-NLS-1$
-        wizPanel.add(authPanel, "4"); //$NON-NLS-1$
+		
+		templPanel = new TemplatePanel();
+		templPanel.setBorder(new EmptyBorder(10, 10, 10, 10));
+		panels.add(templPanel);
+		
+		transportPanel = new TransportPanel();
+		transportPanel.setBorder(new EmptyBorder(10, 10, 10, 10));
+		panels.add(transportPanel);
+		
+		donePanel = new DonePanel();
+		donePanel.setBorder(new EmptyBorder(10, 10, 10, 10));
+		panels.add(donePanel);
+		
+		wizPanel.add(starterPanel, "1"); //$NON-NLS-1$
+		wizPanel.add(titlePanel, "2"); //$NON-NLS-1$
+		wizPanel.add(catPanel, "3"); //$NON-NLS-1$
+		wizPanel.add(authPanel, "4"); //$NON-NLS-1$
         wizPanel.add(emailPanel, "5"); //$NON-NLS-1$
-        wizPanel.add(templPanel, "6"); //$NON-NLS-1$
-        wizPanel.add(transportPanel, "7"); //$NON-NLS-1$
-        wizPanel.add(donePanel, "8");	 //$NON-NLS-1$
-        
-        ActionListener listener = new ButtonHandler();
-        nextButton = new JButton(i18n.str("next-")); //$NON-NLS-1$
-        nextButton.addActionListener(listener);
-        backButton = new JButton(i18n.str("-back")); //$NON-NLS-1$
-        backButton.setEnabled(false);
-        backButton.addActionListener(listener);
-        doneButton = new JButton(CANCEL);
-        doneButton.addActionListener(listener);
-        
-        JPanel controlPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
-        controlPanel.setBorder(new EtchedBorder());
-        JPanel buttonPanel = new JPanel(new GridLayout(1, 3, 5, 5));
-        buttonPanel.add(backButton);
-        buttonPanel.add(nextButton);
-        buttonPanel.add(doneButton);
-        controlPanel.add(buttonPanel);
-        
-        JLabel img = new JLabel();
-        img.setVerticalAlignment(SwingConstants.TOP);
-        img.setOpaque(true);
-        img.setBackground(Color.WHITE);
-        img.setIcon(UIUtils.getIcon(UIUtils.MISC, "wizard.jpg")); //$NON-NLS-1$
-        
-        getContentPane().add(wizPanel, BorderLayout.CENTER);
-        getContentPane().add(controlPanel, BorderLayout.SOUTH);
-        getContentPane().add(img, BorderLayout.WEST);
-        
-        pack();
+		wizPanel.add(templPanel, "6"); //$NON-NLS-1$
+		wizPanel.add(transportPanel, "7"); //$NON-NLS-1$
+		wizPanel.add(donePanel, "8");	 //$NON-NLS-1$
+		
+		ActionListener listener = new ButtonHandler();
+		nextButton = new JButton(i18n.str("next-")); //$NON-NLS-1$
+		nextButton.addActionListener(listener);
+		backButton = new JButton(i18n.str("-back")); //$NON-NLS-1$
+		backButton.setEnabled(false);
+		backButton.addActionListener(listener);
+		doneButton = new JButton(CANCEL);
+		doneButton.addActionListener(listener);
+		
+		JPanel controlPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
+		controlPanel.setBorder(new EtchedBorder());
+		JPanel buttonPanel = new JPanel(new GridLayout(1, 3, 5, 5));		
+		buttonPanel.add(backButton);
+		buttonPanel.add(nextButton);
+		buttonPanel.add(doneButton);
+		controlPanel.add(buttonPanel);
+		
+		JLabel img = new JLabel();
+		img.setVerticalAlignment(SwingConstants.TOP);
+		img.setOpaque(true);
+		img.setBackground(Color.WHITE);
+		img.setIcon(UIUtils.getIcon(UIUtils.MISC, "wizard.jpg")); //$NON-NLS-1$
+		
+		getContentPane().add(wizPanel, BorderLayout.CENTER);
+		getContentPane().add(controlPanel, BorderLayout.SOUTH);
+		getContentPane().add(img, BorderLayout.WEST);
+		
+		pack();
         setSize(560, getHeight());
-        setResizable(false);
-    }
-    
-    public TBWeblog getWeblog() {
-        return weblog;
-    }
-    
-    public boolean hasUserCancelled() {
-        return isCancelled;
-    }
-    
-    private void doFinish() {
-                /*for(int i = 0; i < panels.size(); i++)
-                {
-                        PropertyPanel p = (PropertyPanel)panels.elementAt(i);
-                        p.saveProperties();
-                }*/
+		setResizable(false);
+	}
+	
+	public TBWeblog getWeblog()
+	{
+		return weblog;
+	}
+	
+	public boolean hasUserCancelled()
+	{
+		return isCancelled;
+	}
+	
+	private void doFinish()
+	{		
+		/*for(int i = 0; i < panels.size(); i++)
+		{
+			PropertyPanel p = (PropertyPanel)panels.elementAt(i);
+			p.saveProperties();
+		}*/
         
-        try {
+        try
+        {
             selectedPack.installPack(weblog.getHomeDirectory());
-        } catch(Exception ex) {
+        }
+        catch(Exception ex)
+        {
             UIUtils.showError(this, ex);
         }
+		
+		//add a couple ping services
+		WeblogsDotComPing ping = new WeblogsDotComPing();
         
-        //add a couple ping services
-        WeblogsDotComPing ping = new WeblogsDotComPing();
-        
         //removed because the TAMB ping server has been shutdown...
-                /*ping.setServiceName("Updated Thingamablogs");
-                ping.setServiceUrl("http://thingamablog.sourceforge.net/rpc.php");
-                ping.setEnabled(true);
-                weblog.addPingService(ping);*/
-        
-        ping = new WeblogsDotComPing();
-        ping.setServiceName("weblogs.com"); //$NON-NLS-1$
-        ping.setServiceUrl("http://rpc.weblogs.com/RPC2"); //$NON-NLS-1$
-        ping.setEnabled(false);
-        weblog.addPingService(ping);
-        
-        dispose();
-    }
+		/*ping.setServiceName("Updated Thingamablogs");
+		ping.setServiceUrl("http://thingamablog.sourceforge.net/rpc.php");
+		ping.setEnabled(true);		
+		weblog.addPingService(ping);*/
+		
+		ping = new WeblogsDotComPing();
+		ping.setServiceName("weblogs.com"); //$NON-NLS-1$
+		ping.setServiceUrl("http://rpc.weblogs.com/RPC2"); //$NON-NLS-1$
+		ping.setEnabled(false);
+		weblog.addPingService(ping);	
+		
+		dispose();
+	}
+	
+	private void cancelDialog()
+	{
+		isCancelled = true;
+		try{
+			weblog.deleteAll();
+		}catch(BackendException ex){}
+		dispose();		
+	}
     
-    private void cancelDialog() {
-        isCancelled = true;
-        try{
-            weblog.deleteAll();
-        }catch(BackendException ex){}
-        dispose();
-    }
-    
-    public void dispose() {
-        WeblogPreviewer.getInstance().clearPreviewData();
+    public void dispose()
+    {       
+        WeblogPreviewer.getInstance().clearPreviewData();        
         super.dispose();
     }
     
+
+	private JLabel createHeaderLabel(String text)
+	{
+		JLabel label = new JLabel("<html><h2>" + text + "</h2></html>"); //$NON-NLS-1$ //$NON-NLS-2$
+		return label;
+	}
     
-    private JLabel createHeaderLabel(String text) {
-        JLabel label = new JLabel("<html><h2>" + text + "</h2></html>"); //$NON-NLS-1$ //$NON-NLS-2$
-        return label;
-    }
+	
     
-    
-    
-    private PropertyPanel getCurrentPanel() {
-        for(int i = 0; i < panels.size(); i++) {
+    private PropertyPanel getCurrentPanel()
+    {
+        for(int i = 0; i < panels.size(); i++)
+        {
             PropertyPanel p = (PropertyPanel)panels.elementAt(i);
-            if(p.isVisible()) {
+            if(p.isVisible())
+            {
                 //return p.isValidData();
                 return p;
             }
@@ -253,224 +269,260 @@
         
         return null;
     }
-    
-    private class ButtonHandler implements ActionListener {
-        public void actionPerformed(ActionEvent e) {
-            if(e.getSource() == nextButton) {
-                if(!donePanel.isVisible()) {
-                    //if(isCurrentPanelValid())
+	
+	private class ButtonHandler implements ActionListener
+	{
+		public void actionPerformed(ActionEvent e)
+		{
+			if(e.getSource() == nextButton)
+			{
+				if(!donePanel.isVisible())
+				{				
+					//if(isCurrentPanelValid())
                     PropertyPanel p = getCurrentPanel();
-                    if(p != null && p.isValidData()) {
-                        p.saveProperties();
+                    if(p != null && p.isValidData())
+                    {
+						p.saveProperties();
                         wizLayout.next(wizPanel);
                         
                     }
-                }
-                
-                if(donePanel.isVisible()) {
-                    doneButton.setText(FINISH);
-                    nextButton.setEnabled(false);
-                }
-                backButton.setEnabled(true);
-            } else if(e.getSource() == backButton) {
-                if(!starterPanel.isVisible())
-                    wizLayout.previous(wizPanel);
-                if(starterPanel.isVisible())
-                    backButton.setEnabled(false);
-                if(doneButton.getText().equals(FINISH))
-                    doneButton.setText(CANCEL);
-                nextButton.setEnabled(true);
-            } else if(e.getSource() == doneButton) {
-                //the new Weblog was canceled, so delete the
-                //directory structure that was created when
-                //the Weblog was instantiated
-                if(doneButton.getText().equals(FINISH)) {
-                    doFinish();
-                } else {
-                    cancelDialog();
-                }
-            }
-        }
-    }
-    
-    
-    
-    
-    private class StarterPanel extends PropertyPanel {
-        /**
-         *
+				}
+														
+				if(donePanel.isVisible())
+				{
+					doneButton.setText(FINISH);
+					nextButton.setEnabled(false);
+				}
+				backButton.setEnabled(true);
+			}
+			else if(e.getSource() == backButton)
+			{
+				if(!starterPanel.isVisible())
+					wizLayout.previous(wizPanel);				
+				if(starterPanel.isVisible())
+					backButton.setEnabled(false);				
+				if(doneButton.getText().equals(FINISH))
+					doneButton.setText(CANCEL);
+				nextButton.setEnabled(true);
+			}
+			else if(e.getSource() == doneButton)
+			{
+				//the new Weblog was canceled, so delete the 
+				//directory structure that was created when
+				//the Weblog was instantiated
+				if(doneButton.getText().equals(FINISH))
+				{
+					doFinish();				
+				}
+				else
+				{
+					cancelDialog();	
+				}								
+			}
+		}
+	}
+	
+
+
+	
+	private class StarterPanel extends PropertyPanel
+	{
+		/**
+         * 
          */
         private static final long serialVersionUID = 1L;
         private JTextField pathField = new JTextField(20);
-        private JTextField urlField = new JTextField(20);
-        private String TYPE[] = {"internet","freenet"};
-        private JComboBox typeCombo = new JComboBox(TYPE);
-        
-        public StarterPanel() {
-            JLabel header = createHeaderLabel(i18n.str("weblog_wizard"));			 //$NON-NLS-1$
-            String text =
-                    i18n.str("welcome_panel_text"); //$NON-NLS-1$
-            
-            
-            LabelledItemPanel lip = new LabelledItemPanel();
-            lip.addItem(i18n.str("base_path"), pathField); //$NON-NLS-1$
-            lip.addItem(i18n.str("base_url"), urlField); //$NON-NLS-1$
-            lip.addItem(i18n.str("type"), typeCombo);
-            
-            popupManager.registerJTextComponent(pathField);
-            popupManager.registerJTextComponent(urlField);
-            
-            setLayout(new BorderLayout());
-            add(header, BorderLayout.NORTH);
-            add(new MultilineText(text), BorderLayout.CENTER);
-            add(lip, BorderLayout.SOUTH);
-        }
-        
-        public boolean isValidData() {
+		private JTextField urlField = new JTextField(20);
+                private String TYPE[]={"internet","freenet"};
+                private JComboBox typeCombo = new JComboBox(TYPE);
+		
+		public StarterPanel()
+		{			
+			JLabel header = createHeaderLabel(i18n.str("weblog_wizard"));			 //$NON-NLS-1$
+			String text =
+			i18n.str("welcome_panel_text"); //$NON-NLS-1$
+			
+			
+			LabelledItemPanel lip = new LabelledItemPanel();
+			lip.addItem(i18n.str("base_path"), pathField); //$NON-NLS-1$
+			lip.addItem(i18n.str("base_url"), urlField); //$NON-NLS-1$
+			lip.addItem(i18n.str("type"), typeCombo);
+                        
+			popupManager.registerJTextComponent(pathField);
+			popupManager.registerJTextComponent(urlField);
+			
+			setLayout(new BorderLayout());	
+			add(header, BorderLayout.NORTH);
+			add(new MultilineText(text), BorderLayout.CENTER);
+			add(lip, BorderLayout.SOUTH);			
+		}
+		
+		public boolean isValidData()
+		{
             if(pathField.getText().equals("")) //$NON-NLS-1$
             {
                 JOptionPane.showMessageDialog(TBWizardDialog.this,
-                        i18n.str("invalid_path_prompt"), i18n.str("invalid_path"),  //$NON-NLS-1$ //$NON-NLS-2$
-                        JOptionPane.WARNING_MESSAGE);
+                    i18n.str("invalid_path_prompt"), i18n.str("invalid_path"),  //$NON-NLS-1$ //$NON-NLS-2$
+                    JOptionPane.WARNING_MESSAGE);
                 return false;
             }
             
             if(urlField.getText().equals("")) //$NON-NLS-1$
             {
                 JOptionPane.showMessageDialog(TBWizardDialog.this,
-                        i18n.str("invalid_url_prompt"), i18n.str("invalid_url"),  //$NON-NLS-1$ //$NON-NLS-2$
-                        JOptionPane.WARNING_MESSAGE);
+                    i18n.str("invalid_url_prompt"), i18n.str("invalid_url"),  //$NON-NLS-1$ //$NON-NLS-2$
+                    JOptionPane.WARNING_MESSAGE);
                 return false;
             }
-            
-            if(typeCombo.getSelectedItem().toString().equals("internet")) {
-                try {
-                    new URL(urlField.getText());
-                } catch(MalformedURLException ex) //invalid url
+            if (typeCombo.getSelectedItem().toString().equals("internet")) {
+            try
+			{
+				new URL(urlField.getText());				
+			}
+			catch(MalformedURLException ex) //invalid url
+			{
+                            
+				// Display a warning message instead of just put http:// at the beginning of the url, in case the user enter a USK key and didn't use the type combobox                                                                                           
+				urlField.setText("http://" + urlField.getText()); //$NON-NLS-1$
+                                JOptionPane.showMessageDialog(TBWizardDialog.this,
+                                    i18n.str("invalid_url_prompt"), i18n.str("invalid_url"),  //$NON-NLS-1$ //$NON-NLS-2$
+                                    JOptionPane.WARNING_MESSAGE);
+                                return false;
+			}			
+            }		
+            if (typeCombo.getSelectedItem().toString().equals("freenet"))
+                        return isValidSSK(urlField.getText());
+			
+            return true;		
+            }
+        	private boolean isValidSSK(String u)
                 {
-                    urlField.setText("http://" + urlField.getText()); //$NON-NLS-1$
+                    // TODO : Check if u match a SSK key                    
+                    return true;
                 }
-            } else {
-                return isValidKey(urlField.getText());
-            }
-            
-            return true;
-        }
-        
-        public Boolean isValidKey(String key){
-            // TODO : Check if the key match a USK key
-            return true;
-        }
-        
-        public void saveProperties() {
-            String path = pathField.getText();
-            String url = urlField.getText();
-            if(!url.endsWith("/")) //$NON-NLS-1$
-                url += "/";; //$NON-NLS-1$
-                
-                String arcUrl = url + "archives"; //$NON-NLS-1$
-                String mediaUrl = url + "media"; //$NON-NLS-1$
-                
-                weblog.setBlogUrls(path, url, arcUrl, mediaUrl);
-                weblog.setType(typeCombo.getSelectedItem().toString());
-        }
-    }
-    
-    private class TitleDescrPanel extends PropertyPanel {
-        /**
-         *
+		public void saveProperties()
+		{
+			String path = pathField.getText();
+			String url = urlField.getText();
+			if(!url.endsWith("/")) //$NON-NLS-1$
+				url += "/";; //$NON-NLS-1$
+			String arcUrl = url + "archives"; //$NON-NLS-1$
+			String mediaUrl = url + "media"; //$NON-NLS-1$
+			
+			weblog.setBlogUrls(path, url, arcUrl, mediaUrl);
+                        weblog.setType(typeCombo.getSelectedItem().toString());
+		}
+	}
+	
+	private class TitleDescrPanel extends PropertyPanel
+	{
+		/**
+         * 
          */
         private static final long serialVersionUID = 1L;
         private JTextField titleField = new JTextField();
-        private JTextArea textArea = new JTextArea(4, 4);
+		private JTextArea textArea = new JTextArea(4, 4);
+		
+		public TitleDescrPanel()
+		{
+			setLayout(new BorderLayout());
+			
+			JPanel instrPanel = new JPanel(new BorderLayout());
+			JLabel header = createHeaderLabel(i18n.str("title_and_description")); //$NON-NLS-1$
+			String text =
+			i18n.str("title_panel_text"); //$NON-NLS-1$
+			instrPanel.add(header, BorderLayout.NORTH);
+			instrPanel.add(new MultilineText(text), BorderLayout.CENTER);
+			
+			popupManager.registerJTextComponent(titleField);
+			popupManager.registerJTextComponent(textArea);
+			
+			LabelledItemPanel lip = new LabelledItemPanel();
+			lip.addItem(i18n.str("site_title"), titleField); //$NON-NLS-1$
+			lip.addItem(i18n.str("description"), new JScrollPane(textArea)); //$NON-NLS-1$
+			
+			add(instrPanel, BorderLayout.NORTH);
+			add(lip, BorderLayout.CENTER);						
+		}
+		
+		public boolean isValidData()
+		{			
+			if(titleField.getText().equals("")) //$NON-NLS-1$
+			{
+				JOptionPane.showMessageDialog(TBWizardDialog.this, 
+					i18n.str("invalid_title_prompt"), i18n.str("title"), JOptionPane.WARNING_MESSAGE); //$NON-NLS-1$ //$NON-NLS-2$
+				return false;
+			}
+			return true;	
+		}
+		
+		public void saveProperties()
+		{
+			weblog.setTitle(titleField.getText());
+			weblog.setDescription(textArea.getText());
+		}	
         
-        public TitleDescrPanel() {
-            setLayout(new BorderLayout());
-            
-            JPanel instrPanel = new JPanel(new BorderLayout());
-            JLabel header = createHeaderLabel(i18n.str("title_and_description")); //$NON-NLS-1$
-            String text =
-                    i18n.str("title_panel_text"); //$NON-NLS-1$
-            instrPanel.add(header, BorderLayout.NORTH);
-            instrPanel.add(new MultilineText(text), BorderLayout.CENTER);
-            
-            popupManager.registerJTextComponent(titleField);
-            popupManager.registerJTextComponent(textArea);
-            
-            LabelledItemPanel lip = new LabelledItemPanel();
-            lip.addItem(i18n.str("site_title"), titleField); //$NON-NLS-1$
-            lip.addItem(i18n.str("description"), new JScrollPane(textArea)); //$NON-NLS-1$
-            
-            add(instrPanel, BorderLayout.NORTH);
-            add(lip, BorderLayout.CENTER);
-        }
-        
-        public boolean isValidData() {
-            if(titleField.getText().equals("")) //$NON-NLS-1$
-            {
-                JOptionPane.showMessageDialog(TBWizardDialog.this,
-                        i18n.str("invalid_title_prompt"), i18n.str("title"), JOptionPane.WARNING_MESSAGE); //$NON-NLS-1$ //$NON-NLS-2$
-                return false;
-            }
-            return true;
-        }
-        
-        public void saveProperties() {
-            weblog.setTitle(titleField.getText());
-            weblog.setDescription(textArea.getText());
-        }
-        
-        public String getTitle() {
+        public String getTitle()
+        {
             return titleField.getText();
         }
         
-        public String getDescription() {
+        public String getDescription()
+        {
             return textArea.getText();
         }
-    }
-    
-    private class CategoriesPanel extends PropertyPanel {
-        /**
-         *
+	}
+	
+	private class CategoriesPanel extends PropertyPanel
+	{
+		/**
+         * 
          */
         private static final long serialVersionUID = 1L;
         private EditableList list;
-        private WeblogEditableListModel model;
-        
-        public CategoriesPanel() {
-            setLayout(new BorderLayout(5, 5));
+		private WeblogEditableListModel model;
+		
+		public CategoriesPanel()
+		{
+			setLayout(new BorderLayout(5, 5));
+			
+			JPanel instrPanel = new JPanel(new BorderLayout());
+			JLabel header = createHeaderLabel(i18n.str("categories")); //$NON-NLS-1$
+			String text =
+			i18n.str("categories_panel_text"); //$NON-NLS-1$
+			instrPanel.add(header, BorderLayout.NORTH);
+			instrPanel.add(new MultilineText(text), BorderLayout.CENTER);
+			
+			model = new WeblogEditableListModel(WeblogEditableListModel.CATEGORIES);
+			list = new EditableList(model);
+			setBorder(BorderFactory.createEmptyBorder(12, 12, 12, 12));
+			
+			add(instrPanel, BorderLayout.NORTH);
+			add(list, BorderLayout.CENTER);	
             
-            JPanel instrPanel = new JPanel(new BorderLayout());
-            JLabel header = createHeaderLabel(i18n.str("categories")); //$NON-NLS-1$
-            String text =
-                    i18n.str("categories_panel_text"); //$NON-NLS-1$
-            instrPanel.add(header, BorderLayout.NORTH);
-            instrPanel.add(new MultilineText(text), BorderLayout.CENTER);
             
-            model = new WeblogEditableListModel(WeblogEditableListModel.CATEGORIES);
-            list = new EditableList(model);
-            setBorder(BorderFactory.createEmptyBorder(12, 12, 12, 12));
-            
-            add(instrPanel, BorderLayout.NORTH);
-            add(list, BorderLayout.CENTER);
-            
-            
-        }
+		}
+		
+		public boolean isValidData()
+		{			
+			return true;
+		}
+		
+		public void saveProperties()
+		{
+			//ListModel lm = catList.getModel();			
+			try
+			{
+				model.syncListWithWeblog(weblog);
+			}
+			catch(Exception ex)
+			{
+				ex.printStackTrace();
+			}
+		}
         
-        public boolean isValidData() {
-            return true;
-        }
-        
-        public void saveProperties() {
-            //ListModel lm = catList.getModel();
-            try {
-                model.syncListWithWeblog(weblog);
-            } catch(Exception ex) {
-                ex.printStackTrace();
-            }
-        }
-        
-        public String[] getCategories() {
+        public String[] getCategories()
+        {
             List data = list.getListData();
             String[] cats = new String[data.size()];
             for(int i = 0; i < cats.length; i++)
@@ -478,50 +530,59 @@
             return cats;
         }
         
-        public WeblogEditableListModel getModel() {
+        public WeblogEditableListModel getModel()
+        {
             return model;
         }
-    }
-    
-    private class AuthorsPanel extends PropertyPanel {
-        /**
-         *
+	}
+	
+	private class AuthorsPanel extends PropertyPanel
+	{
+		/**
+         * 
          */
         private static final long serialVersionUID = 1L;
         private EditableList list;
-        private WeblogEditableListModel model;
+		private WeblogEditableListModel model;
+		
+		public AuthorsPanel()
+		{
+			setLayout(new BorderLayout(5, 5));
+			
+			JPanel instrPanel = new JPanel(new BorderLayout());
+			JLabel header = createHeaderLabel(i18n.str("authors")); //$NON-NLS-1$
+			String text =
+			i18n.str("authors_panel_text"); //$NON-NLS-1$
+			instrPanel.add(header, BorderLayout.NORTH);
+			instrPanel.add(new MultilineText(text), BorderLayout.CENTER);
+			
+			model = new WeblogEditableListModel(WeblogEditableListModel.AUTHORS);
+			list = new EditableList(model);
+			setBorder(BorderFactory.createEmptyBorder(12, 12, 12, 12));
+			
+			add(instrPanel, BorderLayout.NORTH);
+			add(list, BorderLayout.CENTER);										
+		}
+		
+		public boolean isValidData()
+		{			
+			return true;
+		}
+		
+		public void saveProperties()
+		{
+			try
+			{
+				model.syncListWithWeblog(weblog);
+			}
+			catch(Exception ex)
+			{
+				ex.printStackTrace();
+			}
+		}
         
-        public AuthorsPanel() {
-            setLayout(new BorderLayout(5, 5));
-            
-            JPanel instrPanel = new JPanel(new BorderLayout());
-            JLabel header = createHeaderLabel(i18n.str("authors")); //$NON-NLS-1$
-            String text =
-                    i18n.str("authors_panel_text"); //$NON-NLS-1$
-            instrPanel.add(header, BorderLayout.NORTH);
-            instrPanel.add(new MultilineText(text), BorderLayout.CENTER);
-            
-            model = new WeblogEditableListModel(WeblogEditableListModel.AUTHORS);
-            list = new EditableList(model);
-            setBorder(BorderFactory.createEmptyBorder(12, 12, 12, 12));
-            
-            add(instrPanel, BorderLayout.NORTH);
-            add(list, BorderLayout.CENTER);
-        }
-        
-        public boolean isValidData() {
-            return true;
-        }
-        
-        public void saveProperties() {
-            try {
-                model.syncListWithWeblog(weblog);
-            } catch(Exception ex) {
-                ex.printStackTrace();
-            }
-        }
-        
-        public Author[] getAuthors() {
+        public Author[] getAuthors()
+        {
             List data = list.getListData();
             Author[] a = new Author[data.size()];
             for(int i = 0; i < a.length; i++)
@@ -529,27 +590,30 @@
             return a;
         }
         
-        public WeblogEditableListModel getModel() {
+        public WeblogEditableListModel getModel()
+        {
             return model;
         }
-    }
+	}
     
-    private class EmailPanel extends PropertyPanel {
-        
+    private class EmailPanel extends PropertyPanel
+    {
+
         /**
-         *
+         * 
          */
         private static final long serialVersionUID = 1L;
         TBEmailPanel emailPanel;
         
-        public EmailPanel() {
+        public EmailPanel()
+        {
             setLayout(new BorderLayout(5, 5));
             
             JPanel instrPanel = new JPanel(new BorderLayout());
             JLabel header = createHeaderLabel("Email"); //$NON-NLS-1$
             String text =
-                    i18n.str("specify_mail_server_prompt"); //$NON-NLS-1$
-            
+            i18n.str("specify_mail_server_prompt"); //$NON-NLS-1$
+                
             instrPanel.add(header, BorderLayout.NORTH);
             instrPanel.add(new MultilineText(text), BorderLayout.CENTER);
             
@@ -561,106 +625,120 @@
         /* (non-Javadoc)
          * @see net.sf.thingamablog.gui.properties.PropertyPanel#isValidData()
          */
-        public boolean isValidData() {
+        public boolean isValidData()
+        {            
             return emailPanel.isValidData();
         }
-        
+
         /* (non-Javadoc)
          * @see net.sf.thingamablog.gui.properties.PropertyPanel#saveProperties()
          */
-        public void saveProperties() {
-            emailPanel.saveProperties();
+        public void saveProperties()
+        {
+            emailPanel.saveProperties();            
         }
         
     }
-    
-    private class TransportPanel extends PropertyPanel {
-        /**
-         *
+	
+	private class TransportPanel extends PropertyPanel
+	{
+		/**
+         * 
          */
         private static final long serialVersionUID = 1L;
         TBPublishTransportPanel pubPanel;
-        
-        public TransportPanel() {
-            setLayout(new BorderLayout());
-            
-            JPanel instrPanel = new JPanel(new BorderLayout());
-            JLabel header = createHeaderLabel(i18n.str("publishing")); //$NON-NLS-1$
-            String text =
-                    i18n.str("publishing_panel_text"); //$NON-NLS-1$
-            instrPanel.add(header, BorderLayout.NORTH);
-            instrPanel.add(new MultilineText(text), BorderLayout.CENTER);
-            
-            pubPanel = new TBPublishTransportPanel(weblog);
-            add(instrPanel, BorderLayout.NORTH);
-            add(pubPanel, BorderLayout.CENTER);
-        }
-        
-        public boolean isValidData() {
-            return pubPanel.isValidData();
-        }
-        
-        public void saveProperties() {
-            pubPanel.saveProperties();
-        }
-    }
-    
-    private class TemplatePanel extends PropertyPanel {
-        /**
-         *
+		
+		public TransportPanel()
+		{
+			setLayout(new BorderLayout());
+			
+			JPanel instrPanel = new JPanel(new BorderLayout());
+			JLabel header = createHeaderLabel(i18n.str("publishing")); //$NON-NLS-1$
+			String text = 
+			i18n.str("publishing_panel_text"); //$NON-NLS-1$
+			instrPanel.add(header, BorderLayout.NORTH);
+			instrPanel.add(new MultilineText(text), BorderLayout.CENTER);
+
+			pubPanel = new TBPublishTransportPanel(weblog);
+			add(instrPanel, BorderLayout.NORTH);
+			add(pubPanel, BorderLayout.CENTER);							
+		}
+		
+		public boolean isValidData()
+		{			
+			return pubPanel.isValidData();
+		}
+		
+		public void saveProperties()
+		{
+			pubPanel.saveProperties();
+		}		
+	}
+	
+	private class TemplatePanel extends PropertyPanel
+	{
+		/**
+         * 
          */
         private static final long serialVersionUID = 1L;
-        //private JComboBox tmplCombo;
+        //private JComboBox tmplCombo; 
         //private TemplatePropertiesPanel propertyPanel;
         private TemplateSelectionPanel selPanel;
-        
-        public TemplatePanel() {
-            JPanel instrPanel = new JPanel(new BorderLayout());
-            JLabel header = createHeaderLabel(i18n.str("templates")); //$NON-NLS-1$
-            String text =
-                    i18n.str("templates_panel_text"); //$NON-NLS-1$
-            instrPanel.add(header, BorderLayout.NORTH);
-            instrPanel.add(new MultilineText(text), BorderLayout.CENTER);
-            
-            selPanel = new TemplateSelectionPanel(weblog);
-            
+		
+		public TemplatePanel()
+		{
+			JPanel instrPanel = new JPanel(new BorderLayout());
+			JLabel header = createHeaderLabel(i18n.str("templates")); //$NON-NLS-1$
+			String text =
+			i18n.str("templates_panel_text"); //$NON-NLS-1$
+			instrPanel.add(header, BorderLayout.NORTH);
+			instrPanel.add(new MultilineText(text), BorderLayout.CENTER);
+                        
+            selPanel = new TemplateSelectionPanel(weblog);			
+			
             setLayout(new BorderLayout(5, 5));
-            add(instrPanel, BorderLayout.NORTH);
-            add(selPanel, BorderLayout.CENTER);
-        }
-        
-        public boolean isValidData() {
-            if(selPanel.getSelectedPack() == null)
+			add(instrPanel, BorderLayout.NORTH);
+			add(selPanel, BorderLayout.CENTER);								
+		}
+		
+		public boolean isValidData()
+		{			
+			if(selPanel.getSelectedPack() == null)
                 return false;
             return true;
-        }
-        
-        public void saveProperties() {
+		}
+		
+        public void saveProperties()
+        {           
             selectedPack = selPanel.getSelectedPack();
         }
-    }
-    
-    private class DonePanel extends PropertyPanel {
-        /**
-         *
+	}	
+	
+	private class DonePanel extends PropertyPanel
+	{
+		/**
+         * 
          */
         private static final long serialVersionUID = 1L;
-        
-        public DonePanel() {
-            JLabel header = createHeaderLabel(i18n.str("done")); //$NON-NLS-1$
-            String text =
-                    i18n.str("finished_panel_text"); //$NON-NLS-1$
-            
-            setLayout(new BorderLayout());
-            add(header, BorderLayout.NORTH);
-            add(new MultilineText(text), BorderLayout.CENTER);
-        }
-        
-        public boolean isValidData() {
-            return true;
-        }
-        
-        public void saveProperties() {
-        }
-    }
+
+        public DonePanel()
+		{
+			JLabel header = createHeaderLabel(i18n.str("done")); //$NON-NLS-1$
+			String text =
+			i18n.str("finished_panel_text"); //$NON-NLS-1$
+			
+			setLayout(new BorderLayout());
+			add(header, BorderLayout.NORTH);
+			add(new MultilineText(text), BorderLayout.CENTER);	
+		}
+		
+		public boolean isValidData()
+		{			
+			return true;
+		}
+		
+		public void saveProperties()
+		{			
+		}		
+	}
 }

Modified: trunk/apps/thingamablog/src/net/sf/thingamablog/xml/TBPersistFactory.java
===================================================================
--- trunk/apps/thingamablog/src/net/sf/thingamablog/xml/TBPersistFactory.java	2008-02-09 20:27:58 UTC (rev 17769)
+++ trunk/apps/thingamablog/src/net/sf/thingamablog/xml/TBPersistFactory.java	2008-02-10 03:51:06 UTC (rev 17770)
@@ -14,7 +14,7 @@
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
- *
+ * 
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,
@@ -62,328 +62,362 @@
 
 
 /**
- *
+ * 
  * Factory for persisting a Thingamablog XML "database"
- *
+ * 
  * @author Bob Tantlinger
  *
  */
-public class TBPersistFactory {
+public class TBPersistFactory
+{
     //private static final Logger logger = Logger.getLogger("net.sf.thingamablog.xml");
     
     /**
-     * Saves the current data to an XML file
-     *
-     * @param blogList The list of weblogs
-     * @param feedRootFolder The root FeedFolder
-     * @param path The path to save the file to
-     * @throws IOException If an IO error occurs
-     * @throws JDOMException If a JDOM error occurs
-     */
-    public synchronized static void save(WeblogList blogList, FeedFolder feedRootFolder, String path)
-    throws IOException, JDOMException {
-        String mainRoot = "Thingamablog";
-        //Document document = XMLUtils.initDocument(mainRoot, mainRoot, new File(path));
-        Document document = new Document(new Element(mainRoot));
-        Comment comment =
-                new Comment("Generated by Thingamablog. DO NOT EDIT THIS FILE!!!");
-        document.getContent().add(0, comment);
-        
-        Element weblogsRoot = new Element("Weblogs");
-        Element feedsRoot = new Element("Feeds");
-        saveWeblogsToXML(blogList, weblogsRoot);
-        saveFeedFolder(feedRootFolder, feedsRoot);
-        
-        Element root = document.getRootElement();
-        root.addContent(weblogsRoot);
-        root.addContent(feedsRoot);
-        
-        XMLUtils.writeXML(document, path, true);
-    }
-    
-    public static void loadData(String path, WeblogList list, FeedFolder rootFolder, WeblogBackend b1, FeedBackend b2)
-    throws IOException, JDOMException {
-        File f = new File(path);
-        Document doc = createDocument(f);
-        loadWeblogList(doc, f, list, b1);
-        loadFeedTree(doc, rootFolder, b2);
-    }
-    
-    private static Document createDocument(File file)
-    throws IOException, JDOMException {
-        SAXBuilder builder = new SAXBuilder(false);
-        builder.setEntityResolver(new TBEntityResolver());
-        Document document = builder.build(file);
-        return document;
-    }
-    
-    
-    
-    private static void saveFeedFolder(FeedFolder folder, Element element) {
-        FeedFolder sub[] = folder.getFolders();
-        for(int i = 0; i < sub.length; i++) {
-            Element category = new Element("Folder");
-            category.setAttribute("name", sub[i].getName());
-            element.addContent(category);
-            saveFeedFolder(sub[i], category);
-        }
-        
-        Feed feeds[] = folder.getFeeds();
-        for(int j = 0; j < feeds.length; j++) {
-            Element link = new Element("Feed");
-            link.setText(feeds[j].getURL());
-            
-            String title = feeds[j].getTitle();
-            if(title != null)
-                link.setAttribute("title", title);
-            else
-                link.setAttribute("title", "Untitled");
-            
-            link.setAttribute("archive", feeds[j].isLimitItems() + "");
-            link.setAttribute("limit", feeds[j].getItemLimit() + "");
-            
-            Date updateDate = feeds[j].getLastUpdated();
-            if(updateDate != null)
-                link.setAttribute("update_date", updateDate.getTime() + "");
-            //link.setAttribute("update_failed", feeds[j].isLastUpdateFailed() + "");
-            if(feeds[j].isLastUpdateFailed())
-                link.setAttribute("update_failed", feeds[j].getLastUpdateFailedReason());
-            
-            element.addContent(link);
-        }
-    }
-    
-    /**
-     * Loads the FeedFolder heirarchy from an XML file
-     *
-     * @param rootFolder The root FeedFolder
-     * @param path The path to the XML file
-     * @param backend The backend for the feeds
-     * @throws IOException If an IO error occurs
-     * @throws JDOMException If a JDOM error occurs
-     */
-    public static void loadFeedTree(FeedFolder rootFolder, String path, FeedBackend backend)
-    throws IOException, JDOMException {
-        Document document = createDocument(new File(path));
-        if(document == null)
-            return;
-        
-        loadFeedTree(document, rootFolder, backend);
-    }
-    
-    private static void loadFeedTree(Document document, FeedFolder rootFolder, FeedBackend backend) {
-        Element root = document.getRootElement();
-        Element feedRoot = root.getChild("Feeds");
-        
-        if(feedRoot != null) {
-            loadFeeds(rootFolder, feedRoot, backend);
-        }
-    }
-    
-    private static void loadFeeds(FeedFolder folder, Element element, FeedBackend backend) {
-        List contents = element.getChildren();
-        Iterator contentsIt = contents.iterator();
-        
-        while(contentsIt.hasNext()) {
-            Element ele = (Element) contentsIt.next();
-            
-            /** The element is a category */
-            if(ele.getName().equals("Folder")) {
-                FeedFolder subFolder = loadFeedFolder(ele);
-                folder.addFolder(subFolder);
-                loadFeeds(subFolder, ele, backend);
-            }
-            /** The element is a favorite */
-            else if (ele.getName().equals("Feed")) {
-                folder.addFeed(loadFeed(ele, backend));
-            }
-        }
-    }
-    
-    private static FeedFolder loadFeedFolder(Element element) {
-        
-        /** Name of the category */
-        String folderName = element.getAttributeValue("name");
-        
-        /** Create a new category */
-        FeedFolder sub = new FeedFolder(folderName);
-        return sub;
-    }
-    
-    private static Feed loadFeed(Element element, FeedBackend backend) {
-        String url = "";
-        String title = "";
-        Date updated = null;
-        boolean /*lastUpdateFailed = false,*/ archive = true;
-        String failReason = null;
-        int limit = 50;
-        
-        // Url of the feed
-        if (element.getText() != null)
-            url = element.getText();
-        
-        // Title of the feed
-        if (element.getAttributeValue("title") != null)
-            title = element.getAttributeValue("title");
-        
-        if(element.getAttributeValue("update_date") != null) {
-            try {
-                long epoch = Long.parseLong(element.getAttributeValue("update_date"));
-                updated = new Date(epoch);
-            } catch(Exception ex){}
-        }
-        
-        try {
-            limit = Integer.parseInt(element.getAttributeValue("limit", "50"));
-        }catch(Exception ex){}
-        
-        archive = element.getAttributeValue("archive", "true").equals("true");
-        
-        if(element.getAttributeValue("update_failed") != null) {
-            failReason = element.getAttributeValue("update_failed");
-        }
-        
-        Feed f = new Feed(url);
-        f.setTitle(title);
-        f.setBackend(backend);
-        f.setLastUpdated(updated);
-        f.setLastUpdateFailed(failReason != null);
-        f.setLimitItems(archive);
-        f.setItemLimit(limit);
-        if(failReason != null)
-            f.setLastUpdateFailedReason(failReason);
-        return f;
-    }
-    
-    
-    private static void saveWeblogsToXML(WeblogList blogList, Element root)
-    throws IOException, JDOMException {
-        for(int i = 0; i < blogList.getWeblogCount(); i++) {
-            Weblog blog = blogList.getWeblogAt(i);
-            Element bElement = createWeblogElement(blog);
-            root.addContent(bElement);
-        }
-    }
-    
-    private static Element createWeblogElement(Weblog blog) {
-        Element element = new Element("Weblog");
-        element.setAttribute("title", blog.getTitle());
-        element.setAttribute("key", blog.getKey());
-        element.setAttribute("last_publish", blog.getLastPublishDate().getTime() + "");
+	 * Saves the current data to an XML file
+	 * 
+	 * @param blogList The list of weblogs
+	 * @param feedRootFolder The root FeedFolder
+	 * @param path The path to save the file to
+	 * @throws IOException If an IO error occurs
+	 * @throws JDOMException If a JDOM error occurs
+	 */
+	public synchronized static void save(WeblogList blogList, FeedFolder feedRootFolder, String path)
+	throws IOException, JDOMException
+	{
+		String mainRoot = "Thingamablog";		
+		//Document document = XMLUtils.initDocument(mainRoot, mainRoot, new File(path));
+		Document document = new Document(new Element(mainRoot));
+		Comment comment =
+			new Comment("Generated by Thingamablog. DO NOT EDIT THIS FILE!!!");
+		document.getContent().add(0, comment);
+				
+		Element weblogsRoot = new Element("Weblogs");
+		Element feedsRoot = new Element("Feeds");		
+		saveWeblogsToXML(blogList, weblogsRoot);
+		saveFeedFolder(feedRootFolder, feedsRoot);
+		
+		Element root = document.getRootElement();
+		root.addContent(weblogsRoot);
+		root.addContent(feedsRoot);			
+		
+		XMLUtils.writeXML(document, path, true);
+	}
+	
+	public static void loadData(String path, WeblogList list, FeedFolder rootFolder, WeblogBackend b1, FeedBackend b2)
+	throws IOException, JDOMException
+	{
+		File f = new File(path);
+		Document doc = createDocument(f);
+		loadWeblogList(doc, f, list, b1);
+		loadFeedTree(doc, rootFolder, b2);		
+	}
+	
+	private static Document createDocument(File file)
+	throws IOException, JDOMException
+	{
+		SAXBuilder builder = new SAXBuilder(false);
+		builder.setEntityResolver(new TBEntityResolver());
+		Document document = builder.build(file);
+		return document;
+	}
+	
+	
+
+	private static void saveFeedFolder(FeedFolder folder, Element element)
+	{
+		FeedFolder sub[] = folder.getFolders();
+		for(int i = 0; i < sub.length; i++)
+		{
+			Element category = new Element("Folder");
+			category.setAttribute("name", sub[i].getName());
+			element.addContent(category);
+			saveFeedFolder(sub[i], category);
+		}
+		
+		Feed feeds[] = folder.getFeeds();
+		for(int j = 0; j < feeds.length; j++)
+		{
+			Element link = new Element("Feed");
+			link.setText(feeds[j].getURL());
+			
+			String title = feeds[j].getTitle();
+			if(title != null)			
+				link.setAttribute("title", title);
+			else
+			link.setAttribute("title", "Untitled");			
+			
+			link.setAttribute("archive", feeds[j].isLimitItems() + "");
+			link.setAttribute("limit", feeds[j].getItemLimit() + "");				
+			
+			Date updateDate = feeds[j].getLastUpdated();
+			if(updateDate != null)
+				link.setAttribute("update_date", updateDate.getTime() + "");
+			//link.setAttribute("update_failed", feeds[j].isLastUpdateFailed() + "");
+			if(feeds[j].isLastUpdateFailed())
+				link.setAttribute("update_failed", feeds[j].getLastUpdateFailedReason());
+			
+			element.addContent(link);
+		}
+	}	
+	
+	/**
+	 * Loads the FeedFolder heirarchy from an XML file
+	 * 
+	 * @param rootFolder The root FeedFolder
+	 * @param path The path to the XML file
+	 * @param backend The backend for the feeds
+	 * @throws IOException If an IO error occurs
+	 * @throws JDOMException If a JDOM error occurs
+	 */
+	public static void loadFeedTree(FeedFolder rootFolder, String path, FeedBackend backend) 
+	throws IOException, JDOMException 
+	{
+		Document document = createDocument(new File(path));
+		if(document == null)
+			return;
+		
+		loadFeedTree(document, rootFolder, backend);
+	}
+	
+	private static void loadFeedTree(Document document, FeedFolder rootFolder, FeedBackend backend)
+	{
+		Element root = document.getRootElement();
+		Element feedRoot = root.getChild("Feeds");		
+
+		if(feedRoot != null) 
+		{			
+			loadFeeds(rootFolder, feedRoot, backend);			
+		}	
+	}
+	
+	private static void loadFeeds(FeedFolder folder, Element element, FeedBackend backend)
+	{
+		List contents = element.getChildren();
+		Iterator contentsIt = contents.iterator();
+
+		while(contentsIt.hasNext())
+		{
+			Element ele = (Element) contentsIt.next();
+
+			/** The element is a category */
+			if(ele.getName().equals("Folder")) 
+			{
+				FeedFolder subFolder = loadFeedFolder(ele);
+				folder.addFolder(subFolder);
+				loadFeeds(subFolder, ele, backend);
+			}
+			/** The element is a favorite */
+			else if (ele.getName().equals("Feed")) 
+			{
+				folder.addFeed(loadFeed(ele, backend));
+			}
+		}
+	}	
+	
+	private static FeedFolder loadFeedFolder(Element element) 
+	{
+
+		/** Name of the category */
+		String folderName = element.getAttributeValue("name");
+
+		/** Create a new category */
+		FeedFolder sub = new FeedFolder(folderName);
+		return sub;
+	}
+	
+	private static Feed loadFeed(Element element, FeedBackend backend)
+	{
+		String url = "";
+		String title = "";
+		Date updated = null;
+		boolean /*lastUpdateFailed = false,*/ archive = true;
+		String failReason = null;
+		int limit = 50;
+		
+		// Url of the feed 
+		if (element.getText() != null)
+			url = element.getText();
+
+		// Title of the feed 
+		if (element.getAttributeValue("title") != null)
+			title = element.getAttributeValue("title");
+		
+		if(element.getAttributeValue("update_date") != null)
+		{
+			try
+			{			
+				long epoch = Long.parseLong(element.getAttributeValue("update_date"));
+				updated = new Date(epoch);				
+			}
+			catch(Exception ex){}
+		}
+		
+		try
+		{
+			limit = Integer.parseInt(element.getAttributeValue("limit", "50"));
+		}catch(Exception ex){}
+		
+		archive = element.getAttributeValue("archive", "true").equals("true");
+		
+		if(element.getAttributeValue("update_failed") != null)
+		{
+			failReason = element.getAttributeValue("update_failed");
+		}
+		
+		Feed f = new Feed(url);
+		f.setTitle(title);
+		f.setBackend(backend);
+		f.setLastUpdated(updated);		
+		f.setLastUpdateFailed(failReason != null);
+		f.setLimitItems(archive);
+		f.setItemLimit(limit);
+		if(failReason != null)
+			f.setLastUpdateFailedReason(failReason);
+		return f;
+	}
+	
+
+	private static void saveWeblogsToXML(WeblogList blogList, Element root)
+	throws IOException, JDOMException
+	{
+		for(int i = 0; i < blogList.getWeblogCount(); i++)
+		{
+			Weblog blog = blogList.getWeblogAt(i);
+			Element bElement = createWeblogElement(blog);
+			root.addContent(bElement);
+		}	
+	}
+	
+	private static Element createWeblogElement(Weblog blog)
+	{
+		Element element = new Element("Weblog");
+		element.setAttribute("title", blog.getTitle());
+		element.setAttribute("key", blog.getKey());
+		element.setAttribute("last_publish", blog.getLastPublishDate().getTime() + "");
         element.setAttribute("publish_failed", blog.isPublishFailed() + "");
-        Element descr = new Element("Description");
-        descr.addContent(blog.getDescription());
-        element.addContent(descr);
-        element.addContent(createPingServicesElement(blog));
-        element.addContent(createPublishTransportElement(blog));
+		Element descr = new Element("Description");
+		descr.addContent(blog.getDescription());		
+		element.addContent(descr);
+		element.addContent(createPingServicesElement(blog));
+		element.addContent(createPublishTransportElement(blog));
         element.addContent(createMailSettingsElement(blog));
-        
-        if(blog instanceof TBWeblog) {
-            TBWeblog tbBlog = (TBWeblog)blog;
-            return createTBWeblogElement(tbBlog, element);
-        }
-        return element;
-    }
-    
-    private static Element createPingServicesElement(Weblog blog) {
-        Element element = new Element("PingServices");
-        PingService ps[] = blog.getPingServices();
-        for(int i = 0; i < ps.length; i++) {
-            if(ps[i] instanceof WeblogsDotComPing) {
-                Element ping = new Element("WeblogsDotComPing");
-                ping.setAttribute("name", ps[i].getServiceName());
-                ping.setAttribute("url", ps[i].getServiceUrl());
-                ping.setAttribute("enabled", ps[i].isEnabled() + "");
-                element.addContent(ping);
-            }
-        }
-        return element;
-    }
-    
-    private static Element createTBWeblogElement(TBWeblog blog, Element element) {
-        element.setName("TBWeblog");
-        element.setAttribute("url", blog.getBaseUrl());
-        element.setAttribute("arc_url", blog.getArchiveUrl());
-        element.setAttribute("media_url", blog.getMediaUrl());
-        element.setAttribute("base_path", blog.getBasePath());
-        element.setAttribute("base_date", blog.getArchiveBaseDate().getTime() + "");
-        element.setAttribute("arc_policy", blog.getArchivePolicy() + "");
-        element.setAttribute("day_interval", blog.getArchiveByDayInterval() + "");
-        element.setAttribute("arc_ext", blog.getArchivesExtension());
-        element.setAttribute("cat_ext", blog.getCategoriesExtension());
+		
+		if(blog instanceof TBWeblog)
+		{
+			TBWeblog tbBlog = (TBWeblog)blog;
+			return createTBWeblogElement(tbBlog, element);
+		}
+		return element;
+	}
+	
+	private static Element createPingServicesElement(Weblog blog)
+	{
+		Element element = new Element("PingServices");
+		PingService ps[] = blog.getPingServices();
+		for(int i = 0; i < ps.length; i++)
+		{
+			if(ps[i] instanceof WeblogsDotComPing)
+			{
+				Element ping = new Element("WeblogsDotComPing");
+				ping.setAttribute("name", ps[i].getServiceName());
+				ping.setAttribute("url", ps[i].getServiceUrl());
+				ping.setAttribute("enabled", ps[i].isEnabled() + "");
+				element.addContent(ping);
+			}
+		}
+		return element;
+	}
+	
+	private static Element createTBWeblogElement(TBWeblog blog, Element element)
+	{
+		element.setName("TBWeblog");
+		element.setAttribute("url", blog.getBaseUrl());
+		element.setAttribute("arc_url", blog.getArchiveUrl());
+		element.setAttribute("media_url", blog.getMediaUrl());
+		element.setAttribute("base_path", blog.getBasePath());		
+		element.setAttribute("base_date", blog.getArchiveBaseDate().getTime() + "");
+		element.setAttribute("arc_policy", blog.getArchivePolicy() + "");
+		element.setAttribute("day_interval", blog.getArchiveByDayInterval() + "");
+		element.setAttribute("arc_ext", blog.getArchivesExtension());
+		element.setAttribute("cat_ext", blog.getCategoriesExtension());
         element.setAttribute("gen_cat_feed", blog.isGenerateCategoryFeeds() + "");
         element.setAttribute("cat_feed_ext", blog.getCategoriesFeedExtension());
-        element.setAttribute("entry_ext", blog.getEntryPageExtension());
-        element.setAttribute("gen_rss", blog.isGenerateRssFeed() + "");
-        element.setAttribute("gen_arc_index", blog.isGenerateArchiveIndex() + "");
-        element.setAttribute("gen_entries", blog.isGenerateEntryPages() + "");
-        element.setAttribute("fp_filename", blog.getFrontPageFileName());
-        element.setAttribute("rss_filename", blog.getRssFileName());
-        element.setAttribute("arc_index_filename", blog.getArchiveIndexFileName());
-        element.setAttribute("locale", blog.getLocale().toString());
-        element.setAttribute("publish_all", blog.isPublishAll() + "");
-        element.setAttribute("type", blog.getType());
-        
-        Element outdatedArcs = new Element("OutdatedArchives");
-        ArchiveRange ar[] = blog.getOutdatedArchives();
-        for(int i = 0; i < ar.length; i++) {
-            Element arcRange = new Element("Archive");
-            arcRange.setAttribute("start", ar[i].getStartDate().getTime() + "");
-            arcRange.setAttribute("end", ar[i].getExpirationDate().getTime() + "");
-            outdatedArcs.addContent(arcRange);
-        }
-        element.addContent(outdatedArcs);
-        
-        Element outdatedCats = new Element("OutdatedCategories");
-        String cats[] = blog.getOutdatedCategories();
-        for(int i = 0; i < cats.length; i++) {
-            Element category = new Element("Category");
-            category.setText(cats[i]);
-            outdatedCats.addContent(category);
-        }
-        element.addContent(outdatedCats);
-        
-        Element outdatedEntries = new Element("OutdatedEntries");
-        long ids[] = blog.getOutdatedEntryIDs();
-        for(int i = 0; i < ids.length; i++) {
-            Element ent = new Element("Entry");
-            ent.setText(ids[i] + "");
-            outdatedEntries.addContent(ent);
-        }
-        element.addContent(outdatedEntries);
-        
-        Element genElement = new Element("Generator");
-        PageGenerator gen = blog.getPageGenerator();
-        genElement.setAttribute("charset", gen.getCharset());
-        genElement.setAttribute("range_format", gen.getArchiveRangeFormat());
-        genElement.setAttribute("span_range", gen.isSpanArcRange() + "");
-        genElement.setAttribute("date_format", gen.getDateFormat());
-        genElement.setAttribute("time_format", gen.getTimeFormat());
-        genElement.setAttribute("front_asc", gen.isFrontPageAscending() + "");
-        genElement.setAttribute("cat_asc", gen.isCategoryPageAscending() + "");
-        genElement.setAttribute("arc_asc", gen.isArchivePageAscending() + "");
-        genElement.setAttribute("limit_front", gen.isLimitFrontPage() + "");
-        genElement.setAttribute("front_page_limit", gen.getFrontPageLimit() + "");
-        genElement.setAttribute("limit_cat", gen.isLimitCategoryPage() + "");
-        genElement.setAttribute("cat_page_limit", gen.getCategoryPageLimit() + "");
-        genElement.setAttribute("limit_rss_body", gen.isLimitRssEntry() + "");
-        
-        
-        Element customTagsElement = new Element("CustomTags");
-        CustomTag tags[] = gen.getCustomTags();
-        for(int i = 0; i < tags.length; i++) {
-            Element tag = new Element("Tag");
-            tag.setAttribute("name", tags[i].getName());
-            tag.setText(tags[i].getValue());
-            customTagsElement.addContent(tag);
-        }
-        
-        genElement.addContent(customTagsElement);
-        element.addContent(genElement);
-        return element;
-    }
+		element.setAttribute("entry_ext", blog.getEntryPageExtension());
+		element.setAttribute("gen_rss", blog.isGenerateRssFeed() + "");
+		element.setAttribute("gen_arc_index", blog.isGenerateArchiveIndex() + "");
+		element.setAttribute("gen_entries", blog.isGenerateEntryPages() + "");
+		element.setAttribute("fp_filename", blog.getFrontPageFileName());
+		element.setAttribute("rss_filename", blog.getRssFileName());
+		element.setAttribute("arc_index_filename", blog.getArchiveIndexFileName());
+		element.setAttribute("locale", blog.getLocale().toString());
+		element.setAttribute("publish_all", blog.isPublishAll() + "");
+		element.setAttribute("type", blog.getType());
+                
+		Element outdatedArcs = new Element("OutdatedArchives");
+		ArchiveRange ar[] = blog.getOutdatedArchives();
+		for(int i = 0; i < ar.length; i++)
+		{
+			Element arcRange = new Element("Archive");
+			arcRange.setAttribute("start", ar[i].getStartDate().getTime() + "");
+			arcRange.setAttribute("end", ar[i].getExpirationDate().getTime() + "");
+			outdatedArcs.addContent(arcRange);		
+		}
+		element.addContent(outdatedArcs);
+		
+		Element outdatedCats = new Element("OutdatedCategories");
+		String cats[] = blog.getOutdatedCategories();
+		for(int i = 0; i < cats.length; i++)
+		{
+			Element category = new Element("Category");
+			category.setText(cats[i]);
+			outdatedCats.addContent(category);		
+		}
+		element.addContent(outdatedCats);
+		
+		Element outdatedEntries = new Element("OutdatedEntries");
+		long ids[] = blog.getOutdatedEntryIDs();
+		for(int i = 0; i < ids.length; i++)
+		{
+		    Element ent = new Element("Entry");
+		    ent.setText(ids[i] + "");
+		    outdatedEntries.addContent(ent);
+		}
+		element.addContent(outdatedEntries);
+		
+		Element genElement = new Element("Generator");
+		PageGenerator gen = blog.getPageGenerator();
+		genElement.setAttribute("charset", gen.getCharset());
+		genElement.setAttribute("range_format", gen.getArchiveRangeFormat());
+		genElement.setAttribute("span_range", gen.isSpanArcRange() + "");
+		genElement.setAttribute("date_format", gen.getDateFormat());
+		genElement.setAttribute("time_format", gen.getTimeFormat());
+		genElement.setAttribute("front_asc", gen.isFrontPageAscending() + "");
+		genElement.setAttribute("cat_asc", gen.isCategoryPageAscending() + "");
+		genElement.setAttribute("arc_asc", gen.isArchivePageAscending() + "");
+		genElement.setAttribute("limit_front", gen.isLimitFrontPage() + "");
+		genElement.setAttribute("front_page_limit", gen.getFrontPageLimit() + "");
+		genElement.setAttribute("limit_cat", gen.isLimitCategoryPage() + "");
+		genElement.setAttribute("cat_page_limit", gen.getCategoryPageLimit() + "");
+		genElement.setAttribute("limit_rss_body", gen.isLimitRssEntry() + "");
+		
+		
+		Element customTagsElement = new Element("CustomTags");
+		CustomTag tags[] = gen.getCustomTags();
+		for(int i = 0; i < tags.length; i++)
+		{
+			Element tag = new Element("Tag");
+			tag.setAttribute("name", tags[i].getName());
+			tag.setText(tags[i].getValue());
+			customTagsElement.addContent(tag);
+		}
+		
+		genElement.addContent(customTagsElement);	
+		element.addContent(genElement);
+		return element;		
+	}
     
-    private static Element createMailSettingsElement(Weblog blog) {
+    private static Element createMailSettingsElement(Weblog blog)
+    {        
         Element mailSettings = new Element("MailSettings");
         mailSettings.setAttribute("enabled", blog.isImportFromEmailEnabled() + "");
         if(blog.getLastEmailCheck() != null)
@@ -399,32 +433,36 @@
         transport.setAttribute("port", rpt.getPort() + "");
         transport.setAttribute("user", rpt.getUserName());
         if(rpt.isSavePassword())
-            transport.setAttribute("password",
-                    PasswordUtil.encrypt(rpt.getPassword(), PasswordUtil.KEY));
+            transport.setAttribute("password", 
+            PasswordUtil.encrypt(rpt.getPassword(), PasswordUtil.KEY));
         
         mailSettings.addContent(transport);
         return mailSettings;
     }
-    
-    private static Element createPublishTransportElement(Weblog blog) {
-        Element transport = new Element("Transport");
-        PublishTransport pt = blog.getPublishTransport();
-        if(pt instanceof RemoteTransport) {
-            RemoteTransport rpt = (RemoteTransport)pt;
-            transport.setAttribute("type", "sftp");
-            transport.setAttribute("server", rpt.getAddress());
-            transport.setAttribute("port", rpt.getPort() + "");
-            transport.setAttribute("user", rpt.getUserName());
-            if(rpt.isSavePassword())
-                transport.setAttribute("password",
-                        PasswordUtil.encrypt(rpt.getPassword(), PasswordUtil.KEY));
-            if(rpt instanceof FTPTransport) {
-                FTPTransport ftp = (FTPTransport)rpt;
-                transport.setAttribute("type", "ftp");
-                transport.setAttribute("passive", ftp.isPassiveMode()+"");
+	
+	private static Element createPublishTransportElement(Weblog blog)
+	{
+		Element transport = new Element("Transport");
+		PublishTransport pt = blog.getPublishTransport();
+		if(pt instanceof RemoteTransport)
+		{
+			RemoteTransport rpt = (RemoteTransport)pt;
+			transport.setAttribute("type", "sftp");
+			transport.setAttribute("server", rpt.getAddress());
+			transport.setAttribute("port", rpt.getPort() + "");
+			transport.setAttribute("user", rpt.getUserName());
+			if(rpt.isSavePassword())
+				transport.setAttribute("password", 
+				PasswordUtil.encrypt(rpt.getPassword(), PasswordUtil.KEY));
+			if(rpt instanceof FTPTransport)
+			{
+				FTPTransport ftp = (FTPTransport)rpt;
+				transport.setAttribute("type", "ftp");
+				transport.setAttribute("passive", ftp.isPassiveMode()+"");
                 Element e = new Element("ASCIITypes");
                 List exts = ftp.getASCIIExtensions();
-                for(Iterator it = exts.iterator(); it.hasNext();) {
+                for(Iterator it = exts.iterator(); it.hasNext();)
+                {
                     String ex = it.next().toString();
                     Element c = new Element("ext");
                     c.setText(ex);
@@ -432,252 +470,284 @@
                 }
                 
                 transport.addContent(e);
-            }
-        } else {
-            transport.setAttribute("type", "local");
-        }
-        
-        return transport;
-    }
-    
-    
-    /**
-     * Creates a WeblogList from an XML file
-     *
-     * @param path The path to the XML file
-     * @param backend The backend to connect the weblogs to
-     * @param authStore The author store for the weblogs
-     * @param catStore The category store for the weblogs
-     * @return A list of weblogs
-     * @throws IOException If an IO error occurs
-     * @throws JDOMException If a JDOM error occurs
-     */
-    public static WeblogList loadWeblogsFromXML(String path, WeblogBackend backend)
-    throws IOException, JDOMException {
-        WeblogList list = new WeblogList();
-        File f = new File(path);
-        Document document = createDocument(f);
-        loadWeblogList(document, f, list, backend);
-        
-        return list;
-    }
-    
-    private static void loadWeblogList(Document document, File path, WeblogList list, WeblogBackend backend) {
-        if(document == null)//couldn't load xml file
-            return;//return empty WeblogList
-        
-        Element root = document.getRootElement();
-        List weblogs = root.getChild("Weblogs").getChildren();
-        Iterator weblogsIt = weblogs.iterator();
-        //children should all be weblogs
-        while(weblogsIt.hasNext()) {
-            Element blogElement = (Element)weblogsIt.next();
-            Weblog w = createWeblogFromElement(blogElement,path);
-            if(w != null) {
-                w.setBackend(backend);
-                list.addWeblog(w);
-            }
-        }
-        list.sortList();
-    }
-    
-    private static Weblog createWeblogFromElement(Element blogEle, File path) {
-        Weblog weblog = null;
-        //different weblog types might be added later
-        //for now we're only dealing with TBWeblogs
-        if(blogEle.getName().equals("TBWeblog"))
-            weblog = createTBWeblogFromElement(blogEle, path);
-        
-        if(weblog == null)
-            return null;
-        
-        weblog.setPublishTransport(loadPublishTransportFromXML(blogEle));
-        loadPingServicesFromXML(blogEle, weblog);
+			}					
+		}
+		else
+		{
+			transport.setAttribute("type", "local");
+		}
+		
+		return transport;
+	}
+	
+
+	/**
+	 * Creates a WeblogList from an XML file
+	 * 
+	 * @param path The path to the XML file
+	 * @param backend The backend to connect the weblogs to
+	 * @param authStore The author store for the weblogs
+	 * @param catStore The category store for the weblogs
+	 * @return A list of weblogs
+	 * @throws IOException If an IO error occurs
+	 * @throws JDOMException If a JDOM error occurs
+	 */
+	public static WeblogList loadWeblogsFromXML(String path, WeblogBackend backend) 
+	throws IOException, JDOMException
+	{
+		WeblogList list = new WeblogList();
+		File f = new File(path);		
+		Document document = createDocument(f);		
+		loadWeblogList(document, f, list, backend);			
+
+		return list;
+	}
+	
+	private static void loadWeblogList(Document document, File path, WeblogList list, WeblogBackend backend)
+	{
+		if(document == null)//couldn't load xml file
+			return;//return empty WeblogList
+			
+		Element root = document.getRootElement();
+		List weblogs = root.getChild("Weblogs").getChildren();
+		Iterator weblogsIt = weblogs.iterator();
+		//children should all be weblogs
+		while(weblogsIt.hasNext())
+		{
+			Element blogElement = (Element)weblogsIt.next();
+			Weblog w = createWeblogFromElement(blogElement,path);
+			if(w != null)
+			{				
+				w.setBackend(backend);
+				list.addWeblog(w);
+			}
+		}
+		list.sortList();		
+	}
+	
+	private static Weblog createWeblogFromElement(Element blogEle, File path)
+	{
+		Weblog weblog = null;
+		//different weblog types might be added later
+		//for now we're only dealing with TBWeblogs
+		if(blogEle.getName().equals("TBWeblog"))
+			weblog = createTBWeblogFromElement(blogEle, path);
+		
+		if(weblog == null)
+			return null;
+		
+		weblog.setPublishTransport(loadPublishTransportFromXML(blogEle));
+		loadPingServicesFromXML(blogEle, weblog);
         loadEmailSettingsFromXML(blogEle, weblog);
-        weblog.setTitle(blogEle.getAttributeValue("title", "Untitled"));
-        String description = "";
-        Element desc = blogEle.getChild("Description");
-        if(desc != null)
-            description = desc.getText();
-        weblog.setDescription(description);
-        try {
-            long time = Long.parseLong(
-                    blogEle.getAttributeValue("last_publish",
-                    System.currentTimeMillis() + ""));
-            weblog.setLastPublishDate(new Date(time));
-        } catch(Exception ex){}
+		weblog.setTitle(blogEle.getAttributeValue("title", "Untitled"));
+		String description = "";
+		Element desc = blogEle.getChild("Description");
+		if(desc != null)
+			description = desc.getText();
+		weblog.setDescription(description);
+		try
+		{
+			long time = Long.parseLong(
+				blogEle.getAttributeValue("last_publish", 
+				System.currentTimeMillis() + ""));
+			weblog.setLastPublishDate(new Date(time));
+		}
+		catch(Exception ex){}
         weblog.setPublishFailed(Boolean.parseBoolean(blogEle.getAttributeValue("publish_failed", "false")));
-        
+		
         return weblog; //element wasn't a known type
-    }
-    
-    private static TBWeblog createTBWeblogFromElement(Element element, File path) {
-        String key = element.getAttributeValue("key");
-        if(key == null)
-            return null; //can't continue if this weblog doesnt have a unique key
-        
-        TBWeblog tb = new TBWeblog(path.getParentFile(), key);
-        String genericUrl = "http://www.mysite.com";
-        String basePath = element.getAttributeValue("base_path", "/");
-        String url = element.getAttributeValue("url", genericUrl);
-        String arcUrl = element.getAttributeValue("arc_url", genericUrl);
-        String mediaUrl = element.getAttributeValue("media_url", genericUrl);
-        tb.setBlogUrls(basePath, url, arcUrl, mediaUrl);
-        
-        tb.setCategoriesExtension(element.getAttributeValue("cat_ext", ".html"));
-        tb.setArchivesExtension(element.getAttributeValue("arc_ext", ".html"));
-        tb.setEntryPageExtension(element.getAttributeValue("entry_ext", ".html"));
-        tb.setFrontPageFileName(element.getAttributeValue("fp_filename", "blog.html"));
-        tb.setRssFileName(element.getAttributeValue("rss_filename", "rss.xml"));
-        tb.setArchiveIndexFileName(element.getAttributeValue("arc_index_filename", "list.html"));
-        
+	}
+	
+	private static TBWeblog createTBWeblogFromElement(Element element, File path)
+	{
+		String key = element.getAttributeValue("key");
+		if(key == null)
+			return null; //can't continue if this weblog doesnt have a unique key
+			
+		TBWeblog tb = new TBWeblog(path.getParentFile(), key);
+		String genericUrl = "http://www.mysite.com";
+		String basePath = element.getAttributeValue("base_path", "/");
+		String url = element.getAttributeValue("url", genericUrl);
+		String arcUrl = element.getAttributeValue("arc_url", genericUrl);
+		String mediaUrl = element.getAttributeValue("media_url", genericUrl);
+		tb.setBlogUrls(basePath, url, arcUrl, mediaUrl);
+		
+		tb.setCategoriesExtension(element.getAttributeValue("cat_ext", ".html"));
+		tb.setArchivesExtension(element.getAttributeValue("arc_ext", ".html"));
+		tb.setEntryPageExtension(element.getAttributeValue("entry_ext", ".html"));
+		tb.setFrontPageFileName(element.getAttributeValue("fp_filename", "blog.html"));
+		tb.setRssFileName(element.getAttributeValue("rss_filename", "rss.xml"));
+		tb.setArchiveIndexFileName(element.getAttributeValue("arc_index_filename", "list.html"));
+		
         tb.setGenerateCategoryFeeds(element.getAttributeValue("gen_cat_feed", "false").equals("true"));
         tb.setCategoriesFeedExtension(element.getAttributeValue("cat_feed_ext", ".rss"));
         
-        tb.setGenerateRssFeed(element.getAttributeValue("gen_rss", "true").equals("true"));
-        tb.setGenerateArchiveIndex(element.getAttributeValue("gen_arc_index", "true").equals("true"));
-        tb.setGenerateEntryPages(element.getAttributeValue("gen_entries", "false").equals("true"));
-        
-        tb.setLocale(createLocale(element.getAttributeValue("locale", Locale.getDefault().toString())));
-        tb.setPublishAll(element.getAttributeValue("publish_all", "true").equals("true"));
-        tb.setType(element.getAttributeValue("type").toString());
-        
-        int arcPolicy = TBWeblog.ARCHIVE_MONTHLY;
-        int dayInterval = 5;
-        Date arcBaseDate = new Date(0);
-        try {
-            arcPolicy = Integer.parseInt(
-                    element.getAttributeValue("arc_policy", Integer.toString(TBWeblog.ARCHIVE_MONTHLY)));
-            dayInterval = Integer.parseInt(element.getAttributeValue("day_interval", "5"));
-            long time = Long.parseLong(element.getAttributeValue("base_date"));
-            arcBaseDate = new Date(time);
-        } catch(Exception ex){}
-        tb.setArchivePolicy(arcPolicy);
-        tb.setArchiveByDayInterval(dayInterval);
-        tb.setArchiveBaseDate(arcBaseDate);
-        
-        //load outdated archives from xml
-        Element outdatedArcs = element.getChild("OutdatedArchives");
-        if(outdatedArcs != null) {
-            Iterator itr = (outdatedArcs.getChildren()).iterator();
-            while(itr.hasNext()) {
-                Date start = new Date();
-                Date exp = new Date();
-                Element e = (Element)itr.next();
-                if(e.getName().equals("Archive")) {
-                    try {
-                        long d1 = Long.parseLong(e.getAttributeValue("start"));
-                        long d2 = Long.parseLong(e.getAttributeValue("end"));
-                        start.setTime(d1);
-                        exp.setTime(d2);
-                        tb.addOutdatedArchive(new ArchiveRange(start, exp));
-                    } catch(Exception ex){}
-                }
-            }
-        }
-        
-        //load outdated cats from xml
-        Element outdatedCats = element.getChild("OutdatedCategories");
-        if(outdatedCats != null) {
-            Iterator itr = (outdatedCats.getChildren()).iterator();
-            while(itr.hasNext()) {
-                Element e = (Element)itr.next();
-                if(e.getName().equals("Category")) {
-                    tb.addOutdatedCategory(e.getText());
-                }
-            }
-        }
-        
-        //load outdated entries from xml
-        Element outdatedEnts = element.getChild("OutdatedEntries");
-        if(outdatedEnts != null) {
-            Iterator itr = (outdatedEnts.getChildren()).iterator();
-            while(itr.hasNext()) {
-                Element e = (Element)itr.next();
-                if(e.getName().equals("Entry")) {
-                    try{
-                        long id = Long.parseLong(e.getText());
-                        tb.addOutdatedEntryID(new Long(id));
-                    }catch(Exception ex){}
-                }
-            }
-        }
-        
-        loadGeneratorSettingsFromXML(tb, element);
-        return tb;
-    }
+		tb.setGenerateRssFeed(element.getAttributeValue("gen_rss", "true").equals("true"));
+		tb.setGenerateArchiveIndex(element.getAttributeValue("gen_arc_index", "true").equals("true"));
+		tb.setGenerateEntryPages(element.getAttributeValue("gen_entries", "false").equals("true"));
+		
+		tb.setLocale(createLocale(element.getAttributeValue("locale", Locale.getDefault().toString())));
+		tb.setPublishAll(element.getAttributeValue("publish_all", "true").equals("true"));
+		tb.setType(element.getAttributeValue("type").toString());
+                
+		int arcPolicy = TBWeblog.ARCHIVE_MONTHLY;
+		int dayInterval = 5;
+		Date arcBaseDate = new Date(0);
+		try
+		{
+			arcPolicy = Integer.parseInt(
+				element.getAttributeValue("arc_policy", Integer.toString(TBWeblog.ARCHIVE_MONTHLY)));
+			dayInterval = Integer.parseInt(element.getAttributeValue("day_interval", "5"));
+			long time = Long.parseLong(element.getAttributeValue("base_date"));
+			arcBaseDate = new Date(time);
+		}
+		catch(Exception ex){}
+		tb.setArchivePolicy(arcPolicy);
+		tb.setArchiveByDayInterval(dayInterval);
+		tb.setArchiveBaseDate(arcBaseDate);
+		
+		//load outdated archives from xml
+		Element outdatedArcs = element.getChild("OutdatedArchives");
+		if(outdatedArcs != null)
+		{		
+			Iterator itr = (outdatedArcs.getChildren()).iterator();
+			while(itr.hasNext()) 
+			{
+				Date start = new Date();
+				Date exp = new Date();
+				Element e = (Element)itr.next();
+				if(e.getName().equals("Archive"))
+				{
+					try
+					{
+						long d1 = Long.parseLong(e.getAttributeValue("start"));
+						long d2 = Long.parseLong(e.getAttributeValue("end"));
+						start.setTime(d1);
+						exp.setTime(d2);
+						tb.addOutdatedArchive(new ArchiveRange(start, exp));
+					}
+					catch(Exception ex){}
+				}
+			}
+		}
+		
+		//load outdated cats from xml
+		Element outdatedCats = element.getChild("OutdatedCategories");
+		if(outdatedCats != null)
+		{		
+			Iterator itr = (outdatedCats.getChildren()).iterator();
+			while(itr.hasNext()) 
+			{
+				Element e = (Element)itr.next();
+				if(e.getName().equals("Category"))
+				{
+					tb.addOutdatedCategory(e.getText());
+				}
+			}
+		}
+		
+		//load outdated entries from xml
+		Element outdatedEnts = element.getChild("OutdatedEntries");
+		if(outdatedEnts != null)
+		{		
+			Iterator itr = (outdatedEnts.getChildren()).iterator();
+			while(itr.hasNext()) 
+			{
+				Element e = (Element)itr.next();
+				if(e.getName().equals("Entry"))
+				{
+					try{
+					    long id = Long.parseLong(e.getText());
+					    tb.addOutdatedEntryID(new Long(id));
+					}catch(Exception ex){}				    
+				}
+			}
+		}
+		
+		loadGeneratorSettingsFromXML(tb, element);
+		return tb;		
+	}
+	
+	private static void loadGeneratorSettingsFromXML(TBWeblog tbw, Element element)
+	{
+		//set up the page generator defaults
+		PageGenerator gen = tbw.getPageGenerator();
+		Element genElement = element.getChild("Generator");
+		if(genElement == null)
+			return;
+		
+		gen.setCharset(genElement.getAttributeValue("charset", "UTF-8"));
+		gen.setDateFormat(genElement.getAttributeValue("date_format"));
+		gen.setTimeFormat(genElement.getAttributeValue("time_format"));
+		String s = genElement.getAttributeValue("span_range");
+		boolean span = s != null && s.equals("true");		
+		gen.setArchiveRangeFormat(genElement.getAttributeValue("range_format"), span);
+		s = genElement.getAttributeValue("front_asc");
+		gen.setFrontPageAscending(s != null && s.equals("true"));
+		s = genElement.getAttributeValue("arc_asc");
+		gen.setArchivePageAscending(s != null && s.equals("true"));
+		s = genElement.getAttributeValue("cat_asc");
+		gen.setCategoryPageAscending(s != null && s.equals("true"));
+		
+		int fpLimit = 10;
+		int catLimit = 20;
+		try
+		{
+			fpLimit = Integer.parseInt(genElement.getAttributeValue("front_page_limit"));
+			catLimit = Integer.parseInt(genElement.getAttributeValue("cat_page_limit"));
+		}
+		catch(Exception ex){}
+		
+		gen.setLimitFrontPage(genElement.getAttributeValue("limit_front", "true").equals("true"));
+		gen.setFrontPageLimit(fpLimit);		
+		gen.setLimitCategoryPage(genElement.getAttributeValue("limit_cat", "true").equals("true"));
+		gen.setCategoryPageLimit(catLimit);
+		s = genElement.getAttributeValue("limit_rss_body");
+		gen.setLimitRssEntry(s != null && s.equals("true"));
+		
+		Element custTags = genElement.getChild("CustomTags");
+		if(custTags == null)return;
+		Iterator itr = custTags.getChildren().iterator();		
+		while(itr.hasNext()) 
+		{
+			Element e = (Element)itr.next();
+			if(e.getName().equals("Tag"))
+			{
+				String name = e.getAttributeValue("name");
+				if(name == null)
+					continue;
+				String value = e.getText();
+				CustomTag tag = new CustomTag(name, value);
+				gen.addCustomTag(tag);	
+			}
+		}		
+	}
+	
+	
+	
+	private static void loadPingServicesFromXML(Element parent, Weblog blog)
+	{
+		Element services = parent.getChild("PingServices");
+		if(services == null)
+			services = new Element("PingServices");
+			
+		Iterator itr = (services.getChildren()).iterator();
+		while(itr.hasNext()) 
+		{
+			Element service = (Element)itr.next();
+			if(service.getName().equals("WeblogsDotComPing"))
+			{
+				WeblogsDotComPing ping = new WeblogsDotComPing();
+				ping.setServiceUrl(service.getAttributeValue("url"));
+				ping.setServiceName(service.getAttributeValue("name"));
+				ping.setEnabled(service.getAttributeValue("enabled", "true").equals("true"));
+				blog.addPingService(ping);		  
+			}
+		}
+	}
     
-    private static void loadGeneratorSettingsFromXML(TBWeblog tbw, Element element) {
-        //set up the page generator defaults
-        PageGenerator gen = tbw.getPageGenerator();
-        Element genElement = element.getChild("Generator");
-        if(genElement == null)
-            return;
-        
-        gen.setCharset(genElement.getAttributeValue("charset", "UTF-8"));
-        gen.setDateFormat(genElement.getAttributeValue("date_format"));
-        gen.setTimeFormat(genElement.getAttributeValue("time_format"));
-        String s = genElement.getAttributeValue("span_range");
-        boolean span = s != null && s.equals("true");
-        gen.setArchiveRangeFormat(genElement.getAttributeValue("range_format"), span);
-        s = genElement.getAttributeValue("front_asc");
-        gen.setFrontPageAscending(s != null && s.equals("true"));
-        s = genElement.getAttributeValue("arc_asc");
-        gen.setArchivePageAscending(s != null && s.equals("true"));
-        s = genElement.getAttributeValue("cat_asc");
-        gen.setCategoryPageAscending(s != null && s.equals("true"));
-        
-        int fpLimit = 10;
-        int catLimit = 20;
-        try {
-            fpLimit = Integer.parseInt(genElement.getAttributeValue("front_page_limit"));
-            catLimit = Integer.parseInt(genElement.getAttributeValue("cat_page_limit"));
-        } catch(Exception ex){}
-        
-        gen.setLimitFrontPage(genElement.getAttributeValue("limit_front", "true").equals("true"));
-        gen.setFrontPageLimit(fpLimit);
-        gen.setLimitCategoryPage(genElement.getAttributeValue("limit_cat", "true").equals("true"));
-        gen.setCategoryPageLimit(catLimit);
-        s = genElement.getAttributeValue("limit_rss_body");
-        gen.setLimitRssEntry(s != null && s.equals("true"));
-        
-        Element custTags = genElement.getChild("CustomTags");
-        if(custTags == null)return;
-        Iterator itr = custTags.getChildren().iterator();
-        while(itr.hasNext()) {
-            Element e = (Element)itr.next();
-            if(e.getName().equals("Tag")) {
-                String name = e.getAttributeValue("name");
-                if(name == null)
-                    continue;
-                String value = e.getText();
-                CustomTag tag = new CustomTag(name, value);
-                gen.addCustomTag(tag);
-            }
-        }
-    }
-    
-    
-    
-    private static void loadPingServicesFromXML(Element parent, Weblog blog) {
-        Element services = parent.getChild("PingServices");
-        if(services == null)
-            services = new Element("PingServices");
-        
-        Iterator itr = (services.getChildren()).iterator();
-        while(itr.hasNext()) {
-            Element service = (Element)itr.next();
-            if(service.getName().equals("WeblogsDotComPing")) {
-                WeblogsDotComPing ping = new WeblogsDotComPing();
-                ping.setServiceUrl(service.getAttributeValue("url"));
-                ping.setServiceName(service.getAttributeValue("name"));
-                ping.setEnabled(service.getAttributeValue("enabled", "true").equals("true"));
-                blog.addPingService(ping);
-            }
-        }
-    }
-    
-    private static void loadEmailSettingsFromXML(Element parent, Weblog blog) {
+    private static void loadEmailSettingsFromXML(Element parent, Weblog blog)
+    {
         Element mailSettings = parent.getChild("MailSettings");
         if(mailSettings == null)
             return;
@@ -694,102 +764,126 @@
         configureRemoteTransport(blog.getMailTransport(), transport, 110);
     }
     
-    private static int parseInt(String intStr, int defaultVal) {
-        try {
+    private static int parseInt(String intStr, int defaultVal)
+    {
+        try
+        {
             defaultVal = Integer.parseInt(intStr);
-        } catch(Exception ex){}
+        }
+        catch(Exception ex){}
         
         return defaultVal;
     }
     
-    private static Date parseDate(String epocString) {
+    private static Date parseDate(String epocString)
+    {
         long d = 0;
-        try {
+        try
+        {
             d = Long.parseLong(epocString);
-        } catch(Exception ex){}
+        }
+        catch(Exception ex){}
         
         return new Date(d);
     }
-    
-    private static Locale createLocale(String str) {
-        Vector v = new Vector();
-        if(str != null) {
-            StringTokenizer st = new StringTokenizer(str, "_");
-            while (st.hasMoreTokens()) {
-                v.add(st.nextToken());
-            }
-        }
-        
-        Locale loc = Locale.getDefault();
-        if(v.size() == 3)
-            loc = new Locale(v.elementAt(0).toString(),
-                    v.elementAt(1).toString(), v.elementAt(2).toString());
-        else if(v.size() == 2)
-            loc = new Locale(v.elementAt(0).toString(),
-                    v.elementAt(1).toString());
-        else if(v.size() == 1)
-            loc = new Locale(v.elementAt(0).toString());
-        
-        return loc;
-    }
-    
-    private static PublishTransport loadPublishTransportFromXML(Element parent) {
-        Element transport = parent.getChild("Transport");
-        if(transport == null)
-            transport = new Element("Transport");
-        PublishTransport pubTransport = null;
-        String type = transport.getAttributeValue("type", "local");
-        
-        if(type.equals("ftp") || type.equals("sftp")) {
-            RemotePublishTransport rtp = null;
-            int port = 22;
-            if(type.equals("ftp")) {
-                FTPTransport ftp = new FTPTransport();
-                ftp.setPassiveMode(transport.getAttributeValue("passive", "true").equals("true"));
-                Element asciiElem = transport.getChild("ASCIITypes");
+	
+	private static Locale createLocale(String str)
+	{		
+		Vector v = new Vector();
+		if(str != null)
+		{		
+			StringTokenizer st = new StringTokenizer(str, "_");
+			while (st.hasMoreTokens()) 
+			{
+				v.add(st.nextToken());			 
+			}
+		}
+		
+		Locale loc = Locale.getDefault();
+		if(v.size() == 3)
+			loc = new Locale(v.elementAt(0).toString(), 
+				v.elementAt(1).toString(), v.elementAt(2).toString());
+		else if(v.size() == 2)
+			loc = new Locale(v.elementAt(0).toString(), 
+				v.elementAt(1).toString());
+		else if(v.size() == 1)
+		    loc = new Locale(v.elementAt(0).toString());
+		
+		return loc;		
+	}
+	
+	private static PublishTransport loadPublishTransportFromXML(Element parent)
+	{
+		Element transport = parent.getChild("Transport");
+		if(transport == null)
+			transport = new Element("Transport");		
+		PublishTransport pubTransport = null;
+		String type = transport.getAttributeValue("type", "local");
+		
+		if(type.equals("ftp") || type.equals("sftp"))
+		{
+			RemotePublishTransport rtp = null;
+			int port = 22;
+			if(type.equals("ftp"))
+			{
+				FTPTransport ftp = new FTPTransport();
+				ftp.setPassiveMode(transport.getAttributeValue("passive", "true").equals("true"));
+				Element asciiElem = transport.getChild("ASCIITypes");
                 ArrayList lst = new ArrayList();
-                if(asciiElem == null) {
+                if(asciiElem == null)
+                {                    
                     lst.add("cgi");
                     lst.add("pl");
                     lst.add("php");
-                    lst.add("asp");
-                } else {
+                    lst.add("asp");                    
+                }
+                else
+                {
                     List ch = asciiElem.getChildren();
-                    for(int i = 0; i < ch.size(); i++) {
+                    for(int i = 0; i < ch.size(); i++)
+                    {
                         Element e = (Element)ch.get(i);
                         if(e.getName() == "ext");
-                        lst.add(e.getText());
+                            lst.add(e.getText());
                     }
                     
                 }
                 ftp.setASCIIExtentions(lst);
                 rtp = ftp;
-                port = 21;
-            } else
-                rtp = new SFTPTransport();
-            
-            configureRemoteTransport(rtp, transport, port);
-            pubTransport = rtp;
-        } else
-            pubTransport = new LocalTransport();
-        
-        return pubTransport;
-    }
+				port = 21;
+			}
+			else
+				rtp = new SFTPTransport();
+			
+			configureRemoteTransport(rtp, transport, port);
+			pubTransport = rtp;
+		}
+		else		
+			pubTransport = new LocalTransport();
+		
+		return pubTransport;
+	}
     
-    private static void configureRemoteTransport(RemoteTransport rtp, Element transport, int defaultPort) {
-        try {
+    private static void configureRemoteTransport(RemoteTransport rtp, Element transport, int defaultPort)
+    {        
+        try
+        {
             defaultPort = Integer.parseInt(transport.getAttributeValue("port"));
         }catch(Exception ex){}
         
-        rtp.setPort(defaultPort);
+        rtp.setPort(defaultPort);                  
         rtp.setAddress(transport.getAttributeValue("server"));
         rtp.setUserName(transport.getAttributeValue("user"));
-        String password = transport.getAttributeValue("password");
+        String password = transport.getAttributeValue("password");          
         rtp.setSavePassword(password != null);
-        if(rtp.isSavePassword()) {
-            try {
+        if(rtp.isSavePassword())
+        {
+            try
+            {
                 password = PasswordUtil.decrypt(password, PasswordUtil.KEY);
-            } catch(Exception ex) {
+            }
+            catch(Exception ex)
+            {
                 password = "";
             }
             rtp.setPassword(password);




More information about the cvs mailing list