diff --git a/bagri-server/bagri-server-hazelcast/src/main/java/com/bagri/xdm/cache/hazelcast/store/FileDocumentCacheStore.java b/bagri-server/bagri-server-hazelcast/src/main/java/com/bagri/xdm/cache/hazelcast/store/FileDocumentCacheStore.java index bc45f9a9..6988939a 100644 --- a/bagri-server/bagri-server-hazelcast/src/main/java/com/bagri/xdm/cache/hazelcast/store/FileDocumentCacheStore.java +++ b/bagri-server/bagri-server-hazelcast/src/main/java/com/bagri/xdm/cache/hazelcast/store/FileDocumentCacheStore.java @@ -16,7 +16,6 @@ import java.nio.file.Paths; import java.util.ArrayList; import java.util.Collection; -import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.HashSet; @@ -31,6 +30,7 @@ import com.bagri.common.util.FileUtils; import com.bagri.xdm.api.XDMException; +import com.bagri.xdm.cache.api.DocumentManagement; import com.bagri.xdm.cache.hazelcast.impl.DocumentManagementImpl; import com.bagri.xdm.cache.hazelcast.impl.PopulationManagementImpl; import com.bagri.xdm.cache.hazelcast.impl.SchemaRepositoryImpl; @@ -117,6 +117,57 @@ private String getFullUri(String fileName) { return dataPath + "/" + fileName; } + @Override + public Set loadAllKeys() { + //if (true) { + // return Collections.emptySet(); + //} + + ensureRepository(); + if (xdmRepo == null) { + logger.trace("loadAllKeys.enter; store is not ready yet, skipping population"); + return null; + } + + logger.trace("loadAllKeys.enter;"); + Set docIds = popManager.getDocumentKeys(); + if (docIds != null) { + if (logger.isTraceEnabled()) { + logger.trace("loadAllKeys.exit; returning from PopulationManager: {}", docIds); + } else { + logger.info("loadAllKeys.exit; returning keys from PopulationManager: {}", docIds.size()); + } + return docIds; + } + + Path root = Paths.get(dataPath); + Map uris = new HashMap<>(); + try { + List files = new ArrayList<>(); + processPathFiles(root, files); + DocumentKey docKey; + for (Path path: files) { + String uri = path.getFileName().toString(); + int revision = 0; + do { + docKey = xdmRepo.getFactory().newDocumentKey(uri, revision, dvFirst); + revision++; + } while (uris.get(docKey) != null); + uris.put(docKey, uri); + } + docIds = new HashSet<>(uris.keySet()); + } catch (IOException ex) { + logger.error("loadAllKeys.error;", ex); + } + popManager.setKeyMappings(uris); + if (logger.isTraceEnabled()) { + logger.trace("loadAllKeys.exit; got mappings: {}", uris); + } else { + logger.info("loadAllKeys.exit; returning keys: {}", docIds.size()); + } + return docIds; + } + private Document loadDocument(DocumentKey docKey) { String docUri = null; Document doc = popManager.getDocument(docKey.getKey()); @@ -180,67 +231,7 @@ public Map loadAll(Collection keys) { return result; } - @Override - public Set loadAllKeys() { - //if (true) { - // return Collections.emptySet(); - //} - - ensureRepository(); - if (xdmRepo == null) { - logger.trace("loadAllKeys.enter; store is not ready yet, skipping population"); - return null; - } - - logger.trace("loadAllKeys.enter;"); - Set docIds = popManager.getDocumentKeys(); - if (docIds != null) { - if (logger.isTraceEnabled()) { - logger.trace("loadAllKeys.exit; returning from PopulationManager: {}", docIds); - } else { - logger.info("loadAllKeys.exit; returning keys from PopulationManager: {}", docIds.size()); - } - return docIds; - } - - Path root = Paths.get(dataPath); - Map uris = new HashMap<>(); - try { - List files = new ArrayList<>(); - processPathFiles(root, files); - Collections.sort(files); - DocumentKey docKey; - for (Path path: files) { - String uri = path.getFileName().toString(); - int revision = 0; - do { - docKey = xdmRepo.getFactory().newDocumentKey(uri, revision, dvFirst); - revision++; - } while (uris.get(docKey) != null); - uris.put(docKey, uri); - } - docIds = new HashSet<>(uris.keySet()); - } catch (IOException ex) { - logger.error("loadAllKeys.error;", ex); - } - popManager.setKeyMappings(uris); - if (logger.isTraceEnabled()) { - logger.trace("loadAllKeys.exit; got mappings: {}", uris); - } else { - logger.info("loadAllKeys.exit; returning keys: {}", docIds.size()); - } - return docIds; - } - - @Override - public void store(DocumentKey key, Document value) { - logger.trace("store.enter; key: {}; value: {}", key, value); - ensureRepository(); - if (xdmRepo == null) { - logger.trace("store; not ready yet, skipping store"); - return; - } - + private Exception storeDocument(DocumentManagement docManager, DocumentKey key, Document value) { String docUri = popManager.getKeyMapping(key); if (docUri == null) { // create a new document @@ -253,28 +244,55 @@ public void store(DocumentKey key, Document value) { String fullUri = getFullUri(docUri); try { - DocumentManagementImpl docManager = (DocumentManagementImpl) xdmRepo.getDocumentManagement(); String xml = docManager.getDocumentAsString(key, null); FileUtils.writeTextFile(fullUri, xml); - logger.trace("store.exit; stored as: {}; length: {}", fullUri, xml.length()); + logger.trace("storeDocument.exit; stored as: {}; length: {}", fullUri, xml.length()); + return null; } catch (IOException | XDMException ex) { + return ex; + } + } + + @Override + public void store(DocumentKey key, Document value) { + logger.trace("store.enter; key: {}; value: {}", key, value); + ensureRepository(); + DocumentManagement docManager = (DocumentManagement) xdmRepo.getDocumentManagement(); + Exception ex = storeDocument(docManager, key, value); + if (ex != null) { logger.error("store.error; exception on store document: " + ex.getMessage(), ex); - // rethrow it ? + throw new RuntimeException(ex); + } else { + logger.trace("store.exit"); } } @Override public void storeAll(Map entries) { logger.trace("storeAll.enter; entries: {}", entries.size()); + ensureRepository(); + int cnt = 0; + int err = 0; + Exception ex = null; + DocumentManagement docManager = (DocumentManagement) xdmRepo.getDocumentManagement(); for (Map.Entry entry: entries.entrySet()) { - store(entry.getKey(), entry.getValue()); + Exception e = storeDocument(docManager, entry.getKey(), entry.getValue()); + if (e == null) { + cnt++; + } else { + err++; + ex = e; + } + } + if (err == 0) { + logger.trace("storeAll.exit; stored: {}; errors: {}", cnt, err); + } else { + logger.info("storeAll.exit; stored: {}; errors: {}", cnt, err); + throw new RuntimeException(ex); } - logger.trace("storeAll.exit; stored: {}", entries.size()); } - - @Override - public void delete(DocumentKey key) { - logger.trace("delete.enter; key: {}", key); + + private boolean deleteDocument(DocumentKey key) { boolean result = false; String docUri = popManager.deleteKeyMapping(key); if (docUri != null) { @@ -283,9 +301,16 @@ public void delete(DocumentKey key) { try { result = Files.deleteIfExists(path); } catch (IOException ex) { - logger.error("delete.error; path: " + path, ex); + logger.error("deleteDocument.error; path: " + path, ex); } } + return result; + } + + @Override + public void delete(DocumentKey key) { + logger.trace("delete.enter; key: {}", key); + boolean result = deleteDocument(key); logger.trace("delete.exit; deleted: {}", result); } @@ -294,17 +319,8 @@ public void deleteAll(Collection keys) { logger.trace("deleteAll.enter; keys: {}", keys.size()); int deleted = 0; for (DocumentKey key: keys) { - String docUri = popManager.deleteKeyMapping(key); - if (docUri != null) { - docUri = getFullUri(docUri); - Path path = Paths.get(docUri); - try { - if (Files.deleteIfExists(path)) { - deleted++; - } - } catch (IOException ex) { - logger.error("deleteAll.error; path: " + path, ex); - } + if (deleteDocument(key)) { + deleted++; } } logger.trace("deleteAll.exit; deleted: {}", deleted); diff --git a/bagri-xdm/src/main/java/com/bagri/common/util/FileUtils.java b/bagri-xdm/src/main/java/com/bagri/common/util/FileUtils.java index 3dd2a233..2b23a887 100644 --- a/bagri-xdm/src/main/java/com/bagri/common/util/FileUtils.java +++ b/bagri-xdm/src/main/java/com/bagri/common/util/FileUtils.java @@ -2,17 +2,21 @@ import java.io.BufferedWriter; import java.io.File; +import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; +import java.io.RandomAccessFile; import java.io.Writer; import java.net.URI; import java.net.URL; +import java.nio.ByteBuffer; +import java.nio.CharBuffer; +import java.nio.MappedByteBuffer; +import java.nio.channels.FileChannel; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; -import java.nio.file.Path; import java.nio.file.Paths; -import java.util.Scanner; /** * A set of static utility methods regarding files @@ -47,13 +51,16 @@ public static String readTextFile(String fileName) throws IOException { * @throws IOException in case of read error */ public static String readTextFile(String fileName, String encoding) throws IOException { - Path path = Paths.get(fileName); + Charset cs = Charset.forName(encoding); StringBuilder text = new StringBuilder(); - try (Scanner scanner = new Scanner(path, encoding)){ - while (scanner.hasNextLine()) { - text.append(scanner.nextLine()).append(EOL); - } - } + try (FileInputStream fis = new FileInputStream(fileName)) { + FileChannel ch = fis.getChannel(); + MappedByteBuffer mbb = ch.map(FileChannel.MapMode.READ_ONLY, 0, ch.size()); + while (mbb.hasRemaining()) { + CharBuffer cb = cs.decode(mbb); + text.append(cb.toString()); + } + } return text.toString(); } @@ -65,11 +72,12 @@ public static String readTextFile(String fileName, String encoding) throws IOExc * @throws IOException in case of write error */ public static void writeTextFile(String fileName, String content) throws IOException { - - try (Writer writer = new BufferedWriter( - new OutputStreamWriter(new FileOutputStream(fileName), def_encoding))) { - writer.write(content); - } + byte[] bytes = content.getBytes(); + try (RandomAccessFile raw = new RandomAccessFile(fileName, "rw")) { + FileChannel ch = raw.getChannel(); + ByteBuffer buff = ch.map(FileChannel.MapMode.READ_WRITE, 0, bytes.length); + buff.put(bytes); + } } /** @@ -80,7 +88,7 @@ public static void writeTextFile(String fileName, String content) throws IOExcep * @throws IOException in case of write error */ public static void appendTextFile(String fileName, String content) throws IOException { - + // TODO: do append via NIO try (Writer writer = new BufferedWriter( new OutputStreamWriter(new FileOutputStream(fileName, true), def_encoding))) { writer.write(content);