Docjar: A Java Source and Docuemnt Enginecom.*    java.*    javax.*    org.*    all    new    plug-in

Quick Search    Search Deep

Source code: org/progeeks/meta/DeferredPropertyType.java


1   /*
2    * $Id: DeferredPropertyType.java,v 1.3 2003/09/01 04:38:07 pspeed Exp $
3    *
4    * Copyright (c) 2001-2002, Paul Speed
5    * All rights reserved.
6    *
7    * Redistribution and use in source and binary forms, with or without
8    * modification, are permitted provided that the following conditions
9    * are met:
10   *
11   * 1) Redistributions of source code must retain the above copyright notice,
12   *    this list of conditions and the following disclaimer.
13   * 2) Redistributions in binary form must reproduce the above copyright
14   *    notice, this list of conditions and the following disclaimer in the
15   *    documentation and/or other materials provided with the distribution.
16   * 3) Neither the names "Progeeks", "Meta-JB", nor the names of its contributors
17   *    may be used to endorse or promote products derived from this software
18   *    without specific prior written permission.
19   *
20   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21   * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23   * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24   * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25   * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26   * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27   * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28   * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30   * POSSIBILITY OF SUCH DAMAGE.
31   */
32  
33  package org.progeeks.meta;
34  
35  /**
36   *  Represents an unresolved property type of a meta-object.  This
37   *  is to support deferred resolution of property types within a
38   *  meta-class.  The actual functionality of the PropertyType implementation
39   *  throws UnsupportedOperationExceptions since these operations cannot
40   *  be done without resolving the type.  When the type has been resolved
41   *  within the meta-class it will be replaced with the real type.
42   *
43   *  @version   $Revision: 1.3 $
44   *  @author    Paul Speed
45   */
46  public class DeferredPropertyType implements PropertyType
47  {
48      private String       metaClassName;
49      private PropertyType alternateType;
50  
51      /**
52       *  Creates a deferred type the will resolve to the specified meta-class
53       *  when resolution is requested.  If the meta-class does not exist then
54       *  an exception will be thrown.
55       */
56      public DeferredPropertyType( String metaClassName )
57      {
58          this( metaClassName, null );
59      }
60  
61      /**
62       *  Creates a deferred type the will resolve to the specified meta-class
63       *  when resolution is requested.  If the meta-class does not exist then
64       *  the alternate type is returned.
65       */
66      public DeferredPropertyType( String metaClassName, PropertyType alternateType )
67      {
68          if( metaClassName == null )
69              throw new IllegalArgumentException( "MetaClass name cannot be null." );
70          this.metaClassName = metaClassName;
71          this.alternateType = alternateType;
72      }
73  
74      /**
75       *  Returns the replacement property type as can be
76       *  resolved from the specified class registry.
77       */
78      public PropertyType resolveType( MetaClassRegistry registry )
79      {
80          MetaClass mc = registry.getMetaClass( metaClassName );
81          if( mc != null )
82              return( new MetaClassPropertyType( mc ) );
83          if( alternateType != null )
84              return( alternateType );
85          throw new RuntimeException( "MetaClass not found for name:" + metaClassName );
86      }
87  
88      /**
89       *  Returns the Java class upon which this property type
90       *  is based.
91       */
92      public Class getBaseClass()
93      {
94          throw new UnsupportedOperationException( "Cannot get the base class for a deferred type:"
95                                                       + metaClassName );
96      }
97  
98      /**
99       *  Returns true if the specified object is an instance
100      *  of this type.
101      */
102     public boolean isInstance( Object obj )
103     {
104         throw new UnsupportedOperationException( "Cannot perform instance check for a deferred type:"
105                                                      + metaClassName );
106     }
107 
108     public String toString()
109     {
110         return( "DeferredPropertyType[" + metaClassName + ", " + alternateType + "]" );
111     }
112 }