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()
Пример #2
0
    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()