Project

General

Profile

1
package edu.ucsb.nceas.metacat.index;
2

    
3
import static org.junit.Assert.assertFalse;
4
import static org.junit.Assert.assertTrue;
5

    
6
import edu.ucsb.nceas.metacat.common.SolrServerFactory;
7
import java.io.File;
8
import java.io.FileInputStream;
9
import java.io.InputStream;
10
import java.io.StringWriter;
11
import java.io.Writer;
12
import java.util.ArrayList;
13
import java.util.HashMap;
14
import java.util.List;
15
import java.util.Map;
16

    
17
import org.apache.solr.client.solrj.SolrServer;
18
import org.apache.solr.client.solrj.SolrServerException;
19
import org.apache.solr.client.solrj.response.QueryResponse;
20
import org.apache.solr.common.params.SolrParams;
21
import org.apache.solr.core.CoreContainer;
22
import org.apache.solr.core.SolrCore;
23
import org.apache.solr.request.LocalSolrQueryRequest;
24
import org.apache.solr.response.SolrQueryResponse;
25
import org.apache.solr.response.XMLResponseWriter;
26
import org.apache.solr.servlet.SolrRequestParsers;
27
import org.dataone.service.types.v1.Identifier;
28
import org.dataone.service.types.v1.SystemMetadata;
29
import org.dataone.service.util.TypeMarshaller;
30
import org.junit.Before;
31
import org.junit.Test;
32

    
33
public class SolrIndexIT  {
34
    
35
    private static final String SYSTEMMETAFILEPATH = "src/test/resources/eml-system-meta-example.xml";
36
    private static final String EMLFILEPATH = "src/test/resources/eml-example.xml";
37
    private static final String SYSTEMMETAUPDATEFILEPATH = "src/test/resources/eml-updating-system-meta-example.xml";
38
    private static final String EMLUPDATEFILEPATH = "src/test/resources/eml-updating-example.xml";
39
    private static final String SYSTEMMETAARCHIVEFILEPATH = "src/test/resources/eml-archive-system-meta-example.xml";
40
    private static final String id = "urn:uuid:606a19dd-b531-4bf4-b5a5-6d06c3d39098";
41
    private static final String newId = "urn:uuid:606a19dd-b531-4bf4-b5a5-6d06c3d39099";
42
    
43
	private String annotation_id = "http://doi.org/annotation.1.1";
44
	private static final String ANNOTATION_SYSTEM_META_FILE_PATH = "src/test/resources/annotation-system-meta-example.xml";
45
	private static final String AO_FILE_PATH = "src/test/resources/ao-example.rdf";;
46
	private static final String OA_FILE_PATH = "src/test/resources/oa-example.rdf";;
47

    
48
	private SolrIndex solrIndex = null;
49
    
50
    @Before
51
    public void setUp() throws Exception {
52
            solrIndex  = generateSolrIndex();
53
    }
54
    
55
    public static SolrIndex generateSolrIndex() throws Exception {
56
        String springConfigFile = "/index-processor-context.xml";
57
        String metacatPropertyFile = null; //in this test, we use the test.properties file rather than metacat.properties file. so set it to be null.
58
        ApplicationController controller = new ApplicationController(springConfigFile, metacatPropertyFile);
59
        controller.initialize();
60
        List<SolrIndex> list = controller.getSolrIndexes();
61
        SolrIndex[] solrIndexesarray = list.toArray(new SolrIndex[list.size()]);
62
        SolrIndex index = solrIndexesarray[0];
63
        //SolrServer solrServer = SolrServerFactory.createSolrServer();
64
        //index.setSolrServer(solrServer);
65
        return index;
66
    }
67
    
68
    /**
69
     * Test building index for an insert.
70
     */
71
    @Test
72
    public void testInsert() throws Exception {
73
    	
74
    	
75
       //InputStream systemInputStream = new FileInputStream(new File(SYSTEMMETAFILEPATH));
76
       SystemMetadata systemMetadata = TypeMarshaller.unmarshalTypeFromFile(SystemMetadata.class, SYSTEMMETAFILEPATH);
77
       InputStream emlInputStream = new FileInputStream(new File(EMLFILEPATH)); 
78
       //List<String> chain = null;
79
       Identifier pid = new Identifier();
80
       pid.setValue(id);
81
       solrIndex.update(pid, systemMetadata, emlInputStream);
82
       String result = doQuery(solrIndex.getSolrServer());
83
       List<String> ids = solrIndex.getSolrIds();
84
       //assertTrue(ids.size() == 1);
85
       boolean foundId = false;
86
       for(String identifiers :ids) {
87
           if(id.equals(identifiers)) {
88
               foundId = true;
89
           }
90
       }
91
       assertTrue(foundId);
92
       assertTrue(result.contains("version1"));
93
    	
94
    }
95
    
96
    /**
97
     * Test building index for an insert.
98
     */
99
    @Test
100
    public void testUpdate() throws Exception {
101
       //InputStream systemInputStream = new FileInputStream(new File(SYSTEMMETAFILEPATH));
102
       SystemMetadata systemMetadata = TypeMarshaller.unmarshalTypeFromFile(SystemMetadata.class, SYSTEMMETAUPDATEFILEPATH);
103
       InputStream emlInputStream = new FileInputStream(new File(EMLUPDATEFILEPATH));  
104
       /*obsoletes.add(id);
105
       obsoletes.add("tao");*/
106
       Identifier pid = new Identifier();
107
       pid.setValue(newId);
108
       solrIndex.update(pid, systemMetadata, emlInputStream);
109
       String result = doQuery(solrIndex.getSolrServer());
110
       assertTrue(result.contains("version1"));
111
       assertTrue(result.contains("version2"));
112
       
113
       // have to re-index the older version
114
       Identifier obsoletedPid = systemMetadata.getObsoletes();
115
       SystemMetadata obsoletedSystemMetadata = TypeMarshaller.unmarshalTypeFromFile(SystemMetadata.class, SYSTEMMETAFILEPATH);
116
       assertTrue(obsoletedSystemMetadata.getIdentifier().getValue().equals(obsoletedPid.getValue()));
117
       obsoletedSystemMetadata.setObsoletedBy(pid);
118
       InputStream obsoletedEmlInputStream = new FileInputStream(new File(EMLFILEPATH));  
119
       solrIndex.update(obsoletedPid, obsoletedSystemMetadata, obsoletedEmlInputStream);
120
       
121
       // old version should be marked as obsoleted and not returned
122
       result = doQuery(solrIndex.getSolrServer(), "&fq=-obsoletedBy:*");
123
       assertTrue(!result.contains("version1"));
124
       assertTrue(result.contains("version2"));
125
    }
126
    
127
    /**
128
     * Test building index for an insert.
129
     */
130
    @Test
131
    public void testArchive() throws Exception {
132
       SolrIndex solrIndex = generateSolrIndex();
133
       //InputStream systemInputStream = new FileInputStream(new File(SYSTEMMETAFILEPATH));
134
       //System metadata's archive is true.
135
       SystemMetadata systemMetadata = TypeMarshaller.unmarshalTypeFromFile(SystemMetadata.class, SYSTEMMETAARCHIVEFILEPATH);
136
       InputStream emlInputStream = new FileInputStream(new File(EMLUPDATEFILEPATH));    
137
       /*ArrayList<String> obsoletes = new ArrayList<String>();
138
       obsoletes.add(id);
139
       obsoletes.add("tao");*/
140
       Identifier pid = new Identifier();
141
       pid.setValue(newId);
142
       solrIndex.update(pid, systemMetadata, emlInputStream);
143
       String result = doQuery(solrIndex.getSolrServer());
144
       assertTrue(result.contains("version1"));
145
       assertTrue(!result.contains("version2"));
146
    }
147
    
148
    
149
    /**
150
     * Test building index for dynamic fields.
151
     */
152
    @Test
153
    public void testDynamicFields() throws Exception {
154
    	
155
       SystemMetadata systemMetadata = TypeMarshaller.unmarshalTypeFromFile(SystemMetadata.class, SYSTEMMETAFILEPATH);
156
       InputStream emlInputStream = new FileInputStream(new File(EMLFILEPATH)); 
157
       Identifier pid = new Identifier();
158
       pid.setValue(id);
159
       solrIndex.update(pid, systemMetadata, emlInputStream);
160
       String result = doQuery(solrIndex.getSolrServer());
161
       List<String> ids = solrIndex.getSolrIds();
162
       boolean foundId = false;
163
       for(String identifiers :ids) {
164
           if (id.equals(identifiers)) {
165
               foundId = true;
166
           }
167
       }
168
       assertTrue(foundId);
169
       assertTrue(result.contains("version1"));
170
       
171
       // augment with the dynamic field
172
       String fieldName = "test_count_i";
173
       Map<String, List<Object>> fields = new HashMap<String, List<Object>>();
174
       List<Object> values = new ArrayList<Object>();
175
       values.add(6);
176
       fields.put(fieldName, values);
177
       solrIndex.insertFields(pid, fields);
178
       result = doQuery(solrIndex.getSolrServer(), "&fq=" + fieldName + ":[0 TO 5]");
179
       assertFalse(result.contains(id));
180
       result = doQuery(solrIndex.getSolrServer(), "&fq=" + fieldName + ":[6 TO 6]");
181
       assertTrue(result.contains(id));
182
       
183
       // now update the value
184
       values.clear();
185
       values.add(7);
186
       fields.put(fieldName, values);
187
       solrIndex.insertFields(pid, fields);
188
       result = doQuery(solrIndex.getSolrServer(), "&fq=" + fieldName + ":[7 TO 7]");
189
       assertTrue(result.contains(id));
190
       
191
    }
192
    
193
    /**
194
     * Test building index for annotation using OpenAnnotation.
195
     */
196
    @Test
197
    public void testOpenAnnotation() throws Exception {
198
    	
199
       SystemMetadata systemMetadata = TypeMarshaller.unmarshalTypeFromFile(SystemMetadata.class, SYSTEMMETAFILEPATH);
200
       InputStream emlInputStream = new FileInputStream(new File(EMLFILEPATH)); 
201
       Identifier pid = new Identifier();
202
       pid.setValue(id);
203
       solrIndex.update(pid, systemMetadata, emlInputStream);
204
       String result = doQuery(solrIndex.getSolrServer());
205
       List<String> ids = solrIndex.getSolrIds();
206
       boolean foundId = false;
207
       for(String identifiers :ids) {
208
           if (id.equals(identifiers)) {
209
               foundId = true;
210
           }
211
       }
212
       assertTrue(foundId);
213
       assertTrue(result.contains("version1"));
214
       
215
       // augment with the dynamic field
216
       SystemMetadata annotationSystemMetadata = TypeMarshaller.unmarshalTypeFromFile(SystemMetadata.class, ANNOTATION_SYSTEM_META_FILE_PATH);
217
       InputStream annotationInputStream = new FileInputStream(new File(OA_FILE_PATH)); 
218
       Identifier annotationPid = new Identifier();
219
       annotationPid.setValue(annotation_id);
220
       solrIndex.update(annotationPid, annotationSystemMetadata, annotationInputStream);
221
       String annotationResult = doQuery(solrIndex.getSolrServer(), "&fq=standard_sm:\"http://ecoinformatics.org/oboe/oboe.1.0/oboe-standards.owl#Gram\"");
222
       assertTrue(annotationResult.contains(pid.getValue()));
223
       assertTrue(annotationResult.contains("http://ecoinformatics.org/oboe/oboe.1.0/oboe-standards.owl#Gram"));
224

    
225
       // check that it contains the creator annotation as well
226
       assertTrue(annotationResult.contains("creator_sm"));
227
       assertTrue(annotationResult.contains("http://sandbox-1.orcid.org/0000-0003-2141-4459"));
228

    
229
    }
230
    
231
    /**
232
     * Do query - with no additional params
233
     */
234
    public static String doQuery(SolrServer server)
235
                    throws SolrServerException {
236
    	return doQuery(server, null);
237
    }
238
    
239
    /**
240
     * Do query, allowing additional parameters
241
     */
242
    public static String doQuery(SolrServer server, String moreParams)
243
                    throws SolrServerException {
244
                StringBuffer request = new StringBuffer();
245
                request.append("q=" + "*:*");
246
                if (moreParams != null) {
247
                    request.append(moreParams);
248
                }
249
                SolrParams solrParams = SolrRequestParsers.parseQueryString(request
250
                        .toString());
251
                QueryResponse reponse = server.query(solrParams);
252
                String result = toXML(solrParams, reponse);
253
                System.out.println("**************************************************************************");
254
                System.out.println("The query result:\n");
255
                System.out.println(result);
256
                System.out.println("**************************************************************************");
257
                return result;
258
    }
259
    
260
    /**
261
     * Transform the query response to the xml format.
262
     */
263
    private static String toXML(SolrParams request, QueryResponse response) {
264
        XMLResponseWriter xmlWriter = new XMLResponseWriter();
265
        Writer w = new StringWriter();
266
        SolrQueryResponse sResponse = new SolrQueryResponse();
267
        sResponse.setAllValues(response.getResponse());
268
        try {
269
            SolrCore core = null;
270
            CoreContainer container = SolrServerFactory.getCoreContainer();
271
            core = container.getCore("collection1");
272
            xmlWriter.write(w, new LocalSolrQueryRequest(core, request), sResponse);
273
        } catch (Exception e) {
274
            throw new RuntimeException("Unable to convert Solr response into XML", e);
275
        }
276
        return w.toString();
277
    }
278

    
279

    
280
    
281
    
282
}
283

    
(4-4/5)