/** Reads uids from 'uids' file during conversion of midlets from old java to OMJ. */
 private void readUidsFromFile(InstallBall aBall) {
   if (!aBall.iConversionInstallation) {
     return;
   }
   String uidsFilename = aBall.iConversionRoot + "uids";
   if (FileUtils.exists(uidsFilename)) {
     Log.log("Reading uids file: " + uidsFilename);
     Vector v = new Vector();
     InputStream is = null;
     try {
       is = FileUtils.getInputStream(uidsFilename);
       while (is.available() > 0) {
         v.addElement(readUid(is));
       }
     } catch (IOException ioe) {
       InstallerException.internalError("Error while reading uids file: " + uidsFilename, ioe);
     } finally {
       if (is != null) {
         try {
           is.close();
           is = null;
         } catch (IOException ioe) {
           Log.logWarning("Closing InputStream failed", ioe);
         }
       }
     }
     iUidsFromFile = new Uid[v.size()];
     v.copyInto(iUidsFromFile);
     for (int i = 0; i < iUidsFromFile.length; i++) {
       Log.log("Read uid[" + i + "]: " + iUidsFromFile[i]);
     }
   } else {
     InstallerException.internalError("No uids file: " + uidsFilename);
   }
 }
 /**
  * Selects application uid from Nokia-MIDlet-UID attribute.
  *
  * @return uid if attribute specifies it, null otherwise.
  * @throws InstallerException if attribute exists and is not valid or specified uid is already in
  *     use.
  */
 private Uid selectAppUidFromAttribute(InstallBall aBall, int aIndex) {
   Uid uid = null;
   String appUidAttrName = MIDLET_UID_ATTR_NAME + aIndex;
   String appUidAttrValue = aBall.getAttributeValue(appUidAttrName);
   if (appUidAttrValue != null) {
     uid = PlatformUid.createUid(appUidAttrValue);
     if (uid == null) {
       Log.logError("Invalid " + appUidAttrName + " attribute value: " + appUidAttrValue);
       throw new InvalidAttributeException(
           InstallerErrorMessage.INST_CORRUPT_PKG,
           null,
           InstallerDetailedErrorMessage.ATTR_BAD_SYNTAX,
           new String[] {appUidAttrName},
           (aBall.attributeExistsInJad(appUidAttrName)
               ? OtaStatusCode.INVALID_DESCRIPTOR
               : OtaStatusCode.INVALID_JAR));
     }
     boolean uidInJad = aBall.attributeExistsInJad(appUidAttrName);
     // If jar file is not yet present, assume that uid
     // will be present in jar.
     boolean uidInJar = true;
     if (aBall.iJarFilename != null) {
       uidInJar = aBall.attributeExistsInJar(appUidAttrName);
     }
     if (uidInJar && !uidInJad && aBall.iJadAttributes != null) {
       // If Uid is specified in jar but not in jad
       // it must be ignored. Getting applications
       // through Java Verified process requires
       // that applications using protected Uids
       // can be installed as untrusted (without jad).
       Log.logWarning(appUidAttrName + " attribute present in jar but not in jad, ignoring it");
       uid = null;
     }
     if (uid != null) {
       // Check that uid is valid.
       PlatformUid.checkValidity(
           appUidAttrName, uid, aBall.iSuite.isTrusted(), uidInJad, uidInJar);
       // Check that uid is not already in use.
       if (appUidInUse(uid, aBall) || appUidInUse(uid, aBall.iSuite)) {
         Log.logError("Uid " + uid + " is already in use");
         throw new InvalidAttributeException(
             InstallerErrorMessage.INST_CORRUPT_PKG,
             null,
             InstallerDetailedErrorMessage.ATTR_HANDLING_FAILED,
             new String[] {appUidAttrName},
             (aBall.attributeExistsInJad(appUidAttrName)
                 ? OtaStatusCode.INVALID_DESCRIPTOR
                 : OtaStatusCode.INVALID_JAR));
       }
     }
     aBall.log("Selected app uid from " + appUidAttrName + " attribute: " + uid);
   }
   return uid;
 }
 /**
  * Checks that all specified Nokia-MIDlet-UID-n attributes are present in jar for trusted
  * application. Throws InstallerException if attributes are not present.
  */
 private static void checkNokiaMidletUids(InstallBall aBall) {
   if (aBall == null || !aBall.iSuite.isTrusted()) {
     return;
   }
   for (int i = 1; true; i++) {
     // Check if uid is specified with Nokia-MIDlet-UID attribute.
     String appUidAttrName = MIDLET_UID_ATTR_NAME + i;
     String appUidAttrValue = aBall.getAttributeValue(appUidAttrName);
     if (appUidAttrValue != null) {
       // Uid is specified with attribute, check that attribute
       // is present in jar.
       if (!aBall.attributeExistsInJar(appUidAttrName)) {
         Log.logError("For trusted application Uid must be specified in Jar: " + appUidAttrName);
         throw new InvalidAttributeException(
             InstallerErrorMessage.INST_CORRUPT_PKG,
             null,
             InstallerDetailedErrorMessage.ATTR_HANDLING_FAILED,
             new String[] {appUidAttrName},
             OtaStatusCode.INVALID_JAR);
       }
     } else {
       break;
     }
   }
 }
 /** Selects suite uid. */
 private void selectSuiteUid(InstallBall ball) {
   // Select suite uid.
   Log.log("Selecting suite uid...");
   if (ball.iConversionInstallation && iUidsFromFile != null && iUidsFromFile.length > 0) {
     // Conversion installation, use uid from 'uids' file.
     ball.iSuite.setUid(iUidsFromFile[0]);
     ball.log("Selected suite uid from file: " + ball.iSuite.getUid());
   } else if (ball.iOldSuite != null) {
     // Old suite exists, use its uid.
     ball.iSuite.setUid(ball.iOldSuite.getUid());
     ball.log("Selected old suite uid: " + ball.iSuite.getUid());
   } else {
     // Allocate a new suite uid.
     ball.iSuite.setUid(allocateUid(ball, ball.getAttributeValue("MIDlet-Name")));
     ball.log("Allocated new suite uid: " + ball.iSuite.getUid());
   }
 }
 /** Selects application uids. */
 private void selectApplicationUids(InstallBall ball) {
   // Select application uids.
   int startIndex = ball.iSuite.getApplications().size() + 1;
   Log.log("Selecting application uids, startIndex " + startIndex);
   for (int i = startIndex; true; i++) {
     String appAttrName = "MIDlet-" + i;
     String appAttrValue = ball.getAttributeValue(appAttrName);
     if (appAttrValue != null) {
       Uid uid = null;
       // Split MIDlet-n attribute into tokens.
       String[] tokens = Tokenizer.split(appAttrValue, ",");
       if (tokens == null || tokens.length != 3) {
         Log.logError("Invalid " + appAttrName + " attribute value: " + appAttrValue);
         throw new InvalidAttributeException(
             InstallerErrorMessage.INST_CORRUPT_PKG,
             null,
             InstallerDetailedErrorMessage.ATTR_BAD_SYNTAX,
             new String[] {appAttrName},
             (ball.attributeExistsInJad(appAttrName)
                 ? OtaStatusCode.INVALID_DESCRIPTOR
                 : OtaStatusCode.INVALID_JAR));
       }
       if (ball.iConversionInstallation && iUidsFromFile != null && iUidsFromFile.length > i) {
         // Conversion installation, use uid from 'uids' file.
         uid = iUidsFromFile[i];
         ball.log("Selected app uid from file: " + uid);
       }
       if (uid == null) {
         // Check if uid is specified with Nokia-MIDlet-UID attribute.
         uid = selectAppUidFromAttribute(ball, i);
       }
       if (uid == null && ball.iOldSuite != null) {
         // No uid yet, check from old suite.
         Vector oldApps = ball.iOldSuite.getApplications();
         if (oldApps.size() >= i) {
           // Use old application uid.
           uid = ((ApplicationInfo) oldApps.elementAt(i - 1)).getUid();
           // Check that uid is not already in use in this
           // suite. This could happen if Nokia-MIDlet-UID
           // attribute was used to select uid for different
           // app in the previous version of this suite.
           if (appUidInUse(uid, ball.iSuite)) {
             // Uid is already in use in this suite,
             // it cannot be used twice.
             Log.log("Old uid already in use: " + uid);
             uid = null;
           }
           if (uid != null) {
             ball.log("Selected old app uid: " + uid);
           }
         }
       }
       if (uid == null) {
         // If no uid chosen yet, then allocate a new application uid.
         uid = allocateUid(ball, tokens[0].trim());
         ball.log("Allocated new app uid: " + uid);
       }
       // Add a new ApplicationInfo to suite.
       ball.iSuite.addApplication(
           new ApplicationInfo(
               uid,
               tokens[0].trim(),
               tokens[1].trim(),
               tokens[2].trim(),
               ApplicationInfo.AUTOSTART_FALSE));
     } else {
       break;
     }
   }
 }