View Javadoc

1   package com.ontotext.ordi.mapper.processor;
2   
3   import java.io.File;
4   import java.io.FileNotFoundException;
5   import java.io.FileReader;
6   import java.io.Reader;
7   import java.util.ArrayList;
8   import java.util.Collections;
9   import java.util.HashMap;
10  import java.util.HashSet;
11  import java.util.Iterator;
12  import java.util.List;
13  import java.util.Map;
14  import java.util.Set;
15  
16  import org.apache.log4j.Logger;
17  import org.openrdf.model.Statement;
18  import org.openrdf.model.URI;
19  import org.openrdf.rio.RDFHandler;
20  import org.openrdf.rio.RDFHandlerException;
21  import org.openrdf.rio.RDFParser;
22  import org.openrdf.rio.RDFParserFactory;
23  import org.openrdf.rio.n3.N3ParserFactory;
24  
25  import com.ontotext.ordi.mapper.exceptions.IllegalMapperDescriptorFormat;
26  import com.ontotext.ordi.mapper.model.DataSource;
27  import com.ontotext.ordi.mapper.model.MapperDescriptor;
28  import com.ontotext.ordi.mapper.model.PredicatePattern;
29  
30  public class N3MapperDescriptorImpl implements MapperDescriptor {
31  
32      private Set<PredicatePattern> predicateSet = new HashSet<PredicatePattern>();
33      private Map<URI, DataSource> dataSources = new HashMap<URI, DataSource>();
34      private static Logger logger = Logger
35              .getLogger(N3MapperDescriptorImpl.class);
36  
37      public N3MapperDescriptorImpl(File... files) {
38          if (files == null) {
39              throw new IllegalArgumentException();
40          }
41          for (int i = 0; i < files.length; i++) {
42              
43              try {
44                  if (files[i] == null || files[i].exists() == false) {
45                      String msg = String.format("Invalid file name %s!"
46                              + files[i].getAbsolutePath());
47                      logger.error(msg);
48                      throw new IllegalArgumentException(msg);
49                  }
50                  if (files[i].length() > 1024 * 1024) {
51                      String msg = String.format(
52                              "The file %s has lenght of %d (the maximum allowed"
53                                      + " is %d!", files[i].getAbsolutePath(),
54                              files[i].length(), 1024 * 1024);
55                      logger.error(msg);
56                      throw new IllegalMapperDescriptorFormat(msg);
57                  }
58                  
59                  initialize(new FileReader(files[i]));
60                  
61              } catch (FileNotFoundException fe) {
62                  throw new IllegalMapperDescriptorFormat(fe.getMessage(), fe);
63              }
64          }
65      }
66  
67      public N3MapperDescriptorImpl(Reader reader) {
68          if (reader == null) {
69              throw new IllegalArgumentException();
70          }
71          initialize(reader);
72      }
73  
74      public boolean addPattern(PredicatePattern pattern) {
75          if (pattern == null) {
76              throw new IllegalArgumentException();
77          }
78          return predicateSet.add(pattern);
79      }
80  
81      public Set<PredicatePattern> listPatterns() {
82          return Collections.unmodifiableSet(predicateSet);
83      }
84  
85      public boolean removePattern(PredicatePattern pattern) {
86          return predicateSet.remove(pattern);
87      }
88  
89      public DataSource getDataSource(URI name) {
90          return dataSources.get(name);
91      }
92  
93      private void initialize(Reader reader) {
94          RDFParserFactory factory = new N3ParserFactory();
95          RDFParser parser = factory.getParser();
96          parser.setVerifyData(true);
97          parser.setStopAtFirstError(true);
98          MapperDescriptorParser handler = new MapperDescriptorParser();
99          parser.setRDFHandler(handler);
100 
101         try {
102             parser.parse(reader, OntologyMapperReader.ORDI_NS);
103         } catch (Exception pe) {
104             String msg = "Could not process MapperDescriptor!";
105             logger.error(msg);
106             throw new IllegalMapperDescriptorFormat(msg, pe);
107         }
108 
109         OntologyMapperReader ontologyReader = new OntologyMapperReader(
110                 handler.statements);
111         for (Iterator<DataSource> i = ontologyReader.getDataSources()
112                 .iterator(); i.hasNext();) {
113             DataSource ds = i.next();
114             dataSources.put(ds.getName(), ds);
115         }
116         for (Iterator<PredicatePattern> i = ontologyReader
117                 .getPredicatePatterns(this).iterator(); i.hasNext();) {
118             predicateSet.add(i.next());
119         }
120 
121         validate();
122     }
123 
124     private void validate() {
125         for (Iterator<PredicatePattern> i = predicateSet.iterator(); i
126                 .hasNext();) {
127             PredicatePattern pattern = (PredicatePattern) i.next();
128             if (pattern.isValid() == false) {
129                 logger.info(String.format("The predicate pattern %s was "
130                         + "ignored because its not valid!", pattern));
131                 i.remove();
132             }
133         }
134     }
135 
136     private class MapperDescriptorParser implements RDFHandler {
137 
138         private List<Statement> statements = new ArrayList<Statement>();
139 
140         public void startRDF() throws RDFHandlerException {
141         }
142 
143         public void endRDF() throws RDFHandlerException {
144         }
145 
146         public void handleNamespace(String prefix, String uri)
147                 throws RDFHandlerException {
148         }
149 
150         public void handleStatement(Statement st) throws RDFHandlerException {
151             statements.add(st);
152         }
153 
154         public void handleComment(String comment) throws RDFHandlerException {
155         }
156     }
157 }