pl.edu.icm.unity.engine.confirmation.facilities.UserEmailFacility Maven / Gradle / Ivy
/*
* Copyright (c) 2015 ICM Uniwersytet Warszawski All rights reserved.
* See LICENCE.txt file for licensing information.
*/
package pl.edu.icm.unity.engine.confirmation.facilities;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import pl.edu.icm.unity.base.Constants;
import pl.edu.icm.unity.base.entity.EntityState;
import pl.edu.icm.unity.base.exceptions.EngineException;
import pl.edu.icm.unity.base.exceptions.InternalException;
import pl.edu.icm.unity.base.message.MessageSource;
import pl.edu.icm.unity.engine.api.confirmation.EmailConfirmationRedirectURLBuilder;
import pl.edu.icm.unity.engine.api.confirmation.EmailConfirmationRedirectURLBuilder.ConfirmedElementType;
import pl.edu.icm.unity.engine.api.confirmation.EmailConfirmationRedirectURLBuilder.Status;
import pl.edu.icm.unity.engine.api.confirmation.states.UserEmailConfirmationState;
import pl.edu.icm.unity.engine.api.finalization.WorkflowFinalizationConfiguration;
import pl.edu.icm.unity.store.api.EntityDAO;
/**
* Common code for processing verifiable elements for the entities existing in database (as opposed to
* elements existing in registrations).
*
* @author K. Benedyczak
*/
public abstract class UserEmailFacility extends BaseEmailFacility
{
protected final ObjectMapper mapper = Constants.MAPPER;
protected EntityDAO entityDAO;
protected MessageSource msg;
private String defaultRedirectURL;
protected UserEmailFacility(EntityDAO entityDAO, MessageSource msg, String defaultRedirectURL)
{
this.entityDAO = entityDAO;
this.msg = msg;
this.defaultRedirectURL = defaultRedirectURL;
}
protected abstract WorkflowFinalizationConfiguration confirmElements(T state) throws EngineException;
protected abstract ConfirmedElementType getConfirmedElementType(T state);
protected String getSuccessRedirect(T state)
{
return new EmailConfirmationRedirectURLBuilder(defaultRedirectURL, Status.elementConfirmed).
setConfirmationInfo(getConfirmedElementType(state), state.getType(), state.getValue()).
build();
}
protected String getErrorRedirect(T state)
{
return new EmailConfirmationRedirectURLBuilder(defaultRedirectURL, Status.elementConfirmationError).
setConfirmationInfo(getConfirmedElementType(state), state.getType(), state.getValue()).
build();
}
@Override
public boolean isDuplicate(T base, String candidate)
{
ObjectNode main;
try
{
main = mapper.readValue(candidate, ObjectNode.class);
} catch (Exception e)
{
throw new InternalException("Can't perform JSON deserialization", e);
}
if (!main.has("ownerEntityId"))
return false;
long ownerEntityId = main.get("ownerEntityId").asLong();
String value = main.get("value").asText();
return base.getOwnerEntityId() == ownerEntityId && base.getValue().equals(value);
}
@Override
public WorkflowFinalizationConfiguration processConfirmation(String state) throws EngineException
{
T idState = parseState(state);
EntityState entityState = null;
try
{
entityState = entityDAO.getByKey(idState.getOwnerEntityId()).getEntityState();
} catch (Exception e)
{
return WorkflowFinalizationConfiguration.basicError(
msg.getMessage("ConfirmationStatus.entityRemoved"),
defaultRedirectURL);
}
if (!entityState.equals(EntityState.valid))
{
return WorkflowFinalizationConfiguration.basicError(
msg.getMessage("ConfirmationStatus.entityInvalid"),
defaultRedirectURL);
}
return confirmElements(idState);
}
}