KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > opencms > workplace > CmsNewResourceExternallink


1 /*
2 * File : $Source: /usr/local/cvs/opencms/src-modules/com/opencms/workplace/CmsNewResourceExternallink.java,v $
3 * Date : $Date: 2005/06/27 23:22:07 $
4 * Version: $Revision: 1.5 $
5 *
6 * This library is part of OpenCms -
7 * the Open Source Content Mananagement System
8 *
9 * Copyright (C) 2001 The OpenCms Group
10 *
11 * This library is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU Lesser General Public
13 * License as published by the Free Software Foundation; either
14 * version 2.1 of the License, or (at your option) any later version.
15 *
16 * This library is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 * Lesser General Public License for more details.
20 *
21 * For further information about OpenCms, please see the
22 * OpenCms Website: http://www.opencms.org
23 *
24 * You should have received a copy of the GNU Lesser General Public
25 * License along with this library; if not, write to the Free Software
26 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
27 */

28
29 package com.opencms.workplace;
30
31 import org.opencms.file.CmsFile;
32 import org.opencms.file.CmsFolder;
33 import org.opencms.file.CmsObject;
34 import org.opencms.file.CmsPropertyDefinition;
35 import org.opencms.file.CmsResource;
36 import org.opencms.file.types.CmsResourceTypePointer;
37 import org.opencms.i18n.CmsEncoder;
38 import org.opencms.main.CmsException;
39 import org.opencms.workplace.CmsWorkplaceSettings;
40
41 import com.opencms.core.I_CmsSession;
42 import com.opencms.legacy.CmsLegacyException;
43 import com.opencms.legacy.CmsXmlTemplateLoader;
44 import com.opencms.template.A_CmsXmlContent;
45
46 import java.util.ArrayList JavaDoc;
47 import java.util.Collections JavaDoc;
48 import java.util.Hashtable JavaDoc;
49 import java.util.Iterator JavaDoc;
50 import java.util.List JavaDoc;
51 import java.util.Vector JavaDoc;
52
53 import javax.servlet.http.HttpServletRequest JavaDoc;
54 import javax.servlet.http.HttpSession JavaDoc;
55
56 /**
57  * Template class for displaying the new resource screen for a new link
58  * of the OpenCms workplace.<P>
59  * Reads template files of the content type <code>CmsXmlWpTemplateFile</code>.
60  *
61  * @author Michael Emmerich
62  * @version $Revision: 1.5 $ $Date: 2005/06/27 23:22:07 $
63  */

64
65 public class CmsNewResourceExternallink extends CmsWorkplaceDefault {
66     
67     private static final String JavaDoc C_PARA_KEEP_PROPERTIES = "keepproperties";
68     private static final String JavaDoc C_PARA_ADD_TO_NAV = "addtonav";
69     private static final int DEBUG = 0;
70
71     /**
72      * Overwrites the getContent method of the CmsWorkplaceDefault.<br>
73      * Gets the content of the new resource othertype template and processed the data input.
74      * @param cms The CmsObject.
75      * @param templateFile The lock template file
76      * @param elementName not used
77      * @param parameters Parameters of the request and the template.
78      * @param templateSelector Selector of the template tag to be displayed.
79      * @return Bytearry containing the processed data of the template.
80      * @throws Throws CmsException if something goes wrong.
81      */

82
83     public byte[] getContent(CmsObject cms, String JavaDoc templateFile, String JavaDoc elementName,
84             Hashtable JavaDoc parameters, String JavaDoc templateSelector) throws CmsException {
85
86         String JavaDoc error = "";
87         boolean checkurl = true;
88
89         String JavaDoc filename = null;
90         String JavaDoc targetName = null;
91         String JavaDoc foldername = null;
92         // String type = null;
93
I_CmsSession session = CmsXmlTemplateLoader.getSession(cms.getRequestContext(), true);
94
95         // get the document to display
96
CmsXmlWpTemplateFile xmlTemplateDocument = new CmsXmlWpTemplateFile(cms, templateFile);
97         CmsXmlLanguageFile lang = xmlTemplateDocument.getLanguageFile();
98
99         // clear session values on first load
100
String JavaDoc initial = (String JavaDoc)parameters.get(CmsWorkplaceDefault.C_PARA_INITIAL);
101         if(initial != null){
102             // remove all session values
103
session.removeValue(CmsWorkplaceDefault.C_PARA_RESOURCE);
104             session.removeValue(CmsWorkplaceDefault.C_PARA_LINK);
105             session.removeValue(CmsWorkplaceDefault.C_PARA_VIEWFILE);
106             session.removeValue(CmsWorkplaceDefault.C_PARA_NAVPOS);
107             session.removeValue(CmsWorkplaceDefault.C_PARA_NAVTEXT);
108             session.removeValue("lasturl");
109         }
110         // get the lasturl from parameters or from session
111
String JavaDoc lastUrl = getLastUrl(cms, parameters);
112         if(lastUrl != null){
113             session.putValue("lasturl", lastUrl);
114         }
115         // get the linkname and the linkurl
116
filename = CmsXmlTemplateLoader.getRequest(cms.getRequestContext()).getParameter(CmsWorkplaceDefault.C_PARA_RESOURCE);
117         if(filename != null) {
118             session.putValue(CmsWorkplaceDefault.C_PARA_RESOURCE, filename);
119         } else {
120             // try to get the value from the session, e.g. after an error
121
filename = (String JavaDoc)session.getValue(CmsWorkplaceDefault.C_PARA_RESOURCE)!=null?(String JavaDoc)session.getValue(CmsWorkplaceDefault.C_PARA_RESOURCE):"";
122         }
123         targetName = CmsXmlTemplateLoader.getRequest(cms.getRequestContext()).getParameter(CmsWorkplaceDefault.C_PARA_LINK);
124         if(targetName != null) {
125             session.putValue(CmsWorkplaceDefault.C_PARA_LINK, targetName);
126         } else {
127             // try to get the value from the session, e.g. after an error
128
targetName = (String JavaDoc)session.getValue(CmsWorkplaceDefault.C_PARA_LINK)!=null?(String JavaDoc)session.getValue(CmsWorkplaceDefault.C_PARA_LINK):"";
129         }
130         
131         // get the parameters
132
String JavaDoc navtitle = (String JavaDoc)parameters.get(CmsWorkplaceDefault.C_PARA_NAVTEXT);
133         if(navtitle != null) {
134             session.putValue(CmsWorkplaceDefault.C_PARA_NAVTEXT, navtitle);
135         } else {
136             // try to get the value from the session, e.g. after an error
137
navtitle = (String JavaDoc)session.getValue(CmsWorkplaceDefault.C_PARA_NAVTEXT)!=null?(String JavaDoc)session.getValue(CmsWorkplaceDefault.C_PARA_NAVTEXT):"";
138         }
139         
140         String JavaDoc navpos = (String JavaDoc)parameters.get(CmsWorkplaceDefault.C_PARA_NAVPOS);
141         if(navpos != null) {
142             session.putValue(CmsWorkplaceDefault.C_PARA_NAVPOS, navpos);
143         } else {
144             // try to get the value from the session, e.g. after an error
145
navpos = (String JavaDoc)session.getValue(CmsWorkplaceDefault.C_PARA_NAVPOS)!=null?(String JavaDoc)session.getValue(CmsWorkplaceDefault.C_PARA_NAVPOS):"";
146         }
147         
148         String JavaDoc dummy = (String JavaDoc)parameters.get(CmsNewResourceExternallink.C_PARA_KEEP_PROPERTIES);
149         if (DEBUG>0) System.out.println( "parameter " + CmsNewResourceExternallink.C_PARA_KEEP_PROPERTIES + ": " + dummy );
150         boolean keepTargetProperties = false;
151         if (dummy!=null) {
152             session.putValue(CmsNewResourceExternallink.C_PARA_KEEP_PROPERTIES, dummy);
153         }
154         else {
155             dummy = (String JavaDoc)session.getValue(CmsNewResourceExternallink.C_PARA_KEEP_PROPERTIES)!=null?(String JavaDoc)session.getValue(CmsNewResourceExternallink.C_PARA_KEEP_PROPERTIES):"true";
156         }
157         keepTargetProperties = dummy.trim().equalsIgnoreCase("true");
158         
159         dummy = (String JavaDoc)parameters.get(CmsNewResourceExternallink.C_PARA_ADD_TO_NAV);
160         if (DEBUG>0) System.out.println( "parameter " + CmsNewResourceExternallink.C_PARA_ADD_TO_NAV + ": " + dummy );
161         boolean addToNav = false;
162         if (dummy!=null) {
163             session.putValue(CmsNewResourceExternallink.C_PARA_ADD_TO_NAV, dummy);
164         }
165         else {
166             dummy = (String JavaDoc)session.getValue(CmsNewResourceExternallink.C_PARA_ADD_TO_NAV)!=null?(String JavaDoc)session.getValue(CmsNewResourceExternallink.C_PARA_ADD_TO_NAV):"false";
167         }
168         addToNav = dummy.trim().equalsIgnoreCase("true");
169         
170         String JavaDoc notChange = (String JavaDoc)parameters.get("newlink");
171         
172         CmsResource linkResource = null;
173         String JavaDoc step = CmsXmlTemplateLoader.getRequest(cms.getRequestContext()).getParameter("step");
174
175         // set the values e.g. after an error
176
xmlTemplateDocument.setData("LINKNAME", filename);
177         xmlTemplateDocument.setData("LINKVALUE", targetName);
178         xmlTemplateDocument.setData("NAVTITLE", CmsEncoder.escapeHtml(navtitle));
179         xmlTemplateDocument.setData("KEEPPROPERTIES", keepTargetProperties==true ? "true" : "false" );
180         xmlTemplateDocument.setData("ADDTONAV", addToNav==true ? "true" : "false" );
181
182         // if an existing link should be edited show the change page
183
if(notChange != null && notChange.equals("false") && step == null) {
184             try{
185                 CmsFile currentFile = cms.readFile(filename);
186                 String JavaDoc content = new String JavaDoc(currentFile.getContents());
187                 xmlTemplateDocument.setData("LINKNAME", currentFile.getName());
188                 xmlTemplateDocument.setData("LINK", cms.getSitePath(currentFile));
189                 xmlTemplateDocument.setData("LINKVALUE", content);
190                 templateSelector = "change";
191             } catch (CmsException e){
192                 error = e.getMessage();
193             }
194         }
195
196         // get the current phase of this wizard
197
if(step != null) {
198             // step 1 - show the final selection screen
199
if(step.equals("1") || step.equals("2")) {
200                 try{
201                     // step 1 - create the link with checking http-link
202
// step 2 - create the link without link check
203
// get folder- and filename
204
// foldername = (String)session.getValue(C_PARA_FILELIST);
205
foldername = CmsWorkplaceAction.getCurrentFolder(CmsXmlTemplateLoader.getRequest(cms.getRequestContext()).getOriginalRequest());
206
207                     if(foldername == null) {
208                         foldername = cms.getSitePath(cms.readFolder("/"));
209                     }
210
211                     String JavaDoc title = lang.getLanguageValue("explorer.linkto") + " " + targetName;
212                     // type = "link";
213
if(notChange != null && notChange.equals("false")) {
214             
215                         // change old file
216
CmsFile editFile = cms.readFile(filename);
217                         editFile.setContents(targetName.getBytes());
218
219                         if(step.equals("1")){
220                             // TODO: write some better link check which will not fail if there is
221
// no access to the internet
222
//if(!targetName.startsWith("/")){
223
// checkurl = CmsLinkCheck.checkUrl(targetName);
224
//}
225
}
226                         checkurl=true;
227                         if(checkurl){
228                             cms.writeFile(editFile);
229                             cms.writeProperty(filename, CmsPropertyDefinition.PROPERTY_TITLE, title);
230                         }
231                         linkResource = editFile;
232                     } else {
233                         // link URL is a file, so create the new file
234
List JavaDoc properties = null;
235                         if (title != null) {
236                             properties = new ArrayList JavaDoc();
237                             properties.add(new org.opencms.file.CmsProperty(CmsPropertyDefinition.PROPERTY_TITLE, title, null));
238                         } else {
239                             properties = Collections.EMPTY_LIST;
240                         }
241                         
242                         checkurl=true;
243                         
244                         if (checkurl ) {
245                             // TODO VFS links: creates an external HTTP link following the new linking paradigm
246
//linkResource = cms.createVfsLink(foldername + filename, targetName, targetProperties);
247
linkResource = cms.createResource(foldername + filename, CmsResourceTypePointer.getStaticTypeId());
248                         }
249                         
250                  
251                     }
252                     // now check if navigation informations have to be added to the new page.
253
if(addToNav && checkurl) {
254                         cms.writeProperty(cms.getSitePath(linkResource), CmsPropertyDefinition.PROPERTY_NAVTEXT, navtitle);
255                         // update the navposition.
256
if(navpos != null) {
257                             updateNavPos(cms, linkResource, navpos);
258                         }
259                     }
260
261                     // remove values from session
262
session.removeValue(CmsWorkplaceDefault.C_PARA_RESOURCE);
263                     session.removeValue(CmsWorkplaceDefault.C_PARA_VIEWFILE);
264                     session.removeValue(CmsWorkplaceDefault.C_PARA_LINK);
265                     session.removeValue(CmsWorkplaceDefault.C_PARA_NAVTEXT);
266                     session.removeValue(CmsWorkplaceDefault.C_PARA_NAVPOS);
267
268                     // now return to appropriate filelist
269
} catch (CmsException e){
270                     error = e.getMessage();
271                 }
272
273                 if(checkurl && ("".equals(error.trim()))){
274                     try {
275                         if(lastUrl != null) {
276                             CmsXmlTemplateLoader.getResponse(cms.getRequestContext()).sendRedirect(lastUrl);
277                         } else {
278                             CmsXmlTemplateLoader.getResponse(cms.getRequestContext()).sendCmsRedirect(getConfigFile(cms).getWorkplaceActionPath()
279                                     + CmsWorkplaceAction.getExplorerFileUri(CmsXmlTemplateLoader.getRequest(cms.getRequestContext()).getOriginalRequest()));
280                         }
281                     } catch(Exception JavaDoc e) {
282                         throw new CmsLegacyException("Redirect fails :" + getConfigFile(cms).getWorkplaceActionPath()
283                             + CmsWorkplaceAction.getExplorerFileUri(CmsXmlTemplateLoader.getRequest(cms.getRequestContext()).getOriginalRequest()), e);
284                     }
285                     return null;
286                 }
287             }
288         } else {
289             session.removeValue(CmsWorkplaceDefault.C_PARA_RESOURCE);
290             session.removeValue(CmsWorkplaceDefault.C_PARA_VIEWFILE);
291             session.removeValue(CmsWorkplaceDefault.C_PARA_LINK);
292             session.removeValue(CmsWorkplaceDefault.C_PARA_NAVTEXT);
293         }
294         // set lasturl
295
if(lastUrl == null) {
296             lastUrl = CmsWorkplaceAction.getExplorerFileUri(CmsXmlTemplateLoader.getRequest(cms.getRequestContext()).getOriginalRequest());
297         }
298         xmlTemplateDocument.setData("lasturl", lastUrl);
299         // set the templateselector if there was an error
300
if(!checkurl){
301             xmlTemplateDocument.setData("folder", foldername);
302             xmlTemplateDocument.setData("newlink", notChange);
303             session.putValue(CmsWorkplaceDefault.C_PARA_LINK, targetName);
304             session.putValue(CmsWorkplaceDefault.C_PARA_RESOURCE, filename);
305             session.putValue(CmsWorkplaceDefault.C_PARA_NAVTEXT, navtitle);
306             session.putValue(CmsWorkplaceDefault.C_PARA_NAVPOS, navpos);
307             templateSelector = "errorcheckurl";
308         }
309         if(!"".equals(error.trim())){
310             xmlTemplateDocument.setData("errordetails", error);
311             session.putValue(CmsWorkplaceDefault.C_PARA_LINK, targetName);
312             session.putValue(CmsWorkplaceDefault.C_PARA_RESOURCE, filename);
313             session.putValue(CmsWorkplaceDefault.C_PARA_NAVTEXT, navtitle);
314             session.putValue(CmsWorkplaceDefault.C_PARA_NAVPOS, navpos);
315             templateSelector = "error";
316         }
317         // process the selected template
318
return startProcessing(cms, xmlTemplateDocument, elementName, parameters, templateSelector);
319     }
320
321     /**
322      * Indicates if the results of this class are cacheable.
323      *
324      * @param cms CmsObject Object for accessing system resources
325      * @param templateFile Filename of the template file
326      * @param elementName Element name of this template in our parent template.
327      * @param parameters Hashtable with all template class parameters.
328      * @param templateSelector template section that should be processed.
329      * @return <EM>true</EM> if cacheable, <EM>false</EM> otherwise.
330      */

331
332     public boolean isCacheable(CmsObject cms, String JavaDoc templateFile, String JavaDoc elementName,
333             Hashtable JavaDoc parameters, String JavaDoc templateSelector) {
334         return false;
335     }
336     
337     /**
338      * Returns the current workplace path Uri
339      *
340      * @param cms CmsObject Object for accessing system resources.
341      * @param tagcontent Unused in this special case of a user method. Can be ignored.
342      * @param doc Reference to the A_CmsXmlContent object of the initiating XLM document.
343      * @param userObject Hashtable with parameters.
344      * @return String or byte[] with the content of this subelement.
345      * @throws CmsException if something goes wrong
346      */

347     public Object JavaDoc getCurrentPathUri(CmsObject cms, String JavaDoc tagcontent, A_CmsXmlContent doc, Object JavaDoc userObject) throws CmsException {
348         HttpSession JavaDoc session = ((HttpServletRequest JavaDoc)CmsXmlTemplateLoader.getRequest(cms.getRequestContext()).getOriginalRequest()).getSession();
349         CmsWorkplaceSettings settings = (CmsWorkplaceSettings)session.getAttribute("__CmsWorkplace.WORKPLACE_SETTINGS");
350         String JavaDoc path = settings.getExplorerResource();
351         if (path == null) {
352             path = "/";
353         }
354         if (path.indexOf("/") != -1) {
355             path = path.substring(0, path.lastIndexOf("/") + 1);
356         }
357         return path.getBytes();
358     }
359
360     /**
361      * Sets the value of the new file input field of dialog.
362      * This method is directly called by the content definiton.
363      * @param Cms The CmsObject.
364      * @param lang The language file.
365      * @param parameters User parameters.
366      * @return Value that is set into the new file dialod.
367      * @throws CmsExeption if something goes wrong.
368      */

369
370     public String JavaDoc setValue(CmsObject cms, CmsXmlLanguageFile lang, Hashtable JavaDoc parameters) throws CmsException {
371         I_CmsSession session = CmsXmlTemplateLoader.getSession(cms.getRequestContext(), true);
372
373         // get a previous value from the session
374
String JavaDoc filename = (String JavaDoc)session.getValue(CmsWorkplaceDefault.C_PARA_RESOURCE);
375         if(filename == null) {
376             filename = "";
377         }
378         return filename;
379     }
380
381     /**
382      * Gets the files displayed in the navigation select box.
383      * @param cms The CmsObject.
384      * @param lang The langauge definitions.
385      * @param names The names of the new rescources.
386      * @param values The links that are connected with each resource.
387      * @param parameters Hashtable of parameters (not used yet).
388      * @return The vectors names and values are filled with data for building the navigation.
389      * @throws Throws CmsException if something goes wrong.
390      */

391     public Integer JavaDoc getNavPos(CmsObject cms, CmsXmlLanguageFile lang, Vector JavaDoc names,
392             Vector JavaDoc values, Hashtable JavaDoc parameters) throws CmsException {
393         int retValue = -1;
394         I_CmsSession session = CmsXmlTemplateLoader.getSession(cms.getRequestContext(), true);
395         String JavaDoc preselect = (String JavaDoc)session.getValue(CmsWorkplaceDefault.C_PARA_NAVPOS);
396         // get the nav information
397
Hashtable JavaDoc storage = getNavData(cms);
398         if(storage.size() > 0) {
399             String JavaDoc[] nicenames = (String JavaDoc[])storage.get("NICENAMES");
400             int count = ((Integer JavaDoc)storage.get("COUNT")).intValue();
401
402             // finally fill the result vectors
403
for(int i = 0;i <= count;i++) {
404                 names.addElement(CmsEncoder.escapeHtml(nicenames[i]));
405                 values.addElement(CmsEncoder.escapeHtml(nicenames[i]));
406                 if ((preselect != null) && (preselect.equals(nicenames[i]))){
407                     retValue = values.size() -1;
408                 }
409             }
410         }
411         else {
412             values = new Vector JavaDoc();
413         }
414         if (retValue == -1){
415             // set the default value to no change
416
return new Integer JavaDoc(values.size() - 1);
417         }else{
418             return new Integer JavaDoc(retValue);
419         }
420     }
421
422     /**
423      * Gets all required navigation information from the files and subfolders of a folder.
424      * A file list of all files and folder is created, for all those resources, the navigation
425      * property is read. The list is sorted by their navigation position.
426      * @param cms The CmsObject.
427      * @return Hashtable including three arrays of strings containing the filenames,
428      * nicenames and navigation positions.
429      * @throws Throws CmsException if something goes wrong.
430      */

431     private Hashtable JavaDoc getNavData(CmsObject cms) throws CmsException {
432         // I_CmsSession session = CmsXmlTemplateLoader.getSession(cms.getRequestContext(), true);
433
CmsXmlLanguageFile lang = new CmsXmlLanguageFile(cms);
434         String JavaDoc[] filenames;
435         String JavaDoc[] nicenames;
436         String JavaDoc[] positions;
437         Hashtable JavaDoc storage = new Hashtable JavaDoc();
438         CmsFolder folder = null;
439         CmsFile file = null;
440         String JavaDoc nicename = null;
441         String JavaDoc currentFilelist = null;
442         int count = 1;
443         float max = 0;
444
445         // get the current folder
446
// currentFilelist = (String)session.getValue(C_PARA_FILELIST);
447
currentFilelist = CmsWorkplaceAction.getCurrentFolder(CmsXmlTemplateLoader.getRequest(cms.getRequestContext()).getOriginalRequest());
448         if(currentFilelist == null) {
449             currentFilelist = cms.getSitePath(cms.readFolder("/"));
450         }
451
452         // get all files and folders in the current filelist.
453
List JavaDoc files = cms.getFilesInFolder(currentFilelist);
454         List JavaDoc folders = cms.getSubFolders(currentFilelist);
455
456         // combine folder and file vector
457
Vector JavaDoc filefolders = new Vector JavaDoc();
458         Iterator JavaDoc en = folders.iterator();
459         while(en.hasNext()) {
460             folder = (CmsFolder)en.next();
461             filefolders.addElement(folder);
462         }
463         en = files.iterator();
464         while(en.hasNext()) {
465             file = (CmsFile)en.next();
466             filefolders.addElement(file);
467         }
468         if(filefolders.size() > 0) {
469
470             // Create some arrays to store filename, nicename and position for the
471
// nav in there. The dimension of this arrays is set to the number of
472
// found files and folders plus two more entrys for the first and last
473
// element.
474
filenames = new String JavaDoc[filefolders.size() + 2];
475             nicenames = new String JavaDoc[filefolders.size() + 2];
476             positions = new String JavaDoc[filefolders.size() + 2];
477
478             //now check files and folders that are not deleted and include navigation
479
// information
480
en = filefolders.iterator();
481             while(en.hasNext()) {
482                 CmsResource res = (CmsResource)en.next();
483
484                 // check if the resource is not marked as deleted
485
if(res.getState() != CmsResource.STATE_DELETED) {
486                     String JavaDoc navpos = cms.readProperty(cms.getSitePath(res), CmsPropertyDefinition.PROPERTY_NAVPOS);
487
488                     // check if there is a navpos for this file/folder
489
if(navpos != null) {
490                         nicename = cms.readProperty(cms.getSitePath(res), CmsPropertyDefinition.PROPERTY_NAVTEXT);
491                         if(nicename == null) {
492                             nicename = res.getName();
493                         }
494
495                         // add this file/folder to the storage.
496
filenames[count] = cms.getSitePath(res);
497                         nicenames[count] = nicename;
498                         positions[count] = navpos;
499                         if(new Float JavaDoc(navpos).floatValue() > max) {
500                             max = new Float JavaDoc(navpos).floatValue();
501                         }
502                         count++;
503                     }
504                 }
505             }
506         }
507         else {
508             filenames = new String JavaDoc[2];
509             nicenames = new String JavaDoc[2];
510             positions = new String JavaDoc[2];
511         }
512
513         // now add the first and last value
514
filenames[0] = "FIRSTENTRY";
515         nicenames[0] = lang.getLanguageValue("input.firstelement");
516         positions[0] = "0";
517         filenames[count] = "LASTENTRY";
518         nicenames[count] = lang.getLanguageValue("input.lastelement");
519         positions[count] = new Float JavaDoc(max + 1).toString();
520
521         // finally sort the nav information.
522
sort(cms, filenames, nicenames, positions, count);
523
524         // put all arrays into a hashtable to return them to the calling method.
525
storage.put("FILENAMES", filenames);
526         storage.put("NICENAMES", nicenames);
527         storage.put("POSITIONS", positions);
528         storage.put("COUNT", new Integer JavaDoc(count));
529         return storage;
530     }
531
532     /**
533      * Sorts a set of three String arrays containing navigation information depending on
534      * their navigation positions.
535      * @param cms Cms Object for accessign files.
536      * @param filenames Array of filenames
537      * @param nicenames Array of well formed navigation names
538      * @param positions Array of navpostions
539      */

540     private void sort(CmsObject cms, String JavaDoc[] filenames, String JavaDoc[] nicenames, String JavaDoc[] positions, int max) {
541
542         // Sorting algorithm
543
// This method uses an bubble sort, so replace this with something more
544
// efficient
545
for(int i = max - 1;i > 1;i--) {
546             for(int j = 1;j < i;j++) {
547                 float a = new Float JavaDoc(positions[j]).floatValue();
548                 float b = new Float JavaDoc(positions[j + 1]).floatValue();
549                 if(a > b) {
550                     String JavaDoc tempfilename = filenames[j];
551                     String JavaDoc tempnicename = nicenames[j];
552                     String JavaDoc tempposition = positions[j];
553                     filenames[j] = filenames[j + 1];
554                     nicenames[j] = nicenames[j + 1];
555                     positions[j] = positions[j + 1];
556                     filenames[j + 1] = tempfilename;
557                     nicenames[j + 1] = tempnicename;
558                     positions[j + 1] = tempposition;
559                 }
560             }
561         }
562     }
563
564     /**
565      * Updates the navigation position of all resources in the actual folder.
566      * @param cms The CmsObject.
567      * @param newfile The new file added to the nav.
568      * @param navpos The file after which the new entry is sorted.
569      */

570     private void updateNavPos(CmsObject cms, CmsResource newfile, String JavaDoc newpos) throws CmsException {
571         float newPos = 0;
572
573         // get the nav information
574
Hashtable JavaDoc storage = getNavData(cms);
575         if(storage.size() > 0) {
576             String JavaDoc[] nicenames = (String JavaDoc[])storage.get("NICENAMES");
577             String JavaDoc[] positions = (String JavaDoc[])storage.get("POSITIONS");
578             int count = ((Integer JavaDoc)storage.get("COUNT")).intValue();
579
580             // now find the file after which the new file is sorted
581
int pos = 0;
582             for(int i = 0;i < nicenames.length;i++) {
583                 if(newpos.equals(nicenames[i])) {
584                     pos = i;
585                 }
586             }
587             if(pos < count) {
588                 float low = new Float JavaDoc(positions[pos]).floatValue();
589                 float high = new Float JavaDoc(positions[pos + 1]).floatValue();
590                 newPos = (high + low) / 2;
591             }
592             else {
593                 newPos = new Float JavaDoc(positions[pos]).floatValue() + 1;
594             }
595         }
596         else {
597             newPos = 1;
598         }
599         cms.writeProperty(cms.getSitePath(newfile), CmsPropertyDefinition.PROPERTY_NAVPOS, new Float JavaDoc(newPos).toString());
600     }
601 }
602
Popular Tags