public TemplateModel get(String key) throws TemplateModelException { if (size() == 1) { NodeModel nm = (NodeModel) get(0); return nm.get(key); } if (key.startsWith("@@") && (key.equals("@@markup") || key.equals("@@nested_markup") || key.equals("@@text"))) { StringBuffer result = new StringBuffer(); for (int i = 0; i < size(); i++) { NodeModel nm = (NodeModel) get(i); TemplateScalarModel textModel = (TemplateScalarModel) nm.get(key); result.append(textModel.getAsString()); } return new SimpleScalar(result.toString()); } if (StringUtil.isXMLID(key) || ((key.startsWith("@") && StringUtil.isXMLID(key.substring(1)))) || key.equals("*") || key.equals("**") || key.equals("@@") || key.equals("@*")) { NodeListModel result = new NodeListModel(contextNode); for (int i = 0; i < size(); i++) { NodeModel nm = (NodeModel) get(i); if (nm instanceof ElementModel) { TemplateSequenceModel tsm = (TemplateSequenceModel) ((ElementModel) nm).get(key); if (tsm != null) { int size = tsm.size(); for (int j = 0; j < size; j++) { result.add(tsm.get(j)); } } } } if (result.size() == 1) { return result.get(0); } return result; } XPathSupport xps = getXPathSupport(); if (xps != null) { Object context = (size() == 0) ? null : rawNodeList(); return xps.executeQuery(context, key); } throw new TemplateModelException( "Key: '" + key + "' is not legal for a node sequence (" + this.getClass().getName() + "). This node sequence contains " + size() + " node(s). " + "Some keys are valid only for node sequences of size 1. " + "If you use Xalan (instead of Jaxen), XPath expression keys work only with " + "node lists of size 1."); }
public static void main(String[] args) throws Exception { /* You should do this ONLY ONCE in the whole application life-cycle: */ /* Create and adjust the configuration singleton */ Configuration cfg = new Configuration(Configuration.VERSION_2_3_22); cfg.setDirectoryForTemplateLoading(new File("/Users/ian.goldsmith/projects/freemarker")); cfg.setDefaultEncoding("UTF-8"); cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER); /* * You usually do these for MULTIPLE TIMES in the application * life-cycle: */ /* Create a data-model */ Map message = new HashMap(); message.put( "contentAsXml", freemarker.ext.dom.NodeModel.parse( new File("/Users/ian.goldsmith/projects/freemarker/test.xml"))); Map root = new HashMap(); root.put("message", message); /* Get the template (uses cache internally) */ Template temp = cfg.getTemplate("testxml.ftl"); /* Merge data-model with template */ Writer out = new OutputStreamWriter(System.out); temp.process(root, out); // Note: Depending on what `out` is, you may need to call `out.close()`. // This is usually the case for file output, but not for servlet output. }
/** * Constructor * * @throws ParserConfigurationException * @throws SAXException * @throws IOExeption si no puede leer fichero properties */ public GeneradorHtml() { try { java.io.InputStream is = this.getClass().getResourceAsStream("/entregar.properties"); if (is != null) props.load(is); File templates = new File(props.getProperty("carpeta.templates")); if (!templates.exists()) logger.debug("la carptea de templates no existe.... imposible crear los htmls"); cfg.setDirectoryForTemplateLoading(templates); root.put("noframesmensaje", "Esta página utiliza frames pero su navegador no los soporta"); root.put("enlaceCabecera", "Enlace con Cabecera"); root.put("enlaceMenu", "Enlace con Menu"); root.put("enlaceContenido", "Enlace con Contenido"); root.put("enlace", "Enlace con pagina"); root.put("redes", "red.es"); root.put("comunidad", "Comunidad de Madrid"); root.put("contenido", "Contenido"); root.put("contenidoPrincipal", "Contenido Principal"); root.put("salir", "Cerrar Ventana"); root.put("siguiente", "Ver Siguiente"); root.put("anterior", "Ver Anterior"); root.put("infSiguiente", "Informe Siguiente"); root.put("infAnterior", "Informe Anterior"); NodeModel.useDefaultXPathSupport(); cfg.setObjectWrapper(new DefaultObjectWrapper()); } catch (Exception e) { logger.error("No se pudo cargar el fichero properties"); } }
XPathSupport getXPathSupport() throws TemplateModelException { if (xpathSupport == null) { if (contextNode != null) { xpathSupport = contextNode.getXPathSupport(); } else if (size() > 0) { xpathSupport = ((NodeModel) get(0)).getXPathSupport(); } } return xpathSupport; }
public NodeModel getXmlNodeModel() { NodeModel nodeModel = null; try { nodeModel = NodeModel.parse(new InputSource(new StringReader(getXml()))); } catch (Throwable err) { logger.error(err); } return nodeModel; }
/** * método que permite verificar si el ODE tiene metadatos.. ya sea integrados en el manifest o * externos al mismo. * * @return String con tres posibles valores * <ul> * <li>null . - si el ODE no tiene metadatos * <li>vacio . - si el ODE tiene metadatos integrados en el manifest * <li>path al metadato. - si el ODE tiene metadatos externos que sean lomes validos </ul */ private String chequearLomes() throws Exception { String resultado = null; List listaLomes = new ArrayList(); Node nodo = modelo.getNode().getChildNodes().item(0); NodeModel.simplify(nodo); boolean terminado = false; NodeList hijos = nodo.getChildNodes(); for (int i = 0; i < hijos.getLength() && !terminado; i++) { Node child = hijos.item(i); if (child.getLocalName() != null && child.getLocalName().equals("metadata")) { NodeList hijos2 = child.getChildNodes(); for (int j = 0; j < hijos2.getLength() && !terminado; j++) { Node child2 = hijos2.item(j); if (child2.getLocalName() != null && child2.getLocalName().equals("lom")) { resultado = ""; terminado = true; } if (child2.getLocalName() != null && child2.getLocalName().equals("location")) { listaLomes.add(child2.getFirstChild().getNodeValue()); } } } // metadata } if (resultado == null && listaLomes.size() > 0) { // busco en la lista de nodos externos al primero que sea lomes boolean encontrado = false; for (Iterator iter = listaLomes.iterator(); iter.hasNext() && !encontrado; ) { String path = (String) iter.next(); if (chequearTipoLomesExterno(path)) { resultado = path; encontrado = true; } } } return resultado; }
static void setFreeMarkerXPathEngine(String xpathEngine) throws IllegalConfigurationException { if (xpathEngine.equals(Engine.XPATH_ENGINE_DONT_SET)) {; // do nothing } else if (xpathEngine.equals(Engine.XPATH_ENGINE_DEFAULT)) { NodeModel.useDefaultXPathSupport(); } else if (xpathEngine.equals(Engine.XPATH_ENGINE_XALAN)) { try { NodeModel.useXalanXPathSupport(); } catch (Exception e) { throw new IllegalConfigurationException("Failed to use Xalan XPath engine.", e); } } else if (xpathEngine.equals(Engine.XPATH_ENGINE_JAXEN)) { try { NodeModel.useJaxenXPathSupport(); } catch (Exception e) { throw new IllegalConfigurationException("Failed to use Jaxen XPath engine.", e); } } else { Class cl; try { cl = MiscUtil.classForName(xpathEngine); } catch (ClassNotFoundException e) { throw new IllegalConfigurationException( "Custom XPath engine adapter class " + StringUtil.jQuote(xpathEngine) + " not found. " + "Note that the reserved names are: " + StringUtil.jQuote(Engine.XPATH_ENGINE_DONT_SET) + ", " + StringUtil.jQuote(Engine.XPATH_ENGINE_DEFAULT) + ", " + StringUtil.jQuote(Engine.XPATH_ENGINE_XALAN) + ", " + StringUtil.jQuote(Engine.XPATH_ENGINE_JAXEN) + ".", e); } NodeModel.setXPathSupportClass(cl); } }
/** * metodo que permite verificar si un fichero lomes externo es un fichero lomes * * @param lomesExterno path al fichero xml con los metadatos * @return * <ul> * <li>true .- si es un lomes * <li>false.- si no es un lomes * </ul> */ private boolean chequearTipoLomesExterno(String lomesExterno) throws Exception { boolean resultado = false; NodeModel modeloExterno = null; try { modeloExterno = NodeModel.parse(new File(pathOde + "/" + lomesExterno)); Node nodo = modeloExterno.getNode().getChildNodes().item(0); if (nodo != null && nodo.getNamespaceURI() != null && nodo.getNamespaceURI().equals("http://ltsc.ieee.org/xsd/LOM")) { resultado = true; } } catch (Exception e) { if (logger.isDebugEnabled()) { logger.debug( "Error en GeneradorHTML:chequearTipoLomesExterno .. problemas al leer fichero lomes externo: " + e.getMessage()); } throw e; } return resultado; }
/** * Método público que permite generar fichero de metadatos en carpeta separada. Comprueba si el * fichero manifest tiene un lomes integrado o un metadato externo. si el ODE no tiene metadatos.. * no genera nada * * @param pathOde path del ODE que se desea exportar * @param dirDestino directorio donde se va a copiar la catalogacion lomes * @param subdirDestino target subdirectory * @throws Exception */ public void obtenerLOMES( String pathOde, String dirDestino, String subdirDestino, String lomFileName) throws Exception { this.pathOde = pathOde; this.dirDestino = dirDestino; crearCarpeta(dirDestino + File.separator + subdirDestino); modelo = NodeModel.parse(new File(pathOde + MANIFEST)); root.put("doc", modelo); pathLomesExterno = chequearLomes(); obtenerLOMES(subdirDestino + File.separator + lomFileName); }
/** * metodo que permite generar los ficheros html necesarios para visualizar el ODE como html * * @param pathOde path donde se encuentra el ODE que se desea exportar * @param dirDestino directorio donde se van a generar los ficheros html * @throws Exception */ public void generarFrames(String pathOde, String dirDestino) throws Exception { this.pathOde = pathOde; this.dirDestino = dirDestino; crearCarpeta(dirDestino + "/contenido"); try { modelo = NodeModel.parse(new File(pathOde + MANIFEST)); pathLomesExterno = chequearLomes(); generarBlanco(); generarContenidoFrame(); generarContenidoIndex(); generarMenu(); generarCabecera(); generarIndex(); } catch (Exception e) { if (logger.isDebugEnabled()) { logger.debug("Error en GeneradorHTML:generarFrames .. " + e.getMessage()); } throw new Exception(e); } }
/** * Método para generar fichero menu.html * * @throws Exception */ private void generarMenu() throws Exception { FileOutputStream fo = null; Writer out = null; File index = null; Template temp; try { modelo = NodeModel.parse(new File(pathOde + MANIFEST)); root.put("doc", modelo); temp = cfg.getTemplate("menuXML.ftl"); index = new File(dirDestino + "/contenido/menu.html"); boolean creado = index.createNewFile(); if (creado) { fo = new FileOutputStream(index); out = new OutputStreamWriter(fo); temp.process(root, out); out.flush(); } } catch (Exception e) { if (logger.isDebugEnabled()) { logger.debug("Error en GeneradorHTML:generarMenu .. " + e.getMessage()); } throw e; } finally { index = null; if (fo != null) { try { fo.close(); out.close(); } catch (IOException e) { } } } }
NodeListModel(Node node) { this(NodeModel.wrap(node)); }
public TemplateModel wrap(Object obj) { if (obj instanceof NodeModel) { return (NodeModel) obj; } return NodeModel.wrap((Node) obj); }
/** * Método que devuelve el título de ode en caso que existiera.. busca el título en el lomes * integrado en el manifest o en algun lomes externo si lo tuviera. * * @return String con el título del ode */ private String obtenerTitulo() throws Exception { String resultado = ""; if (pathLomesExterno == null) return resultado; boolean terminado = false; if (pathLomesExterno.equals("")) { Node nodo = modelo.getNode().getChildNodes().item(0); NodeModel.simplify(nodo); NodeList hijos = nodo.getChildNodes(); for (int i = 0; i < hijos.getLength() && !terminado; i++) { Node child = hijos.item(i); if (child.getLocalName() != null && child.getLocalName().equals("metadata")) { NodeList hijos2 = child.getChildNodes(); for (int j = 0; j < hijos2.getLength() && !terminado; j++) { Node child2 = hijos2.item(j); if (child2.getLocalName() != null && child2.getLocalName().equals("lom")) { NodeList hijos3 = child2.getChildNodes(); for (int k = 0; k < hijos3.getLength() && !terminado; k++) { Node child3 = hijos3.item(k); if (child3.getLocalName() != null && child3.getLocalName().equals("general")) { NodeList hijos4 = child3.getChildNodes(); for (int l = 0; l < hijos4.getLength() && !terminado; l++) { Node child4 = hijos4.item(l); if (child4.getLocalName() != null && child4.getLocalName().equals("title")) { NodeList hijos5 = child4.getChildNodes(); for (int ll = 0; ll < hijos5.getLength() && !terminado; ll++) { Node child5 = hijos5.item(ll); if (child5.getLocalName() != null && child5.getLocalName().equals("string")) { resultado = child5.getFirstChild().getNodeValue(); terminado = true; } } } } } } } } } // metadata } } else { NodeModel modeloExterno = null; try { modeloExterno = NodeModel.parse(new File(pathOde + "/" + pathLomesExterno)); Node nodo = modeloExterno.getNode().getChildNodes().item(0); NodeModel.simplify(nodo); NodeList hijos = nodo.getChildNodes(); for (int i = 0; i < hijos.getLength() && !terminado; i++) { Node child = hijos.item(i); if (child.getLocalName() != null && child.getLocalName().equals("general")) { NodeList hijos2 = child.getChildNodes(); for (int j = 0; j < hijos2.getLength() && !terminado; j++) { Node child2 = hijos2.item(j); if (child2.getLocalName() != null && child2.getLocalName().equals("title")) { NodeList hijos3 = child2.getChildNodes(); for (int k = 0; k < hijos3.getLength() && !terminado; k++) { Node child3 = hijos3.item(k); if (child3.getLocalName() != null && child3.getLocalName().equals("string")) { resultado = child3.getFirstChild().getNodeValue(); terminado = true; } } } } } // metadata } } catch (Exception e) { if (logger.isDebugEnabled()) { logger.debug("Error en GeneradorHTML:obtenerTitulo .. " + e.getMessage()); } throw e; } } return resultado; }