/*
* Copyright (c) 2011 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.service.restlets;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import org.apache.commons.lang.WordUtils;
import org.apache.commons.logging.Log;
import org.eurekastreams.commons.logging.LogFactory;
import org.eurekastreams.server.domain.EntityType;
import org.eurekastreams.server.persistence.mappers.DomainMapper;
import org.eurekastreams.server.persistence.mappers.stream.GetDomainGroupsByShortNames;
import org.eurekastreams.server.search.modelview.DomainGroupModelView;
import org.eurekastreams.server.search.modelview.PersonModelView;
import org.restlet.data.MediaType;
import org.restlet.data.Request;
import org.restlet.resource.Representation;
import org.restlet.resource.ResourceException;
import org.restlet.resource.StringRepresentation;
import org.restlet.resource.Variant;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;
/**
* One-off service for Eureka sites used to verify Person/Group shortNames.
*
*/
public class StreamIdValidationResource extends SmpResource
{
/**
* Logger.
*/
private Log log = LogFactory.make();
/**
* Request param for stream key to validate.
*/
private String uniqueKey;
/**
* Request param for stream type.
*/
private EntityType type;
/**
* Person model view mapper.
*/
private final DomainMapper<String, PersonModelView> getPersonMVByAccountId;
/**
* Groups by shortName DAO.
*/
private final GetDomainGroupsByShortNames groupByShortNameDAO;
/**
* Instance of the {@link PlatformTransactionManager}.
*/
private final PlatformTransactionManager transManager;
/**
* Constructor.
*
* @param inGetPersonMVByAccountId
* Person model view mapper.
* @param inGroupByShortNameDAO
* Groups by shortName DAO.
* @param inTransManager
* - instance of the {@link PlatformTransactionManager}.
*/
public StreamIdValidationResource(final DomainMapper<String, PersonModelView> inGetPersonMVByAccountId,
final GetDomainGroupsByShortNames inGroupByShortNameDAO, final PlatformTransactionManager inTransManager)
{
getPersonMVByAccountId = inGetPersonMVByAccountId;
groupByShortNameDAO = inGroupByShortNameDAO;
transManager = inTransManager;
}
/**
* Initialize parameters from the request object.
*
* @param inRequest
* the client's request
*/
@Override
protected void initParams(final Request inRequest)
{
uniqueKey = (String) inRequest.getAttributes().get("uniqueKey");
type = EntityType.valueOf(((String) inRequest.getAttributes().get("type")).trim().toUpperCase());
}
/**
* Handle GET requests.
*
* @param variant
* the variant to be retrieved.
* @throws ResourceException
* thrown if a representation cannot be provided
* @return a representation of the resource
*/
@Override
public Representation represent(final Variant variant) throws ResourceException
{
DefaultTransactionDefinition transDef = new DefaultTransactionDefinition();
transDef.setReadOnly(true);
TransactionStatus currentStatus = transManager.getTransaction(transDef);
boolean isValid;
String typeString = WordUtils.capitalizeFully(type.toString());
try
{
switch (type)
{
case PERSON:
PersonModelView pmv = getPersonMVByAccountId.execute(uniqueKey);
isValid = pmv != null;
break;
case GROUP:
List<DomainGroupModelView> groups = groupByShortNameDAO.execute(Collections.singletonList(uniqueKey));
isValid = groups.size() == 1;
break;
default:
typeString = "Type";
throw new RuntimeException("only accepts person and group types.");
}
transManager.commit(currentStatus);
}
catch (Exception e)
{
log.warn("Error validating id", e);
transManager.rollback(currentStatus);
isValid = false;
}
String styleColor = isValid ? "green" : "red";
String responseString = isValid ? "Valid " : "Invalid ";
// style the response
String styledResponse = "<div style=\"color:" + styleColor + "; font-family:Arial; font-size:smaller\">"
+ responseString + typeString + "</div>";
Representation rep = new StringRepresentation(styledResponse, MediaType.TEXT_HTML);
rep.setExpirationDate(new Date(0L));
return rep;
}
}