/* * MimirIndexingPR.java * * Copyright (c) 2007-2011, The University of Sheffield. * * This file is part of GATE Mímir (see http://gate.ac.uk/family/mimir.html), * and is free software, licenced under the GNU Lesser General Public License, * Version 3, June 2007 (also included with this distribution as file * LICENCE-LGPL3.html). * * Valentin Tablan, 01 Dec 2011 * * $Id$ */ package gate.mimir.index; import gate.creole.AbstractLanguageAnalyser; import gate.creole.ExecutionException; import gate.creole.metadata.CreoleParameter; import gate.creole.metadata.CreoleResource; import gate.creole.metadata.Optional; import gate.creole.metadata.RunTime; import gate.mimir.tool.WebUtils; import gate.util.GateRuntimeException; import org.apache.log4j.Logger; import java.net.URL; /** * A simple PR for sending documents to a Mímir index. */ @CreoleResource(comment="A PR that sends documents to a Mímir server for indexing.", name="Mímir Indexing PR") public class MimirIndexingPR extends AbstractLanguageAnalyser { private static final long serialVersionUID = 3291873032301133998L; private static final Logger log = Logger.getLogger(MimirIndexingPR.class); private URL mimirIndexUrl; private String mimirUsername; private String mimirPassword; private Integer connectionInterval; protected MimirConnector mimirConnector; public URL getMimirIndexUrl() { return mimirIndexUrl; } @CreoleParameter (comment="The Index URL, as obtained from the Mímir Server.") @RunTime public void setMimirIndexUrl(URL mimirIndexUrl) { this.mimirIndexUrl = mimirIndexUrl; } public String getMimirUsername() { return mimirUsername; } @CreoleParameter(comment="Username for authenticating to the Mímir server. Leave empty if no authentication is required.") @Optional @RunTime public void setMimirUsername(String mimirUsername) { this.mimirUsername = mimirUsername; closeConnector(); } public String getMimirPassword() { return mimirPassword; } @CreoleParameter(comment="Password for authenticating to the Mímir server. Leave empty if no authentication is required.") @Optional @RunTime public void setMimirPassword(String mimirPassword) { this.mimirPassword = mimirPassword; closeConnector(); } public Integer getConnectionInterval() { return connectionInterval; } @CreoleParameter(comment="Interval between connections to the Mímir server. -1 causes each document " + "to be sent immediately, positive values cause documents to be buffered and sent to the server in " + "batches, which is generally much more efficient, particularly when the documents are short.", defaultValue = "1000") @Optional @RunTime public void setConnectionInterval(Integer connectionInterval) { this.connectionInterval = connectionInterval; closeConnector(); } @Override public void cleanup() { closeConnector(); } protected void closeConnector() { if(mimirConnector != null) { try { mimirConnector.close(); } catch(Exception e) { log.warn("Execption while closing Mímir connector", e); } } mimirConnector = null; } @Override public void execute() throws ExecutionException { try { if(mimirConnector == null) { // first run or config has changed: [re-]create if(mimirUsername != null && mimirUsername.length() > 0) { mimirConnector = new MimirConnector(mimirIndexUrl, new WebUtils(mimirUsername, mimirPassword)); } else { mimirConnector = new MimirConnector(mimirIndexUrl); } if(connectionInterval != null) { mimirConnector.setConnectionInterval(connectionInterval.intValue()); } } mimirConnector.sendToMimir(getDocument(), null); } catch(Exception e) { throw new ExecutionException( "Error communicating with the Mímir server", e); } } }