diff --git a/fr-plugin-CharCartnoon-1.0/fr-plugin-CharCartnoon-1.0.jar b/fr-plugin-CharCartnoon-1.0/fr-plugin-CharCartnoon-1.0.jar index 35a0677..dff1090 100644 Binary files a/fr-plugin-CharCartnoon-1.0/fr-plugin-CharCartnoon-1.0.jar and b/fr-plugin-CharCartnoon-1.0/fr-plugin-CharCartnoon-1.0.jar differ diff --git a/fr-plugin-CharCartnoon-1.0/plugin.xml b/fr-plugin-CharCartnoon-1.0/plugin.xml index 9b489a7..fd35f71 100644 --- a/fr-plugin-CharCartnoon-1.0/plugin.xml +++ b/fr-plugin-CharCartnoon-1.0/plugin.xml @@ -1,5 +1,5 @@ - com.fr.plugin.char.cartnoon + com.fr.plugin.cool.cartnoon yes 1.0 @@ -10,6 +10,7 @@ ]]> + @@ -20,5 +21,5 @@ - + \ No newline at end of file diff --git a/install/fr-plugin-CharCartnoon-1.0.zip b/install/fr-plugin-CharCartnoon-1.0.zip index bc7dbab..4fff014 100644 Binary files a/install/fr-plugin-CharCartnoon-1.0.zip and b/install/fr-plugin-CharCartnoon-1.0.zip differ diff --git a/install/fr-plugin-CoolChart-1.0.zip b/install/fr-plugin-CoolChart-1.0.zip deleted file mode 100644 index 578e05f..0000000 Binary files a/install/fr-plugin-CoolChart-1.0.zip and /dev/null differ diff --git a/install/install/fr-plugin-cool-chart-1.1.zip b/install/install/fr-plugin-cool-chart-1.1.zip deleted file mode 100644 index ccad8ce..0000000 Binary files a/install/install/fr-plugin-cool-chart-1.1.zip and /dev/null differ diff --git a/plugin.xml b/plugin.xml index 9b489a7..fd35f71 100644 --- a/plugin.xml +++ b/plugin.xml @@ -1,5 +1,5 @@ - com.fr.plugin.char.cartnoon + com.fr.plugin.cool.cartnoon yes 1.0 @@ -10,6 +10,7 @@ ]]> + @@ -20,5 +21,5 @@ - + \ No newline at end of file diff --git a/src/com/fr/plugin/cool/cartnoon/FunConstants.java b/src/com/fr/plugin/cool/cartnoon/CartUtils.java similarity index 78% rename from src/com/fr/plugin/cool/cartnoon/FunConstants.java rename to src/com/fr/plugin/cool/cartnoon/CartUtils.java index 0f96db9..0ab3d89 100644 --- a/src/com/fr/plugin/cool/cartnoon/FunConstants.java +++ b/src/com/fr/plugin/cool/cartnoon/CartUtils.java @@ -4,12 +4,9 @@ import com.fr.base.BaseUtils; import com.fr.general.FArray; import com.fr.general.GeneralUtils; import com.fr.locale.InterProviderFactory; -import com.fr.log.FineLoggerFactory; -import com.fr.plugin.context.PluginContexts; import com.fr.plugin.cool.cartnoon.utils.AnimatedGifEncoder; import com.fr.plugin.cool.cartnoon.web.ImageViewer; import com.fr.script.AbstractFunction; -import com.fr.script.Calculator; import com.fr.stable.ColumnRow; import com.fr.stable.fun.Authorize; import sun.font.FontDesignMetrics; @@ -21,18 +18,13 @@ import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; -import java.net.MalformedURLException; -import java.net.URL; import java.util.regex.Matcher; import java.util.regex.Pattern; -@Authorize(callSignKey = FunConstants.PLUGIN_ID) -public class FunConstants { +@Authorize(callSignKey = CartUtils.PLUGIN_ID) +public class CartUtils { + static final String PLUGIN_ID = "com.fr.plugin.cool.cartnoon"; - static final String AUTHOR_ERROR = InterProviderFactory.getProvider().getLocText("Plugin.Function.CartNoon_AUTHOR_ERROR"); - static boolean Author() { - return PluginContexts.currentContext().isAvailable(); - } static boolean CheckArgs(Object[] args,int num) { return args.length==num; @@ -67,7 +59,7 @@ public class FunConstants { int textHeight=fm.getHeight(); BufferedImage img = new BufferedImage(width, textHeight, BufferedImage.TYPE_4BYTE_ABGR); Graphics2D g2 = img.createGraphics(); - FineLoggerFactory.getLogger().info("textWidth,textHeightY:{},{}",textWidth,textHeight); + AffineTransform affineTransform = new AffineTransform(); Font rotatedFont = font.deriveFont(affineTransform); g2.setFont(rotatedFont); @@ -87,7 +79,7 @@ public class FunConstants { BufferedImage img = new BufferedImage(textWidth, textWidth, BufferedImage.TYPE_4BYTE_ABGR); Graphics2D g2 = img.createGraphics(); - FineLoggerFactory.getLogger().info("textWidth,textHeightY:{},{}",textWidth,textHeight); + AffineTransform affineTransform = new AffineTransform(); Font rotatedFont = font.deriveFont(affineTransform); g2.setFont(rotatedFont); @@ -97,31 +89,7 @@ public class FunConstants { return img; } - final static void CreatePrintAnimate(String id, String text, int fontSize, int rate, Color color, int width) { - - // 读数据 - int len=text.length(); - - AnimatedGifEncoder e = new AnimatedGifEncoder(); - - ByteArrayOutputStream out=new ByteArrayOutputStream(); - e.start(out); - - //图片之间间隔时间 - e.setDelay(rate); // 1 frame per sec - //重复次数 0表示无限重复 默认不重复 - e.setRepeat(0); - //添加图片 - String subStr; - for (int i = 0; i <= len; i++) { - subStr=text.substring(0,i); - e.addFrame(ImageFromText(subStr,fontSize,color,width)); - } - e.finish(); - byte[] data = out.toByteArray(); - ImageViewer.gifData.put(id,data); - } final static void CreateCountUpAnimate(String id, Integer number, int fontSize, int rate, Color color, int width) { // 读数据 @@ -129,7 +97,6 @@ public class FunConstants { int step=number/len; AnimatedGifEncoder e = new AnimatedGifEncoder(); - ByteArrayOutputStream out=new ByteArrayOutputStream(); e.start(out); @@ -149,7 +116,6 @@ public class FunConstants { ImageViewer.gifData.put(id,data); } static String GetCellId(AbstractFunction calculator){ - String[] result={}; final ColumnRow currentColumnRow = calculator.getCalculator().getCurrentColumnRow(); int intRow=currentColumnRow.getRow(); int intCol=currentColumnRow.getColumn(); @@ -159,9 +125,6 @@ public class FunConstants { } static BufferedImage readImage(Object file) { BufferedImage res=null; -// if (file instanceof BufferedImage) { -// return (BufferedImage) file; -// } String filename = file.toString(); if(isHttpUrl(filename)){ res= BaseUtils.readImage(filename); diff --git a/src/com/fr/plugin/cool/cartnoon/FRAnimateArraow.java b/src/com/fr/plugin/cool/cartnoon/FRAnimateArraow.java index 826bd9e..e99647d 100644 --- a/src/com/fr/plugin/cool/cartnoon/FRAnimateArraow.java +++ b/src/com/fr/plugin/cool/cartnoon/FRAnimateArraow.java @@ -2,15 +2,18 @@ package com.fr.plugin.cool.cartnoon; import com.fr.intelli.record.Focus; import com.fr.intelli.record.Original; +import com.fr.locale.InterProviderFactory; +import com.fr.plugin.PluginLicense; +import com.fr.plugin.PluginLicenseManager; +import com.fr.plugin.context.PluginContext; import com.fr.plugin.cool.cartnoon.utils.AnimatedGifEncoder; import com.fr.plugin.cool.cartnoon.utils.DrawValueLine; import com.fr.plugin.cool.cartnoon.web.ImageViewer; +import com.fr.plugin.manage.PluginManager; import com.fr.record.analyzer.EnableMetrics; import com.fr.script.AbstractFunction; -import com.fr.stable.ColumnRow; import com.fr.stable.Primitive; import com.fr.stable.fun.Authorize; -import net.coobird.thumbnailator.Thumbnails; import java.awt.*; import java.awt.image.BufferedImage; @@ -18,24 +21,29 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; @EnableMetrics -@Authorize(callSignKey = FunConstants.PLUGIN_ID) +@Authorize(callSignKey = CartUtils.PLUGIN_ID) public class FRAnimateArraow extends AbstractFunction { @Override - @Focus(id = FunConstants.PLUGIN_ID, text = "Plugin-Function_FRAnimateArraow", source = Original.PLUGIN) + @Focus(id = CartUtils.PLUGIN_ID, text = "Plugin-Function_FRAnimateArraow", source = Original.PLUGIN) public Object run(Object[] args) { - if(!FunConstants.Author()){ - return FunConstants.AUTHOR_ERROR; + PluginLicense pluginLicense = PluginLicenseManager.getInstance().getPluginLicenseByID(CartUtils.PLUGIN_ID); + if (!pluginLicense.isAvailable()) { + return InterProviderFactory.getProvider().getLocText("Plugin.Function.CartNoon_AUTHOR_ERROR"); } - if(!FunConstants.CheckArgs(args,4)){ + PluginContext contexts = PluginManager.getContext(CartUtils.PLUGIN_ID); + if(!contexts.isActive()){ + return "插件已被禁用!"; + } + if(!CartUtils.CheckArgs(args,4)){ return Primitive.ERROR_VALUE; } final int width= Integer.parseInt(args[0].toString()); final int height= Integer.parseInt(args[1].toString()); - final Color color = FunConstants.TextToColor(args[2].toString()); + final Color color = CartUtils.TextToColor(args[2].toString()); final int stroke= Integer.parseInt(args[3].toString()); - final String id=FunConstants.GetCellId(this); + final String id= CartUtils.GetCellId(this); final String url="/webroot/decision/url/img?id="+id; try { diff --git a/src/com/fr/plugin/cool/cartnoon/FRBlurText.java b/src/com/fr/plugin/cool/cartnoon/FRBlurText.java index 2688b83..7018743 100644 --- a/src/com/fr/plugin/cool/cartnoon/FRBlurText.java +++ b/src/com/fr/plugin/cool/cartnoon/FRBlurText.java @@ -2,13 +2,17 @@ package com.fr.plugin.cool.cartnoon; import com.fr.intelli.record.Focus; import com.fr.intelli.record.Original; +import com.fr.locale.InterProviderFactory; +import com.fr.plugin.PluginLicense; +import com.fr.plugin.PluginLicenseManager; +import com.fr.plugin.context.PluginContext; import com.fr.plugin.cool.cartnoon.utils.AnimatedGifEncoder; import com.fr.plugin.cool.cartnoon.web.ImageViewer; +import com.fr.plugin.manage.PluginManager; import com.fr.record.analyzer.EnableMetrics; import com.fr.script.AbstractFunction; import com.fr.stable.Primitive; import com.fr.stable.fun.Authorize; -import com.jhlabs.image.BlockFilter; import com.jhlabs.image.GaussianFilter; import java.awt.*; @@ -17,15 +21,20 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; @EnableMetrics -@Authorize(callSignKey = FunConstants.PLUGIN_ID) +@Authorize(callSignKey = CartUtils.PLUGIN_ID) public class FRBlurText extends AbstractFunction { @Override - @Focus(id = FunConstants.PLUGIN_ID, text = "Plugin-Function_FRBlurText", source = Original.PLUGIN) + @Focus(id = CartUtils.PLUGIN_ID, text = "Plugin-Function_FRBlurText", source = Original.PLUGIN) public Object run(Object[] args) { - if(!FunConstants.Author()){ - return FunConstants.AUTHOR_ERROR; + PluginLicense pluginLicense = PluginLicenseManager.getInstance().getPluginLicenseByID(CartUtils.PLUGIN_ID); + if (!pluginLicense.isAvailable()) { + return InterProviderFactory.getProvider().getLocText("Plugin.Function.CartNoon_AUTHOR_ERROR"); } - if(!FunConstants.CheckArgs(args,6)){ + PluginContext contexts = PluginManager.getContext(CartUtils.PLUGIN_ID); + if(!contexts.isActive()){ + return "插件已被禁用!"; + } + if(!CartUtils.CheckArgs(args,6)){ return Primitive.ERROR_VALUE; } final String text = args[0].toString(); @@ -34,9 +43,9 @@ public class FRBlurText extends AbstractFunction { int height= Integer.parseInt(args[2].toString()); int fontSize= Integer.parseInt(args[3].toString()); int rate= Integer.parseInt(args[4].toString()); - final Color color = FunConstants.TextToColor(args[5].toString()); + final Color color = CartUtils.TextToColor(args[5].toString()); - final String id=FunConstants.GetCellId(this); + final String id= CartUtils.GetCellId(this); final String url="/webroot/decision/url/img?id="+id; try { CreateMasaicText(id,text,fontSize,rate,color); @@ -61,7 +70,7 @@ public class FRBlurText extends AbstractFunction { //重复次数 0表示无限重复 默认不重复 e.setRepeat(0); //添加图片 - final BufferedImage image = FunConstants.ImageFromMultiText(text, fontSize, color); + final BufferedImage image = CartUtils.ImageFromMultiText(text, fontSize, color); for (int o=100; o>0; o--) { e.addFrame(setFilter(image,o)); } diff --git a/src/com/fr/plugin/cool/cartnoon/FRCartnoonFunctions.java b/src/com/fr/plugin/cool/cartnoon/FRCartnoonFunctions.java index c8ece54..f3ee2f9 100644 --- a/src/com/fr/plugin/cool/cartnoon/FRCartnoonFunctions.java +++ b/src/com/fr/plugin/cool/cartnoon/FRCartnoonFunctions.java @@ -6,10 +6,10 @@ import com.fr.stable.fun.Authorize; import com.fr.stable.fun.impl.AbstractFunctionDefContainer; import com.fr.stable.script.FunctionDef; @EnableMetrics -@Authorize(callSignKey = FunConstants.PLUGIN_ID) +@Authorize(callSignKey = CartUtils.PLUGIN_ID) public class FRCartnoonFunctions extends AbstractFunctionDefContainer { @Override - @Focus(id=FunConstants.PLUGIN_ID, text="字符动画函数") + @Focus(id= CartUtils.PLUGIN_ID, text="字符动画函数") public FunctionDef[] getFunctionDefs() { return new FunctionDef[]{ new FunctionDef("FRPrintText", "生成打字机动画效果。\n参数说明:\n参数1:字符型,打字的文本。\n参数2:整型,显示宽度。\n参数3:整型,显示高度。\n参数4:整型,文本字号。\n参数5:整型,动画刷新频率(毫秒)。\n示例:FRPrintText(\"123456790\",500,100,20,100,\"ffff00\")", FRPrintText.class.getName()), @@ -18,7 +18,7 @@ public class FRCartnoonFunctions extends AbstractFunctionDefContainer { new FunctionDef("FRRotateText", "生成旋转文本动画效果。\n参数说明:\n参数1:字符型,要旋转的文本。\n参数2:整型,文本宽度。\n参数3:整型,文本高度。\n参数4:整型,文本字号。\n参数5:整型,动画刷新频率(毫秒)。\n示例:FRRotateText(\"你好,世界\",180,180,25,300,\"ff0000\")", FRRotateText.class.getName()), new FunctionDef("FRAnimateArraow", "生成箭头动画效果。\n参数说明:\n参数1:整型,页面占用宽度。\n参数2:整型,页面占用高度。\n参数3:文本,箭头颜色,如FF0000。\n参数4:整型,箭头粗细。\n示例:FRAnimateArraow(300,200,\"ff0000\",10)", FRAnimateArraow.class.getName()), new FunctionDef("FRCountUp", "生成数字计数动画效果。\n参数说明:\n参数1:整型,要计数的数字。\n参数2:整型,显示宽度。\n参数3:整型,显示高度。\n参数4:整型,文本字号。\n参数5:整型,动画刷新频率(毫秒)。\n示例:FRCountUp(\"123456790\",500,100,20,100,\"ffff00\")", FRCountUp.class.getName()), - new FunctionDef("FRClockTime", "生成时钟动画效果。\n参数说明:\n参数1:文本,时间,用HH:MM表示。\n参数2:整型,显示宽度。\n参数3:整型,显示高度。\n参数4:整型,动画刷新频率(毫秒)。\n示例:FRClockTime(\"123456790\",500,100,20,100,\"ffff00\")", FRClockTime.class.getName()), + new FunctionDef("FRClockTime", "生成时钟动画效果。\n参数说明:\n参数1:文本,时间,用HH:MM表示。\n参数2:整型,显示宽度。\n参数3:整型,显示高度。\n参数4:整型,动画刷新频率(毫秒)。\n示例:FRClockTime(\"6:30\",100,100,20)", FRClockTime.class.getName()), new FunctionDef("FRMasaicText", "生成马塞克动画效果。\n参数说明:\n参数1:显示的文本。\n参数2:整型,显示宽度。\n参数3:整型,显示高度。\n参数4:整型,动画刷新频率(毫秒)。\n示例:FRMasaicText(\"你好,世界\", 180, 180, 25, 100, \"ff0000\")", FRMasaicText.class.getName()), new FunctionDef("FRBlurText", "生成高斯模糊动画效果。\n参数说明:\n参数1:显示的文本。\n参数2:整型,显示宽度。\n参数3:整型,显示高度。\n参数4:整型,动画刷新频率(毫秒)。\n示例:FRBlurText(\"你好,世界\", 180, 180, 25, 60, \"ff0000\")", FRBlurText.class.getName()), new FunctionDef("FRCustomAnimation", "生成自定义动画效果。\n参数说明:\n参数1:文本数组,动画图片文件名或网址。\n参数2:整型,动画刷新频率(毫秒)。\n参数3:整型,显示宽度。\n参数4:整型,显示高度。\n示例:FRCustomAnimation([\"http://www.jhlabs.com/ip/filters/ChannelMixFilter.jpg\",\"http://www.jhlabs.com/ip/filters/DiffuseFilter.jpg\"], 100, 300, 300)", FRCustomAnimation.class.getName()), @@ -28,9 +28,6 @@ public class FRCartnoonFunctions extends AbstractFunctionDefContainer { @Override public String getGroupName() { - if (!FunConstants.Author()) { - return FunConstants.AUTHOR_ERROR; - } return "字符动画函数"; } } diff --git a/src/com/fr/plugin/cool/cartnoon/FRClockTime.java b/src/com/fr/plugin/cool/cartnoon/FRClockTime.java index 2435d23..ca19f46 100644 --- a/src/com/fr/plugin/cool/cartnoon/FRClockTime.java +++ b/src/com/fr/plugin/cool/cartnoon/FRClockTime.java @@ -3,8 +3,13 @@ package com.fr.plugin.cool.cartnoon; import com.fr.base.BaseUtils; import com.fr.intelli.record.Focus; import com.fr.intelli.record.Original; +import com.fr.locale.InterProviderFactory; +import com.fr.plugin.PluginLicense; +import com.fr.plugin.PluginLicenseManager; +import com.fr.plugin.context.PluginContext; import com.fr.plugin.cool.cartnoon.utils.AnimatedGifEncoder; import com.fr.plugin.cool.cartnoon.web.ImageViewer; +import com.fr.plugin.manage.PluginManager; import com.fr.record.analyzer.EnableMetrics; import com.fr.script.AbstractFunction; import com.fr.stable.Primitive; @@ -17,15 +22,20 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; @EnableMetrics -@Authorize(callSignKey = FunConstants.PLUGIN_ID) +@Authorize(callSignKey = CartUtils.PLUGIN_ID) public class FRClockTime extends AbstractFunction { @Override - @Focus(id = FunConstants.PLUGIN_ID, text = "Plugin-Function_FRClockTime", source = Original.PLUGIN) + @Focus(id = CartUtils.PLUGIN_ID, text = "Plugin-Function_FRClockTime", source = Original.PLUGIN) public Object run(Object[] args) { - if(!FunConstants.Author()){ - return FunConstants.AUTHOR_ERROR; + PluginLicense pluginLicense = PluginLicenseManager.getInstance().getPluginLicenseByID(CartUtils.PLUGIN_ID); + if (!pluginLicense.isAvailable()) { + return InterProviderFactory.getProvider().getLocText("Plugin.Function.CartNoon_AUTHOR_ERROR"); } - if(!FunConstants.CheckArgs(args,4)){ + PluginContext contexts = PluginManager.getContext(CartUtils.PLUGIN_ID); + if(!contexts.isActive()){ + return "插件已被禁用!"; + } + if(!CartUtils.CheckArgs(args,4)){ return Primitive.ERROR_VALUE; } final String time = args[0].toString(); @@ -41,7 +51,7 @@ public class FRClockTime extends AbstractFunction { int height= Integer.parseInt(args[2].toString()); int rate= Integer.parseInt(args[3].toString()); - final String id=FunConstants.GetCellId(this); + final String id= CartUtils.GetCellId(this); final String url="/webroot/decision/url/img?id="+id; try { CreateClockTime(id,htime,mtime,width,rate); diff --git a/src/com/fr/plugin/cool/cartnoon/FRCountUp.java b/src/com/fr/plugin/cool/cartnoon/FRCountUp.java index 8bdd729..05d1aeb 100644 --- a/src/com/fr/plugin/cool/cartnoon/FRCountUp.java +++ b/src/com/fr/plugin/cool/cartnoon/FRCountUp.java @@ -2,6 +2,11 @@ package com.fr.plugin.cool.cartnoon; import com.fr.intelli.record.Focus; import com.fr.intelli.record.Original; +import com.fr.locale.InterProviderFactory; +import com.fr.plugin.PluginLicense; +import com.fr.plugin.PluginLicenseManager; +import com.fr.plugin.context.PluginContext; +import com.fr.plugin.manage.PluginManager; import com.fr.record.analyzer.EnableMetrics; import com.fr.script.AbstractFunction; import com.fr.stable.Primitive; @@ -10,15 +15,20 @@ import com.fr.stable.fun.Authorize; import java.awt.*; @EnableMetrics -@Authorize(callSignKey = FunConstants.PLUGIN_ID) +@Authorize(callSignKey = CartUtils.PLUGIN_ID) public class FRCountUp extends AbstractFunction { @Override - @Focus(id = FunConstants.PLUGIN_ID, text = "Plugin-Function_FRCountUp", source = Original.PLUGIN) + @Focus(id = CartUtils.PLUGIN_ID, text = "Plugin-Function_FRCountUp", source = Original.PLUGIN) public Object run(Object[] args) { - if(!FunConstants.Author()){ - return FunConstants.AUTHOR_ERROR; + PluginLicense pluginLicense = PluginLicenseManager.getInstance().getPluginLicenseByID(CartUtils.PLUGIN_ID); + if (!pluginLicense.isAvailable()) { + return InterProviderFactory.getProvider().getLocText("Plugin.Function.CartNoon_AUTHOR_ERROR"); } - if(!FunConstants.CheckArgs(args,6)){ + PluginContext contexts = PluginManager.getContext(CartUtils.PLUGIN_ID); + if(!contexts.isActive()){ + return "插件已被禁用!"; + } + if(!CartUtils.CheckArgs(args,6)){ return Primitive.ERROR_VALUE; } final Integer number = Integer.parseInt(args[0].toString()); @@ -27,12 +37,12 @@ public class FRCountUp extends AbstractFunction { int height= Integer.parseInt(args[2].toString()); int fontSize= Integer.parseInt(args[3].toString()); int rate= Integer.parseInt(args[4].toString()); - final Color color = FunConstants.TextToColor(args[5].toString()); + final Color color = CartUtils.TextToColor(args[5].toString()); - final String id=FunConstants.GetCellId(this); + final String id= CartUtils.GetCellId(this); final String url="/webroot/decision/url/img?id="+id; - FunConstants.CreateCountUpAnimate(id,number,fontSize,rate,color,width); + CartUtils.CreateCountUpAnimate(id,number,fontSize,rate,color,width); return ""; } diff --git a/src/com/fr/plugin/cool/cartnoon/FRCustomAnimation.java b/src/com/fr/plugin/cool/cartnoon/FRCustomAnimation.java index 8185f7f..aef9ad6 100644 --- a/src/com/fr/plugin/cool/cartnoon/FRCustomAnimation.java +++ b/src/com/fr/plugin/cool/cartnoon/FRCustomAnimation.java @@ -2,38 +2,47 @@ package com.fr.plugin.cool.cartnoon; import com.fr.intelli.record.Focus; import com.fr.intelli.record.Original; +import com.fr.locale.InterProviderFactory; +import com.fr.plugin.PluginLicense; +import com.fr.plugin.PluginLicenseManager; +import com.fr.plugin.context.PluginContext; import com.fr.plugin.cool.cartnoon.utils.AnimatedGifEncoder; import com.fr.plugin.cool.cartnoon.web.ImageViewer; +import com.fr.plugin.manage.PluginManager; import com.fr.record.analyzer.EnableMetrics; import com.fr.script.AbstractFunction; import com.fr.stable.Primitive; import com.fr.stable.fun.Authorize; -import com.jhlabs.image.GaussianFilter; import net.coobird.thumbnailator.Thumbnails; -import java.awt.*; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.IOException; @EnableMetrics -@Authorize(callSignKey = FunConstants.PLUGIN_ID) +@Authorize(callSignKey = CartUtils.PLUGIN_ID) public class FRCustomAnimation extends AbstractFunction { @Override - @Focus(id = FunConstants.PLUGIN_ID, text = "Plugin-Function_FRCustomAnimation", source = Original.PLUGIN) + @Focus(id = CartUtils.PLUGIN_ID, text = "Plugin-Function_FRCustomAnimation", source = Original.PLUGIN) public Object run(Object[] args) { - if(!FunConstants.Author()){ - return FunConstants.AUTHOR_ERROR; + PluginLicense pluginLicense = PluginLicenseManager.getInstance().getPluginLicenseByID(CartUtils.PLUGIN_ID); + if (!pluginLicense.isAvailable()) { + return InterProviderFactory.getProvider().getLocText("Plugin.Function.CartNoon_AUTHOR_ERROR"); } - if(!FunConstants.CheckArgs(args,4)){ + + PluginContext contexts = PluginManager.getContext(CartUtils.PLUGIN_ID); + if(!contexts.isActive()){ + return "插件已被禁用!"; + } + if(!CartUtils.CheckArgs(args,4)){ return Primitive.ERROR_VALUE; } - String[] arrSrcImg=FunConstants.GetSrcImgFromArgs(args[0]); + String[] arrSrcImg= CartUtils.GetSrcImgFromArgs(args[0]); int rate= Integer.parseInt(args[1].toString()); int width= Integer.parseInt(args[2].toString()); int height= Integer.parseInt(args[3].toString()); - final String id=FunConstants.GetCellId(this); + final String id= CartUtils.GetCellId(this); final String url="/webroot/decision/url/img?id="+id; try { Create(id,arrSrcImg,rate,width,height); @@ -60,7 +69,7 @@ public class FRCustomAnimation extends AbstractFunction { //添加图片 int imgLen=srcImage.length; for (int i = 0; i < imgLen; i++) { - e.addFrame(setSize(FunConstants.readImage(srcImage[i]),width,height)); + e.addFrame(setSize(CartUtils.readImage(srcImage[i]),width,height)); } e.finish(); diff --git a/src/com/fr/plugin/cool/cartnoon/FRDissolveText.java b/src/com/fr/plugin/cool/cartnoon/FRDissolveText.java index e3dd96d..061845c 100644 --- a/src/com/fr/plugin/cool/cartnoon/FRDissolveText.java +++ b/src/com/fr/plugin/cool/cartnoon/FRDissolveText.java @@ -2,11 +2,15 @@ package com.fr.plugin.cool.cartnoon; import com.fr.intelli.record.Focus; import com.fr.intelli.record.Original; +import com.fr.locale.InterProviderFactory; +import com.fr.plugin.PluginLicense; +import com.fr.plugin.PluginLicenseManager; +import com.fr.plugin.context.PluginContext; import com.fr.plugin.cool.cartnoon.utils.AnimatedGifEncoder; import com.fr.plugin.cool.cartnoon.web.ImageViewer; +import com.fr.plugin.manage.PluginManager; import com.fr.record.analyzer.EnableMetrics; import com.fr.script.AbstractFunction; -import com.fr.stable.ColumnRow; import com.fr.stable.Primitive; import com.fr.stable.fun.Authorize; import com.jhlabs.image.DissolveFilter; @@ -16,15 +20,20 @@ import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; @EnableMetrics -@Authorize(callSignKey = FunConstants.PLUGIN_ID) +@Authorize(callSignKey = CartUtils.PLUGIN_ID) public class FRDissolveText extends AbstractFunction { @Override - @Focus(id = FunConstants.PLUGIN_ID, text = "Plugin-Function_FRDissolveText", source = Original.PLUGIN) + @Focus(id = CartUtils.PLUGIN_ID, text = "Plugin-Function_FRDissolveText", source = Original.PLUGIN) public Object run(Object[] args) { - if(!FunConstants.Author()){ - return FunConstants.AUTHOR_ERROR; + PluginLicense pluginLicense = PluginLicenseManager.getInstance().getPluginLicenseByID(CartUtils.PLUGIN_ID); + if (!pluginLicense.isAvailable()) { + return InterProviderFactory.getProvider().getLocText("Plugin.Function.CartNoon_AUTHOR_ERROR"); } - if(!FunConstants.CheckArgs(args,6)){ + PluginContext contexts = PluginManager.getContext(CartUtils.PLUGIN_ID); + if(!contexts.isActive()){ + return "插件已被禁用!"; + } + if(!CartUtils.CheckArgs(args,6)){ return Primitive.ERROR_VALUE; } final String text = args[0].toString(); @@ -33,9 +42,9 @@ public class FRDissolveText extends AbstractFunction { int height= Integer.parseInt(args[2].toString()); int fontSize= Integer.parseInt(args[3].toString()); int rate= Integer.parseInt(args[4].toString()); - final Color color = FunConstants.TextToColor(args[5].toString()); + final Color color = CartUtils.TextToColor(args[5].toString()); - final String id=FunConstants.GetCellId(this); + final String id= CartUtils.GetCellId(this); final String url="/webroot/decision/url/img?id="+id; CreateDissoveText(id,text,fontSize,rate,color,width); @@ -55,7 +64,7 @@ public class FRDissolveText extends AbstractFunction { //重复次数 0表示无限重复 默认不重复 e.setRepeat(0); //添加图片 - final BufferedImage image = FunConstants.ImageFromText(text, fontSize, color, width); + final BufferedImage image = CartUtils.ImageFromText(text, fontSize, color, width); for (float i = 0; i <= 9; i++) { float v=i/10; e.addFrame(setFilter(image,v,v)); diff --git a/src/com/fr/plugin/cool/cartnoon/FRMasaicText.java b/src/com/fr/plugin/cool/cartnoon/FRMasaicText.java index 627affc..8973a43 100644 --- a/src/com/fr/plugin/cool/cartnoon/FRMasaicText.java +++ b/src/com/fr/plugin/cool/cartnoon/FRMasaicText.java @@ -2,8 +2,13 @@ package com.fr.plugin.cool.cartnoon; import com.fr.intelli.record.Focus; import com.fr.intelli.record.Original; +import com.fr.locale.InterProviderFactory; +import com.fr.plugin.PluginLicense; +import com.fr.plugin.PluginLicenseManager; +import com.fr.plugin.context.PluginContext; import com.fr.plugin.cool.cartnoon.utils.AnimatedGifEncoder; import com.fr.plugin.cool.cartnoon.web.ImageViewer; +import com.fr.plugin.manage.PluginManager; import com.fr.record.analyzer.EnableMetrics; import com.fr.script.AbstractFunction; import com.fr.stable.Primitive; @@ -16,15 +21,21 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; @EnableMetrics -@Authorize(callSignKey = FunConstants.PLUGIN_ID) +@Authorize(callSignKey = CartUtils.PLUGIN_ID) public class FRMasaicText extends AbstractFunction { @Override - @Focus(id = FunConstants.PLUGIN_ID, text = "Plugin-Function_FRMasaicText", source = Original.PLUGIN) + @Focus(id = CartUtils.PLUGIN_ID, text = "Plugin-Function_FRMasaicText", source = Original.PLUGIN) public Object run(Object[] args) { - if(!FunConstants.Author()){ - return FunConstants.AUTHOR_ERROR; + PluginLicense pluginLicense = PluginLicenseManager.getInstance().getPluginLicenseByID(CartUtils.PLUGIN_ID); + if (!pluginLicense.isAvailable()) { + return InterProviderFactory.getProvider().getLocText("Plugin.Function.CartNoon_AUTHOR_ERROR"); } - if(!FunConstants.CheckArgs(args,6)){ + + PluginContext contexts = PluginManager.getContext(CartUtils.PLUGIN_ID); + if(!contexts.isActive()){ + return "插件已被禁用!"; + } + if(!CartUtils.CheckArgs(args,6)){ return Primitive.ERROR_VALUE; } final String text = args[0].toString(); @@ -33,9 +44,9 @@ public class FRMasaicText extends AbstractFunction { int height= Integer.parseInt(args[2].toString()); int fontSize= Integer.parseInt(args[3].toString()); int rate= Integer.parseInt(args[4].toString()); - final Color color = FunConstants.TextToColor(args[5].toString()); + final Color color = CartUtils.TextToColor(args[5].toString()); - final String id=FunConstants.GetCellId(this); + final String id= CartUtils.GetCellId(this); final String url="/webroot/decision/url/img?id="+id; try { CreateMasaicText(id,text,fontSize,rate,color); @@ -60,7 +71,7 @@ public class FRMasaicText extends AbstractFunction { //重复次数 0表示无限重复 默认不重复 e.setRepeat(0); //添加图片 - final BufferedImage image = FunConstants.ImageFromMultiText(text, fontSize, color); + final BufferedImage image = CartUtils.ImageFromMultiText(text, fontSize, color); for (int o=36; o>0; o--) { e.addFrame(setFilter(image,o)); } diff --git a/src/com/fr/plugin/cool/cartnoon/FRPrintText.java b/src/com/fr/plugin/cool/cartnoon/FRPrintText.java index 6b9540f..dc5ffa6 100644 --- a/src/com/fr/plugin/cool/cartnoon/FRPrintText.java +++ b/src/com/fr/plugin/cool/cartnoon/FRPrintText.java @@ -2,23 +2,39 @@ package com.fr.plugin.cool.cartnoon; import com.fr.intelli.record.Focus; import com.fr.intelli.record.Original; +import com.fr.locale.InterProviderFactory; +import com.fr.log.FineLoggerFactory; +import com.fr.plugin.PluginLicense; +import com.fr.plugin.PluginLicenseManager; +import com.fr.plugin.context.PluginContext; +import com.fr.plugin.cool.cartnoon.utils.AnimatedGifEncoder; +import com.fr.plugin.cool.cartnoon.web.ImageViewer; +import com.fr.plugin.manage.PluginManager; import com.fr.record.analyzer.EnableMetrics; import com.fr.script.AbstractFunction; import com.fr.stable.Primitive; import com.fr.stable.fun.Authorize; import java.awt.*; +import java.io.ByteArrayOutputStream; @EnableMetrics -@Authorize(callSignKey = com.fr.plugin.cool.cartnoon.FunConstants.PLUGIN_ID) +@Authorize(callSignKey = CartUtils.PLUGIN_ID) public class FRPrintText extends AbstractFunction { @Override - @Focus(id = com.fr.plugin.cool.cartnoon.FunConstants.PLUGIN_ID, text = "Plugin-Function_FRPrintText", source = Original.PLUGIN) + @Focus(id = CartUtils.PLUGIN_ID, text = "Plugin-Function_FRPrintText", source = Original.PLUGIN) public Object run(Object[] args) { - if(!FunConstants.Author()){ - return FunConstants.AUTHOR_ERROR; + PluginLicense pluginLicense = PluginLicenseManager.getInstance().getPluginLicenseByID(CartUtils.PLUGIN_ID); + if (!pluginLicense.isAvailable()) { + return InterProviderFactory.getProvider().getLocText("Plugin.Function.CartNoon_AUTHOR_ERROR"); } - if(!FunConstants.CheckArgs(args,6)){ + + PluginContext contexts = PluginManager.getContext(CartUtils.PLUGIN_ID); + if(!contexts.isActive()){ + return "插件已被禁用!"; + } + + if(!CartUtils.CheckArgs(args,6)){ return Primitive.ERROR_VALUE; } final String text = args[0].toString(); @@ -27,16 +43,42 @@ public class FRPrintText extends AbstractFunction { int height= Integer.parseInt(args[2].toString()); int fontSize= Integer.parseInt(args[3].toString()); int rate= Integer.parseInt(args[4].toString()); - final Color color = FunConstants.TextToColor(args[5].toString()); + final Color color = CartUtils.TextToColor(args[5].toString()); - final String id=FunConstants.GetCellId(this); + final String id= CartUtils.GetCellId(this); final String url="/webroot/decision/url/img?id="+id; - FunConstants.CreatePrintAnimate(id,text,fontSize,rate,color,width); + CreatePrintAnimate(id,text,fontSize,rate,color,width); return ""; } + final void CreatePrintAnimate(String id, String text, int fontSize, int rate, Color color, int width) { + + // 读数据 + int len=text.length(); + + AnimatedGifEncoder e = new AnimatedGifEncoder(); + + ByteArrayOutputStream out=new ByteArrayOutputStream(); + e.start(out); + //图片之间间隔时间 + e.setDelay(rate); // 1 frame per sec + //重复次数 0表示无限重复 默认不重复 + e.setRepeat(0); + //添加图片 + String subStr; + for (int i = 0; i <= len; i++) { + subStr=text.substring(0,i); + e.addFrame(CartUtils.ImageFromText(subStr,fontSize,color,width)); + } + e.finish(); + + byte[] data = out.toByteArray(); + + ImageViewer.gifData.put(id,data); + + } } \ No newline at end of file diff --git a/src/com/fr/plugin/cool/cartnoon/FRRollText.java b/src/com/fr/plugin/cool/cartnoon/FRRollText.java index c6f2619..2483917 100644 --- a/src/com/fr/plugin/cool/cartnoon/FRRollText.java +++ b/src/com/fr/plugin/cool/cartnoon/FRRollText.java @@ -2,21 +2,31 @@ package com.fr.plugin.cool.cartnoon; import com.fr.intelli.record.Focus; import com.fr.intelli.record.Original; +import com.fr.locale.InterProviderFactory; +import com.fr.plugin.PluginLicense; +import com.fr.plugin.PluginLicenseManager; +import com.fr.plugin.context.PluginContext; +import com.fr.plugin.manage.PluginManager; import com.fr.record.analyzer.EnableMetrics; import com.fr.script.AbstractFunction; import com.fr.stable.Primitive; import com.fr.stable.fun.Authorize; @EnableMetrics -@Authorize(callSignKey = FunConstants.PLUGIN_ID) +@Authorize(callSignKey = CartUtils.PLUGIN_ID) public class FRRollText extends AbstractFunction { @Override - @Focus(id = FunConstants.PLUGIN_ID, text = "Plugin-Function_FRRollText", source = Original.PLUGIN) + @Focus(id = CartUtils.PLUGIN_ID, text = "Plugin-Function_FRRollText", source = Original.PLUGIN) public Object run(Object[] args) { - if(!FunConstants.Author()){ - return FunConstants.AUTHOR_ERROR; + PluginLicense pluginLicense = PluginLicenseManager.getInstance().getPluginLicenseByID(CartUtils.PLUGIN_ID); + if (!pluginLicense.isAvailable()) { + return InterProviderFactory.getProvider().getLocText("Plugin.Function.CartNoon_AUTHOR_ERROR"); } - if(!FunConstants.CheckArgs(args,3)){ + PluginContext contexts = PluginManager.getContext(CartUtils.PLUGIN_ID); + if(!contexts.isActive()){ + return "插件已被禁用!"; + } + if(!CartUtils.CheckArgs(args,3)){ return Primitive.ERROR_VALUE; } final String text = args[0].toString(); diff --git a/src/com/fr/plugin/cool/cartnoon/FRRotateText.java b/src/com/fr/plugin/cool/cartnoon/FRRotateText.java index 748d2c7..ee33903 100644 --- a/src/com/fr/plugin/cool/cartnoon/FRRotateText.java +++ b/src/com/fr/plugin/cool/cartnoon/FRRotateText.java @@ -2,8 +2,13 @@ package com.fr.plugin.cool.cartnoon; import com.fr.intelli.record.Focus; import com.fr.intelli.record.Original; +import com.fr.locale.InterProviderFactory; +import com.fr.plugin.PluginLicense; +import com.fr.plugin.PluginLicenseManager; +import com.fr.plugin.context.PluginContext; import com.fr.plugin.cool.cartnoon.utils.AnimatedGifEncoder; import com.fr.plugin.cool.cartnoon.web.ImageViewer; +import com.fr.plugin.manage.PluginManager; import com.fr.record.analyzer.EnableMetrics; import com.fr.script.AbstractFunction; import com.fr.stable.Primitive; @@ -16,15 +21,21 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; @EnableMetrics -@Authorize(callSignKey = FunConstants.PLUGIN_ID) +@Authorize(callSignKey = CartUtils.PLUGIN_ID) public class FRRotateText extends AbstractFunction { @Override - @Focus(id = FunConstants.PLUGIN_ID, text = "Plugin-Function_FRRotateText", source = Original.PLUGIN) + @Focus(id = CartUtils.PLUGIN_ID, text = "Plugin-Function_FRRotateText", source = Original.PLUGIN) public Object run(Object[] args) { - if(!FunConstants.Author()){ - return FunConstants.AUTHOR_ERROR; + PluginLicense pluginLicense = PluginLicenseManager.getInstance().getPluginLicenseByID(CartUtils.PLUGIN_ID); + if (!pluginLicense.isAvailable()) { + return InterProviderFactory.getProvider().getLocText("Plugin.Function.CartNoon_AUTHOR_ERROR"); } - if(!FunConstants.CheckArgs(args,6)){ + + PluginContext contexts = PluginManager.getContext(CartUtils.PLUGIN_ID); + if(!contexts.isActive()){ + return "插件已被禁用!"; + } + if(!CartUtils.CheckArgs(args,6)){ return Primitive.ERROR_VALUE; } final String text = args[0].toString(); @@ -33,9 +44,9 @@ public class FRRotateText extends AbstractFunction { int height= Integer.parseInt(args[2].toString()); int fontSize= Integer.parseInt(args[3].toString()); int rate= Integer.parseInt(args[4].toString()); - final Color color = FunConstants.TextToColor(args[5].toString()); + final Color color = CartUtils.TextToColor(args[5].toString()); - final String id=FunConstants.GetCellId(this); + final String id= CartUtils.GetCellId(this); final String url="/webroot/decision/url/img?id="+id; try { CreateText(id,text,fontSize,rate,color); @@ -60,7 +71,7 @@ public class FRRotateText extends AbstractFunction { //重复次数 0表示无限重复 默认不重复 e.setRepeat(0); //添加图片 - final BufferedImage image = FunConstants.ImageFromMultiText(text, fontSize, color); + final BufferedImage image = CartUtils.ImageFromMultiText(text, fontSize, color); for (float i = 1; i <= 10; i++) { float rotate=i*36; e.addFrame(setFilter(image,1,rotate)); diff --git a/src/com/fr/plugin/cool/cartnoon/FunLocaleFinder.java b/src/com/fr/plugin/cool/cartnoon/FunLocaleFinder.java index 6533c7d..f4436da 100644 --- a/src/com/fr/plugin/cool/cartnoon/FunLocaleFinder.java +++ b/src/com/fr/plugin/cool/cartnoon/FunLocaleFinder.java @@ -10,8 +10,8 @@ import com.fr.stable.fun.impl.AbstractLocaleFinder; @EnableMetrics public class FunLocaleFinder extends AbstractLocaleFinder { @Override - @Focus(id = FunConstants.PLUGIN_ID, text = "Plugin-Test_Function_FRExchangeRate", source = Original.PLUGIN) + @Focus(id = CartUtils.PLUGIN_ID, text = "Plugin-Test_Function_coolCartNoon", source = Original.PLUGIN) public String find() { - return "com/fr/plugin/market/update/local/marketUpdate"; + return "com/fr/plugin/cool/cartnoon/local/coolCartNoon"; } } diff --git a/src/com/fr/plugin/cool/cartnoon/local/coolCartNoon.properties b/src/com/fr/plugin/cool/cartnoon/local/coolCartNoon.properties new file mode 100644 index 0000000..57b2c9d --- /dev/null +++ b/src/com/fr/plugin/cool/cartnoon/local/coolCartNoon.properties @@ -0,0 +1,3 @@ +Plugin.Function.CartNoon_AUTHOR_ERROR=Error:authorization is expired +Plugin.Function.CartNoon_Disable=plugin disable + diff --git a/src/com/fr/plugin/cool/cartnoon/local/coolCartNoon_zh_CN.properties b/src/com/fr/plugin/cool/cartnoon/local/coolCartNoon_zh_CN.properties new file mode 100644 index 0000000..97ca304 --- /dev/null +++ b/src/com/fr/plugin/cool/cartnoon/local/coolCartNoon_zh_CN.properties @@ -0,0 +1,2 @@ +Plugin.Function.CartNoon_AUTHOR_ERROR=\u63d2\u4ef6\u5df2\u8fc7\u671f +Plugin.Function.CartNoon_Disable=\u63d2\u4ef6\u5df2\u88ab\u7981\u7528 \ No newline at end of file diff --git a/src/com/fr/plugin/cool/cartnoon/local/dataEncrypt.properties b/src/com/fr/plugin/cool/cartnoon/local/dataEncrypt.properties deleted file mode 100644 index 1ddfe90..0000000 --- a/src/com/fr/plugin/cool/cartnoon/local/dataEncrypt.properties +++ /dev/null @@ -1,3 +0,0 @@ -Fine-Design_Data_Encrypt_AUTHOR_ERROR=Error:authorization is expired -Fine-Design_Data_Encrypt_CHECK_PASS=checkPass -Fine-Design_Data_Encrypt_ArgsCountError=Args Count Error! diff --git a/src/com/fr/plugin/cool/cartnoon/local/dataEncrypt_zh_CN.properties b/src/com/fr/plugin/cool/cartnoon/local/dataEncrypt_zh_CN.properties deleted file mode 100644 index e69de29..0000000 diff --git a/src/com/fr/plugin/cool/cartnoon/resources/menuIcon.png b/src/com/fr/plugin/cool/cartnoon/resources/menuIcon.png deleted file mode 100644 index 651aaba..0000000 Binary files a/src/com/fr/plugin/cool/cartnoon/resources/menuIcon.png and /dev/null differ diff --git a/src/com/fr/plugin/cool/cartnoon/web/CSSLoader.java b/src/com/fr/plugin/cool/cartnoon/web/CSSLoader.java index c1f39cf..e9ffc96 100644 --- a/src/com/fr/plugin/cool/cartnoon/web/CSSLoader.java +++ b/src/com/fr/plugin/cool/cartnoon/web/CSSLoader.java @@ -11,7 +11,7 @@ import com.fr.web.struct.category.StylePath; public class CSSLoader extends AbstractWebResourceProvider { - @Focus(id = "com.fr.plugin.char.cartnoon",text = "字符动画函数") + @Focus(id = "com.fr.plugin.cool.cartnoon",text = "字符动画函数") public Atom[] clients() { return new Atom[]{ new Component() { diff --git a/src/com/fr/plugin/cool/cartnoon/web/ImageViewer.java b/src/com/fr/plugin/cool/cartnoon/web/ImageViewer.java index d2e201a..6de1e6c 100644 --- a/src/com/fr/plugin/cool/cartnoon/web/ImageViewer.java +++ b/src/com/fr/plugin/cool/cartnoon/web/ImageViewer.java @@ -1,14 +1,11 @@ package com.fr.plugin.cool.cartnoon.web; import com.fr.decision.fun.impl.BaseHttpHandler; -import com.fr.intelli.record.Focus; -import com.fr.intelli.record.Original; -import com.fr.log.FineLoggerFactory; import com.fr.third.springframework.web.bind.annotation.RequestMethod; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import java.io.*; +import java.io.OutputStream; import java.util.HashMap; public class ImageViewer extends BaseHttpHandler { @@ -29,18 +26,15 @@ public class ImageViewer extends BaseHttpHandler { } @Override - @Focus(id = "com.fr.plugin.cool.chart.web", text = "", source = Original.PLUGIN) public void handle(HttpServletRequest request, HttpServletResponse response) throws Exception { - final String JPG = "image/jpeg;charset=GB2312"; String id = request.getParameter("id"); response.setHeader("Content-Type", "image/gif"); OutputStream output = response.getOutputStream(); - FineLoggerFactory.getLogger().info("id:{}",id); - // 回写 response.setContentType("image/gif"); + output.write(gifData.get(id)); output.flush(); output.close();