ICEfaces涉嫌抄袭PrimeFaces

ICEfaces 3发布后,本来我是很激动的,以为这是一个伟大的版本。但是,PrimeFaces的同行们发现了ICEfaces抄袭了PrimeFaces的部分代码。ICEfaces的行为真令人失望!

由于PrimeFaces和ICEfaces都是开源产品,因此抄袭在法律上没有问题。但是在道德上,则无法过关。抄袭的代码对比如下:

一、PrimeFaces PanelRenderer

package org.primefaces.component.panel;import java.io.IOException;
import java.util.Map;import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;import org.primefaces.component.menu.Menu;
import org.primefaces.renderkit.CoreRenderer;public class PanelRenderer extends CoreRenderer {@Overridepublic void decode(FacesContext context, UIComponent component) {Panel panel = (Panel) component;String clientId = panel.getClientId(context);Map params = context.getExternalContext().getRequestParameterMap();//Restore toggle stateString collapsedParam = params.get(clientId + "_collapsed");if(collapsedParam != null) {panel.setCollapsed(Boolean.valueOf(collapsedParam));}//Restore visibility stateString visibleParam = params.get(clientId + "_visible");if(visibleParam != null) {panel.setVisible(Boolean.valueOf(visibleParam));}decodeBehaviors(context, component);}@Overridepublic void encodeEnd(FacesContext facesContext, UIComponent component) throws IOException {Panel panel = (Panel) component;encodeMarkup(facesContext, panel);encodeScript(facesContext, panel);}protected void encodeScript(FacesContext context, Panel panel) throws IOException {ResponseWriter writer = context.getResponseWriter();String clientId = panel.getClientId(context);startScript(writer, clientId);writer.write("PrimeFaces.cw('Panel','" + panel.resolveWidgetVar() + "',{");writer.write("id:'" + clientId + "'");//Toggle configurationif(panel.isToggleable()) {writer.write(",toggleable:true");writer.write(",toggleSpeed:" + panel.getToggleSpeed());writer.write(",collapsed:" + panel.isCollapsed());}//Toggle configurationif(panel.isClosable()) {writer.write(",closable:true");writer.write(",closeSpeed:" + panel.getCloseSpeed());}//Options menu configurationif(panel.getOptionsMenu() != null) {writer.write(",hasMenu:true");}encodeClientBehaviors(context, panel);writer.write("});");endScript(writer);}protected void encodeMarkup(FacesContext context, Panel panel) throws IOException {ResponseWriter writer = context.getResponseWriter();String clientId = panel.getClientId(context);Menu optionsMenu = panel.getOptionsMenu();writer.startElement("div", null);writer.writeAttribute("id", clientId, null);String styleClass = panel.getStyleClass() != null ? Panel.PANEL_CLASS + " " + panel.getStyleClass() : Panel.PANEL_CLASS;styleClass = panel.isVisible() ? styleClass : styleClass + " ui-helper-hidden";writer.writeAttribute("class", styleClass, "styleClass");if(panel.getStyle() != null) {writer.writeAttribute("style", panel.getStyle(), "style");}encodeHeader(context, panel);encodeContent(context, panel);encodeFooter(context, panel);if(panel.isToggleable()) {encodeStateHolder(context, panel, clientId + "_collapsed", String.valueOf(panel.isCollapsed()));}if(panel.isClosable()) {encodeStateHolder(context, panel, clientId + "_visible", String.valueOf(panel.isVisible()));}if (optionsMenu != null) {optionsMenu.setPosition("dynamic");optionsMenu.setTrigger(clientId + "_menu");optionsMenu.setMy("left top");optionsMenu.setAt("left bottom");optionsMenu.encodeAll(context);}writer.endElement("div");}protected void encodeHeader(FacesContext context, Panel panel) throws IOException {ResponseWriter writer = context.getResponseWriter();String widgetVar = panel.resolveWidgetVar();UIComponent header = panel.getFacet("header");String headerText = panel.getHeader();String clientId = panel.getClientId(context);if(headerText == null && header == null) {return;}writer.startElement("div", null);writer.writeAttribute("id", panel.getClientId(context) + "_header", null);writer.writeAttribute("class", Panel.PANEL_TITLEBAR_CLASS, null);//Titlewriter.startElement("span", null);writer.writeAttribute("class", Panel.PANEL_TITLE_CLASS, null);if(header != null) {renderChild(context, header);} else if(headerText != null) {writer.write(headerText);}writer.endElement("span");//Optionsif(panel.isClosable()) {encodeIcon(context, panel, "ui-icon-closethick", clientId + "_closer", panel.getCloseTitle());}if(panel.isToggleable()) {String icon = panel.isCollapsed() ? "ui-icon-plusthick" : "ui-icon-minusthick";encodeIcon(context, panel, icon, clientId + "_toggler", panel.getToggleTitle());}if(panel.getOptionsMenu() != null) {encodeIcon(context, panel, "ui-icon-gear", clientId + "_menu", panel.getMenuTitle());}writer.endElement("div");}protected void encodeContent(FacesContext facesContext, Panel panel) throws IOException {ResponseWriter writer = facesContext.getResponseWriter();writer.startElement("div", null);writer.writeAttribute("id", panel.getClientId() + "_content", null);writer.writeAttribute("class", Panel.PANEL_CONTENT_CLASS, null);if (panel.isCollapsed()) {writer.writeAttribute("style", "display:none", null);}renderChildren(facesContext, panel);writer.endElement("div");}protected void encodeFooter(FacesContext facesContext, Panel panel) throws IOException {ResponseWriter writer = facesContext.getResponseWriter();UIComponent footer = panel.getFacet("footer");String footerText = panel.getFooter();if (footer != null || footerText != null) {writer.startElement("div", null);writer.writeAttribute("id", panel.getClientId(facesContext) + "_footer", null);writer.writeAttribute("class", Panel.PANEL_FOOTER_CLASS, null);if (footer != null) {renderChild(facesContext, footer);} else if (footerText != null) {writer.write(footerText);}writer.endElement("div");}}protected void encodeIcon(FacesContext context, Panel panel, String iconClass, String id, String title) throws IOException {ResponseWriter writer = context.getResponseWriter();writer.startElement("a", null);writer.writeAttribute("href", "javascript:void(0)", null);writer.writeAttribute("class", Panel.PANEL_TITLE_ICON_CLASS, null);if(title != null) {writer.writeAttribute("title", title, null);}writer.startElement("span", null);if(id != null) {writer.writeAttribute("id", id, null);}writer.writeAttribute("class", "ui-icon " + iconClass, null);writer.endElement("span");writer.endElement("a");}protected void encodeStateHolder(FacesContext context, Panel panel, String name, String value) throws IOException {ResponseWriter writer = context.getResponseWriter();writer.startElement("input", null);writer.writeAttribute("type", "hidden", null);writer.writeAttribute("id", name, null);writer.writeAttribute("name", name, null);writer.writeAttribute("value", value, null);writer.endElement("input");}@Overridepublic void encodeChildren(FacesContext context, UIComponent component) throws IOException {//Do nothing}@Overridepublic boolean getRendersChildren() {return true;}
}

二、IceFaces PanelRenderer
package org.icefaces.ace.component.panel;import java.io.IOException;
import java.util.Map;import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;import org.icefaces.ace.component.menu.Menu;
import org.icefaces.ace.renderkit.CoreRenderer;import org.icefaces.ace.util.Utils;
import org.icefaces.ace.util.JSONBuilder;
import org.icefaces.render.MandatoryResourceComponent;@MandatoryResourceComponent(tagName="panel", value="org.icefaces.ace.component.panel.Panel")
public class PanelRenderer extends CoreRenderer {@Overridepublic void decode(FacesContext context, UIComponent component) {Panel panel = (Panel) component;String clientId = panel.getClientId(context);Map params = context.getExternalContext().getRequestParameterMap();//Restore toggle stateString collapsedParam = params.get(clientId + "_collapsed");if(collapsedParam != null) {panel.setCollapsed(Boolean.valueOf(collapsedParam));}//Restore visibility stateString visibleParam = params.get(clientId + "_visible");if(visibleParam != null) {panel.setVisible(Boolean.valueOf(visibleParam));}decodeBehaviors(context, component);}@Overridepublic void encodeEnd(FacesContext facesContext, UIComponent component) throws IOException {Panel panel = (Panel) component;encodeMarkup(facesContext, panel);encodeScript(facesContext, panel);}protected void encodeScript(FacesContext context, Panel panel) throws IOException {ResponseWriter writer = context.getResponseWriter();String clientId = panel.getClientId(context);writer.startElement("script", null);writer.writeAttribute("type", "text/javascript", null);writer.write(this.resolveWidgetVar(panel) + " = new ");JSONBuilder jb = JSONBuilder.create();jb.beginFunction("ice.ace.Panel").item(clientId).beginMap().entry("visible", panel.isVisible());//Toggle configurationif(panel.isToggleable()) {jb.entry("toggleable", true);jb.entry("toggleSpeed", panel.getToggleSpeed());jb.entry("collapsed", panel.isCollapsed());}//Toggle configurationif(panel.isClosable()) {jb.entry("closable", true);jb.entry("closeSpeed", panel.getCloseSpeed());}//Options menu configurationif(panel.getOptionsMenu() != null) {jb.entry("hasMenu", true);}encodeClientBehaviors(context, panel, jb);jb.endMap().endFunction();writer.write(jb.toString());writer.endElement("script");}protected void encodeMarkup(FacesContext context, Panel panel) throws IOException {ResponseWriter writer = context.getResponseWriter();String clientId = panel.getClientId(context);Menu optionsMenu = panel.getOptionsMenu();writer.startElement("div", null);writer.writeAttribute("id", clientId, null);String styleClass = panel.getStyleClass() ;Utils.writeConcatenatedStyleClasses(writer, Panel.PANEL_CLASS, styleClass);String style = panel.getStyle();if(style != null) {writer.writeAttribute("style", style, "style");}encodeHeader(context, panel);encodeContent(context, panel);encodeFooter(context, panel);if(panel.isToggleable()) {encodeStateHolder(context, panel, clientId + "_collapsed", String.valueOf(panel.isCollapsed()));}if(panel.isClosable()) {encodeStateHolder(context, panel, clientId + "_visible", String.valueOf(panel.isVisible()));}if (optionsMenu != null) {optionsMenu.setPosition("dynamic");optionsMenu.setTrigger(clientId + "_menu");optionsMenu.setMy("left top");optionsMenu.setAt("left bottom");optionsMenu.encodeAll(context);}writer.endElement("div");}protected void encodeHeader(FacesContext context, Panel panel) throws IOException {ResponseWriter writer = context.getResponseWriter();String widgetVar = this.resolveWidgetVar(panel);UIComponent header = panel.getFacet("header");String headerText = panel.getHeader();String clientId = panel.getClientId(context);if(headerText == null && header == null) {return;}writer.startElement("div", null);writer.writeAttribute("id", clientId + "_header", null);writer.writeAttribute("class", Panel.PANEL_TITLEBAR_CLASS, null);//Titlewriter.startElement("span", null);writer.writeAttribute("class", Panel.PANEL_TITLE_CLASS, null);if(header != null) {renderChild(context, header);} else if(headerText != null) {writer.write(headerText);}writer.endElement("span");//Optionsif(panel.isClosable()) {encodeIcon(context, panel, "ui-icon-closethick", clientId + "_closer");}if(panel.isToggleable()) {String icon = panel.isCollapsed() ? "ui-icon-plusthick" : "ui-icon-minusthick";encodeIcon(context, panel, icon, clientId + "_toggler");}if(panel.getOptionsMenu() != null) {encodeIcon(context, panel, "ui-icon-gear", clientId + "_menu");}writer.endElement("div");}protected void encodeContent(FacesContext facesContext, Panel panel) throws IOException {ResponseWriter writer = facesContext.getResponseWriter();writer.startElement("div", null);writer.writeAttribute("id", panel.getClientId() + "_content", null);writer.writeAttribute("class", Panel.PANEL_CONTENT_CLASS, null);if (panel.isCollapsed()) {writer.writeAttribute("style", "display:none", null);}renderChildren(facesContext, panel);writer.endElement("div");}protected void encodeFooter(FacesContext facesContext, Panel panel) throws IOException {ResponseWriter writer = facesContext.getResponseWriter();UIComponent footer = panel.getFacet("footer");String footerText = panel.getFooter();if (footer != null || footerText != null) {writer.startElement("div", null);writer.writeAttribute("id", panel.getClientId(facesContext) + "_footer", null);writer.writeAttribute("class", Panel.PANEL_FOOTER_CLASS, null);if (footer != null) {renderChild(facesContext, footer);} else if (footerText != null) {writer.write(footerText);}writer.endElement("div");}}protected void encodeIcon(FacesContext context, Panel panel, String iconClass, String id) throws IOException {ResponseWriter writer = context.getResponseWriter();writer.startElement("a", null);writer.writeAttribute("class", Panel.PANEL_TITLE_ICON_CLASS, null);writer.startElement("span", null);if(id != null) {writer.writeAttribute("id", id, null);}writer.writeAttribute("class", "ui-icon " + iconClass, null);writer.endElement("span");writer.endElement("a");}protected void encodeStateHolder(FacesContext context, Panel panel, String name, String value) throws IOException {ResponseWriter writer = context.getResponseWriter();writer.startElement("input", null);writer.writeAttribute("type", "hidden", null);writer.writeAttribute("id", name, null);writer.writeAttribute("name", name, null);writer.writeAttribute("value", value, null);writer.endElement("input");}@Overridepublic void encodeChildren(FacesContext context, UIComponent component) throws IOException {//Do nothing}@Overridepublic boolean getRendersChildren() {return true;}
}

三、PrimeFaces Panel.js

/*** PrimeFaces Panel Widget*/
PrimeFaces.widget.Panel = function(cfg) {this.cfg = cfg;this.id = this.cfg.id;this.jqId = PrimeFaces.escapeClientId(this.id);if(this.cfg.toggleable) {this.toggler = $(this.jqId + '_toggler');this.toggleStateHolder = $(this.jqId + '_collapsed');this.content = $(this.jqId + '_content');this.setupToggleTrigger();}if(this.cfg.closable) {this.visibleStateHolder = $(this.jqId + "_visible");this.setupCloseTrigger();}if(this.cfg.hasMenu) {this.visibleStateHolder = $(this.jqId + "_visible");this.setupMenuTrigger();}this.postConstruct();
}PrimeFaces.extend(PrimeFaces.widget.Panel, PrimeFaces.widget.BaseWidget);PrimeFaces.widget.Panel.prototype.toggle = function() {if(this.cfg.collapsed) {this.toggler.removeClass('ui-icon-plusthick').addClass('ui-icon-minusthick');this.cfg.collapsed = false;this.toggleStateHolder.val(false);}else {this.toggler.removeClass('ui-icon-minusthick').addClass('ui-icon-plusthick');this.cfg.collapsed = true;this.toggleStateHolder.val(true);}var _self = this;this.content.slideToggle(this.cfg.toggleSpeed,function(e) {if(_self.cfg.behaviors) {var toggleBehavior = _self.cfg.behaviors['toggle'];if(toggleBehavior) {toggleBehavior.call(_self, e);}}});
}PrimeFaces.widget.Panel.prototype.close = function() {this.visibleStateHolder.val(false);var _self = this;$(this.jqId).fadeOut(this.cfg.closeSpeed,function(e) {if(_self.cfg.behaviors) {var closeBehavior = _self.cfg.behaviors['close'];if(closeBehavior) {closeBehavior.call(_self, e);}}});
}PrimeFaces.widget.Panel.prototype.show = function() {$(this.jqId).fadeIn(this.cfg.closeSpeed);this.visibleStateHolder.val(true);
}PrimeFaces.widget.Panel.prototype.setupToggleTrigger = function() {var _self = this,trigger = this.toggler.parent();this.setupTriggerVisuals(trigger);trigger.click(function() {_self.toggle();});
}PrimeFaces.widget.Panel.prototype.setupCloseTrigger = function() {var _self = this,trigger = $(this.jqId + '_closer').parent();this.setupTriggerVisuals(trigger);trigger.click(function() {_self.close();});
}PrimeFaces.widget.Panel.prototype.setupMenuTrigger = function() {var trigger = $(this.jqId + '_menu').parent();this.setupTriggerVisuals(trigger);
}PrimeFaces.widget.Panel.prototype.setupTriggerVisuals = function(trigger) {trigger.mouseover(function() {$(this).addClass('ui-state-hover');}).mouseout(function() {$(this).removeClass('ui-state-hover');});
}

四、IceFaces Panel.js

/***  Panel Widget*/
ice.ace.Panel = function(id, cfg) {this.id = id;this.cfg = cfg;this.jqId = ice.ace.escapeClientId(id);if(this.cfg.toggleable) {this.toggler = ice.ace.jq(this.jqId + '_toggler');this.toggleStateHolder = ice.ace.jq(this.jqId + '_collapsed');this.content = ice.ace.jq(this.jqId + '_content');this.setupToggleTrigger();}if(this.cfg.closable) {this.visibleStateHolder = ice.ace.jq(this.jqId + "_visible");this.setupCloseTrigger();}if(this.cfg.hasMenu) {this.visibleStateHolder = ice.ace.jq(this.jqId + "_visible");this.setupMenuTrigger();}if(!this.cfg.visible) {ice.ace.jq(this.jqId).css('display','none');}
}ice.ace.Panel.prototype.toggle = function() {if(this.cfg.collapsed) {this.toggler.removeClass('ui-icon-plusthick').addClass('ui-icon-minusthick');this.cfg.collapsed = false;this.toggleStateHolder.val(false);}else {this.toggler.removeClass('ui-icon-minusthick').addClass('ui-icon-plusthick');this.cfg.collapsed = true;this.toggleStateHolder.val(true);}var _self = this;this.content.slideToggle(this.cfg.toggleSpeed,function(e) {if(_self.cfg.behaviors) {var toggleBehavior = _self.cfg.behaviors['toggle'];if(toggleBehavior) {toggleBehavior.call(this, e);}}});
}ice.ace.Panel.prototype.close = function() {this.visibleStateHolder.val(false);var _self = this;ice.ace.jq(this.jqId).fadeOut(this.cfg.closeSpeed,function(e) {if(_self.cfg.behaviors) {var closeBehavior = _self.cfg.behaviors['close'];if(closeBehavior) {closeBehavior.call(this, e);}}});
}ice.ace.Panel.prototype.show = function() {ice.ace.jq(this.jqId).fadeIn(this.cfg.closeSpeed);this.visibleStateHolder.val(true);
}ice.ace.Panel.prototype.setupToggleTrigger = function() {var _self = this,trigger = this.toggler.parent();this.setupTriggerVisuals(trigger);trigger.click(function() {_self.toggle();});
}ice.ace.Panel.prototype.setupCloseTrigger = function() {var _self = this,trigger = ice.ace.jq(this.jqId + '_closer').parent();this.setupTriggerVisuals(trigger);trigger.click(function() {_self.close();});
}ice.ace.Panel.prototype.setupMenuTrigger = function() {var trigger = ice.ace.jq(this.jqId + '_menu').parent();this.setupTriggerVisuals(trigger);
}ice.ace.Panel.prototype.setupTriggerVisuals = function(trigger) {trigger.mouseover(function() {ice.ace.jq(this).addClass('ui-state-hover');}).mouseout(function() {ice.ace.jq(this).removeClass('ui-state-hover');});
}
ICEsoft公司在开发ACE组件集时,把PrimeFaces的代码直接复制过来,然后修改包名和类名,其它的代码都是照搬。这种行为真丢脸。

结论:ICEfaces的行为让人及其失望,用PrimeFaces的开发者的一句原话作为本文的总结:“您可以复制我们的代码,但您永远也拿不走我们的激情!”。

转载于:https://www.cnblogs.com/yangjin-55/archive/2012/02/13/2786711.html

ICEfaces抄袭PrimeFaces相关推荐

  1. 图书抄袭何时休,技术人的版权在哪里?

    今天,一个很偶然的机会,看到了一本北京邮电大学出版社出版的技术图书<Linux服务器架设.性能调优.集群管理教程--实训与项目案例>,感觉有种似曾相识的感觉,于是打开目录大概了解了下,一个 ...

  2. 关于产品体验以及产品会被抄袭的思考

    一个好产品本来可以以免费让用户注册为开始吸引用户并从而能引导用户进行消费和购买的:但是由于可能考虑到当前这个产品可能会被别人抄袭,从而设定了门槛,然后营销团队进行沟通,和别人说当前的产品是多么多么的好 ...

  3. GitHub 遭抵制!AI 代码生成神器竟成“抄袭工具”?

    整理 | 郑丽媛 出品 | CSDN(ID:CSDNnews) 上周,微软.GitHub.OpenAI 三方联手推出的 AI 代码生成神器 GitHub Copilot 一经官宣便引起巨大关注:试问哪 ...

  4. 南大硕士毕业生举报同组同学抄袭,被举报者回应了

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 来源丨机器之心 编辑丨极市平台 导读 一篇关于剽窃的帖子在知乎发酵开 ...

  5. 100%抄袭!ICLR 2022投稿竟公然剽窃两篇顶会,程序主席放「实锤」严词拒稿

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 来源丨新智元 编辑丨极市平台 导读 ICLR 2022会议投稿出现抄 ...

  6. 北理工硕士被指抄袭投稿论文,校方通报:留校察看

    9月30日,北京理工大学研究生院网站发布<关于对我校研究生张某某处分的情况通报>,根据调查结果,认定2020级硕士研究生张某某"滥用学术成果署名",属于"严重 ...

  7. 北理工硕士生「一字不差」抄袭顶会投稿,网友:买论文被忽悠了?

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 来源丨机器之心 编辑丨极市平台 导读 竟然如此明目张胆,一字不差地抄 ...

  8. 机翻降重?掩饰抄袭?SCI期刊上的这些「奇言怪语」,不少来自中国作者

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 来源丨机器之心 编辑丨极市平台 导读 研究者将研究重点放在了< ...

  9. 这所985大学宣布调查结果:抄袭事实成立!撤销其硕士学位!

    点击上方"视学算法",选择加"星标"置顶 重磅干货,第一时间送达 来源:中国青年报 本文转载自:双一流高校 近日,电子科技大学邮件回复澎湃新闻,宣布了一项调查结 ...

最新文章

  1. python setdefault,Python笔记setdefault用法
  2. halcon模板匹配测试流程
  3. 将Visual Studio Code设置为jshell中的默认编辑器
  4. 大侦探福老师——幽灵Crash谜踪案
  5. PAT (Advanced Level) Practise:1001. A+B Format
  6. 【Golang 接口自动化05】使用yml管理自动化用例
  7. 掌握面试——弹出框的实现
  8. 简析运维监控系统及Open-Falcon
  9. Java基础教程:Lambda表达式
  10. 网络管理与维护作业4
  11. dbeaver 设置编码_DBeaver 一个神奇的数据库操作软件
  12. Struts2之result的配置
  13. 数学建模常用模型、特点以及应用场景
  14. php查拼音,php 输入汉字,查出对应的拼音
  15. django generic view - ListView
  16. 硬盘数据恢复方法有哪些?希望这些方法能帮助你
  17. 膨胀卷积 / 空洞卷积(Dilated convolution)
  18. 一线互联网大厂中高级Android面试真题收录!大厂直通车!
  19. dirname $0
  20. IP段是什么意思?扬州高防服务器103.219.30.X

热门文章

  1. Problem - 6111迷宫出逃
  2. CentOS 7升级gcc 8.3.1 7.x.x 4.9.4版本
  3. Linux信号量之用户态信号量(Posix信号量->无名信号量)
  4. c++primer 5th习题12.25答案
  5. initrd.img相关
  6. 函数指针 指针函数
  7. 概率论-3.3 多维随机变量函数的分布
  8. int类型在计算机中的储存(原码、补码、反码)
  9. Hibernate查询缓存全面分析
  10. MVC技术的面试问题