sadas

package com.example.setupwizard;

import javafx.concurrent.Task;
import javafx.fxml.FXML;
import javafx.scene.control.ComboBox;
import javafx.scene.control.TextArea;
import org.w3c.dom.Text;

import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.Optional;
import java.util.stream.Stream;

public class SetupController {

    @FXML
    private ComboBox<String> ipComboBox;

    @FXML
    public TextArea arayuzTerminal;

    @FXML
    public void initialize() {
        dosyadanipleriyukle();
    }

    private void dosyadanipleriyukle() {

        try {
            Path dosyaYolu = Paths.get("src/main/resources/servers.txt");

            List<String> okunanIpler = Files.readAllLines(dosyaYolu);

            ipComboBox.getItems().addAll(okunanIpler);
        }
        catch (Exception e) {
            System.err.println("HATA: servers.txt dosyası okunamadı! " + e.getMessage());

            ipComboBox.getItems().addAll("IP Listesi Bulunamadı!");
        }
    }

    @FXML
    public void adimBirBaslat() {
        String secilenIp = ipComboBox.getValue();

        if (secilenIp == null) {
            arayuzTerminal.appendText(">> HATA: Lütfen önce bir IP seçin!\n");
            return;
        }

        KurulumTask gorevyoneticisi = new KurulumTask(secilenIp,0);

        gorevyoneticisi.messageProperty().addListener((gozlemci,eskiMesaj,yeniMesaj) -> {
            if (yeniMesaj != null) {
                arayuzTerminal.appendText(yeniMesaj + "\n");

                arayuzTerminal.setScrollTop(Double.MAX_VALUE);
            }
        });

        gorevyoneticisi.setOnSucceeded(event -> {
            int sonuc = gorevyoneticisi.getValue();
            if (sonuc == 0)
                arayuzTerminal.appendText(">> İŞLEM BAŞARILI. Sıradaki adıma geçebilirisiniz."); // ikinci adımın butonu burda aktif edilebilir
            else
                arayuzTerminal.appendText(">> İŞLEM BAŞARISIZ OLDU! (Kod: " + sonuc + ")\n");
        });

        gorevyoneticisi.setOnFailed(event -> {
            arayuzTerminal.appendText(">> KRİTİK HATA: Arka plan görevi çöktü!\n");
        });

        Thread arkaPlanTreni =  new Thread(gorevyoneticisi);
        arkaPlanTreni.setDaemon(true);
        arkaPlanTreni.start();
    }

}

public class KurulumTask extends Task<Integer>{
    private final String secilenIp;
    private final int adimIdeksi;

    public KurulumTask(String secilenIp, int adimIdeksi) {
        this.secilenIp = secilenIp;
        this.adimIdeksi = adimIdeksi;
    }

    @Override
    protected Integer call() throws Exception {
        String sonHaneStr = secilenIp.substring(secilenIp.lastIndexOf('.') + 1);
        int sonHane = Integer.parseInt(sonHaneStr);
        String sunucuKodu = String.format("%03d", sonHane);

        Path sharedAnaDizin = Paths.get("\\\\ORTAK_IP\\Shared");
        Path bulunanKlasor = null;

        try (Stream<Path> klasorler = Files.list(sharedAnaDizin)) {
            Optional<Path> eslesenKlasor = klasorler.filter(Files::isDirectory)
                    .filter(p -> p.getFileName().toString().endsWith(sunucuKodu))
                    .findFirst();

            if(eslesenKlasor.isPresent()){
                bulunanKlasor = eslesenKlasor.get();
                updateMessage(">> Hedef Klasör Bulundu: " + bulunanKlasor.toString());
            } else {
                updateMessage(">> HATA: Sonu '" + sunucuKodu + "' ile biten klasör bulunamadı! İşlem iptal ediliyor.");
                return 1;
            }
        }
        catch (Exception e) {
            updateMessage(">> HATA: Ortak klasöre erişilemedi veya dizin yok!" + e.getMessage());
            return 1;
        }

        ProcessBuilder pb = null;
    }
}