blob: 97aea278c25a74d561eb1f2bd9bfd2383b5e8c18 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2003, 2007 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - Initial API and implementation
*******************************************************************************/
package org.eclipse.jst.server.tomcat.core.internal;
import java.io.ByteArrayInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jst.server.tomcat.core.internal.xml.XMLUtil;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
/**
* Helper class to access a web.xml file.
*/
public class WebAppDocument {
protected boolean isWebAppDirty;
protected Document webAppDocument;
/**
* Loads a web.xml from the given URL.
*
* @param path a path
* @throws Exception if anything goes wrong
*/
public WebAppDocument(IPath path) throws Exception {
webAppDocument = XMLUtil.getDocumentBuilder().parse(new InputSource(new FileInputStream(path.toFile())));
}
/**
* Loads a web.xml from the given resource.
*
* @param file a file
* @throws Exception if anything goes wrong
*/
public WebAppDocument(IFile file) throws Exception {
webAppDocument = XMLUtil.getDocumentBuilder().parse(new InputSource(file.getContents()));
}
/**
* Adds a MimeMapping.
*
* @param index int
* @param map org.eclipse.jst.server.tomcat.IMimeMapping
*/
public void addMimeMapping(int index, IMimeMapping map) {
Trace.trace(Trace.FINER, "Adding mime mapping " + index + " " + map.getMimeType() + " " + map.getExtension());
Element element = webAppDocument.getDocumentElement();
Element mapping = XMLUtil.createChildElement(webAppDocument, element, index, "mime-mapping");
XMLUtil.insertText(webAppDocument, mapping, "\n\t");
XMLUtil.createTextChildElement(webAppDocument, mapping, "extension", map.getExtension());
XMLUtil.insertText(webAppDocument, mapping, "\n\t");
XMLUtil.createTextChildElement(webAppDocument, mapping, "mime-type", map.getMimeType());
XMLUtil.insertText(webAppDocument, mapping, "\n");
isWebAppDirty = true;
}
/**
* Returns a list of MimeMappings.
*
* @return java.util.List
*/
public List getMimeMappings() {
List map = new ArrayList();
Element root = webAppDocument.getDocumentElement();
Iterator iterator = XMLUtil.getNodeIterator(root, "mime-mapping");
while (iterator.hasNext()) {
Element element = (Element) iterator.next();
String mimeType = XMLUtil.getSubNodeValue(element, "mime-type");
String extension = XMLUtil.getSubNodeValue(element, "extension");
MimeMapping mm = new MimeMapping(extension, mimeType);
map.add(mm);
}
return map;
}
/**
* Modifies a mime mapping.
*
* @param index
* @param map
*/
public void modifyMimeMapping(int index, IMimeMapping map) {
Element element = webAppDocument.getDocumentElement();
NodeList list = element.getElementsByTagName("mime-mapping");
Element element2 = (Element) list.item(index);
XMLUtil.setNodeValue(element2.getElementsByTagName("extension").item(0), "extension", map.getExtension());
XMLUtil.setNodeValue(element2.getElementsByTagName("mime-type").item(0), "mime-type", map.getMimeType());
isWebAppDirty = true;
}
/**
* Removes the mime mapping at the specified index.
*
* @param index int
*/
public void removeMimeMapping(int index) {
Element element = webAppDocument.getDocumentElement();
NodeList list = element.getElementsByTagName("mime-mapping");
Node node = list.item(index);
element.removeChild(node);
isWebAppDirty = true;
}
/**
* Saves the Web app document.
*
* @param path a path
* @param forceDirty true to force a save
* @throws IOException if anything goes wrong
*/
public void save(String path, boolean forceDirty) throws IOException {
if (forceDirty || isWebAppDirty)
XMLUtil.save(path, webAppDocument);
}
/**
* Saves the Web app document.
*
* @param file a file
* @param monitor a progress monitor
* @throws Exception if anything goes wrong
*/
public void save(IFile file, IProgressMonitor monitor) throws Exception {
if (file.exists() && !isWebAppDirty)
return;
byte[] data = XMLUtil.getContents(webAppDocument);
InputStream in = null;
try {
in = new ByteArrayInputStream(data);
if (file.exists())
file.setContents(in, true, true, ProgressUtil.getSubMonitorFor(monitor, 200));
else
file.create(in, true, ProgressUtil.getSubMonitorFor(monitor, 200));
} catch (Exception e) {
// ignore
} finally {
try {
in.close();
} catch (Exception e) {
// ignore
}
}
isWebAppDirty = false;
}
}