package org.sakaiproject.springframework.orm.hibernate.impl;
import org.sakaiproject.springframework.orm.hibernate.VendorHbmTransformer;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ClassPathResource;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamSource;
import javax.xml.transform.stream.StreamResult;
import java.util.Map;
import java.util.HashMap;
import java.io.InputStream;
import java.io.IOException;
import java.io.ByteArrayOutputStream;
import java.io.ByteArrayInputStream;
/**
* Created by IntelliJ IDEA.
* User: jbush
* Date: Jul 25, 2007
* Time: 10:26:52 AM
* To change this template use File | Settings | File Templates.
*/
public class VendorHbmTransformerImpl implements VendorHbmTransformer {
protected final transient Log logger = LogFactory.getLog(getClass());
private Map vendorTransforms = new HashMap();
private String vendor;
/**
* Applies the vendor specific xsl transformation to the given mappingDoc. If
* no xsl file can be found for the current vendor, return the mapping unchanged.
*
* @param mappingDoc - mappingDoc
* @return
*/
public InputStream getTransformedMapping(InputStream mappingDoc) {
InputStream xsl = null;
try {
try {
xsl = loadTransformStream();
} catch (IOException e) {
logger.error("problem loading xsl file, leaving hbm unchanged", e);
return mappingDoc;
}
// no xsl for this vendor, so nothing to transform
if (xsl == null) {
logger.info("no vendor specific xsl, returning hbm unchanged");
return mappingDoc;
}
try {
ByteArrayOutputStream transformedMapping = new ByteArrayOutputStream();
Transformer transformer = TransformerFactory.newInstance().newTransformer(new StreamSource(xsl));
transformer.transform(new StreamSource(mappingDoc), new StreamResult(transformedMapping));
logger.debug(new String(transformedMapping.toByteArray()));
return new ByteArrayInputStream(transformedMapping.toByteArray());
} catch (Exception e) {
logger.error("Problem applying transformation to hibernate mapping file, processing hbm unchanged", e);
return mappingDoc;
}
} finally {
if (xsl != null)
try {
xsl.close();
} catch (IOException e) {
}
}
}
protected InputStream loadTransformStream() throws IOException {
String resourcePath = (String) getVendorTransforms().get(vendor);
if (resourcePath == null) {
return null;
}
Resource resource = new ClassPathResource(resourcePath.trim());
logger.info("Transforming hibernate mapping file using: " + resource.getFilename());
return resource.getInputStream();
}
public Map getVendorTransforms() {
return vendorTransforms;
}
public void setVendorTransforms(Map vendorTransforms) {
this.vendorTransforms = vendorTransforms;
}
public void setVendor(String vendor) {
this.vendor = vendor;
}
}