/*
* RRepositoryFileImpl.java
*
* Copyright (C) 2010-2016, Microsoft Corporation
*
* This program is licensed to you under the terms of Version 2.0 of the
* Apache License. This program is distributed WITHOUT
* ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,
* MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the
* Apache License 2.0 (http://www.apache.org/licenses/LICENSE-2.0) for more details.
*
*/
package com.revo.deployr.client.core.impl;
import com.revo.deployr.client.RClientException;
import com.revo.deployr.client.RSecurityException;
import com.revo.deployr.client.core.RCoreResult;
import com.revo.deployr.client.core.RClientExecutor;
import com.revo.deployr.client.call.RCall;
import com.revo.deployr.client.call.repository.RepositoryFileListCall;
import com.revo.deployr.client.call.repository.RepositoryFileGrantCall;
import com.revo.deployr.client.call.repository.RepositoryFileRevertCall;
import com.revo.deployr.client.call.repository.RepositoryFileUpdateCall;
import com.revo.deployr.client.call.repository.RepositoryFileDeleteCall;
import com.revo.deployr.client.RRepositoryFile;
import com.revo.deployr.client.about.RRepositoryFileDetails;
import com.revo.deployr.client.core.REndpoints;
import com.revo.deployr.client.util.REntityUtil;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.net.*;
import java.io.InputStream;
import org.apache.http.client.utils.URIBuilder;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* DeployR repository file.
*/
public class RRepositoryFileImpl implements RRepositoryFile {
private Log log = LogFactory.getLog(RRepositoryFile.class);
RRepositoryFileDetails about;
RLiveContext liveContext;
public RRepositoryFileImpl(RRepositoryFileDetails about, RLiveContext liveContext) {
this.about = about;
this.liveContext = liveContext;
}
public RRepositoryFileDetails about() {
return about;
}
public List<RRepositoryFile> versions()
throws RClientException, RSecurityException {
RCall rCall = new RepositoryFileListCall(false, false, false,
about.filename,
about.directory,
false, null);
RCoreResult rResult = liveContext.executor.processCall(rCall);
List<Map> repoFiles = rResult.getRepoFiles();
log.debug("versions: repoFiles=" + repoFiles);
List<RRepositoryFile> versionList = new ArrayList<RRepositoryFile>();
for(Map repoFileMap : repoFiles) {
RRepositoryFileDetails details = REntityUtil.getRepositoryFileDetails(repoFileMap, liveContext);
RRepositoryFile file = new RRepositoryFileImpl(details, liveContext);
versionList.add(file);
}
boolean success = rResult.isSuccess();
String error = rResult.getError();
int errorCode = rResult.getErrorCode();
log.debug("versions: repoFiles, success=" + success + " error=" + error + " errorCode=" + errorCode);
return versionList;
}
/*
* RRepositoryFile Interfaces.
*/
public RRepositoryFile grant(String newauthor, String revokeauthor)
throws RClientException, RSecurityException {
RCall rCall = new RepositoryFileGrantCall(about, newauthor, revokeauthor);
RCoreResult rResult = liveContext.executor.processCall(rCall);
Map repoFileMap = rResult.getRepoFile();
log.debug("grant: rResult.getRepoFile=" + repoFileMap);
RRepositoryFileDetails details = REntityUtil.getRepositoryFileDetails(repoFileMap, liveContext);
RRepositoryFile repoFile = new RRepositoryFileImpl(details, liveContext);
boolean success = rResult.isSuccess();
String error = rResult.getError();
int errorCode = rResult.getErrorCode();
log.debug("grant: repoFile, success=" + success + " error=" + error + " errorCode=" + errorCode);
return repoFile;
}
public RRepositoryFile revert(RRepositoryFile fileVersion, String descr, String restricted, boolean shared, boolean published)
throws RClientException, RSecurityException {
RCall rCall = new RepositoryFileRevertCall(fileVersion.about(), descr, restricted, shared, published);
RCoreResult rResult = liveContext.executor.processCall(rCall);
Map repoFileMap = rResult.getRepoFile();
log.debug("revert: rResult.getRepoFile=" + repoFileMap);
RRepositoryFileDetails details = REntityUtil.getRepositoryFileDetails(repoFileMap, liveContext);
RRepositoryFile repoFile = new RRepositoryFileImpl(details, liveContext);
boolean success = rResult.isSuccess();
String error = rResult.getError();
int errorCode = rResult.getErrorCode();
log.debug("revert: repoFile, success=" + success + " error=" + error + " errorCode=" + errorCode);
return repoFile;
}
public RRepositoryFile update(String restricted, boolean shared, boolean published, String descr)
throws RClientException, RSecurityException {
return update(restricted, shared, published, descr, null, null);
}
public RRepositoryFile update(String restricted, boolean shared, boolean published, String descr, String inputs, String outputs)
throws RClientException, RSecurityException {
RCall rCall = new RepositoryFileUpdateCall(about, restricted, shared, published, descr, inputs, outputs);
RCoreResult rResult = liveContext.executor.processCall(rCall);
Map repoFileMap = rResult.getRepoFile();
log.debug("update: rResult.getRepoFile=" + repoFileMap);
RRepositoryFileDetails details = REntityUtil.getRepositoryFileDetails(repoFileMap, liveContext);
RRepositoryFile repoFile = new RRepositoryFileImpl(details, liveContext);
boolean success = rResult.isSuccess();
String error = rResult.getError();
int errorCode = rResult.getErrorCode();
log.debug("update: repoFile, success=" + success + " error=" + error + " errorCode=" + errorCode);
return repoFile;
}
public URL diff() throws RClientException, RSecurityException {
URL diffURL;
if(this.about.version == null) {
throw new RClientException("Repository file diff can only be requested on a version of a file, not on the latest.");
}
try {
String urlPath = liveContext.serverurl + REndpoints.RREPOSITORYFILEDIFF;
urlPath = urlPath + ";jsessionid=" + liveContext.httpcookie;
URIBuilder builder = new URIBuilder(urlPath);
builder.addParameter("filename", this.about.filename);
builder.addParameter("directory", this.about.directory);
builder.addParameter("author", this.about.latestby);
builder.addParameter("version", this.about.version);
diffURL = builder.build().toURL();
} catch(Exception uex) {
throw new RClientException("Diff url: ex=" + uex.getMessage());
}
return diffURL;
}
public InputStream download()
throws RClientException, RSecurityException {
try {
String urlBase = liveContext.serverurl +
REndpoints.RREPOSITORYFILEDOWNLOAD;
String urlPath = urlBase + ";jsessionid=" + liveContext.httpcookie;
URIBuilder builder = new URIBuilder(urlPath);
builder.addParameter("filename", this.about.filename);
builder.addParameter("directory", this.about.directory);
builder.addParameter("author", this.about.author);
builder.addParameter("version", this.about.version);
return liveContext.executor.download(builder);
} catch(Exception ex) {
throw new RClientException("Download failed: " +
ex.getMessage());
}
}
public void delete()
throws RClientException, RSecurityException {
RCall rCall = new RepositoryFileDeleteCall(about);
RCoreResult rResult = liveContext.executor.processCall(rCall);
boolean success = rResult.isSuccess();
String error = rResult.getError();
int errorCode = rResult.getErrorCode();
log.debug("delete: repoFile, success=" + success + " error=" + error + " errorCode=" + errorCode);
}
}