tikhomirov@295: /* tikhomirov@388: * Copyright (c) 2011-2012 TMate Software Ltd tikhomirov@295: * tikhomirov@295: * This program is free software; you can redistribute it and/or modify tikhomirov@295: * it under the terms of the GNU General Public License as published by tikhomirov@295: * the Free Software Foundation; version 2 of the License. tikhomirov@295: * tikhomirov@295: * This program is distributed in the hope that it will be useful, tikhomirov@295: * but WITHOUT ANY WARRANTY; without even the implied warranty of tikhomirov@295: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the tikhomirov@295: * GNU General Public License for more details. tikhomirov@295: * tikhomirov@295: * For information on how to redistribute this software under tikhomirov@295: * the terms of a license other than GNU General Public License tikhomirov@295: * contact TMate Software at support@hg4j.com tikhomirov@295: */ tikhomirov@295: package org.tmatesoft.hg.internal; tikhomirov@295: tikhomirov@388: import java.util.Collections; tikhomirov@388: import java.util.Map; tikhomirov@388: tikhomirov@295: import org.tmatesoft.hg.core.SessionContext; tikhomirov@295: import org.tmatesoft.hg.util.LogFacility; tikhomirov@295: tikhomirov@295: /** tikhomirov@295: * tikhomirov@295: * @author Artem Tikhomirov tikhomirov@295: * @author TMate Software Ltd. tikhomirov@295: */ tikhomirov@295: public class BasicSessionContext implements SessionContext { tikhomirov@295: tikhomirov@407: private LogFacility logFacility; tikhomirov@388: private final Map properties; tikhomirov@295: tikhomirov@431: public BasicSessionContext(LogFacility log) { tikhomirov@431: this(null, log); tikhomirov@388: } tikhomirov@388: tikhomirov@388: @SuppressWarnings("unchecked") tikhomirov@431: public BasicSessionContext(Map propertyOverrides, LogFacility log) { tikhomirov@407: logFacility = log; tikhomirov@388: properties = propertyOverrides == null ? Collections.emptyMap() : (Map) propertyOverrides; tikhomirov@295: } tikhomirov@295: tikhomirov@295: public LogFacility getLog() { tikhomirov@295: // e.g. for exceptions that we can't handle but log (e.g. FileNotFoundException when we've checked beforehand file.canRead() tikhomirov@407: if (logFacility == null) { tikhomirov@407: boolean needDebug = _getBooleanProperty("hg.consolelog.debug", false); tikhomirov@407: boolean needInfo = needDebug || _getBooleanProperty("hg.consolelog.info", false); tikhomirov@407: logFacility = new StreamLogFacility(needDebug, needInfo, true, System.out); tikhomirov@407: } tikhomirov@295: return logFacility; tikhomirov@295: } tikhomirov@407: tikhomirov@407: private boolean _getBooleanProperty(String name, boolean defaultValue) { tikhomirov@407: // can't use and unchecked cast because got no confidence passed properties are strictly of the kind of my default values, tikhomirov@407: // i.e. if boolean from outside comes as "true", while I pass default as Boolean or vice versa. tikhomirov@407: Object p = getProperty(name, defaultValue); tikhomirov@407: return p instanceof Boolean ? ((Boolean) p).booleanValue() : Boolean.parseBoolean(String.valueOf(p)); tikhomirov@407: } tikhomirov@295: tikhomirov@407: // TODO specific helpers for boolean and int values tikhomirov@338: public Object getProperty(String name, Object defaultValue) { tikhomirov@407: // NOTE, this method is invoked from getLog(), hence do not call getLog from here unless changed appropriately tikhomirov@388: Object value = properties.get(name); tikhomirov@388: if (value != null) { tikhomirov@388: return value; tikhomirov@388: } tikhomirov@388: value = System.getProperty(name); tikhomirov@338: return value == null ? defaultValue : value; tikhomirov@338: } tikhomirov@295: }