aboutsummaryrefslogtreecommitdiffstats
path: root/jython-tosca-parser/src/main/java/org/openecomp/sdc/toscaparser/ToscaParserFactory.java
blob: 8bb1e173653681cba088802b04c3af6a1847ca4e (plain)
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
package org.openecomp.sdc.toscaparser;

import java.io.IOException;

import org.openecomp.sdc.toscaparser.api.ToscaTemplateFactory;
import org.openecomp.sdc.toscaparser.utils.JarExtractor;
import org.python.util.PythonInterpreter;

/**
 * This is the entry point of the tosca-parser: a factory for creating {@code ToscaParser}s.
 * <b>This class is not thread-safe.</b> Once you are done with all {@code ToscaParser}s 
 * created by this factory, the {@code ToscaParserFactory} itself must be closed either by
 * calling its close() method explicitly or preferrably by creating it in a try-with-resources block:
 * <pre>
    try (ToscaParserFactory toscaParserFactory = new ToscaParserFactory()){
        ToscaParser parser = toscaParserFactory.create()
        ToscaTemplate toscaTemplate = parser.parse(toscaFilePath);
        ...
    }
 * </pre>
 * @author Yaniv Nahoum
 *
 */
public class ToscaParserFactory implements AutoCloseable {
    
    private JythonRuntime jythonRuntime;

    public ToscaParser create() throws IOException {
        initRuntime();
        ToscaTemplateFactory toscaTemplateFactory = new ToscaTemplateFactory();
        PythonInterpreter pythonInterpreter = new PythonInterpreter();
        return new ToscaParser(toscaTemplateFactory, pythonInterpreter);
    }
    
    private void initRuntime() throws IOException {
        if (jythonRuntime == null) {
            jythonRuntime = new JythonRuntime(new JarExtractor());
            jythonRuntime.initialize();
        }
    }    
    
    @Override
    public void close() throws IOException {
        if (jythonRuntime != null) {
            jythonRuntime.terminate();
        }
    }
}