/*
* Copyright 2000-2016 Vaadin Ltd.
*
* 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 com.vaadin.client.metadata;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import com.vaadin.client.Profiler;
public abstract class AsyncBundleLoader {
public enum State {
NOT_STARTED, LOADING, LOADED, ERROR;
}
private State state = State.NOT_STARTED;
private Throwable error = null;
private List<BundleLoadCallback> callbacks = new ArrayList<>();
private final String packageName;
private final String[] indentifiers;
public AsyncBundleLoader(String packageName, String[] indentifiers) {
this.packageName = packageName;
this.indentifiers = indentifiers;
}
protected abstract void load(TypeDataStore store);
public List<BundleLoadCallback> setError(Throwable error) {
assert state == State.LOADING;
state = State.ERROR;
this.error = error;
return clearCallbacks();
}
public Throwable getError() {
return error;
}
public State getState() {
return state;
}
public List<BundleLoadCallback> getCallback() {
return Collections.unmodifiableList(callbacks);
}
public void load(BundleLoadCallback callback, TypeDataStore store) {
assert state == State.NOT_STARTED;
Profiler.enter("AsyncBundleLoader.load");
state = State.LOADING;
addCallback(callback);
load(store);
Profiler.leave("AsyncBundleLoader.load");
}
public void addCallback(BundleLoadCallback callback) {
assert state == State.LOADING;
if (callback != null) {
callbacks.add(callback);
}
}
public List<BundleLoadCallback> setLoaded() {
assert state == State.LOADING;
state = State.LOADED;
return clearCallbacks();
}
private List<BundleLoadCallback> clearCallbacks() {
List<BundleLoadCallback> callbacks = this.callbacks;
this.callbacks = null;
return callbacks;
}
public String getName() {
return packageName;
}
public String[] getIndentifiers() {
return indentifiers;
}
}