⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pluginloader.java

📁 A static analysis tool to find bugs in Java programs
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
				Element details = (Element) node;				String detailHTML = details.getText();				StringBuffer buf = new StringBuffer();				buf.append("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n");				buf.append("<HTML><HEAD><TITLE>Detector Description</TITLE></HEAD><BODY>\n");				buf.append(detailHTML);				buf.append("</BODY></HTML>\n");				factory.setDetailHTML(buf.toString());			}		} catch (ClassNotFoundException e) {			throw new PluginException("Could not instantiate detector class: " + e, e);		}		// Create ordering constraints		Node orderingConstraintsNode =			pluginDescriptor.selectSingleNode("/FindbugsPlugin/OrderingConstraints");		if (orderingConstraintsNode != null) {			// Get inter-pass and intra-pass constraints			for (Element constraintElement : (List<Element>) orderingConstraintsNode.selectNodes("./SplitPass|./WithinPass"))			{				// Create the selectors which determine which detectors are				// involved in the constraint				DetectorFactorySelector earlierSelector = getConstraintSelector(						constraintElement, plugin, "Earlier", "EarlierCategory");				DetectorFactorySelector laterSelector = getConstraintSelector(						constraintElement, plugin, "Later", "LaterCategory");				// Create the constraint				DetectorOrderingConstraint constraint = new DetectorOrderingConstraint(						earlierSelector, laterSelector);				// Add the constraint to the plugin				if (constraintElement.getName().equals("SplitPass"))					plugin.addInterPassOrderingConstraint(constraint);				else					plugin.addIntraPassOrderingConstraint(constraint);			}		}		// register global Category descriptions		I18N i18n = I18N.instance();		for (Document messageCollection : messageCollectionList) {			List<Node> categoryNodeList = messageCollection.selectNodes("/MessageCollection/BugCategory");			if (DEBUG) System.out.println("found "+categoryNodeList.size()+" categories in "+messageCollection.getName());			for (Node categoryNode : categoryNodeList) {				String key = categoryNode.valueOf("@category");				if (key.equals(""))					throw new PluginException("BugCategory element with missing category attribute");				String shortDesc = getChildText(categoryNode, "Description");				BugCategory bc = new BugCategory(key, shortDesc);				boolean b = i18n.registerBugCategory(key, bc);				if (DEBUG) System.out.println(b					? "category "+key+" -> "+shortDesc					: "rejected \""+shortDesc+"\" for category "+key+": "+i18n.getBugCategoryDescription(key));				/* Now set the abbreviation and details. Be prepared for messages_fr.xml				 * to specify only the shortDesc (though it should set the abbreviation				 * too) and fall back to messages.xml for the abbreviation and details. */				if (!b) bc = i18n.getBugCategory(key); // get existing BugCategory object				try {					String abbrev = getChildText(categoryNode, "Abbreviation");					if (bc.getAbbrev() == null) {						bc.setAbbrev(abbrev);						if (DEBUG) System.out.println("category "+key+" abbrev -> "+abbrev);					}					else if (DEBUG) System.out.println("rejected abbrev '"+abbrev+"' for category "+key+": "+bc.getAbbrev());				} catch (PluginException pe) {					if (DEBUG) System.out.println("missing Abbreviation for category "+key+"/"+shortDesc);					// do nothing else -- Abbreviation is required, but handle its omission gracefully				}				try {					String details = getChildText(categoryNode, "Details");					if (bc.getDetailText() == null) {						bc.setDetailText(details);						if (DEBUG) System.out.println("category "+key+" details -> "+details);					}					else if (DEBUG) System.out.println("rejected details ["+details+"] for category "+key+": ["+bc.getDetailText()+']');				} catch (PluginException pe) {					// do nothing -- LongDescription is optional				}			}		}		// Create BugPatterns		List<Node> bugPatternNodeList = pluginDescriptor.selectNodes("/FindbugsPlugin/BugPattern");		for (Node bugPatternNode : bugPatternNodeList) {			String type = bugPatternNode.valueOf("@type");			String abbrev = bugPatternNode.valueOf("@abbrev");			String category = bugPatternNode.valueOf("@category");			String experimental = bugPatternNode.valueOf("@experimental");			// Find the matching element in messages.xml (or translations)			String query = "/MessageCollection/BugPattern[@type='" + type + "']";			Node messageNode = findMessageNode(messageCollectionList, query,					"messages.xml missing BugPattern element for type " + type);			String shortDesc = getChildText(messageNode, "ShortDescription");			String longDesc = getChildText(messageNode, "LongDescription");			String detailText = getChildText(messageNode, "Details");			BugPattern bugPattern = new BugPattern(type, abbrev, category,					Boolean.valueOf(experimental).booleanValue(),					shortDesc, longDesc, detailText);			plugin.addBugPattern(bugPattern);			boolean unknownCategory = (null == i18n.getBugCategory(category));			if (unknownCategory) {				i18n.registerBugCategory(category, new BugCategory(category, category));				// no desc, but at least now it will appear in I18N.getBugCategories().				if (DEBUG) System.out.println("Category "+category+" (of BugPattern "					+type+") has no description in messages*.xml");				//TODO report this even if !DEBUG			}		}		// Create BugCodes		Set<String> definedBugCodes = new HashSet<String>();		for (Document messageCollection : messageCollectionList) {			List<Node> bugCodeNodeList = messageCollection.selectNodes("/MessageCollection/BugCode");			for (Node bugCodeNode : bugCodeNodeList) {				String abbrev = bugCodeNode.valueOf("@abbrev");				if (abbrev.equals(""))					throw new PluginException("BugCode element with missing abbrev attribute");				if (definedBugCodes.contains(abbrev))					continue;				String description = bugCodeNode.getText();				BugCode bugCode = new BugCode(abbrev, description);				plugin.addBugCode(bugCode);				definedBugCodes.add(abbrev);			}		}		// Success!		// Assign to the plugin field, so getPlugin() can return the		// new Plugin object.		this.plugin = plugin;	}	private static DetectorFactorySelector getConstraintSelector(			Element constraintElement,			Plugin plugin,			String singleDetectorElementName,			String detectorCategoryElementName) throws PluginException {		Node node = constraintElement.selectSingleNode("./" + singleDetectorElementName);		if (node != null) {			String detectorClass = node.valueOf("@class");			return new SingleDetectorFactorySelector(plugin, detectorClass);		}		node = constraintElement.selectSingleNode("./" + detectorCategoryElementName);		if (node != null) {			String categoryName = node.valueOf("@name");			boolean spanPlugins = Boolean.valueOf(node.valueOf("@spanplugins")).booleanValue();			if (categoryName.equals("reporting")) {				return new ReportingDetectorFactorySelector(spanPlugins ? null : plugin);			} else if (categoryName.equals("training")) {				return new ByInterfaceDetectorFactorySelector(spanPlugins ? null : plugin, TrainingDetector.class);			} else if (categoryName.equals("interprocedural")) {				return new ByInterfaceDetectorFactorySelector(spanPlugins ? null : plugin, InterproceduralFirstPassDetector.class);			} else {				throw new PluginException("Invalid constraint selector node");			}		}		throw new PluginException("Invalid constraint selector node");	}	private String lookupDetectorClass(Plugin plugin, String name) throws PluginException {		// If the detector name contains '.' characters, assume it is		// fully qualified already.  Otherwise, assume it is a short		// name that resolves to another detector in the same plugin.		if (name.indexOf('.') < 0) {			DetectorFactory factory = plugin.getFactoryByShortName(name);			if (factory == null)				throw new PluginException("No detector found for short name '" + name + "'");			name = factory.getFullName();		}		return name;	}	private void addCollection(List<Document> messageCollectionList, String filename)			throws DocumentException {		URL messageURL = findResource(filename);		if (messageURL != null) {			SAXReader reader = new SAXReader();			Document messageCollection = reader.read(messageURL);			messageCollectionList.add(messageCollection);		}	}	private static Node findMessageNode(List<Document> messageCollectionList, String xpath,										String missingMsg) throws PluginException {		for (Document document : messageCollectionList) {			Node node = document.selectSingleNode(xpath);			if (node != null)				return node;		}		throw new PluginException(missingMsg);	}	private static String getChildText(Node node, String childName) throws PluginException {		Node child = node.selectSingleNode(childName);		if (child == null)			throw new PluginException("Could not find child \"" + childName + "\" for node");		return child.getText();	}}// vim:ts=4

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -