package net.jxta.impl.cm.bdb;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.Map;
import java.util.Set;
import java.util.logging.Logger;
import net.jxta.document.Advertisement;
import net.jxta.document.AdvertisementFactory;
import net.jxta.document.MimeMediaType;
import net.jxta.document.StructuredDocumentFactory;
import net.jxta.document.XMLDocument;
import net.jxta.impl.cm.CacheUtils;
import net.jxta.logging.Logging;
import com.sleepycat.je.DatabaseEntry;
import com.sleepycat.je.DatabaseException;
import com.sleepycat.je.SecondaryDatabase;
import com.sleepycat.je.SecondaryMultiKeyCreator;
/**
* Generates search keys against {@link AdvertisementDbRecord} if the record
* is an advertisement, making it possible to search based on the indexable
* fields of that advertisement.
*/
public class AdvertisementIndexableKeyCreator implements SecondaryMultiKeyCreator {
private static final Logger LOG = Logger.getLogger(AdvertisementIndexableKeyCreator.class.getName());
private AdvertisementKeyTupleBinding keyBinding = new AdvertisementKeyTupleBinding();
private AdvertisementDbRecordTupleBinding binding = new AdvertisementDbRecordTupleBinding();
public void createSecondaryKeys(SecondaryDatabase secondary,
DatabaseEntry key, DatabaseEntry data, Set<DatabaseEntry> results)
throws DatabaseException {
AdvertisementKey advKey = keyBinding.entryToObject(key);
String areaName = advKey.getAreaName();
String directoryName = advKey.getDirectoryName();
AdvertisementDbRecord record = binding.entryToObject(data);
if(!record.isAdvertisement) {
// we do not create any secondary keys for raw binary data that is cached
return;
}
try {
XMLDocument<?> asDoc = (XMLDocument<?>) StructuredDocumentFactory.newStructuredDocument(MimeMediaType.XMLUTF8, new ByteArrayInputStream(record.getData()));
Advertisement adv = AdvertisementFactory.newAdvertisement(asDoc);
Map<String, String> indexfields = CacheUtils.getIndexfields(adv.getIndexFields(), asDoc);
for(String indexField : indexfields.keySet()) {
AttributeSearchKey newSearchKey = new AttributeSearchKey(areaName, directoryName, indexField, indexfields.get(indexField));
results.add(newSearchKey.toDatabaseEntry());
}
} catch(IOException e) {
Logging.logCheckedSevere(LOG, "Unable to parse XML for advertisement that is being added to the DB!\n", e);
}
}
}