summaryrefslogtreecommitdiff
path: root/scripting/examples/java/Newsgroup/SubscribedNewsgroups.java
diff options
context:
space:
mode:
Diffstat (limited to 'scripting/examples/java/Newsgroup/SubscribedNewsgroups.java')
-rw-r--r--scripting/examples/java/Newsgroup/SubscribedNewsgroups.java373
1 files changed, 373 insertions, 0 deletions
diff --git a/scripting/examples/java/Newsgroup/SubscribedNewsgroups.java b/scripting/examples/java/Newsgroup/SubscribedNewsgroups.java
new file mode 100644
index 000000000000..b227791c0299
--- /dev/null
+++ b/scripting/examples/java/Newsgroup/SubscribedNewsgroups.java
@@ -0,0 +1,373 @@
+import java.io.*;
+import java.util.Vector;
+
+
+public class SubscribedNewsgroups {
+
+
+ private static NewsGroup[] allSubscribed = null;
+ private static boolean windows = false;
+
+ public static void main( String[] args ) {
+ // Test the class
+ SubscribedNewsgroups subscribed = new SubscribedNewsgroups();
+
+ NewsGroup allGroups[] = subscribed.getNewsGroups();
+
+ if( allGroups == null )
+ {
+ System.out.println("Could not find subscribed newsgroups from mozilla/netscape mailrc files");
+ }
+ else
+ {
+ for( int i=0; i < allGroups.length; i++ )
+ {
+ System.out.println( "Hostname is: " + allGroups[i].getHostName() + " Newsgroup is: " + allGroups[i].getNewsgroupName() );
+ }
+ }
+ }
+
+
+
+ // Only public method of the class
+ // Returns and array of unique NewsGroup objects
+ public NewsGroup[] getNewsGroups()
+ {
+ windows = false;
+ if( System.getProperty( "os.name" ).indexOf( "Windows" ) != -1 )
+ {
+ windows = true;
+ }
+
+ String mozillaHome = "";
+ if( windows )
+ {
+ mozillaHome = System.getProperty( "user.home" ) + System.getProperty( "file.separator" ) + "Application Data" + System.getProperty( "file.separator" ) + "Mozilla" + System.getProperty( "file.separator" ) + "Profiles";
+ //System.out.println( "Windows mozilla path: " + mozillaHome );
+ }
+ else
+ {
+ mozillaHome = System.getProperty( "user.home" ) + System.getProperty( "file.separator" ) + ".mozilla";
+ //System.out.println( "Unix/Linux mozilla path: " + mozillaHome );
+ }
+ if( !new File( mozillaHome ).isDirectory() )
+ {
+ //System.out.println("Could not find .mozilla directory");
+ return null;
+ }
+ //System.out.println(".mozilla directory found");
+
+ // Get all the profiles belonging to the user
+ File profiles[] = findProfiles( new File ( mozillaHome ) );
+ if( profiles.length < 1 )
+ {
+ //System.out.println("Could not find Profiles");
+ return null;
+ }
+ //System.out.println("Profiles found");
+
+ // Get the News directory for each profile
+ File allNewsDirs[] = new File[ profiles.length ];
+ for( int i=0; i < profiles.length; i++ ) {
+ File newsDir = findNewsDir( profiles[i] );
+ allNewsDirs[i] = newsDir;
+ //System.out.println( "News is at: " + newsDir.getPath() );
+ }
+ // Check that at least one News directory exists and remove nulls
+ boolean newsFound = false;
+ //Vector nonNullNews = new Vector();
+ for( int i=0; i < allNewsDirs.length; i++ ) {
+ if( allNewsDirs[i] != null ) {
+ newsFound = true;
+ break;
+ }
+ }
+ if( !newsFound )
+ {
+ //System.out.println("Could not find News directory");
+ return null;
+ }
+ //System.out.println("News directory found");
+
+ // Get all the mailrc files for each News directory
+ File allMailrcs[] = findMailrcFiles( allNewsDirs );
+ if( allMailrcs == null )
+ {
+ //System.out.println("Could not find mailrc files");
+ return null;
+ }
+ //System.out.println("mailrc files found");
+
+ Vector subscribed = new Vector();
+ // Get the newsgroups in each mailrc file
+ for( int i=0; i < allMailrcs.length; i++ )
+ {
+ File mailrc = (File) allMailrcs[i];
+ NewsGroup newsgroup[] = findNewsgroups( mailrc );
+ //if the Newsgroup has not already been added to the list
+ for( int j=0; j < newsgroup.length; j++ )
+ {
+ // if newsgroup is unique then add to the list
+ if( !listed( newsgroup[j], subscribed ) )
+ {
+ subscribed.addElement( newsgroup[j] );
+ }
+ }
+ }
+
+ // Copy all unique Newsgroups into the global array
+ allSubscribed = new NewsGroup[ subscribed.size() ];
+ subscribed.copyInto( allSubscribed );
+ // Test that at least one subscribed newsgroup has been found
+ if( allSubscribed.length < 1 )
+ {
+ //System.out.println("Could not find Subscribed newsgroups ");
+ return null;
+ }
+ //System.out.println("Subscribed newsgroups found");
+
+ return allSubscribed;
+ }
+
+
+
+
+ // Tests if the NewsGroup object has already been listed by another mailrc file
+ private static boolean listed( NewsGroup newsgroup, Vector uniqueSubscription )
+ {
+ for(int i=0; i < uniqueSubscription.size(); i++)
+ {
+ NewsGroup tempGroup = (NewsGroup) uniqueSubscription.elementAt(i);
+ // Test for duplication
+ if(newsgroup.getHostName().equalsIgnoreCase( tempGroup.getHostName()) &&
+ newsgroup.getNewsgroupName().equalsIgnoreCase( tempGroup.getNewsgroupName() ) )
+ return true;
+ }
+ return false;
+ }
+
+
+
+
+ // Finds all the NewsGroups in an individual mailrc file
+ private static NewsGroup[] findNewsgroups(File mailrcfile )
+ {
+
+ String hostname = "";
+ String newsgroup = "";
+ NewsGroup mailrcNewsGroups[] = null;
+
+ //Retrieve name of news host/server from file name
+ //Sequentially access each of the newsgroups
+ //If the newsgroup is not already contained in the global NewsGroup[] array then add it
+
+ String filename = mailrcfile.getPath();
+ if( windows )
+ {
+ // Windows format "staroffice-news.germany.sun.com.rc"
+ int hostNameStart = filename.lastIndexOf("\\") + 1;
+ int hostNameEnd = filename.indexOf(".rc");
+ hostname = filename.substring( hostNameStart, hostNameEnd );
+ }
+ else
+ {
+ // Unix/Linux format "newsrc-staroffice-news.germany.sun.com"
+ int hostNameStart = filename.lastIndexOf("newsrc-") + 7;
+ hostname = filename.substring( hostNameStart, filename.length() );
+ }
+
+ // Assumes the content format in Window is the same as Unix/Linux (unknown at the moment)
+ // i.e. a list of newsgroups each ending with a ":"
+ LineNumberReader in = null;
+ try {
+ in = new LineNumberReader( new FileReader( mailrcfile ) );
+ Vector groups = new Vector();
+ String inString = "";
+ int line = 0;
+ while( inString != null )
+ {
+ in.setLineNumber( line );
+ inString = in.readLine();
+ line++;
+ if( inString != null )
+ {
+ int newsgroupEnd = inString.indexOf(":");
+ newsgroup = inString.substring( 0, newsgroupEnd );
+ NewsGroup group = new NewsGroup( hostname, newsgroup );
+ groups.addElement( group );
+ }
+ }
+ mailrcNewsGroups = new NewsGroup[ groups.size() ];
+ groups.copyInto(mailrcNewsGroups);
+ in.close();
+ }
+ catch( IOException ioe ) {
+ ioe.printStackTrace();
+ }
+
+ return mailrcNewsGroups;
+ }
+
+
+ // Finds all the mailrc files for all the given News directories
+ private static File[] findMailrcFiles(File[] newsDirs)
+ {
+ Vector allFiles = new Vector();
+
+ for( int i=0; i < newsDirs.length; i++ )
+ {
+ //System.out.println( "Finding mailrc for: " + newsDirs[i] );
+ if( newsDirs[i] != null )
+ {
+ File mailrcFiles[] = newsDirs[i].listFiles( new VersionFilter() );
+ if( mailrcFiles != null )
+ {
+ //System.out.println( "Number found: " + mailrcFiles.length );
+ for( int j=0; j < mailrcFiles.length; j++ )
+ {
+ //System.out.println( "This mailrc was found: " + mailrcFiles[j] );
+ allFiles.addElement( mailrcFiles[j] );
+ }
+ }
+ }
+ }
+ File allMailrcFiles[] = new File[ allFiles.size() ];
+ allFiles.copyInto(allMailrcFiles);
+
+ //System.out.println( "number of mailrcs in total: " + allMailrcFiles.length );
+
+ if( allMailrcFiles.length == 0 ) {
+ //System.out.println( "Returning null");
+ return null;
+ }
+
+ //System.out.println( "Returning an File array containing mailrcs");
+ return allMailrcFiles;
+ }
+
+
+ // Finds all profiles belonging to one user (can be more than one)
+ private static File[] findProfiles(File start)
+ {
+ // Get all files and directories in .mozilla
+ File allFiles[] = start.listFiles();
+ File[] dirs = new File[allFiles.length];
+ int dirCounter = 0;
+
+ // Remove files leaving directories only
+ for(int i=0; i < allFiles.length; i++ )
+ {
+ if(allFiles[i].isDirectory())
+ {
+ dirs[dirCounter] = allFiles[i];
+ dirCounter++;
+ }
+ }
+
+ // Add each directory to a user profile array
+ File[] profileDirs = new File[dirCounter];
+ for( int i=0; i < dirCounter; i++ )
+ {
+ profileDirs[i] = dirs[i];
+ }
+
+ // return a File array containing the profile dirs
+ return profileDirs;
+ }
+
+
+ // Recursively searches for the News directory for a given profile directory
+ private static File findNewsDir(File start)
+ {
+ File mailrcFile = null;
+
+ // File array containing all matches for the version filter ("News")
+ File files[] = start.listFiles(new VersionFilter());
+ // If the array is empty then no matches were found
+ if (files.length == 0)
+ {
+ // File array of all the directories in File start
+ File dirs[] = start.listFiles(new DirFilter());
+ // for each of the directories check for a match
+ for (int i=0; i< dirs.length; i++)
+ {
+ mailrcFile = findNewsDir(dirs[i]);
+ if (mailrcFile != null)
+ {
+ // break the for loop
+ break;
+ }
+ }
+ }
+ else
+ {
+ // end recursion
+ // Check for a News directory inside the News directory (fix for bug)
+ // Original solution had only "mailrcFile = files[0];"
+
+ boolean noChildNews = true;
+ File checkChildNewsDirs[] = files[0].listFiles(new VersionFilter());
+ if( checkChildNewsDirs != null )
+ {
+ for( int i=0; i < checkChildNewsDirs.length; i++ )
+ {
+ if( checkChildNewsDirs[i].getName().equals( "News" ) )
+ {
+ noChildNews = false;
+ break;
+ }
+ }
+ }
+
+ if( noChildNews )
+ {
+ mailrcFile = files[0];
+ }
+ else
+ {
+ String childNewsPathName = files[0].getAbsolutePath() + System.getProperty( "file.separator" ) + "News";
+ mailrcFile = new File( childNewsPathName );
+ }
+
+ }
+
+ // return a File representing the News dir in a profile
+ return mailrcFile;
+ }
+}
+
+
+
+class DirFilter implements FileFilter
+{
+ public boolean accept(File aFile)
+ {
+ return aFile.isDirectory();
+ }
+}
+
+
+class VersionFilter implements FileFilter
+{
+ public boolean accept(File aFile)
+ {
+ if( System.getProperty( "os.name" ).indexOf( "Windows" ) != -1 )
+ {
+ if (aFile.getName().compareToIgnoreCase("News") == 0 ||
+ aFile.getName().indexOf(".rc") != -1 )
+ {
+ return true;
+ }
+ }
+ else
+ {
+ if (aFile.getName().compareToIgnoreCase("News") == 0 ||
+ aFile.getName().indexOf("newsrc") != -1 )
+ {
+ return true;
+ }
+ }
+
+ return false;
+ }
+}