/*
* Copyright (C) 2005-2012 BetaCONCEPT Limited
*
* This file is part of Astroboa.
*
* Astroboa is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Astroboa is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Astroboa. If not, see <http://www.gnu.org/licenses/>.
*/
package org.betaconceptframework.astroboa.engine.definition;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import javax.xml.XMLConstants;
import org.apache.commons.lang.StringUtils;
import org.betaconceptframework.astroboa.engine.definition.xsom.EntityResolverForBuiltInSchemas;
import org.betaconceptframework.astroboa.engine.jcr.dao.ContentDefinitionDao;
import org.betaconceptframework.astroboa.util.CmsConstants;
import org.springframework.beans.factory.annotation.Autowired;
import org.xml.sax.EntityResolver;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
/**
* Entity Resolver for REPOSITORY schemas defined in a repository.
*
* @author Gregory Chomatas (gchomatas@betaconcept.com)
* @author Savvas Triantafyllou (striantafyllou@betaconcept.com)
*
*/
public class RepositoryEntityResolver implements EntityResolver{
@Autowired
private ContentDefinitionDao contentDefinitionDao;
@Autowired
private EntityResolverForBuiltInSchemas entityResolverForBuiltInSchemas;
@Override
public InputSource resolveEntity(String publicId, String systemId)
throws SAXException, IOException {
if (XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI.equals(systemId) ||
XMLConstants.XML_NS_URI.equals(systemId) ||
CmsConstants.XML_SCHEMA_LOCATION.equals(systemId) ||
CmsConstants.XML_SCHEMA_DTD_LOCATION.equals(systemId)){
return entityResolverForBuiltInSchemas.resolveXmlSchemaRelatedToW3C(publicId, systemId);
}
byte[] schema = getSchema(systemId);
if (schema == null){
return null;
}
InputSource is = new InputSource(new ByteArrayInputStream(schema));
is.setSystemId(systemId);
is.setPublicId(publicId);
return is;
}
private byte[] getSchema(String systemId) {
if (StringUtils.isBlank(systemId)){
return null;
}
//We are only interested in content type name or path.
String schemaFilename = systemId;
//We expect URL of the form
//http://<server>/resource-api/<repository-id>/model/multilingualStringPropertyType?output=xsd
//Definition name is located after the last forward slash
if (schemaFilename.contains(CmsConstants.FORWARD_SLASH)){
schemaFilename = StringUtils.substringAfterLast(schemaFilename, CmsConstants.FORWARD_SLASH);
}
if (schemaFilename.contains("?")){
schemaFilename = StringUtils.substringBefore(schemaFilename, "?");
}
byte[] schema = contentDefinitionDao.getXMLSchemaFileForDefinition(schemaFilename);
if (schema == null || schema.length == 0){
return null;
}
return schema;
}
}