blob: 024a8653cf71316911c45f731736cdae0b67b5cf [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.accumulo.examples.wikisearch.query;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringReader;
import java.io.StringWriter;
import java.net.MalformedURLException;
import java.net.URL;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.annotation.Resource;
import javax.ejb.EJBException;
import javax.ejb.Local;
import javax.ejb.Stateless;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.transform.Templates;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import org.apache.accumulo.core.client.Connector;
import org.apache.accumulo.core.client.Instance;
import org.apache.accumulo.core.client.ZooKeeperInstance;
import org.apache.accumulo.examples.wikisearch.logic.ContentLogic;
import org.apache.accumulo.examples.wikisearch.logic.QueryLogic;
import org.apache.accumulo.examples.wikisearch.sample.Results;
import org.apache.log4j.Logger;
@Stateless
@Local(IQuery.class)
public class Query implements IQuery {
private static final Logger log = Logger.getLogger(Query.class);
// Inject values from XML configuration file
@Resource(name = "instanceName")
private String instanceName;
@Resource(name = "zooKeepers")
private String zooKeepers;
@Resource(name = "username")
private String username;
@Resource(name = "password")
private String password;
@Resource(name = "tableName")
private String tableName;
@Resource(name = "threads")
private int threads;
private static final String XSL = "/accumulo-wikisearch/style.xsl";
@PostConstruct
public void init() {
log.info("Post Construct");
}
@PreDestroy
public void close() {
log.info("Close called.");
}
/*
* (non-Javadoc)
*
* @see sample.query.IQuery#html(java.lang.String, java.lang.String)
*/
public String html(String query, String auths) {
log.info("HTML query: " + query);
URL u;
try {
u = new URL("http://" + System.getProperty("jboss.bind.address") + ":" + System.getProperty("jboss.web.http.port") + XSL);
} catch (MalformedURLException e1) {
throw new EJBException("Unable to load XSL stylesheet", e1);
}
InputStream xslContent;
try {
xslContent = u.openStream();
} catch (IOException e1) {
throw new EJBException("Unable to get xsl content", e1);
}
StringWriter xml = new StringWriter();
StringWriter html = new StringWriter();
Results results = query(query, auths);
try {
// Marshall the query results object
JAXBContext ctx = JAXBContext.newInstance(Results.class);
Marshaller m = ctx.createMarshaller();
m.marshal(results, xml);
// Perform XSL transform on the xml.
StringReader reader = new StringReader(xml.toString());
TransformerFactory tf = TransformerFactory.newInstance();
// Create the transformer from the xsl
Templates xsl = tf.newTemplates(new StreamSource(xslContent));
Transformer t = xsl.newTransformer();
t.transform(new StreamSource(reader), new StreamResult(html));
} catch (Exception e) {
throw new EJBException("Error processing query results", e);
} finally {
try {
xslContent.close();
} catch (IOException e) {
throw new EJBException("Unable to close input stream", e);
}
}
return html.toString();
}
/*
* (non-Javadoc)
*
* @see sample.query.IQuery#xml(java.lang.String, java.lang.String)
*/
public Results xml(String query, String auths) {
log.info("XML query: " + query);
return query(query, auths);
}
/*
* (non-Javadoc)
*
* @see sample.query.IQuery#json(java.lang.String, java.lang.String)
*/
public Results json(String query, String auths) {
log.info("JSON query: " + query);
return query(query, auths);
}
/*
* (non-Javadoc)
*
* @see sample.query.IQuery#yaml(java.lang.String, java.lang.String)
*/
public Results yaml(String query, String auths) {
log.info("YAML query: " + query);
return query(query, auths);
}
/*
* (non-Javadoc)
*
* @see sample.query.IQuery#content(java.lang.String, java.lang.String)
*/
public Results content(String query, String auths) {
log.info("Content query: " + query);
Connector connector = null;
if (null == instanceName || null == zooKeepers || null == username || null == password)
throw new EJBException("Required parameters not set. [instanceName = " + this.instanceName + ", zookeepers = " + this.zooKeepers + ", username = "
+ this.username + (password==null?", password = null":"") + "]. Check values in ejb-jar.xml");
Instance instance = new ZooKeeperInstance(this.instanceName, this.zooKeepers);
try {
log.info("Connecting to [instanceName = " + this.instanceName + ", zookeepers = " + this.zooKeepers + ", username = " + this.username + "].");
connector = instance.getConnector(this.username, this.password.getBytes());
} catch (Exception e) {
throw new EJBException("Error getting connector from instance", e);
}
// Create list of auths
List<String> authorizations = new ArrayList<String>();
if (auths != null && auths.length() > 0)
for (String a : auths.split(","))
authorizations.add(a);
ContentLogic table = new ContentLogic();
table.setTableName(tableName);
return table.runQuery(connector, query, authorizations);
}
/**
* calls the query logic with the parameters, returns results
*
* @param query
* @param auths
* @return The results of a query
* @throws ParseException
*/
public Results query(String query, String auths) {
Connector connector = null;
if (null == instanceName || null == zooKeepers || null == username || null == password)
throw new EJBException("Required parameters not set. [instanceName = " + this.instanceName + ", zookeepers = " + this.zooKeepers + ", username = "
+ this.username + (password==null?", password = null":"") + "]. Check values in ejb-jar.xml");
Instance instance = new ZooKeeperInstance(this.instanceName, this.zooKeepers);
try {
log.info("Connecting to [instanceName = " + this.instanceName + ", zookeepers = " + this.zooKeepers + ", username = " + this.username + "].");
connector = instance.getConnector(this.username, this.password.getBytes());
} catch (Exception e) {
throw new EJBException("Error getting connector from instance", e);
}
// Create list of auths
List<String> authorizations = new ArrayList<String>();
if (auths != null && auths.length() > 0)
for (String a : auths.split(","))
authorizations.add(a);
QueryLogic table = new QueryLogic();
table.setTableName(tableName);
table.setMetadataTableName(tableName + "Metadata");
table.setIndexTableName(tableName + "Index");
table.setReverseIndexTableName(tableName + "ReverseIndex");
table.setQueryThreads(threads);
table.setUnevaluatedFields("TEXT");
table.setUseReadAheadIterator(false);
return table.runQuery(connector, authorizations, query, null, null, null);
}
}