田源
2025-01-16 a13255b4129ee8a7a7b7e1ecd8e02dd2c78f7c17
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
/*
 * JBoss, Home of Professional Open Source
 * Copyright 2005, JBoss Inc., and individual contributors as indicated
 * by the @authors tag. See the copyright.txt in the distribution for a
 * full listing of individual contributors.
 *
 * This is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation; either version 2.1 of
 * the License, or (at your option) any later version.
 *
 * This software is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this software; if not, write to the Free
 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
 */
package org.jbpm.jpdl.internal.convert.node;
 
import java.io.InputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
 
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
 
 
/**
 * This originates from jbpm3 code base
 * 
 * Basically, it maps a type string to a Node class.
 */
public class NodeConverterTypes {
 
      public static Set<String> getNodeTypes() {
        return nodeTypes.keySet();
      }
      
      public static Set<Class<? extends Node>> getNodeNames() {
        return nodeNames.keySet();
      }
      
      public static Class<? extends Node> getNodeType(String name) {
        return nodeTypes.get(name);
      }
      
      public static String getNodeName(Class<? extends Node> type) {
        return nodeNames.get(type);
      }
      
      private static final Log log = LogFactory.getLog(NodeConverterTypes.class);
      private static SAXReader reader = new SAXReader();
      static Map<String, Class<? extends Node>> nodeTypes = initialiseNodeTypes();
      static Map<Class<? extends Node>, String> nodeNames = createInverseMapping(nodeTypes);
      
      static Map<String, Class<? extends Node>> initialiseNodeTypes() {
        Map<String, Class<? extends Node>> types = new HashMap<String, Class<? extends Node>>();
        InputStream nodeTypesStream = NodeConverterTypes.class.getClassLoader().getResourceAsStream("node.converter.types.xml");
        Element nodeTypesElement = null;
        try {
            nodeTypesElement = reader.read(nodeTypesStream).getRootElement();
        } catch (DocumentException e1) {
            log.error("Failed to parse the node.converter.types.xml", e1);
        }       
        Iterator<?> nodeTypeIterator = nodeTypesElement.elementIterator("node-type");
        while(nodeTypeIterator.hasNext()) {
          Element nodeTypeElement = (Element) nodeTypeIterator.next();
 
          String elementTag = nodeTypeElement.attributeValue("element");
          String className = nodeTypeElement.attributeValue("class");
          try {
            Class<?> nodeClass =  NodeConverterTypes.class.forName(className);
            types.put(elementTag, nodeClass.asSubclass(Node.class));
            
          } catch (Exception e) {
            if (!"org.jboss.seam.jbpm.Page".equals(className)) {
              if(log.isDebugEnabled())
              {
                  log.debug("node '"+elementTag+"' will not be available. class '"+className+"' couldn't be loaded");
              }
            }
          }
        }
 
        return types; 
      }
 
      public static <K, V> Map<V, K> createInverseMapping(Map<K, V> map) {
        Map<V, K> inverse = new HashMap<V, K>();
        for (Map.Entry<K, V> entry : map.entrySet()) {
          inverse.put(entry.getValue(), entry.getKey());      
        }
        return inverse;
      }
    }