class ImportEdgesProcess extends AbstractImportProcess {

    public static final String EDGE_SOURCE = "source";
    public static final String EDGE_TARGET = "target";
    public static final String EDGE_TYPE = "type";
    public static final String EDGE_KIND = "kind";

    public static final String EDGE_ID = "id";
    public static final String EDGE_LABEL = "label";

    public ImportEdgesProcess(SpreadsheetGeneralConfiguration generalConfig, SheetParser parser,
                              ContainerLoader container, ProgressTicket progressTicket) throws IOException {
        super(generalConfig, container, progressTicket, parser);
        init();
    }

    private void init() {
        //Make sure default container configuration is correct for importing edges:
        container.setAllowAutoNode(true);
        container.setAllowParallelEdge(true);
        container.setAllowSelfLoop(true);
        container.setEdgeDefault(EdgeDirectionDefault.MIXED);
    }

    @Override
    public boolean execute() {<FILL_FUNCTION_BODY>}

    @Override
    protected void addColumn(String name, Class type) {
        container.addEdgeColumn(name, type);
    }
}

        setupColumnsIndexesAndFindSpecialColumns(
            Arrays.asList(EDGE_SOURCE, EDGE_TARGET, EDGE_TYPE, EDGE_KIND, EDGE_ID, EDGE_LABEL),
            generalConfig.getColumnsClasses());

        Integer sourceColumnIndex = specialColumnsIndexMap.get(EDGE_SOURCE);
        Integer targetColumnIndex = specialColumnsIndexMap.get(EDGE_TARGET);
        Integer typeColumnIndex = specialColumnsIndexMap.get(EDGE_TYPE);//Direction
        Integer kindColumnIndex = specialColumnsIndexMap.get(EDGE_KIND);//Kind for parallel edges

        Integer idColumnIndex = specialColumnsIndexMap.get(EDGE_ID);
        Integer labelColumnIndex = specialColumnsIndexMap.get(EDGE_LABEL);

        Progress.start(progressTicket);
        for (SheetRow row : parser) {
            if (cancel) {
                break;
            }

            if (!checkRow(row)) {
                continue;
            }

            String source = null;
            String target = null;
            String id = null;
            String label = null;
            EdgeDirection direction = EdgeDirection.DIRECTED;
            String kind = null;

            if (sourceColumnIndex != null) {
                source = row.get(sourceColumnIndex);
            }
            if (targetColumnIndex != null) {
                target = row.get(targetColumnIndex);
            }
            if (typeColumnIndex != null) {
                String type = row.get(typeColumnIndex);
                if ("undirected".equalsIgnoreCase(type)) {
                    direction = EdgeDirection.UNDIRECTED;
                }
            }
            if (kindColumnIndex != null) {
                kind = row.get(kindColumnIndex);
            }

            if (idColumnIndex != null) {
                id = row.get(idColumnIndex);
            }
            if (labelColumnIndex != null) {
                label = row.get(labelColumnIndex);
            }

            EdgeDraft edge = id != null ? container.factory().newEdgeDraft(id) : container.factory().newEdgeDraft();

            if (label != null) {
                edge.setLabel(label);
            }

            if (source == null || target == null) {
                logError(getMessage("ImportEdgesProcess.error.noSourceOrTargetData"));
                continue;
            }

            if (!container.nodeExists(source)) {
                container.addNode(container.factory().newNodeDraft(source));
            }

            if (!container.nodeExists(target)) {
                container.addNode(container.factory().newNodeDraft(target));
            }

            edge.setSource(container.getNode(source));
            edge.setTarget(container.getNode(target));
            edge.setDirection(direction);

            if (kind != null) {
                edge.setType(kind);
            }

            for (Map.Entry<String, Integer> columnEntry : headersIndexMap.entrySet()) {
                String column = columnEntry.getKey();
                Integer index = columnEntry.getValue();
                Class type = headersClassMap.get(column);

                if (type == null) {
                    continue;
                }

                Object value = row.get(index);
                if (value != null) {
                    value = parseValue((String) value, type, column);

                    if (value != null) {
                        //Note: we allow any type on weight column, to support dynamic weights
                        if (column.equalsIgnoreCase("weight") && value instanceof Number) {
                            edge.setWeight(((Number) value).doubleValue());
                        } else {
                            edge.setValue(column, value);
                        }
                    }
                }
            }

            container.addEdge(edge);
        }

        Progress.finish(progressTicket);

        return !cancel;
    
<methods>public void <init>(org.gephi.io.importer.plugin.file.spreadsheet.process.SpreadsheetGeneralConfiguration, org.gephi.io.importer.api.ContainerLoader, org.gephi.utils.progress.ProgressTicket, org.gephi.io.importer.plugin.file.spreadsheet.sheet.SheetParser) ,public boolean cancel() ,public void close() throws java.io.IOException,public abstract boolean execute() ,public org.gephi.io.importer.api.Report getReport() <variables>protected boolean cancel,protected final non-sealed org.gephi.io.importer.api.ContainerLoader container,protected final non-sealed org.gephi.io.importer.plugin.file.spreadsheet.process.SpreadsheetGeneralConfiguration generalConfig,protected final Map<java.lang.String,Class#RAW> headersClassMap,protected final Map<java.lang.String,java.lang.Integer> headersIndexMap,protected final non-sealed org.gephi.io.importer.plugin.file.spreadsheet.sheet.SheetParser parser,protected final non-sealed org.gephi.utils.progress.ProgressTicket progressTicket,protected final non-sealed org.gephi.io.importer.api.Report report,protected final Map<java.lang.String,java.lang.Integer> specialColumnsIndexMap