From 7ccaa46b4a749896b2daabda390d8ddd3ae7743f Mon Sep 17 00:00:00 2001
From: Fabio Pistolesi <fabio.pistolesi@forgerock.com>
Date: Fri, 10 Apr 2015 14:55:54 +0000
Subject: [PATCH]
---
opendj-server-legacy/src/main/java/org/opends/server/util/Platform.java | 163 +++++++++++++++++++++++++-----------------------------
1 files changed, 76 insertions(+), 87 deletions(-)
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/util/Platform.java b/opendj-server-legacy/src/main/java/org/opends/server/util/Platform.java
index be9bc43..abe7988 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/util/Platform.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/util/Platform.java
@@ -36,15 +36,20 @@
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.util.List;
+import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
+import java.io.IOException;
import java.io.InputStream;
import java.lang.management.ManagementFactory;
import java.lang.management.MemoryPoolMXBean;
import java.lang.management.MemoryUsage;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
+
import org.forgerock.i18n.LocalizableMessage;
+import org.forgerock.i18n.slf4j.LocalizedLogger;
+
import static org.opends.messages.UtilityMessages.*;
@@ -108,8 +113,29 @@
/** Constructors for each of the above classes. */
private static Constructor<?> certKeyGenCons, X500NameCons;
+ /** Filesystem APIs */
+ private static Method FILESYSTEMS_GETSTORES;
+ private static Method FILESYSTEMS_PATHSGET;
+
+ private static final LocalizedLogger logger = LocalizedLogger.getLoggerForThisClass();
+
static
{
+
+ try
+ {
+ // FileSystem and FileStores APIs were introduced in JDK 7.
+ FILESYSTEMS_PATHSGET = Class.forName("java.nio.file.Paths").getMethod("get", String.class, String[].class);
+ FILESYSTEMS_GETSTORES = Class.forName("java.nio.file.Files").getMethod(
+ "getFileStore", Class.forName("java.nio.file.Path"));
+ }
+ catch (Exception e)
+ {
+ FILESYSTEMS_GETSTORES = null;
+ FILESYSTEMS_PATHSGET = null;
+ logger.warn(WARN_UNABLE_TO_USE_FILESYSTEM_API.get());
+ }
+
String x509pkg = pkgPrefix + ".x509";
String certAndKeyGen;
if (pkgPrefix.equals(IBM_SEC)
@@ -155,21 +181,7 @@
- /**
- * Delete the specified alias from the specified keystore.
- *
- * @param ks
- * The keystore to delete the alias from.
- * @param ksPath
- * The path to the keystore.
- * @param alias
- * The alias to use in the request generation.
- * @param pwd
- * The keystore password to use.
- * @throws KeyStoreException
- * If an error occurred deleting the alias.
- */
- public final void deleteAlias(KeyStore ks, String ksPath, String alias,
+ private final void deleteAlias(KeyStore ks, String ksPath, String alias,
char[] pwd) throws KeyStoreException
{
try
@@ -193,28 +205,7 @@
- /**
- * Add the certificate in the specified path to the specified keystore,
- * creating the keystore using the specified type and path if it the
- * keystore doesn't exist.
- *
- * @param ks
- * The keystore to add the certificate to, may be null if it
- * doesn't exist.
- * @param ksType
- * The type to use if the keystore is created.
- * @param ksPath
- * The path to the keystore if it is created.
- * @param alias
- * The alias to store the certificate under.
- * @param pwd
- * The password to use in saving the certificate.
- * @param certPath
- * The path to the file containing the certificate.
- * @throws KeyStoreException
- * If an error occurred adding the certificate to the keystore.
- */
- public final void addCertificate(KeyStore ks, String ksType, String ksPath,
+ private final void addCertificate(KeyStore ks, String ksType, String ksPath,
String alias, char[] pwd, String certPath) throws KeyStoreException
{
try
@@ -255,31 +246,7 @@
- /**
- * Generate a self-signed certificate using the specified alias, dn string
- * and validity period. If the keystore does not exist, create it using the
- * specified type and path.
- *
- * @param ks
- * The keystore to save the certificate in. May be null if it does
- * not exist.
- * @param ksType
- * The keystore type to use if the keystore is created.
- * @param ksPath
- * The path to the keystore if the keystore is created.
- * @param alias
- * The alias to store the certificate under.
- * @param pwd
- * The password to us in saving the certificate.
- * @param dn
- * The dn string used as the certificate subject.
- * @param validity
- * The validity of the certificate in days.
- * @return The keystore that the self-signed certificate was stored in.
- * @throws KeyStoreException
- * If the self-signed certificate cannot be generated.
- */
- public final KeyStore generateSelfSignedCertificate(KeyStore ks,
+ private final KeyStore generateSelfSignedCertificate(KeyStore ks,
String ksType, String ksPath, String alias, char[] pwd, String dn,
int validity) throws KeyStoreException
{
@@ -330,19 +297,6 @@
/**
* Generate a x509 certificate from the input stream. Verification is done
* only if it is self-signed.
- *
- * @param alias
- * The alias to save the certificate under.
- * @param cf
- * The x509 certificate factory.
- * @param ks
- * The keystore to add the certificate in.
- * @param in
- * The input stream to read the certificate from.
- * @throws KeyStoreException
- * If the alias exists already in the keystore, if the self-signed
- * certificate didn't verify, or the certificate could not be
- * stored.
*/
private void trustedCert(String alias, CertificateFactory cf, KeyStore ks,
InputStream in) throws KeyStoreException
@@ -369,10 +323,6 @@
/**
* Check that the issuer and subject DNs match.
- *
- * @param cert
- * The certificate to examine.
- * @return {@code true} if the certificate is self-signed.
*/
private boolean isSelfSigned(X509Certificate cert)
{
@@ -391,14 +341,7 @@
- /**
- * Calculates the usable memory which could potentially be used by the
- * application for caching objects.
- *
- * @return The usable memory which could potentially be used by the
- * application for caching objects.
- */
- public long getUsableMemoryForCaching()
+ private long getUsableMemoryForCaching()
{
long youngGenSize = 0;
long oldGenSize = 0;
@@ -454,6 +397,40 @@
.totalMemory())) * 40 / 100;
}
}
+
+ private File getFilesystem(File directory) throws IOException
+ {
+ if (FILESYSTEMS_GETSTORES != null)
+ {
+ try
+ {
+ Object dirFStore = FILESYSTEMS_GETSTORES.invoke(null,
+ FILESYSTEMS_PATHSGET.invoke(null, directory.getAbsolutePath(), new String[0]));
+ File parentDir = directory.getParentFile();
+ /*
+ * Since there is no concept of mount point in the APIs, iterate on all parents of
+ * the given directory until the FileSystem Store changes (hint of a different
+ * device, hence a mount point) or we get to root, which works too.
+ */
+ while (parentDir != null)
+ {
+ Object parentFStore = FILESYSTEMS_GETSTORES.invoke(null,
+ FILESYSTEMS_PATHSGET.invoke(null, parentDir.getAbsolutePath(), new String[0]));
+ if (!parentFStore.equals(dirFStore))
+ {
+ return directory;
+ }
+ directory = directory.getParentFile();
+ parentDir = directory.getParentFile();
+ }
+ }
+ catch (Exception e)
+ {
+ throw new IOException(e);
+ }
+ }
+ return directory;
+ }
}
@@ -648,4 +625,16 @@
{
return IMPL.getUsableMemoryForCaching();
}
+
+ /**
+ * Returns the filesystem on which the given directory resides by its mountpoint.
+ *
+ * @param directory the directory whose filesystem is required
+ * @return the filesystem on which the given directory resides
+ * @throws IOException The exception in case information on filesystem/storage cannot be found
+ */
+ public static File getFilesystem(File directory) throws IOException
+ {
+ return IMPL.getFilesystem(directory);
+ }
}
--
Gitblit v1.10.0