001/* 002 * The contents of this file are subject to the license and copyright 003 * detailed in the LICENSE and NOTICE files at the root of the source 004 * tree. 005 */ 006 007package org.fcrepo.kernel.api; 008 009import java.time.Duration; 010import java.time.Instant; 011 012import org.fcrepo.kernel.api.identifiers.FedoraId; 013 014/** 015 * A read-only tx that never expires and cannot be committed. 016 * 017 * @author pwinckles 018 */ 019public class ReadOnlyTransaction implements Transaction { 020 021 // This is not a perfect way to create a singleton, but it should be fine for its purposes as it does 022 // not really need to be a singleton. 023 public static final ReadOnlyTransaction INSTANCE = new ReadOnlyTransaction(); 024 025 public static final String READ_ONLY_TX_ID = "read-only"; 026 027 private ReadOnlyTransaction() { 028 // empty 029 } 030 031 @Override 032 public void commit() { 033 // no-op 034 } 035 036 @Override 037 public void commitIfShortLived() { 038 // no-op 039 } 040 041 @Override 042 public boolean isCommitted() { 043 return false; 044 } 045 046 @Override 047 public void rollback() { 048 // no-op 049 } 050 051 @Override 052 public void fail() { 053 // no-op 054 } 055 056 @Override 057 public boolean isRolledBack() { 058 return false; 059 } 060 061 @Override 062 public boolean isOpenLongRunning() { 063 return false; 064 } 065 066 @Override 067 public boolean isOpen() { 068 return true; 069 } 070 071 @Override 072 public void ensureCommitting() { 073 // no-op 074 } 075 076 @Override 077 public boolean isReadOnly() { 078 return true; 079 } 080 081 @Override 082 public String getId() { 083 return READ_ONLY_TX_ID; 084 } 085 086 @Override 087 public boolean isShortLived() { 088 return true; 089 } 090 091 @Override 092 public void setShortLived(final boolean shortLived) { 093 // no-op 094 } 095 096 @Override 097 public void expire() { 098 // no-op 099 } 100 101 @Override 102 public boolean hasExpired() { 103 return false; 104 } 105 106 @Override 107 public Instant updateExpiry(final Duration amountToAdd) { 108 return Instant.now().plus(amountToAdd); 109 } 110 111 @Override 112 public Instant getExpires() { 113 return Instant.now().plus(Duration.ofMinutes(1)); 114 } 115 116 @Override 117 public void refresh() { 118 // no-op 119 } 120 121 @Override 122 public void lockResource(final FedoraId resourceId) { 123 // no-op 124 } 125 126 @Override 127 public void lockResourceAndGhostNodes(final FedoraId resourceId) { 128 // no-op 129 } 130 131 @Override 132 public void releaseResourceLocksIfShortLived() { 133 // no-op 134 } 135 136 @Override 137 public void doInTx(final Runnable runnable) { 138 runnable.run(); 139 } 140 141 @Override 142 public void setBaseUri(final String baseUri) { 143 // no-op 144 } 145 146 @Override 147 public void setUserAgent(final String userAgent) { 148 // no-op 149 } 150 151 @Override 152 public void suppressEvents() { 153 // no-op 154 } 155}