package hellowicket.dbupdates;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import org.apache.wicket.request.resource.AbstractResource;
import org.hibernate.CacheMode;
import org.hibernate.Query;
import org.hibernate.ScrollMode;
import org.hibernate.ScrollableResults;
import org.hibernate.Session;
import com.fasterxml.jackson.databind.ObjectMapper;
import hellowicket.HibernateUtil;
import hellowicket.World;
import org.hibernate.Transaction;
/**
* A resource that implements the requirements for
* Test type 5: Database updates
*/
public class HelloDbUpdatesResource extends AbstractResource
{
private static final long serialVersionUID = 1L;
private static final int DB_ROWS = 10000;
private static final ObjectMapper mapper = new ObjectMapper();
protected ResourceResponse newResourceResponse(Attributes attributes)
{
int _queries = attributes.getRequest().getQueryParameters().getParameterValue("queries").toInt(1);
if (_queries < 1)
{
_queries = 1;
}
else if (_queries > 500)
{
_queries = 500;
}
final int queries = _queries;
final ResourceResponse response = new ResourceResponse();
response.setContentType("application/json");
response.setWriteCallback(new WriteCallback() {
public void writeData(Attributes attributes)
{
Random random = new Random();
List worldsForJson = new ArrayList<>();
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction tx = session.beginTransaction();
// update in batches. See http://docs.jboss.org/hibernate/core/3.3/reference/en/html/batch.html#batch-update
ScrollableResults worlds = session.createQuery("from World")
.setMaxResults(queries)
.setCacheMode(CacheMode.IGNORE)
.scroll(ScrollMode.FORWARD_ONLY);
int count=0;
while (worlds.next())
{
World world = (World) worlds.get(0);
world.randomNumber = random.nextInt(DB_ROWS) + 1;
worldsForJson.add(world);
if ( ++count % 500 == 0 )
{
//flush a batch of updates and release memory
session.flush();
session.clear();
}
}
tx.commit();
session.close();
try
{
String data;
if (queries == 1)
{
data = HelloDbUpdatesResource.mapper.writeValueAsString(worldsForJson.get(0));
}
else
{
data = HelloDbUpdatesResource.mapper.writeValueAsString(worldsForJson);
}
attributes.getResponse().write(data);
}
catch (IOException ex)
{
// do nothing
}
}
});
return response;
}
}