tikhomirov@295: /* tikhomirov@571: * Copyright (c) 2011-2013 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.core; tikhomirov@295: tikhomirov@698: import java.net.URI; tikhomirov@698: tikhomirov@698: import org.tmatesoft.hg.internal.BasicSessionContext; tikhomirov@698: import org.tmatesoft.hg.internal.Experimental; tikhomirov@698: import org.tmatesoft.hg.internal.remote.RemoteConnectorDescriptor; tikhomirov@698: import org.tmatesoft.hg.repo.HgLookup.RemoteDescriptor; tikhomirov@295: import org.tmatesoft.hg.util.LogFacility; tikhomirov@571: import org.tmatesoft.hg.util.Path; tikhomirov@295: tikhomirov@295: /** tikhomirov@456: * Access to objects that might need to be shared between various distinct operations ran during the same working session tikhomirov@456: * (i.e. caches, log, etc.). It's unspecified whether session context is per repository or can span multiple repositories tikhomirov@295: * tikhomirov@456: *

Note, API is likely to be extended in future versions, adding more object to share. tikhomirov@295: * tikhomirov@295: * @author Artem Tikhomirov tikhomirov@295: * @author TMate Software Ltd. tikhomirov@295: */ tikhomirov@456: public abstract class SessionContext { tikhomirov@456: // abstract class to facilitate adding more functionality without API break tikhomirov@338: tikhomirov@338: /** tikhomirov@456: * Access wrapper for a system log facility. tikhomirov@456: * @return facility to direct dumps to, never null tikhomirov@338: */ tikhomirov@456: public abstract LogFacility getLog(); tikhomirov@456: tikhomirov@456: /** tikhomirov@456: * Access configuration parameters of the session. tikhomirov@456: * @param name name of the session configuration parameter tikhomirov@456: * @param defaultValue value to return if parameter is not configured tikhomirov@456: * @return value of the session parameter, defaultValue if none found tikhomirov@456: */ tikhomirov@456: public abstract Object getConfigurationProperty(String name, Object defaultValue); tikhomirov@456: // perhaps, later may add Configuration object, with PropertyMarshal's helpers tikhomirov@456: // e.g. when there's standalone Caches and WritableSessionProperties objects tikhomirov@490: tikhomirov@490: /** tikhomirov@571: * Provide a factory to create {@link Path} objects. tikhomirov@571: * tikhomirov@571: * Occasionally, there's a need to construct a {@link Path} object from a string/byte data tikhomirov@571: * kept in mercurial control files. Generally, default implementation (with {@link Path#create(CharSequence)} tikhomirov@571: * is enough, however, if there's a need to control number of string objects in memory (i.e. prevent duplicates), tikhomirov@571: * default implementation might need to be replaced with more sophisticated (e.g. using weak references or tikhomirov@571: * just a huge hash set). tikhomirov@571: * tikhomirov@571: * @return factory to construct Path objects, never null tikhomirov@571: */ tikhomirov@571: public Path.Source getPathFactory() { tikhomirov@571: return new Path.Source() { tikhomirov@571: public Path path(CharSequence p) { tikhomirov@571: return Path.create(p); tikhomirov@571: } tikhomirov@571: }; tikhomirov@571: } tikhomirov@571: tikhomirov@571: /** tikhomirov@698: * Work in progress, provisional API. tikhomirov@698: * tikhomirov@698: * Provides descriptor that knows how to handle connections of specific kind tikhomirov@698: * tikhomirov@698: * FIXME Perhaps, implementation here shall return null for any URI, while the one tikhomirov@698: * in {@link BasicSessionContext} shall use our internal classes? However, tikhomirov@698: * present implementation provides support for uris handled in the library itself, and likely tikhomirov@698: * most clients need this, even if they supply own SessionContext tikhomirov@698: * tikhomirov@698: * @return null if supplied URI doesn't point to a remote repository or repositories of that kind are not supported tikhomirov@698: */ tikhomirov@698: @Experimental(reason="Work in progress, provisional API") tikhomirov@698: public RemoteDescriptor getRemoteDescriptor(URI uri) { tikhomirov@698: return new RemoteConnectorDescriptor.Provider().get(this, uri); tikhomirov@698: } tikhomirov@698: tikhomirov@698: /** tikhomirov@490: * Providers of the context may implement tikhomirov@490: */ tikhomirov@490: public interface Source { tikhomirov@490: SessionContext getSessionContext(); tikhomirov@490: } tikhomirov@667: tikhomirov@667: public static final class SourcePrim implements Source { tikhomirov@667: private final SessionContext ctx; tikhomirov@667: tikhomirov@667: public SourcePrim(SessionContext sessionContext) { tikhomirov@667: assert sessionContext != null; tikhomirov@667: ctx = sessionContext; tikhomirov@667: } tikhomirov@667: public SessionContext getSessionContext() { tikhomirov@667: return ctx; tikhomirov@667: } tikhomirov@667: } tikhomirov@295: }