package org.jboss.resteasy.keystone.server;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonEncoding;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import org.infinispan.Cache;
import org.jboss.resteasy.keystone.model.IdentityStore;
import org.jboss.resteasy.keystone.model.Role;
import org.jboss.resteasy.keystone.model.StoredProject;
import org.jboss.resteasy.keystone.model.StoredUser;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
/**
* @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
* @version $Revision: 1 $
*/
@SuppressWarnings({"rawtypes", "unchecked"})
public class Loader
{
final ObjectMapper DEFAULT_MAPPER = new ObjectMapper();
final ObjectMapper WRAPPED_MAPPER = new ObjectMapper();
public Loader()
{
DEFAULT_MAPPER.setSerializationInclusion(JsonInclude.Include.NON_NULL);
DEFAULT_MAPPER.enable(SerializationFeature.INDENT_OUTPUT);
DEFAULT_MAPPER.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);
}
public String export(Cache cache)
{
IdentityStore store = toStore(cache);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
write(baos, store);
return new String(baos.toByteArray());
}
public IdentityStore importStore(InputStream is)
{
try
{
JsonParser jp = DEFAULT_MAPPER.getJsonFactory().createJsonParser(is);
return DEFAULT_MAPPER.readValue(jp, IdentityStore.class);
}
catch (IOException e)
{
throw new RuntimeException(e);
}
}
public void importStore(InputStream is, Cache cache)
{
IdentityStore store = importStore(is);
importStore(store, cache);
}
public void importStore(IdentityStore store, Cache cache)
{
if (store.getRoles() != null)
{
for (Role role : store.getRoles())
{
cache.put("/roles/" + role.getId(), role);
}
}
if (store.getUsers() != null)
{
for (StoredUser user : store.getUsers())
{
cache.put("/users/" + user.getId(), user);
}
}
if (store.getProjects() != null)
{
for (StoredProject project : store.getProjects())
{
cache.put("/projects/" + project.getProject().getId(), project);
}
}
}
public void export(Cache cache, OutputStream os)
{
IdentityStore store = toStore(cache);
write(os, store);
}
private void write(OutputStream os, IdentityStore store)
{
try
{
JsonGenerator jg = DEFAULT_MAPPER.getFactory().createGenerator(os, JsonEncoding.UTF8);
DEFAULT_MAPPER.writeValue(jg, store);
}
catch (IOException e)
{
throw new RuntimeException(e);
}
}
public IdentityStore toStore(Cache cache)
{
List<StoredUser> users = new ArrayList<StoredUser>();
List<Role> roles = new ArrayList<Role>();
List<StoredProject> projects = new ArrayList<StoredProject>();
IdentityStore store = new IdentityStore();
for (Object value : cache.values())
{
if (value instanceof StoredUser)
{
users.add((StoredUser) value);
store.setUsers(users);
} else if (value instanceof Role)
{
roles.add((Role) value);
store.setRoles(roles);
} else if (value instanceof StoredProject)
{
projects.add((StoredProject) value);
store.setProjects(projects);
}
}
return store;
}
}