Search in sources :

Example 1 with PkgCategory

use of org.haiku.haikudepotserver.dataobjects.PkgCategory in project haikudepotserver by haiku.

the class PkgCategoryCoverageImportSpreadsheetJobRunner method run.

@Override
public void run(JobService jobService, PkgCategoryCoverageImportSpreadsheetJobSpecification specification) throws IOException, JobRunnerException {
    Preconditions.checkArgument(null != jobService);
    Preconditions.checkArgument(null != specification);
    Preconditions.checkArgument(null != specification.getInputDataGuid(), "missing imput data guid on specification");
    // this will register the outbound data against the job.
    JobDataWithByteSink jobDataWithByteSink = jobService.storeGeneratedData(specification.getGuid(), "download", MediaType.CSV_UTF_8.toString());
    // if there is input data then feed it in and process it to manipulate the packages'
    // categories.
    Optional<JobDataWithByteSource> jobDataWithByteSourceOptional = jobService.tryObtainData(specification.getInputDataGuid());
    if (jobDataWithByteSourceOptional.isEmpty()) {
        throw new IllegalStateException("the job data was not able to be found for guid; " + specification.getInputDataGuid());
    }
    try (OutputStream outputStream = jobDataWithByteSink.getByteSink().openBufferedStream();
        OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream);
        CSVWriter writer = new CSVWriter(outputStreamWriter, ',');
        InputStream inputStream = jobDataWithByteSourceOptional.get().getByteSource().openStream();
        InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
        CSVReader reader = new CSVReader(inputStreamReader)) {
        // headers
        List<String> pkgCategoryCodes = getPkgCategoryCodes();
        String[] headings = getHeadingRow(pkgCategoryCodes);
        // read in the first row of the input and check the headings are there to quasi-validate
        // that the input is not some random rubbish.
        String[] headerRow = reader.readNext();
        if (headings.length != headerRow.length) {
            throw new JobRunnerException("wrong number of header columns in input");
        }
        if (!Arrays.equals(headerRow, headings)) {
            throw new JobRunnerException("mismatched input headers");
        }
        writer.writeNext(headings);
        serverRuntime.performInTransaction(() -> {
            try {
                String[] row;
                while (null != (row = reader.readNext())) {
                    if (0 != row.length) {
                        ObjectContext rowContext = serverRuntime.newContext();
                        Action action = Action.NOACTION;
                        if (row.length < headings.length - 1) {
                            // -1 because it is possible to omit the action column.
                            action = Action.INVALID;
                            LOGGER.warn("inconsistent number of cells on line");
                        } else {
                            String pkgName = row[0];
                            // 1; display
                            boolean isNone = AbstractJobRunner.MARKER.equals(row[COLUMN_NONE]);
                            Optional<Pkg> pkgOptional = Pkg.tryGetByName(rowContext, pkgName);
                            List<String> selectedPkgCategoryCodes = new ArrayList<>();
                            if (pkgOptional.isPresent()) {
                                for (int i = 0; i < pkgCategoryCodes.size(); i++) {
                                    if (AbstractJobRunner.MARKER.equals(row[COLUMN_NONE + 1 + i].trim())) {
                                        if (isNone) {
                                            action = Action.INVALID;
                                            LOGGER.warn("line for package {} has 'none' marked as well as an actual category", row[0]);
                                        }
                                        selectedPkgCategoryCodes.add(pkgCategoryCodes.get(i));
                                    }
                                }
                                if (action == Action.NOACTION) {
                                    List<PkgCategory> selectedPkgCategories = PkgCategory.getByCodes(rowContext, selectedPkgCategoryCodes);
                                    if (selectedPkgCategories.size() != selectedPkgCategoryCodes.size()) {
                                        throw new IllegalStateException("one or more of the package category codes was not able to be found");
                                    }
                                    if (pkgService.updatePkgCategories(rowContext, pkgOptional.get(), selectedPkgCategories)) {
                                        action = Action.UPDATED;
                                        rowContext.commitChanges();
                                        LOGGER.debug("did update for package {}", row[0]);
                                    }
                                }
                            } else {
                                action = Action.NOTFOUND;
                                LOGGER.debug("unable to find the package for {}", row[0]);
                            }
                        }
                        // copy the row back verbatim, but with the action result at the
                        // end.
                        List<String> rowOutput = new ArrayList<>();
                        Collections.addAll(rowOutput, row);
                        while (rowOutput.size() < headings.length) {
                            rowOutput.add("");
                        }
                        rowOutput.remove(rowOutput.size() - 1);
                        rowOutput.add(action.name());
                        writer.writeNext(rowOutput.toArray(new String[0]));
                    }
                }
            } catch (Throwable th) {
                LOGGER.error("a problem has arisen importing package categories from a spreadsheet", th);
            }
            return null;
        });
    }
}
Also used : JobRunnerException(org.haiku.haikudepotserver.job.model.JobRunnerException) JobDataWithByteSource(org.haiku.haikudepotserver.job.model.JobDataWithByteSource) CSVReader(com.opencsv.CSVReader) PkgCategory(org.haiku.haikudepotserver.dataobjects.PkgCategory) CSVWriter(com.opencsv.CSVWriter) Pkg(org.haiku.haikudepotserver.dataobjects.Pkg) JobDataWithByteSink(org.haiku.haikudepotserver.job.model.JobDataWithByteSink) ObjectContext(org.apache.cayenne.ObjectContext)

Example 2 with PkgCategory

use of org.haiku.haikudepotserver.dataobjects.PkgCategory in project haikudepotserver by haiku.

the class MiscelaneousApiIT method testGetAllPkgCategories.

@Test
public void testGetAllPkgCategories() {
    // ------------------------------------
    GetAllPkgCategoriesResult result = miscellaneousApi.getAllPkgCategories(new GetAllPkgCategoriesRequest());
    // ------------------------------------
    ObjectContext objectContext = serverRuntime.newContext();
    List<PkgCategory> pkgCategories = PkgCategory.getAll(objectContext);
    Assertions.assertThat(pkgCategories.size()).isEqualTo(result.pkgCategories.size());
    for (int i = 0; i < pkgCategories.size(); i++) {
        PkgCategory pkgCategory = pkgCategories.get(i);
        GetAllPkgCategoriesResult.PkgCategory apiPkgCategory = result.pkgCategories.get(i);
        Assertions.assertThat(pkgCategory.getName()).isEqualTo(apiPkgCategory.name);
        Assertions.assertThat(pkgCategory.getCode()).isEqualTo(apiPkgCategory.code);
    }
}
Also used : GetAllPkgCategoriesResult(org.haiku.haikudepotserver.api1.model.miscellaneous.GetAllPkgCategoriesResult) PkgCategory(org.haiku.haikudepotserver.dataobjects.PkgCategory) GetAllPkgCategoriesRequest(org.haiku.haikudepotserver.api1.model.miscellaneous.GetAllPkgCategoriesRequest) ObjectContext(org.apache.cayenne.ObjectContext) AbstractIntegrationTest(org.haiku.haikudepotserver.AbstractIntegrationTest) Test(org.junit.jupiter.api.Test)

Aggregations

ObjectContext (org.apache.cayenne.ObjectContext)2 PkgCategory (org.haiku.haikudepotserver.dataobjects.PkgCategory)2 CSVReader (com.opencsv.CSVReader)1 CSVWriter (com.opencsv.CSVWriter)1 AbstractIntegrationTest (org.haiku.haikudepotserver.AbstractIntegrationTest)1 GetAllPkgCategoriesRequest (org.haiku.haikudepotserver.api1.model.miscellaneous.GetAllPkgCategoriesRequest)1 GetAllPkgCategoriesResult (org.haiku.haikudepotserver.api1.model.miscellaneous.GetAllPkgCategoriesResult)1 Pkg (org.haiku.haikudepotserver.dataobjects.Pkg)1 JobDataWithByteSink (org.haiku.haikudepotserver.job.model.JobDataWithByteSink)1 JobDataWithByteSource (org.haiku.haikudepotserver.job.model.JobDataWithByteSource)1 JobRunnerException (org.haiku.haikudepotserver.job.model.JobRunnerException)1 Test (org.junit.jupiter.api.Test)1