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}