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 {