374 lines
12 KiB
Java
374 lines
12 KiB
Java
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;
|
|
}
|
|
}
|