1 /**
2 *
3 * Copyright 2003-2004 The Apache Software Foundation
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17 package org.apache.geronimo.deployment.plugin.remote;
18
19 import org.apache.geronimo.deployment.plugin.local.AbstractDeployCommand;
20 import org.apache.geronimo.util.encoders.Base64;
21
22 import java.io.File;
23 import java.io.IOException;
24 import java.io.DataOutputStream;
25 import java.io.BufferedInputStream;
26 import java.io.FileInputStream;
27 import java.io.BufferedOutputStream;
28 import java.io.DataInputStream;
29 import java.net.URL;
30 import java.net.URLConnection;
31 import java.util.LinkedList;
32 import java.util.List;
33 import java.util.Iterator;
34
35 /**
36 * Knows how to upload files to a server
37 *
38 * @version $Rev: 355877 $ $Date: 2005-12-10 18:48:27 -0800 (Sat, 10 Dec 2005) $
39 */
40 public class RemoteDeployUtil {
41 public static void uploadFilesToServer(File[] files, AbstractDeployCommand progress) {
42 if(files == null) {
43 return;
44 }
45 List valid = new LinkedList();
46 for(int i=0; i<files.length; i++) {
47 if(files[i] == null) {
48 continue;
49 }
50 File file = files[i];
51 if(!file.exists() || !file.canRead()) {
52 continue;
53 }
54 valid.add(new Integer(i));
55 }
56 if(valid.size() > 0) {
57 progress.updateStatus("Uploading "+valid.size()+" file(s) to server");
58 try {
59 URL url = progress.getRemoteDeployUploadURL();
60 URLConnection con = connectToServer(url, progress.getCommandContext().getUsername(), progress.getCommandContext().getPassword());
61 DataOutputStream out = new DataOutputStream(new BufferedOutputStream(con.getOutputStream()));
62 out.writeInt(valid.size());
63 byte[] buf = new byte[1024];
64 int size, total, length, threshold, next;
65 for (Iterator it = valid.iterator(); it.hasNext();) {
66 Integer index = (Integer) it.next();
67 File file = files[index.intValue()];
68 out.writeInt(length = (int)file.length());
69 threshold = Math.max(length / 100, 10240);
70 next = threshold;
71 BufferedInputStream in = new BufferedInputStream(new FileInputStream(file));
72 total = 0;
73 while((size = in.read(buf)) > -1) {
74 out.write(buf, 0, size);
75 total += size;
76 if(total > next) {
77 progress.updateStatus("Uploading "+file.getName()+": "+(total/1024)+" kB");
78 while(total > next) next += threshold;
79 }
80 }
81 }
82 out.flush();
83 out.close();
84 DataInputStream in = new DataInputStream(new BufferedInputStream(con.getInputStream()));
85 String status = in.readUTF();
86 if(!status.equals("OK")) {
87 progress.fail("Unable to upload files to server: "+status);
88 return;
89 }
90 progress.updateStatus("File upload complete (Server: "+status+")");
91 int count = in.readInt();
92 if(count != valid.size()) {
93 progress.fail("Server did not receive all "+valid.size()+" files ("+count+")");
94 }
95 for (Iterator it = valid.iterator(); it.hasNext();) {
96 Integer index = (Integer) it.next();
97 String serverFileName = in.readUTF();
98 files[index.intValue()] = new File(serverFileName);
99 }
100 in.close();
101 progress.updateStatus(count+" file(s) transferred to server. Resuming deployment operation.");
102 } catch (Exception e) {
103 progress.doFail(e);
104 }
105 }
106 }
107
108 private static URLConnection connectToServer(URL url, String username, String password) throws IOException {
109 URLConnection con = url.openConnection();
110 String auth = username + ":" + password;
111 byte[] data = auth.getBytes();
112 String s = new String(Base64.encode(data));
113 while(s.length() % 4 != 0) s += "=";
114 con.setRequestProperty("Authorization", "Basic "+s);
115 con.setDoInput(true);
116 con.setDoOutput(true);
117 con.connect();
118 return con;
119 }
120 }