package org.bundlemaker.core.project.internal.gson; import java.lang.reflect.Type; import org.bundlemaker.core.project.IProjectContentProvider; import org.bundlemaker.core.project.internal.ProjectContentProviderExtension; import org.eclipse.core.runtime.Assert; 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.JsonPrimitive; import com.google.gson.JsonSerializationContext; import com.google.gson.JsonSerializer; /** * <p> * </p> * * @author Gerd Wütherich (gerd@gerd-wuetherich.de) */ public class ProjectContentProviderJsonAdapter implements JsonSerializer<IProjectContentProvider>, JsonDeserializer<IProjectContentProvider> { /** the CLASSNAME attribute */ private static final String TYPE = "provider-id"; /** the INSTANCE attribute */ private static final String INSTANCE = "provider-config"; /** - */ private ContentProviderCompoundClassLoader _classLoader; /** * <p> * Creates a new instance of type {@link ProjectContentProviderJsonAdapter}. * </p> * * @param classLoader */ public ProjectContentProviderJsonAdapter(ContentProviderCompoundClassLoader classLoader) { Assert.isNotNull(classLoader); // _classLoader = classLoader; } /** * {@inheritDoc} */ @Override public JsonElement serialize(IProjectContentProvider src, Type typeOfSrc, JsonSerializationContext context) { String className = src.getClass().getName(); String id = _classLoader.getClassnameToIdMap().get(className); JsonObject retValue = new JsonObject(); retValue.addProperty(TYPE, id); JsonElement elem = context.serialize(src); retValue.add(INSTANCE, elem); return retValue; } /** * {@inheritDoc} */ @Override public IProjectContentProvider deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { JsonObject jsonObject = json.getAsJsonObject(); JsonPrimitive prim = (JsonPrimitive) jsonObject.get(TYPE); String id = prim.getAsString(); ProjectContentProviderExtension extension = _classLoader.getIdToExtensionMap().get(id); Class<?> clazz = null; try { clazz = _classLoader.getCompoundClassLoader().loadClass(extension.getClassName()); } catch (ClassNotFoundException e) { e.printStackTrace(); throw new JsonParseException(e.getMessage()); } // return the instance return context.deserialize(jsonObject.get(INSTANCE), clazz); } }