📄 pluginloader.java
字号:
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 + -