Closed pmcandido closed 7 years ago
Let me check! O servidor só aceita uma push de um file se o repositorio já existir. O servidor manda um String a dizer THE REPOSITORY DOES NOT EXIST se o remotrespository nao existir.
De resto se olhares para o run() do myGitServer ele está a espera de um int que e o numero de files que vai receber quando faz um push repo (Isto ainda nao esta bem feito era so para ver se funcionava dessa maneira)
Pedro Candido o teu enum Message Factory está um mimo.... Não sabia que se conseguia fazer tal coisa com um enum..... NICE!!!!!!!
ok António, vou implementar agora o -init...ontem estive a perder tempo com um ridículo padrão strategy com factory, estes informáticos são do piorio...fiquei com uma data handlers algures que sem grande prejuízo ficariam logo no cliente...
a factory foi roubada à prof Isabel Nunes (DCO 2016) :)
Fixe eu vou terminar o push repositório e afinar a interacção do servidor com o cliente. Pois este factory com enums nunca tinha visto...... Abraço
abraço
António, choca-te teres um AUTH e um INIT no enum TypeOperation? ficava com o cliente mais modular...
só o AUTH...?
Faz as alterações que achares necessárias.... Faz sentido como se trata de uma operação. Força nisso
implementados (mais ou menos):
myGit -init
Este já não falta muito depois de decidirmos a interacção cliente servidor:
myGit
Para já o server está a dar:
INSIDE TRY TO READ MSG Exception in thread "pool-1-thread-3" java.lang.ClassCastException: message.MessageP cannot be cast to java.lang.Integer at server.MyGitServer$ServerThread.run(MyGitServer.java:89) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745)
Olá António,
estou a fazer um push rep, o push é composto por duas mensagens, uma mensagem de autenticação (Message) que é aceite seguida por uma mensagem de push (MessageP)...como o servidor já fechou o socket obtenho um broken pipe...olhando para o código do servidor parece-me que pretendes apenas uma única mensagem, é isso? e depois como enviar cada um dos ficheiros?...
java.net.SocketException: Broken pipe (Write failed) at java.net.SocketOutputStream.socketWrite0(Native Method) at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:111) at java.net.SocketOutputStream.write(SocketOutputStream.java:155) at java.io.ObjectOutputStream$BlockDataOutputStream.drain(ObjectOutputStream.java:1877) at java.io.ObjectOutputStream$BlockDataOutputStream.setBlockDataMode(ObjectOutputStream.java:1786) at java.io.ObjectOutputStream.writeNonProxyDesc(ObjectOutputStream.java:1286) at java.io.ObjectOutputStream.writeClassDesc(ObjectOutputStream.java:1231) at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1427) at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178) at java.io.ObjectOutputStream.writeFatalException(ObjectOutputStream.java:1577) at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:351) at client.MessagePHandler.sendPushRepMessage(MessagePHandler.java:75) at client.MessagePHandler.sendMessage(MessagePHandler.java:28) at client.MyGitClient.main(MyGitClient.java:77)
Hello 1º Pq estas a dividir em duas msgs uma de autenticação e outra de message P se podes fazer tudo na mesma mensagemP (Podemos fazer a auth com os atributos das messageP (user(n,p),serverAddress,pass,typeSend,repoName, TypeOperation, numberfiles,timestamp) [Este construtor e para os pull e push repository] e este (user(n,p),serverAddress,pass,typeSend,repoName, filename, TypeOperation, numberfiles,timestamp) [Este construtor e para os push e pull file]
Depois e que vem o problema que eu ainda nao consegui resolver... melhor consegui mas com batota mando um messageP com o repoName para validar se o repo existe no rep remoto (se nao existe cria-se), mando o numero de files do repo e de seguida mando os files um a um estando no servidor à espera de um numero files que mandei anteriormente, mas esta parte esta no mygitserver (no run method ()) e nao encapsolado no serverSkell como devia ser
por isso eh que eu que digo que faço batota pois ainda nao consegui mandar os ficheiro um a um.
Nao sei se me faço entender desta forma vê lá se percebes.te e let me know!!!!!!!!!
Abraço
António, vou então mandar apenas uma MessageP, com repoName e numero de ficheiros e depois injectar-te os ficheiros um a um ...agora percebi o conjunto gitserver e serverskel...então depois de enviar a MessageP vou iterar o folder e fazer um ReadWriteUtil.sendFile por cada file, neh?
Eh pah sim dessa forma dá.... Na falta de uma melhor solução vai a possivel. Não te esqueças de mandar a seguir ao messageP o size da lista de ficheiros e depois é que injectas um a um os ficheiros. Mando todos que a validação do timestamp e afins faz-se do lado do server. Se vires o codigo do push file ele recebe sempre se não presta apaga-o. Mais uma vez é ineficiente mas funciona se houver tempo de melhorar fixe se nao que se lixe. Abraço
António, já tens o número de ficheiros na MessageP a anterior...não consegues fazer set de um atributo e fazer get no run method do mygitserver?...
Eh uma ideia vou tentar fazer isso
@AntonioNRodrigues, finalmente o servidor escreve ficheiros enviado num push rep enviado pelo cliente...bastou fazer uma pequena alteração no run do mygitserver e acrescentar um método ao readwriteutil...é preciso ainda que o mygitserver passe um path ao receivefile como parâmetro para este saber onde escrever os ficheiros, para já está a escrever na raiz do projecto...é preciso construir um path tendo em atenção o owner do rep e o nome do rep...no final daria qualquer coisa como SERVER/maria/myrep/myGit.java...
@AntonioNRodrigues, @Aqua1986 , isto está quase...as mensagens push, share e rep já estão a ser enviadas pelo cliente e processadas pelo servidor. Pontos em aberto:
@AntonioNRodrigues, @Aqua1986 e acrescento mais um requisito confirmado pela Prof. Dulce:
Conseguimos reconstituir os repositórios e a sua ownership lendo a estrutura do sistema de ficheiros no servidor (p.e. SERVER/owner/repName) mas perdemos a informação de sharing se essa não estiver escrita num ficheiro que deverá ser lido quando o servidor arranca de novo.
@AntonioNRodrigues, implementei o pull no cliente do mesmo modo que o servidor implementou o push, depois de enviar a mensagem de pull fico à espera de um inteiro com o número de ficheiros e depois então os ficheiros.
Faz sentido. Mto bem cada repositório tem um file owner.txt com o seu dono. É só acrescentar um file com o share.txt com os shared users. Qdo o server levanta vai ler esse file tb. Atenção que tal como foi definido pelo grupo os repositório s estão todos na pasta SERVER. Não existe SERVER/username/reponame/ só existe SERVER/reponame/owner.txt. estou a escrever isto é a pensar que isto vai dar asneira se houver dois users que criem o mesmo nome para o repositório. Tenho de ir analisar isso.
Qto ao pull do repo depois testo e vejo se funciona.
Já fiz com que o repositorio criasse um ficheiro "owner" dentro de si... No meu caso, o AbsolutPath nao funcionava...
@AntonioNRodrigues, ontem andei às voltas com isto e parece-me que o único problema que temos é o facto de a referencia para o remote repository estar sempre a null em todas as operações, quando é um push rep ele testa se rr é null e se é vai criar um repositório...mas nas outras operações testa se ee é null para sair...como o servidor tem threads as referencias para o rem repo são perdidas entre pedidos (acho eu)...julgo que a coisa se arranja se se na classe MyGitServer estiverem definidos os catálogos (em vez de no ServerSkell ) e no main() do MyGitServer tivermos qq coisa como
MyGitServer myGitServer = new MyGitServer();
sk = new ServerSkell(myGitServer);
Já era quase de manhã e já não experimentei, tive que vir trabalhar hoje (e na segunda), valida sff se achas que isto faz sentido...ontem só dormi 3 horas...estou mortinho para acabar isto...
Boas ok ainda estou no trabalho vejo isso quando chegar a casa.
Estou.te a perceber..... Vou fazer essa migração do sk para o mygitserver. Se tudo correr bem amanhã tenho isso feito.... Thx pela ideia
Agora, quer envie um ficheiro ou muitos, num repositorio, do lado do servidor o mecanismo é o mesmo, visto que recebe o número de ficheiros por parametro da mensagem... 👍
No entanto, falta indicar o caminho para os ficheiros persistirem... Vou tentar fazer agora...
@Aqua1986, @AntonioNRodrigues eu já tenho isso feito mas só mais logo é que consigo fazer o commit e push, está com muitos conflitos...a única diferença entre os dois métodos no serverSkell é que o push rep deve anteceder um push file, se não existir RemoteRepository num push REP o remote repository deve ser criado e depois os ficheiros carregados para o RepositoryCatalog e para o filesystem; se for feito um push file antes de um push rep deve dar erro; se já existe uma instância de RemoteRepository no RepositoryCatalog o push file deve ter sucesso...
Cliente envia msg de autenticacao seguida de mensagem MessageP correspondente a um push de um ficheiro (será que se pode fazer um push file antes de um push rep?)
log do server:
INSIDE TRY TO READ MSG Exception in thread "pool-1-thread-1" java.lang.ClassCastException: message.MessageP cannot be cast to java.lang.Integer at server.MyGitServer$ServerThread.run(MyGitServer.java:89) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745)
depois da mensagem de autenticação o server estaria à espera de uma lista de files...