View Javadoc

1   package org.csc.phynixx.common.cast;
2   
3   /*
4    * #%L
5    * phynixx-common
6    * %%
7    * Copyright (C) 2014 Christoph Schmidt-Casdorff
8    * %%
9    * Licensed under the Apache License, Version 2.0 (the "License");
10   * you may not use this file except in compliance with the License.
11   * You may obtain a copy of the License at
12   * 
13   *      http://www.apache.org/licenses/LICENSE-2.0
14   * 
15   * Unless required by applicable law or agreed to in writing, software
16   * distributed under the License is distributed on an "AS IS" BASIS,
17   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18   * See the License for the specific language governing permissions and
19   * limitations under the License.
20   * #L%
21   */
22  
23  
24  /**
25   * Implementierung des von {@link IImplementor} fuer eine Delegatinon.
26   *
27   * @param <Y>
28   * @author Christoph Schmidt-Casdorff
29   */
30  public class ImplementorWrapper<Y extends IImplementor> implements IImplementor {
31  
32      private Y editable = null;
33  
34      protected ImplementorWrapper(final Y editable) {
35          super();
36          this.editable = editable;
37      }
38  
39      protected Y getWrapped() {
40          return this.editable;
41      }
42  
43      /**
44       * prueft, ob uebergebene Klasse <code>assignable</code> von aktueller
45       * Klasse ist.
46       */
47      public <X> X cast(final Class<X> iface) {
48          if (iface == null) {
49              throw new IllegalArgumentException("Parameter 'cls' muss angegeben werden");
50          }
51  
52          final Class<?> clazz = this.getClass();
53          if (iface.isAssignableFrom(clazz)) {
54              return iface.cast(this);
55          } else {
56              if (this.editable == null) {
57                  throw new IllegalStateException("Delegate ist nicht definiert");
58              }
59              return this.editable.cast(iface);
60          }
61      }
62  
63      public <X> boolean isImplementationOf(final Class<X> cls) {
64          if (cls == null) {
65              throw new IllegalArgumentException(
66                      "Parameter 'cls' muss angegeben werden");
67          }
68          if (cls.isAssignableFrom(this.getClass())) {
69              return true;
70          } else {
71              if (this.editable == null) {
72                  throw new IllegalStateException("Delegate ist nicht definiert");
73              }
74              return this.editable.isImplementationOf(cls);
75          }
76      }
77  
78  }