001package de.deepamehta.storage.neo4j; 002 003import de.deepamehta.core.model.RoleModel; 004import de.deepamehta.core.service.ModelFactory; 005 006import org.neo4j.graphdb.Node; 007 008 009 010enum NodeType { 011 012 TOPIC { 013 @Override 014 RoleModel createRoleModel(Node node, String roleTypeUri, ModelFactory mf) { 015 return mf.newTopicRoleModel(node.getId(), roleTypeUri); 016 } 017 018 @Override 019 String error(Node node) { 020 return "ID " + node.getId() + " refers to an Association when the caller expects a Topic"; 021 } 022 }, 023 ASSOC { 024 @Override 025 RoleModel createRoleModel(Node node, String roleTypeUri, ModelFactory mf) { 026 return mf.newAssociationRoleModel(node.getId(), roleTypeUri); 027 } 028 029 @Override 030 String error(Node node) { 031 return "ID " + node.getId() + " refers to a Topic when the caller expects an Association"; 032 } 033 }; 034 035 // --- 036 037 abstract RoleModel createRoleModel(Node node, String roleTypeUri, ModelFactory mf); 038 039 abstract String error(Node node); 040 041 // --- 042 043 static NodeType of(Node node) { 044 String type = (String) node.getProperty("node_type"); 045 return valueOf(type.toUpperCase()); 046 } 047 048 /** 049 * Checks if the given node is of this type. 050 * <p> 051 * For a non-DM node <code>false</code> is returned. 052 * Non-DM nodes are those created by 3rd-party Neo4j components, e.g. Neo4j Spatial. 053 */ 054 boolean isTypeOf(Node node) { 055 // a node is regarded "non-DM" if it has no "node_type" property. 056 return node.getProperty("node_type", "").equals(stringify()); 057 } 058 059 String stringify() { 060 return name().toLowerCase(); 061 } 062}