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