/** * Copyright (c) 2009-2010 Misys Open Source Solutions (MOSS) and others * * 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. * * Contributors: * Misys Open Source Solutions - initial API and implementation * - */ package org.openhealthtools.openxds.repository.relationaldb; import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.io.InputStreamReader; import java.util.Iterator; import java.util.List; import javax.activation.DataHandler; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.openhealthtools.openxds.repository.ByteArrayDataSource; import org.openhealthtools.openxds.repository.Repository; import org.openhealthtools.openxds.repository.Utility; import org.openhealthtools.openxds.repository.XdsRepositoryItemImpl; import org.openhealthtools.openxds.repository.api.RepositoryException; import org.openhealthtools.openxds.repository.api.RepositoryRequestContext; import org.openhealthtools.openxds.repository.api.XdsRepositoryItem; import org.openhealthtools.openxds.repository.api.XdsRepositoryService; import org.openhealthtools.openxds.repository.dao.XdsRepositoryManagerDao; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; /** * This class provides a xds repository manager service implementation. * * @author <a href="mailto:Rasakannu.Palaniyandi@misys.com">Raja</a> * */ @Transactional(propagation = Propagation.SUPPORTS, readOnly = true) public class RelationalDBRepositoryServiceImpl implements XdsRepositoryService { private static final Log log = LogFactory.getLog(RelationalDBRepositoryServiceImpl.class); private XdsRepositoryManagerDao xdsRepositoryManagerDao; private String repositoryUniqueId; public XdsRepositoryManagerDao getXdsRepositoryManagerDao() { return xdsRepositoryManagerDao; } public void setXdsRepositoryManagerDao( XdsRepositoryManagerDao xdsRepositoryManagerDao) { this.xdsRepositoryManagerDao = xdsRepositoryManagerDao; } public void setRepositoryUniqueId(String repositoryUniqueId) { this.repositoryUniqueId = repositoryUniqueId; } public String getRepositoryUniqueId() { return repositoryUniqueId; } /* (non-Javadoc) * @see org.openhealthtools.openxds.repository.api.IXdsRepositoryManager#getRepositoryItem() */ @Transactional(propagation = Propagation.REQUIRES_NEW) public XdsRepositoryItem getRepositoryItem(String documentUniqueId, RepositoryRequestContext context) throws RepositoryException { XdsRepositoryItemImpl repositoryItem = null; // Strip off the "urn:uuid:" String id = Utility.getInstance().stripId(documentUniqueId); try { Repository repository = xdsRepositoryManagerDao.getXdsRepositoryBean(id); if(repository != null){ DataHandler contentDataHandler = new DataHandler(new ByteArrayDataSource(repository.getBinaryContent(), repository.getMimeType())); repositoryItem = new XdsRepositoryItemImpl(); repositoryItem.setDataHandler(contentDataHandler); repositoryItem.setDocumentUniqueId(repository.getDocumentUniqueId()); repositoryItem.setMimeType(repository.getMimeType()); } } catch (Exception e) { log.error(e); throw new RepositoryException(e); } return repositoryItem; } /* (non-Javadoc) * @see org.openhealthtools.openxds.repository.api.IXdsRepositoryManager#getRepositoryItems() */ @Transactional(propagation = Propagation.REQUIRES_NEW) public List<XdsRepositoryItem> getRepositoryItems( List<String> documentUniqueIds, RepositoryRequestContext context) throws RepositoryException { List<XdsRepositoryItem> repositoryItems = null; try { if (documentUniqueIds != null) { Iterator<String> item = documentUniqueIds.iterator(); while (item.hasNext()) { String repositoryItem = item.next(); XdsRepositoryItem xdsRepositoryItem = getRepositoryItem(repositoryItem, context); if (xdsRepositoryItem != null) repositoryItems.add(xdsRepositoryItem); } } } catch (Exception e) { log.error(e); throw new RepositoryException(e); } return repositoryItems; } /* (non-Javadoc) * @see org.openhealthtools.openxds.repository.api.IXdsRepositoryManager#insert() */ @Transactional(propagation = Propagation.REQUIRED) public void insert(XdsRepositoryItem item, RepositoryRequestContext context) throws RepositoryException { Repository bean =null; byte contentBytes[]= null; // get the mime type of the document. String mimeTypeCode = item.getMimeType(); // Strip off the "urn:uuid:" String id = Utility.getInstance().stripId(item.getDocumentUniqueId()); //check whether document unique id is already exists in repository or not bean = xdsRepositoryManagerDao.getXdsRepositoryBean(id); if(bean != null){ String newHash = item.getHash(); if (bean.getHash().equals(newHash)) { //The same document is saved previously. Allow it to proceed. return ; } log.debug("document unique id already exist"); throw new RepositoryException("document unique id already exist in repository"); } try { contentBytes = readBytes(item.getDataHandler().getInputStream()); } catch (Exception e) { log.error(e); throw new RepositoryException("error while converting datahandler object into byte array"); } bean = new Repository(); bean.setDocumentUniqueId(id); bean.setBinaryContent(contentBytes); bean.setMimeType(mimeTypeCode); bean.setSize(item.getSize()); bean.setHash(item.getHash()); xdsRepositoryManagerDao.insert(bean); } /* (non-Javadoc) * @see org.openhealthtools.openxds.repository.api.IXdsRepositoryManager#insert() */ @Transactional(propagation = Propagation.REQUIRED) public void insert(List<XdsRepositoryItem> items, RepositoryRequestContext context) throws RepositoryException { try { if (items != null) { Iterator<XdsRepositoryItem> item = items.iterator(); while (item.hasNext()) { XdsRepositoryItem repositoryItem = item.next(); insert(repositoryItem, context); } } } catch (Exception e) { log.error(e); throw new RepositoryException(e); } } /* (non-Javadoc) * @see org.openhealthtools.openxds.repository.api.IXdsRepositoryManager#delete() */ @Transactional(propagation = Propagation.REQUIRES_NEW) public void delete(String documentUniqueId, RepositoryRequestContext context) throws RepositoryException { // Strip off the "urn:uuid:" String id = Utility.getInstance().stripId(documentUniqueId); try { xdsRepositoryManagerDao.delete(id); } catch (Exception e) { log.error(e); throw new RepositoryException(e); } log.debug("Reposiotry bean deleted successfully"); } /* (non-Javadoc) * @see org.openhealthtools.openxds.repository.api.IXdsRepositoryManager#delete() */ @Transactional(propagation = Propagation.REQUIRES_NEW) public void delete(List<String> ids, RepositoryRequestContext context) throws RepositoryException { try { if (ids != null) { Iterator<String> item = ids.iterator(); while (item.hasNext()) { String repositoryItem = item.next(); delete(repositoryItem, context); } } } catch (Exception e) { log.error(e); throw new RepositoryException(e); } } /** * Reads bytes from InputStream until the end of the stream. * * @param in The InputStream to be read. * @return the read bytes * @throws Exception */ private byte[] readBytes(InputStream in) throws Exception { ByteArrayOutputStream baos = new ByteArrayOutputStream(); InputStreamReader inr = new InputStreamReader(in); byte bbuf[] = new byte[1024]; int read; while ((read = in.read(bbuf)) > 0) { baos.write(bbuf, 0, read); } return baos.toByteArray(); } }