Package com.taobao.top.analysis.node.component

Source Code of com.taobao.top.analysis.node.component.MixJobBuilder

/**
*
*/
package com.taobao.top.analysis.node.component;

import java.util.HashMap;
import java.util.Map;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.taobao.top.analysis.config.MasterConfig;
import com.taobao.top.analysis.exception.AnalysisException;
import com.taobao.top.analysis.node.IJobBuilder;
import com.taobao.top.analysis.node.job.Job;
import com.taobao.top.analysis.util.AnalyzerUtil;

/**
* 支持多个扩展的JobBuilder,默认集成了本地文件的builder
* 此处有陷阱,支持多种类型的jobBuilder切换时注意
* @author fangweng
* @Email fangweng@taobao.com
* 2011-11-28
*
*/
public class MixJobBuilder implements IJobBuilder {
    private static final Log log = LogFactory.getLog(MixJobBuilder.class);

  Map<String,IJobBuilder> jobBuilders;
  private MasterConfig config;
  private IJobBuilder jobBuilder;
  private String jobResource;
 
  @Override
  public boolean isNeedRebuild() {
    if (jobBuilder == null)
      return false;
    else
      return jobBuilder.isNeedRebuild();
  }

  @Override
  public void setNeedRebuild(boolean needRebuild) {
    if (jobBuilder != null)
      jobBuilder.setNeedRebuild(true);
  }


  @Override
  public MasterConfig getConfig() {
    return config;
  }


  @Override
  public void setConfig(MasterConfig config) {
    this.config = config;
  }
 
  public void addBuilder(String protocol,IJobBuilder jobBuilder)
  {
    jobBuilders.put(protocol, jobBuilder);
  }
 
  public void removeBuilder(String protocol)
  {
    jobBuilders.remove(protocol);
  }
 
  public Map<String,Job> build() throws AnalysisException
  {
    if(config == null)
      throw new AnalysisException("master config is null!");
     
    return build(config.getJobsSource());
  }
 
  @Override
  public Map<String,Job> build(String config) throws
      AnalysisException {
       
    String protocol = "file";
//    String conf = config;
    jobResource = config;
    jobBuilder = jobBuilders.get(protocol);
   
    if (config.indexOf(":") > 0)
    {
      protocol = config.substring(0,config.indexOf(":"));
//      conf = config.substring(config.indexOf(":")+1);
     
      if (jobBuilders.containsKey(protocol))
        jobBuilder = jobBuilders.get(protocol);   
    }
   
    return jobBuilder.build(config);
  }

  @Override
  public void init() {
    jobBuilders = new HashMap<String,IJobBuilder>();
    FileJobBuilder fileJobBuilder = new FileJobBuilder();
    fileJobBuilder.init();
    jobBuilders.put("file", fileJobBuilder);
    jobBuilders.get("file").setConfig(config);
    if(log.isInfoEnabled()) {
        log.info("mixJobBuilder init complete.");
    }
  }

  @Override
  public void releaseResource() {
    jobBuilders.clear();
  }

  @Override
  public Map<String,Job> rebuild(Map<String,Job> jobs) throws AnalysisException {
      //此处有陷阱,支持多种类型的jobBuilder切换时注意
    if (this.isNeedRebuild())
    {
        return jobBuilder.rebuild(jobs);
    }
    else
      return null;
  }

  @Override
  public void buildTasks(Job job) throws AnalysisException {
    // TODO Auto-generated method stub
   
  }

    /* (non-Javadoc)
     * @see com.taobao.top.analysis.node.IJobBuilder#isModified()
     */
    @Override
    public boolean isModified() {
        //此处有陷阱,支持多种类型的jobBuilder切换时注意
        if(!AnalyzerUtil.covertNullToEmpty(config.getJobsSource()).equals(AnalyzerUtil.covertNullToEmpty(this.jobResource)))
            return true;
        if(this.jobBuilders.get("file").isModified())
            return true;
        return false;
    }

    /* (non-Javadoc)
     * @see com.taobao.top.analysis.node.IJobBuilder#getJobResource()
     */
    @Override
    public String getJobResource() {
        return jobResource;
    }

}
TOP

Related Classes of com.taobao.top.analysis.node.component.MixJobBuilder

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.