--- /dev/null
+package org.simantics.db.common;\r
+\r
+import java.lang.reflect.Method;\r
+import java.util.Map;\r
+\r
+import org.simantics.db.Metadata;\r
+import org.simantics.db.Session;\r
+import org.simantics.db.common.utils.Logger;\r
+import org.simantics.db.exception.ServiceException;\r
+\r
+public class MetadataUtils {\r
+\r
+ private static final boolean TRACE_METADATA_SERIALIZATION = false;\r
+\r
+ public static <T extends Metadata> boolean hasMetadata(Map<String,byte[]> metadata, Class<T> clazz) {\r
+ return metadata.containsKey(clazz.getName());\r
+ }\r
+ \r
+ @SuppressWarnings("unchecked")\r
+ public static <T extends Metadata> T getMetadata(Session session, Map<String,byte[]> metadata, Class<T> clazz) throws ServiceException {\r
+ byte[] data = metadata.get(clazz.getName());\r
+ if (TRACE_METADATA_SERIALIZATION) {\r
+ if (data != null)\r
+ System.out.println("deserializing " + data.length + " bytes of metadata into " + clazz);\r
+ }\r
+ Method m;\r
+ try {\r
+ m = clazz.getMethod("deserialise", Session.class, byte[].class);\r
+ return (T) m.invoke(null, session, data);\r
+ } catch (Exception e) {\r
+ e.printStackTrace();\r
+ Logger.defaultLogError(e.toString());\r
+ }\r
+ return null;\r
+ }\r
+ \r
+ public static <T> void addMetadata(Session session, Map<String,byte[]> metadata, Metadata data) throws ServiceException {\r
+ byte[] blob = data.serialise(session);\r
+ if (TRACE_METADATA_SERIALIZATION)\r
+ System.out.println("serialized " + blob.length + " bytes of metadata into for " + data.getClass());\r
+ metadata.put(data.getClass().getName(), blob);\r
+ }\r
+ \r
+}\r