def displayPopupToCreateLayer_cb(self, event): # If fields header are selected, we get it selectedFields = self.vocabularyController.view.selectedMessageTable.treeViewHeaderGroup.getSelectedFields() if selectedFields is None or len(selectedFields) == 0: # Either, we only consider the current field selectedFields = [self.field] # We retrieve the first and last fields selected firstField = selectedFields[0] lastField = selectedFields[0] for field in selectedFields: if field.getIndex() < firstField.getIndex(): firstField = field if field.getIndex() > lastField.getIndex(): lastField = field # Update selected fields to the entire range selectedFields = [] for field in self.getSymbol().getExtendedFields(): if field.getIndex() >= firstField.getIndex() and field.getIndex() <= lastField.getIndex(): selectedFields.append(field) # Verify that selected field range does not overlap existing layers (i.e. if the selected fields have the same parent) parent = selectedFields[0].getParentField() for selectedField in selectedFields: if parent != selectedField.getParentField(): NetzobErrorMessage(_("Selected field range overlaps existing layer.")) return # Retrieve layer's name dialog = Gtk.Dialog(title=_("Layer creation"), flags=0, buttons=(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, Gtk.STOCK_OK, Gtk.ResponseType.OK)) dialog.set_size_request(200, 50) label = Gtk.Label("Name:") entry = Gtk.Entry() dialog.vbox.pack_start(label, True, True, 0) dialog.vbox.pack_start(entry, True, True, 0) dialog.show_all() result = dialog.run() if (result == Gtk.ResponseType.OK): name = entry.get_text() dialog.destroy() if name == "": return else: dialog.destroy() return # Create a new layer regex = "" for selectedField in selectedFields: regex += "(?:" + selectedField.getRegex()[1:] fieldLayer = Field(str(name), "(" + regex + ")", self.getSymbol()) index_newField = 999999 parentField = None for selectedField in selectedFields: parentField = selectedField.getParentField() if parentField.getLocalFields().index(selectedField) < index_newField: index_newField = parentField.getLocalFields().index(selectedField) # Retrieve the lowest index of the new fields fieldLayer.addField(selectedField) parentField.getLocalFields().remove(selectedField) parentField.getLocalFields().insert(index_newField, fieldLayer) # self.getSymbol().getField().addField(fieldLayer, index_newField) self.vocabularyController.view.updateLeftPanel()
def clusterByTokenization(self, symbols): self.ServerInference() ################################### Cluster messages according to their tokens ll = len(self.symbols) - 1 i_equ = 0 while (ll > 0): currentPattern = self.symbols[i_equ].getMessages()[0].getPattern( )[1] for j in range(ll): jnext = len(self.symbols) - j - 1 cond = False for message in self.symbols[jnext].getMessages(): if currentPattern == message.getPattern()[1]: # score = sum([p1 == p2 for p1, p2 in zip(currentPattern, message.getPattern()[1])]) score2 = self.computeSimilarities( currentPattern, message.getPattern()[1]) # if score >= min(len(currentPattern), len(message.getPattern()[1])): minilength = min( len(message.getData()), len(self.symbols[i_equ].getMessages() [0].getData())) if score2 * 2.0 / minilength >= 0.40: cond = True if cond: break if (cond): currentDst = self.symbols[i_equ].getPattern()[0] otherDst = self.symbols[jnext].getPattern()[0] if not self.server or (currentDst == otherDst) or ( currentDst != self.server and otherDst != self.server): self.mergeEffectiveRowCol(i_equ, jnext) # self.log.debug("Merge the equal column/line {0} with the column/line {1}".format(str(i_equ), str(j + 1))) i_equ -= 1 break ll -= 1 i_equ += 1 ################################## Align messages alignment = NeedlemanAndWunsch(self.unitSize, self.cb_status) tmpSymbols = [] for symbol in self.symbols: # alignment.alignSymbols([symbol], self.project) # symbol.getFields()[0].setFormat(Format.STRING) # tmpSymbols.extend(alignment.getLastResult()) try: # print "l" al = self.computeAlignment(symbol) symbol.getField().setAlignment(al) alignment.buildRegexFromAlignment(symbol, al, self.defaultFormat) # for (p, fields) in zip(symbol.getPattern()[1], symbol.getFields()): # field.setFormat(p.getFormat()) except: logging.warn( "Partitionnement error: too much fields ( > 100) for the symbol '" + symbol.getName() + "' len=" + str(len(symbol.getExtendedFields())) + "len " + str(len(symbol.getPattern()[1]))) symbol.getField().removeLocalFields() field = Field("Field 0", "(.{, })", symbol) symbol.addLocalField(field) # Use the default protocol type for representation field.setFormat(self.defaultFormat) alignment.alignSymbols(self.symbols, self.project) self.symbols = alignment.getLastResult()