public PersistentCache()

in oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/persistentCache/PersistentCache.java [101:217]


    public PersistentCache(String url) {
        LOG.info("start, url={}", url);
        String[] parts = url.split(",");
        String dir = parts[0];
        String broadcast = "disabled";
        for (String p : parts) {
            if (p.equals("+docs")) {
                logUnsupportedWarning("docs");
            } else if (p.equals("-prevDocs")) {
                cachePrevDocs = false;
            } else if (p.equals("+docChildren")) {
                logUnsupportedWarning("docChildren");
            } else if (p.equals("-nodes")) {
                cacheNodes = false;
            } else if (p.equals("-children")) {
                cacheChildren = false;
            } else if (p.equals("-diff")) {
                cacheDiff = false;
            } else if (p.equals("-localDiff")) {
                cacheLocalDiff = false;
            } else if (p.equals("+all")) {
                logUnsupportedWarning("all");
            } else if (p.equals("-compact")) {
                compactOnClose = false;
            } else if (p.equals("+compact")) {
                compactOnClose = true;
            } else if (p.equals("-compress")) {
                compress = false;
            } else if (p.endsWith("time")) {
                dir += "-" + System.currentTimeMillis() + "-" + COUNTER.getAndIncrement();
            } else if (p.startsWith("size=")) {
                maxSizeMB = Integer.parseInt(p.split("=")[1]);
            } else if (p.startsWith("memCache=")) {
                memCache = Integer.parseInt(p.split("=")[1]);
            } else if (p.startsWith("binary=")) {
                logUnsupportedWarning("binary");
            } else if (p.startsWith("autoCompact=")) {
                autoCompact = Integer.parseInt(p.split("=")[1]);
            } else if (p.equals("appendOnly")) {
                appendOnly = true;
            } else if (p.equals("manualCommit")) {
                manualCommit = true;
            } else if (p.startsWith("broadcast=")) {
                broadcast = p.split("=")[1];               
            } else if (p.equals("-async")) {
                asyncCache = false;
            } else if (p.equals("+asyncDiff")) {
                asyncDiffCache = true;
            }
        }
        this.directory = dir;
        if (dir.length() == 0) {
            readGeneration = -1;
            writeGeneration = 0;
            writeStore = createMapFactory(writeGeneration, false);
            return;
        }
        File dr = new File(dir);
        if (!dr.exists()) {
            dr.mkdirs();
        }
        if (dr.exists() && !dr.isDirectory()) {
            throw new IllegalArgumentException("A file exists at cache directory " + dir);
        }
        File[] list = dr.listFiles();
        TreeSet<Integer> generations = new TreeSet<Integer>();
        if (list != null) {
            for (File f : list) {
                String fn = f.getName();
                if (fn.startsWith(FILE_PREFIX) && fn.endsWith(FILE_SUFFIX)) {
                    String g = fn.substring(FILE_PREFIX.length(), fn.indexOf(FILE_SUFFIX));
                    try {
                        int gen = Integer.parseInt(g);
                        if (gen >= 0) {
                            File f2 = new File(getFileName(gen));
                            if (fn.equals(f2.getName())) {
                                // ignore things like "cache-000.data"
                                generations.add(gen);
                            }
                        }
                    } catch (Exception e) {
                        // ignore this file
                    }
                }
            }
        }
        while (generations.size() > 2) {
            Integer oldest = generations.first();
            File oldFile = new File(getFileName(oldest));
            if (!oldFile.canWrite()) {
                LOG.info("Ignoring old, read-only generation " + oldFile.getAbsolutePath());
            } else {
                LOG.info("Removing old generation " + oldFile.getAbsolutePath());
                oldFile.delete();
            }
            generations.remove(oldest);
        }

        try {
            readGeneration = generations.size() > 1 ? generations.first() : -1;
            writeGeneration = generations.size() > 0 ? generations.last() : 0;
            if (readGeneration >= 0) {
                readStore = createMapFactory(readGeneration, true);
            }
            writeStore = createMapFactory(writeGeneration, false);
            initBroadcast(broadcast);

            writeDispatcher = new CacheActionDispatcher();
            writeDispatcherThread = new Thread(writeDispatcher, "Oak CacheWriteQueue");
            writeDispatcherThread.setDaemon(true);
            writeDispatcherThread.start();
        } catch (RuntimeException ex) {
            // OAK-8052: cleanup stores in case of failure
            LOG.error("Exception during PersistentCache instantiation for {}.", url);
            close();
        }
    }