/* * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package com.sun.servicetag; import java.io.*; import java.net.URISyntaxException; import java.net.URL; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.io.OutputStreamWriter; import java.util.Locale; import javax.net.ssl.HttpsURLConnection; /** * Sun Connection Class for Product Registration. * * Registration Web Application Interface * 1) POST the product registry to the output stream of the registration * relay service. * 2) Open the webapp URL from a browser with the following parameters: * registry-urn * product=jdk * locale= * version= * * @see https://sn-tools.central.sun.com/twiki/pub/ServiceTags/RegistrationRelayService/ * */ class SunConnection { private static String JDK_REGISTRATION_URL = "https://hs-ws1.oracle.com/"; private static String SANDBOX_TESTING_URL = "https://hs-ws1-tst.oracle.com/"; private static String REGISTRATION_WEB_PATH = "RegistrationWeb/register"; // System properties for testing private static String SVCTAG_REGISTER_TESTING = "servicetag.register.testing"; private static String SVCTAG_REGISTRATION_URL = "servicetag.registration.url"; private static String SVCTAG_CONNECTION_TIMEOUT = "servicetag.connection.timeout"; private SunConnection() { } /** * Returns a URL for JDK registration interfacing with the Sun Connection * registration relay service in this form: * /?product=jdk&locale= * * The can be overridden by an environment * variable or a system property. * * 1) "servicetag.register.testing" system property to switch to the * Sun Connection registration sandbox testing. * 2) "servicetag.registration.url" system property to override * the URL * 3) Default production URL * */ static URL getRegistrationURL(String registrationURN, Locale locale, String version) { String url = System.getProperty(SVCTAG_REGISTRATION_URL); if (url == null) { if (System.getProperty(SVCTAG_REGISTER_TESTING) != null) { url = SANDBOX_TESTING_URL; } else { url = JDK_REGISTRATION_URL; } } url += REGISTRATION_WEB_PATH; // trim whitespaces url = url.trim(); if (url.length() == 0) { throw new InternalError("Empty registration url set"); } // Add the registry_urn in the URL's query String registerURL = rewriteURL(url, registrationURN, locale, version); try { return new URL(registerURL); } catch (MalformedURLException ex) { // should never reach here InternalError x = new InternalError(ex.getMessage()); x.initCause(ex); throw x; } } private static String rewriteURL(String url, String registryURN, Locale locale, String version) { StringBuilder sb = new StringBuilder(url.trim()); int len = sb.length(); if (sb.charAt(len-1) != '/') { sb.append('/'); } sb.append(registryURN); sb.append("?"); sb.append("product=jdk"); sb.append("&"); sb.append("locale=").append(locale.toString()); sb.append("&"); sb.append("version=").append(version); return sb.toString(); } /** * Registers all products in the given product registry. If it fails * to post the service tag registry, open the browser with the offline * registration page. * * @param regData registration data to be posted to the Sun Connection * for registration. * @param locale Locale * @param version JDK version * * @throws IOException if I/O error occurs in this operation */ public static void register(RegistrationData regData, Locale locale, String version) throws IOException { // Gets the URL for SunConnection registration relay service URL url = getRegistrationURL(regData.getRegistrationURN(), locale, version); // Post the Product Registry to Sun Connection boolean succeed = postRegistrationData(url, regData); if (succeed) { // service tags posted successfully // now prompt for registration openBrowser(url); } else { // open browser with the offline registration page openOfflineRegisterPage(); } } /** * Opens a browser for JDK product registration. * @param url Registration Webapp URL */ private static void openBrowser(URL url) throws IOException { if (!BrowserSupport.isSupported()) { if (Util.isVerbose()) { System.out.println("Browser is not supported"); } return; } try { BrowserSupport.browse(url.toURI()); } catch (URISyntaxException ex) { InternalError x = new InternalError("Error in registering: " + ex.getMessage()); x.initCause(ex); throw x; } catch (IllegalArgumentException ex) { if (Util.isVerbose()) { ex.printStackTrace(); } } catch (UnsupportedOperationException ex) { // ignore if not supported if (Util.isVerbose()) { ex.printStackTrace(); } } } /** * POST service tag registry to Sun Connection * @param loc the URL of the webapp to handle the POST request * @param streg the Service Tag registry * @return true if posting succeeds; otherwise, false. */ private static boolean postRegistrationData(URL url, RegistrationData registration) { try { HttpsURLConnection con = (HttpsURLConnection) url.openConnection(); con.setDoInput(true); con.setDoOutput(true); con.setUseCaches(false); con.setAllowUserInteraction(false); // default 10 seconds timeout String timeout = System.getProperty(SVCTAG_CONNECTION_TIMEOUT, "10"); con.setConnectTimeout(Util.getIntValue(timeout) * 1000); if (Util.isVerbose()) { System.out.println("Connecting to post registration data at " + url); } con.setRequestMethod("POST"); con.setRequestProperty("Content-Type", "text/xml;charset=\"utf-8\""); con.connect(); OutputStream out = null; try { out = con.getOutputStream(); registration.storeToXML(out); out.flush(); } finally { if (out != null) { out.close(); } } int returnCode = con.getResponseCode(); if (Util.isVerbose()) { System.out.println("POST return status = " + returnCode); printReturnData(con, returnCode); } return (returnCode == HttpURLConnection.HTTP_OK); } catch (MalformedURLException me) { // should never reach here InternalError x = new InternalError("Error in registering: " + me.getMessage()); x.initCause(me); throw x; } catch (Exception ioe) { // SocketTimeoutException, IOException or UnknownHostException if (Util.isVerbose()) { ioe.printStackTrace(); } return false; } } /** * Opens the offline registratioin page in the browser. * */ private static void openOfflineRegisterPage() throws IOException { if (!BrowserSupport.isSupported()) { if (Util.isVerbose()) { System.out.println("Browser is not supported"); } return; } File registerPage = Installer.getRegistrationHtmlPage(); try { BrowserSupport.browse(registerPage.toURI()); } catch (FileNotFoundException ex) { // should never reach here InternalError x = new InternalError("Error in launching " + registerPage + ": " + ex.getMessage()); x.initCause(ex); throw x; } catch (IllegalArgumentException ex) { if (Util.isVerbose()) { ex.printStackTrace(); } } catch (UnsupportedOperationException ex) { // ignore if not supported if (Util.isVerbose()) { ex.printStackTrace(); } } } private static void printReturnData(HttpURLConnection con, int returnCode) throws IOException { BufferedReader reader = null; try { if (returnCode < 400) { reader = new BufferedReader( new InputStreamReader(con.getInputStream())); } else { reader = new BufferedReader( new InputStreamReader(con.getErrorStream())); } StringBuilder sb = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { sb.append(line).append("\n"); } System.out.println("Response is : "); System.out.println(sb.toString()); } finally { if (reader != null) { reader.close(); } } } }