/******************************************************************************* * Copyright (c) 2011, 2012, 2013, 2014 Red Hat, Inc. * All rights reserved. * This program is made available under the terms of the * Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Red Hat, Inc. - initial API and implementation * ******************************************************************************/ package org.kie.eclipse.server; import java.io.File; import java.net.URI; import java.util.HashSet; import java.util.List; import java.util.Set; import org.eclipse.jgit.api.Git; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.lib.StoredConfig; import org.kie.eclipse.IKieConstants; import org.kie.eclipse.utils.GitUtils; import org.kie.eclipse.utils.PreferencesUtils; /** * */ public class KieRepositoryHandler extends KieResourceHandler implements IKieRepositoryHandler, IKieConstants { Repository repository; /** * @param organization * @param string */ public KieRepositoryHandler(IKieOrganizationHandler organization, String name) { super(organization, name); } public KieRepositoryHandler(IKieServerHandler server, String name) { super(server, name); } @Override public Object getResource() { return repository; } @Override public List<? extends IKieResourceHandler> getChildren() throws Exception { if (children==null || children.isEmpty()) { children = getDelegate().getProjects(this); } return children; } @Override public List<IKieProjectHandler> getProjects() throws Exception { return (List<IKieProjectHandler>) getChildren(); } @Override public Object load() { if (repository == null) { try { final File repoRoot = new File(PreferencesUtils.getRepoRoot(this)); final Set<File> gitDirs = new HashSet<File>(); GitUtils.findGitDirsRecursive(repoRoot, gitDirs, false); for (File dir : gitDirs) { if (getName().equals(dir.getParentFile().getName())) { Git git = Git.open(dir); Repository repository = git.getRepository(); StoredConfig storedConfig = repository.getConfig(); Set<String> remotes = storedConfig.getSubsections("remote"); for (String remoteName : remotes) { try { String url = storedConfig.getString("remote", remoteName, "url"); URI uri = new URI(url); int port = uri.getPort(); String host = uri.getHost(); String scheme = uri.getScheme(); String path[] = uri.getPath().split("/"); String repoName = path[path.length-1]; if ( name.equals(repoName) && host.equals(getServer().getHost()) && port == getDelegate().getGitPort() && "ssh".equals(scheme)) { this.repository = repository; break; } } catch (Exception e) { e.printStackTrace(); } finally { if (git!=null) { git.close(); git = null; } } } } } } catch (Exception e) { e.printStackTrace(); } } return repository; } @Override public void dispose() { super.dispose(); if (repository!=null) { repository.close(); repository = null; } } @Override public boolean isLoaded() { return repository != null; } @Override public Repository getRepository() { return repository; } }