diff --git a/src/main/java/com/syncleus/grail/graph/AbstractSignalMultiplyingEdge.java b/src/main/java/com/syncleus/grail/graph/AbstractSignalMultiplyingEdge.java index 5b2a7da2586fefdeb2cfee7fa7ddb9e3b1e5fce0..ee83b5189edd0cb1c2f2b25219163245676c56e5 100644 --- a/src/main/java/com/syncleus/grail/graph/AbstractSignalMultiplyingEdge.java +++ b/src/main/java/com/syncleus/grail/graph/AbstractSignalMultiplyingEdge.java @@ -22,6 +22,12 @@ import com.tinkerpop.frames.modules.javahandler.*; import java.util.Random; +/** + * This is the Java handler class associated with the SignalMultiplyingEdge type. It ensures initial weights are set + * to a random value as well as defines how to propagate the signal. + * + * @since 0.1 + */ public abstract class AbstractSignalMultiplyingEdge implements SignalMultiplyingEdge { private static final Random RANDOM = new Random(); private static final double RANGE = 2.0; diff --git a/src/main/java/com/syncleus/grail/graph/GrailGraphFactory.java b/src/main/java/com/syncleus/grail/graph/GrailGraphFactory.java index 46223b002017ac51b31fb1de68fcc7756ee5384a..87ab690596d60656691e6a983065a2f5689fb424 100644 --- a/src/main/java/com/syncleus/grail/graph/GrailGraphFactory.java +++ b/src/main/java/com/syncleus/grail/graph/GrailGraphFactory.java @@ -27,6 +27,15 @@ import com.tinkerpop.frames.modules.typedgraph.*; import java.util.*; +/** + * The GrailGraphFactory class is responsible for creating new graphs compatible with GRAIL classes. Using this factory + * instead of the built-in TinkerPop factory ensures that the proper modules and class typing is instantiated. If this + * class is bypassed and the built-in TinkerPop FramedGraphFactory is used instead it is imperative that the GrailModule + * be passed to the FramedGraphFractory during instantiation. It is also important to pass a TypedModule contained the + * GRAIL classes that will be used when calling FramedGraphFactory directly. + * + * @since 0.1 + */ public class GrailGraphFactory extends FramedGraphFactory { private static final Set<Class<?>> BUILT_IN_TYPES = new HashSet<Class<?>>(Arrays.asList(new Class<?>[]{ SignalMultiplyingEdge.class, @@ -34,14 +43,36 @@ public class GrailGraphFactory extends FramedGraphFactory { ActionTriggerEdge.class, PrioritySerialTriggerEdge.class})); + /** + * Creates a graph factory using only the built-in modules. Only built in GRAIL classes will be handled by the + * typing engine. + * + * @since 0.1 + */ public GrailGraphFactory() { super(GrailGraphFactory.constructModules(Collections.<Module>emptySet())); } + /** + * Creates a graph factory using the built-in modules supplemented by the specified additional modules. Only + * built-in GRAIL classes will be handled by the typing engine unless explicitly handled by a one of the specified + * modules. + * + * @param modules additional modules to configure. + * @since 0.1 + */ public GrailGraphFactory(final Collection<? extends Module> modules) { super(GrailGraphFactory.constructModules(modules)); } + /** + * Creates a graph factory using the built-in modules supplemented by the specified additional Modules. All built-in + * classes will be handled by the typing engine in addition to any additional classes specified. + * + * @param modules additional modules to configure. + * @param types additional classes for the typing engine to handle. + * @since 0.1 + */ public GrailGraphFactory(final Collection<? extends Module> modules, final Collection<? extends Class<?>> types) { super(GrailGraphFactory.constructModules(modules, types)); } diff --git a/src/main/java/com/syncleus/grail/graph/GrailModule.java b/src/main/java/com/syncleus/grail/graph/GrailModule.java index 68319f7dc90de46312622d50e8a15e93d9af3515..6afc8299c8f520d85bdae427712763c28e8a9e3e 100644 --- a/src/main/java/com/syncleus/grail/graph/GrailModule.java +++ b/src/main/java/com/syncleus/grail/graph/GrailModule.java @@ -25,9 +25,23 @@ import com.tinkerpop.frames.modules.typedgraph.TypeValue; import java.util.*; +/** + * The GrailModule is a TinkerPop module which extends the built-in annotations with the following additional + * annotations: TypedAdjacency, and TypedIncidence. This module is automatically added to any graph created using the + * GraphGraphFactory. However the module is provided whenever a different graph factory is preferred. + * + * @since 0.1 + */ public class GrailModule implements Module { private final Map<String, Set<String>> hierarchy; + /** + * Creates a new GraphModule with a typing engine that can recognize the specified types. While these types still + * need to be included in a separate TypedModule they must be created here as well to ensure proper look-ups occur. + * + * @param types Class types known to the typing engine. + * @since 0.1 + */ public GrailModule(final Collection<? extends Class<?>> types) { this.hierarchy = GrailModule.constructTypedHierarchy(types); } diff --git a/src/main/java/com/syncleus/grail/graph/ReflectionUtility.java b/src/main/java/com/syncleus/grail/graph/ReflectionUtility.java index 90037e43756a2ec21a58ec66a7f07d4c59ce3296..d271e95224fa68d1557e4fc14f7cea7df055ded7 100644 --- a/src/main/java/com/syncleus/grail/graph/ReflectionUtility.java +++ b/src/main/java/com/syncleus/grail/graph/ReflectionUtility.java @@ -20,10 +20,25 @@ package com.syncleus.grail.graph; import com.tinkerpop.frames.modules.typedgraph.*; +/** + * The reflection utility is a helper class that can be used to determine the GRAIL specific annotations present on a + * class. + * + * @since 0.1 + */ final class ReflectionUtility { + //Utility class can not be instantiated private ReflectionUtility() { } + /** + * Gets the TypeValue annotation specified on this class, throws a runtime exception if there is none. This only + * checks the direct class and does not check parent classes for the annotation. + * + * @param type The class type to check for annotations. + * @return The TypeValue assigned to the specified class. + * @since 0.1 + */ public static TypeValue determineTypeValue(final Class<?> type) { final TypeValue typeValue = type.getDeclaredAnnotation(TypeValue.class); if( typeValue == null ) @@ -31,6 +46,15 @@ final class ReflectionUtility { return typeValue; } + /** + * Gets the TypeField annotation associated with the given class. If the specified class does not have a TypeField + * annotation than each parent class is checked until one is found, at which point it is returned. If not TypeField + * annotation can be found a runtime exception is thrown. + * + * @param type The class type to check for annotations. + * @return The TypeField assigned to the specified class, or one of its parent classes. + * @since 0.1 + */ public static TypeField determineTypeField(final Class<?> type) { TypeField typeField = type.getAnnotation(TypeField.class); if( typeField == null ) { @@ -48,7 +72,7 @@ final class ReflectionUtility { return typeField; } - public static TypeField determineTypeFieldRecursive(final Class<?> type) { + private static TypeField determineTypeFieldRecursive(final Class<?> type) { TypeField typeField = type.getAnnotation(TypeField.class); if( typeField == null ) { final Class<?>[] parents = type.getInterfaces(); diff --git a/src/main/java/com/syncleus/grail/graph/TypedAdjacencyMethodHandler.java b/src/main/java/com/syncleus/grail/graph/TypedAdjacencyMethodHandler.java index f82bd1761bddd981fd1d2a03de40275d1783751b..9825b6a4f7d143480d3d291708408a25df505de9 100644 --- a/src/main/java/com/syncleus/grail/graph/TypedAdjacencyMethodHandler.java +++ b/src/main/java/com/syncleus/grail/graph/TypedAdjacencyMethodHandler.java @@ -28,10 +28,24 @@ import com.tinkerpop.gremlin.java.GremlinPipeline; import java.lang.reflect.Method; import java.util.*; +/** + * A TinkerPop method handler that implemented the TypedAdjacency Annotation. + * + * @since 0.1 + */ public class TypedAdjacencyMethodHandler implements MethodHandler<TypedAdjacency> { private final Map<String, Set<String>> hierarchy; + /** + * Creates a new method handler with the specified hierarchy map. The hierarchy map has as a key all the TypeValue's + * value property from all the classes known to the typing engine. The value associated with each key is a set of + * TypeValue value parameters for all the children classes which also have a TypeValue. For convenience purposes the + * key will always be present as a single element in the set. This is because a class is always a type of itself. + * + * @param hierarchy the TypeValue hierarchy of all classes known to the typing engine. + * @since 0.1 + */ public TypedAdjacencyMethodHandler(final Map<String, Set<String>> hierarchy) { this.hierarchy = hierarchy; } diff --git a/src/main/java/com/syncleus/grail/graph/TypedIncidenceMethodHandler.java b/src/main/java/com/syncleus/grail/graph/TypedIncidenceMethodHandler.java index 782d45faca2eea5e156d3a7fabf03d7edd28b411..baaf5fe78bb9b49b4ea47f07a1e41cc068372db4 100644 --- a/src/main/java/com/syncleus/grail/graph/TypedIncidenceMethodHandler.java +++ b/src/main/java/com/syncleus/grail/graph/TypedIncidenceMethodHandler.java @@ -27,10 +27,24 @@ import com.tinkerpop.gremlin.java.GremlinPipeline; import java.lang.reflect.*; import java.util.*; +/** + * A TinkerPop method handler that implemented the TypedIncidence Annotation. + * + * @since 0.1 + */ public class TypedIncidenceMethodHandler implements MethodHandler<TypedIncidence> { private final Map<String, Set<String>> hierarchy; + /** + * Creates a new method handler with the specified hierarchy map. The hierarchy map has as a key all the TypeValue's + * value property from all the classes known to the typing engine. The value associated with each key is a set of + * TypeValue value parameters for all the children classes which also have a TypeValue. For convenience purposes the + * key will always be present as a single element in the set. This is because a class is always a type of itself. + * + * @param hierarchy the TypeValue hierarchy of all classes known to the typing engine. + * @since 0.1 + */ public TypedIncidenceMethodHandler(final Map<String, Set<String>> hierarchy) { this.hierarchy = hierarchy; } diff --git a/src/main/java/com/syncleus/grail/graph/action/AbstractActionTrigger.java b/src/main/java/com/syncleus/grail/graph/action/AbstractActionTrigger.java index 933905d9aefc1c3ed78c7f70da3630924676ffdf..6d81fc2fdfe53a517eaa483004e7bea5e1a6580a 100644 --- a/src/main/java/com/syncleus/grail/graph/action/AbstractActionTrigger.java +++ b/src/main/java/com/syncleus/grail/graph/action/AbstractActionTrigger.java @@ -21,6 +21,12 @@ package com.syncleus.grail.graph.action; import java.lang.reflect.Method; import java.util.*; +/** + * This is the Java handler class associated with the ActionTrigger type. It doesnt do much, as it is expected to be + * extended. It does however construct a reflection cache of Action annotations on previously seen classes. + * + * @since 0.1 + */ public abstract class AbstractActionTrigger implements ActionTrigger { private static final Map<Class<?>, Map<String, Set<Method>>> ACTION_METHOD_CACHE = new HashMap<>(); diff --git a/src/main/java/com/syncleus/grail/graph/action/AbstractPrioritySerialTrigger.java b/src/main/java/com/syncleus/grail/graph/action/AbstractPrioritySerialTrigger.java index a040d5ddfc53bab762a1719c344eba84d40bd9e4..5f872d46107268373ff60acf0fbe139b8501e3ef 100644 --- a/src/main/java/com/syncleus/grail/graph/action/AbstractPrioritySerialTrigger.java +++ b/src/main/java/com/syncleus/grail/graph/action/AbstractPrioritySerialTrigger.java @@ -28,6 +28,12 @@ import com.tinkerpop.pipes.util.structures.Pair; import java.lang.reflect.*; import java.util.*; +/** + * This is the Java handler class associated with the ActionTrigger type. It defines how the Trigger is to be executed. + * In this case all triggers are executed in serial within the current thread. + * + * @since 0.1 + */ public abstract class AbstractPrioritySerialTrigger extends AbstractActionTrigger implements PrioritySerialTrigger, JavaHandlerContext { @Override public void trigger() { diff --git a/src/main/java/com/syncleus/grail/graph/action/PrioritySerialTrigger.java b/src/main/java/com/syncleus/grail/graph/action/PrioritySerialTrigger.java index 2f7d1f79d656e9da57384103b1f3387988078703..1ef98288a4a5cd399309d33c982439896ac9b1b8 100644 --- a/src/main/java/com/syncleus/grail/graph/action/PrioritySerialTrigger.java +++ b/src/main/java/com/syncleus/grail/graph/action/PrioritySerialTrigger.java @@ -33,6 +33,14 @@ import com.tinkerpop.frames.modules.typedgraph.TypeValue; @TypeValue("PrioritySerialTrigger") @JavaHandlerClass(AbstractPrioritySerialTrigger.class) public interface PrioritySerialTrigger extends ActionTrigger { + /** + * This will initiate the execution of the action's triggered by this node. The trigger method is also annotated as + * an action with label actionTrigger. This allows for multiple ActionTrigger classes to be chained together. + * Specifically this class executes the triggers in serial by order of the edge's priority value property. All the + * actions are executed in series in the existing thread. + * + * @since 0.1 + */ @JavaHandler @Action("actionTrigger") @Override diff --git a/src/main/java/com/syncleus/grail/graph/action/package-info.java b/src/main/java/com/syncleus/grail/graph/action/package-info.java new file mode 100644 index 0000000000000000000000000000000000000000..6c93e9f71d206c86d1cc2ea2cc3725f868841cc5 --- /dev/null +++ b/src/main/java/com/syncleus/grail/graph/action/package-info.java @@ -0,0 +1,27 @@ +/****************************************************************************** + * * + * Copyright: (c) Syncleus, Inc. * + * * + * You may redistribute and modify this source code under the terms and * + * conditions of the Open Source Community License - Type C version 1.0 * + * or any later version as published by Syncleus, Inc. at www.syncleus.com. * + * There should be a copy of the license included with this file. If a copy * + * of the license is not included you are granted no right to distribute or * + * otherwise use this file except through a legal and valid license. You * + * should also contact Syncleus, Inc. at the information below if you cannot * + * find a license: * + * * + * Syncleus, Inc. * + * 2604 South 12th Street * + * Philadelphia, PA 19148 * + * * + ******************************************************************************/ + +/** + * The action package houses all the framework to facilitate action triggers. Action triggers are responsible for + * triggering and propagating actions across a graph. Action triggers can define the order in which actions take place + * as well as how they are executed. + * + * @since 0.1 + */ +package com.syncleus.grail.graph.action; \ No newline at end of file diff --git a/src/main/java/com/syncleus/grail/graph/package-info.java b/src/main/java/com/syncleus/grail/graph/package-info.java new file mode 100644 index 0000000000000000000000000000000000000000..c503a84576b30b0932f4c2500b12b81d004cc392 --- /dev/null +++ b/src/main/java/com/syncleus/grail/graph/package-info.java @@ -0,0 +1,25 @@ +/****************************************************************************** + * * + * Copyright: (c) Syncleus, Inc. * + * * + * You may redistribute and modify this source code under the terms and * + * conditions of the Open Source Community License - Type C version 1.0 * + * or any later version as published by Syncleus, Inc. at www.syncleus.com. * + * There should be a copy of the license included with this file. If a copy * + * of the license is not included you are granted no right to distribute or * + * otherwise use this file except through a legal and valid license. You * + * should also contact Syncleus, Inc. at the information below if you cannot * + * find a license: * + * * + * Syncleus, Inc. * + * 2604 South 12th Street * + * Philadelphia, PA 19148 * + * * + ******************************************************************************/ + +/** + * The graph package handles all the base framework for querying, traversing, and persisting to and from a GRAIL graph. + * + * @since 0.1 + */ +package com.syncleus.grail.graph; \ No newline at end of file