blob: 2bf790cb850bcbe4c1d7c9a7a6649a5023d71338 [file] [log] [blame]
/****************************************************************
* Licensed to the Apache Software Foundation (ASF) under one *
* or more contributor license agreements. See the NOTICE file *
* distributed with this work for additional information *
* regarding copyright ownership. The ASF licenses this file *
* to you under the Apache License, Version 2.0 (the *
* "License"); you may not use this file except in compliance *
* with the License. You may obtain a copy of the License at *
* *
* http://www.apache.org/licenses/LICENSE-2.0 *
* *
* Unless required by applicable law or agreed to in writing, *
* software distributed under the License is distributed on an *
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
* KIND, either express or implied. See the License for the *
* specific language governing permissions and limitations *
* under the License. *
****************************************************************/
package org.apache.james.adapter.mailbox;
import java.io.Closeable;
import java.io.IOException;
import javax.inject.Inject;
import org.apache.james.core.Username;
import org.apache.james.core.quota.QuotaCountLimit;
import org.apache.james.core.quota.QuotaCountUsage;
import org.apache.james.core.quota.QuotaSizeLimit;
import org.apache.james.core.quota.QuotaSizeUsage;
import org.apache.james.mailbox.exception.MailboxException;
import org.apache.james.mailbox.model.MailboxPath;
import org.apache.james.mailbox.model.SerializableQuota;
import org.apache.james.mailbox.model.SerializableQuotaLimitValue;
import org.apache.james.mailbox.quota.MaxQuotaManager;
import org.apache.james.mailbox.quota.QuotaManager;
import org.apache.james.mailbox.quota.QuotaRootResolver;
import org.apache.james.util.MDCBuilder;
import com.github.fge.lambdas.Throwing;
public class QuotaManagement implements QuotaManagementMBean {
private final QuotaManager quotaManager;
private final MaxQuotaManager maxQuotaManager;
private final QuotaRootResolver quotaRootResolver;
@Inject
public QuotaManagement(QuotaManager quotaManager, MaxQuotaManager maxQuotaManager, QuotaRootResolver quotaRootResolver) {
this.quotaManager = quotaManager;
this.maxQuotaManager = maxQuotaManager;
this.quotaRootResolver = quotaRootResolver;
}
@Override
public String getQuotaRoot(String namespace, String user, String name) throws MailboxException {
try (Closeable closeable =
MDCBuilder.create()
.addToContext(MDCBuilder.PROTOCOL, "CLI")
.addToContext(MDCBuilder.ACTION, "getQuotaRoot")
.build()) {
return quotaRootResolver.getQuotaRoot(new MailboxPath(namespace, Username.of(user), name)).getValue();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
@Override
public SerializableQuotaLimitValue<QuotaCountLimit> getMaxMessageCount(String quotaRoot) throws MailboxException {
try (Closeable closeable =
MDCBuilder.create()
.addToContext(MDCBuilder.PROTOCOL, "CLI")
.addToContext(MDCBuilder.ACTION, "getMaxMessageCount")
.build()) {
return SerializableQuotaLimitValue.valueOf(maxQuotaManager.getMaxMessage(quotaRootResolver.fromString(quotaRoot)));
} catch (IOException e) {
throw new RuntimeException(e);
}
}
@Override
public SerializableQuotaLimitValue<QuotaSizeLimit> getMaxStorage(String quotaRoot) throws MailboxException {
try (Closeable closeable =
MDCBuilder.create()
.addToContext(MDCBuilder.PROTOCOL, "CLI")
.addToContext(MDCBuilder.ACTION, "getMaxStorage")
.build()) {
return SerializableQuotaLimitValue.valueOf(maxQuotaManager.getMaxStorage(quotaRootResolver.fromString(quotaRoot)));
} catch (IOException e) {
throw new RuntimeException(e);
}
}
@Override
public SerializableQuotaLimitValue<QuotaCountLimit> getGlobalMaxMessageCount() throws MailboxException {
try (Closeable closeable =
MDCBuilder.create()
.addToContext(MDCBuilder.PROTOCOL, "CLI")
.addToContext(MDCBuilder.ACTION, "getGlobalMaxMessageCount")
.build()) {
return SerializableQuotaLimitValue.valueOf(maxQuotaManager.getGlobalMaxMessage());
} catch (IOException e) {
throw new RuntimeException(e);
}
}
@Override
public SerializableQuotaLimitValue<QuotaSizeLimit> getGlobalMaxStorage() throws MailboxException {
try (Closeable closeable =
MDCBuilder.create()
.addToContext(MDCBuilder.PROTOCOL, "CLI")
.addToContext(MDCBuilder.ACTION, "getGlobalMaxStorage")
.build()) {
return SerializableQuotaLimitValue.valueOf(maxQuotaManager.getGlobalMaxStorage());
} catch (IOException e) {
throw new RuntimeException(e);
}
}
@Override
public void setMaxMessageCount(String quotaRoot, SerializableQuotaLimitValue<QuotaCountLimit> maxMessageCount) {
try (Closeable closeable =
MDCBuilder.create()
.addToContext(MDCBuilder.PROTOCOL, "CLI")
.addToContext(MDCBuilder.ACTION, "setMaxMessageCount")
.build()) {
maxMessageCount.toValue(QuotaCountLimit::count, QuotaCountLimit.unlimited())
.ifPresent(
Throwing.consumer((QuotaCountLimit value) ->
maxQuotaManager.setMaxMessage(quotaRootResolver.fromString(quotaRoot), value))
.sneakyThrow());
} catch (IOException e) {
throw new RuntimeException(e);
}
}
@Override
public void setMaxStorage(String quotaRoot, SerializableQuotaLimitValue<QuotaSizeLimit> maxSize) {
try (Closeable closeable =
MDCBuilder.create()
.addToContext(MDCBuilder.PROTOCOL, "CLI")
.addToContext(MDCBuilder.ACTION, "setMaxStorage")
.build()) {
maxSize.toValue(QuotaSizeLimit::size, QuotaSizeLimit.unlimited())
.ifPresent(
Throwing.consumer((QuotaSizeLimit value) ->
maxQuotaManager.setMaxStorage(quotaRootResolver.fromString(quotaRoot), value))
.sneakyThrow());
} catch (IOException e) {
throw new RuntimeException(e);
}
}
@Override
public void setGlobalMaxMessageCount(SerializableQuotaLimitValue<QuotaCountLimit> maxGlobalMessageCount) {
try (Closeable closeable =
MDCBuilder.create()
.addToContext(MDCBuilder.PROTOCOL, "CLI")
.addToContext(MDCBuilder.ACTION, "setGlobalMaxMessageCount")
.build()) {
maxGlobalMessageCount
.toValue(QuotaCountLimit::count, QuotaCountLimit.unlimited())
.ifPresent(Throwing.consumer(maxQuotaManager::setGlobalMaxMessage).sneakyThrow());
} catch (IOException e) {
throw new RuntimeException(e);
}
}
@Override
public void setGlobalMaxStorage(SerializableQuotaLimitValue<QuotaSizeLimit> maxGlobalSize) {
try (Closeable closeable =
MDCBuilder.create()
.addToContext(MDCBuilder.PROTOCOL, "CLI")
.addToContext(MDCBuilder.ACTION, "setGlobalMaxStorage")
.build()) {
maxGlobalSize
.toValue(QuotaSizeLimit::size, QuotaSizeLimit.unlimited())
.ifPresent(Throwing.consumer(maxQuotaManager::setGlobalMaxStorage).sneakyThrow());
} catch (IOException e) {
throw new RuntimeException(e);
}
}
@Override
public SerializableQuota<QuotaCountLimit, QuotaCountUsage> getMessageCountQuota(String quotaRoot) throws MailboxException {
try (Closeable closeable =
MDCBuilder.create()
.addToContext(MDCBuilder.PROTOCOL, "CLI")
.addToContext(MDCBuilder.ACTION, "getMessageCountQuota")
.build()) {
return SerializableQuota.newInstance(quotaManager.getMessageQuota(quotaRootResolver.fromString(quotaRoot)));
} catch (IOException e) {
throw new RuntimeException(e);
}
}
@Override
public SerializableQuota<QuotaSizeLimit, QuotaSizeUsage> getStorageQuota(String quotaRoot) throws MailboxException {
try (Closeable closeable =
MDCBuilder.create()
.addToContext(MDCBuilder.PROTOCOL, "CLI")
.addToContext(MDCBuilder.ACTION, "getStorageQuota")
.build()) {
return SerializableQuota.newInstance(quotaManager.getStorageQuota(quotaRootResolver.fromString(quotaRoot)));
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}