/* * * RHQ Sync Tool * Copyright (C) 2012-2013 Red Hat, Inc. * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License, * version 2.1, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License and the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU General Public License * and the GNU Lesser General Public License along with this program; * if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ package org.jboss.rhq.sync.tool.actions.impl.impex; import java.lang.reflect.Type; import java.util.Collection; import java.util.HashSet; import java.util.Set; import org.apache.log4j.Logger; import org.jboss.rhq.sync.tool.util.LogUtils; import org.rhq.core.domain.auth.Subject; import org.rhq.core.domain.authz.Role; import org.rhq.core.domain.resource.group.ResourceGroup; import com.google.gson.GsonBuilder; import com.google.gson.JsonDeserializationContext; import com.google.gson.JsonDeserializer; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParseException; import com.google.gson.JsonSerializationContext; import com.google.gson.JsonSerializer; import com.google.gson.reflect.TypeToken; /** * @author Romain PELISSE - <belaran@redhat.com> * */ public class SubjectSerializer implements JsonSerializer<Subject>,JsonDeserializer<Subject> { private static Logger logger = Logger.getLogger(SubjectSerializer.class); @Override public Subject deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext ctx) throws JsonParseException { if ( logger.isDebugEnabled() ) logger.debug("Deserialized invoked with:" + jsonElement.toString()); Subject subject = new GsonBuilder().create().fromJson(jsonElement,type); LogUtils.logSubjectInstance(logger,subject, "Deserialized instance:"); return subject; } @Override public JsonElement serialize(Subject subject, Type type, JsonSerializationContext ctx) { JsonObject result = new JsonObject(); result.add("id",ctx.serialize(subject.getId(),Integer.class)); result.add("name",ctx.serialize(subject.getName(),String.class)); result.add("classname",ctx.serialize(subject.getClass().toString(),String.class)); result.add("firstName",ctx.serialize(subject.getFirstName(),String.class)); result.add("lastName",ctx.serialize(subject.getLastName(),String.class)); result.add("emailAddress",ctx.serialize(subject.getEmailAddress(),String.class)); result.add("department",ctx.serialize(subject.getDepartment(),String.class)); result.add("phoneNumber",ctx.serialize(subject.getPhoneNumber(),String.class)); result.add("smsAddress",ctx.serialize(subject.getSmsAddress(),String.class)); result.add("fsystem",ctx.serialize(subject.getFsystem(),Boolean.class)); result.add("factive",ctx.serialize(subject.getFactive(),Boolean.class)); result.add("ownedGroups",ctx.serialize(groups(subject.getOwnedGroups()),Set.class)); result.add("ldapRoles", ctx.serialize(subject.getLdapRoles(),Set.class)); //No support for LDAP Roles return result; } private Set<String> groups(Collection<ResourceGroup> list) { if ( list != null && ! list.isEmpty() ) { Set<String> groups = new HashSet<String>(list.size()); for ( ResourceGroup group : list ) { groups.add(group.getName()); } return groups; } return new HashSet<String>(0); } /** * <p>Commidity method to easily load a {@link Collection} of {@link Role}.</p> * * <p><em>This mostly takes care of the type marshalling necessary for JSON.</em></p> * * @param jsonAsString JSON content as a simple {@link String}. * @return */ public static Collection<Subject> loadJsonRolesCollections(String jsonAsString) { Type collectionType = new TypeToken<Collection<Role>>(){}.getType(); return new GsonBuilder().create().fromJson(jsonAsString, collectionType); } }