/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE file at the root of the source
* tree and available online at
*
* https://github.com/keeps/roda
*/
package org.roda.core;
import java.io.InputStream;
import java.util.Optional;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import org.apache.commons.lang3.StringUtils;
import org.roda.core.common.RodaUtils;
import org.roda.core.common.validation.ResourceResolver;
import org.roda.core.data.common.RodaConstants;
import org.roda.core.data.v2.common.Pair;
import com.google.common.cache.CacheLoader;
public class SchemasCacheLoader extends CacheLoader<Pair<String, String>, Optional<Schema>> {
@Override
public Optional<Schema> load(Pair<String, String> pair) throws Exception {
String metadataType = pair.getFirst();
String metadataTypeLowerCase = metadataType.toLowerCase();
String metadataVersion = pair.getSecond();
String metadataVersionLowerCase = "";
if (metadataVersion != null) {
metadataVersionLowerCase = metadataVersion.toLowerCase();
}
String schemaFileName;
if (StringUtils.isNotEmpty(metadataVersion)) {
schemaFileName = metadataTypeLowerCase + RodaConstants.METADATA_VERSION_SEPARATOR + metadataVersionLowerCase
+ ".xsd";
} else {
schemaFileName = metadataTypeLowerCase + ".xsd";
}
String schemaPath = RodaConstants.CORE_SCHEMAS_FOLDER + "/" + schemaFileName;
InputStream schemaStream = RodaCoreFactory.getConfigurationFileAsStream(schemaPath);
Schema xmlSchema = null;
try {
SchemaFactory schemaFactory = SchemaFactory.newInstance(RodaConstants.W3C_XML_SCHEMA_NS_URI);
schemaFactory.setResourceResolver(new ResourceResolver());
xmlSchema = schemaFactory.newSchema(new StreamSource(schemaStream));
} finally {
RodaUtils.closeQuietly(schemaStream);
}
return Optional.ofNullable(xmlSchema);
}
}