######################################################################
#
# EPrints::Const
#
######################################################################
#
#
######################################################################

=pod

=for Pod2Wiki

=head1 NAME

B<EPrints::Const> - Constants and enumerations.

=head1 DESCRIPTION

This module contains EPrints constants and enumerations.

=head2 SYNOPSIS

    # don't import any constants
    use EPrints::Const qw();

    # import trigger and http constants
    use EPrints::Const qw( :trigger :http );

    # import only the OK DONE DECLINED constants
    use EPrints::Const qw( OK DONE DECLINED );

=head1 CONSTANTS

=head2 :namespace

=over 4

=item EP_NS_CITATION

http://eprints.org/ep3/citation

=item EP_NS_DATA

http://eprints.org/ep2/data/2.0

=item EP_NS_XSLT

http://eprints.org/ep2/xslt/1.0

=item EP_NS_OPENSEARCH

http://a9.com/-/spec/opensearch/1.1/

=back

=head2 :xml

=over 4

=item XML_ELEMENT_NODE

=item XML_ATTRIBUTE_NODE

=item XML_TEXT_NODE

=item XML_CDATA_SECTION_NODE

=item XML_ENTITY_REFERENCE_NODE

B<XML_ENTITY_REF_NODE> shares the same constant value.

=item XML_ENTITY_NODE

=item XML_PROCESSING_INSTRUCTION_NODE

=item XML_COMMENT_NODE

=item XML_DOCUMENT_NODE

=item XML_DOCUMENT_TYPE_NODE

=item XML_DOCUMENT_FRAGMENT_NODE

=item XML_NOTATION_NODE

=back

=head2 :http

Also, all HTTP_* constants defined by L<Apache2::Const>.

=over 4

=item DONE

=item DECLINED

=item NOT_FOUND

=item OK

=back

=head2 :trigger

See L<EPrints::RepositoryConfig/add_trigger> and L<EPrints::RepositoryConfig/add_dataset_trigger>.

=over 4

=item EP_TRIGGER_DONE

Stop processing triggers immediately and return.

=item EP_TRIGGER_OK

Continue normal processing.

=item EP_TRIGGER_LOG

=item EP_TRIGGER_BOILERPLATE_RDF

=item EP_TRIGGER_REPOSITORY_RDF

=item EP_TRIGGER_BEGIN

Called immediately after the 'session_init' config method (see archive config or lib/cfg.d/session.pl). These triggers should not set a return value, so all of them can run. Could be used to pre-cache information in the session, or other 'expensive' tasks that should run once.

=item EP_TRIGGER_BEGIN_REQUEST

Called after L<EPrints::Repository/init_from_request>.

=item EP_TRIGGER_END_REQUEST

Called just before L<EPrints::Repository/cleanup> in response to a mod_perl request.

=item EP_TRIGGER_END

Called immediately before the 'session_close' config method (see archive config or lib/cfg.d/session.pl). These triggers should not set a return value, so the whole stack can run.

=item EP_TRIGGER_URL_REWRITE

Called for every request that is within the repository's path. Use this to redirect the user to a different location. C<return_code> is a scalar reference, therefore you must deference when assigning a new value C<${$rc} = CODE>.

	request - mod_perl request object
	lang - current language id
	args - request arguments "?..."
	urlpath - EPrint's HTTP root
	cgipath - EPrints's HTTP cgi root
	uri - request uri "/eprints/12/"
	secure - whether under HTTPS
	return_code - reference to return code

=item EP_TRIGGER_DOC_URL_REWRITE

Similar to the EP_TRIGGER_URL_REWRITE trigger, but is active when the request is for a document. Can be used to return variant versions of a document. It has the following additional parameters passed to it:

	eprint - EPrint object that owns the requested document
	document - Document object being requested
	filename - Filename - initially taken from end of the URI
	relations - if the document position path in the URL has digits followed by a '.', this is the rest of that path component, split on '.'s  e.g. hassmallThumbnailVersion

=item EP_TRIGGER_CREATED

Called after $dataset->create_dataobj( { ... } ).

	dataobj - the newly created dataobj

=item EP_TRIGGER_REMOVED

Called just before the object is removed from the database.

	dataobj - the object being removed

=item EP_TRIGGER_RDF

=item EP_TRIGGER_DEFAULTS

=item EP_TRIGGER_STATUS_CHANGE

=item EP_TRIGGER_BEFORE_COMMIT

=item EP_TRIGGER_AFTER_COMMIT

=item EP_TRIGGER_VALIDATE

=item EP_TRIGGER_VALIDATE_FIELD

Validate a field's value.

	field - field to validate
	value - value to validate
	dataobj - parent dataobj (if available)
	problems - ARRAYREF of DOM problems encountered

=item EP_TRIGGER_WARNINGS

=item EP_TRIGGER_FILES_MODIFIED

=item EP_TRIGGER_MEDIA_INFO

Populate a Document epdata structure with information about a file.

	epdata
	filename
	filepath

=item EP_TRIGGER_THUMBNAIL_TYPES

Manipulate the list of thumbnail types that will be generated for a given user-uploaded document.

	types - array reference of types (strings)
	dataobj - document object

=item EP_TRIGGER_INDEX_FIELDS

Add the changed fields for the given data object to the index engine(s).

	dataobj = EPrints::DataObj
	fields = ARRAYREF of field objects

=item EP_TRIGGER_INDEX_REMOVED

An object was removed and should now be removed from the index engine(s).

	dataset = EPrints::DataSet
	id = object id

=item EP_TRIGGER_DYNAMIC_TEMPLATE

Manipulate parts included in the template. These will be called for every page impression, so don't do anything heavyweight in here.

	pins - hash ref of template pins

=item EP_TRIGGER_LOCAL_SITEMAP_URLS

Manipulate the URLs added to the local sitemaps.

	urlset - the set of all URLs to include in the sitemap.

=head2 :metafield

=item EP_PROPERTY_FROM_CONFIG

Get the default value from field defaults in the config.

=item EP_PROPERTY_NO_CHANGE

Don't use a default, the code may have already set this value. setting it to undef has no effect rather than setting it to default value.

=item EP_PROPERTY_REQUIRED

This field property must be explicitly set.

=item EP_PROPERTY_UNDEF

This field property defaults to undef.

=item EP_PROPERTY_TRUE

This field property defaults to true.

=item EP_PROPERTY_FALSE

This field property defaults to false.

=head2 :crypt

One-way encryption methods for passwords, see L<EPrints::Utils/crypt>.

=item EP_CRYPT_CRYPT

L<perlfunc/crypt>.

=item EP_CRYPT_SHA512

L<Digest::SHA> sha512 with 2-byte salt and 10000 rounds.

=item EP_CRYPT_BCRYPT_REHASH

Rehashes legacy hash (C<EP_CRYPT_SHA512>) using L<Crypt::Eksblowfish::Bcrypt>.

=item EP_CRYPT_BCRYPT

L<Crypt::Eksblowfish::Bcrypt>


=back

=cut

package EPrints::Const;

use Apache2::Const qw(:common :http);
use Exporter;
@ISA = qw( Exporter );

# Namespaces
use constant {
	EP_NS_XSLT => "http://eprints.org/ep2/xslt/1.0",
	EP_NS_CITATION => "http://eprints.org/ep3/citation",
	EP_NS_DATA => "http://eprints.org/ep2/data/2.0",
	EP_NS_OPENSEARCH => "http://a9.com/-/spec/opensearch/1.1/",
};

# XML Node Types
use constant {
	XML_ELEMENT_NODE => 1,
	XML_ATTRIBUTE_NODE => 2,
	XML_TEXT_NODE => 3,
	XML_CDATA_SECTION_NODE => 4,
	XML_ENTITY_REFERENCE_NODE => 5,
	XML_ENTITY_REF_NODE => 5, # synonym for XML::LibXML
	XML_ENTITY_NODE => 6,
	XML_PROCESSING_INSTRUCTION_NODE => 7,
	XML_COMMENT_NODE => 8,
	XML_DOCUMENT_NODE => 9,
	XML_DOCUMENT_TYPE_NODE => 10,
	XML_DOCUMENT_FRAGMENT_NODE => 11,
	XML_NOTATION_NODE => 12,
};

use constant {
	EP_TRIGGER_DONE => -2,
	EP_TRIGGER_OK => 0,
};

# Repository triggers
use constant {
	EP_TRIGGER_LOG => 2,
	EP_TRIGGER_BOILERPLATE_RDF => 3,
	EP_TRIGGER_REPOSITORY_RDF => 4,
	EP_TRIGGER_BEGIN => 5,
	EP_TRIGGER_BEGIN_REQUEST => 6,
	EP_TRIGGER_END_REQUEST => 7,
	EP_TRIGGER_END => 8,
	EP_TRIGGER_DOC_URL_REWRITE => 9,
	EP_TRIGGER_MEDIA_INFO => 10,
	EP_TRIGGER_INDEX_FIELDS => 11,
	EP_TRIGGER_INDEX_REMOVED => 12,
	EP_TRIGGER_URL_REWRITE => 13,
	EP_TRIGGER_VALIDATE_FIELD => 14,
	EP_TRIGGER_LOCAL_SITEMAP_URLS => 15,
	EP_TRIGGER_DYNAMIC_TEMPLATE => 16,
	EP_TRIGGER_THUMBNAIL_TYPES => 17,
};

# Dataset triggers
use constant {
	EP_TRIGGER_CREATED => 100,
	EP_TRIGGER_RDF => 101,
	EP_TRIGGER_DEFAULTS => 102,
	EP_TRIGGER_STATUS_CHANGE => 103,
	EP_TRIGGER_BEFORE_COMMIT => 104,
	EP_TRIGGER_AFTER_COMMIT => 105,
	EP_TRIGGER_VALIDATE => 106,
	EP_TRIGGER_WARNINGS => 107,
	EP_TRIGGER_FILES_MODIFIED => 108,
	EP_TRIGGER_REMOVED => 109,
};

# Field properties
use constant {
	EP_PROPERTY_FROM_CONFIG => "\0\1",
	EP_PROPERTY_NO_CHANGE => "\0\2",
	EP_PROPERTY_REQUIRED => "\0\3",
	EP_PROPERTY_UNDEF => "\0\4",

	EP_PROPERTY_TRUE => 1,
	EP_PROPERTY_FALSE => "\0\4", # don't set hash attribute
};

# Crypt methods

use constant {
	EP_CRYPT_CRYPT => 1,
	EP_CRYPT_SHA512 => 2,
	EP_CRYPT_BCRYPT_REHASH => 3,
	EP_CRYPT_BCRYPT => 4,
};

@xml = qw(
	XML_ELEMENT_NODE
	XML_ATTRIBUTE_NODE
	XML_TEXT_NODE
	XML_CDATA_SECTION_NODE
	XML_ENTITY_REFERENCE_NODE
	XML_ENTITY_REF_NODE
	XML_ENTITY_NODE
	XML_PROCESSING_INSTRUCTION_NODE
	XML_COMMENT_NODE
	XML_DOCUMENT_NODE
	XML_DOCUMENT_TYPE_NODE
	XML_DOCUMENT_FRAGMENT_NODE
	XML_NOTATION_NODE
);

@namespace = qw(
	EP_NS_XSLT
	EP_NS_CITATION
	EP_NS_DATA
	EP_NS_OPENSEARCH
);

@http = qw(
	DONE
	DECLINED
	NOT_FOUND
	OK

	HTTP_ACCEPTED
	HTTP_BAD_GATEWAY
	HTTP_BAD_REQUEST
	HTTP_CONFLICT
	HTTP_CONTINUE
	HTTP_CREATED
	HTTP_EXPECTATION_FAILED
	HTTP_FAILED_DEPENDENCY
	HTTP_FORBIDDEN
	HTTP_GATEWAY_TIME_OUT
	HTTP_GONE
	HTTP_INSUFFICIENT_STORAGE
	HTTP_INTERNAL_SERVER_ERROR
	HTTP_LENGTH_REQUIRED
	HTTP_LOCKED
	HTTP_METHOD_NOT_ALLOWED
	HTTP_MOVED_PERMANENTLY
	HTTP_MOVED_TEMPORARILY
	HTTP_MULTIPLE_CHOICES
	HTTP_MULTI_STATUS
	HTTP_NON_AUTHORITATIVE
	HTTP_NOT_ACCEPTABLE
	HTTP_NOT_EXTENDED
	HTTP_NOT_FOUND
	HTTP_NOT_IMPLEMENTED
	HTTP_NOT_MODIFIED
	HTTP_NO_CONTENT
	HTTP_OK
	HTTP_PARTIAL_CONTENT
	HTTP_PAYMENT_REQUIRED
	HTTP_PRECONDITION_FAILED
	HTTP_PROCESSING
	HTTP_PROXY_AUTHENTICATION_REQUIRED
	HTTP_RANGE_NOT_SATISFIABLE
	HTTP_REQUEST_ENTITY_TOO_LARGE
	HTTP_REQUEST_TIME_OUT
	HTTP_REQUEST_URI_TOO_LARGE
	HTTP_RESET_CONTENT
	HTTP_SEE_OTHER
	HTTP_SERVICE_UNAVAILABLE
	HTTP_SWITCHING_PROTOCOLS
	HTTP_TEMPORARY_REDIRECT
	HTTP_UNAUTHORIZED
	HTTP_UNPROCESSABLE_ENTITY
	HTTP_UNSUPPORTED_MEDIA_TYPE
	HTTP_UPGRADE_REQUIRED
	HTTP_USE_PROXY
	HTTP_VARIANT_ALSO_VARIES
);

@trigger = qw(
	EP_TRIGGER_DONE
	EP_TRIGGER_OK

	EP_TRIGGER_LOG
	EP_TRIGGER_BOILERPLATE_RDF
	EP_TRIGGER_REPOSITORY_RDF
	EP_TRIGGER_BEGIN
	EP_TRIGGER_BEGIN_REQUEST
	EP_TRIGGER_END_REQUEST
	EP_TRIGGER_END
	EP_TRIGGER_URL_REWRITE
	EP_TRIGGER_DOC_URL_REWRITE
	EP_TRIGGER_MEDIA_INFO
	EP_TRIGGER_INDEX_FIELDS
	EP_TRIGGER_INDEX_REMOVED
	EP_TRIGGER_VALIDATE_FIELD
	EP_TRIGGER_LOCAL_SITEMAP_URLS
	EP_TRIGGER_DYNAMIC_TEMPLATE
	EP_TRIGGER_THUMBNAIL_TYPES

	EP_TRIGGER_CREATED
	EP_TRIGGER_RDF
	EP_TRIGGER_DEFAULTS
	EP_TRIGGER_STATUS_CHANGE
	EP_TRIGGER_BEFORE_COMMIT
	EP_TRIGGER_AFTER_COMMIT
	EP_TRIGGER_VALIDATE
	EP_TRIGGER_WARNINGS
	EP_TRIGGER_FILES_MODIFIED
	EP_TRIGGER_REMOVED
);

@metafield = qw(
	EP_PROPERTY_FROM_CONFIG
	EP_PROPERTY_NO_CHANGE
	EP_PROPERTY_REQUIRED
	EP_PROPERTY_UNDEF
	EP_PROPERTY_TRUE
	EP_PROPERTY_FALSE
);

@crypt = qw(
	EP_CRYPT_CRYPT
	EP_CRYPT_SHA512
	EP_CRYPT_BCRYPT_REHASH
	EP_CRYPT_BCRYPT
);

@EXPORT_OK = (@xml, @namespace, @http, @trigger, @metafield, @crypt);
@EXPORT = ();
%EXPORT_TAGS = (
	xml => \@xml,
	namespace => \@namespace,
	http => \@http,
	trigger => \@trigger,
	metafield => \@metafield,
	crypt => \@crypt,
);

use strict;

1;

=head1 COPYRIGHT

=begin COPYRIGHT

Copyright 2022 University of Southampton.
EPrints 3.4 is supplied by EPrints Services.

http://www.eprints.org/eprints-3.4/

=end COPYRIGHT

=begin LICENSE

This file is part of EPrints 3.4 L<http://www.eprints.org/>.

EPrints 3.4 and this file are released under the terms of the
GNU Lesser General Public License version 3 as published by
the Free Software Foundation unless otherwise stated.

EPrints 3.4 is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with EPrints 3.4.
If not, see L<http://www.gnu.org/licenses/>.

=end LICENSE

