All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.ibm.sbt.playground.vfs.GitVFS Maven / Gradle / Ivy

There is a newer version: 1.1.12.20161007-1200
Show newest version
/*
 * Copyright IBM Corp. 2012
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); 
 * you may not use this file except in compliance with the License. 
 * You may obtain a copy of the License at:
 * 
 * http://www.apache.org/licenses/LICENSE-2.0 
 * 
 * Unless required by applicable law or agreed to in writing, software 
 * distributed under the License is distributed on an "AS IS" BASIS, 
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 
 * implied. See the License for the specific language governing 
 * permissions and limitations under the License.
 */
package com.ibm.sbt.playground.vfs;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import com.ibm.commons.runtime.util.URLEncoding;
import com.ibm.commons.util.StringUtil;
import com.ibm.commons.util.io.base64.Base64;
import com.ibm.commons.util.io.json.JsonJavaFactory;
import com.ibm.sbt.services.client.ClientServicesException;
import com.ibm.sbt.services.client.RestClient;


/**
 * Module to import files from GIT.
 * 
 * Uses: GET /repos/:owner/:repo/contents/:path
 * 	Ex: https://api.github.com/repos/OpenNTF/SocialSDK/contents/samples/j2ee/com.ibm.sbt.sample.web/WebContent/js/Utilities
 * 
 * @author priand
 */
public class GitVFS extends RemoteVFS {

	public static final String GITHUB_BASEURL	= "https://api.github.com";

    private static class StringInputStream extends java.io.InputStream {
    	private String str;
    	private int ptr;
    	StringInputStream(String str) {
    		this.str = str;
    	}
        @Override
		public int read() throws IOException {
        	if(ptr json = (Map)c.get(path,new RestClient.HandlerJson(JsonJavaFactory.instance)).getData();
				String content = (String)json.get("content");
				if(content!=null) {
					String encoding = (String)json.get("encoding");
					if(StringUtil.equals(encoding, "base64")) {
						return new Base64.InputStream(new StringInputStream(content));
					}
					throw new IOException(StringUtil.format("Unknown content encoding {0}", encoding));
				}
				return null;
			} catch (ClientServicesException e) {
				throw new IOException(e);
			}
		}

		@Override
		public OutputStream getOutputStream() throws IOException {
			throw new IOException("Output stream is not supported");
		}
		@Override
		public void delete() throws IOException {
			throw new IOException("delete() is not supported");
		}
		
		/*
		 [
		  {
		    "_links": {
		      "html": "https://github.com/OpenNTF/SocialSDK/blob/master/samples/j2ee/com.ibm.sbt.sample.web/WebContent/js/Utilities/Email.html",
		      "self": "https://api.github.com/repos/OpenNTF/SocialSDK/contents/samples/j2ee/com.ibm.sbt.sample.web/WebContent/js/Utilities/Email.html",
		      "git": "https://api.github.com/repos/OpenNTF/SocialSDK/git/blobs/ab4df12cc4fb3a5bbd097f226aadad16a36710fb"
		    },
		    "type": "file",
		    "path": "samples/j2ee/com.ibm.sbt.sample.web/WebContent/js/Utilities/Email.html",
		    "sha": "ab4df12cc4fb3a5bbd097f226aadad16a36710fb",
		    "git_url": "https://api.github.com/repos/OpenNTF/SocialSDK/git/blobs/ab4df12cc4fb3a5bbd097f226aadad16a36710fb",
		    "html_url": "https://github.com/OpenNTF/SocialSDK/blob/master/samples/j2ee/com.ibm.sbt.sample.web/WebContent/js/Utilities/Email.html",
		    "url": "https://api.github.com/repos/OpenNTF/SocialSDK/contents/samples/j2ee/com.ibm.sbt.sample.web/WebContent/js/Utilities/Email.html",
		    "size": 2425,
		    "name": "Email.html"
		  },	
		 */
		
		// Directory functions
		@Override
		protected BaseFile[] loadChildren() throws IOException {
			try {
				ArrayList files = new ArrayList();
				RestClient c = createGitClient(getUserName(),getPassword());
				String path = URLEncoding.encodeURIString(getPath(),"utf-8",0,false);
				Object json = c.get(path,new RestClient.HandlerJson(JsonJavaFactory.instance)).getData();
				//System.out.println("Emit request for: "+path);				
				if(json instanceof List) {
					for(Object entry: (List)json) {
						if(entry instanceof Map) {
							Map m = (Map)entry;
							String eType = (String)m.get("type");
							String eName = (String)m.get("name");
							//String ePath = (String)m.get("path");
							String eUrl = (String)m.get("url");
							GitFile f = new GitFile(getVFS(),this, eName, eUrl, StringUtil.equals(eType,"file"));
							files.add(f);
							//System.out.println(StringUtil.format("Type:{0}, Name:{1}, Path:{2}, Url:{3}",eType,eName,ePath,eUrl));
						}
					}
				}
				return files.toArray(new BaseFile[files.size()]);
			} catch(ClientServicesException ex) {
				throw new IOException(ex);
			}
		}
	}

	private String baseUrl;

	private String userName;
	private String password;
	
	private GitFile root;
	
	public GitVFS(String baseUrl, String userName, String password) {
		this.baseUrl = baseUrl;
		this.root = new GitFile(this,null, "", baseUrl, false);
		this.userName = userName;
		this.password = password;
	}
	
	public String getBaseUrl() {
		return baseUrl;
	}

	@Override
	public VFSFile getRoot() {
		return root;
	}

	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	protected GitClient createGitClient(String userName, String password) {
		String url = baseUrl;
//		url = PathUtil.concat(url, "repos", '/');
//		if(StringUtil.isNotEmpty(getOwner())) {
//			url = PathUtil.concat(url, getOwner(), '/');
//		}
//		if(StringUtil.isNotEmpty(getRepos())) {
//			url = PathUtil.concat(url, getRepos(), '/');
//		}
//		url = PathUtil.concat(url, "contents", '/');
//		if(StringUtil.isNotEmpty(getBasePath())) {
//			url = PathUtil.concat(url, getBasePath(), '/');
//		}
		return new GitClient(url,userName,password);
	}
	
	public static class GitClient extends RestClient {
		public GitClient(String baseUrl, String userName, String password) {
			super(baseUrl);
			setAuthenticator(new BasicAuthenticator(userName,password));
		}
		// Allow HTTPS, regardless of the certificates
		@Override
		protected boolean isForceTrustSSLCertificate() throws ClientServicesException {
			return true;
		}
		
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy