001    package de.deepamehta.storage.neo4j;
002    
003    import de.deepamehta.core.model.AssociationRoleModel;
004    import de.deepamehta.core.model.RoleModel;
005    import de.deepamehta.core.model.TopicRoleModel;
006    
007    import org.neo4j.graphdb.Node;
008    
009    
010    
011    enum NodeType {
012    
013        TOPIC {
014            @Override
015            RoleModel createRoleModel(Node node, String roleTypeUri) {
016                return new TopicRoleModel(node.getId(), roleTypeUri);
017            }
018    
019            @Override
020            String error(Node node) {
021                return "ID " + node.getId() + " refers to an Association when the caller expects a Topic";
022            }
023        },
024        ASSOC {
025            @Override
026            RoleModel createRoleModel(Node node, String roleTypeUri) {
027                return new AssociationRoleModel(node.getId(), roleTypeUri);
028            }
029    
030            @Override
031            String error(Node node) {
032                return "ID " + node.getId() + " refers to a Topic when the caller expects an Association";
033            }
034        };
035    
036        // ---
037    
038        abstract RoleModel createRoleModel(Node node, String roleTypeUri);
039    
040        abstract String error(Node node);
041    
042        // ---
043    
044        static NodeType of(Node node) {
045            String type = (String) node.getProperty("node_type");
046            return valueOf(type.toUpperCase());
047        }
048    
049        boolean isTypeOf(Node node) {
050            return node.getProperty("node_type").equals(stringify());
051        }
052    
053        String stringify() {
054            return name().toLowerCase();
055        }
056    }