jdk/src/share/classes/com/sun/servicetag/ServiceTag.java
changeset 16802 ea3325542aa8
parent 16801 e2de240b437f
parent 16575 d7ad0dfaa411
child 16803 3bdc22a32b0e
equal deleted inserted replaced
16801:e2de240b437f 16802:ea3325542aa8
     1 /*
       
     2  * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
       
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
       
     4  *
       
     5  * This code is free software; you can redistribute it and/or modify it
       
     6  * under the terms of the GNU General Public License version 2 only, as
       
     7  * published by the Free Software Foundation.  Oracle designates this
       
     8  * particular file as subject to the "Classpath" exception as provided
       
     9  * by Oracle in the LICENSE file that accompanied this code.
       
    10  *
       
    11  * This code is distributed in the hope that it will be useful, but WITHOUT
       
    12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
       
    13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
       
    14  * version 2 for more details (a copy is included in the LICENSE file that
       
    15  * accompanied this code).
       
    16  *
       
    17  * You should have received a copy of the GNU General Public License version
       
    18  * 2 along with this work; if not, write to the Free Software Foundation,
       
    19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
       
    20  *
       
    21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
       
    22  * or visit www.oracle.com if you need additional information or have any
       
    23  * questions.
       
    24  */
       
    25 
       
    26 package com.sun.servicetag;
       
    27 
       
    28 import java.util.Date;
       
    29 import java.io.IOException;
       
    30 import static com.sun.servicetag.RegistrationDocument.*;
       
    31 
       
    32 /**
       
    33  * A service tag is an XML-based data structure that identifies a product or
       
    34  * a component on a system. The service tag schema is defined by the
       
    35  * Service Tags Technology. The location of the DTD file is platform dependent.
       
    36  * On Solaris, see <tt>/usr/share/lib/xml/dtd/servicetag.dtd</tt>.
       
    37  * <p>
       
    38  * A valid {@code ServiceTag} instance must comply to the service tag schema
       
    39  * and contain the following fields:
       
    40  * <ul>
       
    41  *   <li>{@link #getInstanceURN <tt>instance_urn</tt>}</li>
       
    42  *   <li>{@link #getProductName <tt>product_name</tt>}</li>
       
    43  *   <li>{@link #getProductVersion <tt>product_version</tt>}</li>
       
    44  *   <li>{@link #getProductURN <tt>product_urn</tt>}</li>
       
    45  *   <li>{@link #getProductParent <tt>product_parent</tt>}</li>
       
    46  *   <li>{@link #getProductParentURN <tt>product_parent_urn</tt>}</li>
       
    47  *   <li>{@link #getProductDefinedInstanceID <tt>product_defined_inst_id</tt>}</li>
       
    48  *   <li>{@link #getProductVendor <tt>product_vendor</tt>}</li>
       
    49  *   <li>{@link #getPlatformArch <tt>platform_arch</tt>}</li>
       
    50  *   <li>{@link #getContainer <tt>container</tt>}</li>
       
    51  *   <li>{@link #getSource <tt>source</tt>}</li>
       
    52  *   <li>{@link #getInstallerUID <tt>installer_uid</tt>}</li>
       
    53  *   <li>{@link #getTimestamp <tt>timestamp</tt>}</li>
       
    54  * </ul>
       
    55  *
       
    56  * The <tt>instance_urn</tt> can be specified when a {@code ServiceTag}
       
    57  * object is created, or it can be generated when it is added to
       
    58  * a {@link RegistrationData} object, or {@link Registry
       
    59  * system service tag registry}. The <tt>installer_uid</tt> and
       
    60  * <tt>timestamp</tt> are set when a {@code ServiceTag} object
       
    61  * is added to a {@link RegistrationData} object, or {@link Registry
       
    62  * system service tag registry}.
       
    63  *
       
    64  * @see <a href="https://sunconnection.sun.com/FAQ/sc_faq.html">Service Tags FAQ</a>
       
    65  */
       
    66 public class ServiceTag {
       
    67 
       
    68     private String instanceURN;
       
    69     private String productName;
       
    70     private String productVersion;
       
    71     private String productURN;
       
    72     private String productParent;
       
    73     private String productParentURN;
       
    74     private String productDefinedInstanceID;
       
    75     private String productVendor;
       
    76     private String platformArch;
       
    77     private String container;
       
    78     private String source;
       
    79     private int installerUID;
       
    80     private Date timestamp;
       
    81 
       
    82     // Service Tag Field Lengths (defined in sthelper.h)
       
    83     // Since the constants defined in sthelper.h includes the null-terminated
       
    84     // character, so minus 1 from the sthelper.h defined values.
       
    85     private final int MAX_URN_LEN             = 256 - 1;
       
    86     private final int MAX_PRODUCT_NAME_LEN    = 256 - 1;
       
    87     private final int MAX_PRODUCT_VERSION_LEN = 64 - 1;
       
    88     private final int MAX_PRODUCT_PARENT_LEN  = 256 - 1;
       
    89     private final int MAX_PRODUCT_VENDOR_LEN  = 64 - 1;
       
    90     private final int MAX_PLATFORM_ARCH_LEN   = 64 - 1;
       
    91     private final int MAX_CONTAINER_LEN       = 64 - 1;
       
    92     private final int MAX_SOURCE_LEN          = 64 - 1;
       
    93 
       
    94     // private constructors
       
    95     private ServiceTag() {
       
    96     }
       
    97     // package private
       
    98     ServiceTag(String instanceURN,
       
    99                String productName,
       
   100                String productVersion,
       
   101                String productURN,
       
   102                String productParent,
       
   103                String productParentURN,
       
   104                String productDefinedInstanceID,
       
   105                String productVendor,
       
   106                String platformArch,
       
   107                String container,
       
   108                String source,
       
   109                int installerUID,
       
   110                Date timestamp) {
       
   111         setInstanceURN(instanceURN);
       
   112         setProductName(productName);
       
   113         setProductVersion(productVersion);
       
   114         setProductURN(productURN);
       
   115         setProductParentURN(productParentURN);
       
   116         setProductParent(productParent);
       
   117         setProductDefinedInstanceID(productDefinedInstanceID);
       
   118         setProductVendor(productVendor);
       
   119         setPlatformArch(platformArch);
       
   120         setContainer(container);
       
   121         setSource(source);
       
   122         setInstallerUID(installerUID);
       
   123         setTimestamp(timestamp);
       
   124     }
       
   125 
       
   126     /**
       
   127      * Creates a service tag object with no <tt>instance_urn</tt>.
       
   128      *
       
   129      * @param productName               the name of the product.
       
   130      * @param productVersion            the version of the product.
       
   131      * @param productURN                the uniform resource name of the product
       
   132      * @param productParent             the name of the product's parent.
       
   133      * @param productParentURN          the uniform resource name of the product's parent.
       
   134      * @param productDefinedInstanceID  the instance identifier.
       
   135      * @param productVendor             the vendor of the product.
       
   136      * @param platformArch              the operating system architecture.
       
   137      * @param container                 the container of the product.
       
   138      * @param source                    the source of the product.
       
   139      *
       
   140      * @throws IllegalArgumentException if any value of the input fields
       
   141      *    does not conform to the service tag XML schema.
       
   142      */
       
   143     public static ServiceTag newInstance(String productName,
       
   144                                          String productVersion,
       
   145                                          String productURN,
       
   146                                          String productParent,
       
   147                                          String productParentURN,
       
   148                                          String productDefinedInstanceID,
       
   149                                          String productVendor,
       
   150                                          String platformArch,
       
   151                                          String container,
       
   152                                          String source) {
       
   153           return new ServiceTag("", /* empty instance_urn */
       
   154                                 productName,
       
   155                                 productVersion,
       
   156                                 productURN,
       
   157                                 productParent,
       
   158                                 productParentURN,
       
   159                                 productDefinedInstanceID,
       
   160                                 productVendor,
       
   161                                 platformArch,
       
   162                                 container,
       
   163                                 source,
       
   164                                 -1,
       
   165                                 null);
       
   166     }
       
   167 
       
   168     /**
       
   169      * Creates a service tag object with a specified <tt>instance_urn</tt>.
       
   170      *
       
   171      * @param instanceURN               the uniform resource name of this instance.
       
   172      * @param productName               the name of the product.
       
   173      * @param productVersion            the version of the product.
       
   174      * @param productURN                the uniform resource name of the product
       
   175      * @param productParent             the name of the product's parent.
       
   176      * @param productParentURN          the uniform resource name of the product's parent.
       
   177      * @param productDefinedInstanceID  the instance identifier.
       
   178      * @param productVendor             the vendor of the product.
       
   179      * @param platformArch              the operating system architecture.
       
   180      * @param container                 the container of the product.
       
   181      * @param source                    the source of the product.
       
   182      *
       
   183      * @throws IllegalArgumentException if any value of the input fields
       
   184      *    does not conform to the service tag XML schema.
       
   185      */
       
   186     public static ServiceTag newInstance(String instanceURN,
       
   187                                          String productName,
       
   188                                          String productVersion,
       
   189                                          String productURN,
       
   190                                          String productParent,
       
   191                                          String productParentURN,
       
   192                                          String productDefinedInstanceID,
       
   193                                          String productVendor,
       
   194                                          String platformArch,
       
   195                                          String container,
       
   196                                          String source) {
       
   197           return new ServiceTag(instanceURN,
       
   198                                 productName,
       
   199                                 productVersion,
       
   200                                 productURN,
       
   201                                 productParent,
       
   202                                 productParentURN,
       
   203                                 productDefinedInstanceID,
       
   204                                 productVendor,
       
   205                                 platformArch,
       
   206                                 container,
       
   207                                 source,
       
   208                                 -1,
       
   209                                 null);
       
   210     }
       
   211 
       
   212     // Creates a copy of the ServiceTag instance
       
   213     // with instance_urn and timestamp initialized
       
   214     static ServiceTag newInstanceWithUrnTimestamp(ServiceTag st) {
       
   215         String instanceURN =
       
   216             (st.getInstanceURN().length() == 0 ? Util.generateURN() :
       
   217                                                  st.getInstanceURN());
       
   218         ServiceTag svcTag = new ServiceTag(instanceURN,
       
   219                                            st.getProductName(),
       
   220                                            st.getProductVersion(),
       
   221                                            st.getProductURN(),
       
   222                                            st.getProductParent(),
       
   223                                            st.getProductParentURN(),
       
   224                                            st.getProductDefinedInstanceID(),
       
   225                                            st.getProductVendor(),
       
   226                                            st.getPlatformArch(),
       
   227                                            st.getContainer(),
       
   228                                            st.getSource(),
       
   229                                            st.getInstallerUID(),
       
   230                                            new Date());
       
   231         return svcTag;
       
   232     }
       
   233 
       
   234     /**
       
   235      * Returns a uniform resource name (URN) in this format:
       
   236      * <blockquote>
       
   237      * "<tt>urn:st:<32-char {@link java.util.UUID uuid}></tt>"
       
   238      * </blockquote>
       
   239      * @return a URN.
       
   240      */
       
   241     public static String generateInstanceURN() {
       
   242         return Util.generateURN();
       
   243     }
       
   244 
       
   245     /**
       
   246      * Returns the uniform resource name of this service tag instance.
       
   247      *
       
   248      * @return  the <tt>instance_urn</tt> of this service tag.
       
   249      */
       
   250     public String getInstanceURN() {
       
   251         return instanceURN;
       
   252     }
       
   253 
       
   254     /**
       
   255      * Returns the name of the product.
       
   256      *
       
   257      * @return the product name.
       
   258      */
       
   259     public String getProductName() {
       
   260         return productName;
       
   261     }
       
   262 
       
   263     /**
       
   264      * Returns the version of the product.
       
   265      *
       
   266      * @return the product version.
       
   267      */
       
   268     public String getProductVersion() {
       
   269         return productVersion;
       
   270     }
       
   271 
       
   272     /**
       
   273      * Returns the uniform resource name of the product.
       
   274      *
       
   275      * @return the product URN.
       
   276      */
       
   277     public String getProductURN() {
       
   278         return productURN;
       
   279     }
       
   280 
       
   281     /**
       
   282      * Returns the uniform resource name of the product's parent.
       
   283      *
       
   284      * @return the product's parent URN.
       
   285      */
       
   286     public String getProductParentURN() {
       
   287         return productParentURN;
       
   288     }
       
   289 
       
   290     /**
       
   291      * Returns the name of the product's parent.
       
   292      *
       
   293      * @return the product's parent name.
       
   294      */
       
   295     public String getProductParent() {
       
   296         return productParent;
       
   297     }
       
   298 
       
   299     /**
       
   300      * Returns the identifier defined for this product instance.
       
   301      *
       
   302      * @return  the identifier defined for this product instance.
       
   303      */
       
   304     public String getProductDefinedInstanceID() {
       
   305         return productDefinedInstanceID;
       
   306     }
       
   307 
       
   308     /**
       
   309      * Returns the vendor of the product.
       
   310      *
       
   311      * @return the product vendor.
       
   312      */
       
   313     public String getProductVendor() {
       
   314         return productVendor;
       
   315     }
       
   316 
       
   317     /**
       
   318      * Returns the platform architecture on which the product
       
   319      * is running on.
       
   320      *
       
   321      * @return the platform architecture on which the product is running on.
       
   322      */
       
   323     public String getPlatformArch() {
       
   324         return platformArch;
       
   325     }
       
   326 
       
   327     /**
       
   328      * Returns the timestamp.  This timestamp is set when this service tag
       
   329      * is added to or updated in a {@code RegistrationData} object or
       
   330      * the system service tag registry.
       
   331      * This method may return {@code null}.
       
   332      *
       
   333      * @return timestamp when this service tag
       
   334      * is added to or updated in a {@code RegistrationData} object or
       
   335      * the system service tag registry, or {@code null}.
       
   336      */
       
   337     public Date getTimestamp() {
       
   338         if (timestamp != null) {
       
   339             return (Date) timestamp.clone();
       
   340         } else {
       
   341             return null;
       
   342         }
       
   343     }
       
   344 
       
   345 
       
   346     /**
       
   347      * Returns the container of the product.
       
   348      *
       
   349      * @return the container of the product.
       
   350      */
       
   351     public String getContainer() {
       
   352         return container;
       
   353     }
       
   354 
       
   355     /**
       
   356      * Returns the source of this service tag.
       
   357      *
       
   358      * @return  source of this service tag.
       
   359      */
       
   360     public String getSource() {
       
   361         return source;
       
   362     }
       
   363 
       
   364     /**
       
   365      * Returns the UID. The UID is set when this service tag
       
   366      * is added to or updated in the system service tag registry.
       
   367      * This is platform dependent whose default value is {@code -1}.
       
   368      * When this service tag is added to a {@code RegistrationData},
       
   369      * the UID is not set.
       
   370      *
       
   371      * @return the UID of whom this service tag
       
   372      * is added to or updated in the system service tag registry,
       
   373      * or {@code -1}.
       
   374      */
       
   375     public int getInstallerUID() {
       
   376         return installerUID;
       
   377     }
       
   378 
       
   379     // The following setter methods are used to validate the
       
   380     // input field when constructing a ServiceTag instance
       
   381 
       
   382     private void setInstanceURN(String instanceURN) {
       
   383         if (instanceURN == null) {
       
   384             throw new NullPointerException("Parameter instanceURN cannot be null");
       
   385         }
       
   386         if (instanceURN.length() > MAX_URN_LEN) {
       
   387             throw new IllegalArgumentException("instanceURN \"" + instanceURN +
       
   388                 "\" exceeds maximum length " + MAX_URN_LEN);
       
   389         }
       
   390         this.instanceURN = instanceURN;
       
   391     }
       
   392 
       
   393     private void setProductName(String productName) {
       
   394         if (productName == null) {
       
   395             throw new NullPointerException("Parameter productName cannot be null");
       
   396         }
       
   397         if (productName.length() == 0) {
       
   398             throw new IllegalArgumentException("product name cannot be empty");
       
   399         }
       
   400         if (productName.length() > MAX_PRODUCT_NAME_LEN) {
       
   401             throw new IllegalArgumentException("productName \"" + productName +
       
   402                 "\" exceeds maximum length " + MAX_PRODUCT_NAME_LEN);
       
   403         }
       
   404         this.productName = productName;
       
   405     }
       
   406 
       
   407     private void setProductVersion(String productVersion) {
       
   408         if (productVersion == null) {
       
   409             throw new NullPointerException("Parameter productVersion cannot be null");
       
   410         }
       
   411 
       
   412         if (productVersion.length() == 0) {
       
   413             throw new IllegalArgumentException("product version cannot be empty");
       
   414         }
       
   415         if (productVersion.length() > MAX_PRODUCT_VERSION_LEN) {
       
   416             throw new IllegalArgumentException("productVersion \"" +
       
   417                 productVersion + "\" exceeds maximum length " +
       
   418                 MAX_PRODUCT_VERSION_LEN);
       
   419         }
       
   420         this.productVersion = productVersion;
       
   421     }
       
   422 
       
   423     private void setProductURN(String productURN) {
       
   424         if (productURN == null) {
       
   425             throw new NullPointerException("Parameter productURN cannot be null");
       
   426         }
       
   427         if (productURN.length() == 0) {
       
   428             throw new IllegalArgumentException("product URN cannot be empty");
       
   429         }
       
   430         if (productURN.length() > MAX_URN_LEN) {
       
   431             throw new IllegalArgumentException("productURN \"" + productURN +
       
   432                 "\" exceeds maximum length " + MAX_URN_LEN);
       
   433         }
       
   434         this.productURN = productURN;
       
   435     }
       
   436 
       
   437     private void setProductParentURN(String productParentURN) {
       
   438         if (productParentURN == null) {
       
   439             throw new NullPointerException("Parameter productParentURN cannot be null");
       
   440         }
       
   441         // optional field - can be empty
       
   442         if (productParentURN.length() > MAX_URN_LEN) {
       
   443             throw new IllegalArgumentException("productParentURN \"" +
       
   444                 productParentURN + "\" exceeds maximum length " +
       
   445                 MAX_URN_LEN);
       
   446         }
       
   447         this.productParentURN = productParentURN;
       
   448     }
       
   449 
       
   450     private void setProductParent(String productParent) {
       
   451         if (productParent == null) {
       
   452             throw new NullPointerException("Parameter productParent cannot be null");
       
   453         }
       
   454         if (productParent.length() == 0) {
       
   455             throw new IllegalArgumentException("product parent cannot be empty");
       
   456         }
       
   457         if (productParent.length() > MAX_PRODUCT_PARENT_LEN) {
       
   458             throw new IllegalArgumentException("productParent \"" +
       
   459                 productParent + "\" exceeds maximum length " +
       
   460                 MAX_PRODUCT_PARENT_LEN);
       
   461         }
       
   462         this.productParent = productParent;
       
   463     }
       
   464 
       
   465     void setProductDefinedInstanceID(String productDefinedInstanceID) {
       
   466         if (productDefinedInstanceID == null) {
       
   467             throw new NullPointerException("Parameter productDefinedInstanceID cannot be null");
       
   468         }
       
   469         if (productDefinedInstanceID.length() > MAX_URN_LEN) {
       
   470             throw new IllegalArgumentException("productDefinedInstanceID \"" +
       
   471                 productDefinedInstanceID + "\" exceeds maximum length " +
       
   472                 MAX_URN_LEN);
       
   473         }
       
   474         // optional field - can be empty
       
   475         this.productDefinedInstanceID = productDefinedInstanceID;
       
   476     }
       
   477 
       
   478     private void setProductVendor(String productVendor) {
       
   479         if (productVendor == null) {
       
   480             throw new NullPointerException("Parameter productVendor cannot be null");
       
   481         }
       
   482         if (productVendor.length() == 0) {
       
   483             throw new IllegalArgumentException("product vendor cannot be empty");
       
   484         }
       
   485         if (productVendor.length() > MAX_PRODUCT_VENDOR_LEN) {
       
   486             throw new IllegalArgumentException("productVendor \"" +
       
   487                 productVendor + "\" exceeds maximum length " +
       
   488                 MAX_PRODUCT_VENDOR_LEN);
       
   489         }
       
   490         this.productVendor = productVendor;
       
   491     }
       
   492 
       
   493     private void setPlatformArch(String platformArch) {
       
   494         if (platformArch == null) {
       
   495             throw new NullPointerException("Parameter platformArch cannot be null");
       
   496         }
       
   497         if (platformArch.length() == 0) {
       
   498             throw new IllegalArgumentException("platform architecture cannot be empty");
       
   499         }
       
   500         if (platformArch.length() > MAX_PLATFORM_ARCH_LEN) {
       
   501             throw new IllegalArgumentException("platformArch \"" +
       
   502                 platformArch + "\" exceeds maximum length " +
       
   503                 MAX_PLATFORM_ARCH_LEN);
       
   504         }
       
   505         this.platformArch = platformArch;
       
   506     }
       
   507 
       
   508     private void setTimestamp(Date timestamp) {
       
   509         // can be null
       
   510         this.timestamp = timestamp;
       
   511     }
       
   512 
       
   513     private void setContainer(String container) {
       
   514         if (container == null) {
       
   515             throw new NullPointerException("Parameter container cannot be null");
       
   516         }
       
   517         if (container.length() == 0) {
       
   518             throw new IllegalArgumentException("container cannot be empty");
       
   519         }
       
   520         if (container.length() > MAX_CONTAINER_LEN) {
       
   521             throw new IllegalArgumentException("container \"" +
       
   522                 container + "\" exceeds maximum length " +
       
   523                 MAX_CONTAINER_LEN);
       
   524         }
       
   525         this.container = container;
       
   526     }
       
   527 
       
   528     private void setSource(String source) {
       
   529         if (source == null) {
       
   530             throw new NullPointerException("Parameter source cannot be null");
       
   531         }
       
   532         if (source.length() == 0) {
       
   533             throw new IllegalArgumentException("source cannot be empty");
       
   534         }
       
   535         if (source.length() > MAX_SOURCE_LEN) {
       
   536             throw new IllegalArgumentException("source \"" + source +
       
   537                 "\" exceeds maximum length " + MAX_SOURCE_LEN);
       
   538         }
       
   539         this.source = source;
       
   540     }
       
   541 
       
   542     private void setInstallerUID(int installerUID) {
       
   543         this.installerUID = installerUID;
       
   544     }
       
   545 
       
   546     /**
       
   547      * Compares this service tag to the specified object.
       
   548      * The result is {@code true} if and only if the argument is
       
   549      * not {@code null} and is a {@code ServiceTag} object whose
       
   550      * <tt>instance_urn</tt> is the same as the
       
   551      * <tt>instance_urn</tt> of this service tag.
       
   552      *
       
   553      * @return {@code true} if this service tag is the same as
       
   554      * the specified object.
       
   555      */
       
   556     @Override
       
   557     public boolean equals(Object obj) {
       
   558         if (obj == null || !(obj instanceof ServiceTag)) {
       
   559             return false;
       
   560         }
       
   561         ServiceTag st = (ServiceTag) obj;
       
   562         if (st == this) {
       
   563             return true;
       
   564         }
       
   565         return st.getInstanceURN().equals(getInstanceURN());
       
   566     }
       
   567 
       
   568     /**
       
   569      * Returns the hash code value for this service tag.
       
   570      * @return the hash code value for this service tag.
       
   571      */
       
   572     @Override
       
   573     public int hashCode() {
       
   574         int hash = 7;
       
   575         hash = 19 * hash + (this.instanceURN != null ? this.instanceURN.hashCode() : 0);
       
   576         return hash;
       
   577     }
       
   578 
       
   579     /**
       
   580      * Returns the string representation of this service tag.
       
   581      * The format is implementation specific.
       
   582      *
       
   583      * @return the string representation of this service tag.
       
   584      */
       
   585     public String toString() {
       
   586         StringBuilder sb = new StringBuilder();
       
   587         sb.append(ST_NODE_INSTANCE_URN).append("=").append(instanceURN).append("\n");
       
   588         sb.append(ST_NODE_PRODUCT_NAME).append("=").append(productName).append("\n");
       
   589         sb.append(ST_NODE_PRODUCT_VERSION).append("=").append(productVersion).append("\n");
       
   590         sb.append(ST_NODE_PRODUCT_URN).append("=").append(productURN).append("\n");
       
   591         sb.append(ST_NODE_PRODUCT_PARENT_URN).append("=").append(productParentURN).append("\n");
       
   592         sb.append(ST_NODE_PRODUCT_PARENT).append("=").append(productParent).append("\n");
       
   593         sb.append(ST_NODE_PRODUCT_DEFINED_INST_ID).append("=").append(productDefinedInstanceID).append("\n");
       
   594         sb.append(ST_NODE_PRODUCT_VENDOR).append("=").append(productVendor).append("\n");
       
   595         sb.append(ST_NODE_PLATFORM_ARCH).append("=").append(platformArch).append("\n");
       
   596         sb.append(ST_NODE_TIMESTAMP).append("=").append(Util.formatTimestamp(timestamp)).append("\n");
       
   597         sb.append(ST_NODE_CONTAINER).append("=").append(container).append("\n");
       
   598         sb.append(ST_NODE_SOURCE).append("=").append(source).append("\n");
       
   599         sb.append(ST_NODE_INSTALLER_UID).append("=").append(String.valueOf(installerUID)).append("\n");
       
   600         return sb.toString();
       
   601     }
       
   602 
       
   603 
       
   604     /**
       
   605      * Returns the {@link ServiceTag} instance for the running Java
       
   606      * platform. The {@link ServiceTag#setSource source} field
       
   607      * of the {@code ServiceTag} will be set to the given {@code source}.
       
   608      * This method will return {@code null} if there is no service tag
       
   609      * for the running Java platform.
       
   610      * <p>
       
   611      * This method is designed for Sun software that bundles the JDK
       
   612      * or the JRE to use. It is recommended that the {@code source}
       
   613      * string contains information about the bundling software
       
   614      * such as the name and the version of the software bundle,
       
   615      * for example,
       
   616      * <blockquote>
       
   617      * <tt>NetBeans IDE 6.0 with JDK 6 Update 5 Bundle</tt>
       
   618      * </blockquote>
       
   619      * in a NetBeans/JDK bundle.
       
   620      * <p>
       
   621      * At the first time to call this method the application
       
   622      * is required to have the write permission to the installed
       
   623      * directory of this running JDK or JRE instance.
       
   624      *
       
   625      * @param source the source that bundles the JDK or the JRE.
       
   626      * @return a {@code ServiceTag} object for the Java platform,
       
   627      *         or {@code null} if not supported.
       
   628      * @throws IOException if an error occurs in this operation.
       
   629      */
       
   630     public static ServiceTag getJavaServiceTag(String source) throws IOException {
       
   631         return Installer.getJavaServiceTag(source);
       
   632     }
       
   633 
       
   634 }