blob: d27fc671a1d46b8d7cbf9d28baa23bc6b1e25c0d [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
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;
}
}