/* * 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"; } }