package be.billington.rob; import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.LoggerContext; import ch.qos.logback.classic.encoder.PatternLayoutEncoder; import ch.qos.logback.core.ConsoleAppender; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import javafx.application.Application; import javafx.application.Platform; import javafx.fxml.FXML; import javafx.fxml.FXMLLoader; import javafx.scene.Scene; import javafx.scene.control.*; import javafx.stage.Stage; import okio.*; import java.io.File; import java.io.IOException; import java.lang.reflect.Type; import java.time.LocalDate; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class MainFX extends Application { private Stage primaryStage; @FXML private SplitPane rootLayout; @FXML private TextField txtOwner; @FXML private TextField txtRepo; @FXML private ComboBox<String> comboApi; @FXML private TextField txtPrefix; @FXML private TextField txtBranch; @FXML private TextArea txtConsole; @FXML private TextField txtFilePath; @FXML private TextField txtConfigPath; @FXML private DatePicker txtFromDate; @FXML private DatePicker txtToDate; //private Combo profilesCombo; private Logger logger; private File configFile, profileFile; private List<Profile> profiles; private ExecutorService pool = Executors.newFixedThreadPool(4); private Map<String, String> config = new HashMap<>(); public static void main(String[] args) { launch(args); } /** * Initializes the root layout. */ public void initRootLayout() { try { // Load root layout from fxml file. FXMLLoader loader = new FXMLLoader(); loader.setLocation(MainFX.class.getResource("/be/billington/rob/Layout2.fxml")); rootLayout = loader.load(); // Show the scene containing the root layout. Scene scene = new Scene(rootLayout); primaryStage.setScene(scene); primaryStage.show(); } catch (IOException e) { e.printStackTrace(); } } @Override public void start(Stage primaryStage) { this.primaryStage = primaryStage; this.primaryStage.setTitle("Rob"); initRootLayout(); } @FXML private void initialize() { LoggerContext context = new LoggerContext(); logger = context.getLogger(MainFX.class); initConfig(); initProfiles(); initUIProfiles(false); initUILogger(context); } private void initUIProfiles(boolean last) { int pos = 0; if (last){ pos = profiles.size() - 1; } if (profiles != null) { //TODO profilesCombo.removeAll(); //TODO profiles.forEach((p) -> profilesCombo.add(p.getTitle())); //TODO profilesCombo.select(pos); } bindProfile(pos); } private void initUILogger(LoggerContext context) { ConsoleAppender consoleAppender = new ConsoleAppender<>(); UIAppender uiAppender = new UIAppender((txt) -> Platform.runLater(() -> txtConsole.appendText(txt)) ); PatternLayoutEncoder pa = new PatternLayoutEncoder(); pa.setPattern("%r %5p %c [%t] - %m%n"); pa.setContext(context); pa.start(); uiAppender.setContext(context); uiAppender.start(); consoleAppender.setEncoder(pa); consoleAppender.setContext(context); consoleAppender.start(); logger.addAppender(uiAppender); logger.addAppender(consoleAppender); } private void initConfig() { configFile = new File("./rob.conf"); try { if (!readConfig()) { createConfig(); } } catch (IOException e) { logger.error("IOException: " + e.getMessage(), e); } } private void initProfiles() { profileFile = new File("./rob.profiles"); try { Gson gson = new Gson(); Source source = Okio.source(profileFile); BufferedSource profileGsonSource = Okio.buffer(source); Type listType = new TypeToken<ArrayList<Profile>>() {}.getType(); profiles = gson.fromJson(profileGsonSource.readUtf8(), listType); profileGsonSource.close(); source.close(); } catch (IOException e) { logger.error("IOException: " + e.getMessage(), e); } } private void writeConfig() throws IOException { Sink sink = Okio.sink(configFile); BufferedSink bufferedSink = Okio.buffer(sink); this.config.forEach((k, v) -> { try { bufferedSink.writeUtf8(k + "=" + v + "\n"); } catch (IOException e) { logger.error("IOException: " + e.getMessage(), e); } }); bufferedSink.close(); sink.close(); } private boolean readConfig() throws IOException { if (!configFile.exists()) { return false; } boolean simpleCheckatLeastOneLine = false; Source source = Okio.source(configFile); BufferedSource bufferedSource = Okio.buffer(source); String line = bufferedSource.readUtf8Line(); while (line != null) { if (line.contains("=")) { String[] values = line.split("="); if (values.length > 1) { this.config.put(values[0], values[1]); } } line = bufferedSource.readUtf8Line(); simpleCheckatLeastOneLine = true; } bufferedSource.close(); source.close(); return simpleCheckatLeastOneLine; } private void createConfig() { //TODO dialog is config is missing ConfigDialog configDialog = new ConfigDialog(shell, config); //TODO config = configDialog.open(); try { writeConfig(); } catch (IOException e) { logger.error("IOException: " + e.getMessage(), e); } } private void initButtonActions() { //generate.setOnAction((event) -> robIt()); //output.setOnAction((event) -> loadGeneratedFile()); /*settings.setOnAction((event) -> createConfig()); saveProfile.setOnAction(n(event) -> saveProfile()); removeProfile.setOnAction((event) -> removeCurrentProfile());*/ //quit.setOnAction((event) -> quit()); } private void bindProfile(int pos) { if (profiles == null || profiles.isEmpty()) { comboApi.setValue(Rob.API_BITBUCKET); txtOwner.setText("afrogleap"); txtRepo.setText("wecycle-android-recyclemanager"); txtPrefix.setText("WEC"); txtBranch.setText("development"); txtFilePath.setText("./target/changelog.txt"); } else { Profile profile = profiles.get(pos); if (profile.getApi().equalsIgnoreCase(Rob.API_BITBUCKET)){ comboApi.setValue(Rob.API_BITBUCKET); } else { comboApi.setValue(Rob.API_GITHUB); } txtOwner.setText(profile.getOwner()); txtRepo.setText(profile.getRepo()); txtPrefix.setText(profile.getPrefix()); txtBranch.setText(profile.getBranch()); txtFilePath.setText(profile.getFilePath()); if (profile.getToDate() != null && !profile.getToDate().isEmpty()) { txtToDate.setValue(LocalDate.parse(profile.getToDate())); } if (profile.getFromDate() != null && !profile.getFromDate().isEmpty()) { txtFromDate.setValue(LocalDate.parse(profile.getFromDate())); } } } /* private void removeCurrentProfile(){ profiles.remove(profilesCombo.getSelectionIndex()); initUIProfiles(true); } private void saveProfile() { Profile profile = new Profile(comboApi.getValue(), txtOwner.getText(), txtRepo.getText(), txtPrefix.getText(), txtBranch.getText(), "", txtFilePath.getText(), txtFromDate.getValue().toString(), txtToDate.getValue().toString()); if (profiles == null){ profiles = new ArrayList<>(); } profiles.add(profile); initUIProfiles(true); try { Sink sink = Okio.sink(profileFile); BufferedSink bufferedSink = Okio.buffer(sink); Gson gson = new Gson(); bufferedSink.writeUtf8(gson.toJson(profiles)); bufferedSink.close(); sink.close(); } catch (IOException e) { logger.error("IOException: " + e.getMessage(), e); } }*/ @FXML protected void robIt() { String dateFromStr = "", dateToStr = ""; if (txtFromDate != null && txtFromDate.getValue() != null){ dateFromStr = txtFromDate.getValue().toString(); } if (txtToDate != null && txtToDate.getValue() != null){ dateToStr = txtToDate.getValue().toString(); } Configuration conf = new Configuration.ConfigurationBuilder(logger, comboApi.getValue(), txtRepo.getText(), txtOwner.getText()) .branch(txtBranch.getText()).prefix(txtPrefix.getText()).filePath(txtFilePath.getText()).fromDate(dateFromStr).toDate(dateToStr) .token(config.get(Common.CONFIG_TOKEN)).key(config.get(Common.CONFIG_KEY)).secret(config.get(Common.CONFIG_SECRET)).configPath(txtConfigPath.getText()).build(); pool.execute( new RobWorker(conf) ); } @FXML protected void loadGeneratedFile() { try { Source source = Okio.source(new File(txtFilePath.getText())); BufferedSource bufferedSource = Okio.buffer(source); String content = bufferedSource.readUtf8(); txtConsole.setText(content); bufferedSource.close(); source.close(); } catch (IOException e) { logger.error("IOException: " + e.getMessage(), e); } } @FXML private void quit(){ System.exit(0); } }