You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

ConnectorBundleLoader.java 2.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. /*
  2. @VaadinApache2LicenseForJavaFiles@
  3. */
  4. package com.vaadin.client.metadata;
  5. import java.util.HashMap;
  6. import java.util.List;
  7. import java.util.Map;
  8. import com.google.gwt.core.shared.GWT;
  9. import com.vaadin.client.metadata.AsyncBundleLoader.State;
  10. public abstract class ConnectorBundleLoader {
  11. public static final String EAGER_BUNDLE_NAME = "__eager";
  12. public static final String DEFERRED_BUNDLE_NAME = "__deferred";
  13. private static ConnectorBundleLoader impl;
  14. private Map<String, AsyncBundleLoader> asyncBlockLoaders = new HashMap<String, AsyncBundleLoader>();
  15. private Map<String, String> identifierToBundle = new HashMap<String, String>();
  16. private final TypeDataStore datStore = new TypeDataStore();
  17. public ConnectorBundleLoader() {
  18. init();
  19. }
  20. public TypeDataStore getTypeDataStore() {
  21. return datStore;
  22. }
  23. public static ConnectorBundleLoader get() {
  24. if (impl == null) {
  25. impl = GWT.create(ConnectorBundleLoader.class);
  26. }
  27. return impl;
  28. }
  29. public void loadBundle(String packageName, BundleLoadCallback callback) {
  30. AsyncBundleLoader loader = asyncBlockLoaders.get(packageName);
  31. switch (loader.getState()) {
  32. case NOT_STARTED:
  33. loader.load(callback, getTypeDataStore());
  34. break;
  35. case LOADING:
  36. loader.addCallback(callback);
  37. break;
  38. case LOADED:
  39. callback.loaded();
  40. break;
  41. case ERROR:
  42. callback.failed(loader.getError());
  43. }
  44. }
  45. public boolean isBundleLoaded(String bundleName) {
  46. AsyncBundleLoader loader = asyncBlockLoaders.get(bundleName);
  47. if (loader == null) {
  48. throw new IllegalArgumentException("Bundle " + bundleName
  49. + " not recognized");
  50. }
  51. return loader.getState() == State.LOADED;
  52. }
  53. public void setLoaded(String packageName) {
  54. List<BundleLoadCallback> callbacks = asyncBlockLoaders.get(packageName)
  55. .setLoaded();
  56. for (BundleLoadCallback callback : callbacks) {
  57. if (callback != null) {
  58. callback.loaded();
  59. }
  60. }
  61. }
  62. public void setLoadFailure(String bundleName, Throwable reason) {
  63. List<BundleLoadCallback> callbacks = asyncBlockLoaders.get(bundleName)
  64. .setError(reason);
  65. for (BundleLoadCallback callback : callbacks) {
  66. callback.failed(reason);
  67. }
  68. }
  69. public String getBundleForIdentifier(String identifier) {
  70. return identifierToBundle.get(identifier);
  71. }
  72. protected void addAsyncBlockLoader(AsyncBundleLoader loader) {
  73. String name = loader.getName();
  74. asyncBlockLoaders.put(name, loader);
  75. String[] indentifiers = loader.getIndentifiers();
  76. for (String identifier : indentifiers) {
  77. identifierToBundle.put(identifier, name);
  78. }
  79. }
  80. public abstract void init();
  81. }