JBPM 3 소스 코드 분석

8700 단어 xmljbpm

JBPM 3 소스 코드 분석
작성 자: wocsok
    JBPM 3 를 자주 사용 하 는 친구 들 은 아래 몇 줄 의 코드 에 대해 잘 알 고 있 을 지도 모른다.이 글 은 주로 JBPM 의 소스 코드 에 대해 간략하게 설명 하고 이 방법 들 에서 도대체 무엇 을 했 는 지 살 펴 보 자.
JbpmConfiguration configuration =  JbpmConfiguration.getInstance();
JbpmContext jbpmContext = configuration.createJbpmContext();
InputStream is = new FileInputStream("test.par/processdefinition.xml");
ProcessDefinition processDefinition = ProcessDefinition.parseXmlInputStream(is);
jbpmContext.deployProcessDefinition(processDefinition);

인용 하 다.
분석 하기 전에 여러분 은 먼저 몇 가지 개념 을 명 확 히 하 세 요.
1. JbpmConfiguration 은 말 그대로 JBPM 의 설정 입 니 다. 즉, 이 종 류 는 JBPM 의 설정 정 보 를 포함 합 니 다.
2. ObjectInfo。 JBPM 은 설정 파일 의 대상 을 Object Info 로 패키지 하여 통 일 된 작업 을 할 수 있 도록 합 니 다.
3. ObjectFactory。Object Info 의 공장 인 터 페 이 스 를 만 듭 니 다. 이것 은 하나의 실현 클래스 Object Factory Impl 만 있 습 니 다.
4. ObjectFactoryParser。XML 프로필 을 분석 하고 검사 (프로필 탭 의 이름, 지원 하 는 지 판단 합 니 다.), 그리고 Object Info 구현 클래스 를 만 들 때 Object Info 의 이름과 해당 하 는 대상 을 하나의 map 에 저장 합 니 다. 나중에 사용 할 때 이름 을 통 해 해당 하 는 대상 을 직접 추출 할 수 있 습 니 다.
본론 으로 돌아 가면 JbpmConfiguration configuration =  JbpmConfiguration.getInstance();
안의 비밀.

	public static JbpmConfiguration getInstance() {
		return getInstance(null);
	}

	public static synchronized JbpmConfiguration getInstance(String resource) {
		//      jbpm.cfg.xml
		if (resource == null) {
			resource = "jbpm.cfg.xml";
		}
		//  map   
		JbpmConfiguration instance = (JbpmConfiguration) instances
				.get(resource);
		//      ,    ,     instances  map 
		if (instance == null) {
			//   objectFactory    
			if (defaultObjectFactory != null) {
				instance = new JbpmConfiguration(defaultObjectFactory);
			} else {
				try {
					InputStream jbpmCfgXmlStream = ClassLoaderUtil
							.getStream(resource);
					//         
					ObjectFactory objectFactory = parseObjectFactory(jbpmCfgXmlStream);
					//     JbpmConfiguration  
					instance = new JbpmConfiguration(objectFactory);
				} catch (RuntimeException e) {
					throw new JbpmException(
							"couldn't parse jbpm configuration from resource '"
									+ resource + "'", e);
				}
			}
			//         ,   map 。
			instances.put(resource, instance);
		}
		return instance;
	}

대상 공장 을 구축 하 는 과정 을 살 펴 보 자.

	protected static ObjectFactory parseObjectFactory(InputStream inputStream) {
		//          
		ObjectFactoryParser objectFactoryParser = new ObjectFactoryParser();
		// ObjectFactoryImpl          
		ObjectFactoryImpl objectFactoryImpl = new ObjectFactoryImpl();
		//                ,     ,  ObjectFactoryImpl。
		objectFactoryParser.parseElementsFromResource(
				"org/jbpm/default.jbpm.cfg.xml", objectFactoryImpl);
		//             
		if (inputStream != null) {

			objectFactoryParser.parseElementsStream(inputStream,
					objectFactoryImpl);
		}
		return objectFactoryImpl;
	}
 
object Factory Parser. parseElement s FromResource () 가 무엇 을 했 는 지 보 세 요.
  public void parseElementsFromResource(String resource, ObjectFactoryImpl objectFactoryImpl) {
	  //  XML    
    Element rootElement = XmlUtil.parseXmlResource(resource).getDocumentElement();
    parseElements(rootElement, objectFactoryImpl);
  }
 
XML 의 설정 정 보 를 Object Info 로 해석 하여 object Factory Impl 에 넣 습 니 다.
	public void parseElements(Element element,
			ObjectFactoryImpl objectFactoryImpl) {
		List objectInfoElements = XmlUtil.elements(element);
		for (int i = 0; i < objectInfoElements.size(); i++) {
			Element objectInfoElement = (Element) objectInfoElements.get(i);
			ObjectInfo objectInfo = parse(objectInfoElement);
			objectFactoryImpl.addObjectInfo(objectInfo);
		}
	}

	//        
	//        objectInfo  
	public ObjectInfo parse(Element element) {
		ObjectInfo objectInfo = null;
		String elementTagName = element.getTagName().toLowerCase();
		//  :    ObjectFactoryParser   ,        
		//     XML                       (java.lang.reflect.Constructor),
		//  key-value   ,   mappings ,       Constructor     。
		Constructor constructor = (Constructor) mappings.get(elementTagName);
		if (constructor == null) {
			throw new JbpmException(
					"no ObjectInfo class specified for element '"
							+ elementTagName + "'");
		}
		try {
			//                  ,           objectInfo   , objectInfo    ,
			//         ObjectInfo                   KEY-VALUE   
			//          MAP ,          
			//        (     ,     MAP           Construct)。
			objectInfo = (ObjectInfo) constructor.newInstance(new Object[] {
					element, this });
		} catch (Exception e) {
			throw new JbpmException("couldn't parse '" + elementTagName
					+ "' into a '" + constructor.getDeclaringClass().getName()
					+ "': " + XmlUtil.toString(element), e);
		}
		return objectInfo;
	}

이로써 JbpmConfiguration 의 생 성 과정 이 완료 되 었 습 니 다.JbpmConfiguration 의 생 성 과정 은 jbpm. cfg. xml 프로필 과 default. jbpm. cfg. xml 프로필 입 니 다.
분석 한 다음 에 대응 하 는 Object Info 의 실현 클래스 로 봉 하여 object Factory Impl 에 넣 은 다음 에 만 든 JbpmConfiguration 대상 에 object Factory Impl 에 대한 인용 을 묻 었 습 니 다.
앞으로 저 는 어떤 Object Info 의 실현 류 를 만 들 든 이 대상 프로젝트 로 만 들 면 됩 니 다. (공장 대상 의 create () 방법 은 실제 적 으로 Object Info 에 대응 하 는 create 방법 을 호출 했 습 니 다.)
이제 default. jbpm. cfg. xml 에 무엇이 있 는 지 봅 시다.

 
 
 
   
   
   
   
   
 

 
 
  //아직 많 습 니 다. 생략 합 니 다.
 
 
 
 
/ / 아직 많 습 니 다. 생략 합 니 다.
 //        StringInfo   ,           。
  public StringInfo(Element stringElement, ObjectFactoryParser configParser) {
  //                map     ,           (  :<long name="a" value="5000" singleton="true" />
                singleton   ,       true )
    super(stringElement, configParser);
    s = getValueString(stringElement);
  }
  protected String getValueString(Element element) {
    String value = null;
    if (element.hasAttribute("value")) {
      value = element.getAttribute("value");
    } else {
      value = XmlUtil.getContentText(element);
    }
    return value;
  }
  //StringInfo               value  ,  StringInfo create();
  public Object createObject(ObjectFactoryImpl objectFactory) {
  //          value      ,  
    return s;
  }

 
다음 글 은 복잡 한 JbpmContext 의 생 성 과정 을 살 펴 보 겠 습 니 다.
JbpmContext jbpmContext = configuration.createJbpmContext();

좋은 웹페이지 즐겨찾기