KickJava   Java API By Example, From Geeks To Geeks.

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


1 /*
2 * File : $Source: /usr/local/cvs/opencms/src-modules/com/opencms/workplace/CmsXmlTemplateEditor.java,v $
3 * Date : $Date: 2005/06/27 23:22:07 $
4 * Version: $Revision: 1.7 $
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
30 package com.opencms.workplace;
31
32 import org.opencms.file.CmsFile;
33 import org.opencms.file.CmsObject;
34 import org.opencms.file.CmsPropertyDefinition;
35 import org.opencms.file.CmsRequestContext;
36 import org.opencms.file.CmsResource;
37 import org.opencms.file.CmsResourceFilter;
38 import org.opencms.file.CmsVfsResourceAlreadyExistsException;
39 import org.opencms.i18n.CmsEncoder;
40 import org.opencms.importexport.CmsCompatibleCheck;
41 import org.opencms.lock.CmsLock;
42 import org.opencms.main.CmsException;
43 import org.opencms.main.CmsLog;
44 import org.opencms.main.OpenCms;
45 import org.opencms.staticexport.CmsLinkManager;
46 import org.opencms.util.CmsStringUtil;
47 import org.opencms.workplace.CmsWorkplace;
48 import org.opencms.workplace.editors.CmsMSDHtmlEditor;
49
50 import com.opencms.core.I_CmsSession;
51 import com.opencms.legacy.CmsLegacyException;
52 import com.opencms.legacy.CmsXmlTemplateLoader;
53 import com.opencms.template.A_CmsXmlContent;
54 import com.opencms.template.CmsTemplateClassManager;
55 import com.opencms.template.CmsXmlControlFile;
56 import com.opencms.template.CmsXmlTemplate;
57 import com.opencms.template.CmsXmlTemplateFile;
58
59 import java.io.IOException JavaDoc;
60 import java.util.Hashtable JavaDoc;
61 import java.util.Iterator JavaDoc;
62 import java.util.Map JavaDoc;
63 import java.util.Vector JavaDoc;
64
65 import javax.servlet.http.HttpServletRequest JavaDoc;
66
67 import org.w3c.dom.Element JavaDoc;
68
69 /**
70  * Template class for displaying the XML template editor of the OpenCms workplace.<P>
71  * Reads template files of the content type <code>CmsXmlWpTemplateFile</code>.
72  *
73  * @author Alexander Lucas
74  * @version $Revision: 1.7 $ $Date: 2005/06/27 23:22:07 $
75  * @see com.opencms.workplace.CmsXmlWpTemplateFile
76  *
77  * @deprecated Will not be supported past the OpenCms 6 release.
78  */

79
80 public class CmsXmlTemplateEditor extends CmsWorkplaceDefault {
81
82     protected void commitTemporaryFile(CmsObject cms, String JavaDoc originalFilename, String JavaDoc temporaryFilename,
83                    int tempProject, int curProject) throws CmsException {
84         // set current project to tempfileproject
85
cms.getRequestContext().setCurrentProject(cms.readProject(tempProject));
86         CmsFile tempFile = cms.readFile(temporaryFilename, CmsResourceFilter.IGNORE_EXPIRATION);
87         Map JavaDoc minfos = cms.readProperties(temporaryFilename);
88         // set current project
89
cms.getRequestContext().setCurrentProject(cms.readProject(curProject));
90         CmsFile orgFile = cms.readFile(originalFilename, CmsResourceFilter.IGNORE_EXPIRATION);
91         orgFile.setContents(tempFile.getContents());
92         cms.writeFile(orgFile);
93         Iterator JavaDoc keys = minfos.keySet().iterator();
94         while(keys.hasNext()) {
95             String JavaDoc keyName = (String JavaDoc)keys.next();
96             cms.writeProperty(originalFilename, keyName, (String JavaDoc)minfos.get(keyName));
97         }
98         // don't forget to clear the cache.
99
A_CmsXmlContent.clearFileCache(cms.getRequestContext().currentProject().getName()+":"
100                         + cms.getRequestContext().addSiteRoot(originalFilename));
101     }
102
103     protected String JavaDoc createTemporaryFile(CmsObject cms, CmsResource file, int tempProject, int curProject) throws CmsException {
104         String JavaDoc temporaryFilename = CmsResource.getFolderPath(cms.getSitePath(file)) + CmsWorkplace.TEMP_FILE_PREFIX + file.getName();
105         boolean ok = true;
106         
107         cms.getRequestContext().setCurrentProject(cms.readProject(tempProject));
108         
109         try {
110             cms.copyResource(cms.getSitePath(file), temporaryFilename, org.opencms.file.CmsResource.COPY_AS_NEW);
111             // cms.chmod(temporaryFilename, 91);
112
} catch (CmsException e) {
113             if ((e instanceof CmsVfsResourceAlreadyExistsException) || ((e instanceof CmsLegacyException) && (((CmsLegacyException)e).getType() != CmsLegacyException.C_SQL_ERROR))) {
114                 try {
115                     // try to re-use the old temporary file
116
cms.changeLastModifiedProjectId(temporaryFilename);
117                     cms.lockResource(temporaryFilename);
118                     // cms.chmod(temporaryFilename, 91);
119
} catch (Exception JavaDoc ex) {
120                     ok = false;
121                 }
122             } else {
123                 throw e;
124             }
125         }
126         
127         String JavaDoc extendedTempFile = temporaryFilename;
128
129         int loop = 0;
130         while (!ok) {
131             ok = true;
132             extendedTempFile = temporaryFilename + loop;
133             
134             try {
135                 cms.copyResource(cms.getSitePath(file), extendedTempFile);
136                 // cms.chmod(extendedTempFile, 91);
137
} catch (CmsException e) {
138                 if ((!(e instanceof CmsVfsResourceAlreadyExistsException)) && (e instanceof CmsLegacyException) && (((CmsLegacyException)e).getType() != CmsLegacyException.C_SQL_ERROR)) {
139                     cms.getRequestContext().setCurrentProject(cms.readProject(curProject));
140                     // This was not a file-exists-exception.
141
// Very bad. We should not continue here since we may run
142
// into an endless looooooooooooooooooooooooooooooooooop.
143
throw e;
144                 }
145
146                 // temp file could not be created
147
loop++;
148                 ok = false;
149             }
150         }
151
152         cms.getRequestContext().setCurrentProject(cms.readProject(curProject));
153         // Oh how lucky we are! We have found a temporary file!
154
temporaryFilename = extendedTempFile;
155         
156         return temporaryFilename;
157     }
158
159     /**
160      * Gets the templates displayed in the template select box.
161      * @param cms The CmsObject.
162      * @param lang The langauge definitions.
163      * @param names The names of the new rescources.
164      * @param values The links that are connected with each resource.
165      * @param parameters Hashtable of parameters (not used yet).
166      * @return The vectors names and values are filled with the information found in the
167      * workplace.ini.
168      * @throws Throws CmsException if something goes wrong.
169      */

170
171     public Integer JavaDoc getAvailableTemplates(CmsObject cms, CmsXmlLanguageFile lang, Vector JavaDoc names,
172             Vector JavaDoc values, Hashtable JavaDoc parameters) throws CmsException {
173
174         Integer JavaDoc retValue = CmsHelperMastertemplates.getTemplates(cms, names, values, (String JavaDoc)parameters.get("template"), -1);
175         if(retValue.intValue() != -1) {
176             return retValue;
177         } else {
178             // no template found -> use the given one
179
// first clean the vectors
180
names.removeAllElements();
181             values.removeAllElements();
182             // now add the current template
183
String JavaDoc name = (String JavaDoc)parameters.get("template");
184             try { // to read the title of this template
185
name = cms.readProperty(name, CmsPropertyDefinition.PROPERTY_TITLE);
186             } catch(CmsException exc) {
187                 // ignore this exception - the title for this template was not readable
188
}
189             names.add(name);
190             values.add(parameters.get("template"));
191             return new Integer JavaDoc(0);
192         }
193     }
194
195     /**
196      * Gets all views available in the workplace screen.
197      * <P>
198      * The given vectors <code>names</code> and <code>values</code> will
199      * be filled with the appropriate information to be used for building
200      * a select box.
201      * <P>
202      * <code>names</code> will contain language specific view descriptions
203      * and <code>values</code> will contain the correspondig URL for each
204      * of these views after returning from this method.
205      * <P>
206      *
207      * @param cms CmsObject Object for accessing system resources.
208      * @param lang reference to the currently valid language file
209      * @param names Vector to be filled with the appropriate values in this method.
210      * @param values Vector to be filled with the appropriate values in this method.
211      * @param parameters Hashtable containing all user parameters <em>(not used here)</em>.
212      * @return Index representing the user's current workplace view in the vectors.
213      * @throws CmsException
214      */

215
216     public Integer JavaDoc getBodys(CmsObject cms, CmsXmlLanguageFile lang, Vector JavaDoc names, Vector JavaDoc values,
217             Hashtable JavaDoc parameters) throws CmsException {
218         I_CmsSession session = CmsXmlTemplateLoader.getSession(cms.getRequestContext(), true);
219         String JavaDoc currentBodySection = (String JavaDoc)parameters.get("body");
220         String JavaDoc bodyClassName = (String JavaDoc)parameters.get("bodyclass");
221         String JavaDoc tempBodyFilename = (String JavaDoc)session.getValue("te_tempbodyfile");
222         Object JavaDoc tempObj = CmsTemplateClassManager.getClassInstance(bodyClassName);
223         CmsXmlTemplate bodyElementClassObject = (CmsXmlTemplate)tempObj;
224         CmsXmlTemplateFile bodyTemplateFile = bodyElementClassObject.getOwnTemplateFile(cms,
225                 tempBodyFilename, C_BODY_ELEMENT, parameters, null);
226         Vector JavaDoc allBodys = bodyTemplateFile.getAllSections();
227         int loop = 0;
228         int currentBodySectionIndex = 0;
229         int numBodys = allBodys.size();
230         for(int i = 0;i < numBodys;i++) {
231             String JavaDoc bodyname = (String JavaDoc)allBodys.elementAt(i);
232             String JavaDoc encodedBodyname = CmsEncoder.escapeXml(bodyname);
233             if(bodyname.equals(currentBodySection)) {
234                 currentBodySectionIndex = loop;
235             }
236             values.addElement(encodedBodyname);
237             names.addElement(encodedBodyname);
238             loop++;
239         }
240         return new Integer JavaDoc(currentBodySectionIndex);
241     }
242
243     /**
244      * Gets the content of a defined section in a given template file and its subtemplates
245      * with the given parameters.
246      *
247      * @see #getContent(CmsObject, String, String, Hashtable, String)
248      * @param cms CmsObject Object for accessing system resources.
249      * @param templateFile Filename of the template file.
250      * @param elementName Element name of this template in our parent template.
251      * @param parameters Hashtable with all template class parameters.
252      * @param templateSelector template section that should be processed.
253      */

254     public byte[] getContent(CmsObject cms, String JavaDoc templateFile, String JavaDoc elementName,
255             Hashtable JavaDoc parameters, String JavaDoc templateSelector) throws CmsException {
256         CmsRequestContext reqCont = cms.getRequestContext();
257         HttpServletRequest JavaDoc orgReq = CmsXmlTemplateLoader.getRequest(reqCont).getOriginalRequest();
258         I_CmsSession session = CmsXmlTemplateLoader.getSession(cms.getRequestContext(), true);
259
260         // get the temporary file projectid
261
int tempProject = 0;
262         try{
263             tempProject = OpenCms.getWorkplaceManager().getTempFileProjectId();
264         }catch(Exception JavaDoc e){
265             throw new CmsLegacyException("Can not read projectId of tempfileproject for creating temporary file for editing! "+e.toString());
266         }
267         if(tempProject == 0){
268             throw new CmsLegacyException("Can not create temporary file for editing!");
269         }
270         int curProject = cms.getRequestContext().currentProject().getId();
271
272         // Get the user's browser
273
String JavaDoc browser = orgReq.getHeader("user-agent");
274         String JavaDoc hostName = orgReq.getScheme() + "://" + orgReq.getServerName() + ":" + orgReq.getServerPort();
275
276         // Get all URL parameters
277
String JavaDoc content = (String JavaDoc)parameters.get(CmsWorkplaceDefault.C_PARA_CONTENT);
278         if(content == null){
279             // try to get the value from the session because we might come from errorpage
280
content = (String JavaDoc)session.getValue(CmsWorkplaceDefault.C_PARA_CONTENT);
281             session.removeValue(CmsWorkplaceDefault.C_PARA_CONTENT);
282         }
283         
284         String JavaDoc body = (String JavaDoc)parameters.get("body");
285         if(body == null){
286             // try to get the value from the session because we might come from errorpage
287
body = (String JavaDoc)session.getValue("body");
288             session.removeValue("body");
289         }
290         String JavaDoc file = (String JavaDoc)parameters.get(CmsWorkplaceDefault.C_PARA_RESOURCE);
291         if(file == null){
292             // try to get the value from the session because we might come from errorpage
293
file = (String JavaDoc)session.getValue(CmsWorkplaceDefault.C_PARA_RESOURCE);
294             session.removeValue(CmsWorkplaceDefault.C_PARA_RESOURCE);
295         }
296         String JavaDoc editor = (String JavaDoc)parameters.get("editor");
297         if((editor == null) || "".equals(editor)){
298             // try to get the value from the session because we might come from errorpage
299
editor = (String JavaDoc)session.getValue("editor");
300             if(editor != null){
301                 parameters.put("editor", editor);
302             }
303             session.removeValue("editor");
304         }
305         String JavaDoc title = (String JavaDoc)parameters.get(CmsWorkplaceDefault.C_PARA_TITLE);
306         if(title == null){
307             // try to get the value from the session because we might come from errorpage
308
title = (String JavaDoc)session.getValue(CmsWorkplaceDefault.C_PARA_TITLE);
309             session.removeValue(CmsWorkplaceDefault.C_PARA_TITLE);
310         }
311         String JavaDoc bodytitle = (String JavaDoc)parameters.get("bodytitle");
312         if(bodytitle == null){
313             // try to get the value from the session because we might come from errorpage
314
bodytitle = (String JavaDoc)session.getValue("bodytitle");
315             session.removeValue("bodytitle");
316         }
317         String JavaDoc layoutTemplateFilename = (String JavaDoc)parameters.get("template");
318         if(layoutTemplateFilename == null){
319             // try to get the value from the session because we might come from errorpage
320
layoutTemplateFilename = (String JavaDoc)session.getValue("template");
321             session.removeValue("template");
322         }
323         String JavaDoc layoutTemplatFilenameRelative = layoutTemplateFilename;
324         layoutTemplateFilename = CmsLinkManager.getAbsoluteUri(layoutTemplateFilename, file);
325         String JavaDoc bodyElementClassName = (String JavaDoc)parameters.get("bodyclass");
326         if(bodyElementClassName == null){
327             // try to get the value from the session because we might come from errorpage
328
bodyElementClassName = (String JavaDoc)session.getValue("bodyclass");
329             session.removeValue("bodyclass");
330         }
331         String JavaDoc bodyElementFilename = (String JavaDoc)parameters.get("bodyfile");
332         if(bodyElementFilename == null){
333             // try to get the value from the session because we might come from errorpage
334
bodyElementFilename = (String JavaDoc)session.getValue("bodyfile");
335             session.removeValue("bodyfile");
336         }
337         String JavaDoc action = (String JavaDoc)parameters.get(CmsWorkplaceDefault.C_PARA_ACTION);
338
339         String JavaDoc startView = (String JavaDoc)parameters.get("startview");
340         if((startView == null) || ("".equals(startView))){
341             // try to get the value from the session because we might come from errorpage
342
startView = (String JavaDoc)session.getValue("startview");
343             session.removeValue("startview");
344         }
345
346         // Get all session parameters
347
String JavaDoc oldEdit = (String JavaDoc)session.getValue("te_oldedit");
348         String JavaDoc oldLayoutFilename = (String JavaDoc)session.getValue("te_oldlayout");
349         String JavaDoc oldTitle = (String JavaDoc)session.getValue("te_title");
350         String JavaDoc oldBody = (String JavaDoc)session.getValue("te_oldbody");
351         String JavaDoc oldBodytitle = (String JavaDoc)session.getValue("te_oldbodytitle");
352         String JavaDoc layoutTemplateClassName = (String JavaDoc)session.getValue("te_templateclass");
353         String JavaDoc tempPageFilename = (String JavaDoc)session.getValue("te_temppagefile");
354         String JavaDoc tempBodyFilename = (String JavaDoc)session.getValue("te_tempbodyfile");
355         String JavaDoc style = (String JavaDoc)session.getValue("te_stylesheet");
356
357         boolean existsContentParam = content != null;
358         boolean existsFileParam = (file != null && (!"".equals(file)));
359         boolean saveRequested = ((action != null) && (CmsWorkplaceDefault.C_EDIT_ACTION_SAVE.equals(action) || CmsWorkplaceDefault.C_EDIT_ACTION_SAVEEXIT.equals(action)));
360         boolean exitRequested = ((action != null) && (CmsWorkplaceDefault.C_EDIT_ACTION_EXIT.equals(action) || CmsWorkplaceDefault.C_EDIT_ACTION_SAVEEXIT.equals(action)));
361         boolean bodychangeRequested = ((oldBody != null) && (body != null) && (!(oldBody.equals(body))));
362         boolean templatechangeRequested = (oldLayoutFilename != null && layoutTemplateFilename != null
363                && (!(oldLayoutFilename.equals(layoutTemplateFilename))));
364         boolean titlechangeRequested = (oldTitle != null && title != null && (!(oldTitle.equals(title))));
365         boolean newbodyRequested = ((action != null) && "newbody".equals(action));
366         boolean previewRequested = ((action != null) && "preview".equals(action));
367         boolean bodytitlechangeRequested = (oldBodytitle != null && bodytitle != null && (!(oldBodytitle.equals(bodytitle))));
368
369         String JavaDoc saveerror = "";
370
371         // Check if there is a file parameter in the request
372
if(!existsFileParam) {
373             throwException("No \"file\" parameter given. Don't know which file should be edited.");
374         }
375
376         // If there is no content parameter this seems to be
377
// a new request of the page editor.
378
// So we have to read all files and set some initial values.
379
parameters.put("root.pagetype", OpenCms.getResourceManager().getResourceType(cms.readResource(file).getTypeId()).getTypeName());
380         parameters.put("filename_for_relative_template", file);
381         
382         // Simple page support
383
String JavaDoc templateProp = cms.readProperty(file, CmsPropertyDefinition.PROPERTY_TEMPLATE);
384         boolean isSimplePage = (templateProp != null);
385
386         // Check, if the selected page file is locked
387
CmsResource pageFileResource = cms.readResource(file);
388         CmsLock lock = cms.getLock(file);
389         if(lock.isNullLock()) {
390             cms.lockResource(file);
391         }
392                                         
393         if(!existsContentParam) {
394             
395             if (isSimplePage) {
396                 
397                 bodyElementClassName = CmsCompatibleCheck.XML_CONTROL_DEFAULT_CLASS;
398                 bodyElementFilename = file;
399                 layoutTemplateClassName = CmsCompatibleCheck.XML_CONTROL_DEFAULT_CLASS;
400                 layoutTemplateFilename = templateProp;
401                 layoutTemplatFilenameRelative = templateProp;
402                 
403             } else {
404                 
405                 CmsXmlControlFile originalControlFile = new CmsXmlControlFile(cms, file);
406                 if(originalControlFile.isElementClassDefined(C_BODY_ELEMENT)) {
407                     bodyElementClassName = originalControlFile.getElementClass(C_BODY_ELEMENT);
408                 }
409                 if(originalControlFile.isElementTemplateDefined(C_BODY_ELEMENT)) {
410                     bodyElementFilename = originalControlFile.getElementTemplate(C_BODY_ELEMENT);
411                     bodyElementFilename = originalControlFile.validateBodyPath(cms, bodyElementFilename, cms.readResource(file));
412                 }
413                 if((bodyElementClassName == null) || (bodyElementFilename == null)) {
414                     // Either the template class or the template file
415
// for the body element could not be determined.
416
// BUG: Send error here
417
}
418
419                 // The content file must be locked before editing
420
//CmsResource contentFileResource = cms.readFileHeader(bodyElementFilename);
421
lock = cms.getLock(bodyElementFilename);
422                 if(lock.isNullLock()) {
423                     cms.lockResource(bodyElementFilename);
424                 }
425                 // Now get the currently selected master template file
426
layoutTemplateFilename = originalControlFile.getMasterTemplate();
427                 layoutTemplatFilenameRelative = layoutTemplateFilename;
428                 layoutTemplateFilename = CmsLinkManager.getAbsoluteUri(layoutTemplateFilename, originalControlFile.getAbsoluteFilename());
429                 layoutTemplateClassName = originalControlFile.getTemplateClass();
430             }
431             
432             int browserId;
433             if(browser.indexOf("MSIE") > -1) {
434                 browserId = 0;
435             }else {
436                 browserId = 1;
437             }
438
439             if(editor == null || "".equals(editor)) {
440                 if(startView == null || "".equals(startView)){
441                     editor = CmsMSDHtmlEditor.SELECTBOX_EDITORVIEWS[CmsWorkplaceDefault.C_SELECTBOX_EDITORVIEWS_DEFAULT[browserId]];
442                 } else {
443                     editor = startView;
444                 }
445                 session.putValue("te_pageeditor", editor);
446                 parameters.put("editor", editor);
447             }
448
449             // And finally the document title
450
title = cms.readProperty(file, CmsPropertyDefinition.PROPERTY_TITLE);
451             if(title == null) {
452                 title = "";
453             }
454
455             // Okay. All values are initialized. Now we can create
456
// the temporary files.
457
// if the parameter noactivex is set the temp file was already created,
458
// so read the filename from the session
459
String JavaDoc noactivex = (String JavaDoc)parameters.get("noactivex");
460             
461             if(noactivex == null || "".equals(noactivex.trim())){
462                 tempPageFilename = createTemporaryFile(cms, pageFileResource, tempProject, curProject);
463             } else {
464                 tempPageFilename = (String JavaDoc)session.getValue("te_temppagefile");
465             }
466             
467             cms.getRequestContext().setCurrentProject(cms.readProject(curProject));
468             if (isSimplePage) {
469                 tempBodyFilename = tempPageFilename;
470             } else {
471                 tempBodyFilename = CmsCompatibleCheck.VFS_PATH_BODIES.substring(0, CmsCompatibleCheck.VFS_PATH_BODIES.length()-1) + tempPageFilename;
472             }
473             
474             session.putValue("te_temppagefile", tempPageFilename);
475             session.putValue("te_tempbodyfile", tempBodyFilename);
476         }
477         // Get the XML parsed content of the layout file.
478
// This can be done by calling the getOwnTemplateFile() method of the
479
// layout's template class.
480
// The content is needed to determine the HTML style of the body element.
481
Object JavaDoc tempObj = null;
482         CmsXmlTemplateFile layoutTemplateFile = null;
483         if (isSimplePage) {
484             StringBuffer JavaDoc layoutBuffer = new StringBuffer JavaDoc(512);
485             layoutBuffer.append("<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n<xmltemplate>\n<stylesheet>");
486             layoutBuffer.append("none");
487             layoutBuffer.append("</stylesheet>\n<template><element name=\"jsptemplate\"/></template>\n<elementdef name=\"jsptemplate\">\n<class>com.opencms.flex.CmsJspTemplate</class>\n<template>");
488             layoutBuffer.append(templateFile);
489             layoutBuffer.append("</template>\n</elementdef>\n</xmltemplate>\n");
490             layoutTemplateFile = new CmsXmlTemplateFile(cms, templateFile + com.opencms.core.I_CmsConstants.C_XML_CONTROL_FILE_SUFFIX, layoutBuffer.toString());
491         } else {
492             tempObj = CmsTemplateClassManager.getClassInstance(layoutTemplateClassName);
493             CmsXmlTemplate layoutTemplateClassObject = (CmsXmlTemplate)tempObj;
494             layoutTemplateFile = layoutTemplateClassObject.getOwnTemplateFile(cms,
495                     layoutTemplateFilename, null, parameters, null);
496         }
497         
498         // Get the XML parsed content of the body file.
499
// This can be done by calling the getOwnTemplateFile() method of the
500
// body's template class.
501
tempObj = CmsTemplateClassManager.getClassInstance(bodyElementClassName);
502         CmsXmlTemplate bodyElementClassObject = (CmsXmlTemplate)tempObj;
503         CmsXmlTemplateFile bodyTemplateFile = bodyElementClassObject.getOwnTemplateFile(cms,
504                 tempBodyFilename, C_BODY_ELEMENT, parameters, null);
505
506         // Get the temporary page file object
507
CmsXmlControlFile temporaryControlFile = null;
508         if (! isSimplePage) temporaryControlFile = new CmsXmlControlFile(cms, tempPageFilename);
509         if(!existsContentParam) {
510             Vector JavaDoc allBodys = bodyTemplateFile.getAllSections();
511             if(allBodys == null || allBodys.size() == 0) {
512                 body = "";
513             }else {
514                 body = (String JavaDoc)allBodys.elementAt(0);
515             }
516             bodytitle = body.equals("(default)") ? "" : body;
517             if (isSimplePage) {
518                 style = cms.readProperty(layoutTemplateFilename, CmsPropertyDefinition.PROPERTY_TEMPLATE);
519                 if (style != null) {
520                     style = hostName + OpenCms.getSystemInfo().getOpenCmsContext() + style;
521                 } else {
522                     style = "";
523                 }
524             } else {
525                 temporaryControlFile.setElementTemplSelector(C_BODY_ELEMENT, body);
526                 temporaryControlFile.setElementTemplate(C_BODY_ELEMENT, tempBodyFilename);
527                 // change the current project to temp file project
528
cms.getRequestContext().setCurrentProject(cms.readProject(tempProject));
529                 temporaryControlFile.write();
530                 cms.getRequestContext().setCurrentProject(cms.readProject(curProject));
531                 try {
532                     style = getStylesheet(cms, null, layoutTemplateFile, null);
533                 } catch (Exception JavaDoc e) {
534                     style = "";
535                 }
536                 if(style != null && !"".equals(style)) {
537                     style = hostName + style;
538                 }
539             }
540             session.putValue("te_stylesheet", style);
541         } else {
542             // There exists a content parameter.
543
// We have to check all possible changes requested by the user.
544
if(titlechangeRequested) {
545                 // The user entered a new document title
546
try {
547                     cms.getRequestContext().setCurrentProject(cms.readProject(tempProject));
548                     cms.writeProperty(tempPageFilename, CmsPropertyDefinition.PROPERTY_TITLE, title);
549                     cms.getRequestContext().setCurrentProject(cms.readProject(curProject));
550                 }catch(CmsException e) {
551                     cms.getRequestContext().setCurrentProject(cms.readProject(curProject));
552                     if(CmsLog.getLog(this).isErrorEnabled() ) {
553                         CmsLog.getLog(this).error("Could not write property " + CmsPropertyDefinition.PROPERTY_TITLE + " for file " + file, e);
554                     }
555                 }
556             }
557             if(templatechangeRequested) {
558                 // The user requested a change of the layout template
559
if (isSimplePage) {
560                     cms.getRequestContext().setCurrentProject(cms.readProject(tempProject));
561                     cms.writeProperty(tempPageFilename, CmsPropertyDefinition.PROPERTY_TEMPLATE, layoutTemplatFilenameRelative);
562                     cms.getRequestContext().setCurrentProject(cms.readProject(curProject));
563                     style = cms.readProperty(layoutTemplateFilename, CmsPropertyDefinition.PROPERTY_TEMPLATE);
564                     if (style != null) {
565                         style = hostName + OpenCms.getSystemInfo().getOpenCmsContext() + style;
566                     } else {
567                         style = "";
568                     }
569                 } else {
570                     temporaryControlFile.setMasterTemplate(layoutTemplatFilenameRelative );
571                     try {
572                         style = getStylesheet(cms, null, layoutTemplateFile, null);
573                     }catch(Exception JavaDoc e) {
574                         style = "";
575                     }
576                     if(style != null && !"".equals(style)) {
577                         style = hostName + style;
578                     }
579                 }
580                 session.putValue("te_stylesheet", style);
581             }
582             if(bodytitlechangeRequested) {
583                 // The user entered a new title for the current body
584
if((!oldBody.equals("(default)")) && (!oldBody.equals("script"))) {
585                     if(bodytitle.toLowerCase().equals("script")) {
586                         bodytitle = "script";
587                     }
588                     try {
589                         bodyTemplateFile.renameSection(oldBody, bodytitle);
590                         oldBody = bodytitle;
591                         if(!bodychangeRequested) {
592                             body = bodytitle;
593                         }
594                     }catch(Exception JavaDoc e) {
595                         bodytitle = oldBodytitle;
596                     }
597                     if(bodytitle.equals("script")) {
598                         session.putValue("te_pageeditor", editor);
599                         editor = CmsMSDHtmlEditor.SELECTBOX_EDITORVIEWS[1];
600                         parameters.put("editor", editor);
601                     }
602                 }else {
603                     bodytitle = oldBodytitle;
604                 }
605             }
606             if(bodychangeRequested) {
607                 if (! isSimplePage) temporaryControlFile.setElementTemplSelector(C_BODY_ELEMENT, body);
608                 bodytitle = body.equals("(default)") ? "" : body;
609                 if(body.equals("script")) {
610                     // User wants to edit javascript code
611
// Select text editor
612
session.putValue("te_pageeditor", editor);
613                     editor = CmsMSDHtmlEditor.SELECTBOX_EDITORVIEWS[1];
614                     parameters.put("editor", editor);
615                 }else {
616                     if(oldBody.equals("script")) {
617                         // User wants to switch back from javascript mode
618
// Select old editor
619
editor = (String JavaDoc)session.getValue("te_pageeditor");
620                         parameters.put("editor", editor);
621                     }
622                 }
623             }
624             if(newbodyRequested) {
625                 body = C_BODY_ELEMENT + bodyTemplateFile.createNewSection(C_BODY_ELEMENT);
626                 bodytitle = body;
627                 if (! isSimplePage) {
628                     temporaryControlFile.setElementTemplSelector(C_BODY_ELEMENT, body);
629                     temporaryControlFile.setElementTemplate(C_BODY_ELEMENT, tempBodyFilename);
630                 }
631             }
632             
633             // check for C_PROPERTY_RELATIVEROOT property (with directory search)
634
String JavaDoc relativeRoot = cms.readProperty(file, org.opencms.file.CmsPropertyDefinition.PROPERTY_RELATIVEROOT, true);
635             
636             // save file contents to our temporary file.
637
content = CmsEncoder.unescape(content, CmsEncoder.ENCODING_UTF_8);
638             if (! CmsEncoder.ENCODING_UTF_8.equalsIgnoreCase(cms.getRequestContext().getEncoding())) {
639                 content = CmsEncoder.escapeNonAscii(content);
640             }
641             
642             if((!exitRequested) || saveRequested) {
643                 bodyTemplateFile.setEditedTemplateContent(cms, content, oldBody, oldEdit.equals(CmsMSDHtmlEditor.SELECTBOX_EDITORVIEWS[0]), file, relativeRoot);
644             }
645             cms.getRequestContext().setCurrentProject(cms.readProject(tempProject));
646             bodyTemplateFile.write();
647             if (! isSimplePage) temporaryControlFile.write();
648             cms.getRequestContext().setCurrentProject(cms.readProject(curProject));
649         }
650
651         // If the user requested a preview then send a redirect
652
// to the temporary page file.
653
if(previewRequested) {
654             preview(tempPageFilename, reqCont);
655             return "".getBytes();
656         }
657
658         // If the user requested a "save" expilitly by pressing one of
659
// the "save" buttons, copy all informations of the temporary
660
// files to the original files.
661
if(saveRequested) {
662             try{
663                 commitTemporaryFile(cms, bodyElementFilename, tempBodyFilename, tempProject, curProject);
664                 cms.getRequestContext().setCurrentProject(cms.readProject(tempProject));
665                 title = cms.readProperty(tempPageFilename, CmsPropertyDefinition.PROPERTY_TITLE);
666                 cms.getRequestContext().setCurrentProject(cms.readProject(curProject));
667                 if(title != null && !"".equals(title)) {
668                     cms.writeProperty(file, CmsPropertyDefinition.PROPERTY_TITLE, title);
669                 }
670                 if (! isSimplePage) {
671                     CmsXmlControlFile originalControlFile = new CmsXmlControlFile(cms, file);
672                     originalControlFile.setMasterTemplate(temporaryControlFile.getMasterTemplate());
673                     originalControlFile.write();
674                 }
675             } catch (CmsException e){
676                 // there was an exception while the file should be saved
677
// return to the editor and show the exception so the user can save the changes
678
saveerror = e.getMessage();
679                 if(content != null){
680                     session.putValue(CmsWorkplaceDefault.C_PARA_CONTENT, content);
681                 }
682                 if(body != null){
683                     session.putValue("body", body);
684                 }
685                 if(file != null){
686                     session.putValue(CmsWorkplaceDefault.C_PARA_RESOURCE, file);
687                 }
688                 if(editor != null){
689                     session.putValue("editor", editor);
690                 }
691                 if(title != null){
692                     session.putValue(CmsWorkplaceDefault.C_PARA_TITLE, title);
693                 }
694                 if(bodytitle != null){
695                     session.putValue("bodytitle", bodytitle);
696                 }
697                 if(layoutTemplatFilenameRelative != null){
698                     session.putValue("template", layoutTemplatFilenameRelative);
699                 }
700                 if(bodyElementClassName != null){
701                     session.putValue("bodyclass", bodyElementClassName);
702                 }
703                 if(bodyElementFilename != null){
704                     session.putValue("bodyfile", bodyElementFilename);
705                 }
706                 if(startView != null){
707                     session.putValue("startview", startView);
708                 }
709             }
710         }
711
712         // Check if we should leave th editor instead of start processing
713
if(exitRequested && ((saveerror == null) || "".equals(saveerror))) {
714
715             // First delete temporary files
716
if (! isSimplePage) temporaryControlFile.removeFromFileCache();
717             bodyTemplateFile.removeFromFileCache();
718             // deleting the pagefile will delete the bodyfile too
719
cms.getRequestContext().setCurrentProject(cms.readProject(tempProject));
720             cms.deleteResource(tempPageFilename, org.opencms.file.CmsResource.DELETE_PRESERVE_SIBLINGS);
721             cms.getRequestContext().setCurrentProject(cms.readProject(curProject));
722             try {
723                 CmsXmlTemplateLoader.getResponse(cms.getRequestContext()).sendCmsRedirect(CmsWorkplaceAction.getWorkplaceUri(CmsXmlTemplateLoader.getRequest(cms.getRequestContext()).getOriginalRequest()));
724             }catch(IOException JavaDoc e) {
725                 throwException("Could not send redirect to workplace main screen.", e);
726             }
727             return null;
728         }
729
730         // Include the datablocks of the layout file into the body file.
731
// So the "bodytag" and "style" data can be accessed by the body file.
732
Element JavaDoc bodyTag = layoutTemplateFile.getBodyTag();
733         bodyTemplateFile.setBodyTag(bodyTag);
734         
735         // Load the body!
736
content = bodyTemplateFile.getEditableTemplateContent(this, parameters, body, editor.equals(CmsMSDHtmlEditor.SELECTBOX_EDITORVIEWS[0]), style);
737         
738         // set the context & servlet path in editor content
739
content = CmsStringUtil.substitute(content, CmsStringUtil.MACRO_OPENCMS_CONTEXT + "/", OpenCms.getSystemInfo().getOpenCmsContext() + "/");
740         
741         // escape content
742
content = CmsEncoder.escapeWBlanks(content, CmsEncoder.ENCODING_UTF_8);
743         
744         parameters.put(CmsWorkplaceDefault.C_PARA_CONTENT, content);
745
746         // put the body parameter so that the selectbox can set the correct current value
747
parameters.put("body", body);
748         parameters.put("bodyfile", bodyElementFilename);
749         parameters.put("bodyclass", bodyElementClassName);
750         parameters.put("template", layoutTemplateFilename);
751
752         // remove all parameters that could be relevant for the
753
// included editor.
754
parameters.remove(CmsWorkplaceDefault.C_PARA_RESOURCE);
755         parameters.remove(CmsWorkplaceDefault.C_PARA_ACTION);
756         int numEditors = CmsMSDHtmlEditor.SELECTBOX_EDITORVIEWS.length;
757         for(int i = 0;i < numEditors;i++) {
758             if(editor.equals(CmsMSDHtmlEditor.SELECTBOX_EDITORVIEWS[i])) {
759                 parameters.put("editor._CLASS_", C_SELECTBOX_EDITORVIEWS_CLASSES[i]);
760                 parameters.put("editor._TEMPLATE_", CmsWorkplaceDefault.C_VFS_PATH_DEFAULT_INTERNAL + CmsWorkplaceDefault.C_SELECTBOX_EDITORVIEWS_TEMPLATES[i]);
761             }
762         }
763         session.putValue("te_file", file);
764         session.putValue("te_oldedit", editor);
765         session.putValue("te_oldbody", body);
766         session.putValue("te_oldbodytitle", bodytitle);
767         session.putValue("te_oldlayout", layoutTemplateFilename);
768         if(title != null) {
769             session.putValue("te_title", title);
770         }else {
771             session.putValue("te_title", "");
772         }
773         session.putValue("te_templateclass", layoutTemplateClassName);
774         CmsXmlWpTemplateFile xmlTemplateDocument = (CmsXmlWpTemplateFile)getOwnTemplateFile(cms,
775                 templateFile, elementName, parameters, templateSelector);
776         xmlTemplateDocument.setData("editor", editor);
777         xmlTemplateDocument.setData("bodyfile", bodyElementFilename);
778         xmlTemplateDocument.setData("bodyclass", bodyElementClassName);
779         xmlTemplateDocument.setData("editorframe", (String JavaDoc)parameters.get("root.editorframe"));
780         if (bodytitle != null) {
781             xmlTemplateDocument.setData("bodytitle", bodytitle);
782         }
783
784         // Put the "file" datablock for processing in the template file.
785
// It will be inserted in a hidden input field and given back when submitting.
786
xmlTemplateDocument.setData(CmsWorkplaceDefault.C_PARA_RESOURCE, file);
787         if(!"".equals(saveerror)){
788             templateSelector = "errorsave";
789             xmlTemplateDocument.setData("errordetail", saveerror);
790             xmlTemplateDocument.setData("errorlasturl", xmlTemplateDocument.getFilename()+".html");
791         }
792         return startProcessing(cms, xmlTemplateDocument, elementName, parameters, templateSelector);
793     }
794
795     /** Gets all editor views available in the template editor screens.
796      * <P>
797      * The given vectors <code>names</code> and <code>values</code> will
798      * be filled with the appropriate information to be used for building
799      * a select box.
800      * <P>
801      * Used to build font select boxes in editors.
802      *
803      * @param cms CmsObject Object for accessing system resources.
804      * @param lang reference to the currently valid language file
805      * @param names Vector to be filled with the appropriate values in this method.
806      * @param values Vector to be filled with the appropriate values in this method.
807      * @param parameters Hashtable containing all user parameters <em>(not used here)</em>.
808      * @return Index representing the user's current workplace view in the vectors.
809      * @throws CmsException
810      */

811
812     public Integer JavaDoc getEditorViews(CmsObject cms, CmsXmlLanguageFile lang, Vector JavaDoc names, Vector JavaDoc values,
813             Hashtable JavaDoc parameters) throws CmsException {
814         Vector JavaDoc names2 = new Vector JavaDoc();
815         Vector JavaDoc values2 = new Vector JavaDoc();
816         getConstantSelectEntries(names2, values2, CmsMSDHtmlEditor.SELECTBOX_EDITORVIEWS, lang);
817         int browserId;
818         CmsRequestContext reqCont = cms.getRequestContext();
819         HttpServletRequest JavaDoc orgReq = CmsXmlTemplateLoader.getRequest(reqCont).getOriginalRequest();
820         String JavaDoc browser = orgReq.getHeader("user-agent");
821         if(browser.indexOf("MSIE") > -1) {
822             browserId = 0;
823         }
824         else {
825             browserId = 1;
826         }
827         int loop = 1;
828         int allowedEditors = CmsMSDHtmlEditor.SELECTBOX_EDITORVIEWS_ALLOWED[browserId];
829         if(((String JavaDoc)parameters.get("body")).equals("script")) {
830             allowedEditors = allowedEditors & 510;
831         }
832         for(int i = 0;i < names2.size();i++) {
833             if((allowedEditors & loop) > 0) {
834                 values.addElement(values2.elementAt(i));
835                 names.addElement(names2.elementAt(i));
836             }
837             loop <<= 1;
838         }
839         int currentIndex = values.indexOf(parameters.get("editor"));
840         return new Integer JavaDoc(currentIndex);
841     }
842
843     /**
844      * Indicates if the results of this class are cacheable.
845      *
846      * @param cms CmsObject Object for accessing system resources
847      * @param templateFile Filename of the template file
848      * @param elementName Element name of this template in our parent template.
849      * @param parameters Hashtable with all template class parameters.
850      * @param templateSelector template section that should be processed.
851      * @return <EM>true</EM> if cacheable, <EM>false</EM> otherwise.
852      */

853
854     public boolean isCacheable(CmsObject cms, String JavaDoc templateFile, String JavaDoc elementName,
855             Hashtable JavaDoc parameters, String JavaDoc templateSelector) {
856         return false;
857     }
858
859     protected void preview(String JavaDoc previewPath, CmsRequestContext reqCont) throws CmsException {
860         String JavaDoc servletPath = CmsXmlTemplateLoader.getRequest(reqCont).getServletUrl();
861         try {
862             CmsXmlTemplateLoader.getResponse(reqCont).sendCmsRedirect(previewPath);
863         }
864         catch(IOException JavaDoc e) {
865             throwException("Could not send redirect preview file " + servletPath + previewPath, e);
866         }
867     }
868
869     /**
870      * User method to generate an URL for a preview.
871      * The currently selected temporary file name will be considered.
872      * <P>
873      * In the editor template file, this method can be invoked by
874      * <code>&lt;METHOD name="previewUrl"/&gt;</code>.
875      *
876      * @param cms CmsObject Object for accessing system resources.
877      * @param tagcontent Unused in this special case of a user method. Can be ignored.
878      * @param doc Reference to the A_CmsXmlContent object of the initiating XLM document <em>(not used here)</em>.
879      * @param userObj Hashtable with parameters <em>(not used here)</em>.
880      * @return String with the pics URL.
881      * @throws CmsException
882      */

883
884     public Object JavaDoc previewUrl(CmsObject cms, String JavaDoc tagcontent, A_CmsXmlContent doc, Object JavaDoc userObj) throws CmsException {
885         String JavaDoc servletPath = CmsXmlTemplateLoader.getRequest(cms.getRequestContext()).getServletUrl();
886         I_CmsSession session = CmsXmlTemplateLoader.getSession(cms.getRequestContext(), true);
887         String JavaDoc tempPath = (String JavaDoc)session.getValue("te_temppagefile");
888         String JavaDoc result = servletPath + tempPath;
889         return result;
890     }
891
892     /**
893      * Pre-Sets the value of the body title input field.
894      * This method is directly called by the content definiton.
895      * @param Cms The CmsObject.
896      * @param lang The language file.
897      * @param parameters User parameters.
898      * @return Value that is pre-set into the title field.
899      * @throws CmsExeption if something goes wrong.
900      */

901
902     public String JavaDoc setBodyTitle(CmsObject cms, CmsXmlLanguageFile lang, Hashtable JavaDoc parameters) throws CmsException {
903         I_CmsSession session = CmsXmlTemplateLoader.getSession(cms.getRequestContext(), true);
904         String JavaDoc title = (String JavaDoc)session.getValue("te_oldbodytitle");
905         return CmsEncoder.escapeXml(title);
906     }
907     
908     public Object JavaDoc getCharset(CmsObject cms, String JavaDoc tagcontent, A_CmsXmlContent doc, Object JavaDoc userObj) {
909         // Try to find property on file and all parent folders
910
String JavaDoc prop = null;
911         try {
912             I_CmsSession session = CmsXmlTemplateLoader.getSession(cms.getRequestContext(), true);
913             String JavaDoc file = (String JavaDoc)session.getValue("te_file");
914             prop = cms.readProperty(file, CmsPropertyDefinition.PROPERTY_CONTENT_ENCODING);
915             while ((prop == null) && (! "".equals(file))) {
916                 file = file.substring(0, file.lastIndexOf("/"));
917                 prop = cms.readProperty(file + "/", CmsPropertyDefinition.PROPERTY_CONTENT_ENCODING);
918             }
919         } catch (Exception JavaDoc e) {}
920         if (prop == null) prop = OpenCms.getSystemInfo().getDefaultEncoding();
921         return prop;
922     }
923     
924     public Object JavaDoc setText(CmsObject cms, String JavaDoc tagcontent, A_CmsXmlContent doc, Object JavaDoc userObj) throws CmsException {
925         Hashtable JavaDoc parameters = (Hashtable JavaDoc)userObj;
926
927         String JavaDoc content = (String JavaDoc)parameters.get(CmsWorkplaceDefault.C_PARA_CONTENT);
928         boolean existsContentParam = (content != null && (!"".equals(content)));
929
930         // Check the existance of the "file" parameter
931
if(!existsContentParam) {
932             if(CmsLog.getLog(this).isWarnEnabled() ) {
933                 CmsLog.getLog(this).warn("No content found");
934             }
935             content = "";
936         }
937
938         // Escape the text for including it in HTML text
939
return content;
940     }
941
942     /**
943      * Pre-Sets the value of the title input field.
944      * This method is directly called by the content definiton.
945      * @param Cms The CmsObject.
946      * @param lang The language file.
947      * @param parameters User parameters.
948      * @return Value that is pre-set into the title field.
949      * @throws CmsExeption if something goes wrong.
950      */

951
952     public String JavaDoc setTitle(CmsObject cms, CmsXmlLanguageFile lang,
953             Hashtable JavaDoc parameters) throws CmsException {
954         I_CmsSession session = CmsXmlTemplateLoader.getSession(cms.getRequestContext(), true);
955         String JavaDoc name = (String JavaDoc)session.getValue("te_title");
956         return CmsEncoder.escapeXml(name);
957     }
958 }
959
Popular Tags