/*
* JBoss, Home of Professional Open Source
* Copyright 2010 Red Hat Inc. and/or its affiliates and other
* contributors as indicated by the @author tags. All rights reserved.
* See the copyright.txt in the distribution for a full listing of
* individual contributors.
*
* 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.infinispan.lucene;
import java.util.regex.Pattern;
import org.infinispan.loaders.jdbc.stringbased.JdbcStringBasedCacheStoreConfig;
import org.infinispan.loaders.keymappers.TwoWayKey2StringMapper;
/**
* To configure a JdbcStringBasedCacheStoreConfig for the Lucene Directory, use this
* Key2StringMapper implementation.
*
* @see JdbcStringBasedCacheStoreConfig#setKey2StringMapperClass(String)
*
* @author Sanne Grinovero
* @since 4.1
*/
@SuppressWarnings("unchecked")
public class LuceneKey2StringMapper implements TwoWayKey2StringMapper {
/**
* The pipe character was chosen as it's illegal to have a pipe in a filename, so we only have to
* check for the indexnames.
*/
static final Pattern singlePipePattern = Pattern.compile("\\|");
@Override
public boolean isSupportedType(Class<?> keyType) {
return (keyType == ChunkCacheKey.class ||
keyType == FileCacheKey.class ||
keyType == FileListCacheKey.class ||
keyType == FileReadLockKey.class);
}
@Override
public String getStringMapping(Object key) {
return key.toString();
}
/**
* This method has to perform the inverse transformation of the keys used in the Lucene
* Directory from String to object. So this implementation is strongly coupled to the
* toString method of each key type.
*
* @see ChunkCacheKey#toString()
* @see FileCacheKey#toString()
* @see FileListCacheKey#toString()
* @see FileReadLockKey#toString()
*/
@Override
public Object getKeyMapping(String key) {
if (key == null) {
throw new IllegalArgumentException("Not supporting null keys");
}
// ChunkCacheKey: fileName + "|" + chunkId + "|" + indexName;
// FileCacheKey : fileName + "|M|"+ indexName;
// FileListCacheKey : "*|" + indexName;
// FileReadLockKey : fileName + "|RL|"+ indexName;
if (key.startsWith("*|")) {
return new FileListCacheKey(key.substring(2));
} else {
String[] split = singlePipePattern.split(key);
if (split.length != 3) {
throw new IllegalArgumentException("Unexpected format of key in String form: " + key);
} else {
if ("M".equals(split[1])) {
return new FileCacheKey(split[2], split[0]);
} else if ("RL".equals(split[1])) {
return new FileReadLockKey(split[2], split[0]);
} else {
try {
int parsedInt = Integer.parseInt(split[1]);
return new ChunkCacheKey(split[2], split[0], parsedInt);
} catch (NumberFormatException nfe) {
throw new IllegalArgumentException("Unexpected format of key in String form: " + key, nfe);
}
}
}
}
}
}