package jp.ac.aiit.jointry.controllers; import java.net.URL; import java.util.HashMap; import java.util.Map; import java.util.ResourceBundle; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.fxml.FXML; import javafx.fxml.Initializable; import javafx.scene.control.Label; import javafx.scene.control.TextField; import javafx.scene.input.MouseEvent; import javafx.scene.layout.FlowPane; import javafx.stage.Stage; import jp.ac.aiit.jointry.models.Room; import jp.ac.aiit.jointry.services.broker.core.Agent; import jp.ac.aiit.jointry.services.broker.core.DInfo; import java.io.File; import java.io.IOException; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.logging.Level; import java.util.logging.Logger; import javafx.geometry.Insets; import javafx.scene.control.RadioButton; import jp.ac.aiit.jointry.services.broker.app.JointryAccount; import jp.ac.aiit.jointry.services.broker.app.JointryCommon; import jp.ac.aiit.jointry.services.broker.app.MainDialog; public class CooperationController implements Initializable, JointryCommon { @FXML private TextField name; @FXML private TextField owner_name; @FXML private TextField url; @FXML private FlowPane roomList; @FXML private Label messages; @FXML private RadioButton default_server; @FXML private RadioButton custom_server; private Agent agent; private Agent dummyAgent; private RoomView selectRoom; private MainController mainController; private Process broker_process; @FXML protected void createRoom(ActionEvent event) { agent = new Agent(); if (agent.open(url.getText(), CHAT_SERVICE, SERVER, owner_name.getText(), "", null)) { agent.startListening(CHAT_TIMEOUT); JointryAccount.addUser(owner_name.getText()); mainController.initWindow("connect"); windowClose(); } } @FXML protected void participationRoom(ActionEvent event) { agent = new Agent(); if (agent.open(url.getText(), accessMapping(CHAT_SERVICE, CLIENT, name.getText(), "", null, selectRoom.getRoom().getProxyId()))) { agent.startListening(CHAT_TIMEOUT); MainDialog.sendConnection(M_MAIN_CONNECT, agent, name.getText()); mainController.initWindow("connect"); windowClose(); } } @Override public void initialize(URL url, ResourceBundle rb) { try { InetAddress hst = InetAddress.getLocalHost(); StringBuilder sb = new StringBuilder(); sb.append("http://"); sb.append(hst.getHostAddress()); sb.append(":8081"); sb.append("/index.html"); this.url.setText(sb.toString()); connect(sb.toString()); } catch (UnknownHostException ex) { Logger.getLogger(CooperationController.class.getName()).log(Level.SEVERE, null, ex); } } @FXML protected void connect(ActionEvent event) { if (custom_server.isSelected()) { connect(this.url.getText()); } else { connect(this.url.getText()); } } private void connect(String server) { if (dummyAgent != null) { return; } roomList.getChildren().clear(); dummyAgent = new Agent(); //立ち上がっているサーバー一覧を取得する if (dummyAgent.open(server, CHAT_SERVICE, SERVER, DUMMY_AGENT_NAME, "", null)) { dummyAgent.startListening(CHAT_TIMEOUT); DInfo info = dummyAgent.query(K_SERVER_INFO); String[] serverList = info.get(K_SERVER_INFO).split(":"); int roomId = 1; //部屋番号 for (String s : serverList) { Room room = new Room(s); if (room.getName().equals(DUMMY_AGENT_NAME)) { continue; } addRoom(roomId++, room);//部屋登録 } } else { messages.setText("協同編集用サーバーに接続出来ません。"); } dummyAgent.close(); dummyAgent = null; } private void addRoom(int roomId, Room room) { final RoomView roomView = new RoomView(roomId, room); roomView.setOnMouseClicked(new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent t) { if (selectRoom != null) { selectRoom.setStyle("-fx-border-color: white;"); } roomView.setStyle("-fx-border-color: red;"); selectRoom = roomView; } }); FlowPane.setMargin(roomView, new Insets(20, 0, 0, 40)); roomList.getChildren().add(roomView); } private Map<String, String> accessMapping(String serviceId, String role, String userId, String password, String proxyFQCN, String proxyId) { Map<String, String> paramMap = new HashMap(); paramMap.put(USER_ROLE, role); paramMap.put(SERVICE_ID, serviceId); paramMap.put(USER_ID, userId); paramMap.put(PASSWORD, password); paramMap.put(PROXY_ID, proxyId); if (proxyFQCN != null) { paramMap.put(PROXY_FQCN, proxyFQCN); } return paramMap; } public void windowClose() { if (dummyAgent != null) { dummyAgent.close(); } Stage stage = (Stage) roomList.getScene().getWindow(); stage.close(); } public Agent getAgent() { return agent; } public String getName() { return name.getText(); } public void setMainController(MainController controller) { this.mainController = controller; } @FXML public void runBroker(ActionEvent event) { String pathes = System.getProperty("java.class.path"); String jarpath = ""; for (String path : pathes.split(";")) { if (path.matches(".*jointry.jar")) { jarpath = new File(path).getParent(); break; } } String sp = System.getProperty("file.separator"); String brokerpath = jarpath + sp + "lib" + sp + "jointry-broker.jar"; Runtime r = Runtime.getRuntime(); StringBuilder sb = new StringBuilder("java -jar "); sb.append(brokerpath); try { System.out.println(sb.toString()); broker_process = r.exec(sb.toString()); } catch (IOException ex) { Logger.getLogger(CooperationController.class.getName()).log(Level.SEVERE, null, ex); } } @FXML public void stopBroker() { broker_process.destroy(); } }