blob: e4cdc56361dec9f2134154d76fe30d4ccacf6f6d [file] [log] [blame]
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed 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 com.motorola.studio.android.logger;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.NullProgressMonitor;
import com.motorola.studio.android.AndroidPlugin;
import com.motorola.studio.android.adt.DDMSFacade;
import com.motorola.studio.android.common.log.StudioLogger;
import com.motorola.studio.android.logger.collector.core.ILogFile;
/**
* This class is the Implementation of ILogFile that is responsible to collect device properties and write them to files.
* These files will be used by the Collect Logs functionality
*/
public class DevicePropertyLogger implements ILogFile
{
private final Collection<String> serialNumbers;
private final Map<String, Map<String, String>> properties;
public DevicePropertyLogger()
{
serialNumbers = DDMSFacade.getConnectedSerialNumbers();
properties = new HashMap<String, Map<String, String>>(serialNumbers.size());
for (String serialNumber : serialNumbers)
{
Map<String, String> propertiesMap = new HashMap<String, String>(140);
String deviceName = DDMSFacade.getNameBySerialNumber(serialNumber);
try
{
Collection<String> lines =
DDMSFacade
.execRemoteApp(serialNumber, "getprop", new NullProgressMonitor());
for (String line : lines)
{
String[] split = line.split(":");
StringBuffer buffer = new StringBuffer();
for (int i = 1; i < split.length; i++)
{
buffer.append(split[i]);
}
if (!"".equals(split[0]))
{
propertiesMap.put(split[0], buffer.toString());
}
}
}
catch (IOException e)
{
StudioLogger.error(getClass(), "Unable to execute getprop command on device "
+ deviceName, e);
}
properties.put((deviceName), propertiesMap);
}
}
/*
* (non-Javadoc)
* @see com.motorola.studio.android.logger.collector.core.ILogFile#getLogFilePath()
*/
public List<IPath> getLogFilePath()
{
ArrayList<IPath> logs = new ArrayList<IPath>(properties.keySet().size());
IPath LOG_PATH = AndroidPlugin.getDefault().getStateLocation();
for (String devicename : properties.keySet())
{
IPath log = LOG_PATH.append(devicename + "_devProperties.log");
writeLogFile(log, properties.get(devicename));
logs.add(log);
}
return logs;
}
private void writeLogFile(IPath log, Map<String, String> devProperties)
{
File logFile = log.toFile();
BufferedWriter bw = null;
try
{
bw = new BufferedWriter(new FileWriter(logFile));
for (String propKey : devProperties.keySet())
{
bw.append(propKey + "=" + devProperties.get(propKey)
+ System.getProperty("line.separator"));
}
}
catch (IOException e)
{
StudioLogger.error(getClass(),
"An error occurred while trying to write device Properties log file, "
+ logFile.getAbsolutePath(), e);
}
finally
{
try
{
bw.flush();
bw.close();
}
catch (IOException e)
{
StudioLogger.error("Could not close stream while writing device property log. "
+ e.getMessage());
}
}
}
/*
* (non-Javadoc)
* @see com.motorola.studio.android.logger.collector.core.ILogFile#getLogName()
*/
public String getLogName()
{
return "Device properties";
}
/*
* (non-Javadoc)
* @see com.motorola.studio.android.logger.collector.core.ILogFile#getOutputSubfolderName()
*/
public String getOutputSubfolderName()
{
return "Devices";
}
}