Package com.socrata.datasync.job

Examples of com.socrata.datasync.job.JobStatus


                    if (!componentsInFile[j])
                        componentsInFile[j] = header.equalsIgnoreCase(locationComponents[j]);
                }
            }
            if (locationInFile) {
                JobStatus status = JobStatus.PUBLISH_ERROR;
                status.setMessage("Ambiguous Column Name: Synthetic location '" + field + "' specified in the control file may conflict with '" +
                        field + "' provided in '" + csvFilename + "'." +
                        "\nPlease list '" + field + "' as one of the ignored columns in the control file.");
                return status;
            }
            for (int i = 0; i < componentsInFile.length; i++) {
                if (!componentsInFile[i]) {
                    JobStatus status = JobStatus.PUBLISH_ERROR;
                    status.setMessage("Synthetic Location Not Found: The synthetic location column '" + field +
                            "' references a component '" + locationComponents[i] + "' which is not present in '" +
                            csvFilename + "'." +
                            "\nPlease check your control file to ensure that the column name is spelled correctly, " +
                            "and that '" + locationComponents[i] + "' is not included in the 'ignoreColumns' array.");
                    return status;
                }
            }
            JobStatus typesSupported = locationTypesSupported(field, location, DatasetUtils.getDatasetTypeMapping(schema));
            if (typesSupported.isError())
                return typesSupported;
        }

        return JobStatus.VALID;
    }
View Full Code Here


            } else {
                supportedTypes = new String[]{"text"};
            }
            String unsupportedType = getUnsupportedType(fieldname, supportedTypes, typeMapping);
            if (unsupportedType != null) {
                JobStatus status = JobStatus.PUBLISH_ERROR;
                StringBuilder message = new StringBuilder("Unsupported Datatype: " + Utils.capitalizeFirstLetter(component) + " component  '" +
                        locationName + "' is of type '" + unsupportedType + "'; " + component + " components require ");
                if (supportedTypes.length == 1) message.append(" a ");
                message.append("'" + supportedTypes[0] + "'");
                for (int i=1; i<supportedTypes.length; i++)
                    message.append(" or '" + supportedTypes[i] + "'");
                message.append(" column");
                if (supportedTypes.length > 1) message.append('s');
                message.append(".\nPlease specify a column that matches a supported type.");
                status.setMessage(message.toString());
                return status;
            }
        }
        return  JobStatus.VALID;
    }
View Full Code Here

        for (String field : headers) {
            field = field.toLowerCase();
            if (field.equalsIgnoreCase(rowIdentifier)) headerHasRowId = true;

            if (!columnNames.contains(field)) {
                JobStatus status = JobStatus.PUBLISH_ERROR;
                status.setMessage("Extra Columns Specified: File '" + csvFilename + "' contains column '" + field +
                        "', but dataset '" + schema.getId() + "' does not." +
                        "\nPlease check that your headers are using the field name rather than the human readable name." +
                        "\nConsider using 'ignoreColumns' in the control file if '" + field +
                        "' should not be included in the dataset");
                return status;
            } else {
                columnNames.remove(field);
            }
        }
        for (String synth : synthetics) {
            if (columnNames.contains(synth))
                columnNames.remove(synth);
        }
        if (columnNames.size() > 0) {
            if (rowIdentifier == null) {
                JobStatus status = JobStatus.PUBLISH_ERROR;
                StringBuilder message = new StringBuilder("Missing Columns: Dataset " + schema.getId() +
                        " contains the following column(s) that are not available in '" + csvFilename + "':");
                for (String colName : columnNames)
                    message.append("\n\t").append(colName);
                message.append("\nPlease validate that the CSV contains all columns and retry.");
                status.setMessage(message.toString());
                return status;
            } else if (!headerHasRowId) {
                JobStatus status = JobStatus.PUBLISH_ERROR;
                status.setMessage("Missing Row Identifier: Dataset '" + schema.getId() + "' contains a row identifier in column '" + rowIdentifier +
                        "'. This column must be present in '" + csvFilename + "'.");
                return status;
            }
        }
        return JobStatus.VALID;
View Full Code Here

        }
        if (sinkSetIDTextField.isEditable()) {
            jobToRun.setSinkSetID(sinkSetIDTextField.getText());
        }

        JobStatus status = jobToRun.run();
        if (!status.isError()) {
            sinkSetIDTextField.setText(jobToRun.getSinkSetID());
        }
        return status;
    }
View Full Code Here

        // Ensures dataset is in known state (2 rows)
        File twoRowsFile = new File("src/test/resources/datasync_unit_test_two_rows.csv");
        Soda2Publisher.replaceNew(producer, ddl, UNITTEST_DATASET_ID, twoRowsFile, true);

        File threeRowsFile = new File("src/test/resources/datasync_unit_test_three_rows.csv");
        JobStatus result = FTPDropbox2Publisher.publishViaFTPDropboxV2(
                userPrefs, UNITTEST_DATASET_ID, threeRowsFile,
                new File("src/test/resources/datasync_unit_test_three_rows_control.json"));

        TestCase.assertEquals(JobStatus.SUCCESS, result);
        TestCase.assertEquals(3, getTotalRows(UNITTEST_DATASET_ID));
View Full Code Here

                "      \"floatingTimestampFormat\" : \"MM/dd/yyyy\"\n" +
                "    }\n" +
                "}";

        File threeRowsFile = new File("src/test/resources/datasync_unit_test_three_rows_no_header.csv");
        JobStatus result = FTPDropbox2Publisher.publishViaFTPDropboxV2(
                userPrefs, UNITTEST_DATASET_ID, threeRowsFile,
                controlFileContent);

        TestCase.assertEquals(JobStatus.SUCCESS, result);
        TestCase.assertEquals(3, getTotalRows(UNITTEST_DATASET_ID));
View Full Code Here

        // Ensures dataset is in known state (2 rows)
        File twoRowsFile = new File("src/test/resources/datasync_unit_test_two_rows.csv");
        Soda2Publisher.replaceNew(producer, ddl, UNITTEST_DATASET_ID, twoRowsFile, true);

        File threeRowsFile = new File("src/test/resources/datasync_unit_test_three_rows_invalid_date.csv");
        JobStatus result = FTPDropbox2Publisher.publishViaFTPDropboxV2(
                userPrefs, UNITTEST_DATASET_ID, threeRowsFile,
                new File("src/test/resources/datasync_unit_test_three_rows_control.json"));

        TestCase.assertEquals(JobStatus.PUBLISH_ERROR, result);
        TestCase.assertEquals("FAILURE: Processing datasync_unit_test_three_rows_invalid_date.csv failed: Value in column \"date\" uninterpretable as calendar_date in input at record 3: \"invalid_date\"\n",
                result.getMessage());
        TestCase.assertEquals(2, getTotalRows(UNITTEST_DATASET_ID));
    }
View Full Code Here

    @Test
    public void testReplaceViaFTPInvalidControlFile() throws IOException, InterruptedException {
        final UserPreferences userPrefs = getUserPrefs();

        File threeRowsFile = new File("src/test/resources/datasync_unit_test_three_rows.csv");
        JobStatus result = FTPDropbox2Publisher.publishViaFTPDropboxV2(
                userPrefs, UNITTEST_DATASET_ID, threeRowsFile,
                new File("src/test/resources/datasync_unit_test_three_rows_control_invalid.json"));

        TestCase.assertEquals(JobStatus.PUBLISH_ERROR, result);
    }
View Full Code Here

     * @param inputControlFile  stream of control.json file content
     * @return JobStatus containing success or error information
     */
    private static JobStatus publishViaFTPDropboxV2(final UserPreferences userPrefs, final String datasetId,
                                                    final File csvOrTsvFile, final InputStream inputControlFile) {
        JobStatus status = JobStatus.PUBLISH_ERROR;

        String ftpHost;
        try {
            ftpHost = getFTPHost(userPrefs);
        } catch (Exception e) {
            e.printStackTrace();
            status.setMessage("Error obtaining FTP host: " + e.getMessage());
            return status;
        }

        FTPSClient ftp = null;
        try {
            ftp = new FTPSClient(false, SSLContext.getDefault());

            System.out.println("Connecting to " + ftpHost + ":" + FTP_HOST_PORT);
            // ADDED connection retry logic
            int tryCount = 0;
            int maxTries = 5;
            boolean connectionSuccessful = false;
            do {
                try {
                    ftp.connect(ftpHost, FTP_HOST_PORT);
                    connectionSuccessful = true;
                } catch (Exception connectException) {
                    // wait 2 secs, then retry connection
                    try {
                        Thread.sleep((long) (Math.pow(2, (tryCount + 1)) * 1000));
                    } catch (InterruptedException e) {
                        // do nothing
                    }
                }
                if (++tryCount > maxTries) {
                    status.setMessage("FTP server refused connection (connection timeout).");
                    return status;
                }
            } while(!connectionSuccessful);
            // END connection retry logic

            SocrataConnectionInfo connectionInfo = userPrefs.getConnectionInfo();
            ftp.login(connectionInfo.getUser(), connectionInfo.getPassword());

            // verify connection was successful
            if(FTPReply.isPositiveCompletion(ftp.getReplyCode())) {
                System.out.println("ftp.setFileType(FTP.BINARY_FILE_TYPE)");
                ftp.setFileType(FTP.BINARY_FILE_TYPE);
                System.out.println("ftp.enterLocalPassiveMode()");
                ftp.enterLocalPassiveMode();

                // Set protection buffer size (what does this do??)
                //ftp.execPBSZ(0);
                // Set data channel protection to private
                System.out.println("ftp.execPROT(\"P\")");
                ftp.execPROT("P");

                String pathToDomainRoot = getPathToDomainRoot(ftp, connectionInfo);
                String pathToDatasetDir = pathToDomainRoot + "/" + datasetId;

                // if datasetId does not exist then create the directory
                System.out.println("ftp.listFiles(" + pathToDatasetDir + "/" + FTP_STATUS_FILENAME + ")");
                FTPFile[] checkDatasetDirExists = ftp.listFiles(pathToDatasetDir + "/" + FTP_STATUS_FILENAME);
                if(checkDatasetDirExists.length == 0) {
                    System.out.println("ftp.makeDirectory(" + pathToDatasetDir + ")");
                    boolean datasetDirCreated = ftp.makeDirectory(pathToDatasetDir);
                    if(!datasetDirCreated) {
                        closeFTPConnection(ftp);
                        status.setMessage("Error creating dataset ID directory at" +
                                " '" + pathToDatasetDir + "': " + ftp.getReplyString());
                        return status;
                    }
                }

                // set request Id for control file upload
                String controlFileRequestId = setFTPRequestId(ftp, pathToDomainRoot + "/" + FTP_REQUEST_ID_FILENAME);
                if(controlFileRequestId.startsWith(FAILURE_PREFIX)) {
                    closeFTPConnection(ftp);
                    status.setMessage("Error setting request Id: " + controlFileRequestId);
                    return status;
                }
                // for tracking DataSync version
                recordDataSyncVersion(ftp, pathToDomainRoot + "/" + FTP_DATASYNC_VERSION_FILENAME);

                // upload control.json file content
                String controlFilePathFTP = pathToDatasetDir + "/" + FTP_CONTROL_FILENAME;
                String controlResponse = uploadAndEnqueue(ftp, inputControlFile, controlFilePathFTP, 0);
                inputControlFile.close();
                if(!controlResponse.equals(SUCCESS_PREFIX)) {
                    closeFTPConnection(ftp);
                    status.setMessage("Error uploading control file: " + controlResponse);
                    return status;
                }
                // ensure control.json was uploaded without issues
                String controlFileUploadStatus = pollUploadStatus(
                        ftp, pathToDatasetDir + "/" + FTP_STATUS_FILENAME, controlFileRequestId);
                if(!controlFileUploadStatus.startsWith(SUCCESS_PREFIX)) {
                    closeFTPConnection(ftp);
                    status.setMessage("Error uploading control file: " + controlFileUploadStatus);
                    return status;
                }

                System.out.println("Publishing entire file via FTPS...");
                // set request Id for this job
                String csvOrTsvFileRequestId = setFTPRequestId(ftp, pathToDomainRoot + "/" + FTP_REQUEST_ID_FILENAME);
                if(csvOrTsvFileRequestId.startsWith(FAILURE_PREFIX)) {
                    closeFTPConnection(ftp);
                    status.setMessage("Error setting request Id: " + csvOrTsvFileRequestId);
                    return status;
                }

                // attempt to gzip CSV/TSV file before uploading
                boolean deleteFileToUpload = false;
                File fileToUpload;
                String dataFilePathFTP;
                try {
                    System.out.println("Gzipping file before uploading...");
                    fileToUpload = createTempGzippedFile(csvOrTsvFile);
                    dataFilePathFTP = pathToDatasetDir + "/" + csvOrTsvFile.getName() + ".gz";
                    deleteFileToUpload = true;
                } catch (IOException ex) {
                    // if gzipping fails revert to sending raw CSV
                    System.out.println("Gzipping failed, uploading CSV directly");
                    fileToUpload = csvOrTsvFile;
                    dataFilePathFTP = pathToDatasetDir + "/" + csvOrTsvFile.getName();
                }

                // upload CSV/TSV file
                long dataFileSizeBytes = fileToUpload.length();
                InputStream inputDataFile = new FileInputStream(fileToUpload);
                String dataFileResponse = uploadAndEnqueue(ftp, inputDataFile, dataFilePathFTP, dataFileSizeBytes);
                inputDataFile.close();
                if(deleteFileToUpload)
                    fileToUpload.delete();
                if(!dataFileResponse.equals(SUCCESS_PREFIX)) {
                    closeFTPConnection(ftp);
                    status.setMessage(dataFileResponse);
                    return status;
                }

                // Poll upload status until complete
                String dataFileUploadStatus = pollUploadStatus(
                        ftp, pathToDatasetDir + "/" + FTP_STATUS_FILENAME, csvOrTsvFileRequestId);
                if(!dataFileUploadStatus.startsWith(SUCCESS_PREFIX)) {
                    status.setMessage(dataFileUploadStatus);
                    return status;
                }
            } else {
                status.setMessage("FTP server refused connection (check your username and password).");
                return status;
            }
        } catch(IOException e) {
            e.printStackTrace();
            status.setMessage("FTP error: " + e.getMessage());
            return status;
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            status.setMessage("Java error: " + e.getMessage());
            return status;
        } finally {
            if(ftp != null)
                closeFTPConnection(ftp);
        }
View Full Code Here

            } catch (CompletelyRestartJob e) {
                retryCount += 1;
            } catch (ParseException | NoSuchAlgorithmException | InputException | URISyntaxException |
                    SignatureException |InterruptedException | HttpException e) {
                e.printStackTrace();
                JobStatus jobStatus = JobStatus.PUBLISH_ERROR;
                jobStatus.setMessage(e.getMessage());
                return jobStatus;
            } finally {
                if (previousSignature != null) { previousSignature.close(); }
                if (patch != null) { patch.close(); }
                if (signatureResponse != null) { signatureResponse.close(); }
            }
        } while(retryCount < httpRetries);
        JobStatus jobStatus = JobStatus.PUBLISH_ERROR;
        jobStatus.setMessage("Couldn't get the request through; too many retries"); // TODO Better message
        return jobStatus;
    }
View Full Code Here

TOP

Related Classes of com.socrata.datasync.job.JobStatus

Copyright © 2018 www.massapicom. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.