/**
* Copyright (c) Codice Foundation
* <p>
* This is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser
* General Public License as published by the Free Software Foundation, either version 3 of the
* License, or any later version.
* <p>
* This program 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
* Lesser General Public License for more details. A copy of the GNU Lesser General Public License
* is distributed along with this program and can be found at
* <http://www.gnu.org/licenses/lgpl.html>.
*/
package org.codice.ddf.spatial.admin.module.service;
import java.lang.management.ManagementFactory;
import javax.management.InstanceAlreadyExistsException;
import javax.management.MBeanServer;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
import org.apache.commons.io.FilenameUtils;
import org.codice.ddf.spatial.geocoding.GeoEntryExtractionException;
import org.codice.ddf.spatial.geocoding.GeoEntryExtractor;
import org.codice.ddf.spatial.geocoding.GeoEntryIndexer;
import org.codice.ddf.spatial.geocoding.GeoEntryIndexingException;
import org.codice.ddf.spatial.geocoding.GeoNamesRemoteDownloadException;
import org.codice.ddf.spatial.geocoding.ProgressCallback;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Geocoding implements GeocodingMBean {
private static final Logger LOGGER = LoggerFactory.getLogger(Geocoding.class);
private static final String BASE_DIR = System.getProperty("user.dir") + "/content/store/";
public GeoEntryExtractor geoEntryExtractor;
public GeoEntryIndexer geoEntryIndexer;
private int progress = 0;
public Geocoding() {
registerMbean();
}
private void registerMbean() {
ObjectName objectName = null;
MBeanServer mBeanServer = null;
try {
objectName = new ObjectName(Geocoding.class.getName() + ":service=geocoding");
mBeanServer = ManagementFactory.getPlatformMBeanServer();
} catch (MalformedObjectNameException e) {
LOGGER.info("Unable to create Geocoding Configuration MBean.", e);
}
if (mBeanServer != null) {
try {
try {
mBeanServer.registerMBean(this, objectName);
LOGGER.debug("Registered Geocoding Configuration MBean under object name: {}",
objectName.toString());
} catch (InstanceAlreadyExistsException e) {
// Try to remove and re-register
mBeanServer.unregisterMBean(objectName);
mBeanServer.registerMBean(this, objectName);
LOGGER.debug("Re-registered Geocoding Configuration MBean");
}
} catch (Exception e) {
//objectName is not always non-null because new ObjectName(...) can throw an exception
LOGGER.info("Could not register MBean [{}].",
objectName != null ?
objectName.toString() :
Geocoding.class.getName(),
e);
}
}
}
@Override
public boolean updateGeoIndexWithUrl(String url, String createIndex) {
progress = 0;
String countryCode = FilenameUtils.getBaseName(url);
url = FilenameUtils.getPath(url);
LOGGER.debug("Downloading : {}{}.zip", url, countryCode);
LOGGER.debug("Create Index : {}", createIndex);
if (url != null) {
geoEntryExtractor.setUrl(url);
}
return updateIndex(countryCode, createIndex.equals("true"));
}
@Override
public boolean updateGeoIndexWithFilePath(String fileName, String contentFolderId,
String createIndex) {
progress = 0;
fileName = BASE_DIR + contentFolderId + "/" + fileName;
LOGGER.debug("Adding {} to index. Create New Index : {}", fileName, createIndex);
return updateIndex(fileName, createIndex.equals("true"));
}
@Override
public int progressCallback() {
return progress;
}
private boolean updateIndex(String resource, boolean createIndex) {
final ProgressCallback progressCallback = new ProgressCallback() {
@Override
public void updateProgress(final int progress) {
setProgress(progress);
}
};
LOGGER.trace("Updating GeoNames Index...");
try {
geoEntryIndexer.updateIndex(resource, geoEntryExtractor, createIndex, progressCallback);
LOGGER.trace("\nDone Updating GeoNames Index.");
LOGGER.debug("Done Updating GeoNames Index with : {}", resource);
return true;
} catch (GeoEntryExtractionException e) {
LOGGER.debug("Error extracting GeoNames data from resource {}", resource, e);
return false;
} catch (GeoEntryIndexingException e) {
LOGGER.debug("Error indexing GeoNames data", e);
return false;
} catch (GeoNamesRemoteDownloadException e) {
LOGGER.debug("Error downloading resource from remote source {}", resource, e);
return false;
}
}
public void setProgress(int progress) {
this.progress = progress;
}
public GeoEntryExtractor getGeoEntryExtractor() {
return this.geoEntryExtractor;
}
public void setGeoEntryExtractor(GeoEntryExtractor geoEntryExtractor) {
this.geoEntryExtractor = geoEntryExtractor;
}
public GeoEntryIndexer getGeoEntryIndexer() {
return this.geoEntryIndexer;
}
public void setGeoEntryIndexer(GeoEntryIndexer geoEntryIndexer) {
this.geoEntryIndexer = geoEntryIndexer;
}
}