- full support of all version 2 attributes (attr2) - the code is generated
authorJan Pospíšil <honik@ntc.zcu.cz>
Sun, 11 May 2008 18:37:36 +0000 (18:37 +0000)
committerJan Pospíšil <honik@ntc.zcu.cz>
Sun, 11 May 2008 18:37:36 +0000 (18:37 +0000)
- attrs2 now default, version 1 attributes available by -1 option
- fix for bug #21085 - corrected XML escaping in XML structured attributes
(added dependency on org.glite.lbjp-common.trio)
- added several messages to the verbose mode

org.glite.lb.utils/Makefile
org.glite.lb.utils/src/process_attrs.c [new file with mode: 0644]
org.glite.lb.utils/src/process_attrs2.c.T [new file with mode: 0644]
org.glite.lb.utils/src/statistics.c

index 299b3b7..e4e98d5 100644 (file)
@@ -20,7 +20,12 @@ version=${module.version}
 VPATH=${top_srcdir}/src:${top_srcdir}/doc
 
 CC=gcc
+AT3=${stagedir}/sbin/glite-lb-at3
+
+SUFFIXES = .T
+
 DEBUG:=-g -O0 -Wall
+
 CFLAGS:= \
        ${WS_CFLAGS} ${DEBUG} \
        -DVERSION=\"${version}\" \
@@ -51,6 +56,7 @@ CLIENT_LIB:=-lglite_lb_client_${nothrflavour}
 JP_LIBS:=-lglite_jp_common_${nothrflavour}
 
 UTILS:=mon purge dump load dump_exporter
+STATISTICS_OBJS:=statistics.o process_attrs.o process_attrs2.o
 
 MAN_GZ:=glite-lb-mon.1.gz
 MAN = $(MAN_GZ:.gz=)
@@ -60,14 +66,11 @@ default: all
 
 compile all: ${UTILS} ${MAN_GZ} statistics
 
-%.o: %.c 
-       ${CC} ${CFLAGS} -c $<
-
 ${UTILS}: %: %.o
        ${LINK} -o $@ $< ${COMMON_LIB} ${CLIENT_LIB} ${EXT_LIBS} -lglite_lbu_maildir
 
-statistics: statistics.o
-       ${LINK} -rdynamic -o $@ $< ${COMMON_LIB} ${JP_LIBS} ${EXT_LIBS} 
+statistics: ${STATISTICS_OBJS}
+       ${LINK} -rdynamic -o $@ ${STATISTICS_OBJS} ${COMMON_LIB} ${JP_LIBS} ${EXT_LIBS} 
 
 check: compile 
 
@@ -101,3 +104,8 @@ clean:
 %.o: %.c
        ${COMPILE} -c $<
 
+%.c: %.c.T
+       rm -f $@
+       ${AT3} $< >$@ || rm -f $@
+       chmod -w $@ >/dev/null
+
diff --git a/org.glite.lb.utils/src/process_attrs.c b/org.glite.lb.utils/src/process_attrs.c
new file mode 100644 (file)
index 0000000..9b03c46
--- /dev/null
@@ -0,0 +1,220 @@
+#include <stdio.h>
+#include <malloc.h>
+#include <unistd.h>
+
+#include "glite/lbu/trio.h"
+
+#include "glite/jp/types.h"
+#include "glite/jp/context.h"
+#include "glite/jp/file_plugin.h"
+#include "glite/jp/attr.h"
+#include "glite/lb/job_attrs.h"
+
+/*
+ * free the array of JP attr
+ */
+static void free_attrs(glite_jp_attrval_t *av) {
+        glite_jp_attrval_t *item;
+
+        item = av;
+        while (item->name) {
+                glite_jp_attrval_free(item++, 0);
+        }
+        free(av);
+}
+
+/*
+ * process attributes
+ */
+void process_attrs(glite_jp_context_t jpctx, glite_jpps_fplug_data_t plugin_data, void *data_handle, FILE *outfile) {
+
+       glite_jp_attrval_t *attrval;
+
+       /* <header> */
+       trio_fprintf(outfile,"<?xml version=\"1.0\"?>\n\n");
+       trio_fprintf(outfile,"<lbd:jobRecord\n");
+       trio_fprintf(outfile,"xmlns:lbd=\"http://glite.org/wsdl/types/lbdump\"\n");
+       
+       plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_jobId, &attrval);
+       if (attrval) {
+               trio_fprintf(outfile,"jobid=\"%|Xs\"\n", attrval->value);
+               free_attrs(attrval);
+       } else {
+               trio_fprintf(outfile,"jobid=\"default\"\n");
+       }
+       trio_fprintf(outfile,">\n");
+       /* </header> */
+       
+       /* <body> */
+       plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_user, &attrval);
+       if (attrval) {
+               trio_fprintf(outfile,"<user>%|Xs</user>\n", attrval->value);
+               free_attrs(attrval);
+       }
+
+       plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_parent, &attrval);
+       if (attrval) {
+               trio_fprintf(outfile,"<parent>%|Xs</parent>\n", attrval->value);
+               free_attrs(attrval);
+       }
+
+       plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_VO, &attrval);
+       if (attrval) {
+               trio_fprintf(stdout,"<VO>%|Xs</VO>\n", attrval->value);
+               free_attrs(attrval);
+       }
+
+       plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_aTag, &attrval);
+       if (attrval) {
+               trio_fprintf(outfile,"<aTag>%|Xs</aTag>\n", attrval->value);
+               free_attrs(attrval);
+       }
+
+       plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_rQType, &attrval);
+       if (attrval) {
+               trio_fprintf(outfile,"<rQType>%|Xs</rQType>\n", attrval->value);
+               free_attrs(attrval);
+       }
+
+       plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_eDuration, &attrval);
+       if (attrval) {
+               trio_fprintf(outfile,"<eDuration>%|Xs</eDuration>\n", attrval->value);
+               free_attrs(attrval);
+       }
+
+       plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_eNodes, &attrval);
+       if (attrval) {
+               trio_fprintf(outfile,"<eNodes>%|Xs</eNodes>\n", attrval->value);
+               free_attrs(attrval);
+       }
+
+       plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_eProc, &attrval);
+       if (attrval) {
+               trio_fprintf(outfile,"<eProc>%|Xs</eProc>\n", attrval->value);
+               free_attrs(attrval);
+       }
+
+       plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_RB, &attrval);
+       if (attrval) {
+               trio_fprintf(outfile,"<RB>%|Xs</RB>\n", attrval->value);
+               free_attrs(attrval);
+       }
+
+       plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_CE, &attrval);
+       if (attrval) {
+               trio_fprintf(outfile,"<CE>%|Xs</CE>\n", attrval->value);
+               free_attrs(attrval);
+       }
+
+       plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_host, &attrval);
+       if (attrval) {
+               trio_fprintf(outfile,"<host>%|Xs</host>\n", attrval->value);
+               free_attrs(attrval);
+       }
+
+       plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_UIHost, &attrval);
+       if (attrval) {
+               trio_fprintf(outfile,"<UIHost>%|Xs</UIHost>\n", attrval->value);
+               free_attrs(attrval);
+       }
+
+       plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_CPUTime, &attrval);
+       if (attrval) {
+               trio_fprintf(outfile,"<CPUTime>%|Xs</CPUTime>\n", attrval->value);
+               free_attrs(attrval);
+       }
+
+       plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_NProc, &attrval);
+       if (attrval) {
+               trio_fprintf(outfile,"<NProc>%|Xs</NProc>\n", attrval->value);
+               free_attrs(attrval);
+       }
+
+       plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_finalStatus, &attrval);
+       if (attrval) {
+               trio_fprintf(outfile,"<finalStatus>%|Xs</finalStatus>\n", attrval->value);
+               free_attrs(attrval);
+       }
+
+       plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_finalDoneStatus, &attrval);
+       if (attrval) {
+               trio_fprintf(outfile,"<finalDoneStatus>%|Xs</finalDoneStatus>\n", attrval->value);
+               free_attrs(attrval);
+       }
+
+       plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_finalStatusDate, &attrval);
+       if (attrval) {
+               trio_fprintf(outfile,"<finalStatusDate>%|Xs</finalStatusDate>\n", attrval->value);
+               free_attrs(attrval);
+       }
+
+       plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_finalStatusReason, &attrval);
+       if (attrval) {
+               trio_fprintf(outfile,"<finalStatusReason>%|Xs</finalStatusReason>\n", attrval->value);
+               free_attrs(attrval);
+       }
+
+       plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_LRMSDoneStatus, &attrval);
+       if (attrval) {
+               trio_fprintf(outfile,"<LRMSDoneStatus>%|Xs</LRMSDoneStatus>\n", attrval->value);
+               free_attrs(attrval);
+       }
+
+       plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_LRMSStatusReason, &attrval);
+       if (attrval) {
+               trio_fprintf(outfile,"<LRMSStatusReason>%|Xs</LRMSStatusReason>\n", attrval->value);
+               free_attrs(attrval);
+       }
+
+       plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_retryCount, &attrval);
+       if (attrval) {
+               trio_fprintf(outfile,"<retryCount>%|Xs</retryCount>\n", attrval->value);
+               free_attrs(attrval);
+       }
+
+       plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_additionalReason, &attrval);
+       if (attrval) {
+               trio_fprintf(outfile,"<additionalReason>%|Xs</additionalReason>\n", attrval->value);
+               free_attrs(attrval);
+       }
+
+       plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_jobType, &attrval);
+       if (attrval) {
+               trio_fprintf(outfile,"<jobType>%|Xs</jobType>\n", attrval->value);
+               free_attrs(attrval);
+       }
+
+       plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_nsubjobs, &attrval);
+       if (attrval) {
+               trio_fprintf(outfile,"<nsubjobs>%|Xs</nsubjobs>\n", attrval->value);
+               free_attrs(attrval);
+       }
+
+       plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_subjobs, &attrval);
+       if (attrval) {
+               trio_fprintf(outfile,"<subjobs>%|Xs</subjobs>\n", attrval->value);
+               free_attrs(attrval);
+       }
+
+       plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_lastStatusHistory, &attrval);
+       if (attrval) {
+               trio_fprintf(outfile,"<lastStatusHistory>%s</lastStatusHistory>\n",attrval->value);
+               free_attrs(attrval);
+       }
+
+       plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_fullStatusHistory, &attrval);
+       if (attrval) {
+               trio_fprintf(outfile,"<fullStatusHistory>%s</fullStatusHistory>\n",attrval->value);
+               free_attrs(attrval);
+       }
+
+       plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_JDL, &attrval);
+       if (attrval) {
+               trio_fprintf(outfile,"<JDL>%|Xs</JDL>\n", attrval->value);
+               free_attrs(attrval);
+       }
+
+       /* </body> */
+
+       trio_fprintf(outfile,"</lbd:jobRecord>\n\n");
+}
diff --git a/org.glite.lb.utils/src/process_attrs2.c.T b/org.glite.lb.utils/src/process_attrs2.c.T
new file mode 100644 (file)
index 0000000..3467d29
--- /dev/null
@@ -0,0 +1,85 @@
+#ident "$Header$"
+/*
+@@@AUTO
+*/
+@@@LANG: C
+
+#include <stdio.h>
+#include <malloc.h>
+#include <unistd.h>
+
+#include "glite/lbu/trio.h"
+
+#include "glite/jp/types.h"
+#include "glite/jp/context.h"
+#include "glite/jp/file_plugin.h"
+#include "glite/jp/attr.h"
+#include "glite/lb/job_attrs2.h"
+
+/*
+ * free the array of JP attr
+ */
+static void free_attrs(glite_jp_attrval_t *av) {
+        glite_jp_attrval_t *item;
+
+        item = av;
+        while (item->name) {
+                glite_jp_attrval_free(item++, 0);
+        }
+        free(av);
+}
+
+/*
+ * process attributes
+ */
+void process_attrs2(glite_jp_context_t jpctx, glite_jpps_fplug_data_t plugin_data, void *data_handle, FILE *outfile) {
+
+       glite_jp_attrval_t *attrval;
+
+       /* <header> */
+       fprintf(outfile,"<?xml version=\"1.0\"?>\n\n");
+       fprintf(outfile,"<lbd:jobRecord\n");
+       fprintf(outfile,"xmlns:lbd=\"http://glite.org/wsdl/types/lbdump\"\n");
+       
+       plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_jobId, &attrval);
+       if (attrval) {
+               trio_fprintf(outfile,"jobid=\"%|Xs\"\n", attrval->value);
+               free_attrs(attrval);
+       } else {
+               fprintf(outfile,"jobid=\"default\"\n");
+       }
+       fprintf(outfile,">\n");
+       /* </header> */
+       
+       /* <body> */
+@@@{
+# elems
+        for my $n ($status->getAllFieldsOrdered) {
+                my $f = selectField $status $n;
+#                my $type = getType $f;
+               my $type = $f->{type};
+                my $name = getName $f;
+
+#                $type = 'jobtypeType' if $name eq 'jobtype';
+
+                @ln = split /_/,$name;
+                my $un = shift @ln; $un .= ucfirst shift @ln while (@ln);
+                my $c = getComment $f;
+               my $strformat = "%s";
+               if ($type eq 'string') { $strformat = "%|Xs"; }
+
+                gen qq{
+       /** $c */
+        plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_$un, &attrval);
+        if (attrval) {
+                trio_fprintf(outfile,"<$un>$strformat</$un>\\n", attrval->value);
+                free_attrs(attrval);
+        }
+};
+
+        }
+@@@}
+       fprintf(outfile,"</lbd:jobRecord>\n\n");
+
+       /* </body> */
+}
index aef0842..5736c4a 100644 (file)
 typedef int init_f(glite_jp_context_t ctx, glite_jpps_fplug_data_t *data);
 typedef void done_f(glite_jp_context_t ctx, glite_jpps_fplug_data_t *data);
 
+void process_attrs(glite_jp_context_t jpctx, glite_jpps_fplug_data_t plugin_data, void *data_handle, FILE *outfile);
+void process_attrs2(glite_jp_context_t jpctx, glite_jpps_fplug_data_t plugin_data, void *data_handle, FILE *outfile);
+
 static const char rcsid[] = "@(#)$Id$";
 static int verbose = 0;
 static char *infilename = NULL;
 static char *outfilename = NULL;
-static int jdl = 0;
+static int versionone = 0;
 
 static struct option const long_options[] = {
        { "file", required_argument, 0, 'f' },
        { "outfile", required_argument, 0, 'o' },
-       { "jdl", no_argument, 0, 'j' },
+       { "versionone", no_argument, 0, '1' },
         { "help", no_argument, 0, 'h' },
         { "verbose", no_argument, 0, 'v' },
         { "version", no_argument, 0, 'V' },
@@ -60,7 +63,7 @@ usage(char *program_name) {
                "-v, --verbose              print extensive debug output to stderr\n"
                "-f, --file <file>          dump file to process\n"
                "-o, --outfile <file>       output filename\n"  
-               "-j, --jdl                  prit also JDL in the XML\n\n",
+               "-1, --versionone           use version 1 of the attributes (obsolete now)\n\n",
                program_name);
 }
 
@@ -82,19 +85,6 @@ int glite_jppsbe_pread(glite_jp_context_t ctx, void *handle, void *buf, size_t n
 }
 
 /*
- * free the array of JP attr
- */
-static void free_attrs(glite_jp_attrval_t *av) {
-       glite_jp_attrval_t *item;
-
-       item = av;
-       while (item->name) {
-               glite_jp_attrval_free(item++, 0);
-       }
-       free(av);
-}
-
-/*
  * main
  */
 int main(int argc, char *argv[]) 
@@ -103,7 +93,6 @@ int main(int argc, char *argv[])
        glite_jpps_fplug_data_t plugin_data;
        void *data_handle, *lib_handle;
        FILE *infile,*outfile = NULL;
-       glite_jp_attrval_t *attrval;
        char *err;
        init_f *plugin_init;
        done_f *plugin_done;
@@ -113,7 +102,7 @@ int main(int argc, char *argv[])
        while ((opt = getopt_long(argc,argv,
                "f:" /* input file */
                "o:" /* output file */
-               "j"  /* jdl */
+               "1"  /* version one of the attributes */
                "h"  /* help */
                "v"  /* verbose */
                "V",  /* version */
@@ -124,7 +113,7 @@ int main(int argc, char *argv[])
                        case 'v': verbose = 1; break;
                        case 'f': infilename = optarg; break;
                        case 'o': outfilename = optarg; break;
-                       case 'j': jdl = 1; break;
+                       case '1': versionone = 1; break;
                        case 'h':
                        default:
                                usage(argv[0]); return(0);
@@ -136,21 +125,22 @@ int main(int argc, char *argv[])
                err = dlerror() ? :"unknown error";
                fprintf(stderr,"lb_statistics: can't load L&B plugin (%s)\n", err);
                return 1;
-       }
+       } else if (verbose) fprintf(stdout,"lb_statistics: loaded L&B plugin\n");
+
        if ((plugin_init = dlsym(lib_handle, "init")) == NULL ||
            (plugin_done = dlsym(lib_handle, "done")) == NULL) {
                err = dlerror() ? : "unknown error";
                fprintf(stderr,"lb_statistics: can't find symbol 'init' or 'done' (%s)\n", err);
                dlclose(lib_handle);
                return 1;
-       }
+       } else if (verbose) fprintf(stdout,"lb_statistics: L&B plugin check o.k.\n");
 
        /* dump file with events */
        if ((infile = fopen(infilename, "rt")) == NULL) {
                fprintf(stderr,"lb_statistics: Error opening file %s: %s\n", infilename, strerror(errno));
                dlclose(lib_handle);
                return 1;
-       }
+       } else if (verbose) fprintf(stdout,"lb_statistics: opened input file %s\n", infilename);
 
        /* output filename */
        if (outfilename) {
@@ -158,13 +148,14 @@ int main(int argc, char *argv[])
                        fprintf(stderr,"lb_statistics: Error opening file %s: %s\n", outfilename, strerror(errno));
                        dlclose(lib_handle);
                        fclose(infile);
-               }
+               } else if (verbose) fprintf(stdout,"lb_statistics: opened output file %s\n", outfilename);
        } else {
                outfile = stdout;
+               if (verbose) fprintf(stdout,"lb_statistics: output will go to stdout\n");
        }
 
-       jpctx = calloc(1,sizeof *jpctx);
        /* use the plugin */
+       jpctx = calloc(1,sizeof *jpctx);
        plugin_init(jpctx, &plugin_data);
 
        jpctx->plugins = calloc(2,sizeof(*jpctx->plugins));
@@ -173,201 +164,28 @@ int main(int argc, char *argv[])
        plugin_data.ops.open(jpctx, infile, "uri://", &data_handle);
 
        if (data_handle) {
-               /* <header> */
-               fprintf(outfile,"<?xml version=\"1.0\"?>\n\n");
-               fprintf(outfile,"<lbd:jobRecord\n");
-               fprintf(outfile,"\txmlns:lbd=\"http://glite.org/wsdl/types/lbdump\"\n");
-               
-               plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_jobId, &attrval);
-               if (attrval) {
-                       fprintf(outfile,"\tjobid=\"%s\"\n", attrval->value);
-                       free_attrs(attrval);
-               } else {
-                       fprintf(outfile,"\tjobid=\"default\"\n");
-               }
-               fprintf(outfile,">\n");
-               /* </header> */
-               
-               /* <body> */
-               plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_user, &attrval);
-               if (attrval) {
-                       fprintf(outfile,"\t<user>%s</user>\n", attrval->value);
-                       free_attrs(attrval);
-               }
-
-               plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_parent, &attrval);
-               if (attrval) {
-                       fprintf(outfile,"\t<parent>%s</parent>\n", attrval->value);
-                       free_attrs(attrval);
-               }
-
-               plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_VO, &attrval);
-               if (attrval) {
-                       fprintf(stdout,"\t<VO>%s</VO>\n", attrval->value);
-                       free_attrs(attrval);
-               }
-
-               plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_aTag, &attrval);
-               if (attrval) {
-                       fprintf(outfile,"\t<aTag>%s</aTag>\n", attrval->value);
-                       free_attrs(attrval);
-               }
-
-               plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_rQType, &attrval);
-               if (attrval) {
-                       fprintf(outfile,"\t<rQType>%s</rQType>\n", attrval->value);
-                       free_attrs(attrval);
-               }
-
-               plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_eDuration, &attrval);
-               if (attrval) {
-                       fprintf(outfile,"\t<eDuration>%s</eDuration>\n", attrval->value);
-                       free_attrs(attrval);
-               }
-
-               plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_eNodes, &attrval);
-               if (attrval) {
-                       fprintf(outfile,"\t<eNodes>%s</eNodes>\n", attrval->value);
-                       free_attrs(attrval);
-               }
-
-               plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_eProc, &attrval);
-               if (attrval) {
-                       fprintf(outfile,"\t<eProc>%s</eProc>\n", attrval->value);
-                       free_attrs(attrval);
-               }
-
-               plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_RB, &attrval);
-               if (attrval) {
-                       fprintf(outfile,"\t<RB>%s</RB>\n", attrval->value);
-                       free_attrs(attrval);
-               }
-
-               plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_CE, &attrval);
-               if (attrval) {
-                       fprintf(outfile,"\t<CE>%s</CE>\n", attrval->value);
-                       free_attrs(attrval);
-               }
-
-               plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_host, &attrval);
-               if (attrval) {
-                       fprintf(outfile,"\t<host>%s</host>\n", attrval->value);
-                       free_attrs(attrval);
-               }
-
-               plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_UIHost, &attrval);
-               if (attrval) {
-                       fprintf(outfile,"\t<UIHost>%s</UIHost>\n", attrval->value);
-                       free_attrs(attrval);
-               }
-
-               plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_CPUTime, &attrval);
-               if (attrval) {
-                       fprintf(outfile,"\t<CPUTime>%s</CPUTime>\n", attrval->value);
-                       free_attrs(attrval);
-               }
-
-               plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_NProc, &attrval);
-               if (attrval) {
-                       fprintf(outfile,"\t<NProc>%s</NProc>\n", attrval->value);
-                       free_attrs(attrval);
-               }
-
-               plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_finalStatus, &attrval);
-               if (attrval) {
-                       fprintf(outfile,"\t<finalStatus>%s</finalStatus>\n", attrval->value);
-                       free_attrs(attrval);
-               }
-
-               plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_finalDoneStatus, &attrval);
-               if (attrval) {
-                       fprintf(outfile,"\t<finalDoneStatus>%s</finalDoneStatus>\n", attrval->value);
-                       free_attrs(attrval);
-               }
-
-               plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_finalStatusDate, &attrval);
-               if (attrval) {
-                       fprintf(outfile,"\t<finalStatusDate>%s</finalStatusDate>\n", attrval->value);
-                       free_attrs(attrval);
-               }
-
-               plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_finalStatusReason, &attrval);
-               if (attrval) {
-                       fprintf(outfile,"\t<finalStatusReason>%s</finalStatusReason>\n", attrval->value);
-                       free_attrs(attrval);
-               }
-
-               plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_LRMSDoneStatus, &attrval);
-               if (attrval) {
-                       fprintf(outfile,"\t<LRMSDoneStatus>%s</LRMSDoneStatus>\n", attrval->value);
-                       free_attrs(attrval);
-               }
-
-               plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_LRMSStatusReason, &attrval);
-               if (attrval) {
-                       fprintf(outfile,"\t<LRMSStatusReason>%s</LRMSStatusReason>\n", attrval->value);
-                       free_attrs(attrval);
-               }
-
-               plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_retryCount, &attrval);
-               if (attrval) {
-                       fprintf(outfile,"\t<retryCount>%s</retryCount>\n", attrval->value);
-                       free_attrs(attrval);
-               }
 
-               plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_additionalReason, &attrval);
-               if (attrval) {
-                       fprintf(outfile,"\t<additionalReason>%s</additionalReason>\n", attrval->value);
-                       free_attrs(attrval);
-               }
-
-               plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_jobType, &attrval);
-               if (attrval) {
-                       fprintf(outfile,"\t<jobType>%s</jobType>\n", attrval->value);
-                       free_attrs(attrval);
-               }
-
-               plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_nsubjobs, &attrval);
-               if (attrval) {
-                       fprintf(outfile,"\t<nsubjobs>%s</nsubjobs>\n", attrval->value);
-                       free_attrs(attrval);
-               }
-
-               plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_subjobs, &attrval);
-               if (attrval) {
-                       fprintf(outfile,"\t<subjobs>\n%s\t</subjobs>\n", attrval->value);
-                       free_attrs(attrval);
-               }
-
-               plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_lastStatusHistory, &attrval);
-               if (attrval) {
-                       fprintf(outfile,"\t<lastStatusHistory>\n%s\t</lastStatusHistory>\n",attrval->value);
-                       free_attrs(attrval);
-               }
-
-               plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_fullStatusHistory, &attrval);
-               if (attrval) {
-                       fprintf(outfile,"\t<fullStatusHistory>\n%s\t</fullStatusHistory>\n",attrval->value);
-                       free_attrs(attrval);
-               }
-
-               if (jdl) {
-                       plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_JDL, &attrval);
-                       if (attrval) {
-                               fprintf(outfile,"\t<JDL>%s</JDL>\n", attrval->value);
-                               free_attrs(attrval);
-                       }
+               if (versionone) {
+                       process_attrs(jpctx, plugin_data, data_handle, outfile);
+               } else {
+                       process_attrs2(jpctx, plugin_data, data_handle, outfile);
                }
 
-               fprintf(outfile,"</lbd:jobRecord>\n");
-
-               /* </body> */
                plugin_data.ops.close(jpctx, data_handle);
        }
        plugin_done(jpctx, &plugin_data);
 
        fclose(infile);
-       if (outfile) fclose(outfile);
+       if (verbose) fprintf(stdout,"lb_statistics: closed input file %s\n", infilename);
+
+       if (outfile) {
+               fclose(outfile);
+               if (verbose) fprintf(stdout,"lb_statistics: closed output file %s\n", outfilename);
+       }
+
        dlclose(lib_handle);
+       if (verbose) fprintf(stdout,"lb_statistics: L&B plugin closed\n");
+
        return 0;
 }
+