Search in sources :

Example 1 with ExecutorUtil.executeAsyncWithRetry

use of se.light.assembly64.util.ExecutorUtil.executeAsyncWithRetry in project assembly64fx by freabemania.

the class SearchController method init.

public void init(Artifact searchEntry) throws Exception {
    localDb = LocalDBService.getInstance();
    userService = UserService.getInstance();
    searchService = SearchService.getInstance();
    mappingService = CategoryMappingService.getInstance();
    // populate years
    table.setPlaceholder(new Label(""));
    yearInput.getItems().add(ALL);
    IntStream.range(1980, Calendar.getInstance().get(Calendar.YEAR) + 1).forEach(item -> yearInput.getItems().add(String.valueOf(item)));
    yearInput.getSelectionModel().selectFirst();
    // populate ratings
    ratingInput.getItems().add(ALL);
    IntStream.range(1, 10).forEach(item -> ratingInput.getItems().add(String.valueOf(item)));
    ratingInput.getSelectionModel().selectFirst();
    categoryInput.getItems().add(ALL);
    List<CategoryMapping> l = new ArrayList<CategoryMapping>(mappingService.values());
    Collections.sort(l, (i1, i2) -> i1.getDescription().toLowerCase().compareTo(i2.getDescription().toLowerCase()));
    l.stream().forEach(item -> categoryInput.getItems().add(item.getDescription()));
    if (searchEntry != null) {
        try {
            CategoryMapping categoryMappingByName = mappingService.getCategoryMappingByName(searchEntry.getDatabaseId());
            categoryInput.getSelectionModel().select(categoryMappingByName.getDescription());
        } catch (Exception e) {
            categoryInput.getSelectionModel().selectFirst();
        }
    } else {
        categoryInput.getSelectionModel().selectFirst();
    }
    name.setCellValueFactory(new PropertyValueFactory<SearchResultItem, String>("name"));
    group.setCellValueFactory(new PropertyValueFactory<SearchResultItem, String>("group"));
    year.setCellValueFactory(new PropertyValueFactory<SearchResultItem, Integer>("year"));
    handle.setCellValueFactory(new PropertyValueFactory<SearchResultItem, String>("handle"));
    event.setCellValueFactory(new PropertyValueFactory<SearchResultItem, String>("event"));
    group.setCellValueFactory(new PropertyValueFactory<SearchResultItem, String>("group"));
    rating.setCellValueFactory(new PropertyValueFactory<SearchResultItem, Integer>("rating"));
    category.setCellValueFactory(new PropertyValueFactory<SearchResultItem, String>("categoryName"));
    updated.setCellValueFactory(new PropertyValueFactory<SearchResultItem, String>("updated"));
    EventHandler<MouseEvent> mouseEventHandle = (MouseEvent event) -> {
        handleMouseClicked(event);
    };
    table.setOnKeyTyped(event -> {
        if (event.getCharacter().length() > 0 && event.getCharacter().charAt(0) == ENTER_KEY) {
            openFiles();
        }
    });
    table.addEventHandler(MouseEvent.MOUSE_PRESSED, mouseEventHandle);
    table.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
    registerSearchOnEnter(nameInput);
    registerSearchOnEnter(groupInput);
    registerSearchOnEnter(handleInput);
    registerSearchOnEnter(eventInput);
    registerChoice(yearInput);
    registerChoice(categoryInput);
    registerChoice(ratingInput);
    checkCheckbox(t64, T64SEARCH);
    checkCheckbox(d64, D64SEARCH);
    checkCheckbox(d71, T71SEARCH);
    checkCheckbox(d81, T81SEARCH);
    checkCheckbox(prg, PRGSEARCH);
    checkCheckbox(tap, TAPSEARCH);
    checkCheckbox(crt, CRTSEARCH);
    checkCheckbox(bin, BINSEARCH);
    checkCheckbox(sid, SIDSEARCH);
    checkCheckbox(g64, G64SEARCH);
    searchPeriod.setItems(FXCollections.observableArrayList(SEARCH_PERIOD.ALL, SEARCH_PERIOD.ONE_DAY, SEARCH_PERIOD.TWO_DAYS, SEARCH_PERIOD.FOUR_DAYS, SEARCH_PERIOD.ONE_WEEK, SEARCH_PERIOD.TWO_WEEKS, SEARCH_PERIOD.THREE_WEEKS, SEARCH_PERIOD.ONE_MONTH, SEARCH_PERIOD.TWO_MONTHS));
    searchPeriod.getSelectionModel().select(0);
    try {
        searchPeriod.getSelectionModel().selectedItemProperty().addListener((ObservableValue<? extends SEARCH_PERIOD> observable, SEARCH_PERIOD oldValue, SEARCH_PERIOD newValue) -> performSearch());
    } catch (Exception e) {
        logger.error("Unable to install listener", e);
    }
    registerCheckboxChangeForSearch(t64, T64SEARCH);
    registerCheckboxChangeForSearch(d64, D64SEARCH);
    registerCheckboxChangeForSearch(d71, T71SEARCH);
    registerCheckboxChangeForSearch(d81, T81SEARCH);
    registerCheckboxChangeForSearch(prg, PRGSEARCH);
    registerCheckboxChangeForSearch(tap, TAPSEARCH);
    registerCheckboxChangeForSearch(crt, CRTSEARCH);
    registerCheckboxChangeForSearch(bin, BINSEARCH);
    registerCheckboxChangeForSearch(sid, SIDSEARCH);
    registerCheckboxChangeForSearch(g64, G64SEARCH);
    searchFromStartOfString.selectedProperty().addListener(new ChangeListener<Boolean>() {

        public void changed(ObservableValue<? extends Boolean> ov, Boolean oldVal, Boolean newVal) {
            ExecutorUtil.executeAsyncWithRetry(() -> {
                localDb.addLocalDBSetting("search_from_start", String.valueOf(newVal));
                return null;
            });
        }
    });
    String val = localDb.getLocalDBSetting("search_from_start");
    if (val != null) {
        searchFromStartOfString.setSelected(Boolean.valueOf(val));
    } else {
        searchFromStartOfString.setSelected(true);
    }
    if (!userService.isLocationSelectedAndExisting()) {
        downloadFolderImage.setVisible(false);
    }
}
Also used : SEARCH_PERIOD(se.light.assembly64.Support.SEARCH_PERIOD) CategoryMapping(se.light.assembly64.model.CategoryMapping) MouseEvent(javafx.scene.input.MouseEvent) Label(javafx.scene.control.Label) ArrayList(java.util.ArrayList) SearchResultItem(se.light.assembly64.model.SearchResultItem) ObservableValue(javafx.beans.value.ObservableValue) SearchException(se.light.assembly64.model.SearchException)

Example 2 with ExecutorUtil.executeAsyncWithRetry

use of se.light.assembly64.util.ExecutorUtil.executeAsyncWithRetry in project assembly64fx by freabemania.

the class SearchViewFilesController method loopImages.

private void loopImages(Set<TargetAndPath> images) {
    final TargetAndPath[] imgs = images.toArray(new TargetAndPath[] {});
    final Image[] imgObjs = new Image[imgs.length];
    AtomicInteger ctr = new AtomicInteger();
    Runnable r = () -> {
        if (ctr.get() == imgs.length - 1) {
            ctr.set(0);
        } else {
            ctr.incrementAndGet();
        }
        if (imgObjs[ctr.get()] == null) {
            ReturningTask<Void> task2 = () -> {
                imgObjs[ctr.get()] = new Image(CachedImageService.getInstance().getImage(imgs[ctr.get()]));
                return null;
            };
            ExecutorUtil.executeAsyncWithRetry(task2);
        }
        FadeTransition fadeOutTransition = new FadeTransition(Duration.seconds(1), imageView);
        fadeOutTransition.setFromValue(1.0);
        fadeOutTransition.setToValue(0.0);
        fadeOutTransition.setOnFinished(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent arg0) {
                imageView.setImage(imgObjs[ctr.get()]);
                FadeTransition fadeInTransition = new FadeTransition(Duration.seconds(1), imageView);
                fadeInTransition.setFromValue(0.0);
                fadeInTransition.setToValue(1.0);
                fadeInTransition.setOnFinished(new EventHandler<ActionEvent>() {

                    @Override
                    public void handle(ActionEvent arg0) {
                        imageView.setImage(imgObjs[ctr.get()]);
                    }
                });
                fadeInTransition.play();
            }
        });
        fadeOutTransition.play();
    };
    future = Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate(r, 0, 4, TimeUnit.SECONDS);
}
Also used : TargetAndPath(se.light.assembly64.model.TargetAndPath) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) ReturningTask(se.light.assembly64.model.ReturningTask) FadeTransition(javafx.animation.FadeTransition) ActionEvent(javafx.event.ActionEvent) EventHandler(javafx.event.EventHandler) Image(javafx.scene.image.Image)

Example 3 with ExecutorUtil.executeAsyncWithRetry

use of se.light.assembly64.util.ExecutorUtil.executeAsyncWithRetry in project assembly64fx by freabemania.

the class SearchViewFilesController method downloadFilesAsync.

private void downloadFilesAsync(List<ContentEntry> selectedItems, String customPath) {
    CancelableTask cancelTask = CancelableTask.of();
    ProgressDBController controller = GuiUtils.showDialogOwnerNoWait("progressBarDbUpdate.fxml", "Progress", true, getStage(), new Object[] { selectedItems.size(), cancelTask, customPath + searchedItem.getCategoryShortName() + "/" + searchedItem.getName(), "Files were installed to " + customPath + searchedItem.getName() });
    ReturningTask<Void> task = () -> {
        int failureCtr = 0;
        for (ContentEntry selectedItem : selectedItems) {
            if (cancelTask.isCancelled()) {
                break;
            }
            try {
                downloadService.downloadItem(searchedItem.getId(), searchedItem.getCategory(), selectedItem.getId(), searchedItem.getName(), selectedItem.getName(), searchedItem.getCategoryShortName(), FILE_ACTION.DOWNLOAD, customPath);
            } catch (Exception e) {
                failureCtr++;
            }
            controller.setProgressLabel("Installing " + selectedItem.getName());
            controller.increaseProgress();
        }
        if (failureCtr == 0) {
            controller.progressDone();
        } else {
            controller.progressDone(failureCtr + " of " + selectedItems.size() + " could not be installed to " + customPath);
        }
        return null;
    };
    ExecutorUtil.executeAsyncWithRetry(task, 3);
}
Also used : ContentEntry(se.light.assembly64.model.ContentEntry) CancelableTask(se.light.assembly64.model.CancelableTask)

Example 4 with ExecutorUtil.executeAsyncWithRetry

use of se.light.assembly64.util.ExecutorUtil.executeAsyncWithRetry in project assembly64fx by freabemania.

the class SearchViewFilesController method init.

public void init(SearchResultItem searchedItem, ContentEntryInfo contentEntry, boolean fromSearch) {
    localDb = LocalDBService.getInstance();
    downloadService = DownloadArtifactsService.getInstance();
    playlistService = PlaylistService.getInstance();
    viceService = ViceService.getInstance();
    userService = UserService.getInstance();
    this.fromSearch = fromSearch;
    ReturningTask<Void> task = () -> {
        MetadataService metaDataSercice = MetadataService.getInstance();
        metadata = metaDataSercice.resolve(searchedItem);
        if (metadata.getUrl() == null) {
            toSourceButton.setVisible(false);
        }
        Platform.runLater(() -> {
            if (isNotEmpty(metadata.getEvent()) && isNotEmpty(metadata.getEventType())) {
                eventName.setText(capitalize(metadata.getEvent()));
                eventType.setText(capitalize(metadata.getEventType()));
                showEventName();
            }
            if (isNotEmpty(metadata.getReleaseDate())) {
                date.setText(metadata.getReleaseDate());
                showDate();
            }
            if (isNotEmpty(metadata.getName())) {
                releaseName.setText(capitalize(metadata.getName()));
                showReleaseName();
            }
            if (isNotEmpty(metadata.getGroup())) {
                group.setText(capitalize(metadata.getGroup()));
                showGroup();
            }
            if (isNotEmpty(metadata.getRating())) {
                rating.setText(metadata.getRating());
                showRating();
            }
            if (isNotEmpty(metadata.getPlace())) {
                place.setText("#" + metadata.getPlace());
                showPlace();
            }
            if (metadata.getImages().size() == 1) {
                try {
                    ReturningTask<Void> task2 = () -> {
                        TargetAndPath name = metadata.getImages().iterator().next();
                        fadeUpImage(new Image(CachedImageService.getInstance().getImage(name)));
                        return null;
                    };
                    ExecutorUtil.executeAsyncWithRetry(task2);
                } catch (Exception e) {
                    imageView.setImage(metaDataSercice.getNoPreview());
                }
            } else if (metadata.getImages().size() > 1) {
                loopImages(metadata.getImages());
            } else {
                fadeUpImage(metaDataSercice.getNoPreview());
            }
        });
        return null;
    };
    ExecutorUtil.executeAsyncWithRetry(task);
    this.searchedItem = searchedItem;
    name.setCellValueFactory(new PropertyValueFactory<ContentEntry, String>("name"));
    EventHandler<MouseEvent> mouseEventHandle = (MouseEvent event) -> {
        handleMouseClicked(event);
    };
    table.addEventHandler(MouseEvent.MOUSE_PRESSED, mouseEventHandle);
    table.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
    contentEntry.getContentEntry().sort((i1, i2) -> i1.getName().toLowerCase().compareTo(i2.getName().toLowerCase()));
    data.addAll(contentEntry.getContentEntry());
    table.setItems(data);
    getStage().setOnCloseRequest(event -> {
        closeImageLoop();
    });
    table.setOnKeyTyped(event -> {
        if (event.getCharacter().charAt(0) == Support.ENTER_KEY) {
            openFile(false);
        }
    });
    Executors.newSingleThreadExecutor().execute(() -> {
        try {
            Thread.sleep(200);
        } catch (InterruptedException e) {
        }
        Platform.runLater(() -> {
            GuiUtils.selectFirstInList(table);
        });
    });
}
Also used : TargetAndPath(se.light.assembly64.model.TargetAndPath) MouseEvent(javafx.scene.input.MouseEvent) ReturningTask(se.light.assembly64.model.ReturningTask) Image(javafx.scene.image.Image) MetadataService(se.light.assembly64.fx.mdresolve.MetadataService) ContentEntry(se.light.assembly64.model.ContentEntry)

Example 5 with ExecutorUtil.executeAsyncWithRetry

use of se.light.assembly64.util.ExecutorUtil.executeAsyncWithRetry in project assembly64fx by freabemania.

the class SidifyMainContoller method playSong.

private SidTune playSong(PlaylistEntry song) throws InterruptedException, SongNotAvailableException, SpecifyFileIdException {
    // Ugly, but needed for the nextsub to know
    SidTune sidTune = null;
    setIconPlaying(true);
    Platform.runLater(() -> nowPlaying.setText(song.getNameMasked()));
    try {
        int retries = 0;
        while (true) {
            try {
                File sid = Support.getSid(song);
                if (!sid.exists() && isOffline()) {
                    throw new SongNotAvailableException();
                } else if (!sid.exists()) {
                    downloadService.downloadTo(sid, song.getId(), song.getCategory(), song.getFileId());
                    Platform.runLater(() -> {
                        // update downloaded status
                        songlist.getColumns().get(0).setVisible(false);
                        songlist.getColumns().get(0).setVisible(true);
                    });
                }
                sidTune = sidPlayService.getSidTune(sid);
                sidPlayService.playSid(sidTune, getSongIndex(sidTune) + 1);
                break;
            } catch (Exception e) {
                if (e instanceof SpecifyFileIdException) {
                    throw e;
                } else if (retries > 3 || e instanceof SongNotAvailableException) {
                    throw e;
                }
                retries++;
            }
        }
        // load image async
        ReturningTask<Void> task = () -> {
            if (!Support.isOffline()) {
                Set<TargetAndPath> images = MetadataService.getInstance().resolve(song).getImages();
                if (images.size() > 0) {
                    imageView.setImage(new Image(imageCache.getImage(images.iterator().next())));
                }
            } else {
                imageView.setImage(MetadataService.getInstance().getNoPreview());
            }
            return null;
        };
        ExecutorUtil.executeAsyncWithRetry(task, 1);
    } catch (Exception e) {
        if (e instanceof SpecifyFileIdException) {
            throw new SpecifyFileIdException();
        }
        setIconPlaying(false);
        progressUpdater.stop();
        GenericMessageDialogController.withErrorProps("Sidify", "Sid seems to be broken!", true).showAndWait();
        throw new InterruptedException();
    }
    return sidTune;
}
Also used : SpecifyFileIdException(se.light.assembly64.model.SpecifyFileIdException) Set(java.util.Set) SongNotAvailableException(se.light.assembly64.model.SongNotAvailableException) Image(javafx.scene.image.Image) SidTune(libsidplay.sidtune.SidTune) File(java.io.File) SearchException(se.light.assembly64.model.SearchException) SongNotAvailableException(se.light.assembly64.model.SongNotAvailableException) SpecifyFileIdException(se.light.assembly64.model.SpecifyFileIdException)

Aggregations

File (java.io.File)7 ArrayList (java.util.ArrayList)5 Image (javafx.scene.image.Image)5 ReturningTask (se.light.assembly64.model.ReturningTask)5 MouseEvent (javafx.scene.input.MouseEvent)4 Artifact (se.light.assembly64.model.Artifact)4 RandomAccessFile (java.io.RandomAccessFile)3 List (java.util.List)3 Set (java.util.Set)3 FadeTransition (javafx.animation.FadeTransition)3 ObservableValue (javafx.beans.value.ObservableValue)3 ActionEvent (javafx.event.ActionEvent)3 EventHandler (javafx.event.EventHandler)3 ContextMenu (javafx.scene.control.ContextMenu)3 ContentEntry (se.light.assembly64.model.ContentEntry)3 GuiLocation (se.light.assembly64.model.GuiLocation)3 PlatformInfoService (se.light.assembly64.service.PlatformInfoService)3 FileChannel (java.nio.channels.FileChannel)2 FileLock (java.nio.channels.FileLock)2 Collections (java.util.Collections)2