001 package org.mactor.extensions.xml;
002
003 import java.io.File;
004 import java.io.IOException;
005 import java.io.StringReader;
006 import java.util.List;
007
008 import javax.xml.XMLConstants;
009 import javax.xml.transform.stream.StreamSource;
010 import javax.xml.validation.Schema;
011 import javax.xml.validation.SchemaFactory;
012 import javax.xml.validation.Validator;
013
014 import org.apache.log4j.Logger;
015 import org.mactor.brokers.Message;
016 import org.mactor.framework.ConfigException;
017 import org.mactor.framework.MactorException;
018 import org.mactor.framework.TestContext;
019 import org.mactor.framework.extensioninterface.ActionCommand;
020 import org.mactor.framework.spec.ProjectContext;
021 import org.xml.sax.SAXException;
022
023 public class AssertXmlValid implements ActionCommand {
024 private static Logger log = Logger.getLogger(AssertXmlValid.class);
025 public void perform(TestContext context, List<String> params) throws MactorException {
026 if (params.size() != 1)
027 throw new ConfigException("Invalid testspec. One parameter expected: [<the relative path to the XML schema that should be used to validate the last received message>]>");
028 Message last = context.getLastIncomingMessage();
029 if (last == null)
030 throw new MactorException("There is no incoming message to validate");
031 log.debug("AssertXmlValid:'" + params.get(0) + "'");
032 validateMessage(last, params.get(0));
033 }
034 public void validateMessage(Message message, String schemaPath) throws MactorException {
035 Validator v = getSchema(schemaPath).newValidator();
036 try {
037 v.validate(new StreamSource(new StringReader(message.getContent())));
038 } catch (IOException ioe) {
039 throw new RuntimeException("Unable to read the last received message. Error:" + ioe.getMessage(), ioe);
040 } catch (SAXException se) {
041 throw new MactorException("The message is not valid according to the '" + schemaPath + "' schema. Details:" + se.getMessage(), se);
042 }
043 }
044 private Schema getSchema(String schemaPath) throws MactorException {
045 File absoluteShemaPath = ProjectContext.getGlobalInstance().getAbsolutePath(schemaPath);
046 if (!absoluteShemaPath.exists())
047 throw new ConfigException("The specifed XML schema '" + absoluteShemaPath.getAbsolutePath() + "' does not exist");
048 final String sl = XMLConstants.W3C_XML_SCHEMA_NS_URI;
049 SchemaFactory factory = SchemaFactory.newInstance(sl);
050 try {
051 return factory.newSchema(absoluteShemaPath);
052 } catch (SAXException se) {
053 throw new ConfigException("The specifed XML schema '" + absoluteShemaPath.getAbsolutePath() + "' could not be loaded. Problem:" + se.getMessage(), se);
054 }
055 }
056 }