Project

General

Profile

Download (5.39 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
* Copyright (C) 2019 EDIT
3
* European Distributed Institute of Taxonomy
4
* http://www.e-taxonomy.eu
5
*
6
* The contents of this file are subject to the Mozilla Public License Version 1.1
7
* See LICENSE.TXT at the top of this package for the full license terms.
8
*/
9
package eu.etaxonomy.cdm.io.descriptive.owl.in;
10

    
11
import java.net.URI;
12
import java.util.Arrays;
13
import java.util.Set;
14
import java.util.UUID;
15

    
16
import org.springframework.stereotype.Component;
17

    
18
import com.hp.hpl.jena.rdf.model.Model;
19
import com.hp.hpl.jena.rdf.model.ResIterator;
20
import com.hp.hpl.jena.rdf.model.Resource;
21
import com.hp.hpl.jena.rdf.model.Statement;
22
import com.hp.hpl.jena.rdf.model.StmtIterator;
23

    
24
import eu.etaxonomy.cdm.common.monitor.IProgressMonitor;
25
import eu.etaxonomy.cdm.io.common.CdmImportBase;
26
import eu.etaxonomy.cdm.io.descriptive.owl.OwlUtil;
27
import eu.etaxonomy.cdm.model.media.Media;
28
import eu.etaxonomy.cdm.model.term.DefinedTermBase;
29
import eu.etaxonomy.cdm.model.term.TermVocabulary;
30

    
31
/**
32
 * @author pplitzner
33
 * @since May 27, 2019
34
 */
35
@Component("termVocabularyOwlImport")
36
public class TermVocabularyOwlImport
37
        extends CdmImportBase<StructureTreeOwlImportConfigurator, StructureTreeOwlImportState> {
38

    
39
    private static final long serialVersionUID = -3659780404413458511L;
40
    private static final org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(TermVocabularyOwlImport.class);
41

    
42
    @Override
43
    protected boolean doCheck(StructureTreeOwlImportState state) {
44
        logger.warn("Checking not yet implemented for " + this.getClass().getSimpleName());
45
        return true;
46
    }
47

    
48
    @Override
49
    public void doInvoke(StructureTreeOwlImportState state) {
50
        URI source = state.getConfig().getSource();
51

    
52
        state.getModel().read(source.toString());
53

    
54
        //calculate total work
55
        int nodeCount = state.getModel().listResourcesWithProperty(OwlUtil.propIsA, OwlUtil.NODE).toSet().size();
56
        int termCount = state.getModel().listResourcesWithProperty(OwlUtil.propIsA, OwlUtil.TERM).toSet().size();
57
        int totalWork = nodeCount+termCount;
58
        IProgressMonitor progressMonitor = state.getConfig().getProgressMonitor();
59
        progressMonitor.beginTask("Importing terms", totalWork);
60

    
61
        //get all vocabularies
62
        ResIterator iterator = state.getModel().listResourcesWithProperty(OwlUtil.propIsA, OwlUtil.VOCABULARY);
63
        while(iterator.hasNext()){
64
            Resource voc = iterator.next();
65
            String type = voc.getProperty(OwlUtil.propType).getString();
66

    
67
            UUID vocUuid = UUID.fromString(voc.getProperty(OwlUtil.propUuid).getString());
68
            TermVocabulary vocabulary = getVocabularyService().load(vocUuid, Arrays.asList("terms"));
69
            if(vocabulary==null){
70
                vocabulary = OwlImportUtil.createVocabulary(voc, this, state.getModel(), state);
71
                vocabulary = getVocabularyService().save(vocabulary);
72
            }
73

    
74
            // import terms
75
            Set<Statement> terms = voc.listProperties(OwlUtil.propVocTopLevelTerm).toSet();
76
            for (Statement statement : terms) {
77
                if(progressMonitor.isCanceled()){
78
                    break;
79
                }
80
                DefinedTermBase term = createTerm(vocabulary, statement, state.getModel(), state);
81
                vocabulary.addTerm(term);
82
                progressMonitor.worked(1);
83
            }
84
            getVocabularyService().saveOrUpdate(vocabulary);
85
        }
86
    }
87

    
88
    private DefinedTermBase createTerm(TermVocabulary vocabulary, Statement termStatement, Model model, StructureTreeOwlImportState state) {
89
        Resource termResource = model.createResource(termStatement.getObject().toString());
90

    
91
        UUID termUuid = UUID.fromString(termResource.getProperty(OwlUtil.propUuid).getString());
92
        if(getTermService().exists(termUuid)) {
93
            return getTermService().load(termUuid);
94
        }
95
        DefinedTermBase term = OwlImportUtil.createTerm(termResource, this, model, state);
96
        term = getTermService().save(term);
97
        vocabulary.addTerm(term); // only add term if it does not already exist
98

    
99
        //check media
100
        StmtIterator mediaIterator = termResource.listProperties(OwlUtil.propTermHasMedia);
101
        while(mediaIterator.hasNext()){
102
            Resource mediaResource = model.createResource(mediaIterator.next().getObject().toString());
103
            Media media = OwlImportUtil.findMedia(mediaResource, this);
104
            if(media==null){
105
                media = OwlImportUtil.createMedia(mediaResource, state);
106
            }
107
            term.addMedia(media);
108
        }
109

    
110
        // check includes
111
        StmtIterator includesIterator = termResource.listProperties(OwlUtil.propTermIncludes);
112
        while(includesIterator.hasNext()){
113
            DefinedTermBase includeTerm = createTerm(vocabulary, includesIterator.next(), model, state);
114
            term.addIncludes(includeTerm);
115
        }
116
        // check generalization
117
        StmtIterator generalizationOfIterator = termResource.listProperties(OwlUtil.propTermIsGeneralizationOf);
118
        while(generalizationOfIterator.hasNext()){
119
            DefinedTermBase generalizationOfTerm = createTerm(vocabulary, generalizationOfIterator.next(), model, state);
120
            term.addGeneralizationOf(generalizationOfTerm);
121
        }
122
        getTermService().saveOrUpdate(term);
123
        return term;
124
    }
125

    
126
    @Override
127
    protected boolean isIgnore(StructureTreeOwlImportState state) {
128
        return false;
129
    }
130

    
131
}
(6-6/6)