package org.basex.query;
import java.lang.annotation.*;
/**
* <p>The XQuery {@code import module} statement can be used to import XQuery modules
* as well as Java instances, which will be treated as modules. Any class with a public,
* empty constructor can be imported as module.</p>
*
* <p>If a class extends the {@link QueryModule} class, it inherits the {@link #queryContext}
* and {@link #staticContext} variables, which provide access to all properties of the
* current query. E.g., they provide access to the current {@link QueryContext#value
* context value} or the {@link StaticContext#ns declared namespaces} of a query.</p>
*
* <p>The default properties of functions can be overwritten via annotations:</p>
* <ul>
* <li>Java functions can only be executed by users with {@code ADMIN} permissions.
* You may annotate a function with {@link Requires}({@link Permission}) to
* also make it accessible to users with less privileges.</li>
* <li>Java code is treated as "non-deterministic", as its behavior cannot
* be predicted by the XQuery processor. You may annotate a function as
* {@link Deterministic} if you know that it will have no side-effects and will
* always yield the same result.</li>
* <li>Java code is treated as "context-independent". If a function accesses
* the specified {@link #queryContext}, it should be annotated as
* {@link ContextDependent}.</li>
* <li>Java code is treated as "focus-independent". If a function accesses
* the current context value, position or size, it should be annotated as
* {@link FocusDependent}.</li>
* </ul>
*
* If the {@link QueryResource} is implemented, its {@link QueryResource#close()} method will be
* called after the query has been evaluated. It should always be implemented if a module opens
* connections, resources, etc. that eventually need to be closed.
*
* <p>Please visit our documentation to find more details on
* <a href="http://docs.basex.org/wiki/Packaging">Packaging</a>,
* <a href="http://docs.basex.org/wiki/Java_Bindings">Java Bindings</a> and
* <a href="http://docs.basex.org/wiki/User_Management">User Management</a>.
* The XQuery 3.0 specification gives more insight into
* <a href="http://www.w3.org/TR/xpath-functions-30/#properties-of-functions">function
* properties</a>.</p>
*
* @author BaseX Team 2005-17, BSD License
* @author Christian Gruen
*/
public abstract class QueryModule {
/**
* Permission required to call a function.
*/
public enum Permission {
/** No permissions. */
NONE,
/** Read permissions. */
READ,
/** Write permissions. */
WRITE,
/** Create permissions. */
CREATE,
/** Admin permissions. */
ADMIN
}
/**
* Java functions can only be executed by users with {@code ADMIN} permissions.
* You may annotate a function with {@link Requires}({@link Permission}) to
* also make it accessible to other users with less permissions.
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Requires {
/**
* Permission.
* @return value
*/
Permission value();
}
/**
* Java code is treated as "non-deterministic", as its behavior cannot be predicted from
* the XQuery processor. You may annotate a function as {@link Deterministic} if you
* know that it will have no side-effects and will always yield the same result.
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Deterministic { }
/**
* Java code is treated as "context-independent". If a function accesses the specified
* {@link #queryContext}, it should be annotated as {@link ContextDependent}.
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface ContextDependent { }
/**
* Java code is treated as "focus-independent". If a function accesses the current
* context value, position or size, it should be annotated as {@link FocusDependent}.
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface FocusDependent { }
/**
* Set additional locks to be fetched. These are useful if a module accesses external
* resources which must be under concurrency control. These locks are in a "java module
* namespace" and do not interfere with user locks or databases with the same name.
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Lock {
/**
* Read locks.
* @return read locks
*/
String[] read() default { };
/**
* Write locks.
* @return write locks
*/
String[] write() default { };
}
/** Global query context. */
public QueryContext queryContext;
/** Static context. */
public StaticContext staticContext;
}