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}