You can subscribe to this list here.
2009 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
(22) |
Nov
(85) |
Dec
(20) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2010 |
Jan
(47) |
Feb
(127) |
Mar
(268) |
Apr
(78) |
May
(47) |
Jun
(38) |
Jul
(131) |
Aug
(221) |
Sep
(187) |
Oct
(54) |
Nov
(111) |
Dec
(84) |
2011 |
Jan
(152) |
Feb
(106) |
Mar
(94) |
Apr
(90) |
May
(53) |
Jun
(20) |
Jul
(24) |
Aug
(37) |
Sep
(32) |
Oct
(70) |
Nov
(22) |
Dec
(15) |
2012 |
Jan
(33) |
Feb
(110) |
Mar
(24) |
Apr
(1) |
May
(11) |
Jun
(8) |
Jul
(12) |
Aug
(37) |
Sep
(39) |
Oct
(81) |
Nov
(38) |
Dec
(50) |
2013 |
Jan
(23) |
Feb
(53) |
Mar
(23) |
Apr
(5) |
May
(19) |
Jun
(16) |
Jul
(16) |
Aug
(9) |
Sep
(21) |
Oct
(1) |
Nov
(2) |
Dec
(8) |
2014 |
Jan
(16) |
Feb
(6) |
Mar
(27) |
Apr
(1) |
May
(10) |
Jun
(1) |
Jul
(4) |
Aug
(10) |
Sep
(19) |
Oct
(22) |
Nov
(4) |
Dec
(6) |
2015 |
Jan
(3) |
Feb
(6) |
Mar
(9) |
Apr
|
May
(11) |
Jun
(23) |
Jul
(14) |
Aug
(10) |
Sep
(10) |
Oct
(9) |
Nov
(18) |
Dec
(4) |
2016 |
Jan
(5) |
Feb
(5) |
Mar
|
Apr
(2) |
May
(15) |
Jun
(2) |
Jul
(8) |
Aug
(2) |
Sep
(6) |
Oct
|
Nov
|
Dec
|
2017 |
Jan
(2) |
Feb
(12) |
Mar
(22) |
Apr
(6) |
May
|
Jun
|
Jul
(1) |
Aug
(1) |
Sep
(5) |
Oct
(2) |
Nov
|
Dec
|
2018 |
Jan
(2) |
Feb
|
Mar
|
Apr
|
May
|
Jun
(5) |
Jul
(3) |
Aug
|
Sep
(7) |
Oct
(19) |
Nov
|
Dec
|
2021 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
(1) |
Nov
|
Dec
|
2022 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
(3) |
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: James F. <jam...@ex...> - 2010-07-28 17:52:20
|
2010/7/28 Dmitriy Shabanov <sha...@gm...>: > On Wed, 2010-07-28 at 19:31 +0200, José María Fernández González wrote: >> we can have a look at the different approaches on filesystems world. >> In Mac OS X HFS+ and Windows NTFS there is the concept of forks, like >> several named streams of bytes attached to a file. One of those named >> streams is the default one, i.e. the file content. On UNIX you have >> the extended file attributes concept >> (http://en.wikipedia.org/wiki/Extended_file_attributes), and it is a >> key/value model. > > +1 for two streams, it's looks very close to Adam's proposal. I think this is a cool thing, a few thoughts: * we should make it possible to make metadata show up as embedded explicit mixed content (attributes or elements?) with a document stored in the database if we need to serialize document. * there maybe versioning considerations to think through with metadata * I do feel that considering a new metadata axis is useful but we need to be careful e.g. is it being proposed that we will have a metadata namespace for this stuff my 2p/2e/2czk J |
From: Dmitriy S. <sha...@gm...> - 2010-07-28 17:46:02
|
On Wed, 2010-07-28 at 19:31 +0200, José María Fernández González wrote: > we can have a look at the different approaches on filesystems world. > In Mac OS X HFS+ and Windows NTFS there is the concept of forks, like > several named streams of bytes attached to a file. One of those named > streams is the default one, i.e. the file content. On UNIX you have > the extended file attributes concept > (http://en.wikipedia.org/wiki/Extended_file_attributes), and it is a > key/value model. +1 for two streams, it's looks very close to Adam's proposal. -- Cheers, Dmitriy Shabanov |
From: Adam R. <ad...@ex...> - 2010-07-28 17:43:10
|
This functionality should be integrated with Triggers. It also make no sense to configure this separately via the command line! This should be done in conf.xml! Thanks Adam. On 28 July 2010 18:06, <ix...@us...> wrote: > Revision: 12086 > http://exist.svn.sourceforge.net/exist/?rev=12086&view=rev > Author: ixitar > Date: 2010-07-28 17:06:45 +0000 (Wed, 28 Jul 2010) > > Log Message: > ----------- > [feature] Adding the ability to execute an XQuery script when an HTTP session is created and another XQuery script when an HTTP session is destroyed. > > Two listeners are being added to the server: > - org.exist.http.AuditTrailSessionListener > - org.exist.http.SessionCountListener > > NOTE: This feature is disabled by default, so it will have no impact on a system until enabled. > > These listeners can be enabled by uncommenting the following in tools/jetty/etc/webdefaults.xml: > > <listener> > <listener-class>org.exist.http.AuditTrailSessionListener</listener-class> > </listener> > <listener> > <listener-class>org.exist.http.SessionCountListener</listener-class> > </listener> > > To change the session timeout from the default of 30 minutes, change the following value in webdefaults.xml: > > <session-config> > <session-timeout>30</session-timeout> > </session-config> > > > When the AuditTrailSessionListener is enabled, then there are two Java properties that need to be set: > > - org.exist.http.session_create_listener > - org.exist.http.session_destroy_listener > > If a property is not set, then the listener will do nothing for the create or destroy. > > If the property is set, but the XQuery script does not exist, then a Log4J error message "Resource [resource path] does not exist." is processed and then no other action is taken. > > If the resource exists and there is an execution failure, then a Log4J error message "Exception while executing [resource path] script for admin" is processed and then no other action is taken. > > If the resource exists and the execution succeeds, then a Log4J info message "XQuery execution results: results" is processed and then the method is completed. > > To set these properties, you need to edit bin/functions.d/eXist-settings.sh if starting from the command line in Unix/Linux: > > set_java_options() { > if [ -z "${JAVA_OPTIONS}" ]; then > JAVA_OPTIONS="-Xms128m -Xmx512m -Dfile.encoding=UTF-8 -Dorg.exist.http.session_destroy_listener=/db/session/session-destroy.xq"; > fi > JAVA_OPTIONS="${JAVA_OPTIONS} -Djava.endorsed.dirs=${JAVA_ENDORSED_DIRS}"; > } > > To set these properties for The command line execution in Windows, you need to edit bin/startup.bat: > > :gotExistHome > set JAVA_ENDORSED_DIRS="%EXIST_HOME%"\lib\endorsed > set JAVA_OPTS="-Xms128m -Xmx512m -Dfile.encoding=UTF-8 -Dorg.exist.http.session_destroy_listener=/db/session/session-destroy.xq -Djava.endorsed.dirs=%JAVA_ENDORSED_DIRS%" > > To set these properties in wrapper, you need to edit tools/wrapper/conf/wrapper.conf: > > # Java Additional Parameters > wrapper.java.additional.1=-Djava.endorsed.dirs=../../../lib/endorsed > wrapper.java.additional.2=-Dfile.encoding=UTF-8 > wrapper.java.additional.3=-Dexist.home=../../.. > wrapper.java.additional.4=-Djetty.home=../../../tools/jetty > wrapper.java.additional.5=-Dorg.exist.http.session_create_listener=/db/session/session-create.xq > wrapper.java.additional.6=-Dorg.exist.http.session_destroy_listener=/db/session/session-destroy.xq > > > - - - - - - - - - - - - - - - > The SessionCountListener will return the number of open sessions are on the server, the way to access the value is through SessionCountListener.getActiveSessions() which returns a long. An XQuery function will be implemented to return this value. > > Modified Paths: > -------------- > trunk/eXist/tools/jetty/etc/webdefault.xml > > Added Paths: > ----------- > trunk/eXist/src/org/exist/http/AuditTrailSessionListener.java > trunk/eXist/src/org/exist/http/SessionCountListener.java > > Added: trunk/eXist/src/org/exist/http/AuditTrailSessionListener.java > =================================================================== > --- trunk/eXist/src/org/exist/http/AuditTrailSessionListener.java (rev 0) > +++ trunk/eXist/src/org/exist/http/AuditTrailSessionListener.java 2010-07-28 17:06:45 UTC (rev 12086) > @@ -0,0 +1,151 @@ > +/* > + * eXist Open Source Native XML Database > + * Copyright (C) 2010 The eXist Project > + * http://exist-db.org > + * > + * This program is free software; you can redistribute it and/or > + * modify it under the terms of the GNU Lesser General Public License > + * as published by the Free Software Foundation; either version 2 > + * of the License, or (at your option) any later version. > + * > + * This program is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + * GNU Lesser General Public License for more details. > + * > + * You should have received a copy of the GNU Lesser General Public License > + * along with this program; if not, write to the Free Software > + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. > + * > + * $Id$ > + */ > +package org.exist.http; > + > +import org.apache.log4j.Logger; > +import org.exist.dom.BinaryDocument; > +import org.exist.dom.DocumentImpl; > +import org.exist.security.User; > +import org.exist.security.xacml.AccessContext; > +import org.exist.source.DBSource; > +import org.exist.source.Source; > +import org.exist.storage.BrokerPool; > +import org.exist.storage.DBBroker; > +import org.exist.storage.lock.Lock; > +import org.exist.xmldb.XmldbURI; > +import org.exist.xquery.CompiledXQuery; > +import org.exist.xquery.XQuery; > +import org.exist.xquery.XQueryContext; > +import org.exist.xquery.value.Sequence; > + > +import javax.servlet.http.HttpSessionListener; > +import javax.servlet.http.HttpSessionEvent; > +import javax.servlet.http.HttpSession; > +import java.util.Properties; > + > +/** > + * Executes an XQuery script whose filename is retrieved from the > + * java option 'org.exist.http.session_create_listener' when an > + * HTTP session is created and 'org.exist.http.session_destroy_listener' > + * when an HTTP session is destroyed. > + * > + * If the java option is not set, then do nothing. > + * > + * If the java option is set, then retrieve the script from the file > + * or resource designated by the value of the property. Execute the > + * XQuery script to record the creation or destruction of a HTTP session. > + */ > +public class AuditTrailSessionListener implements HttpSessionListener { > + > + private final static Logger LOG = Logger.getLogger(AuditTrailSessionListener.class); > + private static final String REGISTER_CREATE_XQUERY_SCRIPT_PROPERTY = "org.exist.http.session_create_listener"; > + private static final String REGISTER_DESTROY_XQUERY_SCRIPT_PROPERTY = "org.exist.http.session_destroy_listener"; > + > + > + > + /** > + * > + * @param sessionEvent > + */ > + public void sessionCreated(HttpSessionEvent sessionEvent) { > + HttpSession session = sessionEvent.getSession(); > + > + LOG.info("session created " + session.getId()); > + String xqueryResourcePath = System.getProperty(REGISTER_CREATE_XQUERY_SCRIPT_PROPERTY); > + executeXQuery(xqueryResourcePath); > + } > + > + /** > + * > + * @param sessionEvent > + */ > + public void sessionDestroyed(HttpSessionEvent sessionEvent) { > + HttpSession session = (sessionEvent != null) ? sessionEvent.getSession() : null; > + if (session != null) > + LOG.info("destroy session " + session.getId()); > + else > + LOG.info("destroy session"); > + > + String xqueryResourcePath = System.getProperty(REGISTER_DESTROY_XQUERY_SCRIPT_PROPERTY); > + executeXQuery(xqueryResourcePath); > + } > + > + private void executeXQuery(String xqueryResourcePath) { > + if (xqueryResourcePath != null && xqueryResourcePath.length() > 0) { > + xqueryResourcePath = xqueryResourcePath.trim(); > + BrokerPool pool = null; > + DBBroker broker = null; > + User principal = null; > + > + try { > + DocumentImpl resource = null; > + Source source = null; > + > + pool = BrokerPool.getInstance(); > + principal = pool.getSecurityManager().getSystemAccount(); > + > + broker = pool.get(principal); > + if (broker == null) { > + LOG.error("Unable to retrieve DBBroker for " + principal.getName()); > + return; > + } > + > + XmldbURI pathUri = XmldbURI.create(xqueryResourcePath); > + > + > + resource = broker.getXMLResource(pathUri, Lock.READ_LOCK); > + > + if(resource != null) { > + LOG.info("Resource [" + xqueryResourcePath + "] exists."); > + source = new DBSource(broker, (BinaryDocument)resource, true); > + } else { > + LOG.error("Resource [" + xqueryResourcePath + "] does not exist."); > + return; > + } > + > + > + XQuery xquery = broker.getXQueryService(); > + > + if (xquery == null) { > + LOG.error("broker unable to retrieve XQueryService"); > + return; > + } > + > + XQueryContext context = xquery.newContext(AccessContext.REST); > + > + CompiledXQuery compiled = xquery.compile(context, source); > + > + Properties outputProperties = new Properties(); > + > + Sequence result = xquery.execute(compiled, null, outputProperties); > + LOG.info("XQuery execution results: " + result.toString()); > + > + } catch (Exception e) { > + LOG.error("Exception while executing [" + xqueryResourcePath + "] script for " + principal.getName(), e); > + } > + finally { > + if (pool != null) > + pool.release(broker); > + } > + } > + } > +} > \ No newline at end of file > > > Property changes on: trunk/eXist/src/org/exist/http/AuditTrailSessionListener.java > ___________________________________________________________________ > Added: svn:keywords > + Id > > Added: trunk/eXist/src/org/exist/http/SessionCountListener.java > =================================================================== > --- trunk/eXist/src/org/exist/http/SessionCountListener.java (rev 0) > +++ trunk/eXist/src/org/exist/http/SessionCountListener.java 2010-07-28 17:06:45 UTC (rev 12086) > @@ -0,0 +1,50 @@ > +/* > + * eXist Open Source Native XML Database > + * Copyright (C) 2010 The eXist Project > + * http://exist-db.org > + * > + * This program is free software; you can redistribute it and/or > + * modify it under the terms of the GNU Lesser General Public License > + * as published by the Free Software Foundation; either version 2 > + * of the License, or (at your option) any later version. > + * > + * This program is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + * GNU Lesser General Public License for more details. > + * > + * You should have received a copy of the GNU Lesser General Public License > + * along with this program; if not, write to the Free Software > + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. > + * > + * $Id$ > + */ > +package org.exist.http; > + > +import javax.servlet.http.HttpSessionEvent; > +import javax.servlet.http.HttpSessionListener; > + > +/** > + * Created by IntelliJ IDEA. > + * User: lcahlander > + * Date: Jul 27, 2010 > + * Time: 10:31:47 PM > + * To change this template use File | Settings | File Templates. > + */ > +public class SessionCountListener implements HttpSessionListener { > + > + private static long activeSessions = 0; > + > + public void sessionCreated(HttpSessionEvent httpSessionEvent) { > + activeSessions++; > + } > + > + public void sessionDestroyed(HttpSessionEvent httpSessionEvent) { > + if (activeSessions > 0) > + activeSessions--; > + } > + > + public static long getActiveSessions() { > + return activeSessions; > + } > +} > > > Property changes on: trunk/eXist/src/org/exist/http/SessionCountListener.java > ___________________________________________________________________ > Added: svn:keywords > + Id > > Modified: trunk/eXist/tools/jetty/etc/webdefault.xml > =================================================================== > --- trunk/eXist/tools/jetty/etc/webdefault.xml 2010-07-28 16:49:11 UTC (rev 12085) > +++ trunk/eXist/tools/jetty/etc/webdefault.xml 2010-07-28 17:06:45 UTC (rev 12086) > @@ -29,6 +29,22 @@ > This file is applied to a Web application before it's own WEB_INF/web.xml file > </description> > > + <!-- ======================================================================== --> > + <!-- The AuditTrailSessionListener allows for the execution of XQuery scripts --> > + <!-- when an HTTP session is created or destroyed. Set the following Java --> > + <!-- properties to specify the scripts to run. --> > + <!-- --> > + <!-- org.exist.http.session_create_listener --> > + <!-- org.exist.http.session_destroy_listener --> > + <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> > + <!-- UNCOMMENT TO ACTIVATE > + <listener> > + <listener-class>org.exist.http.AuditTrailSessionListener</listener-class> > + </listener> > + <listener> > + <listener-class>org.exist.http.SessionCountListener</listener-class> > + </listener> > + --> > > <!-- ==================================================================== --> > <!-- Context params to control Session Cookies --> > > > This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. > > ------------------------------------------------------------------------------ > The Palm PDK Hot Apps Program offers developers who use the > Plug-In Development Kit to bring their C/C++ apps to Palm for a share > of $1 Million in cash or HP Products. Visit us here for more details: > http://p.sf.net/sfu/dev2dev-palm > _______________________________________________ > Exist-commits mailing list > Exi...@li... > https://lists.sourceforge.net/lists/listinfo/exist-commits > -- Adam Retter eXist Developer { United Kingdom } ad...@ex... irc://irc.freenode.net/existdb |
From: Adam R. <ad...@ex...> - 2010-07-28 17:40:17
|
> MarkLogic implementation is interesting and a good starting point, but I guess it does not allow attaching binary contents as metadata, which is a limitation. Some scenarios can be, for instance, a JPEG image stored in eXist could have some metadata in XML describing its EXIF properties Accessing this metadata at the moment is possible via the image xquery extension module. > , and binary metadata like a thumbnail, and SVG or XSL-FO documents could also have as binary metadata a thumbnail. Well my proposal was to use the XQuery datatypes, so then the user could set metadata to be base64binary data if desired. > > Cheers, > José María > > On 28/07/10 17:55, Patrick Bosek wrote: >> I really like the concept of implementing metadata axis. >> >> After reading over MarkLogic's implementation, I think it may be a very good idea to essentially mimic them. It looks like their system would accomplish most of the goals expressed here thus far. And I'm always a proponent of consistency. >> >> Thoughts? >> >> Cheers, >> >> Patrick >> >> On Wed, Jul 28, 2010 at 9:50 AM, Joe Wicentowski <jo...@gm... <mailto:jo...@gm...>> wrote: >> >> Very interesting discussion; I second all that Dan said about his use >> cases. Just a note on Adam's e-mail: >> >> > The new user customisable metadata becomes a simple key value store >> > and is indexed on document id and unique key name. Each value follows >> > XQuery datatype rules and may be either an atomic value or a sequence. >> > >> > We then establish a metadata axis which is available in XQuery. From >> > here we can use the standard predicates and update facilities of >> > XQuery to maintain the metadata. The context of the metadata axis >> > would always be the document root of the current node as metadata is >> > on a per-document level, not a per-node level. >> >> The metadata:: axis strikes me as similar in notion to the MarkLogic >> property:: axis, although the latter stores metadata as an XML node >> rather than key/value pair. See: >> >> http://docs.marklogic.com/4.1doc/docapp.xqy#display.xqy?fname=http://pubs/4.1doc/xml/dev_guide/properties.xml >> >> I raise this as an existing implementation for comparison. >> >> Joe >> >> >> >> >> -- >> Patrick Bosek >> Jorsek Software >> Cell (585) 820 9634 >> Office (585) 239 6060 >> Jorsek.com >> >> >> >> ------------------------------------------------------------------------------ >> The Palm PDK Hot Apps Program offers developers who use the >> Plug-In Development Kit to bring their C/C++ apps to Palm for a share >> of $1 Million in cash or HP Products. Visit us here for more details: >> http://p.sf.net/sfu/dev2dev-palm >> >> >> >> _______________________________________________ >> Exist-development mailing list >> Exi...@li... >> https://lists.sourceforge.net/lists/listinfo/exist-development > > -- > "La violencia es el último recurso del incompetente" > - Salvor Hardin en "La Fundación" de Isaac Asimov > "Premature optimization is the root of all evil." - Donald Knuth > > José María Fernández González > e-mail: jos...@gm... > > ------------------------------------------------------------------------------ > The Palm PDK Hot Apps Program offers developers who use the > Plug-In Development Kit to bring their C/C++ apps to Palm for a share > of $1 Million in cash or HP Products. Visit us here for more details: > http://p.sf.net/sfu/dev2dev-palm > _______________________________________________ > Exist-development mailing list > Exi...@li... > https://lists.sourceforge.net/lists/listinfo/exist-development > -- Adam Retter eXist Developer { United Kingdom } ad...@ex... irc://irc.freenode.net/existdb |
From: José M. F. G. <jm...@us...> - 2010-07-28 17:31:19
|
Hi everybody, we can have a look at the different approaches on filesystems world. In Mac OS X HFS+ and Windows NTFS there is the concept of forks, like several named streams of bytes attached to a file. One of those named streams is the default one, i.e. the file content. On UNIX you have the extended file attributes concept (http://en.wikipedia.org/wiki/Extended_file_attributes), and it is a key/value model. MarkLogic implementation is interesting and a good starting point, but I guess it does not allow attaching binary contents as metadata, which is a limitation. Some scenarios can be, for instance, a JPEG image stored in eXist could have some metadata in XML describing its EXIF properties, and binary metadata like a thumbnail, and SVG or XSL-FO documents could also have as binary metadata a thumbnail. Cheers, José María On 28/07/10 17:55, Patrick Bosek wrote: > I really like the concept of implementing metadata axis. > > After reading over MarkLogic's implementation, I think it may be a very good idea to essentially mimic them. It looks like their system would accomplish most of the goals expressed here thus far. And I'm always a proponent of consistency. > > Thoughts? > > Cheers, > > Patrick > > On Wed, Jul 28, 2010 at 9:50 AM, Joe Wicentowski <jo...@gm... <mailto:jo...@gm...>> wrote: > > Very interesting discussion; I second all that Dan said about his use > cases. Just a note on Adam's e-mail: > > > The new user customisable metadata becomes a simple key value store > > and is indexed on document id and unique key name. Each value follows > > XQuery datatype rules and may be either an atomic value or a sequence. > > > > We then establish a metadata axis which is available in XQuery. From > > here we can use the standard predicates and update facilities of > > XQuery to maintain the metadata. The context of the metadata axis > > would always be the document root of the current node as metadata is > > on a per-document level, not a per-node level. > > The metadata:: axis strikes me as similar in notion to the MarkLogic > property:: axis, although the latter stores metadata as an XML node > rather than key/value pair. See: > > http://docs.marklogic.com/4.1doc/docapp.xqy#display.xqy?fname=http://pubs/4.1doc/xml/dev_guide/properties.xml > > I raise this as an existing implementation for comparison. > > Joe > > > > > -- > Patrick Bosek > Jorsek Software > Cell (585) 820 9634 > Office (585) 239 6060 > Jorsek.com > > > > ------------------------------------------------------------------------------ > The Palm PDK Hot Apps Program offers developers who use the > Plug-In Development Kit to bring their C/C++ apps to Palm for a share > of $1 Million in cash or HP Products. Visit us here for more details: > http://p.sf.net/sfu/dev2dev-palm > > > > _______________________________________________ > Exist-development mailing list > Exi...@li... > https://lists.sourceforge.net/lists/listinfo/exist-development -- "La violencia es el último recurso del incompetente" - Salvor Hardin en "La Fundación" de Isaac Asimov "Premature optimization is the root of all evil." - Donald Knuth José María Fernández González e-mail: jos...@gm... |
From: Patrick B. <pat...@jo...> - 2010-07-28 15:55:23
|
I really like the concept of implementing metadata axis. After reading over MarkLogic's implementation, I think it may be a very good idea to essentially mimic them. It looks like their system would accomplish most of the goals expressed here thus far. And I'm always a proponent of consistency. Thoughts? Cheers, Patrick On Wed, Jul 28, 2010 at 9:50 AM, Joe Wicentowski <jo...@gm...> wrote: > Very interesting discussion; I second all that Dan said about his use > cases. Just a note on Adam's e-mail: > > > The new user customisable metadata becomes a simple key value store > > and is indexed on document id and unique key name. Each value follows > > XQuery datatype rules and may be either an atomic value or a sequence. > > > > We then establish a metadata axis which is available in XQuery. From > > here we can use the standard predicates and update facilities of > > XQuery to maintain the metadata. The context of the metadata axis > > would always be the document root of the current node as metadata is > > on a per-document level, not a per-node level. > > The metadata:: axis strikes me as similar in notion to the MarkLogic > property:: axis, although the latter stores metadata as an XML node > rather than key/value pair. See: > > > http://docs.marklogic.com/4.1doc/docapp.xqy#display.xqy?fname=http://pubs/4.1doc/xml/dev_guide/properties.xml > > I raise this as an existing implementation for comparison. > > Joe > -- Patrick Bosek Jorsek Software Cell (585) 820 9634 Office (585) 239 6060 Jorsek.com |
From: Joe W. <jo...@gm...> - 2010-07-28 13:50:38
|
Very interesting discussion; I second all that Dan said about his use cases. Just a note on Adam's e-mail: > The new user customisable metadata becomes a simple key value store > and is indexed on document id and unique key name. Each value follows > XQuery datatype rules and may be either an atomic value or a sequence. > > We then establish a metadata axis which is available in XQuery. From > here we can use the standard predicates and update facilities of > XQuery to maintain the metadata. The context of the metadata axis > would always be the document root of the current node as metadata is > on a per-document level, not a per-node level. The metadata:: axis strikes me as similar in notion to the MarkLogic property:: axis, although the latter stores metadata as an XML node rather than key/value pair. See: http://docs.marklogic.com/4.1doc/docapp.xqy#display.xqy?fname=http://pubs/4.1doc/xml/dev_guide/properties.xml I raise this as an existing implementation for comparison. Joe |
From: Adam R. <ad...@ex...> - 2010-07-28 07:31:37
|
One design option in my opinion - Existing metadata i.e. file permissions and attributes stay where they are. Its crucial for performance not to complicate this, as it needs to be interpreted for each document queried. The new user customisable metadata becomes a simple key value store and is indexed on document id and unique key name. Each value follows XQuery datatype rules and may be either an atomic value or a sequence. We then establish a metadata axis which is available in XQuery. From here we can use the standard predicates and update facilities of XQuery to maintain the metadata. The context of the metadata axis would always be the document root of the current node as metadata is on a per-document level, not a per-node level. e.g. doc("/db/abc.xml)/someNode[@value eq $some-value][metadata::someKey eq $some-metadata-value] update value doc("/db/abc.xml)/metadata::someKey with $new-metadata-value or maybe even - doc("/db/abc.xml)/someNode[@value eq $some-value][metadata::entry['someKey'] eq $some-metadata-value] update value doc("/db/abc.xml)/metadata::entry['someKey'] with $new-metadata-value Hows that sound? Cheers Adam. On 28 July 2010 01:52, Patrick Bosek <pat...@jo...> wrote: > Hello eXist Developers! > > I need the ability to set up some pretty advanced metadata for documents and > for binary objects (perhaps even collections?). I spoke briefly with Adam, > he seemed to think a module was the wrong path, and eXist needed metadata > functionality built into the core (Adam, please feel free to correct me if > you don't feel I've properly represented you). This is a job I'm more than > willing to undertake, but I think it would be best if I was directed by the > core developers, since I want to make sure anything I write benefits > everyone and not just my needs. Also, I think I could probably build it much > faster if given a few pointers. > > My needs are basically just the ability to efficiently store and index a > schema validated piece of XML associated with other objects in the system. I > was also thinking this might be a good time to consider how this could be > extended into native XLink functionality. > > I've done a little work in the code base, I built a small addition to the > unix permissions to allow more granular permissions (which I still intend to > contribute, but I haven't had time to fully test, and now I'm thinking of > changing it as I work on the metadata stuff). But a quick "here's where I > would start" would be very helpful. Also, any tips to ensure efficiency > would be appreciated. Lastly, links to reading material are always great. > > Let me know what ya'll think! > > > Cheers, > > -- > Patrick Bosek > Jorsek Software > Cell (585) 820 9634 > Office (585) 239 6060 > Jorsek.com > > > ------------------------------------------------------------------------------ > The Palm PDK Hot Apps Program offers developers who use the > Plug-In Development Kit to bring their C/C++ apps to Palm for a share > of $1 Million in cash or HP Products. Visit us here for more details: > http://ad.doubleclick.net/clk;226879339;13503038;l? > http://clk.atdmt.com/CRS/go/247765532/direct/01/ > _______________________________________________ > Exist-development mailing list > Exi...@li... > https://lists.sourceforge.net/lists/listinfo/exist-development > > -- Adam Retter eXist Developer { United Kingdom } ad...@ex... irc://irc.freenode.net/existdb |
From: Dan M. <dan...@gm...> - 2010-07-28 02:10:22
|
This might be a good idea, but there are several design trade-offs here. First of all, perhaps we should define a little bit more about what we mean by metadata. Each person seems to have a slightly different definition. Next come the question of what metadata to add by default and where do we put it (in the XML files or not in the XML files) and should we allow the users to change this on a collection-by-collection configuration. For example the current system keeps track of the following for each resource and each collection: owner name group name created date-time last updated date-time Note that collections also have these items also. Since we frequently need to sync much of our data to subversion we also add the user-id that created the document and the user-id that last modified the document. But we put all this metadata at the end of each XML file for "administered items" as the ISO-11179 metadata registry spec calls them. There are many trade-offs for storing system metadata in the XML documents and not in the documents. We do try to centralize some of these functions using a common XQuery module but we have more work to do here. We can not use the eXist built-in time-stamp metadata for user and timestamps since it gets changed when we do a restore from a backup and does not reflect actual user and timestamps that did change the data. We also would like to do what subversion does and have a timestamp change of a collection that reflects the most recent update of any resource inside that collection. This would be very useful for doing Sync operations between exist systems and systems like subversion. One option might be to create a collection configuration standard that would automatically add a <metadata> tag to the end of each element that needs this metadata and keeps it up to date. I could also see a lot of other useful data that might be unimportant to other people. Things like "validated-by" metatdata that hold the XML Schema name and version and time-stamp that a document what checked against a specific version of an XML Schema. Or a "published" date-time that shows when the document was published to an external public web server and who authorized the document to be published. I have also tried to use eXist triggers to keep this metadata up to date but my work on triggers has not been very successful and I don't have the background to debug why the sometimes do not fire. I hope that give us some ideas of where this can go. My only real suggestion is that we use the existing collection configuration files to change what metadata is tracked and where it is stored. It might be interesting to try to do this with just triggers and in-document XML data as a starting point. - Dan On Tue, Jul 27, 2010 at 7:52 PM, Patrick Bosek <pat...@jo...>wrote: > Hello eXist Developers! > > I need the ability to set up some pretty advanced metadata for documents > and for binary objects (perhaps even collections?). I spoke briefly with > Adam, he seemed to think a module was the wrong path, and eXist needed > metadata functionality built into the core (Adam, please feel free to > correct me if you don't feel I've properly represented you). This is a job > I'm more than willing to undertake, but I think it would be best if I was > directed by the core developers, since I want to make sure anything I write > benefits everyone and not just my needs. Also, I think I could probably > build it much faster if given a few pointers. > > My needs are basically just the ability to efficiently store and index a > schema validated piece of XML associated with other objects in the system. I > was also thinking this might be a good time to consider how this could be > extended into native XLink functionality. > > I've done a little work in the code base, I built a small addition to the > unix permissions to allow more granular permissions (which I still intend to > contribute, but I haven't had time to fully test, and now I'm thinking of > changing it as I work on the metadata stuff). But a quick "here's where I > would start" would be very helpful. Also, any tips to ensure efficiency > would be appreciated. Lastly, links to reading material are always great. > > Let me know what ya'll think! > > > Cheers, > > -- > Patrick Bosek > Jorsek Software > Cell (585) 820 9634 > Office (585) 239 6060 > Jorsek.com > > > > ------------------------------------------------------------------------------ > The Palm PDK Hot Apps Program offers developers who use the > Plug-In Development Kit to bring their C/C++ apps to Palm for a share > of $1 Million in cash or HP Products. Visit us here for more details: > http://ad.doubleclick.net/clk;226879339;13503038;l? > http://clk.atdmt.com/CRS/go/247765532/direct/01/ > _______________________________________________ > Exist-development mailing list > Exi...@li... > https://lists.sourceforge.net/lists/listinfo/exist-development > > -- Dan McCreary Semantic Solutions Architect office: (952) 931-9198 cell: (612) 986-1552 |
From: Patrick B. <pat...@jo...> - 2010-07-28 00:52:25
|
Hello eXist Developers! I need the ability to set up some pretty advanced metadata for documents and for binary objects (perhaps even collections?). I spoke briefly with Adam, he seemed to think a module was the wrong path, and eXist needed metadata functionality built into the core (Adam, please feel free to correct me if you don't feel I've properly represented you). This is a job I'm more than willing to undertake, but I think it would be best if I was directed by the core developers, since I want to make sure anything I write benefits everyone and not just my needs. Also, I think I could probably build it much faster if given a few pointers. My needs are basically just the ability to efficiently store and index a schema validated piece of XML associated with other objects in the system. I was also thinking this might be a good time to consider how this could be extended into native XLink functionality. I've done a little work in the code base, I built a small addition to the unix permissions to allow more granular permissions (which I still intend to contribute, but I haven't had time to fully test, and now I'm thinking of changing it as I work on the metadata stuff). But a quick "here's where I would start" would be very helpful. Also, any tips to ensure efficiency would be appreciated. Lastly, links to reading material are always great. Let me know what ya'll think! Cheers, -- Patrick Bosek Jorsek Software Cell (585) 820 9634 Office (585) 239 6060 Jorsek.com |
From: Loren C. <lor...@gm...> - 2010-07-26 22:51:29
|
I have not used the wrapper script. I will take a look at it. Loren On Jul 26, 2010, at 05:37 PM, Leif-Jöran Olsson wrote: > Den 2010-07-26 23:32, Loren Cahlander skrev: >> We should add the option to have the installer create startup/shutdown scripts for linux. >> >> >> The following is the script that is called for starting and stopping eXist. It is passed a parameter start, stop, restart, reload, status, or condrestart: >> /etc/init.d/existdb >> >> The following are symlinks to the above script. These start or stop services defined in the scripts contained in the /etc/rc#.d directories. The S scripts are run during startup, lower through higher run-level. The K scripts are run during shutdown, higher through lower run-level. >> >> /etc/rc0.d/K98existdb -> ../init.d/existdb >> /etc/rc1.d/K98existdb -> ../init.d/existdb >> /etc/rc2.d/S98existdb -> ../init.d/existdb >> /etc/rc3.d/S98existdb -> ../init.d/existdb >> /etc/rc4.d/S98existdb -> ../init.d/existdb >> /etc/rc5.d/S98existdb -> ../init.d/existdb >> /etc/rc6.d/K98existdb -> ../init.d/existdb >> >> >> I will be developing the /etc/init.d/existdb script for the LEXA stack document. > > Do you mean by develop not using the wrapper script which provides this functionality already? In that case why and which benefits compared to the wrapper would it add? Or do you by develop mean add the wrapper script setup to the installer? > > > Cheers, > Leif-Jöran |
From: Leif-Jöran O. <lj...@ex...> - 2010-07-26 22:37:25
|
Den 2010-07-26 23:32, Loren Cahlander skrev: > We should add the option to have the installer create startup/shutdown scripts for linux. > > > The following is the script that is called for starting and stopping eXist. It is passed a parameter start, stop, restart, reload, status, or condrestart: > /etc/init.d/existdb > > The following are symlinks to the above script. These start or stop services defined in the scripts contained in the /etc/rc#.d directories. The S scripts are run during startup, lower through higher run-level. The K scripts are run during shutdown, higher through lower run-level. > > /etc/rc0.d/K98existdb -> ../init.d/existdb > /etc/rc1.d/K98existdb -> ../init.d/existdb > /etc/rc2.d/S98existdb -> ../init.d/existdb > /etc/rc3.d/S98existdb -> ../init.d/existdb > /etc/rc4.d/S98existdb -> ../init.d/existdb > /etc/rc5.d/S98existdb -> ../init.d/existdb > /etc/rc6.d/K98existdb -> ../init.d/existdb > > > I will be developing the /etc/init.d/existdb script for the LEXA stack document. Do you mean by develop not using the wrapper script which provides this functionality already? In that case why and which benefits compared to the wrapper would it add? Or do you by develop mean add the wrapper script setup to the installer? Cheers, Leif-Jöran |
From: Loren C. <lor...@gm...> - 2010-07-26 21:32:28
|
We should add the option to have the installer create startup/shutdown scripts for linux. The following is the script that is called for starting and stopping eXist. It is passed a parameter start, stop, restart, reload, status, or condrestart: /etc/init.d/existdb The following are symlinks to the above script. These start or stop services defined in the scripts contained in the /etc/rc#.d directories. The S scripts are run during startup, lower through higher run-level. The K scripts are run during shutdown, higher through lower run-level. /etc/rc0.d/K98existdb -> ../init.d/existdb /etc/rc1.d/K98existdb -> ../init.d/existdb /etc/rc2.d/S98existdb -> ../init.d/existdb /etc/rc3.d/S98existdb -> ../init.d/existdb /etc/rc4.d/S98existdb -> ../init.d/existdb /etc/rc5.d/S98existdb -> ../init.d/existdb /etc/rc6.d/K98existdb -> ../init.d/existdb I will be developing the /etc/init.d/existdb script for the LEXA stack document. This script and the symlinks will allow for a clean startup and shutdown of the eXist server when linux is being started, stopped, rebooted, etc. Adding these scripts will allow for the user to have a command-line option of: sudo /etc/init.d/existdb start to start eXist sudo /etc/init.d/existdb stop to stop eXist and sudo /etc/init.d/existdb restart to restart eXist. We would need to come up with what a reload could be or just have it do a restart. A status would be a nice thing to identify. Probably the process id (pid) and the the values displayed during startup. |
From: Andrzej J. T. <an...@ch...> - 2010-07-24 13:41:25
|
Dmitry: > Thanks for reporting, it was fixed. Can you check? (rev 12039) Seems to be working fine..thanks for the quick fix! -- Andrzej Taramina Chaeron Corporation: Enterprise System Solutions http://www.chaeron.com |
From: Wolfgang M. <wol...@ex...> - 2010-07-24 09:12:33
|
> Is the trunk stable right now? Dmitryi is currently redesigning the security manager to prepare the way for pluggable realms using LDAP, ActiveDirectory and other implementations. He's committing his changes in smaller steps to avoid breaking too much. However, the security related modules in trunk may become temporarily unstable during the next 2 or 3 weeks. There will also be some changes to the structure of /db/system, but we plan to provide an automatic migration upon restore. Several people on this list depend on Dmitryi's work and there's a considerable time pressure to get the redesign finished until early August. We'll all help to get those changes through as fast as we can. Wolfgang |
From: Dmitriy S. <sha...@gm...> - 2010-07-24 05:31:43
|
Hi Andrzej, Thanks for reporting, it was fixed. Can you check? (rev 12039) -- Cheers, Dmitriy Shabanov On Fri, 2010-07-23 at 18:30 -0400, Andrzej Jan Taramina wrote: > Dimitry: > > Your realm changes have broken the Java Admin Client's ability to do a restore. > > Here is what happens: > > Restore.setAdminCredentials() calls mgmt.updateUser( dba ) which ends up calling.... > > RemoteUserManagementService.updateUser(), which does a: parent.getClient().execute("setUser", params) > > which ends up calling: SecurityManagerImpl.setUser(). > > Problem was that SecurityManagerImpl.setUser() was coded to call defaultRealm.addAccount(user), which would then throw > an IllegalArgumentException in the RealmImpl._addAccount() method, since the admin/dba user already exists. > > I'm not sure why you are trying to add a new admin user rather than just setting the current user. > > In any case, I have hacked the SecurityManagerImpl.setUser() code and commented out the defaultRealm.addAccount(user) > method invocation, which seems to allow the Java Admin Client to successfully initiate a Restore. > > Could you please look into this chain of calls, and figure out that it should really be doing, Dimitry? > > Thanks. > |
From: Andrzej J. T. <an...@ch...> - 2010-07-23 22:57:20
|
Wolfgang: I've run into a situation where I have a database that has a document in it where the document name is "." (just a period). But with the latest trunk, there doesn't seem to be any way to create a document with such a name any more. There are a number of problems with this, and not just that I have an older database with such a document in it (which is problematic when trying to do backups and restores!). The issue is that you can still try to create a document with the name ".", and it will succeed (sort of). The following XQuery fragment will succeed: let $col := xmldb:create-collection( "/db", "test" ) return xmldb:store( "/db/test", ".", <test/> ) And it will create the requested resource, but will the null string as the resource name! The problem with that is if you try to delete that resource (try it with the web admin page), it will delete the parent collection. Oooops! This just doesn't seem right. So my question is what we should do about it? Should we allow "." (or ".." for that matter) as a document name? If so, then we need to fix the behaviour so that the document name is stored correctly, that is, with a non-null value. If we aren't going to allow such document names, then we need to put in place some checks and not create the resource if we get an "invalid" document name. And if we're not going to allow this, what do we do with legacy documents that were created when this seemed to work? Thoughts? My thinking is that we should allow for these document names.....I've already got some code in the Backup.java file that accounts for the fact that you can't create a file on the filesystem called "." or "..", just haven't checked that in yet. I put that code in to handle the backup of my legacy database document that does have this name, but found that I can't create a document of that name any more. Thanks! -- Andrzej Taramina Chaeron Corporation: Enterprise System Solutions http://www.chaeron.com |
From: Andrzej J. T. <an...@ch...> - 2010-07-23 22:29:08
|
Dimitry: Your realm changes have broken the Java Admin Client's ability to do a restore. Here is what happens: Restore.setAdminCredentials() calls mgmt.updateUser( dba ) which ends up calling.... RemoteUserManagementService.updateUser(), which does a: parent.getClient().execute("setUser", params) which ends up calling: SecurityManagerImpl.setUser(). Problem was that SecurityManagerImpl.setUser() was coded to call defaultRealm.addAccount(user), which would then throw an IllegalArgumentException in the RealmImpl._addAccount() method, since the admin/dba user already exists. I'm not sure why you are trying to add a new admin user rather than just setting the current user. In any case, I have hacked the SecurityManagerImpl.setUser() code and commented out the defaultRealm.addAccount(user) method invocation, which seems to allow the Java Admin Client to successfully initiate a Restore. Could you please look into this chain of calls, and figure out that it should really be doing, Dimitry? Thanks. -- Andrzej Taramina Chaeron Corporation: Enterprise System Solutions http://www.chaeron.com |
From: Andrzej J. T. <an...@ch...> - 2010-07-23 21:05:30
|
Is the trunk stable right now? I recall seeing a few posts that it might not be, relating to the recent security checkings, and something about a database version change? Thanks! -- Andrzej Taramina Chaeron Corporation: Enterprise System Solutions http://www.chaeron.com |
From: Dmitriy S. <sha...@gm...> - 2010-07-22 09:10:38
|
On Thu, 2010-07-22 at 09:36 +0100, Adam Retter wrote: > >> How is this any different to the current 'guest' user? > > > > Current "guest" account can be used by user (authenticate), I do miss > > something before user introduce oneself. This account should not be > > allowed to create anything @database, but only limited read permissions. > > Sure but this problem is really due to the default permission on /db. > Arguably you just need to tighten these up and then the guest user > would be fine. We are talking different things here. You are on authorization side & I'm on authentication one. Personally, I don't like default account & role for permissions (default mask is ok), the user must introduce oneself or we have security hole. (linux security system don't allow this, you have to authenticate first) -- Cheers, Dmitriy Shabanov |
From: Adam R. <ad...@ex...> - 2010-07-22 08:36:59
|
>> How is this any different to the current 'guest' user? > > Current "guest" account can be used by user (authenticate), I do miss > something before user introduce oneself. This account should not be > allowed to create anything @database, but only limited read permissions. Sure but this problem is really due to the default permission on /db. Arguably you just need to tighten these up and then the guest user would be fine. > -- > Cheers, > > Dmitriy Shabanov > -- Adam Retter eXist Developer { United Kingdom } ad...@ex... irc://irc.freenode.net/existdb |
From: Dmitriy S. <sha...@gm...> - 2010-07-22 08:20:02
|
On Wed, 2010-07-21 at 22:04 +0100, Adam Retter wrote: > > - 'system account' (id = 0, dba group), it will be use by system only. > > It will be useful as owner of the /system resources, so it will be never > > modified by anybody, only by system it self (throw special functions); > > fine :-) > > > - 'nobody' (id = -1, guest group), the use didn't offer himself. This > > account can't be used as resource owner. > > How is this any different to the current 'guest' user? Current "guest" account can be used by user (authenticate), I do miss something before user introduce oneself. This account should not be allowed to create anything @database, but only limited read permissions. -- Cheers, Dmitriy Shabanov |
From: Adam R. <ad...@ex...> - 2010-07-21 21:04:34
|
> - 'system account' (id = 0, dba group), it will be use by system only. > It will be useful as owner of the /system resources, so it will be never > modified by anybody, only by system it self (throw special functions); fine :-) > - 'nobody' (id = -1, guest group), the use didn't offer himself. This > account can't be used as resource owner. How is this any different to the current 'guest' user? > Next in my plan (next two weeks): > > - change the major version number of the security subsystem; > > - add collection /system/security, it will be use for setting, accounts > and roles information; > > - use collections: /system/security/( internal, openid, ldap, > activeDirectory) & etc, one per realm, other words each realm will have > separate collection. > > - each realm's collection will have subcollection: role (or should I > use 'group' as name?), user & file: settings.xml (I'll implement runtime > reconfiguration) > > - each group or user will be at single file. > > (I will put converter to transform old structure to new one) > > Any comments? > > -- > Cheers, > > Dmitriy Shabanov > > ------------------------------------------------------------------------------ > This SF.net email is sponsored by Sprint > What will you do first with EVO, the first 4G phone? > Visit sprint.com/first -- http://p.sf.net/sfu/sprint-com-first > _______________________________________________ > Exist-development mailing list > Exi...@li... > https://lists.sourceforge.net/lists/listinfo/exist-development > > -- Adam Retter eXist Developer { United Kingdom } ad...@ex... irc://irc.freenode.net/existdb |
From: Dannes W. <da...@ex...> - 2010-07-21 18:01:05
|
if the dbx format is changed, you should update a 'magic number', identifying a dbx-model update. Exist refuses to startup when there is a difference between javacode and the code stored in the dbx files. The only way to pass this, is a backup-restore. These kind of changes are acceptable for trunk (not too often), but should be announced on the mailing list and in the commit message. Between versions (1.4.0 1.4.1) these changes are acceptable as well. D. On 21 Jul 2010, at 19:53 , Dmitriy Shabanov wrote: > The trunk is POSSIBLE UNSTABLE, please let me know if any problem. > > Should I change storage version (.dbx file) to force backup/restore, > because of new security storage structure? > > Should it be converted automatic or manual? (I think of manual way, > pluggable realms will be turned off and only internal one (users.xml) > will operate) Kind regards Dannes -- eXist-db Native XML Database - http://exist-db.org Join us on linked-in: http://www.linkedin.com/groups?gid=35624 |
From: Dmitriy S. <sha...@gm...> - 2010-07-21 17:53:35
|
The trunk is POSSIBLE UNSTABLE, please let me know if any problem. Should I change storage version (.dbx file) to force backup/restore, because of new security storage structure? Should it be converted automatic or manual? (I think of manual way, pluggable realms will be turned off and only internal one (users.xml) will operate) -- Cheers, Dmitriy Shabanov On Fri, 2010-07-16 at 00:12 +0500, Dmitriy Shabanov wrote: > Hello, > > I want to add new accounts: > > - 'system account' (id = 0, dba group), it will be use by system only. > It will be useful as owner of the /system resources, so it will be never > modified by anybody, only by system it self (throw special functions); > > - 'nobody' (id = -1, guest group), the use didn't offer himself. This > account can't be used as resource owner. > > Next in my plan (next two weeks): > > - change the major version number of the security subsystem; > > - add collection /system/security, it will be use for setting, accounts > and roles information; > > - use collections: /system/security/( internal, openid, ldap, > activeDirectory) & etc, one per realm, other words each realm will have > separate collection. > > - each realm's collection will have subcollection: role (or should I > use 'group' as name?), user & file: settings.xml (I'll implement runtime > reconfiguration) > > - each group or user will be at single file. > > (I will put converter to transform old structure to new one) > > Any comments? > |