Skip to content

Commit

Permalink
[incubator-kie-issues-1204] Add built in support for org.w3c.dom.Docu…
Browse files Browse the repository at this point in the history
…ment (#3518)

* [incubator-kie-issues-1204] Add built in support for org.w3c.dom.Document
  • Loading branch information
elguardian authored May 28, 2024
1 parent f8c8f2e commit ae22647
Show file tree
Hide file tree
Showing 18 changed files with 2,783 additions and 543 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
/*
* 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.jbpm.process.core.datatype.impl.coverter;

import java.util.function.Function;

import javax.xml.parsers.DocumentBuilderFactory;

public class DocumentConverter implements Function<String, Object> {

@Override
public Object apply(String xml) {
try {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setExpandEntityReferences(false);
factory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
return factory.newDocumentBuilder().parse(xml);
} catch (Exception e) {
throw new RuntimeException(e);
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
/*
* 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.jbpm.process.core.datatype.impl.coverter;

import java.io.StringWriter;
import java.util.function.Function;

import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;

public class DocumentUnconverter implements Function<Document, String> {

@Override
public String apply(Document document) {
try {
TransformerFactory tf = TransformerFactory.newInstance();
Transformer trans = tf.newTransformer();
StringWriter sw = new StringWriter();
trans.transform(new DOMSource(document), new StreamResult(sw));
return sw.toString();
} catch (Exception e) {
throw new RuntimeException(e);
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
import org.kie.kogito.jackson.utils.JsonNodeConverter;
import org.kie.kogito.jackson.utils.ObjectMapperFactory;
import org.kie.kogito.jackson.utils.StringConverter;
import org.w3c.dom.Document;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.module.SimpleModule;
Expand All @@ -43,7 +44,9 @@ public class TypeConverterRegistry {
private TypeConverterRegistry() {
converters.put(Date.class.getName(), new DateTypeConverter());
converters.put(JsonNode.class.getName(), new JsonNodeConverter(ObjectMapperFactory::listenerAware));
converters.put(Document.class.getName(), new DocumentConverter());
unconverters.put(JsonNode.class.getName(), new StringConverter());
unconverters.put(Document.class.getName(), new DocumentUnconverter());
addJacksonPair(Variable.class, Map.class);
}

Expand Down
25 changes: 24 additions & 1 deletion jbpm/process-serialization-protobuf/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,21 @@
<artifactId>assertj-core</artifactId>
<scope>test</scope>
</dependency>

<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-core</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.xmlunit</groupId>
<artifactId>xmlunit-core</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
Expand Down Expand Up @@ -144,6 +158,15 @@
<plugin>
<groupId>org.xolstice.maven.plugins</groupId>
<artifactId>protobuf-maven-plugin</artifactId>
<executions>
<execution>
<id>default</id>
<goals>
<goal>compile</goal>
</goals>
<phase>generate-sources</phase>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
/*
* 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.jbpm.flow.serialization;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.ServiceLoader;

import org.jbpm.util.JbpmClassLoaderUtil;

public class ObjectMarshallerStrategyHelper {

public static ObjectMarshallerStrategy[] defaultStrategies() {
List<ObjectMarshallerStrategy> strats = new ArrayList<>();
ServiceLoader<ObjectMarshallerStrategy> loader = ServiceLoader.load(ObjectMarshallerStrategy.class, JbpmClassLoaderUtil.findClassLoader());

for (ObjectMarshallerStrategy strategy : loader) {
strats.add(strategy);
}
Collections.sort(strats);
return strats.stream().toArray(ObjectMarshallerStrategy[]::new);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -82,11 +82,8 @@ public Builder withDefaultListeners() {
}

public Builder withDefaultObjectMarshallerStrategies() {
ServiceLoader<ObjectMarshallerStrategy> loader = ServiceLoader.load(ObjectMarshallerStrategy.class, JbpmClassLoaderUtil.findClassLoader());

for (ObjectMarshallerStrategy strategy : loader) {
ProcessInstanceMarshallerService.this.strats.add(strategy);
}
ProcessInstanceMarshallerService.this.strats.addAll(List.of(ObjectMarshallerStrategyHelper.defaultStrategies()));

ServiceLoader<NodeInstanceReader> readerLoader = ServiceLoader.load(NodeInstanceReader.class, JbpmClassLoaderUtil.findClassLoader());

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
/*
* 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.jbpm.flow.serialization.impl.marshallers;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.StringWriter;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.jbpm.flow.serialization.ObjectMarshallerStrategy;
import org.jbpm.flow.serialization.ProcessInstanceMarshallerException;
import org.jbpm.flow.serialization.protobuf.KogitoTypesProtobuf;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;

import com.google.protobuf.Any;

public class ProtobufDocumentNodeMessageMarshaller implements ObjectMarshallerStrategy {

@Override
public boolean acceptForMarshalling(Object value) {
return value instanceof Document;
}

@Override
public boolean acceptForUnmarshalling(Any value) {
return value.is(KogitoTypesProtobuf.Document.class);
}

@Override
public Any marshall(Object unmarshalled) {
try {
KogitoTypesProtobuf.Document.Builder builder = KogitoTypesProtobuf.Document.newBuilder();
Document document = (Document) unmarshalled;
TransformerFactory tf = TransformerFactory.newInstance();
Transformer trans = tf.newTransformer();
StringWriter sw = new StringWriter();
trans.transform(new DOMSource(document), new StreamResult(sw));
builder.setContent(sw.toString());
return Any.pack(builder.build());
} catch (TransformerException e) {
throw new ProcessInstanceMarshallerException("Error trying to marshalling a Document Node value", e);
}
}

@Override
public Object unmarshall(Any data) {
try {
KogitoTypesProtobuf.Document storedValue = data.unpack(KogitoTypesProtobuf.Document.class);
StringBuilder xmlStringBuilder = new StringBuilder(storedValue.getContent());
ByteArrayInputStream input = new ByteArrayInputStream(xmlStringBuilder.toString().getBytes("UTF-8"));
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setExpandEntityReferences(false);
factory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
return factory.newDocumentBuilder().parse(input);
} catch (IOException | SAXException | ParserConfigurationException e1) {
throw new ProcessInstanceMarshallerException("Error trying to unmarshalling a Document Node value", e1);
}
}
}
Loading

0 comments on commit ae22647

Please sign in to comment.