/* * Copyright (C) 2012 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. * 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.document.marshalling; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.util.Date; import java.util.Map; import org.drools.core.common.DroolsObjectInputStream; import org.jbpm.document.Document; import org.jbpm.document.service.DocumentStorageService; import org.jbpm.document.service.DocumentStorageServiceProvider; public class DocumentMarshallingStrategy extends AbstractDocumentMarshallingStrategy { private DocumentStorageService documentStorageService; public DocumentMarshallingStrategy() { documentStorageService = DocumentStorageServiceProvider.get().getStorageService(); } public DocumentMarshallingStrategy(String path) { documentStorageService = DocumentStorageServiceProvider.get().getStorageService(); } @Override public Document buildDocument( String name, long size, Date lastModified, Map<String, String> params ) { return documentStorageService.buildDocument( name, size, lastModified, params ); } @Override public void write(ObjectOutputStream os, Object object) throws IOException { Document document = (Document) object; if (document != null && document.getContent() != null) { documentStorageService.saveDocument(document, document.getContent()); } os.writeUTF(document.getIdentifier()); os.writeUTF(document.getClass().getCanonicalName()); os.writeUTF(document.getLink()); } public Object read(ObjectInputStream os) throws IOException, ClassNotFoundException { String objectId = os.readUTF(); String canonicalName = os.readUTF(); String link = os.readUTF(); try { Document doc = documentStorageService.getDocument(objectId); Document document = (Document) Class.forName(canonicalName).newInstance(); document.setIdentifier(objectId); document.setLink(link); document.setName(doc.getName()); document.setSize(doc.getSize()); document.setLastModified(doc.getLastModified()); document.setAttributes(doc.getAttributes()); document.setContent(doc.getContent()); return document; } catch(Exception e) { throw new RuntimeException("Cannot read document", e); } } @Override public byte[] marshal(Context context, ObjectOutputStream objectOutputStream, Object o) throws IOException { Document document = (Document) o; documentStorageService.saveDocument(document, document.getContent()); ByteArrayOutputStream buff = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(buff); oos.writeUTF(document.getIdentifier()); oos.writeUTF(document.getClass().getCanonicalName()); oos.writeUTF(document.getLink()); oos.close(); return buff.toByteArray(); } @Override public Object unmarshal(Context context, ObjectInputStream objectInputStream, byte[] object, ClassLoader classLoader) throws IOException, ClassNotFoundException { DroolsObjectInputStream is = new DroolsObjectInputStream(new ByteArrayInputStream(object), classLoader); // first we read out the object id and class name we stored during marshaling String objectId = is.readUTF(); String canonicalName = is.readUTF(); String link = is.readUTF(); Document document = null; try { document = (Document) Class.forName(canonicalName).newInstance(); Document storedDoc = documentStorageService.getDocument(objectId); document.setIdentifier(storedDoc.getIdentifier()); document.setName( storedDoc.getName() ); document.setLink( link ); document.setLastModified( storedDoc.getLastModified() ); document.setSize( storedDoc.getSize() ); document.setAttributes( storedDoc.getAttributes() ); document.setContent(storedDoc.getContent()); } catch (Exception e) { throw new RuntimeException("Cannot read document from storage service", e); } return document; } @Override public Context createContext() { return null; } }