diff --git a/components/sbm-recipes-jee-to-boot/src/main/java/org/springframework/sbm/jee/ejb/actions/MigrateLocalStatelessSessionBeans.java b/components/sbm-recipes-jee-to-boot/src/main/java/org/springframework/sbm/jee/ejb/actions/MigrateLocalStatelessSessionBeans.java index 63b67bc3e..b0dcbfec9 100644 --- a/components/sbm-recipes-jee-to-boot/src/main/java/org/springframework/sbm/jee/ejb/actions/MigrateLocalStatelessSessionBeans.java +++ b/components/sbm-recipes-jee-to-boot/src/main/java/org/springframework/sbm/jee/ejb/actions/MigrateLocalStatelessSessionBeans.java @@ -15,12 +15,12 @@ */ package org.springframework.sbm.jee.ejb.actions; +import lombok.RequiredArgsConstructor; +import org.springframework.sbm.engine.context.ProjectContext; import org.springframework.sbm.engine.recipe.AbstractAction; import org.springframework.sbm.java.api.JavaSource; import org.springframework.sbm.java.api.SuperTypeHierarchy; import org.springframework.sbm.java.api.Type; -import org.springframework.sbm.engine.context.ProjectContext; -import lombok.RequiredArgsConstructor; import java.util.List; diff --git a/components/sbm-recipes-mule-to-boot/pom.xml b/components/sbm-recipes-mule-to-boot/pom.xml index 83cadbabf..991f08b91 100644 --- a/components/sbm-recipes-mule-to-boot/pom.xml +++ b/components/sbm-recipes-mule-to-boot/pom.xml @@ -37,11 +37,6 @@ sbm-core 0.10.1-SNAPSHOT - - org.springframework.sbm - recipe-test-support - ${project.version} - org.springframework.sbm sbm-openrewrite diff --git a/components/sbm-support-jee/src/generated/ejb/java/org/springframework/sbm/jee/ejb/api/package-info.java b/components/sbm-support-jee/src/generated/ejb/java/org/springframework/sbm/jee/ejb/api/package-info.java index 1c6d043f2..02d4315dc 100644 --- a/components/sbm-support-jee/src/generated/ejb/java/org/springframework/sbm/jee/ejb/api/package-info.java +++ b/components/sbm-support-jee/src/generated/ejb/java/org/springframework/sbm/jee/ejb/api/package-info.java @@ -13,5 +13,5 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -@javax.xml.bind.annotation.XmlSchema(namespace = "http://xmlns.jcp.org/xml/ns/javaee", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED) +@javax.xml.bind.annotation.XmlSchema(namespace = "http://xmlns.jcp.org/xml/ns/javaee", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.UNSET) package org.springframework.sbm.jee.ejb.api; diff --git a/components/sbm-support-jee/src/main/java/org/springframework/sbm/jee/ejb/api/EjbJarXml.java b/components/sbm-support-jee/src/main/java/org/springframework/sbm/jee/ejb/api/EjbJarXml.java index 474a689bd..98e34fd8d 100644 --- a/components/sbm-support-jee/src/main/java/org/springframework/sbm/jee/ejb/api/EjbJarXml.java +++ b/components/sbm-support-jee/src/main/java/org/springframework/sbm/jee/ejb/api/EjbJarXml.java @@ -15,22 +15,26 @@ */ package org.springframework.sbm.jee.ejb.api; -import org.springframework.sbm.project.resource.RewriteSourceFileHolder; import org.openrewrite.xml.tree.Xml; +import org.springframework.sbm.project.resource.RewriteSourceFileHolder; import org.xml.sax.InputSource; import javax.xml.bind.*; import javax.xml.namespace.QName; -import javax.xml.transform.Source; -import javax.xml.transform.stream.StreamSource; +import javax.xml.stream.XMLInputFactory; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; +import javax.xml.stream.util.StreamReaderDelegate; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathExpressionException; import javax.xml.xpath.XPathFactory; +import java.io.ByteArrayInputStream; import java.io.StringReader; import java.io.StringWriter; +import java.lang.String; +import java.nio.charset.StandardCharsets; import java.nio.file.Path; import java.util.List; -import java.lang.String; public class EjbJarXml extends RewriteSourceFileHolder { @@ -63,20 +67,43 @@ public String print() { } EjbJarType unmarshal(String content) { - try { - System.setProperty("javax.xml.accessExternalDTD", "all"); - JAXBContext jaxbContext = JAXBContext.newInstance(EjbJarType.class); - Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); - jaxbUnmarshaller.setSchema(null); // disable validation -// jaxbUnmarshaller.setProperty(NAMESPACE_PREFIX_MAPPER, new YahooNamespacePrefixMapper()); - Source s = new StreamSource(new StringReader(content)); - JAXBElement jarTypeJAXBElement = null; - jarTypeJAXBElement = jaxbUnmarshaller.unmarshal(s, EjbJarType.class); - return jarTypeJAXBElement.getValue(); - } catch (JAXBException e) { - throw new RuntimeException(e); + return new EjbJarXmlUnmarshaller().unmarshal(content); + } + + + static class EjbJarXmlUnmarshaller { + + /** + * Takes the raw ejb-jar.xml source and attempts to map it to JAXB classes created from a EJB 3.1 schema. + * Namespace information will be removed to allow unmarshalling all versions into the same JAXB model classes. + */ + public EjbJarType unmarshal(String xml) { + try { + XMLStreamReader xsr = XMLInputFactory.newFactory().createXMLStreamReader(new ByteArrayInputStream(xml.getBytes(StandardCharsets.UTF_8))); + EjbJarXml.EjbJarXmlUnmarshaller.XMLReaderWithoutNamespace xr = new EjbJarXml.EjbJarXmlUnmarshaller.XMLReaderWithoutNamespace(xsr); + JAXBContext jaxbContext = JAXBContext.newInstance(EjbJarType.class); + Unmarshaller jc = jaxbContext.createUnmarshaller(); + return jc.unmarshal(xr, EjbJarType.class).getValue(); + } catch (JAXBException | XMLStreamException e) { + throw new RuntimeException(e); + } } + class XMLReaderWithoutNamespace extends StreamReaderDelegate { + public XMLReaderWithoutNamespace(XMLStreamReader reader) { + super(reader); + } + + @Override + public String getAttributeNamespace(int arg0) { + return ""; + } + + @Override + public String getNamespaceURI() { + return ""; + } + } } public boolean isEmpty() { diff --git a/components/sbm-support-jee/src/test/java/org/springframework/sbm/jee/ejb/api/EjbJarXmlTest.java b/components/sbm-support-jee/src/test/java/org/springframework/sbm/jee/ejb/api/EjbJarXmlTest.java index 6bea27a8f..a27ba0afc 100644 --- a/components/sbm-support-jee/src/test/java/org/springframework/sbm/jee/ejb/api/EjbJarXmlTest.java +++ b/components/sbm-support-jee/src/test/java/org/springframework/sbm/jee/ejb/api/EjbJarXmlTest.java @@ -15,15 +15,15 @@ */ package org.springframework.sbm.jee.ejb.api; -import org.springframework.sbm.engine.context.ProjectContext; -import org.springframework.sbm.jee.ejb.filter.EjbJarXmlResourceFilter; -import org.springframework.sbm.jee.ejb.resource.JeeEjbJarXmlProjectResourceRegistrar; -import org.springframework.sbm.project.resource.TestProjectContext; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.openrewrite.xml.XmlParser; import org.openrewrite.xml.tree.Xml; +import org.springframework.sbm.engine.context.ProjectContext; +import org.springframework.sbm.jee.ejb.filter.EjbJarXmlResourceFilter; +import org.springframework.sbm.jee.ejb.resource.JeeEjbJarXmlProjectResourceRegistrar; +import org.springframework.sbm.project.resource.TestProjectContext; import javax.xml.bind.JAXBException; import java.lang.String; @@ -39,6 +39,51 @@ class EjbJarXmlTest { public static final String EJB_TYPE = "Stateless"; private static final String EJB_NAME = "noInterfaceView"; + + @Test + void unmarshal_21_ejb_jarXml() { + String ejbJarXmlContent = + "\n" + + "\n" + + " Example of a session bean\n" + + " MyTimeBeanEJBName\n" + + " \n" + + " \n" + + " An EJB named MyTimeBean\n" + + " MyTimeBeanName\n" + + " MyTimeBean\n" + + " mytimepak.MyTimeLocalHome\n" + + " mytimepak.MyTimeLocal\n" + + " mytimepak.MyTimeBean\n" + + " Stateless\n" + + " Container\n" + + " \n" + + " \n" + + ""; + + ProjectContext projectContext = TestProjectContext.buildProjectContext() + .addRegistrar(new JeeEjbJarXmlProjectResourceRegistrar()) + .addProjectResource("src/main/resources/ejb-jar.xml", ejbJarXmlContent) + .build(); + + Optional ejbJarXmlOptional = projectContext.search(new EjbJarXmlResourceFilter()); + EjbJarType ejbJarXml = ejbJarXmlOptional.get().getEjbJarXml(); + assertThat(ejbJarXml.getEnterpriseBeans().getSessionOrEntityOrMessageDriven()).hasSize(1); + assertThat(ejbJarXml.getEnterpriseBeans().getSessionOrEntityOrMessageDriven().get(0)).isInstanceOf(SessionBeanType.class); + SessionBeanType sb = (SessionBeanType) ejbJarXml.getEnterpriseBeans().getSessionOrEntityOrMessageDriven().get(0); + assertThat(sb.getDescription().get(0).getValue()).isEqualTo("An EJB named MyTimeBean"); + assertThat(sb.getDisplayName().get(0).getValue()).isEqualTo("MyTimeBeanName"); + assertThat(sb.getEjbName().getValue()).isEqualTo("MyTimeBean"); + assertThat(sb.getLocalHome().getValue()).isEqualTo("mytimepak.MyTimeLocalHome"); + assertThat(sb.getLocal().getValue()).isEqualTo("mytimepak.MyTimeLocal"); + assertThat(sb.getEjbClass().getValue()).isEqualTo("mytimepak.MyTimeBean"); + assertThat(sb.getSessionType().getValue()).isEqualTo("Stateless"); + assertThat(sb.getTransactionType().getValue()).isEqualTo("Container"); + } + @Test void unmarshal_jcp_3_2_schema() throws JAXBException {