/* * JBoss, Home of Professional Open Source. * Copyright 2006, Red Hat Middleware LLC, and individual contributors * as indicated by the @author tags. See the copyright.txt file in the * distribution for a full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.deployment; import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.net.URL; import java.util.ArrayList; import java.util.Iterator; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.jboss.system.server.ServerConfig; import org.jboss.util.StringPropertyReplacer; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.InputSource; /** * Static helper methods for NetBoot features * * @see org.jboss.deployment.NetBootFile * @see org.jboss.deployment.SARDeployer * @see org.jboss.deployment.scanner.HttpURLDeploymentScanner * * @author Sacha Labourey. * @version $Revision: 57205 $ * *

Revisions: * *

7 novembre 2002 Sacha Labourey: *

*/ public class NetBootHelper { // Constants ----------------------------------------------------- public final static String DEFAULT_NETBOOT_LISTING_URL = "jboss.netboot.listing.url"; // Attributes ---------------------------------------------------- // Static -------------------------------------------------------- protected static org.jboss.logging.Logger log = org.jboss.logging.Logger.getLogger(NetBootHelper.class); protected static boolean traceEnabled = log.isTraceEnabled (); // Constructors -------------------------------------------------- // Public -------------------------------------------------------- public static String buildDownloadUrlForFile (String baseUrl, String directory, String filename) { String part = baseUrl; if (part.charAt (part.length ()-1) != '/') part=part + "/"; part = part + directory; if (part.charAt (part.length ()-1) != '/') part=part + "/"; part = part + filename; return part; } public static String getDefaultDownloadUrl () { return System.getProperty(ServerConfig.SERVER_HOME_URL); } public static String getDefaultListUrl () throws IllegalStateException { String defaultUrl = System.getProperty (NetBootHelper.DEFAULT_NETBOOT_LISTING_URL); if (defaultUrl == null) { // No default listing URL is provided! // We have a defaulting mode that can be used: if, on the server side, // the JBossWeb NetBoot war is used, we can automatically use it // The jboss.netboot.use.jbossweb System property can be set to false to // disable this automatic behaviour // String autofallback = System.getProperty ("jboss.netboot.use.jbossweb"); if (autofallback == null || !autofallback.equalsIgnoreCase ("false")) { if (traceEnabled) log.trace ("jboss.netboot.use.jbossweb not defined but fallback activated..."); defaultUrl = System.getProperty(ServerConfig.HOME_URL); int cropSize = defaultUrl.length (); if (defaultUrl.endsWith ("/files")) cropSize-= "/files".length () - 1; else if (defaultUrl.endsWith ("/files/")) cropSize-= "/files/".length () - 1; else throw new IllegalStateException ("No wildcard permitted in non-file URL deployment when jboss.netboot.listing.url not defined. " + "You must either use the JBossWeb NetBoot WAR extension, specify individual jars" + ", use the URL:* notation or specify the jboss.netboot.listing.url system property"); defaultUrl = System.getProperty(ServerConfig.HOME_URL).substring (0, cropSize) + "List?"; if (traceEnabled) log.trace ("...using: " + defaultUrl); } else { if (traceEnabled) log.trace ("jboss.netboot.use.jbossweb not defined and fallback explicitly deactivated"); throw new IllegalStateException ("No wildcard permitted in non-file URL deployment when jboss.netboot.listing.url not defined. " + "You must either specify individual jars" + ", use the URL:* notation or specify the jboss.netboot.listing.url system property"); } } return StringPropertyReplacer.replaceProperties (defaultUrl); } public static String buildListUrlForFolder (String baseUrl, String directory) throws IllegalStateException, UnsupportedEncodingException { String listUrl = null; if (baseUrl == null || "".equals (baseUrl)) { // If not supplied, we provide the default URL // listUrl = getDefaultListUrl (); } else { listUrl = baseUrl; } return listUrl + "dir=" + java.net.URLEncoder.encode (directory, "UTF-8"); } public static NetBootFile[] listAllFromDirectory (String lister) throws Exception { return listAllFromDirectory (lister, true, true); } public static NetBootFile[] listFilesFromDirectory (String lister) throws Exception { return listAllFromDirectory (lister, false, true); } public static NetBootFile[] listDirectoriesFromDirectory (String lister) throws Exception { return listAllFromDirectory (lister, true, false); } // Z implementation ---------------------------------------------- // Y overrides --------------------------------------------------- // Package protected --------------------------------------------- // Protected ----------------------------------------------------- /** * * The is expected document we should receive in result: * * * * * * * * * In this case we are only interested in file, not directories * */ protected static NetBootFile[] listAllFromDirectory (String lister, boolean doDir, boolean doFiles) throws Exception { if (traceEnabled) log.trace ("Getting directory listing from: " + lister); ArrayList result = new ArrayList(); // We now download the XML description from the remote URL // InputStream stream = new URL (lister).openStream (); InputSource is = new InputSource(stream); DocumentBuilder parser = DocumentBuilderFactory.newInstance().newDocumentBuilder(); org.w3c.dom.Document doc = parser.parse(is); if (doFiles) { Iterator dirContentIter = getChildrenByTagName(doc.getDocumentElement(), "file"); while (dirContentIter.hasNext ()) { Element item = (Element)dirContentIter.next(); String name = getUniqueChild (item, "name").getFirstChild().getNodeValue(); long lastModified = Long.parseLong(getUniqueChild (item, "modified").getFirstChild().getNodeValue()); long size = Long.parseLong(getUniqueChild (item, "size").getFirstChild().getNodeValue()); result.add (new NetBootFile (name, size, lastModified, false, lister)); } } if (doFiles) { Iterator dirContentIter = getChildrenByTagName(doc.getDocumentElement(), "directory"); while (dirContentIter.hasNext ()) { Element item = (Element)dirContentIter.next(); String name = getUniqueChild (item, "name").getFirstChild().getNodeValue(); long lastModified = Long.parseLong(getUniqueChild (item, "modified").getFirstChild().getNodeValue()); long size = Long.parseLong(getUniqueChild (item, "size").getFirstChild().getNodeValue()); result.add (new NetBootFile (name, size, lastModified, true, lister)); } } return (NetBootFile[]) result.toArray (new NetBootFile[] {}); } /** * from org.jboss.metadata.MetaData which is not in the System module * (which is understandable) */ protected static Element getUniqueChild(Element element, String tagName) throws DeploymentException { Iterator goodChildren = getChildrenByTagName(element, tagName); if (goodChildren != null && goodChildren.hasNext()) { Element child = (Element)goodChildren.next(); if (goodChildren.hasNext()) { throw new DeploymentException ("expected only one " + tagName + " tag"); } return child; } else { throw new DeploymentException ("expected one " + tagName + " tag"); } } protected static Iterator getChildrenByTagName(Element element, String tagName) { if (element == null) return null; // getElementsByTagName gives the corresponding elements in the whole // descendance. We want only children NodeList children = element.getChildNodes(); ArrayList goodChildren = new ArrayList(); for (int i=0; i