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: }