import gov.noaa.ncdc.publications.exception.ConvertException; | |
import gov.noaa.ncdc.publications.exception.CreatePDFFileException; | |
import gov.noaa.ncdc.publications.exception.CreateTempWorkingDirException; | |
import gov.noaa.ncdc.publications.exception.FTPServerException; | |
import gov.noaa.ncdc.publications.exception.FTPServerTimeoutException; | |
import gov.noaa.ncdc.publications.exception.createListFileException; | |
import gov.noaa.ncdc.util.FileUtils; | |
import gov.noaa.ncdc.util.Registry; | |
import gov.noaa.ncdc.util.WssrdFileComparator; | |
import gov.noaa.ncdc.util.ftpServer.FtpServer; | |
import org.apache.commons.logging.Log; | |
import org.apache.commons.logging.LogFactory; | |
import java.io.BufferedWriter; | |
import java.io.File; | |
import java.io.FileWriter; | |
import java.io.IOException; | |
import java.io.PrintWriter; | |
import java.util.Arrays; | |
/** | |
* <p> | |
* <CODE>RemotePublication</CODE> RemotePublication is a publication | |
* stored as TIF files in the WSSRD database. | |
* </p> | |
* <pre> | |
* Revision 1.1 2003/10/15 13:11:18 othomann | |
* Fix for 44839 | |
* | |
* Revision 1.6 2003/10/09 22:07:28 jduska | |
* Merged Chaged from 1.3 Branch into Head | |
* | |
* Revision 1.5.2.2 2003/10/01 22:48:03 jduska | |
* Added support, so that the publication can be retrieved by WSSRD cabinet | |
* and WSSRD docID | |
* | |
* Revision 1.5.2.1 2003/09/17 18:20:48 jduska | |
* Change FTP Errors to Warnings | |
* | |
* Revision 1.5 2003/07/25 20:49:52 jduska | |
* - Updated the Publication Library to use a new renameFile method | |
* - Created the new FileUtils class by moving the copyFile and adding the renameFile | |
* methods | |
* | |
* Revision 1.4 2003/07/17 23:56:58 jduska | |
* - Updated to support new support files in the command line tool | |
* - Update the properties to support the dynamic changing the FTP library | |
* - Cleaned up the exceptions and few other files with outdate or unneed imports and etc | |
* | |
* Revision 1.3 2003/07/07 15:42:48 jduska | |
* - Corrected bugs in new changes to support the Publication Library | |
* | |
* Revision 1.2 2003/07/02 17:33:14 jduska | |
* - bug fix to correct the Temporary Directory | |
* issue when using the library within a web application | |
* | |
* Revision 1.1 2003/06/26 23:54:10 jduska | |
* - Command Line version of the Publication Library | |
* | |
* Revision 1.3 2003/06/26 23:43:21 jduska | |
* - Changes to support using the PDF Library on the command line | |
* | |
* Revision 1.1 2003/06/09 21:27:29 jduska | |
* - Updated the library, so works on Windows | |
* | |
* Revision 1.1 2003/01/24 18:43:58 jduska | |
* More refactoring of the SerialPublications to | |
* support the local documents | |
* | |
* Revision 1.3 2002/10/11 21:03:50 jduska | |
* keyword substitution change *** | |
* | |
* </pre> | |
*/ | |
public class RemotePublication extends Publication { | |
private static final String PDF_FILETYPE = "PDF"; | |
private static Log log = | |
LogFactory.getLog(RemotePublication.class.getName()); | |
private String _fileList; | |
private String _fileType; | |
protected String _pages[]; | |
protected RemotePublication(String id, String year, String month, | |
String stateCode, | |
String serverDirectory, String cabinet) { | |
super(id, year, month, stateCode, serverDirectory, cabinet); | |
_fileList = _cabinet + '~' + id + ".txt"; | |
} | |
public boolean getDocument() { | |
int attempt = 0; | |
while (attempt < _maxAttempts) { | |
try { | |
attempt++; | |
log.info("*** Downloading " + _localFilename + | |
EXTENTION + " attempt " + attempt + | |
" out of " + _maxAttempts); | |
if (getRemoteDocument()) { | |
log.info("Success document published " + | |
_localFilename + EXTENTION); | |
return true; | |
} | |
} catch (ConvertException e) { | |
log.warn(e); | |
} | |
} | |
return false; | |
} | |
protected boolean getRemoteDocument() throws ConvertException { | |
boolean successful = false; | |
try { | |
createTempWorkingDir(); | |
getPages(); | |
if (_fileType != PDF_FILETYPE) { | |
createListFile(); | |
createPDFFile(); | |
} else { | |
renamePDFFile(); | |
} | |
successful = true; | |
} catch (FTPServerTimeoutException e) { | |
String msg = | |
"Convert process timed out retriving TIFF page" + | |
e.getFileName(); | |
log.warn(msg); | |
throw new ConvertException(msg); | |
} catch (FTPServerException e) { | |
String msg = | |
"Convert process encounter an " + e.getMessage(); | |
log.warn(msg); | |
throw new ConvertException(msg); | |
} catch (CreateTempWorkingDirException e) { | |
String msg = | |
"Error: Covert could not create a Working Directory!"; | |
log.warn(msg); | |
throw new ConvertException(msg); | |
} catch (CreatePDFFileException e) { | |
String msg = | |
"Could not create the PDF file " + e.getMessage(); | |
log.warn(msg); | |
throw new ConvertException(msg); | |
} catch (createListFileException e) { | |
String msg = | |
"Could not create the c42pdf List File" + | |
e.getMessage(); | |
throw new ConvertException(msg); | |
} catch (NoFTPServiceException e) { | |
String msg = | |
"Could not create the FTP Service " + e.getMessage(); | |
log.warn(msg); | |
throw new ConvertException(msg); | |
} | |
return successful; | |
} | |
protected void getPages() | |
throws FTPServerTimeoutException, | |
FTPServerException, NoFTPServiceException { | |
// Setup the ftp server | |
FtpServer ftp; | |
try { | |
ftp = (FtpServer) Class.forName(Registry.getFTPService()) | |
.newInstance(); | |
ftp.setServer(Registry.getUrl()); | |
ftp.setPassword(Registry.getFtpPassword()); | |
ftp.setUserName(Registry.getFtpUserName()); | |
ftp.setPassive(Registry.usePassive()); | |
ftp.setTimeout(Registry.getFtpTimeout()); | |
// get the pages and store them in the _workingDir | |
_pages = | |
ftp.getFiles(getWssrdDocumentName(), _workingDir); | |
if ((_pages.length == 1) && _pages[0].endsWith(".PDF")) { | |
_fileType = PDF_FILETYPE; | |
} | |
} catch (InstantiationException e) { | |
log.warn(e.getMessage()); | |
throw new NoFTPServiceException(); | |
} catch (IllegalAccessException e) { | |
// TODO Auto-generated catch block | |
e.printStackTrace(); | |
} catch (ClassNotFoundException e) { | |
// TODO Auto-generated catch block | |
e.printStackTrace(); | |
} | |
} | |
protected void createPDFFile() throws CreatePDFFileException { | |
String cmdLine = null; | |
try { | |
File newPdfFile = | |
new File(_workingDir + File.separator + | |
_localFilename + EXTENTION); | |
if (Registry.isCommandLineMode()) { | |
handleMultipleDocuments(newPdfFile); | |
} | |
cmdLine = createC42PDFCommandLine(newPdfFile.getName()); | |
if (log.isDebugEnabled()) { | |
log.debug("Running " + cmdLine); | |
} | |
// run C42PDF to create the file & wait till it finishes. | |
Process p = Runtime.getRuntime().exec(cmdLine); | |
p.waitFor(); | |
// check to see if it worked | |
if (!newPdfFile.exists()) { | |
log.warn("PDF File was not created!"); | |
throw new CreatePDFFileException("PDF File was not created!"); | |
} | |
} catch (IOException e) { | |
e.printStackTrace(); | |
throw new CreatePDFFileException(e.toString()); | |
} catch (InterruptedException e) { | |
e.printStackTrace(); | |
throw new CreatePDFFileException(e.toString()); | |
} | |
return; | |
} | |
/** | |
* generates the command line need to execute the C42PDF tool in | |
* a shell. This requires that the | |
* <code>Registry.getConvertToolPath()</code> and | |
* <code>Registry.getConvertToolName()</code> are valid. | |
* | |
* @param documentName the name of the document you wish to | |
* create | |
* | |
* @return | |
*/ | |
private String createC42PDFCommandLine(String documentName) { | |
return (Registry.getConvertToolPath() + File.separator + | |
Registry.getConvertToolName() + | |
(" -o " + _workingDir + File.separator + documentName + | |
" -l " + _workingDir + File.separator + _fileList)); | |
} | |
/** | |
* there a special cases within WSSRD where there may be more | |
* than one PDF that makes up the document. For example River | |
* Basin documents. Thus, it is possible for the same document | |
* already exist when using this libarary via a command line | |
* mode. <code>handleMultipleDocuments</code> will add a index | |
* counter to end of each duplicate filename. Thus, if there are | |
* three files for this document the files would be name | |
* filename1, filename2 and filename3 | |
* | |
* @param newPdfFile name of the document we are making sure does | |
* already exist | |
*/ | |
private void handleMultipleDocuments(File newPdfFile) { | |
int documentCount = 0; | |
String newFilename; | |
if (log.isDebugEnabled()) { | |
log.debug("Checking to see if " + newPdfFile.getName() + | |
"already exists"); | |
} | |
while (newPdfFile.exists()) { | |
documentCount++; | |
newFilename = | |
(new StringBuffer(_workingDir).append(File.separator) | |
.append(_localFilename) | |
.append(documentCount) | |
.append(EXTENTION)).toString(); | |
if (log.isDebugEnabled()) { | |
log.debug("File already exists. Check to see if we need rename existing file"); | |
} | |
if (documentCount == 1) { | |
File backupPdfFile = new File(newFilename); | |
newPdfFile.renameTo(backupPdfFile); | |
} | |
newPdfFile = new File(newFilename); | |
} | |
return; | |
} | |
protected void createListFile() throws createListFileException { | |
PrintWriter tiffFileListFile = null; | |
String s; | |
// Must have pages to sort! | |
if (_pages.length == 0) { | |
log.error("Internal Error: _tiffPage == null!"); | |
throw new createListFileException("No pages found in the document!"); | |
} | |
// Sort TIFF files into the correct page order | |
WssrdFileComparator fileComparator = | |
new WssrdFileComparator(); | |
Arrays.sort(_pages, fileComparator); | |
if (log.isDebugEnabled()) { | |
log.debug("Creating list file for C42PDF"); | |
} | |
try { | |
File tiffFileList = | |
new File(_workingDir + File.separator + _fileList); | |
if (tiffFileList.exists()) { | |
tiffFileList.delete(); | |
} | |
tiffFileListFile = | |
new PrintWriter(new BufferedWriter(new FileWriter(_workingDir + | |
File.separator + | |
_fileList))); | |
for (int i = 0; i < _pages.length; i++) { | |
s = _workingDir + File.separator + _pages[i]; | |
if (log.isDebugEnabled()) { | |
log.debug(s); | |
} | |
tiffFileListFile.println(s); | |
} | |
} catch (IOException e) { | |
e.printStackTrace(); | |
throw new createListFileException(e.toString()); | |
} finally { | |
if (tiffFileListFile != null) { | |
tiffFileListFile.close(); | |
} | |
if (log.isDebugEnabled()) { | |
log.debug("Finished Creating list file for C42PDF"); | |
} | |
return; | |
} | |
} | |
protected void renamePDFFile() throws CreatePDFFileException { | |
String newFileName = | |
_workingDir + File.separator + _localFilename + | |
EXTENTION; | |
String oldWssrdFile = | |
_workingDir + File.separator + _pages[0]; | |
try { | |
FileUtils.renameFile(oldWssrdFile, newFileName); | |
} catch (IOException e) { | |
String msg = "The following error occurred " + e.getMessage(); | |
log.warn(msg); | |
throw new CreatePDFFileException("Could not rename PDF File"); | |
} | |
} | |
} |