/* * Copyright 2015 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * * 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.services.task.impl.model.xml; import static org.jbpm.services.task.impl.model.xml.AbstractJaxbTaskObject.unsupported; import java.io.IOException; import java.io.ObjectInput; import java.io.ObjectOutput; import java.util.Map; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlSchemaType; import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; import org.jbpm.services.task.utils.ContentMarshallerHelper; import org.kie.api.task.model.Content; import org.kie.internal.jaxb.StringKeyObjectValueMapXmlAdapter; import com.fasterxml.jackson.annotation.JsonAutoDetect; @XmlRootElement(name="content") @XmlAccessorType(XmlAccessType.FIELD) @JsonAutoDetect(getterVisibility=JsonAutoDetect.Visibility.NONE, setterVisibility=JsonAutoDetect.Visibility.NONE, fieldVisibility=JsonAutoDetect.Visibility.ANY) public class JaxbContent implements Content { @XmlElement private Long id; @XmlElement @XmlSchemaType(name="base64Binary") private byte[] content = null; @XmlJavaTypeAdapter(StringKeyObjectValueMapXmlAdapter.class) private Map<String, Object> contentMap = null; public JaxbContent() { // default } public JaxbContent(Content content) { initialize(content); } @SuppressWarnings("unchecked") public void initialize(Content content) { if( content == null || content.getId() == -1) { return; } this.id = content.getId(); this.content = content.getContent(); if( content instanceof JaxbContent ) { this.contentMap = ((JaxbContent) content).getContentMap(); } else { try { Object unmarshalledContent = ContentMarshallerHelper.unmarshall(content.getContent(), null); if( unmarshalledContent != null && unmarshalledContent instanceof Map ) { contentMap = (Map<String, Object>) unmarshalledContent; } } catch (Exception e) { // don't fail in case of unmarshalling problem as it might be content not handled via jaxb // Ļe.g. custom classes, non map based etc } } } @Override public byte[] getContent() { return content; } public byte[] getSerializedContent() { return this.content; } public void setSerializedContent(byte [] content) { this.content = content; } public Map<String, Object> getContentMap() { return this.contentMap; } public void setContentMap(Map<String, Object> map) { this.contentMap = map; } @Override public Long getId() { return this.id; } public void setId(Long id) { this.id = id; } @Override public void writeExternal( ObjectOutput out ) throws IOException { unsupported(Content.class); } @Override public void readExternal( ObjectInput in ) throws IOException, ClassNotFoundException { unsupported(Content.class); } }