Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package smc.plugin.form;
- import java.io.File;
- import java.util.HashMap;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- import org.w3c.dom.Document;
- import org.w3c.dom.Element;
- import org.w3c.dom.NodeList;
- import smc.broker.plugin.IVersionablePO;
- import smc.broker.plugin.PluginObjectFactory;
- import smc.broker.util.BrokerContext;
- import smc.broker.util.FolderUtils;
- import smc.transform.core.ClassBasedTrafo;
- import smc.transform.core.Plugin;
- import smc.transform.core.PluginException;
- import smc.util.Constants;
- import smc.util.Context;
- import smc.util.XMLHandler;
- import smc.xml.xpath.XPath;
- public class ProcessFieldDocuments implements ClassBasedTrafo {
- private static final Logger log = LoggerFactory
- .getLogger(ProcessFieldDocuments.class);
- public Document getDocument(Document sourceDoc,
- HashMap<String, String> params, Context context)
- throws PluginException {
- HashMap<String, String> trafos = new HashMap<String, String>();
- String language = params.get("language");
- String objType = params.get("objType");
- String uri = params.get("uri");
- String field2doc = "form.field2doc.xml";
- log.info("URI: "+uri);
- //filter object type to get document from form.project only
- if (objType.equals("form.project")) {
- BrokerContext bcontext = (BrokerContext) context;
- Plugin docPlugin = bcontext.getTransformerRepository().getPlugin("form");
- String path = new StringBuilder().append(docPlugin.getLocation()).append(File.separatorChar)
- .append("config").append(File.separatorChar).append(field2doc).toString();
- log.info("fileLocation: " + path);
- try {
- //get the fields we need documents
- Document doc = XMLHandler.readDocument(path);
- if(doc!=null){
- loadFieldsTrafo(doc, trafos);
- // get all fields from document
- NodeList fieldList = XPath.selectNodeList(sourceDoc,
- "/Note/Field");
- for (int i = 0; i < fieldList.getLength(); i++) {
- Element fieldElem = (Element)fieldList.item(i);
- String fieldName = fieldElem.getAttribute("name");
- if(trafos.containsKey(fieldName)){
- applyTrafo(fieldElem, trafos, uri, bcontext, language);
- }
- }
- }
- } catch (Exception e) {
- log.error("Error generating ACL", e);
- }
- }
- return sourceDoc;
- }
- private void loadFieldsTrafo(Document doc, HashMap<String, String>trafos) {
- NodeList fieldList = XPath.selectNodeList(doc,
- "/Fields/Field");
- for (int i = 0; i < fieldList.getLength(); i++) {
- Element field = (Element)fieldList.item(i);
- String fieldName = field.getAttribute("name");
- String fieldTrafo = field.getAttribute("trafo");
- trafos.put(fieldName, fieldTrafo);
- }
- }
- private void applyTrafo(Element fieldElem, HashMap<String, String> trafos, String uri, BrokerContext bcontext, String language) {
- //log.info("TRAFO: "+trafos.get(docName));
- String docName = fieldElem.getAttribute("name");
- String trafoName = trafos.get(docName);
- //get name's folder, it matches with form's name
- String folderName = uri.substring(uri.lastIndexOf("/") + 1, uri.lastIndexOf("."));
- //the folder should be at the same level than the form
- String folderPath = uri.substring(0, uri.lastIndexOf("/")+1)+folderName;
- //the document's name matches with field's name. There should be one document for each
- //field set up in fielWithDoc
- String docUri = folderPath+"/"+docName+".theme";
- try {
- //check and create folders if they don't exist
- //The foldes has the same name that the form
- FolderUtils.mkFolders(folderPath, bcontext.getDataAPI(), bcontext.getCredentials());
- IVersionablePO po = PluginObjectFactory.getFileBasedPluginObject(Constants.OBJECT_TYPE_DOCUMENT, bcontext);
- if (!po.existsObject(folderPath, docName)){
- po.createObject(folderPath, docName, language, true);
- }
- Document contentDoc = po.transform(XMLHandler.createDocument(fieldElem), language, trafoName, null);
- po.save(docUri, language, contentDoc);
- } catch (Exception e) {
- log.error("Problem creating/updating document", e);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement