command.line/java/com/jetbrains/teamcity/resources/TCWorkspace.java (106 lines of code) (raw):
package com.jetbrains.teamcity.resources;
import com.jetbrains.teamcity.Debug;
import com.jetbrains.teamcity.Storage;
import java.io.File;
import java.io.IOException;
import java.text.MessageFormat;
import java.util.HashMap;
import org.jetbrains.annotations.NotNull;
public class TCWorkspace {
public static final String TCC_ADMIN_FILE = ".teamcity-mappings.properties";
static final String TCC_GLOBAL_ADMIN_FILE = new File(System.getProperty("user.home"), Storage.TC_CLI_HOME + File.separator + TCC_ADMIN_FILE).getAbsolutePath();
private final HashMap<File, ITCResourceMatcher> myCache = new HashMap<File, ITCResourceMatcher>();
@SuppressWarnings("FieldMayBeFinal") private ITCResourceMatcher myGlobalMatcher;
private final ITCResourceMatcher myOverridingMatcher;
public TCWorkspace() {
this(null);
}
public TCWorkspace(final ITCResourceMatcher externMatcher) {
// setup global admin
final File defaultConfig = getGlobalAdminFile();
if (defaultConfig != null && defaultConfig.exists()) {
myGlobalMatcher = new FileBasedMatcher(defaultConfig);
} else {
Debug.getInstance().debug(TCWorkspace.class, MessageFormat.format("Default Admin file \"{0}\" is not found", defaultConfig));
}
myOverridingMatcher = externMatcher;
Debug.getInstance().debug(TCWorkspace.class, String.format("Overriding Matcher set to \"%s\"", externMatcher)); //$NON-NLS-1$
}
protected File getGlobalAdminFile() {
final String globalConfigEnv = System.getenv("TC_DEFAULT_CONFIG");
if (globalConfigEnv != null && globalConfigEnv.length() > 0) {
Debug.getInstance().debug(TCWorkspace.class, String.format("Check Environment variable \"%s\" for Admin file ", globalConfigEnv));
return new File(globalConfigEnv);
}
final String myDefaultConfigFile = TCC_GLOBAL_ADMIN_FILE;
Debug.getInstance().debug(TCWorkspace.class, String.format("Check Default location \"%s\" for Admin file ", myDefaultConfigFile));
return new File(myDefaultConfigFile);
}
static ITCResourceMatcher getMatcherFor(@NotNull final File local) throws IllegalArgumentException {
// per-folder search
try {
File folder = local.getParentFile();
if (folder != null) {
folder = folder.getCanonicalFile().getAbsoluteFile();
final File adminFile = new File(folder, TCC_ADMIN_FILE);
if (adminFile.exists()) {
Debug.getInstance().debug(TCWorkspace.class, String.format("found mapping for %s in %s", local, adminFile));
return new FileBasedMatcher(adminFile);
} else {
return getMatcherFor(folder);
}
}
} catch (IOException e) {
throw new IllegalArgumentException(e);
}
return null;
}
public ITCResource getTCResource(@NotNull File local) throws IllegalArgumentException {
try {
local = local.getAbsoluteFile().getCanonicalFile();
} catch (IOException e) {
throw new IllegalArgumentException(e);
}
ITCResourceMatcher matcher;
// set to OverridingMatcher if defined
if (myOverridingMatcher != null) {
matcher = myOverridingMatcher;
} else {
// look into cache(cache keep file for files resides in same folder only)
matcher = myCache.get(local.getParentFile());
if (matcher == null) {
// seek for uncached
matcher = getMatcherFor(local);
if (matcher == null) {
// look into Global
matcher = myGlobalMatcher;
if (myGlobalMatcher == null) {
Debug.getInstance().debug(TCWorkspace.class, MessageFormat.format("Neither Local nor Global admin files found for \"{0}\"", local));
return null;
}
}
}
}
// cache found
myCache.put(local.getParentFile(), matcher);
final ITCResourceMatcher.Matching matching = matcher.getMatching(local);
if (matching == null) {
Debug.getInstance().debug(TCWorkspace.class, MessageFormat.format("No Matching found for \"{0}\"", local));
return null;
}
// All found
final String prefix = matching.getTCID();
final String relativePath = matching.getRelativePath();
return new TCResource(local, MessageFormat.format("{0}/{1}", prefix, relativePath)); //$NON-NLS-1$
}
static class TCResource implements ITCResource {
private final File myLocal;
private final String myRepositoryPath;
TCResource(File local, String repositoryPath) {
myLocal = local;
myRepositoryPath = repositoryPath;
}
public File getLocal() {
return myLocal;
}
public String getRepositoryPath() {
return myRepositoryPath;
}
@Override
public String toString() {
return MessageFormat.format("local={0}, repo={1}", getLocal(), getRepositoryPath()); //$NON-NLS-1$
}
}
}