Java tutorial
// Copyright 2016 Eivind Vegsundvg // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package ninja.eivind.hotsreplayuploader.window.nodes; import javafx.collections.ObservableList; import javafx.event.EventHandler; import javafx.fxml.FXML; import javafx.fxml.FXMLLoader; import javafx.scene.control.Hyperlink; import javafx.scene.control.ListView; import javafx.scene.input.MouseEvent; import javafx.scene.layout.VBox; import ninja.eivind.hotsreplayuploader.di.FXMLLoaderFactory; import ninja.eivind.hotsreplayuploader.di.nodes.JavaFXNode; import ninja.eivind.hotsreplayuploader.services.platform.PlatformService; import ninja.eivind.stormparser.StandaloneBattleLobbyParser; import ninja.eivind.stormparser.models.Player; import ninja.eivind.stormparser.models.Replay; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.StringUtils; import java.io.File; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URL; import java.util.Base64; import java.util.List; import java.util.stream.Collectors; public class BattleLobbyNode extends VBox implements JavaFXNode { @Autowired private StandaloneBattleLobbyParser parser; @Autowired private PlatformService platformService; @FXML private ListView<String> teamOneList; @FXML private ListView<String> teamTwoList; @FXML private Hyperlink link; private static final String MATCH_PREVIEW_URL = "http://www.hotslogs.com/Player/MatchPreview?Data={{data}}"; /** * @deprecated * @throws IOException */ public BattleLobbyNode() throws IOException { this(FXMLLoader::new); } public BattleLobbyNode(FXMLLoaderFactory factory) throws IOException { URL resource = getClass().getResource("BattleLobbyNode.fxml"); FXMLLoader loader = factory.get(); loader.setLocation(resource); loader.setRoot(this); loader.setController(this); loader.load(); } @Override public void afterPropertiesSet() throws Exception { } public void setFile(File file) { teamOneList.getItems().clear(); teamTwoList.getItems().clear(); Replay replay = parser.apply(file); List<Player> players = replay.getReplayDetails().getPlayers(); for (int i = 0; i < players.size(); i++) { final Player player = players.get(i); final String playerName = getPlayerName(player); final ObservableList<String> items; if (i < 5) { items = teamOneList.getItems(); } else { items = teamTwoList.getItems(); } items.add(playerName); } link.setOnMouseClicked(event -> { final String url = MATCH_PREVIEW_URL.replace("{{data}}", base64EncodeBattleLobby(replay)); platformService.browse(url); }); } private String getPlayerName(Player player) { String shortName = player.getShortName(); if (!StringUtils.hasLength(shortName)) { return "AI Player"; } return shortName; } public String base64EncodeBattleLobby(Replay replay) { Base64.Encoder encoder = Base64.getEncoder(); List<String> asString = replay .getReplayDetails().getPlayers().stream().map(player -> player.getBattleNetRegionId() + "#" + player.getShortName() + "#" + player.getBattleTag() + "#" + player.getTeam()) .collect(Collectors.toList()); try { byte[] data = String.join(",", asString).getBytes("UTF-8"); return encoder.encodeToString(data); } catch (UnsupportedEncodingException e) { throw new RuntimeException(e); } } }