/**
* Copyright 2012 Anjuke Inc.
*
* 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 com.anjuke.romar.core;
import java.io.FileInputStream;
import java.io.InputStream;
import org.apache.mahout.cf.taste.impl.neighborhood.NearestNUserNeighborhood;
import org.apache.mahout.cf.taste.impl.neighborhood.ThresholdUserNeighborhood;
import org.apache.mahout.cf.taste.impl.recommender.ItemAverageRecommender;
import org.apache.mahout.cf.taste.impl.recommender.ItemUserAverageRecommender;
import org.apache.mahout.cf.taste.impl.recommender.slopeone.SlopeOneRecommender;
import org.apache.mahout.cf.taste.impl.similarity.CityBlockSimilarity;
import org.apache.mahout.cf.taste.impl.similarity.EuclideanDistanceSimilarity;
import org.apache.mahout.cf.taste.impl.similarity.LogLikelihoodSimilarity;
import org.apache.mahout.cf.taste.impl.similarity.PearsonCorrelationSimilarity;
import org.apache.mahout.cf.taste.impl.similarity.SpearmanCorrelationSimilarity;
import org.apache.mahout.cf.taste.impl.similarity.TanimotoCoefficientSimilarity;
import org.apache.mahout.cf.taste.impl.similarity.UncenteredCosineSimilarity;
import org.apache.mahout.cf.taste.neighborhood.UserNeighborhood;
import org.apache.mahout.cf.taste.recommender.Recommender;
import org.apache.mahout.cf.taste.similarity.ItemSimilarity;
import org.apache.mahout.cf.taste.similarity.UserSimilarity;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.yaml.snakeyaml.Yaml;
import com.anjuke.romar.mahout.factory.MahoutServiceCommonRecommendFactory;
import com.anjuke.romar.mahout.factory.MahoutServiceFactory;
import com.anjuke.romar.mahout.factory.MahoutServiceItemRecommendFactory;
import com.anjuke.romar.mahout.factory.MahoutServiceUserRecommendFactory;
public final class RomarConfig {
private static final Logger LOG = LoggerFactory.getLogger(RomarConfig.class);
private static final RomarConfig INSTANCE;
private static final String CONF_PATH_KEY = "romar.config";
public static class RomarConfigHolder {
private Boolean _allowUserStringID;
private Boolean _allowItemStringID;
private Integer _serverPort;
private RecommendType _recommendType;
private Boolean _useSimilarityCache;
private Integer _similarityCacheSize;
private ItemSimilarityClass _itemSimilarityClass;
private UserSimilarityClass _userSimilarityClass;
private UserNeighborhoodClass _userNeighborhoodClass;
private Integer _userNeighborhoodNearestN;
private CommonRecommenderClass _commonRecommenderClass;
private String _persistencePath;
private Boolean _useFileSimilarity;
private Boolean _binarySimilarityFile;
private String _similarityFile;
public Boolean getAllowUserStringID() {
return _allowUserStringID;
}
public void setAllowUserStringID(Boolean allowUserStringID) {
_allowUserStringID = allowUserStringID;
}
public Boolean getAllowItemStringID() {
return _allowItemStringID;
}
public void setAllowItemStringID(Boolean allowItemStringID) {
_allowItemStringID = allowItemStringID;
}
public Integer getServerPort() {
return _serverPort;
}
public void setServerPort(Integer serverPort) {
_serverPort = serverPort;
}
public RecommendType getRecommendType() {
return _recommendType;
}
public void setRecommendType(RecommendType recommendType) {
_recommendType = recommendType;
}
public Boolean getUseSimilarityCache() {
return _useSimilarityCache;
}
public void setUseSimilarityCache(Boolean useSimilarityCache) {
_useSimilarityCache = useSimilarityCache;
}
public Integer getSimilarityCacheSize() {
return _similarityCacheSize;
}
public void setSimilarityCacheSize(Integer similarityCacheSize) {
_similarityCacheSize = similarityCacheSize;
}
public ItemSimilarityClass getItemSimilarityClass() {
return _itemSimilarityClass;
}
public void setItemSimilarityClass(ItemSimilarityClass itemSimilarityClass) {
_itemSimilarityClass = itemSimilarityClass;
}
public UserSimilarityClass getUserSimilarityClass() {
return _userSimilarityClass;
}
public void setUserSimilarityClass(UserSimilarityClass userSimilarityClass) {
_userSimilarityClass = userSimilarityClass;
}
public UserNeighborhoodClass getUserNeighborhoodClass() {
return _userNeighborhoodClass;
}
public void setUserNeighborhoodClass(UserNeighborhoodClass userNeighborhoodClass) {
_userNeighborhoodClass = userNeighborhoodClass;
}
public Integer getUserNeighborhoodNearestN() {
return _userNeighborhoodNearestN;
}
public void setUserNeighborhoodNearestN(Integer userNeighborhoodNearestN) {
_userNeighborhoodNearestN = userNeighborhoodNearestN;
}
public CommonRecommenderClass getCommonRecommenderClass() {
return _commonRecommenderClass;
}
public void setCommonRecommenderClass(
CommonRecommenderClass commonRecommenderClass) {
_commonRecommenderClass = commonRecommenderClass;
}
public String getPersistencePath() {
return _persistencePath;
}
public void setPersistencePath(String persistencePath) {
_persistencePath = persistencePath;
}
public Boolean getUseFileSimilarity() {
return _useFileSimilarity;
}
public void setUseFileSimilarity(Boolean useFileSimilarity) {
_useFileSimilarity = useFileSimilarity;
}
public Boolean getBinarySimilarityFile() {
return _binarySimilarityFile;
}
public void setBinarySimilarityFile(Boolean binarySimilarityFile) {
_binarySimilarityFile = binarySimilarityFile;
}
public String getSimilarityFile() {
return _similarityFile;
}
public void setSimilarityFile(String similarityFile) {
_similarityFile = similarityFile;
}
}
static {
Yaml yaml = new Yaml();
String path = System.getProperty(CONF_PATH_KEY);
InputStream isDefault = null;
InputStream isCustom = null;
try {
isDefault = RomarConfig.class.getResourceAsStream("/romar.default.yaml");
RomarConfigHolder defaultHolder = yaml.loadAs(isDefault,
RomarConfigHolder.class);
RomarConfigHolder customHolder;
LOG.debug("custom conf path is " + path);
if (path != null && !path.isEmpty()) {
LOG.info("loading config from " + path);
isCustom = new FileInputStream(path);
customHolder = yaml.loadAs(isCustom, RomarConfigHolder.class);
} else {
customHolder = new RomarConfigHolder();
}
INSTANCE = new RomarConfig(defaultHolder, customHolder);
} catch (Exception e) {
e.printStackTrace();
throw new Error(e);
} finally {
if (isDefault != null) {
try {
isDefault.close();
} catch (Exception e) {
LOG.error(e.getMessage(), e);
}
}
if (isCustom != null) {
try {
isCustom.close();
} catch (Exception e) {
LOG.error(e.getMessage(), e);
}
}
}
}
public static RomarConfig getInstance() {
return INSTANCE;
}
private enum RecommendType {
item(new MahoutServiceItemRecommendFactory()),
user(new MahoutServiceUserRecommendFactory()),
common(new MahoutServiceCommonRecommendFactory());
private MahoutServiceFactory _factory;
private RecommendType(MahoutServiceFactory factory) {
_factory = factory;
}
}
private enum ItemSimilarityClass {
EuclideanDistanceSimilarity(EuclideanDistanceSimilarity.class),
PearsonCorrelationSimilarity(PearsonCorrelationSimilarity.class),
UncenteredCosineSimilarity(UncenteredCosineSimilarity.class),
CityBlockSimilarity(CityBlockSimilarity.class),
LogLikelihoodSimilarity(LogLikelihoodSimilarity.class),
TanimotoCoefficientSimilarity(TanimotoCoefficientSimilarity.class);
private Class<? extends ItemSimilarity> _clazz;
private ItemSimilarityClass(Class<? extends ItemSimilarity> clazz) {
_clazz = clazz;
}
public Class<? extends ItemSimilarity> getClazz() {
return _clazz;
}
}
private enum UserSimilarityClass {
EuclideanDistanceSimilarity(EuclideanDistanceSimilarity.class),
PearsonCorrelationSimilarity(PearsonCorrelationSimilarity.class),
UncenteredCosineSimilarity(UncenteredCosineSimilarity.class),
CityBlockSimilarity(CityBlockSimilarity.class),
LogLikelihoodSimilarity(LogLikelihoodSimilarity.class),
TanimotoCoefficientSimilarity(TanimotoCoefficientSimilarity.class),
SpearmanCorrelationSimilarity(SpearmanCorrelationSimilarity.class);
private Class<? extends UserSimilarity> _clazz;
private UserSimilarityClass(Class<? extends UserSimilarity> clazz) {
_clazz = clazz;
}
public Class<? extends UserSimilarity> getClazz() {
return _clazz;
}
}
private enum UserNeighborhoodClass {
NearestNUserNeighborhood(NearestNUserNeighborhood.class),
ThresholdUserNeighborhood(ThresholdUserNeighborhood.class);
private Class<? extends UserNeighborhood> _clazz;
private UserNeighborhoodClass(Class<? extends UserNeighborhood> clazz) {
_clazz = clazz;
}
public Class<? extends UserNeighborhood> getClazz() {
return _clazz;
}
}
private enum CommonRecommenderClass {
ItemAverageRecommender(ItemAverageRecommender.class),
ItemUserAverageRecommender(ItemUserAverageRecommender.class),
SlopeOneRecommender(SlopeOneRecommender.class);
private Class<? extends Recommender> _clazz;
private CommonRecommenderClass(Class<? extends Recommender> clazz) {
_clazz = clazz;
}
public Class<? extends Recommender> getClazz() {
return _clazz;
}
}
private final RomarConfigHolder _defaultHolder;
private final RomarConfigHolder _customerHolder;
public RomarConfig(RomarConfigHolder defaultHolder, RomarConfigHolder customerHolder) {
super();
_defaultHolder = defaultHolder;
_customerHolder = customerHolder;
}
public int getServerPort() {
if (_customerHolder._serverPort != null) {
return _customerHolder._serverPort;
}
return _defaultHolder._serverPort;
}
public MahoutServiceFactory getMahoutServiceFactory() {
if (_customerHolder._recommendType != null) {
return _customerHolder._recommendType._factory;
}
return _defaultHolder._recommendType._factory;
}
public boolean isUseSimilariyCache() {
if (_customerHolder._useSimilarityCache != null) {
return _customerHolder._useSimilarityCache;
}
return _defaultHolder._useSimilarityCache;
}
public int getSimilarityCacheSize() {
if (_customerHolder._similarityCacheSize != null) {
return _customerHolder._similarityCacheSize;
}
return _defaultHolder._similarityCacheSize;
}
public Class<? extends ItemSimilarity> getItemSimilarityClass() {
if (_customerHolder._itemSimilarityClass != null) {
return _customerHolder._itemSimilarityClass.getClazz();
}
return _defaultHolder._itemSimilarityClass.getClazz();
}
public Class<? extends UserSimilarity> getUserSimilarityClass() {
if (_customerHolder._userSimilarityClass != null) {
return _customerHolder._userSimilarityClass.getClazz();
}
return _defaultHolder._userSimilarityClass.getClazz();
}
public Class<? extends UserNeighborhood> getUserNeighborhoodClass() {
if (_customerHolder._userNeighborhoodClass != null) {
return _customerHolder._userNeighborhoodClass.getClazz();
}
return _defaultHolder._userNeighborhoodClass.getClazz();
}
public int getUserNeighborhoodNearestN() {
if (_customerHolder._userNeighborhoodNearestN != null) {
return _customerHolder._userNeighborhoodNearestN;
}
return _defaultHolder._userNeighborhoodNearestN;
}
public Class<? extends Recommender> getCommonRecommenderClass() {
if (_customerHolder._commonRecommenderClass != null) {
return _customerHolder._commonRecommenderClass.getClazz();
}
return _defaultHolder._commonRecommenderClass.getClazz();
}
public String getPersistencePath() {
String path;
if (_customerHolder._persistencePath != null) {
path = _customerHolder._persistencePath;
} else {
path = _defaultHolder._persistencePath;
}
if (path == null) {
return null;
}
if (path.startsWith("/")) {
return path;
} else {
return System.getProperty("romar.home", "/tmp/romar") + "/" + path;
}
}
public boolean isAllowUserStringID() {
Boolean allowStringID = _customerHolder.getAllowUserStringID();
if (allowStringID != null) {
return allowStringID;
}
return _defaultHolder._allowUserStringID;
}
public boolean isAllowItemStringID() {
Boolean allowStringID = _customerHolder.getAllowItemStringID();
if (allowStringID != null) {
return allowStringID;
}
return _defaultHolder._allowItemStringID;
}
public Boolean isUseFileSimilarity() {
Boolean useFileSimilarity = _customerHolder.getUseFileSimilarity();
if (useFileSimilarity != null) {
return useFileSimilarity;
}
return _defaultHolder._useFileSimilarity;
}
public Boolean isBinarySimilarityFile() {
Boolean binarySimilarityFile = _customerHolder.getBinarySimilarityFile();
if (binarySimilarityFile != null) {
return binarySimilarityFile;
}
return _defaultHolder._binarySimilarityFile;
}
public String getSimilarityFile(){
String similarityFile = _customerHolder.getSimilarityFile();
if (similarityFile != null) {
return similarityFile;
}
return _defaultHolder._similarityFile;
}
}