/*
* Copyright (c) 2010 Lockheed Martin Corporation
*
* 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 org.eurekastreams.server.action.execution.start;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.eurekastreams.commons.actions.ExecutionStrategy;
import org.eurekastreams.commons.actions.context.ActionContext;
import org.eurekastreams.commons.logging.LogFactory;
import org.eurekastreams.server.action.request.start.GadgetUserPrefActionRequest;
import org.eurekastreams.server.domain.Gadget;
import org.eurekastreams.server.persistence.mappers.DomainMapper;
import org.eurekastreams.server.persistence.mappers.FindByIdMapper;
import org.eurekastreams.server.persistence.mappers.UpdateMapper;
import org.eurekastreams.server.persistence.mappers.requests.FindByIdRequest;
import org.eurekastreams.server.persistence.mappers.requests.PersistenceRequest;
/**
* This action updates user prefs for a given gadget. If the gadget does not already have an entry in the db for the
* user prefs, then a new record will be added to the db.
*
*/
public class UpdateGadgetUserPrefByIdExecution implements ExecutionStrategy<ActionContext>
{
/**
* Local instance of logger.
*/
private final Log logger = LogFactory.make();
/**
* Mapper responsible for updating the existing user pref.
*/
private final UpdateMapper<Gadget> updateMapper;
/**
* Mapper responsible for retrieving the gadget instance that is needed to create a new user pref record if none is
* already in the db.
*/
private final FindByIdMapper<Gadget> findGadgetByIdMapper;
/** Mapper to clear or refresh user's start page data in cache. */
private final DomainMapper<Long, Object> pageMapper;
/**
* Constructor for action.
*
* @param inUpdateMapper
* - mapper responsible for gadget user pref updates.
* @param inFindGadgetByIdMapper
* - mapper responsible for retrieving gadget instances.
* @param inPageMapper
* Mapper to clear or refresh user's start page data in cache.
*/
public UpdateGadgetUserPrefByIdExecution(final UpdateMapper<Gadget> inUpdateMapper,
final FindByIdMapper<Gadget> inFindGadgetByIdMapper, final DomainMapper<Long, Object> inPageMapper)
{
updateMapper = inUpdateMapper;
findGadgetByIdMapper = inFindGadgetByIdMapper;
pageMapper = inPageMapper;
}
/**
* Update gadget user preferences by id.
*
* @param inActionContext
* {@link ActionContext}.
* @return gadget user preferences.
*/
@Override
public String execute(final ActionContext inActionContext)
{
GadgetUserPrefActionRequest currentRequest = (GadgetUserPrefActionRequest) inActionContext.getParams();
// No unescaping/decoding required
logger.debug("Updating user prefs for gadget: " + currentRequest.getGadgetId() + " with: "
+ currentRequest.getGadgetUserPref());
Gadget currentGadgetInstance = findGadgetByIdMapper.execute(new FindByIdRequest("Gadget", currentRequest
.getGadgetId()));
String oldVal = currentGadgetInstance.getGadgetUserPref();
String newVal = currentRequest.getGadgetUserPref();
if (StringUtils.equalsIgnoreCase(oldVal, newVal))
{
logger.debug("prefs didn't change; i refuse to update them");
return oldVal;
}
currentGadgetInstance.setGadgetUserPref(newVal);
updateMapper.execute(new PersistenceRequest<Gadget>(currentGadgetInstance));
// clear or refresh user's page data in the cache (since it has old preferences)
pageMapper.execute(currentGadgetInstance.getOwner().getId());
return currentGadgetInstance.getGadgetUserPref();
}
}