1 21 package com.jaspersoft.jasperserver.api.metadata.common.service.impl.hibernate.persistent; 22 23 import java.sql.Blob ; 24 import java.sql.SQLException ; 25 26 import org.apache.commons.logging.Log; 27 import org.apache.commons.logging.LogFactory; 28 import org.hibernate.Hibernate; 29 30 import com.jaspersoft.jasperserver.api.JSException; 31 import com.jaspersoft.jasperserver.api.JSExceptionWrapper; 32 import com.jaspersoft.jasperserver.api.metadata.common.domain.FileResource; 33 import com.jaspersoft.jasperserver.api.metadata.common.domain.FileResourceData; 34 import com.jaspersoft.jasperserver.api.metadata.common.domain.Resource; 35 import com.jaspersoft.jasperserver.api.metadata.common.service.ResourceFactory; 36 import com.jaspersoft.jasperserver.api.metadata.common.service.impl.hibernate.ReferenceResolver; 37 38 45 public class RepoFileResource extends RepoResource { 46 private static final Log log = LogFactory.getLog(RepoFileResource.class); 47 48 private String fileType; 49 private Blob data; 50 private RepoFileResource reference; 51 52 public RepoFileResource() { 53 super(); 54 } 55 56 59 public Blob getData() { 60 return data; 61 } 62 63 public void setData(Blob data) { 64 this.data = data; 65 } 66 67 70 public String getFileType() { 71 return fileType; 72 } 73 74 public void setFileType(String type) { 75 this.fileType = type; 76 } 77 78 public String getFinalFileType() { 79 RepoFileResource res = this; 80 while (res.isFileReference()) { 81 res = res.getReference(); 82 } 83 return res.getFileType(); 84 } 85 86 public boolean isFileReference() { 87 return getReference() != null; 88 } 89 90 93 public RepoFileResource getReference() { 94 return reference; 95 } 96 97 public void setReference(RepoFileResource reference) { 98 this.reference = reference; 99 } 100 101 protected Class getClientItf() { 102 return FileResource.class; 103 } 104 105 protected void copyTo(Resource clientRes, ResourceFactory resourceFactory) { 106 super.copyTo(clientRes, resourceFactory); 107 108 FileResource fileRes = (FileResource) clientRes; 109 110 if (isFileReference()) { 111 RepoFileResource ref = getReference(); 112 fileRes.setFileType(null); 113 fileRes.setData(null); 114 fileRes.setReferenceURI(ref.getResourceURI()); 115 } else { 116 fileRes.setFileType(getFileType()); 117 fileRes.setReferenceURI(null); 119 } 120 } 121 122 public FileResourceData copyData() { 123 try { 124 if (isFileReference()) { 125 throw new JSException("File resource \"" + getResourceURI() + "\" is a reference and has no data"); 126 } 127 128 FileResourceData resData; 129 130 Blob blob = getData(); 131 if (blob == null) { 132 resData = new FileResourceData((byte[]) null); 133 } else { 134 resData = new FileResourceData(blob.getBinaryStream()); 135 } 136 137 return resData; 138 } catch (SQLException e) { 139 log.error("Error while reading data blob of \"" + getResourceURI() + "\"", e); 140 throw new JSExceptionWrapper(e); 141 } 142 } 143 144 protected void copyFrom(Resource clientRes, 145 ReferenceResolver referenceResolver) { 146 super.copyFrom(clientRes, referenceResolver); 147 148 FileResource dataRes = (FileResource) clientRes; 149 if (dataRes.isReference()) { 150 setFileType(null); 151 setData(null); 152 153 RepoFileResource externalReference = (RepoFileResource) referenceResolver 154 .getExternalReference(dataRes.getReferenceURI(), RepoFileResource.class); 155 156 if (dataRes.getFileType() != null 157 && !dataRes.getFileType().equals(externalReference.getFinalFileType())) { 158 throw new JSException("The declared type of the resource (" 159 + dataRes.getFileType() 160 + ") does not match the actual type of the reference (" 161 + externalReference.getFileType() + ")."); 162 } 163 164 setReference(externalReference); 165 } else { 166 setFileType(dataRes.getFileType()); 167 copyDataFrom(dataRes); 168 setReference(null); 169 } 170 } 171 172 protected void copyDataFrom(FileResource dataRes) { 173 if (dataRes.isReference()) { 174 setData(null); 175 } else { 176 if (dataRes.hasData()) { 178 byte[] clientData = dataRes.getData(); 179 Blob blob = Hibernate.createBlob(clientData); 180 setData(blob); 181 } 182 } 183 } 184 } 185 | Popular Tags |