/**
* Licensed to Apereo under one or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information regarding copyright ownership. Apereo
* licenses this file to you 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 the
* following location:
*
* <p>http://www.apache.org/licenses/LICENSE-2.0
*
* <p>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.apereo.portal.io.xml.crn;
import com.google.common.base.Function;
import java.io.IOException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Result;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import org.apereo.portal.io.xml.IDataExporter;
import org.apereo.portal.io.xml.IPortalData;
import org.apereo.portal.io.xml.IPortalDataType;
import org.apereo.portal.utils.SafeFilenameUtils;
import org.apereo.portal.utils.Tuple;
import org.apereo.portal.xml.XmlUtilities;
import org.dom4j.Element;
import org.dom4j.io.DocumentSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Required;
import org.springframework.oxm.Marshaller;
import org.springframework.oxm.XmlMappingException;
/**
* Base class used for exporting DOM4j data
*
*/
public abstract class AbstractDom4jExporter
implements IDataExporter<Tuple<String, Element>>, Marshaller {
protected final Logger logger = LoggerFactory.getLogger(getClass());
private XmlUtilities xmlUtilities;
private IPortalDataType portalDataType;
private Function<IPortalDataType, Iterable<? extends IPortalData>> portalDataRetriever;
@Autowired
public void setXmlUtilities(XmlUtilities xmlUtilities) {
this.xmlUtilities = xmlUtilities;
}
@Required
public void setPortalDataType(IPortalDataType portalDataType) {
this.portalDataType = portalDataType;
}
@Required
public void setPortalDataRetriever(
Function<IPortalDataType, Iterable<? extends IPortalData>> portalDataRetriever) {
this.portalDataRetriever = portalDataRetriever;
}
/* (non-Javadoc)
* @see org.apereo.portal.io.xml.IDataExporter#getPortalDataType()
*/
@Override
public IPortalDataType getPortalDataType() {
return this.portalDataType;
}
/* (non-Javadoc)
* @see org.apereo.portal.io.xml.IDataExporter#getPortalData()
*/
@Override
public Iterable<? extends IPortalData> getPortalData() {
return this.portalDataRetriever.apply(this.portalDataType);
}
/* (non-Javadoc)
* @see org.apereo.portal.io.xml.IDataExporter#exportData(java.lang.String)
*/
@Override
public Tuple<String, Element> exportData(String id) {
final Element node = this.exportDataElement(id);
if (node == null) {
return null;
}
return new Tuple<String, Element>(id, node);
}
protected abstract Element exportDataElement(String id);
/* (non-Javadoc)
* @see org.apereo.portal.io.xml.IDataExporter#getFileName(java.lang.Object)
*/
@Override
public String getFileName(Tuple<String, Element> data) {
return SafeFilenameUtils.makeSafeFilename(data.first);
}
/* (non-Javadoc)
* @see org.apereo.portal.io.xml.IDataExporter#getMarshaller()
*/
@Override
public Marshaller getMarshaller() {
return this;
}
/* (non-Javadoc)
* @see org.springframework.oxm.Marshaller#supports(java.lang.Class)
*/
@Override
public boolean supports(Class<?> clazz) {
return true;
}
/* (non-Javadoc)
* @see org.springframework.oxm.Marshaller#marshal(java.lang.Object, javax.xml.transform.Result)
*/
@Override
public void marshal(Object graph, Result result) throws IOException, XmlMappingException {
@SuppressWarnings("unchecked")
final Tuple<String, Element> data = (Tuple<String, Element>) graph;
final Transformer transformer;
try {
transformer = this.xmlUtilities.getIdentityTransformer();
} catch (TransformerConfigurationException e) {
throw new RuntimeException("Failed to load identity Transformer", e);
}
//Setup the transformer to pretty-print the output
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
try {
transformer.transform(new DocumentSource(data.second), result);
} catch (TransformerException e) {
throw new RuntimeException("Failed to write Element to Result for: " + data.first, e);
}
}
}