-
Notifications
You must be signed in to change notification settings - Fork 454
Open
Description
大家好,我是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
Labels
No labels