View Javadoc
1   /*
2    * Copyright (C) 2005-2015 Schlichtherle IT Services.
3    * All rights reserved. Use is subject to license terms.
4    */
5   package net.java.truevfs.kernel.spec;
6   
7   import java.util.*;
8   import javax.annotation.CheckForNull;
9   import javax.annotation.concurrent.Immutable;
10  import net.java.truecommons.services.Container;
11  
12  /**
13   * An abstract composite driver.
14   * This class provides an implementation of {@link #newController} which uses
15   * the file system driver map returned by {@link #get()} to lookup the
16   * appropriate driver for the scheme of any given mount point.
17   * <p>
18   * Subclasses should be immutable, too.
19   *
20   * @author Christian Schlichtherle
21   */
22  @Immutable
23  public abstract class FsAbstractCompositeDriver
24  implements FsCompositeDriver, Container<Map<FsScheme, FsDriver>> {
25  
26      @Override
27      public final FsModel newModel(
28              final FsManager context,
29              final FsMountPoint mountPoint,
30              final FsModel parent) {
31          assert null == parent
32                      ? null == mountPoint.getParent()
33                      : parent.getMountPoint().equals(mountPoint.getParent());
34          return driver(mountPoint).newModel(context, mountPoint, parent);
35      }
36  
37      @Override
38      public final FsController newController(
39              final FsManager context,
40              final FsModel model,
41              final @CheckForNull FsController parent)
42      throws ServiceConfigurationError {
43          assert null == parent
44                      ? null == model.getParent()
45                      : parent.getModel().equals(model.getParent());
46          return driver(model.getMountPoint()).newController(context, model, parent);
47      }
48  
49      private FsDriver driver(final FsMountPoint mountPoint) {
50          final FsScheme scheme = mountPoint.getScheme();
51          final FsDriver driver = get().get(scheme);
52          if (null == driver)
53              throw new ServiceConfigurationError(scheme
54                      + " (Unknown file system scheme! May be the class path doesn't contain the respective driver module or it isn't set up correctly?)");
55          return driver;
56      }
57  }