170c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll/* 270c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll * Copyright (C) 2011 The Android Open Source Project 370c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll * 470c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll * Licensed under the Apache License, Version 2.0 (the "License"); 570c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll * you may not use this file except in compliance with the License. 670c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll * You may obtain a copy of the License at 770c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll * 870c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll * http://www.apache.org/licenses/LICENSE-2.0 970c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll * 1070c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll * Unless required by applicable law or agreed to in writing, software 1170c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll * distributed under the License is distributed on an "AS IS" BASIS, 1270c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1370c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll * See the License for the specific language governing permissions and 1470c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll * limitations under the License. 1570c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll */ 1670c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll 17e46e7023069558853aad42f569a4d3fe6249d099Raphael Mollpackage com.android.sdkuilib.internal.repository.core; 1870c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll 1970c222d49c0a75e30b05337dbbb8110a39635aafRaphael Mollimport com.android.sdkuilib.internal.tasks.ILogUiProvider; 20ae6a209f6f4030e1ebe20118f9455547e4cd50fcXavier Ducrohetimport com.android.utils.ILogger; 2170c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll 2270c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll 2370c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll/** 24ae6a209f6f4030e1ebe20118f9455547e4cd50fcXavier Ducrohet * Adapter that transform log from an {@link ILogUiProvider} to an {@link ILogger}. 2570c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll */ 2670c222d49c0a75e30b05337dbbb8110a39635aafRaphael Mollpublic final class SdkLogAdapter implements ILogUiProvider { 2770c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll 28ae6a209f6f4030e1ebe20118f9455547e4cd50fcXavier Ducrohet private ILogger mSdkLog; 2970c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll private String mLastLogMsg; 3070c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll 3170c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll /** 3270c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll * Creates a new adapter to output log on the given {@code sdkLog}. 3370c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll * 3470c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll * @param sdkLog The logger to output to. Must not be null. 3570c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll */ 36ae6a209f6f4030e1ebe20118f9455547e4cd50fcXavier Ducrohet public SdkLogAdapter(ILogger sdkLog) { 3770c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll mSdkLog = sdkLog; 3870c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll } 3970c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll 4070c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll /** 4170c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll * Sets the description in the current task dialog. 4270c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll * This method can be invoked from a non-UI thread. 4370c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll */ 4470c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll @Override 4570c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll public void setDescription(final String description) { 4670c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll if (acceptLog(description)) { 47ae6a209f6f4030e1ebe20118f9455547e4cd50fcXavier Ducrohet mSdkLog.info("%1$s", description); //$NON-NLS-1$ 4870c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll } 4970c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll } 5070c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll 5170c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll /** 5270c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll * Logs a "normal" information line. 5370c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll * This method can be invoked from a non-UI thread. 5470c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll */ 5570c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll @Override 5670c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll public void log(String log) { 5770c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll if (acceptLog(log)) { 58ae6a209f6f4030e1ebe20118f9455547e4cd50fcXavier Ducrohet mSdkLog.info(" %1$s", log); //$NON-NLS-1$ 5970c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll } 6070c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll } 6170c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll 6270c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll /** 6370c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll * Logs an "error" information line. 6470c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll * This method can be invoked from a non-UI thread. 6570c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll */ 6670c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll @Override 6770c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll public void logError(String log) { 6870c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll if (acceptLog(log)) { 6970c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll mSdkLog.error(null, " %1$s", log); //$NON-NLS-1$ 7070c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll } 7170c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll } 7270c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll 7370c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll /** 7470c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll * Logs a "verbose" information line, that is extra details which are typically 7570c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll * not that useful for the end-user and might be hidden until explicitly shown. 7670c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll * This method can be invoked from a non-UI thread. 7770c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll */ 7870c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll @Override 7970c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll public void logVerbose(String log) { 8070c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll if (acceptLog(log)) { 81ae6a209f6f4030e1ebe20118f9455547e4cd50fcXavier Ducrohet mSdkLog.verbose(" %1$s", log); //$NON-NLS-1$ 8270c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll } 8370c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll } 8470c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll 8570c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll // ---- 8670c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll 8770c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll /** 8870c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll * Filter messages displayed in the log: <br/> 8970c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll * - Messages with a % are typical part of a progress update and shouldn't be in the log. <br/> 9070c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll * - Messages that are the same as the same output message should be output a second time. 9170c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll * 9270c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll * @param msg The potential log line to print. 9370c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll * @return True if the log line should be printed, false otherwise. 9470c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll */ 9570c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll private boolean acceptLog(String msg) { 9670c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll if (msg == null) { 9770c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll return false; 9870c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll } 9970c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll 10070c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll msg = msg.trim(); 10170c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll if (msg.indexOf('%') != -1) { 10270c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll return false; 10370c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll } 10470c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll 10570c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll if (msg.equals(mLastLogMsg)) { 10670c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll return false; 10770c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll } 10870c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll 10970c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll mLastLogMsg = msg; 11070c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll return true; 11170c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll } 11270c222d49c0a75e30b05337dbbb8110a39635aafRaphael Moll} 113