/*
* Copyright 2015-2016 Red Hat, Inc. and/or its affiliates
* and other contributors as indicated by the @author tags.
*
* Licensed 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.hawkular.inventory.rest.cdi;
import java.io.InputStream;
import java.time.Instant;
import java.util.Iterator;
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.inject.Produces;
import javax.inject.Inject;
import org.hawkular.inventory.api.Configuration;
import org.hawkular.inventory.api.EmptyInventory;
import org.hawkular.inventory.api.EntityAlreadyExistsException;
import org.hawkular.inventory.api.EntityNotFoundException;
import org.hawkular.inventory.api.Interest;
import org.hawkular.inventory.api.Inventory;
import org.hawkular.inventory.api.Query;
import org.hawkular.inventory.api.Relationships;
import org.hawkular.inventory.api.Tenants;
import org.hawkular.inventory.api.TransactionFrame;
import org.hawkular.inventory.api.filters.Filter;
import org.hawkular.inventory.api.model.AbstractElement;
import org.hawkular.inventory.api.model.Entity;
import org.hawkular.inventory.api.model.Tenant;
import org.hawkular.inventory.api.paging.Page;
import org.hawkular.inventory.api.paging.Pager;
import org.hawkular.inventory.cdi.Official;
import org.hawkular.inventory.paths.CanonicalPath;
import rx.Observable;
/**
* @author Lukas Krejci
* @since 0.1.0
*/
@ApplicationScoped
public class AutoTenantInventoryProducer {
@Inject
@Official
private Inventory inventory;
@Produces
@AutoTenant
@ApplicationScoped
public Inventory getInventory() {
return new AutotenantInventory(inventory);
}
private static class AutotenantInventory implements Inventory {
private final Inventory inventory;
private AutotenantInventory(Inventory inventory) {
this.inventory = inventory;
}
@Override public AutotenantInventory at(Instant time) {
return new AutotenantInventory(inventory.at(time));
}
@Override
public void close() throws Exception {
inventory.close();
}
@Override
public InputStream getGraphSON(String tenantId) {
return inventory.getGraphSON(tenantId);
}
@Override
public <T extends Entity<?, ?>> Iterator<T> getTransitiveClosureOver(
CanonicalPath startingPoint, Relationships.Direction direction, Class<T> clazz,
String... relationshipNames) {
return inventory.getTransitiveClosureOver(startingPoint, direction, clazz, relationshipNames);
}
@Override public Configuration getConfiguration() {
return inventory.getConfiguration();
}
@Override
public boolean hasObservers(Interest<?, ?> interest) {
return inventory.hasObservers(interest);
}
@Override
public void initialize(Configuration configuration) {
inventory.initialize(configuration);
}
@Override
public TransactionFrame newTransactionFrame() {
TransactionFrame frame = inventory.newTransactionFrame();
return new TransactionFrame() {
@Override
public void commit() {
frame.commit();
}
@Override
public void rollback() {
frame.rollback();
}
@Override
public Inventory boundInventory() {
return new AutotenantInventory(frame.boundInventory());
}
};
}
@Override public <T extends AbstractElement<?, ?>> T getElement(CanonicalPath path) {
return inventory.getElement(path);
}
@Override
public <C, E> Observable<C> observable(Interest<C, E> interest) {
return inventory.observable(interest);
}
@Override
public Relationships.Read relationships() {
return inventory.relationships();
}
@Override
public Tenants.ReadWrite tenants() {
Tenants.ReadWrite actual = inventory.tenants();
return new Tenants.ReadWrite() {
@Override
public Tenants.Multiple getAll(Filter[][] filters) {
return new EmptyInventory.TenantsMultiple();
}
@Override
public Tenants.Single get(String id) throws EntityNotFoundException {
Tenants.Single ret = actual.get(id);
if (ret.exists()) {
return ret;
} else {
return actual.create(Tenant.Blueprint.builder().withId(id).build());
}
}
@Override
public Tenants.Single create(Tenant.Blueprint blueprint, boolean cache)
throws EntityAlreadyExistsException {
return actual.create(blueprint, cache);
}
@Override
public void update(String id, Tenant.Update update) throws EntityNotFoundException {
actual.update(id, update);
}
@Override
public void delete(String id) throws EntityNotFoundException {
actual.delete(id);
}
@Override public void eradicate(String id) throws EntityNotFoundException {
actual.eradicate(id);
}
};
}
@Override
public <T extends AbstractElement> Page<T> execute(Query query, Class<T> requestedEntity, Pager pager) {
return inventory.execute(query, requestedEntity, pager);
}
}
}