Skip to content

Commit

Permalink
Merge branch 'CLI_Workspace'
Browse files Browse the repository at this point in the history
  • Loading branch information
mvpcortes committed Nov 28, 2010
2 parents 234c3e4 + 76b752f commit fc58235
Show file tree
Hide file tree
Showing 7 changed files with 400 additions and 28 deletions.
8 changes: 7 additions & 1 deletion src/main/java/br/uff/ic/gardener/cli/CLI.java
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
import br.uff.ic.gardener.TransationException;
import br.uff.ic.gardener.client.APIClient;
import br.uff.ic.gardener.client.APIClientException;
import br.uff.ic.gardener.client.Conflict;
import br.uff.ic.gardener.comm.ComClientException;
import br.uff.ic.gardener.diff.Diff;
import br.uff.ic.gardener.util.ANDFileFilter;
Expand Down Expand Up @@ -533,7 +534,12 @@ private void onInit(String string) throws APIClientException, WorkspaceException

private void onUpdate() throws TransationException
{
getClient().update();
List<Conflict> list = new LinkedList<Conflict>();
getClient().update(list);
for(Conflict c: list)
{
System.out.println(String.format("The workspace file: %s has have conflict", c.getPathB().getPath()));
}
}

/**
Expand Down
90 changes: 79 additions & 11 deletions src/main/java/br/uff/ic/gardener/client/APIClient.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package br.uff.ic.gardener.client;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.util.Collection;
import java.util.Collections;
Expand All @@ -11,9 +13,11 @@

import java.io.FileFilter;

import br.uff.ic.gardener.client.ClientMerge.ClientMergeException;
import br.uff.ic.gardener.comm.ComClient;
import br.uff.ic.gardener.comm.ComClientException;
import br.uff.ic.gardener.comm.ComFactory;
import br.uff.ic.gardener.merge.MergeException;
import br.uff.ic.gardener.workspace.CIWorkspaceStatus;
import br.uff.ic.gardener.workspace.Workspace;
import br.uff.ic.gardener.workspace.WorkspaceException;
Expand Down Expand Up @@ -43,6 +47,8 @@ private URI getURIServ()
return workspace.getServSource();
}

private ClientMerge merge = null;

/**
* get APIClient of application
* @throws APIClientException
Expand Down Expand Up @@ -90,10 +96,13 @@ public APIClient(File _uriWorkspace, URI _uriServ) throws APIClientException
{
try
{
workspace = new Workspace (_uriWorkspace);
workspace = new Workspace (_uriWorkspace);
merge = new ClientMerge();
}catch(WorkspaceException e)
{
throw new APIClientException("Can not create Workspace", e);
} catch (IOException e) {
throw new APIClientException("Cannot create ClientMerge and generate IOException", e);
}
getWorkspace();
workspace.setServSource(_uriServ);
Expand Down Expand Up @@ -162,13 +171,8 @@ public RevisionID commit(String msg) throws TransationException

public void addFiles(Collection<File> listFiles) throws APIClientException, WorkspaceException
{
try
{
getWorkspace().addFiles(listFiles);
}catch(WorkspaceException e)
{
throw e;
}
getWorkspace().addFiles(listFiles);

}

public void removeFiles(Collection<File> listFiles) throws APIClientException, WorkspaceException
Expand Down Expand Up @@ -211,7 +215,7 @@ public void init(String strProject) throws APIClientException , WorkspaceExcepti
/**
* Update the workspace to the last revision
*/
public void update() throws TransationException{
public void update(Collection<Conflict> conflicts) throws TransationException{
List<ConfigurationItem> listServ = new LinkedList<ConfigurationItem>();
List<ConfigurationItem> listWork = new LinkedList<ConfigurationItem>();
try {
Expand All @@ -223,13 +227,43 @@ public void update() throws TransationException{
Iterator<ConfigurationItem> is = listServ.iterator();
Iterator<ConfigurationItem> iw = listWork.iterator();

ConfigurationItem ciServ = null;
ConfigurationItem ciWork = null;
while(is.hasNext() && iw.hasNext())
{
ConfigurationItem ciServ = is.next();
ConfigurationItem ciWork = iw.next();
if(ciServ == null)
ciServ = is.next();
if(ciWork == null)
ciWork = iw.next();

//faz o merge

String strServ = ciServ.getUri().getPath();
String strWork = ciWork.getUri().getPath();

final int diff = strServ.compareTo(strWork);
if(0 == diff)//mesmo item
{
boolean conflict = merge(ciServ,ciWork);
if(conflict)
{
conflicts.add(new Conflict(ciServ.getUri(), ciWork.getUri()));
}
ciServ =is.next();
ciWork = is.next();
}else if (0 < diff) //strServ é menor. Grava ele no disco
{
addCIWorkspace(ciServ);
ciServ =is.next();

}else //strServ é maior. faz nada, mantém o do ws
{
ciWork = is.next();
}
}

//atribui a nova revisão ao workspace
workspace.setCurrentRevision(getComClient().getLastRevision(""));

} catch (ComClientException e) {
throw new TransationException("Cannot realize update transation", e);
Expand All @@ -241,6 +275,40 @@ public void update() throws TransationException{

}

private void addCIWorkspace(ConfigurationItem ci) throws WorkspaceException, APIClientException
{
getWorkspace().addNewCI(ci);
}

/**
* faz merge de dos CIs. Nunca dá exceção pq a política por enquanto é deixar o erro do merge dentro do arquivo
* @param ciServ
* @param ciWork
* @return if it cause conflict
*/
private boolean merge(ConfigurationItem ciServ, ConfigurationItem ciWork) {
try {
InputStream in = merge.merge(ciServ, ciWork, getWorkspace());
ConfigurationItem ci = new ConfigurationItem(ciWork.getUri(), in, ciServ.getRevision());
getWorkspace().replaceCI(ci);

return merge.lastConflict();
} catch (WorkspaceException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (MergeException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClientMergeException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (APIClientException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return true;
}

public void status(Collection<CIWorkspaceStatus> coll) throws WorkspaceException, APIClientException {
getWorkspace().getStatus(coll);

Expand Down
108 changes: 108 additions & 0 deletions src/main/java/br/uff/ic/gardener/client/ClientMerge.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
package br.uff.ic.gardener.client;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

import br.uff.ic.gardener.ConfigurationItem;
import br.uff.ic.gardener.merge.IMerge;
import br.uff.ic.gardener.merge.MergeException;
import br.uff.ic.gardener.merge.MergeWithRegEx;
import br.uff.ic.gardener.util.FileHelper;
import br.uff.ic.gardener.util.UtilStream;
import br.uff.ic.gardener.workspace.Workspace;

/**
* classe que encapsula o trabalho de merge
* @author Marcos
*
*/
public class ClientMerge {

public class ClientMergeException extends Exception
{
/**
*
*/
private static final long serialVersionUID = 920405757395138678L;

public ClientMergeException(String msg, Throwable t) {
super(msg, t);
}

}
private File pathTemp = null;

private long fileID = 0;

private boolean lastConflict = false;

public ClientMerge() throws IOException
{
pathTemp = FileHelper.createTemporaryRandomPath();
}

public InputStream merge(ConfigurationItem ciServ,
ConfigurationItem ciWork, Workspace workspace) throws MergeException, ClientMergeException
{
lastConflict = false;
IMerge realMerge = new MergeWithRegEx();
//cria arquivos
File f1 = createFile(ciServ);
File f2 = createFile(ciWork);
File fBase = createFile();
File fDest = createFile();
//faz o merge
lastConflict = realMerge.merge(f1, f2, fBase, fDest);

f1.delete();
f2.delete();
fBase.delete();
try {

return new FileInputStream(fDest);
} catch (FileNotFoundException e) {
throw new ClientMergeException("Error at create File Destiny", e);
}
}


private File createFile() throws ClientMergeException
{
File f = new File(pathTemp, Long.toString(fileID)+".tmp");
try {
f.createNewFile();
fileID++;
} catch (IOException e) {
throw new ClientMergeException("Error in create file" + f.toString(), e);
}
return f;
}
private File createFile(ConfigurationItem ci) throws ClientMergeException {
File f = createFile();
FileOutputStream fOut = null;
try {
fOut = new FileOutputStream(f);
UtilStream.copy(ci.getItemAsInputStream(), fOut);
fOut.close();
} catch (FileNotFoundException e) {
throw new ClientMergeException("Cannot open file " + f.toString(), e);
} catch (IOException e) {
throw new ClientMergeException("File output problem: " + f.toString(), e);
}

return f;
}

public void close()
{
FileHelper.deleteDirTree(pathTemp);
}

public boolean lastConflict() {
return lastConflict;
}
}
30 changes: 30 additions & 0 deletions src/main/java/br/uff/ic/gardener/client/Conflict.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package br.uff.ic.gardener.client;

import java.net.URI;

/**
* conflict between two files
* @author Marcos
*
*/
public class Conflict {

private URI pathA;
private URI pathB;

public final URI getPathA() {
return pathA;
}

public final URI getPathB() {
return pathB;
}

public Conflict(URI A, URI B)
{
pathA = A;
pathB = B;
}


}
2 changes: 1 addition & 1 deletion src/main/java/br/uff/ic/gardener/workspace/Status.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
* @author Marcos
*
*/
enum Status
public enum Status
{
UNVER("Unversioned", "UNVER"),
ADD("Added", "ADD"),
Expand Down
Loading

0 comments on commit fc58235

Please sign in to comment.