diff options
Diffstat (limited to 'scripting/examples/java/Newsgroup/SubscribedNewsgroups.java')
-rw-r--r-- | scripting/examples/java/Newsgroup/SubscribedNewsgroups.java | 373 |
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; + } +} |