Thanks to visit codestin.com
Credit goes to github.com

Skip to content

OFD文档合并会导致递归栈溢出 #388

@FanQinFred

Description

@FanQinFred

大家好,我是iLoveOFD的开发者,在使用OFD R&W进行OFD文档合并测试的过程中,发现了代码一个严重的递归错误。这是我第二次提交代码为此项目做贡献。
该问题涉及的文件:ofdrw/ofdrw-reader/src/main/java/org/ofdrw/reader/ResourceManage.java 136至161行。
以下代码供参考,加入了一个set记录。
/**
* 递归的解析绘制参数并覆盖配置参数内容
*
* @param id 资源ID
* @return 绘制参数,不存在返回null
*/
public CT_DrawParam getDrawParamFinal(String id) {
return getDrawParamFinal(id, new HashSet<>());
}

private CT_DrawParam getDrawParamFinal(String id, Set<String> visited) {
    if (id == null || visited.contains(id)) {
        return null; // 避免循环引用
    }
    visited.add(id);

    CT_DrawParam current = drawParamMap.get(id);
    return superDrawParam(current, visited);
}

/**
 * 寻找继承属性用于覆盖当前为空的属性
 *
 * @param current 当前需要子节点
 * @return 补全后的子节点副本
 */
public CT_DrawParam superDrawParam(CT_DrawParam current, Set<String> visited) {
    if (current == null) {
        return null;
    }
    // 复制为副本防止造成污染
    current = current.clone();
    ST_RefID relative = current.getRelative();
    if (relative == null) {
        return current;
    }
    // 递归的寻找上一级继承的参数的最终参数
    CT_DrawParam parent = getDrawParamFinal(relative.toString(), visited);
    if (parent == null) {
        return current;
    }
    // 本次绘制属性将覆盖其引用的绘制参数中的同名属性。
    if (current.attributeValue("LineWidth") == null
            && parent.attributeValue("LineWidth") != null) {
        current.addAttribute("LineWidth", parent.attributeValue("LineWidth"));
    }
    if (current.attributeValue("Join") == null
            && parent.attributeValue("Join") != null) {
        current.addAttribute("Join", parent.attributeValue("Join"));
    }
    if (current.attributeValue("Cap") == null
            && parent.attributeValue("Cap") != null) {
        current.addAttribute("Cap", parent.attributeValue("Cap"));
    }
    if (current.attributeValue("DashOffset") == null
            && parent.attributeValue("DashOffset") != null) {
        current.addAttribute("DashOffset", parent.attributeValue("DashOffset"));
    }
    if (current.attributeValue("DashPattern") == null
            && parent.attributeValue("DashPattern") != null) {
        current.addAttribute("DashPattern", parent.attributeValue("DashPattern"));
    }
    if (current.attributeValue("MiterLimit") == null
            && parent.attributeValue("MiterLimit") != null) {
        current.addAttribute("MiterLimit", parent.attributeValue("MiterLimit"));
    }
    if (current.getFillColor() == null
            && parent.getFillColor() != null) {
        current.setFillColor(parent.getFillColor());
    }
    if (current.getStrokeColor() == null
            && parent.getStrokeColor() != null) {
        current.setStrokeColor(parent.getStrokeColor());
    }
    return current;
}

由于我对整个项目缺少整体理解,上诉解决方案还需要进行严格审核。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions