/*
* Copyright (c) 2009 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.persistence;
import java.util.LinkedList;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.eurekastreams.server.domain.FeedReader;
import org.eurekastreams.server.domain.FeedReaderUrlCount;
//TODO must be brought out into the feed reader project.
/**
* This class provides the mapper functionality for FeedReader entities.
*/
public class FeedReaderMapper
{
/**
* Local log instance.
*/
private static Log logger = LogFactory.getLog(FeedReaderMapper.class);
/**
* EntityManager to use for all ORM operations.
*/
private EntityManager entityManager;
/**
* Getter for entityManager.
*
* @return The entityManager.
*/
protected EntityManager getEntityManager()
{
return entityManager;
}
/**
* Set the entity manager - used for low-level ORM hits like flush & clear.
*
* @param inEntityManager
* the EntityManager to inject
*/
@PersistenceContext
public void setEntityManager(final EntityManager inEntityManager)
{
this.entityManager = inEntityManager;
}
/**
* Insert the domain entity.
*
* @param domainEntity
* The domainEntity to operate on.
*/
public void insert(final FeedReader domainEntity)
{
entityManager.persist(domainEntity);
}
/**
* Update all entities that have changed since they were loaded within the same context.
*/
public void flush()
{
entityManager.flush();
}
/**
* Refresh the domain entity.
*
* @param domainEntity
* the domain entity.
*/
public void refresh(final FeedReader domainEntity)
{
entityManager.refresh(domainEntity);
}
/**
* Find the domain entity by id.
*
* @param inModuleId
* module id of the feed read to lookup.
* @param inOpenSocialId
* User Id (OS ID) of the feed reader to lookup.
*
* @return the entity with the input
*/
@SuppressWarnings("unchecked")
public FeedReader findFeedByOpenSocialIdAndModuleId(final String inOpenSocialId, final String inModuleId)
{
Query q = entityManager.createQuery(
"from FeedReader where moduleId = :inModuleId and openSocialId= :inOpenSocialId").setParameter(
"inModuleId", inModuleId).setParameter("inOpenSocialId", inOpenSocialId);
List<FeedReader> results = q.getResultList();
if (results.size() < 1)
{
return null;
}
else
{
return (FeedReader) results.get(0);
}
}
/**
* Find the domain entity by id.
*
* @param inOpenSocialId
* User Id (OS ID) of the feed reader to lookup.
*
* @return the entity with the input
*/
@SuppressWarnings("unchecked")
public List<FeedReader> findFeedsByOpenSocialId(final String inOpenSocialId)
{
Query q = entityManager.createQuery("from FeedReader where openSocialId= :inOpenSocialId").setParameter(
"inOpenSocialId", inOpenSocialId);
List<FeedReader> results = q.getResultList();
return results;
}
/**
* Find the domain entity by id.
*
* @return the entity with the input
*/
@SuppressWarnings("unchecked")
public List<FeedReaderUrlCount> findTop10PublicFeeds()
{
Query q = entityManager.createQuery("SELECT url, count(*), feedTitle from FeedReader"
+ " group by url, feedTitle ORDER BY count(*) desc");
// TODO find a better place to set this. 5+5 = magic number rule work around.
q.setMaxResults(5 + 5);
List<FeedReaderUrlCount> feedList = new LinkedList<FeedReaderUrlCount>();
List<Object[]> results = (List<Object[]>) q.getResultList();
for (Object[] result : results)
{
FeedReaderUrlCount resultItem = new FeedReaderUrlCount();
resultItem.setUrl((String) result[0]);
resultItem.setCount((Long) result[1]);
resultItem.setFeedTitle((String) result[2]);
feedList.add(resultItem);
}
return feedList;
}
/**
* Find the domain entity by id.
*
* @param openSocialIdString
* List of OS Ids for the people to get Top feeds for.
* @return the entity with the input
*/
@SuppressWarnings("unchecked")
public List<FeedReaderUrlCount> findTop10FriendFeeds(final String openSocialIdString)
{
List<FeedReaderUrlCount> feedList = new LinkedList<FeedReaderUrlCount>();
if (!openSocialIdString.isEmpty() && openSocialIdString != null)
{
Query q = entityManager
.createQuery("SELECT url, count(*), feedTitle from FeedReader where openSocialId IN ("
+ openSocialIdString + ") group by url, feedTitle ORDER BY count(*) desc");
// TODO get rid of this and figure out an appropriate place to put this.
String theMagicNumberRuleSucks = "10";
q.setMaxResults(Integer.parseInt(theMagicNumberRuleSucks));
List<Object[]> results = (List<Object[]>) q.getResultList();
for (Object[] result : results)
{
FeedReaderUrlCount resultItem = new FeedReaderUrlCount();
resultItem.setUrl((String) result[0]);
resultItem.setCount((Long) result[1]);
resultItem.setFeedTitle((String) result[2]);
feedList.add(resultItem);
}
}
return feedList;
}
/**
* Delete a feed.
*
* @param id
* the id of the recommendation to delete.
*/
public void delete(final long id)
{
entityManager.createQuery("DELETE FROM FeedReader where id=:id").setParameter("id", id).executeUpdate();
}
}