package org.netbeans.gradle.project.model; import java.io.Serializable; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; import org.netbeans.gradle.model.util.CollectionUtils; import org.netbeans.gradle.model.util.SerializationCache; import org.netbeans.gradle.model.util.SerializationCaches; import org.netbeans.gradle.model.util.SerializationUtils; import org.netbeans.gradle.project.NbGradleProject; import org.netbeans.gradle.project.extensions.NbGradleExtensionRef; public final class SerializedNbGradleModels implements Serializable { private static final long serialVersionUID = 1L; private static final Logger LOGGER = Logger.getLogger(SerializedNbGradleModels.class.getName()); private final NbGenericModelInfo genericInfo; // Maps extension name to serialized extension model private final Map<String, byte[]> extensionModels; private final boolean rootWithoutSettingsGradle; private SerializedNbGradleModels( NbGenericModelInfo genericInfo, Map<String, byte[]> extensionModels, boolean rootWithoutSettingsGradle) { assert genericInfo != null; assert extensionModels != null; this.genericInfo = genericInfo; this.extensionModels = extensionModels; this.rootWithoutSettingsGradle = rootWithoutSettingsGradle; } public static SerializedNbGradleModels createSerialized(NbGradleModel model) { Map<String, Object> extensionModels = model.getExtensionModels(); Map<String, byte[]> serializedModels = CollectionUtils.newHashMap(extensionModels.size()); for (Map.Entry<String, Object> entry: extensionModels.entrySet()) { String extensionName = entry.getKey(); Object extensionModel = entry.getValue(); if (!(extensionModel instanceof Serializable)) { continue; } byte[] serializedModel; try { serializedModel = SerializationUtils.serializeObject(extensionModel); } catch (Exception ex) { LOGGER.log(Level.INFO, "There was a problem serializing " + extensionModel, ex); continue; } serializedModels.put(extensionName, serializedModel); } return new SerializedNbGradleModels(model.getGenericInfo(), serializedModels, model.isRootWithoutSettingsGradle()); } public NbGradleModel deserializeModel(NbGradleProject ownerProject) { SerializationCache serializationCache = SerializationCaches.getDefault(); Map<String, Object> deserializedModels = CollectionUtils.newHashMap(extensionModels.size()); for (NbGradleExtensionRef extensionRef: ownerProject.getExtensions().getExtensionRefs()) { byte[] serializedModel = extensionModels.get(extensionRef.getName()); if (serializedModel != null) { try { ClassLoader modelClassLoader = extensionRef.getExtensionDef().getModelType().getClassLoader(); Object model = SerializationUtils.deserializeObject(serializedModel, serializationCache, modelClassLoader); deserializedModels.put(extensionRef.getName(), model); } catch (Throwable ex) { LOGGER.log(Level.INFO, "There was a problem when deserializing model for " + extensionRef.getName(), ex); } } } return new NbGradleModel(genericInfo, deserializedModels, rootWithoutSettingsGradle); } }