[Bedework-commit] r463 - in trunk/calendar3: bldfiles calCore/resources/hbms calEnv/src/org/bedework/calenv calFacade/src/org/bedework/calfacade calFacade/src/org/bedework/calfacade/ifs config/configs deployment deployment/dumprestore/shellscr deployment/dumprestore/shellscr/resources deployment/termination deployment/termination/shellscr dumprestore dumprestore/src/org/bedework/dumprestore dumprestore/src/org/bedework/dumprestore/dump dumprestore/src/org/bedework/dumprestore/dump/dumpling dumprestore/src/org/bedework/dumprestore/restore dumprestore/src/org/bedework/dumprestore/restore/rules test/caldavTestData/eg test/src/org/bedework/tests/calsvc

svnadmin at bedework.org svnadmin at bedework.org
Tue May 9 16:56:39 EDT 2006


Author: douglm
Date: 2006-05-09 16:56:37 -0400 (Tue, 09 May 2006)
New Revision: 463

Added:
   trunk/calendar3/deployment/termination/shellscr/
   trunk/calendar3/deployment/termination/shellscr/build.xml
   trunk/calendar3/dumprestore/src/org/bedework/dumprestore/DumpRestoreConfig.java
   trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/rules/AttendeeFieldRule.java
   trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/rules/AttendeeRule.java
   trunk/calendar3/test/caldavTestData/eg/eg21.test
Modified:
   trunk/calendar3/bldfiles/buildsh.xml
   trunk/calendar3/bldfiles/globalDefs.xml
   trunk/calendar3/calCore/resources/hbms/Alarm.hbm.xml
   trunk/calendar3/calCore/resources/hbms/Attendee.hbm.xml
   trunk/calendar3/calCore/resources/hbms/Calendar.hbm.xml
   trunk/calendar3/calEnv/src/org/bedework/calenv/CalOptions.java
   trunk/calendar3/calFacade/src/org/bedework/calfacade/BwAlarm.java
   trunk/calendar3/calFacade/src/org/bedework/calfacade/BwAttendee.java
   trunk/calendar3/calFacade/src/org/bedework/calfacade/BwDateTime.java
   trunk/calendar3/calFacade/src/org/bedework/calfacade/BwEvent.java
   trunk/calendar3/calFacade/src/org/bedework/calfacade/ifs/Attendees.java
   trunk/calendar3/config/configs/democal.options.xml
   trunk/calendar3/config/configs/democal.properties
   trunk/calendar3/deployment/build.xml
   trunk/calendar3/deployment/dumprestore/shellscr/build.xml
   trunk/calendar3/deployment/dumprestore/shellscr/resources/dumpres.sh
   trunk/calendar3/deployment/dumprestore/shellscr/resources/log4j.xml
   trunk/calendar3/dumprestore/build.xml
   trunk/calendar3/dumprestore/src/org/bedework/dumprestore/dump/Dump.java
   trunk/calendar3/dumprestore/src/org/bedework/dumprestore/dump/DumpGlobals.java
   trunk/calendar3/dumprestore/src/org/bedework/dumprestore/dump/dumpling/DumpAttendees.java
   trunk/calendar3/dumprestore/src/org/bedework/dumprestore/dump/dumpling/DumpAuthUsers.java
   trunk/calendar3/dumprestore/src/org/bedework/dumprestore/dump/dumpling/DumpEvents.java
   trunk/calendar3/dumprestore/src/org/bedework/dumprestore/dump/dumpling/DumpUserPrefs.java
   trunk/calendar3/dumprestore/src/org/bedework/dumprestore/dump/dumpling/Dumpling.java
   trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/HibRestore.java
   trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/Restore.java
   trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/RestoreGlobals.java
   trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/RestoreIntf.java
   trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/TimezonesImpl.java
   trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/rules/AdminGroupRule.java
   trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/rules/AuthUserRule.java
   trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/rules/CalendarRule.java
   trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/rules/EntityFieldRule.java
   trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/rules/EntityRule.java
   trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/rules/EventFieldRule.java
   trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/rules/EventRule.java
   trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/rules/FilterRule.java
   trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/rules/FiltersRule.java
   trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/rules/RestoreRule.java
   trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/rules/RestoreRuleSet.java
   trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/rules/SysparsFieldRule.java
   trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/rules/UserPrefsFieldRule.java
   trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/rules/UserRule.java
   trunk/calendar3/test/src/org/bedework/tests/calsvc/CalSvcAlarmsTest.java
Log:
Mostly Dump/restore changes

Further schema changes - renamed calendar path column to bwpath
 alter table CALENDARS alter column path rename to bwpath

Added ownerid column and index and publick to attendees
  alter table ATTENDEES add column ownerid int
  alter table ATTENDEES add column publick char(1)
  CREATE INDEX vattendees_user ON attendees (ownerid)

Changed CalOptions to support extra classes and fix bugs.

Moved system parameters into xml options.
Moved dump/restore runtime options into xml options.

Removed use of bedework.dumprestore.options file. Multiple files just lead to
confusion and the zipped version will eventually allow overrides as run time
parameters.

Many changes to deployment build files to build dump/restore applications as
zipped runnable packages

Disabled (for the time being at least) the targets which run the dump/restore
applications. For the moment cd into the temp directory and run it, e.g.

cd quickstart/calendar3/temp/shellscr/dumpres/
chmod +x cmd
./cmd restore ~/.bedework/caldata.xml

or unzip the zipped application that is in the dist directory.

The zipped application will handle dump, restore, initdb and has a backup option
to save the data in a file with a date tagged name.

Dump new attendee fields.

Still to do:
Check attendees restored correctly

Ensure all fields are dumped and restored
Use subscription name in view dump instead of id.

Use the event key fields instead of id for annotation target and master.

Not dumping preferred calendars in version3.0 - do so.

Need to set calType in 2.3 restore

EventAnnotations still need work. target  and master need setiing.



Modified: trunk/calendar3/bldfiles/buildsh.xml
===================================================================
--- trunk/calendar3/bldfiles/buildsh.xml	2006-05-08 20:45:37 UTC (rev 462)
+++ trunk/calendar3/bldfiles/buildsh.xml	2006-05-09 20:56:37 UTC (rev 463)
@@ -2,7 +2,7 @@
 
 <!-- ===================================================================
      This file builds a runnable application wrapped up as a zip file.
-     Unpacking the zip shoudl result in a directory containing a shell
+     Unpacking the zip should result in a directory containing a shell
      script, a set of jars and any other resources needed.
 
      Properties we need:
@@ -27,6 +27,8 @@
               location="${app.dest.classes}/properties/calendar" />
     <property name="app.dest.resources"
               location="${app.dest.home}/resources" />
+    <property name="app.dest.data"
+              location="${app.dest.home}/data" />
 
     <property name="app.zip.file"
               location="${dist.home}/${propval.app.zip.name}.zip" />
@@ -38,6 +40,9 @@
 
   <target name="build" depends="init">
     <filterset id="property.filters" >
+      <filter token="BW-APP-NAME"
+              value="${org.bedework.deploy.name}"/>
+
       <filter token="HIBERNATE-DIALECT"
               value="${org.bedework.global.hibernate.dialect}" />
 
@@ -48,9 +53,9 @@
               value="${propval.app.description}" />
 
       <filter token="DUMP-CLASS"
-              value="org.bedework.tools.dumprestore.dump.Dump"/>
+              value="org.bedework.dumprestore.dump.Dump"/>
       <filter token="RESTORE-CLASS"
-              value="org.bedework.tools.dumprestore.restore.Restore"/>
+              value="org.bedework.dumprestore.restore.Restore"/>
 
       <filter token="APP-NAME"
               value="${propval.app.name}"/>
@@ -87,13 +92,30 @@
     <!-- Extra libraries specified in calling build file -->
     <copy todir="${app.dest.lib}" flatten="yes" >
       <fileset refid="org.bedework.run.jars" />
-    </copy>
-    <copy todir="${app.dest.lib}" flatten="yes" >
       <fileset refid="org.bedework.run.lib.jars" />
+
+      <!-- local jdbc drivers -->
+      <fileset dir="${org.bedework.jdbc.lib}">
+        <include name="*.jar"/>
+      </fileset>
     </copy>
 
-    <copy todir="${app.dest.classes}"  >
+    <!-- Include the quickstart jdbc driver -->
+    <copy todir="${app.dest.lib}" file="${hsqldb.jdbcdriver.jar}"/>
+
+    <copy todir="${app.dest.classes}">
+      <fileset dir="${org.bedework.core.base}/resources/properties" />
+      <filterset refid="property.filters" />
+    </copy>
+
+    <copy todir="${app.dest.classes}">
+      <fileset dir="${org.bedework.core.base}/resources/hbms" />
+      <filterset refid="property.filters" />
+    </copy>
+
+    <copy todir="${app.dest.classes}" overwrite="yes" >
       <fileset refid="org.bedework.extra.resources" />
+      <filterset refid="property.filters" />
     </copy>
 
     <!-- add the jdbcdriver if defined -->
@@ -117,6 +139,17 @@
           failonerror="false" />
 
     <!-- ===============================================================
+                       Add any data files
+         =============================================================== -->
+
+    <mkdir dir="${app.dest.data}" />
+
+    <copy todir="${app.dest.data}" overwrite="yes" >
+      <fileset refid="org.bedework.shellscr.data" />
+      <filterset refid="property.filters" />
+    </copy>
+
+    <!-- ===============================================================
                        Build the classpath
          =============================================================== -->
 
@@ -136,7 +169,7 @@
                        Copy and modify the shell script
          =============================================================== -->
 
-    <copy toDir="${app.dest.home}"
+    <copy tofile="${app.dest.home}/${propval.app.shellscr.name}"
           file="${app.run.shellscr}" >
       <filterset>
         <filter token="CP"

Modified: trunk/calendar3/bldfiles/globalDefs.xml
===================================================================
--- trunk/calendar3/bldfiles/globalDefs.xml	2006-05-08 20:45:37 UTC (rev 462)
+++ trunk/calendar3/bldfiles/globalDefs.xml	2006-05-09 20:56:37 UTC (rev 463)
@@ -28,10 +28,6 @@
     <!-- comment out to disable build of caldav components.-->
     <property name="org.bedework.build.caldav" value="yes" />
 
-    <!-- First try to load properties from user dump/restore overrides -->
-    <property name="org.bedework.dumprestore.properties.file"
-              location="${user.home}/bedework.dumprestore.properties"/>
-
     <!-- Overriding this when invoking ant allows different user property
          files to be included e.g.
             ant -Dorg.bedework.user.build.properties=/home/me/bedework.properties ...
@@ -42,7 +38,6 @@
     <echo message="Load user properties from ${org.bedework.user.build.properties}" />
 
     <!-- Load user property definition overrides -->
-    <property file="${org.bedework.dumprestore.properties.file}"/>
     <property file="${org.bedework.user.build.properties}" />
     <property file="${calendar.dir}/build.properties"/>
 

Modified: trunk/calendar3/calCore/resources/hbms/Alarm.hbm.xml
===================================================================
--- trunk/calendar3/calCore/resources/hbms/Alarm.hbm.xml	2006-05-08 20:45:37 UTC (rev 462)
+++ trunk/calendar3/calCore/resources/hbms/Alarm.hbm.xml	2006-05-09 20:56:37 UTC (rev 463)
@@ -74,6 +74,10 @@
       <column name="ownerid" not-null="true" index="valarms_user" />
     </many-to-one>
 
+    <property name="publick" type="true_false" >
+      <column name="publick" not-null="true" />
+    </property>
+
     <property name="trigger" column="trigger_rfctime" type="text"/>
 
     <property name="triggerStart" type="true_false">

Modified: trunk/calendar3/calCore/resources/hbms/Attendee.hbm.xml
===================================================================
--- trunk/calendar3/calCore/resources/hbms/Attendee.hbm.xml	2006-05-08 20:45:37 UTC (rev 462)
+++ trunk/calendar3/calCore/resources/hbms/Attendee.hbm.xml	2006-05-09 20:56:37 UTC (rev 463)
@@ -16,6 +16,12 @@
 
     <version name="seq" column="bwsequence" type="integer" />
 
+    <many-to-one name="owner"
+                 class="org.bedework.calfacade.BwUser"
+                 unique="true" >
+      <column name="ownerid" not-null="true" index="vattendees_user" />
+    </many-to-one>
+
     <property name="cn" type="text"/>
     <property name="cuType" column="cutype" type="text"/>
     <property name="delegatedFrom" column="delegated_from" type="text"/>

Modified: trunk/calendar3/calCore/resources/hbms/Calendar.hbm.xml
===================================================================
--- trunk/calendar3/calCore/resources/hbms/Calendar.hbm.xml	2006-05-08 20:45:37 UTC (rev 462)
+++ trunk/calendar3/calCore/resources/hbms/Calendar.hbm.xml	2006-05-09 20:56:37 UTC (rev 463)
@@ -40,7 +40,7 @@
 
     <!-- I wanted to specify unique="true" on this but mysql complains.
       -->
-    <property name="path" column="path" type="string" length="1000"
+    <property name="path" column="bwpath" type="string" length="1000"
               not-null="true"
               index="calpath" lazy="false" />
 

Modified: trunk/calendar3/calEnv/src/org/bedework/calenv/CalOptions.java
===================================================================
--- trunk/calendar3/calEnv/src/org/bedework/calenv/CalOptions.java	2006-05-08 20:45:37 UTC (rev 462)
+++ trunk/calendar3/calEnv/src/org/bedework/calenv/CalOptions.java	2006-05-09 20:56:37 UTC (rev 463)
@@ -98,7 +98,7 @@
     try {
       initOptions();
     } catch (Throwable t) {
-      Logger.getLogger(CalOptions.class).error("Init error", t);
+      error("Init error", t);
       throw new RuntimeException(t);
     }
   }
@@ -577,6 +577,7 @@
 
         Class[] parClasses = meth.getParameterTypes();
         if (parClasses.length != 1) {
+          error("Invalid setter method " + name);
           throw new CalEnvException("org.bedework.calenv.invalid.setter");
         }
 
@@ -587,10 +588,14 @@
         } else if (parClass.getName().equals("int") ||
             parClass.getName().equals("java.lang.Integer")) {
           par = Integer.valueOf(ndval);
+        } else if (parClass.getName().equals("long") ||
+            parClass.getName().equals("java.lang.Long")) {
+          par = Long.valueOf(ndval);
         } else if (parClass.getName().equals("boolean") ||
             parClass.getName().equals("java.lang.Boolean")) {
           par = Boolean.valueOf(ndval);
         } else {
+          error("Unsupported par class for method " + name);
           throw new CalEnvException("org.bedework.calenv.unsupported.setter");
         }
 
@@ -617,6 +622,8 @@
            * object.
            */
           if (val != null) {
+            error("Nested classes not yet supported for element " + valnode.name +
+                  " and class " + className);
             throw new CalEnvException("org.bedework.calenv.nested.classes.unsupported");
           }
 
@@ -628,6 +635,8 @@
         }
 
         doChildren(valnode, el, val);
+
+        val = null;
       }
     } catch (CalEnvException ce) {
       throw ce;
@@ -636,6 +645,14 @@
     }
   }
 
+  private static void error(String msg) {
+    Logger.getLogger(CalOptions.class).error(msg);
+  }
+
+  private static void error(String msg, Throwable t) {
+    Logger.getLogger(CalOptions.class).error(msg, t);
+  }
+
   /* We've been dealing with property names - convert the dotted notation to a path
    */
   private static String[] makePathElements(String val) {

Modified: trunk/calendar3/calFacade/src/org/bedework/calfacade/BwAlarm.java
===================================================================
--- trunk/calendar3/calFacade/src/org/bedework/calfacade/BwAlarm.java	2006-05-08 20:45:37 UTC (rev 462)
+++ trunk/calendar3/calFacade/src/org/bedework/calfacade/BwAlarm.java	2006-05-09 20:56:37 UTC (rev 463)
@@ -179,6 +179,27 @@
    *                      Bean methods
    * ==================================================================== */
 
+  /** Set the owner
+   *
+   * @param val     UserVO owner of the entity
+   */
+  public void setOwner(BwUser val) {
+    super.setOwner(val);
+    if (attendeesHelper != null) {
+      attendeesHelper.setOwner(val);
+    }
+  }
+
+  /**
+   * @param val
+   */
+  public void setPublick(boolean val) {
+    super.setPublick(val);
+    if (attendeesHelper != null) {
+      attendeesHelper.setPublick(val);
+    }
+  }
+
   /** Set the alarmType for this event
    *
    * @param val    alarmType
@@ -559,7 +580,7 @@
    */
   public void clearAttendees() {
     getAttendeesHelper().clearAttendees();
-    setAttendees(attendeesHelper.getAttendees());
+    setAttendees(getAttendeesHelper().getAttendees());
   }
 
   /* (non-Javadoc)
@@ -567,7 +588,7 @@
    */
   public void addAttendee(BwAttendee val) {
     getAttendeesHelper().addAttendee(val);
-    setAttendees(attendeesHelper.getAttendees());
+    setAttendees(getAttendeesHelper().getAttendees());
   }
 
   /* (non-Javadoc)
@@ -575,7 +596,7 @@
    */
   public void addAttendeeEmail(String val) {
     getAttendeesHelper().addAttendeeEmail(val);
-    setAttendees(attendeesHelper.getAttendees());
+    setAttendees(getAttendeesHelper().getAttendees());
   }
 
   /* (non-Javadoc)
@@ -586,7 +607,7 @@
       return null;
     }
 
-    return attendeesHelper.getAttendeeEmailList();
+    return getAttendeesHelper().getAttendeeEmailList();
   }
 
   /* (non-Javadoc)
@@ -597,7 +618,7 @@
       return null;
     }
 
-    return attendeesHelper.copyAttendees();
+    return getAttendeesHelper().copyAttendees();
   }
 
   /* (non-Javadoc)
@@ -608,7 +629,7 @@
       return null;
     }
 
-    return attendeesHelper.cloneAttendees();
+    return getAttendeesHelper().cloneAttendees();
   }
 
   /*
@@ -817,7 +838,7 @@
 
   private Attendees getAttendeesHelper() {
     if (attendeesHelper == null) {
-      attendeesHelper = new Attendees();
+      attendeesHelper = new Attendees(getOwner(), getPublick());
     }
 
     return attendeesHelper;

Modified: trunk/calendar3/calFacade/src/org/bedework/calfacade/BwAttendee.java
===================================================================
--- trunk/calendar3/calFacade/src/org/bedework/calfacade/BwAttendee.java	2006-05-08 20:45:37 UTC (rev 462)
+++ trunk/calendar3/calFacade/src/org/bedework/calfacade/BwAttendee.java	2006-05-09 20:56:37 UTC (rev 463)
@@ -53,13 +53,13 @@
 */
 package org.bedework.calfacade;
 
-import org.bedework.calfacade.base.BwDbentity;
+import org.bedework.calfacade.base.BwOwnedDbentity;
 
 /** Represent an attendee
  *
  *  @author Mike Douglass   douglm at rpi.edu
  */
-public class BwAttendee extends BwDbentity implements Comparable {
+public class BwAttendee extends BwOwnedDbentity implements Comparable {
   /* Params fields */
 
   private String cn;
@@ -85,6 +85,8 @@
 
   /** Constructor
    *
+   * @param owner
+   * @param publick
    * @param cn
    * @param cuType
    * @param delegatedFrom
@@ -98,7 +100,9 @@
    * @param sentBy
    * @param attendeeUri
    */
-  public BwAttendee(String cn,
+  public BwAttendee(BwUser owner,
+                    boolean publick,
+                    String cn,
                     String cuType,
                     String delegatedFrom,
                     String delegatedTo,
@@ -110,6 +114,7 @@
                     String partstat,
                     String sentBy,
                     String attendeeUri) {
+    super(owner, publick);
     this.cn = cn;
     this.cuType = cuType;
     this.delegatedFrom = delegatedFrom;
@@ -401,7 +406,9 @@
   }
 
   public Object clone() {
-    BwAttendee nobj = new BwAttendee(getCn(),
+    BwAttendee nobj = new BwAttendee((BwUser)getOwner().clone(),
+                                     getPublick(),
+                                     getCn(),
                                      getCuType(),
                                      getDelegatedFrom(),
                                      getDelegatedTo(),

Modified: trunk/calendar3/calFacade/src/org/bedework/calfacade/BwDateTime.java
===================================================================
--- trunk/calendar3/calFacade/src/org/bedework/calfacade/BwDateTime.java	2006-05-08 20:45:37 UTC (rev 462)
+++ trunk/calendar3/calFacade/src/org/bedework/calfacade/BwDateTime.java	2006-05-09 20:56:37 UTC (rev 463)
@@ -422,7 +422,8 @@
    * @param timezones
    * @throws CalFacadeException
    */
-  public void init(boolean dateType, String date, String tzid, CalTimezones timezones) throws CalFacadeException {
+  public void init(boolean dateType, String date, String tzid,
+                   CalTimezones timezones) throws CalFacadeException {
     setDateType(dateType);
     setDtval(date);
     setTzid(tzid);

Modified: trunk/calendar3/calFacade/src/org/bedework/calfacade/BwEvent.java
===================================================================
--- trunk/calendar3/calFacade/src/org/bedework/calfacade/BwEvent.java	2006-05-08 20:45:37 UTC (rev 462)
+++ trunk/calendar3/calFacade/src/org/bedework/calfacade/BwEvent.java	2006-05-09 20:56:37 UTC (rev 463)
@@ -246,7 +246,7 @@
 
   private Collection attendees;
 
-  private Attendees attendeesHelper = new Attendees();
+  private Attendees attendeesHelper;
 
   private boolean recurring;
 
@@ -337,6 +337,27 @@
    *                      Bean methods
    * ==================================================================== */
 
+  /** Set the owner
+   *
+   * @param val     UserVO owner of the entity
+   */
+  public void setOwner(BwUser val) {
+    super.setOwner(val);
+    if (attendeesHelper != null) {
+      attendeesHelper.setOwner(val);
+    }
+  }
+
+  /**
+   * @param val
+   */
+  public void setPublick(boolean val) {
+    super.setPublick(val);
+    if (attendeesHelper != null) {
+      attendeesHelper.setPublick(val);
+    }
+  }
+
   /** Set the event's name
    *
    * @param val    String event's name
@@ -829,7 +850,7 @@
    */
   public void clearAttendees() {
     getAttendeesHelper().clearAttendees();
-    setAttendees(attendeesHelper.getAttendees());
+    setAttendees(getAttendeesHelper().getAttendees());
     setAttendeesChanged(true);
   }
 
@@ -838,7 +859,7 @@
    */
   public void addAttendee(BwAttendee val) {
     getAttendeesHelper().addAttendee(val);
-    setAttendees(attendeesHelper.getAttendees());
+    setAttendees(getAttendeesHelper().getAttendees());
     setAttendeesChanged(true);
   }
 
@@ -847,7 +868,7 @@
    */
   public void addAttendeeEmail(String val) {
     getAttendeesHelper().addAttendeeEmail(val);
-    setAttendees(attendeesHelper.getAttendees());
+    setAttendees(getAttendeesHelper().getAttendees());
     setAttendeesChanged(true);
   }
 
@@ -859,7 +880,7 @@
       return null;
     }
 
-    return attendeesHelper.getAttendeeEmailList();
+    return getAttendeesHelper().getAttendeeEmailList();
   }
 
   /* (non-Javadoc)
@@ -870,7 +891,7 @@
       return null;
     }
 
-    return attendeesHelper.copyAttendees();
+    return getAttendeesHelper().copyAttendees();
   }
 
   /* (non-Javadoc)
@@ -881,7 +902,7 @@
       return null;
     }
 
-    return attendeesHelper.cloneAttendees();
+    return getAttendeesHelper().cloneAttendees();
   }
 
   /* ====================================================================
@@ -1214,7 +1235,7 @@
 
   private Attendees getAttendeesHelper() {
     if (attendeesHelper == null) {
-      attendeesHelper = new Attendees();
+      attendeesHelper = new Attendees(getOwner(), getPublick());
     }
 
     return attendeesHelper;

Modified: trunk/calendar3/calFacade/src/org/bedework/calfacade/ifs/Attendees.java
===================================================================
--- trunk/calendar3/calFacade/src/org/bedework/calfacade/ifs/Attendees.java	2006-05-08 20:45:37 UTC (rev 462)
+++ trunk/calendar3/calFacade/src/org/bedework/calfacade/ifs/Attendees.java	2006-05-09 20:56:37 UTC (rev 463)
@@ -54,35 +54,78 @@
 package org.bedework.calfacade.ifs;
 
 import org.bedework.calfacade.BwAttendee;
+import org.bedework.calfacade.BwUser;
 
 import java.io.Serializable;
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Iterator;
 import java.util.TreeSet;
-import java.util.Vector;
 
-/** An interface defining the operations we can carry out on attendees and
+/** A class defining the operations we can carry out on attendees and
  * collections of attendees
  *
  *  @version 1.0
  *  @author Mike Douglass   douglm @ rpi.edu
  */
 public class Attendees implements Serializable {
+  private BwUser owner;
+  private boolean publick;
   private Collection attendees;
 
   /** Constructor
+   *
+   * @param owner
+   * @param publick
    */
-  public Attendees() {
+  public Attendees(BwUser owner, boolean publick) {
+    this.owner = owner;
+    this.publick = publick;
   }
 
   /** Constructor
    *
+   * @param owner
+   * @param publick
    * @param attendees
    */
-  public Attendees(Collection attendees) {
+  public Attendees(BwUser owner, boolean publick, Collection attendees) {
+    this(owner, publick);
     this.attendees = attendees;
   }
 
+  /** Set the owner for this object and any contained objects.
+   *
+   * @param val
+   */
+  public void setOwner(BwUser val) {
+    owner = val;
+
+    if (attendees != null) {
+      Iterator it = iterateAttendees();
+      while (it.hasNext()) {
+        BwAttendee att = (BwAttendee)it.next();
+        att.setOwner(owner);
+      }
+    }
+  }
+
+  /** Set the public flag for this object and any contained objects.
+   *
+   * @param val
+   */
+  public void setPublick(boolean val) {
+    publick = val;
+
+    if (attendees != null) {
+      Iterator it = iterateAttendees();
+      while (it.hasNext()) {
+        BwAttendee att = (BwAttendee)it.next();
+        att.setPublick(publick);
+      }
+    }
+  }
+
   /** Set the attendees
    *
    * @param val    Collection of attendees
@@ -125,6 +168,8 @@
     Collection as = getAttendees();
 
     if (!as.contains(val)) {
+      val.setOwner(owner);
+      val.setPublick(publick);
       as.add(val);
     }
   }
@@ -137,6 +182,8 @@
     Collection as = getAttendees();
     BwAttendee att = new BwAttendee();
 
+    att.setOwner(owner);
+    att.setPublick(publick);
     att.setAttendeeUri(val);
 
     if (!as.contains(att)) {
@@ -149,7 +196,7 @@
    *  @return String[]   attendees list
    */
   public String[] getAttendeeEmailList() {
-    Vector v = new Vector();
+    ArrayList al = new ArrayList();
     Iterator it = iterateAttendees();
     while (it.hasNext()) {
       BwAttendee att = (BwAttendee)it.next();
@@ -160,12 +207,12 @@
         // ???
       } else if (!uri.toUpperCase().startsWith("MAILTO:")) {
         // Assume an email without MAILTO: prefix.
-        v.add(uri);
+        al.add(uri);
       } else {
-        v.add(uri.substring(7));
+        al.add(uri.substring(7));
       }
     }
-    return (String[])v.toArray(new String[v.size()]);
+    return (String[])al.toArray(new String[al.size()]);
   }
 
   /** Return a copy of the collection

Modified: trunk/calendar3/config/configs/democal.options.xml
===================================================================
--- trunk/calendar3/config/configs/democal.options.xml	2006-05-08 20:45:37 UTC (rev 462)
+++ trunk/calendar3/config/configs/democal.options.xml	2006-05-09 20:56:37 UTC (rev 463)
@@ -2,6 +2,7 @@
   <org>
     <bedework>
       <global>
+
         <module>
           <user-ldap-group classname="org.bedework.calcore.ldap.LdapConfigProperties">
             <initialContextFactory>com.sun.jndi.ldap.LdapCtxFactory</initialContextFactory>
@@ -15,7 +16,70 @@
             <debug>true</debug>
           </user-ldap-group>
         </module>
+
       </global>
+
+      <!-- Only used for system initialisation or conversion from 2.3 - ignored thereafter -->
+      <syspars classname="org.bedework.calfacade.BwSystem">
+        <!-- name must match the global system name -->
+        <name>bedework</name>
+        <tzid>America/New_York</tzid>
+        <systemid>demobedework at mysite.edu</systemid>
+
+        <publicCalendarRoot>public</publicCalendarRoot>
+        <userCalendarRoot>user</userCalendarRoot>
+        <userDefaultCalendar>calendar</userDefaultCalendar>
+        <defaultTrashCalendar>Trash</defaultTrashCalendar>
+        <userInbox>Inbox</userInbox>
+        <userOutbox>Outbox</userOutbox>
+        <deletedCalendar>Deleted</deletedCalendar>
+        <busyCalendar>Busy</busyCalendar>
+
+        <defaultUserViewName>All</defaultUserViewName>
+
+        <publicUser>user</publicUser>
+
+        <httpConnectionsPerUser>10</httpConnectionsPerUser>
+        <httpConnectionsPerHost>50</httpConnectionsPerHost>
+        <httpConnections>200</httpConnections>
+
+
+        <!-- size limits -->
+        <maxPublicDescriptionLength>500</maxPublicDescriptionLength>
+        <maxUserDescriptionLength>1000</maxUserDescriptionLength>
+        <maxUserEntitySize>100000</maxUserEntitySize>
+        <defaultUserQuota>10000000</defaultUserQuota> <!-- 10 Meg OK? -->
+
+        <!-- Max number of instances per recurring event -->
+        <maxInstances>1000</maxInstances>
+
+        <userauthClass>org.bedework.calcore.hibernate.UserAuthUWDbImpl</userauthClass>
+        <mailerClass>org.bedework.mail.DummyMailer</mailerClass>
+        <admingroupsClass>org.bedework.calcore.hibernate.AdminGroupsDbImpl</admingroupsClass>
+        <!--
+        <usergroupsClass>org.bedework.calcore.ldap.UserGroupsLdapImpl</usergroupsClass>
+        -->
+        <usergroupsClass>org.bedework.calcore.hibernate.GroupsDbImpl</usergroupsClass>
+      </syspars>
+
+      <app>
+        <dumpres classname="org.bedework.dumprestore.DumpRestoreConfig">
+          <debug>true</debug>
+          <debugEntity>false</debugEntity>
+          <superGroupName>campusAdminGroups</superGroupName>
+          <defaultPublicCalPath>/public/Other Events/Other</defaultPublicCalPath>
+        </dumpres>
+
+        <!-- Use the restore utility to convert from uwcal 2.3 -->
+        <restoreFrom2p3px classname="org.bedework.dumprestore.DumpRestoreConfig">
+          <debug>true</debug>
+          <debugEntity>false</debugEntity>
+          <from2p3px>true</from2p3px>
+          <timezonesFilename>resources/bwtimezones.xml</timezonesFilename>
+          <superGroupName>campusAdminGroups</superGroupName>
+          <defaultPublicCalPath>/public/Other Events/Other</defaultPublicCalPath>
+        </restoreFrom2p3px>
+      </app>
     </bedework>
   </org>
 </bedework-options>

Modified: trunk/calendar3/config/configs/democal.properties
===================================================================
--- trunk/calendar3/config/configs/democal.properties	2006-05-08 20:45:37 UTC (rev 462)
+++ trunk/calendar3/config/configs/democal.properties	2006-05-09 20:56:37 UTC (rev 463)
@@ -8,14 +8,18 @@
 # being deployed. The globals section defines which modules will be
 # deployed as well as some other global properties.
 #
+# Note that the options and properties are undergoing yet another upheaval.
+# They will be divided into two parts, build-time ant properties in this file
+# and run-time application properties in a corresponding xxx.options.xml file.
+#
 # --------------------------------------------------------------------
 #
 # Global options
 #
 
 # Define the names of the applications we want to build
-org.bedework.install.app.names=bwconfig,CalAdmin,Events,UserCal,Pubcaldav,Usercaldav
-org.bedework.install.app.types=webconfig,webadmin,webpublic,webuser,publiccaldav,usercaldav
+org.bedework.install.app.names=bwconfig,CalAdmin,Events,UserCal,Pubcaldav,Usercaldav,dumpres,restoreFrom2p3px
+org.bedework.install.app.types=webconfig,webadmin,webpublic,webuser,publiccaldav,usercaldav,dumprestore,dumprestore
 
 #
 # --------------------------------------------------------------------
@@ -34,33 +38,6 @@
 org.bedework.global.personal.calendar.uri=/ucal
 
 #
-# --------------------------------------------------------------------
-#
-# System parameters used globally by the system and read from the db.
-#
-org.bedework.syspar.tzid=America/New_York
-org.bedework.syspar.systemid=demobedework at mysite.edu
-
-org.bedework.syspar.public.calroot=public
-org.bedework.syspar.user.calroot=user
-org.bedework.syspar.default.user.calendar=calendar
-org.bedework.syspar.default.trash.calendar=Trash
-org.bedework.syspar.default.user.inbox=Inbox
-org.bedework.syspar.default.user.outbox=Outbox
-org.bedework.syspar.default.user.view=All
-
-org.bedework.syspar.public.user=public-user
-
-org.bedework.syspar.http.connections.peruser=10
-org.bedework.syspar.http.connections.perhost=50
-org.bedework.syspar.http.connections=200
-
-org.bedework.syspar.userauthclass=org.bedework.calcore.hibernate.UserAuthUWDbImpl
-org.bedework.syspar.mailerclass=org.bedework.mail.DummyMailer
-org.bedework.syspar.admingroupsclass=org.bedework.calcore.hibernate.AdminGroupsDbImpl
-org.bedework.syspar.usergroupsclass=org.bedework.calcore.ldap.UserGroupsLdapImpl
-#org.bedework.syspar.usergroupsclass=org.bedework.calcore.hibernate.GroupsDbImpl
-#
 # -------------------------------------------------------------------
 #
 # Bedework config web client
@@ -232,32 +209,27 @@
 # Dumprestore
 #
 
-org.bedework.app.dumprestore.zip.name=bwdumpres
-org.bedework.app.dumprestore.description=Bedework dump/restore utility
-org.bedework.app.dumprestore.version=3.0
-org.bedework.app.dumprestore.jdbcdriver.jar=${appserver.jdbcdriver.jar}
+# -------------- normal dump/restore build properties ------------------
 
-# -------------- dump parameters ------------------
+org.bedework.app.dumpres.shellscr.name=cmd
+org.bedework.app.dumpres.zip.name=dumpres
+org.bedework.app.dumpres.description=Bedework dump/restore utility
+org.bedework.app.dumpres.version=3.1
+org.bedework.app.dumpres.dumpfile=${calendar.dir}/dumprestore/initcaldata.xml
+org.bedework.app.dumpres.hibernate.dialect=org.hibernate.dialect.HSQLDialect
+org.bedework.app.dumpres.jdbcdriver=org.hsqldb.jdbcDriver
+org.bedework.app.dumpres.jdbcurl=jdbc:hsqldb:hsql://localhost:8887
+org.bedework.app.dumpres.jdbcid=sa
+org.bedework.app.dumpres.jdbcpw=
 
-org.bedework.dump.arg.dumpfile=${user.home}/.bedework/caldata.xml
-org.bedework.dump.arg.debug=-debug
-org.bedework.dump.arg.hibernate.dialect=org.hibernate.dialect.HSQLDialect
-org.bedework.dump.arg.jdbcdriver=org.hsqldb.jdbcDriver
-org.bedework.dump.arg.jdbcurl=jdbc:hsqldb:hsql://localhost:8887
-org.bedework.dump.arg.jdbcid=sa
-org.bedework.dump.arg.jdbcpw=
+# -------------- convert from 2.3 build properties - use restore only ------------------
 
-# -------------- restore parameters ------------------
+org.bedework.app.restoreFrom2p3px.shellscr.name=cmd
+org.bedework.app.restoreFrom2p3px.zip.name=restoreFrom2p3px
+org.bedework.app.restoreFrom2p3px.dumpfile=${calendar.dir}/dumprestore/initcaldata.xml
+org.bedework.app.restoreFrom2p3px.hibernate.dialect=org.hibernate.dialect.HSQLDialect
+org.bedework.app.restoreFrom2p3px.jdbcdriver=org.hsqldb.jdbcDriver
+org.bedework.app.restoreFrom2p3px.jdbcurl=jdbc:hsqldb:hsql://localhost:8887
+org.bedework.app.restoreFrom2p3px.jdbcid=sa
+org.bedework.app.restoreFrom2p3px.jdbcpw=
 
-org.bedework.restore.arg.dumpfile=${calendar.dir}/dumprestore/initcaldata.xml
-org.bedework.restore.arg.debug=-debug
-org.bedework.restore.arg.from2p3px=
-org.bedework.restore.arg.fixcals=-nfixcals
-org.bedework.restore.arg.defaultpubliccal=
-org.bedework.restore.arg.hibernate.dialect=org.hibernate.dialect.HSQLDialect
-org.bedework.restore.arg.jdbcdriver=org.hsqldb.jdbcDriver
-org.bedework.restore.arg.jdbcurl=jdbc:hsqldb:hsql://localhost:8887
-org.bedework.restore.arg.jdbcid=sa
-org.bedework.restore.arg.jdbcpw=
-org.bedework.restore.arg.timezones=
-

Modified: trunk/calendar3/deployment/build.xml
===================================================================
--- trunk/calendar3/deployment/build.xml	2006-05-08 20:45:37 UTC (rev 462)
+++ trunk/calendar3/deployment/build.xml	2006-05-09 20:56:37 UTC (rev 463)
@@ -144,6 +144,8 @@
 
     <antcall target="deploy.standalone.apps" inheritrefs="true" />
 
+    <antcall target="deploy.shellscr.apps" inheritrefs="true" />
+
     <antcall target="deploy.portal.apps" inheritrefs="true" />
 
     <antcall target="deploy.j2ee.apps" inheritrefs="true" />
@@ -168,6 +170,11 @@
     <antcall target="deploy.apps" inheritrefs="true" />
   </target>
 
+  <target name="deploy.shellscr.apps" if="org.bedework.global.build.standalone.app" >
+    <property name="org.bedework.deploy.kind" value="shellscr" />
+    <antcall target="deploy.apps" inheritrefs="true" />
+  </target>
+
   <target name="deploy.portal.apps" if="org.bedework.global.portal.platform" >
     <property name="org.bedework.deploy.kind"
               value="${org.bedework.global.portal.platform}" />
@@ -209,15 +216,9 @@
                 types="${org.bedework.install.app.types}"
                 prefix="org.bedework.deploy">
       <sequential>
-        <propertyset id="app-properties">
-          <propertyref prefix="org.bedework.app.${org.bedework.deploy.name}"/>
-          <globmapper from="org.bedework.app.${org.bedework.deploy.name}.*" to="propval.app.*"/>
-        </propertyset>
-
-        <ant antfile="${org.bedework.deployment.base}/${org.bedework.deploy.type}/${org.bedework.deploy.kind}/build.xml"
-             inheritrefs="true" target="build.configured" >
-          <propertyset refid="app-properties" />
-        </ant>
+        <available file="${org.bedework.deployment.base}/${org.bedework.deploy.type}/${org.bedework.deploy.kind}/build.xml"
+                   property="app.kind.available" />
+        <antcall target="build.available.configured.app" inheritrefs="true" />
       </sequential>
     </forEachApp>
 
@@ -226,20 +227,26 @@
          inheritrefs="true" target="build.configured" />
   </target>
 
+  <target name="build.available.configured.app" if="app.kind.available">
+    <!-- Pick out the application build properties based on the prefix "org.bedework.app."
+         and the deployment name -->
+    <propertyset id="app-properties">
+      <propertyref prefix="org.bedework.app.${org.bedework.deploy.name}"/>
+      <globmapper from="org.bedework.app.${org.bedework.deploy.name}.*" to="propval.app.*"/>
+    </propertyset>
+
+    <ant antfile="${org.bedework.deployment.base}/${org.bedework.deploy.type}/${org.bedework.deploy.kind}/build.xml"
+         inheritrefs="true" target="build.configured" >
+      <propertyset refid="app-properties" />
+    </ant>
+  </target>
+
   <target name="deploy.apps">
     <forEachApp names="${org.bedework.install.app.names}"
                 types="${org.bedework.install.app.types}"
                 prefix="org.bedework.deploy">
       <sequential>
-        <propertyset id="app-properties">
-          <propertyref prefix="org.bedework.app.${org.bedework.deploy.name}"/>
-          <globmapper from="org.bedework.app.${org.bedework.deploy.name}.*" to="propval.app.*"/>
-        </propertyset>
-
-        <ant antfile="${org.bedework.deployment.base}/${org.bedework.deploy.type}/${org.bedework.deploy.kind}/build.xml"
-             inheritrefs="true" target="deploy" >
-          <propertyset refid="app-properties" />
-        </ant>
+        <antcall target="wrap.deploy.available.app" inheritrefs="true" />
       </sequential>
     </forEachApp>
 
@@ -247,4 +254,23 @@
     <ant antfile="${org.bedework.deployment.base}/termination/${org.bedework.deploy.kind}/build.xml"
          inheritrefs="true" target="deploy" />
   </target>
+
+  <target name="wrap.deploy.available.app">
+    <!-- just to make app.kind.available go away -->
+    <available file="${org.bedework.deployment.base}/${org.bedework.deploy.type}/${org.bedework.deploy.kind}/build.xml"
+               property="app.kind.available" />
+    <antcall target="deploy.available.app" inheritrefs="true" />
+  </target>
+
+  <target name="deploy.available.app" if="app.kind.available">
+    <propertyset id="app-properties">
+      <propertyref prefix="org.bedework.app.${org.bedework.deploy.name}"/>
+      <globmapper from="org.bedework.app.${org.bedework.deploy.name}.*" to="propval.app.*"/>
+    </propertyset>
+
+    <ant antfile="${org.bedework.deployment.base}/${org.bedework.deploy.type}/${org.bedework.deploy.kind}/build.xml"
+         inheritrefs="true" target="deploy" >
+      <propertyset refid="app-properties" />
+    </ant>
+  </target>
 </project>

Modified: trunk/calendar3/deployment/dumprestore/shellscr/build.xml
===================================================================
--- trunk/calendar3/deployment/dumprestore/shellscr/build.xml	2006-05-08 20:45:37 UTC (rev 462)
+++ trunk/calendar3/deployment/dumprestore/shellscr/build.xml	2006-05-09 20:56:37 UTC (rev 463)
@@ -8,7 +8,7 @@
   <target name="init" >
     <dirname property="this.dir" file="${ant.file}"/>
 
-    <property name="app.sou.dir" location="${org.bedework.tools.base}" />
+    <property name="app.sou.dir" location="${org.bedework.dumprestore.base}" />
 
     <property name="app.resources.dir"
               location="${this.dir}/resources" />
@@ -46,26 +46,29 @@
 
     <!-- Extra resources -->
     <property name="app.temp.home"
-              location="${org.bedework.temp.shellscr.home}/bldtemp/${propval.zip.name}" />
+              location="${org.bedework.temp.shellscr.home}/bldtemp/${propval.app.zip.name}" />
     <mkdir dir="${app.temp.home}"/>
     <mkdir dir="${app.temp.home}/resources"/>
-    <copy todir="${app.temp.home}/resources">
-      <fileset dir="${org.bedework.core.base}/resources/hbms" />
-    </copy>
-    <copy todir="${app.temp.home}/resources">
-      <fileset dir="${org.bedework.core.base}/resources/properties" />
-    </copy>
     <echo file="${app.temp.home}/resources/hibernate.properties">
-hibernate.dialect=${org.bedework.dump.arg.hibernate.dialect}
-hibernate.connection.driver_class=${org.bedework.dump.arg.jdbcdriver}
-hibernate.connection.username=${org.bedework.dump.arg.jdbcid}
-hibernate.connection.password=${org.bedework.dump.arg.jdbcpw}
-hibernate.connection.url=${org.bedework.dump.arg.jdbcurl}
+hibernate.query.substitutions true 'T', false 'F', yes 'Y', no 'N'
+hibernate.dialect=${propval.app.hibernate.dialect}
+hibernate.connection.driver_class=${propval.app.jdbcdriver}
+hibernate.connection.username=${propval.app.jdbcid}
+hibernate.connection.password=${propval.app.jdbcpw}
+hibernate.connection.url=${propval.app.jdbcurl}
+hibernate.cglib.use_reflection_optimizer=false
+#
+# Here for better debugging
+#
+hibernate.jdbc.batch_size=0
     </echo>
 
-    <fileset id="org.bedework.extra.resources" dir="${app.temp.home}/resources" >
-    </fileset>
+    <mkdir dir="${app.temp.home}/data"/>
+    <copy todir="${app.temp.home}/data" file="${app.sou.dir}/resources/initbedework.xml" />
 
+    <fileset id="org.bedework.extra.resources" dir="${app.temp.home}/resources" />
+    <fileset id="org.bedework.shellscr.data" dir="${app.temp.home}/data" />
+
     <!-- ===============================================================
          Build the shell script
          =============================================================== -->

Modified: trunk/calendar3/deployment/dumprestore/shellscr/resources/dumpres.sh
===================================================================
--- trunk/calendar3/deployment/dumprestore/shellscr/resources/dumpres.sh	2006-05-08 20:45:37 UTC (rev 462)
+++ trunk/calendar3/deployment/dumprestore/shellscr/resources/dumpres.sh	2006-05-09 20:56:37 UTC (rev 463)
@@ -11,23 +11,27 @@
 DUMPCMD="$JAVA_HOME/bin/java -cp $cp @DUMP-CLASS@"
 RESTORECMD="$JAVA_HOME/bin/java -cp $cp @RESTORE-CLASS@"
 
+APPNAME=@BW-APP-NAME@
 
-
 case "$1" in
   dump)
-    echo $DUMPCMD -debug -f $2 $3 $4 $5 $6 $7 $8 $9
-    $DUMPCMD -debug -f $2 $3 $4 $5 $6 $7 $8 $9
+    echo $DUMPCMD -appname $APPNAME -f $2 $3 $4 $5 $6 $7 $8 $9
+    $DUMPCMD -appname $APPNAME -f $2 $3 $4 $5 $6 $7 $8 $9
     ;;
   restore)
-    echo $RESTORECMD -debug -f $2 $3 $4 $5 $6 $7 $8 $9
-    $RESTORECMD -debug -f $2 $3 $4 $5 $6 $7 $8 $9
+    echo $RESTORECMD -appname $APPNAME -f $2 $3 $4 $5 $6 $7 $8 $9
+    $RESTORECMD -appname $APPNAME -f $2 $3 $4 $5 $6 $7 $8 $9
     ;;
   backup)
     TARGET=$2/$3`date +%Y%m%d_%H%M%S`.ldif
-    echo $RUNCMD -dump -f $TARGET
-    $RUNCMD -dump -f $TARGET
+    echo $DUMPCMD -appname $APPNAME -f $TARGET
+    $DUMPCMD -appname $APPNAME -f $TARGET
     ;;
+  initdb)
+    echo $RESTORECMD -appname $APPNAME -f ./data/initbedework.xml -initSyspars
+    $RESTORECMD -appname $APPNAME -f ./data/initbedework.xml -initSyspars
+    ;;
   *)
-    echo $"Usage: $0 {dump <filename>|restore <filename>|backup <directory> <prefix>}"
+    echo $"Usage: $0 {dump <filename>|restore <filename>|backup <directory> <prefix>} || initdb"
 esac
 

Modified: trunk/calendar3/deployment/dumprestore/shellscr/resources/log4j.xml
===================================================================
--- trunk/calendar3/deployment/dumprestore/shellscr/resources/log4j.xml	2006-05-08 20:45:37 UTC (rev 462)
+++ trunk/calendar3/deployment/dumprestore/shellscr/resources/log4j.xml	2006-05-09 20:56:37 UTC (rev 463)
@@ -160,16 +160,18 @@
    <!-- Limit categories -->
    <!-- ================ -->
 
-   <!-- Limit the org.apache.commons category to INFO as its DEBUG is verbose -->
-   <category name="org.apache.commons">
+   <!-- Limit the org.apache category to INFO as its DEBUG is verbose -->
+   <category name="org.apache">
       <priority value="INFO"/>
    </category>
 
-   <category name="org.apache.commons.digester">
+   <!-- ical4j is noisy -->
+   <category name="net.fortuna.ical4j">
       <priority value="INFO"/>
    </category>
 
-   <category name="org.apache.commons.digester.SimpleRegexMatcher">
+   <!-- caching is noisy too -->
+   <category name="net.sf.ehcache">
       <priority value="INFO"/>
    </category>
 
@@ -204,18 +206,6 @@
      <priority value="DEBUG"/>
    </category>
 
-   <!-- Set washington categories -->
-   <category name="edu.washington">
-     <priority value="DEBUG"/>
-   </category>
-
-   <!-- Set hibernate categories
-        Setting to DEBUG gives a lot of output.
-     -->
-   <category name="net.sf.hibernate">
-     <priority value="INFO"/>
-   </category>
-
    <!--
       | An example of enabling the custom TRACE level priority that is used
       | by the JBoss internals to diagnose low level details. This example

Added: trunk/calendar3/deployment/termination/shellscr/build.xml
===================================================================
--- trunk/calendar3/deployment/termination/shellscr/build.xml	                        (rev 0)
+++ trunk/calendar3/deployment/termination/shellscr/build.xml	2006-05-09 20:56:37 UTC (rev 463)
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>
+
+<!-- ===================================================================
+     shellscr terminations tasks.
+     =================================================================== -->
+
+<project name="bwpubcaldav.deploy" default="deploy" >
+  <target name="init">
+  </target>
+
+  <target name="deploy" depends="init,build.configured" >
+  </target>
+
+  <target name="build.configured" depends="init" >
+  </target>
+</project>

Modified: trunk/calendar3/dumprestore/build.xml
===================================================================
--- trunk/calendar3/dumprestore/build.xml	2006-05-08 20:45:37 UTC (rev 462)
+++ trunk/calendar3/dumprestore/build.xml	2006-05-09 20:56:37 UTC (rev 463)
@@ -15,96 +15,6 @@
 
     <property name="dump.class" value="org.bedework.dumprestore.dump.Dump" />
     <property name="restore.class" value="org.bedework.dumprestore.restore.Restore" />
-
-    <property name="org.bedework.dump.jdbcdriver.jar"
-              value="${appserver.jdbcdriver.jar}" />
-
-    <property name="dumprestore.run.base"
-              location="${org.bedework.temp.home}/dumprestore"/>
-    <property name="dumprestore.run.resources"
-              location="${org.bedework.temp.home}/dumprestore/resources"/>
-    <delete dir="${dumprestore.run.base}" />
-    <mkdir dir="${dumprestore.run.base}" />
-    <mkdir dir="${dumprestore.run.resources}" />
-
-    <copy todir="${dumprestore.run.resources}">
-      <fileset dir="${org.bedework.core.base}/resources/properties" />
-    </copy>
-    <copy todir="${dumprestore.run.resources}">
-      <fileset dir="${org.bedework.core.base}/resources/hbms" />
-    </copy>
-
-    <path id="lib.dump.class.path">
-      <fileset dir="${org.bedework.temp.jars}">
-        <include name="*.jar"/>
-      </fileset>
-      <fileset dir="${org.bedework.default.lib}">
-        <include name="*.jar"/>
-      </fileset>
-      <fileset dir="${hibernate.jars.dir}">
-        <include name="*.jar"/>
-      </fileset>
-      <fileset dir="${digester.dir}">
-        <include name="*.jar"/>
-      </fileset>
-      <fileset dir="${struts.dir}">
-        <include name="*.jar"/>
-      </fileset>
-
-      <!-- local jdbc drivers -->
-      <fileset dir="${org.bedework.jdbc.lib}">
-        <include name="*.jar"/>
-      </fileset>
-
-      <!-- Include the quickstart jdbc driver -->
-      <pathelement location="${hsqldb.jdbcdriver.jar}"/>
-
-      <!-- add any properties we might want -->
-      <pathelement location="${dumprestore.run.resources}" />
-      <pathelement location="${org.bedework.dumprestore.base}/properties" />
-
-      <!-- add the mapping file from appsuite -->
-      <pathelement
-          location="${org.bedework.appsuite.base}/resources/properties" />
-      <pathelement
-          location="${dumprestore.run.base}/resources/hibernate.properties"/>
-    </path>
-
-    <path id="lib.restore.class.path">
-      <fileset dir="${org.bedework.temp.jars}">
-        <include name="*.jar"/>
-      </fileset>
-      <fileset dir="${org.bedework.default.lib}">
-        <include name="*.jar"/>
-      </fileset>
-      <fileset dir="${hibernate.jars.dir}">
-        <include name="*.jar"/>
-      </fileset>
-      <fileset dir="${digester.dir}">
-        <include name="*.jar"/>
-      </fileset>
-      <fileset dir="${struts.dir}">
-        <include name="*.jar"/>
-      </fileset>
-
-      <!-- local jdbc drivers -->
-      <fileset dir="${org.bedework.jdbc.lib}">
-        <include name="*.jar"/>
-      </fileset>
-
-      <!-- Include the quickstart jdbc driver -->
-      <pathelement location="${hsqldb.jdbcdriver.jar}"/>
-
-      <!-- add any properties we might want -->
-      <pathelement location="${dumprestore.run.resources}" />
-      <pathelement location="${org.bedework.dumprestore.base}/properties" />
-
-      <!-- add the mapping file from appsuite -->
-      <pathelement
-          location="${org.bedework.appsuite.base}/resources/properties" />
-      <pathelement
-          location="${dumprestore.run.base}/resources/hibernate.properties"/>
-    </path>
   </target>
 
   <target name="build"
@@ -127,6 +37,7 @@
       <pathelement location="${ical4j.jar}"/>
       <pathelement location="${digester.jar}"/>
       <pathelement location="${hibernate.jar}"/>
+      <pathelement location="${org.bedework.calenv.jar}"/>
       <pathelement location="${org.bedework.calfacadeshared.jar}"/>
       <pathelement location="${org.bedework.calsvci.jar}"/>
       <pathelement location="${org.bedework.calcore.jar}"/>
@@ -144,35 +55,6 @@
 
   <target name="dumpdb" depends="init"
           description="Run bedework db dump app">
-
-    <echo file="${dumprestore.run.base}/resources/hibernate.properties">
-hibernate.query.substitutions true 'T', false 'F', yes 'Y', no 'N'
-hibernate.dialect=${org.bedework.dump.arg.hibernate.dialect}
-hibernate.connection.driver_class=${org.bedework.dump.arg.jdbcdriver}
-hibernate.connection.username=${org.bedework.dump.arg.jdbcid}
-hibernate.connection.password=${org.bedework.dump.arg.jdbcpw}
-hibernate.connection.url=${org.bedework.dump.arg.jdbcurl}
-    </echo>
-
-    <pathconvert property="lib.txt.classpath"
-                 refid="lib.dump.class.path"
-                 targetos="unix"  pathsep=":" />
-
-    <echo message="cp: ${lib.txt.classpath}" />
-
-    <echo message=" " />
-    <echo message="dumping to ${org.bedework.dump.arg.dumpfile}" />
-
-    <java  classname="${dump.class}"
-          fork="true"
-          failonerror="true">
-      <classpath refid="lib.dump.class.path" />
-      <arg value="${org.bedework.dump.arg.debug}" />
-      <arg value="-f" />
-      <arg value="${org.bedework.dump.arg.dumpfile}" />
-      <!--
-      <arg value="-Djava.endorsed.dir=${org.bedework.default.lib}/endorsed"/>-->
-    </java>
   </target>
 
   <target name="restoredb" depends="init"
@@ -198,92 +80,11 @@
     </condition>
     <fail if="do.abort">restore aborted by user.</fail>
 
-    <echo file="${dumprestore.run.base}/resources/hibernate.properties">
-hibernate.query.substitutions true 'T', false 'F', yes 'Y', no 'N'
-hibernate.dialect=${org.bedework.restore.arg.hibernate.dialect}
-hibernate.connection.driver_class=${org.bedework.restore.arg.jdbcdriver}
-hibernate.connection.username=${org.bedework.restore.arg.jdbcid}
-hibernate.connection.password=${org.bedework.restore.arg.jdbcpw}
-hibernate.connection.url=${org.bedework.restore.arg.jdbcurl}
-#
-# Here for better debugging
-#
-hibernate.jdbc.batch_size=0
-    </echo>
-
     <pathconvert property="lib.txt.classpath"
                  refid="lib.restore.class.path"
                  targetos="unix"  pathsep=":" />
 
     <echo message="cp: ${lib.txt.classpath}" />
-
-    <echo message=" " />
-    <echo message="restoring from ${org.bedework.restore.arg.dumpfile}" />
-
-    <java  classname="${restore.class}"
-          fork="true"
-          failonerror="true">
-      <classpath refid="lib.restore.class.path" />
-      <arg value="${org.bedework.restore.arg.debug}" />
-      <arg value="-supergroup" />
-      <arg value="${org.bedework.restore.supergroup}" />
-      <arg value="-f" />
-      <arg value="${org.bedework.restore.arg.dumpfile}" />
-      <arg value="${org.bedework.restore.arg.from2p3px}" />
-      <arg line="${org.bedework.restore.arg.defaultpubliccal}" />
-      <arg line="${org.bedework.restore.arg.timezones}" />
-
-      <arg value="-sysname" />
-      <arg value="${org.bedework.global.system.name}" />
-      <arg value="-tzid" />
-      <arg value="${org.bedework.syspar.tzid}" />
-      <arg value="-sysid" />
-      <arg value="${org.bedework.syspar.systemid}" />
-
-      <arg value="-publiccalroot" />
-      <arg value="${org.bedework.syspar.public.calroot}" />
-      <arg value="-usercalroot" />
-      <arg value="${org.bedework.syspar.user.calroot}" />
-      <arg value="-defusercal" />
-      <arg value="${org.bedework.syspar.default.user.calendar}" />
-      <arg value="-deftrashcal" />
-      <arg value="${org.bedework.syspar.default.trash.calendar}" />
-      <arg value="-definbox" />
-      <arg value="${org.bedework.syspar.default.user.inbox}" />
-      <arg value="-defoutbox" />
-      <arg value="${org.bedework.syspar.default.user.outbox}" />
-      <arg value="-defuview" />
-      <arg line="${org.bedework.syspar.default.user.view}" />
-
-      <arg value="-pu" />
-      <arg value="${org.bedework.syspar.public.user}" />
-
-      <arg value="-onlyusers" />
-      <arg value="${org.bedework.onlyusers}" />
-
-      <arg value="-httpconnsperuser" />
-      <arg value="${org.bedework.syspar.http.connections.peruser}" />
-      <arg value="-httpconnsperhost" />
-      <arg value="${org.bedework.syspar.http.connections.perhost}" />
-      <arg value="-httpconns" />
-      <arg value="${org.bedework.syspar.http.connections}" />
-
-      <arg value="-userauthClass" />
-      <arg value="${org.bedework.syspar.userauthclass}" />
-      <arg value="-mailerClass" />
-      <arg value="${org.bedework.syspar.mailerclass}" />
-      <arg value="-admingroupsClass" />
-      <arg value="${org.bedework.syspar.admingroupsclass}" />
-      <arg value="-usergroupsClass" />
-      <arg value="${org.bedework.syspar.usergroupsclass}" />
-      <jvmarg value="-mx128m" />
-      <jvmarg value="-ms128m" />
-      <!--
-      <jvmarg value="-Xrunyjpagent:cpu=times,onexit=cpu" />
-      -->
-      <!--
-      <arg value="-Djava.endorsed.dir=${org.bedework.default.lib}/endorsed"/>-->
-    </java>
   </target>
 
   <!-- Initdb is just restoredb with the input data file property set in

Added: trunk/calendar3/dumprestore/src/org/bedework/dumprestore/DumpRestoreConfig.java
===================================================================
--- trunk/calendar3/dumprestore/src/org/bedework/dumprestore/DumpRestoreConfig.java	                        (rev 0)
+++ trunk/calendar3/dumprestore/src/org/bedework/dumprestore/DumpRestoreConfig.java	2006-05-09 20:56:37 UTC (rev 463)
@@ -0,0 +1,198 @@
+/*
+ Copyright (c) 2000-2005 University of Washington.  All rights reserved.
+
+ Redistribution and use of this distribution in source and binary forms,
+ with or without modification, are permitted provided that:
+
+   The above copyright notice and this permission notice appear in
+   all copies and supporting documentation;
+
+   The name, identifiers, and trademarks of the University of Washington
+   are not used in advertising or publicity without the express prior
+   written permission of the University of Washington;
+
+   Recipients acknowledge that this distribution is made available as a
+   research courtesy, "as is", potentially with defects, without
+   any obligation on the part of the University of Washington to
+   provide support, services, or repair;
+
+   THE UNIVERSITY OF WASHINGTON DISCLAIMS ALL WARRANTIES, EXPRESS OR
+   IMPLIED, WITH REGARD TO THIS SOFTWARE, INCLUDING WITHOUT LIMITATION
+   ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+   PARTICULAR PURPOSE, AND IN NO EVENT SHALL THE UNIVERSITY OF
+   WASHINGTON BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
+   DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+   PROFITS, WHETHER IN AN ACTION OF CONTRACT, TORT (INCLUDING
+   NEGLIGENCE) OR STRICT LIABILITY, ARISING OUT OF OR IN CONNECTION WITH
+   THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+/* **********************************************************************
+    Copyright 2005 Rensselaer Polytechnic Institute. All worldwide rights reserved.
+
+    Redistribution and use of this distribution in source and binary forms,
+    with or without modification, are permitted provided that:
+       The above copyright notice and this permission notice appear in all
+        copies and supporting documentation;
+
+        The name, identifiers, and trademarks of Rensselaer Polytechnic
+        Institute are not used in advertising or publicity without the
+        express prior written permission of Rensselaer Polytechnic Institute;
+
+    DISCLAIMER: The software is distributed" AS IS" without any express or
+    implied warranty, including but not limited to, any implied warranties
+    of merchantability or fitness for a particular purpose or any warrant)'
+    of non-infringement of any current or pending patent rights. The authors
+    of the software make no representations about the suitability of this
+    software for any particular purpose. The entire risk as to the quality
+    and performance of the software is with the user. Should the software
+    prove defective, the user assumes the cost of all necessary servicing,
+    repair or correction. In particular, neither Rensselaer Polytechnic
+    Institute, nor the authors of the software are liable for any indirect,
+    special, consequential, or incidental damages related to the software,
+    to the maximum extent the law permits.
+*/
+package org.bedework.dumprestore;
+
+/** Configuration propeties for the restore phase
+ *
+ * @author Mike Douglass   douglm at rpi.edu
+ * @version 1.0
+ */
+public class DumpRestoreConfig {
+  private boolean debug;
+
+  private boolean debugEntity;
+
+  private boolean initSyspars;
+
+  /* Initdb: We can restore timezone info from this file
+   */
+  private String timezonesFilename;
+
+  /* When converting put all admin groups into the new group with this name
+   * When initialising set default access to be read/write-content for this group
+   */
+  private String superGroupName;
+
+  /* If non-null we will set any events with no calendar to this one.
+   * This is mainly to fix errors in the data. All events should have a calendar.
+   */
+  private String defaultPublicCalPath;
+
+  /* From uwcal 2.3 */
+
+  /* True if we doing the conversion from 2.3.2 to V3 */
+  private boolean from2p3px;
+
+  /**
+   * @param val
+   */
+  public void setDebug(boolean val)  {
+    debug = val;
+  }
+
+  /** .
+   *
+   * @return booelan val
+   */
+  public boolean getDebug()  {
+    return debug;
+  }
+
+  /**
+   * @param val
+   */
+  public void setDebugEntity(boolean val)  {
+    debugEntity = val;
+  }
+
+  /**
+   *
+   * @return boolean val
+   */
+  public boolean getDebugEntity()  {
+    return debugEntity;
+  }
+
+  /** True if we initialise the system parameters
+   *
+   * @param val
+   */
+  public void setInitSyspars(boolean val)  {
+    initSyspars = val;
+  }
+
+  /** True if we initialise the system parameters
+   *
+   * @return booelan val
+   */
+  public boolean getInitSyspars()  {
+    return initSyspars;
+  }
+
+  /** Are we doing the conversion from 2.3.2 to V3
+   *
+   * @param val
+   */
+  public void setFrom2p3px(boolean val)  {
+    from2p3px = val;
+  }
+
+  /** Are we doing the conversion from 2.3.2 to V3
+   *
+   * @return String val
+   */
+  public boolean getFrom2p3px()  {
+    return from2p3px;
+  }
+
+  /** We can restore timezone info from this file
+   *
+   * @param val
+   */
+  public void setTimezonesFilename(String val)  {
+    timezonesFilename = val;
+  }
+
+  /** We can restore timezone info from this file
+   *
+   * @return String val
+   */
+  public String getTimezonesFilename()  {
+    return timezonesFilename;
+  }
+
+  /** When converting put all admin groups into the new group with this name
+   *
+   * @param val
+   */
+  public void setSuperGroupName(String val)  {
+    superGroupName = val;
+  }
+
+  /** When converting put all admin groups into the new group with this name
+   *
+   * @return String val
+   */
+  public String getSuperGroupName()  {
+    return superGroupName;
+  }
+
+  /** If non-null we will set any events with no calendar to this one.
+   * This is mainly to fix errors in the data. All events should have a calendar.
+   *
+   * @param val
+   */
+  public void setDefaultPublicCalPath(String val)  {
+    defaultPublicCalPath = val;
+  }
+
+  /** If non-null we will set any events with no calendar to this one.
+   * This is mainly to fix errors in the data. All events should have a calendar.
+   *
+   * @return String val
+   */
+  public String getDefaultPublicCalPath()  {
+    return defaultPublicCalPath;
+  }
+}

Modified: trunk/calendar3/dumprestore/src/org/bedework/dumprestore/dump/Dump.java
===================================================================
--- trunk/calendar3/dumprestore/src/org/bedework/dumprestore/dump/Dump.java	2006-05-08 20:45:37 UTC (rev 462)
+++ trunk/calendar3/dumprestore/src/org/bedework/dumprestore/dump/Dump.java	2006-05-09 20:56:37 UTC (rev 463)
@@ -28,19 +28,31 @@
  */
 package org.bedework.dumprestore.dump;
 
+import org.bedework.calenv.CalOptions;
 import org.bedework.dumprestore.Defs;
+import org.bedework.dumprestore.DumpRestoreConfig;
 import org.bedework.dumprestore.dump.dumpling.DumpAll;
 
-
 import java.io.FileWriter;
 import java.io.OutputStreamWriter;
 
+import org.apache.log4j.Logger;
+
 /** Application to dump calendar data.
  *
  * @author Mike Douglass   douglm at rpi.edu
- * @version 1.0
+ * @version 3.1
  */
 public class Dump implements Defs {
+  private transient Logger log;
+
+  /* Properties can be supplied via the command line or via a the properties
+   * file with the prefix propertyPrefix + appName + "."
+   */
+  private String appPrefix = "org.bedework.app.";
+
+  private String appName;
+
   DumpIntf di;
 
   /* Runtime arg -f Where we dump to.
@@ -58,7 +70,7 @@
   }
 
   void open() throws Throwable {
-    di = new HibDump(globals.debug);
+    di = new HibDump(globals.config.getDebug());
 
     if (fileName == null) {
       globals.out = new OutputStreamWriter(System.out);
@@ -82,16 +94,20 @@
 
 
   void processArgs(String[] args) throws Throwable {
-    if (args == null) {
-      return;
-    }
+    /* Look for appname arg */
 
     for (int i = 0; i < args.length; i++) {
       if (args[i].equals("-debug")) {
-        globals.debug = true;
+        globals.config.setDebug(true);
       } else if (args[i].equals("-ndebug")) {
-        globals.debug = false;
+        globals.config.setDebug(false);
+      } else if (args[i].equals("")) {
+        // null arg generated by ant
       } else if (args[i].equals("-noarg")) {
+        // noop
+      } else if (argpar("-appname", args, i)) {
+        i++;
+        // done earlier
       } else if (argpar("-f", args, i)) {
         i++;
         fileName = args[i];
@@ -99,7 +115,7 @@
         i++;
         //id = args[i];
       } else {
-        dmsg("Illegal argument: " + args[i]);
+        error("Illegal argument: " + args[i]);
         throw new Exception("Invalid args");
       }
     }
@@ -116,10 +132,47 @@
     return true;
   }
 
-  static void dmsg(String s) {
-    System.out.println(s);
+  void getConfigProperties(String[] args) throws Throwable {
+    /* Look for the appname arg */
+
+    if (args != null) {
+      for (int i = 0; i < args.length; i++) {
+        if (argpar("-appname", args, i)) {
+          i++;
+          appName = args[i];
+          break;
+        }
+      }
+    }
+
+    if (appName == null) {
+      error("Missing required argument -appname");
+      throw new Exception("Invalid args");
+    }
+
+    globals.init((DumpRestoreConfig)CalOptions.getProperty(appPrefix + appName));
   }
 
+  protected Logger getLog() {
+    if (log == null) {
+      log = Logger.getLogger(this.getClass());
+    }
+
+    return log;
+  }
+
+  protected void error(String msg) {
+    getLog().error(msg);
+  }
+
+  protected void info(String msg) {
+    getLog().info(msg);
+  }
+
+  protected void trace(String msg) {
+    getLog().debug(msg);
+  }
+
   /**
    * @param args
    */
@@ -127,8 +180,12 @@
     Dump d = null;
 
     try {
+      long startTime = System.currentTimeMillis();
+
       d = new Dump();
 
+      d.getConfigProperties(args);
+
       d.processArgs(args);
 
       d.open();
@@ -136,6 +193,13 @@
       d.doDump();
 
       d.stats();
+
+      long millis = System.currentTimeMillis() - startTime;
+      long seconds = millis / 1000;
+      long minutes = seconds / 60;
+      seconds -= (minutes * 60);
+
+      d.info("Elapsed time: " + minutes + ":" + twoDigits(seconds));
     } catch (Throwable t) {
       t.printStackTrace();
     } finally {
@@ -146,5 +210,12 @@
       }
     }
   }
+
+  private static String twoDigits(long val) {
+    if (val < 10) {
+      return "0" + val;
+    }
+
+    return String.valueOf(val);
+  }
 }
-

Modified: trunk/calendar3/dumprestore/src/org/bedework/dumprestore/dump/DumpGlobals.java
===================================================================
--- trunk/calendar3/dumprestore/src/org/bedework/dumprestore/dump/DumpGlobals.java	2006-05-08 20:45:37 UTC (rev 462)
+++ trunk/calendar3/dumprestore/src/org/bedework/dumprestore/dump/DumpGlobals.java	2006-05-09 20:56:37 UTC (rev 463)
@@ -28,6 +28,8 @@
  */
 package org.bedework.dumprestore.dump;
 
+import org.bedework.dumprestore.DumpRestoreConfig;
+
 import java.io.Writer;
 import java.util.Stack;
 
@@ -35,13 +37,10 @@
  * @author douglm
  *
  */
-/**
- * @author douglm
- *
- */
 public class DumpGlobals {
-  /** */
-  public boolean debug;
+  /** Config properties from options file.
+   */
+  public DumpRestoreConfig config;
 
   /** */
   public Writer out;
@@ -88,7 +87,7 @@
 
   /** */
   public int events;
-  
+
   /** */
   public int eventAnnotations;
 
@@ -151,4 +150,11 @@
   public Writer getOut() {
     return out;
   }
+
+  /**
+   * @param config
+   */
+  public void init(DumpRestoreConfig config) {
+    this.config = config;
+  }
 }

Modified: trunk/calendar3/dumprestore/src/org/bedework/dumprestore/dump/dumpling/DumpAttendees.java
===================================================================
--- trunk/calendar3/dumprestore/src/org/bedework/dumprestore/dump/dumpling/DumpAttendees.java	2006-05-08 20:45:37 UTC (rev 462)
+++ trunk/calendar3/dumprestore/src/org/bedework/dumprestore/dump/dumpling/DumpAttendees.java	2006-05-09 20:56:37 UTC (rev 463)
@@ -67,10 +67,11 @@
   private void dumpAttendee(BwAttendee a) throws Throwable {
     tagStart(objectAttendee);
 
-    taggedEntityId(a);
+    ownedEntityTags(a);
     taggedVal("cutype", a.getCuType());
     taggedVal("delegated-from", a.getDelegatedFrom());
-    taggedVal("getDelegatedTo-to", a.getCn());
+    taggedVal("delegated-to", a.getDelegatedTo());
+    taggedVal("cn", a.getCn());
     taggedVal("dir", a.getDir());
     taggedVal("lang", a.getLanguage());
     taggedVal("member", a.getMember());

Modified: trunk/calendar3/dumprestore/src/org/bedework/dumprestore/dump/dumpling/DumpAuthUsers.java
===================================================================
--- trunk/calendar3/dumprestore/src/org/bedework/dumprestore/dump/dumpling/DumpAuthUsers.java	2006-05-08 20:45:37 UTC (rev 462)
+++ trunk/calendar3/dumprestore/src/org/bedework/dumprestore/dump/dumpling/DumpAuthUsers.java	2006-05-09 20:56:37 UTC (rev 463)
@@ -28,6 +28,7 @@
  */
 package org.bedework.dumprestore.dump.dumpling;
 
+import org.bedework.calfacade.BwCalendar;
 import org.bedework.calfacade.BwCategory;
 import org.bedework.calfacade.BwLocation;
 import org.bedework.calfacade.BwSponsor;
@@ -128,6 +129,21 @@
 
         tagEnd("preferredSponsors");
       }
+
+      s = aup.getPreferredCalendars();
+      if ((s != null) && (s.size() > 0)) {
+        tagStart("preferredCalendars");
+
+        Iterator si = s.iterator();
+
+        while (si.hasNext()) {
+          BwCalendar p = (BwCalendar)si.next();
+
+          taggedVal("preferredCalendar", p.getPath());
+        }
+
+        tagEnd("preferredCalendars");
+      }
     }
 
     tagEnd("preferences");

Modified: trunk/calendar3/dumprestore/src/org/bedework/dumprestore/dump/dumpling/DumpEvents.java
===================================================================
--- trunk/calendar3/dumprestore/src/org/bedework/dumprestore/dump/dumpling/DumpEvents.java	2006-05-08 20:45:37 UTC (rev 462)
+++ trunk/calendar3/dumprestore/src/org/bedework/dumprestore/dump/dumpling/DumpEvents.java	2006-05-09 20:56:37 UTC (rev 463)
@@ -44,7 +44,7 @@
  */
 public class DumpEvents extends Dumpling {
   protected boolean annotations;
-  
+
   /** Constructor
    *
    * @param globals
@@ -77,12 +77,6 @@
   private void dumpEvent(BwEvent e) throws Throwable {
     BwEventAnnotation ann = null;
 
-    if (e instanceof BwEventAnnotation) {
-      ann = (BwEventAnnotation)e;
-      taggedVal("target", ann.getTarget().getId());
-      taggedVal("master", ann.getMaster().getId());
-    }
-    
     if (ann == null) {
       tagStart(objectEvent);
     } else {
@@ -92,20 +86,21 @@
     shareableContainedEntityTags(e);
 
     taggedVal("name", e.getName());
-    taggedVal("guid", e.getGuid());
     taggedVal("summary", e.getSummary());
     taggedVal("description", e.getDescription());
 
     taggedDateTime("start", e.getDtstart());
     taggedDateTime("end", e.getDtend());
-    taggedVal("duration", e.getDuration());
     taggedVal("end-type", e.getEndType());
+    taggedVal("duration", e.getDuration());
 
     taggedVal("link", e.getLink());
+    taggedVal("deleted", e.getDeleted());
     taggedVal("status", e.getStatus());
     taggedVal("cost", e.getCost());
-    taggedVal("deleted", e.getDeleted());
 
+    taggedEntityId("organizer", e.getOrganizer());
+
     taggedVal("dtstamp", e.getDtstamp());
     taggedVal("last-mod", e.getLastmod());
     taggedVal("create-date", e.getCreated());
@@ -113,6 +108,12 @@
     taggedVal("priority", e.getPriority());
     taggedVal("sequence", e.getSequence());
 
+    taggedEntityId("sponsor", e.getSponsor());
+    taggedEntityId("location", e.getLocation());
+
+    taggedVal("guid", e.getGuid());
+    taggedVal("transparency", e.getTransparency());
+
     tagStart("eventCategories");
 
     Iterator it = e.getCategories().iterator();
@@ -125,12 +126,6 @@
 
     tagEnd("eventCategories");
 
-    taggedEntityId("sponsor", e.getSponsor());
-    taggedEntityId("location", e.getLocation());
-    taggedEntityId("organizer", e.getOrganizer());
-
-    taggedVal("transparency", e.getTransparency());
-
     tagStart("eventAttendees");
 
     it = e.getAttendees().iterator();
@@ -180,13 +175,13 @@
 
     if (ann == null) {
       tagEnd(objectEvent);
-      
+
       globals.events++;
     } else {
-      taggedVal("target", ann.getTarget().getId());
-      taggedVal("master", ann.getMaster().getId());
+      taggedEventKey("target", ann.getTarget());
+      taggedEventKey("master", ann.getMaster());
       tagEnd(objectEventAnnotation);
-      
+
       globals.eventAnnotations++;
     }
   }

Modified: trunk/calendar3/dumprestore/src/org/bedework/dumprestore/dump/dumpling/DumpUserPrefs.java
===================================================================
--- trunk/calendar3/dumprestore/src/org/bedework/dumprestore/dump/dumpling/DumpUserPrefs.java	2006-05-08 20:45:37 UTC (rev 462)
+++ trunk/calendar3/dumprestore/src/org/bedework/dumprestore/dump/dumpling/DumpUserPrefs.java	2006-05-09 20:56:37 UTC (rev 463)
@@ -84,10 +84,12 @@
 
         taggedVal("sub-id", sub.getId());
         taggedVal("sub-seq", sub.getSeq());
+        taggedVal("sub-owner", sub.getOwner().getId());
+
         taggedVal("sub-name", sub.getName());
-        taggedVal("sub-owner", sub.getOwner().getId());
         taggedVal("sub-uri", sub.getUri());
         taggedVal("sub-affectsFreeBusy", sub.getAffectsFreeBusy());
+        taggedVal("sub-ignoreTransparency", sub.getIgnoreTransparency());
         taggedVal("sub-display", sub.getDisplay());
         taggedVal("sub-style", sub.getStyle());
         taggedVal("sub-internalSubscription", sub.getInternalSubscription());
@@ -118,8 +120,8 @@
 
         taggedVal("view-id", view.getId());
         taggedVal("view-seq", view.getSeq());
+        taggedVal("view-owner", view.getOwner().getId());
         taggedVal("view-name", view.getName());
-        taggedVal("view-owner", view.getOwner().getId());
 
         Collection vs = view.getSubscriptions();
 
@@ -131,7 +133,7 @@
           while (vsi.hasNext()) {
             BwSubscription sub = (BwSubscription)vsi.next();
 
-            taggedVal("view-sub-id", sub.getId());
+            taggedVal("view-sub-name", sub.getName());
           }
 
           tagEnd("view-subscriptions");
@@ -145,7 +147,7 @@
 
     taggedVal("email", p.getEmail());
     if (p.getDefaultCalendar() != null) {
-      taggedVal("default-calendar", p.getDefaultCalendar().getId());
+      taggedVal("defaultCalendar", p.getDefaultCalendar().getPath());
     }
     taggedVal("skinName", p.getSkinName());
     taggedVal("skinStyle", p.getSkinStyle());
@@ -154,6 +156,8 @@
     taggedVal("workDays", p.getWorkDays());
     taggedVal("workdayStart", p.getWorkdayStart());
     taggedVal("workdayEnd", p.getWorkdayEnd());
+    taggedVal("preferredEndType", p.getPreferredEndType());
+    taggedVal("userMode", p.getUserMode());
 
     tagEnd(objectUserPrefs);
   }

Modified: trunk/calendar3/dumprestore/src/org/bedework/dumprestore/dump/dumpling/Dumpling.java
===================================================================
--- trunk/calendar3/dumprestore/src/org/bedework/dumprestore/dump/dumpling/Dumpling.java	2006-05-08 20:45:37 UTC (rev 462)
+++ trunk/calendar3/dumprestore/src/org/bedework/dumprestore/dump/dumpling/Dumpling.java	2006-05-09 20:56:37 UTC (rev 463)
@@ -54,6 +54,7 @@
 package org.bedework.dumprestore.dump.dumpling;
 
 import org.bedework.calfacade.BwDateTime;
+import org.bedework.calfacade.BwEvent;
 import org.bedework.calfacade.BwGroup;
 import org.bedework.calfacade.BwPrincipal;
 import org.bedework.calfacade.BwUser;
@@ -163,6 +164,11 @@
     taggedVal("sponsor-access", val.getSponsorAccess());
   }
 
+  protected void ownerKey(BwPrincipal val) throws Throwable {
+    taggedVal("owner-account", val.getAccount());
+    taggedVal("owner-kind", val.getKind());
+  }
+
   protected void groupTags(BwGroup val) throws Throwable {
     principalTags(val);
     tagStart("groupMembers");
@@ -194,7 +200,12 @@
           throws Throwable {
     shareableEntityTags(entity);
 
-    taggedEntityId("calendar", entity.getCalendar());
+    if (entity.getCalendar() == null) {
+      // Sould check validity here. Only valid for calendar roots.
+      taggedVal("calendar", "");
+    } else {
+      taggedVal("calendar", entity.getCalendar().getPath());
+    }
   }
 
   protected void ownedEntityTags(BwOwnedDbentity entity) throws Throwable {
@@ -224,6 +235,14 @@
     taggedVal(prefix + "-date", dt.getDate());
   }
 
+  protected void taggedEventKey(String prefix, BwEvent ev) throws Throwable {
+    taggedVal(prefix + "-calendar", ev.getCalendar().getPath());
+    taggedVal(prefix + "-guid", ev.getGuid());
+    if (ev.getRecurring()) {
+      taggedVal(prefix + "-recurrenceId", ev.getRecurrence().getRecurrenceId());
+    }
+  }
+
   /** Anything for which toString() works OK
    *
    * @param name

Modified: trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/HibRestore.java
===================================================================
--- trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/HibRestore.java	2006-05-08 20:45:37 UTC (rev 462)
+++ trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/HibRestore.java	2006-05-09 20:56:37 UTC (rev 463)
@@ -55,6 +55,7 @@
 
 
 import org.bedework.calfacade.BwAlarm;
+import org.bedework.calfacade.BwAttendee;
 import org.bedework.calfacade.BwCalendar;
 import org.bedework.calfacade.BwCategory;
 import org.bedework.calfacade.BwEvent;
@@ -85,6 +86,7 @@
 import java.util.Iterator;
 
 import org.apache.log4j.Logger;
+import org.hibernate.FlushMode;
 import org.hibernate.Query;
 import org.hibernate.SessionFactory;
 import org.hibernate.Session;
@@ -103,11 +105,11 @@
 
   //private HibSession sess;
   private SessionFactory sessFactory;
-  
-  
+
+
   private Session hibSess;
   private StatelessSession sess;
-  
+
   private int adminGroupId = 1;
 
   private transient Logger log;
@@ -126,17 +128,6 @@
   }
 
   /* (non-Javadoc)
-   * @see org.bedework.dumprestore.restore.RestoreIntf#init(java.lang.String, java.lang.String, java.lang.String, java.lang.String, int, org.bedework.dumprestore.restore.RestoreGlobals)
-   */
-  public void init(String url,
-                   String className,
-                   String id,
-                   String pw,
-                   RestoreGlobals globals) throws Throwable {
-    this.globals = globals;
-  }
-
-  /* (non-Javadoc)
    * @see org.bedework.dumprestore.restore.RestoreIntf#init(org.bedework.dumprestore.restore.RestoreGlobals)
    */
   public void init(RestoreGlobals globals) throws Throwable {
@@ -149,6 +140,20 @@
   public void open() throws Throwable {
   }
 
+  public void startTransaction() throws Throwable {
+    // Open delayed till retore method called
+  }
+
+  public void endTransaction() throws Throwable {
+    if (sess != null) {
+      closeSession();
+    }
+
+    if (hibSess != null) {
+      closeHibSession();
+    }
+  }
+
   /* (non-Javadoc)
    * @see org.bedework.dumprestore.restore.RestoreIntf#close()
    */
@@ -175,11 +180,11 @@
    * @see org.bedework.dumprestore.restore.RestoreIntf#restoreUser(org.bedework.calfacade.BwUser)
    */
   public void restoreUser(BwUser o) throws Throwable {
-    if (globals.onlyUsers && 
+    if (globals.onlyUsers &&
         (globals.onlyUsersMap.get(o.getAccount()) == null)) {
       return;
     }
-    
+
     try {
       openSess();
 
@@ -199,11 +204,11 @@
    * @throws Throwable
    */
   public void restoreUserInfo(BwUserInfo o) throws Throwable {
-    if (globals.onlyUsers && 
+    if (globals.onlyUsers &&
         (globals.onlyUsersMap.get(o.getUser().getAccount()) == null)) {
       return;
     }
-    
+
     openHibSess();
 
     hibSave(o);
@@ -215,7 +220,7 @@
     if (!checkOnlyUser(o)) {
       return;
     }
-    
+
     openSess();
 
     save(o);
@@ -223,24 +228,35 @@
     closeSess();
   }
 
+  public void restoreAttendee(BwAttendee o) throws Throwable {
+    // Ensure id not set
+    o.setId(CalFacadeDefs.unsavedItemKey);
+
+    openHibSess();
+
+    hibSess.save(o);
+
+    closeHibSess();
+  }
+
   /* (non-Javadoc)
    * @see org.bedework.dumprestore.restore.RestoreIntf#restoreAdminGroup(org.bedework.calfacade.svc.BwAdminGroup)
    */
   public void restoreAdminGroup(BwAdminGroup o) throws Throwable {
     openSess();
 
-    if (globals.from2p3px) {
+    if (globals.config.getFrom2p3px()) {
       // No id assigned
       o.setId(adminGroupId);
       adminGroupId++;
     }
-    
+
     if (globals.onlyUsers) {
       if (globals.onlyUsersMap.get(o.getGroupOwner().getAccount()) == null) {
         o.setGroupOwner(globals.getPublicUser());
       }
     }
-    
+
     save(o);
 
     log.debug("Saved admin group " + o);
@@ -253,13 +269,13 @@
     Iterator it = c.iterator();
     while (it.hasNext()) {
       BwPrincipal pr = (BwPrincipal)it.next();
-      
-      if (globals.onlyUsers && 
+
+      if (globals.onlyUsers &&
           (pr instanceof BwUser) &&
           (globals.onlyUsersMap.get(((BwUser)pr).getAccount()) == null)) {
         continue;
       }
-            
+
       openSess();
 
       BwAdminGroupEntry entry = new BwAdminGroupEntry();
@@ -279,17 +295,17 @@
    * @see org.bedework.dumprestore.restore.RestoreIntf#restoreAuthUser(org.bedework.calfacade.svc.BwAuthUser)
    */
   public void restoreAuthUser(BwAuthUser o) throws Throwable {
-    if (globals.onlyUsers && 
+    if (globals.onlyUsers &&
         (globals.onlyUsersMap.get(o.getUser().getAccount()) == null)) {
       return;
     }
-    
+
     openHibSess();
 
 //    if (o.getId() <= 0) {
 //      o.setId(o.getUser().getId());
 //    }
-    
+
     hibSave(o);
 
     closeHibSess();
@@ -302,7 +318,7 @@
     if (!checkOnlyUser(o)) {
       return;
     }
-    
+
     openHibSess();
 
     hibSave(o);
@@ -317,7 +333,7 @@
     if (!checkOnlyUser(o)) {
       return;
     }
-    
+
     openHibSess();
 
     hibSess.update(o);
@@ -332,7 +348,7 @@
     if (!checkOnlyUser(o)) {
       return;
     }
-    
+
     openSess();
 
     save(o);
@@ -347,7 +363,7 @@
     if (!checkOnlyUser(o)) {
       return null;
     }
-    
+
     openSess();
 
     StringBuffer sb = new StringBuffer();
@@ -358,7 +374,7 @@
     Query q = sess.createQuery(sb.toString());
     q.setString("address", o.getAddress());
     q.setEntity("owner", o.getOwner());
-    
+
     Integer i = (Integer)q.uniqueResult();
 
     if (i == null) {
@@ -376,7 +392,7 @@
     if (!checkOnlyUser(o)) {
       return null;
     }
-    
+
     openSess();
 
     StringBuffer sb = new StringBuffer();
@@ -413,9 +429,9 @@
     if (false) {
       // XXX need fixing and we're not using them yet
       openHibSess();
-      
+
       hibSave(o);
-      
+
       closeHibSess();
     }
   }
@@ -424,7 +440,7 @@
     if (!checkOnlyUser(o)) {
       return;
     }
-    
+
     openHibSess();
 
     /* Unset the subscription id - hibernate cascades cause an error
@@ -456,7 +472,7 @@
     if (!checkOnlyUser(o)) {
       return;
     }
-    
+
     openHibSess();
 
     hibSave(o);
@@ -465,11 +481,11 @@
   }
 
   public void update(BwUser user) throws Throwable {
-    if (globals.onlyUsers && 
+    if (globals.onlyUsers &&
         (globals.onlyUsersMap.get(user.getAccount()) == null)) {
       return;
     }
-    
+
     openSess();
 
     sess.update(user);
@@ -525,7 +541,7 @@
     if (!checkOnlyUser(o)) {
       return;
     }
-    
+
     openSess();
 
     restoreCalendars(o, sess.connection());
@@ -535,22 +551,55 @@
     closeSess();
   }
 
+  public BwCalendar getCalendar(String path) throws Throwable {
+    openHibSess();
+
+    Query q = hibSess.createQuery("from org.bedework.calfacade.BwCalendar cal where " +
+                        "cal.path=:path");
+    q.setString("path", path);
+    BwCalendar cal = (BwCalendar)q.uniqueResult();
+
+    return cal;
+  }
+
+  public void saveRootCalendar(BwCalendar val) throws Throwable {
+    if (!checkOnlyUser(val)) {
+      return;
+    }
+
+    // Ensure id not set
+    val.setId(CalFacadeDefs.unsavedItemKey);
+
+    openHibSess();
+
+    hibSess.save(val);
+
+    closeHibSess();
+  }
+
   /* We cannot use hibernate to set the db id here as the save will cascade
    * down all the children.
    *
    * <p>We save a skeleton copy of the calendar structure using direct jdbc
    * calls then update the structure with hibernate.
    */
-  public void restoreCalendar(BwCalendar o) throws Throwable {
+  public void addCalendar(BwCalendar o) throws Throwable {
     if (!checkOnlyUser(o)) {
       return;
     }
-    
-    openSess();
 
-    restoreCalendar(o, sess.connection());
+    // Ensure id not set
+    o.setId(CalFacadeDefs.unsavedItemKey);
 
-    closeSess();
+    openHibSess();
+
+    BwCalendar parent = o.getCalendar();
+
+    parent.addChild(o);
+
+//    hibSess.update(parent);
+
+    closeHibSess();
   }
 
   /* ====================================================================
@@ -561,7 +610,7 @@
     if (!checkOnlyUser(val)) {
       return;
     }
-    
+
     restoreCalendar(val, conn);
 
     Collection cals = val.getChildren();
@@ -578,24 +627,27 @@
     }
   }
 
-  /* Restore a single calendar. Don't restore children
+  /* The only reason for this is the need to preserve the calendar id.
+   * From 3.x on this need will not exist. Just use hibernate.
+   *
+   * Restore a single calendar. Don't restore children
    */
   private void restoreCalendar(BwCalendar val, Connection conn) throws Throwable {
     if (!checkOnlyUser(val)) {
       return;
     }
-    
+
     PreparedStatement ps = null;
 
     try {
       ps = conn.prepareStatement(
             "INSERT INTO calendars " +
-                "(id, seq, creatorid, ownerid, access, " +
-                 "publick, name, path, summary, description," +
-                 " mail_list_id, calendar_collection, parent) " +
+                "(id, seq, creatorid, ownerid, bwaccess, " +
+                 "publick, calname, path, summary, description," +
+                 " mail_list_id, calendar_collection, parent, caltype) " +
                "VALUES (?,?,?,?,?," +
                        "?,?,?,?,?," +
-                       "?,?,?)");
+                       "?,?,?,?)");
 
       ps.setInt(1, val.getId());
       ps.setInt(2, val.getSeq());
@@ -617,6 +669,7 @@
       } else {
         ps.setInt(13, val.getCalendar().getId());
       }
+      ps.setInt(14, val.getCalType());
 
       ps.executeUpdate();
     } catch (Throwable t) {
@@ -632,18 +685,23 @@
   private synchronized void openSess() throws Throwable {
     if (sess == null) {
       sess = sessFactory.openStatelessSession();
+      sess.beginTransaction();
     }
-    sess.beginTransaction();
   }
 
   private synchronized void openHibSess() throws Throwable {
     if (hibSess == null) {
       hibSess = sessFactory.openSession();
+      hibSess.setFlushMode(FlushMode.COMMIT);
+      hibSess.beginTransaction();
     }
-    hibSess.beginTransaction();
   }
 
-  private synchronized void closeHibSess() throws Throwable {
+  private void closeHibSess() throws Throwable {
+    endTransaction();
+  }
+
+  private synchronized void closeHibSession() throws Throwable {
     hibSess.getTransaction().commit();
     try {
       if (hibSess != null) {
@@ -659,7 +717,13 @@
   }
 
   private synchronized void closeSess() throws Throwable {
-    sess.getTransaction().commit();
+    endTransaction();
+  }
+
+  private synchronized void closeSession() throws Throwable {
+    if (sess.getTransaction() != null) {
+      sess.getTransaction().commit();
+    }
     try {
       if (sess != null) {
         sess.close();
@@ -672,11 +736,11 @@
       sess = null;
     }
   }
-  
+
   private void hibSave(Object o) throws Throwable {
     hibSess.save(o);
   }
-  
+
   private void save(Object o) throws Throwable {
     sess.insert(o);
   }
@@ -698,32 +762,32 @@
     /* Just commit * /
     sess.commit();
   }*/
-  
+
   private boolean checkOnlyUser(BwOwnedDbentity ent) {
     if (!globals.onlyUsers) {
       return true;
     }
-    
+
     if (globals.onlyUsersMap.get(ent.getOwner().getAccount()) == null) {
       return false;
     }
-    
+
     return true;
   }
-  
+
   private boolean checkOnlyUser(BwShareableDbentity ent) {
     if (!globals.onlyUsers) {
       return true;
     }
-    
+
     if (globals.onlyUsersMap.get(ent.getOwner().getAccount()) == null) {
       return false;
     }
-    
+
     if (globals.onlyUsersMap.get(ent.getCreator().getAccount()) == null) {
       ent.setCreator(ent.getOwner());
     }
-    
+
     return true;
   }
 

Modified: trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/Restore.java
===================================================================
--- trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/Restore.java	2006-05-08 20:45:37 UTC (rev 462)
+++ trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/Restore.java	2006-05-09 20:56:37 UTC (rev 463)
@@ -53,13 +53,16 @@
 */
 package org.bedework.dumprestore.restore;
 
+import org.bedework.calenv.CalOptions;
 import org.bedework.calfacade.BwCalendar;
+import org.bedework.calfacade.BwSystem;
 import org.bedework.calfacade.BwUser;
 import org.bedework.calfacade.svc.BwAdminGroup;
 import org.bedework.calfacade.svc.BwPreferences;
 import org.bedework.calfacade.svc.BwSubscription;
 import org.bedework.calfacade.svc.BwView;
 import org.bedework.dumprestore.Defs;
+import org.bedework.dumprestore.DumpRestoreConfig;
 import org.bedework.dumprestore.restore.rules.RestoreRuleSet;
 
 import java.io.FileReader;
@@ -75,30 +78,24 @@
 /** Application to restore from an XML calendar dump..
  *
  * @author Mike Douglass   douglm at rpi.edu
- * @version 1.0
+ * @version 3.1
  */
 public class Restore implements Defs {
   private transient Logger log;
 
-  //private boolean concatdesc = false;
-
-  //private boolean printData = false;
-
-  /** The dump file
+  /* Properties can be supplied via the command line or via a the properties
+   * file with the prefix propertyPrefix + appName + "."
    */
-  private String fileName;
+  private String appPrefix = "org.bedework.app.";
 
-  /* runtime arg -i (id) */
-  private String id = "sa";
+  private String appName;
 
-  /* runtime arg -p (password) */
-  private String pw = "";
+  /* File we restore from */
+  private String filename;
 
-  /* runtime arg -u  (url) */
-  private String url = "jdbc:hsqldb:hsql://localhost:8887";
+  //private boolean concatdesc = false;
 
-  /* runtime arg -d  (driver) */
-  private String driver = "org.hsqldb.jdbcDriver";
+  //private boolean printData = false;
 
   private RestoreGlobals globals = new RestoreGlobals();
 
@@ -121,12 +118,12 @@
   void open() throws Throwable {
     if (globals.rintf == null) {
 //      globals.rintf = new JdbcRestore();
-      globals.rintf = new HibRestore(globals.debug);
-      globals.rintf.init(url, driver, id, pw, globals);
+      globals.rintf = new HibRestore(globals.config.getDebug());
+      globals.rintf.init(globals);
       globals.rintf.open();
     }
 
-    if (globals.from2p3px) {
+    if (globals.config.getFrom2p3px()) {
       // System prefs are set up by run time pars
 
       globals.rintf.restoreSyspars(globals.syspars);
@@ -149,9 +146,9 @@
     digester.setRules(new RegexRules(m));
 
     digester.addRuleSet(new RestoreRuleSet(globals));
-    digester.parse(new FileReader(fileName));
+    digester.parse(new FileReader(filename));
 
-    if (globals.from2p3px) {
+    if (globals.config.getFrom2p3px()) {
       makePrefs();
       if (globals.rintf != null) {
         globals.rintf.restoreAdminGroup((BwAdminGroup)globals.getSuperGroup());
@@ -285,27 +282,23 @@
     }
 
     for (int i = 0; i < args.length; i++) {
-      if (args[i].equals("")) {
-        // null arg generated by ant
-      } else if (args[i].equals("-debug")) {
-        globals.debug = true;
+      if (args[i].equals("-debug")) {
+        globals.config.setDebug(true);
       } else if (args[i].equals("-ndebug")) {
-        globals.debug = false;
-      } else if (args[i].equals("-debugentity")) {
-        globals.debugEntity = true;
-      } else if (args[i].equals("-ndebugentity")) {
-        globals.debugEntity = false;
+        globals.config.setDebug(false);
+      } else if (args[i].equals("")) {
+        // null arg generated by ant
       } else if (args[i].equals("-noarg")) {
-        globals.debug = false;
-      } else if (argpar("-supergroup", args, i)) {
+        // noop
+      } else if (argpar("-appname", args, i)) {
         i++;
-        globals.superGroupName = args[i];
-      } else if (argpar("-defaultpubliccal", args, i)) {
+        // done earlier
+      } else if (args[i].equals("-initSyspars")) {
+        // done earlier
+      } else if (argpar("-f", args, i)) {
         i++;
-        globals.defaultPublicCalPath = args[i];
-        trace("Setting null event calendars to " + args[i]);
-      } else if (args[i].equals("-from2p3px")) {
-        globals.from2p3px = true;
+        filename = args[i];
+        /* Can we override these in the hibernate properties?
       } else if (argpar("-d", args, i)) {
         i++;
         driver = args[i];
@@ -318,49 +311,8 @@
       } else if (argpar("-u", args, i)) {
         i++;
         url = args[i];
-      } else if (argpar("-f", args, i)) {
-        i++;
-        fileName = args[i];
-      } else if (argpar("-timezones", args, i)) {
-        i++;
-        globals.timezonesFilename = args[i];
+        */
 
-        /* System parameters */
-      } else if (argpar("-sysname", args, i)) {
-        i++;
-        globals.syspars.setName(args[i]);
-      } else if (argpar("-tzid", args, i)) {
-        i++;
-        globals.syspars.setTzid(args[i]);
-      } else if (argpar("-sysid", args, i)) {
-        i++;
-        globals.syspars.setSystemid(args[i]);
-      } else if (argpar("-publiccalroot", args, i)) {
-        i++;
-        globals.syspars.setPublicCalendarRoot(args[i]);
-      } else if (argpar("-usercalroot", args, i)) {
-        i++;
-        globals.syspars.setUserCalendarRoot(args[i]);
-      } else if (argpar("-defusercal", args, i)) {
-        i++;
-        globals.syspars.setUserDefaultCalendar(args[i]);
-      } else if (argpar("-deftrashcal", args, i)) {
-        i++;
-        globals.syspars.setDefaultTrashCalendar(args[i]);
-      } else if (argpar("-definbox", args, i)) {
-        i++;
-        globals.syspars.setUserInbox(args[i]);
-      } else if (argpar("-defoutbox", args, i)) {
-        i++;
-        globals.syspars.setUserOutbox(args[i]);
-      } else if (argpar("-defuview", args, i)) {
-        i++;
-        globals.syspars.setDefaultUserViewName(args[i]);
-
-      } else if (argpar("-pu", args, i)) {
-        i++;
-        globals.syspars.setPublicUser(args[i]);
-
       } else if (argpar("-onlyusers", args, i)) {
         i++;
         if (args[i].equals("*")) {
@@ -374,36 +326,6 @@
           }
         }
 
-      } else if (argpar("-httpconnsperuser", args, i)) {
-        i++;
-        globals.syspars.setHttpConnectionsPerUser(intPar(args[i]));
-        globals.sysparsSetHttpConnectionsPerUser = true;
-      } else if (argpar("-httpconnsperhost", args, i)) {
-        i++;
-        globals.syspars.setHttpConnectionsPerHost(intPar(args[i]));
-        globals.sysparsSetHttpConnectionsPerHost = true;
-      } else if (argpar("-httpconns", args, i)) {
-        i++;
-        globals.syspars.setHttpConnections(intPar(args[i]));
-        globals.sysparsSetHttpConnections = true;
-
-      } else if (argpar("-defuquota", args, i)) {
-        i++;
-        globals.syspars.setDefaultUserQuota(longPar(args[i]));
-        globals.sysparsSetDefaultUserQuota = true;
-
-      } else if (argpar("-userauthClass", args, i)) {
-        i++;
-        globals.syspars.setUserauthClass(args[i]);
-      } else if (argpar("-mailerClass", args, i)) {
-        i++;
-        globals.syspars.setMailerClass(args[i]);
-      } else if (argpar("-admingroupsClass", args, i)) {
-        i++;
-        globals.syspars.setAdmingroupsClass(args[i]);
-      } else if (argpar("-usergroupsClass", args, i)) {
-        i++;
-        globals.syspars.setUsergroupsClass(args[i]);
       } else {
         error("Illegal argument: '" + args[i] + "'");
         usage();
@@ -414,26 +336,10 @@
     return true;
   }
 
-  private int intPar(String par) throws Throwable {
-    return Integer.parseInt(par);
-  }
-
-  private long longPar(String par) throws Throwable {
-    return Long.parseLong(par);
-  }
-
   void usage() {
     System.out.println("Usage:");
-    System.out.println("args   -debug");
-    System.out.println("       -ndebug");
-    System.out.println("       -f filename");
-    System.out.println("            define name of input file");
-    System.out.println("       -concatdesc");
-    System.out.println("            put all event description in one field");
-    System.out.println("       -jdbc");
-    System.out.println("            Update the database via jdbc");
-    System.out.println("       -printdata");
-    System.out.println("            print the data before restore");
+    System.out.println("args   -appname name");
+    System.out.println("       -f restorefilename");
     System.out.println("");
   }
 
@@ -448,6 +354,31 @@
     return true;
   }
 
+  void getConfigProperties(String[] args) throws Throwable {
+    /* Look for the appname arg */
+
+    if (args != null) {
+      for (int i = 0; i < args.length; i++) {
+        if (argpar("-appname", args, i)) {
+          i++;
+          appName = args[i];
+        } else if (args[i].equals("-initSyspars")) {
+          globals.config.setInitSyspars(true);
+        }
+      }
+    }
+
+    if (appName == null) {
+      error("Missing required argument -appname");
+      throw new Exception("Invalid args");
+    }
+
+    globals.init((DumpRestoreConfig)CalOptions.getProperty(appPrefix + appName));
+    if (globals.config.getInitSyspars() || globals.config.getFrom2p3px()) {
+      globals.syspars = (BwSystem)CalOptions.getProperty("org.bedework.syspars");
+    }
+  }
+
   protected Logger getLog() {
     if (log == null) {
       log = Logger.getLogger(this.getClass());
@@ -476,8 +407,12 @@
     Restore r = null;
 
     try {
+      long startTime = System.currentTimeMillis();
+
       r = new Restore();
 
+      r.getConfigProperties(args);
+
       if (!r.processArgs(args)) {
         return;
       }
@@ -490,6 +425,12 @@
 
       r.stats();
 
+      long millis = System.currentTimeMillis() - startTime;
+      long seconds = millis / 1000;
+      long minutes = seconds / 60;
+      seconds -= (minutes * 60);
+
+      r.info("Elapsed time: " + minutes + ":" + twoDigits(seconds));
     } catch (Throwable t) {
       t.printStackTrace();
     } finally {
@@ -500,5 +441,12 @@
       }
     }
   }
-}
 
+  private static String twoDigits(long val) {
+    if (val < 10) {
+      return "0" + val;
+    }
+
+    return String.valueOf(val);
+  }
+}

Modified: trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/RestoreGlobals.java
===================================================================
--- trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/RestoreGlobals.java	2006-05-08 20:45:37 UTC (rev 462)
+++ trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/RestoreGlobals.java	2006-05-09 20:56:37 UTC (rev 463)
@@ -55,10 +55,7 @@
 
 import org.bedework.appcommon.TimeZonesParser;
 import org.bedework.calfacade.BwAttendee;
-import org.bedework.calfacade.BwEvent;
-import org.bedework.calfacade.BwEventAlarm;
 import org.bedework.calfacade.BwEventAnnotation;
-import org.bedework.calfacade.BwEventObj;
 import org.bedework.calfacade.BwGroup;
 import org.bedework.calfacade.BwCalendar;
 import org.bedework.calfacade.BwCategory;
@@ -66,35 +63,24 @@
 import org.bedework.calfacade.BwOrganizer;
 import org.bedework.calfacade.BwSponsor;
 import org.bedework.calfacade.BwSystem;
-import org.bedework.calfacade.BwTimeZone;
-import org.bedework.calfacade.BwTodoAlarm;
 import org.bedework.calfacade.BwUser;
 import org.bedework.calfacade.BwUserInfo;
-import org.bedework.calfacade.filter.BwAndFilter;
-import org.bedework.calfacade.filter.BwCategoryFilter;
-import org.bedework.calfacade.filter.BwCreatorFilter;
 import org.bedework.calfacade.filter.BwFilter;
-import org.bedework.calfacade.filter.BwLocationFilter;
-import org.bedework.calfacade.filter.BwNotFilter;
-import org.bedework.calfacade.filter.BwOrFilter;
-import org.bedework.calfacade.filter.BwSponsorFilter;
 import org.bedework.calfacade.ifs.CalTimezones;
 import org.bedework.calfacade.svc.BwAdminGroup;
-import org.bedework.calfacade.svc.BwAuthUser;
-import org.bedework.calfacade.svc.BwPreferences;
 import org.bedework.calfacade.svc.BwSubscription;
 import org.bedework.calfacade.svc.BwView;
-import org.bedework.dumprestore.BwDbLastmod;
+import org.bedework.dumprestore.DumpRestoreConfig;
 
 import edu.rpi.cct.uwcal.access.Access;
 import edu.rpi.cct.uwcal.access.Ace;
 import edu.rpi.cct.uwcal.access.Acl;
 
 import java.io.FileInputStream;
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.Iterator;
-import java.util.Vector;
 
 /** Globals for the restore phase
  *
@@ -102,40 +88,23 @@
  * @version 1.0
  */
 public class RestoreGlobals {
-  /** */
-  public boolean debug;
+  /** Set false at start of entity, set true on entity error
+   */
+  public boolean entityError;
 
+  /** Config properties from options file.
+   */
+  public DumpRestoreConfig config;
+
   /** Map user with id of zero on to this id - fixes oversight */
   public static int mapUser0 = 1;
 
-  /** */
-  public boolean debugEntity;
-
-  /** We can restore timezone info from this file
-   */
-  public String timezonesFilename;
-
   /** System parameters object */
   public BwSystem syspars = new BwSystem();
 
-  /** show syspars.setHttpConnectionsPerUser was set */
-  public boolean sysparsSetHttpConnectionsPerUser;
-  /** show syspars.setHttpConnectionsPerHost was set */
-  public boolean sysparsSetHttpConnectionsPerHost;
-  /** show syspars.setHttpConnections was set */
-  public boolean sysparsSetHttpConnections;
-  /** show syspars.setDefaultUserQuota was set */
-  public boolean sysparsSetDefaultUserQuota;
-
   /* Used when processing timezones */
   private CalTimezones tzcache;
 
-  /** True if we doing the conversion from 2.3.2 to V3 */
-  public boolean from2p3px;
-
-  /** When converting put all admin groups into the new group with this name */
-  public String superGroupName;
-
   /** The super admin group */
   public BwGroup superGroup;
 
@@ -146,12 +115,8 @@
 
   /** Even number of elements, old-name followd by new-name
    */
-  public Vector fixedCalendarNames = new Vector();
+  public ArrayList fixedCalendarNames = new ArrayList();
 
-  /** If non-null we will set any events with no calendar to this one.
-   * This is mainly to fix errors in the data. All events should have a calendar.
-   */
-  public String defaultPublicCalPath;
   /** */
   public BwCalendar defaultPublicCal;
 
@@ -171,7 +136,7 @@
   /** For each of these we update events to have the appropriate calendar id.
    * Any event which already has a calendar id turned up in two calendars.
    */
-  public Vector calLeaves = new Vector();
+  public Collection calLeaves = new ArrayList();
 
   /** If true stop restore on any error, otherwise just flag it.
    */
@@ -258,13 +223,13 @@
     public void put(BwUser owner, int calid) {
       Integer key = new Integer(owner.getId());
 
-      Vector v = (Vector)get(key);
-      if (v == null) {
-        v = new Vector();
-        put(key, v);
+      ArrayList al = (ArrayList)get(key);
+      if (al == null) {
+        al = new ArrayList();
+        put(key, al);
       }
 
-      v.add(new Integer(calid));
+      al.add(new Integer(calid));
     }
 
     /**
@@ -274,13 +239,13 @@
     public void put(BwUser owner, BwSubscription sub) {
       Integer key = new Integer(owner.getId());
 
-      Vector v = (Vector)get(key);
-      if (v == null) {
-        v = new Vector();
-        put(key, v);
+      ArrayList al = (ArrayList)get(key);
+      if (al == null) {
+        al = new ArrayList();
+        put(key, al);
       }
 
-      v.add(sub);
+      al.add(sub);
     }
 
     /** 2.3.2
@@ -289,7 +254,7 @@
      * @return Collection
      */
     public Collection getCalendarids(BwUser owner) {
-      return (Vector)get(new Integer(owner.getId()));
+      return (Collection)get(new Integer(owner.getId()));
     }
 
     /**
@@ -297,7 +262,7 @@
      * @return Collection
      */
     public Collection getSubs(BwUser owner) {
-      return (Vector)get(new Integer(owner.getId()));
+      return (Collection)get(new Integer(owner.getId()));
     }
 
     /**
@@ -322,6 +287,29 @@
 
       return null;
     }
+
+    /**
+     * @param owner
+     * @param name
+     * @return BwSubscription
+     */
+    public BwSubscription getSub(BwUser owner, String name) {
+      Collection subs = getSubs(owner);
+
+      if (subs == null) {
+        return null;
+      }
+
+      Iterator it = subs.iterator();
+      while (it.hasNext()) {
+        BwSubscription sub = (BwSubscription)it.next();
+        if (sub.getName().equals(name)) {
+          return sub;
+        }
+      }
+
+      return null;
+    }
   }
 
   /**
@@ -334,13 +322,13 @@
     public void put(int keyid, int eventid) {
       Integer key = new Integer(keyid);
 
-      Vector v = (Vector)get(key);
-      if (v == null) {
-        v = new Vector();
-        put(key, v);
+      ArrayList al = (ArrayList)get(key);
+      if (al == null) {
+        al = new ArrayList();
+        put(key, al);
       }
 
-      v.add(new Integer(eventid));
+      al.add(new Integer(eventid));
     }
 
     /**
@@ -348,7 +336,7 @@
      * @return Collection
      */
     public Collection getEventids(int keyid) {
-      return (Vector)get(new Integer(keyid));
+      return (Collection)get(new Integer(keyid));
     }
   }
 
@@ -432,6 +420,25 @@
 
   /**
    */
+  public static class CalendarMap extends HashMap {
+    /**
+     * @param val
+     */
+    public void put(BwCalendar val) {
+      put(val.getPath(), val);
+    }
+
+    /**
+     * @param path
+     * @return BwCalendar
+     */
+    public BwCalendar get(String path) {
+      return (BwCalendar)get(path);
+    }
+  }
+
+  /**
+   */
   public static class CategoryMap extends HashMap {
     /**
      * @param val
@@ -574,7 +581,7 @@
   public HashMap trashCalendars = new HashMap();
 
   /** */
-  public HashMap calendarsTbl = new HashMap();
+  public CalendarMap calendarsTbl = new CalendarMap();
 
   /** Subscription we are currently restoring */
   public BwSubscription curSub;
@@ -586,43 +593,6 @@
   public static class AliasFilter extends BwFilter {
   }
 
-  /** Link tag-name to calendar class. For every entity tag generated by the dump
-   * there should be an entry in this table.
-   */
-  public static final HashMap classes = new HashMap();
-
-  static {
-    classes.put("aliasFilter", AliasFilter.class.getName());
-    classes.put("andFilter", BwAndFilter.class.getName());
-    classes.put("creatorFilter", BwCreatorFilter.class.getName());
-    classes.put("keyFilter", BwCategoryFilter.class.getName());
-    classes.put("locationFilter", BwLocationFilter.class.getName());
-    classes.put("notFilter", BwNotFilter.class.getName());
-    classes.put("orFilter", BwOrFilter.class.getName());
-    classes.put("sponsorFilter", BwSponsorFilter.class.getName());
-
-    classes.put("system", BwSystem.class.getName());
-    classes.put("user", BwUser.class.getName());
-    classes.put("timezone", BwTimeZone.class.getName());
-    classes.put("calendar", BwCalendar.class.getName());
-    classes.put("location", BwLocation.class.getName());
-    classes.put("sponsor", BwSponsor.class.getName());
-    classes.put("organizer", BwOrganizer.class.getName());
-    classes.put("attendee", BwAttendee.class.getName());
-    classes.put("event-alarm", BwEventAlarm.class.getName());
-    classes.put("todo-alarm", BwTodoAlarm.class.getName());
-    classes.put("keyword", BwCategory.class.getName());
-    classes.put("category", BwCategory.class.getName());
-    classes.put("authuser", BwAuthUser.class.getName());
-    classes.put("event", BwEventObj.class.getName());
-    classes.put("adminGroup", BwAdminGroup.class.getName());
-    classes.put("user-prefs", BwPreferences.class.getName());
-    classes.put("dblastmod", BwDbLastmod.class.getName());
-
-    /* 2.3.2 */
-    classes.put("eventRef", BwEvent.class.getName());
-  }
-
   /** */
   public RestoreIntf rintf;
 
@@ -643,14 +613,14 @@
       throw new Exception("syspars.tzid not initialised");
     }
 
-    tzcache = new TimezonesImpl(debug, getPublicUser(), rintf);
+    tzcache = new TimezonesImpl(config.getDebug(), getPublicUser(), rintf);
     tzcache.setDefaultTimeZoneId(syspars.getTzid());
 
-    if (from2p3px && (timezonesFilename != null)) {
+    if (config.getFrom2p3px() && (config.getTimezonesFilename() != null)) {
       // Populate from a file
       TimeZonesParser tzp = new TimeZonesParser(
-             new FileInputStream(timezonesFilename),
-             debug);
+             new FileInputStream(config.getTimezonesFilename()),
+             config.getDebug());
 
       Collection tzis = tzp.getTimeZones();
 
@@ -715,12 +685,12 @@
       return superGroup;
     }
 
-    if (superGroupName == null) {
+    if (config.getSuperGroupName() == null) {
       throw new Exception("superGroupName must be defined");
     }
 
     // Create it
-    BwAdminGroup sg = new BwAdminGroup(superGroupName);
+    BwAdminGroup sg = new BwAdminGroup(config.getSuperGroupName());
     sg.setGroupOwner(getPublicUser());
     sg.setOwner(getPublicUser());
     superGroup = sg;
@@ -735,7 +705,7 @@
   public String getDefaultPublicAccess() {
     if (defaultPublicAccess == null) {
       try {
-        Access a = new Access(debug);
+        Access a = new Access(config.getDebug());
         defaultPublicAccess = a.getDefaultPublicAccess();
         defaultPersonalAccess = a.getDefaultPublicAccess();
       } catch (Throwable t) {
@@ -767,7 +737,7 @@
    * @throws Throwable
    */
   public String getDefaultPublicCalendarsAccess() throws Throwable {
-    Acl acl = new Acl(debug);
+    Acl acl = new Acl(config.getDebug());
 
     /** all owner, read others, read unauthenticated, (read,writeContent) group=superGroup */
     acl.clear();
@@ -775,7 +745,7 @@
     acl.addAce(new Ace(null, false, Ace.whoTypeOther, Access.read));
     acl.addAce(new Ace(null, false, Ace.whoTypeUnauthenticated, Access.read));
 
-    Ace rwcont = new Ace(getSuperGroup().getAccount(), false,
+    Ace rwcont = new Ace(config.getSuperGroupName(), false,
                         Ace.whoTypeGroup, Access.writeContent);
     rwcont.addPriv(Access.read);
     acl.addAce(rwcont);
@@ -817,4 +787,11 @@
       }
     }
   }
+
+  /**
+   * @param config
+   */
+  public void init(DumpRestoreConfig config) {
+    this.config = config;
+  }
 }

Modified: trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/RestoreIntf.java
===================================================================
--- trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/RestoreIntf.java	2006-05-08 20:45:37 UTC (rev 462)
+++ trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/RestoreIntf.java	2006-05-09 20:56:37 UTC (rev 463)
@@ -53,6 +53,7 @@
 */
 package org.bedework.dumprestore.restore;
 
+import org.bedework.calfacade.BwAttendee;
 import org.bedework.calfacade.BwAlarm;
 import org.bedework.calfacade.BwCalendar;
 import org.bedework.calfacade.BwCategory;
@@ -79,23 +80,9 @@
  */
 public interface RestoreIntf {
   /**
-   * @param url
-   * @param className
-   * @param id
-   * @param pw
    * @param globals
    * @throws Throwable
    */
-  public void init(String url,
-                   String className,
-                   String id,
-                   String pw,
-                   RestoreGlobals globals) throws Throwable;
-
-  /**
-   * @param globals
-   * @throws Throwable
-   */
   public void init(RestoreGlobals globals) throws Throwable;
 
   /** Call after any init phase
@@ -104,6 +91,18 @@
    */
   public void open() throws Throwable;
 
+  /** Call to start a transaction
+   *
+   * @throws Throwable
+   */
+  public void startTransaction() throws Throwable;
+
+  /** Call to end a transaction
+   *
+   * @throws Throwable
+   */
+  public void endTransaction() throws Throwable;
+
   /** Call at end of restoring to finish up. Will restore any cached values.
    *
    * @throws Throwable
@@ -124,6 +123,13 @@
    */
   public void restoreUser(BwUser o) throws Throwable;
 
+  /** Restore attendee
+   *
+   * @param o
+   * @throws Throwable
+   */
+  public void restoreAttendee(BwAttendee o) throws Throwable;
+
   /** Restore user info
    *
    * @param o
@@ -242,17 +248,31 @@
    */
   public int fixUserEventsCal(BwUser u, BwCalendar cal) throws Throwable;
 
-  /**
+  /** 2.3 only
    * @param val
    * @throws Throwable
    */
   public void restoreCalendars(BwCalendar val) throws Throwable;
 
-  /** Restore a single calendar
+  /**
+   * @param path
+   * @return BwCalendar
+   * @throws Throwable
+   */
+  public BwCalendar getCalendar(String path) throws Throwable;
+
+  /** Save a single root calendar - no parent is set in the entity
    *
    * @param val
    * @throws Throwable
    */
-  public void restoreCalendar(BwCalendar val) throws Throwable;
+  public void saveRootCalendar(BwCalendar val) throws Throwable;
+
+  /** Restore a single calendar - parent is set in the entity
+   *
+   * @param val
+   * @throws Throwable
+   */
+  public void addCalendar(BwCalendar val) throws Throwable;
 }
 

Modified: trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/TimezonesImpl.java
===================================================================
--- trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/TimezonesImpl.java	2006-05-08 20:45:37 UTC (rev 462)
+++ trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/TimezonesImpl.java	2006-05-09 20:56:37 UTC (rev 463)
@@ -157,6 +157,9 @@
       timezones.put(id, tzinfo);
     }
     */
+    if (tzinfo == null) {
+      return null;
+    }
 
     return tzinfo.getTz();
   }
@@ -198,7 +201,7 @@
     // force refresh now
     lookup("not-a-timezone");
   }
-  
+
   /* ====================================================================
    *                   Private methods
    * ==================================================================== */

Modified: trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/rules/AdminGroupRule.java
===================================================================
--- trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/rules/AdminGroupRule.java	2006-05-08 20:45:37 UTC (rev 462)
+++ trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/rules/AdminGroupRule.java	2006-05-09 20:56:37 UTC (rev 463)
@@ -89,7 +89,7 @@
         globals.rintf.restoreAdminGroup(entity);
       }
 
-      if (globals.from2p3px) {
+      if (globals.config.getFrom2p3px()) {
         globals.getSuperGroup().addGroupMember(entity);
       }
     } catch (Throwable t) {

Added: trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/rules/AttendeeFieldRule.java
===================================================================
--- trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/rules/AttendeeFieldRule.java	                        (rev 0)
+++ trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/rules/AttendeeFieldRule.java	2006-05-09 20:56:37 UTC (rev 463)
@@ -0,0 +1,102 @@
+/*
+ Copyright (c) 2000-2005 University of Washington.  All rights reserved.
+
+ Redistribution and use of this distribution in source and binary forms,
+ with or without modification, are permitted provided that:
+
+   The above copyright notice and this permission notice appear in
+   all copies and supporting documentation;
+
+   The name, identifiers, and trademarks of the University of Washington
+   are not used in advertising or publicity without the express prior
+   written permission of the University of Washington;
+
+   Recipients acknowledge that this distribution is made available as a
+   research courtesy, "as is", potentially with defects, without
+   any obligation on the part of the University of Washington to
+   provide support, services, or repair;
+
+   THE UNIVERSITY OF WASHINGTON DISCLAIMS ALL WARRANTIES, EXPRESS OR
+   IMPLIED, WITH REGARD TO THIS SOFTWARE, INCLUDING WITHOUT LIMITATION
+   ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+   PARTICULAR PURPOSE, AND IN NO EVENT SHALL THE UNIVERSITY OF
+   WASHINGTON BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
+   DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+   PROFITS, WHETHER IN AN ACTION OF CONTRACT, TORT (INCLUDING
+   NEGLIGENCE) OR STRICT LIABILITY, ARISING OUT OF OR IN CONNECTION WITH
+   THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+/* **********************************************************************
+    Copyright 2005 Rensselaer Polytechnic Institute. All worldwide rights reserved.
+
+    Redistribution and use of this distribution in source and binary forms,
+    with or without modification, are permitted provided that:
+       The above copyright notice and this permission notice appear in all
+        copies and supporting documentation;
+
+        The name, identifiers, and trademarks of Rensselaer Polytechnic
+        Institute are not used in advertising or publicity without the
+        express prior written permission of Rensselaer Polytechnic Institute;
+
+    DISCLAIMER: The software is distributed" AS IS" without any express or
+    implied warranty, including but not limited to, any implied warranties
+    of merchantability or fitness for a particular purpose or any warrant)'
+    of non-infringement of any current or pending patent rights. The authors
+    of the software make no representations about the suitability of this
+    software for any particular purpose. The entire risk as to the quality
+    and performance of the software is with the user. Should the software
+    prove defective, the user assumes the cost of all necessary servicing,
+    repair or correction. In particular, neither Rensselaer Polytechnic
+    Institute, nor the authors of the software are liable for any indirect,
+    special, consequential, or incidental damages related to the software,
+    to the maximum extent the law permits.
+*/
+package org.bedework.dumprestore.restore.rules;
+
+import org.bedework.calfacade.BwAttendee;
+import org.bedework.dumprestore.restore.RestoreGlobals;
+
+/**
+ * @author Mike Douglass   douglm at rpi.edu
+ * @version 1.0
+ */
+public class AttendeeFieldRule extends EntityFieldRule {
+  AttendeeFieldRule(RestoreGlobals globals) {
+    super(globals);
+  }
+
+  public void field(String name) throws Exception {
+    BwAttendee ent = (BwAttendee)top();
+
+    if (ownedEntityTags(ent, name)) {
+      return;
+    }
+
+    if (name.equals("cutype")) {
+      ent.setCuType(stringFld());
+    } else if (name.equals("delegated-from")) {
+      ent.setDelegatedFrom(stringFld());
+    } else if (name.equals("delegated-to")) {
+      ent.setDelegatedTo(stringFld());
+    } else if (name.equals("cn")) {
+      ent.setCn(stringFld());
+    } else if (name.equals("dir")) {
+      ent.setDir(stringFld());
+    } else if (name.equals("lang")) {
+      ent.setLanguage(stringFld());
+    } else if (name.equals("member")) {
+      ent.setMember(stringFld());
+    } else if (name.equals("rsvp")) {
+      ent.setRsvp(booleanFld());
+    } else if (name.equals("role")) {
+      ent.setRole(stringFld());
+    } else if (name.equals("sent-by")) {
+      ent.setSentBy(stringFld());
+    } else if (name.equals("attendee-uri")) {
+      ent.setAttendeeUri(stringFld());
+    } else {
+      unknownTag(name);
+    }
+  }
+}
+

Added: trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/rules/AttendeeRule.java
===================================================================
--- trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/rules/AttendeeRule.java	                        (rev 0)
+++ trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/rules/AttendeeRule.java	2006-05-09 20:56:37 UTC (rev 463)
@@ -0,0 +1,87 @@
+/*
+ Copyright (c) 2000-2005 University of Washington.  All rights reserved.
+
+ Redistribution and use of this distribution in source and binary forms,
+ with or without modification, are permitted provided that:
+
+   The above copyright notice and this permission notice appear in
+   all copies and supporting documentation;
+
+   The name, identifiers, and trademarks of the University of Washington
+   are not used in advertising or publicity without the express prior
+   written permission of the University of Washington;
+
+   Recipients acknowledge that this distribution is made available as a
+   research courtesy, "as is", potentially with defects, without
+   any obligation on the part of the University of Washington to
+   provide support, services, or repair;
+
+   THE UNIVERSITY OF WASHINGTON DISCLAIMS ALL WARRANTIES, EXPRESS OR
+   IMPLIED, WITH REGARD TO THIS SOFTWARE, INCLUDING WITHOUT LIMITATION
+   ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+   PARTICULAR PURPOSE, AND IN NO EVENT SHALL THE UNIVERSITY OF
+   WASHINGTON BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
+   DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+   PROFITS, WHETHER IN AN ACTION OF CONTRACT, TORT (INCLUDING
+   NEGLIGENCE) OR STRICT LIABILITY, ARISING OUT OF OR IN CONNECTION WITH
+   THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+/* **********************************************************************
+    Copyright 2005 Rensselaer Polytechnic Institute. All worldwide rights reserved.
+
+    Redistribution and use of this distribution in source and binary forms,
+    with or without modification, are permitted provided that:
+       The above copyright notice and this permission notice appear in all
+        copies and supporting documentation;
+
+        The name, identifiers, and trademarks of Rensselaer Polytechnic
+        Institute are not used in advertising or publicity without the
+        express prior written permission of Rensselaer Polytechnic Institute;
+
+    DISCLAIMER: The software is distributed" AS IS" without any express or
+    implied warranty, including but not limited to, any implied warranties
+    of merchantability or fitness for a particular purpose or any warrant)'
+    of non-infringement of any current or pending patent rights. The authors
+    of the software make no representations about the suitability of this
+    software for any particular purpose. The entire risk as to the quality
+    and performance of the software is with the user. Should the software
+    prove defective, the user assumes the cost of all necessary servicing,
+    repair or correction. In particular, neither Rensselaer Polytechnic
+    Institute, nor the authors of the software are liable for any indirect,
+    special, consequential, or incidental damages related to the software,
+    to the maximum extent the law permits.
+*/
+package org.bedework.dumprestore.restore.rules;
+
+import org.bedework.calfacade.BwAttendee;
+import org.bedework.dumprestore.restore.RestoreGlobals;
+
+/**
+ * @author Mike Douglass   douglm at rpi.edu
+ * @version 1.0
+ */
+public class AttendeeRule extends EntityRule {
+  /** Constructor
+   *
+   * @param globals
+   */
+  public AttendeeRule(RestoreGlobals globals) {
+    super(globals);
+  }
+
+  public void end(String ns, String name) throws Exception {
+    BwAttendee entity = (BwAttendee)pop();
+    globals.attendees++;
+
+    globals.attendeesTbl.put(entity);
+
+    try {
+      if (globals.rintf != null) {
+        globals.rintf.restoreAttendee(entity);
+      }
+    } catch (Throwable t) {
+      throw new Exception(t);
+    }
+  }
+}
+

Modified: trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/rules/AuthUserRule.java
===================================================================
--- trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/rules/AuthUserRule.java	2006-05-08 20:45:37 UTC (rev 462)
+++ trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/rules/AuthUserRule.java	2006-05-09 20:56:37 UTC (rev 463)
@@ -77,7 +77,7 @@
       if (globals.rintf != null) {
         globals.rintf.restoreAuthUser(au);
 
-        if (globals.from2p3px && (globals.userInfo != null)) {
+        if (globals.config.getFrom2p3px() && (globals.userInfo != null)) {
           globals.userInfo.setUser(au.getUser());
           globals.rintf.restoreUserInfo(globals.userInfo);
           globals.userInfo = null;

Modified: trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/rules/CalendarRule.java
===================================================================
--- trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/rules/CalendarRule.java	2006-05-08 20:45:37 UTC (rev 462)
+++ trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/rules/CalendarRule.java	2006-05-09 20:56:37 UTC (rev 463)
@@ -77,9 +77,16 @@
 
     try {
       if (globals.rintf != null) {
-        globals.rintf.restoreCalendar(entity);
+        /* If the parent is null then this should be one of the root calendars,
+         */
+        BwCalendar parent = entity.getCalendar();
+        if (parent == null) {
+          // Ensure root
+          globals.rintf.saveRootCalendar(entity);
+        } else {
+          globals.rintf.addCalendar(entity);
+        }
       }
-      globals.calendarsTbl.put(new Integer(entity.getId()), entity);
     } catch (Throwable t) {
       throw new Exception(t);
     }

Modified: trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/rules/EntityFieldRule.java
===================================================================
--- trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/rules/EntityFieldRule.java	2006-05-08 20:45:37 UTC (rev 462)
+++ trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/rules/EntityFieldRule.java	2006-05-09 20:56:37 UTC (rev 463)
@@ -174,7 +174,11 @@
     }
 
     if (name.equals("calendar")) {
-      entity.setCalendar(calendarFld());
+      String path = stringFld();
+
+      if ((path != null) && (path.length() > 0)) {
+        entity.setCalendar(calendarFld());
+      } // Otherwise assume root calendar
       return true;
     }
 
@@ -227,7 +231,8 @@
     }
 
     if (name.equals("seq")) {
-      entity.setSeq(intFld());
+      // Don't restore version number.
+      //entity.setSeq(intFld());
       return true;
     }
 
@@ -376,6 +381,9 @@
 
       return dtim;
     } catch (Throwable t) {
+      if (t instanceof Exception) {
+        throw (Exception)t;
+      }
       throw new Exception(t);
     }
   }
@@ -404,9 +412,14 @@
       throw new Exception("No value for " + tagName);
     }
 
-    int id = Integer.parseInt(fldval);
-
-    return (BwCalendar)globals.calendarsTbl.get(new Integer(id));
+    try {
+      return globals.rintf.getCalendar(fldval);
+    } catch (Throwable t) {
+      if (t instanceof Exception) {
+        throw (Exception)t;
+      }
+      throw new Exception(t);
+    }
   }
 
   protected BwFilter filterFld() throws Exception {

Modified: trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/rules/EntityRule.java
===================================================================
--- trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/rules/EntityRule.java	2006-05-08 20:45:37 UTC (rev 462)
+++ trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/rules/EntityRule.java	2006-05-09 20:56:37 UTC (rev 463)
@@ -53,9 +53,37 @@
 */
 package org.bedework.dumprestore.restore.rules;
 
+import org.bedework.calfacade.BwAttendee;
+import org.bedework.calfacade.BwCalendar;
+import org.bedework.calfacade.BwCategory;
+import org.bedework.calfacade.BwEvent;
+import org.bedework.calfacade.BwEventAlarm;
+import org.bedework.calfacade.BwEventAnnotation;
+import org.bedework.calfacade.BwEventObj;
+import org.bedework.calfacade.BwLocation;
+import org.bedework.calfacade.BwOrganizer;
+import org.bedework.calfacade.BwSponsor;
+import org.bedework.calfacade.BwSystem;
+import org.bedework.calfacade.BwTimeZone;
+import org.bedework.calfacade.BwTodoAlarm;
+import org.bedework.calfacade.BwUser;
 import org.bedework.calfacade.base.BwShareableDbentity;
+import org.bedework.calfacade.filter.BwAndFilter;
+import org.bedework.calfacade.filter.BwCategoryFilter;
+import org.bedework.calfacade.filter.BwCreatorFilter;
+import org.bedework.calfacade.filter.BwLocationFilter;
+import org.bedework.calfacade.filter.BwNotFilter;
+import org.bedework.calfacade.filter.BwOrFilter;
+import org.bedework.calfacade.filter.BwSponsorFilter;
+import org.bedework.calfacade.svc.BwAdminGroup;
+import org.bedework.calfacade.svc.BwAuthUser;
+import org.bedework.calfacade.svc.BwPreferences;
+import org.bedework.dumprestore.BwDbLastmod;
 import org.bedework.dumprestore.restore.RestoreGlobals;
+import org.bedework.dumprestore.restore.RestoreGlobals.AliasFilter;
 
+import java.util.HashMap;
+
 import org.xml.sax.Attributes;
 
 /**
@@ -63,16 +91,57 @@
  * @version 1.0
  */
 public class EntityRule extends RestoreRule {
+
+  /** Link tag-name to calendar class. For every entity tag generated by the dump
+   * there should be an entry in this table.
+   */
+  public static final HashMap classes = new HashMap();
+
+  static {
+    classes.put("aliasFilter", AliasFilter.class.getName());
+    classes.put("andFilter", BwAndFilter.class.getName());
+    classes.put("creatorFilter", BwCreatorFilter.class.getName());
+    classes.put("keyFilter", BwCategoryFilter.class.getName());
+    classes.put("locationFilter", BwLocationFilter.class.getName());
+    classes.put("notFilter", BwNotFilter.class.getName());
+    classes.put("orFilter", BwOrFilter.class.getName());
+    classes.put("sponsorFilter", BwSponsorFilter.class.getName());
+
+    classes.put("system", BwSystem.class.getName());
+    classes.put("user", BwUser.class.getName());
+    classes.put("timezone", BwTimeZone.class.getName());
+    classes.put("calendar", BwCalendar.class.getName());
+    classes.put("location", BwLocation.class.getName());
+    classes.put("sponsor", BwSponsor.class.getName());
+    classes.put("organizer", BwOrganizer.class.getName());
+    classes.put("attendee", BwAttendee.class.getName());
+    classes.put("event-alarm", BwEventAlarm.class.getName());
+    classes.put("todo-alarm", BwTodoAlarm.class.getName());
+    classes.put("keyword", BwCategory.class.getName());
+    classes.put("category", BwCategory.class.getName());
+    classes.put("authuser", BwAuthUser.class.getName());
+    classes.put("event", BwEventObj.class.getName());
+    classes.put("event-annotation", BwEventAnnotation.class.getName());
+    classes.put("adminGroup", BwAdminGroup.class.getName());
+    classes.put("user-prefs", BwPreferences.class.getName());
+    classes.put("dblastmod", BwDbLastmod.class.getName());
+
+    /* 2.3.2 */
+    classes.put("eventRef", BwEvent.class.getName());
+  }
+
   EntityRule(RestoreGlobals globals) {
     super(globals);
   }
 
   public void begin(String ns, String name, Attributes att) {
-    if (globals.debugEntity) {
+    globals.entityError = false;
+
+    if (globals.config.getDebugEntity()) {
       trace("About to push entity for " + name);
     }
 
-    String className = (String)RestoreGlobals.classes.get(name);
+    String className = (String)classes.get(name);
 
     if (className == null) {
       throw new RuntimeException("Unable to get class name for " + name);
@@ -89,13 +158,17 @@
       }
 
       o = c.newInstance();
+
+      push(o);
+
+      if (globals.rintf != null) {
+        globals.rintf.startTransaction();
+      }
     } catch (ClassNotFoundException e) {
       throw new RuntimeException("Class " + className + " not found");
     } catch (Throwable t) {
       throw new RuntimeException(t);
     }
-
-    push(o);
   }
 
   /** Set the owner and creator on a shareable entity.

Modified: trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/rules/EventFieldRule.java
===================================================================
--- trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/rules/EventFieldRule.java	2006-05-08 20:45:37 UTC (rev 462)
+++ trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/rules/EventFieldRule.java	2006-05-09 20:56:37 UTC (rev 463)
@@ -76,170 +76,195 @@
       return;
     }
 
-    /* pre-hibernate fields */
-    if (name.equals("lastmod")) { // pre-hibernate
-      e.setLastmod(isoDateTimeFld());
-    } else if (name.equals("created")) {  // pre-hibernate
-      e.setCreated(isoDateTimeFld());
-      e.setDtstamp(isoDateTimeFld());
-    } else if (name.equals("longdesc")) { // pre-hibernate
-      e.setDescription(stringFld());
-    } else if (name.equals("startdate")) { // pre-hibernate
-      e.setDtstart(dateFld());
-    } else if (name.equals("starttime")) { // pre-hibernate
-      makeDateTimeFld(e.getDtstart());
-    } else if (name.equals("enddate")) { // pre-hibernate
-      e.setEndType(BwEvent.endTypeDate);
-      e.setDtend(dateFld());
-    } else if (name.equals("endtime")) { // pre-hibernate
-      makeDateTimeFld(e.getDtend());
-    } else if (name.equals("shortdesc")) { // pre-hibernate
-      e.setSummary(stringFld());
-    } else if (name.equals("keyword")) { // pre-hibernate
-      //globals.eventKeysTbl.put(intFld(), e.getId());
-      BwCategory cat = categoryFld();
-      e.addCategory(cat);
-      BwCalendar cal = globals.catCalTbl.get(cat.getId());
-      if (cal == null) {
-        error("No mapping for category " + cat + " for event " + e);
-      } else {
-        e.setCalendar(cal);
-      }
-    } else if (name.equals("eventKeywords")) { // pre-hibernate
-      // Nothing to do.
+    try {
+      /* pre-hibernate fields */
+      if (name.equals("lastmod")) { // pre-hibernate
+        e.setLastmod(isoDateTimeFld());
+      } else if (name.equals("created")) {  // pre-hibernate
+        e.setCreated(isoDateTimeFld());
+        e.setDtstamp(isoDateTimeFld());
+      } else if (name.equals("longdesc")) { // pre-hibernate
+        e.setDescription(stringFld());
+      } else if (name.equals("startdate")) { // pre-hibernate
+        e.setDtstart(dateFld());
+      } else if (name.equals("starttime")) { // pre-hibernate
+        makeDateTimeFld(e.getDtstart());
+      } else if (name.equals("enddate")) { // pre-hibernate
+        e.setEndType(BwEvent.endTypeDate);
+        e.setDtend(dateFld());
+      } else if (name.equals("endtime")) { // pre-hibernate
+        makeDateTimeFld(e.getDtend());
+      } else if (name.equals("shortdesc")) { // pre-hibernate
+        e.setSummary(stringFld());
+      } else if (name.equals("keyword")) { // pre-hibernate
+        //globals.eventKeysTbl.put(intFld(), e.getId());
+        BwCategory cat = categoryFld();
+        e.addCategory(cat);
+        BwCalendar cal = globals.catCalTbl.get(cat.getId());
+        if (cal == null) {
+          error("No mapping for category " + cat + " for event " + e);
+        } else {
+          e.setCalendar(cal);
+        }
+      } else if (name.equals("eventKeywords")) { // pre-hibernate
+        // Nothing to do.
 
-    } else if (name.equals("target")) {
-      /* FIXME - this is wrong */
-      // Create a dummy target
-      BwEvent target = new BwEventObj();
+      } else if (name.equals("target-calendar")) {
+        BwEvent target = getAnnotationTarget(e);
 
-      target.setId(intFld());
-      ((BwEventAnnotation)e).setTarget(target);
+        // target.setCalendar()
+      } else if (name.equals("name")) {
+        e.setName(stringFld());
+      } else if (name.equals("guid")) {
+        e.setGuid(stringFld());
+      } else if (name.equals("summary")) {
+        e.setSummary(stringFld());
+      } else if (name.equals("description")) {
+        e.setDescription(stringFld());
 
-    } else if (name.equals("name")) {
-      e.setName(stringFld());
-    } else if (name.equals("guid")) {
-      e.setGuid(stringFld());
-    } else if (name.equals("summary")) {
-      e.setSummary(stringFld());
-    } else if (name.equals("description")) {
-      e.setDescription(stringFld());
+        /* Start */
+      } else if (name.equals("start-date-type")) {
+        dateType = booleanFld();
+        tzid = null;
+      } else if (name.equals("start-tzid")) {
+        tzid = stringFld();
+      } else if (name.equals("start-dtval")) {
+        dtVal = fixedDateTimeFld();
+      } else if (name.equals("start-date")) {
+        // Could compare given UTC time
+        e.setDtstart(dateTimeFld());
 
-      /* Start */
-    } else if (name.equals("start-date-type")) {
-      dateType = booleanFld();
-      tzid = null;
-    } else if (name.equals("start-tzid")) {
-      tzid = stringFld();
-    } else if (name.equals("start-dtval")) {
-      dtVal = fixedDateTimeFld();
-    } else if (name.equals("start-date")) {
-      // Could compare given UTC time
-      e.setDtstart(dateTimeFld());
+        /* end */
+      } else if (name.equals("end-date-type")) {
+        dateType = booleanFld();
+        tzid = null;
+      } else if (name.equals("end-tzid")) {
+        tzid = stringFld();
+      } else if (name.equals("end-dtval")) {
+        dtVal = fixedDateTimeFld();
+      } else if (name.equals("end-date")) {
+        // Could compare given UTC time
+        e.setDtend(dateTimeFld());
 
-      /* end */
-    } else if (name.equals("end-date-type")) {
-      dateType = booleanFld();
-      tzid = null;
-    } else if (name.equals("end-tzid")) {
-      tzid = stringFld();
-    } else if (name.equals("end-dtval")) {
-      dtVal = fixedDateTimeFld();
-    } else if (name.equals("end-date")) {
-      // Could compare given UTC time
-      e.setDtend(dateTimeFld());
+      } else if (name.equals("duration")) {
+        e.setDuration(stringFld());
+      } else if (name.equals("end-type")) {
+        e.setEndType(charFld());
 
-    } else if (name.equals("duration")) {
-      e.setDuration(stringFld());
-    } else if (name.equals("end-type")) {
-      e.setEndType(charFld());
+      } else if (name.equals("link")) {
+        e.setLink(stringFld());
+      } else if (name.equals("status")) {
+        String status = stringFld();
+        if ((status != null) &&
+            (!status.equals("F"))) {       // 2.3
+          e.setStatus(status);
+        }
+      } else if (name.equals("cost")) {
+        e.setCost(stringFld());
+      } else if (name.equals("deleted")) {
+        e.setDeleted(booleanFld());
 
-    } else if (name.equals("link")) {
-      e.setLink(stringFld());
-    } else if (name.equals("status")) {
-      String status = stringFld();
-      if ((status != null) &&
-          (!status.equals("F"))) {       // 2.3
-        e.setStatus(status);
-      }
-    } else if (name.equals("cost")) {
-      e.setCost(stringFld());
-    } else if (name.equals("deleted")) {
-      e.setDeleted(booleanFld());
+      } else if (name.equals("dtstamp")) {
+        e.setDtstamp(stringFld());
+      } else if (name.equals("last-mod")) {
+        e.setLastmod(stringFld());
+      } else if (name.equals("create-date")) {
+        e.setCreated(stringFld());
 
-    } else if (name.equals("dtstamp")) {
-      e.setDtstamp(stringFld());
-    } else if (name.equals("last-mod")) {
-      e.setLastmod(stringFld());
-    } else if (name.equals("create-date")) {
-      e.setCreated(stringFld());
+      } else if (name.equals("priority")) {
+        e.setPriority(intFld());
+      } else if (name.equals("sequence")) {
+        e.setSequence(intFld());
 
-    } else if (name.equals("priority")) {
-      e.setPriority(intFld());
-    } else if (name.equals("sequence")) {
-      e.setSequence(intFld());
+      } else if (name.equals("eventCategories")) {
+        // Nothing to do.
+      } else if (name.equals("category")) {
+        globals.eventKeysTbl.put(intFld(), e.getId());
+        e.addCategory(categoryFld());
 
-    } else if (name.equals("eventCategories")) {
-      // Nothing to do.
-    } else if (name.equals("category")) {
-      globals.eventKeysTbl.put(intFld(), e.getId());
-      e.addCategory(categoryFld());
+      } else if (name.equals("sponsor")) {
+        e.setSponsor(sponsorFld());
+      } else if (name.equals("location")) {
+        e.setLocation(locationFld());
+      } else if (name.equals("organizer")) {
+        e.setOrganizer(organizerFld());
 
-    } else if (name.equals("sponsor")) {
-      e.setSponsor(sponsorFld());
-    } else if (name.equals("location")) {
-      e.setLocation(locationFld());
-    } else if (name.equals("organizer")) {
-      e.setOrganizer(organizerFld());
+      } else if (name.equals("transparency")) {
+        e.setTransparency(stringFld());
 
-    } else if (name.equals("transparency")) {
-      e.setTransparency(stringFld());
+      } else if (name.equals("eventAttendees")) {
+        // Nothing to do.
+      } else if (name.equals("attendee")) {
+        throw new Exception("Unimplemented - attendee");
 
-    } else if (name.equals("eventAttendees")) {
-      // Nothing to do.
-    } else if (name.equals("attendee")) {
-      throw new Exception("Unimplemented - attendee");
+      } else if (name.equals("recurring")) {
+        e.setRecurring(booleanFld());
+      } else if (name.equals("eventRecurrence")) {
+        // Nothing to do.
+      } else if (name.equals("rrule")) {
+        e.getRecurrence().addRrule(stringFld());
+      } else if (name.equals("exrule")) {
+        e.getRecurrence().addExrule(stringFld());
 
-    } else if (name.equals("recurring")) {
-      e.setRecurring(booleanFld());
-    } else if (name.equals("eventRecurrence")) {
-      // Nothing to do.
-    } else if (name.equals("rrule")) {
-      e.getRecurrence().addRrule(stringFld());
-    } else if (name.equals("exrule")) {
-      e.getRecurrence().addExrule(stringFld());
+        /* rdate */
+      } else if (name.equals("rdate-date-type")) {
+        dateType = booleanFld();
+        tzid = null;
+      } else if (name.equals("rdate-tzid")) {
+        tzid = stringFld();
+      } else if (name.equals("rdate-dtval")) {
+        dtVal = stringFld();
+      } else if (name.equals("rdate-date")) {
+        // Could compare given UTC time
+        e.getRecurrence().addRdate(dateTimeFld());
 
-      /* rdate */
-    } else if (name.equals("rdate-date-type")) {
-      dateType = booleanFld();
-      tzid = null;
-    } else if (name.equals("rdate-tzid")) {
-      tzid = stringFld();
-    } else if (name.equals("rdate-dtval")) {
-      dtVal = stringFld();
-    } else if (name.equals("rdate-date")) {
-      // Could compare given UTC time
-      e.getRecurrence().addRdate(dateTimeFld());
+        /* exdate */
+      } else if (name.equals("exdate-date-type")) {
+        dateType = booleanFld();
+        tzid = null;
+      } else if (name.equals("exdate-tzid")) {
+        tzid = stringFld();
+      } else if (name.equals("exdate-dtval")) {
+        dtVal = stringFld();
+      } else if (name.equals("exdate-date")) {
+        // Could compare given UTC time
+        e.getRecurrence().addExdate(dateTimeFld());
 
-      /* exdate */
-    } else if (name.equals("exdate-date-type")) {
-      dateType = booleanFld();
-      tzid = null;
-    } else if (name.equals("exdate-tzid")) {
-      tzid = stringFld();
-    } else if (name.equals("exdate-dtval")) {
-      dtVal = stringFld();
-    } else if (name.equals("exdate-date")) {
-      // Could compare given UTC time
-      e.getRecurrence().addExdate(dateTimeFld());
+      } else if (name.equals("recurrenceId")) {
+        e.setRecurrenceId(stringFld());
+      } else if (name.equals("latestDate")) {
+        e.getRecurrence().setLatestDate(stringFld());
+      } else {
+        unknownTag(name);
+      }
+    } catch (Exception ex) {
+      error("Error processing event id " + e.getId(), ex);
+      globals.entityError = true;
+    }
+  }
 
-    } else if (name.equals("recurrenceId")) {
-      e.setRecurrenceId(stringFld());
-    } else if (name.equals("latestDate")) {
-      e.getRecurrence().setLatestDate(stringFld());
-    } else {
-      unknownTag(name);
+  private BwEvent getAnnotationTarget(BwEvent e) {
+    BwEventAnnotation ann = (BwEventAnnotation)e;
+    BwEvent target = ann.getTarget();
+
+    if (target == null) {
+      target = new BwEventObj();
     }
+
+    ann.setTarget(target);
+    return target;
   }
+
+  private BwEvent getAnnotationMaster(BwEvent e) {
+    BwEventAnnotation ann = (BwEventAnnotation)e;
+    BwEvent master = ann.getMaster();
+
+    if (master == null) {
+      master = new BwEventObj();
+    }
+
+    ann.setMaster(master);
+    return master;
+  }
 }
 

Modified: trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/rules/EventRule.java
===================================================================
--- trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/rules/EventRule.java	2006-05-08 20:45:37 UTC (rev 462)
+++ trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/rules/EventRule.java	2006-05-09 20:56:37 UTC (rev 463)
@@ -89,15 +89,21 @@
   public void end(String ns, String name) throws Exception {
     BwEvent entity = (BwEvent)top();
 
+    if (globals.entityError) {
+      warn("Not restoring event because of previous error");
+      warn(entity.toString());
+      return;
+    }
+
     globals.events++;
 
-    if (globals.debug) {
+    if (globals.config.getDebug()) {
       trace("Restore event # " + globals.events);
     }
 
     fixSharableEntity(entity, "Event");
 
-    /* If it's an alias, save an entry in the alia table then remove the dummy target.
+    /* If it's an alias, save an entry in the alias table then remove the dummy target.
      * We'll update them all at the end
      */
     if (entity instanceof BwEventAnnotation) {
@@ -106,7 +112,7 @@
     }
 
     try {
-      if (globals.from2p3px) {
+      if (globals.config.getFrom2p3px()) {
         if ((entity.getGuid() == null) || (entity.getGuid().length() == 0)) {
           if (globals.syspars.getSystemid() == null) {
             throw new Exception("You must supply a system id");
@@ -121,7 +127,7 @@
 
           String guid = guidPrefix + globals.syspars.getSystemid();
 
-          if (globals.debug) {
+          if (globals.config.getDebug()) {
 //            trace("Set guid for " + entity.getId() + " to " + guid);
           }
 

Modified: trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/rules/FilterRule.java
===================================================================
--- trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/rules/FilterRule.java	2006-05-08 20:45:37 UTC (rev 462)
+++ trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/rules/FilterRule.java	2006-05-09 20:56:37 UTC (rev 463)
@@ -85,7 +85,7 @@
     globals.filtersTbl.put(entity);
 
     try {
-      if (globals.from2p3px) {
+      if (globals.config.getFrom2p3px()) {
         /* We are converting filter definitions into calendar definitions.
          */
         BwCalendar cal = new BwCalendar();
@@ -107,7 +107,7 @@
           cal.setCalendarCollection(true);
           globals.calLeaves.add(entity);
           globals.catCalTbl.put(catf.getCategory().getId(), cal);
-          if (globals.debug) {
+          if (globals.config.getDebug()) {
             trace("Save calendar with id " + cal.getId());
           }
         } else if (entity instanceof BwCreatorFilter) {
@@ -152,9 +152,8 @@
           cal.setId(globals.nextCalKey);
           globals.nextCalKey++;
 
-          globals.calendarsTbl.put(new Integer(cal.getId()), cal);
-
           if (entity.getParent() != null) {
+            // We set the path further up
             BwCalendar parent = (BwCalendar)globals.filterToCal.get(
                 new Integer(entity.getParent().getId()));
 
@@ -164,19 +163,21 @@
             } else {
               cal.setCalendar(parent);
               cal.setPath(parent.getPath() + "/" + cal.getName());
-              if (cal.getPath().equals(globals.defaultPublicCalPath)) {
+              if (cal.getPath().equals(globals.config.getDefaultPublicCalPath())) {
                 globals.defaultPublicCal = cal;
               }
               parent.addChild(cal);
             }
           }
 
+          globals.calendarsTbl.put(cal);
+
           globals.filterToCal.put(new Integer(entity.getId()), cal);
         }
 
         entity.setOwner(globals.getPublicUser());
         entity.setPublick(true);
-      }
+      } // 2.3
 
       if (globals.rintf != null) {
         trace("About to restore filter " + entity);

Modified: trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/rules/FiltersRule.java
===================================================================
--- trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/rules/FiltersRule.java	2006-05-08 20:45:37 UTC (rev 462)
+++ trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/rules/FiltersRule.java	2006-05-09 20:56:37 UTC (rev 463)
@@ -79,7 +79,7 @@
    * @see org.apache.commons.digester.Rule#end(java.lang.String, java.lang.String)
    */
   public void end(String ns, String name) throws Exception {
-    if (!globals.from2p3px) {
+    if (!globals.config.getFrom2p3px()) {
       // Not converting
       return;
     }
@@ -145,7 +145,7 @@
     cal.setCalendarCollection(true);
     ucal.addChild(cal);
 
-    globals.calendarsTbl.put(new Integer(cal.getId()), cal);
+    globals.calendarsTbl.put(cal);
 
     globals.defaultCalendars.put(new Integer(u.getId()), cal);
 

Modified: trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/rules/RestoreRule.java
===================================================================
--- trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/rules/RestoreRule.java	2006-05-08 20:45:37 UTC (rev 462)
+++ trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/rules/RestoreRule.java	2006-05-09 20:56:37 UTC (rev 463)
@@ -95,6 +95,10 @@
     getLog().error(msg);
   }
 
+  protected void error(String msg, Throwable t) {
+    getLog().error(msg, t);
+  }
+
   protected void warn(String msg) {
     getLog().warn(msg);
   }

Modified: trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/rules/RestoreRuleSet.java
===================================================================
--- trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/rules/RestoreRuleSet.java	2006-05-08 20:45:37 UTC (rev 462)
+++ trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/rules/RestoreRuleSet.java	2006-05-09 20:56:37 UTC (rev 463)
@@ -97,6 +97,9 @@
     d.addRule("caldata/organizers/organizer", new OrganizerRule(globals));
     d.addRule("caldata/organizers/organizer/*", new OrganizerFieldRule(globals));
 
+    d.addRule("caldata/attendees/attendee", new AttendeeRule(globals));
+    d.addRule("caldata/attendees/attendee/*", new AttendeeFieldRule(globals));
+
     /* 2.3.2
     d.addRule("caldata/dblastmods/dblastmod", new DbLastmodRule(globals));
     d.addRule("caldata/dblastmods/dblastmod/*", new DbLastmodFieldRule(globals));
@@ -130,6 +133,9 @@
     d.addRule("caldata/events/event", new EventRule(globals));
     d.addRule("caldata/events/event/*", efr);
 
+    d.addRule("caldata/event-annotations/event-annotation", new EventRule(globals));
+    d.addRule("caldata/event-annotations/event-annotation/*", efr);
+
     AlarmRule alr = new AlarmRule(globals);
     AlarmFieldRule alfr = new AlarmFieldRule(globals);
     d.addRule("caldata/alarms/event-alarm", alr);

Modified: trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/rules/SysparsFieldRule.java
===================================================================
--- trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/rules/SysparsFieldRule.java	2006-05-08 20:45:37 UTC (rev 462)
+++ trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/rules/SysparsFieldRule.java	2006-05-09 20:56:37 UTC (rev 463)
@@ -101,15 +101,12 @@
 
     } else if (name.equals("httpConnectionsPerUser")) {
       ent.setHttpConnectionsPerUser(parval(globals.syspars.getHttpConnectionsPerUser(),
-                                           globals.sysparsSetHttpConnectionsPerUser,
                                            intFld()));
     } else if (name.equals("httpConnectionsPerHost")) {
       ent.setHttpConnectionsPerHost(parval(globals.syspars.getHttpConnectionsPerHost(),
-                                           globals.sysparsSetHttpConnectionsPerHost,
                                            intFld()));
     } else if (name.equals("httpConnections")) {
       ent.setHttpConnections(parval(globals.syspars.getHttpConnections(),
-                                    globals.sysparsSetHttpConnections,
                                     intFld()));
 
     } else if (name.equals("maxPublicDescriptionLength")) {
@@ -119,11 +116,8 @@
     } else if (name.equals("maxUserEntitySize")) {
       ent.setMaxUserEntitySize(intFld());
     } else if (name.equals("defaultUserQuota")) {
-      if (globals.sysparsSetDefaultUserQuota) {
-        ent.setDefaultUserQuota(globals.syspars.getDefaultUserQuota());
-      } else {
-        ent.setDefaultUserQuota(longFld());
-      }
+      ent.setDefaultUserQuota(parval(globals.syspars.getDefaultUserQuota(),
+                                     longFld()));
 
     } else if (name.equals("userauthClass")) {
       ent.setUserauthClass(parval(globals.syspars.getUserauthClass(), stringFld()));
@@ -138,14 +132,22 @@
     }
   }
 
-  private int parval(int sysparVal, boolean isSet, int val) {
-    if (isSet) {
+  private int parval(int sysparVal, int val) {
+    if (sysparVal != 0) {
       return sysparVal;
     }
 
     return val;
   }
 
+  private long parval(long sysparVal, long val) {
+    if (sysparVal != 0) {
+      return sysparVal;
+    }
+
+    return val;
+  }
+
   private String parval(String sysparVal, String val) {
     if (sysparVal != null) {
       return sysparVal;

Modified: trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/rules/UserPrefsFieldRule.java
===================================================================
--- trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/rules/UserPrefsFieldRule.java	2006-05-08 20:45:37 UTC (rev 462)
+++ trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/rules/UserPrefsFieldRule.java	2006-05-09 20:56:37 UTC (rev 463)
@@ -77,7 +77,7 @@
 
     if (name.equals("email")) {
       p.setEmail(stringFld());
-    } else if (name.equals("default-calendar")) {
+    } else if (name.equals("defaultCalendar")) {
       p.setDefaultCalendar(calendarFld());
     } else if (name.equals("skinName")) {
       p.setSkinName(stringFld());
@@ -93,6 +93,10 @@
       p.setWorkdayStart(intFld());
     } else if (name.equals("workdayEnd")) {
       p.setWorkdayEnd(intFld());
+    } else if (name.equals("preferredEndType")) {
+      p.setPreferredEndType(stringFld());
+    } else if (name.equals("userMode")) {
+      p.setUserMode(intFld());
 
     // subscription fields
 
@@ -109,7 +113,7 @@
       globals.curSub.setName(stringFld());
     } else if (name.equals("sub-owner")) {
       BwUser sowner = userFld();
-      
+
       if (!p.getOwner().equals(sowner)) {
         error("Subscription owners don't match for " + globals.curSub);
         error("  Found owner " + sowner + " expected " + p.getOwner());
@@ -119,6 +123,8 @@
       globals.curSub.setUri(stringFld());
     } else if (name.equals("sub-affectsFreeBusy")) {
       globals.curSub.setAffectsFreeBusy(booleanFld());
+    } else if (name.equals("sub-ignoreTransparency")) {
+      globals.curSub.setIgnoreTransparency(booleanFld());
     } else if (name.equals("sub-display")) {
       globals.curSub.setDisplay(booleanFld());
     } else if (name.equals("sub-style")) {
@@ -146,7 +152,7 @@
       globals.curView.setName(stringFld());
     } else if (name.equals("view-owner")) {
       BwUser vowner = userFld();
-      
+
       if (!p.getOwner().equals(vowner)) {
         error("View owners don't match for " + globals.curView);
         error("  Found owner " + vowner + " expected " + p.getOwner());
@@ -154,6 +160,7 @@
       globals.curView.setOwner(p.getOwner());
     } else if (name.equals("view-subscriptions")) {
     } else if (name.equals("view-sub-id")) {
+      // pre 3.1
       BwSubscription sub = globals.subscriptionsTbl.getSub(p.getOwner(), intFld());
 
       if (sub == null) {
@@ -162,6 +169,15 @@
       } else {
         globals.curView.addSubscription(sub);
       }
+    } else if (name.equals("view-sub-name")) {
+      BwSubscription sub = globals.subscriptionsTbl.getSub(p.getOwner(), stringFld());
+
+      if (sub == null) {
+        error("  Missing subscription " + stringFld() + " for view " +
+              globals.curView);
+      } else {
+        globals.curView.addSubscription(sub);
+      }
     }
   }
 }

Modified: trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/rules/UserRule.java
===================================================================
--- trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/rules/UserRule.java	2006-05-08 20:45:37 UTC (rev 462)
+++ trunk/calendar3/dumprestore/src/org/bedework/dumprestore/restore/rules/UserRule.java	2006-05-09 20:56:37 UTC (rev 463)
@@ -73,7 +73,7 @@
     BwUser entity = (BwUser)pop();
     globals.users++;
 
-    if (globals.from2p3px) {
+    if (globals.config.getFrom2p3px()) {
       entity.setCategoryAccess(globals.getDefaultPersonalAccess());
       entity.setLocationAccess(globals.getDefaultPersonalAccess());
       entity.setSponsorAccess(globals.getDefaultPersonalAccess());

Added: trunk/calendar3/test/caldavTestData/eg/eg21.test
===================================================================
--- trunk/calendar3/test/caldavTestData/eg/eg21.test	                        (rev 0)
+++ trunk/calendar3/test/caldavTestData/eg/eg21.test	2006-05-09 20:56:37 UTC (rev 463)
@@ -0,0 +1,32 @@
+DESCRIPTION: REPORT with unsupported property
+
+METHOD: REPORT
+
+AUTH: true
+
+EXPECT-RESPONSE: 403
+
+URL: calendar/
+
+HEADER: Depth: 1
+
+CONTENTTYPE: text/xml
+
+CONTENT:
+<?xml version="1.0" encoding="utf-8" ?>
+<C:calendar-query xmlns:C="urn:ietf:params:xml:ns:caldav">
+  <D:prop xmlns:D="DAV:">
+    <D:getetag/>
+    <C:calendar-data/>
+  </D:prop>
+  <C:filter>
+    <C:comp-filter name="VCALENDAR">
+      <C:comp-filter name="VEVENT">
+        <C:prop-filter name="X-ABC-GUID">
+          <C:text-match>ABC</C:text-match>
+        </C:prop-filter>
+      </C:comp-filter>
+    </C:comp-filter>
+  </C:filter>
+</C:calendar-query>
+

Modified: trunk/calendar3/test/src/org/bedework/tests/calsvc/CalSvcAlarmsTest.java
===================================================================
--- trunk/calendar3/test/src/org/bedework/tests/calsvc/CalSvcAlarmsTest.java	2006-05-08 20:45:37 UTC (rev 462)
+++ trunk/calendar3/test/src/org/bedework/tests/calsvc/CalSvcAlarmsTest.java	2006-05-09 20:56:37 UTC (rev 463)
@@ -150,7 +150,8 @@
 
       int twoAttendeeAlarm = alarm.getId();
 
-      alarm.addAttendee(new BwAttendee(null, null, null, null,
+      alarm.addAttendee(new BwAttendee(alarm.getOwner(), alarm.getPublick(),
+                                       null, null, null, null,
                                        null, null, null, true,
                                        null, null, "someone at rpi.edu",
                                        "anotherperson at rpi.edu"));
@@ -227,7 +228,8 @@
 
       int twoAttendeeAlarm = alarm.getId();
 
-      alarm.addAttendee(new BwAttendee(null, null, null, null,
+      alarm.addAttendee(new BwAttendee(alarm.getOwner(), alarm.getPublick(),
+                                       null, null, null, null,
                                        null, null, null, true,
                                        null, null, "someone at rpi.edu",
                                        "anotherperson at rpi.edu"));
@@ -260,14 +262,15 @@
    * ==================================================================== */
 
   private BwEventAlarm makeAlarm(String user, int mins) {
-    BwEventAlarm alarm = BwEventAlarm.emailAlarm(ev, new BwUser(user),
+    BwUser u = new BwUser(user);
+    BwEventAlarm alarm = BwEventAlarm.emailAlarm(ev, u,
                                                  "-PT" + mins + "M", true, true,
                                                  "PT5M", 1,
                                                  null, // attach
                                                  "Description of alarm",
                                                  "Summary for alarm",
                                                  null);  //attendees
-    BwAttendee att = new BwAttendee(null, null, null, null,
+    BwAttendee att = new BwAttendee(u, false, null, null, null, null,
                                     null, null, null, true,
                                     null, null, "someone at rpi.edu",
                                     "someoneelse at rpi.edu");



More information about the Bedework-commit mailing list