package org.ff4j.web.controller;
import static org.ff4j.web.bean.WebConstants.NEW_NAME;
import static org.ff4j.web.bean.WebConstants.OP_ADD_FIXEDVALUE;
import static org.ff4j.web.bean.WebConstants.OP_COPY_PROPERTY;
import static org.ff4j.web.bean.WebConstants.OP_CREATE_PROPERTY;
import static org.ff4j.web.bean.WebConstants.OP_DELETE_FIXEDVALUE;
import static org.ff4j.web.bean.WebConstants.OP_EDIT_PROPERTY;
import static org.ff4j.web.bean.WebConstants.OP_RENAME_PROPERTY;
import static org.ff4j.web.bean.WebConstants.OP_RMV_PROPERTY;
import static org.ff4j.web.bean.WebConstants.PARAM_FIXEDVALUE;
/*
* #%L
* ff4j-sample-web
* %%
* Copyright (C) 2013 - 2016 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.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.ff4j.FF4j;
import org.ff4j.property.Property;
import org.ff4j.property.util.PropertyFactory;
import org.ff4j.utils.Util;
import org.ff4j.web.bean.WebConstants;
import org.ff4j.web.embedded.ConsoleOperations;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.WebContext;
/**
* Controller for main class
*
* @author Cedrick LUNVEN (@clunven)
*/
public class PropertiesController extends AbstractController {
/** Logger for this class. */
public static final Logger LOGGER = LoggerFactory.getLogger(PropertiesController.class);
/** View name. */
private static final String VIEW_PROPERTIES = "properties";
/** {@inheritDoc} */
public PropertiesController(FF4j ff4j, TemplateEngine te) {
super(ff4j, VIEW_PROPERTIES, te);
}
/** {@inheritDoc} */
public void post(HttpServletRequest req, HttpServletResponse res, WebContext ctx)
throws IOException {
String msg = null;
String msgType = "success";
String operation = req.getParameter(WebConstants.OPERATION);
String propertyName = req.getParameter(WebConstants.NAME);
String featureId = req.getParameter(WebConstants.FEATURE_UID);
if (OP_CREATE_PROPERTY.equalsIgnoreCase(operation)) {
ConsoleOperations.createProperty(getFf4j(), req);
msg = propertyName + " has been CREATED";
String logMessage = "Property '" + propertyName + "' has been created ";
if (Util.hasLength(featureId)) {
logMessage+= " for feature '" + featureId + "'";
}
LOGGER.info(logMessage);
} else if (OP_RMV_PROPERTY.equalsIgnoreCase(operation)) {
if (!Util.hasLength(propertyName)) {
msgType = "warning";
msg = "Property name not found";
} else {
getFf4j().getPropertiesStore().deleteProperty(propertyName);
msg = propertyName + " has been DELETED";
}
} else if (OP_EDIT_PROPERTY.equalsIgnoreCase(operation)) {
ConsoleOperations.updateProperty(getFf4j(), req);
msg = propertyName + " has been UPDATED";
String logMessage = "Property '" + propertyName + "' has been UPDATED ";
if (Util.hasLength(featureId)) {
logMessage+= " for feature '" + featureId + "'";
}
LOGGER.info(logMessage);
} else if (OP_RENAME_PROPERTY.equalsIgnoreCase(operation)) {
String newName = req.getParameter(NEW_NAME);
Set< String> propertiesNames = getFf4j().getPropertiesStore().listPropertyNames();
if (propertiesNames.contains(newName)) {
msgType = "warning";
msg = "Cannot rename " + propertyName + " to " + newName + " : it already exists";
} else {
Property<?> newProperty = getFf4j().getPropertiesStore().readProperty(propertyName);
newProperty.setName(newName);
getFf4j().getPropertiesStore().deleteProperty(propertyName);
getFf4j().getPropertiesStore().createProperty(newProperty);
msg = "Property " + propertyName + " has been renamed to " + newName;
}
} else if (OP_COPY_PROPERTY.equalsIgnoreCase(operation)) {
String newName = req.getParameter(NEW_NAME);
Set< String> propertiesNames = getFf4j().getPropertiesStore().listPropertyNames();
if (propertiesNames.contains(newName)) {
msgType = "warning";
msg = "Cannot copy " + propertyName + " to " + newName + " : it already exists";
} else {
Property<?> p = getFf4j().getPropertiesStore().readProperty(propertyName);
Property<?> newProperty = PropertyFactory.createProperty(newName, p.getType(), p.asString(), p.getDescription(), null);
for(Object o : p.getFixedValues()) {
newProperty.add2FixedValueFromString(o.toString());
}
getFf4j().getPropertiesStore().createProperty(newProperty);
msg = "Property " + propertyName + " has been copied to " + newName;
}
}
ctx.setVariable("msgType", msgType);
ctx.setVariable("msgInfo", msg);
renderPage(ctx);
}
/** {@inheritDoc} */
public void get(HttpServletRequest req, HttpServletResponse res, WebContext ctx)
throws IOException {
String operation = req.getParameter(WebConstants.OPERATION);
String propertyName = req.getParameter(WebConstants.FEATID);
String msgType = "success";
String msg = null;
if (Util.hasLength(operation) && Util.hasLength(propertyName) &&
getFf4j().getPropertiesStore().existProperty(propertyName)) {
if (OP_DELETE_FIXEDVALUE.equalsIgnoreCase(operation)) {
String fixedValue = req.getParameter(PARAM_FIXEDVALUE);
Property<?> ap = getFf4j().getPropertiesStore().readProperty(propertyName);
// Need to convert back to object to use the remove()
ap.getFixedValues().remove(ap.fromString(fixedValue));
getFf4j().getPropertiesStore().updateProperty(ap);
LOGGER.info("Property '" + propertyName + "' remove fixedValue '" + fixedValue + "'");
}
if (OP_ADD_FIXEDVALUE.equalsIgnoreCase(operation)) {
String fixedValue = req.getParameter(PARAM_FIXEDVALUE);
Property<?> ap = getFf4j().getPropertiesStore().readProperty(propertyName);
ap.add2FixedValueFromString(fixedValue);
getFf4j().getPropertiesStore().updateProperty(ap);
LOGGER.info("Property '" + propertyName + "' add fixedValue '" + fixedValue + "'");
}
}
ctx.setVariable("msgType", msgType);
ctx.setVariable("msgInfo", msg);
renderPage(ctx);
}
/**
* Both get and post operation will render the page.
*
* @param ctx
* current web context
*/
private void renderPage(WebContext ctx) {
ctx.setVariable(KEY_TITLE, "Properties");
// Sort natural Order
Map<String, Property<?>> mapOfProperties = ff4j.getPropertiesStore().readAllProperties();
List<String> propertyNames = Arrays.asList(mapOfProperties.keySet().toArray(new String[0]));
Collections.sort(propertyNames);
List<Property<?>> orderedProperties = new ArrayList<Property<?>>();
for (String propName : propertyNames) {
orderedProperties.add(mapOfProperties.get(propName));
}
ctx.setVariable("listOfProperties", orderedProperties);
}
}