Skip to content

Commit da020f8

Browse files
fabapp2ravigkant
authored andcommitted
closes spring-projects-experimental#62 Unmarshal EJB 2.1 ejb-jar.xml deployment descriptor (spring-projects-experimental#64)
1 parent a2dd96b commit da020f8

File tree

5 files changed

+95
-28
lines changed

5 files changed

+95
-28
lines changed

components/sbm-recipes-jee-to-boot/src/main/java/org/springframework/sbm/jee/ejb/actions/MigrateLocalStatelessSessionBeans.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,12 @@
1515
*/
1616
package org.springframework.sbm.jee.ejb.actions;
1717

18+
import lombok.RequiredArgsConstructor;
19+
import org.springframework.sbm.engine.context.ProjectContext;
1820
import org.springframework.sbm.engine.recipe.AbstractAction;
1921
import org.springframework.sbm.java.api.JavaSource;
2022
import org.springframework.sbm.java.api.SuperTypeHierarchy;
2123
import org.springframework.sbm.java.api.Type;
22-
import org.springframework.sbm.engine.context.ProjectContext;
23-
import lombok.RequiredArgsConstructor;
2424

2525
import java.util.List;
2626

components/sbm-recipes-mule-to-boot/pom.xml

-5
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,6 @@
3737
<artifactId>sbm-core</artifactId>
3838
<version>0.10.1-SNAPSHOT</version>
3939
</dependency>
40-
<dependency>
41-
<groupId>org.springframework.sbm</groupId>
42-
<artifactId>recipe-test-support</artifactId>
43-
<version>${project.version}</version>
44-
</dependency>
4540
<dependency>
4641
<groupId>org.springframework.sbm</groupId>
4742
<artifactId>sbm-openrewrite</artifactId>

components/sbm-support-jee/src/generated/ejb/java/org/springframework/sbm/jee/ejb/api/package-info.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,5 @@
1313
* See the License for the specific language governing permissions and
1414
* limitations under the License.
1515
*/
16-
@javax.xml.bind.annotation.XmlSchema(namespace = "http://xmlns.jcp.org/xml/ns/javaee", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
16+
@javax.xml.bind.annotation.XmlSchema(namespace = "http://xmlns.jcp.org/xml/ns/javaee", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.UNSET)
1717
package org.springframework.sbm.jee.ejb.api;

components/sbm-support-jee/src/main/java/org/springframework/sbm/jee/ejb/api/EjbJarXml.java

+43-16
Original file line numberDiff line numberDiff line change
@@ -15,22 +15,26 @@
1515
*/
1616
package org.springframework.sbm.jee.ejb.api;
1717

18-
import org.springframework.sbm.project.resource.RewriteSourceFileHolder;
1918
import org.openrewrite.xml.tree.Xml;
19+
import org.springframework.sbm.project.resource.RewriteSourceFileHolder;
2020
import org.xml.sax.InputSource;
2121

2222
import javax.xml.bind.*;
2323
import javax.xml.namespace.QName;
24-
import javax.xml.transform.Source;
25-
import javax.xml.transform.stream.StreamSource;
24+
import javax.xml.stream.XMLInputFactory;
25+
import javax.xml.stream.XMLStreamException;
26+
import javax.xml.stream.XMLStreamReader;
27+
import javax.xml.stream.util.StreamReaderDelegate;
2628
import javax.xml.xpath.XPath;
2729
import javax.xml.xpath.XPathExpressionException;
2830
import javax.xml.xpath.XPathFactory;
31+
import java.io.ByteArrayInputStream;
2932
import java.io.StringReader;
3033
import java.io.StringWriter;
34+
import java.lang.String;
35+
import java.nio.charset.StandardCharsets;
3136
import java.nio.file.Path;
3237
import java.util.List;
33-
import java.lang.String;
3438

3539
public class EjbJarXml extends RewriteSourceFileHolder<Xml.Document> {
3640

@@ -63,20 +67,43 @@ public String print() {
6367
}
6468

6569
EjbJarType unmarshal(String content) {
66-
try {
67-
System.setProperty("javax.xml.accessExternalDTD", "all");
68-
JAXBContext jaxbContext = JAXBContext.newInstance(EjbJarType.class);
69-
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
70-
jaxbUnmarshaller.setSchema(null); // disable validation
71-
// jaxbUnmarshaller.setProperty(NAMESPACE_PREFIX_MAPPER, new YahooNamespacePrefixMapper());
72-
Source s = new StreamSource(new StringReader(content));
73-
JAXBElement<EjbJarType> jarTypeJAXBElement = null;
74-
jarTypeJAXBElement = jaxbUnmarshaller.unmarshal(s, EjbJarType.class);
75-
return jarTypeJAXBElement.getValue();
76-
} catch (JAXBException e) {
77-
throw new RuntimeException(e);
70+
return new EjbJarXmlUnmarshaller().unmarshal(content);
71+
}
72+
73+
74+
static class EjbJarXmlUnmarshaller {
75+
76+
/**
77+
* Takes the raw ejb-jar.xml source and attempts to map it to JAXB classes created from a EJB 3.1 schema.
78+
* Namespace information will be removed to allow unmarshalling all versions into the same JAXB model classes.
79+
*/
80+
public EjbJarType unmarshal(String xml) {
81+
try {
82+
XMLStreamReader xsr = XMLInputFactory.newFactory().createXMLStreamReader(new ByteArrayInputStream(xml.getBytes(StandardCharsets.UTF_8)));
83+
EjbJarXml.EjbJarXmlUnmarshaller.XMLReaderWithoutNamespace xr = new EjbJarXml.EjbJarXmlUnmarshaller.XMLReaderWithoutNamespace(xsr);
84+
JAXBContext jaxbContext = JAXBContext.newInstance(EjbJarType.class);
85+
Unmarshaller jc = jaxbContext.createUnmarshaller();
86+
return jc.unmarshal(xr, EjbJarType.class).getValue();
87+
} catch (JAXBException | XMLStreamException e) {
88+
throw new RuntimeException(e);
89+
}
7890
}
7991

92+
class XMLReaderWithoutNamespace extends StreamReaderDelegate {
93+
public XMLReaderWithoutNamespace(XMLStreamReader reader) {
94+
super(reader);
95+
}
96+
97+
@Override
98+
public String getAttributeNamespace(int arg0) {
99+
return "";
100+
}
101+
102+
@Override
103+
public String getNamespaceURI() {
104+
return "";
105+
}
106+
}
80107
}
81108

82109
public boolean isEmpty() {

components/sbm-support-jee/src/test/java/org/springframework/sbm/jee/ejb/api/EjbJarXmlTest.java

+49-4
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,15 @@
1515
*/
1616
package org.springframework.sbm.jee.ejb.api;
1717

18-
import org.springframework.sbm.engine.context.ProjectContext;
19-
import org.springframework.sbm.jee.ejb.filter.EjbJarXmlResourceFilter;
20-
import org.springframework.sbm.jee.ejb.resource.JeeEjbJarXmlProjectResourceRegistrar;
21-
import org.springframework.sbm.project.resource.TestProjectContext;
2218
import org.assertj.core.api.Assertions;
2319
import org.junit.jupiter.api.Disabled;
2420
import org.junit.jupiter.api.Test;
2521
import org.openrewrite.xml.XmlParser;
2622
import org.openrewrite.xml.tree.Xml;
23+
import org.springframework.sbm.engine.context.ProjectContext;
24+
import org.springframework.sbm.jee.ejb.filter.EjbJarXmlResourceFilter;
25+
import org.springframework.sbm.jee.ejb.resource.JeeEjbJarXmlProjectResourceRegistrar;
26+
import org.springframework.sbm.project.resource.TestProjectContext;
2727

2828
import javax.xml.bind.JAXBException;
2929
import java.lang.String;
@@ -39,6 +39,51 @@ class EjbJarXmlTest {
3939
public static final String EJB_TYPE = "Stateless";
4040
private static final String EJB_NAME = "noInterfaceView";
4141

42+
43+
@Test
44+
void unmarshal_21_ejb_jarXml() {
45+
String ejbJarXmlContent =
46+
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
47+
"<ejb-jar id=\"ejb-jar_1\" xmlns=\"http://xmlns.jcp.org/xml/ns/javaee\"\n" +
48+
" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n" +
49+
" xsi:schemaLocation=\"http://java.sun.com/xml/ns/j2ee\n" +
50+
" http://xmlns.jcp.org/xml/ns/javaee/ejb-jar_2_1.xsd\" version=\"2.1\">\n" +
51+
" <description>Example of a session bean</description>\n" +
52+
" <display-name>MyTimeBeanEJBName</display-name>\n" +
53+
" <enterprise-beans>\n" +
54+
" <session id=\"Session_MyTime\">\n" +
55+
" <description>An EJB named MyTimeBean</description>\n" +
56+
" <display-name>MyTimeBeanName</display-name>\n" +
57+
" <ejb-name>MyTimeBean</ejb-name>\n" +
58+
" <local-home>mytimepak.MyTimeLocalHome</local-home>\n" +
59+
" <local>mytimepak.MyTimeLocal</local>\n" +
60+
" <ejb-class>mytimepak.MyTimeBean</ejb-class>\n" +
61+
" <session-type>Stateless</session-type>\n" +
62+
" <transaction-type>Container</transaction-type>\n" +
63+
" </session>\n" +
64+
" </enterprise-beans>\n" +
65+
"</ejb-jar>";
66+
67+
ProjectContext projectContext = TestProjectContext.buildProjectContext()
68+
.addRegistrar(new JeeEjbJarXmlProjectResourceRegistrar())
69+
.addProjectResource("src/main/resources/ejb-jar.xml", ejbJarXmlContent)
70+
.build();
71+
72+
Optional<EjbJarXml> ejbJarXmlOptional = projectContext.search(new EjbJarXmlResourceFilter());
73+
EjbJarType ejbJarXml = ejbJarXmlOptional.get().getEjbJarXml();
74+
assertThat(ejbJarXml.getEnterpriseBeans().getSessionOrEntityOrMessageDriven()).hasSize(1);
75+
assertThat(ejbJarXml.getEnterpriseBeans().getSessionOrEntityOrMessageDriven().get(0)).isInstanceOf(SessionBeanType.class);
76+
SessionBeanType sb = (SessionBeanType) ejbJarXml.getEnterpriseBeans().getSessionOrEntityOrMessageDriven().get(0);
77+
assertThat(sb.getDescription().get(0).getValue()).isEqualTo("An EJB named MyTimeBean");
78+
assertThat(sb.getDisplayName().get(0).getValue()).isEqualTo("MyTimeBeanName");
79+
assertThat(sb.getEjbName().getValue()).isEqualTo("MyTimeBean");
80+
assertThat(sb.getLocalHome().getValue()).isEqualTo("mytimepak.MyTimeLocalHome");
81+
assertThat(sb.getLocal().getValue()).isEqualTo("mytimepak.MyTimeLocal");
82+
assertThat(sb.getEjbClass().getValue()).isEqualTo("mytimepak.MyTimeBean");
83+
assertThat(sb.getSessionType().getValue()).isEqualTo("Stateless");
84+
assertThat(sb.getTransactionType().getValue()).isEqualTo("Container");
85+
}
86+
4287
@Test
4388
void unmarshal_jcp_3_2_schema() throws JAXBException {
4489

0 commit comments

Comments
 (0)