def createAndShowGUI(): # Create the GUI and show it. As with all GUI code, this must run # on the event-dispatching thread. frame = JFrame("GUI Development ") frame.setSize(500, 600) frame.setLayout(BorderLayout()) splitPane = JSplitPane(JSplitPane.VERTICAL_SPLIT) #Create and set up the content pane. psimures= ResourcePanel() psimures.setOpaque(True) pconfig = ConfigurationPanel() pconfig.setOpaque(True) #content panes must be opaque # show the GUI splitPane.add(psimures) splitPane.add(pconfig) frame.add(splitPane) frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE) frame.setVisible(True)
class BobGui(JFrame): def __init__(self): super(BobGui, self).__init__('BobPy') # IJ.log('okay?') # print('okay??') self.setLayout(BorderLayout()) self.main_panel = JPanel() # self.main_panel.setLayout(MigLayout('insets 1 10 1 1')) self.main_panel.setLayout(MigLayout()) dir_panel = JPanel() dir_panel.setLayout(BoxLayout(dir_panel, BoxLayout.X_AXIS)) dir_label = JLabel('Experiment Folder:') dir_panel.add(dir_label) self.dir_text_field = JTextField(10) self.dir_text_field.addActionListener( ActionListenerFactory(self, self.text_field_al)) dir_panel.add(self.dir_text_field) dir_button = JButton('open') dir_button.addActionListener( ActionListenerFactory(self, self.choose_dir_al)) dir_panel.add(dir_button) self.main_panel.add(dir_panel, 'wrap, growx, spanx, pushx') add_key_args(self.main_panel, 'close_w', ActionListenerFactory(self, self.close_al), KeyEvent.VK_W, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()) self.add(self.main_panel, BorderLayout.CENTER) self.setPreferredSize(Dimension(650, 600)) self.pack() self.setLocationRelativeTo(None) self.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE) self.setVisible(True) def show_exper_info(self): chf_panel = self.make_chf_panel() hseg_tree_panel = self.make_hseg_tree_panel() self.split_pane = JSplitPane(JSplitPane.HORIZONTAL_SPLIT) self.split_pane.setOneTouchExpandable(True) self.split_pane.setContinuousLayout(True) self.split_pane.setResizeWeight(0.5) self.split_pane.add(chf_panel) self.split_pane.add(hseg_tree_panel) self.main_panel.add(self.split_pane, 'grow, wrap') # self.log_text = JTextArea() self.main_panel.add(self.log_text, 'grow, wrap') self.log_text.setLineWrap(True) self.log_text.setWrapStyleWord(True) self.revalidate() def make_chf_panel(self): """ chf --> common hseg files """ chf_panel = JPanel() chf_panel.setLayout(MigLayout('insets 0')) chf_files_label = JLabel('Hemisegment cells') chf_files_text = JTextArea( BobGui.archetype_to_str( self.exper.hseg_cell_files_cab().archetype)) chf_panel.add(chf_files_label, 'growx, wrap') chf_panel.add(chf_files_text, 'grow, wrap') chf_files_label = JLabel('Hemisegment binary image files') chf_files_text = JTextArea( BobGui.archetype_to_str(self.exper.hseg_bin_files_cab().archetype)) chf_panel.add(chf_files_label, 'growx, wrap') chf_panel.add(chf_files_text, 'grow, wrap') chf_files_label = JLabel('Intensity Image Files') # chf_files_text = JTextArea(BobGui.archetype_to_str(self.exper.hseg_intens_im_files_cab().archetype)) # print(self.exper.hseg_intens_im_files_cab().archetype) # chf_panel.add(chf_files_label, 'growx, wrap') # chf_panel.add(chf_files_text, 'grow, wrap') self.intens_im_boxes = [] intens_im_panel = JPanel() intens_im_panel.setLayout(MigLayout('insets 0')) for poss_im_file in self.exper.hseg_intens_im_files_cab().archetype: self.intens_im_boxes.append(JCheckBox(poss_im_file)) intens_im_panel.add(self.intens_im_boxes[-1], 'wrap') chf_panel.add(chf_files_label, 'growx, wrap') chf_panel.add(intens_im_panel, 'grow, wrap') mdf_create_button = JButton( 'Create meta_data file from default outline') # mdf_create_button = JButton('<html>Create meta_data file<br>from default outline</html>') mdf_create_button.addActionListener( ActionListenerFactory(self, self.mdf_create_al)) mdf_open_button = JButton('Open existing meta_data file') mdf_open_button.addActionListener( ActionListenerFactory(self, self.mdf_open_al)) # meta_data_file_buttton = JButton('Open/Create meta_data file') # meta_data_file_buttton.addActionListener(ActionListenerFactory(self, self.meta_data_al)) # chf_panel.add(meta_data_file_buttton) chf_panel.add(mdf_create_button, 'wrap') chf_panel.add(mdf_open_button, 'wrap') chf_scroll_pane = JScrollPane() chf_scroll_pane.getViewport().setView(chf_panel) return chf_scroll_pane @staticmethod def archetype_to_str(archetype): at_str = '' for val in archetype: at_str += str(val) + '\n' return at_str def make_hseg_tree_panel(self): root = DefaultMutableTreeNode(self.exper.name) for hseg in self.exper.hsegs(): hseg_node = DefaultMutableTreeNode(hseg.name) root.add(hseg_node) hseg_at_deviations = self.exper.hseg_files_cab( ).archetype_deviations if len(hseg_at_deviations[hseg.name]) > 0: for definer, file_names in hseg_at_deviations[ hseg.name].items(): for file_name in file_names: node_str = definer + ': ' + file_name temp = DefaultMutableTreeNode(node_str) hseg_node.add(temp) hseg_tree = JTree(root) hseg_tree.setCellRenderer(BobPyTreeCellRenderer()) hseg_scroll_pane = JScrollPane() hseg_scroll_pane.getViewport().setView((hseg_tree)) hseg_panel = JPanel(MigLayout('insets 0')) hseg_panel.add(hseg_scroll_pane, 'grow, span, push, wrap') run_button = JButton('Run') run_button.addActionListener(ActionListenerFactory(self, self.run_al)) rerun_button = JButton('Rerun') rerun_button.addActionListener( ActionListenerFactory(self, self.rerun_al)) hseg_panel.add(run_button) hseg_panel.add(rerun_button) return hseg_panel def log(self, text): self.log_text.append(str(text) + '\n') def text_field_al(self, e): # self.dir_path = self.got_exper(self.dir_text_field.getText()) def choose_dir_al(self, e): dc = DirectoryChooser('Choose a bob_py experiment folder') # self.dir_path = dc.getDirectory() # self.dir_text_field.setText(self.dir_path) # self.dir_text_field.setText('blerg') # IJ.log('blerg') # print('boop') self.got_exper(dc.getDirectory()) def close_al(self, e): self.dispatchEvent(WindowEvent(self, WindowEvent.WINDOW_CLOSING)) def run_al(self, e): # dt = br.dtic('Processed experiment {}'.format(self.exper.name)) t = br.tic() self.exper.make_data() self.exper.output_cell_cols_def() self.exper.output_nuc_cols_def() self.exper.output_new_hdings() self.exper.log('Processed experiment {} in {:.3f} seconds'.format( self.exper.name, br.toc(t))) # br.dtoc(dt) def rerun_al(self, e): # dt = br.dtic('Processed experiment {}'.format(self.exper.name)) # t = br.tic() self.exper = None self.got_exper(self.dir_path) self.run_al(None) # self.exper = # self.exper.make_data() # self.exper.output_cell_cols_def() # self.exper.output_nuc_cols_def() # self.exper.output_new_hdings() # # self.exper.log('Created and processed experiment {} in {:.3f} seconds'.format(self.exper.name, br.toc(t))) # br.dtoc(dt) # def meta_data_al(self, e) : # meta_data_path = self.exper.meta_data_path() # if not os.path.exists(meta_data_path) : # txt = make_meta_data_str(self.exper) # with open(meta_data_path, 'w') as f : # f.write(txt) # # IJ.open(meta_data_path) def mdf_create_al(self, e): meta_data_path = self.exper.meta_data_path() # if not os.path.exists(meta_data_path) : intens_im_list = [] for check_box in self.intens_im_boxes: if check_box.isSelected(): intens_im_list.append(check_box.getLabel()) txt = make_meta_data_str2(self.exper, intens_im_list) with open(meta_data_path, 'w') as f: f.write(txt) # IJ.open(meta_data_path) def mdf_open_al(self, e): meta_data_path = self.exper.meta_data_path() IJ.open(meta_data_path) def got_exper(self, dir_path): # IJ.log('exper') self.dir_path = dir_path self.dir_text_field.setText(self.dir_path) self.log_text = JTextArea() self.exper = bob_py.Exper(dir_path, gui=self) self.show_exper_info()
class BurpExtender(IBurpExtender, IContextMenuFactory, ITab, IHttpListener, IMessageEditorController, AbstractTableModel): def registerExtenderCallbacks(self, callbacks): self.messages = [] self._callbacks = callbacks self._helpers = callbacks.getHelpers() self._callbacks.setExtensionName('TPLogScan') self._log = ArrayList() self._lock = Lock() self.jSplitPaneV = JSplitPane(JSplitPane.VERTICAL_SPLIT, True) self.jSplitPaneV.setDividerLocation(300) self.jSplitPaneV.setOneTouchExpandable(True) self.jPanel_top = JPanel() self.jTabbedPane = JTabbedPane(JTabbedPane.TOP) self.iRequestTextEditor = self._callbacks.createMessageEditor(self, False) self.iResponseTextEditor = self._callbacks.createMessageEditor(self, False) self.jTable = CustomTable(self) self.jTable.setShowGrid(True) self.jTable.setAutoCreateRowSorter(True) self.jTable.setAutoResizeMode(JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS) first_column_model = self.jTable.getColumnModel().getColumn(0) first_column_model.setPreferredWidth(60); first_column_model.setMaxWidth(60) first_column_model.setMinWidth(60) self.jTable.getColumnModel().getColumn(1).setPreferredWidth(300) third_column_model = self.jTable.getColumnModel().getColumn(2) third_column_model.setPreferredWidth(100) third_column_model.setMinWidth(100) self.jTable.getColumnModel().getColumn(3).setPreferredWidth(600) self.jTable.getColumnModel().getColumn(4).setPreferredWidth(100) self.jTable.getColumnModel().getColumn(5).setPreferredWidth(100) self.jScrollPane1 = JScrollPane(self.jTable) self.jScrollPane1.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED) self.jScrollPane1.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED) self.jTabbedPane.addTab("Log", self.jScrollPane1) self.jPanel_top.add(self.jTabbedPane) self.jPanel_top.setLayout(GridLayout(1,1)) self.jSplitPaneInfo = JSplitPane(JSplitPane.HORIZONTAL_SPLIT, True) self.jSplitPaneInfo.setDividerLocation(650) self.jSplitPaneInfo.setOneTouchExpandable(True) self.jPanel_reqInfo_left = JPanel() self.jPanel_respInfo_right = JPanel() self.jPanel_reqInfo_left.setLayout(BorderLayout()) self.jPanel_respInfo_right.setLayout(BorderLayout()) self.jPanel_reqInfo_left.add(self.iRequestTextEditor.getComponent(), BorderLayout.CENTER) self.jPanel_respInfo_right.add(self.iResponseTextEditor.getComponent(), BorderLayout.CENTER) self.jSplitPaneInfo.add(self.jPanel_reqInfo_left, JSplitPane.LEFT) self.jSplitPaneInfo.add(self.jPanel_respInfo_right, JSplitPane.RIGHT) self.jSplitPaneV.add(self.jPanel_top, JSplitPane.TOP) self.jSplitPaneV.add(self.jSplitPaneInfo, JSplitPane.BOTTOM) self._callbacks.customizeUiComponent(self.jSplitPaneV) self._callbacks.customizeUiComponent(self.jPanel_top) self._callbacks.customizeUiComponent(self.jTabbedPane) self._callbacks.customizeUiComponent(self.jTable) self._callbacks.customizeUiComponent(self.jScrollPane1) self._callbacks.customizeUiComponent(self.jSplitPaneInfo) self._callbacks.customizeUiComponent(self.jPanel_reqInfo_left) self._callbacks.customizeUiComponent(self.jPanel_respInfo_right) self._callbacks.addSuiteTab(self) self._callbacks.registerHttpListener(self) self._callbacks.registerContextMenuFactory(self) return def getTabCaption(self): return 'TPLogScan' def getUiComponent(self): return self.jSplitPaneV def getRowCount(self): try: return self._log.size() except: return 0 def getColumnCount(self): return 6 def getColumnName(self, columnIndex): if columnIndex == 0: return "#" if columnIndex == 1: return "Host" if columnIndex == 2: return "Method" if columnIndex == 3: return "URL" if columnIndex == 4: return "Status" if columnIndex == 5: return "Length" return "" def getValueAt(self, rowIndex, columnIndex): logEntry = self._log.get(rowIndex) url = logEntry._url.toString() url_parse = urlparse.urlparse(url) if url_parse.netloc.find(':') != -1: netloc = url_parse.netloc[:url_parse.netloc.find(':')] host = url_parse.scheme + '://' + netloc path = url_parse.path if columnIndex == 0: return rowIndex+1 if columnIndex == 1: return host if columnIndex == 2: return logEntry._method if columnIndex == 3: return path if columnIndex == 4: return logEntry._status_code if columnIndex == 5: return logEntry._length return "" def processHttpMessage(self, toolFlag, messageIsRequest, messageInfo): # tool_name = self._callbacks.getToolName(toolFlag) # if tool_name != 'Extender': if toolFlag != 1024: return if messageIsRequest: return request_info = self._helpers.analyzeRequest(messageInfo) response_info = self._helpers.analyzeResponse(messageInfo.getResponse()) response_headers = response_info.getHeaders() response_length = 0 for header in response_headers: header = header.encode('utf-8') if header.startswith("Content-Length"): response_length = int(header.replace('Content-Length: ', '')) length = response_length if response_length > 0 else 0 self._lock.acquire() row = self._log.size() self._log.add(LogEntry(toolFlag, self._callbacks.saveBuffersToTempFiles(messageInfo), request_info.getUrl(),request_info.getMethod(),response_info.getStatusCode(),length)) self.fireTableRowsInserted(row, row) self._lock.release() def getHttpService(self): return self._currentlyDisplayedItem.getHttpService() def getRequest(self): return self._currentlyDisplayedItem.getRequest() def getResponse(self): return self._currentlyDisplayedItem.getResponse() def loadMenus(self): self.menus = [] self.mainMenu = JMenu("TPLogScan") self.menus.append(self.mainMenu) menu = JMenuItem('ThinkPHP v3', None, actionPerformed=lambda x: self.eventHandler(x)) self.mainMenu.add(menu) menu = JMenuItem('ThinkPHP v5', None, actionPerformed=lambda x: self.eventHandler(x)) self.mainMenu.add(menu) def createMenuItems(self, invocation): self.loadMenus() self.messages = invocation.getSelectedMessages() return self.menus if self.menus else None def eventHandler(self, x): menuName = x.getSource().text if menuName == 'ThinkPHP v3': version = 3 elif menuName == 'ThinkPHP v5': version = 5 else: print("chose error") return for message in self.messages: url = str(self._helpers.analyzeRequest(message).getUrl()) url_parse = urlparse.urlparse(url) url = url_parse.scheme + '://' + url_parse.netloc print("[*] url: {}".format(url)) datetime_now = datetime.datetime.now() year = (datetime_now - datetime.timedelta(days=30)).year month = (datetime_now - datetime.timedelta(days=30)).month day = (datetime_now - datetime.timedelta(days=30)).day tplogscan = TPLogScan(url, version, year, month, day) log_path = tplogscan.checkLogPath() if not log_path: print("[-] {} can't get log file! ".format(url)) self._callbacks.issueAlert("{} can't get log file".format(url)) return filename_list = tplogscan.genFileName() t = threading.Thread(target=self.logScan, args=(message, version, log_path, filename_list)) t.start() def logScan(self, message, version, log_path, filename_list): http_service = message.getHttpService() old_request = self._helpers.bytesToString(message.getRequest()) old_path = self._helpers.analyzeRequest(message).getUrl().getPath() for filename in filename_list: try: new_request = old_request.replace(" " + old_path + " HTTP/", " " + log_path+filename + " HTTP/") response, status_code = self.sendRequest(http_service, new_request) if status_code != 200: continue tmp_filename = filename now_filename = '' pattern = re.compile(r"\[ (\d{4}-\d{2}-\d{2})T((\d{2}:){2}\d{2})\+08:00 \]") flag = True while flag: match_result = pattern.search(response) if not match_result: break time_str = match_result.group(1) + ' ' + match_result.group(2) timeArray = time.strptime(time_str, "%Y-%m-%d %H:%M:%S") timestamp = int(time.mktime(timeArray)) timestamp_list = [str(timestamp), str(timestamp-1), str(timestamp-2), str(timestamp-3)] for timestamp in timestamp_list: if version == 3: tmp_filename = timestamp + '-' + filename else: tmp_filename = filename[:filename.find('/')] + '/' + timestamp + '-' + filename[filename.find('/')+1:] if tmp_filename == now_filename: flag = False break new_request = old_request.replace(" " + old_path + " HTTP/", " " + log_path+tmp_filename + " HTTP/") response, status_code = self.sendRequest(http_service, new_request) if status_code == 200: now_filename = tmp_filename break except Exception as e: print("[-] error: {}".format(e)) print('[*] Log Scan complete!') def sendRequest(self, http_service, new_request): checkRequestResponse = self._callbacks.makeHttpRequest(http_service, self._helpers.stringToBytes(new_request)) status_code = self._helpers.analyzeResponse(checkRequestResponse.getResponse()).getStatusCode() print('[*] {} | {}'.format(self._helpers.analyzeRequest(checkRequestResponse).getUrl(), status_code)) return self._helpers.bytesToString(checkRequestResponse.getResponse()), status_code
class BobGui(JFrame): def __init__(self): super(BobGui, self).__init__('BobPy') # cls = self.getClass() # print(cls) # self.setLayout(MigLayout()) self.setLayout(BorderLayout()) self.main_panel = JPanel() self.main_panel.setLayout(MigLayout()) dir_panel = JPanel() dir_panel.setLayout(BoxLayout(dir_panel, BoxLayout.X_AXIS)) dir_label = JLabel('Experiment Folder:') dir_panel.add(dir_label) self.dir_text_field = JTextField(10) self.dir_text_field.addActionListener( ActionListenerFactory(self, self.text_field_al)) dir_panel.add(self.dir_text_field) dir_button = JButton('open') dir_button.addActionListener( ActionListenerFactory(self, self.choose_dir_al)) dir_panel.add(dir_button) self.main_panel.add(dir_panel, 'growx, spanx, pushx, wrap') add_key_args(self.main_panel, 'close_w', ActionListenerFactory(self, self.close_al), KeyEvent.VK_W, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()) self.add(self.main_panel, BorderLayout.CENTER) self.setPreferredSize(Dimension(500, 400)) self.pack() self.setLocationRelativeTo(None) self.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE) self.setVisible(True) def show_exper_info_old(self): # sb = br.SimilarityBuilder() cab = br.CollectionArchetypeBuilder() for hseg in self.exper.hsegs(): all_file_dict = hseg.file_dict() all_file_dict.update(hseg.cell_file_dict()) all_file_dict.update(hseg.bin_file_dict()) cab.add_collection(hseg.name, all_file_dict) hseg_at, hseg_at_deviations = cab.get_archetype_info() at_str = '' for val in hseg_at: at_str += str(val) + '\n' chf_panel = self.make_chf_panel(at_str) hseg_tree_panel = self.make_hseg_tree_panel(hseg_at_deviations) self.split_pane = JSplitPane(JSplitPane.HORIZONTAL_SPLIT) self.split_pane.setOneTouchExpandable(True) self.split_pane.setContinuousLayout(True) self.split_pane.setResizeWeight(0.5) self.split_pane.add(chf_panel) self.split_pane.add(hseg_tree_panel) self.main_panel.add(self.split_pane, 'grow') self.revalidate() def show_exper_info(self): # sb = br.SimilarityBuilder() # cab = br.CollectionArchetypeBuilder() # # for hseg in self.exper.hsegs() : # all_file_dict = hseg.file_dict() # all_file_dict.update(hseg.cell_file_dict()) # all_file_dict.update(hseg.bin_file_dict()) # cab.add_collection(hseg.name, all_file_dict) # # hseg_at, hseg_at_deviations = cab.get_archetype_info() # # at_str = '' # for val in hseg_at : # at_str += str(val) + '\n' chf_panel = self.make_chf_panel() hseg_tree_panel = self.make_hseg_tree_panel() self.split_pane = JSplitPane(JSplitPane.HORIZONTAL_SPLIT) self.split_pane.setOneTouchExpandable(True) self.split_pane.setContinuousLayout(True) self.split_pane.setResizeWeight(0.5) self.split_pane.add(chf_panel) self.split_pane.add(hseg_tree_panel) self.main_panel.add(self.split_pane, 'grow') self.revalidate() def make_chf_panel_old(self, at_str): """ cf --> common hseg files """ chf_panel = JPanel() # chf_panel.setLayout(BoxLayout(chf_panel, BoxLayout.Y_AXIS)) chf_panel.setLayout(MigLayout('insets 0')) # chf_panel.setAlignmentX(Component.LEFT_ALIGNMENT) chf_label = JLabel('Common Hemeisegment Files') # chf_label.setAlignmentX(Component.LEFT_ALIGNMENT) chf_panel.add(chf_label, 'grow, wrap') chf_text_area = JTextArea(at_str) chf_panel.add(chf_text_area, 'grow, push, span') return chf_panel def make_chf_panel(self): """ chf --> common hseg files """ chf_panel = JPanel() # chf_panel.setLayout(BoxLayout(chf_panel, BoxLayout.Y_AXIS)) chf_panel.setLayout(MigLayout('insets 0')) # chf_panel.setAlignmentX(Component.LEFT_ALIGNMENT) chf_files_label = JLabel('Hemisegment cells') chf_files_text = JTextArea( BobGui.archetype_to_str( self.exper.hseg_cell_files_cab().archetype)) chf_panel.add(chf_files_label, 'growx, wrap') chf_panel.add(chf_files_text, 'grow, wrap') chf_files_label = JLabel('Hemisegment binary image files') chf_files_text = JTextArea( BobGui.archetype_to_str(self.exper.hseg_bin_files_cab().archetype)) chf_panel.add(chf_files_label, 'growx, wrap') chf_panel.add(chf_files_text, 'grow, wrap') chf_files_label = JLabel('Other hemisegment files') chf_files_text = JTextArea( BobGui.archetype_to_str(self.exper.hseg_files_cab().archetype)) chf_panel.add(chf_files_label, 'growx, wrap') chf_panel.add(chf_files_text, 'grow') # chf_label = JLabel('Common Hemeisegment Files') # # chf_label.setAlignmentX(Component.LEFT_ALIGNMENT) # # chf_panel.add(chf_label, 'grow, wrap') # # chf_text_area = JTextArea(at_str) # chf_panel.add(chf_text_area, 'grow, push, span') return chf_panel @staticmethod def archetype_to_str(archetype): at_str = '' for val in archetype: at_str += str(val) + '\n' return at_str # def make_hseg_tree_panel(self, hseg_at_deviations) : def make_hseg_tree_panel(self): root = DefaultMutableTreeNode(self.exper.name) for hseg in self.exper.hsegs(): hseg_node = DefaultMutableTreeNode(hseg.name) root.add(hseg_node) hseg_at_deviations = self.exper.hseg_all_files_cab( ).archetype_deviations if len(hseg_at_deviations[hseg.name]) > 0: for definer, file_names in hseg_at_deviations[ hseg.name].items(): for file_name in file_names: node_str = definer + ': ' + file_name temp = DefaultMutableTreeNode(node_str) hseg_node.add(temp) hseg_tree = JTree(root) hseg_tree.setCellRenderer(BobPyTreeCellRenderer()) hseg_scroll_pane = JScrollPane() hseg_scroll_pane.getViewport().setView((hseg_tree)) return hseg_scroll_pane def text_field_al(self, e): self.dir_path = self.dir_text_field.getText() self.got_exper(self.dir_path) def choose_dir_al(self, e): dc = DirectoryChooser('Choose a bob_py experiment folder') self.dir_path = dc.getDirectory() self.dir_text_field.setText(self.dir_path) self.got_exper(self.dir_path) def close_al(self, e): self.dispatchEvent(WindowEvent(self, WindowEvent.WINDOW_CLOSING)) def got_exper(self, dir_path): self.exper = bob_py.Exper(dir_path) self.show_exper_info()
class Browser: def __init__(self, repository): self.repository = repository # want a better solution, with domains, perhaps user specifies self.currentUserReference = System.getProperty("user.name") self.currentRecord = None self.window = JFrame("Pointrel browser", windowClosing=self.exit) self.window.contentPane.layout = BorderLayout() # redundant as the default self.window.bounds = (100, 100, 800, 600) self.menuBar = JMenuBar() self.window.JMenuBar = self.menuBar fileMenu = JMenu("File") fileMenu.add(JMenuItem("Open...", actionPerformed=self.open)) fileMenu.add(JMenuItem("Reload", actionPerformed=self.reloadPressed)) fileMenu.addSeparator() fileMenu.add(JMenuItem("Import from other repository...", actionPerformed=self.importFromOtherRepository)) fileMenu.addSeparator() fileMenu.add(JMenuItem("Close", actionPerformed=self.close)) self.menuBar.add(fileMenu) exportMenu = JMenu("Export") exportMenu.add(JMenuItem("Choose current export file...", actionPerformed=self.exportChooseCurrentFile)) exportMenu.addSeparator() exportMenu.add(JMenuItem("Export selected record", actionPerformed=self.exportSelectedRecord)) exportMenu.add(JMenuItem("Export record history for selected attribute", actionPerformed=self.exportAllRecordsForSelectedAttribute)) exportMenu.addSeparator() exportMenu.add(JMenuItem("Export current records for all attributes of selected entity", actionPerformed=self.exportLatestRecordsForSelectedEntity)) exportMenu.add(JMenuItem("Export entire record history for all attributes of selected entity", actionPerformed=self.exportAllRecordsForSelectedEntity)) self.menuBar.add(exportMenu) self.exportFileName = "export.pointrel" #self.reloadButton = JButton("Reload Repository", actionPerformed=self.reloadPressed) self.entitiesList = JList(DefaultListModel(), mouseClicked=self.entitiesListClicked) self.entitiesList.model.addElement("root") self.entitiesList.mousePressed = self.entitiesListMousePressed self.entitiesList.mouseReleased = self.entitiesListMousePressed self.attributesList = JList(DefaultListModel(), mouseClicked=self.attributesListClicked) self.versionsList = JList(DefaultListModel(), mouseClicked=self.versionsListClicked) self.listPanel = JPanel(layout=GridLayout(1, 2)) self.listPanel.add(JScrollPane(self.entitiesList)) self.listPanel.add(JScrollPane(self.attributesList)) self.listPanel.add(JScrollPane(self.versionsList)) self.navigationPanel = JPanel(layout=BorderLayout()) #self.navigationPanel.add(self.reloadButton, BorderLayout.NORTH) self.navigationPanel.add(self.listPanel, BorderLayout.CENTER) self.entityTextField = JTextField(preferredSize=(200,20)) self.attributeTextField = JTextField(preferredSize=(200,20)) self.deletedButton = JCheckBox("Deleted", actionPerformed=self.deletedPressed) # only one right now -- and no support for switching editor panels yet examples = ["pointrel:text/utf-8", ] self.valueTypeComboBox = JComboBox(examples, preferredSize=(200,20), editable=True) self.attributePanel = Box(BoxLayout.X_AXIS) self.attributePanel.add(Box.createRigidArea(Dimension(5,0))) self.attributePanel.add(JLabel("Entity:")) self.attributePanel.add(Box.createRigidArea(Dimension(2,0))) self.attributePanel.add(self.entityTextField) self.attributePanel.add(Box.createRigidArea(Dimension(5,0))) self.attributePanel.add(JLabel("Attribute:")) self.attributePanel.add(Box.createRigidArea(Dimension(2,0))) self.attributePanel.add(self.attributeTextField) self.attributePanel.add(Box.createRigidArea(Dimension(5,0))) self.attributePanel.add(JLabel("Value type:")) self.attributePanel.add(Box.createRigidArea(Dimension(2,0))) self.attributePanel.add(self.valueTypeComboBox) self.attributePanel.add(Box.createRigidArea(Dimension(5,0))) self.attributePanel.add(self.deletedButton) self.attributePanel.add(Box.createRigidArea(Dimension(5,0))) self.showAllDeletedButton = JCheckBox("Show all deleted", actionPerformed=self.showAllDeletedPressed) self.statusText = JTextField(preferredSize=(100,20)) self.saveButton = JButton("Save", actionPerformed=self.savePressed) self.normalSaveButtonColor = self.saveButton.background self.changedSaveButtonColor = Color.YELLOW self.statusPanel = Box(BoxLayout.X_AXIS) self.statusPanel.add(Box.createRigidArea(Dimension(5,0))) self.statusPanel.add(self.showAllDeletedButton) self.statusPanel.add(Box.createRigidArea(Dimension(25,0))) self.statusPanel.add(JLabel("Message:") ) self.statusPanel.add(Box.createRigidArea(Dimension(2,0))) self.statusPanel.add(self.statusText) self.statusPanel.add(Box.createRigidArea(Dimension(5,0))) self.statusPanel.add(self.saveButton) self.statusPanel.add(Box.createRigidArea(Dimension(1,0))) self.currentEditorPanel = EditorPanel_text_utf_8(self, "pointrel:text/utf-8") self.topPanel = Box(BoxLayout.Y_AXIS) self.topPanel.add(Box.createRigidArea(Dimension(0,5))) self.topPanel.add(self.attributePanel) self.topPanel.add(Box.createRigidArea(Dimension(0,5))) self.editorPanel = JPanel(layout=BorderLayout()) self.editorPanel.add(self.topPanel, BorderLayout.NORTH) self.editorPanel.add(self.currentEditorPanel, BorderLayout.CENTER) self.editorPanel.add(self.statusPanel, BorderLayout.SOUTH) self.browserPanel = JSplitPane(JSplitPane.VERTICAL_SPLIT) self.browserPanel.add(self.navigationPanel) self.browserPanel.add(self.editorPanel) self.window.contentPane.add(self.browserPanel, BorderLayout.CENTER) self.setTitleForRepository() self.window.show() # background timer for updating save button color self.timer = Timer(1000, CallbackActionListener(self.timerEvent)) self.timer.initialDelay = 1000 self.timer.start() def close(self, event): System.exit(0) def open(self, event): dialog = FileDialog(self.window) fileName = dialog.go(PointrelFileTypes) if not fileName: return repository = Repository(fileName) self.repository = repository self.currentRecord = None self.clearAllEntityNames() self.refreshBrowser() self.setTitleForRepository() def setTitleForRepository(self): self.window.title = "Pointrel browser on %s" % self.repository.fileName def setStatus(self, messageText): self.statusText.text = messageText def getCurrentEntityName(self): return self.entityTextField.text def setCurrentEntityName(self, newAttributeName): self.entityTextField.text = newAttributeName def getCurrentAttributeName(self): return self.attributeTextField.text def setCurrentAttributeName(self, newAttributeName): self.attributeTextField.text = newAttributeName def getCurrentValueType(self): #return self.valueTypeComboBox.selectedItem return self.valueTypeComboBox.editor.editorComponent.text def setCurrentValueType(self, newValueType): self.valueTypeComboBox.selectedItem = newValueType # PDF FIX __ NEED TO CHANGE EDITOR TYPE def reportStatistics(self): contents = self.currentEditorPanel.getCurrentValueBytes() words = len(contents.split()) lines = contents.count('\n') characters = len(contents) report = "%d lines; %d words; %d characters" % (lines, words, characters) self.setStatus(report) def timerEvent(self, event): self.manageSaveButtonColor() self.reportStatistics() def exit(self, event=None): System.exit(0) def reloadPressed(self, event): print "reloading repository; ", self.repository.reload() self.refreshBrowser() print "done" def importCodeFromRepository(self, name, globals=None, locals=None, fromlist=None): # seems to fail with stack overflow if print while importing while trying jconsole (it reassigns stdio) debug = 0 self.importLevel += 1 if debug: print " " * self.importLevel, if debug: print "importCodeFromRepository", name try: if debug: print " " * self.importLevel, if debug: print " globals: ", globals if debug: print " " * self.importLevel, if debug: print " locals", locals if debug: print " " * self.importLevel, if debug: print " fromlist", fromlist except UnboundLocalError: if debug: print " " * self.importLevel, if debug: print "unbound error" # Fast path: see if the module has already been imported. # though this is wrong -- as need to check repository if code has been changed # broken as does not consider fromlist #try: # return sys.modules[name] #except KeyError: # pass # check if local module record = self.repository.findLatestRecordForEntityAttribute(self.contextUUID, name + ".py") if record: if debug: print " " * self.importLevel, if debug: print " Loading from repository" #file = StringIO.StringIO(record.valueBytes) #try: #module = imp.load_source(name, name, file) #print module modifiedName = self.contextUUID[7:] + "." + name modifiedName = modifiedName.replace("-", "_") if debug: print "modifiedName", modifiedName if debug: print "sys.module.items", sys.modules.items() try: module = sys.modules[modifiedName] except KeyError: module = None # use the latest if this one is not if module: if module.__pointrelIdentifier__ != record.identifierString: module = None if not module: file = ByteArrayInputStream(record.valueBytes) module = imp.load_module(modifiedName, file, modifiedName + ".py", (".py", "r", imp.PY_SOURCE)) module.__pointrelIdentifier__ = record.identifierString if fromlist: if debug: print " " * self.importLevel, if debug: print "processing fromlist" for fromItemName in fromlist: if debug: print " " * self.importLevel, if debug: print "fromitemname", fromItemName if fromItemName == "*": for moduleItemName in dir(module): if debug: print " " * self.importLevel, if debug: print "moduleItemName", moduleItemName if moduleItemName[1] != '_': result = getattr(module, moduleItemName) #print " " * self.importLevel, #print "result", result #print " " * self.importLevel, #print "globals", globals globals[moduleItemName] = result else: result = getattr(module, fromItemName) globals[fromItemName] = result if debug: print "finished set", fromItemName #finally: # file.close() if debug: print " " * self.importLevel, if debug: print " Done loading" self.importLevel -= 1 result = module else: if debug: print " " * self.importLevel, if debug: print "default loading", name, fromlist try: result = self.oldimport(name, globals, locals, fromlist) except UnboundLocalError: # deal with strange Jython error result = self.oldimport(name) self.importLevel -= 1 return result def importFromOtherRepository(self, event): dialog = FileDialog(self.window, loadOrSave="load") fileName = dialog.go(PointrelFileTypes) if not fileName: return print "Importing from: ", fileName self.repository.importRecordsFromAnotherRepository(fileName) print "Done with import" self.refreshBrowser() def exportChooseCurrentFile(self, event): dialog = FileDialog(self.window, loadOrSave="save") fileName = dialog.go(PointrelFileTypes) if not fileName: return self.exportFileName = fileName print "File selected for exports:", self.exportFileName def exportSelectedRecord(self, event): if not self.currentRecord: print "No record selected" return oldRecords = [self.currentRecord] print "Exporting current record to repository %s" % self.exportFileName repository = Repository(self.exportFileName) repository.addRecordsFromAnotherRepository(oldRecords) print "Done" def exportAllRecordsForSelectedAttribute(self, event): entityName = self.getCurrentEntityName() if not entityName: print "No entity selected" return attributeName = self.getCurrentAttributeName() if not attributeName: print "No attribute selected" return print "Exporting all records for entity '%s' attribute '%s' to repository %s" % (entityName, attributeName, self.exportFileName) oldRecords = self.repository.findAllRecordsForEntityAttribute(entityName, attributeName) oldRecords.reverse() repository = Repository(self.exportFileName) repository.addRecordsFromAnotherRepository(oldRecords) print "Done" def exportLatestRecordsForSelectedEntity(self, event): entityName = self.getCurrentEntityName() if not entityName: print "No entity selected" return print "Exporting latest records for all entity '%s' attributes to repository %s" % (entityName, self.exportFileName) oldRecords = self.repository.findLatestRecordsForAllEntityAttributes(entityName) oldRecords.reverse() repository = Repository(self.exportFileName) repository.addRecordsFromAnotherRepository(oldRecords) print "Done" def exportAllRecordsForSelectedEntity(self, event): entityName = self.getCurrentEntityName() if not entityName: print "No entity selected" return print "Exporting all records for entity '%s' to repository %s" % (entityName, self.exportFileName) oldRecords = self.repository.findAllRecordsForEntity(entityName) oldRecords.reverse() repository = Repository(self.exportFileName) repository.addRecordsFromAnotherRepository(oldRecords) print "Done" def setCurrentRecord(self, aRecord): self.currentRecord = aRecord if aRecord: self.setCurrentEntityName(aRecord.entity) self.entityTextField.caretPosition = 0 self.setCurrentAttributeName(aRecord.attribute) self.attributeTextField.caretPosition = 0 self.setCurrentValueType(aRecord.valueType) self.currentEditorPanel.setCurrentValueBytes(aRecord.valueBytes) self.deletedButton.model.setSelected(aRecord.deleted) else: entityName = self.entitiesList.selectedValue if entityName == None: entityName = "" self.setCurrentEntityName(entityName) self.entityTextField.caretPosition = 0 self.setCurrentAttributeName("") self.setCurrentValueType(DefaultValueType) self.currentEditorPanel.setCurrentValueBytes("") self.deletedButton.model.selected = False def manageSaveButtonColor(self): if self.isCurrentRecordChanged(): self.saveButton.background = self.changedSaveButtonColor else: self.saveButton.background = self.normalSaveButtonColor def isCurrentRecordChanged(self): if not self.currentRecord: if self.getCurrentAttributeName() or self.currentEditorPanel.getCurrentValueBytes(): return True return False if self.getCurrentEntityName() != self.currentRecord.entity: return True if self.getCurrentAttributeName() != self.currentRecord.attribute: return True if self.getCurrentValueType() != self.currentRecord.valueType: return True if self.currentEditorPanel.isChangedFromOriginal(): return True # funky comparison because may be booleans and integers? # decided not to test as not really linked to save button #if (self.deletedButton.model.selected and not self.currentRecord.deleted) or (not self.deletedButton.model.selected and self.currentRecord.deleted): # return True return False def deletedPressed(self, event): deleteFlag = self.deletedButton.model.selected if self.currentRecord == None: return self.repository.deleteOrUndelete(self.currentRecord, self.currentUserReference, deleteFlag=deleteFlag) if not self.isDeletedViewable(): self.refreshBrowser() def refreshBrowser(self): entityName = self.entitiesList.selectedValue attributeName = self.attributesList.selectedValue versionName = self.versionsList.selectedValue self.entitiesListClicked(None, entityName, attributeName, versionName) def showAllDeletedPressed(self, event): self.refreshBrowser() def isDeletedViewable(self): return self.showAllDeletedButton.model.selected def savePressed(self, event): #entityName = self.entitiesList.selectedValue entityName = self.getCurrentEntityName() if entityName: attributeName = self.getCurrentAttributeName() if attributeName: attributeValue = self.currentEditorPanel.getCurrentValueBytes() attributeType = self.getCurrentValueType() newRecord = self.repository.add(entityName, attributeName, attributeValue, attributeType, self.currentUserReference) self.setCurrentRecord(newRecord) self.entitiesListClicked(None, self.entitiesList.selectedValue, attributeName) # refresh list if changed if attributeName != self.attributesList.selectedValue: # ? self.attributesList.model.addElement(attributeName) # need to select new version self.entitiesListClicked(None) def test(self): print "test OK" def clearAllEntityNames(self): self.entitiesList.model.clear() self.addEntityNameToEntitiesList("root") def deleteEntityNameFromList(self): entityName = self.entitiesList.selectedValue if entityName: self.entitiesList.model.removeElement(entityName) def addEntitytNameToList(self): entityName = JOptionPane.showInputDialog("Enter an entity name: ") if entityName: self.addEntityNameToEntitiesList(entityName) def addAllEntityNamesToList(self, addMeta): entityNames = self.repository.lastUser.keys() entityNames.sort() for entityName in entityNames: if addMeta or entityName.find("pointrel://tripleID/") != 0: self.addEntityNameToEntitiesList(entityName) def entitiesListMousePressed(self, event): if event.isPopupTrigger(): # options should be a list of (name, function, [arg1, [arg2]]) tuples options = [ ("add to list..", self.addEntitytNameToList), ("delete from list", self.deleteEntityNameFromList), (None), ("clear", self.clearAllEntityNames), (None), ("add all except meta", self.addAllEntityNamesToList, False), ("add all", self.addAllEntityNamesToList, True), ] menu = OptionsCallbackPopupMenu(event.component, event.x, event.y, options) def entitiesListClicked(self, event, entityName=None, attributeName=None, versionName=None): if event: self.setCurrentRecord(None) if entityName: self.entitiesList.setSelectedValue(entityName, True) else: entityName = self.entitiesList.selectedValue if entityName: self.versionsList.model.clear() model = self.attributesList.model model.clear() attributes = self.repository.allAttributesForEntity(entityName, self.isDeletedViewable()) attributes.sort() for attribute in attributes: model.addElement(attribute) if attributeName: self.attributesList.setSelectedValue(attributeName, True) self.attributesListClicked(None, versionName) def attributesListClicked(self, event, versionName=None): if event: self.setCurrentRecord(None) entityName = self.entitiesList.selectedValue if entityName: attributeName = self.attributesList.selectedValue if event: self.setCurrentAttributeName(attributeName) if attributeName: model = self.versionsList.model model.clear() versions = self.repository.findAllRecordsForEntityAttribute(entityName, attributeName, self.isDeletedViewable()) for version in versions: versionDescription = "%s %s" % (version.timestamp, version.userReference) model.addElement(versionDescription) selectedRecord = None if versions: if versionName == None or not model.contains(versionName): self.versionsList.selectedIndex = 0 selectedRecord = versions[0] else: versionIndex = model.indexOf(versionName) self.versionsList.selectedIndex = versionIndex selectedRecord = versions[versionIndex] self.setCurrentRecord(selectedRecord) if event and event.clickCount == 2: self.followResource(self.currentRecord) else: self.setCurrentRecord(None) else: self.setCurrentRecord(None) def versionsListClicked(self, event): entityName = self.entitiesList.selectedValue if entityName: attributeName = self.attributesList.selectedValue if event: self.setCurrentAttributeName(attributeName) if attributeName: index = self.versionsList.selectedIndex versions = self.repository.findAllRecordsForEntityAttribute(entityName, attributeName, self.isDeletedViewable()) if versions: versionRecord = versions[index] self.setCurrentRecord(versionRecord) if event and event.clickCount == 2: self.followResource(versionRecord) else: self.setCurrentRecord(None) def followResource(self, record): if not record: return if '\n' in record.valueBytes: print "not following a resource with a newline" return self.addEntityNameToEntitiesList(record.valueBytes) def addEntityNameToEntitiesList(self, entityName): self.entitiesList.model.addElement(entityName) self.entitiesList.selectedIndex = self.entitiesList.model.size() - 1 self.entitiesListClicked(None) self.setCurrentRecord(None)