package org.ff4j.store.mongodb;
import java.util.HashMap;
/*
* #%L
* ff4j-store-mongodb
* %%
* Copyright (C) 2013 - 2014 Ff4J
* %%
* 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.
* #L%
*/
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.ff4j.core.Feature;
import org.ff4j.core.FlippingStrategy;
import org.ff4j.property.Property;
import org.ff4j.property.util.PropertyJsonBean;
import org.ff4j.utils.JsonUtils;
import org.ff4j.utils.MappingUtil;
import com.mongodb.BasicDBList;
import com.mongodb.BasicDBObject;
import com.mongodb.DBObject;
import com.mongodb.util.JSON;
import static org.ff4j.store.mongodb.FeatureStoreMongoConstants.*;
/**
* MApping from Mongo document to Feature.
*
* @author <a href="mailto:cedrick.lunven@gmail.com">Cedrick LUNVEN</a>
*/
public final class FeatureDBObjectMapper {
/**
* Convert {@link DBObject} to {@link Feature}.
*
* @param dbObject
* document in mongodb.
* @return
*/
public Feature mapFeature(DBObject dbObject) {
String featUid = (String) dbObject.get(UUID);
boolean status = (Boolean) dbObject.get(ENABLE);
Feature f = new Feature(featUid, status);
f.setDescription((String) dbObject.get(DESCRIPTION));
f.setGroup((String) dbObject.get(GROUPNAME));
f.setPermissions(mapAuthorization(dbObject));
f.setFlippingStrategy(mapStrategy(featUid, dbObject));
f.setCustomProperties(mapCustomProperties(dbObject));
return f;
}
/**
* Map a property.
*
* @param dbObject
* db object
* @return
* list of property
*/
public Property< ? > mapProperty(DBObject dbObject) {
PropertyJsonBean pf = new PropertyJsonBean();
pf.setName((String) dbObject.get(PROPERTY_NAME));
pf.setDescription((String) dbObject.get(PROPERTY_DESCRIPTION));
pf.setType((String) dbObject.get(PROPERTY_TYPE));
pf.setValue((String) dbObject.get(PROPERTY_VALUE));
if (dbObject.containsField(PROPERTY_FIXEDVALUES)) {
BasicDBList dbList = (BasicDBList) dbObject.get(PROPERTY_FIXEDVALUES);
if (dbList != null) {
for(Object item : dbList) {
pf.addFixedValue((String) item);
}
}
}
return pf.asProperty();
}
/**
* Convert {@link Feature} to {@link DBObject}.
*
* @param feature
* target feature.
* @return document in mongo db
*/
public DBObject toDBObject(Feature feature) {
String strategyColumn = null;
String expressionColumn = null;
if (feature.getFlippingStrategy() != null) {
strategyColumn = feature.getFlippingStrategy().getClass().getCanonicalName();
expressionColumn = MappingUtil.fromMap(feature.getFlippingStrategy().getInitParams());
}
String customProperties = null;
if (feature.getCustomProperties() != null) {
customProperties = JsonUtils.customPropertiesAsJson(feature.getCustomProperties());
}
return new FeatureDBObjectBuilder().addFeatUid(feature.getUid()).//
addEnable(feature.isEnable()).//
addDescription(feature.getDescription()).//
addGroupName(feature.getGroup()).//
addStrategy(strategyColumn).//
addExpression(expressionColumn).//
addCustomProperties(customProperties).
addRoles(feature.getPermissions()).build();
}
public DBObject fromProperty2DBObject(Property<?> property) {
PropertyJsonBean pjb = new PropertyJsonBean(property);
return new PropertyDBObjectBuilder().//
addName(pjb.getName()). //
addType(pjb.getType()). //
addValue(pjb.getValue()). //
addDescription(pjb.getDescription()). //
addFixedValues(pjb.getFixedValues()).build();
}
/**
* Map from {@link DBObject} to authorizations..
*
* @param dbObject
* target
* @return
*/
@SuppressWarnings("rawtypes")
private Set<String> mapAuthorization(DBObject dbObject) {
Set<String> authorisation = new HashSet<String>();
if (dbObject.containsField(ROLES)) {
for (Object role : (Iterable) dbObject.get(ROLES)) {
authorisation.add(role.toString());
}
}
return authorisation;
}
/**
* Map from {@link DBObject} to strategy.
*
* @param dbObject
* target
* @return
*/
private FlippingStrategy mapStrategy(String featUid, DBObject dbObject) {
String strategy = (String) dbObject.get(STRATEGY);
Map < String, String > initParams = MappingUtil.toMap((String) dbObject.get(EXPRESSION));
if (strategy != null && !"".equals(strategy)) {
return MappingUtil.instanceFlippingStrategy(featUid, strategy, initParams);
}
return null;
}
/**
* Custom Properties.
*
* @param dbObject
* db object
* @return
* list of property
*/
@SuppressWarnings("unchecked")
private Map < String, Property<?> > mapCustomProperties(DBObject dbObject) {
Map < String, Property<?> > mapOfCustomProperties = new HashMap<String, Property<?>>();
if (dbObject.containsField(CUSTOMPROPERTIES)) {
String properties = (String) dbObject.get(CUSTOMPROPERTIES);
Map < String, BasicDBObject > values = (Map<String, BasicDBObject>) JSON.parse(properties);
for (Map.Entry<String,BasicDBObject> entry : values.entrySet()) {
mapOfCustomProperties.put(entry.getKey(), mapProperty(entry.getValue()));
}
}
return mapOfCustomProperties;
}
}