asad

package com.example.setupwizard;

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

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.NodeList;

import java.io.BufferedReader;
import java.io.InputStreamReader;
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 private Button btnAdim1;
    @FXML private Button btnAdim2;
    @FXML private Button btnAdim3;
    @FXML private Button btnAdim4;

    @FXML
    public void initialize() {
        if (!dosyadanIpleriYukle())
            xmldenIpleriYukle();
    }

    private boolean dosyadanIpleriYukle() {

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

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

            ipComboBox.getItems().addAll(okunanIpler);

            btnAdim1.setDisable(false);

            return true;
        }
        catch (Exception e) {
            System.err.println("HATA: servers.txt dosyası okunamadı! " + e.getMessage());

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

            return false;
        }
    }

    private void xmldenIpleriYukle() {

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

            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();

            Document document = builder.parse(dosyaYolu.toFile());
            document.getDocumentElement().normalize();

            NodeList ipListesi = document.getElementsByTagName("ip");

            ipComboBox.getItems().clear();

            for (int i = 0; i < ipListesi.getLength(); i++) {
                String ip = ipListesi.item(i).getTextContent().trim();
                ipComboBox.getItems().add(ip);
            }

            if (!ipComboBox.getItems().isEmpty()) {
                ipComboBox.getSelectionModel().selectFirst();
                btnAdim1.setDisable(false);
            }

        } catch (Exception e) {
            System.err.println("HATA: servers.xml dosyası okunamadı! " + e.getMessage());

            ipComboBox.getItems().clear();
            ipComboBox.getItems().add("IP Listesi Bulunamadı!");
            btnAdim1.setDisable(true);
        }
    }

    private void kurulumAdimiCalistir(int adımIndeksi,String basariMesaji){
        String secilenIp = ipComboBox.getValue();

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

        KurulumTask gorevyoneticisi = new KurulumTask(secilenIp,adımIndeksi);

        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.\n"); // ikinci adımın butonu burda aktif edilebilir

                if (adımIndeksi == 0) {
                    btnAdim2.setDisable(false);
                }
                else if (adımIndeksi == 1) {
                    btnAdim3.setDisable(false);
                }
                else if (adımIndeksi == 2) {
                    btnAdim4.setDisable(false);
                }
            }
            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();
    }

    @FXML
    public void adimBirBaslat() {
        kurulumAdimiCalistir(0,">> KOPYALAMA BAŞARILI. Sıradaki adıma geçebilirisiniz.. \n");
    }
    @FXML
    public void adimIkiBaslat() {
        kurulumAdimiCalistir(1,">> ADIM 1 BAŞARILI. Başlangıç kurulumu tamamlandı.. \n");
    }
    @FXML
    public void adimUcBaslat() {
        kurulumAdimiCalistir(2,">> ADIM 2 Başarılı. Servisler başlatıldı.. \n");
    }
    @FXML
    public void adimDortBaslat() {
        kurulumAdimiCalistir(3,">> ADIM 3 Başarılı. Uygulamaların İndirilmesi Tamamlandı.. \n");
    }

}

class KurulumTask extends Task<Integer>{

    private final String secilenIp;
    private final int adimIndeksi;

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

    private String getHedefMasaustuYolu(Path bulunanKlasor){
        String masaustuYolu = System.getProperty("user.home") + "\\Desktop";
        return masaustuYolu + "\\" + bulunanKlasor.getFileName().toString();
    }

    @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 sharedAnaDizin = Paths.get("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;

        String hedefKlasor = getHedefMasaustuYolu(bulunanKlasor);

        if (adimIndeksi == 0) {

            String kaynakTamYol = bulunanKlasor.toAbsolutePath().toString();

            updateMessage(">> BİLGİ: Sistem ağdan lokal ortama (Masaüstü) aktarılıyor..\n");
            updateMessage(">> Lütfen Bekleyiniz, dosyalar kopyalanıyor...\n");

            updateMessage(">> KAYNAK YOL: " + kaynakTamYol + "\n");

            String xcopyKomutu = String.format("xcopy \"%s\" \"%s\" /E /I /Y", kaynakTamYol, hedefKlasor);
            pb = new ProcessBuilder("cmd","/c", xcopyKomutu);
        }

        else if (adimIndeksi == 1) {
            String batDosyaYolu = hedefKlasor + "\\Local_install_initial.bat";

            updateMessage(">> BİLGİ: 1. Aşama (Local Install Initial) başlatılıyor..\n");
            updateMessage("\n>> ÇALIŞTIRILAN DOSYA: " + batDosyaYolu + "\n");

            pb = new ProcessBuilder("cmd", "/c", batDosyaYolu);

            pb.directory(new java.io.File(hedefKlasor));
        }

        else if (adimIndeksi == 2) {
            //servisleri indir
        }

        else if (adimIndeksi == 3) {
            String batDosyaYolu = hedefKlasor + "\\Local_install_applications.bat";

            updateMessage(">> BİLGİ: 3. Aşama (Local Install Applications) başlatılıyor..\n");
            updateMessage("\n>> ÇALIŞTIRILAN DOSYA: " + batDosyaYolu + "\n");

            pb = new ProcessBuilder("cmd", "/c", batDosyaYolu);

            pb.directory(new java.io.File(hedefKlasor));
        }

        if (pb != null) {

            pb.redirectErrorStream(true);
            Process process = pb.start();

            try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
                String line;

                while ((line = reader.readLine()) != null) {
                    updateMessage(line);
                }

            }
            return process.waitFor();
        }
        return 1;
    }
}