<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://wiki.eprints.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Sf03r%40ecs.soton.ac.uk</id>
	<title>EPrints Documentation - User contributions [en-gb]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.eprints.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Sf03r%40ecs.soton.ac.uk"/>
	<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/Special:Contributions/Sf03r@ecs.soton.ac.uk"/>
	<updated>2026-08-01T14:20:27Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.31.8</generator>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=Main_Page&amp;diff=10961</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=Main_Page&amp;diff=10961"/>
		<updated>2014-06-17T15:16:26Z</updated>

		<summary type="html">&lt;p&gt;Sf03r@ecs.soton.ac.uk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Rubbish]]&lt;br /&gt;
__NOTOC__&lt;br /&gt;
&lt;br /&gt;
'''Welcome to the EPrints Wiki'''&lt;br /&gt;
&lt;br /&gt;
This wiki contains technical and user-contributed documentation for the [[Introduction|EPrints software]].&lt;br /&gt;
&lt;br /&gt;
[http://demoprints3.eprints.org/ Demoprints] is our live, online server that allows anyone to try EPrints without having to install it first.&lt;br /&gt;
&lt;br /&gt;
For more information on the EPrints project and related activities visit http://eprints.org/.&lt;br /&gt;
&lt;br /&gt;
== Download EPrints ==&lt;br /&gt;
&lt;br /&gt;
{{Download}}&lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;br /&gt;
&lt;br /&gt;
* [[:Category:Installation|Installing]] EPrints on various platforms&lt;br /&gt;
&lt;br /&gt;
==Getting Started==&lt;br /&gt;
&lt;br /&gt;
* [[EPrints Manual|EPrints 3 Documentation]]&lt;br /&gt;
* [http://www.eprints.org/software/training/ Training materials] provided by EPrints Services.&lt;br /&gt;
* [[Frequently Asked Questions]]&lt;br /&gt;
* [[:Category:Howto|How to...]]&lt;br /&gt;
* [[IRStats2 API]]&lt;br /&gt;
&lt;br /&gt;
==Getting Support==&lt;br /&gt;
&lt;br /&gt;
* [http://www.eprints.org/services/ EPrints Services] - premium support, training and hosting from EPrints experts&lt;br /&gt;
* [[Contact]] - mailing lists, bug reports etc.&lt;br /&gt;
&lt;br /&gt;
==Add-ons, patches and translations==&lt;br /&gt;
&lt;br /&gt;
* The [http://files.eprints.org/ EPrints Files Repository] contains add-on and 3rd party scripts, patches and translations. This also provides an archive of all previous EPrints releases (3.0 onwards).&lt;br /&gt;
* [[:Category:Plugins|Plugins]]: Some Wiki pages about scripts and patches.&lt;br /&gt;
&lt;br /&gt;
{{Register}}&lt;br /&gt;
&lt;br /&gt;
==Contributing to EPrints==&lt;br /&gt;
&lt;br /&gt;
* [[Usability|EPrints usability]]&lt;br /&gt;
* [[:Category:Releases|New features in EPrints]] - released and proposed&lt;br /&gt;
* [[How to contribute|How to contribute to EPrints development]]&lt;br /&gt;
* [http://trac.eprints.org/ EPrints Trac] - access nightly builds, tickets and changes (requires free registration to view source code)&lt;br /&gt;
&lt;br /&gt;
== Content management ==&lt;br /&gt;
&lt;br /&gt;
* [[Digital preservation]]: managing content for longer-term access and use&lt;/div&gt;</summary>
		<author><name>Sf03r@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=Installing_EPrints_on_Debian/Ubuntu&amp;diff=10957</id>
		<title>Installing EPrints on Debian/Ubuntu</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=Installing_EPrints_on_Debian/Ubuntu&amp;diff=10957"/>
		<updated>2014-06-06T10:50:13Z</updated>

		<summary type="html">&lt;p&gt;Sf03r@ecs.soton.ac.uk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Debian and Ubuntu]]&lt;br /&gt;
[[Category:Installation]]&lt;br /&gt;
&lt;br /&gt;
David Tarrant has built a Debian/Ubuntu package for Eprints.&lt;br /&gt;
&lt;br /&gt;
=APT Mirrors=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Add one of the following mirrors (2 lines) to your /etc/apt/sources.list file as the root user. Please ensure that there is only one set in the file or you may not experience the correct behaviour.&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==EPrints Latest==&lt;br /&gt;
&lt;br /&gt;
To install the testing build add *one* the following to /etc/apt/sources.list:&lt;br /&gt;
&lt;br /&gt;
===Stable Builds===&lt;br /&gt;
&lt;br /&gt;
 deb http://deb.eprints.org/ stable/&lt;br /&gt;
 deb-src http://deb.eprints.org/ source/&lt;br /&gt;
&lt;br /&gt;
===Testing Builds===&lt;br /&gt;
&lt;br /&gt;
 deb http://deb.eprints.org/ unstable/&lt;br /&gt;
 deb-src http://deb.eprints.org/ source/&lt;br /&gt;
&lt;br /&gt;
===Nightly Build===&lt;br /&gt;
&lt;br /&gt;
Rather than the above add the following to /etc/apt/sources.list (note that this code is in developement and will not neccessarily compile):&lt;br /&gt;
&lt;br /&gt;
 deb http://deb.eprints.org/ nightly/&lt;br /&gt;
 deb-src http://deb.eprints.org/ source/&lt;br /&gt;
&lt;br /&gt;
==EPrints 3.X (Specific Version Locking)==&lt;br /&gt;
===Stable Release===&lt;br /&gt;
&lt;br /&gt;
Add the following to /etc/apt/sources.list:&lt;br /&gt;
&lt;br /&gt;
 deb http://deb.eprints.org/3.X/ stable/&lt;br /&gt;
 deb-src http://deb.eprints.org/3.X/ source/&lt;br /&gt;
&lt;br /&gt;
===Unstable Release===&lt;br /&gt;
&lt;br /&gt;
To install the latest '''unstable''' release add the following to /etc/apt/sources.list:&lt;br /&gt;
&lt;br /&gt;
 deb http://deb.eprints.org/3.X/ unstable/&lt;br /&gt;
 deb-src http://deb.eprints.org/3.X/ source/&lt;br /&gt;
&lt;br /&gt;
===Nightly Build===&lt;br /&gt;
&lt;br /&gt;
To install the nightly build add the following to /etc/apt/sources.list:&lt;br /&gt;
&lt;br /&gt;
 deb http://deb.eprints.org/3.X/ nightly/&lt;br /&gt;
 deb-src http://deb.eprints.org/3.X/ source/&lt;br /&gt;
&lt;br /&gt;
=Installing Eprints via apt-get=&lt;br /&gt;
&lt;br /&gt;
To install Eprints and all its dependencies execute the following (as root):&lt;br /&gt;
&lt;br /&gt;
 apt-get update&lt;br /&gt;
 apt-get install eprints&lt;br /&gt;
&lt;br /&gt;
=Setting up a Repository=&lt;br /&gt;
You should now have a working installation of eprints in /usr/share/eprints3/. Please follow the on-screen instructions to set up an eprints repository. You probably want to start with (as root):&lt;br /&gt;
&lt;br /&gt;
'''For more information about setting up an EPrints repository take a look at [[Getting Started with EPrints 3]]'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Read First: Known issues with the Debian/Ubuntu package can be found at [[Debian Known Issues]].&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 su eprints&lt;br /&gt;
 cd&lt;br /&gt;
 ./bin/epadmin create&lt;br /&gt;
 logout&lt;br /&gt;
 a2ensite eprints3&lt;br /&gt;
 apache2ctl restart&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you have any problems getting set up you can get free help and support from the EP-Tech mailing list. {{EPrintsTech}}&lt;br /&gt;
&lt;br /&gt;
=Getting and Compiling from Source (not required)=&lt;br /&gt;
&lt;br /&gt;
To install dependencies and retrieve the Eprints source execute the following:&lt;br /&gt;
&lt;br /&gt;
 apt-get update&lt;br /&gt;
 apt-get build-dep eprints&lt;br /&gt;
 apt-get source eprints&lt;br /&gt;
&lt;br /&gt;
The source will be saved to a tarball in the current directory.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Issues with Ubuntu 13/14 (Apache 2.3/2.4)=&lt;br /&gt;
&lt;br /&gt;
Apache 2.3+ and PERL v5.16+ introduce a few changes which break EPrints.&lt;br /&gt;
&lt;br /&gt;
Current patches on github are:&lt;br /&gt;
&lt;br /&gt;
* See last comment on https://github.com/eprints/eprints/issues/214  [ use of remote_ip ]&lt;br /&gt;
* https://github.com/eprints/eprints/issues/237 [ NameVirtualHost deprecated ]&lt;br /&gt;
* https://github.com/eprints/eprints/issues/236 [ Order allow,deny deprecated ]&lt;br /&gt;
* https://github.com/eprints/eprints/commit/157db0d27d423d38f9c0fc31ce47e519cd861d45 [ utf8::decode and URI parameters ]&lt;/div&gt;</summary>
		<author><name>Sf03r@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=Kieker&amp;diff=10956</id>
		<title>Kieker</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=Kieker&amp;diff=10956"/>
		<updated>2014-06-02T16:00:15Z</updated>

		<summary type="html">&lt;p&gt;Sf03r@ecs.soton.ac.uk: /* Notes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page describes what Kieker is and how to integrate it with EPrints (tested on v3.3). The Kieker framework is developed and maintained at the University of Kiel in Germany and it is a neat tool for analysing a system whether in development or in production. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==What is Kieker==&lt;br /&gt;
&lt;br /&gt;
Concretely Kieker allows you to profile and to monitor all the internal module calls (to EPrints). Any functions called will be trapped and sent to a queue for further processing.&lt;br /&gt;
&lt;br /&gt;
Kieker comes with many post-processing graphs and diagrams to see, for instance, all the calls made, the execution times, etc. This then allows you to have a global picture of the EPrints' internals in order to e.g. optimise certain parts of the system, find coupled modules, detect un-wanted loops (between modules) etc.&lt;br /&gt;
&lt;br /&gt;
Read more about it here: http://kieker-monitoring.net/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==How does it work?==&lt;br /&gt;
&lt;br /&gt;
For EPrints, Kieker uses a PERL module called Sub::WrapPackages which basically allows user to define global wrappers for internal calls. It is possible to restrict which modules are wrapped: for instance, you may want to only profile the database layer, in which case you probably want to wrap EPrints::Database and EPrints::Database::MySQL. The EPrints/Kieker extensions (https://github.com/eprints/epkieker) make it easy to set this up.&lt;br /&gt;
&lt;br /&gt;
When Kieker is enabled it will trap any selected internal calls and will send some information to a queueing system. The data sent will contain a high-precision timestamp, the name of the module, of the function etc. Traditionally Kieker uses JMS as a queueing system but we integrated it with memcached which is a popular, easy-to-install server-wide caching system.&lt;br /&gt;
&lt;br /&gt;
Once you're happy with the profiling, you can disable kieker and retrieve the data from the queue. Then you may use Kieker's built-in tools to generate all sorts of graphs. &lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Kieker===&lt;br /&gt;
&lt;br /&gt;
We used Kieker v1.9 during our tests. You may get it from: http://kieker-monitoring.net/download/&lt;br /&gt;
&lt;br /&gt;
Note that Kieker requires Java (but this can easily be installed under Ubuntu).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Required modules===&lt;br /&gt;
&lt;br /&gt;
If you're using Ubuntu, you can install the modules as follow:&lt;br /&gt;
&lt;br /&gt;
 sudo apt-get install libclass-accessor-perl libnet-stomp-perl libdevel-caller-ignorenamespaces-perl libsub-install-perl libparams-util-perl libdata-optlist-perl libsub-exporter-perl libsub-prototype-perl libsub-wrappackages-perl&lt;br /&gt;
&lt;br /&gt;
If you'd rather install them via CPAN, the above packages' name are:&lt;br /&gt;
&lt;br /&gt;
* Class::Accessor&lt;br /&gt;
* Net::Stomp&lt;br /&gt;
* Devel::Caller::IgnoreNamespaces&lt;br /&gt;
* Sub::Install&lt;br /&gt;
* Params::Util&lt;br /&gt;
* Data::OptList&lt;br /&gt;
* Sub::Exporter&lt;br /&gt;
* Sub::Prototype&lt;br /&gt;
* Sub::WrapPackages&lt;br /&gt;
&lt;br /&gt;
You must also install memcached, if not already present on your server:&lt;br /&gt;
&lt;br /&gt;
 sudo apt-get install memcached libcache-memcached-fast-perl&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===EPrints/Kieker extensions===&lt;br /&gt;
&lt;br /&gt;
You need to copy a few modules from https://github.com/eprints/epkieker to finalise the installation of Kieker, to run with EPrints.&lt;br /&gt;
&lt;br /&gt;
If EPrints is install under its default path /opt/eprints3 (otherwise adjust the paths):&lt;br /&gt;
&lt;br /&gt;
 cp -rf perl_lib/Kieker* /opt/eprints3/perl_lib&lt;br /&gt;
 cp perl_lib/EPrints/Apache/KiekerHandler.pm /opt/eprints3/perl_lib/EPrints/Apache&lt;br /&gt;
 cp -rf bin/kieker /opt/eprints3/archives/&amp;lt;id&amp;gt;/bin/&lt;br /&gt;
&lt;br /&gt;
And you're done.&lt;br /&gt;
&lt;br /&gt;
===Configuration===&lt;br /&gt;
&lt;br /&gt;
There are only a few options you need to edit to configure Kieker, which are in /opt/eprints3/perl_lib/EPrints/Apache/KiekerHandler.pm.&lt;br /&gt;
&lt;br /&gt;
Any time you make a configuration change, you must restart Apache.&lt;br /&gt;
&lt;br /&gt;
====Monitored URI====&lt;br /&gt;
&lt;br /&gt;
This option allows you to restrict the URI which will capture profiling data. For instance, if you have a problem with searching, you may want to set this to &amp;quot;/cgi/search&amp;quot;. To do the same with the browse views, use &amp;quot;/view/&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Some examples:&lt;br /&gt;
&lt;br /&gt;
 my $MONIT_URI = &amp;quot;/&amp;quot;;                 # monitors &amp;quot;/&amp;quot; ie. /index.html&lt;br /&gt;
 my $MONIT_URI = /cgi/search&amp;quot;;        # monitors the search&lt;br /&gt;
 my $MONIT_URI = &amp;quot;/view/year/&amp;quot;;       # monitors the browse view &amp;quot;by year&amp;quot;&lt;br /&gt;
 my $MONIT_URI = &amp;quot;/cgi/users/home&amp;quot;;   # monitors the user (logged-in) area&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Monitored IP====&lt;br /&gt;
&lt;br /&gt;
It can be dangerous to allow monitoring for any clients using your repository (if using Kieker on a production server). This will slow down the system for everyone, as well as generating lots of useless data.&lt;br /&gt;
&lt;br /&gt;
This option is there to restrict which IP address enables monitoring. At the moment it can only be a single IP address, you cannot specify network blocks. If you want to monitor EPrints then this should probably be set to your IP (v4) address.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
 my $MONIT_URI = &amp;quot;124.3.45.7&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Monitored Packages====&lt;br /&gt;
&lt;br /&gt;
Remember I told you that, with PERL, Kieker wraps any modules? Well this last option allows you to specify which modules will be wrapped hence which modules will be monitored. Anything outside of the selected scope will not be monitored and will not generate any data.&lt;br /&gt;
&lt;br /&gt;
Some common examples:&lt;br /&gt;
&lt;br /&gt;
 my $MONIT_PACKAGES = &amp;quot;EPrints EPrints::*&amp;quot;;                            # any EPrints call&lt;br /&gt;
 my $MONIT_PACKAGES = &amp;quot;EPrints::Database EPrints::Database::*&amp;quot;;        # anything relating to EPrints' Database layer&lt;br /&gt;
 my $MONIT_PACKAGES = &amp;quot;EPrints::Plugin::Screen::Items;&amp;quot;                # the &amp;quot;Manage deposits&amp;quot; page&lt;br /&gt;
 my $MONIT_PACKAGES = &amp;quot;EPrints::MetaField::* EPrints::XML;&amp;quot;            # EPrints' metafield layer, in relation to the XML module&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Enabling/Disabling Kieker===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Typically EPrints tells Apache that it handles *any* web requests for a given virtual host (the URL of your repository).&lt;br /&gt;
&lt;br /&gt;
The line responsible for this delegation is inside /opt/eprints3/cfg/apache/&amp;lt;id&amp;gt;.conf:&lt;br /&gt;
&lt;br /&gt;
 PerlTransHandler +EPrints::Apache::Rewrite&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
We just need to set this to the Kieker handler to enable Kieker:&lt;br /&gt;
&lt;br /&gt;
 PerlTransHandler +EPrints::Apache::KiekerPerlHandler&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Restart Apache and you are done. To disable Kieker, do the opposite.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Monitoring cycles==&lt;br /&gt;
&lt;br /&gt;
Say that you notice a slow-down when visiting a certain page on EPrints and you would like to investigate what could be the cause(s) and what could be optimised. Kieker is good at showing undesired coupling between modules and is also very good at showing &amp;quot;slowest paths&amp;quot; (when executing a web request from A to Z you can easily spot which method call(s) is/are the slowest - this could be long DB query, lots of files reads, ETC.).&lt;br /&gt;
&lt;br /&gt;
The standard cycle when using Kieker is to:&lt;br /&gt;
&lt;br /&gt;
* Enable Kieker on the URI you think is problematic, for your IP address only&lt;br /&gt;
* Restart Apache&lt;br /&gt;
* Go to the URI with your browser: this may be slower than usual, because Kieker is generating lots of data&lt;br /&gt;
* Disable Kieker&lt;br /&gt;
* Restart Apache&lt;br /&gt;
* Dequeue the Kieker monitoring data from memcached&lt;br /&gt;
* Use Kieker's shipped-in modules to generate releavant graphs for your analysis.&lt;br /&gt;
&lt;br /&gt;
Once you start using Kieker, you will see that you can get results and graphs very, very quickly.&lt;br /&gt;
&lt;br /&gt;
==Processing Data==&lt;br /&gt;
&lt;br /&gt;
As said earlier, once enabled, Kieker will send its data to memcached. To process the data you will need to dequeue the data from memcached by simply using the supplied script.&lt;br /&gt;
&lt;br /&gt;
 mkdir -p ~/kieker/logs/&lt;br /&gt;
 mkdir -p ~/kieker/logs/out/&lt;br /&gt;
 cd ~/kieker/logs/&lt;br /&gt;
 perl /opt/eprints3/archives/&amp;lt;id&amp;gt;/bin/kieker/dequeue_memcached.pl&lt;br /&gt;
&lt;br /&gt;
And that's it! The PERL script will create all necessary files in the current directory. You can then feed the directory to Kieker's built-in tools.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
 ~/kieker-1.9/bin/trace-analysis.sh -i ~/kieker/logs -o ~/kieker/logs/out/ --plot-Assembly-Component-Dependency-Graph --plot-Aggregated-Deployment-Call-Tree --plot-Container-Dependency-Graph --plot-Assembly-Operation-Dependency-Graph responseTimes responseTimeColoring 20&lt;br /&gt;
&lt;br /&gt;
This will generate four different graphs in the &amp;quot;.dot&amp;quot; format. Kieker can generate other graphs, look at the available options by running ~/kieker-1.9/bin/trace-analysis.sh without any parameters.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;.dot&amp;quot; files can be converted to SVG (then PDF), to JPEG etc using the xdot linux library (readily available via apt-get on Ubuntu) for instance:&lt;br /&gt;
&lt;br /&gt;
 dot -T jpeg -o assembly-graph.jpg assemblyComponentDependencyGraph.dot&lt;br /&gt;
&lt;br /&gt;
You can turn SVG files into PDF by using the free tool &amp;quot;inkscape&amp;quot; which may be invoked from the command-line.&lt;br /&gt;
&lt;br /&gt;
==Notes==&lt;br /&gt;
&lt;br /&gt;
* In order to avoid LOTS of warnings in the Apache's error logs, we are using a shipped-in module called Sub::WrapEPrints instead of Sub::WrapPackages.&lt;br /&gt;
* memcached can be set-up on a remote server - this is actually a standard feature of memcached. You could then monitor one server and store the monitoring data on another machine.&lt;/div&gt;</summary>
		<author><name>Sf03r@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=Kieker&amp;diff=10955</id>
		<title>Kieker</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=Kieker&amp;diff=10955"/>
		<updated>2014-06-02T15:58:49Z</updated>

		<summary type="html">&lt;p&gt;Sf03r@ecs.soton.ac.uk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page describes what Kieker is and how to integrate it with EPrints (tested on v3.3). The Kieker framework is developed and maintained at the University of Kiel in Germany and it is a neat tool for analysing a system whether in development or in production. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==What is Kieker==&lt;br /&gt;
&lt;br /&gt;
Concretely Kieker allows you to profile and to monitor all the internal module calls (to EPrints). Any functions called will be trapped and sent to a queue for further processing.&lt;br /&gt;
&lt;br /&gt;
Kieker comes with many post-processing graphs and diagrams to see, for instance, all the calls made, the execution times, etc. This then allows you to have a global picture of the EPrints' internals in order to e.g. optimise certain parts of the system, find coupled modules, detect un-wanted loops (between modules) etc.&lt;br /&gt;
&lt;br /&gt;
Read more about it here: http://kieker-monitoring.net/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==How does it work?==&lt;br /&gt;
&lt;br /&gt;
For EPrints, Kieker uses a PERL module called Sub::WrapPackages which basically allows user to define global wrappers for internal calls. It is possible to restrict which modules are wrapped: for instance, you may want to only profile the database layer, in which case you probably want to wrap EPrints::Database and EPrints::Database::MySQL. The EPrints/Kieker extensions (https://github.com/eprints/epkieker) make it easy to set this up.&lt;br /&gt;
&lt;br /&gt;
When Kieker is enabled it will trap any selected internal calls and will send some information to a queueing system. The data sent will contain a high-precision timestamp, the name of the module, of the function etc. Traditionally Kieker uses JMS as a queueing system but we integrated it with memcached which is a popular, easy-to-install server-wide caching system.&lt;br /&gt;
&lt;br /&gt;
Once you're happy with the profiling, you can disable kieker and retrieve the data from the queue. Then you may use Kieker's built-in tools to generate all sorts of graphs. &lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Kieker===&lt;br /&gt;
&lt;br /&gt;
We used Kieker v1.9 during our tests. You may get it from: http://kieker-monitoring.net/download/&lt;br /&gt;
&lt;br /&gt;
Note that Kieker requires Java (but this can easily be installed under Ubuntu).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Required modules===&lt;br /&gt;
&lt;br /&gt;
If you're using Ubuntu, you can install the modules as follow:&lt;br /&gt;
&lt;br /&gt;
 sudo apt-get install libclass-accessor-perl libnet-stomp-perl libdevel-caller-ignorenamespaces-perl libsub-install-perl libparams-util-perl libdata-optlist-perl libsub-exporter-perl libsub-prototype-perl libsub-wrappackages-perl&lt;br /&gt;
&lt;br /&gt;
If you'd rather install them via CPAN, the above packages' name are:&lt;br /&gt;
&lt;br /&gt;
* Class::Accessor&lt;br /&gt;
* Net::Stomp&lt;br /&gt;
* Devel::Caller::IgnoreNamespaces&lt;br /&gt;
* Sub::Install&lt;br /&gt;
* Params::Util&lt;br /&gt;
* Data::OptList&lt;br /&gt;
* Sub::Exporter&lt;br /&gt;
* Sub::Prototype&lt;br /&gt;
* Sub::WrapPackages&lt;br /&gt;
&lt;br /&gt;
You must also install memcached, if not already present on your server:&lt;br /&gt;
&lt;br /&gt;
 sudo apt-get install memcached libcache-memcached-fast-perl&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===EPrints/Kieker extensions===&lt;br /&gt;
&lt;br /&gt;
You need to copy a few modules from https://github.com/eprints/epkieker to finalise the installation of Kieker, to run with EPrints.&lt;br /&gt;
&lt;br /&gt;
If EPrints is install under its default path /opt/eprints3 (otherwise adjust the paths):&lt;br /&gt;
&lt;br /&gt;
 cp -rf perl_lib/Kieker* /opt/eprints3/perl_lib&lt;br /&gt;
 cp perl_lib/EPrints/Apache/KiekerHandler.pm /opt/eprints3/perl_lib/EPrints/Apache&lt;br /&gt;
 cp -rf bin/kieker /opt/eprints3/archives/&amp;lt;id&amp;gt;/bin/&lt;br /&gt;
&lt;br /&gt;
And you're done.&lt;br /&gt;
&lt;br /&gt;
===Configuration===&lt;br /&gt;
&lt;br /&gt;
There are only a few options you need to edit to configure Kieker, which are in /opt/eprints3/perl_lib/EPrints/Apache/KiekerHandler.pm.&lt;br /&gt;
&lt;br /&gt;
Any time you make a configuration change, you must restart Apache.&lt;br /&gt;
&lt;br /&gt;
====Monitored URI====&lt;br /&gt;
&lt;br /&gt;
This option allows you to restrict the URI which will capture profiling data. For instance, if you have a problem with searching, you may want to set this to &amp;quot;/cgi/search&amp;quot;. To do the same with the browse views, use &amp;quot;/view/&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Some examples:&lt;br /&gt;
&lt;br /&gt;
 my $MONIT_URI = &amp;quot;/&amp;quot;;                 # monitors &amp;quot;/&amp;quot; ie. /index.html&lt;br /&gt;
 my $MONIT_URI = /cgi/search&amp;quot;;        # monitors the search&lt;br /&gt;
 my $MONIT_URI = &amp;quot;/view/year/&amp;quot;;       # monitors the browse view &amp;quot;by year&amp;quot;&lt;br /&gt;
 my $MONIT_URI = &amp;quot;/cgi/users/home&amp;quot;;   # monitors the user (logged-in) area&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Monitored IP====&lt;br /&gt;
&lt;br /&gt;
It can be dangerous to allow monitoring for any clients using your repository (if using Kieker on a production server). This will slow down the system for everyone, as well as generating lots of useless data.&lt;br /&gt;
&lt;br /&gt;
This option is there to restrict which IP address enables monitoring. At the moment it can only be a single IP address, you cannot specify network blocks. If you want to monitor EPrints then this should probably be set to your IP (v4) address.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
 my $MONIT_URI = &amp;quot;124.3.45.7&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Monitored Packages====&lt;br /&gt;
&lt;br /&gt;
Remember I told you that, with PERL, Kieker wraps any modules? Well this last option allows you to specify which modules will be wrapped hence which modules will be monitored. Anything outside of the selected scope will not be monitored and will not generate any data.&lt;br /&gt;
&lt;br /&gt;
Some common examples:&lt;br /&gt;
&lt;br /&gt;
 my $MONIT_PACKAGES = &amp;quot;EPrints EPrints::*&amp;quot;;                            # any EPrints call&lt;br /&gt;
 my $MONIT_PACKAGES = &amp;quot;EPrints::Database EPrints::Database::*&amp;quot;;        # anything relating to EPrints' Database layer&lt;br /&gt;
 my $MONIT_PACKAGES = &amp;quot;EPrints::Plugin::Screen::Items;&amp;quot;                # the &amp;quot;Manage deposits&amp;quot; page&lt;br /&gt;
 my $MONIT_PACKAGES = &amp;quot;EPrints::MetaField::* EPrints::XML;&amp;quot;            # EPrints' metafield layer, in relation to the XML module&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Enabling/Disabling Kieker===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Typically EPrints tells Apache that it handles *any* web requests for a given virtual host (the URL of your repository).&lt;br /&gt;
&lt;br /&gt;
The line responsible for this delegation is inside /opt/eprints3/cfg/apache/&amp;lt;id&amp;gt;.conf:&lt;br /&gt;
&lt;br /&gt;
 PerlTransHandler +EPrints::Apache::Rewrite&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
We just need to set this to the Kieker handler to enable Kieker:&lt;br /&gt;
&lt;br /&gt;
 PerlTransHandler +EPrints::Apache::KiekerPerlHandler&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Restart Apache and you are done. To disable Kieker, do the opposite.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Monitoring cycles==&lt;br /&gt;
&lt;br /&gt;
Say that you notice a slow-down when visiting a certain page on EPrints and you would like to investigate what could be the cause(s) and what could be optimised. Kieker is good at showing undesired coupling between modules and is also very good at showing &amp;quot;slowest paths&amp;quot; (when executing a web request from A to Z you can easily spot which method call(s) is/are the slowest - this could be long DB query, lots of files reads, ETC.).&lt;br /&gt;
&lt;br /&gt;
The standard cycle when using Kieker is to:&lt;br /&gt;
&lt;br /&gt;
* Enable Kieker on the URI you think is problematic, for your IP address only&lt;br /&gt;
* Restart Apache&lt;br /&gt;
* Go to the URI with your browser: this may be slower than usual, because Kieker is generating lots of data&lt;br /&gt;
* Disable Kieker&lt;br /&gt;
* Restart Apache&lt;br /&gt;
* Dequeue the Kieker monitoring data from memcached&lt;br /&gt;
* Use Kieker's shipped-in modules to generate releavant graphs for your analysis.&lt;br /&gt;
&lt;br /&gt;
Once you start using Kieker, you will see that you can get results and graphs very, very quickly.&lt;br /&gt;
&lt;br /&gt;
==Processing Data==&lt;br /&gt;
&lt;br /&gt;
As said earlier, once enabled, Kieker will send its data to memcached. To process the data you will need to dequeue the data from memcached by simply using the supplied script.&lt;br /&gt;
&lt;br /&gt;
 mkdir -p ~/kieker/logs/&lt;br /&gt;
 mkdir -p ~/kieker/logs/out/&lt;br /&gt;
 cd ~/kieker/logs/&lt;br /&gt;
 perl /opt/eprints3/archives/&amp;lt;id&amp;gt;/bin/kieker/dequeue_memcached.pl&lt;br /&gt;
&lt;br /&gt;
And that's it! The PERL script will create all necessary files in the current directory. You can then feed the directory to Kieker's built-in tools.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
 ~/kieker-1.9/bin/trace-analysis.sh -i ~/kieker/logs -o ~/kieker/logs/out/ --plot-Assembly-Component-Dependency-Graph --plot-Aggregated-Deployment-Call-Tree --plot-Container-Dependency-Graph --plot-Assembly-Operation-Dependency-Graph responseTimes responseTimeColoring 20&lt;br /&gt;
&lt;br /&gt;
This will generate four different graphs in the &amp;quot;.dot&amp;quot; format. Kieker can generate other graphs, look at the available options by running ~/kieker-1.9/bin/trace-analysis.sh without any parameters.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;.dot&amp;quot; files can be converted to SVG (then PDF), to JPEG etc using the xdot linux library (readily available via apt-get on Ubuntu) for instance:&lt;br /&gt;
&lt;br /&gt;
 dot -T jpeg -o assembly-graph.jpg assemblyComponentDependencyGraph.dot&lt;br /&gt;
&lt;br /&gt;
You can turn SVG files into PDF by using the free tool &amp;quot;inkscape&amp;quot; which may be invoked from the command-line.&lt;br /&gt;
&lt;br /&gt;
==Notes==&lt;br /&gt;
&lt;br /&gt;
* In order to avoid LOTS of warnings in the Apache's error logs, we are using a shipped-in module called Sub::WrapEPrints instead of Sub::WrapPackages.&lt;/div&gt;</summary>
		<author><name>Sf03r@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=Kieker&amp;diff=10954</id>
		<title>Kieker</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=Kieker&amp;diff=10954"/>
		<updated>2014-06-02T15:55:23Z</updated>

		<summary type="html">&lt;p&gt;Sf03r@ecs.soton.ac.uk: /* Processing Data */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page describes what Kieker is and how to integrate it with EPrints (tested on v3.3). The Kieker framework is developed and maintained at the University of Kiel in Germany and it is a neat tool for analysing a system whether in development or in production. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==What is Kieker==&lt;br /&gt;
&lt;br /&gt;
Concretely Kieker allows you to profile and to monitor all the internal module calls (to EPrints). Any functions called will be trapped and sent to a queue for further processing.&lt;br /&gt;
&lt;br /&gt;
Kieker comes with many post-processing graphs and diagrams to see, for instance, all the calls made, the execution times, etc. This then allows you to have a global picture of the EPrints' internals in order to e.g. optimise certain parts of the system, find coupled modules, detect un-wanted loops (between modules) etc.&lt;br /&gt;
&lt;br /&gt;
Read more about it here: http://kieker-monitoring.net/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==How does it work?==&lt;br /&gt;
&lt;br /&gt;
For EPrints, Kieker uses a PERL module called Sub::WrapPackages which basically allows user to define global wrappers for internal calls. It is possible to restrict which modules are wrapped: for instance, you may want to only profile the database layer, in which case you probably want to wrap EPrints::Database and EPrints::Database::MySQL. The EPrints/Kieker extensions (https://github.com/eprints/epkieker) make it easy to set this up.&lt;br /&gt;
&lt;br /&gt;
When Kieker is enabled it will trap any selected internal calls and will send some information to a queueing system. The data sent will contain a high-precision timestamp, the name of the module, of the function etc. Traditionally Kieker uses JMS as a queueing system but we integrated it with memcached which is a popular, easy-to-install server-wide caching system.&lt;br /&gt;
&lt;br /&gt;
Once you're happy with the profiling, you can disable kieker and retrieve the data from the queue. Then you may use Kieker's built-in tools to generate all sorts of graphs. &lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Kieker===&lt;br /&gt;
&lt;br /&gt;
We used Kieker v1.9 during our tests. You may get it from: http://kieker-monitoring.net/download/&lt;br /&gt;
&lt;br /&gt;
Note that Kieker requires Java (but this can easily be installed under Ubuntu).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Required modules===&lt;br /&gt;
&lt;br /&gt;
If you're using Ubuntu, you can install the modules as follow:&lt;br /&gt;
&lt;br /&gt;
 sudo apt-get install libclass-accessor-perl libnet-stomp-perl libdevel-caller-ignorenamespaces-perl libsub-install-perl libparams-util-perl libdata-optlist-perl libsub-exporter-perl libsub-prototype-perl libsub-wrappackages-perl&lt;br /&gt;
&lt;br /&gt;
If you'd rather install them via CPAN, the above packages' name are:&lt;br /&gt;
&lt;br /&gt;
* Class::Accessor&lt;br /&gt;
* Net::Stomp&lt;br /&gt;
* Devel::Caller::IgnoreNamespaces&lt;br /&gt;
* Sub::Install&lt;br /&gt;
* Params::Util&lt;br /&gt;
* Data::OptList&lt;br /&gt;
* Sub::Exporter&lt;br /&gt;
* Sub::Prototype&lt;br /&gt;
* Sub::WrapPackages&lt;br /&gt;
&lt;br /&gt;
You must also install memcached, if not already present on your server:&lt;br /&gt;
&lt;br /&gt;
 sudo apt-get install memcached libcache-memcached-fast-perl&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===EPrints/Kieker extensions===&lt;br /&gt;
&lt;br /&gt;
You need to copy a few modules from https://github.com/eprints/epkieker to finalise the installation of Kieker, to run with EPrints.&lt;br /&gt;
&lt;br /&gt;
If EPrints is install under its default path /opt/eprints3 (otherwise adjust the paths):&lt;br /&gt;
&lt;br /&gt;
 cp -rf perl_lib/Kieker* /opt/eprints3/perl_lib&lt;br /&gt;
 cp perl_lib/EPrints/Apache/KiekerHandler.pm /opt/eprints3/perl_lib/EPrints/Apache&lt;br /&gt;
 cp -rf bin/kieker /opt/eprints3/archives/&amp;lt;id&amp;gt;/bin/&lt;br /&gt;
&lt;br /&gt;
And you're done.&lt;br /&gt;
&lt;br /&gt;
===Configuration===&lt;br /&gt;
&lt;br /&gt;
There are only a few options you need to edit to configure Kieker, which are in /opt/eprints3/perl_lib/EPrints/Apache/KiekerHandler.pm.&lt;br /&gt;
&lt;br /&gt;
Any time you make a configuration change, you must restart Apache.&lt;br /&gt;
&lt;br /&gt;
====Monitored URI====&lt;br /&gt;
&lt;br /&gt;
This option allows you to restrict the URI which will capture profiling data. For instance, if you have a problem with searching, you may want to set this to &amp;quot;/cgi/search&amp;quot;. To do the same with the browse views, use &amp;quot;/view/&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Some examples:&lt;br /&gt;
&lt;br /&gt;
 my $MONIT_URI = &amp;quot;/&amp;quot;;                 # monitors &amp;quot;/&amp;quot; ie. /index.html&lt;br /&gt;
 my $MONIT_URI = /cgi/search&amp;quot;;        # monitors the search&lt;br /&gt;
 my $MONIT_URI = &amp;quot;/view/year/&amp;quot;;       # monitors the browse view &amp;quot;by year&amp;quot;&lt;br /&gt;
 my $MONIT_URI = &amp;quot;/cgi/users/home&amp;quot;;   # monitors the user (logged-in) area&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Monitored IP====&lt;br /&gt;
&lt;br /&gt;
It can be dangerous to allow monitoring for any clients using your repository (if using Kieker on a production server). This will slow down the system for everyone, as well as generating lots of useless data.&lt;br /&gt;
&lt;br /&gt;
This option is there to restrict which IP address enables monitoring. At the moment it can only be a single IP address, you cannot specify network blocks. If you want to monitor EPrints then this should probably be set to your IP (v4) address.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
 my $MONIT_URI = &amp;quot;124.3.45.7&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Monitored Packages====&lt;br /&gt;
&lt;br /&gt;
Remember I told you that, with PERL, Kieker wraps any modules? Well this last option allows you to specify which modules will be wrapped hence which modules will be monitored. Anything outside of the selected scope will not be monitored and will not generate any data.&lt;br /&gt;
&lt;br /&gt;
Some common examples:&lt;br /&gt;
&lt;br /&gt;
 my $MONIT_PACKAGES = &amp;quot;EPrints EPrints::*&amp;quot;;                            # any EPrints call&lt;br /&gt;
 my $MONIT_PACKAGES = &amp;quot;EPrints::Database EPrints::Database::*&amp;quot;;        # anything relating to EPrints' Database layer&lt;br /&gt;
 my $MONIT_PACKAGES = &amp;quot;EPrints::Plugin::Screen::Items;&amp;quot;                # the &amp;quot;Manage deposits&amp;quot; page&lt;br /&gt;
 my $MONIT_PACKAGES = &amp;quot;EPrints::MetaField::* EPrints::XML;&amp;quot;            # EPrints' metafield layer, in relation to the XML module&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Enabling/Disabling Kieker===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Typically EPrints tells Apache that it handles *any* web requests for a given virtual host (the URL of your repository).&lt;br /&gt;
&lt;br /&gt;
The line responsible for this delegation is inside /opt/eprints3/cfg/apache/&amp;lt;id&amp;gt;.conf:&lt;br /&gt;
&lt;br /&gt;
 PerlTransHandler +EPrints::Apache::Rewrite&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
We just need to set this to the Kieker handler to enable Kieker:&lt;br /&gt;
&lt;br /&gt;
 PerlTransHandler +EPrints::Apache::KiekerPerlHandler&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Restart Apache and you are done. To disable Kieker, do the opposite.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Monitoring cycles==&lt;br /&gt;
&lt;br /&gt;
Say that you notice a slow-down when visiting a certain page on EPrints and you would like to investigate what could be the cause(s) and what could be optimised. Kieker is good at showing undesired coupling between modules and is also very good at showing &amp;quot;slowest paths&amp;quot; (when executing a web request from A to Z you can easily spot which method call(s) is/are the slowest - this could be long DB query, lots of files reads, ETC.).&lt;br /&gt;
&lt;br /&gt;
The standard cycle when using Kieker is to:&lt;br /&gt;
&lt;br /&gt;
* Enable Kieker on the URI you think is problematic, for your IP address only&lt;br /&gt;
* Restart Apache&lt;br /&gt;
* Go to the URI with your browser: this may be slower than usual, because Kieker is generating lots of data&lt;br /&gt;
* Disable Kieker&lt;br /&gt;
* Restart Apache&lt;br /&gt;
* Dequeue the Kieker monitoring data from memcached&lt;br /&gt;
* Use Kieker's shipped-in modules to generate releavant graphs for your analysis.&lt;br /&gt;
&lt;br /&gt;
Once you start using Kieker, you will see that you can get results and graphs very, very quickly.&lt;br /&gt;
&lt;br /&gt;
==Processing Data==&lt;br /&gt;
&lt;br /&gt;
As said earlier, once enabled, Kieker will send its data to memcached. To process the data you will need to dequeue the data from memcached by simply using the supplied script.&lt;br /&gt;
&lt;br /&gt;
 mkdir -p ~/kieker/logs/&lt;br /&gt;
 mkdir -p ~/kieker/logs/out/&lt;br /&gt;
 cd ~/kieker/logs/&lt;br /&gt;
 perl /opt/eprints3/archives/&amp;lt;id&amp;gt;/bin/kieker/dequeue_memcached.pl&lt;br /&gt;
&lt;br /&gt;
And that's it! The PERL script will create all necessary files in the current directory. You can then feed the directory to Kieker's built-in tools.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
 ~/kieker-1.9/bin/trace-analysis.sh -i ~/kieker/logs -o ~/kieker/logs/out/ --plot-Assembly-Component-Dependency-Graph --plot-Aggregated-Deployment-Call-Tree --plot-Container-Dependency-Graph --plot-Assembly-Operation-Dependency-Graph responseTimes responseTimeColoring 20&lt;br /&gt;
&lt;br /&gt;
This will generate four different graphs in the &amp;quot;.dot&amp;quot; format. Kieker can generate other graphs, look at the available options by running ~/kieker-1.9/bin/trace-analysis.sh without any parameters.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;.dot&amp;quot; files can be converted to SVG (then PDF), to JPEG etc using the xdot linux library (readily available via apt-get on Ubuntu) for instance:&lt;br /&gt;
&lt;br /&gt;
 dot -T jpeg -o assembly-graph.jpg assemblyComponentDependencyGraph.dot&lt;br /&gt;
&lt;br /&gt;
You can turn SVG files into PDF by using the free tool &amp;quot;inkscape&amp;quot; which may be invoked from the command-line.&lt;/div&gt;</summary>
		<author><name>Sf03r@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=Kieker&amp;diff=10953</id>
		<title>Kieker</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=Kieker&amp;diff=10953"/>
		<updated>2014-06-02T15:38:28Z</updated>

		<summary type="html">&lt;p&gt;Sf03r@ecs.soton.ac.uk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page describes what Kieker is and how to integrate it with EPrints (tested on v3.3). The Kieker framework is developed and maintained at the University of Kiel in Germany and it is a neat tool for analysing a system whether in development or in production. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==What is Kieker==&lt;br /&gt;
&lt;br /&gt;
Concretely Kieker allows you to profile and to monitor all the internal module calls (to EPrints). Any functions called will be trapped and sent to a queue for further processing.&lt;br /&gt;
&lt;br /&gt;
Kieker comes with many post-processing graphs and diagrams to see, for instance, all the calls made, the execution times, etc. This then allows you to have a global picture of the EPrints' internals in order to e.g. optimise certain parts of the system, find coupled modules, detect un-wanted loops (between modules) etc.&lt;br /&gt;
&lt;br /&gt;
Read more about it here: http://kieker-monitoring.net/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==How does it work?==&lt;br /&gt;
&lt;br /&gt;
For EPrints, Kieker uses a PERL module called Sub::WrapPackages which basically allows user to define global wrappers for internal calls. It is possible to restrict which modules are wrapped: for instance, you may want to only profile the database layer, in which case you probably want to wrap EPrints::Database and EPrints::Database::MySQL. The EPrints/Kieker extensions (https://github.com/eprints/epkieker) make it easy to set this up.&lt;br /&gt;
&lt;br /&gt;
When Kieker is enabled it will trap any selected internal calls and will send some information to a queueing system. The data sent will contain a high-precision timestamp, the name of the module, of the function etc. Traditionally Kieker uses JMS as a queueing system but we integrated it with memcached which is a popular, easy-to-install server-wide caching system.&lt;br /&gt;
&lt;br /&gt;
Once you're happy with the profiling, you can disable kieker and retrieve the data from the queue. Then you may use Kieker's built-in tools to generate all sorts of graphs. &lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Kieker===&lt;br /&gt;
&lt;br /&gt;
We used Kieker v1.9 during our tests. You may get it from: http://kieker-monitoring.net/download/&lt;br /&gt;
&lt;br /&gt;
Note that Kieker requires Java (but this can easily be installed under Ubuntu).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Required modules===&lt;br /&gt;
&lt;br /&gt;
If you're using Ubuntu, you can install the modules as follow:&lt;br /&gt;
&lt;br /&gt;
 sudo apt-get install libclass-accessor-perl libnet-stomp-perl libdevel-caller-ignorenamespaces-perl libsub-install-perl libparams-util-perl libdata-optlist-perl libsub-exporter-perl libsub-prototype-perl libsub-wrappackages-perl&lt;br /&gt;
&lt;br /&gt;
If you'd rather install them via CPAN, the above packages' name are:&lt;br /&gt;
&lt;br /&gt;
* Class::Accessor&lt;br /&gt;
* Net::Stomp&lt;br /&gt;
* Devel::Caller::IgnoreNamespaces&lt;br /&gt;
* Sub::Install&lt;br /&gt;
* Params::Util&lt;br /&gt;
* Data::OptList&lt;br /&gt;
* Sub::Exporter&lt;br /&gt;
* Sub::Prototype&lt;br /&gt;
* Sub::WrapPackages&lt;br /&gt;
&lt;br /&gt;
You must also install memcached, if not already present on your server:&lt;br /&gt;
&lt;br /&gt;
 sudo apt-get install memcached libcache-memcached-fast-perl&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===EPrints/Kieker extensions===&lt;br /&gt;
&lt;br /&gt;
You need to copy a few modules from https://github.com/eprints/epkieker to finalise the installation of Kieker, to run with EPrints.&lt;br /&gt;
&lt;br /&gt;
If EPrints is install under its default path /opt/eprints3 (otherwise adjust the paths):&lt;br /&gt;
&lt;br /&gt;
 cp -rf perl_lib/Kieker* /opt/eprints3/perl_lib&lt;br /&gt;
 cp perl_lib/EPrints/Apache/KiekerHandler.pm /opt/eprints3/perl_lib/EPrints/Apache&lt;br /&gt;
 cp -rf bin/kieker /opt/eprints3/archives/&amp;lt;id&amp;gt;/bin/&lt;br /&gt;
&lt;br /&gt;
And you're done.&lt;br /&gt;
&lt;br /&gt;
===Configuration===&lt;br /&gt;
&lt;br /&gt;
There are only a few options you need to edit to configure Kieker, which are in /opt/eprints3/perl_lib/EPrints/Apache/KiekerHandler.pm.&lt;br /&gt;
&lt;br /&gt;
Any time you make a configuration change, you must restart Apache.&lt;br /&gt;
&lt;br /&gt;
====Monitored URI====&lt;br /&gt;
&lt;br /&gt;
This option allows you to restrict the URI which will capture profiling data. For instance, if you have a problem with searching, you may want to set this to &amp;quot;/cgi/search&amp;quot;. To do the same with the browse views, use &amp;quot;/view/&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Some examples:&lt;br /&gt;
&lt;br /&gt;
 my $MONIT_URI = &amp;quot;/&amp;quot;;                 # monitors &amp;quot;/&amp;quot; ie. /index.html&lt;br /&gt;
 my $MONIT_URI = /cgi/search&amp;quot;;        # monitors the search&lt;br /&gt;
 my $MONIT_URI = &amp;quot;/view/year/&amp;quot;;       # monitors the browse view &amp;quot;by year&amp;quot;&lt;br /&gt;
 my $MONIT_URI = &amp;quot;/cgi/users/home&amp;quot;;   # monitors the user (logged-in) area&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Monitored IP====&lt;br /&gt;
&lt;br /&gt;
It can be dangerous to allow monitoring for any clients using your repository (if using Kieker on a production server). This will slow down the system for everyone, as well as generating lots of useless data.&lt;br /&gt;
&lt;br /&gt;
This option is there to restrict which IP address enables monitoring. At the moment it can only be a single IP address, you cannot specify network blocks. If you want to monitor EPrints then this should probably be set to your IP (v4) address.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
 my $MONIT_URI = &amp;quot;124.3.45.7&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Monitored Packages====&lt;br /&gt;
&lt;br /&gt;
Remember I told you that, with PERL, Kieker wraps any modules? Well this last option allows you to specify which modules will be wrapped hence which modules will be monitored. Anything outside of the selected scope will not be monitored and will not generate any data.&lt;br /&gt;
&lt;br /&gt;
Some common examples:&lt;br /&gt;
&lt;br /&gt;
 my $MONIT_PACKAGES = &amp;quot;EPrints EPrints::*&amp;quot;;                            # any EPrints call&lt;br /&gt;
 my $MONIT_PACKAGES = &amp;quot;EPrints::Database EPrints::Database::*&amp;quot;;        # anything relating to EPrints' Database layer&lt;br /&gt;
 my $MONIT_PACKAGES = &amp;quot;EPrints::Plugin::Screen::Items;&amp;quot;                # the &amp;quot;Manage deposits&amp;quot; page&lt;br /&gt;
 my $MONIT_PACKAGES = &amp;quot;EPrints::MetaField::* EPrints::XML;&amp;quot;            # EPrints' metafield layer, in relation to the XML module&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Enabling/Disabling Kieker===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Typically EPrints tells Apache that it handles *any* web requests for a given virtual host (the URL of your repository).&lt;br /&gt;
&lt;br /&gt;
The line responsible for this delegation is inside /opt/eprints3/cfg/apache/&amp;lt;id&amp;gt;.conf:&lt;br /&gt;
&lt;br /&gt;
 PerlTransHandler +EPrints::Apache::Rewrite&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
We just need to set this to the Kieker handler to enable Kieker:&lt;br /&gt;
&lt;br /&gt;
 PerlTransHandler +EPrints::Apache::KiekerPerlHandler&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Restart Apache and you are done. To disable Kieker, do the opposite.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Monitoring cycles==&lt;br /&gt;
&lt;br /&gt;
Say that you notice a slow-down when visiting a certain page on EPrints and you would like to investigate what could be the cause(s) and what could be optimised. Kieker is good at showing undesired coupling between modules and is also very good at showing &amp;quot;slowest paths&amp;quot; (when executing a web request from A to Z you can easily spot which method call(s) is/are the slowest - this could be long DB query, lots of files reads, ETC.).&lt;br /&gt;
&lt;br /&gt;
The standard cycle when using Kieker is to:&lt;br /&gt;
&lt;br /&gt;
* Enable Kieker on the URI you think is problematic, for your IP address only&lt;br /&gt;
* Restart Apache&lt;br /&gt;
* Go to the URI with your browser: this may be slower than usual, because Kieker is generating lots of data&lt;br /&gt;
* Disable Kieker&lt;br /&gt;
* Restart Apache&lt;br /&gt;
* Dequeue the Kieker monitoring data from memcached&lt;br /&gt;
* Use Kieker's shipped-in modules to generate releavant graphs for your analysis.&lt;br /&gt;
&lt;br /&gt;
Once you start using Kieker, you will see that you can get results and graphs very, very quickly.&lt;br /&gt;
&lt;br /&gt;
==Processing Data==&lt;br /&gt;
&lt;br /&gt;
As said earlier, once enabled, Kieker will send its data to memcached. To process the data you will need to dequeue the data from memcached by simply using the supplied script.&lt;/div&gt;</summary>
		<author><name>Sf03r@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=Kieker&amp;diff=10952</id>
		<title>Kieker</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=Kieker&amp;diff=10952"/>
		<updated>2014-06-02T15:23:17Z</updated>

		<summary type="html">&lt;p&gt;Sf03r@ecs.soton.ac.uk: Created page with ' This page describes what Kieker is and how to integrate it with EPrints (tested on v3.3). The Kieker framework is developed and maintained at the University of Kiel in Germany a…'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
This page describes what Kieker is and how to integrate it with EPrints (tested on v3.3). The Kieker framework is developed and maintained at the University of Kiel in Germany and it is a neat tool for analysing a system whether in development or in production. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==What is Kieker==&lt;br /&gt;
&lt;br /&gt;
Concretely Kieker allows you to profile and to monitor all the internal module calls (to EPrints). Any functions called will be trapped and sent to a queue for further processing.&lt;br /&gt;
&lt;br /&gt;
Kieker comes with many post-processing graphs and diagrams to see, for instance, all the calls made, the execution times, etc. This then allows you to have a global picture of the EPrints' internals in order to e.g. optimise certain parts of the system, find coupled modules, detect un-wanted loops (between modules) etc.&lt;br /&gt;
&lt;br /&gt;
Read more about it here: http://kieker-monitoring.net/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==How does it work?==&lt;br /&gt;
&lt;br /&gt;
For EPrints, Kieker uses a PERL module called Sub::WrapPackages which basically allows user to define global wrappers for internal calls. It is possible to restrict which modules are wrapped: for instance, you may want to only profile the database layer, in which case you probably want to wrap EPrints::Database and EPrints::Database::MySQL. The EPrints/Kieker extensions (https://github.com/eprints/epkieker) make it easy to set this up.&lt;br /&gt;
&lt;br /&gt;
When Kieker is enabled it will trap any selected internal calls and will send some information to a queueing system. The data sent will contain a high-precision timestamp, the name of the module, of the function etc. Traditionally Kieker uses JMS as a queueing system but we integrated it with memcached which is a popular, easy-to-install server-wide caching system.&lt;br /&gt;
&lt;br /&gt;
Once you're happy with the profiling, you can disable kieker and retrieve the data from the queue. Then you may use Kieker's built-in tools to generate all sorts of graphs. &lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Kieker===&lt;br /&gt;
&lt;br /&gt;
We used Kieker v1.9 during our tests. You may get it from: http://kieker-monitoring.net/download/&lt;br /&gt;
&lt;br /&gt;
Note that Kieker requires Java (but this can easily be installed under Ubuntu).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Required modules===&lt;br /&gt;
&lt;br /&gt;
If you're using Ubuntu, you can install the modules as follow:&lt;br /&gt;
&lt;br /&gt;
 sudo apt-get install libclass-accessor-perl libnet-stomp-perl libdevel-caller-ignorenamespaces-perl libsub-install-perl libparams-util-perl libdata-optlist-perl libsub-exporter-perl libsub-prototype-perl libsub-wrappackages-perl&lt;br /&gt;
&lt;br /&gt;
If you'd rather install them via CPAN, the above packages' name are:&lt;br /&gt;
&lt;br /&gt;
* Class::Accessor&lt;br /&gt;
* Net::Stomp&lt;br /&gt;
* Devel::Caller::IgnoreNamespaces&lt;br /&gt;
* Sub::Install&lt;br /&gt;
* Params::Util&lt;br /&gt;
* Data::OptList&lt;br /&gt;
* Sub::Exporter&lt;br /&gt;
* Sub::Prototype&lt;br /&gt;
* Sub::WrapPackages&lt;br /&gt;
&lt;br /&gt;
You must also install memcached, if not already present on your server:&lt;br /&gt;
&lt;br /&gt;
 sudo apt-get install memcached libcache-memcached-fast-perl&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===EPrints/Kieker extensions===&lt;br /&gt;
&lt;br /&gt;
You need to copy a few modules from https://github.com/eprints/epkieker to finalise the installation of Kieker, to run with EPrints.&lt;br /&gt;
&lt;br /&gt;
If EPrints is install under its default path /opt/eprints3 (otherwise adjust the paths):&lt;br /&gt;
&lt;br /&gt;
 cp -rf perl_lib/Kieker* /opt/eprints3/perl_lib&lt;br /&gt;
 cp perl_lib/EPrints/Apache/KiekerHandler.pm /opt/eprints3/perl_lib/EPrints/Apache&lt;br /&gt;
 cp -rf bin/kieker /opt/eprints3/archives/&amp;lt;id&amp;gt;/bin/&lt;br /&gt;
&lt;br /&gt;
And you're done.&lt;br /&gt;
&lt;br /&gt;
===Configuration===&lt;br /&gt;
&lt;br /&gt;
There are only a few options you need to edit to configure Kieker, which are in /opt/eprints3/perl_lib/EPrints/Apache/KiekerHandler.pm.&lt;br /&gt;
&lt;br /&gt;
====Monitored URI====&lt;br /&gt;
&lt;br /&gt;
This option allows you to restrict the URI which will capture profiling data. For instance, if you have a problem with searching, you may want to set this to &amp;quot;/cgi/search&amp;quot;. To do the same with the browse views, use &amp;quot;/view/&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Some examples:&lt;br /&gt;
&lt;br /&gt;
 my $MONIT_URI = &amp;quot;/&amp;quot;;                 # monitors &amp;quot;/&amp;quot; ie. /index.html&lt;br /&gt;
 my $MONIT_URI = /cgi/search&amp;quot;;        # monitors the search&lt;br /&gt;
 my $MONIT_URI = &amp;quot;/view/year/&amp;quot;;       # monitors the browse view &amp;quot;by year&amp;quot;&lt;br /&gt;
 my $MONIT_URI = &amp;quot;/cgi/users/home&amp;quot;;   # monitors the user (logged-in) area&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Monitored IP====&lt;br /&gt;
&lt;br /&gt;
It can be dangerous to allow monitoring for any clients using your repository (if using Kieker on a production server). This will slow down the system for everyone, as well as generating lots of useless data.&lt;br /&gt;
&lt;br /&gt;
This option is there to restrict which IP address enables monitoring. At the moment it can only be a single IP address, you cannot specify network blocks. If you want to monitor EPrints then this should probably be set to your IP (v4) address.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
 my $MONIT_URI = &amp;quot;124.3.45.7&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Monitored Packages====&lt;br /&gt;
&lt;br /&gt;
Remember I told you that, with PERL, Kieker wraps any modules? Well this last option allows you to specify which modules will be wrapped hence which modules will be monitored. Anything outside of the selected scope will not be monitored and will not generate any data.&lt;br /&gt;
&lt;br /&gt;
Some common examples:&lt;br /&gt;
&lt;br /&gt;
 my $MONIT_PACKAGES = &amp;quot;EPrints EPrints::*&amp;quot;;                            # any EPrints call&lt;br /&gt;
 my $MONIT_PACKAGES = &amp;quot;EPrints::Database EPrints::Database::*&amp;quot;;        # anything relating to EPrints' Database layer&lt;br /&gt;
 my $MONIT_PACKAGES = &amp;quot;EPrints::Plugin::Screen::Items;&amp;quot;                # the &amp;quot;Manage deposits&amp;quot; page&lt;br /&gt;
 my $MONIT_PACKAGES = &amp;quot;EPrints::MetaField::* EPrints::XML;&amp;quot;            # EPrints' metafield layer, in relation to the XML module&lt;br /&gt;
&lt;br /&gt;
===Enabling/Disabling Kieker===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Processing Data==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Main Objectives==&lt;br /&gt;
&lt;br /&gt;
* Separation of the Core API and UI (/rendering) components - that mainly means that core objects (Repository, MetaField*, DataObj*) won't have any render_* method. this could also imply that the core or the UI could be upgraded separately. It would also make re-use of the eprints core easy for other purposes (e.g. data repository, OER etc.)&lt;/div&gt;</summary>
		<author><name>Sf03r@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=EPrints4_CORE&amp;diff=10951</id>
		<title>EPrints4 CORE</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=EPrints4_CORE&amp;diff=10951"/>
		<updated>2014-05-23T16:33:47Z</updated>

		<summary type="html">&lt;p&gt;Sf03r@ecs.soton.ac.uk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Packages that are considered CORE in EPrints4 - this will form the &amp;quot;CORE API&amp;quot; that other extensions can build upon.&lt;br /&gt;
&lt;br /&gt;
Note that this is not an official document and any information on this page should not be taken as the law.&lt;br /&gt;
&lt;br /&gt;
* Core - core&lt;br /&gt;
** ACL.pm&lt;br /&gt;
** Apache.pm&lt;br /&gt;
** Apache/Auth.pm&lt;br /&gt;
** Apache/Conf.pm&lt;br /&gt;
** Apache/Handler.pm&lt;br /&gt;
** CLIProcessor.pm&lt;br /&gt;
** Config.pm&lt;br /&gt;
** Const.pm&lt;br /&gt;
** Database.pm&lt;br /&gt;
** Database/*&lt;br /&gt;
** DataObj.pm&lt;br /&gt;
** DataObj/*&lt;br /&gt;
** DataSet.pm&lt;br /&gt;
** Email.pm&lt;br /&gt;
** Index.pm&lt;br /&gt;
** Index/*&lt;br /&gt;
** Language.pm&lt;br /&gt;
** List.pm&lt;br /&gt;
** MetaField.pm&lt;br /&gt;
** MetaField/*&lt;br /&gt;
** NamedSet.pm&lt;br /&gt;
** Plugin.pm&lt;br /&gt;
** PluginFactory.pm&lt;br /&gt;
** RepositoryConfig.pm&lt;br /&gt;
** Repository.pm&lt;br /&gt;
** Storage.pm&lt;br /&gt;
** System.pm&lt;br /&gt;
** System/*&lt;br /&gt;
** SystemSettings.pm&lt;br /&gt;
** Test.pm&lt;br /&gt;
** Test/*&lt;br /&gt;
** Time.pm&lt;br /&gt;
** URL.pm&lt;br /&gt;
** Xapian.pm&lt;br /&gt;
** Xapian/*&lt;br /&gt;
** XML.pm&lt;br /&gt;
** XML/*&lt;br /&gt;
&lt;br /&gt;
* Core - plugins&lt;br /&gt;
** Controller.pm&lt;br /&gt;
** Controller/*&lt;br /&gt;
** Convert.pm&lt;br /&gt;
** Event.pm&lt;br /&gt;
** Event/*&lt;br /&gt;
** Export.pm&lt;br /&gt;
** Export/*&lt;br /&gt;
** Import.pm&lt;br /&gt;
** Import/*&lt;br /&gt;
** Screen.pm&lt;br /&gt;
** Screen/*&lt;br /&gt;
** Storage.pm&lt;br /&gt;
** Storage/*&lt;br /&gt;
&lt;br /&gt;
* Uncertain future&lt;br /&gt;
&lt;br /&gt;
Not quite decided what will happen to the following former core modules. Note that plenty of modules have been removed already.&lt;br /&gt;
&lt;br /&gt;
** Page.pm&lt;br /&gt;
** Page/*&lt;br /&gt;
** Probity.pm&lt;br /&gt;
** ScreenProcessor.pm&lt;br /&gt;
** Script.pm&lt;br /&gt;
** Script/*&lt;br /&gt;
** Search.pm&lt;br /&gt;
** Search/*&lt;br /&gt;
** Sword/*&lt;br /&gt;
** Update/*&lt;br /&gt;
** Utils.pm&lt;br /&gt;
** XHTML.pm&lt;/div&gt;</summary>
		<author><name>Sf03r@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=EPrints4_CORE&amp;diff=10950</id>
		<title>EPrints4 CORE</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=EPrints4_CORE&amp;diff=10950"/>
		<updated>2014-05-23T16:33:30Z</updated>

		<summary type="html">&lt;p&gt;Sf03r@ecs.soton.ac.uk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Packages that are considered CORE in EPrints4 - this will form the &amp;quot;CORE API&amp;quot; that other extensions can build upon.&lt;br /&gt;
&lt;br /&gt;
Note that this is not an official document and any information on this page should not be taken as the law.&lt;br /&gt;
&lt;br /&gt;
* Core - core&lt;br /&gt;
&lt;br /&gt;
** ACL.pm&lt;br /&gt;
** Apache.pm&lt;br /&gt;
** Apache/Auth.pm&lt;br /&gt;
** Apache/Conf.pm&lt;br /&gt;
** Apache/Handler.pm&lt;br /&gt;
** CLIProcessor.pm&lt;br /&gt;
** Config.pm&lt;br /&gt;
** Const.pm&lt;br /&gt;
** Database.pm&lt;br /&gt;
** Database/*&lt;br /&gt;
** DataObj.pm&lt;br /&gt;
** DataObj/*&lt;br /&gt;
** DataSet.pm&lt;br /&gt;
** Email.pm&lt;br /&gt;
** Index.pm&lt;br /&gt;
** Index/*&lt;br /&gt;
** Language.pm&lt;br /&gt;
** List.pm&lt;br /&gt;
** MetaField.pm&lt;br /&gt;
** MetaField/*&lt;br /&gt;
** NamedSet.pm&lt;br /&gt;
** Plugin.pm&lt;br /&gt;
** PluginFactory.pm&lt;br /&gt;
** RepositoryConfig.pm&lt;br /&gt;
** Repository.pm&lt;br /&gt;
** Storage.pm&lt;br /&gt;
** System.pm&lt;br /&gt;
** System/*&lt;br /&gt;
** SystemSettings.pm&lt;br /&gt;
** Test.pm&lt;br /&gt;
** Test/*&lt;br /&gt;
** Time.pm&lt;br /&gt;
** URL.pm&lt;br /&gt;
** Xapian.pm&lt;br /&gt;
** Xapian/*&lt;br /&gt;
** XML.pm&lt;br /&gt;
** XML/*&lt;br /&gt;
&lt;br /&gt;
* Core - plugins&lt;br /&gt;
&lt;br /&gt;
** Controller.pm&lt;br /&gt;
** Controller/*&lt;br /&gt;
** Convert.pm&lt;br /&gt;
** Event.pm&lt;br /&gt;
** Event/*&lt;br /&gt;
** Export.pm&lt;br /&gt;
** Export/*&lt;br /&gt;
** Import.pm&lt;br /&gt;
** Import/*&lt;br /&gt;
** Screen.pm&lt;br /&gt;
** Screen/*&lt;br /&gt;
** Storage.pm&lt;br /&gt;
** Storage/*&lt;br /&gt;
&lt;br /&gt;
* Uncertain future&lt;br /&gt;
&lt;br /&gt;
Not quite decided what will happen to the following former core modules. Note that plenty of modules have been removed already.&lt;br /&gt;
&lt;br /&gt;
** Page.pm&lt;br /&gt;
** Page/*&lt;br /&gt;
** Probity.pm&lt;br /&gt;
** ScreenProcessor.pm&lt;br /&gt;
** Script.pm&lt;br /&gt;
** Script/*&lt;br /&gt;
** Search.pm&lt;br /&gt;
** Search/*&lt;br /&gt;
** Sword/*&lt;br /&gt;
** Update/*&lt;br /&gt;
** Utils.pm&lt;br /&gt;
** XHTML.pm&lt;/div&gt;</summary>
		<author><name>Sf03r@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=EPrints4_CORE&amp;diff=10949</id>
		<title>EPrints4 CORE</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=EPrints4_CORE&amp;diff=10949"/>
		<updated>2014-05-23T14:26:34Z</updated>

		<summary type="html">&lt;p&gt;Sf03r@ecs.soton.ac.uk: Created page with 'Packages that are considered CORE in EPrints4 - this will form the &amp;quot;CORE API&amp;quot; that other extensions can build upon.  Note that this is not an official document and any informatio…'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Packages that are considered CORE in EPrints4 - this will form the &amp;quot;CORE API&amp;quot; that other extensions can build upon.&lt;br /&gt;
&lt;br /&gt;
Note that this is not an official document and any information on this page should not be taken as the law.&lt;br /&gt;
&lt;br /&gt;
* ACL.pm&lt;br /&gt;
* Apache.pm&lt;br /&gt;
* Apache/Auth.pm&lt;br /&gt;
* Apache/Conf.pm&lt;br /&gt;
* CLIProcessor.pm&lt;br /&gt;
* Config.pm&lt;br /&gt;
* Const.pm&lt;br /&gt;
* Database.pm&lt;br /&gt;
* Database/*&lt;br /&gt;
* DataObj.pm&lt;br /&gt;
* DataObj/*&lt;br /&gt;
* DataSet.pm&lt;br /&gt;
* Email.pm&lt;br /&gt;
* Index.pm&lt;br /&gt;
* Index/*&lt;br /&gt;
* Language.pm&lt;br /&gt;
* List.pm&lt;br /&gt;
* MetaField.pm&lt;br /&gt;
* MetaField/*&lt;br /&gt;
* NamedSet.pm&lt;br /&gt;
* Plugin.pm&lt;br /&gt;
* PluginFactory.pm&lt;br /&gt;
* RepositoryConfig.pm&lt;br /&gt;
* Repository.pm&lt;br /&gt;
* Storage.pm&lt;br /&gt;
* System.pm&lt;br /&gt;
* System/*&lt;br /&gt;
* SystemSettings.pm&lt;br /&gt;
* Test.pm&lt;br /&gt;
* Test/*&lt;br /&gt;
* Time.pm&lt;br /&gt;
* URL.pm&lt;br /&gt;
* Xapian.pm&lt;br /&gt;
* Xapian/*&lt;br /&gt;
* XML.pm&lt;br /&gt;
* XML/*&lt;/div&gt;</summary>
		<author><name>Sf03r@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=EPrints4_Status&amp;diff=10948</id>
		<title>EPrints4 Status</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=EPrints4_Status&amp;diff=10948"/>
		<updated>2014-05-23T14:19:31Z</updated>

		<summary type="html">&lt;p&gt;Sf03r@ecs.soton.ac.uk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Packages that are considered &amp;quot;CORE&amp;quot;: [[EPrints4_CORE]]&lt;br /&gt;
&lt;br /&gt;
Things which have been tested / implemented:&lt;br /&gt;
&lt;br /&gt;
=CORE=&lt;br /&gt;
&lt;br /&gt;
==Database==&lt;br /&gt;
&lt;br /&gt;
* Preferred MySQL engine is now InnoDB (over MyISAM)&lt;br /&gt;
* Added support for transactions with InnoDB. Partially written data/data-objects may be roll-backed (they are if an error occurs)&lt;br /&gt;
* Connects on demand&lt;br /&gt;
&lt;br /&gt;
==Request handlers/routers==&lt;br /&gt;
&lt;br /&gt;
* Every request is now routed via a trigger call (to find out which controller will respond)&lt;br /&gt;
* Apache::Rewrite has been refactored to Apache::Handler and is now super-lightweight&lt;br /&gt;
* Support for CGI scripts has been removed&lt;br /&gt;
&lt;br /&gt;
==Controllers==&lt;br /&gt;
&lt;br /&gt;
* CRUD&lt;br /&gt;
* Storage (delivery of files/thumbnails)&lt;br /&gt;
* Counter (like /cgi/counter)&lt;br /&gt;
* Ping (for fun, just replies 'pong')&lt;br /&gt;
* UI (for, potentially, Screen plug-ins)&lt;br /&gt;
* Static pages (XHTML, XPAGES etc that need compilation to HTML or any other static file (js, css...)&lt;br /&gt;
&lt;br /&gt;
==Security==&lt;br /&gt;
&lt;br /&gt;
* Based around actions (e.g. edit, view, search, ...) and optional contexts ('owner', etc.)&lt;br /&gt;
* Low-level implementation to avoid objects to leak from one dataset ('inbox') to another ('archive')&lt;br /&gt;
* ACL dataset (should maybe be called 'privs') to store extra privs against a user&lt;br /&gt;
* finer-grain permission (down to a single dataobj)&lt;br /&gt;
&lt;br /&gt;
==Auth==&lt;br /&gt;
&lt;br /&gt;
* Rewritten auth mechanisms&lt;br /&gt;
* Done similarly to Controllers, via a trigger&lt;br /&gt;
* When a user is auth'ed a user-session is created (cf. login ticket)&lt;br /&gt;
* When a request comes, EPrints attempts to load a user-session - cf. above&lt;br /&gt;
* Supports AuthBasic when no UI is available&lt;br /&gt;
* Cookies are managed transparently behind the &amp;quot;user-session&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Storage==&lt;br /&gt;
&lt;br /&gt;
* Added support for generic files. It is now possible to store any file against any object.&lt;br /&gt;
* Added support for &amp;quot;thumbnails&amp;quot; (as a separate dataset)&lt;br /&gt;
&lt;br /&gt;
==CRUD==&lt;br /&gt;
&lt;br /&gt;
* CRUD extended to support more methods/URI etc&lt;br /&gt;
* Sword2 hacks temporarily removed from CRUD&lt;br /&gt;
* Doesn't require its own auth code anymore&lt;br /&gt;
* CrudClient available to perform remote operation on a repository (via CrudDataSet, CrudDataObj, CrudList etc) - the API is very similar to the standard CLI syntax to create/edit/etc objects/lists of objects.&lt;br /&gt;
* Support for ETag and If-None-Match&lt;br /&gt;
* Support for PATCH method&lt;br /&gt;
* Support for generic file upload&lt;br /&gt;
* Minimal support for searching a dataset (e.g. GET /data/user/) - though will probably have a separate /search/... interface to allow user queries (Xapian and the likes)&lt;br /&gt;
* Entry poing /id/... moved to /data/...&lt;br /&gt;
&lt;br /&gt;
==Dataset definition==&lt;br /&gt;
&lt;br /&gt;
* The following properties are now core (meaning that EPrints will automatically add appropriate fields, set/update/remove data when such or such properties are enabled):&lt;br /&gt;
** flow: replaces eprint_status and the likes. Allows to specify a flow of states and transitions&lt;br /&gt;
** revision: adds a revision number, incremented each time the data obj is modified&lt;br /&gt;
** acl (TO RENAME): allows ACL checks on the dataset (should always be ON)&lt;br /&gt;
** read-only: make the dataset read-only, no modifications are allowed via the API (whether HTTP, CLI ...)&lt;br /&gt;
** web-read-only (TOFIX): make the dataset read-only ONLY for HTTP requests - CLI scripts can still change data&lt;br /&gt;
** history (TODO): keeps an historic of changes&lt;br /&gt;
** lastmod: keeps a timestamp of when the data-obj was last modified&lt;br /&gt;
** datestamp: keeps the date of creation of a data-obj&lt;br /&gt;
** loghandler (TODO): keeps download stats for that dataset&lt;br /&gt;
** contexts: allows to add custom security contexts (eg. 'owner', 'editor', 'co-author') &lt;br /&gt;
&lt;br /&gt;
==Misc==&lt;br /&gt;
&lt;br /&gt;
* memcached: use of server-wide &amp;quot;memcached&amp;quot; service to memory cache data objects&lt;br /&gt;
* contextual debugging: allows to enable/disable only specific themes e.g. &amp;quot;db&amp;quot;, &amp;quot;security&amp;quot; etc. and only write status messages to the logs for the enabled themes&lt;br /&gt;
* much, much more!&lt;br /&gt;
&lt;br /&gt;
=UI=&lt;br /&gt;
&lt;br /&gt;
* Template using Bootstrap&lt;br /&gt;
* Data-binding with JS Framework AngularJS&lt;br /&gt;
* Dynamical pages served through light-weight Screen plug-ins (only handles the security aspect - who can see this page - and the &amp;quot;page's actions&amp;quot; via AJAX)&lt;/div&gt;</summary>
		<author><name>Sf03r@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=EPrints4_Roadmap&amp;diff=10945</id>
		<title>EPrints4 Roadmap</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=EPrints4_Roadmap&amp;diff=10945"/>
		<updated>2014-05-21T15:23:17Z</updated>

		<summary type="html">&lt;p&gt;Sf03r@ecs.soton.ac.uk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Some general ideas for the development of the next major release of EPrints. &lt;br /&gt;
&lt;br /&gt;
Also read [[EPrints4_Status]]&lt;br /&gt;
&lt;br /&gt;
==Main Objectives==&lt;br /&gt;
&lt;br /&gt;
* Separation of the Core API and UI (/rendering) components - that mainly means that core objects (Repository, MetaField*, DataObj*) won't have any render_* method. this could also imply that the core or the UI could be upgraded separately. It would also make re-use of the eprints core easy for other purposes (e.g. data repository, OER etc.)&lt;br /&gt;
&lt;br /&gt;
* Remove the spaghetti code (esp (1) rendering methods (2) Dataobj-Metafield relations)&lt;br /&gt;
&lt;br /&gt;
* Drop support for internal search in favour of specialist tools such as Xapian or Solr - we might however need to keep some aspects of the internal search (cf List/data retrieval) for exact matching - perhaps that's more a (SQL) &amp;quot;QueryBuilder&amp;quot; than a (user) search.&lt;br /&gt;
&lt;br /&gt;
* Drop support for Windows?&lt;br /&gt;
&lt;br /&gt;
* Implement object locking at the core level (for any objects, perhaps without using database fields at all). Actually this is done via: DB Transactions, ETag and If-None-Match headers. The current (3.2/3.3) object locking is a UI feature not a core one.&lt;br /&gt;
&lt;br /&gt;
* Implement object state at the core level (at the moment EPrint object might be in one of 4 states: inbox, buffer, archive, deletion via the field eprint_status) &amp;lt;DONE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* code normalisation:&lt;br /&gt;
** use new class name (e.g. EPrints::Session =&amp;gt; EPrints::Repository)&lt;br /&gt;
** use &amp;quot;new way&amp;quot; of doing things (e.g. EPrints::Dataobj::X-&amp;gt;new(12) =&amp;gt; repo-&amp;gt;dataset( 'x' )-&amp;gt;dataobj(12))&lt;br /&gt;
** remove v2.x features deprecated in v3+ (cf. EPrints::BackCompatibility)&lt;br /&gt;
&lt;br /&gt;
* define clear API for core functions (e.g. Database, object handling) and for UI purposes. The API must present a unique way of doing something.&lt;br /&gt;
&lt;br /&gt;
* It might be worth separating the code into 3 packages to ease the development: eprints4-core, eprints4-ir and eprints4-ir-ui.&lt;br /&gt;
&lt;br /&gt;
==Core==&lt;br /&gt;
&lt;br /&gt;
* Revisit Apache request Handler aka Apache::Rewrite (lots of hard-coded paths, many obsolete paths) - URL handling should be done by Controllers called/prioritised via a trigger. &amp;lt;TESTED OK&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Remove EPrints::Session from anywhere in favour of EPrints::Repository&lt;br /&gt;
&lt;br /&gt;
* Test using memcached (http://code.google.com/p/memcached/) - Cache::Memcached::Fast to cache data objects, perhaps could work to cache XML fragments too. &amp;lt;TESTED OK&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Use Multipart rather than Compound - Compound creates 1 table per subfield whilst Multipart creates 1 column per subfield. &amp;lt;TESTED OK&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Finer grain permissions (using User, Groups, perhaps ACL concepts) - also security should be handled at the core level not at the UI level&lt;br /&gt;
&lt;br /&gt;
* Core should be able to run without IR extensions nor UI elements (might require to extend the SWORD layer for interactions with the core) &amp;lt;TESTED OK&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Built-in locking mechanisms for objects (improved edit_lock)&lt;br /&gt;
&lt;br /&gt;
* No hard-coded exceptions for IR extensions (e.g. eprint_status hard-coded in places) &amp;lt;TESTED OK&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Generalise concept of &amp;quot;files&amp;quot; to allow the storage of arbitrary files against any data objects (e.g. a profile picture for a User) &amp;lt;TESTED OK&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* (coding-style) don't use objects via hash-value directly e.g. my $repo = $object-&amp;gt;{repository} - use method instead: my $repo = $object-&amp;gt;repository.&lt;br /&gt;
&lt;br /&gt;
* Metafield/DataObj::set_value should re-enforce the database type - i.e. $object-&amp;gt;set_value( 'int_field', 'abc' )should fail at the Application layer - not silently at the DB layer as it currently happens. Same goes with any field type (e.g. -&amp;gt;set_value( 'set_field', 'invalid_set_value' ) should fail). &amp;lt;TESTED OK&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Extra dataset properties to allow global, consistent behaviour. Considered: &amp;quot;states&amp;quot;, &amp;quot;revision&amp;quot; (TESTED OK), &amp;quot;lastmod&amp;quot; (TESTED OK), &amp;quot;read-only&amp;quot; (TESTED OK), &amp;quot;cache&amp;quot; (i.e. use memcached), &amp;quot;history&amp;quot; (keep revision history, implies revision=true), &amp;quot;datestamp&amp;quot;, &amp;quot;acl&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Extensions for IR-type of Repositories==&lt;br /&gt;
&lt;br /&gt;
* Authors/names stored in a separate dataset - should help integrate with various UID systems like OrcID.&lt;br /&gt;
&lt;br /&gt;
* Extra metadata to describe a User - cf. MePrints.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==UI elements==&lt;br /&gt;
&lt;br /&gt;
* jQuery over Prototype&lt;br /&gt;
&lt;br /&gt;
* jQueryUI widgets used to render fields &lt;br /&gt;
&lt;br /&gt;
* Javascript/Ajax concepts built-in&lt;br /&gt;
&lt;br /&gt;
* CSS3 Responsive design to support small screens (mobile, tablets etc) - http://alistapart.com/article/responsive-web-design&lt;br /&gt;
&lt;br /&gt;
* Consider http://getbootstrap.com/javascript/ -  http://getbootstrap.com/components/&lt;br /&gt;
&lt;br /&gt;
==Misc==&lt;br /&gt;
&lt;br /&gt;
* an internal messaging system would be nice (similar to the current Message data object but with more options) - this would help system/user and user/user interactions. A logged-in user could then see messages and act accordingly. For instance: publication just went live, items have been imported from remote sources, user commented on a resource etc.&lt;br /&gt;
&lt;br /&gt;
==Current Dev tasks (stuff in progress)==&lt;br /&gt;
&lt;br /&gt;
* Complex UI elements such as forms with validations - Currently using a mix of Mustache (server-side templates) and AngularJS (client-side) - btw some cool stuff here: http://angular-ui.github.io/bootstrap/&lt;br /&gt;
* (Deep) integration of Xapian into the core:&lt;br /&gt;
** but keeping it generic enough to allow other implementation of other search engines&lt;br /&gt;
** must find a way to (1) conduct a user search via Xapian and (2) merge the results with a DB-bound search to restrict to items that the user can effectively search (think ACL here)&lt;br /&gt;
** Must find a way to generate API pages from the code/POD&lt;/div&gt;</summary>
		<author><name>Sf03r@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=EPrints4_Status&amp;diff=10940</id>
		<title>EPrints4 Status</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=EPrints4_Status&amp;diff=10940"/>
		<updated>2014-03-25T14:07:33Z</updated>

		<summary type="html">&lt;p&gt;Sf03r@ecs.soton.ac.uk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Things which have been tested / implemented:&lt;br /&gt;
&lt;br /&gt;
=CORE=&lt;br /&gt;
&lt;br /&gt;
==Database==&lt;br /&gt;
&lt;br /&gt;
* Preferred MySQL engine is now InnoDB (over MyISAM)&lt;br /&gt;
* Added support for transactions with InnoDB. Partially written data/data-objects may be roll-backed (they are if an error occurs)&lt;br /&gt;
* Connects on demand&lt;br /&gt;
&lt;br /&gt;
==Request handlers/routers==&lt;br /&gt;
&lt;br /&gt;
* Every request is now routed via a trigger call (to find out which controller will respond)&lt;br /&gt;
* Apache::Rewrite has been refactored to Apache::Handler and is now super-lightweight&lt;br /&gt;
* Support for CGI scripts has been removed&lt;br /&gt;
&lt;br /&gt;
==Controllers==&lt;br /&gt;
&lt;br /&gt;
* CRUD&lt;br /&gt;
* Storage (delivery of files/thumbnails)&lt;br /&gt;
* Counter (like /cgi/counter)&lt;br /&gt;
* Ping (for fun, just replies 'pong')&lt;br /&gt;
* UI (for, potentially, Screen plug-ins)&lt;br /&gt;
* Static pages (XHTML, XPAGES etc that need compilation to HTML or any other static file (js, css...)&lt;br /&gt;
&lt;br /&gt;
==Security==&lt;br /&gt;
&lt;br /&gt;
* Based around actions (e.g. edit, view, search, ...) and optional contexts ('owner', etc.)&lt;br /&gt;
* Low-level implementation to avoid objects to leak from one dataset ('inbox') to another ('archive')&lt;br /&gt;
* ACL dataset (should maybe be called 'privs') to store extra privs against a user&lt;br /&gt;
* finer-grain permission (down to a single dataobj)&lt;br /&gt;
&lt;br /&gt;
==Auth==&lt;br /&gt;
&lt;br /&gt;
* Rewritten auth mechanisms&lt;br /&gt;
* Done similarly to Controllers, via a trigger&lt;br /&gt;
* When a user is auth'ed a user-session is created (cf. login ticket)&lt;br /&gt;
* When a request comes, EPrints attempts to load a user-session - cf. above&lt;br /&gt;
* Supports AuthBasic when no UI is available&lt;br /&gt;
* Cookies are managed transparently behind the &amp;quot;user-session&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Storage==&lt;br /&gt;
&lt;br /&gt;
* Added support for generic files. It is now possible to store any file against any object.&lt;br /&gt;
* Added support for &amp;quot;thumbnails&amp;quot; (as a separate dataset)&lt;br /&gt;
&lt;br /&gt;
==CRUD==&lt;br /&gt;
&lt;br /&gt;
* CRUD extended to support more methods/URI etc&lt;br /&gt;
* Sword2 hacks temporarily removed from CRUD&lt;br /&gt;
* Doesn't require its own auth code anymore&lt;br /&gt;
* CrudClient available to perform remote operation on a repository (via CrudDataSet, CrudDataObj, CrudList etc) - the API is very similar to the standard CLI syntax to create/edit/etc objects/lists of objects.&lt;br /&gt;
* Support for ETag and If-None-Match&lt;br /&gt;
* Support for PATCH method&lt;br /&gt;
* Support for generic file upload&lt;br /&gt;
* Minimal support for searching a dataset (e.g. GET /data/user/) - though will probably have a separate /search/... interface to allow user queries (Xapian and the likes)&lt;br /&gt;
* Entry poing /id/... moved to /data/...&lt;br /&gt;
&lt;br /&gt;
==Dataset definition==&lt;br /&gt;
&lt;br /&gt;
* The following properties are now core (meaning that EPrints will automatically add appropriate fields, set/update/remove data when such or such properties are enabled):&lt;br /&gt;
** flow: replaces eprint_status and the likes. Allows to specify a flow of states and transitions&lt;br /&gt;
** revision: adds a revision number, incremented each time the data obj is modified&lt;br /&gt;
** acl (TO RENAME): allows ACL checks on the dataset (should always be ON)&lt;br /&gt;
** read-only: make the dataset read-only, no modifications are allowed via the API (whether HTTP, CLI ...)&lt;br /&gt;
** web-read-only (TOFIX): make the dataset read-only ONLY for HTTP requests - CLI scripts can still change data&lt;br /&gt;
** history (TODO): keeps an historic of changes&lt;br /&gt;
** lastmod: keeps a timestamp of when the data-obj was last modified&lt;br /&gt;
** datestamp: keeps the date of creation of a data-obj&lt;br /&gt;
** loghandler (TODO): keeps download stats for that dataset&lt;br /&gt;
** contexts: allows to add custom security contexts (eg. 'owner', 'editor', 'co-author') &lt;br /&gt;
&lt;br /&gt;
==Misc==&lt;br /&gt;
&lt;br /&gt;
* memcached: use of server-wide &amp;quot;memcached&amp;quot; service to memory cache data objects&lt;br /&gt;
* contextual debugging: allows to enable/disable only specific themes e.g. &amp;quot;db&amp;quot;, &amp;quot;security&amp;quot; etc. and only write status messages to the logs for the enabled themes&lt;br /&gt;
* much, much more!&lt;br /&gt;
&lt;br /&gt;
=UI=&lt;br /&gt;
&lt;br /&gt;
* Template using Bootstrap&lt;br /&gt;
* Data-binding with JS Framework AngularJS&lt;br /&gt;
* Dynamical pages served through light-weight Screen plug-ins (only handles the security aspect - who can see this page - and the &amp;quot;page's actions&amp;quot; via AJAX)&lt;/div&gt;</summary>
		<author><name>Sf03r@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=EPrints4_Status&amp;diff=10939</id>
		<title>EPrints4 Status</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=EPrints4_Status&amp;diff=10939"/>
		<updated>2014-03-25T13:39:56Z</updated>

		<summary type="html">&lt;p&gt;Sf03r@ecs.soton.ac.uk: /* Database */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Things which have been tested / implemented:&lt;br /&gt;
&lt;br /&gt;
=CORE=&lt;br /&gt;
&lt;br /&gt;
==Database==&lt;br /&gt;
&lt;br /&gt;
* Preferred MySQL engine is now InnoDB (over MyISAM)&lt;br /&gt;
* Added support for transactions with InnoDB. Partially written data/data-objects may be roll-backed (they are if an error occurs)&lt;br /&gt;
* Connects on demand&lt;br /&gt;
&lt;br /&gt;
==Request handlers/routers==&lt;br /&gt;
&lt;br /&gt;
* Every request is now routed via a trigger call (to find out which controller will respond)&lt;br /&gt;
* Apache::Rewrite has been refactored to Apache::Handler and is now super-lightweight&lt;br /&gt;
* Support for CGI scripts has been removed&lt;br /&gt;
&lt;br /&gt;
==Controllers==&lt;br /&gt;
&lt;br /&gt;
* CRUD&lt;br /&gt;
* Storage (delivery of files/thumbnails)&lt;br /&gt;
* Counter (like /cgi/counter)&lt;br /&gt;
* Ping (for fun, just replies 'pong')&lt;br /&gt;
* UI (for, potentially, Screen plug-ins)&lt;br /&gt;
* Static pages (XHTML, XPAGES etc that need compilation to HTML or any other static file (js, css...)&lt;br /&gt;
&lt;br /&gt;
==Security==&lt;br /&gt;
&lt;br /&gt;
* Based around actions (e.g. edit, view, search, ...) and optional contexts ('owner', etc.)&lt;br /&gt;
* Low-level implementation to avoid objects to leak from one dataset ('inbox') to another ('archive')&lt;br /&gt;
* ACL dataset (should maybe be called 'privs') to store extra privs against a user&lt;br /&gt;
* finer-grain permission (down to a single dataobj)&lt;br /&gt;
&lt;br /&gt;
==Auth==&lt;br /&gt;
&lt;br /&gt;
* Rewritten auth mechanisms&lt;br /&gt;
* Done similarly to Controllers, via a trigger&lt;br /&gt;
* When a user is auth'ed a user-session is created (cf. login ticket)&lt;br /&gt;
* When a request comes, EPrints attempts to load a user-session - cf. above&lt;br /&gt;
* Supports AuthBasic when no UI is available&lt;br /&gt;
* Cookies are managed transparently behind the &amp;quot;user-session&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Storage==&lt;br /&gt;
&lt;br /&gt;
* Added support for generic files. It is now possible to store any file against any object.&lt;br /&gt;
* Added support for &amp;quot;thumbnails&amp;quot; (as a separate dataset)&lt;br /&gt;
&lt;br /&gt;
==CRUD==&lt;br /&gt;
&lt;br /&gt;
* CRUD extended to support more methods/URI etc&lt;br /&gt;
* Sword2 hacks temporarily removed from CRUD&lt;br /&gt;
* Doesn't require its own auth code anymore&lt;br /&gt;
* CrudClient available to perform remote operation on a repository (via CrudDataSet, CrudDataObj, CrudList etc) - the API is very similar to the standard CLI syntax to create/edit/etc objects/lists of objects.&lt;br /&gt;
* Support for ETag and If-None-Match&lt;br /&gt;
* Support for PATCH method&lt;br /&gt;
* Support for generic file upload&lt;br /&gt;
* Minimal support for searching a dataset (e.g. GET /data/user/) - though will probably have a separate /search/... interface to allow user queries (Xapian and the likes)&lt;br /&gt;
* Entry poing /id/... moved to /data/...&lt;br /&gt;
&lt;br /&gt;
==Dataset definition==&lt;br /&gt;
&lt;br /&gt;
* The following properties are now core (meaning that EPrints will automatically add appropriate fields, set/update/remove data when such or such properties are enabled):&lt;br /&gt;
** flow: replaces eprint_status and the likes. Allows to specify a flow of states and transitions&lt;br /&gt;
** revision: adds a revision number, incremented each time the data obj is modified&lt;br /&gt;
** acl (TO RENAME): allows ACL checks on the dataset (should always be ON)&lt;br /&gt;
** read-only: make the dataset read-only, no modifications are allowed via the API (whether HTTP, CLI ...)&lt;br /&gt;
** web-read-only (TOFIX): make the dataset read-only ONLY for HTTP requests - CLI scripts can still change data&lt;br /&gt;
** history (TODO): keeps an historic of changes&lt;br /&gt;
** lastmod: keeps a timestamp of when the data-obj was last modified&lt;br /&gt;
** datestamp: keeps the date of creation of a data-obj&lt;br /&gt;
** loghandler (TODO): keeps download stats for that dataset&lt;br /&gt;
** contexts: allows to add custom security contexts (eg. 'owner', 'editor', 'co-author') &lt;br /&gt;
&lt;br /&gt;
==Misc==&lt;br /&gt;
&lt;br /&gt;
* memcached: use of server-wide &amp;quot;memcached&amp;quot; service to memory cache data objects&lt;br /&gt;
* contextual debugging: allows to enable/disable only specific themes e.g. &amp;quot;db&amp;quot;, &amp;quot;security&amp;quot; etc. and only write status messages to the logs for the enabled themes&lt;br /&gt;
* much, much more!&lt;/div&gt;</summary>
		<author><name>Sf03r@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=EPrints4_Status&amp;diff=10938</id>
		<title>EPrints4 Status</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=EPrints4_Status&amp;diff=10938"/>
		<updated>2014-03-24T17:19:35Z</updated>

		<summary type="html">&lt;p&gt;Sf03r@ecs.soton.ac.uk: /* Nisc */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Things which have been tested / implemented:&lt;br /&gt;
&lt;br /&gt;
=CORE=&lt;br /&gt;
&lt;br /&gt;
==Database==&lt;br /&gt;
&lt;br /&gt;
* Preferred MySQL engine is now InnoDB (over MyISAM)&lt;br /&gt;
* Added support for transactions with InnoDB. Partially written data/data-objects may be roll-backed (they are if an error occurs)&lt;br /&gt;
&lt;br /&gt;
==Request handlers/routers==&lt;br /&gt;
&lt;br /&gt;
* Every request is now routed via a trigger call (to find out which controller will respond)&lt;br /&gt;
* Apache::Rewrite has been refactored to Apache::Handler and is now super-lightweight&lt;br /&gt;
* Support for CGI scripts has been removed&lt;br /&gt;
&lt;br /&gt;
==Controllers==&lt;br /&gt;
&lt;br /&gt;
* CRUD&lt;br /&gt;
* Storage (delivery of files/thumbnails)&lt;br /&gt;
* Counter (like /cgi/counter)&lt;br /&gt;
* Ping (for fun, just replies 'pong')&lt;br /&gt;
* UI (for, potentially, Screen plug-ins)&lt;br /&gt;
* Static pages (XHTML, XPAGES etc that need compilation to HTML or any other static file (js, css...)&lt;br /&gt;
&lt;br /&gt;
==Security==&lt;br /&gt;
&lt;br /&gt;
* Based around actions (e.g. edit, view, search, ...) and optional contexts ('owner', etc.)&lt;br /&gt;
* Low-level implementation to avoid objects to leak from one dataset ('inbox') to another ('archive')&lt;br /&gt;
* ACL dataset (should maybe be called 'privs') to store extra privs against a user&lt;br /&gt;
* finer-grain permission (down to a single dataobj)&lt;br /&gt;
&lt;br /&gt;
==Auth==&lt;br /&gt;
&lt;br /&gt;
* Rewritten auth mechanisms&lt;br /&gt;
* Done similarly to Controllers, via a trigger&lt;br /&gt;
* When a user is auth'ed a user-session is created (cf. login ticket)&lt;br /&gt;
* When a request comes, EPrints attempts to load a user-session - cf. above&lt;br /&gt;
* Supports AuthBasic when no UI is available&lt;br /&gt;
* Cookies are managed transparently behind the &amp;quot;user-session&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Storage==&lt;br /&gt;
&lt;br /&gt;
* Added support for generic files. It is now possible to store any file against any object.&lt;br /&gt;
* Added support for &amp;quot;thumbnails&amp;quot; (as a separate dataset)&lt;br /&gt;
&lt;br /&gt;
==CRUD==&lt;br /&gt;
&lt;br /&gt;
* CRUD extended to support more methods/URI etc&lt;br /&gt;
* Sword2 hacks temporarily removed from CRUD&lt;br /&gt;
* Doesn't require its own auth code anymore&lt;br /&gt;
* CrudClient available to perform remote operation on a repository (via CrudDataSet, CrudDataObj, CrudList etc) - the API is very similar to the standard CLI syntax to create/edit/etc objects/lists of objects.&lt;br /&gt;
* Support for ETag and If-None-Match&lt;br /&gt;
* Support for PATCH method&lt;br /&gt;
* Support for generic file upload&lt;br /&gt;
* Minimal support for searching a dataset (e.g. GET /data/user/) - though will probably have a separate /search/... interface to allow user queries (Xapian and the likes)&lt;br /&gt;
* Entry poing /id/... moved to /data/...&lt;br /&gt;
&lt;br /&gt;
==Dataset definition==&lt;br /&gt;
&lt;br /&gt;
* The following properties are now core (meaning that EPrints will automatically add appropriate fields, set/update/remove data when such or such properties are enabled):&lt;br /&gt;
** flow: replaces eprint_status and the likes. Allows to specify a flow of states and transitions&lt;br /&gt;
** revision: adds a revision number, incremented each time the data obj is modified&lt;br /&gt;
** acl (TO RENAME): allows ACL checks on the dataset (should always be ON)&lt;br /&gt;
** read-only: make the dataset read-only, no modifications are allowed via the API (whether HTTP, CLI ...)&lt;br /&gt;
** web-read-only (TOFIX): make the dataset read-only ONLY for HTTP requests - CLI scripts can still change data&lt;br /&gt;
** history (TODO): keeps an historic of changes&lt;br /&gt;
** lastmod: keeps a timestamp of when the data-obj was last modified&lt;br /&gt;
** datestamp: keeps the date of creation of a data-obj&lt;br /&gt;
** loghandler (TODO): keeps download stats for that dataset&lt;br /&gt;
** contexts: allows to add custom security contexts (eg. 'owner', 'editor', 'co-author') &lt;br /&gt;
&lt;br /&gt;
==Misc==&lt;br /&gt;
&lt;br /&gt;
* memcached: use of server-wide &amp;quot;memcached&amp;quot; service to memory cache data objects&lt;br /&gt;
* contextual debugging: allows to enable/disable only specific themes e.g. &amp;quot;db&amp;quot;, &amp;quot;security&amp;quot; etc. and only write status messages to the logs for the enabled themes&lt;br /&gt;
* much, much more!&lt;/div&gt;</summary>
		<author><name>Sf03r@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=EPrints4_Status&amp;diff=10937</id>
		<title>EPrints4 Status</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=EPrints4_Status&amp;diff=10937"/>
		<updated>2014-03-24T17:18:33Z</updated>

		<summary type="html">&lt;p&gt;Sf03r@ecs.soton.ac.uk: /* Database */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Things which have been tested / implemented:&lt;br /&gt;
&lt;br /&gt;
=CORE=&lt;br /&gt;
&lt;br /&gt;
==Database==&lt;br /&gt;
&lt;br /&gt;
* Preferred MySQL engine is now InnoDB (over MyISAM)&lt;br /&gt;
* Added support for transactions with InnoDB. Partially written data/data-objects may be roll-backed (they are if an error occurs)&lt;br /&gt;
&lt;br /&gt;
==Request handlers/routers==&lt;br /&gt;
&lt;br /&gt;
* Every request is now routed via a trigger call (to find out which controller will respond)&lt;br /&gt;
* Apache::Rewrite has been refactored to Apache::Handler and is now super-lightweight&lt;br /&gt;
* Support for CGI scripts has been removed&lt;br /&gt;
&lt;br /&gt;
==Controllers==&lt;br /&gt;
&lt;br /&gt;
* CRUD&lt;br /&gt;
* Storage (delivery of files/thumbnails)&lt;br /&gt;
* Counter (like /cgi/counter)&lt;br /&gt;
* Ping (for fun, just replies 'pong')&lt;br /&gt;
* UI (for, potentially, Screen plug-ins)&lt;br /&gt;
* Static pages (XHTML, XPAGES etc that need compilation to HTML or any other static file (js, css...)&lt;br /&gt;
&lt;br /&gt;
==Security==&lt;br /&gt;
&lt;br /&gt;
* Based around actions (e.g. edit, view, search, ...) and optional contexts ('owner', etc.)&lt;br /&gt;
* Low-level implementation to avoid objects to leak from one dataset ('inbox') to another ('archive')&lt;br /&gt;
* ACL dataset (should maybe be called 'privs') to store extra privs against a user&lt;br /&gt;
* finer-grain permission (down to a single dataobj)&lt;br /&gt;
&lt;br /&gt;
==Auth==&lt;br /&gt;
&lt;br /&gt;
* Rewritten auth mechanisms&lt;br /&gt;
* Done similarly to Controllers, via a trigger&lt;br /&gt;
* When a user is auth'ed a user-session is created (cf. login ticket)&lt;br /&gt;
* When a request comes, EPrints attempts to load a user-session - cf. above&lt;br /&gt;
* Supports AuthBasic when no UI is available&lt;br /&gt;
* Cookies are managed transparently behind the &amp;quot;user-session&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Storage==&lt;br /&gt;
&lt;br /&gt;
* Added support for generic files. It is now possible to store any file against any object.&lt;br /&gt;
* Added support for &amp;quot;thumbnails&amp;quot; (as a separate dataset)&lt;br /&gt;
&lt;br /&gt;
==CRUD==&lt;br /&gt;
&lt;br /&gt;
* CRUD extended to support more methods/URI etc&lt;br /&gt;
* Sword2 hacks temporarily removed from CRUD&lt;br /&gt;
* Doesn't require its own auth code anymore&lt;br /&gt;
* CrudClient available to perform remote operation on a repository (via CrudDataSet, CrudDataObj, CrudList etc) - the API is very similar to the standard CLI syntax to create/edit/etc objects/lists of objects.&lt;br /&gt;
* Support for ETag and If-None-Match&lt;br /&gt;
* Support for PATCH method&lt;br /&gt;
* Support for generic file upload&lt;br /&gt;
* Minimal support for searching a dataset (e.g. GET /data/user/) - though will probably have a separate /search/... interface to allow user queries (Xapian and the likes)&lt;br /&gt;
* Entry poing /id/... moved to /data/...&lt;br /&gt;
&lt;br /&gt;
==Dataset definition==&lt;br /&gt;
&lt;br /&gt;
* The following properties are now core (meaning that EPrints will automatically add appropriate fields, set/update/remove data when such or such properties are enabled):&lt;br /&gt;
** flow: replaces eprint_status and the likes. Allows to specify a flow of states and transitions&lt;br /&gt;
** revision: adds a revision number, incremented each time the data obj is modified&lt;br /&gt;
** acl (TO RENAME): allows ACL checks on the dataset (should always be ON)&lt;br /&gt;
** read-only: make the dataset read-only, no modifications are allowed via the API (whether HTTP, CLI ...)&lt;br /&gt;
** web-read-only (TOFIX): make the dataset read-only ONLY for HTTP requests - CLI scripts can still change data&lt;br /&gt;
** history (TODO): keeps an historic of changes&lt;br /&gt;
** lastmod: keeps a timestamp of when the data-obj was last modified&lt;br /&gt;
** datestamp: keeps the date of creation of a data-obj&lt;br /&gt;
** loghandler (TODO): keeps download stats for that dataset&lt;br /&gt;
** contexts: allows to add custom security contexts (eg. 'owner', 'editor', 'co-author') &lt;br /&gt;
&lt;br /&gt;
==Nisc==&lt;br /&gt;
&lt;br /&gt;
* memcached: use of server-wide &amp;quot;memcached&amp;quot; service to memory cache data objects&lt;br /&gt;
* contextual debugging: allows to enable/disable only specific themes e.g. &amp;quot;db&amp;quot;, &amp;quot;security&amp;quot; etc. and only write status messages to the logs for the enabled themes&lt;br /&gt;
* much, much more!&lt;/div&gt;</summary>
		<author><name>Sf03r@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=EPrints4_Status&amp;diff=10936</id>
		<title>EPrints4 Status</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=EPrints4_Status&amp;diff=10936"/>
		<updated>2014-03-24T17:18:10Z</updated>

		<summary type="html">&lt;p&gt;Sf03r@ecs.soton.ac.uk: Created page with 'Things which have been tested / implemented:  =CORE=  ==Database==  * Preferred MySQL engine is now InnoDB (over MyISAM) * Added support for transactions with InnoDB. Partially c…'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Things which have been tested / implemented:&lt;br /&gt;
&lt;br /&gt;
=CORE=&lt;br /&gt;
&lt;br /&gt;
==Database==&lt;br /&gt;
&lt;br /&gt;
* Preferred MySQL engine is now InnoDB (over MyISAM)&lt;br /&gt;
* Added support for transactions with InnoDB. Partially committed data/data-objects may be roll-backed (they are if an error occurs)&lt;br /&gt;
&lt;br /&gt;
==Request handlers/routers==&lt;br /&gt;
&lt;br /&gt;
* Every request is now routed via a trigger call (to find out which controller will respond)&lt;br /&gt;
* Apache::Rewrite has been refactored to Apache::Handler and is now super-lightweight&lt;br /&gt;
* Support for CGI scripts has been removed&lt;br /&gt;
&lt;br /&gt;
==Controllers==&lt;br /&gt;
&lt;br /&gt;
* CRUD&lt;br /&gt;
* Storage (delivery of files/thumbnails)&lt;br /&gt;
* Counter (like /cgi/counter)&lt;br /&gt;
* Ping (for fun, just replies 'pong')&lt;br /&gt;
* UI (for, potentially, Screen plug-ins)&lt;br /&gt;
* Static pages (XHTML, XPAGES etc that need compilation to HTML or any other static file (js, css...)&lt;br /&gt;
&lt;br /&gt;
==Security==&lt;br /&gt;
&lt;br /&gt;
* Based around actions (e.g. edit, view, search, ...) and optional contexts ('owner', etc.)&lt;br /&gt;
* Low-level implementation to avoid objects to leak from one dataset ('inbox') to another ('archive')&lt;br /&gt;
* ACL dataset (should maybe be called 'privs') to store extra privs against a user&lt;br /&gt;
* finer-grain permission (down to a single dataobj)&lt;br /&gt;
&lt;br /&gt;
==Auth==&lt;br /&gt;
&lt;br /&gt;
* Rewritten auth mechanisms&lt;br /&gt;
* Done similarly to Controllers, via a trigger&lt;br /&gt;
* When a user is auth'ed a user-session is created (cf. login ticket)&lt;br /&gt;
* When a request comes, EPrints attempts to load a user-session - cf. above&lt;br /&gt;
* Supports AuthBasic when no UI is available&lt;br /&gt;
* Cookies are managed transparently behind the &amp;quot;user-session&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Storage==&lt;br /&gt;
&lt;br /&gt;
* Added support for generic files. It is now possible to store any file against any object.&lt;br /&gt;
* Added support for &amp;quot;thumbnails&amp;quot; (as a separate dataset)&lt;br /&gt;
&lt;br /&gt;
==CRUD==&lt;br /&gt;
&lt;br /&gt;
* CRUD extended to support more methods/URI etc&lt;br /&gt;
* Sword2 hacks temporarily removed from CRUD&lt;br /&gt;
* Doesn't require its own auth code anymore&lt;br /&gt;
* CrudClient available to perform remote operation on a repository (via CrudDataSet, CrudDataObj, CrudList etc) - the API is very similar to the standard CLI syntax to create/edit/etc objects/lists of objects.&lt;br /&gt;
* Support for ETag and If-None-Match&lt;br /&gt;
* Support for PATCH method&lt;br /&gt;
* Support for generic file upload&lt;br /&gt;
* Minimal support for searching a dataset (e.g. GET /data/user/) - though will probably have a separate /search/... interface to allow user queries (Xapian and the likes)&lt;br /&gt;
* Entry poing /id/... moved to /data/...&lt;br /&gt;
&lt;br /&gt;
==Dataset definition==&lt;br /&gt;
&lt;br /&gt;
* The following properties are now core (meaning that EPrints will automatically add appropriate fields, set/update/remove data when such or such properties are enabled):&lt;br /&gt;
** flow: replaces eprint_status and the likes. Allows to specify a flow of states and transitions&lt;br /&gt;
** revision: adds a revision number, incremented each time the data obj is modified&lt;br /&gt;
** acl (TO RENAME): allows ACL checks on the dataset (should always be ON)&lt;br /&gt;
** read-only: make the dataset read-only, no modifications are allowed via the API (whether HTTP, CLI ...)&lt;br /&gt;
** web-read-only (TOFIX): make the dataset read-only ONLY for HTTP requests - CLI scripts can still change data&lt;br /&gt;
** history (TODO): keeps an historic of changes&lt;br /&gt;
** lastmod: keeps a timestamp of when the data-obj was last modified&lt;br /&gt;
** datestamp: keeps the date of creation of a data-obj&lt;br /&gt;
** loghandler (TODO): keeps download stats for that dataset&lt;br /&gt;
** contexts: allows to add custom security contexts (eg. 'owner', 'editor', 'co-author') &lt;br /&gt;
&lt;br /&gt;
==Nisc==&lt;br /&gt;
&lt;br /&gt;
* memcached: use of server-wide &amp;quot;memcached&amp;quot; service to memory cache data objects&lt;br /&gt;
* contextual debugging: allows to enable/disable only specific themes e.g. &amp;quot;db&amp;quot;, &amp;quot;security&amp;quot; etc. and only write status messages to the logs for the enabled themes&lt;br /&gt;
* much, much more!&lt;/div&gt;</summary>
		<author><name>Sf03r@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=EPrints4_Roadmap&amp;diff=10935</id>
		<title>EPrints4 Roadmap</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=EPrints4_Roadmap&amp;diff=10935"/>
		<updated>2014-03-24T16:53:29Z</updated>

		<summary type="html">&lt;p&gt;Sf03r@ecs.soton.ac.uk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Some general ideas for the development of the next major release of EPrints. &lt;br /&gt;
&lt;br /&gt;
Also read [[EPrints4_Status]]&lt;br /&gt;
&lt;br /&gt;
==Main Objectives==&lt;br /&gt;
&lt;br /&gt;
* Separation of the Core API and UI (/rendering) components - that mainly means that core objects (Repository, MetaField*, DataObj*) won't have any render_* method. this could also imply that the core or the UI could be upgraded separately. It would also make re-use of the eprints core easy for other purposes (e.g. data repository, OER etc.)&lt;br /&gt;
&lt;br /&gt;
* Remove the spaghetti code (esp (1) rendering methods (2) Dataobj-Metafield relations)&lt;br /&gt;
&lt;br /&gt;
* Drop support for internal search in favour of specialist tools such as Xapian or Solr - we might however need to keep some aspects of the internal search (cf List/data retrieval) for exact matching - perhaps that's more a (SQL) &amp;quot;QueryBuilder&amp;quot; than a (user) search.&lt;br /&gt;
&lt;br /&gt;
* Drop support for Windows?&lt;br /&gt;
&lt;br /&gt;
* Implement object locking at the core level (for any objects, perhaps without using database fields at all). Actually this is done via: DB Transactions, ETag and If-None-Match headers. The current (3.2/3.3) object locking is a UI feature not a core one.&lt;br /&gt;
&lt;br /&gt;
* Implement object state at the core level (at the moment EPrint object might be in one of 4 states: inbox, buffer, archive, deletion via the field eprint_status) &amp;lt;DONE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* code normalisation:&lt;br /&gt;
** use new class name (e.g. EPrints::Session =&amp;gt; EPrints::Repository)&lt;br /&gt;
** use &amp;quot;new way&amp;quot; of doing things (e.g. EPrints::Dataobj::X-&amp;gt;new(12) =&amp;gt; repo-&amp;gt;dataset( 'x' )-&amp;gt;dataobj(12))&lt;br /&gt;
** remove v2.x features deprecated in v3+ (cf. EPrints::BackCompatibility)&lt;br /&gt;
&lt;br /&gt;
* define clear API for core functions (e.g. Database, object handling) and for UI purposes. The API must present a unique way of doing something.&lt;br /&gt;
&lt;br /&gt;
* It might be worth separating the code into 3 packages to ease the development: eprints4-core, eprints4-ir and eprints4-ir-ui.&lt;br /&gt;
&lt;br /&gt;
==Core==&lt;br /&gt;
&lt;br /&gt;
* Revisit Apache request Handler aka Apache::Rewrite (lots of hard-coded paths, many obsolete paths) - URL handling should be done by Controllers called/prioritised via a trigger. &amp;lt;TESTED OK&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Remove EPrints::Session from anywhere in favour of EPrints::Repository&lt;br /&gt;
&lt;br /&gt;
* Test using memcached (http://code.google.com/p/memcached/) - Cache::Memcached::Fast to cache data objects, perhaps could work to cache XML fragments too. &amp;lt;TESTED OK&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Use Multipart rather than Compound - Compound creates 1 table per subfield whilst Multipart creates 1 column per subfield. &amp;lt;TESTED OK&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Finer grain permissions (using User, Groups, perhaps ACL concepts) - also security should be handled at the core level not at the UI level&lt;br /&gt;
&lt;br /&gt;
* Core should be able to run without IR extensions nor UI elements (might require to extend the SWORD layer for interactions with the core) &amp;lt;TESTED OK&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Built-in locking mechanisms for objects (improved edit_lock)&lt;br /&gt;
&lt;br /&gt;
* No hard-coded exceptions for IR extensions (e.g. eprint_status hard-coded in places) &amp;lt;TESTED OK&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Generalise concept of &amp;quot;files&amp;quot; to allow the storage of arbitrary files against any data objects (e.g. a profile picture for a User) &amp;lt;TESTED OK&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* (coding-style) don't use objects via hash-value directly e.g. my $repo = $object-&amp;gt;{repository} - use method instead: my $repo = $object-&amp;gt;repository.&lt;br /&gt;
&lt;br /&gt;
* Metafield/DataObj::set_value should re-enforce the database type - i.e. $object-&amp;gt;set_value( 'int_field', 'abc' )should fail at the Application layer - not silently at the DB layer as it currently happens. Same goes with any field type (e.g. -&amp;gt;set_value( 'set_field', 'invalid_set_value' ) should fail). &amp;lt;TESTED OK&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Extra dataset properties to allow global, consistent behaviour. Considered: &amp;quot;states&amp;quot;, &amp;quot;revision&amp;quot; (TESTED OK), &amp;quot;lastmod&amp;quot; (TESTED OK), &amp;quot;read-only&amp;quot; (TESTED OK), &amp;quot;cache&amp;quot; (i.e. use memcached), &amp;quot;history&amp;quot; (keep revision history, implies revision=true), &amp;quot;datestamp&amp;quot;, &amp;quot;acl&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Extensions for IR-type of Repositories==&lt;br /&gt;
&lt;br /&gt;
* Authors/names stored in a separate dataset - should help integrate with various UID systems like OrcID.&lt;br /&gt;
&lt;br /&gt;
* Extra metadata to describe a User - cf. MePrints.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==UI elements==&lt;br /&gt;
&lt;br /&gt;
* jQuery over Prototype&lt;br /&gt;
&lt;br /&gt;
* jQueryUI widgets used to render fields &lt;br /&gt;
&lt;br /&gt;
* Javascript/Ajax concepts built-in&lt;br /&gt;
&lt;br /&gt;
* CSS3 Responsive design to support small screens (mobile, tablets etc) - http://alistapart.com/article/responsive-web-design&lt;br /&gt;
&lt;br /&gt;
* Consider http://getbootstrap.com/javascript/ -  http://getbootstrap.com/components/&lt;br /&gt;
&lt;br /&gt;
==Misc==&lt;br /&gt;
&lt;br /&gt;
* an internal messaging system would be nice (similar to the current Message data object but with more options) - this would help system/user and user/user interactions. A logged-in user could then see messages and act accordingly. For instance: publication just went live, items have been imported from remote sources, user commented on a resource etc.&lt;/div&gt;</summary>
		<author><name>Sf03r@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=EPrints4_Roadmap&amp;diff=10934</id>
		<title>EPrints4 Roadmap</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=EPrints4_Roadmap&amp;diff=10934"/>
		<updated>2014-03-24T16:52:32Z</updated>

		<summary type="html">&lt;p&gt;Sf03r@ecs.soton.ac.uk: /* Main Objectives */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Some general ideas for the development of the next major release of EPrints.&lt;br /&gt;
&lt;br /&gt;
==Main Objectives==&lt;br /&gt;
&lt;br /&gt;
* Separation of the Core API and UI (/rendering) components - that mainly means that core objects (Repository, MetaField*, DataObj*) won't have any render_* method. this could also imply that the core or the UI could be upgraded separately. It would also make re-use of the eprints core easy for other purposes (e.g. data repository, OER etc.)&lt;br /&gt;
&lt;br /&gt;
* Remove the spaghetti code (esp (1) rendering methods (2) Dataobj-Metafield relations)&lt;br /&gt;
&lt;br /&gt;
* Drop support for internal search in favour of specialist tools such as Xapian or Solr - we might however need to keep some aspects of the internal search (cf List/data retrieval) for exact matching - perhaps that's more a (SQL) &amp;quot;QueryBuilder&amp;quot; than a (user) search.&lt;br /&gt;
&lt;br /&gt;
* Drop support for Windows?&lt;br /&gt;
&lt;br /&gt;
* Implement object locking at the core level (for any objects, perhaps without using database fields at all). Actually this is done via: DB Transactions, ETag and If-None-Match headers. The current (3.2/3.3) object locking is a UI feature not a core one.&lt;br /&gt;
&lt;br /&gt;
* Implement object state at the core level (at the moment EPrint object might be in one of 4 states: inbox, buffer, archive, deletion via the field eprint_status) &amp;lt;DONE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* code normalisation:&lt;br /&gt;
** use new class name (e.g. EPrints::Session =&amp;gt; EPrints::Repository)&lt;br /&gt;
** use &amp;quot;new way&amp;quot; of doing things (e.g. EPrints::Dataobj::X-&amp;gt;new(12) =&amp;gt; repo-&amp;gt;dataset( 'x' )-&amp;gt;dataobj(12))&lt;br /&gt;
** remove v2.x features deprecated in v3+ (cf. EPrints::BackCompatibility)&lt;br /&gt;
&lt;br /&gt;
* define clear API for core functions (e.g. Database, object handling) and for UI purposes. The API must present a unique way of doing something.&lt;br /&gt;
&lt;br /&gt;
* It might be worth separating the code into 3 packages to ease the development: eprints4-core, eprints4-ir and eprints4-ir-ui.&lt;br /&gt;
&lt;br /&gt;
==Core==&lt;br /&gt;
&lt;br /&gt;
* Revisit Apache request Handler aka Apache::Rewrite (lots of hard-coded paths, many obsolete paths) - URL handling should be done by Controllers called/prioritised via a trigger. &amp;lt;TESTED OK&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Remove EPrints::Session from anywhere in favour of EPrints::Repository&lt;br /&gt;
&lt;br /&gt;
* Test using memcached (http://code.google.com/p/memcached/) - Cache::Memcached::Fast to cache data objects, perhaps could work to cache XML fragments too. &amp;lt;TESTED OK&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Use Multipart rather than Compound - Compound creates 1 table per subfield whilst Multipart creates 1 column per subfield. &amp;lt;TESTED OK&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Finer grain permissions (using User, Groups, perhaps ACL concepts) - also security should be handled at the core level not at the UI level&lt;br /&gt;
&lt;br /&gt;
* Core should be able to run without IR extensions nor UI elements (might require to extend the SWORD layer for interactions with the core) &amp;lt;TESTED OK&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Built-in locking mechanisms for objects (improved edit_lock)&lt;br /&gt;
&lt;br /&gt;
* No hard-coded exceptions for IR extensions (e.g. eprint_status hard-coded in places) &amp;lt;TESTED OK&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Generalise concept of &amp;quot;files&amp;quot; to allow the storage of arbitrary files against any data objects (e.g. a profile picture for a User) &amp;lt;TESTED OK&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* (coding-style) don't use objects via hash-value directly e.g. my $repo = $object-&amp;gt;{repository} - use method instead: my $repo = $object-&amp;gt;repository.&lt;br /&gt;
&lt;br /&gt;
* Metafield/DataObj::set_value should re-enforce the database type - i.e. $object-&amp;gt;set_value( 'int_field', 'abc' )should fail at the Application layer - not silently at the DB layer as it currently happens. Same goes with any field type (e.g. -&amp;gt;set_value( 'set_field', 'invalid_set_value' ) should fail). &amp;lt;TESTED OK&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Extra dataset properties to allow global, consistent behaviour. Considered: &amp;quot;states&amp;quot;, &amp;quot;revision&amp;quot; (TESTED OK), &amp;quot;lastmod&amp;quot; (TESTED OK), &amp;quot;read-only&amp;quot; (TESTED OK), &amp;quot;cache&amp;quot; (i.e. use memcached), &amp;quot;history&amp;quot; (keep revision history, implies revision=true), &amp;quot;datestamp&amp;quot;, &amp;quot;acl&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Extensions for IR-type of Repositories==&lt;br /&gt;
&lt;br /&gt;
* Authors/names stored in a separate dataset - should help integrate with various UID systems like OrcID.&lt;br /&gt;
&lt;br /&gt;
* Extra metadata to describe a User - cf. MePrints.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==UI elements==&lt;br /&gt;
&lt;br /&gt;
* jQuery over Prototype&lt;br /&gt;
&lt;br /&gt;
* jQueryUI widgets used to render fields &lt;br /&gt;
&lt;br /&gt;
* Javascript/Ajax concepts built-in&lt;br /&gt;
&lt;br /&gt;
* CSS3 Responsive design to support small screens (mobile, tablets etc) - http://alistapart.com/article/responsive-web-design&lt;br /&gt;
&lt;br /&gt;
* Consider http://getbootstrap.com/javascript/ -  http://getbootstrap.com/components/&lt;br /&gt;
&lt;br /&gt;
==Misc==&lt;br /&gt;
&lt;br /&gt;
* an internal messaging system would be nice (similar to the current Message data object but with more options) - this would help system/user and user/user interactions. A logged-in user could then see messages and act accordingly. For instance: publication just went live, items have been imported from remote sources, user commented on a resource etc.&lt;/div&gt;</summary>
		<author><name>Sf03r@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=EPrints4_Roadmap&amp;diff=10933</id>
		<title>EPrints4 Roadmap</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=EPrints4_Roadmap&amp;diff=10933"/>
		<updated>2014-03-24T16:51:08Z</updated>

		<summary type="html">&lt;p&gt;Sf03r@ecs.soton.ac.uk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Some general ideas for the development of the next major release of EPrints.&lt;br /&gt;
&lt;br /&gt;
==Main Objectives==&lt;br /&gt;
&lt;br /&gt;
* Separation of the Core API and UI (/rendering) components - that mainly means that core objects (Repository, MetaField*, DataObj*) won't have any render_* method. this could also imply that the core or the UI could be upgraded separately. It would also make re-use of the eprints core easy for other purposes (e.g. data repository, OER etc.)&lt;br /&gt;
&lt;br /&gt;
* Remove the spaghetti code (esp (1) rendering methods (2) Dataobj-Metafield relations)&lt;br /&gt;
&lt;br /&gt;
* Drop support for internal search in favour of specialist tools such as Xapian or Solr - we might however need to keep some aspects of the internal search (cf List/data retrieval) for exact matching - perhaps that's more a (SQL) &amp;quot;QueryBuilder&amp;quot; than a (user) search.&lt;br /&gt;
&lt;br /&gt;
* Drop support for Windows?&lt;br /&gt;
&lt;br /&gt;
* Implement object locking at the core level (for any objects, perhaps without using database fields at all)&lt;br /&gt;
&lt;br /&gt;
* Implement object state at the core level (at the moment EPrint object might be in one of 4 states: inbox, buffer, archive, deletion via the field eprint_status)&lt;br /&gt;
&lt;br /&gt;
* code normalisation:&lt;br /&gt;
** use new class name (e.g. EPrints::Session =&amp;gt; EPrints::Repository)&lt;br /&gt;
** use &amp;quot;new way&amp;quot; of doing things (e.g. EPrints::Dataobj::X-&amp;gt;new(12) =&amp;gt; repo-&amp;gt;dataset( 'x' )-&amp;gt;dataobj(12))&lt;br /&gt;
** remove v2.x features deprecated in v3+ (cf. EPrints::BackCompatibility)&lt;br /&gt;
&lt;br /&gt;
* define clear API for core functions (e.g. Database, object handling) and for UI purposes. The API must present a unique way of doing something.&lt;br /&gt;
&lt;br /&gt;
* It might be worth separating the code into 3 packages to ease the development: eprints4-core, eprints4-ir and eprints4-ir-ui.&lt;br /&gt;
&lt;br /&gt;
==Core==&lt;br /&gt;
&lt;br /&gt;
* Revisit Apache request Handler aka Apache::Rewrite (lots of hard-coded paths, many obsolete paths) - URL handling should be done by Controllers called/prioritised via a trigger. &amp;lt;TESTED OK&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Remove EPrints::Session from anywhere in favour of EPrints::Repository&lt;br /&gt;
&lt;br /&gt;
* Test using memcached (http://code.google.com/p/memcached/) - Cache::Memcached::Fast to cache data objects, perhaps could work to cache XML fragments too. &amp;lt;TESTED OK&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Use Multipart rather than Compound - Compound creates 1 table per subfield whilst Multipart creates 1 column per subfield. &amp;lt;TESTED OK&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Finer grain permissions (using User, Groups, perhaps ACL concepts) - also security should be handled at the core level not at the UI level&lt;br /&gt;
&lt;br /&gt;
* Core should be able to run without IR extensions nor UI elements (might require to extend the SWORD layer for interactions with the core) &amp;lt;TESTED OK&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Built-in locking mechanisms for objects (improved edit_lock)&lt;br /&gt;
&lt;br /&gt;
* No hard-coded exceptions for IR extensions (e.g. eprint_status hard-coded in places) &amp;lt;TESTED OK&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Generalise concept of &amp;quot;files&amp;quot; to allow the storage of arbitrary files against any data objects (e.g. a profile picture for a User) &amp;lt;TESTED OK&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* (coding-style) don't use objects via hash-value directly e.g. my $repo = $object-&amp;gt;{repository} - use method instead: my $repo = $object-&amp;gt;repository.&lt;br /&gt;
&lt;br /&gt;
* Metafield/DataObj::set_value should re-enforce the database type - i.e. $object-&amp;gt;set_value( 'int_field', 'abc' )should fail at the Application layer - not silently at the DB layer as it currently happens. Same goes with any field type (e.g. -&amp;gt;set_value( 'set_field', 'invalid_set_value' ) should fail). &amp;lt;TESTED OK&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Extra dataset properties to allow global, consistent behaviour. Considered: &amp;quot;states&amp;quot;, &amp;quot;revision&amp;quot; (TESTED OK), &amp;quot;lastmod&amp;quot; (TESTED OK), &amp;quot;read-only&amp;quot; (TESTED OK), &amp;quot;cache&amp;quot; (i.e. use memcached), &amp;quot;history&amp;quot; (keep revision history, implies revision=true), &amp;quot;datestamp&amp;quot;, &amp;quot;acl&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Extensions for IR-type of Repositories==&lt;br /&gt;
&lt;br /&gt;
* Authors/names stored in a separate dataset - should help integrate with various UID systems like OrcID.&lt;br /&gt;
&lt;br /&gt;
* Extra metadata to describe a User - cf. MePrints.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==UI elements==&lt;br /&gt;
&lt;br /&gt;
* jQuery over Prototype&lt;br /&gt;
&lt;br /&gt;
* jQueryUI widgets used to render fields &lt;br /&gt;
&lt;br /&gt;
* Javascript/Ajax concepts built-in&lt;br /&gt;
&lt;br /&gt;
* CSS3 Responsive design to support small screens (mobile, tablets etc) - http://alistapart.com/article/responsive-web-design&lt;br /&gt;
&lt;br /&gt;
* Consider http://getbootstrap.com/javascript/ -  http://getbootstrap.com/components/&lt;br /&gt;
&lt;br /&gt;
==Misc==&lt;br /&gt;
&lt;br /&gt;
* an internal messaging system would be nice (similar to the current Message data object but with more options) - this would help system/user and user/user interactions. A logged-in user could then see messages and act accordingly. For instance: publication just went live, items have been imported from remote sources, user commented on a resource etc.&lt;/div&gt;</summary>
		<author><name>Sf03r@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=MePrints&amp;diff=10904</id>
		<title>MePrints</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=MePrints&amp;diff=10904"/>
		<updated>2014-03-12T13:05:31Z</updated>

		<summary type="html">&lt;p&gt;Sf03r@ecs.soton.ac.uk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:MePrints]]&lt;br /&gt;
All About MEPrints is a JISC rapid innovations project to build a user profile system for EPrints. The aim is that every repository user will have a page which promotes their work and identity within the repository and beyond. It is hoped this will improve user-to-repository relations and also provide useful information for user-to-user interactions.&lt;br /&gt;
&lt;br /&gt;
The extension we have developed is called MePrints. This page gives an overview of the features of the MePrints extension.&lt;br /&gt;
&lt;br /&gt;
For technical instructions on how to install MePrints, see [[MePrintsInstall]].&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
&lt;br /&gt;
MePrints is a plugin for EPrints 3.1+ that extends the user aspect of EPrints with user profiles and homepages. Profile pages are public-facing pages providing, admin-customisable, information ''about'' the user. Homepages replace the current EPrints &amp;quot;Profile&amp;quot; page and provide, admin and user-customisable, information from the repository so that the user can get a quick overview of anything that is relevant to them.&lt;br /&gt;
&lt;br /&gt;
The hope is that MePrints functionality will find it's way into the EPrints 3.2 trunk so that it is available to use with a new install of EPrints.&lt;br /&gt;
&lt;br /&gt;
=Features=&lt;br /&gt;
&lt;br /&gt;
MePrints brings a number of additional features to EPrints to improve your user experience with EPrints.&lt;br /&gt;
&lt;br /&gt;
==Profile Pages==&lt;br /&gt;
[[Image:MePrints User Profile Thumb.png|frame|right|||An example MePrints User Profile||This image shows an example MePrints User Profile.]] &lt;br /&gt;
&lt;br /&gt;
Public user profile pages provide a static view of data that describes you as a repository user. The information that is displayed on these pages is configurable by the repository administrator. If you do not want your profile page to be accessible to the outside world then you can set your profile to be hidden so that it is not visible to anyone. Profiles also have a search engine friendly URL assigned to them as well in the form &amp;lt;nowiki&amp;gt;http://repository.org/profile/username&amp;lt;/nowiki&amp;gt;. This allows you to easily share their EPrints profile with other people.&lt;br /&gt;
&lt;br /&gt;
Profile pages include the following information;&lt;br /&gt;
* Name&lt;br /&gt;
* Expertise&lt;br /&gt;
* Qualifications&lt;br /&gt;
* Divisions&lt;br /&gt;
* Biography&lt;br /&gt;
* User Image&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear: both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Homepages==&lt;br /&gt;
[[Image:MePrints Homepage Thumb.png|frame|right|||An example MePrints User Homepage||This image shows a screenshot of an example MePrints User Homepage.]] &lt;br /&gt;
&lt;br /&gt;
This replaces the initial &amp;quot;Manage Deposits&amp;quot; view that you see when they first login. The &amp;quot;Manage Deposits&amp;quot; view is still available although it is now accessible through the link at the top of the page. &lt;br /&gt;
&lt;br /&gt;
This page is highly customisable for both the repository administrator and you. A repository administrator can create [[#Widgets|widgets]], which are a special type of plugin that provide information from the repository that is relevant to you. Also the administrator can create different layouts for the homepage so that [[#Widgets|widgets]] on the page will be laid out in different ways. You can then choose the layout that you prefer from a number of available layouts if your repository administrator has made several available for use.&lt;br /&gt;
&lt;br /&gt;
You can further customise your homepage by changing the positions of the widgets and adding or removing [[#Widgets|widgets]] that the repository administrator has installed.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear: both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Widgets==&lt;br /&gt;
Widgets appear both on your profile and your homepage. The widgets that appear on your profile are managed by the repository administrator while on your homepage you have a degree of control over what widgets appear, from the collection of available widgets, and where on the page they appear.&lt;br /&gt;
&lt;br /&gt;
Widgets available by default with MePrints include;&lt;br /&gt;
* User Details - Shows the username, biography, expertise and other core data fields.&lt;br /&gt;
* User Picture - Allows the user to upload an image of themselves for their profile.&lt;br /&gt;
* User Actions - Adds a box containing all of the possible user actions.&lt;br /&gt;
* Recently Published Items - Shows items that the user has recently published in the repository.&lt;br /&gt;
* Item Issues - Shows any issues with items, owned by the user, that have been discovered by an issues audit.&lt;br /&gt;
* Quick Upload -  Allows the user to upload a file and attach it to a new record in their inbox, ready for publication on the repository later.&lt;br /&gt;
* Most Popular Items - Looks at the number of times a users items have been accessed and displays a rundown of the most popular.&lt;br /&gt;
* IRStats Mini Dashboard - If the repository has IRStats installed this widget can display data from it and allow the user to look at a number of different statistics regarding their publications.&lt;br /&gt;
&lt;br /&gt;
This list may differ for you if your repository administrator has disabled or added any widgets.&lt;br /&gt;
&lt;br /&gt;
==Searching For Users==&lt;br /&gt;
MePrints makes it possible for you to search through all of the users who have made their profiles public. If you make your profile private and don't allow anyone to see it then it will not be included in any search results as well as not allowing anyone to view it.&lt;br /&gt;
&lt;br /&gt;
===Browsing For Users By Expertise===&lt;br /&gt;
A new browse view has been added with MePrints that allows you to browse for users by expertise.&lt;br /&gt;
&lt;br /&gt;
===User Search Page===&lt;br /&gt;
There is a new user search provided by MePrints, cgi/search_users, which allows you to search through users in the EPrints repository.&lt;br /&gt;
&lt;br /&gt;
=Installation=&lt;br /&gt;
MePrints can be installed on EPrints 3.3 from the Bazaar with a one-click install.&lt;br /&gt;
&lt;br /&gt;
For older versions of MePrints/EPrints see: Installation of MePrints on an existing EPrints 3.1 repository has been designed to be a simple as possible. Full instructions for installation can be found at [[MePrintsInstall]].&lt;br /&gt;
&lt;br /&gt;
[http://creativecommons.org/licenses/by/3.0/ This work is licensed under a Creative Commons Attribution 3.0 Unported License].&lt;br /&gt;
&lt;br /&gt;
=Changelog=&lt;br /&gt;
&lt;br /&gt;
==v1.4.3==&lt;br /&gt;
&lt;br /&gt;
Released on 16th September 2013 by sf2 &lt;br /&gt;
&lt;br /&gt;
* Added missing user citation &amp;quot;details&amp;quot;&lt;br /&gt;
* Added new user citation &amp;quot;profile&amp;quot; to control the look and feel of the (external) profile page&lt;br /&gt;
* Removed calls to deprecated functions (EPrints 3.3+)&lt;br /&gt;
* Added missing timestamp file to allow regeneration of profile pages from the Admin UI&lt;br /&gt;
* Added missing Admin screen plug-in to allow regen. of profile pages&lt;br /&gt;
* Disabled user searches and user browse views by default&lt;br /&gt;
* Fixed the user setting their profile visibility to &amp;quot;public&amp;quot; / &amp;quot;private&amp;quot; and is now working&lt;br /&gt;
* Added missing CGI script &amp;quot;save&amp;quot; to save the position of the homepage's widgets&lt;br /&gt;
* Added possibility to define locally-defined sizes of the profile pictures&lt;br /&gt;
* Added missing triggers to allow regen of the profile pages when the user's metadata has changed&lt;/div&gt;</summary>
		<author><name>Sf03r@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=MePrintsInstall&amp;diff=10903</id>
		<title>MePrintsInstall</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=MePrintsInstall&amp;diff=10903"/>
		<updated>2014-03-12T12:52:33Z</updated>

		<summary type="html">&lt;p&gt;Sf03r@ecs.soton.ac.uk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''WARNING: THIS PAGE IS OUT-OF-DATE. MePrints is available from the Bazaar as a one-click install'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:MePrints]]&lt;br /&gt;
This page provides technical instructions for installing the MePrints extension. To find out what MePrints is, and for an overview of MePrints features, see [[MePrintsOverview]].&lt;br /&gt;
&lt;br /&gt;
==Installation (EPrints 3.1.3+)==&lt;br /&gt;
&lt;br /&gt;
Download the latest release to your '''local repository directory''' (eg. /opt/eprints3/archives/ARCHIVEID/).&lt;br /&gt;
&lt;br /&gt;
Extract files:&lt;br /&gt;
&lt;br /&gt;
 tar xzvf meprints_xx.tgz&lt;br /&gt;
&lt;br /&gt;
===Install bin scripts===&lt;br /&gt;
&lt;br /&gt;
Edit the bin/generate_meprints file and check the include path on the first line. For example if you have installed EPrints in /var/lib/eprints3 change the line from:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/perl -w -I/opt/eprints3/perl_lib&lt;br /&gt;
&lt;br /&gt;
to:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/perl -w -I/var/lib/eprints3/perl_lib&lt;br /&gt;
&lt;br /&gt;
===Install cgi scripts===&lt;br /&gt;
&lt;br /&gt;
Link the MePrints cgi scripts into the EPrints cgi directory:&lt;br /&gt;
&lt;br /&gt;
 ln -s /opt/eprints3/archives/ARCHIVEID/cgi/meprints/ /opt/eprints3/cgi/&lt;br /&gt;
 ln -s /opt/eprints3/archives/ARCHIVEID/cgi/users/meprints/ /opt/eprints3/cgi/users/&lt;br /&gt;
&lt;br /&gt;
===Update database===&lt;br /&gt;
&lt;br /&gt;
Add the new MePrints user fields (defined in cfg/cfg.d/z_meprints.pl) to your repository database:&lt;br /&gt;
&lt;br /&gt;
 cd /opt/eprints3/&lt;br /&gt;
 bin/epadmin update_database_structure ARCHIVEID --verbose&lt;br /&gt;
&lt;br /&gt;
===Apply MePrints patches===&lt;br /&gt;
&lt;br /&gt;
Apply the MePrints patch files:&lt;br /&gt;
&lt;br /&gt;
 cd /opt/eprints3&lt;br /&gt;
 patch -R -p0 &amp;lt; archives/ARCHIVE_ID/meprints_1.0.patch&lt;br /&gt;
&lt;br /&gt;
DO NOT APPLY THIS FOLLOWING PATCH ON EPrints 3.2, it is not required;&lt;br /&gt;
&lt;br /&gt;
 patch -R -p0 &amp;lt; archives/ARCHIVE_ID/meprints_dataset.patch #YOU DONT NEED THIS ON 3.2 trying it might break your install&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
These patches change two core EPrints modules:&lt;br /&gt;
&lt;br /&gt;
# Update/Views.pm - allow view pages to be generated for any dataset (MePrints adds views over the public_profile_users dataset)&lt;br /&gt;
# DataSet.pm - add a new dataset called public_profile_users which is the set of all users who have opted to make their public profile page visible.&lt;br /&gt;
&lt;br /&gt;
==Getting Started==&lt;br /&gt;
&lt;br /&gt;
To activate MePrints, you will need to make some changes to your repository setup.&lt;br /&gt;
&lt;br /&gt;
===cfg/cfg.d/plugins.pl===&lt;br /&gt;
You can skip this step on MePrints 1.3 and later.&lt;br /&gt;
&lt;br /&gt;
Add the following lines to your cfg/cfg.d/plugins.pl configuration file: to use the MePrints homepage instead instead of the default EPrints &amp;quot;Profile&amp;quot; page:&lt;br /&gt;
&lt;br /&gt;
 $c-&amp;gt;{plugins}-&amp;gt;{&amp;quot;Screen::User::View&amp;quot;}-&amp;gt;{appears}-&amp;gt;{key_tools} = undef;&lt;br /&gt;
 $c-&amp;gt;{plugin_alias_map}-&amp;gt;{&amp;quot;Screen::User::View&amp;quot;} = &amp;quot;Screen::User::Homepage&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
===cfg/cfg.d/user_fields_automatic.pl===&lt;br /&gt;
&lt;br /&gt;
Add the following lines to your cfg/cfg.d/user_fields_automatic.pl configuration file to update the MePrints public profile page automatically when a user changes his or her profile information, &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$c-&amp;gt;{user_fields_automatic} = sub {&lt;br /&gt;
        &lt;br /&gt;
&lt;br /&gt;
        my $user = @_;&lt;br /&gt;
&lt;br /&gt;
        ...&lt;br /&gt;
&lt;br /&gt;
        if( defined $user-&amp;gt;{changed} )&lt;br /&gt;
        {&lt;br /&gt;
                $user-&amp;gt;remove_static();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===cfg/cfg.d/eprint_fields_automatic.pl===&lt;br /&gt;
&lt;br /&gt;
Add the following line to your cfg/cfg.d/eprint_fields_automatic.pl configuration file so that the MePrints public profile page automatically changes when an EPrint they have deposited is updated.&lt;br /&gt;
&lt;br /&gt;
 $eprint-&amp;gt;get_user-&amp;gt;remove_static;&lt;br /&gt;
&lt;br /&gt;
===cfg/cfg.d/urls.pl===&lt;br /&gt;
&lt;br /&gt;
To activate the canonical profile URLs, add &amp;quot;/profile/&amp;quot; to the rewrite_exceptions list in your cfg/cfg.d/urls.pl configuration file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$c-&amp;gt;{rewrite_exceptions} = [ '/cgi/', '/archive/', '/profile/' ];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===cfg/apachevhost.conf===&lt;br /&gt;
&lt;br /&gt;
Add the following directives to your cfg/apachevhost.conf configuration file to enable canonical profile URLs (for example http://myrepository.com/profile/jsmith):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;Location &amp;quot;/profile&amp;quot;&amp;gt;&lt;br /&gt;
  DefaultType 'text/html; charset=UTF-8'&lt;br /&gt;
  SetHandler perl-script&lt;br /&gt;
  PerlResponseHandler EPrints::Plugin::MePrints::MePrintsHandler&lt;br /&gt;
&amp;lt;/Location&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On eprints 3.2 and later you will now need to regenerated your apache conf:&lt;br /&gt;
 &amp;lt;eprints_root&amp;gt;/bin/generate_apacheconf --replace &amp;lt;archiveid&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===cfg/workflows/user/default.xml===&lt;br /&gt;
&lt;br /&gt;
Add the following lines to your cfg/workflows/user/default.xml configuration file:&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;stage name=&amp;quot;default&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;component type=&amp;quot;Field::Multi&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;title&amp;gt;&amp;lt;epc:phrase ref=&amp;quot;user_section_personal&amp;quot; /&amp;gt;&amp;lt;/title&amp;gt;&lt;br /&gt;
      ...&lt;br /&gt;
    &amp;lt;/component&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;component type=&amp;quot;Field::Multi&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;title&amp;gt;&amp;lt;epc:phrase ref=&amp;quot;user_section_meprints&amp;quot; /&amp;gt;&amp;lt;/title&amp;gt;&lt;br /&gt;
      &amp;lt;field ref=&amp;quot;profile_visibility&amp;quot; required=&amp;quot;yes&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;field ref=&amp;quot;jobtitle&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;field ref=&amp;quot;expertise&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;field ref=&amp;quot;biography&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;field ref=&amp;quot;qualifications&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/component&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===cfg/citations/user/default.xml===&lt;br /&gt;
&lt;br /&gt;
Replace the default EPrints user citation with the MePrints citation (which includes a thumbnail of the user's profile picture) run:&lt;br /&gt;
&lt;br /&gt;
 cd /opt/eprints3/archives/ARCHIVEID&lt;br /&gt;
 cp cfg/citations/user/default_with_thumbnail.xml cfg/citations/user/default.xml&lt;br /&gt;
&lt;br /&gt;
'''Note: if you have already made changes to the default citation, you should examine both files and merge the MePrints changes into default.xml&lt;br /&gt;
&lt;br /&gt;
===Authorship in MePrints===&lt;br /&gt;
Meprints 1.1 and later change the definition of ownership in the respository. This means that users who have the same email address as that listed in an items creators field belong to that user once the item enters the archive. This allows users to see statistics about papers they have authored without have to upload their own copy of the paper. You can return this to the eprints default by removing the cfg/cfg.d/authorship_meprints.pl file &lt;br /&gt;
&lt;br /&gt;
===Confirm Permissions===&lt;br /&gt;
The last thing to do before using MePrints is to ensure that the permissions are correct on the ''meprints'' directory. To do this run the following commands, there probably will not be any output from running this command;&lt;br /&gt;
 cd archives/ARCHIVEID&lt;br /&gt;
 chmod g+wx meprints&lt;br /&gt;
&lt;br /&gt;
If the permissions are not correct then you may encounter errors when using MePrints.&lt;br /&gt;
&lt;br /&gt;
==Testing==&lt;br /&gt;
&lt;br /&gt;
After applying all the changes above, restart Apache to activate MePrints.&lt;br /&gt;
&lt;br /&gt;
===Homepage===&lt;br /&gt;
&lt;br /&gt;
Log into your repository and should see your MePrints Homepage with default widget layout and profile picture.&lt;br /&gt;
&lt;br /&gt;
====Update profile====&lt;br /&gt;
&lt;br /&gt;
Click the Modify Profile button and add some information to the new MePrints fields (Job Title, Expertise, Biography, Qualifications). Set your Profile Visibility to '''Public'''. Click the Save button to return to your Homepage where the information you entered should now be displayed.&lt;br /&gt;
&lt;br /&gt;
====Upload photo====&lt;br /&gt;
&lt;br /&gt;
Click the Profile Picture button, choose a file and click Upload. You will be returned to your Homepage where your picture will now be displayed.&lt;br /&gt;
&lt;br /&gt;
====MePrints Widgets====&lt;br /&gt;
&lt;br /&gt;
By default your homepage displays several widgets (see user_homepage_defaults setting in cfg/cfg.d/z_meprints.pl). Try adding and removing widgets using the widget controls at the bottom of the screen. You can also rearrange widgets by dragging them up/down or between columns. To reset to the default widget layout click the Reset button in the widget control bar.&lt;br /&gt;
&lt;br /&gt;
===Public Profile===&lt;br /&gt;
&lt;br /&gt;
Enter the following URL to view your public profile page:&lt;br /&gt;
&lt;br /&gt;
 http://myrepository.com/profile/USERNAME&lt;br /&gt;
&lt;br /&gt;
where USERNAME is your EPrints username. The layout of the MePrints widgets on your profile page is controlled by the user_profile_defaults setting in cfg/cfg.d/z_meprints.pl.&lt;br /&gt;
&lt;br /&gt;
Go back to your MePrints homepage and click Modify Profile. Change some of your profile information (eg. Job Title, Expertise, Biography, Qualifications) and click Save. Return to your public profile page and check that your profile information has been updated.&lt;br /&gt;
&lt;br /&gt;
===MePrints Views===&lt;br /&gt;
&lt;br /&gt;
Run:&lt;br /&gt;
&lt;br /&gt;
 bin/generate_views ARCHIVEID --generate menus&lt;br /&gt;
&lt;br /&gt;
Check http://myrepository.com/view/ - you should see 2 new views (you may want to link these into your site template).&lt;br /&gt;
&lt;br /&gt;
Explore the view pages and check that you are listed. Make sure that you can click through from the browse listing to your public profile page.&lt;br /&gt;
&lt;br /&gt;
===MePrints search===&lt;br /&gt;
&lt;br /&gt;
Go to: http://myrepository.com/cgi/meprints/search&lt;br /&gt;
&lt;br /&gt;
Check that you can find your profile using keywords from your user profile information (eg. expertise, qualifications).&lt;br /&gt;
&lt;br /&gt;
Make sure that you can click through from the search result list to your public profile page.&lt;br /&gt;
&lt;br /&gt;
===MePrints Embeddable===&lt;br /&gt;
&lt;br /&gt;
If you want to use the default minimal style supplied for MePrints Embeddable then add the following code to the ''&amp;lt;head&amp;gt;'' section of your page:&lt;br /&gt;
 &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text/css&amp;quot; href=&amp;quot;http://myrepository.com/style/meprints_embed.css&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====MePrints Embeddable Widgets====&lt;br /&gt;
It is possible to embed individual widgets that are viewable on your public profile on your own page. If you go to the public profile page you will see an embed links on the widgets that can be embedded. Click the link and instructions will appear telling you how to embed the widget on your page.&lt;br /&gt;
&lt;br /&gt;
====MePrints Embeddable Profile====&lt;br /&gt;
Edit an HTML page and add the following code to the ''&amp;lt;head&amp;gt;'' section of the page:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;http://myrepository.com/cgi/meprints/embed_js?username=USERNAME&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Where ''USERNAME'' is your username on the repository.&lt;br /&gt;
&lt;br /&gt;
Then inside the ''&amp;lt;body&amp;gt;'' section of the page you need to add the following code:&lt;br /&gt;
&lt;br /&gt;
 &amp;amp;lt;div id=&amp;quot;meprints_profile&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will be the location where your embeddable profile will go on your page.&lt;br /&gt;
&lt;br /&gt;
===MePrints for admins===&lt;br /&gt;
&lt;br /&gt;
Using an administrator account go to the Admin screen and choose '''Search users'''. Enter a username or other criteria to find at least one user account (not the account you are logged in with).&lt;br /&gt;
&lt;br /&gt;
Make sure that you can click through from the results list to the user's homepage.&lt;br /&gt;
&lt;br /&gt;
You should be able to modify the user's profile information by clicking Administer Account.&lt;br /&gt;
&lt;br /&gt;
The widget layout should reflect the user's own preference, and you should not be able to make changes to their widget layout.&lt;br /&gt;
&lt;br /&gt;
====Hide Profile====&lt;br /&gt;
&lt;br /&gt;
Change the user's profile visibility to '''private'''.&lt;br /&gt;
&lt;br /&gt;
Log out, and make sure that:&lt;br /&gt;
&lt;br /&gt;
# the profile is no longer visible at /profile/USERNAME&lt;br /&gt;
# the profile no longer appears in search results&lt;br /&gt;
# the profile no longer appears in view pages&lt;br /&gt;
# the embeddable widget no longer displays the profile&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You can also change the default visibility of MePrints profiles in cfg/cfg.d/z_meprints.pl&lt;br /&gt;
by default profiles are public unless a user specifically makes there profile private. change&lt;br /&gt;
 $c-&amp;gt;{default_profile_behavior} = 1;&lt;br /&gt;
to &lt;br /&gt;
 $c-&amp;gt;{default_profile_behavior} = 0;&lt;br /&gt;
to make the default private profiles&lt;br /&gt;
&lt;br /&gt;
==Troubleshooting==&lt;br /&gt;
&lt;br /&gt;
===Database errors===&lt;br /&gt;
&lt;br /&gt;
When dragging and dropping Widgets around, MePrints shows database errors in the error log:&lt;br /&gt;
&lt;br /&gt;
 DBD::mysql::st execute failed: Duplicate entry '1-0' for key 1 at /opt/eprints3/perl_lib/EPrints/Database.pm line 1192.&lt;br /&gt;
 at /opt/eprints3/perl_lib/EPrints/Database.pm line 1192&lt;br /&gt;
 EPrints::Database::insert('EPrints::Database::mysql=HASH(0x2b593e11ebd0)', 'user_items_fields', 'ARRAY(0x2b593bd00510)', ...&lt;br /&gt;
&lt;br /&gt;
This is a known problem which does not seem to affect widget layout.&lt;br /&gt;
&lt;br /&gt;
===generate_views errors===&lt;br /&gt;
&lt;br /&gt;
====Warnings====&lt;br /&gt;
&lt;br /&gt;
 Use of uninitialized value $id in hash element at /usr/share/eprints3/perl_lib/EPrints/Database.pm line 2979.&lt;br /&gt;
&lt;br /&gt;
See http://trac.eprints.org/trac/ticket/3537&lt;br /&gt;
&lt;br /&gt;
====EPrint citations====&lt;br /&gt;
&lt;br /&gt;
After hiding all previously public profiles, eprint citations were rendered in the view list instead of users'. (need to work out how to reproduce this)&lt;br /&gt;
&lt;br /&gt;
====Empty views====&lt;br /&gt;
&lt;br /&gt;
After hiding all previously public profiles and regenerating views, view pages still show expertise/department values.&lt;br /&gt;
&lt;br /&gt;
[http://creativecommons.org/licenses/by/3.0/ This work is licensed under a Creative Commons Attribution 3.0 Unported License].&lt;/div&gt;</summary>
		<author><name>Sf03r@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=MePrintsInstall&amp;diff=10902</id>
		<title>MePrintsInstall</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=MePrintsInstall&amp;diff=10902"/>
		<updated>2014-03-12T12:52:21Z</updated>

		<summary type="html">&lt;p&gt;Sf03r@ecs.soton.ac.uk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
'''WARNING: THIS PAGE IS OUT-OF-DATE. MePrints is available from the Bazaar as a one-click install'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&amp;lt;div&amp;gt;bla&amp;lt;/div&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:MePrints]]&lt;br /&gt;
This page provides technical instructions for installing the MePrints extension. To find out what MePrints is, and for an overview of MePrints features, see [[MePrintsOverview]].&lt;br /&gt;
&lt;br /&gt;
==Installation (EPrints 3.1.3+)==&lt;br /&gt;
&lt;br /&gt;
Download the latest release to your '''local repository directory''' (eg. /opt/eprints3/archives/ARCHIVEID/).&lt;br /&gt;
&lt;br /&gt;
Extract files:&lt;br /&gt;
&lt;br /&gt;
 tar xzvf meprints_xx.tgz&lt;br /&gt;
&lt;br /&gt;
===Install bin scripts===&lt;br /&gt;
&lt;br /&gt;
Edit the bin/generate_meprints file and check the include path on the first line. For example if you have installed EPrints in /var/lib/eprints3 change the line from:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/perl -w -I/opt/eprints3/perl_lib&lt;br /&gt;
&lt;br /&gt;
to:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/perl -w -I/var/lib/eprints3/perl_lib&lt;br /&gt;
&lt;br /&gt;
===Install cgi scripts===&lt;br /&gt;
&lt;br /&gt;
Link the MePrints cgi scripts into the EPrints cgi directory:&lt;br /&gt;
&lt;br /&gt;
 ln -s /opt/eprints3/archives/ARCHIVEID/cgi/meprints/ /opt/eprints3/cgi/&lt;br /&gt;
 ln -s /opt/eprints3/archives/ARCHIVEID/cgi/users/meprints/ /opt/eprints3/cgi/users/&lt;br /&gt;
&lt;br /&gt;
===Update database===&lt;br /&gt;
&lt;br /&gt;
Add the new MePrints user fields (defined in cfg/cfg.d/z_meprints.pl) to your repository database:&lt;br /&gt;
&lt;br /&gt;
 cd /opt/eprints3/&lt;br /&gt;
 bin/epadmin update_database_structure ARCHIVEID --verbose&lt;br /&gt;
&lt;br /&gt;
===Apply MePrints patches===&lt;br /&gt;
&lt;br /&gt;
Apply the MePrints patch files:&lt;br /&gt;
&lt;br /&gt;
 cd /opt/eprints3&lt;br /&gt;
 patch -R -p0 &amp;lt; archives/ARCHIVE_ID/meprints_1.0.patch&lt;br /&gt;
&lt;br /&gt;
DO NOT APPLY THIS FOLLOWING PATCH ON EPrints 3.2, it is not required;&lt;br /&gt;
&lt;br /&gt;
 patch -R -p0 &amp;lt; archives/ARCHIVE_ID/meprints_dataset.patch #YOU DONT NEED THIS ON 3.2 trying it might break your install&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
These patches change two core EPrints modules:&lt;br /&gt;
&lt;br /&gt;
# Update/Views.pm - allow view pages to be generated for any dataset (MePrints adds views over the public_profile_users dataset)&lt;br /&gt;
# DataSet.pm - add a new dataset called public_profile_users which is the set of all users who have opted to make their public profile page visible.&lt;br /&gt;
&lt;br /&gt;
==Getting Started==&lt;br /&gt;
&lt;br /&gt;
To activate MePrints, you will need to make some changes to your repository setup.&lt;br /&gt;
&lt;br /&gt;
===cfg/cfg.d/plugins.pl===&lt;br /&gt;
You can skip this step on MePrints 1.3 and later.&lt;br /&gt;
&lt;br /&gt;
Add the following lines to your cfg/cfg.d/plugins.pl configuration file: to use the MePrints homepage instead instead of the default EPrints &amp;quot;Profile&amp;quot; page:&lt;br /&gt;
&lt;br /&gt;
 $c-&amp;gt;{plugins}-&amp;gt;{&amp;quot;Screen::User::View&amp;quot;}-&amp;gt;{appears}-&amp;gt;{key_tools} = undef;&lt;br /&gt;
 $c-&amp;gt;{plugin_alias_map}-&amp;gt;{&amp;quot;Screen::User::View&amp;quot;} = &amp;quot;Screen::User::Homepage&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
===cfg/cfg.d/user_fields_automatic.pl===&lt;br /&gt;
&lt;br /&gt;
Add the following lines to your cfg/cfg.d/user_fields_automatic.pl configuration file to update the MePrints public profile page automatically when a user changes his or her profile information, &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$c-&amp;gt;{user_fields_automatic} = sub {&lt;br /&gt;
        &lt;br /&gt;
&lt;br /&gt;
        my $user = @_;&lt;br /&gt;
&lt;br /&gt;
        ...&lt;br /&gt;
&lt;br /&gt;
        if( defined $user-&amp;gt;{changed} )&lt;br /&gt;
        {&lt;br /&gt;
                $user-&amp;gt;remove_static();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===cfg/cfg.d/eprint_fields_automatic.pl===&lt;br /&gt;
&lt;br /&gt;
Add the following line to your cfg/cfg.d/eprint_fields_automatic.pl configuration file so that the MePrints public profile page automatically changes when an EPrint they have deposited is updated.&lt;br /&gt;
&lt;br /&gt;
 $eprint-&amp;gt;get_user-&amp;gt;remove_static;&lt;br /&gt;
&lt;br /&gt;
===cfg/cfg.d/urls.pl===&lt;br /&gt;
&lt;br /&gt;
To activate the canonical profile URLs, add &amp;quot;/profile/&amp;quot; to the rewrite_exceptions list in your cfg/cfg.d/urls.pl configuration file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$c-&amp;gt;{rewrite_exceptions} = [ '/cgi/', '/archive/', '/profile/' ];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===cfg/apachevhost.conf===&lt;br /&gt;
&lt;br /&gt;
Add the following directives to your cfg/apachevhost.conf configuration file to enable canonical profile URLs (for example http://myrepository.com/profile/jsmith):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;Location &amp;quot;/profile&amp;quot;&amp;gt;&lt;br /&gt;
  DefaultType 'text/html; charset=UTF-8'&lt;br /&gt;
  SetHandler perl-script&lt;br /&gt;
  PerlResponseHandler EPrints::Plugin::MePrints::MePrintsHandler&lt;br /&gt;
&amp;lt;/Location&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On eprints 3.2 and later you will now need to regenerated your apache conf:&lt;br /&gt;
 &amp;lt;eprints_root&amp;gt;/bin/generate_apacheconf --replace &amp;lt;archiveid&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===cfg/workflows/user/default.xml===&lt;br /&gt;
&lt;br /&gt;
Add the following lines to your cfg/workflows/user/default.xml configuration file:&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;stage name=&amp;quot;default&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;component type=&amp;quot;Field::Multi&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;title&amp;gt;&amp;lt;epc:phrase ref=&amp;quot;user_section_personal&amp;quot; /&amp;gt;&amp;lt;/title&amp;gt;&lt;br /&gt;
      ...&lt;br /&gt;
    &amp;lt;/component&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;component type=&amp;quot;Field::Multi&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;title&amp;gt;&amp;lt;epc:phrase ref=&amp;quot;user_section_meprints&amp;quot; /&amp;gt;&amp;lt;/title&amp;gt;&lt;br /&gt;
      &amp;lt;field ref=&amp;quot;profile_visibility&amp;quot; required=&amp;quot;yes&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;field ref=&amp;quot;jobtitle&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;field ref=&amp;quot;expertise&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;field ref=&amp;quot;biography&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;field ref=&amp;quot;qualifications&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/component&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===cfg/citations/user/default.xml===&lt;br /&gt;
&lt;br /&gt;
Replace the default EPrints user citation with the MePrints citation (which includes a thumbnail of the user's profile picture) run:&lt;br /&gt;
&lt;br /&gt;
 cd /opt/eprints3/archives/ARCHIVEID&lt;br /&gt;
 cp cfg/citations/user/default_with_thumbnail.xml cfg/citations/user/default.xml&lt;br /&gt;
&lt;br /&gt;
'''Note: if you have already made changes to the default citation, you should examine both files and merge the MePrints changes into default.xml&lt;br /&gt;
&lt;br /&gt;
===Authorship in MePrints===&lt;br /&gt;
Meprints 1.1 and later change the definition of ownership in the respository. This means that users who have the same email address as that listed in an items creators field belong to that user once the item enters the archive. This allows users to see statistics about papers they have authored without have to upload their own copy of the paper. You can return this to the eprints default by removing the cfg/cfg.d/authorship_meprints.pl file &lt;br /&gt;
&lt;br /&gt;
===Confirm Permissions===&lt;br /&gt;
The last thing to do before using MePrints is to ensure that the permissions are correct on the ''meprints'' directory. To do this run the following commands, there probably will not be any output from running this command;&lt;br /&gt;
 cd archives/ARCHIVEID&lt;br /&gt;
 chmod g+wx meprints&lt;br /&gt;
&lt;br /&gt;
If the permissions are not correct then you may encounter errors when using MePrints.&lt;br /&gt;
&lt;br /&gt;
==Testing==&lt;br /&gt;
&lt;br /&gt;
After applying all the changes above, restart Apache to activate MePrints.&lt;br /&gt;
&lt;br /&gt;
===Homepage===&lt;br /&gt;
&lt;br /&gt;
Log into your repository and should see your MePrints Homepage with default widget layout and profile picture.&lt;br /&gt;
&lt;br /&gt;
====Update profile====&lt;br /&gt;
&lt;br /&gt;
Click the Modify Profile button and add some information to the new MePrints fields (Job Title, Expertise, Biography, Qualifications). Set your Profile Visibility to '''Public'''. Click the Save button to return to your Homepage where the information you entered should now be displayed.&lt;br /&gt;
&lt;br /&gt;
====Upload photo====&lt;br /&gt;
&lt;br /&gt;
Click the Profile Picture button, choose a file and click Upload. You will be returned to your Homepage where your picture will now be displayed.&lt;br /&gt;
&lt;br /&gt;
====MePrints Widgets====&lt;br /&gt;
&lt;br /&gt;
By default your homepage displays several widgets (see user_homepage_defaults setting in cfg/cfg.d/z_meprints.pl). Try adding and removing widgets using the widget controls at the bottom of the screen. You can also rearrange widgets by dragging them up/down or between columns. To reset to the default widget layout click the Reset button in the widget control bar.&lt;br /&gt;
&lt;br /&gt;
===Public Profile===&lt;br /&gt;
&lt;br /&gt;
Enter the following URL to view your public profile page:&lt;br /&gt;
&lt;br /&gt;
 http://myrepository.com/profile/USERNAME&lt;br /&gt;
&lt;br /&gt;
where USERNAME is your EPrints username. The layout of the MePrints widgets on your profile page is controlled by the user_profile_defaults setting in cfg/cfg.d/z_meprints.pl.&lt;br /&gt;
&lt;br /&gt;
Go back to your MePrints homepage and click Modify Profile. Change some of your profile information (eg. Job Title, Expertise, Biography, Qualifications) and click Save. Return to your public profile page and check that your profile information has been updated.&lt;br /&gt;
&lt;br /&gt;
===MePrints Views===&lt;br /&gt;
&lt;br /&gt;
Run:&lt;br /&gt;
&lt;br /&gt;
 bin/generate_views ARCHIVEID --generate menus&lt;br /&gt;
&lt;br /&gt;
Check http://myrepository.com/view/ - you should see 2 new views (you may want to link these into your site template).&lt;br /&gt;
&lt;br /&gt;
Explore the view pages and check that you are listed. Make sure that you can click through from the browse listing to your public profile page.&lt;br /&gt;
&lt;br /&gt;
===MePrints search===&lt;br /&gt;
&lt;br /&gt;
Go to: http://myrepository.com/cgi/meprints/search&lt;br /&gt;
&lt;br /&gt;
Check that you can find your profile using keywords from your user profile information (eg. expertise, qualifications).&lt;br /&gt;
&lt;br /&gt;
Make sure that you can click through from the search result list to your public profile page.&lt;br /&gt;
&lt;br /&gt;
===MePrints Embeddable===&lt;br /&gt;
&lt;br /&gt;
If you want to use the default minimal style supplied for MePrints Embeddable then add the following code to the ''&amp;lt;head&amp;gt;'' section of your page:&lt;br /&gt;
 &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text/css&amp;quot; href=&amp;quot;http://myrepository.com/style/meprints_embed.css&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====MePrints Embeddable Widgets====&lt;br /&gt;
It is possible to embed individual widgets that are viewable on your public profile on your own page. If you go to the public profile page you will see an embed links on the widgets that can be embedded. Click the link and instructions will appear telling you how to embed the widget on your page.&lt;br /&gt;
&lt;br /&gt;
====MePrints Embeddable Profile====&lt;br /&gt;
Edit an HTML page and add the following code to the ''&amp;lt;head&amp;gt;'' section of the page:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;http://myrepository.com/cgi/meprints/embed_js?username=USERNAME&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Where ''USERNAME'' is your username on the repository.&lt;br /&gt;
&lt;br /&gt;
Then inside the ''&amp;lt;body&amp;gt;'' section of the page you need to add the following code:&lt;br /&gt;
&lt;br /&gt;
 &amp;amp;lt;div id=&amp;quot;meprints_profile&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will be the location where your embeddable profile will go on your page.&lt;br /&gt;
&lt;br /&gt;
===MePrints for admins===&lt;br /&gt;
&lt;br /&gt;
Using an administrator account go to the Admin screen and choose '''Search users'''. Enter a username or other criteria to find at least one user account (not the account you are logged in with).&lt;br /&gt;
&lt;br /&gt;
Make sure that you can click through from the results list to the user's homepage.&lt;br /&gt;
&lt;br /&gt;
You should be able to modify the user's profile information by clicking Administer Account.&lt;br /&gt;
&lt;br /&gt;
The widget layout should reflect the user's own preference, and you should not be able to make changes to their widget layout.&lt;br /&gt;
&lt;br /&gt;
====Hide Profile====&lt;br /&gt;
&lt;br /&gt;
Change the user's profile visibility to '''private'''.&lt;br /&gt;
&lt;br /&gt;
Log out, and make sure that:&lt;br /&gt;
&lt;br /&gt;
# the profile is no longer visible at /profile/USERNAME&lt;br /&gt;
# the profile no longer appears in search results&lt;br /&gt;
# the profile no longer appears in view pages&lt;br /&gt;
# the embeddable widget no longer displays the profile&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You can also change the default visibility of MePrints profiles in cfg/cfg.d/z_meprints.pl&lt;br /&gt;
by default profiles are public unless a user specifically makes there profile private. change&lt;br /&gt;
 $c-&amp;gt;{default_profile_behavior} = 1;&lt;br /&gt;
to &lt;br /&gt;
 $c-&amp;gt;{default_profile_behavior} = 0;&lt;br /&gt;
to make the default private profiles&lt;br /&gt;
&lt;br /&gt;
==Troubleshooting==&lt;br /&gt;
&lt;br /&gt;
===Database errors===&lt;br /&gt;
&lt;br /&gt;
When dragging and dropping Widgets around, MePrints shows database errors in the error log:&lt;br /&gt;
&lt;br /&gt;
 DBD::mysql::st execute failed: Duplicate entry '1-0' for key 1 at /opt/eprints3/perl_lib/EPrints/Database.pm line 1192.&lt;br /&gt;
 at /opt/eprints3/perl_lib/EPrints/Database.pm line 1192&lt;br /&gt;
 EPrints::Database::insert('EPrints::Database::mysql=HASH(0x2b593e11ebd0)', 'user_items_fields', 'ARRAY(0x2b593bd00510)', ...&lt;br /&gt;
&lt;br /&gt;
This is a known problem which does not seem to affect widget layout.&lt;br /&gt;
&lt;br /&gt;
===generate_views errors===&lt;br /&gt;
&lt;br /&gt;
====Warnings====&lt;br /&gt;
&lt;br /&gt;
 Use of uninitialized value $id in hash element at /usr/share/eprints3/perl_lib/EPrints/Database.pm line 2979.&lt;br /&gt;
&lt;br /&gt;
See http://trac.eprints.org/trac/ticket/3537&lt;br /&gt;
&lt;br /&gt;
====EPrint citations====&lt;br /&gt;
&lt;br /&gt;
After hiding all previously public profiles, eprint citations were rendered in the view list instead of users'. (need to work out how to reproduce this)&lt;br /&gt;
&lt;br /&gt;
====Empty views====&lt;br /&gt;
&lt;br /&gt;
After hiding all previously public profiles and regenerating views, view pages still show expertise/department values.&lt;br /&gt;
&lt;br /&gt;
[http://creativecommons.org/licenses/by/3.0/ This work is licensed under a Creative Commons Attribution 3.0 Unported License].&lt;/div&gt;</summary>
		<author><name>Sf03r@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=MePrintsInstall&amp;diff=10901</id>
		<title>MePrintsInstall</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=MePrintsInstall&amp;diff=10901"/>
		<updated>2014-03-12T12:51:23Z</updated>

		<summary type="html">&lt;p&gt;Sf03r@ecs.soton.ac.uk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''WARNING: THIS PAGE IS OUT-OF-DATE. MePrints is available from the Bazaar as a one-click install'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:MePrints]]&lt;br /&gt;
This page provides technical instructions for installing the MePrints extension. To find out what MePrints is, and for an overview of MePrints features, see [[MePrintsOverview]].&lt;br /&gt;
&lt;br /&gt;
==Installation (EPrints 3.1.3+)==&lt;br /&gt;
&lt;br /&gt;
Download the latest release to your '''local repository directory''' (eg. /opt/eprints3/archives/ARCHIVEID/).&lt;br /&gt;
&lt;br /&gt;
Extract files:&lt;br /&gt;
&lt;br /&gt;
 tar xzvf meprints_xx.tgz&lt;br /&gt;
&lt;br /&gt;
===Install bin scripts===&lt;br /&gt;
&lt;br /&gt;
Edit the bin/generate_meprints file and check the include path on the first line. For example if you have installed EPrints in /var/lib/eprints3 change the line from:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/perl -w -I/opt/eprints3/perl_lib&lt;br /&gt;
&lt;br /&gt;
to:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/perl -w -I/var/lib/eprints3/perl_lib&lt;br /&gt;
&lt;br /&gt;
===Install cgi scripts===&lt;br /&gt;
&lt;br /&gt;
Link the MePrints cgi scripts into the EPrints cgi directory:&lt;br /&gt;
&lt;br /&gt;
 ln -s /opt/eprints3/archives/ARCHIVEID/cgi/meprints/ /opt/eprints3/cgi/&lt;br /&gt;
 ln -s /opt/eprints3/archives/ARCHIVEID/cgi/users/meprints/ /opt/eprints3/cgi/users/&lt;br /&gt;
&lt;br /&gt;
===Update database===&lt;br /&gt;
&lt;br /&gt;
Add the new MePrints user fields (defined in cfg/cfg.d/z_meprints.pl) to your repository database:&lt;br /&gt;
&lt;br /&gt;
 cd /opt/eprints3/&lt;br /&gt;
 bin/epadmin update_database_structure ARCHIVEID --verbose&lt;br /&gt;
&lt;br /&gt;
===Apply MePrints patches===&lt;br /&gt;
&lt;br /&gt;
Apply the MePrints patch files:&lt;br /&gt;
&lt;br /&gt;
 cd /opt/eprints3&lt;br /&gt;
 patch -R -p0 &amp;lt; archives/ARCHIVE_ID/meprints_1.0.patch&lt;br /&gt;
&lt;br /&gt;
DO NOT APPLY THIS FOLLOWING PATCH ON EPrints 3.2, it is not required;&lt;br /&gt;
&lt;br /&gt;
 patch -R -p0 &amp;lt; archives/ARCHIVE_ID/meprints_dataset.patch #YOU DONT NEED THIS ON 3.2 trying it might break your install&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
These patches change two core EPrints modules:&lt;br /&gt;
&lt;br /&gt;
# Update/Views.pm - allow view pages to be generated for any dataset (MePrints adds views over the public_profile_users dataset)&lt;br /&gt;
# DataSet.pm - add a new dataset called public_profile_users which is the set of all users who have opted to make their public profile page visible.&lt;br /&gt;
&lt;br /&gt;
==Getting Started==&lt;br /&gt;
&lt;br /&gt;
To activate MePrints, you will need to make some changes to your repository setup.&lt;br /&gt;
&lt;br /&gt;
===cfg/cfg.d/plugins.pl===&lt;br /&gt;
You can skip this step on MePrints 1.3 and later.&lt;br /&gt;
&lt;br /&gt;
Add the following lines to your cfg/cfg.d/plugins.pl configuration file: to use the MePrints homepage instead instead of the default EPrints &amp;quot;Profile&amp;quot; page:&lt;br /&gt;
&lt;br /&gt;
 $c-&amp;gt;{plugins}-&amp;gt;{&amp;quot;Screen::User::View&amp;quot;}-&amp;gt;{appears}-&amp;gt;{key_tools} = undef;&lt;br /&gt;
 $c-&amp;gt;{plugin_alias_map}-&amp;gt;{&amp;quot;Screen::User::View&amp;quot;} = &amp;quot;Screen::User::Homepage&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
===cfg/cfg.d/user_fields_automatic.pl===&lt;br /&gt;
&lt;br /&gt;
Add the following lines to your cfg/cfg.d/user_fields_automatic.pl configuration file to update the MePrints public profile page automatically when a user changes his or her profile information, &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$c-&amp;gt;{user_fields_automatic} = sub {&lt;br /&gt;
        &lt;br /&gt;
&lt;br /&gt;
        my $user = @_;&lt;br /&gt;
&lt;br /&gt;
        ...&lt;br /&gt;
&lt;br /&gt;
        if( defined $user-&amp;gt;{changed} )&lt;br /&gt;
        {&lt;br /&gt;
                $user-&amp;gt;remove_static();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===cfg/cfg.d/eprint_fields_automatic.pl===&lt;br /&gt;
&lt;br /&gt;
Add the following line to your cfg/cfg.d/eprint_fields_automatic.pl configuration file so that the MePrints public profile page automatically changes when an EPrint they have deposited is updated.&lt;br /&gt;
&lt;br /&gt;
 $eprint-&amp;gt;get_user-&amp;gt;remove_static;&lt;br /&gt;
&lt;br /&gt;
===cfg/cfg.d/urls.pl===&lt;br /&gt;
&lt;br /&gt;
To activate the canonical profile URLs, add &amp;quot;/profile/&amp;quot; to the rewrite_exceptions list in your cfg/cfg.d/urls.pl configuration file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$c-&amp;gt;{rewrite_exceptions} = [ '/cgi/', '/archive/', '/profile/' ];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===cfg/apachevhost.conf===&lt;br /&gt;
&lt;br /&gt;
Add the following directives to your cfg/apachevhost.conf configuration file to enable canonical profile URLs (for example http://myrepository.com/profile/jsmith):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;Location &amp;quot;/profile&amp;quot;&amp;gt;&lt;br /&gt;
  DefaultType 'text/html; charset=UTF-8'&lt;br /&gt;
  SetHandler perl-script&lt;br /&gt;
  PerlResponseHandler EPrints::Plugin::MePrints::MePrintsHandler&lt;br /&gt;
&amp;lt;/Location&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On eprints 3.2 and later you will now need to regenerated your apache conf:&lt;br /&gt;
 &amp;lt;eprints_root&amp;gt;/bin/generate_apacheconf --replace &amp;lt;archiveid&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===cfg/workflows/user/default.xml===&lt;br /&gt;
&lt;br /&gt;
Add the following lines to your cfg/workflows/user/default.xml configuration file:&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;stage name=&amp;quot;default&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;component type=&amp;quot;Field::Multi&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;title&amp;gt;&amp;lt;epc:phrase ref=&amp;quot;user_section_personal&amp;quot; /&amp;gt;&amp;lt;/title&amp;gt;&lt;br /&gt;
      ...&lt;br /&gt;
    &amp;lt;/component&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;component type=&amp;quot;Field::Multi&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;title&amp;gt;&amp;lt;epc:phrase ref=&amp;quot;user_section_meprints&amp;quot; /&amp;gt;&amp;lt;/title&amp;gt;&lt;br /&gt;
      &amp;lt;field ref=&amp;quot;profile_visibility&amp;quot; required=&amp;quot;yes&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;field ref=&amp;quot;jobtitle&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;field ref=&amp;quot;expertise&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;field ref=&amp;quot;biography&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;field ref=&amp;quot;qualifications&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/component&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===cfg/citations/user/default.xml===&lt;br /&gt;
&lt;br /&gt;
Replace the default EPrints user citation with the MePrints citation (which includes a thumbnail of the user's profile picture) run:&lt;br /&gt;
&lt;br /&gt;
 cd /opt/eprints3/archives/ARCHIVEID&lt;br /&gt;
 cp cfg/citations/user/default_with_thumbnail.xml cfg/citations/user/default.xml&lt;br /&gt;
&lt;br /&gt;
'''Note: if you have already made changes to the default citation, you should examine both files and merge the MePrints changes into default.xml&lt;br /&gt;
&lt;br /&gt;
===Authorship in MePrints===&lt;br /&gt;
Meprints 1.1 and later change the definition of ownership in the respository. This means that users who have the same email address as that listed in an items creators field belong to that user once the item enters the archive. This allows users to see statistics about papers they have authored without have to upload their own copy of the paper. You can return this to the eprints default by removing the cfg/cfg.d/authorship_meprints.pl file &lt;br /&gt;
&lt;br /&gt;
===Confirm Permissions===&lt;br /&gt;
The last thing to do before using MePrints is to ensure that the permissions are correct on the ''meprints'' directory. To do this run the following commands, there probably will not be any output from running this command;&lt;br /&gt;
 cd archives/ARCHIVEID&lt;br /&gt;
 chmod g+wx meprints&lt;br /&gt;
&lt;br /&gt;
If the permissions are not correct then you may encounter errors when using MePrints.&lt;br /&gt;
&lt;br /&gt;
==Testing==&lt;br /&gt;
&lt;br /&gt;
After applying all the changes above, restart Apache to activate MePrints.&lt;br /&gt;
&lt;br /&gt;
===Homepage===&lt;br /&gt;
&lt;br /&gt;
Log into your repository and should see your MePrints Homepage with default widget layout and profile picture.&lt;br /&gt;
&lt;br /&gt;
====Update profile====&lt;br /&gt;
&lt;br /&gt;
Click the Modify Profile button and add some information to the new MePrints fields (Job Title, Expertise, Biography, Qualifications). Set your Profile Visibility to '''Public'''. Click the Save button to return to your Homepage where the information you entered should now be displayed.&lt;br /&gt;
&lt;br /&gt;
====Upload photo====&lt;br /&gt;
&lt;br /&gt;
Click the Profile Picture button, choose a file and click Upload. You will be returned to your Homepage where your picture will now be displayed.&lt;br /&gt;
&lt;br /&gt;
====MePrints Widgets====&lt;br /&gt;
&lt;br /&gt;
By default your homepage displays several widgets (see user_homepage_defaults setting in cfg/cfg.d/z_meprints.pl). Try adding and removing widgets using the widget controls at the bottom of the screen. You can also rearrange widgets by dragging them up/down or between columns. To reset to the default widget layout click the Reset button in the widget control bar.&lt;br /&gt;
&lt;br /&gt;
===Public Profile===&lt;br /&gt;
&lt;br /&gt;
Enter the following URL to view your public profile page:&lt;br /&gt;
&lt;br /&gt;
 http://myrepository.com/profile/USERNAME&lt;br /&gt;
&lt;br /&gt;
where USERNAME is your EPrints username. The layout of the MePrints widgets on your profile page is controlled by the user_profile_defaults setting in cfg/cfg.d/z_meprints.pl.&lt;br /&gt;
&lt;br /&gt;
Go back to your MePrints homepage and click Modify Profile. Change some of your profile information (eg. Job Title, Expertise, Biography, Qualifications) and click Save. Return to your public profile page and check that your profile information has been updated.&lt;br /&gt;
&lt;br /&gt;
===MePrints Views===&lt;br /&gt;
&lt;br /&gt;
Run:&lt;br /&gt;
&lt;br /&gt;
 bin/generate_views ARCHIVEID --generate menus&lt;br /&gt;
&lt;br /&gt;
Check http://myrepository.com/view/ - you should see 2 new views (you may want to link these into your site template).&lt;br /&gt;
&lt;br /&gt;
Explore the view pages and check that you are listed. Make sure that you can click through from the browse listing to your public profile page.&lt;br /&gt;
&lt;br /&gt;
===MePrints search===&lt;br /&gt;
&lt;br /&gt;
Go to: http://myrepository.com/cgi/meprints/search&lt;br /&gt;
&lt;br /&gt;
Check that you can find your profile using keywords from your user profile information (eg. expertise, qualifications).&lt;br /&gt;
&lt;br /&gt;
Make sure that you can click through from the search result list to your public profile page.&lt;br /&gt;
&lt;br /&gt;
===MePrints Embeddable===&lt;br /&gt;
&lt;br /&gt;
If you want to use the default minimal style supplied for MePrints Embeddable then add the following code to the ''&amp;lt;head&amp;gt;'' section of your page:&lt;br /&gt;
 &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text/css&amp;quot; href=&amp;quot;http://myrepository.com/style/meprints_embed.css&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====MePrints Embeddable Widgets====&lt;br /&gt;
It is possible to embed individual widgets that are viewable on your public profile on your own page. If you go to the public profile page you will see an embed links on the widgets that can be embedded. Click the link and instructions will appear telling you how to embed the widget on your page.&lt;br /&gt;
&lt;br /&gt;
====MePrints Embeddable Profile====&lt;br /&gt;
Edit an HTML page and add the following code to the ''&amp;lt;head&amp;gt;'' section of the page:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;http://myrepository.com/cgi/meprints/embed_js?username=USERNAME&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Where ''USERNAME'' is your username on the repository.&lt;br /&gt;
&lt;br /&gt;
Then inside the ''&amp;lt;body&amp;gt;'' section of the page you need to add the following code:&lt;br /&gt;
&lt;br /&gt;
 &amp;amp;lt;div id=&amp;quot;meprints_profile&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will be the location where your embeddable profile will go on your page.&lt;br /&gt;
&lt;br /&gt;
===MePrints for admins===&lt;br /&gt;
&lt;br /&gt;
Using an administrator account go to the Admin screen and choose '''Search users'''. Enter a username or other criteria to find at least one user account (not the account you are logged in with).&lt;br /&gt;
&lt;br /&gt;
Make sure that you can click through from the results list to the user's homepage.&lt;br /&gt;
&lt;br /&gt;
You should be able to modify the user's profile information by clicking Administer Account.&lt;br /&gt;
&lt;br /&gt;
The widget layout should reflect the user's own preference, and you should not be able to make changes to their widget layout.&lt;br /&gt;
&lt;br /&gt;
====Hide Profile====&lt;br /&gt;
&lt;br /&gt;
Change the user's profile visibility to '''private'''.&lt;br /&gt;
&lt;br /&gt;
Log out, and make sure that:&lt;br /&gt;
&lt;br /&gt;
# the profile is no longer visible at /profile/USERNAME&lt;br /&gt;
# the profile no longer appears in search results&lt;br /&gt;
# the profile no longer appears in view pages&lt;br /&gt;
# the embeddable widget no longer displays the profile&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You can also change the default visibility of MePrints profiles in cfg/cfg.d/z_meprints.pl&lt;br /&gt;
by default profiles are public unless a user specifically makes there profile private. change&lt;br /&gt;
 $c-&amp;gt;{default_profile_behavior} = 1;&lt;br /&gt;
to &lt;br /&gt;
 $c-&amp;gt;{default_profile_behavior} = 0;&lt;br /&gt;
to make the default private profiles&lt;br /&gt;
&lt;br /&gt;
==Troubleshooting==&lt;br /&gt;
&lt;br /&gt;
===Database errors===&lt;br /&gt;
&lt;br /&gt;
When dragging and dropping Widgets around, MePrints shows database errors in the error log:&lt;br /&gt;
&lt;br /&gt;
 DBD::mysql::st execute failed: Duplicate entry '1-0' for key 1 at /opt/eprints3/perl_lib/EPrints/Database.pm line 1192.&lt;br /&gt;
 at /opt/eprints3/perl_lib/EPrints/Database.pm line 1192&lt;br /&gt;
 EPrints::Database::insert('EPrints::Database::mysql=HASH(0x2b593e11ebd0)', 'user_items_fields', 'ARRAY(0x2b593bd00510)', ...&lt;br /&gt;
&lt;br /&gt;
This is a known problem which does not seem to affect widget layout.&lt;br /&gt;
&lt;br /&gt;
===generate_views errors===&lt;br /&gt;
&lt;br /&gt;
====Warnings====&lt;br /&gt;
&lt;br /&gt;
 Use of uninitialized value $id in hash element at /usr/share/eprints3/perl_lib/EPrints/Database.pm line 2979.&lt;br /&gt;
&lt;br /&gt;
See http://trac.eprints.org/trac/ticket/3537&lt;br /&gt;
&lt;br /&gt;
====EPrint citations====&lt;br /&gt;
&lt;br /&gt;
After hiding all previously public profiles, eprint citations were rendered in the view list instead of users'. (need to work out how to reproduce this)&lt;br /&gt;
&lt;br /&gt;
====Empty views====&lt;br /&gt;
&lt;br /&gt;
After hiding all previously public profiles and regenerating views, view pages still show expertise/department values.&lt;br /&gt;
&lt;br /&gt;
[http://creativecommons.org/licenses/by/3.0/ This work is licensed under a Creative Commons Attribution 3.0 Unported License].&lt;/div&gt;</summary>
		<author><name>Sf03r@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=MePrintsInstall&amp;diff=10900</id>
		<title>MePrintsInstall</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=MePrintsInstall&amp;diff=10900"/>
		<updated>2014-03-12T12:51:12Z</updated>

		<summary type="html">&lt;p&gt;Sf03r@ecs.soton.ac.uk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
'''WARNING: THIS PAGE IS OUT-OF-DATE. MePrints is available from the Bazaar as a one-click install'''&lt;br /&gt;
&lt;br /&gt;
[[Category:MePrints]]&lt;br /&gt;
This page provides technical instructions for installing the MePrints extension. To find out what MePrints is, and for an overview of MePrints features, see [[MePrintsOverview]].&lt;br /&gt;
&lt;br /&gt;
==Installation (EPrints 3.1.3+)==&lt;br /&gt;
&lt;br /&gt;
Download the latest release to your '''local repository directory''' (eg. /opt/eprints3/archives/ARCHIVEID/).&lt;br /&gt;
&lt;br /&gt;
Extract files:&lt;br /&gt;
&lt;br /&gt;
 tar xzvf meprints_xx.tgz&lt;br /&gt;
&lt;br /&gt;
===Install bin scripts===&lt;br /&gt;
&lt;br /&gt;
Edit the bin/generate_meprints file and check the include path on the first line. For example if you have installed EPrints in /var/lib/eprints3 change the line from:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/perl -w -I/opt/eprints3/perl_lib&lt;br /&gt;
&lt;br /&gt;
to:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/perl -w -I/var/lib/eprints3/perl_lib&lt;br /&gt;
&lt;br /&gt;
===Install cgi scripts===&lt;br /&gt;
&lt;br /&gt;
Link the MePrints cgi scripts into the EPrints cgi directory:&lt;br /&gt;
&lt;br /&gt;
 ln -s /opt/eprints3/archives/ARCHIVEID/cgi/meprints/ /opt/eprints3/cgi/&lt;br /&gt;
 ln -s /opt/eprints3/archives/ARCHIVEID/cgi/users/meprints/ /opt/eprints3/cgi/users/&lt;br /&gt;
&lt;br /&gt;
===Update database===&lt;br /&gt;
&lt;br /&gt;
Add the new MePrints user fields (defined in cfg/cfg.d/z_meprints.pl) to your repository database:&lt;br /&gt;
&lt;br /&gt;
 cd /opt/eprints3/&lt;br /&gt;
 bin/epadmin update_database_structure ARCHIVEID --verbose&lt;br /&gt;
&lt;br /&gt;
===Apply MePrints patches===&lt;br /&gt;
&lt;br /&gt;
Apply the MePrints patch files:&lt;br /&gt;
&lt;br /&gt;
 cd /opt/eprints3&lt;br /&gt;
 patch -R -p0 &amp;lt; archives/ARCHIVE_ID/meprints_1.0.patch&lt;br /&gt;
&lt;br /&gt;
DO NOT APPLY THIS FOLLOWING PATCH ON EPrints 3.2, it is not required;&lt;br /&gt;
&lt;br /&gt;
 patch -R -p0 &amp;lt; archives/ARCHIVE_ID/meprints_dataset.patch #YOU DONT NEED THIS ON 3.2 trying it might break your install&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
These patches change two core EPrints modules:&lt;br /&gt;
&lt;br /&gt;
# Update/Views.pm - allow view pages to be generated for any dataset (MePrints adds views over the public_profile_users dataset)&lt;br /&gt;
# DataSet.pm - add a new dataset called public_profile_users which is the set of all users who have opted to make their public profile page visible.&lt;br /&gt;
&lt;br /&gt;
==Getting Started==&lt;br /&gt;
&lt;br /&gt;
To activate MePrints, you will need to make some changes to your repository setup.&lt;br /&gt;
&lt;br /&gt;
===cfg/cfg.d/plugins.pl===&lt;br /&gt;
You can skip this step on MePrints 1.3 and later.&lt;br /&gt;
&lt;br /&gt;
Add the following lines to your cfg/cfg.d/plugins.pl configuration file: to use the MePrints homepage instead instead of the default EPrints &amp;quot;Profile&amp;quot; page:&lt;br /&gt;
&lt;br /&gt;
 $c-&amp;gt;{plugins}-&amp;gt;{&amp;quot;Screen::User::View&amp;quot;}-&amp;gt;{appears}-&amp;gt;{key_tools} = undef;&lt;br /&gt;
 $c-&amp;gt;{plugin_alias_map}-&amp;gt;{&amp;quot;Screen::User::View&amp;quot;} = &amp;quot;Screen::User::Homepage&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
===cfg/cfg.d/user_fields_automatic.pl===&lt;br /&gt;
&lt;br /&gt;
Add the following lines to your cfg/cfg.d/user_fields_automatic.pl configuration file to update the MePrints public profile page automatically when a user changes his or her profile information, &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$c-&amp;gt;{user_fields_automatic} = sub {&lt;br /&gt;
        &lt;br /&gt;
&lt;br /&gt;
        my $user = @_;&lt;br /&gt;
&lt;br /&gt;
        ...&lt;br /&gt;
&lt;br /&gt;
        if( defined $user-&amp;gt;{changed} )&lt;br /&gt;
        {&lt;br /&gt;
                $user-&amp;gt;remove_static();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===cfg/cfg.d/eprint_fields_automatic.pl===&lt;br /&gt;
&lt;br /&gt;
Add the following line to your cfg/cfg.d/eprint_fields_automatic.pl configuration file so that the MePrints public profile page automatically changes when an EPrint they have deposited is updated.&lt;br /&gt;
&lt;br /&gt;
 $eprint-&amp;gt;get_user-&amp;gt;remove_static;&lt;br /&gt;
&lt;br /&gt;
===cfg/cfg.d/urls.pl===&lt;br /&gt;
&lt;br /&gt;
To activate the canonical profile URLs, add &amp;quot;/profile/&amp;quot; to the rewrite_exceptions list in your cfg/cfg.d/urls.pl configuration file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$c-&amp;gt;{rewrite_exceptions} = [ '/cgi/', '/archive/', '/profile/' ];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===cfg/apachevhost.conf===&lt;br /&gt;
&lt;br /&gt;
Add the following directives to your cfg/apachevhost.conf configuration file to enable canonical profile URLs (for example http://myrepository.com/profile/jsmith):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;Location &amp;quot;/profile&amp;quot;&amp;gt;&lt;br /&gt;
  DefaultType 'text/html; charset=UTF-8'&lt;br /&gt;
  SetHandler perl-script&lt;br /&gt;
  PerlResponseHandler EPrints::Plugin::MePrints::MePrintsHandler&lt;br /&gt;
&amp;lt;/Location&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On eprints 3.2 and later you will now need to regenerated your apache conf:&lt;br /&gt;
 &amp;lt;eprints_root&amp;gt;/bin/generate_apacheconf --replace &amp;lt;archiveid&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===cfg/workflows/user/default.xml===&lt;br /&gt;
&lt;br /&gt;
Add the following lines to your cfg/workflows/user/default.xml configuration file:&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;stage name=&amp;quot;default&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;component type=&amp;quot;Field::Multi&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;title&amp;gt;&amp;lt;epc:phrase ref=&amp;quot;user_section_personal&amp;quot; /&amp;gt;&amp;lt;/title&amp;gt;&lt;br /&gt;
      ...&lt;br /&gt;
    &amp;lt;/component&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;component type=&amp;quot;Field::Multi&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;title&amp;gt;&amp;lt;epc:phrase ref=&amp;quot;user_section_meprints&amp;quot; /&amp;gt;&amp;lt;/title&amp;gt;&lt;br /&gt;
      &amp;lt;field ref=&amp;quot;profile_visibility&amp;quot; required=&amp;quot;yes&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;field ref=&amp;quot;jobtitle&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;field ref=&amp;quot;expertise&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;field ref=&amp;quot;biography&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;field ref=&amp;quot;qualifications&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/component&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===cfg/citations/user/default.xml===&lt;br /&gt;
&lt;br /&gt;
Replace the default EPrints user citation with the MePrints citation (which includes a thumbnail of the user's profile picture) run:&lt;br /&gt;
&lt;br /&gt;
 cd /opt/eprints3/archives/ARCHIVEID&lt;br /&gt;
 cp cfg/citations/user/default_with_thumbnail.xml cfg/citations/user/default.xml&lt;br /&gt;
&lt;br /&gt;
'''Note: if you have already made changes to the default citation, you should examine both files and merge the MePrints changes into default.xml&lt;br /&gt;
&lt;br /&gt;
===Authorship in MePrints===&lt;br /&gt;
Meprints 1.1 and later change the definition of ownership in the respository. This means that users who have the same email address as that listed in an items creators field belong to that user once the item enters the archive. This allows users to see statistics about papers they have authored without have to upload their own copy of the paper. You can return this to the eprints default by removing the cfg/cfg.d/authorship_meprints.pl file &lt;br /&gt;
&lt;br /&gt;
===Confirm Permissions===&lt;br /&gt;
The last thing to do before using MePrints is to ensure that the permissions are correct on the ''meprints'' directory. To do this run the following commands, there probably will not be any output from running this command;&lt;br /&gt;
 cd archives/ARCHIVEID&lt;br /&gt;
 chmod g+wx meprints&lt;br /&gt;
&lt;br /&gt;
If the permissions are not correct then you may encounter errors when using MePrints.&lt;br /&gt;
&lt;br /&gt;
==Testing==&lt;br /&gt;
&lt;br /&gt;
After applying all the changes above, restart Apache to activate MePrints.&lt;br /&gt;
&lt;br /&gt;
===Homepage===&lt;br /&gt;
&lt;br /&gt;
Log into your repository and should see your MePrints Homepage with default widget layout and profile picture.&lt;br /&gt;
&lt;br /&gt;
====Update profile====&lt;br /&gt;
&lt;br /&gt;
Click the Modify Profile button and add some information to the new MePrints fields (Job Title, Expertise, Biography, Qualifications). Set your Profile Visibility to '''Public'''. Click the Save button to return to your Homepage where the information you entered should now be displayed.&lt;br /&gt;
&lt;br /&gt;
====Upload photo====&lt;br /&gt;
&lt;br /&gt;
Click the Profile Picture button, choose a file and click Upload. You will be returned to your Homepage where your picture will now be displayed.&lt;br /&gt;
&lt;br /&gt;
====MePrints Widgets====&lt;br /&gt;
&lt;br /&gt;
By default your homepage displays several widgets (see user_homepage_defaults setting in cfg/cfg.d/z_meprints.pl). Try adding and removing widgets using the widget controls at the bottom of the screen. You can also rearrange widgets by dragging them up/down or between columns. To reset to the default widget layout click the Reset button in the widget control bar.&lt;br /&gt;
&lt;br /&gt;
===Public Profile===&lt;br /&gt;
&lt;br /&gt;
Enter the following URL to view your public profile page:&lt;br /&gt;
&lt;br /&gt;
 http://myrepository.com/profile/USERNAME&lt;br /&gt;
&lt;br /&gt;
where USERNAME is your EPrints username. The layout of the MePrints widgets on your profile page is controlled by the user_profile_defaults setting in cfg/cfg.d/z_meprints.pl.&lt;br /&gt;
&lt;br /&gt;
Go back to your MePrints homepage and click Modify Profile. Change some of your profile information (eg. Job Title, Expertise, Biography, Qualifications) and click Save. Return to your public profile page and check that your profile information has been updated.&lt;br /&gt;
&lt;br /&gt;
===MePrints Views===&lt;br /&gt;
&lt;br /&gt;
Run:&lt;br /&gt;
&lt;br /&gt;
 bin/generate_views ARCHIVEID --generate menus&lt;br /&gt;
&lt;br /&gt;
Check http://myrepository.com/view/ - you should see 2 new views (you may want to link these into your site template).&lt;br /&gt;
&lt;br /&gt;
Explore the view pages and check that you are listed. Make sure that you can click through from the browse listing to your public profile page.&lt;br /&gt;
&lt;br /&gt;
===MePrints search===&lt;br /&gt;
&lt;br /&gt;
Go to: http://myrepository.com/cgi/meprints/search&lt;br /&gt;
&lt;br /&gt;
Check that you can find your profile using keywords from your user profile information (eg. expertise, qualifications).&lt;br /&gt;
&lt;br /&gt;
Make sure that you can click through from the search result list to your public profile page.&lt;br /&gt;
&lt;br /&gt;
===MePrints Embeddable===&lt;br /&gt;
&lt;br /&gt;
If you want to use the default minimal style supplied for MePrints Embeddable then add the following code to the ''&amp;lt;head&amp;gt;'' section of your page:&lt;br /&gt;
 &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text/css&amp;quot; href=&amp;quot;http://myrepository.com/style/meprints_embed.css&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====MePrints Embeddable Widgets====&lt;br /&gt;
It is possible to embed individual widgets that are viewable on your public profile on your own page. If you go to the public profile page you will see an embed links on the widgets that can be embedded. Click the link and instructions will appear telling you how to embed the widget on your page.&lt;br /&gt;
&lt;br /&gt;
====MePrints Embeddable Profile====&lt;br /&gt;
Edit an HTML page and add the following code to the ''&amp;lt;head&amp;gt;'' section of the page:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;http://myrepository.com/cgi/meprints/embed_js?username=USERNAME&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Where ''USERNAME'' is your username on the repository.&lt;br /&gt;
&lt;br /&gt;
Then inside the ''&amp;lt;body&amp;gt;'' section of the page you need to add the following code:&lt;br /&gt;
&lt;br /&gt;
 &amp;amp;lt;div id=&amp;quot;meprints_profile&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will be the location where your embeddable profile will go on your page.&lt;br /&gt;
&lt;br /&gt;
===MePrints for admins===&lt;br /&gt;
&lt;br /&gt;
Using an administrator account go to the Admin screen and choose '''Search users'''. Enter a username or other criteria to find at least one user account (not the account you are logged in with).&lt;br /&gt;
&lt;br /&gt;
Make sure that you can click through from the results list to the user's homepage.&lt;br /&gt;
&lt;br /&gt;
You should be able to modify the user's profile information by clicking Administer Account.&lt;br /&gt;
&lt;br /&gt;
The widget layout should reflect the user's own preference, and you should not be able to make changes to their widget layout.&lt;br /&gt;
&lt;br /&gt;
====Hide Profile====&lt;br /&gt;
&lt;br /&gt;
Change the user's profile visibility to '''private'''.&lt;br /&gt;
&lt;br /&gt;
Log out, and make sure that:&lt;br /&gt;
&lt;br /&gt;
# the profile is no longer visible at /profile/USERNAME&lt;br /&gt;
# the profile no longer appears in search results&lt;br /&gt;
# the profile no longer appears in view pages&lt;br /&gt;
# the embeddable widget no longer displays the profile&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You can also change the default visibility of MePrints profiles in cfg/cfg.d/z_meprints.pl&lt;br /&gt;
by default profiles are public unless a user specifically makes there profile private. change&lt;br /&gt;
 $c-&amp;gt;{default_profile_behavior} = 1;&lt;br /&gt;
to &lt;br /&gt;
 $c-&amp;gt;{default_profile_behavior} = 0;&lt;br /&gt;
to make the default private profiles&lt;br /&gt;
&lt;br /&gt;
==Troubleshooting==&lt;br /&gt;
&lt;br /&gt;
===Database errors===&lt;br /&gt;
&lt;br /&gt;
When dragging and dropping Widgets around, MePrints shows database errors in the error log:&lt;br /&gt;
&lt;br /&gt;
 DBD::mysql::st execute failed: Duplicate entry '1-0' for key 1 at /opt/eprints3/perl_lib/EPrints/Database.pm line 1192.&lt;br /&gt;
 at /opt/eprints3/perl_lib/EPrints/Database.pm line 1192&lt;br /&gt;
 EPrints::Database::insert('EPrints::Database::mysql=HASH(0x2b593e11ebd0)', 'user_items_fields', 'ARRAY(0x2b593bd00510)', ...&lt;br /&gt;
&lt;br /&gt;
This is a known problem which does not seem to affect widget layout.&lt;br /&gt;
&lt;br /&gt;
===generate_views errors===&lt;br /&gt;
&lt;br /&gt;
====Warnings====&lt;br /&gt;
&lt;br /&gt;
 Use of uninitialized value $id in hash element at /usr/share/eprints3/perl_lib/EPrints/Database.pm line 2979.&lt;br /&gt;
&lt;br /&gt;
See http://trac.eprints.org/trac/ticket/3537&lt;br /&gt;
&lt;br /&gt;
====EPrint citations====&lt;br /&gt;
&lt;br /&gt;
After hiding all previously public profiles, eprint citations were rendered in the view list instead of users'. (need to work out how to reproduce this)&lt;br /&gt;
&lt;br /&gt;
====Empty views====&lt;br /&gt;
&lt;br /&gt;
After hiding all previously public profiles and regenerating views, view pages still show expertise/department values.&lt;br /&gt;
&lt;br /&gt;
[http://creativecommons.org/licenses/by/3.0/ This work is licensed under a Creative Commons Attribution 3.0 Unported License].&lt;/div&gt;</summary>
		<author><name>Sf03r@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=EPrints4_Core_Roadmap&amp;diff=10896</id>
		<title>EPrints4 Core Roadmap</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=EPrints4_Core_Roadmap&amp;diff=10896"/>
		<updated>2014-02-07T11:12:42Z</updated>

		<summary type="html">&lt;p&gt;Sf03r@ecs.soton.ac.uk: /* Data retrieval and searching */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=EPrints4 Core Development=&lt;br /&gt;
&lt;br /&gt;
Trying to divide the work into smaller tasks (and questions where relevant).&lt;br /&gt;
&lt;br /&gt;
==Request Handler / Page Controllers==&lt;br /&gt;
&lt;br /&gt;
This deals with how HTTP requests are handled by EPrints: when a request is made by a client (curl, browser..) a number of headers/parameters must be processed (e.g. Accept, Content-Type, EPrints' cookies, auth etc). This is the entry point of any web requests to the system. The main module is EPrints::Apache::Handler (formerly known as Apache::Rewrite).&lt;br /&gt;
&lt;br /&gt;
* Basic security aspects&lt;br /&gt;
** detect invalid requests/URL paths (e.g. containing a dot '.')&lt;br /&gt;
&lt;br /&gt;
* Low-level filters for processing of:&lt;br /&gt;
** Cookies (eprints_session, eprints_lang)&lt;br /&gt;
** URL encoding&lt;br /&gt;
** specific HTTP headers: Accept, Content-Type, Content-Length, Content-Range, Content-MD5 (?), ETag (?)&lt;br /&gt;
&lt;br /&gt;
* System initialisation:&lt;br /&gt;
** Repository object init (with language selection, via cookie/default lang)&lt;br /&gt;
** Protocol (HTTP, HTTPS?)&lt;br /&gt;
&lt;br /&gt;
* Low-level redirects or custom actions via Trigger&lt;br /&gt;
&lt;br /&gt;
* Call for Controller(s) to handle the request (e.g. CRUD if /id/..., UI, storage (file delivery) etc.) via Trigger&lt;br /&gt;
&lt;br /&gt;
* clean-up/post-processing if needed (e.g. setting Cache headers etc).&lt;br /&gt;
&lt;br /&gt;
==Security==&lt;br /&gt;
&lt;br /&gt;
Security (authentication and authorisation) must be handled by the Page Controller. They decide if auth is required at all (for instance a GET on an object via CRUD is usually allowed without auth). If auth may be required, the PerlAccessHandler stack must be defined.&lt;br /&gt;
&lt;br /&gt;
It is worth noting that authentication is likely to be common to most Page Controllers. The typical authentication mechanisms are: Basic Auth (via HTTP Header) and Cookie/Session-based Auth. Session-based is mostly handled internally (via LoginTicket) but the way the credentials are retrieved can be customised (CAS, LDAP...).&lt;br /&gt;
&lt;br /&gt;
Authorisation, on the other hand will be defined by the Page Controller. If the request is trying to modify an object, the Controller needs to check that the logged-in user has the appropriate rights/roles.&lt;br /&gt;
&lt;br /&gt;
Filters must be called using Trigger(s) or similar mechanism to avoid having hard-coded modules in the Request handler. It is then easy to select, add, remove filters at run-time.&lt;br /&gt;
&lt;br /&gt;
==Database==&lt;br /&gt;
&lt;br /&gt;
* Must contain any SQL handling. Custom SQL in scripts is bad and shows lacks in the DB API. This must handle the usual operations required by the system such as data retrieval, modification etc and any DB optimisation (commonly known as hacks).&lt;br /&gt;
&lt;br /&gt;
* The default DB engine is likely to be MySQL/InnoDB with support for transactions.&lt;br /&gt;
&lt;br /&gt;
* The DB layer is &amp;quot;very&amp;quot; low-level and doesn't check security concerns (e.g. can the user modifies that object?). This must be handled by the above layer, usually DataObj and MetaField.&lt;br /&gt;
&lt;br /&gt;
TODO: an audit of the current DB code to remove un-needed/deprecated methods, to re-organise the required existing methods.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Data Representation==&lt;br /&gt;
&lt;br /&gt;
This defines properties for data objects (for example the &amp;quot;name&amp;quot; of a user) and offers a layer between the raw data (handled by Database) and the application/views using the data (e.g. CRUD, &amp;quot;the&amp;quot; UI, Export/Import plug-ins etc).&lt;br /&gt;
&lt;br /&gt;
Important: data objects and metadata fields do not know how to render themselves on a UI. This is one of the main design aspect of EPrints4 as to remove dependencies of the UI on the data model.&lt;br /&gt;
&lt;br /&gt;
===Metadata fields===&lt;br /&gt;
&lt;br /&gt;
* make sure the data is valid, according to the type's constraints. For instance, you cannot store a string into an integer&lt;br /&gt;
&lt;br /&gt;
* maps any higher level type (e.g. URL) to a low-level DB type (e.g. varchar)&lt;br /&gt;
&lt;br /&gt;
* must provide a clean and clear API to easily modify data (set_value, add_value etc)&lt;br /&gt;
&lt;br /&gt;
* the type &amp;quot;file&amp;quot; whilst not being a piece of metadata directly is nonetheless a valid field - it is the only type that links data to a stored file (rather than being purely DB data).&lt;br /&gt;
&lt;br /&gt;
* XML/SAX handlers are likely to be kept at the Meta-Field level (because this makes sense)&lt;br /&gt;
&lt;br /&gt;
* aspects such as indexing, generating order values are more likely to be included in the Search components (so via Xapian for instance)&lt;br /&gt;
&lt;br /&gt;
* review of the existing types is needed (40ish types at the moment) and non-core types must be removed (recaptcha, compound...)&lt;br /&gt;
&lt;br /&gt;
===Data set / Data objects===&lt;br /&gt;
&lt;br /&gt;
* DataSet/Objects are collections of metadata fields and offer an API for easily manipulating objects/data.&lt;br /&gt;
* Dataset offers a number of properties to handle common fields/concepts in a consistent manner across different datasets. For instance the &amp;quot;lastmod&amp;quot; property which is an internal field always set to when the object was last modified or &amp;quot;history&amp;quot; which keeps track of the modifications of the object. Considered properties:&lt;br /&gt;
** &amp;quot;states&amp;quot;: the graph of states for that object. Similar to &amp;quot;eprint_status&amp;quot; for &amp;quot;eprint&amp;quot; objects in EPrints2/3. Automates and generalises state transfer for objects.&lt;br /&gt;
** &amp;quot;revision&amp;quot;: keep the revision number which is incremented each time that object is modified (default: ON)&lt;br /&gt;
** &amp;quot;acl&amp;quot;: enables the ACL related fields and permission checking (TODO)&lt;br /&gt;
** &amp;quot;cache&amp;quot;: enables the use of memcached (default: ON if globally enabled) - if enabled, keep a copy of data objects in memory rather than reading objects from DB.&lt;br /&gt;
** &amp;quot;read-only&amp;quot;: makes that data-set read only and forbids any modification/deletion (default: OFF)&lt;br /&gt;
** &amp;quot;history&amp;quot;: keeps an XML diff of the modifications made to that object. (TODO)&lt;br /&gt;
** &amp;quot;lastmod&amp;quot;: keeps a last modified field&lt;br /&gt;
** &amp;quot;datestamp&amp;quot;: the date at which the object was created&lt;br /&gt;
* EPrints::DataObj now contains all required information so that custom datasets do not need to have their explicit implementation (EPrints::DataObj::Foo package)&lt;br /&gt;
&lt;br /&gt;
Question: EPrints2/3 does not offer a generalised manner to reference a sub-dataset: &amp;quot;archive&amp;quot; is used as a short-cut for &amp;quot;eprint:archive&amp;quot; but because the dataset naming is global you can't re-use &amp;quot;archive&amp;quot; for other datasets. So we need a common way to reference a dataset. eprint:inbox? eprint/inbox? eprint_inbox?&lt;br /&gt;
&lt;br /&gt;
==Data retrieval and searching==&lt;br /&gt;
&lt;br /&gt;
I think there are two slightly different aspects of data retrieval:&lt;br /&gt;
&lt;br /&gt;
* an internal mechanism for retrieving data straight from the database, for instance:&lt;br /&gt;
** all data objects belonging to a dataset&lt;br /&gt;
** all data objects owned by a user&lt;br /&gt;
** generally the retrieval of data objects based on an EXACT constraint or set of constraints.&lt;br /&gt;
** possibility to order the data objects by a given meta field (i.e. a DB column).&lt;br /&gt;
* a user search optimised for helping users to find content they're interested to. This will likely be done by Xapian. Because this concept can become difficult to implement, it is better to use a specialist tool such as Xapian to do it. Includes the following scenarios:&lt;br /&gt;
** retrieval of all data objects belonging to a dataset (via the Xapian indexes which may be out-of-date or incomplete since objects are indexed by the indexer in a asynchronous manner)&lt;br /&gt;
** parsing complex user queries using e.g. boolean operators&lt;br /&gt;
&lt;br /&gt;
One question is how to label these two slightly different searching mechanism?&lt;br /&gt;
&lt;br /&gt;
===Internal Data retrieval===&lt;br /&gt;
&lt;br /&gt;
* Only supports EXACT matching or other SQL-derived tests and operators e.g. NOT NULL (aka is_set)&lt;br /&gt;
* Tightly linked to the concept of EPrints::List&lt;br /&gt;
* May be used on the UI to display lists of items owned by a user ETC but shouldn't be used in real user searches&lt;br /&gt;
&lt;br /&gt;
===User Searches===&lt;br /&gt;
&lt;br /&gt;
* Requires the creation and management of indexes (because it is the indexes which are searched)&lt;br /&gt;
&lt;br /&gt;
==CLI==&lt;br /&gt;
&lt;br /&gt;
* Use of a SYSTEM user for CLI operation/scripts? If not, ACL type of checks must online be done/enabled for Web requests&lt;br /&gt;
&lt;br /&gt;
==Misc==&lt;/div&gt;</summary>
		<author><name>Sf03r@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=EPrints4_Core_Roadmap&amp;diff=10895</id>
		<title>EPrints4 Core Roadmap</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=EPrints4_Core_Roadmap&amp;diff=10895"/>
		<updated>2014-02-07T11:12:28Z</updated>

		<summary type="html">&lt;p&gt;Sf03r@ecs.soton.ac.uk: /* Data set / Data objects */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=EPrints4 Core Development=&lt;br /&gt;
&lt;br /&gt;
Trying to divide the work into smaller tasks (and questions where relevant).&lt;br /&gt;
&lt;br /&gt;
==Request Handler / Page Controllers==&lt;br /&gt;
&lt;br /&gt;
This deals with how HTTP requests are handled by EPrints: when a request is made by a client (curl, browser..) a number of headers/parameters must be processed (e.g. Accept, Content-Type, EPrints' cookies, auth etc). This is the entry point of any web requests to the system. The main module is EPrints::Apache::Handler (formerly known as Apache::Rewrite).&lt;br /&gt;
&lt;br /&gt;
* Basic security aspects&lt;br /&gt;
** detect invalid requests/URL paths (e.g. containing a dot '.')&lt;br /&gt;
&lt;br /&gt;
* Low-level filters for processing of:&lt;br /&gt;
** Cookies (eprints_session, eprints_lang)&lt;br /&gt;
** URL encoding&lt;br /&gt;
** specific HTTP headers: Accept, Content-Type, Content-Length, Content-Range, Content-MD5 (?), ETag (?)&lt;br /&gt;
&lt;br /&gt;
* System initialisation:&lt;br /&gt;
** Repository object init (with language selection, via cookie/default lang)&lt;br /&gt;
** Protocol (HTTP, HTTPS?)&lt;br /&gt;
&lt;br /&gt;
* Low-level redirects or custom actions via Trigger&lt;br /&gt;
&lt;br /&gt;
* Call for Controller(s) to handle the request (e.g. CRUD if /id/..., UI, storage (file delivery) etc.) via Trigger&lt;br /&gt;
&lt;br /&gt;
* clean-up/post-processing if needed (e.g. setting Cache headers etc).&lt;br /&gt;
&lt;br /&gt;
==Security==&lt;br /&gt;
&lt;br /&gt;
Security (authentication and authorisation) must be handled by the Page Controller. They decide if auth is required at all (for instance a GET on an object via CRUD is usually allowed without auth). If auth may be required, the PerlAccessHandler stack must be defined.&lt;br /&gt;
&lt;br /&gt;
It is worth noting that authentication is likely to be common to most Page Controllers. The typical authentication mechanisms are: Basic Auth (via HTTP Header) and Cookie/Session-based Auth. Session-based is mostly handled internally (via LoginTicket) but the way the credentials are retrieved can be customised (CAS, LDAP...).&lt;br /&gt;
&lt;br /&gt;
Authorisation, on the other hand will be defined by the Page Controller. If the request is trying to modify an object, the Controller needs to check that the logged-in user has the appropriate rights/roles.&lt;br /&gt;
&lt;br /&gt;
Filters must be called using Trigger(s) or similar mechanism to avoid having hard-coded modules in the Request handler. It is then easy to select, add, remove filters at run-time.&lt;br /&gt;
&lt;br /&gt;
==Database==&lt;br /&gt;
&lt;br /&gt;
* Must contain any SQL handling. Custom SQL in scripts is bad and shows lacks in the DB API. This must handle the usual operations required by the system such as data retrieval, modification etc and any DB optimisation (commonly known as hacks).&lt;br /&gt;
&lt;br /&gt;
* The default DB engine is likely to be MySQL/InnoDB with support for transactions.&lt;br /&gt;
&lt;br /&gt;
* The DB layer is &amp;quot;very&amp;quot; low-level and doesn't check security concerns (e.g. can the user modifies that object?). This must be handled by the above layer, usually DataObj and MetaField.&lt;br /&gt;
&lt;br /&gt;
TODO: an audit of the current DB code to remove un-needed/deprecated methods, to re-organise the required existing methods.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Data Representation==&lt;br /&gt;
&lt;br /&gt;
This defines properties for data objects (for example the &amp;quot;name&amp;quot; of a user) and offers a layer between the raw data (handled by Database) and the application/views using the data (e.g. CRUD, &amp;quot;the&amp;quot; UI, Export/Import plug-ins etc).&lt;br /&gt;
&lt;br /&gt;
Important: data objects and metadata fields do not know how to render themselves on a UI. This is one of the main design aspect of EPrints4 as to remove dependencies of the UI on the data model.&lt;br /&gt;
&lt;br /&gt;
===Metadata fields===&lt;br /&gt;
&lt;br /&gt;
* make sure the data is valid, according to the type's constraints. For instance, you cannot store a string into an integer&lt;br /&gt;
&lt;br /&gt;
* maps any higher level type (e.g. URL) to a low-level DB type (e.g. varchar)&lt;br /&gt;
&lt;br /&gt;
* must provide a clean and clear API to easily modify data (set_value, add_value etc)&lt;br /&gt;
&lt;br /&gt;
* the type &amp;quot;file&amp;quot; whilst not being a piece of metadata directly is nonetheless a valid field - it is the only type that links data to a stored file (rather than being purely DB data).&lt;br /&gt;
&lt;br /&gt;
* XML/SAX handlers are likely to be kept at the Meta-Field level (because this makes sense)&lt;br /&gt;
&lt;br /&gt;
* aspects such as indexing, generating order values are more likely to be included in the Search components (so via Xapian for instance)&lt;br /&gt;
&lt;br /&gt;
* review of the existing types is needed (40ish types at the moment) and non-core types must be removed (recaptcha, compound...)&lt;br /&gt;
&lt;br /&gt;
===Data set / Data objects===&lt;br /&gt;
&lt;br /&gt;
* DataSet/Objects are collections of metadata fields and offer an API for easily manipulating objects/data.&lt;br /&gt;
* Dataset offers a number of properties to handle common fields/concepts in a consistent manner across different datasets. For instance the &amp;quot;lastmod&amp;quot; property which is an internal field always set to when the object was last modified or &amp;quot;history&amp;quot; which keeps track of the modifications of the object. Considered properties:&lt;br /&gt;
** &amp;quot;states&amp;quot;: the graph of states for that object. Similar to &amp;quot;eprint_status&amp;quot; for &amp;quot;eprint&amp;quot; objects in EPrints2/3. Automates and generalises state transfer for objects.&lt;br /&gt;
** &amp;quot;revision&amp;quot;: keep the revision number which is incremented each time that object is modified (default: ON)&lt;br /&gt;
** &amp;quot;acl&amp;quot;: enables the ACL related fields and permission checking (TODO)&lt;br /&gt;
** &amp;quot;cache&amp;quot;: enables the use of memcached (default: ON if globally enabled) - if enabled, keep a copy of data objects in memory rather than reading objects from DB.&lt;br /&gt;
** &amp;quot;read-only&amp;quot;: makes that data-set read only and forbids any modification/deletion (default: OFF)&lt;br /&gt;
** &amp;quot;history&amp;quot;: keeps an XML diff of the modifications made to that object. (TODO)&lt;br /&gt;
** &amp;quot;lastmod&amp;quot;: keeps a last modified field&lt;br /&gt;
** &amp;quot;datestamp&amp;quot;: the date at which the object was created&lt;br /&gt;
* EPrints::DataObj now contains all required information so that custom datasets do not need to have their explicit implementation (EPrints::DataObj::Foo package)&lt;br /&gt;
&lt;br /&gt;
Question: EPrints2/3 does not offer a generalised manner to reference a sub-dataset: &amp;quot;archive&amp;quot; is used as a short-cut for &amp;quot;eprint:archive&amp;quot; but because the dataset naming is global you can't re-use &amp;quot;archive&amp;quot; for other datasets. So we need a common way to reference a dataset. eprint:inbox? eprint/inbox? eprint_inbox?&lt;br /&gt;
&lt;br /&gt;
==Data retrieval and searching==&lt;br /&gt;
&lt;br /&gt;
I think there are two slightly different aspects of data retrieval:&lt;br /&gt;
&lt;br /&gt;
* an internal mechanism for retrieving data straight from the database, for instance:&lt;br /&gt;
&lt;br /&gt;
** all data objects belonging to a dataset&lt;br /&gt;
** all data objects owned by a user&lt;br /&gt;
** generally the retrieval of data objects based on an EXACT constraint or set of constraints.&lt;br /&gt;
&lt;br /&gt;
** possibility to order the data objects by a given meta field (i.e. a DB column).&lt;br /&gt;
&lt;br /&gt;
* a user search optimised for helping users to find content they're interested to. This will likely be done by Xapian. Because this concept can become difficult to implement, it is better to use a specialist tool such as Xapian to do it. Includes the following scenarios:&lt;br /&gt;
&lt;br /&gt;
** retrieval of all data objects belonging to a dataset (via the Xapian indexes which may be out-of-date or incomplete since objects are indexed by the indexer in a asynchronous manner)&lt;br /&gt;
** parsing complex user queries using e.g. boolean operators&lt;br /&gt;
&lt;br /&gt;
One question is how to label these two slightly different searching mechanism?&lt;br /&gt;
&lt;br /&gt;
===Internal Data retrieval===&lt;br /&gt;
&lt;br /&gt;
* Only supports EXACT matching or other SQL-derived tests and operators e.g. NOT NULL (aka is_set)&lt;br /&gt;
* Tightly linked to the concept of EPrints::List&lt;br /&gt;
* May be used on the UI to display lists of items owned by a user ETC but shouldn't be used in real user searches&lt;br /&gt;
&lt;br /&gt;
===User Searches===&lt;br /&gt;
&lt;br /&gt;
* Requires the creation and management of indexes (because it is the indexes which are searched)&lt;br /&gt;
&lt;br /&gt;
==CLI==&lt;br /&gt;
&lt;br /&gt;
* Use of a SYSTEM user for CLI operation/scripts? If not, ACL type of checks must online be done/enabled for Web requests&lt;br /&gt;
&lt;br /&gt;
==Misc==&lt;/div&gt;</summary>
		<author><name>Sf03r@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=EPrints4_Core_Roadmap&amp;diff=10894</id>
		<title>EPrints4 Core Roadmap</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=EPrints4_Core_Roadmap&amp;diff=10894"/>
		<updated>2014-02-06T16:10:45Z</updated>

		<summary type="html">&lt;p&gt;Sf03r@ecs.soton.ac.uk: /* Data Representation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=EPrints4 Core Development=&lt;br /&gt;
&lt;br /&gt;
Trying to divide the work into smaller tasks (and questions where relevant).&lt;br /&gt;
&lt;br /&gt;
==Request Handler / Page Controllers==&lt;br /&gt;
&lt;br /&gt;
This deals with how HTTP requests are handled by EPrints: when a request is made by a client (curl, browser..) a number of headers/parameters must be processed (e.g. Accept, Content-Type, EPrints' cookies, auth etc). This is the entry point of any web requests to the system. The main module is EPrints::Apache::Handler (formerly known as Apache::Rewrite).&lt;br /&gt;
&lt;br /&gt;
* Basic security aspects&lt;br /&gt;
** detect invalid requests/URL paths (e.g. containing a dot '.')&lt;br /&gt;
&lt;br /&gt;
* Low-level filters for processing of:&lt;br /&gt;
** Cookies (eprints_session, eprints_lang)&lt;br /&gt;
** URL encoding&lt;br /&gt;
** specific HTTP headers: Accept, Content-Type, Content-Length, Content-Range, Content-MD5 (?), ETag (?)&lt;br /&gt;
&lt;br /&gt;
* System initialisation:&lt;br /&gt;
** Repository object init (with language selection, via cookie/default lang)&lt;br /&gt;
** Protocol (HTTP, HTTPS?)&lt;br /&gt;
&lt;br /&gt;
* Low-level redirects or custom actions via Trigger&lt;br /&gt;
&lt;br /&gt;
* Call for Controller(s) to handle the request (e.g. CRUD if /id/..., UI, storage (file delivery) etc.) via Trigger&lt;br /&gt;
&lt;br /&gt;
* clean-up/post-processing if needed (e.g. setting Cache headers etc).&lt;br /&gt;
&lt;br /&gt;
==Security==&lt;br /&gt;
&lt;br /&gt;
Security (authentication and authorisation) must be handled by the Page Controller. They decide if auth is required at all (for instance a GET on an object via CRUD is usually allowed without auth). If auth may be required, the PerlAccessHandler stack must be defined.&lt;br /&gt;
&lt;br /&gt;
It is worth noting that authentication is likely to be common to most Page Controllers. The typical authentication mechanisms are: Basic Auth (via HTTP Header) and Cookie/Session-based Auth. Session-based is mostly handled internally (via LoginTicket) but the way the credentials are retrieved can be customised (CAS, LDAP...).&lt;br /&gt;
&lt;br /&gt;
Authorisation, on the other hand will be defined by the Page Controller. If the request is trying to modify an object, the Controller needs to check that the logged-in user has the appropriate rights/roles.&lt;br /&gt;
&lt;br /&gt;
Filters must be called using Trigger(s) or similar mechanism to avoid having hard-coded modules in the Request handler. It is then easy to select, add, remove filters at run-time.&lt;br /&gt;
&lt;br /&gt;
==Database==&lt;br /&gt;
&lt;br /&gt;
* Must contain any SQL handling. Custom SQL in scripts is bad and shows lacks in the DB API. This must handle the usual operations required by the system such as data retrieval, modification etc and any DB optimisation (commonly known as hacks).&lt;br /&gt;
&lt;br /&gt;
* The default DB engine is likely to be MySQL/InnoDB with support for transactions.&lt;br /&gt;
&lt;br /&gt;
* The DB layer is &amp;quot;very&amp;quot; low-level and doesn't check security concerns (e.g. can the user modifies that object?). This must be handled by the above layer, usually DataObj and MetaField.&lt;br /&gt;
&lt;br /&gt;
TODO: an audit of the current DB code to remove un-needed/deprecated methods, to re-organise the required existing methods.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Data Representation==&lt;br /&gt;
&lt;br /&gt;
This defines properties for data objects (for example the &amp;quot;name&amp;quot; of a user) and offers a layer between the raw data (handled by Database) and the application/views using the data (e.g. CRUD, &amp;quot;the&amp;quot; UI, Export/Import plug-ins etc).&lt;br /&gt;
&lt;br /&gt;
Important: data objects and metadata fields do not know how to render themselves on a UI. This is one of the main design aspect of EPrints4 as to remove dependencies of the UI on the data model.&lt;br /&gt;
&lt;br /&gt;
===Metadata fields===&lt;br /&gt;
&lt;br /&gt;
* make sure the data is valid, according to the type's constraints. For instance, you cannot store a string into an integer&lt;br /&gt;
&lt;br /&gt;
* maps any higher level type (e.g. URL) to a low-level DB type (e.g. varchar)&lt;br /&gt;
&lt;br /&gt;
* must provide a clean and clear API to easily modify data (set_value, add_value etc)&lt;br /&gt;
&lt;br /&gt;
* the type &amp;quot;file&amp;quot; whilst not being a piece of metadata directly is nonetheless a valid field - it is the only type that links data to a stored file (rather than being purely DB data).&lt;br /&gt;
&lt;br /&gt;
* XML/SAX handlers are likely to be kept at the Meta-Field level (because this makes sense)&lt;br /&gt;
&lt;br /&gt;
* aspects such as indexing, generating order values are more likely to be included in the Search components (so via Xapian for instance)&lt;br /&gt;
&lt;br /&gt;
* review of the existing types is needed (40ish types at the moment) and non-core types must be removed (recaptcha, compound...)&lt;br /&gt;
&lt;br /&gt;
===Data set / Data objects===&lt;br /&gt;
&lt;br /&gt;
* DataSet/Objects are collections of metadata fields and offer an API for easily manipulating objects/data.&lt;br /&gt;
&lt;br /&gt;
* Dataset offers a number of properties to handle common fields/concepts in a consistent manner across different datasets. For instance the &amp;quot;lastmod&amp;quot; property which is an internal field always set to when the object was last modified or &amp;quot;history&amp;quot; which keeps track of the modifications of the object. Considered properties:&lt;br /&gt;
&lt;br /&gt;
** &amp;quot;states&amp;quot;: the graph of states for that object. Similar to &amp;quot;eprint_status&amp;quot; for &amp;quot;eprint&amp;quot; objects in EPrints2/3. Automates and generalises state transfer for objects.&lt;br /&gt;
&lt;br /&gt;
** &amp;quot;revision&amp;quot;: keep the revision number which is incremented each time that object is modified (default: ON)&lt;br /&gt;
&lt;br /&gt;
** &amp;quot;acl&amp;quot;: enables the ACL related fields and permission checking (TODO)&lt;br /&gt;
&lt;br /&gt;
** &amp;quot;cache&amp;quot;: enables the use of memcached (default: ON if globally enabled) - if enabled, keep a copy of data objects in memory rather than reading objects from DB.&lt;br /&gt;
&lt;br /&gt;
** &amp;quot;read-only&amp;quot;: makes that data-set read only and forbids any modification/deletion (default: OFF)&lt;br /&gt;
&lt;br /&gt;
** &amp;quot;history&amp;quot;: keeps an XML diff of the modifications made to that object. (TODO)&lt;br /&gt;
&lt;br /&gt;
** &amp;quot;lastmod&amp;quot;: keeps a last modified field&lt;br /&gt;
&lt;br /&gt;
** &amp;quot;datestamp&amp;quot;: the date at which the object was created&lt;br /&gt;
&lt;br /&gt;
* EPrints::DataObj now contains all required information so that custom datasets do not need to have their explicit implementation (EPrints::DataObj::Foo package)&lt;br /&gt;
&lt;br /&gt;
Question: EPrints2/3 does not offer a generalised manner to reference a sub-dataset: &amp;quot;archive&amp;quot; is used as a short-cut for &amp;quot;eprint:archive&amp;quot; but because the dataset naming is global you can't re-use &amp;quot;archive&amp;quot; for other datasets. So we need a common way to reference a dataset. eprint:inbox? eprint/inbox? eprint_inbox?&lt;br /&gt;
&lt;br /&gt;
==Data retrieval and searching==&lt;br /&gt;
&lt;br /&gt;
I think there are two slightly different aspects of data retrieval:&lt;br /&gt;
&lt;br /&gt;
* an internal mechanism for retrieving data straight from the database, for instance:&lt;br /&gt;
&lt;br /&gt;
** all data objects belonging to a dataset&lt;br /&gt;
** all data objects owned by a user&lt;br /&gt;
** generally the retrieval of data objects based on an EXACT constraint or set of constraints.&lt;br /&gt;
&lt;br /&gt;
** possibility to order the data objects by a given meta field (i.e. a DB column).&lt;br /&gt;
&lt;br /&gt;
* a user search optimised for helping users to find content they're interested to. This will likely be done by Xapian. Because this concept can become difficult to implement, it is better to use a specialist tool such as Xapian to do it. Includes the following scenarios:&lt;br /&gt;
&lt;br /&gt;
** retrieval of all data objects belonging to a dataset (via the Xapian indexes which may be out-of-date or incomplete since objects are indexed by the indexer in a asynchronous manner)&lt;br /&gt;
** parsing complex user queries using e.g. boolean operators&lt;br /&gt;
&lt;br /&gt;
One question is how to label these two slightly different searching mechanism?&lt;br /&gt;
&lt;br /&gt;
===Internal Data retrieval===&lt;br /&gt;
&lt;br /&gt;
* Only supports EXACT matching or other SQL-derived tests and operators e.g. NOT NULL (aka is_set)&lt;br /&gt;
* Tightly linked to the concept of EPrints::List&lt;br /&gt;
* May be used on the UI to display lists of items owned by a user ETC but shouldn't be used in real user searches&lt;br /&gt;
&lt;br /&gt;
===User Searches===&lt;br /&gt;
&lt;br /&gt;
* Requires the creation and management of indexes (because it is the indexes which are searched)&lt;br /&gt;
&lt;br /&gt;
==CLI==&lt;br /&gt;
&lt;br /&gt;
* Use of a SYSTEM user for CLI operation/scripts? If not, ACL type of checks must online be done/enabled for Web requests&lt;br /&gt;
&lt;br /&gt;
==Misc==&lt;/div&gt;</summary>
		<author><name>Sf03r@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=EPrints4_Core_Roadmap&amp;diff=10893</id>
		<title>EPrints4 Core Roadmap</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=EPrints4_Core_Roadmap&amp;diff=10893"/>
		<updated>2014-02-06T16:00:13Z</updated>

		<summary type="html">&lt;p&gt;Sf03r@ecs.soton.ac.uk: /* CLI */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=EPrints4 Core Development=&lt;br /&gt;
&lt;br /&gt;
Trying to divide the work into smaller tasks (and questions where relevant).&lt;br /&gt;
&lt;br /&gt;
==Request Handler / Page Controllers==&lt;br /&gt;
&lt;br /&gt;
This deals with how HTTP requests are handled by EPrints: when a request is made by a client (curl, browser..) a number of headers/parameters must be processed (e.g. Accept, Content-Type, EPrints' cookies, auth etc). This is the entry point of any web requests to the system. The main module is EPrints::Apache::Handler (formerly known as Apache::Rewrite).&lt;br /&gt;
&lt;br /&gt;
* Basic security aspects&lt;br /&gt;
** detect invalid requests/URL paths (e.g. containing a dot '.')&lt;br /&gt;
&lt;br /&gt;
* Low-level filters for processing of:&lt;br /&gt;
** Cookies (eprints_session, eprints_lang)&lt;br /&gt;
** URL encoding&lt;br /&gt;
** specific HTTP headers: Accept, Content-Type, Content-Length, Content-Range, Content-MD5 (?), ETag (?)&lt;br /&gt;
&lt;br /&gt;
* System initialisation:&lt;br /&gt;
** Repository object init (with language selection, via cookie/default lang)&lt;br /&gt;
** Protocol (HTTP, HTTPS?)&lt;br /&gt;
&lt;br /&gt;
* Low-level redirects or custom actions via Trigger&lt;br /&gt;
&lt;br /&gt;
* Call for Controller(s) to handle the request (e.g. CRUD if /id/..., UI, storage (file delivery) etc.) via Trigger&lt;br /&gt;
&lt;br /&gt;
* clean-up/post-processing if needed (e.g. setting Cache headers etc).&lt;br /&gt;
&lt;br /&gt;
==Security==&lt;br /&gt;
&lt;br /&gt;
Security (authentication and authorisation) must be handled by the Page Controller. They decide if auth is required at all (for instance a GET on an object via CRUD is usually allowed without auth). If auth may be required, the PerlAccessHandler stack must be defined.&lt;br /&gt;
&lt;br /&gt;
It is worth noting that authentication is likely to be common to most Page Controllers. The typical authentication mechanisms are: Basic Auth (via HTTP Header) and Cookie/Session-based Auth. Session-based is mostly handled internally (via LoginTicket) but the way the credentials are retrieved can be customised (CAS, LDAP...).&lt;br /&gt;
&lt;br /&gt;
Authorisation, on the other hand will be defined by the Page Controller. If the request is trying to modify an object, the Controller needs to check that the logged-in user has the appropriate rights/roles.&lt;br /&gt;
&lt;br /&gt;
Filters must be called using Trigger(s) or similar mechanism to avoid having hard-coded modules in the Request handler. It is then easy to select, add, remove filters at run-time.&lt;br /&gt;
&lt;br /&gt;
==Database==&lt;br /&gt;
&lt;br /&gt;
* Must contain any SQL handling. Custom SQL in scripts is bad and shows lacks in the DB API. This must handle the usual operations required by the system such as data retrieval, modification etc and any DB optimisation (commonly known as hacks).&lt;br /&gt;
&lt;br /&gt;
* The default DB engine is likely to be MySQL/InnoDB with support for transactions.&lt;br /&gt;
&lt;br /&gt;
* The DB layer is &amp;quot;very&amp;quot; low-level and doesn't check security concerns (e.g. can the user modifies that object?). This must be handled by the above layer, usually DataObj and MetaField.&lt;br /&gt;
&lt;br /&gt;
TODO: an audit of the current DB code to remove un-needed/deprecated methods, to re-organise the required existing methods.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Data Representation==&lt;br /&gt;
&lt;br /&gt;
This defines properties for data objects (for example the &amp;quot;name&amp;quot; of a user) and offers a layer between the raw data (handled by Database) and the application/views using the data (e.g. CRUD, &amp;quot;the&amp;quot; UI, Export/Import plug-ins etc).&lt;br /&gt;
&lt;br /&gt;
Important: data objects and metadata fields do not know how to render themselves on a UI. This is one of the main design aspect of EPrints4 as to remove dependencies of the UI on the data model.&lt;br /&gt;
&lt;br /&gt;
===Metadata fields===&lt;br /&gt;
&lt;br /&gt;
* make sure the data is valid, according to the type's constraints. For instance, you cannot store a string into an integer&lt;br /&gt;
&lt;br /&gt;
* maps any higher level type (e.g. URL) to a low-level DB type (e.g. varchar)&lt;br /&gt;
&lt;br /&gt;
* must provide a clean and clear API to easily modify data (set_value, add_value etc)&lt;br /&gt;
&lt;br /&gt;
* the type &amp;quot;file&amp;quot; whilst not being a piece of metadata directly is nonetheless a valid field - it is the only type that links data to a stored file (rather than being purely DB data).&lt;br /&gt;
&lt;br /&gt;
* XML/SAX handlers are likely to be kept at the Meta-Field level (because this makes sense)&lt;br /&gt;
&lt;br /&gt;
* aspects such as indexing, generating order values are more likely to be included in the Search components (so via Xapian for instance)&lt;br /&gt;
&lt;br /&gt;
* review of the existing types is needed (40ish types at the moment) and non-core types must be removed (recaptcha, compound...)&lt;br /&gt;
&lt;br /&gt;
===Data set / Data objects===&lt;br /&gt;
&lt;br /&gt;
* DataSet/Objects are collections of metadata fields and offer an API for easily manipulating objects/data.&lt;br /&gt;
&lt;br /&gt;
* Dataset offers a number of properties to handle common fields/concepts in a consistent manner across different datasets. For instance the &amp;quot;lastmod&amp;quot; property which is an internal field always set to when the object was last modified or &amp;quot;history&amp;quot; which keeps track of the modifications of the object. Considered properties:&lt;br /&gt;
&lt;br /&gt;
** &amp;quot;states&amp;quot;: the graph of states for that object. Similar to &amp;quot;eprint_status&amp;quot; for &amp;quot;eprint&amp;quot; objects in EPrints2/3. Automates and generalises state transfer for objects.&lt;br /&gt;
&lt;br /&gt;
** &amp;quot;revision&amp;quot;: keep the revision number which is incremented each time that object is modified (default: ON)&lt;br /&gt;
&lt;br /&gt;
** &amp;quot;acl&amp;quot;: enables the ACL related fields and permission checking (TODO)&lt;br /&gt;
&lt;br /&gt;
** &amp;quot;cache&amp;quot;: enables the use of memcached (default: ON if globally enabled) - if enabled, keep a copy of data objects in memory rather than reading objects from DB.&lt;br /&gt;
&lt;br /&gt;
** &amp;quot;read-only&amp;quot;: makes that data-set read only and forbids any modification/deletion (default: OFF)&lt;br /&gt;
&lt;br /&gt;
** &amp;quot;history&amp;quot;: keeps an XML diff of the modifications made to that object. (TODO)&lt;br /&gt;
&lt;br /&gt;
** &amp;quot;lastmod&amp;quot;: keeps a last modified field&lt;br /&gt;
&lt;br /&gt;
** &amp;quot;datestamp&amp;quot;: the date at which the object was created&lt;br /&gt;
&lt;br /&gt;
* EPrints::DataObj now contains all required information so that custom datasets do not need to have their explicit implementation (EPrints::DataObj::Foo package)&lt;br /&gt;
&lt;br /&gt;
==Data retrieval and searching==&lt;br /&gt;
&lt;br /&gt;
I think there are two slightly different aspects of data retrieval:&lt;br /&gt;
&lt;br /&gt;
* an internal mechanism for retrieving data straight from the database, for instance:&lt;br /&gt;
&lt;br /&gt;
** all data objects belonging to a dataset&lt;br /&gt;
** all data objects owned by a user&lt;br /&gt;
** generally the retrieval of data objects based on an EXACT constraint or set of constraints.&lt;br /&gt;
&lt;br /&gt;
** possibility to order the data objects by a given meta field (i.e. a DB column).&lt;br /&gt;
&lt;br /&gt;
* a user search optimised for helping users to find content they're interested to. This will likely be done by Xapian. Because this concept can become difficult to implement, it is better to use a specialist tool such as Xapian to do it. Includes the following scenarios:&lt;br /&gt;
&lt;br /&gt;
** retrieval of all data objects belonging to a dataset (via the Xapian indexes which may be out-of-date or incomplete since objects are indexed by the indexer in a asynchronous manner)&lt;br /&gt;
** parsing complex user queries using e.g. boolean operators&lt;br /&gt;
&lt;br /&gt;
One question is how to label these two slightly different searching mechanism?&lt;br /&gt;
&lt;br /&gt;
===Internal Data retrieval===&lt;br /&gt;
&lt;br /&gt;
* Only supports EXACT matching or other SQL-derived tests and operators e.g. NOT NULL (aka is_set)&lt;br /&gt;
* Tightly linked to the concept of EPrints::List&lt;br /&gt;
* May be used on the UI to display lists of items owned by a user ETC but shouldn't be used in real user searches&lt;br /&gt;
&lt;br /&gt;
===User Searches===&lt;br /&gt;
&lt;br /&gt;
* Requires the creation and management of indexes (because it is the indexes which are searched)&lt;br /&gt;
&lt;br /&gt;
==CLI==&lt;br /&gt;
&lt;br /&gt;
* Use of a SYSTEM user for CLI operation/scripts? If not, ACL type of checks must online be done/enabled for Web requests&lt;br /&gt;
&lt;br /&gt;
==Misc==&lt;/div&gt;</summary>
		<author><name>Sf03r@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=EPrints4_Core_Roadmap&amp;diff=10892</id>
		<title>EPrints4 Core Roadmap</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=EPrints4_Core_Roadmap&amp;diff=10892"/>
		<updated>2014-02-06T15:59:20Z</updated>

		<summary type="html">&lt;p&gt;Sf03r@ecs.soton.ac.uk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=EPrints4 Core Development=&lt;br /&gt;
&lt;br /&gt;
Trying to divide the work into smaller tasks (and questions where relevant).&lt;br /&gt;
&lt;br /&gt;
==Request Handler / Page Controllers==&lt;br /&gt;
&lt;br /&gt;
This deals with how HTTP requests are handled by EPrints: when a request is made by a client (curl, browser..) a number of headers/parameters must be processed (e.g. Accept, Content-Type, EPrints' cookies, auth etc). This is the entry point of any web requests to the system. The main module is EPrints::Apache::Handler (formerly known as Apache::Rewrite).&lt;br /&gt;
&lt;br /&gt;
* Basic security aspects&lt;br /&gt;
** detect invalid requests/URL paths (e.g. containing a dot '.')&lt;br /&gt;
&lt;br /&gt;
* Low-level filters for processing of:&lt;br /&gt;
** Cookies (eprints_session, eprints_lang)&lt;br /&gt;
** URL encoding&lt;br /&gt;
** specific HTTP headers: Accept, Content-Type, Content-Length, Content-Range, Content-MD5 (?), ETag (?)&lt;br /&gt;
&lt;br /&gt;
* System initialisation:&lt;br /&gt;
** Repository object init (with language selection, via cookie/default lang)&lt;br /&gt;
** Protocol (HTTP, HTTPS?)&lt;br /&gt;
&lt;br /&gt;
* Low-level redirects or custom actions via Trigger&lt;br /&gt;
&lt;br /&gt;
* Call for Controller(s) to handle the request (e.g. CRUD if /id/..., UI, storage (file delivery) etc.) via Trigger&lt;br /&gt;
&lt;br /&gt;
* clean-up/post-processing if needed (e.g. setting Cache headers etc).&lt;br /&gt;
&lt;br /&gt;
==Security==&lt;br /&gt;
&lt;br /&gt;
Security (authentication and authorisation) must be handled by the Page Controller. They decide if auth is required at all (for instance a GET on an object via CRUD is usually allowed without auth). If auth may be required, the PerlAccessHandler stack must be defined.&lt;br /&gt;
&lt;br /&gt;
It is worth noting that authentication is likely to be common to most Page Controllers. The typical authentication mechanisms are: Basic Auth (via HTTP Header) and Cookie/Session-based Auth. Session-based is mostly handled internally (via LoginTicket) but the way the credentials are retrieved can be customised (CAS, LDAP...).&lt;br /&gt;
&lt;br /&gt;
Authorisation, on the other hand will be defined by the Page Controller. If the request is trying to modify an object, the Controller needs to check that the logged-in user has the appropriate rights/roles.&lt;br /&gt;
&lt;br /&gt;
Filters must be called using Trigger(s) or similar mechanism to avoid having hard-coded modules in the Request handler. It is then easy to select, add, remove filters at run-time.&lt;br /&gt;
&lt;br /&gt;
==Database==&lt;br /&gt;
&lt;br /&gt;
* Must contain any SQL handling. Custom SQL in scripts is bad and shows lacks in the DB API. This must handle the usual operations required by the system such as data retrieval, modification etc and any DB optimisation (commonly known as hacks).&lt;br /&gt;
&lt;br /&gt;
* The default DB engine is likely to be MySQL/InnoDB with support for transactions.&lt;br /&gt;
&lt;br /&gt;
* The DB layer is &amp;quot;very&amp;quot; low-level and doesn't check security concerns (e.g. can the user modifies that object?). This must be handled by the above layer, usually DataObj and MetaField.&lt;br /&gt;
&lt;br /&gt;
TODO: an audit of the current DB code to remove un-needed/deprecated methods, to re-organise the required existing methods.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Data Representation==&lt;br /&gt;
&lt;br /&gt;
This defines properties for data objects (for example the &amp;quot;name&amp;quot; of a user) and offers a layer between the raw data (handled by Database) and the application/views using the data (e.g. CRUD, &amp;quot;the&amp;quot; UI, Export/Import plug-ins etc).&lt;br /&gt;
&lt;br /&gt;
Important: data objects and metadata fields do not know how to render themselves on a UI. This is one of the main design aspect of EPrints4 as to remove dependencies of the UI on the data model.&lt;br /&gt;
&lt;br /&gt;
===Metadata fields===&lt;br /&gt;
&lt;br /&gt;
* make sure the data is valid, according to the type's constraints. For instance, you cannot store a string into an integer&lt;br /&gt;
&lt;br /&gt;
* maps any higher level type (e.g. URL) to a low-level DB type (e.g. varchar)&lt;br /&gt;
&lt;br /&gt;
* must provide a clean and clear API to easily modify data (set_value, add_value etc)&lt;br /&gt;
&lt;br /&gt;
* the type &amp;quot;file&amp;quot; whilst not being a piece of metadata directly is nonetheless a valid field - it is the only type that links data to a stored file (rather than being purely DB data).&lt;br /&gt;
&lt;br /&gt;
* XML/SAX handlers are likely to be kept at the Meta-Field level (because this makes sense)&lt;br /&gt;
&lt;br /&gt;
* aspects such as indexing, generating order values are more likely to be included in the Search components (so via Xapian for instance)&lt;br /&gt;
&lt;br /&gt;
* review of the existing types is needed (40ish types at the moment) and non-core types must be removed (recaptcha, compound...)&lt;br /&gt;
&lt;br /&gt;
===Data set / Data objects===&lt;br /&gt;
&lt;br /&gt;
* DataSet/Objects are collections of metadata fields and offer an API for easily manipulating objects/data.&lt;br /&gt;
&lt;br /&gt;
* Dataset offers a number of properties to handle common fields/concepts in a consistent manner across different datasets. For instance the &amp;quot;lastmod&amp;quot; property which is an internal field always set to when the object was last modified or &amp;quot;history&amp;quot; which keeps track of the modifications of the object. Considered properties:&lt;br /&gt;
&lt;br /&gt;
** &amp;quot;states&amp;quot;: the graph of states for that object. Similar to &amp;quot;eprint_status&amp;quot; for &amp;quot;eprint&amp;quot; objects in EPrints2/3. Automates and generalises state transfer for objects.&lt;br /&gt;
&lt;br /&gt;
** &amp;quot;revision&amp;quot;: keep the revision number which is incremented each time that object is modified (default: ON)&lt;br /&gt;
&lt;br /&gt;
** &amp;quot;acl&amp;quot;: enables the ACL related fields and permission checking (TODO)&lt;br /&gt;
&lt;br /&gt;
** &amp;quot;cache&amp;quot;: enables the use of memcached (default: ON if globally enabled) - if enabled, keep a copy of data objects in memory rather than reading objects from DB.&lt;br /&gt;
&lt;br /&gt;
** &amp;quot;read-only&amp;quot;: makes that data-set read only and forbids any modification/deletion (default: OFF)&lt;br /&gt;
&lt;br /&gt;
** &amp;quot;history&amp;quot;: keeps an XML diff of the modifications made to that object. (TODO)&lt;br /&gt;
&lt;br /&gt;
** &amp;quot;lastmod&amp;quot;: keeps a last modified field&lt;br /&gt;
&lt;br /&gt;
** &amp;quot;datestamp&amp;quot;: the date at which the object was created&lt;br /&gt;
&lt;br /&gt;
* EPrints::DataObj now contains all required information so that custom datasets do not need to have their explicit implementation (EPrints::DataObj::Foo package)&lt;br /&gt;
&lt;br /&gt;
==Data retrieval and searching==&lt;br /&gt;
&lt;br /&gt;
I think there are two slightly different aspects of data retrieval:&lt;br /&gt;
&lt;br /&gt;
* an internal mechanism for retrieving data straight from the database, for instance:&lt;br /&gt;
&lt;br /&gt;
** all data objects belonging to a dataset&lt;br /&gt;
** all data objects owned by a user&lt;br /&gt;
** generally the retrieval of data objects based on an EXACT constraint or set of constraints.&lt;br /&gt;
&lt;br /&gt;
** possibility to order the data objects by a given meta field (i.e. a DB column).&lt;br /&gt;
&lt;br /&gt;
* a user search optimised for helping users to find content they're interested to. This will likely be done by Xapian. Because this concept can become difficult to implement, it is better to use a specialist tool such as Xapian to do it. Includes the following scenarios:&lt;br /&gt;
&lt;br /&gt;
** retrieval of all data objects belonging to a dataset (via the Xapian indexes which may be out-of-date or incomplete since objects are indexed by the indexer in a asynchronous manner)&lt;br /&gt;
** parsing complex user queries using e.g. boolean operators&lt;br /&gt;
&lt;br /&gt;
One question is how to label these two slightly different searching mechanism?&lt;br /&gt;
&lt;br /&gt;
===Internal Data retrieval===&lt;br /&gt;
&lt;br /&gt;
* Only supports EXACT matching or other SQL-derived tests and operators e.g. NOT NULL (aka is_set)&lt;br /&gt;
* Tightly linked to the concept of EPrints::List&lt;br /&gt;
* May be used on the UI to display lists of items owned by a user ETC but shouldn't be used in real user searches&lt;br /&gt;
&lt;br /&gt;
===User Searches===&lt;br /&gt;
&lt;br /&gt;
* Requires the creation and management of indexes (because it is the indexes which are searched)&lt;br /&gt;
&lt;br /&gt;
==CLI==&lt;br /&gt;
&lt;br /&gt;
==Misc==&lt;/div&gt;</summary>
		<author><name>Sf03r@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=EPrints4_Core_Roadmap&amp;diff=10891</id>
		<title>EPrints4 Core Roadmap</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=EPrints4_Core_Roadmap&amp;diff=10891"/>
		<updated>2014-02-06T15:58:48Z</updated>

		<summary type="html">&lt;p&gt;Sf03r@ecs.soton.ac.uk: /* Data retrieval */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=EPrints4 Core Development=&lt;br /&gt;
&lt;br /&gt;
Trying to divide the work into smaller tasks (and questions where relevant).&lt;br /&gt;
&lt;br /&gt;
==Request Handler / Page Controllers==&lt;br /&gt;
&lt;br /&gt;
This deals with how HTTP requests are handled by EPrints: when a request is made by a client (curl, browser..) a number of headers/parameters must be processed (e.g. Accept, Content-Type, EPrints' cookies, auth etc). This is the entry point of any web requests to the system. The main module is EPrints::Apache::Handler (formerly known as Apache::Rewrite).&lt;br /&gt;
&lt;br /&gt;
* Basic security aspects&lt;br /&gt;
** detect invalid requests/URL paths (e.g. containing a dot '.')&lt;br /&gt;
&lt;br /&gt;
* Low-level filters for processing of:&lt;br /&gt;
** Cookies (eprints_session, eprints_lang)&lt;br /&gt;
** URL encoding&lt;br /&gt;
** specific HTTP headers: Accept, Content-Type, Content-Length, Content-Range, Content-MD5 (?), ETag (?)&lt;br /&gt;
&lt;br /&gt;
* System initialisation:&lt;br /&gt;
** Repository object init (with language selection, via cookie/default lang)&lt;br /&gt;
** Protocol (HTTP, HTTPS?)&lt;br /&gt;
&lt;br /&gt;
* Low-level redirects or custom actions via Trigger&lt;br /&gt;
&lt;br /&gt;
* Call for Controller(s) to handle the request (e.g. CRUD if /id/..., UI, storage (file delivery) etc.) via Trigger&lt;br /&gt;
&lt;br /&gt;
* clean-up/post-processing if needed (e.g. setting Cache headers etc).&lt;br /&gt;
&lt;br /&gt;
==Security==&lt;br /&gt;
&lt;br /&gt;
Security (authentication and authorisation) must be handled by the Page Controller. They decide if auth is required at all (for instance a GET on an object via CRUD is usually allowed without auth). If auth may be required, the PerlAccessHandler stack must be defined.&lt;br /&gt;
&lt;br /&gt;
It is worth noting that authentication is likely to be common to most Page Controllers. The typical authentication mechanisms are: Basic Auth (via HTTP Header) and Cookie/Session-based Auth. Session-based is mostly handled internally (via LoginTicket) but the way the credentials are retrieved can be customised (CAS, LDAP...).&lt;br /&gt;
&lt;br /&gt;
Authorisation, on the other hand will be defined by the Page Controller. If the request is trying to modify an object, the Controller needs to check that the logged-in user has the appropriate rights/roles.&lt;br /&gt;
&lt;br /&gt;
Filters must be called using Trigger(s) or similar mechanism to avoid having hard-coded modules in the Request handler. It is then easy to select, add, remove filters at run-time.&lt;br /&gt;
&lt;br /&gt;
==Database==&lt;br /&gt;
&lt;br /&gt;
* Must contain any SQL handling. Custom SQL in scripts is bad and shows lacks in the DB API. This must handle the usual operations required by the system such as data retrieval, modification etc and any DB optimisation (commonly known as hacks).&lt;br /&gt;
&lt;br /&gt;
* The default DB engine is likely to be MySQL/InnoDB with support for transactions.&lt;br /&gt;
&lt;br /&gt;
* The DB layer is &amp;quot;very&amp;quot; low-level and doesn't check security concerns (e.g. can the user modifies that object?). This must be handled by the above layer, usually DataObj and MetaField.&lt;br /&gt;
&lt;br /&gt;
TODO: an audit of the current DB code to remove un-needed/deprecated methods, to re-organise the required existing methods.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Data Representation==&lt;br /&gt;
&lt;br /&gt;
This defines properties for data objects (for example the &amp;quot;name&amp;quot; of a user) and offers a layer between the raw data (handled by Database) and the application/views using the data (e.g. CRUD, &amp;quot;the&amp;quot; UI, Export/Import plug-ins etc).&lt;br /&gt;
&lt;br /&gt;
Important: data objects and metadata fields do not know how to render themselves on a UI. This is one of the main design aspect of EPrints4 as to remove dependencies of the UI on the data model.&lt;br /&gt;
&lt;br /&gt;
===Metadata fields===&lt;br /&gt;
&lt;br /&gt;
* make sure the data is valid, according to the type's constraints. For instance, you cannot store a string into an integer&lt;br /&gt;
&lt;br /&gt;
* maps any higher level type (e.g. URL) to a low-level DB type (e.g. varchar)&lt;br /&gt;
&lt;br /&gt;
* must provide a clean and clear API to easily modify data (set_value, add_value etc)&lt;br /&gt;
&lt;br /&gt;
* the type &amp;quot;file&amp;quot; whilst not being a piece of metadata directly is nonetheless a valid field - it is the only type that links data to a stored file (rather than being purely DB data).&lt;br /&gt;
&lt;br /&gt;
* XML/SAX handlers are likely to be kept at the Meta-Field level (because this makes sense)&lt;br /&gt;
&lt;br /&gt;
* aspects such as indexing, generating order values are more likely to be included in the Search components (so via Xapian for instance)&lt;br /&gt;
&lt;br /&gt;
* review of the existing types is needed (40ish types at the moment) and non-core types must be removed (recaptcha, compound...)&lt;br /&gt;
&lt;br /&gt;
===Data set / Data objects===&lt;br /&gt;
&lt;br /&gt;
* DataSet/Objects are collections of metadata fields and offer an API for easily manipulating objects/data.&lt;br /&gt;
&lt;br /&gt;
* Dataset offers a number of properties to handle common fields/concepts in a consistent manner across different datasets. For instance the &amp;quot;lastmod&amp;quot; property which is an internal field always set to when the object was last modified or &amp;quot;history&amp;quot; which keeps track of the modifications of the object. Considered properties:&lt;br /&gt;
&lt;br /&gt;
** &amp;quot;states&amp;quot;: the graph of states for that object. Similar to &amp;quot;eprint_status&amp;quot; for &amp;quot;eprint&amp;quot; objects in EPrints2/3. Automates and generalises state transfer for objects.&lt;br /&gt;
&lt;br /&gt;
** &amp;quot;revision&amp;quot;: keep the revision number which is incremented each time that object is modified (default: ON)&lt;br /&gt;
&lt;br /&gt;
** &amp;quot;acl&amp;quot;: enables the ACL related fields and permission checking (TODO)&lt;br /&gt;
&lt;br /&gt;
** &amp;quot;cache&amp;quot;: enables the use of memcached (default: ON if globally enabled) - if enabled, keep a copy of data objects in memory rather than reading objects from DB.&lt;br /&gt;
&lt;br /&gt;
** &amp;quot;read-only&amp;quot;: makes that data-set read only and forbids any modification/deletion (default: OFF)&lt;br /&gt;
&lt;br /&gt;
** &amp;quot;history&amp;quot;: keeps an XML diff of the modifications made to that object. (TODO)&lt;br /&gt;
&lt;br /&gt;
** &amp;quot;lastmod&amp;quot;: keeps a last modified field&lt;br /&gt;
&lt;br /&gt;
** &amp;quot;datestamp&amp;quot;: the date at which the object was created&lt;br /&gt;
&lt;br /&gt;
* EPrints::DataObj now contains all required information so that custom datasets do not need to have their explicit implementation (EPrints::DataObj::Foo package)&lt;br /&gt;
&lt;br /&gt;
==Data retrieval and searching==&lt;br /&gt;
&lt;br /&gt;
I think there are two slightly different aspects of data retrieval:&lt;br /&gt;
&lt;br /&gt;
* an internal mechanism for retrieving data straight from the database, for instance:&lt;br /&gt;
&lt;br /&gt;
** all data objects belonging to a dataset&lt;br /&gt;
** all data objects owned by a user&lt;br /&gt;
** generally the retrieval of data objects based on an EXACT constraint or set of constraints.&lt;br /&gt;
&lt;br /&gt;
** possibility to order the data objects by a given meta field (i.e. a DB column).&lt;br /&gt;
&lt;br /&gt;
* a user search optimised for helping users to find content they're interested to. This will likely be done by Xapian. Because this concept can become difficult to implement, it is better to use a specialist tool such as Xapian to do it. Includes the following scenarios:&lt;br /&gt;
&lt;br /&gt;
** retrieval of all data objects belonging to a dataset (via the Xapian indexes which may be out-of-date or incomplete since objects are indexed by the indexer in a asynchronous manner)&lt;br /&gt;
** parsing complex user queries using e.g. boolean operators&lt;br /&gt;
&lt;br /&gt;
One question is how to label these two slightly different searching mechanism?&lt;br /&gt;
&lt;br /&gt;
===Internal Data retrieval===&lt;br /&gt;
&lt;br /&gt;
* Only supports EXACT matching or other SQL-derived tests and operators e.g. NOT NULL (aka is_set)&lt;br /&gt;
* Tightly linked to the concept of EPrints::List&lt;br /&gt;
* May be used on the UI to display lists of items owned by a user ETC but shouldn't be used in real user searches&lt;br /&gt;
&lt;br /&gt;
===User Searches===&lt;br /&gt;
&lt;br /&gt;
* Requires the creation and management of indexes (because it is the indexes which are searched)&lt;/div&gt;</summary>
		<author><name>Sf03r@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=EPrints4_Core_Roadmap&amp;diff=10890</id>
		<title>EPrints4 Core Roadmap</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=EPrints4_Core_Roadmap&amp;diff=10890"/>
		<updated>2014-02-06T15:47:22Z</updated>

		<summary type="html">&lt;p&gt;Sf03r@ecs.soton.ac.uk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=EPrints4 Core Development=&lt;br /&gt;
&lt;br /&gt;
Trying to divide the work into smaller tasks (and questions where relevant).&lt;br /&gt;
&lt;br /&gt;
==Request Handler / Page Controllers==&lt;br /&gt;
&lt;br /&gt;
This deals with how HTTP requests are handled by EPrints: when a request is made by a client (curl, browser..) a number of headers/parameters must be processed (e.g. Accept, Content-Type, EPrints' cookies, auth etc). This is the entry point of any web requests to the system. The main module is EPrints::Apache::Handler (formerly known as Apache::Rewrite).&lt;br /&gt;
&lt;br /&gt;
* Basic security aspects&lt;br /&gt;
** detect invalid requests/URL paths (e.g. containing a dot '.')&lt;br /&gt;
&lt;br /&gt;
* Low-level filters for processing of:&lt;br /&gt;
** Cookies (eprints_session, eprints_lang)&lt;br /&gt;
** URL encoding&lt;br /&gt;
** specific HTTP headers: Accept, Content-Type, Content-Length, Content-Range, Content-MD5 (?), ETag (?)&lt;br /&gt;
&lt;br /&gt;
* System initialisation:&lt;br /&gt;
** Repository object init (with language selection, via cookie/default lang)&lt;br /&gt;
** Protocol (HTTP, HTTPS?)&lt;br /&gt;
&lt;br /&gt;
* Low-level redirects or custom actions via Trigger&lt;br /&gt;
&lt;br /&gt;
* Call for Controller(s) to handle the request (e.g. CRUD if /id/..., UI, storage (file delivery) etc.) via Trigger&lt;br /&gt;
&lt;br /&gt;
* clean-up/post-processing if needed (e.g. setting Cache headers etc).&lt;br /&gt;
&lt;br /&gt;
==Security==&lt;br /&gt;
&lt;br /&gt;
Security (authentication and authorisation) must be handled by the Page Controller. They decide if auth is required at all (for instance a GET on an object via CRUD is usually allowed without auth). If auth may be required, the PerlAccessHandler stack must be defined.&lt;br /&gt;
&lt;br /&gt;
It is worth noting that authentication is likely to be common to most Page Controllers. The typical authentication mechanisms are: Basic Auth (via HTTP Header) and Cookie/Session-based Auth. Session-based is mostly handled internally (via LoginTicket) but the way the credentials are retrieved can be customised (CAS, LDAP...).&lt;br /&gt;
&lt;br /&gt;
Authorisation, on the other hand will be defined by the Page Controller. If the request is trying to modify an object, the Controller needs to check that the logged-in user has the appropriate rights/roles.&lt;br /&gt;
&lt;br /&gt;
Filters must be called using Trigger(s) or similar mechanism to avoid having hard-coded modules in the Request handler. It is then easy to select, add, remove filters at run-time.&lt;br /&gt;
&lt;br /&gt;
==Database==&lt;br /&gt;
&lt;br /&gt;
* Must contain any SQL handling. Custom SQL in scripts is bad and shows lacks in the DB API. This must handle the usual operations required by the system such as data retrieval, modification etc and any DB optimisation (commonly known as hacks).&lt;br /&gt;
&lt;br /&gt;
* The default DB engine is likely to be MySQL/InnoDB with support for transactions.&lt;br /&gt;
&lt;br /&gt;
* The DB layer is &amp;quot;very&amp;quot; low-level and doesn't check security concerns (e.g. can the user modifies that object?). This must be handled by the above layer, usually DataObj and MetaField.&lt;br /&gt;
&lt;br /&gt;
TODO: an audit of the current DB code to remove un-needed/deprecated methods, to re-organise the required existing methods.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Data Representation==&lt;br /&gt;
&lt;br /&gt;
This defines properties for data objects (for example the &amp;quot;name&amp;quot; of a user) and offers a layer between the raw data (handled by Database) and the application/views using the data (e.g. CRUD, &amp;quot;the&amp;quot; UI, Export/Import plug-ins etc).&lt;br /&gt;
&lt;br /&gt;
Important: data objects and metadata fields do not know how to render themselves on a UI. This is one of the main design aspect of EPrints4 as to remove dependencies of the UI on the data model.&lt;br /&gt;
&lt;br /&gt;
===Metadata fields===&lt;br /&gt;
&lt;br /&gt;
* make sure the data is valid, according to the type's constraints. For instance, you cannot store a string into an integer&lt;br /&gt;
&lt;br /&gt;
* maps any higher level type (e.g. URL) to a low-level DB type (e.g. varchar)&lt;br /&gt;
&lt;br /&gt;
* must provide a clean and clear API to easily modify data (set_value, add_value etc)&lt;br /&gt;
&lt;br /&gt;
* the type &amp;quot;file&amp;quot; whilst not being a piece of metadata directly is nonetheless a valid field - it is the only type that links data to a stored file (rather than being purely DB data).&lt;br /&gt;
&lt;br /&gt;
* XML/SAX handlers are likely to be kept at the Meta-Field level (because this makes sense)&lt;br /&gt;
&lt;br /&gt;
* aspects such as indexing, generating order values are more likely to be included in the Search components (so via Xapian for instance)&lt;br /&gt;
&lt;br /&gt;
* review of the existing types is needed (40ish types at the moment) and non-core types must be removed (recaptcha, compound...)&lt;br /&gt;
&lt;br /&gt;
===Data set / Data objects===&lt;br /&gt;
&lt;br /&gt;
* DataSet/Objects are collections of metadata fields and offer an API for easily manipulating objects/data.&lt;br /&gt;
&lt;br /&gt;
* Dataset offers a number of properties to handle common fields/concepts in a consistent manner across different datasets. For instance the &amp;quot;lastmod&amp;quot; property which is an internal field always set to when the object was last modified or &amp;quot;history&amp;quot; which keeps track of the modifications of the object. Considered properties:&lt;br /&gt;
&lt;br /&gt;
** &amp;quot;states&amp;quot;: the graph of states for that object. Similar to &amp;quot;eprint_status&amp;quot; for &amp;quot;eprint&amp;quot; objects in EPrints2/3. Automates and generalises state transfer for objects.&lt;br /&gt;
&lt;br /&gt;
** &amp;quot;revision&amp;quot;: keep the revision number which is incremented each time that object is modified (default: ON)&lt;br /&gt;
&lt;br /&gt;
** &amp;quot;acl&amp;quot;: enables the ACL related fields and permission checking (TODO)&lt;br /&gt;
&lt;br /&gt;
** &amp;quot;cache&amp;quot;: enables the use of memcached (default: ON if globally enabled) - if enabled, keep a copy of data objects in memory rather than reading objects from DB.&lt;br /&gt;
&lt;br /&gt;
** &amp;quot;read-only&amp;quot;: makes that data-set read only and forbids any modification/deletion (default: OFF)&lt;br /&gt;
&lt;br /&gt;
** &amp;quot;history&amp;quot;: keeps an XML diff of the modifications made to that object. (TODO)&lt;br /&gt;
&lt;br /&gt;
** &amp;quot;lastmod&amp;quot;: keeps a last modified field&lt;br /&gt;
&lt;br /&gt;
** &amp;quot;datestamp&amp;quot;: the date at which the object was created&lt;br /&gt;
&lt;br /&gt;
* EPrints::DataObj now contains all required information so that custom datasets do not need to have their explicit implementation (EPrints::DataObj::Foo package)&lt;br /&gt;
&lt;br /&gt;
==Data retrieval==&lt;/div&gt;</summary>
		<author><name>Sf03r@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=EPrints4_Core_Roadmap&amp;diff=10889</id>
		<title>EPrints4 Core Roadmap</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=EPrints4_Core_Roadmap&amp;diff=10889"/>
		<updated>2014-02-06T15:42:48Z</updated>

		<summary type="html">&lt;p&gt;Sf03r@ecs.soton.ac.uk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=EPrints4 Core Development=&lt;br /&gt;
&lt;br /&gt;
Trying to divide the work into smaller tasks (and questions where relevant).&lt;br /&gt;
&lt;br /&gt;
==Request Handler / Page Controllers==&lt;br /&gt;
&lt;br /&gt;
This deals with how HTTP requests are handled by EPrints: when a request is made by a client (curl, browser..) a number of headers/parameters must be processed (e.g. Accept, Content-Type, EPrints' cookies, auth etc). This is the entry point of any web requests to the system. The main module is EPrints::Apache::Handler (formerly known as Apache::Rewrite).&lt;br /&gt;
&lt;br /&gt;
* Basic security aspects&lt;br /&gt;
** detect invalid requests/URL paths (e.g. containing a dot '.')&lt;br /&gt;
&lt;br /&gt;
* Low-level filters for processing of:&lt;br /&gt;
** Cookies (eprints_session, eprints_lang)&lt;br /&gt;
** URL encoding&lt;br /&gt;
** specific HTTP headers: Accept, Content-Type, Content-Length, Content-Range, Content-MD5 (?), ETag (?)&lt;br /&gt;
&lt;br /&gt;
* System initialisation:&lt;br /&gt;
** Repository object init (with language selection, via cookie/default lang)&lt;br /&gt;
** Protocol (HTTP, HTTPS?)&lt;br /&gt;
&lt;br /&gt;
* Low-level redirects or custom actions via Trigger&lt;br /&gt;
&lt;br /&gt;
* Call for Controller(s) to handle the request (e.g. CRUD if /id/..., UI, storage (file delivery) etc.) via Trigger&lt;br /&gt;
&lt;br /&gt;
* clean-up/post-processing if needed (e.g. setting Cache headers etc).&lt;br /&gt;
&lt;br /&gt;
==Security==&lt;br /&gt;
&lt;br /&gt;
Security (authentication and authorisation) must be handled by the Page Controller. They decide if auth is required at all (for instance a GET on an object via CRUD is usually allowed without auth). If auth may be required, the PerlAccessHandler stack must be defined.&lt;br /&gt;
&lt;br /&gt;
It is worth noting that authentication is likely to be common to most Page Controllers. The typical authentication mechanisms are: Basic Auth (via HTTP Header) and Cookie/Session-based Auth. Session-based is mostly handled internally (via LoginTicket) but the way the credentials are retrieved can be customised (CAS, LDAP...).&lt;br /&gt;
&lt;br /&gt;
Authorisation, on the other hand will be defined by the Page Controller. If the request is trying to modify an object, the Controller needs to check that the logged-in user has the appropriate rights/roles.&lt;br /&gt;
&lt;br /&gt;
Filters must be called using Trigger(s) or similar mechanism to avoid having hard-coded modules in the Request handler. It is then easy to select, add, remove filters at run-time.&lt;br /&gt;
&lt;br /&gt;
==Database==&lt;br /&gt;
&lt;br /&gt;
* Must contain any SQL handling. Custom SQL in scripts is bad and shows lacks in the DB API. This must handle the usual operations required by the system such as data retrieval, modification etc and any DB optimisation (commonly known as hacks).&lt;br /&gt;
&lt;br /&gt;
* The default DB engine is likely to be MySQL/InnoDB with support for transactions.&lt;br /&gt;
&lt;br /&gt;
* The DB layer is &amp;quot;very&amp;quot; low-level and doesn't check security concerns (e.g. can the user modifies that object?). This must be handled by the above layer, usually DataObj and MetaField.&lt;br /&gt;
&lt;br /&gt;
TODO: an audit of the current DB code to remove un-needed/deprecated methods, to re-organise the required existing methods.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Data Representation==&lt;br /&gt;
&lt;br /&gt;
This defines properties for data objects (for example the &amp;quot;name&amp;quot; of a user) and offers a layer between the raw data (handled by Database) and the application/views using the data (e.g. CRUD, &amp;quot;the&amp;quot; UI, Export/Import plug-ins etc).&lt;br /&gt;
&lt;br /&gt;
Important: data objects and metadata fields do not know how to render themselves on a UI. This is one of the main design aspect of EPrints4 as to remove dependencies of the UI on the data model.&lt;br /&gt;
&lt;br /&gt;
===Metadata fields===&lt;br /&gt;
&lt;br /&gt;
* make sure the data is valid, according to the type's constraints. For instance, you cannot store a string into an integer&lt;br /&gt;
&lt;br /&gt;
* maps any higher level type (e.g. URL) to a low-level DB type (e.g. varchar)&lt;br /&gt;
&lt;br /&gt;
* must provide a clean and clear API to easily modify data (set_value, add_value etc)&lt;br /&gt;
&lt;br /&gt;
* the type &amp;quot;file&amp;quot; whilst not being a piece of metadata directly is nonetheless a valid field - it is the only type that links data to a stored file (rather than being purely DB data).&lt;br /&gt;
&lt;br /&gt;
* XML/SAX handlers are likely to be kept at the Meta-Field level (because this makes sense)&lt;br /&gt;
&lt;br /&gt;
* aspects such as indexing, generating order values are more likely to be included in the Search components (so via Xapian for instance)&lt;br /&gt;
&lt;br /&gt;
* review of the existing types is needed (40ish types at the moment) and non-core types must be removed (recaptcha, compound...)&lt;br /&gt;
&lt;br /&gt;
===Data set / Data objects===&lt;br /&gt;
&lt;br /&gt;
* DataSet/Objects are collections of metadata fields and offer an API for easily manipulating objects/data.&lt;br /&gt;
&lt;br /&gt;
* Dataset offers a number of properties to handle common fields/concepts in a consistent manner across different datasets. For instance the &amp;quot;lastmod&amp;quot; property which is an internal field always set to when the object was last modified or &amp;quot;history&amp;quot; which keeps track of the modifications of the object. Considered properties:&lt;br /&gt;
&lt;br /&gt;
** &amp;quot;states&amp;quot;: the graph of states for that object. Similar to &amp;quot;eprint_status&amp;quot; for &amp;quot;eprint&amp;quot; objects in EPrints2/3. Automates and generalises state transfer for objects.&lt;br /&gt;
&lt;br /&gt;
** &amp;quot;revision&amp;quot;: keep the revision number which is incremented each time that object is modified (default: ON)&lt;br /&gt;
&lt;br /&gt;
** &amp;quot;acl&amp;quot;: enables the ACL related fields and permission checking (TODO)&lt;br /&gt;
&lt;br /&gt;
** &amp;quot;cache&amp;quot;: enables the use of memcached (default: ON if globally enabled) - if enabled, keep a copy of data objects in memory rather than reading objects from DB.&lt;br /&gt;
&lt;br /&gt;
** &amp;quot;read-only&amp;quot;: makes that data-set read only and forbids any modification/deletion (default: OFF)&lt;br /&gt;
&lt;br /&gt;
** &amp;quot;history&amp;quot;: keeps an XML diff of the modifications made to that object. (TODO)&lt;br /&gt;
&lt;br /&gt;
** &amp;quot;lastmod&amp;quot;: keeps a last modified field&lt;br /&gt;
&lt;br /&gt;
** &amp;quot;datestamp&amp;quot;: the date at which the object was created&lt;br /&gt;
&lt;br /&gt;
* EPrints::DataObj now contains all required information so that custom datasets do not need to have their explicit implementation (EPrints::DataObj::Foo package)&lt;/div&gt;</summary>
		<author><name>Sf03r@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=EPrints4_Core_Roadmap&amp;diff=10888</id>
		<title>EPrints4 Core Roadmap</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=EPrints4_Core_Roadmap&amp;diff=10888"/>
		<updated>2014-02-06T14:54:34Z</updated>

		<summary type="html">&lt;p&gt;Sf03r@ecs.soton.ac.uk: /* EPrints4 Core Development */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=EPrints4 Core Development=&lt;br /&gt;
&lt;br /&gt;
Trying to divide the work into smaller tasks (and questions where relevant).&lt;br /&gt;
&lt;br /&gt;
==Request Handler / Page Controllers==&lt;br /&gt;
&lt;br /&gt;
This deals with how HTTP requests are handled by EPrints: when a request is made by a client (curl, browser..) a number of headers/parameters must be processed (e.g. Accept, Content-Type, EPrints' cookies, auth etc). This is the entry point of any web requests to the system. The main module is EPrints::Apache::Handler (formerly known as Apache::Rewrite).&lt;br /&gt;
&lt;br /&gt;
* Basic security aspects&lt;br /&gt;
** detect invalid requests/URL paths (e.g. containing a dot '.')&lt;br /&gt;
&lt;br /&gt;
* Low-level filters for processing of:&lt;br /&gt;
** Cookies (eprints_session, eprints_lang)&lt;br /&gt;
** URL encoding&lt;br /&gt;
** specific HTTP headers: Accept, Content-Type, Content-Length, Content-Range, Content-MD5 (?), ETag (?)&lt;br /&gt;
&lt;br /&gt;
* System initialisation:&lt;br /&gt;
** Repository object init (with language selection, via cookie/default lang)&lt;br /&gt;
** Protocol (HTTP, HTTPS?)&lt;br /&gt;
&lt;br /&gt;
* Low-level redirects or custom actions via Trigger&lt;br /&gt;
&lt;br /&gt;
* Call for Controller(s) to handle the request (e.g. CRUD if /id/..., UI, storage (file delivery) etc.) via Trigger&lt;br /&gt;
&lt;br /&gt;
* clean-up/post-processing if needed (e.g. setting Cache headers etc).&lt;br /&gt;
&lt;br /&gt;
==Security==&lt;br /&gt;
&lt;br /&gt;
Security (authentication and authorisation) must be handled by the Page Controller. They decide if auth is required at all (for instance a GET on an object via CRUD is usually allowed without auth). If auth may be required, the PerlAccessHandler stack must be defined.&lt;br /&gt;
&lt;br /&gt;
It is worth noting that authentication is likely to be common to most Page Controllers. The typical authentication mechanisms are: Basic Auth (via HTTP Header) and Cookie/Session-based Auth. Session-based is mostly handled internally (via LoginTicket) but the way the credentials are retrieved can be customised (CAS, LDAP...).&lt;br /&gt;
&lt;br /&gt;
Authorisation, on the other hand will be defined by the Page Controller. If the request is trying to modify an object, the Controller needs to check that the logged-in user has the appropriate rights/roles.&lt;br /&gt;
&lt;br /&gt;
Filters must be called using Trigger(s) or similar mechanism to avoid having hard-coded modules in the Request handler. It is then easy to select, add, remove filters at run-time.&lt;/div&gt;</summary>
		<author><name>Sf03r@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=EPrints4_Core_Roadmap&amp;diff=10887</id>
		<title>EPrints4 Core Roadmap</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=EPrints4_Core_Roadmap&amp;diff=10887"/>
		<updated>2014-02-06T14:45:50Z</updated>

		<summary type="html">&lt;p&gt;Sf03r@ecs.soton.ac.uk: /* Request Handler / Page Controllers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=EPrints4 Core Development=&lt;br /&gt;
&lt;br /&gt;
Trying to divide the work into smaller tasks (and questions where relevant).&lt;br /&gt;
&lt;br /&gt;
==Request Handler / Page Controllers==&lt;br /&gt;
&lt;br /&gt;
This deals with how HTTP requests are handled by EPrints: when a request is made by a client (curl, browser..) a number of headers/parameters must be processed (e.g. Accept, Content-Type, EPrints' cookies, auth etc). This is the entry point of any web requests to the system. The main module is EPrints::Apache::Handler (formerly known as Apache::Rewrite).&lt;br /&gt;
&lt;br /&gt;
* Basic security aspects&lt;br /&gt;
** detect invalid requests/URL paths (e.g. containing a dot '.')&lt;br /&gt;
&lt;br /&gt;
* Low-level filters for processing of:&lt;br /&gt;
** Cookies (eprints_session, eprints_lang)&lt;br /&gt;
** URL encoding&lt;br /&gt;
** specific HTTP headers: Accept, Content-Type, Content-Length, Content-Range, Content-MD5 (?), ETag (?)&lt;br /&gt;
&lt;br /&gt;
* System initialisation:&lt;br /&gt;
** Repository object init (with language selection, via cookie/default lang)&lt;br /&gt;
** Protocol (HTTP, HTTPS?)&lt;br /&gt;
&lt;br /&gt;
* Low-level redirects or custom actions via Trigger&lt;br /&gt;
&lt;br /&gt;
* Call for Controller(s) to handle the request (e.g. CRUD if /id/..., UI, storage (file delivery) etc.)&lt;br /&gt;
&lt;br /&gt;
Filters must be called using Trigger(s) or similar mechanism to avoid having hard-coded modules in the Request handler. It is then easy to select, add, remove filters at run-time.&lt;/div&gt;</summary>
		<author><name>Sf03r@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=EPrints4_Core_Roadmap&amp;diff=10886</id>
		<title>EPrints4 Core Roadmap</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=EPrints4_Core_Roadmap&amp;diff=10886"/>
		<updated>2014-02-06T14:39:42Z</updated>

		<summary type="html">&lt;p&gt;Sf03r@ecs.soton.ac.uk: Created page with '=EPrints4 Core Development=  Trying to divide the work into smaller tasks (and questions where relevant).  ==Request Handler / Page Controllers==  This deals with how HTTP reques…'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=EPrints4 Core Development=&lt;br /&gt;
&lt;br /&gt;
Trying to divide the work into smaller tasks (and questions where relevant).&lt;br /&gt;
&lt;br /&gt;
==Request Handler / Page Controllers==&lt;br /&gt;
&lt;br /&gt;
This deals with how HTTP requests are handled by EPrints: when a request is made by a client (curl, browser..) a number of headers/parameters must be processed (e.g. Accept, Content-Type, EPrints' cookies, auth etc). This is the entry point of any web requests to the system. The main module is EPrints::Apache::Handler (formerly known as Apache::Rewrite).&lt;br /&gt;
&lt;br /&gt;
* Low-level filters for processing of:&lt;br /&gt;
** Cookies (eprints_session, eprints_lang)&lt;br /&gt;
** URL encoding&lt;br /&gt;
** specific HTTP headers: Accept, Content-Type, Content-Length, Content-Range, Content-MD5 (?), ETag (?)&lt;br /&gt;
&lt;br /&gt;
* System initialisation:&lt;br /&gt;
** Repository object init (with language selection, via cookie/default lang)&lt;br /&gt;
** Protocol (HTTP, HTTPS?)&lt;br /&gt;
&lt;br /&gt;
* Basic security aspects&lt;br /&gt;
** detect invalid requests/URL paths (e.g. containing a dot '.')&lt;br /&gt;
&lt;br /&gt;
* Low-level redirects or custom actions via Trigger&lt;br /&gt;
&lt;br /&gt;
* Call for Controller(s) to handle the request (e.g. CRUD if /id/..., UI, storage (file delivery) etc.)&lt;/div&gt;</summary>
		<author><name>Sf03r@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=EPrints4_Roadmap&amp;diff=10883</id>
		<title>EPrints4 Roadmap</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=EPrints4_Roadmap&amp;diff=10883"/>
		<updated>2013-11-18T16:37:44Z</updated>

		<summary type="html">&lt;p&gt;Sf03r@ecs.soton.ac.uk: /* UI elements */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Some general ideas for the development of the next major release of EPrints.&lt;br /&gt;
&lt;br /&gt;
==Main Objectives==&lt;br /&gt;
&lt;br /&gt;
* Separation of the Core API and UI (/rendering) components - that mainly means that core objects (Repository, MetaField*, DataObj*) won't have any render_* method. this could also imply that the core or the UI could be upgraded separately. It would also make re-use of the eprints core easy for other purposes (e.g. data repository, OER etc.)&lt;br /&gt;
&lt;br /&gt;
* Remove the spaghetti code (esp (1) rendering methods (2) Dataobj-Metafield relations)&lt;br /&gt;
&lt;br /&gt;
* Drop support for internal search in favour of specialist tools such as Xapian or Solr - we might however need to keep some aspects of the internal search (cf List/data retrieval) for exact matching - perhaps that's more a (SQL) &amp;quot;QueryBuilder&amp;quot; than a (user) search.&lt;br /&gt;
&lt;br /&gt;
* Drop support for Windows?&lt;br /&gt;
&lt;br /&gt;
* Implement object locking at the core level (for any objects, perhaps without using database fields at all)&lt;br /&gt;
&lt;br /&gt;
* Implement object state at the core level (at the moment EPrint object might be in one of 4 states: inbox, buffer, archive, deletion via the field eprint_status)&lt;br /&gt;
&lt;br /&gt;
* code normalisation:&lt;br /&gt;
** use new class name (e.g. EPrints::Session =&amp;gt; EPrints::Repository)&lt;br /&gt;
** use &amp;quot;new way&amp;quot; of doing things (e.g. EPrints::Dataobj::X-&amp;gt;new(12) =&amp;gt; repo-&amp;gt;dataset( 'x' )-&amp;gt;dataobj(12))&lt;br /&gt;
** remove v2.x features deprecated in v3+ (cf. EPrints::BackCompatibility)&lt;br /&gt;
&lt;br /&gt;
* define clear API for core functions (e.g. Database, object handling) and for UI purposes. The API must present a unique way of doing something.&lt;br /&gt;
&lt;br /&gt;
* It might be worth separating the code into 3 packages to ease the development: eprints4-core, eprints4-ir and eprints4-ir-ui.&lt;br /&gt;
&lt;br /&gt;
==Core==&lt;br /&gt;
&lt;br /&gt;
* Revisit Apache request Handler aka Apache::Rewrite (lots of hard-coded paths, many obsolete paths) - URL handling should be done by Controllers called/prioritised via a trigger. &amp;lt;TESTED OK&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Remove EPrints::Session from anywhere in favour of EPrints::Repository&lt;br /&gt;
&lt;br /&gt;
* Test using memcached (http://code.google.com/p/memcached/) - Cache::Memcached::Fast to cache data objects, perhaps could work to cache XML fragments too. &amp;lt;TESTED OK&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Use Multipart rather than Compound - Compound creates 1 table per subfield whilst Multipart creates 1 column per subfield. &amp;lt;TESTED OK&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Finer grain permissions (using User, Groups, perhaps ACL concepts) - also security should be handled at the core level not at the UI level&lt;br /&gt;
&lt;br /&gt;
* Core should be able to run without IR extensions nor UI elements (might require to extend the SWORD layer for interactions with the core) &amp;lt;TESTED OK&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Built-in locking mechanisms for objects (improved edit_lock)&lt;br /&gt;
&lt;br /&gt;
* No hard-coded exceptions for IR extensions (e.g. eprint_status hard-coded in places)&lt;br /&gt;
&lt;br /&gt;
* Generalise concept of &amp;quot;files&amp;quot; to allow the storage of arbitrary files against any data objects (e.g. a profile picture for a User)&lt;br /&gt;
&lt;br /&gt;
* (coding-style) don't use objects via hash-value directly e.g. my $repo = $object-&amp;gt;{repository} - use method instead: my $repo = $object-&amp;gt;repository.&lt;br /&gt;
&lt;br /&gt;
* Metafield/DataObj::set_value should re-enforce the database type - i.e. $object-&amp;gt;set_value( 'int_field', 'abc' )should fail at the Application layer - not silently at the DB layer as it currently happens. Same goes with any field type (e.g. -&amp;gt;set_value( 'set_field', 'invalid_set_value' ) should fail). &amp;lt;TESTED OK&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Extra dataset properties to allow global, consistent behaviour. Considered: &amp;quot;states&amp;quot;, &amp;quot;revision&amp;quot; (TESTED OK), &amp;quot;lastmod&amp;quot; (TESTED OK), &amp;quot;read-only&amp;quot; (TESTED OK), &amp;quot;cache&amp;quot; (i.e. use memcached), &amp;quot;history&amp;quot; (keep revision history, implies revision=true), &amp;quot;datestamp&amp;quot;, &amp;quot;acl&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Extensions for IR-type of Repositories==&lt;br /&gt;
&lt;br /&gt;
* Authors/names stored in a separate dataset - should help integrate with various UID systems like OrcID.&lt;br /&gt;
&lt;br /&gt;
* Extra metadata to describe a User - cf. MePrints.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==UI elements==&lt;br /&gt;
&lt;br /&gt;
* jQuery over Prototype&lt;br /&gt;
&lt;br /&gt;
* jQueryUI widgets used to render fields &lt;br /&gt;
&lt;br /&gt;
* Javascript/Ajax concepts built-in&lt;br /&gt;
&lt;br /&gt;
* CSS3 Responsive design to support small screens (mobile, tablets etc) - http://alistapart.com/article/responsive-web-design&lt;br /&gt;
&lt;br /&gt;
* Consider http://getbootstrap.com/javascript/ -  http://getbootstrap.com/components/&lt;br /&gt;
&lt;br /&gt;
==Misc==&lt;br /&gt;
&lt;br /&gt;
* an internal messaging system would be nice (similar to the current Message data object but with more options) - this would help system/user and user/user interactions. A logged-in user could then see messages and act accordingly. For instance: publication just went live, items have been imported from remote sources, user commented on a resource etc.&lt;/div&gt;</summary>
		<author><name>Sf03r@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=EPrints4_Roadmap&amp;diff=10882</id>
		<title>EPrints4 Roadmap</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=EPrints4_Roadmap&amp;diff=10882"/>
		<updated>2013-11-18T16:15:31Z</updated>

		<summary type="html">&lt;p&gt;Sf03r@ecs.soton.ac.uk: /* Core */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Some general ideas for the development of the next major release of EPrints.&lt;br /&gt;
&lt;br /&gt;
==Main Objectives==&lt;br /&gt;
&lt;br /&gt;
* Separation of the Core API and UI (/rendering) components - that mainly means that core objects (Repository, MetaField*, DataObj*) won't have any render_* method. this could also imply that the core or the UI could be upgraded separately. It would also make re-use of the eprints core easy for other purposes (e.g. data repository, OER etc.)&lt;br /&gt;
&lt;br /&gt;
* Remove the spaghetti code (esp (1) rendering methods (2) Dataobj-Metafield relations)&lt;br /&gt;
&lt;br /&gt;
* Drop support for internal search in favour of specialist tools such as Xapian or Solr - we might however need to keep some aspects of the internal search (cf List/data retrieval) for exact matching - perhaps that's more a (SQL) &amp;quot;QueryBuilder&amp;quot; than a (user) search.&lt;br /&gt;
&lt;br /&gt;
* Drop support for Windows?&lt;br /&gt;
&lt;br /&gt;
* Implement object locking at the core level (for any objects, perhaps without using database fields at all)&lt;br /&gt;
&lt;br /&gt;
* Implement object state at the core level (at the moment EPrint object might be in one of 4 states: inbox, buffer, archive, deletion via the field eprint_status)&lt;br /&gt;
&lt;br /&gt;
* code normalisation:&lt;br /&gt;
** use new class name (e.g. EPrints::Session =&amp;gt; EPrints::Repository)&lt;br /&gt;
** use &amp;quot;new way&amp;quot; of doing things (e.g. EPrints::Dataobj::X-&amp;gt;new(12) =&amp;gt; repo-&amp;gt;dataset( 'x' )-&amp;gt;dataobj(12))&lt;br /&gt;
** remove v2.x features deprecated in v3+ (cf. EPrints::BackCompatibility)&lt;br /&gt;
&lt;br /&gt;
* define clear API for core functions (e.g. Database, object handling) and for UI purposes. The API must present a unique way of doing something.&lt;br /&gt;
&lt;br /&gt;
* It might be worth separating the code into 3 packages to ease the development: eprints4-core, eprints4-ir and eprints4-ir-ui.&lt;br /&gt;
&lt;br /&gt;
==Core==&lt;br /&gt;
&lt;br /&gt;
* Revisit Apache request Handler aka Apache::Rewrite (lots of hard-coded paths, many obsolete paths) - URL handling should be done by Controllers called/prioritised via a trigger. &amp;lt;TESTED OK&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Remove EPrints::Session from anywhere in favour of EPrints::Repository&lt;br /&gt;
&lt;br /&gt;
* Test using memcached (http://code.google.com/p/memcached/) - Cache::Memcached::Fast to cache data objects, perhaps could work to cache XML fragments too. &amp;lt;TESTED OK&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Use Multipart rather than Compound - Compound creates 1 table per subfield whilst Multipart creates 1 column per subfield. &amp;lt;TESTED OK&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Finer grain permissions (using User, Groups, perhaps ACL concepts) - also security should be handled at the core level not at the UI level&lt;br /&gt;
&lt;br /&gt;
* Core should be able to run without IR extensions nor UI elements (might require to extend the SWORD layer for interactions with the core) &amp;lt;TESTED OK&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Built-in locking mechanisms for objects (improved edit_lock)&lt;br /&gt;
&lt;br /&gt;
* No hard-coded exceptions for IR extensions (e.g. eprint_status hard-coded in places)&lt;br /&gt;
&lt;br /&gt;
* Generalise concept of &amp;quot;files&amp;quot; to allow the storage of arbitrary files against any data objects (e.g. a profile picture for a User)&lt;br /&gt;
&lt;br /&gt;
* (coding-style) don't use objects via hash-value directly e.g. my $repo = $object-&amp;gt;{repository} - use method instead: my $repo = $object-&amp;gt;repository.&lt;br /&gt;
&lt;br /&gt;
* Metafield/DataObj::set_value should re-enforce the database type - i.e. $object-&amp;gt;set_value( 'int_field', 'abc' )should fail at the Application layer - not silently at the DB layer as it currently happens. Same goes with any field type (e.g. -&amp;gt;set_value( 'set_field', 'invalid_set_value' ) should fail). &amp;lt;TESTED OK&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Extra dataset properties to allow global, consistent behaviour. Considered: &amp;quot;states&amp;quot;, &amp;quot;revision&amp;quot; (TESTED OK), &amp;quot;lastmod&amp;quot; (TESTED OK), &amp;quot;read-only&amp;quot; (TESTED OK), &amp;quot;cache&amp;quot; (i.e. use memcached), &amp;quot;history&amp;quot; (keep revision history, implies revision=true), &amp;quot;datestamp&amp;quot;, &amp;quot;acl&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Extensions for IR-type of Repositories==&lt;br /&gt;
&lt;br /&gt;
* Authors/names stored in a separate dataset - should help integrate with various UID systems like OrcID.&lt;br /&gt;
&lt;br /&gt;
* Extra metadata to describe a User - cf. MePrints.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==UI elements==&lt;br /&gt;
&lt;br /&gt;
* jQuery over Prototype&lt;br /&gt;
&lt;br /&gt;
* jQueryUI widgets used to render fields &lt;br /&gt;
&lt;br /&gt;
* Javascript/Ajax concepts built-in&lt;br /&gt;
&lt;br /&gt;
* CSS3 Responsive design to support small screens (mobile, tablets etc) - http://alistapart.com/article/responsive-web-design&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Misc==&lt;br /&gt;
&lt;br /&gt;
* an internal messaging system would be nice (similar to the current Message data object but with more options) - this would help system/user and user/user interactions. A logged-in user could then see messages and act accordingly. For instance: publication just went live, items have been imported from remote sources, user commented on a resource etc.&lt;/div&gt;</summary>
		<author><name>Sf03r@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=EPrints4_Roadmap&amp;diff=10880</id>
		<title>EPrints4 Roadmap</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=EPrints4_Roadmap&amp;diff=10880"/>
		<updated>2013-11-13T17:14:34Z</updated>

		<summary type="html">&lt;p&gt;Sf03r@ecs.soton.ac.uk: /* Core */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Some general ideas for the development of the next major release of EPrints.&lt;br /&gt;
&lt;br /&gt;
==Main Objectives==&lt;br /&gt;
&lt;br /&gt;
* Separation of the Core API and UI (/rendering) components - that mainly means that core objects (Repository, MetaField*, DataObj*) won't have any render_* method. this could also imply that the core or the UI could be upgraded separately. It would also make re-use of the eprints core easy for other purposes (e.g. data repository, OER etc.)&lt;br /&gt;
&lt;br /&gt;
* Remove the spaghetti code (esp (1) rendering methods (2) Dataobj-Metafield relations)&lt;br /&gt;
&lt;br /&gt;
* Drop support for internal search in favour of specialist tools such as Xapian or Solr - we might however need to keep some aspects of the internal search (cf List/data retrieval) for exact matching - perhaps that's more a (SQL) &amp;quot;QueryBuilder&amp;quot; than a (user) search.&lt;br /&gt;
&lt;br /&gt;
* Drop support for Windows?&lt;br /&gt;
&lt;br /&gt;
* Implement object locking at the core level (for any objects, perhaps without using database fields at all)&lt;br /&gt;
&lt;br /&gt;
* Implement object state at the core level (at the moment EPrint object might be in one of 4 states: inbox, buffer, archive, deletion via the field eprint_status)&lt;br /&gt;
&lt;br /&gt;
* code normalisation:&lt;br /&gt;
** use new class name (e.g. EPrints::Session =&amp;gt; EPrints::Repository)&lt;br /&gt;
** use &amp;quot;new way&amp;quot; of doing things (e.g. EPrints::Dataobj::X-&amp;gt;new(12) =&amp;gt; repo-&amp;gt;dataset( 'x' )-&amp;gt;dataobj(12))&lt;br /&gt;
** remove v2.x features deprecated in v3+ (cf. EPrints::BackCompatibility)&lt;br /&gt;
&lt;br /&gt;
* define clear API for core functions (e.g. Database, object handling) and for UI purposes. The API must present a unique way of doing something.&lt;br /&gt;
&lt;br /&gt;
* It might be worth separating the code into 3 packages to ease the development: eprints4-core, eprints4-ir and eprints4-ir-ui.&lt;br /&gt;
&lt;br /&gt;
==Core==&lt;br /&gt;
&lt;br /&gt;
* Revisit Apache request Handler aka Apache::Rewrite (lots of hard-coded paths, many obsolete paths) - URL handling should be done by Controllers called/prioritised via a trigger. &amp;lt;TESTED OK&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Remove EPrints::Session from anywhere in favour of EPrints::Repository&lt;br /&gt;
&lt;br /&gt;
* Test using memcached (http://code.google.com/p/memcached/) - Cache::Memcached::Fast to cache data objects, perhaps could work to cache XML fragments too. &amp;lt;TESTED OK&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Use Multipart rather than Compound - Compound creates 1 table per subfield whilst Multipart creates 1 column per subfield. &amp;lt;TESTED OK&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Finer grain permissions (using User, Groups, perhaps ACL concepts) - also security should be handled at the core level not at the UI level&lt;br /&gt;
&lt;br /&gt;
* Core should be able to run without IR extensions nor UI elements (might require to extend the SWORD layer for interactions with the core) &amp;lt;TESTED OK&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Built-in locking mechanisms for objects (improved edit_lock)&lt;br /&gt;
&lt;br /&gt;
* No hard-coded exceptions for IR extensions (e.g. eprint_status hard-coded in places)&lt;br /&gt;
&lt;br /&gt;
* Generalise concept of &amp;quot;files&amp;quot; to allow the storage of arbitrary files against any data objects (e.g. a profile picture for a User)&lt;br /&gt;
&lt;br /&gt;
* (coding-style) don't use objects via hash-value directly e.g. my $repo = $object-&amp;gt;{repository} - use method instead: my $repo = $object-&amp;gt;repository.&lt;br /&gt;
&lt;br /&gt;
==Extensions for IR-type of Repositories==&lt;br /&gt;
&lt;br /&gt;
* Authors/names stored in a separate dataset - should help integrate with various UID systems like OrcID.&lt;br /&gt;
&lt;br /&gt;
* Extra metadata to describe a User - cf. MePrints.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==UI elements==&lt;br /&gt;
&lt;br /&gt;
* jQuery over Prototype&lt;br /&gt;
&lt;br /&gt;
* jQueryUI widgets used to render fields &lt;br /&gt;
&lt;br /&gt;
* Javascript/Ajax concepts built-in&lt;br /&gt;
&lt;br /&gt;
* CSS3 Responsive design to support small screens (mobile, tablets etc) - http://alistapart.com/article/responsive-web-design&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Misc==&lt;br /&gt;
&lt;br /&gt;
* an internal messaging system would be nice (similar to the current Message data object but with more options) - this would help system/user and user/user interactions. A logged-in user could then see messages and act accordingly. For instance: publication just went live, items have been imported from remote sources, user commented on a resource etc.&lt;/div&gt;</summary>
		<author><name>Sf03r@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=EPrints4_Roadmap&amp;diff=10876</id>
		<title>EPrints4 Roadmap</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=EPrints4_Roadmap&amp;diff=10876"/>
		<updated>2013-11-06T14:15:24Z</updated>

		<summary type="html">&lt;p&gt;Sf03r@ecs.soton.ac.uk: /* Core */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Some general ideas for the development of the next major release of EPrints.&lt;br /&gt;
&lt;br /&gt;
==Main Objectives==&lt;br /&gt;
&lt;br /&gt;
* Separation of the Core API and UI (/rendering) components - that mainly means that core objects (Repository, MetaField*, DataObj*) won't have any render_* method. this could also imply that the core or the UI could be upgraded separately. It would also make re-use of the eprints core easy for other purposes (e.g. data repository, OER etc.)&lt;br /&gt;
&lt;br /&gt;
* Remove the spaghetti code (esp (1) rendering methods (2) Dataobj-Metafield relations)&lt;br /&gt;
&lt;br /&gt;
* Drop support for internal search in favour of specialist tools such as Xapian or Solr - we might however need to keep some aspects of the internal search (cf List/data retrieval) for exact matching - perhaps that's more a (SQL) &amp;quot;QueryBuilder&amp;quot; than a (user) search.&lt;br /&gt;
&lt;br /&gt;
* Drop support for Windows?&lt;br /&gt;
&lt;br /&gt;
* Implement object locking at the core level (for any objects, perhaps without using database fields at all)&lt;br /&gt;
&lt;br /&gt;
* Implement object state at the core level (at the moment EPrint object might be in one of 4 states: inbox, buffer, archive, deletion via the field eprint_status)&lt;br /&gt;
&lt;br /&gt;
* code normalisation:&lt;br /&gt;
** use new class name (e.g. EPrints::Session =&amp;gt; EPrints::Repository)&lt;br /&gt;
** use &amp;quot;new way&amp;quot; of doing things (e.g. EPrints::Dataobj::X-&amp;gt;new(12) =&amp;gt; repo-&amp;gt;dataset( 'x' )-&amp;gt;dataobj(12))&lt;br /&gt;
** remove v2.x features deprecated in v3+ (cf. EPrints::BackCompatibility)&lt;br /&gt;
&lt;br /&gt;
* define clear API for core functions (e.g. Database, object handling) and for UI purposes. The API must present a unique way of doing something.&lt;br /&gt;
&lt;br /&gt;
* It might be worth separating the code into 3 packages to ease the development: eprints4-core, eprints4-ir and eprints4-ir-ui.&lt;br /&gt;
&lt;br /&gt;
==Core==&lt;br /&gt;
&lt;br /&gt;
* Revisit Apache request Handler aka Apache::Rewrite (lots of hard-coded paths, many obsolete paths) - URL handling should be done by Controllers called/prioritised via a trigger.&lt;br /&gt;
&lt;br /&gt;
* Remove EPrints::Session from anywhere in favour of EPrints::Repository&lt;br /&gt;
&lt;br /&gt;
* Test using memcached (http://code.google.com/p/memcached/) - Cache::Memcached::Fast to cache data objects, perhaps could work to cache XML fragments too.&lt;br /&gt;
&lt;br /&gt;
* Use Multipart rather than Compound - Compound creates 1 table per subfield whilst Multipart creates 1 column per subfield.&lt;br /&gt;
&lt;br /&gt;
* Finer grain permissions (using User, Groups, perhaps ACL concepts) - also security should be handled at the core level not at the UI level&lt;br /&gt;
&lt;br /&gt;
* Core should be able to run without IR extensions nor UI elements (might require to extend the SWORD layer for interactions with the core)&lt;br /&gt;
&lt;br /&gt;
* Built-in locking mechanisms for objects (improved edit_lock)&lt;br /&gt;
&lt;br /&gt;
* No hard-coded exceptions for IR extensions (e.g. eprint_status hard-coded in places)&lt;br /&gt;
&lt;br /&gt;
* Generalise concept of &amp;quot;files&amp;quot; to allow the storage of arbitrary files against any data objects (e.g. a profile picture for a User)&lt;br /&gt;
&lt;br /&gt;
* (coding-style) don't use objects via hash-value directly e.g. my $repo = $object-&amp;gt;{repository} - use method instead: my $repo = $object-&amp;gt;repository.&lt;br /&gt;
&lt;br /&gt;
==Extensions for IR-type of Repositories==&lt;br /&gt;
&lt;br /&gt;
* Authors/names stored in a separate dataset - should help integrate with various UID systems like OrcID.&lt;br /&gt;
&lt;br /&gt;
* Extra metadata to describe a User - cf. MePrints.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==UI elements==&lt;br /&gt;
&lt;br /&gt;
* jQuery over Prototype&lt;br /&gt;
&lt;br /&gt;
* jQueryUI widgets used to render fields &lt;br /&gt;
&lt;br /&gt;
* Javascript/Ajax concepts built-in&lt;br /&gt;
&lt;br /&gt;
* CSS3 Responsive design to support small screens (mobile, tablets etc) - http://alistapart.com/article/responsive-web-design&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Misc==&lt;br /&gt;
&lt;br /&gt;
* an internal messaging system would be nice (similar to the current Message data object but with more options) - this would help system/user and user/user interactions. A logged-in user could then see messages and act accordingly. For instance: publication just went live, items have been imported from remote sources, user commented on a resource etc.&lt;/div&gt;</summary>
		<author><name>Sf03r@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=EPrints4_Roadmap&amp;diff=10875</id>
		<title>EPrints4 Roadmap</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=EPrints4_Roadmap&amp;diff=10875"/>
		<updated>2013-11-06T14:09:00Z</updated>

		<summary type="html">&lt;p&gt;Sf03r@ecs.soton.ac.uk: /* Core */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Some general ideas for the development of the next major release of EPrints.&lt;br /&gt;
&lt;br /&gt;
==Main Objectives==&lt;br /&gt;
&lt;br /&gt;
* Separation of the Core API and UI (/rendering) components - that mainly means that core objects (Repository, MetaField*, DataObj*) won't have any render_* method. this could also imply that the core or the UI could be upgraded separately. It would also make re-use of the eprints core easy for other purposes (e.g. data repository, OER etc.)&lt;br /&gt;
&lt;br /&gt;
* Remove the spaghetti code (esp (1) rendering methods (2) Dataobj-Metafield relations)&lt;br /&gt;
&lt;br /&gt;
* Drop support for internal search in favour of specialist tools such as Xapian or Solr - we might however need to keep some aspects of the internal search (cf List/data retrieval) for exact matching - perhaps that's more a (SQL) &amp;quot;QueryBuilder&amp;quot; than a (user) search.&lt;br /&gt;
&lt;br /&gt;
* Drop support for Windows?&lt;br /&gt;
&lt;br /&gt;
* Implement object locking at the core level (for any objects, perhaps without using database fields at all)&lt;br /&gt;
&lt;br /&gt;
* Implement object state at the core level (at the moment EPrint object might be in one of 4 states: inbox, buffer, archive, deletion via the field eprint_status)&lt;br /&gt;
&lt;br /&gt;
* code normalisation:&lt;br /&gt;
** use new class name (e.g. EPrints::Session =&amp;gt; EPrints::Repository)&lt;br /&gt;
** use &amp;quot;new way&amp;quot; of doing things (e.g. EPrints::Dataobj::X-&amp;gt;new(12) =&amp;gt; repo-&amp;gt;dataset( 'x' )-&amp;gt;dataobj(12))&lt;br /&gt;
** remove v2.x features deprecated in v3+ (cf. EPrints::BackCompatibility)&lt;br /&gt;
&lt;br /&gt;
* define clear API for core functions (e.g. Database, object handling) and for UI purposes. The API must present a unique way of doing something.&lt;br /&gt;
&lt;br /&gt;
* It might be worth separating the code into 3 packages to ease the development: eprints4-core, eprints4-ir and eprints4-ir-ui.&lt;br /&gt;
&lt;br /&gt;
==Core==&lt;br /&gt;
&lt;br /&gt;
* Revisit Apache request Handler aka Apache::Rewrite (lots of hard-coded paths, many obsolete paths) - URL handling should be done by Controllers called/prioritised via a trigger.&lt;br /&gt;
&lt;br /&gt;
* Remove EPrints::Session from anywhere in favour of EPrints::Repository&lt;br /&gt;
&lt;br /&gt;
* Test using memcached (http://code.google.com/p/memcached/) - Cache::Memcached::Fast to cache data objects, perhaps could work to cache XML fragments too.&lt;br /&gt;
&lt;br /&gt;
* Use Multipart rather than Compound - Compound creates 1 table per subfield whilst Multipart creates 1 column per subfield.&lt;br /&gt;
&lt;br /&gt;
* Finer grain permissions (using User, Groups, perhaps ACL concepts) - also security should be handled at the core level not at the UI level&lt;br /&gt;
&lt;br /&gt;
* Core should be able to run without IR extensions nor UI elements (might require to extend the SWORD layer for interactions with the core)&lt;br /&gt;
&lt;br /&gt;
* Built-in locking mechanisms for objects (improved edit_lock)&lt;br /&gt;
&lt;br /&gt;
* No hard-coded exceptions for IR extensions (e.g. eprint_status hard-coded in places)&lt;br /&gt;
&lt;br /&gt;
* Generalise concept of &amp;quot;files&amp;quot; to allow the storage of arbitrary files against any data objects (e.g. a profile picture for a User)&lt;br /&gt;
&lt;br /&gt;
==Extensions for IR-type of Repositories==&lt;br /&gt;
&lt;br /&gt;
* Authors/names stored in a separate dataset - should help integrate with various UID systems like OrcID.&lt;br /&gt;
&lt;br /&gt;
* Extra metadata to describe a User - cf. MePrints.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==UI elements==&lt;br /&gt;
&lt;br /&gt;
* jQuery over Prototype&lt;br /&gt;
&lt;br /&gt;
* jQueryUI widgets used to render fields &lt;br /&gt;
&lt;br /&gt;
* Javascript/Ajax concepts built-in&lt;br /&gt;
&lt;br /&gt;
* CSS3 Responsive design to support small screens (mobile, tablets etc) - http://alistapart.com/article/responsive-web-design&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Misc==&lt;br /&gt;
&lt;br /&gt;
* an internal messaging system would be nice (similar to the current Message data object but with more options) - this would help system/user and user/user interactions. A logged-in user could then see messages and act accordingly. For instance: publication just went live, items have been imported from remote sources, user commented on a resource etc.&lt;/div&gt;</summary>
		<author><name>Sf03r@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=EPrints4_Roadmap&amp;diff=10874</id>
		<title>EPrints4 Roadmap</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=EPrints4_Roadmap&amp;diff=10874"/>
		<updated>2013-11-06T14:00:35Z</updated>

		<summary type="html">&lt;p&gt;Sf03r@ecs.soton.ac.uk: /* Core */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Some general ideas for the development of the next major release of EPrints.&lt;br /&gt;
&lt;br /&gt;
==Main Objectives==&lt;br /&gt;
&lt;br /&gt;
* Separation of the Core API and UI (/rendering) components - that mainly means that core objects (Repository, MetaField*, DataObj*) won't have any render_* method. this could also imply that the core or the UI could be upgraded separately. It would also make re-use of the eprints core easy for other purposes (e.g. data repository, OER etc.)&lt;br /&gt;
&lt;br /&gt;
* Remove the spaghetti code (esp (1) rendering methods (2) Dataobj-Metafield relations)&lt;br /&gt;
&lt;br /&gt;
* Drop support for internal search in favour of specialist tools such as Xapian or Solr - we might however need to keep some aspects of the internal search (cf List/data retrieval) for exact matching - perhaps that's more a (SQL) &amp;quot;QueryBuilder&amp;quot; than a (user) search.&lt;br /&gt;
&lt;br /&gt;
* Drop support for Windows?&lt;br /&gt;
&lt;br /&gt;
* Implement object locking at the core level (for any objects, perhaps without using database fields at all)&lt;br /&gt;
&lt;br /&gt;
* Implement object state at the core level (at the moment EPrint object might be in one of 4 states: inbox, buffer, archive, deletion via the field eprint_status)&lt;br /&gt;
&lt;br /&gt;
* code normalisation:&lt;br /&gt;
** use new class name (e.g. EPrints::Session =&amp;gt; EPrints::Repository)&lt;br /&gt;
** use &amp;quot;new way&amp;quot; of doing things (e.g. EPrints::Dataobj::X-&amp;gt;new(12) =&amp;gt; repo-&amp;gt;dataset( 'x' )-&amp;gt;dataobj(12))&lt;br /&gt;
** remove v2.x features deprecated in v3+ (cf. EPrints::BackCompatibility)&lt;br /&gt;
&lt;br /&gt;
* define clear API for core functions (e.g. Database, object handling) and for UI purposes. The API must present a unique way of doing something.&lt;br /&gt;
&lt;br /&gt;
* It might be worth separating the code into 3 packages to ease the development: eprints4-core, eprints4-ir and eprints4-ir-ui.&lt;br /&gt;
&lt;br /&gt;
==Core==&lt;br /&gt;
&lt;br /&gt;
* Revisit Apache request Handler aka Apache::Rewrite (lots of hard-coded paths, many obsolete paths) - URL handling should be done by Controllers called/prioritised via a trigger.&lt;br /&gt;
&lt;br /&gt;
* Remove EPrints::Session from anywhere in favour of EPrints::Repository&lt;br /&gt;
&lt;br /&gt;
* Test using memcached (http://code.google.com/p/memcached/) - Cache::Memcached::Fast to cache data objects, perhaps could work to cache XML fragments too.&lt;br /&gt;
&lt;br /&gt;
* Use Multipart rather than Compound - Compound creates 1 table per subfield whilst Multipart creates 1 column per subfield.&lt;br /&gt;
&lt;br /&gt;
* Finer grain permissions (using User, Groups, perhaps ACL concepts)&lt;br /&gt;
&lt;br /&gt;
* Core should be able to run without IR extensions nor UI elements (might require to extend the SWORD layer for interactions with the core)&lt;br /&gt;
&lt;br /&gt;
* Built-in locking mechanisms for objects (improved edit_lock)&lt;br /&gt;
&lt;br /&gt;
* No hard-coded exceptions for IR extensions (e.g. eprint_status hard-coded in places)&lt;br /&gt;
&lt;br /&gt;
* Generalise concept of &amp;quot;files&amp;quot; to allow the storage of arbitrary files against any data objects (e.g. a profile picture for a User)&lt;br /&gt;
&lt;br /&gt;
==Extensions for IR-type of Repositories==&lt;br /&gt;
&lt;br /&gt;
* Authors/names stored in a separate dataset - should help integrate with various UID systems like OrcID.&lt;br /&gt;
&lt;br /&gt;
* Extra metadata to describe a User - cf. MePrints.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==UI elements==&lt;br /&gt;
&lt;br /&gt;
* jQuery over Prototype&lt;br /&gt;
&lt;br /&gt;
* jQueryUI widgets used to render fields &lt;br /&gt;
&lt;br /&gt;
* Javascript/Ajax concepts built-in&lt;br /&gt;
&lt;br /&gt;
* CSS3 Responsive design to support small screens (mobile, tablets etc) - http://alistapart.com/article/responsive-web-design&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Misc==&lt;br /&gt;
&lt;br /&gt;
* an internal messaging system would be nice (similar to the current Message data object but with more options) - this would help system/user and user/user interactions. A logged-in user could then see messages and act accordingly. For instance: publication just went live, items have been imported from remote sources, user commented on a resource etc.&lt;/div&gt;</summary>
		<author><name>Sf03r@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=EPrints4_Roadmap&amp;diff=10873</id>
		<title>EPrints4 Roadmap</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=EPrints4_Roadmap&amp;diff=10873"/>
		<updated>2013-10-28T11:24:57Z</updated>

		<summary type="html">&lt;p&gt;Sf03r@ecs.soton.ac.uk: /* Main Objectives */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Some general ideas for the development of the next major release of EPrints.&lt;br /&gt;
&lt;br /&gt;
==Main Objectives==&lt;br /&gt;
&lt;br /&gt;
* Separation of the Core API and UI (/rendering) components - that mainly means that core objects (Repository, MetaField*, DataObj*) won't have any render_* method. this could also imply that the core or the UI could be upgraded separately. It would also make re-use of the eprints core easy for other purposes (e.g. data repository, OER etc.)&lt;br /&gt;
&lt;br /&gt;
* Remove the spaghetti code (esp (1) rendering methods (2) Dataobj-Metafield relations)&lt;br /&gt;
&lt;br /&gt;
* Drop support for internal search in favour of specialist tools such as Xapian or Solr - we might however need to keep some aspects of the internal search (cf List/data retrieval) for exact matching - perhaps that's more a (SQL) &amp;quot;QueryBuilder&amp;quot; than a (user) search.&lt;br /&gt;
&lt;br /&gt;
* Drop support for Windows?&lt;br /&gt;
&lt;br /&gt;
* Implement object locking at the core level (for any objects, perhaps without using database fields at all)&lt;br /&gt;
&lt;br /&gt;
* Implement object state at the core level (at the moment EPrint object might be in one of 4 states: inbox, buffer, archive, deletion via the field eprint_status)&lt;br /&gt;
&lt;br /&gt;
* code normalisation:&lt;br /&gt;
** use new class name (e.g. EPrints::Session =&amp;gt; EPrints::Repository)&lt;br /&gt;
** use &amp;quot;new way&amp;quot; of doing things (e.g. EPrints::Dataobj::X-&amp;gt;new(12) =&amp;gt; repo-&amp;gt;dataset( 'x' )-&amp;gt;dataobj(12))&lt;br /&gt;
** remove v2.x features deprecated in v3+ (cf. EPrints::BackCompatibility)&lt;br /&gt;
&lt;br /&gt;
* define clear API for core functions (e.g. Database, object handling) and for UI purposes. The API must present a unique way of doing something.&lt;br /&gt;
&lt;br /&gt;
* It might be worth separating the code into 3 packages to ease the development: eprints4-core, eprints4-ir and eprints4-ir-ui.&lt;br /&gt;
&lt;br /&gt;
==Core==&lt;br /&gt;
&lt;br /&gt;
* Revisit Apache request Handler aka Apache::Rewrite (lots of hard-coded paths, many obsolete paths)&lt;br /&gt;
&lt;br /&gt;
* Remove EPrints::Session from anywhere in favour of EPrints::Repository&lt;br /&gt;
&lt;br /&gt;
* Test using memcached (http://code.google.com/p/memcached/) - Cache::Memcached::Fast to cache data objects, perhaps could work to cache XML fragments too.&lt;br /&gt;
&lt;br /&gt;
* Use Multipart rather than Compound - Compound creates 1 table per subfield whilst Multipart creates 1 column per subfield.&lt;br /&gt;
&lt;br /&gt;
* Finer grain permissions (using User, Groups, perhaps ACL concepts)&lt;br /&gt;
&lt;br /&gt;
* Core should be able to run without IR extensions nor UI elements (might require to extend the SWORD layer for interactions with the core)&lt;br /&gt;
&lt;br /&gt;
* Built-in locking mechanisms for objects (improved edit_lock)&lt;br /&gt;
&lt;br /&gt;
* No hard-coded exceptions for IR extensions (e.g. eprint_status hard-coded in places)&lt;br /&gt;
&lt;br /&gt;
* Generalise concept of &amp;quot;files&amp;quot; to allow the storage of arbitrary files against any data objects (e.g. a profile picture for a User)&lt;br /&gt;
&lt;br /&gt;
==Extensions for IR-type of Repositories==&lt;br /&gt;
&lt;br /&gt;
* Authors/names stored in a separate dataset - should help integrate with various UID systems like OrcID.&lt;br /&gt;
&lt;br /&gt;
* Extra metadata to describe a User - cf. MePrints.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==UI elements==&lt;br /&gt;
&lt;br /&gt;
* jQuery over Prototype&lt;br /&gt;
&lt;br /&gt;
* jQueryUI widgets used to render fields &lt;br /&gt;
&lt;br /&gt;
* Javascript/Ajax concepts built-in&lt;br /&gt;
&lt;br /&gt;
* CSS3 Responsive design to support small screens (mobile, tablets etc) - http://alistapart.com/article/responsive-web-design&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Misc==&lt;br /&gt;
&lt;br /&gt;
* an internal messaging system would be nice (similar to the current Message data object but with more options) - this would help system/user and user/user interactions. A logged-in user could then see messages and act accordingly. For instance: publication just went live, items have been imported from remote sources, user commented on a resource etc.&lt;/div&gt;</summary>
		<author><name>Sf03r@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=EPrints4_Roadmap&amp;diff=10872</id>
		<title>EPrints4 Roadmap</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=EPrints4_Roadmap&amp;diff=10872"/>
		<updated>2013-10-25T18:58:19Z</updated>

		<summary type="html">&lt;p&gt;Sf03r@ecs.soton.ac.uk: /* Core */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Some general ideas for the development of the next major release of EPrints.&lt;br /&gt;
&lt;br /&gt;
==Main Objectives==&lt;br /&gt;
&lt;br /&gt;
* Separation of the Core API and UI (/rendering) components - that mainly means that core objects (Repository, MetaField*, DataObj*) won't have any render_* method. this could also imply that the core or the UI could be upgraded separately. It would also make re-use of the eprints core easy for other purposes (e.g. data repository, OER etc.)&lt;br /&gt;
&lt;br /&gt;
* Remove the spaghetti code (esp (1) rendering methods (2) Dataobj-Metafield relations)&lt;br /&gt;
&lt;br /&gt;
* Drop support for internal search in favour of specialist tools such as Xapian or Solr - we might however need to keep some aspects of the internal search (cf List/data retrieval) for exact matching - perhaps that's more a (SQL) &amp;quot;QueryBuilder&amp;quot; than a (user) search.&lt;br /&gt;
&lt;br /&gt;
* Drop support for Windows&lt;br /&gt;
&lt;br /&gt;
* Implement object locking at the core level (for any objects, perhaps without using database fields at all)&lt;br /&gt;
&lt;br /&gt;
* Implement object state at the core level (at the moment EPrint object might be in one of 4 states: inbox, buffer, archive, deletion via the field eprint_status)&lt;br /&gt;
&lt;br /&gt;
* code normalisation:&lt;br /&gt;
** use new class name (e.g. EPrints::Session =&amp;gt; EPrints::Repository)&lt;br /&gt;
** use &amp;quot;new way&amp;quot; of doing things (e.g. EPrints::Dataobj::X-&amp;gt;new(12) =&amp;gt; repo-&amp;gt;dataset( 'x' )-&amp;gt;dataobj(12))&lt;br /&gt;
** remove v2.x features deprecated in v3+ (cf. EPrints::BackCompatibility)&lt;br /&gt;
&lt;br /&gt;
* define clear API for core functions (e.g. Database, object handling) and for UI purposes. The API must present a unique way of doing something.&lt;br /&gt;
&lt;br /&gt;
* It might be worth separating the code into 3 packages to ease the development: eprints4-core, eprints4-ir and eprints4-ir-ui.&lt;br /&gt;
&lt;br /&gt;
==Core==&lt;br /&gt;
&lt;br /&gt;
* Revisit Apache request Handler aka Apache::Rewrite (lots of hard-coded paths, many obsolete paths)&lt;br /&gt;
&lt;br /&gt;
* Remove EPrints::Session from anywhere in favour of EPrints::Repository&lt;br /&gt;
&lt;br /&gt;
* Test using memcached (http://code.google.com/p/memcached/) - Cache::Memcached::Fast to cache data objects, perhaps could work to cache XML fragments too.&lt;br /&gt;
&lt;br /&gt;
* Use Multipart rather than Compound - Compound creates 1 table per subfield whilst Multipart creates 1 column per subfield.&lt;br /&gt;
&lt;br /&gt;
* Finer grain permissions (using User, Groups, perhaps ACL concepts)&lt;br /&gt;
&lt;br /&gt;
* Core should be able to run without IR extensions nor UI elements (might require to extend the SWORD layer for interactions with the core)&lt;br /&gt;
&lt;br /&gt;
* Built-in locking mechanisms for objects (improved edit_lock)&lt;br /&gt;
&lt;br /&gt;
* No hard-coded exceptions for IR extensions (e.g. eprint_status hard-coded in places)&lt;br /&gt;
&lt;br /&gt;
* Generalise concept of &amp;quot;files&amp;quot; to allow the storage of arbitrary files against any data objects (e.g. a profile picture for a User)&lt;br /&gt;
&lt;br /&gt;
==Extensions for IR-type of Repositories==&lt;br /&gt;
&lt;br /&gt;
* Authors/names stored in a separate dataset - should help integrate with various UID systems like OrcID.&lt;br /&gt;
&lt;br /&gt;
* Extra metadata to describe a User - cf. MePrints.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==UI elements==&lt;br /&gt;
&lt;br /&gt;
* jQuery over Prototype&lt;br /&gt;
&lt;br /&gt;
* jQueryUI widgets used to render fields &lt;br /&gt;
&lt;br /&gt;
* Javascript/Ajax concepts built-in&lt;br /&gt;
&lt;br /&gt;
* CSS3 Responsive design to support small screens (mobile, tablets etc) - http://alistapart.com/article/responsive-web-design&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Misc==&lt;br /&gt;
&lt;br /&gt;
* an internal messaging system would be nice (similar to the current Message data object but with more options) - this would help system/user and user/user interactions. A logged-in user could then see messages and act accordingly. For instance: publication just went live, items have been imported from remote sources, user commented on a resource etc.&lt;/div&gt;</summary>
		<author><name>Sf03r@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=EPrints4_Roadmap&amp;diff=10871</id>
		<title>EPrints4 Roadmap</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=EPrints4_Roadmap&amp;diff=10871"/>
		<updated>2013-10-25T18:52:14Z</updated>

		<summary type="html">&lt;p&gt;Sf03r@ecs.soton.ac.uk: /* Main Objectives */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Some general ideas for the development of the next major release of EPrints.&lt;br /&gt;
&lt;br /&gt;
==Main Objectives==&lt;br /&gt;
&lt;br /&gt;
* Separation of the Core API and UI (/rendering) components - that mainly means that core objects (Repository, MetaField*, DataObj*) won't have any render_* method. this could also imply that the core or the UI could be upgraded separately. It would also make re-use of the eprints core easy for other purposes (e.g. data repository, OER etc.)&lt;br /&gt;
&lt;br /&gt;
* Remove the spaghetti code (esp (1) rendering methods (2) Dataobj-Metafield relations)&lt;br /&gt;
&lt;br /&gt;
* Drop support for internal search in favour of specialist tools such as Xapian or Solr - we might however need to keep some aspects of the internal search (cf List/data retrieval) for exact matching - perhaps that's more a (SQL) &amp;quot;QueryBuilder&amp;quot; than a (user) search.&lt;br /&gt;
&lt;br /&gt;
* Drop support for Windows&lt;br /&gt;
&lt;br /&gt;
* Implement object locking at the core level (for any objects, perhaps without using database fields at all)&lt;br /&gt;
&lt;br /&gt;
* Implement object state at the core level (at the moment EPrint object might be in one of 4 states: inbox, buffer, archive, deletion via the field eprint_status)&lt;br /&gt;
&lt;br /&gt;
* code normalisation:&lt;br /&gt;
** use new class name (e.g. EPrints::Session =&amp;gt; EPrints::Repository)&lt;br /&gt;
** use &amp;quot;new way&amp;quot; of doing things (e.g. EPrints::Dataobj::X-&amp;gt;new(12) =&amp;gt; repo-&amp;gt;dataset( 'x' )-&amp;gt;dataobj(12))&lt;br /&gt;
** remove v2.x features deprecated in v3+ (cf. EPrints::BackCompatibility)&lt;br /&gt;
&lt;br /&gt;
* define clear API for core functions (e.g. Database, object handling) and for UI purposes. The API must present a unique way of doing something.&lt;br /&gt;
&lt;br /&gt;
* It might be worth separating the code into 3 packages to ease the development: eprints4-core, eprints4-ir and eprints4-ir-ui.&lt;br /&gt;
&lt;br /&gt;
==Core==&lt;br /&gt;
&lt;br /&gt;
* Revisit Apache request Handler (lots of hard-coded paths, many obsolete paths)&lt;br /&gt;
&lt;br /&gt;
* Remove EPrints::Session from anywhere in favour of EPrints::Repository&lt;br /&gt;
&lt;br /&gt;
* Test using memcached (http://code.google.com/p/memcached/) - Cache::Memcached::Fast to cache data objects, perhaps could work to cache XML fragments too.&lt;br /&gt;
&lt;br /&gt;
* Use Multipart rather than Compound - Compound creates 1 table per subfield whilst Multipart creates 1 column per subfield.&lt;br /&gt;
&lt;br /&gt;
* Finer grain permissions (using User, Groups, perhaps ACL concepts)&lt;br /&gt;
&lt;br /&gt;
* Core should be able to run without IR extensions nor UI elements (might require to extend the SWORD layer for interactions with the core)&lt;br /&gt;
&lt;br /&gt;
* Built-in locking mechanisms for objects (improved edit_lock)&lt;br /&gt;
&lt;br /&gt;
* No hard-coded exceptions for IR extensions (e.g. eprint_status hard-coded in places)&lt;br /&gt;
&lt;br /&gt;
* Generalise concept of &amp;quot;files&amp;quot; to allow the storage of arbitrary files against any data objects (e.g. a profile picture for a User)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Extensions for IR-type of Repositories==&lt;br /&gt;
&lt;br /&gt;
* Authors/names stored in a separate dataset - should help integrate with various UID systems like OrcID.&lt;br /&gt;
&lt;br /&gt;
* Extra metadata to describe a User - cf. MePrints.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==UI elements==&lt;br /&gt;
&lt;br /&gt;
* jQuery over Prototype&lt;br /&gt;
&lt;br /&gt;
* jQueryUI widgets used to render fields &lt;br /&gt;
&lt;br /&gt;
* Javascript/Ajax concepts built-in&lt;br /&gt;
&lt;br /&gt;
* CSS3 Responsive design to support small screens (mobile, tablets etc) - http://alistapart.com/article/responsive-web-design&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Misc==&lt;br /&gt;
&lt;br /&gt;
* an internal messaging system would be nice (similar to the current Message data object but with more options) - this would help system/user and user/user interactions. A logged-in user could then see messages and act accordingly. For instance: publication just went live, items have been imported from remote sources, user commented on a resource etc.&lt;/div&gt;</summary>
		<author><name>Sf03r@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=EPrints4_Roadmap&amp;diff=10870</id>
		<title>EPrints4 Roadmap</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=EPrints4_Roadmap&amp;diff=10870"/>
		<updated>2013-10-25T18:51:30Z</updated>

		<summary type="html">&lt;p&gt;Sf03r@ecs.soton.ac.uk: /* Main Objectives */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Some general ideas for the development of the next major release of EPrints.&lt;br /&gt;
&lt;br /&gt;
==Main Objectives==&lt;br /&gt;
&lt;br /&gt;
* Separation of the Core API and UI (/rendering) components - that mainly means that core objects (Repository, MetaField*, DataObj*) won't have any render_* method. this could also imply that the core or the UI could be upgraded separately. &lt;br /&gt;
&lt;br /&gt;
* Remove the spaghetti code (esp (1) rendering methods (2) Dataobj-Metafield relations)&lt;br /&gt;
&lt;br /&gt;
* Drop support for internal search in favour of specialist tools such as Xapian or Solr - we might however need to keep some aspects of the internal search (cf List/data retrieval) for exact matching - perhaps that's more a (SQL) &amp;quot;QueryBuilder&amp;quot; than a (user) search.&lt;br /&gt;
&lt;br /&gt;
* Drop support for Windows&lt;br /&gt;
&lt;br /&gt;
* Implement object locking at the core level (for any objects, perhaps without using database fields at all)&lt;br /&gt;
&lt;br /&gt;
* Implement object state at the core level (at the moment EPrint object might be in one of 4 states: inbox, buffer, archive, deletion via the field eprint_status)&lt;br /&gt;
&lt;br /&gt;
* code normalisation:&lt;br /&gt;
** use new class name (e.g. EPrints::Session =&amp;gt; EPrints::Repository)&lt;br /&gt;
** use &amp;quot;new way&amp;quot; of doing things (e.g. EPrints::Dataobj::X-&amp;gt;new(12) =&amp;gt; repo-&amp;gt;dataset( 'x' )-&amp;gt;dataobj(12))&lt;br /&gt;
** remove v2.x features deprecated in v3+ (cf. EPrints::BackCompatibility)&lt;br /&gt;
&lt;br /&gt;
* define clear API for core functions (e.g. Database, object handling) and for UI purposes. The API must present a unique way of doing something.&lt;br /&gt;
&lt;br /&gt;
* It might be worth separating the code into 3 packages to ease the development: eprints4-core, eprints4-ir and eprints4-ir-ui.&lt;br /&gt;
&lt;br /&gt;
==Core==&lt;br /&gt;
&lt;br /&gt;
* Revisit Apache request Handler (lots of hard-coded paths, many obsolete paths)&lt;br /&gt;
&lt;br /&gt;
* Remove EPrints::Session from anywhere in favour of EPrints::Repository&lt;br /&gt;
&lt;br /&gt;
* Test using memcached (http://code.google.com/p/memcached/) - Cache::Memcached::Fast to cache data objects, perhaps could work to cache XML fragments too.&lt;br /&gt;
&lt;br /&gt;
* Use Multipart rather than Compound - Compound creates 1 table per subfield whilst Multipart creates 1 column per subfield.&lt;br /&gt;
&lt;br /&gt;
* Finer grain permissions (using User, Groups, perhaps ACL concepts)&lt;br /&gt;
&lt;br /&gt;
* Core should be able to run without IR extensions nor UI elements (might require to extend the SWORD layer for interactions with the core)&lt;br /&gt;
&lt;br /&gt;
* Built-in locking mechanisms for objects (improved edit_lock)&lt;br /&gt;
&lt;br /&gt;
* No hard-coded exceptions for IR extensions (e.g. eprint_status hard-coded in places)&lt;br /&gt;
&lt;br /&gt;
* Generalise concept of &amp;quot;files&amp;quot; to allow the storage of arbitrary files against any data objects (e.g. a profile picture for a User)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Extensions for IR-type of Repositories==&lt;br /&gt;
&lt;br /&gt;
* Authors/names stored in a separate dataset - should help integrate with various UID systems like OrcID.&lt;br /&gt;
&lt;br /&gt;
* Extra metadata to describe a User - cf. MePrints.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==UI elements==&lt;br /&gt;
&lt;br /&gt;
* jQuery over Prototype&lt;br /&gt;
&lt;br /&gt;
* jQueryUI widgets used to render fields &lt;br /&gt;
&lt;br /&gt;
* Javascript/Ajax concepts built-in&lt;br /&gt;
&lt;br /&gt;
* CSS3 Responsive design to support small screens (mobile, tablets etc) - http://alistapart.com/article/responsive-web-design&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Misc==&lt;br /&gt;
&lt;br /&gt;
* an internal messaging system would be nice (similar to the current Message data object but with more options) - this would help system/user and user/user interactions. A logged-in user could then see messages and act accordingly. For instance: publication just went live, items have been imported from remote sources, user commented on a resource etc.&lt;/div&gt;</summary>
		<author><name>Sf03r@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=EPrints4_Roadmap&amp;diff=10869</id>
		<title>EPrints4 Roadmap</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=EPrints4_Roadmap&amp;diff=10869"/>
		<updated>2013-10-25T18:49:05Z</updated>

		<summary type="html">&lt;p&gt;Sf03r@ecs.soton.ac.uk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Some general ideas for the development of the next major release of EPrints.&lt;br /&gt;
&lt;br /&gt;
==Main Objectives==&lt;br /&gt;
&lt;br /&gt;
* Separation of the Core API and UI (/rendering) components - that mainly means that core objects (Repository, MetaField*, DataObj*) won't have any render_* method.&lt;br /&gt;
&lt;br /&gt;
* Remove the spaghetti code (esp (1) rendering methods (2) Dataobj-Metafield relations)&lt;br /&gt;
&lt;br /&gt;
* Drop support for internal search in favour of specialist tools such as Xapian or Solr - we might however need to keep some aspects of the internal search (cf List/data retrieval) for exact matching - perhaps that's more a (SQL) &amp;quot;QueryBuilder&amp;quot; than a (user) search.&lt;br /&gt;
&lt;br /&gt;
* Drop support for Windows&lt;br /&gt;
&lt;br /&gt;
* Implement object locking at the core level (for any objects, perhaps without using database fields at all)&lt;br /&gt;
&lt;br /&gt;
* Implement object state at the core level (at the moment EPrint object might be in one of 4 states: inbox, buffer, archive, deletion via the field eprint_status)&lt;br /&gt;
&lt;br /&gt;
* code normalisation:&lt;br /&gt;
** use new class name (e.g. EPrints::Session =&amp;gt; EPrints::Repository)&lt;br /&gt;
** use &amp;quot;new way&amp;quot; of doing things (e.g. EPrints::Dataobj::X-&amp;gt;new(12) =&amp;gt; repo-&amp;gt;dataset( 'x' )-&amp;gt;dataobj(12))&lt;br /&gt;
** remove v2.x features deprecated in v3+ (cf. EPrints::BackCompatibility)&lt;br /&gt;
&lt;br /&gt;
* define clear API for core functions (e.g. Database, object handling) and for UI purposes. The API must present a unique way of doing something.&lt;br /&gt;
&lt;br /&gt;
==Core==&lt;br /&gt;
&lt;br /&gt;
* Revisit Apache request Handler (lots of hard-coded paths, many obsolete paths)&lt;br /&gt;
&lt;br /&gt;
* Remove EPrints::Session from anywhere in favour of EPrints::Repository&lt;br /&gt;
&lt;br /&gt;
* Test using memcached (http://code.google.com/p/memcached/) - Cache::Memcached::Fast to cache data objects, perhaps could work to cache XML fragments too.&lt;br /&gt;
&lt;br /&gt;
* Use Multipart rather than Compound - Compound creates 1 table per subfield whilst Multipart creates 1 column per subfield.&lt;br /&gt;
&lt;br /&gt;
* Finer grain permissions (using User, Groups, perhaps ACL concepts)&lt;br /&gt;
&lt;br /&gt;
* Core should be able to run without IR extensions nor UI elements (might require to extend the SWORD layer for interactions with the core)&lt;br /&gt;
&lt;br /&gt;
* Built-in locking mechanisms for objects (improved edit_lock)&lt;br /&gt;
&lt;br /&gt;
* No hard-coded exceptions for IR extensions (e.g. eprint_status hard-coded in places)&lt;br /&gt;
&lt;br /&gt;
* Generalise concept of &amp;quot;files&amp;quot; to allow the storage of arbitrary files against any data objects (e.g. a profile picture for a User)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Extensions for IR-type of Repositories==&lt;br /&gt;
&lt;br /&gt;
* Authors/names stored in a separate dataset - should help integrate with various UID systems like OrcID.&lt;br /&gt;
&lt;br /&gt;
* Extra metadata to describe a User - cf. MePrints.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==UI elements==&lt;br /&gt;
&lt;br /&gt;
* jQuery over Prototype&lt;br /&gt;
&lt;br /&gt;
* jQueryUI widgets used to render fields &lt;br /&gt;
&lt;br /&gt;
* Javascript/Ajax concepts built-in&lt;br /&gt;
&lt;br /&gt;
* CSS3 Responsive design to support small screens (mobile, tablets etc) - http://alistapart.com/article/responsive-web-design&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Misc==&lt;br /&gt;
&lt;br /&gt;
* an internal messaging system would be nice (similar to the current Message data object but with more options) - this would help system/user and user/user interactions. A logged-in user could then see messages and act accordingly. For instance: publication just went live, items have been imported from remote sources, user commented on a resource etc.&lt;/div&gt;</summary>
		<author><name>Sf03r@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=EPrints4_Roadmap&amp;diff=10868</id>
		<title>EPrints4 Roadmap</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=EPrints4_Roadmap&amp;diff=10868"/>
		<updated>2013-10-25T18:45:51Z</updated>

		<summary type="html">&lt;p&gt;Sf03r@ecs.soton.ac.uk: /* Main Objectives */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Some general ideas for the development of the next major release of EPrints.&lt;br /&gt;
&lt;br /&gt;
==Main Objectives==&lt;br /&gt;
&lt;br /&gt;
* Separation of the Core API and UI (/rendering) components - that mainly means that core objects (Repository, MetaField*, DataObj*) won't have any render_* method.&lt;br /&gt;
&lt;br /&gt;
* Remove the spaghetti code (esp (1) rendering methods (2) Dataobj-Metafield relations)&lt;br /&gt;
&lt;br /&gt;
* Drop support for internal search in favour of specialist tools such as Xapian or Solr - we might however need to keep some aspects of the internal search (cf List/data retrieval) for exact matching - perhaps that's more a (SQL) &amp;quot;QueryBuilder&amp;quot; than a (user) search.&lt;br /&gt;
&lt;br /&gt;
* Drop support for Windows&lt;br /&gt;
&lt;br /&gt;
* Implement object locking at the core level (for any objects, perhaps without using database fields at all)&lt;br /&gt;
&lt;br /&gt;
* Implement object state at the core level (at the moment EPrint object might be in one of 4 states: inbox, buffer, archive, deletion via the field eprint_status)&lt;br /&gt;
&lt;br /&gt;
* code normalisation:&lt;br /&gt;
** use new class name (e.g. EPrints::Session =&amp;gt; EPrints::Repository)&lt;br /&gt;
** use &amp;quot;new way&amp;quot; of doing things (e.g. EPrints::Dataobj::X-&amp;gt;new(12) =&amp;gt; repo-&amp;gt;dataset( 'x' )-&amp;gt;dataobj(12))&lt;br /&gt;
** remove v2.x features deprecated in v3+ (cf. EPrints::BackCompatibility)&lt;br /&gt;
&lt;br /&gt;
* define clear API for core functions (e.g. Database, object handling) and for UI purposes. The API must present a unique way of doing something.&lt;br /&gt;
&lt;br /&gt;
==Core==&lt;br /&gt;
&lt;br /&gt;
* Revisit Apache request Handler (lots of hard-coded paths, many obsolete paths)&lt;br /&gt;
&lt;br /&gt;
* Remove EPrints::Session from anywhere in favour of EPrints::Repository&lt;br /&gt;
&lt;br /&gt;
* Test using memcached (http://code.google.com/p/memcached/) - Cache::Memcached::Fast to cache data objects, perhaps could work to cache XML fragments too.&lt;br /&gt;
&lt;br /&gt;
* Use Multipart rather than Compound - Compound creates 1 table per subfield whilst Multipart creates 1 column per subfield.&lt;br /&gt;
&lt;br /&gt;
* Finer grain permissions (using User, Groups, perhaps ACL concepts)&lt;br /&gt;
&lt;br /&gt;
* Core should be able to run without IR extensions nor UI elements (might require to extend the SWORD layer for interactions with the core)&lt;br /&gt;
&lt;br /&gt;
* Built-in locking mechanisms for objects (improved edit_lock)&lt;br /&gt;
&lt;br /&gt;
* No hard-coded exceptions for IR extensions (e.g. eprint_status hard-coded in places)&lt;br /&gt;
&lt;br /&gt;
* Generalise concept of &amp;quot;files&amp;quot; to allow the storage of arbitrary files against any data objects (e.g. a profile picture for a User)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Extensions for IR-type of Repositories==&lt;br /&gt;
&lt;br /&gt;
* Authors/names stored in a separate dataset - should help integrate with various UID systems like OrcID.&lt;br /&gt;
&lt;br /&gt;
* Extra metadata to describe a User - cf. MePrints.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==UI elements==&lt;br /&gt;
&lt;br /&gt;
* jQuery over Prototype&lt;br /&gt;
&lt;br /&gt;
* jQueryUI widgets used to render fields &lt;br /&gt;
&lt;br /&gt;
* Javascript/Ajax concepts built-in&lt;br /&gt;
&lt;br /&gt;
* CSS3 Responsive design to support small screens (mobile, tablets etc) - http://alistapart.com/article/responsive-web-design&lt;/div&gt;</summary>
		<author><name>Sf03r@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=EPrints4_Roadmap&amp;diff=10867</id>
		<title>EPrints4 Roadmap</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=EPrints4_Roadmap&amp;diff=10867"/>
		<updated>2013-10-25T18:44:42Z</updated>

		<summary type="html">&lt;p&gt;Sf03r@ecs.soton.ac.uk: /* Main Objectives */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Some general ideas for the development of the next major release of EPrints.&lt;br /&gt;
&lt;br /&gt;
==Main Objectives==&lt;br /&gt;
&lt;br /&gt;
* Separation of the Core API and UI (/rendering) components&lt;br /&gt;
&lt;br /&gt;
* Remove the spaghetti code (esp (1) rendering methods (2) Dataobj-Metafield relations)&lt;br /&gt;
&lt;br /&gt;
* Drop support for internal search in favour of specialist tools such as Xapian or Solr - we might however need to keep some aspects of the internal search (cf List/data retrieval) for exact matching - perhaps that's more a (SQL) &amp;quot;QueryBuilder&amp;quot; than a (user) search.&lt;br /&gt;
&lt;br /&gt;
* Drop support for Windows&lt;br /&gt;
&lt;br /&gt;
* Implement object locking at the core level (for any objects, perhaps without using database fields at all)&lt;br /&gt;
&lt;br /&gt;
* Implement object state at the core level (at the moment EPrint object might be in one of 4 states: inbox, buffer, archive, deletion via the field eprint_status)&lt;br /&gt;
&lt;br /&gt;
* code normalisation:&lt;br /&gt;
** use new class name (e.g. EPrints::Session =&amp;gt; EPrints::Repository)&lt;br /&gt;
** use &amp;quot;new way&amp;quot; of doing things (e.g. EPrints::Dataobj::X-&amp;gt;new(12) =&amp;gt; repo-&amp;gt;dataset( 'x' )-&amp;gt;dataobj(12))&lt;br /&gt;
** remove v2.x features deprecated in v3+ (cf. EPrints::BackCompatibility)&lt;br /&gt;
&lt;br /&gt;
* define clear API for core functions (e.g. Database, object handling) and for UI purposes. The API must present a unique way of doing something.&lt;br /&gt;
&lt;br /&gt;
==Core==&lt;br /&gt;
&lt;br /&gt;
* Revisit Apache request Handler (lots of hard-coded paths, many obsolete paths)&lt;br /&gt;
&lt;br /&gt;
* Remove EPrints::Session from anywhere in favour of EPrints::Repository&lt;br /&gt;
&lt;br /&gt;
* Test using memcached (http://code.google.com/p/memcached/) - Cache::Memcached::Fast to cache data objects, perhaps could work to cache XML fragments too.&lt;br /&gt;
&lt;br /&gt;
* Use Multipart rather than Compound - Compound creates 1 table per subfield whilst Multipart creates 1 column per subfield.&lt;br /&gt;
&lt;br /&gt;
* Finer grain permissions (using User, Groups, perhaps ACL concepts)&lt;br /&gt;
&lt;br /&gt;
* Core should be able to run without IR extensions nor UI elements (might require to extend the SWORD layer for interactions with the core)&lt;br /&gt;
&lt;br /&gt;
* Built-in locking mechanisms for objects (improved edit_lock)&lt;br /&gt;
&lt;br /&gt;
* No hard-coded exceptions for IR extensions (e.g. eprint_status hard-coded in places)&lt;br /&gt;
&lt;br /&gt;
* Generalise concept of &amp;quot;files&amp;quot; to allow the storage of arbitrary files against any data objects (e.g. a profile picture for a User)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Extensions for IR-type of Repositories==&lt;br /&gt;
&lt;br /&gt;
* Authors/names stored in a separate dataset - should help integrate with various UID systems like OrcID.&lt;br /&gt;
&lt;br /&gt;
* Extra metadata to describe a User - cf. MePrints.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==UI elements==&lt;br /&gt;
&lt;br /&gt;
* jQuery over Prototype&lt;br /&gt;
&lt;br /&gt;
* jQueryUI widgets used to render fields &lt;br /&gt;
&lt;br /&gt;
* Javascript/Ajax concepts built-in&lt;br /&gt;
&lt;br /&gt;
* CSS3 Responsive design to support small screens (mobile, tablets etc) - http://alistapart.com/article/responsive-web-design&lt;/div&gt;</summary>
		<author><name>Sf03r@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=EPrints4_Roadmap&amp;diff=10866</id>
		<title>EPrints4 Roadmap</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=EPrints4_Roadmap&amp;diff=10866"/>
		<updated>2013-10-25T17:26:07Z</updated>

		<summary type="html">&lt;p&gt;Sf03r@ecs.soton.ac.uk: /* UI elements */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Some general ideas for the development of the next major release of EPrints.&lt;br /&gt;
&lt;br /&gt;
==Main Objectives==&lt;br /&gt;
&lt;br /&gt;
* Separation of the Core API and UI (/rendering) components&lt;br /&gt;
&lt;br /&gt;
* Remove the spaghetti code (esp (1) rendering methods (2) Dataobj-Metafield relations)&lt;br /&gt;
&lt;br /&gt;
* Drop support for internal search in favour of specialist tools such as Xapian or Solr - we might however need to keep some aspects of the internal search (cf List/data retrieval) for exact matching - perhaps that's more a (SQL) &amp;quot;QueryBuilder&amp;quot; than a (user) search.&lt;br /&gt;
&lt;br /&gt;
* Drop support for Windows&lt;br /&gt;
&lt;br /&gt;
* Implement object locking at the core level (for any objects, perhaps without using database fields at all)&lt;br /&gt;
&lt;br /&gt;
* code normalisation:&lt;br /&gt;
** use new class name (e.g. EPrints::Session =&amp;gt; EPrints::Repository)&lt;br /&gt;
** use &amp;quot;new way&amp;quot; of doing things (e.g. EPrints::Dataobj::X-&amp;gt;new(12) =&amp;gt; repo-&amp;gt;dataset( 'x' )-&amp;gt;dataobj(12))&lt;br /&gt;
** remove v2.x features deprecated in v3+ (cf. EPrints::BackCompatibility)&lt;br /&gt;
&lt;br /&gt;
* define clear API for core functions (e.g. Database, object handling) and for UI purposes. The API must present a unique way of doing something.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Core==&lt;br /&gt;
&lt;br /&gt;
* Revisit Apache request Handler (lots of hard-coded paths, many obsolete paths)&lt;br /&gt;
&lt;br /&gt;
* Remove EPrints::Session from anywhere in favour of EPrints::Repository&lt;br /&gt;
&lt;br /&gt;
* Test using memcached (http://code.google.com/p/memcached/) - Cache::Memcached::Fast to cache data objects, perhaps could work to cache XML fragments too.&lt;br /&gt;
&lt;br /&gt;
* Use Multipart rather than Compound - Compound creates 1 table per subfield whilst Multipart creates 1 column per subfield.&lt;br /&gt;
&lt;br /&gt;
* Finer grain permissions (using User, Groups, perhaps ACL concepts)&lt;br /&gt;
&lt;br /&gt;
* Core should be able to run without IR extensions nor UI elements (might require to extend the SWORD layer for interactions with the core)&lt;br /&gt;
&lt;br /&gt;
* Built-in locking mechanisms for objects (improved edit_lock)&lt;br /&gt;
&lt;br /&gt;
* No hard-coded exceptions for IR extensions (e.g. eprint_status hard-coded in places)&lt;br /&gt;
&lt;br /&gt;
* Generalise concept of &amp;quot;files&amp;quot; to allow the storage of arbitrary files against any data objects (e.g. a profile picture for a User)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Extensions for IR-type of Repositories==&lt;br /&gt;
&lt;br /&gt;
* Authors/names stored in a separate dataset - should help integrate with various UID systems like OrcID.&lt;br /&gt;
&lt;br /&gt;
* Extra metadata to describe a User - cf. MePrints.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==UI elements==&lt;br /&gt;
&lt;br /&gt;
* jQuery over Prototype&lt;br /&gt;
&lt;br /&gt;
* jQueryUI widgets used to render fields &lt;br /&gt;
&lt;br /&gt;
* Javascript/Ajax concepts built-in&lt;br /&gt;
&lt;br /&gt;
* CSS3 Responsive design to support small screens (mobile, tablets etc) - http://alistapart.com/article/responsive-web-design&lt;/div&gt;</summary>
		<author><name>Sf03r@ecs.soton.ac.uk</name></author>
		
	</entry>
</feed>