package nl.ipo.cds.deegree.metadata.provider;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamReader;
import javax.xml.transform.dom.DOMSource;
import nl.ipo.cds.dao.metadata.MetadataDao;
import nl.ipo.cds.deegree.metadata.jaxb.DeegreeServicesMetadata;
import nl.ipo.cds.deegree.metadata.jaxb.ExtendedCapabilitiesType;
import org.apache.axiom.om.OMElement;
import org.deegree.commons.xml.XMLAdapter;
import org.deegree.services.metadata.OWSMetadataProvider;
import org.deegree.spring.ApplicationContextHolder;
import org.deegree.spring.ApplicationContextHolderProvider;
import org.deegree.workspace.ResourceBuilder;
import org.deegree.workspace.ResourceInitException;
import org.deegree.workspace.Workspace;
class DatabaseMetadataProviderBuilder implements ResourceBuilder<OWSMetadataProvider> {
private final DeegreeServicesMetadata config;
private final DatabaseMetadataProviderMetadata metadata;
private final Workspace workspace;
DatabaseMetadataProviderBuilder( DeegreeServicesMetadata md, DatabaseMetadataProviderMetadata metadata, Workspace workspace ) {
this.config = md;
this.metadata = metadata;
this.workspace = workspace;
}
@Override
public DatabaseMetadataProvider build() {
try {
Map<String, List<OMElement>> extendedCapabilities = new HashMap<String, List<OMElement>>();
if ( config.getExtendedCapabilities() != null ) {
for ( ExtendedCapabilitiesType ex : config.getExtendedCapabilities() ) {
String version = ex.getProtocolVersions();
if ( version == null ) {
version = "default";
}
List<OMElement> list = extendedCapabilities.get( version );
if ( list == null ) {
list = new ArrayList<OMElement>();
extendedCapabilities.put( version, list );
}
DOMSource domSource = new DOMSource( ex.getAny() );
XMLStreamReader xmlStream;
try {
xmlStream = XMLInputFactory.newInstance().createXMLStreamReader( domSource );
} catch ( Exception t ) {
throw new ResourceInitException( "Error extracting extended capabilities: " + t.getMessage(), t );
}
list.add( new XMLAdapter( xmlStream ).getRootElement() );
}
}
ApplicationContextHolder contextHolder = workspace.getResource(ApplicationContextHolderProvider.class, config.getApplicationContextHolder());
MetadataDao metadataDao = contextHolder.getApplicationContext().getBean(MetadataDao.class);
return new DatabaseMetadataProvider(metadataDao, extendedCapabilities, metadata );
} catch ( Exception e ) {
throw new ResourceInitException( "Unable to read service metadata config: " + e.getLocalizedMessage(), e );
}
}
}