package jdepend.service.impl; import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; import jdepend.framework.exception.JDependException; import jdepend.framework.file.AnalyzeData; import jdepend.framework.log.LogUtil; import jdepend.metadata.JavaPackage; import jdepend.model.Component; import jdepend.model.profile.ProfileFacade; import jdepend.model.result.AnalysisResult; import jdepend.model.result.AnalysisRunningContext; import jdepend.model.result.ProfileFacadeImpl; import jdepend.parse.BuildListener; import jdepend.parse.Parse; import jdepend.parse.ParseConfigurator; import jdepend.parse.ParseException; import jdepend.parse.ParseListener; import jdepend.parse.impl.AbstractParser; import jdepend.service.AnalyseListener; import jdepend.service.JDependLocalService; import jdepend.service.ServiceException; import jdepend.service.avertcheat.framework.AvertCheat; import jdepend.service.avertcheat.framework.AvertCheatMgr; import jdepend.service.config.ServiceConfigurator; import jdepend.service.profile.ClientProfileFacadeImpl; public final class JDependLocalServiceImpl implements JDependLocalService { private String group; private String command; private Parse parse; private Component component;// 组织分析单元的Component private ServiceConfigurator serviceConf; private ParseConfigurator parseConf; private ProfileFacade profileFacade; private AnalyseContext context; private ArrayList<AnalyseListener> listeners = new ArrayList<AnalyseListener>(); public JDependLocalServiceImpl(String groupName, String commandName) { this.group = groupName; this.command = commandName; component = Component.getDefaultComponent(); this.profileFacade = new ProfileFacadeImpl(new ClientProfileFacadeImpl(groupName, commandName)); this.serviceConf = new ServiceConfigurator(); this.parseConf = new ParseConfigurator(this.profileFacade.getJavaClassRelationItemProfile() .getJavaClassRelationTypes()); parse = new Parse(parseConf); } public JDependLocalServiceImpl(String groupName, String commandName, ServiceConfigurator serviceConf, ParseConfigurator parseConf, ProfileFacade profileFacade) { this.group = groupName; this.command = commandName; component = Component.getDefaultComponent(); this.profileFacade = profileFacade; this.serviceConf = serviceConf; this.parseConf = parseConf; parse = new Parse(parseConf); } /* * (non-Javadoc) * * @see jdepend.client.core.JDependAnalyssisService#analyze() */ public AnalysisResult analyze() throws ServiceException { try { LogUtil.getInstance(JDependLocalServiceImpl.class).systemLog("analyze is start!"); // 创建服务上下文 initServiceContext(); // 创建运行上下文 AnalysisRunningContext context = this.createRunningContext(); // 启动防作弊器 startAvertCheat(context); // 调用解析服务 Collection<JavaPackage> javaPackages = parse.execute(); context.setJavaPackages(new ArrayList<JavaPackage>(javaPackages)); // 组织成组件 List<Component> components = component.list(javaPackages); LogUtil.getInstance(JDependLocalServiceImpl.class).systemLog(components.size() + " components is created!"); // 创建返回结果 final AnalysisResult result = new AnalysisResult(components, context); LogUtil.getInstance(JDependLocalServiceImpl.class).systemLog("analysisResult is created!"); // 调用分析监听器 this.onAnalyse(result); LogUtil.getInstance(JDependLocalServiceImpl.class).systemLog("onAnalyse is finished!"); // 设置End时间 this.context.setExecuteEndTime(System.currentTimeMillis()); return result; } catch (JDependException e) { throw new ServiceException(e); } } private void initServiceContext() { if (this.context == null) { this.initServiceContext(true, null, null); } } private AnalysisRunningContext createRunningContext() { AnalysisRunningContext context = new AnalysisRunningContext(); context.setGroup(group); context.setCommand(command); context.setPath(parse.getDirectorys()); context.setComponent(component); context.setAnalyzeInnerClasses(parseConf.getAnalyzeInnerClasses()); context.setCalJavaClassCycle(serviceConf.isCalJavaClassCycle()); context.setProfileFacade(profileFacade); context.setLocalRunning(context.isLocalRunning()); context.setClient(context.getClient()); context.setUserName(context.getUserName()); return context; } private void startAvertCheat(AnalysisRunningContext context) { for (AvertCheat avertCheat : AvertCheatMgr.getInstance().getAvertCheats()) { if (avertCheat.enable(context)) { if (avertCheat instanceof AnalyseListener) { this.addAnalyseListener((AnalyseListener) avertCheat); } } } } /** * 创建服务上下文 */ @Override public void initServiceContext(boolean isLocalRunning, String client, String userName) { context = new AnalyseContext(); context.setLocalRunning(isLocalRunning); context.setClient(client); context.setUserName(userName); context.setExecuteStartTime(System.currentTimeMillis()); } /* * (non-Javadoc) * * @see * jdepend.client.core.JDependAnalyssisService#setComponent(jdepend.client * .core.Component) */ public void setComponent(Component component) { this.component = component; } /* * (non-Javadoc) * * @see * jdepend.client.core.JDependAnalyssisService#setWriter(java.io.PrintWriter * ) */ public void setParseLogWriter(PrintWriter printWriter) { parse.setLogWriter(printWriter); } /* * (non-Javadoc) * * @see * jdepend.client.core.JDependAnalyssisService#addDirectory(java.lang.String * ) */ public void addDirectory(String name) throws IOException { parse.addDirectorys(name); } /* * (non-Javadoc) * * @see jdepend.client.core.JDependAnalyssisService#countClasses() */ public int countClasses() { return parse.countClasses(); } public void addParseListener(ParseListener listener) { parse.addParseListener(listener); } public void addBuildListener(BuildListener listener) { parse.addBuildListener(listener); } @Override public void setAnalyzeData(AnalyzeData data) { this.parse.setAnalyseData(data); } public void addCommandFilteredPackages(List<String> filteredPackages) { this.parse.addFilteredPackages(filteredPackages); } public void addAnalyseListener(AnalyseListener listener) { listeners.add(listener); } protected void onAnalyse(AnalysisResult result) throws ServiceException { Collections.sort(listeners); for (AnalyseListener listener : listeners) { listener.onAnalyse(result); } } @Override public Collection<JavaPackage> getPackages() throws ServiceException { this.parse.setParseConfigs(false); this.parse.setSupplyJavaClassDetail(false); this.parse.setBuildClassRelation(false); this.parse.setParseModel(AbstractParser.Model_Small); try { return new ArrayList<JavaPackage>(this.parse.execute()); } catch (ParseException e) { throw new ServiceException(e); } } }