Search in sources :

Example 1 with ManagedLock

use of org.exist.storage.lock.ManagedLock in project exist by eXist-db.

the class MemoryContentsImpl method read.

@Override
public int read(byte[] dst, long position, int off, int len) {
    try (ManagedLock lock = readLock()) {
        if (position >= size) {
            return -1;
        }
        int toRead = (int) min(min(size - position, len), Integer.MAX_VALUE);
        int currentBlock = (int) (position / BLOCK_SIZE);
        int startIndexInBlock = (int) (position - (currentBlock * (long) BLOCK_SIZE));
        int read = 0;
        while (read < toRead) {
            int lengthInBlock = min(BLOCK_SIZE - startIndexInBlock, toRead - read);
            byte[] block = getBlock(currentBlock);
            System.arraycopy(block, startIndexInBlock, dst, off + read, lengthInBlock);
            read += lengthInBlock;
            startIndexInBlock = 0;
            currentBlock += 1;
        }
        return read;
    }
}
Also used : ManagedLock(org.exist.storage.lock.ManagedLock)

Example 2 with ManagedLock

use of org.exist.storage.lock.ManagedLock in project exist by eXist-db.

the class SecurityManagerImpl method processParameter.

@Override
public void processParameter(final DBBroker broker, final DocumentImpl document) throws ConfigurationException {
    XmldbURI uri = document.getCollection().getURI();
    final boolean isRemoved = uri.endsWith(SecurityManager.REMOVED_COLLECTION_URI);
    if (isRemoved) {
        uri = uri.removeLastSegment();
    }
    final boolean isAccount = uri.endsWith(SecurityManager.ACCOUNTS_COLLECTION_URI);
    final boolean isGroup = uri.endsWith(SecurityManager.GROUPS_COLLECTION_URI);
    if (isAccount || isGroup) {
        uri = uri.removeLastSegment();
        final String realmId = uri.lastSegment().toString();
        final AbstractRealm realm = (AbstractRealm) findRealmForRealmId(realmId);
        final Configuration conf = Configurator.parse(broker.getBrokerPool(), document);
        Integer id = -1;
        if (isRemoved) {
            id = conf.getPropertyInteger("id");
        }
        final String name = conf.getProperty("name");
        if (isAccount) {
            if (isRemoved && id > 2 && !hasUser(id)) {
                final AccountImpl account = new AccountImpl(realm, conf);
                account.removed = true;
                registerAccount(account);
            } else if (name != null) {
                if (realm.hasAccount(name)) {
                    final Integer oldId = saving.get(document.getURI());
                    final Integer newId = conf.getPropertyInteger("id");
                    if (!newId.equals(oldId)) {
                        final Account current = realm.getAccount(name);
                        try (final ManagedLock<ReadWriteLock> lock = ManagedLock.acquire(accountLocks.getLock(current), LockMode.WRITE_LOCK)) {
                            usersById.write(principalDb -> {
                                principalDb.remove(oldId);
                                principalDb.put(newId, current);
                            });
                        }
                    }
                } else {
                    final Account account = new AccountImpl(realm, conf);
                    if (account.getGroups().length == 0) {
                        try {
                            account.setPrimaryGroup(realm.getGroup(SecurityManager.UNKNOWN_GROUP));
                            LOG.warn("Account '{}' has no groups, but every account must have at least 1 group. Assigned group: " + SecurityManager.UNKNOWN_GROUP, account.getName());
                        } catch (final PermissionDeniedException e) {
                            throw new ConfigurationException("Account has no group, unable to default to " + SecurityManager.UNKNOWN_GROUP + ": " + e.getMessage(), e);
                        }
                    }
                    registerAccount(account);
                    realm.registerAccount(account);
                }
            } else {
                // this can't be! log any way
                LOG.error("Account '{}' already exists in realm: '{}', but received notification that a new one was created.", name, realmId);
            }
        } else if (isGroup) {
            if (isRemoved && id > 2 && !hasGroup(id)) {
                final GroupImpl group = new GroupImpl(realm, conf);
                group.removed = true;
                registerGroup(group);
            } else if (name != null && !realm.hasGroup(name)) {
                final GroupImpl group = new GroupImpl(realm, conf);
                registerGroup(group);
                realm.registerGroup(group);
            } else {
                // this can't be! log any way
                LOG.error("Group '{}' already exists in realm: '{}', but received notification that a new one was created.", name, realmId);
            }
        }
        saving.remove(document.getURI());
    }
}
Also used : LockMode(org.exist.storage.lock.Lock.LockMode) Txn(org.exist.storage.txn.Txn) BrokerPool(org.exist.storage.BrokerPool) ConfigurationException(org.exist.config.ConfigurationException) BiFunction(java.util.function.BiFunction) JobDescription(org.exist.scheduler.JobDescription) PermissionDeniedException(org.exist.security.PermissionDeniedException) ConcurrentValueWrapper(org.exist.util.ConcurrentValueWrapper) Configuration(org.exist.config.Configuration) Configurator(org.exist.config.Configurator) Map(java.util.Map) SchemaType(org.exist.security.SchemaType) Collection(org.exist.collections.Collection) ReadWriteLock(java.util.concurrent.locks.ReadWriteLock) JobExecutionContext(org.quartz.JobExecutionContext) Int2ObjectOpenHashMap(it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap) AbstractRealm(org.exist.security.AbstractRealm) AuthenticationException(org.exist.security.AuthenticationException) GroupAider(org.exist.security.internal.aider.GroupAider) Session(org.exist.security.Session) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) AtomicLazyVal(com.evolvedbinary.j8fu.lazy.AtomicLazyVal) Collectors(java.util.stream.Collectors) SecurityManager(org.exist.security.SecurityManager) List(java.util.List) Logger(org.apache.logging.log4j.Logger) Principal(org.exist.security.Principal) ManagedLock(org.exist.storage.lock.ManagedLock) JobDataMap(org.quartz.JobDataMap) Realm(org.exist.security.realm.Realm) WeakLazyStripes(org.exist.util.WeakLazyStripes) ThreadSafe(net.jcip.annotations.ThreadSafe) HashMap(java.util.HashMap) ReentrantReadWriteLock(java.util.concurrent.locks.ReentrantReadWriteLock) ArrayList(java.util.ArrayList) Account(org.exist.security.Account) Subject(org.exist.security.Subject) BrokerPoolServiceException(org.exist.storage.BrokerPoolServiceException) XmldbURI(org.exist.xmldb.XmldbURI) SimpleTrigger(org.quartz.SimpleTrigger) DocumentImpl(org.exist.dom.persistent.DocumentImpl) EXistException(org.exist.EXistException) Permission(org.exist.security.Permission) Database(org.exist.Database) Properties(java.util.Properties) Group(org.exist.security.Group) BrokerPoolService(org.exist.storage.BrokerPoolService) org.exist.config.annotation(org.exist.config.annotation) DBBroker(org.exist.storage.DBBroker) Int2ObjectMap(it.unimi.dsi.fastutil.ints.Int2ObjectMap) LogManager(org.apache.logging.log4j.LogManager) Account(org.exist.security.Account) Configuration(org.exist.config.Configuration) AbstractRealm(org.exist.security.AbstractRealm) ManagedLock(org.exist.storage.lock.ManagedLock) ConfigurationException(org.exist.config.ConfigurationException) PermissionDeniedException(org.exist.security.PermissionDeniedException) XmldbURI(org.exist.xmldb.XmldbURI)

Example 3 with ManagedLock

use of org.exist.storage.lock.ManagedLock in project exist by eXist-db.

the class MemoryContentsImpl method transferTo.

@Override
public long transferTo(OutputStream target, long position) throws IOException {
    try (ManagedLock lock = readLock()) {
        long transferred = 0L;
        long toTransfer = size - position;
        int currentBlock = (int) (position / BLOCK_SIZE);
        int startIndexInBlock = (int) (position - (currentBlock * (long) BLOCK_SIZE));
        while (transferred < toTransfer) {
            int lengthInBlock = (int) min(BLOCK_SIZE - startIndexInBlock, toTransfer - transferred);
            byte[] block = getBlock(currentBlock);
            target.write(block, startIndexInBlock, lengthInBlock);
            transferred += lengthInBlock;
            startIndexInBlock = 0;
            currentBlock += 1;
        }
        return transferred;
    }
}
Also used : ManagedLock(org.exist.storage.lock.ManagedLock)

Example 4 with ManagedLock

use of org.exist.storage.lock.ManagedLock in project exist by eXist-db.

the class MemoryContentsImpl method write.

@Override
public int write(byte[] src, long position, int off, int len) {
    try (ManagedLock lock = writeLock()) {
        ensureCapacity(position + len);
        int toWrite = min(len, Integer.MAX_VALUE);
        int currentBlock = (int) (position / BLOCK_SIZE);
        int startIndexInBlock = (int) (position - (currentBlock * (long) BLOCK_SIZE));
        int written = 0;
        while (written < toWrite) {
            int lengthInBlock = min(BLOCK_SIZE - startIndexInBlock, toWrite - written);
            byte[] block = getBlock(currentBlock);
            System.arraycopy(src, off + written, block, startIndexInBlock, lengthInBlock);
            written += lengthInBlock;
            startIndexInBlock = 0;
            currentBlock += 1;
        }
        // REVIEW, possibility to fill with random data
        size = max(size, position + written);
        return written;
    }
}
Also used : ManagedLock(org.exist.storage.lock.ManagedLock)

Aggregations

ManagedLock (org.exist.storage.lock.ManagedLock)4 AtomicLazyVal (com.evolvedbinary.j8fu.lazy.AtomicLazyVal)1 Int2ObjectMap (it.unimi.dsi.fastutil.ints.Int2ObjectMap)1 Int2ObjectOpenHashMap (it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap)1 ArrayList (java.util.ArrayList)1 HashMap (java.util.HashMap)1 List (java.util.List)1 Map (java.util.Map)1 Properties (java.util.Properties)1 ConcurrentHashMap (java.util.concurrent.ConcurrentHashMap)1 ReadWriteLock (java.util.concurrent.locks.ReadWriteLock)1 ReentrantReadWriteLock (java.util.concurrent.locks.ReentrantReadWriteLock)1 BiFunction (java.util.function.BiFunction)1 Collectors (java.util.stream.Collectors)1 ThreadSafe (net.jcip.annotations.ThreadSafe)1 LogManager (org.apache.logging.log4j.LogManager)1 Logger (org.apache.logging.log4j.Logger)1 Database (org.exist.Database)1 EXistException (org.exist.EXistException)1 Collection (org.exist.collections.Collection)1