/*
* Copyright (C) 2010 eXo Platform SAS.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.exoplatform.services.jcr.impl.core.query.lucene;
import junit.framework.TestCase;
import org.apache.lucene.document.AbstractField;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.Field.Index;
import org.apache.lucene.document.Field.Store;
import org.apache.lucene.document.Field.TermVector;
import org.apache.lucene.document.Fieldable;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.UUID;
/**
* @author <a href="mailto:nicolas.filotto@exoplatform.com">Nicolas Filotto</a>
* @version $Id$
*/
public class TestChangesHolder extends TestCase
{
public void testSerNDeserializeDocs() throws Exception
{
//System.out.println("### testSerNDeserializeDocs ###");
Collection<Document> add = new ArrayList<Document>(3);
Document doc = new Document();
doc.setBoost(2.0f);
Field fieldFull =
new Field("full", "full-value", Store.YES, Index.ANALYZED_NO_NORMS, TermVector.WITH_POSITIONS_OFFSETS);
fieldFull.setBoost(2.0f);
fieldFull.setOmitTermFreqAndPositions(true);
doc.add(fieldFull);
Field fieldEmpty = new Field("empty", "empty-value", Store.NO, Index.NOT_ANALYZED, TermVector.NO);
doc.add(fieldEmpty);
add.add(doc);
doc = new Document();
doc.add(fieldFull);
add.add(doc);
doc = new Document();
doc.add(fieldEmpty);
add.add(doc);
ByteArrayOutputStream baos = null;
int total = 100000;
long start;
Collection<String> remove = Collections.emptyList();
Collection<Document> addResult = null;
start = System.currentTimeMillis();
for (int i = 0; i < total; i++)
{
baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(new ChangesHolder(remove, add));
oos.close();
}
//System.out.println("Custom serialization: total time = " + (System.currentTimeMillis() - start) + ", size = " + baos.size());
start = System.currentTimeMillis();
for (int i = 0; i < total; i++)
{
ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(baos.toByteArray()));
addResult = ((ChangesHolder)ois.readObject()).getAdd();
ois.close();
}
//System.out.println("Custom deserialization: total time = " + (System.currentTimeMillis() - start));
checkDocs(addResult);
start = System.currentTimeMillis();
for (int i = 0; i < total; i++)
{
baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(add);
oos.close();
}
//System.out.println("Native serialization: total time = " + (System.currentTimeMillis() - start) + ", size = " + baos.size());
start = System.currentTimeMillis();
for (int i = 0; i < total; i++)
{
ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(baos.toByteArray()));
addResult = (Collection<Document>)ois.readObject();
ois.close();
}
//System.out.println("Native deserialization: total time = " + (System.currentTimeMillis() - start));
checkDocs(addResult);
}
private void checkDocs(Collection<Document> addResult)
{
assertNotNull(addResult);
assertEquals(3, addResult.size());
Iterator<Document> it = addResult.iterator();
Document doc = it.next();
assertEquals(2.0f, doc.getBoost());
List<Fieldable> fields = doc.getFields();
assertNotNull(fields);
assertEquals(2, fields.size());
checkFieldFull(fields.get(0));
checkFieldEmpty(fields.get(1));
doc = it.next();
assertEquals(1.0f, doc.getBoost());
fields = doc.getFields();
assertNotNull(fields);
assertEquals(1, fields.size());
checkFieldFull(fields.get(0));
doc = it.next();
assertEquals(1.0f, doc.getBoost());
fields = doc.getFields();
assertNotNull(fields);
assertEquals(1, fields.size());
checkFieldEmpty(fields.get(0));
}
private void checkFieldFull(Fieldable field)
{
assertEquals("full", field.name());
assertEquals("full-value", field.stringValue());
assertTrue(field.isStored());
assertTrue(field.isIndexed());
assertTrue(field.isTokenized());
assertTrue(field.getOmitNorms());
assertTrue(field.isTermVectorStored());
assertTrue(field.isStoreOffsetWithTermVector());
assertTrue(field.isStorePositionWithTermVector());
if (field instanceof AbstractField)
{
assertTrue(((AbstractField)field).getOmitTermFreqAndPositions());
}
assertFalse(field.isBinary());
assertFalse(field.isLazy());
assertEquals(2.0f, field.getBoost());
assertEquals(0, field.getBinaryLength());
assertEquals(0, field.getBinaryOffset());
}
private void checkFieldEmpty(Fieldable field)
{
assertEquals("empty", field.name());
assertEquals("empty-value", field.stringValue());
assertFalse(field.isStored());
assertTrue(field.isIndexed());
assertFalse(field.isTokenized());
assertFalse(field.getOmitNorms());
assertFalse(field.isTermVectorStored());
assertFalse(field.isStoreOffsetWithTermVector());
assertFalse(field.isStorePositionWithTermVector());
if (field instanceof AbstractField)
{
assertFalse(((AbstractField)field).getOmitTermFreqAndPositions());
}
assertFalse(field.isBinary());
assertFalse(field.isLazy());
assertEquals(1.0f, field.getBoost());
assertEquals(0, field.getBinaryLength());
assertEquals(0, field.getBinaryOffset());
}
public void testSerNDeserializeIds() throws Exception
{
//System.out.println("### testSerNDeserializeIds ###");
Collection<String> remove = new ArrayList<String>(3);
remove.add(UUID.randomUUID().toString());
remove.add(UUID.randomUUID().toString());
remove.add(UUID.randomUUID().toString());
ByteArrayOutputStream baos = null;
int total = 100000;
long start;
Collection<Document> add = Collections.emptyList();
Collection<String> addResult = null;
start = System.currentTimeMillis();
for (int i = 0; i < total; i++)
{
baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(new ChangesHolder(remove, add));
oos.close();
}
//System.out.println("Custom serialization: total time = " + (System.currentTimeMillis() - start) + ", size = " + baos.size());
start = System.currentTimeMillis();
for (int i = 0; i < total; i++)
{
ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(baos.toByteArray()));
addResult = ((ChangesHolder)ois.readObject()).getRemove();
ois.close();
}
//System.out.println("Custom deserialization: total time = " + (System.currentTimeMillis() - start));
checkIds(remove, addResult);
start = System.currentTimeMillis();
for (int i = 0; i < total; i++)
{
baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(remove);
oos.close();
}
//System.out.println("Native serialization: total time = " + (System.currentTimeMillis() - start) + ", size = " + baos.size());
start = System.currentTimeMillis();
for (int i = 0; i < total; i++)
{
ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(baos.toByteArray()));
addResult = (Collection<String>)ois.readObject();
ois.close();
}
//System.out.println("Native deserialization: total time = " + (System.currentTimeMillis() - start));
checkIds(remove, addResult);
}
private void checkIds(Collection<String> remove, Collection<String> addResult)
{
assertNotNull(addResult);
assertEquals(remove.size(), addResult.size());
Iterator<String> it1 = remove.iterator();
Iterator<String> it2 = addResult.iterator();
while (it1.hasNext())
{
assertEquals(it1.next(), it2.next());
}
}
}