// BlogBridge -- RSS feed reader, manager, and web based service // Copyright (C) 2002-2006 by R. Pito Salas // // This program is free software; you can redistribute it and/or modify it under // the terms of the GNU General Public License as published by the Free Software Foundation; // either version 2 of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; // without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. // See the GNU General Public License for more details. // // You should have received a copy of the GNU General Public License along with this program; // if not, write to the Free Software Foundation, Inc., 59 Temple Place, // Suite 330, Boston, MA 02111-1307 USA // // Contact: R. Pito Salas // mailto:pitosalas@users.sourceforge.net // More information: about BlogBridge // http://www.blogbridge.com // http://sourceforge.net/projects/blogbridge // // $Id: SmartFeedPlugin.java,v 1.5 2007/04/06 09:32:48 spyromus Exp $ // package com.salas.bb.plugins.domain; import com.salas.bb.domain.FeedType; import com.salas.bb.domain.querytypes.DefaultQueryType; import com.salas.bb.domain.querytypes.QueryType; import com.salas.bb.utils.StringUtils; import com.salas.bb.utils.uif.IconSource; import com.salas.bb.views.feeds.IFeedDisplayConstants; import org.jdom.Element; import javax.swing.*; import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import java.util.Map; /** * SmartFeed plugin. */ public class SmartFeedPlugin extends DefaultQueryType implements IPlugin { private final static Map<String, Integer> MODES = new HashMap<String, Integer>(); private final static Map<String, FeedType> TYPES = new HashMap<String, FeedType>(); private final String iconResource; private final ClassLoader loader; static { MODES.put("full", IFeedDisplayConstants.MODE_FULL); MODES.put("brief", IFeedDisplayConstants.MODE_BRIEF); MODES.put("mini", IFeedDisplayConstants.MODE_MINIMAL); TYPES.put("text", FeedType.TEXT); TYPES.put("link", FeedType.LINK); TYPES.put("image", FeedType.IMAGE); TYPES.put("twitter", FeedType.TWITTER); } /** * Private constructor. * * @param id id type. * @param type type of the feed. * @param name name. * @param icon icon resource. * @param url URL. * @param parameterName parameter name. * @param description description. * @param mode view mode. * @param loader class loader. */ private SmartFeedPlugin(int id, FeedType type, String name, String icon, String url, String parameterName, String description, int mode, ClassLoader loader) { super(id, type, name, null, url, parameterName, description, mode); this.iconResource = icon; this.loader = loader; } /** * Sets the parameters before the initialization. * * @param params parameters. */ public void setParameters(Map<String, String> params) { } /** * Returns the name of plug-in type (Theme, Actions ...). * * @return the name of plug-in type. */ public String getTypeName() { return "Smart Feed"; } @Override public ImageIcon getIcon() { return IconSource.loadIcon(loader.getResource(iconResource)); } /** Initializes plug-in. */ public void initialize() { registerType(this); } /** * Creates the plug-in by parsing the element. * * @param element element. * @param loader loader. * * @return plug-in. * * @throws LoaderException in case anything wrong happens. */ public static IPlugin create(Element element, ClassLoader loader) throws LoaderException { String name = element.getAttributeValue("name"); String type = element.getAttributeValue("type"); String mode = element.getAttributeValue("mode"); String id = element.getAttributeValue("id"); String icon = element.getAttributeValue("icon"); String url = element.getAttributeValue("url"); String descr = element.getAttributeValue("description"); String param = element.getAttributeValue("parameter"); if (StringUtils.isEmpty(name)) throw new LoaderException("Name can't be empty"); if (StringUtils.isEmpty(descr)) throw new LoaderException("Description can't be empty"); if (StringUtils.isEmpty(param)) throw new LoaderException("Parameter can't be empty"); // URL processing if (StringUtils.isEmpty(url)) throw new LoaderException("URL can't be empty"); url = preprocessURL(url); // ID check if (StringUtils.isEmpty(id)) throw new LoaderException("ID can't be empty"); if (!StringUtils.isNumeric(id)) throw new LoaderException("ID must be numeric"); int idI = Integer.parseInt(id); if (idI < QueryType.RESERVED_IDS) throw new LoaderException("ID must be larger than " + QueryType.RESERVED_IDS + " (the last reserved)"); // Type check if (StringUtils.isEmpty(type)) type = "text"; FeedType typeI = TYPES.get(type.trim().toLowerCase()); if (typeI == null) throw new LoaderException("Type can be: text, link, image"); // Mode check if (StringUtils.isEmpty(mode)) mode = "full"; Integer modeI = MODES.get(mode.trim().toLowerCase()); if (modeI == null) throw new LoaderException("Mode can be: mini, brief or full"); // Icon check if (StringUtils.isEmpty(icon)) throw new LoaderException("Icon can't be empty"); InputStream is = loader.getResourceAsStream(icon); if (is == null) throw new LoaderException("Icon file cannot be found"); else { try { is.close(); } catch (IOException e) { // Fall through } } return new SmartFeedPlugin(idI, typeI, name, icon, url, param, descr, modeI, loader); } /** * Preprocesses URL by replacing human-readable tags with those for query engine. * * @param url URL. * * @return finished URL. */ static String preprocessURL(String url) { url = url.replaceAll("\\{(keys|query)\\}", "{0}"); url = url.replaceAll("\\{(max|limit)\\}", "{1}"); return url; } }