/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.cxf.tools.common; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.net.URLClassLoader; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import java.util.StringTokenizer; import java.util.jar.Attributes; import java.util.jar.JarFile; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.namespace.QName; import org.apache.cxf.common.util.StringUtils; import org.apache.cxf.helpers.FileUtils; import org.apache.cxf.tools.util.ToolsStaxUtils; import org.apache.ws.commons.schema.constants.Constants; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.ComparisonFailure; import org.junit.Rule; import org.junit.rules.TemporaryFolder; public class ProcessorTestBase extends Assert { public static final List<String> DEFAULT_IGNORE_ATTR = Arrays.asList(new String[]{"attributeFormDefault", "elementFormDefault", "form", "version", "part@name"}); public static final List<String> DEFAULT_IGNORE_TAG = Arrays.asList(new String[]{"sequence"}); //CHECKSTYLE:OFF @Rule public TemporaryFolder tmpDir = new TemporaryFolder() { protected void before() throws Throwable { super.before(); output = tmpDir.getRoot(); env.put(ToolConstants.CFG_OUTPUTDIR, output.getCanonicalPath()); } }; //CHECKSTYLE:ON protected File output; protected ToolContext env = new ToolContext(); protected Map<QName, Set<String>> qnameAtts = new HashMap<>(); public ProcessorTestBase() { addQNameAttribute(new QName(Constants.URI_2001_SCHEMA_XSD, "element"), "type"); } protected final void addQNameAttribute(QName element, String local) { Set<String> a = qnameAtts.get(element); if (a == null) { qnameAtts.put(element, new HashSet<>()); a = qnameAtts.get(element); } a.add(local); } @Before public void setUp() throws Exception { if (System.getProperty("java.version").startsWith("9")) { System.setProperty("org.apache.cxf.common.util.Compiler-fork", "true"); } } @After public void tearDown() { env = null; } protected boolean isMOXy() { try { JAXBContext c = JAXBContext.newInstance(String.class); return c.getClass().getName().contains(".eclipse"); } catch (JAXBException e) { return false; } } protected String getClassPath() throws URISyntaxException, IOException { ClassLoader loader = getClass().getClassLoader(); StringBuilder classPath = new StringBuilder(); if (loader instanceof URLClassLoader) { for (URL url : ((URLClassLoader)loader).getURLs()) { File file = new File(url.toURI()); String filename = file.getAbsolutePath(); if (filename.indexOf("junit") == -1) { classPath.append(filename); classPath.append(System.getProperty("path.separator")); } if (filename.indexOf("surefirebooter") != -1) { //surefire 2.4 uses a MANIFEST classpath that javac doesn't like try (JarFile jar = new JarFile(filename)) { Attributes attr = jar.getManifest().getMainAttributes(); if (attr != null) { String cp = attr.getValue("Class-Path"); while (cp != null) { String fileName = cp; int idx = fileName.indexOf(' '); if (idx != -1) { fileName = fileName.substring(0, idx); cp = cp.substring(idx + 1).trim(); } else { cp = null; } URI uri = new URI(fileName); File f2 = new File(uri); if (f2.exists()) { classPath.append(f2.getAbsolutePath()); classPath.append(System.getProperty("path.separator")); } } } } } } } return classPath.toString(); } protected String getLocation(String wsdlFile) throws URISyntaxException { return getClass().getResource(wsdlFile).toURI().toString(); } protected File getResource(String wsdlFile) throws URISyntaxException { return new File(getClass().getResource(wsdlFile).toURI()); } protected void assertFileEquals(String f1, String f2) { assertFileEquals(new File(f1), new File(f2)); } protected void assertFileEquals(File location1, File location2) { String str1 = FileUtils.getStringFromFile(location1); String str2 = FileUtils.getStringFromFile(location2); StringTokenizer st1 = new StringTokenizer(str1, " \t\n\r\f(),"); StringTokenizer st2 = new StringTokenizer(str2, " \t\n\r\f(),"); // namespace declarations and wsdl message parts can be ordered // differently in the generated wsdl between the ibm and sun jdks. // So, when we encounter a mismatch, put the unmatched token in a // list and check this list when matching subsequent tokens. // It would be much better to do a proper xml comparison. List<String> unmatched = new ArrayList<>(); while (st1.hasMoreTokens()) { String tok1 = st1.nextToken(); String tok2 = null; if (unmatched.contains(tok1)) { unmatched.remove(tok1); continue; } while (st2.hasMoreTokens()) { tok2 = st2.nextToken(); if (tok1.equals(tok2)) { break; } else { unmatched.add(tok2); } } assertEquals("Compare failed " + location1.getAbsolutePath() + " != " + location2.getAbsolutePath(), tok1, tok2); } assertTrue(!st1.hasMoreTokens()); assertTrue(!st2.hasMoreTokens()); assertTrue("Files did not match: " + unmatched, unmatched.isEmpty()); } public String getStringFromFile(File location) { return FileUtils.getStringFromFile(location); } public boolean assertXmlEquals(final File expected, final File source) throws Exception { List<String> attr = Arrays.asList(new String[]{"attributeFormDefault", "elementFormDefault", "form"}); return assertXmlEquals(expected, source, attr); } public boolean assertXmlEquals(final File expected, final File source, final List<String> ignoreAttr) throws Exception { List<Tag> expectedTags = ToolsStaxUtils.getTags(expected); List<Tag> sourceTags = ToolsStaxUtils.getTags(source); Iterator<Tag> iterator = sourceTags.iterator(); for (Tag expectedTag : expectedTags) { Tag sourceTag = iterator.next(); if (!expectedTag.getName().equals(sourceTag.getName())) { throw new ComparisonFailure("Tags not equal: ", expectedTag.getName().toString(), sourceTag.getName().toString()); } for (Map.Entry<QName, String> attr : expectedTag.getAttributes().entrySet()) { if (ignoreAttr.contains(attr.getKey().getLocalPart())) { continue; } if (sourceTag.getAttributes().containsKey(attr.getKey())) { if (!sourceTag.getAttributes().get(attr.getKey()).equals(attr.getValue())) { throw new ComparisonFailure("Attributes not equal: ", attr.getKey() + ":" + attr.getValue(), attr.getKey() + ":" + sourceTag.getAttributes().get(attr.getKey())); } } else { throw new AssertionError("Attribute: " + attr + " is missing in the source file."); } } if (!StringUtils.isEmpty(expectedTag.getText()) && !expectedTag.getText().equals(sourceTag.getText())) { throw new ComparisonFailure("Text not equal: ", expectedTag.getText(), sourceTag.getText()); } } return true; } protected void assertTagEquals(Tag expected, Tag source) { assertTagEquals(expected, source, DEFAULT_IGNORE_ATTR, DEFAULT_IGNORE_TAG); } protected void assertAttributesEquals(QName element, Map<QName, String> q1, Map<QName, String> q2, Collection<String> ignoreAttr) { for (Map.Entry<QName, String> attr : q1.entrySet()) { if (ignoreAttr.contains(attr.getKey().getLocalPart()) || ignoreAttr.contains(element.getLocalPart() + "@" + attr.getKey().getLocalPart())) { continue; } String found = q2.get(attr.getKey()); if (found == null) { throw new AssertionError("Attribute: " + attr.getKey() + " is missing in " + element); } if (!found.equals(attr.getValue())) { throw new ComparisonFailure("Attribute not equal: ", attr.getKey() + ":" + attr.getValue(), attr.getKey() + ":" + found); } } } protected void assertTagEquals(Tag expected, Tag source, final List<String> ignoreAttr, final List<String> ignoreTag) { if (!expected.getName().equals(source.getName())) { throw new ComparisonFailure("Tags not equal: ", expected.getName().toString(), source.getName().toString()); } assertAttributesEquals(expected.getName(), expected.getAttributes(), source.getAttributes(), ignoreAttr); assertAttributesEquals(expected.getName(), source.getAttributes(), expected.getAttributes(), ignoreAttr); if (!StringUtils.isEmpty(expected.getText()) && !expected.getText().equals(source.getText())) { throw new ComparisonFailure("Text not equal: ", expected.getText(), source.getText()); } if (!expected.getTags().isEmpty()) { for (Tag expectedTag : expected.getTags()) { if (ignoreTag.contains(expectedTag.getName().getLocalPart()) && expectedTag.getTags().isEmpty()) { continue; } Tag sourceTag = getFromSource(source, expectedTag); if (sourceTag == null) { throw new AssertionError("\n" + expectedTag.toString() + " is missing in the source file:" + "\n" + source.toString()); } assertTagEquals(expectedTag, sourceTag, ignoreAttr, ignoreTag); } } } private Tag getFromSource(Tag sourceTag, Tag expectedTag) { for (Tag tag : sourceTag.getTags()) { if (tag.equals(expectedTag)) { return tag; } } return null; } public void assertWsdlEquals(final File expected, final File source, List<String> attr, List<String> tag) throws Exception { Tag expectedTag = ToolsStaxUtils.getTagTree(expected, attr, qnameAtts); Tag sourceTag = ToolsStaxUtils.getTagTree(source, attr, qnameAtts); assertTagEquals(expectedTag, sourceTag, attr, tag); } public void assertWsdlEquals(final File expected, final File source) throws Exception { assertWsdlEquals(expected, source, DEFAULT_IGNORE_ATTR, DEFAULT_IGNORE_TAG); } public void assertWsdlEquals(final InputStream expected, final InputStream source, List<String> attr, List<String> tag) throws Exception { Tag expectedTag = ToolsStaxUtils.getTagTree(expected, attr, qnameAtts); Tag sourceTag = ToolsStaxUtils.getTagTree(source, attr, qnameAtts); assertTagEquals(expectedTag, sourceTag, attr, tag); } public void assertWsdlEquals(final InputStream expected, final InputStream source) throws Exception { assertWsdlEquals(expected, source, DEFAULT_IGNORE_ATTR, DEFAULT_IGNORE_TAG); } }