From 4abe1562403c2d81dc18f76a53df4bd47347dcea Mon Sep 17 00:00:00 2001
From: Matthew Swift <matthew.swift@forgerock.com>
Date: Tue, 20 Mar 2012 21:42:17 +0000
Subject: [PATCH] Reformat code.
---
opends/src/server/org/opends/server/tools/configurator/CheckInstance.java | 658 +++++++++++++++++++++++++++++++++--------------------------
1 files changed, 364 insertions(+), 294 deletions(-)
diff --git a/opends/src/server/org/opends/server/tools/configurator/CheckInstance.java b/opends/src/server/org/opends/server/tools/configurator/CheckInstance.java
index 280d895..6bedc75 100644
--- a/opends/src/server/org/opends/server/tools/configurator/CheckInstance.java
+++ b/opends/src/server/org/opends/server/tools/configurator/CheckInstance.java
@@ -23,44 +23,45 @@
*
*
* Copyright 2006-2009 Sun Microsystems, Inc.
- * Portions Copyright 2011 ForgeRock AS
+ * Portions Copyright 2011-2012 ForgeRock AS
*/
package org.opends.server.tools.configurator;
-import java.io.File;
-import java.io.IOException;
-import java.io.BufferedReader;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.FileReader;
-import java.io.FileWriter;
+
+
+import static org.opends.messages.QuickSetupMessages.*;
+import static org.opends.messages.ToolMessages.*;
+import static org.opends.server.util.DynamicConstants.MAJOR_VERSION;
+import static org.opends.server.util.DynamicConstants.MINOR_VERSION;
+import static org.opends.server.util.DynamicConstants.POINT_VERSION;
+import static org.opends.server.util.DynamicConstants.REVISION_NUMBER;
+
+import java.io.*;
+import java.util.StringTokenizer;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.opends.messages.Message;
+import org.opends.quicksetup.BuildInformation;
+import org.opends.quicksetup.Installation;
+import org.opends.quicksetup.QuickSetupLog;
import org.opends.quicksetup.ReturnCode;
import org.opends.server.util.args.ArgumentException;
import org.opends.server.util.args.ArgumentParser;
-import org.opends.server.util.args.StringArgument;
-import java.io.InputStreamReader;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import org.opends.messages.Message;
-import org.opends.quicksetup.Installation;
import org.opends.server.util.args.BooleanArgument;
-import java.util.StringTokenizer;
-import org.opends.quicksetup.BuildInformation;
-import org.opends.quicksetup.QuickSetupLog;
+import org.opends.server.util.args.StringArgument;
-import static org.opends.messages.ToolMessages.*;
-import static org.opends.messages.QuickSetupMessages.*;
-import static org.opends.server.util.DynamicConstants.*;
/**
* This class is called by the configure command line to move the default
* Directory Server instance.
*/
-public class CheckInstance {
+public class CheckInstance
+{
- static private final Logger LOG = Logger.getLogger(
- CheckInstance.class.getName());
+ static private final Logger LOG = Logger.getLogger(CheckInstance.class
+ .getName());
/** Prefix for log files. */
static public final String LOG_FILE_PREFIX = "opendj-checkinstance-";
@@ -93,24 +94,351 @@
private static int USER_ERROR = 2;
private static int VERSION_ERROR = 3;
+
+
/**
- * Creates a copy of the specified file.
+ * The main method which is called by the configure command lines.
*
- * @param from The source file to be copied.
- * @param to The destination file to be created.
- *
- * @throws IOException If a problem occurs.
+ * @param args
+ * the arguments passed by the command line.
*/
- private static void copyFile(File from, File to)
- throws IOException
+ public static void main(final String[] args)
{
- byte[] buffer = new byte[4096];
- FileInputStream inputStream = null;
- FileOutputStream outputStream = null;
try
{
- inputStream = new FileInputStream(from);
+ QuickSetupLog.initLogFileHandler(File.createTempFile(LOG_FILE_PREFIX,
+ QuickSetupLog.LOG_FILE_SUFFIX));
+ }
+ catch (final Throwable t)
+ {
+ System.err.println(INFO_ERROR_INITIALIZING_LOG.get());
+ t.printStackTrace();
+ }
+
+ // Create the command-line argument parser for use with this program.
+ final Message toolDescription = INFO_CHECK_DESCRIPTION.get();
+ final ArgumentParser argParser = new ArgumentParser(
+ CheckInstance.class.getName(), toolDescription, false);
+
+ installRootFromSystem = System.getProperty("INSTALL_ROOT");
+ if (installRootFromSystem == null)
+ {
+ System.err
+ .println(ERR_INTERNAL.get(ERR_INSTALL_ROOT_NOT_SPECIFIED.get()));
+ System.exit(ReturnCode.APPLICATION_ERROR.getReturnCode());
+ }
+ instanceRootFromSystem = System.getProperty("INSTANCE_ROOT");
+ if (instanceRootFromSystem == null)
+ {
+ System.err
+ .println(ERR_INTERNAL.get(ERR_INSTANCE_ROOT_NOT_SPECIFIED.get()));
+ System.exit(ReturnCode.APPLICATION_ERROR.getReturnCode());
+ }
+ isWin = System.getProperty("file.separator").equals("\\");
+
+ // Initialize all the command-line argument types and register them with the
+ // parser.
+ try
+ {
+ if (!isWin)
+ {
+ currentUserArg = new StringArgument(CURRENT_USER_OPTION_LONG,
+ CURRENT_USER_OPTION_SHORT, CURRENT_USER_OPTION_LONG, true, true,
+ INFO_CURRENT_USER_PLACEHOLDER.get(),
+ INFO_CHECK_DESCRIPTION_CURRENT_USER.get());
+ argParser.addArgument(currentUserArg);
+ }
+ checkVersionArg = new BooleanArgument(CHECK_VERSION_OPTION_LONG,
+ CHECK_VERSION_OPTION_SHORT, CHECK_VERSION_OPTION_LONG,
+ INFO_CHECK_DESCRIPTION_CHECK_VERSION.get());
+ argParser.addArgument(checkVersionArg);
+ }
+ catch (final ArgumentException ae)
+ {
+ System.err.println(ERR_INTERNAL.get(ae.getMessageObject()));
+ System.exit(ReturnCode.APPLICATION_ERROR.getReturnCode());
+ }
+
+ // Parse the command-line arguments provided to this program.
+ try
+ {
+ argParser.parseArguments(args);
+ }
+ catch (final ArgumentException ae)
+ {
+ System.err.println(ERR_INTERNAL.get(ae.getMessageObject()));
+ System.exit(ARGS_ERROR);
+ }
+
+ final File confDir = new File(instanceRootFromSystem,
+ Installation.CONFIG_PATH_RELATIVE);
+
+ if (!isWin)
+ {
+ // Check user
+ final File conf =
+ new File(confDir, Installation.CURRENT_CONFIG_FILE_NAME);
+ Process proc = null;
+ int exit = 0;
+
+ InputStreamReader reader = null;
+ int c;
+ final StringBuffer sb = new StringBuffer();
+ final String[] cmdArgs = { "ls", "-l", conf.getAbsolutePath() };
+ final StringBuilder cmd = new StringBuilder();
+ for (final String arg : cmdArgs)
+ {
+ if (cmd.length() > 0)
+ {
+ cmd.append(" ");
+ }
+ cmd.append(arg);
+ }
+ try
+ {
+ proc = Runtime.getRuntime().exec(cmdArgs);
+ proc.waitFor();
+ reader = new InputStreamReader(proc.getInputStream());
+ while (((c = reader.read()) != -1))
+ {
+ sb.append((char) c);
+ }
+ exit = proc.exitValue();
+ if (exit != 0)
+ {
+ LOG.log(Level.FINEST, cmd + " error= " + exit);
+ System.err.println(ERR_CONFIG_LDIF_NOT_FOUND.get(
+ confDir.getAbsolutePath(), installRootFromSystem + File.separator
+ + "instance.loc"));
+ System.exit(ReturnCode.APPLICATION_ERROR.getReturnCode());
+ }
+ }
+ catch (final InterruptedException ex)
+ {
+ LOG.log(Level.SEVERE, "InterruptedException" + ex.getMessage());
+ System.err.println(ERR_CONFIG_LDIF_NOT_FOUND.get(
+ confDir.getAbsolutePath(), installRootFromSystem + File.separator
+ + "instance.loc"));
+ System.exit(ReturnCode.APPLICATION_ERROR.getReturnCode());
+ }
+ catch (final IOException ex)
+ {
+ LOG.log(Level.SEVERE, "IOException" + ex.getMessage());
+ System.err.println(ERR_CONFIG_LDIF_NOT_FOUND.get(
+ confDir.getAbsolutePath(), installRootFromSystem + File.separator
+ + "instance.loc"));
+ System.exit(ReturnCode.APPLICATION_ERROR.getReturnCode());
+ }
+
+ LOG.log(Level.FINEST, cmd + " returns [" + sb.toString() + "]");
+ final StringTokenizer tok = new StringTokenizer(sb.toString());
+ if (tok.hasMoreTokens())
+ {
+ // access rights
+ tok.nextToken();
+ if (tok.hasMoreTokens())
+ {
+ // inode
+ tok.nextToken();
+ if (tok.hasMoreTokens())
+ {
+ instanceOwner = tok.nextToken();
+ LOG.log(Level.FINEST, "instanceOwner=[" + instanceOwner + "]");
+ }
+ else
+ {
+ LOG.log(Level.SEVERE, "no instanceOwner");
+ System.err
+ .println(ERR_INTERNAL.get(Message.raw("no instanceOwner")));
+ System.exit(ReturnCode.APPLICATION_ERROR.getReturnCode());
+ }
+ }
+ else
+ {
+ LOG.log(Level.SEVERE, "no inode");
+ System.err.println(ERR_INTERNAL.get(Message.raw("no inode")));
+ System.exit(ReturnCode.APPLICATION_ERROR.getReturnCode());
+ }
+ }
+ else
+ {
+ LOG.log(Level.SEVERE, "no access rights");
+ System.err.println(ERR_INTERNAL.get(Message.raw("no access rights")));
+ System.exit(ReturnCode.APPLICATION_ERROR.getReturnCode());
+ }
+
+ currentUser = currentUserArg.getValue();
+ LOG.log(Level.FINEST, "currentUser=[" + currentUser + "]");
+
+ if ((currentUser != null) && !(currentUser.equals(instanceOwner)))
+ {
+ System.err.println(ERR_CHECK_USER_ERROR.get(instanceOwner));
+ System.exit(USER_ERROR);
+ }
+ }
+
+ // Initialize buildinfo in not already done (ZIP delivery)
+ final BuildInformation installBi = BuildInformation
+ .fromBuildString(MAJOR_VERSION + "." + MINOR_VERSION + "."
+ + POINT_VERSION + "." + REVISION_NUMBER);
+ final File bif = new File(confDir, Installation.BUILDINFO_RELATIVE_PATH);
+ if (!bif.exists())
+ {
+ FileWriter fwriter = null;
+ try
+ {
+ fwriter = new FileWriter(bif, true);
+ fwriter.append(installBi.getBuildString());
+ }
+ catch (final Exception e)
+ {
+ }
+ finally
+ {
+ try
+ {
+ fwriter.close();
+ }
+ catch (final Exception e)
+ {
+ }
+ }
+ }
+
+ // Check version
+ if (checkVersionArg.isPresent())
+ {
+ BuildInformation instanceBi = installBi;
+
+ try
+ {
+ if (bif.exists())
+ {
+ final BufferedReader breader =
+ new BufferedReader(new FileReader(bif));
+
+ // Read the first line and close the file.
+ String line;
+ try
+ {
+ line = breader.readLine();
+ instanceBi = BuildInformation.fromBuildString(line);
+ }
+ finally
+ {
+ try
+ {
+ breader.close();
+ }
+ catch (final Exception e)
+ {
+ }
+ }
+
+ // For pkg(5) delivery: update the file to avoid overwrite
+ // during upgrade
+ final FileWriter fwriter = new FileWriter(bif, true);
+ try
+ {
+ fwriter.append('\n');
+ }
+ finally
+ {
+ try
+ {
+ fwriter.close();
+ }
+ catch (final Exception e)
+ {
+ }
+ }
+ }
+ }
+ catch (final Exception e)
+ {
+ LOG.log(Level.SEVERE, "error getting build information for "
+ + "current instance", e);
+ }
+
+ if (!installBi.equals(instanceBi))
+ {
+ System.err.println(ERR_CHECK_VERSION_NOT_MATCH.get());
+ System.exit(VERSION_ERROR);
+ }
+ }
+ else
+ {
+ LOG.log(Level.FINEST, "checkVersion not specified");
+ }
+
+ // For pkg(5) delivery: if config/upgrade/*.ldif.REV does not exist
+ try
+ {
+ final File upgradeDir = new File(confDir, Installation.UPGRADE_PATH);
+ final File tmplUpgradeDir = new File(installRootFromSystem
+ + File.separator + Installation.TMPL_INSTANCE_RELATIVE_PATH
+ + File.separator + Installation.CONFIG_PATH_RELATIVE + File.separator
+ + Installation.UPGRADE_PATH);
+
+ final File concatenatedSchema = new File(upgradeDir, "schema.ldif."
+ + REVISION_NUMBER);
+ if (!concatenatedSchema.exists())
+ {
+ final File tmplConcatenatedSchema = new File(tmplUpgradeDir,
+ "schema.ldif." + REVISION_NUMBER);
+ copyFile(tmplConcatenatedSchema, concatenatedSchema);
+ }
+ else
+ {
+ LOG.log(Level.INFO, concatenatedSchema.getAbsolutePath()
+ + "already exists");
+ }
+
+ final File initialConfig = new File(upgradeDir, "config.ldif."
+ + REVISION_NUMBER);
+ if (!initialConfig.exists())
+ {
+ final File tmplInitialConfig = new File(tmplUpgradeDir, "config.ldif."
+ + REVISION_NUMBER);
+ copyFile(tmplInitialConfig, initialConfig);
+ }
+ else
+ {
+ LOG.log(Level.INFO, initialConfig.getAbsolutePath() + "already exists");
+ }
+ }
+ catch (final Exception e)
+ {
+ LOG.log(Level.SEVERE, "error initializing config/upgrade files", e);
+ }
+
+ System.exit(SUCCESS);
+
+ }
+
+
+
+ /**
+ * Creates a copy of the specified file.
+ *
+ * @param from
+ * The source file to be copied.
+ * @param to
+ * The destination file to be created.
+ * @throws IOException
+ * If a problem occurs.
+ */
+ private static void copyFile(final File from, final File to)
+ throws IOException
+ {
+ final byte[] buffer = new byte[4096];
+ FileInputStream inputStream = null;
+ FileOutputStream outputStream = null;
+
+ try
+ {
+ inputStream = new FileInputStream(from);
outputStream = new FileOutputStream(to, false);
int bytesRead = inputStream.read(buffer);
@@ -128,7 +456,7 @@
{
inputStream.close();
}
- catch (Exception e)
+ catch (final Exception e)
{
}
}
@@ -139,262 +467,4 @@
}
}
}
-
- /**
- * The main method which is called by the configure command lines.
- *
- * @param args the arguments passed by the command line.
- */
- public static void main(String[] args) {
-
- try {
- QuickSetupLog.initLogFileHandler(
- File.createTempFile(LOG_FILE_PREFIX,
- QuickSetupLog.LOG_FILE_SUFFIX));
- } catch (Throwable t) {
- System.err.println(INFO_ERROR_INITIALIZING_LOG.get());
- t.printStackTrace();
- }
-
- // Create the command-line argument parser for use with this program.
- Message toolDescription = INFO_CHECK_DESCRIPTION.get();
- ArgumentParser argParser =
- new ArgumentParser(CheckInstance.class.getName(),
- toolDescription, false);
-
-
- installRootFromSystem = System.getProperty("INSTALL_ROOT");
- if (installRootFromSystem == null) {
- System.err
- .println(ERR_INTERNAL.get(ERR_INSTALL_ROOT_NOT_SPECIFIED.get()));
- System.exit(ReturnCode.APPLICATION_ERROR.getReturnCode());
- }
- instanceRootFromSystem = System.getProperty("INSTANCE_ROOT");
- if (instanceRootFromSystem == null) {
- System.err.println(ERR_INTERNAL
- .get(ERR_INSTANCE_ROOT_NOT_SPECIFIED.get()));
- System.exit(ReturnCode.APPLICATION_ERROR.getReturnCode());
- }
- isWin = System.getProperty("file.separator").equals("\\");
-
- // Initialize all the command-line argument types and register them with the
- // parser.
- try {
- if (!isWin) {
- currentUserArg = new StringArgument(CURRENT_USER_OPTION_LONG,
- CURRENT_USER_OPTION_SHORT,
- CURRENT_USER_OPTION_LONG,
- true, true,
- INFO_CURRENT_USER_PLACEHOLDER.get(),
- INFO_CHECK_DESCRIPTION_CURRENT_USER.get());
- argParser.addArgument(currentUserArg);
- }
- checkVersionArg = new BooleanArgument(CHECK_VERSION_OPTION_LONG,
- CHECK_VERSION_OPTION_SHORT,
- CHECK_VERSION_OPTION_LONG,
- INFO_CHECK_DESCRIPTION_CHECK_VERSION.get());
- argParser.addArgument(checkVersionArg);
- } catch (ArgumentException ae) {
- System.err.println(ERR_INTERNAL.get(ae.getMessageObject()));
- System.exit(ReturnCode.APPLICATION_ERROR.getReturnCode());
- }
-
-
- // Parse the command-line arguments provided to this program.
- try {
- argParser.parseArguments(args);
- } catch (ArgumentException ae) {
- System.err.println(ERR_INTERNAL.get(ae.getMessageObject()));
- System.exit(ARGS_ERROR);
- }
-
- File confDir = new File(instanceRootFromSystem,
- Installation.CONFIG_PATH_RELATIVE);
-
- if (!isWin) {
- // Check user
- File conf = new File (confDir, Installation.CURRENT_CONFIG_FILE_NAME);
- Process proc = null;
- int exit = 0;
-
- InputStreamReader reader = null;
- int c;
- StringBuffer sb = new StringBuffer();
- String[] cmdArgs = {"ls", "-l", conf.getAbsolutePath()};
- StringBuilder cmd = new StringBuilder();
- for (String arg : cmdArgs)
- {
- if (cmd.length() > 0)
- {
- cmd.append(" ");
- }
- cmd.append(arg);
- }
- try {
- proc = Runtime.getRuntime().exec(cmdArgs);
- proc.waitFor();
- reader = new InputStreamReader(proc.getInputStream());
- while (((c = reader.read()) != -1)) {
- sb.append((char) c);
- }
- exit = proc.exitValue();
- if (exit != 0) {
- LOG.log(Level.FINEST, cmd + " error= " + exit);
- System.err.println(ERR_CONFIG_LDIF_NOT_FOUND.get(
- confDir.getAbsolutePath(),
- installRootFromSystem + File.separator + "instance.loc"));
- System.exit(ReturnCode.APPLICATION_ERROR.getReturnCode());
- }
- } catch (InterruptedException ex) {
- LOG.log(Level.SEVERE, "InterruptedException" + ex.getMessage());
- System.err.println(
- ERR_CONFIG_LDIF_NOT_FOUND.get(confDir.getAbsolutePath(),
- installRootFromSystem + File.separator + "instance.loc"));
- System.exit(ReturnCode.APPLICATION_ERROR.getReturnCode());
- } catch (IOException ex) {
- LOG.log(Level.SEVERE, "IOException" + ex.getMessage() );
- System.err.println(ERR_CONFIG_LDIF_NOT_FOUND.get(
- confDir.getAbsolutePath(),
- installRootFromSystem + File.separator + "instance.loc"));
- System.exit(ReturnCode.APPLICATION_ERROR.getReturnCode());
- }
-
- LOG.log(Level.FINEST, cmd + " returns [" + sb.toString() + "]");
- StringTokenizer tok = new StringTokenizer(sb.toString());
- if (tok.hasMoreTokens()) {
- // access rights
- tok.nextToken();
- if (tok.hasMoreTokens()) {
- // inode
- tok.nextToken();
- if (tok.hasMoreTokens()) {
- instanceOwner = tok.nextToken();
- LOG.log(Level.FINEST, "instanceOwner=[" + instanceOwner + "]");
- } else {
- LOG.log(Level.SEVERE, "no instanceOwner");
- System.err.println(ERR_INTERNAL.get(Message.raw("no instanceOwner")));
- System.exit(ReturnCode.APPLICATION_ERROR.getReturnCode());
- }
- } else {
- LOG.log(Level.SEVERE, "no inode");
- System.err.println(ERR_INTERNAL.get(Message.raw("no inode")));
- System.exit(ReturnCode.APPLICATION_ERROR.getReturnCode());
- }
- } else {
- LOG.log(Level.SEVERE, "no access rights");
- System.err.println(ERR_INTERNAL.get(Message.raw("no access rights")));
- System.exit(ReturnCode.APPLICATION_ERROR.getReturnCode());
- }
-
-
- currentUser = currentUserArg.getValue();
- LOG.log(Level.FINEST, "currentUser=[" + currentUser + "]");
-
- if ((currentUser != null) && !(currentUser.equals(instanceOwner))) {
- System.err.println(ERR_CHECK_USER_ERROR.get(instanceOwner));
- System.exit(USER_ERROR);
- }
- }
-
- // Initialize buildinfo in not already done (ZIP delivery)
- BuildInformation installBi =
- BuildInformation.fromBuildString(MAJOR_VERSION +
- "." + MINOR_VERSION +
- "." + POINT_VERSION +
- "." + REVISION_NUMBER);
- File bif = new File(confDir, Installation.BUILDINFO_RELATIVE_PATH);
- if (!bif.exists()) {
- FileWriter fwriter = null;
- try {
- fwriter = new FileWriter(bif, true);
- fwriter.append(installBi.getBuildString());
- } catch (Exception e) {
- } finally {
- try {
- fwriter.close();
- } catch (Exception e) {
- }
- }
- }
-
- // Check version
- if (checkVersionArg.isPresent()) {
- BuildInformation instanceBi = installBi;
-
- try {
- if (bif.exists()) {
- BufferedReader breader = new BufferedReader(new FileReader(bif));
-
- // Read the first line and close the file.
- String line;
- try {
- line = breader.readLine();
- instanceBi = BuildInformation.fromBuildString(line);
- } finally {
- try {
- breader.close();
- } catch (Exception e) {
- }
- }
-
- // For pkg(5) delivery: update the file to avoid overwrite
- // during upgrade
- FileWriter fwriter = new FileWriter(bif, true);
- try {
- fwriter.append('\n');
- } finally {
- try {
- fwriter.close();
- } catch (Exception e) {
- }
- }
- }
- } catch (Exception e) {
- LOG.log(Level.SEVERE, "error getting build information for " +
- "current instance", e);
- }
-
- if (!installBi.equals(instanceBi)) {
- System.err.println(ERR_CHECK_VERSION_NOT_MATCH.get());
- System.exit(VERSION_ERROR);
- }
- } else {
- LOG.log(Level.FINEST, "checkVersion not specified");
- }
-
- // For pkg(5) delivery: if config/upgrade/*.ldif.REV does not exist
- try {
- File upgradeDir = new File(confDir, Installation.UPGRADE_PATH);
- File tmplUpgradeDir = new File(installRootFromSystem + File.separator +
- Installation.TMPL_INSTANCE_RELATIVE_PATH +
- File.separator + Installation.CONFIG_PATH_RELATIVE +
- File.separator + Installation.UPGRADE_PATH);
-
- File concatenatedSchema = new File(upgradeDir,
- "schema.ldif." + REVISION_NUMBER);
- if (!concatenatedSchema.exists()) {
- File tmplConcatenatedSchema = new File(tmplUpgradeDir,
- "schema.ldif." + REVISION_NUMBER);
- copyFile(tmplConcatenatedSchema, concatenatedSchema);
- } else {
- LOG.log(Level.INFO, concatenatedSchema.getAbsolutePath() +
- "already exists");
- }
-
- File initialConfig = new File(upgradeDir,
- "config.ldif." + REVISION_NUMBER);
- if (!initialConfig.exists()) {
- File tmplInitialConfig = new File(tmplUpgradeDir,
- "config.ldif." + REVISION_NUMBER);
- copyFile(tmplInitialConfig, initialConfig);
- } else {
- LOG.log(Level.INFO, initialConfig.getAbsolutePath() + "already exists");
- }
- } catch (Exception e) {
- LOG.log(Level.SEVERE, "error initializing config/upgrade files", e);
- }
-
- System.exit(SUCCESS);
-
- }
-}
\ No newline at end of file
+}
--
Gitblit v1.10.0