package jdepend.client.core.command; import java.io.OutputStream; import java.io.PrintWriter; import java.util.List; import jdepend.core.serviceproxy.framework.JDependServiceProxy; import jdepend.core.serviceproxy.framework.JDependServiceProxyFactoryMgr; import jdepend.framework.exception.JDependException; import jdepend.model.Component; import jdepend.model.result.AnalysisResult; import jdepend.parse.ParseListener; import jdepend.service.AnalyseListener; /** * The <code>JDepend</code> class analyzes directories of Java class files, * generates metrics for each Java package, and reports the metrics in a textual * format. * * @author <b>Abner</b> */ public class DefaultCommand implements Command { protected JDependServiceProxy serviceProxy; private int javaClassCount = -1; private String group; private String name; public DefaultCommand() { } public DefaultCommand(String group, String name) { this.group = group; this.name = name; this.serviceProxy = JDependServiceProxyFactoryMgr.getInstance().getFactory() .createJDependServiceProxy(group, name); } /** * 分析前的准备 * * @throws JDependException */ public void prepareAnalyze() throws JDependException { } public void addCommandFilteredPackages(List<String> filteredPackages) { this.serviceProxy.addCommandFilteredPackages(filteredPackages); } /** * 设置日志输出的对象 * * @param writer */ public void setLogStream(OutputStream stream) { this.serviceProxy.setLogWriter(new PrintWriter(stream)); } /** * Adds the specified directory name to the collection of directories to be * analyzed. * * @param name * Directory name. * @throws JDependException */ public void addDirectory(String name) throws JDependException { serviceProxy.addDirectory(name); } /** * Analyzes the registered directories, generates metrics for each Java * package, and reports the metrics. * * @throws JDependException */ private AnalysisResult analyze() throws JDependException { return serviceProxy.analyze(); } protected void usage(String message) { if (message != null) { System.err.println("\n" + message); } String baseUsage = "\nJDepend "; System.err.println(""); System.err.println("usage: "); System.err.println(baseUsage + "[-components <components>]" + " [-file <output file>] <directory> " + "[directory2 [directory 3] ...]"); // System.exit(1); } /** * 1、可以通过-componentClassName设置新的组件类名 * * 2、可以通过-components设置以输入的字符串开头的一组package为一个组件,组件间以;分开 * */ public void initArgs(String[] args) throws JDependException { if (args != null) { for (int i = 0; i < args.length; i++) { if (args[i].equalsIgnoreCase("-componentClassName")) { if (args.length <= i + 1) { usage("componentClassName not specified."); } try { Component component = (Component) DefaultCommand.class.getClassLoader().loadClass(args[++i]) .newInstance(); if (args.length > i + 1 && !args[i + 1].startsWith("-")) component.init(this.group, this.name, args[++i]); else component.init(this.group, this.name, null); serviceProxy.setComponent(component); } catch (Exception e) { e.printStackTrace(); } } else if (args[i].equalsIgnoreCase("-components")) { if (args.length <= i + 1) { usage("Components not specified."); } serviceProxy.setComponent(SimpleComponent.calSimpleComponent(args[++i], ";")); } else { i++; } } } } @Override public AnalysisResult execute() throws JDependException { this.prepareAnalyze(); return analyze(); } @Override public int getTaskSize() { return this.getJavaClassCount(); } private int getJavaClassCount() { if (this.javaClassCount == -1) { this.javaClassCount = this.serviceProxy.countClasses(); } return this.javaClassCount; } @Override public void addParseListener(ParseListener listener) throws JDependException { this.serviceProxy.addParseListener(listener); } @Override public void addAnalyseListener(AnalyseListener listener) throws JDependException { this.serviceProxy.addAnalyseListener(listener); } }