KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > jaspersoft > jasperserver > util > ImportResource


1 /*
2  * Copyright (C) 2006 JasperSoft http://www.jaspersoft.com
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed WITHOUT ANY WARRANTY; and without the
10  * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
11  * See the GNU General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License
14  * along with this program; if not, see http://www.gnu.org/licenses/gpl.txt
15  * or write to:
16  *
17  * Free Software Foundation, Inc.,
18  * 59 Temple Place - Suite 330,
19  * Boston, MA USA 02111-1307
20  */

21 package com.jaspersoft.jasperserver.util;
22
23 /**
24  * @author tkavanagh
25  * @version $Id: ImportResource.java 4739 2006-09-25 12:31:19Z lucian $
26  */

27
28 import java.io.File JavaDoc;
29 import java.io.FileInputStream JavaDoc;
30 import java.io.FileReader JavaDoc;
31 import java.text.DateFormat JavaDoc;
32 import java.text.SimpleDateFormat JavaDoc;
33 import java.util.ArrayList JavaDoc;
34 import java.util.Calendar JavaDoc;
35 import java.util.Date JavaDoc;
36 import java.util.HashMap JavaDoc;
37 import java.util.HashSet JavaDoc;
38 import java.util.List JavaDoc;
39 import java.util.Iterator JavaDoc;
40 import java.util.Map JavaDoc;
41 import java.util.Set JavaDoc;
42
43 import com.jaspersoft.jasperserver.api.common.domain.ExecutionContext;
44 import com.jaspersoft.jasperserver.api.engine.scheduling.domain.ReportJob;
45 import com.jaspersoft.jasperserver.api.engine.scheduling.domain.ReportJobMailNotification;
46 import com.jaspersoft.jasperserver.api.engine.scheduling.domain.ReportJobRepositoryDestination;
47 import com.jaspersoft.jasperserver.api.engine.scheduling.domain.ReportJobSimpleTrigger;
48 import com.jaspersoft.jasperserver.api.engine.scheduling.domain.ReportJobSource;
49 import com.jaspersoft.jasperserver.api.engine.scheduling.domain.ReportJobTrigger;
50 import com.jaspersoft.jasperserver.api.engine.scheduling.service.ReportJobsPersistenceService;
51 import com.jaspersoft.jasperserver.api.metadata.common.domain.ContentResource;
52 import com.jaspersoft.jasperserver.api.metadata.common.domain.DataSource;
53 import com.jaspersoft.jasperserver.api.metadata.common.domain.DataType;
54 import com.jaspersoft.jasperserver.api.metadata.common.domain.FileResource;
55 import com.jaspersoft.jasperserver.api.metadata.common.domain.Folder;
56 import com.jaspersoft.jasperserver.api.metadata.common.domain.InputControl;
57 import com.jaspersoft.jasperserver.api.metadata.common.domain.ListOfValues;
58 import com.jaspersoft.jasperserver.api.metadata.common.domain.ListOfValuesItem;
59 import com.jaspersoft.jasperserver.api.metadata.common.domain.Query;
60 import com.jaspersoft.jasperserver.api.metadata.common.domain.Resource;
61 import com.jaspersoft.jasperserver.api.metadata.common.domain.ResourceReference;
62 import com.jaspersoft.jasperserver.api.metadata.common.domain.client.DataTypeImpl;
63 import com.jaspersoft.jasperserver.api.metadata.common.domain.client.FileResourceImpl;
64 import com.jaspersoft.jasperserver.api.metadata.common.domain.client.FolderImpl;
65 import com.jaspersoft.jasperserver.api.metadata.common.domain.client.ListOfValuesImpl;
66 import com.jaspersoft.jasperserver.api.metadata.common.domain.client.ListOfValuesItemImpl;
67 import com.jaspersoft.jasperserver.api.metadata.common.domain.client.QueryImpl;
68 import com.jaspersoft.jasperserver.api.metadata.common.service.RepositoryService;
69 import com.jaspersoft.jasperserver.api.metadata.jasperreports.domain.JdbcReportDataSource;
70 import com.jaspersoft.jasperserver.api.metadata.jasperreports.domain.JndiJdbcReportDataSource;
71 import com.jaspersoft.jasperserver.api.metadata.jasperreports.domain.ReportDataSource;
72 import com.jaspersoft.jasperserver.api.metadata.jasperreports.domain.ReportUnit;
73 import com.jaspersoft.jasperserver.api.metadata.olap.domain.MondrianConnection;
74 import com.jaspersoft.jasperserver.api.metadata.olap.domain.MondrianXMLADefinition;
75 import com.jaspersoft.jasperserver.api.metadata.olap.domain.OlapClientConnection;
76 import com.jaspersoft.jasperserver.api.metadata.olap.domain.OlapUnit;
77 import com.jaspersoft.jasperserver.api.metadata.olap.domain.XMLAConnection;
78 import com.jaspersoft.jasperserver.api.metadata.user.domain.Role;
79 import com.jaspersoft.jasperserver.api.metadata.user.domain.User;
80 import com.jaspersoft.jasperserver.api.metadata.user.service.UserAuthorityService;
81 import com.jaspersoft.jasperserver.api.metadata.view.domain.FilterCriteria;
82 import com.jaspersoft.jasperserver.util.FileResourceBean;
83
84 import org.apache.commons.logging.Log;
85 import org.apache.commons.logging.LogFactory;
86
87 import org.exolab.castor.xml.Unmarshaller;
88
89 import org.dom4j.Document;
90 import org.dom4j.Element;
91 import org.dom4j.io.SAXReader;
92
93 public class ImportResource {
94
95     private static final Log log = LogFactory.getLog(ImportResource.class);
96     private static final String JavaDoc PATH_SEP = "/";
97     private static final String JavaDoc LABEL = "_label";
98     private static final boolean TOP_LEVEL_OBJECT = true;
99     private static final boolean NOT_TOP_LEVEL_OBJECT = false;
100     
101     private RepositoryService repo;
102     private UserAuthorityService auth;
103     private ReportJobsPersistenceService mSched;
104     private ExecutionContext context;
105     private String JavaDoc catalogPath;
106     private String JavaDoc catalogFileName;
107     private FileReader JavaDoc reader;
108     
109     private String JavaDoc prependPath;
110     private String JavaDoc prependPathNoSlash;
111     private boolean usePrependPath;
112     
113     private boolean failed = false;
114     
115     /**
116      * @param args
117      */

118     public static void main(String JavaDoc[] args) {
119
120     }
121
122     public ImportResource(RepositoryService repo,
123             UserAuthorityService auth,
124             ReportJobsPersistenceService reportJobsPersistenceService,
125             ExecutionContext context,
126             String JavaDoc catalogPath,
127             String JavaDoc catalogFileName,
128             String JavaDoc prependPath) {
129         
130         this.catalogPath = catalogPath;
131         this.catalogFileName = catalogFileName;
132         this.context = context;
133         this.repo = repo;
134         this.auth = auth;
135         this.mSched = reportJobsPersistenceService;
136         
137         /*
138          * Set the prepend path. Allows for importing to a named folder
139          * location.
140          */

141         if (prependPath == null || prependPath.equals(PATH_SEP) || prependPath.equals("")) {
142             usePrependPath = false;
143             this.prependPath = ""; // set prepend path to empty string
144
log.debug("not using prepend path");
145         } else {
146             usePrependPath = true;
147             this.prependPath = setPrependPath(prependPath);
148             this.prependPathNoSlash = setPrependPathNoSlash(this.prependPath);
149             log.debug("using prepend path, path=" + this.prependPath);
150         }
151     }
152     
153     
154     /**
155      * @return true if successful, false otherwise
156      */

157     public boolean process() {
158         log.debug("top of process()");
159         
160         loadCatalogFile();
161         
162         try {
163         
164             Unmarshaller unmarshaller = new Unmarshaller(ExportImportBean.class);
165             unmarshaller.setMapping(MappingHelper.getExportImportBeanMapping());
166             ExportImportBean bean = (ExportImportBean) unmarshaller.unmarshal(reader);
167             
168             if (log.isDebugEnabled()) {
169                 log.debug("Unmarshalled a " + bean.getVersion() + " exported bean");
170             }
171         
172             if (bean.getUserRoleHolder() != null) {
173                 
174                 processUsersRoles( bean.getUserRoleHolder() );
175             }
176             
177             if (bean.getResource() != null) {
178                 
179                 processResource( bean.getResource() );
180             }
181             
182             if (bean.getReportJobs() != null) {
183                 
184                 processReportJobs( bean.getReportJobs());
185             }
186             
187         } catch (Exception JavaDoc e) {
188             log.error("ERROR: caught exception unmarshalling catalog, file=" +
189                     catalogPath + PATH_SEP + ExportResource.CATALOG_FILE_NAME +
190                     ", exception: " + e.getMessage());
191             e.printStackTrace();
192             failed = true;
193         }
194         return !failed;
195     }
196
197     
198     public void processResource(ResourceBean bean) {
199         log.debug("top of processResource()");
200         
201         try {
202
203             if (bean instanceof FolderBean) {
204                 
205                 process( (FolderBean) bean, TOP_LEVEL_OBJECT);
206                 
207             } else if (bean instanceof ReportUnitBean) {
208                     
209                 process( (ReportUnitBean) bean, TOP_LEVEL_OBJECT);
210                     
211             } else if (bean instanceof OlapUnitBean) {
212                                 
213                 process( (OlapUnitBean) bean, TOP_LEVEL_OBJECT);
214                             
215             } else if (bean instanceof FileResourceBean) {
216                 
217                 process( (FileResourceBean) bean, TOP_LEVEL_OBJECT);
218                 
219             } else if (bean instanceof ContentResourceBean) {
220                 
221                 process( (ContentResourceBean) bean, TOP_LEVEL_OBJECT);
222                                 
223             } else if (bean instanceof DataSourceBean) {
224                 
225                 process( (DataSourceBean) bean, TOP_LEVEL_OBJECT);
226                 
227             } else if (bean instanceof OlapClientConnectionBean) {
228                 
229                 process( (OlapClientConnectionBean) bean, TOP_LEVEL_OBJECT);
230
231             } else if (bean instanceof MondrianXmlaDefinitionBean) {
232                 
233                 process( (MondrianXmlaDefinitionBean) bean, TOP_LEVEL_OBJECT);
234                                 
235             } else if (bean instanceof InputControlBean) {
236                 
237                 process( (InputControlBean) bean, TOP_LEVEL_OBJECT);
238
239             } else if (bean instanceof DataTypeBean) {
240                 
241                 process( (DataTypeBean) bean, TOP_LEVEL_OBJECT);
242                 
243             } else if (bean instanceof ListOfValuesBean) {
244                 
245                 process( (ListOfValuesBean) bean, TOP_LEVEL_OBJECT);
246                 
247             } else if (bean instanceof QueryBean) {
248                 
249                 process( (QueryBean) bean, TOP_LEVEL_OBJECT);
250                 
251             } else {
252                 log.error("ERROR: unknown node type");
253             }
254             
255         } catch (Exception JavaDoc e) {
256             log.error("ERROR: caught exception processing, uri=" + bean.getUriString() +
257                     ", exception: " + e.getMessage());
258             e.printStackTrace();
259             failed = true;
260         }
261     }
262     
263     
264     public void processUsersRoles(UserRoleHolderBean bean) {
265
266         process(bean, NOT_TOP_LEVEL_OBJECT);
267     }
268     
269     
270     public void processReportJobs(ReportJobBean[] beans) {
271         
272         ReportJob job = new ReportJob();
273             
274         for (int i = 0; i < beans.length; i++) {
275             
276             process( beans[i], NOT_TOP_LEVEL_OBJECT);
277         }
278     }
279     
280     
281     public Folder process(FolderBean bean, boolean isTopLevel) {
282         log.debug("top of process(FolderBean)");
283
284         Folder folder = new FolderImpl();
285         
286         fillData(folder, bean);
287         
288         buildParentFolder(folder, bean);
289
290         System.out.println("ImportResource: check and/or save folder, uri=" + folder.getURIString());
291                         
292         handleSaveFolder(folder);
293         
294         /*
295          * get resources (ie files) in folder
296          */

297         if (bean.getResources() != null) {
298             
299             ResourceBean[] resources = bean.getResources();
300             
301             for (int i = 0; i < resources.length; i++) {
302                 
303                 if (resources[i] instanceof ReportUnitBean) {
304                     
305                     ReportUnit res = process( (ReportUnitBean) resources[i], NOT_TOP_LEVEL_OBJECT);
306                     
307                     buildParentFolder(res, resources[i]);
308                     
309                     handleSaveResource(res);
310                     
311                 } else if (resources[i] instanceof OlapUnitBean) {
312                     
313                     OlapUnit res = process( (OlapUnitBean) resources[i], NOT_TOP_LEVEL_OBJECT);
314                     
315                     buildParentFolder(res, resources[i]);
316
317                     handleSaveResource(res);
318                     
319                 } else if (resources[i] instanceof FileResourceBean) {
320                     
321                     FileResource res = process( (FileResourceBean) resources[i], NOT_TOP_LEVEL_OBJECT);
322                     
323                     buildParentFolder(res, resources[i]);
324
325                     handleSaveResource(res);
326                     
327                 } else if (resources[i] instanceof ContentResourceBean) {
328                     
329                     ContentResource res = process( (ContentResourceBean) resources[i], NOT_TOP_LEVEL_OBJECT);
330                     
331                     buildParentFolder(res, resources[i]);
332                     
333                     handleSaveResource(res);
334                     
335                 } else if (resources[i] instanceof DataSourceBean) {
336                     
337                     DataSource res = process( (DataSourceBean)resources[i], NOT_TOP_LEVEL_OBJECT);
338                     
339                     buildParentFolder(res, resources[i]);
340
341                     handleSaveResource(res);
342
343                 } else if (resources[i] instanceof OlapClientConnectionBean) {
344                     
345                     OlapClientConnection res = process( (OlapClientConnectionBean)resources[i], NOT_TOP_LEVEL_OBJECT);
346                     
347                     buildParentFolder(res, resources[i]);
348
349                     handleSaveResource(res);
350
351                 } else if (resources[i] instanceof MondrianXmlaDefinitionBean) {
352                     
353                     MondrianXMLADefinition res = process( (MondrianXmlaDefinitionBean)resources[i], NOT_TOP_LEVEL_OBJECT);
354                     
355                     buildParentFolder(res, resources[i]);
356
357                     handleSaveResource(res);
358                     
359                 } else if (resources[i] instanceof InputControlBean) {
360                     
361                     InputControl res = process( (InputControlBean)resources[i], NOT_TOP_LEVEL_OBJECT);
362                     
363                     buildParentFolder(res, resources[i]);
364                     
365                     handleSaveResource(res);
366                     
367                 } else if (resources[i] instanceof DataTypeBean) {
368                     
369                     DataType res = process( (DataTypeBean)resources[i], NOT_TOP_LEVEL_OBJECT);
370                     
371                     buildParentFolder(res, resources[i]);
372                     
373                     handleSaveResource(res);
374                     
375                 } else if (resources[i] instanceof ListOfValuesBean) {
376                     
377                     ListOfValues res = process( (ListOfValuesBean)resources[i], NOT_TOP_LEVEL_OBJECT);
378                     
379                     buildParentFolder(res, resources[i]);
380                     
381                     handleSaveResource(res);
382
383                 } else if (resources[i] instanceof QueryBean) {
384                     
385                     Query res = process( (QueryBean)resources[i], NOT_TOP_LEVEL_OBJECT);
386                     
387                     buildParentFolder(res, resources[i]);
388                     
389                     handleSaveResource(res);
390
391                 } else {
392                     log.error("ERROR: unknown resource type, class=" + resources[i].getClass());
393                 }
394             }
395         }
396         
397         //OlapClientConnectionBean)
398

399         /*
400          * get and recurse into sub-folders
401          */

402         if (bean.getFolders() != null) {
403             FolderBean[] folders = bean.getFolders();
404             
405             for (int j = 0; j < folders.length; j++) {
406                             
407                 process(folders[j], NOT_TOP_LEVEL_OBJECT); // recurse into sub-folders
408
}
409         }
410         
411         return folder;
412     }
413     
414     
415     public ReportUnit process(ReportUnitBean bean, boolean isTopLevel) {
416         log.debug("top of processReportUnit()");
417
418         ReportUnit unit = (ReportUnit) repo.newResource(context, ReportUnit.class);
419         
420         fillData(bean, unit);
421
422         /*
423          * get datasource
424          */

425         if (bean.getDataSource() != null) {
426             
427             DataSource ds = process( bean.getDataSource(), NOT_TOP_LEVEL_OBJECT);
428                         
429             if (bean.getDataSource().getIsUriReference()) {
430                 
431                 unit.setDataSourceReference(ds.getURIString());
432                 
433             } else {
434                 unit.setDataSource((ReportDataSource) ds);
435             }
436         }
437
438         /*
439          * get query
440          */

441         if (bean.getQuery() != null) {
442             Query query = process( bean.getQuery(), NOT_TOP_LEVEL_OBJECT);
443             if (bean.getQuery().getIsUriReference()) {
444                 unit.setQuery(new ResourceReference(query.getURIString()));
445             } else {
446                 unit.setQuery(new ResourceReference(query));
447             }
448         }
449         
450         /*
451          * get main report jrxml
452          */

453         if (bean.getMainReport() != null) {
454
455             FileResource repRes = process( (FileResourceBean) bean.getMainReport(), NOT_TOP_LEVEL_OBJECT);
456             
457             if (bean.getMainReport().getIsUriReference()) {
458                 
459                 unit.setMainReportReference(repRes.getURIString());
460                 
461             } else {
462                 unit.setMainReport(repRes);
463             }
464         }
465         
466         /*
467          * get InputControls
468          */

469         if (bean.getInputControls() != null) {
470             
471             InputControlBean[] icArray = bean.getInputControls();
472             
473             for (int i = 0; i < icArray.length; i++) {
474                 
475                 InputControl ic = process( (InputControlBean) icArray[i], NOT_TOP_LEVEL_OBJECT);
476                 
477                 if (icArray[i].getIsUriReference()) {
478                     
479                     unit.addInputControlReference(ic.getURIString());
480                     
481                 } else {
482                     unit.addInputControl(ic);
483                 }
484             }
485         }
486         
487         /*
488          * get resources (ie FileResources)
489          */

490         FileResourceBean[] frArray = bean.getResources();
491         
492         if (frArray != null) {
493             for (int j = 0; j < frArray.length; j++) {
494
495                 FileResource res = (FileResource) repo.newResource(context,
496                         FileResource.class);
497
498                 if (frArray[j].getIsReference()) {
499
500                     handleFileResourceRef(res, frArray[j]);
501
502                 } else { // not a reference (not a link)
503

504                     fillData(res, frArray[j]);
505                 }
506                 unit.addResource(res);
507             }
508         }
509         
510         if (isTopLevel) {
511             
512             buildParentFolder(unit, bean);
513             
514             handleSaveResource(unit);
515         }
516         return unit;
517     }
518     
519
520     public OlapUnit process(OlapUnitBean bean, boolean isTopLevel) {
521         log.debug("top of process(OlapUnit)");
522         
523         OlapUnit unit = (OlapUnit) repo.newResource(context, OlapUnit.class);
524         
525         fillData(unit, bean);
526         
527         /*
528          * get OlapClientConnection
529          */

530         
531         if (bean.getOlapClientConnection() != null) {
532             
533             OlapClientConnection oc = process( bean.getOlapClientConnection(), NOT_TOP_LEVEL_OBJECT);
534                         
535             if (bean.getOlapClientConnection().getIsUriReference()) {
536                 
537                 unit.setOlapClientConnectionReference(oc.getURIString());
538                 
539             } else {
540                 unit.setOlapClientConnection(oc);
541             }
542         }
543         
544         if (isTopLevel) {
545             
546             buildParentFolder(unit, bean);
547             
548             handleSaveResource(unit);
549         }
550         return unit;
551     }
552     
553     
554     /*
555      * This works for FileResources. Also, the FileResource that is the
556      * mainReport contained by a ReportUnit is a special case. There is
557      * logic in this module to handle that special case (isUriReference)
558      */

559     public FileResource process(FileResourceBean bean, boolean isTopLevel) {
560         log.debug("top of process(FileResouceBean)");
561
562         FileResource res = (FileResource) repo.newResource(context, FileResource.class);
563         
564         fillData(res, bean);
565             
566         if (isTopLevel || bean.getIsUriReference()) {
567             
568             buildParentFolder(res, bean);
569
570             handleSaveResource(res);
571         }
572         return res;
573     }
574
575     public ContentResource process(ContentResourceBean bean, boolean isTopLevel) {
576         log.debug("top of process(ContentResourceBean)");
577
578         ContentResource res = (ContentResource) repo.newResource(context, ContentResource.class);
579         
580         fillData(res, bean);
581             
582         /*
583          * handle child ContentResources
584          */

585         
586         if (bean.getResources() != null) {
587             
588             ContentResourceBean[] childResources = bean.getResources();
589             
590             for (int i =0; i < childResources.length; i++) {
591                 
592                 ContentResource childRes = process( childResources[i], NOT_TOP_LEVEL_OBJECT);
593                 
594                 res.addChildResource(childRes);
595             }
596         }
597         
598         if (isTopLevel || bean.getIsUriReference()) {
599             
600             buildParentFolder(res, bean);
601
602             handleSaveResource(res);
603         }
604         return res;
605     }
606     
607
608     public DataSource process(DataSourceBean bean, boolean isTopLevel) {
609         log.debug("top of process(DataSourceBean)");
610         
611         ReportDataSource ds = null;
612
613         if (repo.getResource(null, prependPath + bean.getUriString()) == null) {
614
615             if (bean.getDataSourceType().equals(DataSourceBean.DS_TYPE_JDBC)) {
616                 
617                 ds = (JdbcReportDataSource) repo.newResource(null, JdbcReportDataSource.class);
618                 
619                 fillData( (JdbcDataSourceBean) bean, (JdbcReportDataSource) ds);
620                     
621             } else if (bean.getDataSourceType().equals(DataSourceBean.DS_TYPE_JNDI_JDBC)) {
622                 
623                 ds = (JndiJdbcReportDataSource) repo.newResource(null, JndiJdbcReportDataSource.class);
624                 
625                 fillData( (JndiJdbcDataSourceBean) bean, (JndiJdbcReportDataSource) ds);
626                     
627             } else {
628                 log.error("ERROR: unknown data source type, datasource=" + prependPath + bean.getUriString());
629             }
630             
631             if (isTopLevel || bean.getIsUriReference()) {
632     
633                 buildParentFolder(ds, bean);
634
635                 handleSaveResource(ds);
636             }
637
638         } else {
639             log.warn("WARN: ReportDataSource already exists, skipping creation, using existing, uri=" +
640                     prependPath + bean.getUriString());
641             
642             ds = (ReportDataSource) repo.getResource(context, prependPath + bean.getUriString());
643         }
644         
645         return ds;
646     }
647
648     public OlapClientConnection process(OlapClientConnectionBean bean, boolean isTopLevel) {
649         log.debug("top of process(OlapClientConnectionBean)");
650         
651         OlapClientConnection oc = null;
652         
653         if (repo.getResource(context, prependPath + bean.getUriString()) == null) {
654         
655             if (bean.getConnectionType().equals(OlapClientConnectionBean.CONN_TYPE_MONDRIAN)) {
656                 
657                 oc = process( (MondrianConnectionBean) bean, NOT_TOP_LEVEL_OBJECT);
658                 
659             } else if (bean.getConnectionType().equals(OlapClientConnectionBean.CONN_TYPE_XMLA)) {
660
661                 oc = (XMLAConnection) repo.newResource(null, XMLAConnection.class);
662                 
663                 fillData( (XMLAConnection) oc, (XmlaConnectionBean) bean);
664                 
665             } else {
666                 log.error("ERROR: unknown data source type, datasource=" + prependPath + bean.getUriString());
667             }
668             
669             if (isTopLevel || bean.getIsUriReference()) {
670                 
671                 buildParentFolder(oc, bean);
672                 
673                 handleSaveResource(oc);
674             }
675
676         } else {
677             log.warn("WARN: OlapClientConnection already exists, skipping creation, using existing, uri=" +
678                     prependPath + bean.getUriString());
679             
680             oc = (OlapClientConnection) repo.getResource(context, prependPath + bean.getUriString());
681         }
682                 
683         return oc;
684     }
685     
686     public MondrianXMLADefinition process(MondrianXmlaDefinitionBean bean, boolean isTopLevel) {
687         log.debug("top of process(MondrianXmlaDefinitionBean)");
688
689         MondrianXMLADefinition xDef = (MondrianXMLADefinition) repo.newResource(context, MondrianXMLADefinition.class);
690         
691         fillData(xDef, bean);
692         
693         /*
694          * get mondrian connection
695          */

696         
697         if (bean.getMondrianConnection() != null) {
698             
699             MondrianConnection mc = process(bean.getMondrianConnection(), NOT_TOP_LEVEL_OBJECT);
700             
701             if (bean.getMondrianConnection().getIsUriReference()) {
702                 
703                 xDef.setMondrianConnectionReference(mc.getURIString());
704                 
705             } else {
706                 xDef.setMondrianConnection(mc);
707             }
708         }
709         
710         if (isTopLevel || bean.getIsUriReference()) {
711             
712             buildParentFolder(xDef, bean);
713             
714             handleSaveResource(xDef);
715         }
716         return xDef;
717     }
718     
719     
720     public MondrianConnection process(MondrianConnectionBean bean, boolean isTopLevel) {
721         log.debug("top of process(MondrianConnectionBean)");
722         
723         MondrianConnection conn = (MondrianConnection) repo.newResource(context, MondrianConnection.class);
724         
725         fillData(conn, bean);
726
727         /*
728          * get schema
729          */

730         if (bean.getSchema() != null) {
731             
732             FileResource schema = process(bean.getSchema(), NOT_TOP_LEVEL_OBJECT); // FileResource
733

734             if (bean.getSchema().getIsUriReference()) {
735         
736                 conn.setSchemaReference(schema.getURIString());
737             } else {
738                 conn.setSchema(schema);
739             }
740         }
741         
742         /*
743          * get dataSource
744          */

745         if (bean.getDataSource() != null) {
746             
747             DataSource ds = process( bean.getDataSource(), NOT_TOP_LEVEL_OBJECT);
748             
749             if (bean.getDataSource().getIsUriReference()) {
750                 
751                 conn.setDataSourceReference(ds.getURIString());
752                 
753             } else {
754                 
755                 conn.setDataSource((ReportDataSource) ds);
756             }
757         }
758         
759         if (isTopLevel || bean.getIsUriReference()) {
760             
761             buildParentFolder(conn, bean);
762             
763             handleSaveResource(conn);
764         }
765         return conn;
766     }
767     
768     public InputControl process(InputControlBean bean, boolean isTopLevel) {
769         log.debug("top of process(InputControlBean)");
770         
771         InputControl ic = (InputControl) repo.newResource(context, InputControl.class);
772
773         fillData(bean, ic);
774             
775         /*
776          * get dataType
777          */

778         
779         if (bean.getDataType() != null) {
780             
781             DataType dt = process(bean.getDataType(), NOT_TOP_LEVEL_OBJECT);
782     
783             if (bean.getDataType().getIsUriReference()) {
784                 
785                 ic.setDataTypeReference(dt.getURIString());
786                 
787             } else {
788                 ic.setDataType(dt);
789             }
790         }
791         
792         /*
793          * get listOfValues
794          */

795         
796         if (bean.getListOfValues() != null) {
797         
798             ListOfValues lov = process(bean.getListOfValues(), NOT_TOP_LEVEL_OBJECT);
799             
800             if (bean.getListOfValues().getIsUriReference()) {
801                 
802                 ic.setListOfValuesReference(lov.getURIString());
803                 
804             } else {
805                 ic.setListOfValues(lov);
806             }
807         }
808         
809         /*
810          * get query
811          */

812         
813         if (bean.getQuery() != null) {
814         
815             Query query = process(bean.getQuery(), NOT_TOP_LEVEL_OBJECT);
816             
817             if (bean.getQuery().getIsUriReference()) {
818                 
819                 ic.setQueryReference(query.getURIString());
820                 
821             } else {
822                 ic.setQuery(query);
823             }
824         }
825         
826         if (isTopLevel || bean.getIsUriReference()) {
827             
828             buildParentFolder(ic, bean);
829             
830             handleSaveResource(ic);
831         }
832         return ic;
833     }
834     
835     public DataType process(DataTypeBean bean, boolean isTopLevel) {
836         log.debug("top of process(DataTypeBean)");
837
838         DataType dt = (DataType) repo.newResource(context, DataType.class);
839                 
840         fillData(bean, dt);
841         
842         if (isTopLevel || bean.getIsUriReference()) {
843             
844             buildParentFolder(dt, bean);
845
846             handleSaveResource(dt);
847         }
848         return dt;
849     }
850     
851     public ListOfValues process(ListOfValuesBean bean, boolean isTopLevel) {
852         log.debug("top of process(ListOfValuesBean)");
853         
854         ListOfValues lov = null;
855         
856         if (isTopLevel) {
857             lov = (ListOfValues) repo.newResource(context, ListOfValues.class);
858         } else {
859             lov = new ListOfValuesImpl();
860         }
861         
862         fillData(bean, lov);
863         
864         if (isTopLevel || bean.getIsUriReference()) {
865             
866             buildParentFolder(lov, bean);
867
868             handleSaveResource(lov);
869         }
870         return lov;
871     }
872     
873     public Query process(QueryBean bean, boolean isTopLevel) {
874         log.debug("top of process(QueryBean)");
875         
876         Query query = null;
877         
878         if (isTopLevel) {
879             query = (Query) repo.newResource(context, Query.class);
880         } else {
881             query = new QueryImpl();
882         }
883         
884         fillData(bean, query);
885
886         /*
887          * get datasource
888          */

889         if (bean.getDataSource() != null) {
890             DataSource ds = process( bean.getDataSource(), NOT_TOP_LEVEL_OBJECT);
891             if (bean.getDataSource().getIsUriReference()) {
892                 query.setDataSourceReference(ds.getURIString());
893             } else {
894                 query.setDataSource((ReportDataSource) ds);
895             }
896         }
897
898         if (isTopLevel || bean.getIsUriReference()) {
899             
900             buildParentFolder(query, bean);
901
902             handleSaveResource(query);
903         }
904         return query;
905     }
906     
907
908     public void process(UserRoleHolderBean bean, boolean isTopLevel) {
909         log.debug("top of process(UsersRoleHolderBean)");
910                 
911         Map JavaDoc allRolesMap = null;
912         
913         /*
914          * Create Roles.
915          */

916         if (bean.getRoles() != null) {
917         
918             createRoles(bean.getRoles());
919         }
920         
921         /*
922          * create Users
923          */

924         if (bean.getUsers() != null) {
925
926             allRolesMap = getAllRoles();
927             log.debug(" ### allRolesMap.size=" + allRolesMap.size());
928             
929             UserBean[] userBeans = bean.getUsers();
930             
931             for (int i = 0; i < userBeans.length; i++) {
932                 
933                 if (auth.getUser(context, userBeans[i].getUsername()) == null) {
934                 
935                     User user = auth.newUser(null);
936                     user.setUsername(userBeans[i].getUsername());
937                     user.setPassword(userBeans[i].getPassword());
938                     user.setFullName(userBeans[i].getFullName());
939                     user.setEnabled(userBeans[i].getEnabled());
940                     user.setExternallyDefined(userBeans[i].getExternallyDefined());
941                 
942                     RoleBean[] roleBeans = userBeans[i].getRoleSet();
943                     
944                     /*
945                      * add Roles to User
946                      */

947                     for (int j = 0; j < roleBeans.length; j++) {
948                     
949                         if (allRolesMap.containsKey(roleBeans[j].getRoleName())) {
950                             
951                             user.addRole( (Role) allRolesMap.get(roleBeans[j].getRoleName()));
952
953                         } else {
954                             log.error("ERROR: no role matching role held by user" +
955                                     ", username=" + userBeans[i].getUsername() + ", rolename="
956                                     + roleBeans[j].getRoleName());
957                         }
958                     }
959                     
960                     auth.putUser(context, user); // create user
961

962                 } else {
963                     log.warn("WARN: user already exists, skipping, username=" +
964                             userBeans[i].getUsername());
965                 }
966             }
967         }
968     }
969
970
971     public ReportJob process(ReportJobBean bean, boolean isTopLevel) {
972         
973         ReportJob job = new ReportJob();
974         
975         job.setId(bean.getId());
976         //job.setVersion(bean.getVersion());
977
job.setLabel(bean.getLabel());
978         job.setDescription(bean.getDescription());
979         job.setBaseOutputFilename(bean.getBaseOutputFilename());
980         
981         // following need proper processing
982
if (bean.getTrigger() != null) {
983             
984             try {
985                 DateFormat JavaDoc dateFormat = new SimpleDateFormat JavaDoc("yyyy-MM-dd HH:mm:ss.S");
986                 
987                 ReportJobTriggerBean tb = bean.getTrigger();
988                 ReportJobTrigger trig = new ReportJobSimpleTrigger();
989                 
990                 trig.setId(tb.getId());
991                 //trig.setVersion(tb.getVersion());
992
trig.setStartType(tb.getStartType());
993                 
994                 //log.debug(" startDate=" + tb.getStartDate());
995
if (tb.getStartDate() != null) {
996                     Date JavaDoc startDate = dateFormat.parse(tb.getStartDate());
997                     trig.setStartDate(startDate);
998                 }
999                 
1000                if (tb.getEndDate() != null) {
1001                    Date JavaDoc endDate = dateFormat.parse(tb.getEndDate());
1002                    trig.setEndDate(endDate);
1003                }
1004                job.setTrigger(trig);
1005                
1006            } catch (Exception JavaDoc e) {
1007                log.error("ERROR: parsing a date, exception=" + e.getMessage());
1008                e.printStackTrace();
1009                failed = true;
1010            }
1011        }
1012        
1013        if (bean.getSource() != null) {
1014            ReportJobSourceBean sb = bean.getSource();
1015            ReportJobSource src = new ReportJobSource();
1016            
1017            src.setReportUnitURI(sb.getReportUnitURI());
1018            
1019            Map JavaDoc params = new HashMap JavaDoc();
1020            if (sb.getParameters() != null) {
1021                
1022                ParameterBean[] pBeans = sb.getParameters();
1023                for (int i = 0; i < pBeans.length; i++) {
1024                    
1025                    params.put(pBeans[i].getKey(), pBeans[i].getValue());
1026                }
1027                src.setParametersMap(params);
1028            }
1029            job.setSource(src);
1030        }
1031        
1032
1033        if (bean.getOutputFormats() != null) {
1034            
1035            byte[] formats = bean.getOutputFormats();
1036            
1037            for (int i = 0; i < formats.length; i++) {
1038                
1039                job.addOutputFormat(formats[i]);
1040            }
1041        }
1042        
1043        if (bean.getContentRepositoryDestination() != null) {
1044            ReportJobRepositoryDestinationBean rd = bean.getContentRepositoryDestination();
1045            ReportJobRepositoryDestination dest = new ReportJobRepositoryDestination();
1046            
1047            dest.setId(rd.getId());
1048            //dest.setVersion(rd.getVersion());
1049
dest.setFolderURI(rd.getFolderURI());
1050            dest.setSequentialFilenames(rd.isSequentialFilenames());
1051            dest.setOverwriteFiles(rd.isOverwriteFiles());
1052            
1053            job.setContentRepositoryDestination(dest);
1054        }
1055        
1056        if (bean.getMailNotification() != null) {
1057            ReportJobMailNotificationBean nBean = new ReportJobMailNotificationBean();
1058            ReportJobMailNotification note = new ReportJobMailNotification();
1059            
1060            note.setId(nBean.getId());
1061            //note.setVersion(nBean.getVersion());
1062

1063            if (nBean.getToAddresses() != null) {
1064                
1065                String JavaDoc[] toAddrs = new String JavaDoc[nBean.getToAddresses().length];
1066                for (int i = 0; i < toAddrs.length; i++) {
1067                    note.addTo(toAddrs[i]);
1068                }
1069            }
1070            
1071            if (nBean.getCcAddresses() != null) {
1072            
1073                String JavaDoc[] ccAddrs = new String JavaDoc[nBean.getBccAddresses().length];
1074                for (int i = 0; i < nBean.getCcAddresses().length; i++) {
1075                    note.addCc(ccAddrs[i]);
1076                }
1077            }
1078            
1079            if (nBean.getBccAddresses() != null) {
1080                
1081                String JavaDoc[] bccAddrs = new String JavaDoc[nBean.getBccAddresses().length];
1082                for (int i = 0; i < nBean.getBccAddresses().length; i++) {
1083                    note.addBcc(bccAddrs[i]);
1084                }
1085            }
1086            if (nBean.getSubject() != null) {
1087                note.setSubject(nBean.getSubject());
1088            } else {
1089                note.setSubject("subject"); // can't be null
1090
}
1091            if (nBean.getMessageText() != null) {
1092                note.setMessageText(nBean.getMessageText());
1093            } else {
1094                note.setMessageText("message text");
1095            }
1096            note.setResultSendType(nBean.getResultSendType());
1097            
1098            job.setMailNotification(note);
1099        }
1100        
1101        mSched.saveJob(context, job);
1102        
1103        return job;
1104    }
1105    
1106    
1107    /*
1108     * Read passed in RoleBeans and create each role in the system.
1109     * If role exists, skip it (ie. don't overwrite).
1110     *
1111     */

1112    protected void createRoles(RoleBean[] roleBeans) {
1113        
1114        for (int i = 0; i < roleBeans.length; i++) {
1115
1116            Role role = null;
1117            
1118            if (auth.getRole(context, roleBeans[i].getRoleName()) == null) {
1119            
1120                role = auth.newRole(context);
1121                role.setRoleName(roleBeans[i].getRoleName());
1122                role.setExternallyDefined(roleBeans[i].getExternallyDefined());
1123                auth.putRole(context, role);
1124            } else {
1125                log.debug("role already exists, not creating, rolename=" + roleBeans[i].getRoleName());
1126            }
1127        }
1128    }
1129    
1130    /*
1131     * Return all roles in the system as a HashMap.
1132     */

1133    protected Map JavaDoc getAllRoles() {
1134        
1135        HashMap JavaDoc roleMap = new HashMap JavaDoc();
1136        
1137        List JavaDoc roleList = auth.getRoles(context, new FilterCriteria());
1138
1139        for (Iterator JavaDoc it = roleList.iterator(); it.hasNext(); ) {
1140            
1141            Role role = (Role) it.next();
1142            
1143            roleMap.put(role.getRoleName(), role);
1144        }
1145        return roleMap;
1146    }
1147    
1148    
1149    /*
1150     * Create the target FileResource and save it. Then fill the data for
1151     * the link FileResource (that links to the target).
1152     */

1153    protected void handleFileResourceRef(FileResource res, FileResourceBean bean) {
1154        
1155        /*
1156         * make target resource, load it's data, and save
1157         */

1158        FileResource targetRes = (FileResource) repo.newResource(context, FileResource.class);
1159        FileResourceBean targetBean = (FileResourceBean) bean.getLinkTarget();
1160
1161        fillDataForRef(targetRes, targetBean);
1162        
1163        handleSaveResource(targetRes);
1164        
1165        /*
1166         * fill the link resource
1167         */

1168        fillCommonData(res, bean);
1169        
1170        res.setReferenceURI(bean.getReferenceUri());
1171    }
1172    
1173    /*
1174     * Save a Resource. Skip save if resource already exists.
1175     */

1176    protected void handleSaveResource(Resource res) {
1177        
1178        if (repo.getResource(context, res.getURIString()) == null) {
1179        
1180            repo.saveResource(context, res);
1181        
1182        } else {
1183            log.info("target resource already exists, leaving unchanged, uri=" + res.getURIString());
1184        }
1185    }
1186    
1187
1188    /*
1189     * Save a Folder. Skip save if folder already exists.
1190     */

1191    protected void handleSaveFolder(Folder folder) {
1192
1193        if (repo.getFolder(context, folder.getURIString()) == null) {
1194        
1195            repo.saveFolder(context, folder);
1196            
1197        } else {
1198            log.info("folder already exists, leaving unchanged, uri=" + folder.getURIString());
1199        }
1200    }
1201    
1202    protected void fillCommonData(Resource res, ResourceBean bean) {
1203        
1204        res.setName(bean.getName());
1205        res.setLabel(bean.getLabel());
1206        res.setDescription(bean.getDescription());
1207    }
1208    
1209    
1210    protected void fillData(Folder folder, FolderBean bean) {
1211        
1212        fillCommonData(folder, bean);
1213    }
1214    
1215    
1216    protected void fillData(ReportUnitBean bean, ReportUnit unit) {
1217
1218        fillCommonData(unit, bean);
1219    }
1220    
1221    protected void fillData(OlapUnit unit, OlapUnitBean bean) {
1222
1223        fillCommonData(unit, bean);
1224
1225        unit.setMdxQuery(bean.getMdxQuery());
1226    }
1227    
1228    protected void fillData(JdbcDataSourceBean bean, JdbcReportDataSource ds) {
1229        
1230        fillCommonData(ds, bean);
1231        
1232        ds.setDriverClass(bean.getDriverClass());
1233        ds.setConnectionUrl(bean.getConnectionUrl());
1234        ds.setUsername(bean.getUsername());
1235        ds.setPassword(bean.getPassword());
1236    }
1237    
1238    protected void fillData(JndiJdbcDataSourceBean bean, JndiJdbcReportDataSource ds) {
1239        
1240        fillCommonData(ds, bean);
1241        
1242        ds.setJndiName(bean.getJndiName());
1243    }
1244    
1245    protected void fillData(MondrianConnection conn, MondrianConnectionBean bean) {
1246        
1247        fillCommonData(conn, bean);
1248    }
1249    
1250    protected void fillData(XMLAConnection conn, XmlaConnectionBean bean) {
1251        
1252        fillCommonData(conn, bean);
1253        
1254        conn.setURI(bean.getUri());
1255        conn.setDataSource(bean.getDataSource());
1256        conn.setCatalog(bean.getCatalog());
1257        conn.setUsername(bean.getUsername());
1258        conn.setPassword(bean.getPassword());
1259    }
1260        
1261    protected void fillData(MondrianXMLADefinition mx, MondrianXmlaDefinitionBean bean) {
1262        
1263        fillCommonData(mx, bean);
1264        
1265        mx.setCatalog(bean.getCatalog());
1266    }
1267    
1268    protected void fillData(FileResource fr, FileResourceBean bean) {
1269
1270        fillCommonData(fr, bean);
1271        
1272        fr.setFileType(bean.getFileType());
1273        
1274        /*
1275         * load fileResource data. Full path includes catalog folder
1276         */

1277        String JavaDoc fullPath = catalogPath + bean.getParentFolder() + PATH_SEP + bean.getName();
1278
1279        fr.readData( getBinaryData(fullPath) );
1280    }
1281    
1282    protected void fillData(ContentResource res, ContentResourceBean bean) {
1283
1284        fillCommonData(res, bean);
1285        
1286        res.setFileType(bean.getFileType());
1287        
1288        /*
1289         * load ContentResource data. Full path includes catalog folder
1290         */

1291        String JavaDoc fullPath = catalogPath + bean.getParentFolder() + PATH_SEP + bean.getName();
1292
1293        res.readData( getBinaryData(fullPath) );
1294    }
1295    
1296    protected void fillDataForRef(FileResource targetRes, FileResourceBean targetBean) {
1297        
1298        fillCommonData(targetRes, targetBean);
1299
1300        targetRes.setFileType(targetBean.getFileType());
1301        
1302        buildRepoFolderPath(context, prependPath + targetBean.getParentFolder());
1303        targetRes.setParentFolder(prependPath + targetBean.getParentFolder());
1304        
1305        String JavaDoc fullPath =
1306            catalogPath + targetBean.getParentFolder() + PATH_SEP + targetBean.getName();
1307        
1308        targetRes.readData( getBinaryData(fullPath) );
1309    }
1310    
1311
1312    protected void fillData(DataTypeBean bean, DataType dt) {
1313        
1314        fillCommonData(dt, bean);
1315        
1316        dt.setType(bean.getType());
1317        dt.setMaxLength(bean.getMaxLength());
1318        dt.setDecimals(bean.getDecimals());
1319        dt.setRegularExpr(bean.getRegularExpr());
1320        dt.setMinValue(bean.getMinValue());
1321        dt.setMaxValue(bean.getMaxValue());
1322        dt.setStrictMin(bean.getIsStrictMin());
1323        dt.setStrictMax(bean.getIsStrictMax());
1324    }
1325    
1326    protected void fillData(ListOfValuesBean bean, ListOfValues lov) {
1327        
1328        fillCommonData(lov, bean);
1329
1330        if (bean.getValues() != null) {
1331            
1332            ListOfValuesItemBean[] items = bean.getValues();
1333            
1334            for (int i = 0; i < items.length; i++) {
1335                
1336                ListOfValuesItem lovi = new ListOfValuesItemImpl(); // no setter so must loop through
1337
lovi.setLabel(items[i].getLabel());
1338                lovi.setValue(items[i].getValue());
1339                lov.addValue(lovi);
1340            }
1341        }
1342    }
1343    
1344    protected void fillData(QueryBean bean, Query query) {
1345
1346        fillCommonData(query, bean);
1347
1348        String JavaDoc queryLanguage = bean.getLanguage();
1349        if (queryLanguage == null) {//FIXME handle backward compat differently?
1350
queryLanguage = QueryBean.DEFAULT_LANGUAGE;
1351        }
1352        query.setLanguage(queryLanguage);
1353        query.setSql(bean.getSql());
1354    }
1355    
1356    protected void fillData(InputControlBean bean, InputControl ic) {
1357        
1358        fillCommonData(ic, bean);
1359        
1360        ic.setType(bean.getType());
1361        ic.setMandatory(bean.getIsMandatory());
1362        ic.setReadOnly(bean.getIsReadOnly());
1363        
1364        if (bean.getQueryVisibleColumns() != null) {
1365            String JavaDoc[] visCols = bean.getQueryVisibleColumns();
1366            
1367            for (int i = 0; i < visCols.length; i++) { // there is no setter must loop through
1368
ic.addQueryVisibleColumn(visCols[i]);
1369            }
1370        }
1371        
1372        ic.setQueryValueColumn(bean.getQueryValueColumn());
1373        ic.setDefaultValue(bean.getDefaultValue());
1374        
1375        if (bean.getDefaultValues() != null) { // convert from array to List
1376

1377            List JavaDoc defValsList = new ArrayList JavaDoc();
1378            String JavaDoc[] defVals = bean.getDefaultValues();
1379            
1380            for (int i = 0; i < defVals.length; i++) {
1381                defValsList.add(defVals[i]);
1382            }
1383            ic.setDefaultValues(defValsList);
1384        }
1385    }
1386    
1387    protected FileInputStream JavaDoc getBinaryData(String JavaDoc fullPath) {
1388
1389        FileInputStream JavaDoc input = null;
1390        
1391        try {
1392            input = new FileInputStream JavaDoc(fullPath);
1393            
1394            log.debug("file=" + fullPath + ", fileInputStream.available()=" + input.available());
1395            
1396        } catch (Exception JavaDoc e) {
1397            log.error("ERROR: caught exception opening file, file="
1398                    + fullPath + ", e=" + e.getMessage());
1399            e.printStackTrace();
1400            failed = true;
1401        }
1402        return input;
1403    }
1404    
1405
1406    protected void loadCatalogFile() {
1407        
1408        try {
1409            this.reader = new FileReader JavaDoc(new File JavaDoc(catalogPath, catalogFileName));
1410            
1411        } catch (Exception JavaDoc e) {
1412            log.error("ERROR: problem opening catalog file, e: " + e.getMessage());
1413            e.printStackTrace();
1414            failed = true;
1415        }
1416    }
1417    
1418    
1419    protected void buildParentFolder(Resource res, ResourceBean bean) {
1420        
1421        /*
1422         * Check for case of root folder
1423         */

1424        
1425        if (bean.getUriString().equals("/") && bean.getParentFolder() == null) {
1426            
1427            if (prependPath == null || prependPath.equals("")) { // if no prependPath
1428

1429                buildRepoFolderPath(context, bean.getUriString()); // parentFolder null for root folder
1430

1431            } else {
1432                
1433                res.setName(prependPathNoSlash); // ie "myNewDir"
1434
res.setParentFolder("/");
1435            }
1436            
1437        } else {
1438        
1439            /*
1440             * account for a parent folder of "/". If you prepend a dir name
1441             * to a parent folder of "/" you would end up with "/myNewDir/"
1442             * which is invalid.
1443             */

1444
1445            if (bean.getParentFolder().equals("/") && usePrependPath) {
1446                
1447                buildRepoFolderPath(context, prependPath); // ie "/myNewDir"
1448
res.setParentFolder(prependPath);
1449                
1450            } else {
1451                
1452                buildRepoFolderPath(context, prependPath + bean.getParentFolder()); // ie "/myNewDir" + "/images"
1453
res.setParentFolder(prependPath + bean.getParentFolder());
1454            }
1455        }
1456    }
1457    
1458    
1459    /*
1460     * Ensure that a "prepend" uri has a slash "/"
1461     * at the beginning.
1462     */

1463    protected String JavaDoc setPrependPath(String JavaDoc inPath) {
1464        
1465        if (inPath.indexOf('/') != 0) {
1466            return PATH_SEP + inPath;
1467        } else {
1468            return inPath;
1469        }
1470    }
1471    
1472
1473    /*
1474     * Return a String that does not have a slash at the
1475     * beginning. In: "/myNewDir" out: "myNewDir"
1476     */

1477    protected String JavaDoc setPrependPathNoSlash(String JavaDoc inPath) {
1478        
1479        if (inPath.indexOf('/') != 0) {
1480            return inPath;
1481        } else {
1482            return inPath.substring(1);
1483        }
1484    }
1485    
1486    
1487    /*
1488     * todo: make this logic part of repository api
1489     * Build the the uri folder structure that a resource needs in order
1490     * to be able to save it.
1491     *
1492     * Each resource has a parent folder path associated with it. Each folder
1493     * referenced in the parent folder uri path must exist or be created
1494     * in the repository before the resource can be saved.
1495     *
1496     */

1497    private Folder buildRepoFolderPath(ExecutionContext context, String JavaDoc path) {
1498        
1499        //System.out.println("buildRepoFolderPath: build path=" + path);
1500
log.debug("buildRepoFolderPath: build path=" + path);
1501        
1502        // travel down the elements of the path
1503
String JavaDoc[] splitPath = path.split(Folder.SEPARATOR);
1504        String JavaDoc folderName = ""; // start with root
1505
Folder parentFolder = null; // root's parent is null
1506
Folder folder = repo.getFolder(context, folderName);
1507        
1508        for (int i = 0; i < splitPath.length; i++) {
1509            //log.debug("Current path element is, name=" + splitPath[i]);
1510
if ("".equals(splitPath[i])) {
1511                //log.debug("Skipping this element, name=" + splitPath[i]);
1512
continue; // ignore extra slashes
1513
}
1514            
1515            folderName += ("/" + splitPath[i]);
1516            parentFolder = folder; // remember parent
1517
folder = repo.getFolder(context, folderName);
1518            if (folder == null) {
1519                folder = new FolderImpl();
1520                folder.setName(splitPath[i]);
1521                folder.setLabel(splitPath[i]);
1522                folder.setDescription(splitPath[i] + " folder");
1523                folder.setParentFolder(parentFolder);
1524                repo.saveFolder(context, folder);
1525            }
1526        }
1527        
1528        return folder;
1529    }
1530    
1531}
1532
Popular Tags