/*******************************************************************************
* Copyright (c) 2012-2016 Codenvy, S.A.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Codenvy, S.A. - initial API and implementation
*******************************************************************************/
package org.everrest.core.impl.provider;
import org.xml.sax.SAXException;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.ext.ContextResolver;
import javax.ws.rs.ext.Provider;
import javax.xml.transform.Source;
import javax.xml.transform.Templates;
import javax.xml.transform.TransformerConfigurationException;
import java.io.IOException;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
/**
* Provide cache for transformation templates.
*
* @author andrew00x
*/
@Provider
@Produces({MediaType.APPLICATION_XML, "application/*+xml", MediaType.TEXT_XML, "text/*+xml"})
public class XSLTTemplatesContextResolver implements ContextResolver<XSLTTemplatesContextResolver> {
/** All registered templates. */
private final ConcurrentMap<String, Templates> templatesMap = new ConcurrentHashMap<String, Templates>();
private final TemplatesParser templatesParser;
public XSLTTemplatesContextResolver(TemplatesParser templatesParser) {
this.templatesParser = templatesParser;
}
@Override
public XSLTTemplatesContextResolver getContext(Class<?> type) {
return this;
}
/**
* Parse and add given source as templates.
*
* @param name
* name to which templates will be mapped
* @param source
* templates' source
* @throws IllegalArgumentException
* if templates with specified {@code name} already registered
* @throws IOException
* if any i/o errors occurs
* @throws SAXException
* if given source can not be parsed
* @throws TransformerConfigurationException
* if templates handler can't be initialized
* @see Templates
* @see TransformerConfigurationException
*/
public void addAsTemplate(String name, Source source) throws IOException, SAXException, TransformerConfigurationException {
addTemplates(name, templatesParser.parseTemplates(source));
}
/**
* @throws IllegalArgumentException
* if templates with specified {@code name} already registered
*/
public void addTemplates(String name, Templates templates) {
if (templatesMap.putIfAbsent(name, templates) != null) {
throw new IllegalArgumentException(String.format("Template with name '%s' already registered", name));
}
}
public void removeTemplates(String name) {
templatesMap.remove(name);
}
/**
* Get templates with given name.
*
* @param name
* templates' name
* @return templates or <code>null</code> if no templates mapped to given name
*/
public Templates getTemplates(String name) {
return templatesMap.get(name);
}
}