~krause/annis/vers3

« back to all changes in this revision

Viewing changes to annis-service-impl/src/main/java/annis/service/internal/AnnisWebService.java

  • Committer: Benjamin Weißenfels
  • Date: 2012-05-21 16:39:25 UTC
  • mfrom: (861.1.22 lazytable)
  • Revision ID: b.pixeldrama@googlemail.com-20120521163925-w9pce6rylfaqv8tg
Add find to rest api.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
 
1
2
/*
2
3
 * Copyright 2012 SFB 632.
3
4
 *
18
19
import static java.util.Arrays.asList;
19
20
import annis.WekaHelper;
20
21
import annis.dao.AnnisDao;
 
22
import annis.dao.Match;
21
23
import annis.ql.parser.QueryData;
22
24
import annis.resolver.ResolverEntry;
23
25
import annis.resolver.SingleResolverRequest;
24
26
import annis.service.objects.AnnisCorpus;
25
27
import annis.service.objects.CorpusConfig;
26
 
import annis.sqlgen.AnnotateSqlGenerator.AnnotateQueryData;
 
28
import annis.sqlgen.AnnotateQueryData;
 
29
import annis.sqlgen.LimitOffsetQueryData;
27
30
import de.hu_berlin.german.korpling.saltnpepper.salt.saltCommon.SaltProject;
28
31
import java.io.IOException;
29
32
import java.util.Arrays;
39
42
import javax.ws.rs.WebApplicationException;
40
43
import javax.ws.rs.core.MediaType;
41
44
import javax.ws.rs.core.Response;
42
 
import javax.xml.bind.annotation.XmlElementWrapper;
43
45
 
44
46
import org.apache.log4j.Logger;
45
47
import org.springframework.stereotype.Component;
63
65
  /**
64
66
   * Log the successful initialization of this bean.
65
67
   *
66
 
   * <p>
67
 
   * XXX: This should be a private method annotated with <tt>@PostConstruct</tt>, but
68
 
   * that doesn't seem to work.  As a work-around, the method is called
69
 
   * by Spring as an init-method.
 
68
   * <p> XXX: This should be a private method annotated with
 
69
   * <tt>@PostConstruct</tt>, but that doesn't seem to work. As a work-around,
 
70
   * the method is called by Spring as an init-method.
70
71
   */
71
72
  public void sayHello()
72
73
  {
152
153
        "text/plain").entity("one ore more corpora are unknown to the system").
153
154
        build());
154
155
    }
155
 
    
 
156
 
156
157
    String logParameters = createAnnotateLogParameters(left, right, offset,
157
 
        limit);
158
 
    
 
158
      limit);
 
159
 
159
160
    QueryData data = annisDao.parseAQL(query, corpusIDs);
160
 
    data.addExtension(new AnnotateQueryData(offset, limit, left,
161
 
      right));
 
161
    data.addExtension(new LimitOffsetQueryData(offset, limit));
 
162
    data.addExtension(new AnnotateQueryData(left, right));
162
163
    long start = new Date().getTime();
163
164
    SaltProject p = annisDao.annotate(data);
164
165
    long end = new Date().getTime();
168
169
  }
169
170
 
170
171
  @GET
 
172
  @Path("search/find")
 
173
  @Produces("application/xml")
 
174
  public List<Match> find(@QueryParam("q") String query,
 
175
    @QueryParam("corpora") String rawCorpusNames,
 
176
    @DefaultValue("0") @QueryParam("offset") String offsetRaw,
 
177
    @DefaultValue("10") @QueryParam("limit") String limitRaw) throws IOException
 
178
  {
 
179
    if (query == null)
 
180
    {
 
181
      throw new WebApplicationException(
 
182
        Response.status(Response.Status.BAD_REQUEST).type(
 
183
        MediaType.TEXT_PLAIN).entity(
 
184
        "missing required parameter 'q'").build());
 
185
    }
 
186
    if (rawCorpusNames == null)
 
187
    {
 
188
      throw new WebApplicationException(
 
189
        Response.status(Response.Status.BAD_REQUEST).type(
 
190
        MediaType.TEXT_PLAIN).entity(
 
191
        "missing required parameter 'corpora'").build());
 
192
    }
 
193
 
 
194
    int offset = Integer.parseInt(offsetRaw);
 
195
    int limit = Integer.parseInt(limitRaw);
 
196
 
 
197
    List<String> corpusNames = Arrays.asList(rawCorpusNames.split(","));
 
198
    List<Long> corpusIDs = annisDao.listCorpusByName(
 
199
      corpusNames);
 
200
    if (corpusIDs.size() != corpusNames.size())
 
201
    {
 
202
      throw new WebApplicationException(
 
203
        Response.status(Response.Status.NOT_FOUND).type(
 
204
        "text/plain").entity("one ore more corpora are unknown to the system").
 
205
        build());
 
206
    }
 
207
 
 
208
    QueryData data = annisDao.parseAQL(query, corpusIDs);
 
209
    data.setCorpusConfiguration(annisDao.getCorpusConfiguration());
 
210
    data.addExtension(new LimitOffsetQueryData(offset, limit));
 
211
    return annisDao.find(data);
 
212
  }
 
213
 
 
214
  @GET
171
215
  @Path("graphs/{top}/{doc}")
172
216
  @Produces("application/xml")
173
217
  public SaltProject graph(@PathParam("top") String toplevelCorpusName,
185
229
    catch (Exception ex)
186
230
    {
187
231
      log.error("error when accessing graph " + toplevelCorpusName + "/"
188
 
          + documentName, ex);
 
232
        + documentName, ex);
189
233
      throw new WebApplicationException(ex);
190
234
    }
191
235
  }
192
 
  
 
236
 
193
237
  @GET
194
238
  @Path("resolver/{corpusName}/{namespace}/{type}")
195
 
  public List<ResolverEntry> resolver(@PathParam("corpusName") String corpusName, 
196
 
    @PathParam("namespace") String namespace, 
 
239
  public List<ResolverEntry> resolver(@PathParam("corpusName") String corpusName,
 
240
    @PathParam("namespace") String namespace,
197
241
    @PathParam("type") String type)
198
242
  {
199
243
    ResolverEntry.ElementType enumType = ResolverEntry.ElementType.valueOf(type);
201
245
      enumType);
202
246
    return annisDao.getResolverEntries(r);
203
247
  }
204
 
  
 
248
 
205
249
  @GET
206
250
  @Path("corpora")
207
251
  public List<AnnisCorpus> corpora()
208
252
  {
209
253
    return annisDao.listCorpora();
210
254
  }
211
 
  
 
255
 
212
256
  @GET
213
257
  @Path("corpora/{top}/config")
214
258
  public CorpusConfig corpusconfig(@PathParam("top") String toplevelName)
220
264
  }
221
265
 
222
266
  private String createAnnotateLogParameters(int left, int right, int offset,
223
 
      int limit)
 
267
    int limit)
224
268
  {
225
269
    StringBuilder sb = new StringBuilder();
226
270
    sb.append("left: ");
239
283
  }
240
284
 
241
285
  private void logQuery(String queryFunction, String toplevelCorpus,
242
 
      String documentName, long runtime)
 
286
    String documentName, long runtime)
243
287
  {
244
288
    logQuery(queryFunction, null, asList(toplevelCorpus), runtime, "document: "
245
 
        + documentName);
 
289
      + documentName);
246
290
  }
247
291
 
248
292
  private void logQuery(String queryFunction, String annisQuery,
249
 
      List<String> corpusNames, long runtime)
 
293
    List<String> corpusNames, long runtime)
250
294
  {
251
295
    logQuery(queryFunction, annisQuery, corpusNames, runtime, null);
252
296
  }
253
297
 
254
298
  private void logQuery(String queryFunction, String annisQuery,
255
 
      List<String> corpusNames, long runtime, String options)
 
299
    List<String> corpusNames, long runtime, String options)
256
300
  {
257
301
    StringBuilder sb = new StringBuilder();
258
302
    sb.append("function: ");
259
303
    sb.append(queryFunction);
260
304
    sb.append(", ");
261
 
    if (annisQuery != null && ! annisQuery.isEmpty())
 
305
    if (annisQuery != null && !annisQuery.isEmpty())
262
306
    {
263
307
      sb.append("query: ");
264
308
      sb.append(annisQuery);