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"); } } }