/*******************************************************************************
* This file is part of OpenNMS(R).
*
* Copyright (C) 2010-2011 The OpenNMS Group, Inc.
* OpenNMS(R) is Copyright (C) 1999-2011 The OpenNMS Group, Inc.
*
* OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc.
*
* OpenNMS(R) 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.
*
* OpenNMS(R) 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 OpenNMS(R). If not, see:
* http://www.gnu.org/licenses/
*
* For more information contact:
* OpenNMS(R) Licensing <license@opennms.org>
* http://www.opennms.org/
* http://www.opennms.com/
*******************************************************************************/
package org.opennms.protocols.sftp;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.TimeZone;
import java.util.Vector;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import com.jcraft.jsch.ChannelSftp.LsEntry;
import com.jcraft.jsch.SftpException;
/**
* The class for managing SFTP.3GPP URL Connection.
*
* @author <a href="mailto:agalue@opennms.org">Alejandro Galue</a>
*/
public class Sftp3gppUrlConnection extends SftpUrlConnection {
private Map<String,String> m_urlProperties;
/**
* Instantiates a new SFTP+3GPP URL connection.
*
* @param url the URL
*/
protected Sftp3gppUrlConnection(URL url) {
super(url);
}
/**
* Gets the path for 3GPP-A (NE Mode).
*
* @return the path for 3GPP-A (NE Mode)
* @throws SftpUrlException the SFTP URL exception
*/
@Override
protected String getPath() throws SftpUrlException {
File f = new File(url.getPath(), get3gppFileName());
String path = f.getAbsolutePath();
log().debug("getPath: retrieving data 3GPP (NE Mode) using " + path);
return path;
}
/**
* Gets the file name for 3GPP-A (NE Mode).
*
* @return the path for 3GPP-A (NE Mode)
* @throws SftpUrlException the SFTP URL exception
*/
public String get3gppFileName() throws SftpUrlException {
Map<String,String> properties = getQueryMap();
// Checking required parameters
if (!properties.containsKey("step")) {
throw new SftpUrlException("Missing parameter 'step'. 3GPP requires the Collection Step to generate the file name.");
}
if (!properties.containsKey("neid")) {
throw new SftpUrlException("Missing parameter 'neId'. 3GPP requires NE ID to generate the file name.");
}
// Build reference timestamp
long reference = System.currentTimeMillis();
String referenceStr = properties.get("referencetimestamp");
if (referenceStr != null) {
try {
Date d = new Date(Long.parseLong(referenceStr));
reference = d.getTime();
} catch (Exception e) {
throw new SftpUrlException("Invalid value for parameter 'referenceTimestamp': " + referenceStr);
}
}
long step = Long.parseLong(properties.get("step")) * 1000;
long timestamp = reference - reference % step; // normalize timestamp
log().debug("getPath: the reference timestamp used will be " + new Date(timestamp));
// Creating common time format objects
log().info("getPath: generating 3GPP file type A (NE Mode) using URL " + url);
SimpleDateFormat datef = new SimpleDateFormat("yyyyMMdd");
SimpleDateFormat timef = new SimpleDateFormat("HHmmZ");
// Timezone processing
String tz = properties.get("timezone");
if (tz == null) {
log().debug("getPath: time zone not provided, using current timezone " + TimeZone.getDefault().getID());
} else {
log().debug("getPath: using time zone " + TimeZone.getTimeZone(tz).getID());
datef.setTimeZone(TimeZone.getTimeZone(tz));
timef.setTimeZone(TimeZone.getTimeZone(tz));
}
// Processing 3GPP File Type A (NE Mode)
StringBuffer sb = new StringBuffer("A");
sb.append(datef.format(new Date(timestamp)));
sb.append(".");
sb.append(timef.format(new Date(timestamp-step)));
sb.append("-");
sb.append(timef.format(new Date(timestamp)));
sb.append("_");
sb.append(properties.get("neid"));
return sb.toString();
}
/**
* Gets the time stamp from 3GPP XML file name.
*
* @param fileName the 3GPP XML file name
* @return the time stamp from file
*/
public long getTimeStampFromFile(String fileName) {
Pattern p = Pattern.compile("\\w(\\d+)\\.(\\d+)-(\\d+)-(\\d+)-(\\d+)_.+");
Matcher m = p.matcher(fileName);
if (m.find()) {
String value = m.group(1) + '-' + m.group(4); // Using end date as a reference
try {
DateTimeFormatter dtf = DateTimeFormat.forPattern("yyyyMMdd-HHmm");
DateTime dateTime = dtf.parseDateTime(value);
return dateTime.getMillis();
} catch (Exception e) {
log().warn("getTimeStampFromFile: malformed 3GPP file " + fileName + ", because " + e.getMessage());
return 0;
}
}
return 0;
}
/**
* Gets the properties map from the URL Query..
*
* @return the query map
*/
public Map<String,String> getQueryMap() {
if (m_urlProperties == null) {
m_urlProperties = new HashMap<String,String>();
if (url.getQuery() != null) {
for (String pair : url.getQuery().split("&")) {
String data[] = pair.split("=");
m_urlProperties.put(data[0].toLowerCase(), data[1]);
}
}
}
return m_urlProperties;
}
/**
* Gets the file list (from the path defined on the URL).
*
* @return the file list
* @throws SftpException the SFTP exception
* @throws IOException Signals that an I/O exception has occurred.
*/
@SuppressWarnings("unchecked")
public List<String> getFileList() throws SftpException, IOException {
List<String> files = new ArrayList<String>();
Vector<LsEntry> entries = getChannel().ls(url.getPath());
for (LsEntry entry : entries) {
if (entry.getFilename().startsWith("."))
continue;
files.add(entry.getFilename());
}
Collections.sort(files);
return files;
}
/**
* Delete file (from the path defined on the URL).
*
* @param fileName the file name
* @throws SftpException the SFTP exception
* @throws IOException Signals that an I/O exception has occurred.
*/
public void deleteFile(String fileName) throws SftpException, IOException {
String deleteFlag = getQueryMap().get("deletefile");
if (deleteFlag != null && Boolean.parseBoolean(deleteFlag)) {
String file = url.getPath() + File.separatorChar + fileName;
log().debug("deleting file " + file + " from " + url.getHost());
getChannel().rm(file);
}
}
/**
* Gets the file (from the path defined on the URL).
*
* @param fileName the file name
* @return the file
* @throws SftpException the SFTP exception
* @throws IOException Signals that an I/O exception has occurred.
*/
public InputStream getFile(String fileName) throws SftpException, IOException {
return getChannel().get(url.getPath() + File.separatorChar + fileName);
}
}