blob: f1de9168af0154b39c30586f8b76ce5187674e84 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2001, 2005 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.j2ee.commonarchivecore.internal;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.eclipse.emf.common.command.AbstractCommand;
import org.eclipse.emf.common.command.Command;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.jst.j2ee.internal.xml.CollectingErrorHandler;
import org.eclipse.jst.j2ee.internal.xml.XmlDocumentReader;
import org.xml.sax.InputSource;
/**
* Insert the type's description here. Creation date: (03/19/01 10:04:08 AM)
*
* @author: Administrator
*/
public class ValidateXmlCommand extends AbstractCommand {
protected List results;
protected ModuleFile archive;
public boolean validateNested = true;
/**
* ValidateXmlCommand constructor comment.
*/
protected ValidateXmlCommand() {
super();
}
/**
* ValidateXmlCommand constructor comment.
*
* @param label
* java.lang.String
* @param description
* java.lang.String
*/
public ValidateXmlCommand(ModuleFile m) {
super();
archive = m;
}
/**
* ValidateXmlCommand constructor comment.
*
* @param label
* java.lang.String
*/
protected ValidateXmlCommand(String label) {
super(label);
}
/**
* ValidateXmlCommand constructor comment.
*
* @param label
* java.lang.String
* @param description
* java.lang.String
*/
protected ValidateXmlCommand(String label, String description) {
super(label, description);
}
/**
* @see Command
*/
public void execute() {
results = new ArrayList();
validatateXml();
if (isValidateNested()) {
List archives = archive.getArchiveFiles();
for (int i = 0; i < archives.size(); i++) {
Archive a = (Archive) archives.get(i);
if (!a.isModuleFile())
continue;
ModuleFile m = (ModuleFile) a;
ValidateXmlCommand cmd = new ValidateXmlCommand(m);
cmd.execute();
results.addAll(cmd.getResult());
}
}
}
/**
* @return List of XmlValidationResult; 1 for the archive, and one for each nested module file
*/
public Collection getResult() {
return results;
}
/**
* Insert the method's description here. Creation date: (10/22/2001 1:06:52 PM)
*
* @return boolean
*/
public boolean isValidateNested() {
return validateNested;
}
protected boolean prepare() {
return true;
}
/**
* @see Command
*/
public void redo() {
//Default
}
/**
* Insert the method's description here. Creation date: (10/22/2001 1:06:52 PM)
*
* @param newValidateNested
* boolean
*/
public void setValidateNested(boolean newValidateNested) {
validateNested = newValidateNested;
}
protected void validatateXml() {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
Resource res = archive.getStandardDeploymentDescriptor().eResource();
XmlValidationResult result = new XmlValidationResult();
result.setArchive(archive);
try {
res.save(bos, new java.util.HashMap());
} catch (Exception ex) {
throw new org.eclipse.jst.j2ee.commonarchivecore.internal.exception.ArchiveRuntimeException(ex);
}
ByteArrayInputStream inStream = new ByteArrayInputStream(bos.toByteArray());
InputSource source = new InputSource(inStream);
CollectingErrorHandler handler = new CollectingErrorHandler();
XmlDocumentReader parseAdapter = new XmlDocumentReader(source, null, handler);
// the following try/catch clause is added to handle the case
// when SAX parser throws a fatal exception (type SAXException)
// for unmatching end tag that results in a RuntimeException to
// be thrown. Need to catch it so we can get the parser exceptions
// and display them to the user.
try {
parseAdapter.parseDocument();
} catch (RuntimeException re) {
if (handler.getCaughtExceptions() != null) {
result.setArchive(archive);
result.setCaughtExceptions(handler.getCaughtExceptions());
results.add(result);
}
throw re;
}
result.setArchive(archive);
result.setCaughtExceptions(handler.getCaughtExceptions());
results.add(result);
}
}