/*
* Copyright 2007 T-Rank AS
*
* Licensed 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 no.trank.openpipe.solr;
import java.io.Writer;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.xml.stream.XMLEventFactory;
import javax.xml.stream.XMLEventWriter;
import javax.xml.stream.XMLOutputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.events.Attribute;
import javax.xml.stream.events.Characters;
import javax.xml.stream.events.EndElement;
import javax.xml.stream.events.StartElement;
import javax.xml.stream.events.XMLEvent;
/**
* @version $Revision$
*/
public class SolrXmlDocumentWriter {
private static final String TAG_DOC = "doc";
private static final String TAG_FIELD = "field";
private final XMLEventWriter writer;
private final XMLEventFactory factory;
private final Writer out;
private final boolean pretty;
private final Characters newLine;
private final StartElement idStart;
private final EndElement idEnd;
private final StartElement docStart;
private final EndElement docEnd;
private final StartElement addStart;
private final EndElement addEnd;
private final EndElement delEnd;
private final EndElement fieldEnd;
private final StartElement delStart;
private final StartElement commStart;
private final EndElement commEnd;
private final StartElement optStart;
private final EndElement optEnd;
private final Characters newLineInd;
public SolrXmlDocumentWriter(Writer out, UpdateOptions options) throws XMLStreamException {
this(out, options, false);
}
public SolrXmlDocumentWriter(Writer out, UpdateOptions options, boolean pretty) throws XMLStreamException {
this.out = out;
this.pretty = pretty;
factory = XMLEventFactory.newInstance();
writer = XMLOutputFactory.newInstance().createXMLEventWriter(out);
newLine = factory.createCharacters("\n");
newLineInd = factory.createCharacters("\n ");
idStart = factory.createStartElement("", null, "id");
idEnd = factory.createEndElement("", null, "id");
docStart = factory.createStartElement("", null, TAG_DOC);
docEnd = factory.createEndElement("", null, TAG_DOC);
addStart = factory.createStartElement("", null, "add", options.createAddAttributes(factory), null);
addEnd = factory.createEndElement("", null, "add");
delStart = factory.createStartElement("", null, "delete", options.createDelAttributes(factory), null);
delEnd = factory.createEndElement("", null, "delete");
fieldEnd = factory.createEndElement("",null, TAG_FIELD);
commStart = factory.createStartElement("", null, "commit", options.createCOAttributes(factory), null);
commEnd = factory.createEndElement("", null, "commit");
optStart = factory.createStartElement("", null, "optimize", options.createCOAttributes(factory), null);
optEnd = factory.createEndElement("", null, "optimize");
}
public void startDoc(Map<String,String> attributes) throws XMLStreamException {
if (pretty) {
writer.add(newLine);
}
if (attributes.isEmpty()) {
writer.add(docStart);
} else {
final List<Attribute> attribs = new ArrayList<Attribute>(attributes.size());
for (Map.Entry<String,String> e : attributes.entrySet()) {
attribs.add(factory.createAttribute(e.getKey(), e.getValue()));
}
writer.add(factory.createStartElement("", null, TAG_DOC, attribs.iterator(), null));
}
}
public void endDoc() throws XMLStreamException {
if (pretty) {
writer.add(newLine);
}
writer.add(docEnd);
}
public void writeField(final String fieldName, String fieldContent) throws XMLStreamException {
Iterator<?> attributes = Arrays.asList(factory.createAttribute("name", fieldName)).iterator();
if (pretty) {
writer.add(newLineInd);
}
writer.add(factory.createStartElement("", null, TAG_FIELD, attributes, null));
writer.add(factory.createCharacters(fieldContent));
writer.add(fieldEnd);
}
public void startAdd() throws XMLStreamException {
if (pretty) {
writer.add(newLine);
}
writer.add(addStart);
}
public void endAdd() throws XMLStreamException {
if (pretty) {
writer.add(newLine);
}
writer.add(addEnd);
}
private void delete(XMLEvent... deleteBodyElements) throws XMLStreamException {
if (pretty) {
writer.add(newLine);
}
writer.add(delStart);
for (XMLEvent deleteBodyElement : deleteBodyElements) {
writer.add(deleteBodyElement);
}
writer.add(delEnd);
}
public void deleteById(String id) throws XMLStreamException {
delete(idStart, factory.createCharacters(id), idEnd);
}
public void deleteById(List<String> ids) throws XMLStreamException {
final XMLEvent[] deleteEvents = new XMLEvent[ids.size() * 3];
int eventIdx = 0;
for (String id : ids) {
deleteEvents[eventIdx++] = idStart;
deleteEvents[eventIdx++] = factory.createCharacters(id);
deleteEvents[eventIdx++] = idEnd;
}
delete(deleteEvents);
}
public void deleteByQuery(String query) throws XMLStreamException {
delete(factory.createStartElement("", null, "query"), factory.createCharacters(query),
factory.createEndElement("", null, "query"));
}
public void commit() throws XMLStreamException {
if (pretty) {
writer.add(newLine);
}
writer.add(commStart);
writer.add(commEnd);
}
public void optimize() throws XMLStreamException {
if (pretty) {
writer.add(newLine);
}
writer.add(optStart);
writer.add(optEnd);
}
public void close() throws XMLStreamException {
writer.close();
try {
out.close();
} catch (Exception e) {
// Do nothing
}
}
}