| | |
| | | |
| | | import org.opends.quicksetup.Application; |
| | | |
| | | import javax.swing.*; |
| | | import java.net.URL; |
| | | import java.net.Proxy; |
| | | import java.net.URLConnection; |
| | | import java.util.*; |
| | | import java.util.List; |
| | | import java.util.regex.Pattern; |
| | | import java.util.regex.Matcher; |
| | | import java.util.logging.Logger; |
| | | import java.io.*; |
| | | import java.awt.*; |
| | | |
| | | /** |
| | | * Manages listing and retreival of build packages on a remote host. |
| | |
| | | */ |
| | | enum BuildType { |
| | | |
| | | /** |
| | | * Nightly build descriptor. |
| | | */ |
| | | NIGHTLY, |
| | | |
| | | /** |
| | | * Weekly build descriptor. |
| | | */ |
| | | WEEKLY |
| | | |
| | | } |
| | | |
| | | /** |
| | | * Representation of an OpenDS build package. |
| | | */ |
| | | public class Build { |
| | | |
| | | private URL url; |
| | | private String id; |
| | | |
| | | /** |
| | | * Creates an instance. |
| | | * @param url where the build package can be accessed |
| | | * @param id of the new build |
| | | */ |
| | | Build(URL url, String id) { |
| | | this.url = url; |
| | | this.id = id; |
| | | } |
| | | |
| | | /** |
| | | * Gets the URL where the build can be accessed. |
| | | * @return URL representing access to the build package |
| | | */ |
| | | public URL getUrl() { |
| | | return url; |
| | | } |
| | | |
| | | /** |
| | | * Gets the builds ID number, a 14 digit number representing the time |
| | | * the build was created. |
| | | * @return String represenging the build |
| | | */ |
| | | public String getId() { |
| | | return id; |
| | | } |
| | | |
| | | } |
| | | |
| | | private Application app; |
| | | |
| | | private URL url; |
| | | |
| | | private Proxy proxy; |
| | | |
| | | private URL url; |
| | | private String proxyUserName; |
| | | |
| | | private char[] proxyPw; |
| | | |
| | | /** |
| | | * Creates an instance. |
| | |
| | | } |
| | | |
| | | /** |
| | | * Gets the base context where the build information is stored. |
| | | * @return URL representing base context of the build repo |
| | | */ |
| | | public URL getBaseContext() { |
| | | return this.url; |
| | | } |
| | | |
| | | /** |
| | | * Gets a list of builds found in the remote repository. |
| | | * @return List of Build objects representing remote builds |
| | | * @throws IOException if there was a problem contacting the build |
| | | * repository |
| | | */ |
| | | public List<Build> listBuilds() throws IOException { |
| | | return listBuilds(null, null); |
| | | } |
| | | |
| | | /** |
| | | * Gets the list of builds from the build repository using a |
| | | * progress monitor to keep the user informed about the status |
| | | * of downloading the build page. |
| | | * @param c Component to act as parent of the progress monitor |
| | | * @param o message to display in the progress monitor |
| | | * @return list of Build objects |
| | | * @throws IOException if something goes wrong loading the list |
| | | * from the build repository |
| | | */ |
| | | public List<Build> listBuilds(Component c, Object o) throws IOException { |
| | | List<Build> buildList = new ArrayList<Build>(); |
| | | String dailyBuildsPage = getDailyBuildsPage(); |
| | | String dailyBuildsPage = downloadDailyBuildsPage(c, o); |
| | | Pattern p = Pattern.compile("\\d{14}"); |
| | | Matcher m = p.matcher(dailyBuildsPage); |
| | | Set<String> buildIds = new HashSet<String>(); |
| | |
| | | return buildList; |
| | | } |
| | | |
| | | private String getDailyBuildsPage() throws IOException { |
| | | private String downloadDailyBuildsPage(Component c, Object o) |
| | | throws IOException |
| | | { |
| | | URL dailyBuildsUrl = new URL(url, "daily-builds"); |
| | | URLConnection conn; |
| | | if (proxy == null) { |
| | |
| | | } else { |
| | | conn = dailyBuildsUrl.openConnection(proxy); |
| | | } |
| | | InputStream in = conn.getInputStream(); |
| | | String proxyAuthString = createProxyAuthString(); |
| | | if (proxyAuthString != null) { |
| | | conn.setRequestProperty("Proxy-Authorization", "Basic " + |
| | | proxyAuthString); |
| | | } |
| | | InputStream in; |
| | | if (c != null) { |
| | | ProgressMonitorInputStream pmis = |
| | | new ProgressMonitorInputStream(c, o, conn.getInputStream()); |
| | | ProgressMonitor pm = pmis.getProgressMonitor(); |
| | | pm.setMillisToDecideToPopup(0); |
| | | in = pmis; |
| | | } else { |
| | | in = conn.getInputStream(); |
| | | } |
| | | BufferedReader reader = new BufferedReader(new InputStreamReader(in)); |
| | | StringBuilder builder = new StringBuilder(); |
| | | String line; |
| | |
| | | * location on the local file system. |
| | | * @param build to download |
| | | * @param destination directory for the newly downloaded file |
| | | * @throws IOException if the build could not be downloaded |
| | | */ |
| | | public void download(Build build, File destination) { |
| | | public void download(Build build, File destination) throws IOException { |
| | | download(build.getUrl(), destination); |
| | | } |
| | | |
| | | private void download(URL url, File destination) throws IOException { |
| | | URLConnection conn = null; |
| | | if (proxy == null) { |
| | | conn = url.openConnection(); |
| | | } else { |
| | | conn = url.openConnection(proxy); |
| | | } |
| | | String proxyAuthString = createProxyAuthString(); |
| | | if (proxyAuthString != null) { |
| | | conn.setRequestProperty("Proxy-Authorization", "Basic " + |
| | | proxyAuthString); |
| | | } |
| | | InputStream is = null; |
| | | FileOutputStream fos = null; |
| | | try { |
| | | is = conn.getInputStream(); |
| | | fos = new FileOutputStream(destination); |
| | | int i = 0; |
| | | int bytesRead = 0; |
| | | byte[] buf = new byte[1024]; |
| | | while ((i = is.read(buf)) != -1) { |
| | | fos.write(buf, 0, i); |
| | | bytesRead += i; |
| | | } |
| | | } finally { |
| | | if (is != null) { |
| | | is.close(); |
| | | } |
| | | if (fos != null) { |
| | | fos.close(); |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Sets the proxy object this class will use when establishing network |
| | | * connections. |
| | | * @param proxy to use when establishing connections |
| | | */ |
| | | public void setProxy(Proxy proxy) { |
| | | this.proxy = proxy; |
| | | } |
| | | |
| | | /** |
| | | * Gets the proxy object this class uses when establishing network |
| | | * connections. |
| | | * @return Proxy to use when establishing connections |
| | | */ |
| | | public Proxy getProxy() { |
| | | return this.proxy; |
| | | } |
| | | |
| | | /** |
| | | * Sets the user name this class will use to authenticate to its |
| | | * proxy when establishing network connections. |
| | | * @param user this class is acting on behalf of |
| | | */ |
| | | public void setProxyUserName(String user) { |
| | | this.proxyUserName = user; |
| | | } |
| | | |
| | | /** |
| | | * Sets the user name this class will use to authenticate to its |
| | | * proxy when establishing network connections. |
| | | * @return String representing the name of the user of which this class is |
| | | * acting on behalf |
| | | */ |
| | | public String getProxyUserName() { |
| | | return this.proxyUserName; |
| | | } |
| | | |
| | | /** |
| | | * Sets the password this class will use to authenticate to its |
| | | * proxy when establishing network connections. |
| | | * @param pw char[] representing the password of the user of which this class |
| | | * is acting on behalf |
| | | */ |
| | | public void setProxyPassword(char[] pw) { |
| | | this.proxyPw = pw; |
| | | } |
| | | |
| | | /** |
| | | * Sets the password this class will use to authenticate to its |
| | | * proxy when establishing network connections. |
| | | * @return char[] representing the password of the user of which this class is |
| | | * acting on behalf |
| | | */ |
| | | public char[] getProxyPassword() { |
| | | return this.proxyPw; |
| | | } |
| | | |
| | | private String createProxyAuthString() { |
| | | return createAuthenticationString(getProxyUserName(), getProxyPassword()); |
| | | } |
| | | |
| | | static private String createAuthenticationString(String user, char[] pw) { |
| | | String s = null; |
| | | if (user != null && pw != null) { |
| | | StringBuilder sb = new StringBuilder() |
| | | .append(user) |
| | | .append(":") |
| | | .append(pw); |
| | | s = org.opends.server.util.Base64.encode(sb.toString().getBytes()); |
| | | } |
| | | return s; |
| | | } |
| | | |
| | | /** |
| | | * For testing only. |
| | | * @param args command line arguments |
| | | */ |
| | | public static void main(String[] args) { |
| | | try { |
| | | Properties systemSettings = System.getProperties(); |
| | | systemSettings.put("http.proxyHost", "webcache.central.sun.com"); |
| | | systemSettings.put("http.proxyPort", "8080"); |
| | | System.setProperties(systemSettings); |
| | | URL url = new URL("http://builds.opends.org"); |
| | | RemoteBuildManager rbm = new RemoteBuildManager(null, url); |
| | | List<Build> builds = rbm.listBuilds(); |
| | | for (Build build : builds) { |
| | | System.out.println("build " + build.getId()); |
| | | } |
| | | } catch (IOException e) { |
| | | e.printStackTrace(); |
| | | } |
| | | // public static void main(String[] args) { |
| | | // try { |
| | | // Properties systemSettings = System.getProperties(); |
| | | // systemSettings.put("http.proxyHost", "webcache.central.sun.com"); |
| | | // systemSettings.put("http.proxyPort", "8080"); |
| | | // systemSettings.put("https.proxyHost", "webcache.central.sun.com"); |
| | | // systemSettings.put("https.proxyPort", "8080"); |
| | | // |
| | | // System.setProperties(systemSettings); |
| | | // |
| | | // URL url = new URL("http://builds.opends.org"); |
| | | // RemoteBuildManager rbm = new RemoteBuildManager(null, url); |
| | | // //List<Build> builds = rbm.listBuilds(); |
| | | // //for (Build build : builds) { |
| | | // // System.out.println("build " + build); |
| | | // //} |
| | | // rbm.download(new URL("https://opends.dev.java.net/" + |
| | | // "files/documents/4926/55351/OpenDS-0.1-build035.zip"), |
| | | // new File("/tmp/OpenDS-xxx.zip")); |
| | | // } catch (IOException e) { |
| | | // e.printStackTrace(); |
| | | // } |
| | | // |
| | | // } |
| | | |
| | | } |
| | | } |