blob: 5870fef4ea1e755b8251c62026e0b62dbaff5ae5 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF 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
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* 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.apache.oodt.opendapps;
//JDK imports
import java.io.FileNotFoundException;
import java.net.MalformedURLException;
import java.util.List;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import opendap.dap.DConnect;
import org.apache.oodt.cas.metadata.Metadata;
import org.apache.oodt.opendapps.config.DapRoot;
import org.apache.oodt.opendapps.config.OpendapConfig;
import org.apache.oodt.opendapps.config.OpendapConfigReader;
import org.apache.oodt.opendapps.extractors.DasMetadataExtractor;
import org.apache.oodt.opendapps.extractors.MetadataExtractor;
import org.apache.oodt.opendapps.extractors.NcmlMetadataExtractor;
import org.apache.oodt.opendapps.extractors.ThreddsMetadataExtractor;
import org.apache.oodt.opendapps.util.ProfileUtils;
import org.apache.oodt.profile.Profile;
import org.apache.oodt.profile.ProfileException;
import org.apache.oodt.profile.handlers.ProfileHandler;
import org.apache.oodt.xmlquery.XMLQuery;
/**
*
*
* A generic reusable OODT {@link ProfileHandler} for use in extracting metadata
* from OPeNDAP and THREDDS-accessible datasets.
*
*/
public class OpendapProfileHandler implements ProfileHandler {
private static final String PROFILE_HANDLER_ID = "OODT OPeNDAP Profile Handler";
private static Logger LOG = Logger.getLogger(OpendapProfileHandler.class
.getName());
private OpendapConfig conf;
public OpendapProfileHandler(){
}
/**
* Implementation of interface method
*/
public List<Profile> findProfiles(XMLQuery xmlQuery) throws ProfileException {
String configFileLoc = null;
String q = xmlQuery.getKwdQueryString();
if (q.contains("ConfigUrl=")){
Pattern parameterPattern = Pattern.compile("ConfigUrl=(.+?)( .*)?$");
Matcher fileMatch = parameterPattern.matcher(q);
while (fileMatch.find()) {
configFileLoc = fileMatch.group(1);
}
} else {
configFileLoc = System.getProperty("org.apache.oodt.opendap.config.filePath");
}
if (configFileLoc.isEmpty()){
throw new ProfileException(
"Configuration file not found. Please specify in System property opendap.config.filePath or as URL parameter ConfigUrl");
} else {
try {
this.conf = OpendapConfigReader.read(configFileLoc);
} catch (FileNotFoundException e) {
throw new ProfileException("FileNotFoundException: File not found!");
} catch (MalformedURLException e) {
throw new ProfileException("MalformedURLException: please fix file URL");
}
}
List<Profile> profiles = new Vector<Profile>();
List<DapRoot> roots = this.conf.getRoots();
// loop over THREDDS catalogs
for (DapRoot root : roots) {
LOG.log(Level.INFO,"Parsing DapRoot="+root.getDatasetUrl());
DatasetExtractor d = new DatasetExtractor(xmlQuery, root.getCatalogUrl()
.toExternalForm(), root.getDatasetUrl().toExternalForm(), conf);
if (d.getDapUrls() != null) {
for (String opendapUrl : d.getDapUrls()) {
// wrap the profile generation in try-catch to avoid stopping the whole harvesting process in case an exception is thrown
try {
LOG.log(Level.FINE,"Connecting to opendapurl="+opendapUrl);
Profile profile = new Profile();
DConnect dConn = null;
try {
dConn = new DConnect(opendapUrl, true);
} catch (FileNotFoundException e) {
LOG.log(Level.WARNING, "Opendap URL not found: [" + opendapUrl
+ "]: Message: " + e.getMessage());
throw new ProfileException("Opendap URL not found: [" + opendapUrl
+ "]: Message: " + e.getMessage());
}
// retrieve already extracted THREDDS metadata
Metadata datasetMet = d.getDatasetMet(opendapUrl);
// extract DAS metadata
MetadataExtractor dasExtractor = new DasMetadataExtractor(dConn);
dasExtractor.extract(datasetMet, conf);
// extract NcML metadata, if available
if (datasetMet.containsKey(ThreddsMetadataExtractor.SERVICE_TYPE_NCML)) {
// retrieve URL of NcML document, previously stored
final String ncmlUrl = datasetMet.getMetadata(ThreddsMetadataExtractor.SERVICE_TYPE_NCML);
MetadataExtractor ncmlExtractor = new NcmlMetadataExtractor(ncmlUrl);
ncmlExtractor.extract(datasetMet, conf);
}
// debug: write out all metadata entries
for (String key : datasetMet.getAllKeys()) {
LOG.log(Level.FINER, "Metadata key="+key+" value="+datasetMet.getMetadata(key));
}
// <resAttributes>
profile.setResourceAttributes(ProfileUtils.getResourceAttributes(
this.conf, opendapUrl, dConn, datasetMet));
// <profAttributes>
profile.setProfileAttributes(ProfileUtils
.getProfileAttributes(this.conf, datasetMet));
// <profElement>
profile.getProfileElements().putAll(
ProfileUtils.getProfileElements(this.conf, dConn, datasetMet, profile));
profiles.add(profile);
LOG.log(Level.FINE, "Added profile id="+profile.getProfileAttributes().getID());
} catch(Exception e) {
// in case of exception, don't harvest this dataset, but keep going
LOG.log(Level.WARNING,"Error while building profile for opendapurl="+opendapUrl);
LOG.log(Level.WARNING,e.getMessage());
}
}
}
}
return profiles;
}
/*
* (non-Javadoc)
*
* @see org.apache.oodt.profile.handlers.ProfileHandler#get(java.lang.String)
*/
public Profile get(String id) throws ProfileException {
throw new ProfileException("method not implemented yet!");
}
/*
* (non-Javadoc)
*
* @see org.apache.oodt.profile.handlers.ProfileHandler#getID()
*/
public String getID() {
return PROFILE_HANDLER_ID;
}
}