blob: d7006acb5057cfa048636bbaaf503925fe7542ab [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*
* @version $Id$
*/
importPackage(org.apache.cocoon.forms.formmodel);
cocoon.load("resource://org/apache/cocoon/forms/flow/javascript/Form.js");
function binding_gui(form) {
editor_gui(form, "binding");
}
function model_gui(form) {
editor_gui(form, "model");
}
function sitemap_gui(form) {
editor_gui(form, "sitemap");
}
function template_gui(form) {
editor_gui(form, "template");
}
function xreport_gui(form) {
editor_gui(form, "xreport");
}
function editor_gui(form, type) {
var locale = determineLocale();
var model = form.getModel();
form.locale = locale;
// get the documentURI parameter from the sitemap which
// contains the location of the file to be edited
var documentURI = cocoon.parameters["documentURI"];
// Yes, this is a hack, but it closes
// the read-any-file security hole so
// that this can work out-of-the-box.
var allowed_files = [
"report1.xml", "sitemap.xmap",
"form_model_gui_binding.xml", "form_model_gui_data.xml",
"form_model_gui_template_data.xml",
"sample_form_1.xml", "sample_form_1_template.xml",
"sample_form_2.xml", "sample_form_2_template.xml"
];
if (!present(documentURI, allowed_files)) {
cocoon.sendPage(type + "-error-pipeline");
return;
}
// prepend data directory
documentURI = "data/" + documentURI;
// parse the document to a DOM-tree
var document = loadDocument(documentURI);
// bind the document data to the form
form.load(document);
// show the form
form.showForm(type + "-display-pipeline");
print("submitId = " + form.submitId);
if (form.isValid) {
print("Form is valid");
} else {
print("Form is not valid");
}
// Clear the old document
clean_node(document);
// bind the form's data back to the document
form.save(document);
// save the DOM-tree back to an XML file, the makeTargetURI
// function makes a modified filename so that the
// original document is not overwritten
saveDocument(document, makeTargetURI(documentURI));
// also store the form as a request attribute as the XSP isn't flow-aware
cocoon.request.setAttribute("form_" + type + "_gui", form.getWidget());
cocoon.sendPage(type + "-success-pipeline.jx");
}
function present(string, list) {
for (var i = 0; i < list.length; i++)
if (string == list[i]) return true;
return false;
}
function clean_node(node) {
var child = node.getFirstChild();
while(child != null) {
var type = child.getNodeType();
var next = child.getNextSibling();
//if(type == org.w3c.dom.Node.COMMENT_NODE) node.removeChild(child);
if(type == org.w3c.dom.Node.TEXT_NODE) node.removeChild(child);
if(type == org.w3c.dom.Node.ELEMENT_NODE) clean_node(child);
if(type == org.w3c.dom.Node.DOCUMENT_NODE) clean_node(child);
child = next;
}
}
function determineLocale() {
var localeParam = cocoon.request.get("locale");
if (localeParam != null && localeParam.length > 0) {
return Packages.org.apache.cocoon.i18n.I18nUtils.parseLocale(localeParam);
}
return null;
}
/**
* Translate source path into target path so we keep a clean source XML.
*/
function makeTargetURI(path) {
var sfx = ".xml";
var newSfx = "-result.xml";
var newPath = path;
if (path.match(/^.*\.xml$/)) {
newPath = path.substring(0, path.length - ".xml".length);
}
return newPath + newSfx;
}
function loadDocument(uri) {
var parser = null;
var source = null;
var resolver = null;
try {
parser = cocoon.getComponent(Packages.org.apache.excalibur.xml.dom.DOMParser.ROLE);
resolver = cocoon.getComponent(Packages.org.apache.cocoon.environment.SourceResolver.ROLE);
source = resolver.resolveURI(uri);
var is = new Packages.org.xml.sax.InputSource(source.getInputStream());
is.setSystemId(source.getURI());
return parser.parseDocument(is);
} finally {
if (source != null)
resolver.release(source);
cocoon.releaseComponent(parser);
cocoon.releaseComponent(resolver);
}
}
function saveDocument(document, uri) {
var source = null;
var resolver = null;
var outputStream = null;
try {
resolver = cocoon.getComponent(Packages.org.apache.cocoon.environment.SourceResolver.ROLE);
source = resolver.resolveURI(uri);
var tf = Packages.javax.xml.transform.TransformerFactory.newInstance();
if (source instanceof Packages.org.apache.excalibur.source.ModifiableSource
&& tf.getFeature(Packages.javax.xml.transform.sax.SAXTransformerFactory.FEATURE)) {
outputStream = source.getOutputStream();
var transformerHandler = tf.newTransformerHandler();
var transformer = transformerHandler.getTransformer();
transformer.setOutputProperty(Packages.javax.xml.transform.OutputKeys.INDENT, "true");
transformer.setOutputProperty(Packages.javax.xml.transform.OutputKeys.METHOD, "xml");
transformerHandler.setResult(new Packages.javax.xml.transform.stream.StreamResult(outputStream));
var streamer = new Packages.org.apache.cocoon.xml.dom.DOMStreamer(transformerHandler);
streamer.stream(document);
} else {
throw new Packages.org.apache.cocoon.ProcessingException("Cannot write to source " + uri);
}
} finally {
if (source != null)
resolver.release(source);
cocoon.releaseComponent(resolver);
if (outputStream != null) {
try {
outputStream.flush();
outputStream.close();
} catch (error) {
cocoon.log.error("Could not flush/close outputstream: " + error);
}
}
}
}