package com.microsoft.azure.management.resources.fluentcore.arm.models.implementation;
import com.microsoft.azure.management.resources.fluentcore.arm.implementation.ManagerBase;
import com.microsoft.azure.management.resources.fluentcore.arm.models.GroupableResource;
import com.microsoft.azure.management.resources.fluentcore.arm.models.Resource;
import rx.Observable;
import rx.functions.Func1;
public abstract class GroupableParentResourceImpl<
FluentModelT extends Resource,
InnerModelT extends com.microsoft.azure.Resource,
FluentModelImplT extends GroupableParentResourceImpl<FluentModelT, InnerModelT, FluentModelImplT, ManagerT>,
ManagerT extends ManagerBase>
extends
GroupableResourceImpl<FluentModelT, InnerModelT, FluentModelImplT, ManagerT>
implements
GroupableResource<ManagerT, InnerModelT> {
protected GroupableParentResourceImpl(
String name,
InnerModelT innerObject,
ManagerT manager) {
super(name, innerObject, manager);
initializeChildrenFromInner();
}
protected abstract Observable<InnerModelT> createInner();
protected abstract void initializeChildrenFromInner();
protected abstract void beforeCreating();
protected abstract void afterCreating();
@Override
public Observable<FluentModelT> createResourceAsync() {
@SuppressWarnings("unchecked")
final FluentModelT self = (FluentModelT) this;
beforeCreating();
return createInner()
.flatMap(new Func1<InnerModelT, Observable<FluentModelT>>() {
@Override
public Observable<FluentModelT> call(InnerModelT inner) {
setInner(inner);
try {
initializeChildrenFromInner();
afterCreating();
return Observable.just(self);
} catch (Exception e) {
return Observable.error(e);
}
}
});
}
}