Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'proctools/plugins/org.eclipse.sequoyah.device.linuxtools/src/org/eclipse/sequoyah/linuxtools/tools/cpuload/CpuLoadProcessor.java')
-rw-r--r--proctools/plugins/org.eclipse.sequoyah.device.linuxtools/src/org/eclipse/sequoyah/linuxtools/tools/cpuload/CpuLoadProcessor.java280
1 files changed, 280 insertions, 0 deletions
diff --git a/proctools/plugins/org.eclipse.sequoyah.device.linuxtools/src/org/eclipse/sequoyah/linuxtools/tools/cpuload/CpuLoadProcessor.java b/proctools/plugins/org.eclipse.sequoyah.device.linuxtools/src/org/eclipse/sequoyah/linuxtools/tools/cpuload/CpuLoadProcessor.java
new file mode 100644
index 0000000000..a61aa62116
--- /dev/null
+++ b/proctools/plugins/org.eclipse.sequoyah.device.linuxtools/src/org/eclipse/sequoyah/linuxtools/tools/cpuload/CpuLoadProcessor.java
@@ -0,0 +1,280 @@
+/********************************************************************************
+ * Copyright (c) 2008 Motorola Inc. All rights reserved.
+ * This program and the accompanying materials are made available under the terms
+ * of the Eclipse Public License v1.0 which accompanies this distribution, and is
+ * available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Initial Contributor:
+ * Otávio Ferranti (Motorola)
+ *
+ * Contributors:
+ * {Name} (company) - description of contribution.
+ ********************************************************************************/
+
+package org.eclipse.tml.linuxtools.tools.cpuload;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Scanner;
+import java.util.regex.MatchResult;
+
+import org.eclipse.tml.common.utilities.logger.ILogger;
+
+import org.eclipse.tml.linuxtools.LinuxToolsPlugin;
+import org.eclipse.tml.linuxtools.network.IConstants.CommandCode;
+import org.eclipse.tml.linuxtools.network.IConstants.EventCode;
+import org.eclipse.tml.linuxtools.network.IConnectionProvider;
+import org.eclipse.tml.linuxtools.tools.AbstractNotifier;
+import org.eclipse.tml.linuxtools.tools.IListener;
+import org.eclipse.tml.linuxtools.tools.INotifier;
+
+/**
+ * @author Otávio Ferranti
+ */
+public class CpuLoadProcessor extends AbstractNotifier implements IListener {
+
+ final private String CMD_FETCH_STAT = "/proc/stat"; //$NON-NLS-1$
+ final private String PARSE_PATTERN_1 = "cpu(\\d*)(.*)"; //$NON-NLS-1$;
+ final private String PARSE_PATTERN_2 = "\\s+(\\d+)"; //$NON-NLS-1$;
+ final private String DATA_FORMAT = "%1$02.1f %%"; //$NON-NLS-1$;
+
+ final private String MSG_EXECUTING_COMMAND =
+ Messages.CpuLoadProcessor_Msg_Executing_the_command;
+
+ final private String MSG_GOT_RESULT =
+ Messages.CpuLoadProcessor_Msg_Got_The_Result;
+
+ final private int MAX_COLUMNS = 100;
+
+ private int[][] previousData = null;
+ private long[] previousTotal = null;
+ private IConnectionProvider connectionProvider = null;
+
+ private ILogger logger = null;
+
+ /**
+ * The constructor;
+ * @param connectionProvider
+ */
+ public CpuLoadProcessor(IConnectionProvider connectionProvider) {
+ setConnectionProvider(connectionProvider);
+ logger = LinuxToolsPlugin.getLogger();
+ }
+
+ /**
+ * Requests data.
+ * @throws IOException
+ */
+ public void gatherData() throws IOException {
+ this.connectionProvider.sendCommand(CommandCode.FETCH_FILE, this.CMD_FETCH_STAT);
+ logger.debug(MSG_EXECUTING_COMMAND + "\n" + this.CMD_FETCH_STAT); //$NON-NLS-1$
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.tml.linuxtools.network.IListener#notify(org.eclipse.tml.linuxtools.network.INotifier, org.eclipse.tml.linuxtools.network.IConstants.EventCode, java.lang.Object)
+ */
+ public void notify(INotifier notifier,
+ EventCode event,
+ Object result) {
+ if (notifier == this.connectionProvider &&
+ event == EventCode.EVT_PROVIDER_SENDCOMMAND_FINISHED) {
+ Object[][] parsedResult = parseStat((StringBuffer) result);
+ this.notifyListeners(EventCode.EVT_PROCESSOR_GATHERDATA_FINISHED,
+ parsedResult);
+ }
+ }
+
+ /**
+ * Set the connection provider.
+ * @param connectionProvider
+ */
+ public void setConnectionProvider (IConnectionProvider connectionProvider) {
+ if (null != this.connectionProvider) {
+ this.connectionProvider.removeListener(this);
+ }
+ this.connectionProvider = connectionProvider;
+ if (null != this.connectionProvider) {
+ this.connectionProvider.addListener(this);
+ }
+ }
+
+ /**
+ * @param currentDataStr
+ * @return
+ */
+ private Object[][] calculateTimes(String[][] currentDataStr) {
+ String[][] resultStr = null;
+
+ if (null == currentDataStr) {
+ currentDataStr = new String[][] {{"0"}};
+ }
+ if (null == previousData) {
+ previousData = new int[][] {{0}};
+ previousTotal = new long[] {1};
+ }
+ if (previousData.length != currentDataStr.length ||
+ previousData[0].length != currentDataStr[0].length) {
+ previousData = String2int(currentDataStr);
+ previousTotal = new long[previousData.length];
+
+ for (int j = 0; j < previousData.length; j++) {
+ long total = 0;
+ for (int i = 0; i < previousData[0].length; i++) {
+ total += previousData[j][i];
+ }
+ previousTotal[j] = total;
+ }
+ }
+ final int[][] currentDataInt = String2int(currentDataStr);
+ float[][] resultFloat = new float[currentDataStr.length][currentDataStr[0].length];
+
+ for (int j = 0; j < currentDataInt.length; j++) {
+ long total = 0;
+ for (int i = 0; i < currentDataInt[0].length; i++) {
+ total += currentDataInt[j][i];
+ }
+ float deltaTotal = total - previousTotal[j];
+ previousTotal[j] = total;
+ for (int i = 0; i < currentDataInt[0].length; i++) {
+ float deltaData = currentDataInt[j][i] - previousData[j][i];
+ if (0 == deltaTotal) {
+ resultFloat[j][i] = 0;
+ } else {
+ resultFloat[j][i] = 100* deltaData / deltaTotal;
+ }
+ }
+ }
+ previousData = currentDataInt;
+ resultStr = float2StringFormated(resultFloat, DATA_FORMAT);
+ return resultStr;
+ }
+
+ /**
+ * @param target
+ * @param Source
+ */
+ private void copyData(Object[][] target, Object[][] Source) {
+ for (int j = 0; j < target.length; j++) {
+ for (int i = 1; i < target[0].length; i++) {
+ target[j][i] = Source[j][i-1];
+ }
+ }
+ }
+
+ /**
+ * @param input
+ * @return
+ */
+ private String[][] float2StringFormated (float[][] input, String format) {
+ String[][] output = null;
+ if (null != input) {
+ output = new String[input.length][input[0].length];
+ for (int j = 0; j < output.length; j++) {
+ for (int i = 0; i < output[0].length; i++) {
+ output[j][i] = String.format(format, new Float(input[j][i]));
+ }
+ }
+ }
+ return output;
+ }
+
+ /**
+ * @param data
+ * @return
+ */
+ private Object[][] parseStat(StringBuffer data) {
+ logger.debug(MSG_GOT_RESULT + "\n" + data.toString());
+
+ int requiredColumns = 0;
+
+ Scanner s1 = new Scanner(data.toString());
+ ArrayList<String[]> list = new ArrayList<String[]>();
+
+ while (s1.hasNextLine()) {
+ String[] entry = new String[MAX_COLUMNS];;
+
+ Scanner s2 = new Scanner(s1.nextLine());
+ s2.findInLine(PARSE_PATTERN_1);
+
+ try {
+
+ MatchResult result = s2.match();
+ entry[0] = result.group(1).trim();
+
+ String aux = result.group(2);
+
+ Scanner s3 = new Scanner(aux);
+ entry[1] = s3.findInLine(PARSE_PATTERN_2).trim();
+
+ s3.match();
+ int i = 2;
+
+ while (s3.hasNext() && i < MAX_COLUMNS) {
+ entry[i] = s3.next().trim();
+
+ if (i > requiredColumns) {
+ requiredColumns = i;
+ }
+ i++;
+ }
+ s3.close();
+ if (null != entry) {
+ list.add(entry);
+ }
+ } catch (IllegalStateException ise) {
+ }
+ s2.close();
+ }
+ s1.close();
+
+ String[][] dataAux = new String[list.size()][requiredColumns + 1];
+ for (int j = 0; j < dataAux.length; j++) {
+ for (int i = 0; i < dataAux[0].length; i++) {
+ dataAux[j][i] = list.get(j)[i];
+ }
+ }
+ String[][] dataStrippedAux = stripFirstColumn(dataAux);
+ Object[][] result = calculateTimes(dataStrippedAux);
+ copyData(dataAux, result);
+ return dataAux;
+ }
+
+ /**
+ * @param input
+ * @return
+ */
+ private int[][] String2int (String[][] input) {
+ int[][] output = null;
+ if (null != input) {
+ output = new int[input.length][input[0].length];
+ for (int j = 0; j < output.length; j++) {
+ for (int i = 0; i < output[0].length; i++) {
+ try {
+ output[j][i] = new Integer(input[j][i]).intValue();
+ }
+ catch (NumberFormatException nfe) {
+ output[j][i] = -1;
+ }
+ }
+ }
+ }
+ return output;
+ }
+
+ /**
+ * @param input
+ * @return
+ */
+ private String[][] stripFirstColumn (String[][] input) {
+ String output[][] = null;
+ if (null != input) {
+ output = new String[input.length][input[0].length-1];
+ for (int j = 0; j < output.length; j++) {
+ for (int i = 0; i < output[0].length; i++) {
+ output[j][i] = input[j][i+1];
+ }
+ }
+ }
+ return output;
+ }
+}

Back to the top