001/*
002 * file CcTypeBase.java
003 *
004 * Licensed Materials - Property of IBM
005 * Restricted Materials of IBM 
006 *
007 *
008 * com.ibm.rational.wvcm.stp.cc.CcTypeBase
009 * 
010 * (C) Copyright IBM Corporation 2004, 2011.  All Rights Reserved. 
011 * Note to U.S. Government Users Restricted Rights:  Use, duplication or  
012 * disclosure restricted by GSA ADP  Schedule Contract with IBM Corp. 
013 */
014
015
016package com.ibm.rational.wvcm.stp.cc;
017
018import static com.ibm.rational.wvcm.stpex.StpExBase.PROPERTY_NAMESPACE;
019
020import javax.wvcm.PropertyNameList.PropertyName;
021import javax.wvcm.WvcmException;
022
023import com.ibm.rational.wvcm.stpex.StpExEnumeration;
024import com.ibm.rational.wvcm.stpex.StpExEnumerationBase;
025
026/**
027 * <p>Base interface for all ClearCase "type" interfaces - branch type,
028 * label type, etc.  A type object controls certain aspects of the creation and
029 * behavior of instances of that type.  For instance, the name of a label
030 * instance is determined by it's label type.  Changing the name of a label type
031 * changes the names of all instances of that type.
032 * </p>
033 */
034public interface CcTypeBase extends CcVobResource
035{
036    /**
037     * Scope of a ClearCase type object.
038     * A type object's scope determines it's sphere of influence.  Scope is one of
039     * <bl>
040     * <li>None.  The scope of this type object is limited to instances in the
041     * VOB in which this type resides.
042     * </li>
043     * <li>Local.  This type object is a VOB-local instance of a global type.
044     * While it controls the behavior of instances in its local VOB, it is
045     * essentially a local copy of a global type. 
046     * </li>
047     * <li>Global.  This type object controls behavior of instances in all VOBs
048     * for which this type object's VOB serves as an "admin" VOB.  It uses
049     * "local" types as proxies in VOBs other than its own.
050     * </li>
051     * </bl>
052     * <p>
053     * For more information, see the ClearCase Administrator's Guide.
054     */
055    enum Scope implements StpExEnumeration 
056    {
057        /** This is a global type. */
058        GLOBAL,
059
060        /** This is a local instance of a global type. */
061        LOCAL,
062
063        /** This is neither a global type nor a local instance. */
064        NONE;
065    }
066
067    /**
068     * The scope of this type object.
069     */
070    PropertyName<Scope> SCOPE =
071        new PropertyName<Scope>(PROPERTY_NAMESPACE, "vob-type-scope");
072
073    /**
074     * Get the value of this proxy's {@link #SCOPE} property.
075     * @return this type object's scope
076     * @throws WvcmException if this proxy doesn't define a value for this property.
077     */
078    Scope getScope() throws WvcmException;
079
080    /**
081     * Set the value of this proxy's {@link #SCOPE} property.
082     * This property can only be set at type creation time.
083     * @param scope The new scope
084     */
085    void setScope(Scope scope);
086
087    /**
088     * Instance constraint of a ClearCase type object.
089     * A type object's instance constraint determines where the type may be applied. 
090     * Some metatypes do not support all (or any) instance constraints.
091     * Instance constraint is one of
092     * <bl>
093     * <li>None.  There are no special constraints on this metatype beyond the default behaviour
094     * for the type.
095     * </li>
096     * <li>Element.  Type instance may only occur once per element,
097     * </li>
098     * </li>
099     * <li>Branch.  Type instances may occur on multiple branches, but only once per branch,
100     * </li>
101     * </li>
102     * <li>Version.  Type instance may only be attached to versions, but may be attached to 
103     * as many versions as desired
104     * </li>
105     * </bl>
106     * <p>
107     * For more information, see the ClearCase Administrator's Guide.
108     */
109    enum InstanceConstraint implements StpExEnumeration 
110    {
111        /** Default constraint for this type. */
112        NONE,
113
114        /** Once per element. */
115        ELEMENT,
116
117        /** Once per branch. */
118        BRANCH,
119        
120        /** Versions only, as many as desired. */
121        VERSION;
122
123        private InstanceConstraint() {}
124
125        /**
126         * Returns the InstanceConstraint enumerator defined by the given Object
127         *
128         * @param   tag  The Object for which an enumerator is sought
129         *
130         * @return  An InstanceConstraint object that is based on the given Object. Will
131         *          be <b>null</b> if no such enumerator exists.
132         */
133
134        public static InstanceConstraint byTag(Object tag)
135        {
136            return StpExEnumerationBase.getByTag(InstanceConstraint.class, tag);
137        }
138    }
139    
140    /**
141     * The instance constraint of this type object.
142     */
143    PropertyName<InstanceConstraint> INSTANCE_CONSTRAINT =
144        new PropertyName<InstanceConstraint>(PROPERTY_NAMESPACE, "vob-type-instance-constraint");
145
146    /**
147     * Get the value of this proxy's {@link #INSTANCE_CONSTRAINT} property.
148     * @return this type object's instance constraint
149     * @throws WvcmException if this proxy doesn't define a value for this property.
150     */
151    InstanceConstraint getInstanceConstraint() throws WvcmException;
152
153    /**
154     * Set the value of this proxy's {@link #INSTANCE_CONSTRAINT} property.
155     * This property can only be set at type creation time.
156     * @param constraint The new instance constraint
157     */
158    void setInstanceConstraint(InstanceConstraint constraint);
159
160    /**
161     * Does this type object have shared mastership? If true, instances of this
162     * type can be created in any VOB replica in this type object's VOB family.
163     * Otherwise, instances of this type can only be created in the VOB replica
164     * that is the current master of this type object. For more information, see
165     * the ClearCase Administrator's Guide.
166     */
167    PropertyName<Boolean> HAS_SHARED_MASTERSHIP =
168        new PropertyName<Boolean>(PROPERTY_NAMESPACE, "has-shared-mastership"); //$NON-NLS-1$
169
170    /**
171     * Get the value of this proxy's {@link #HAS_SHARED_MASTERSHIP} property.
172     * @return true if this type object has shared mastership, else false
173     * @throws WvcmException if this proxy doesn't define a value for this property.
174     */
175    boolean getHasSharedMastership() throws WvcmException;
176
177    /**
178     * Set the value of this proxy's {@link #HAS_SHARED_MASTERSHIP} property.
179     * This property can only be set at type creation time.
180     * @param hasSharedMastership true if this type is to have shared mastership, else false
181     */
182    void setHasSharedMastership(boolean hasSharedMastership);
183    
184    /** Enum for the doCreateResource method */
185    enum TypeCreateFlag implements StpExEnumeration {
186
187        /**
188         * Acquire eclipsing types
189         */
190        ACQUIRE("acquire");
191
192        private String m_name;
193
194        private TypeCreateFlag(String name) { m_name = name; }
195
196        /* (non-Javadoc)
197         * @see java.lang.Object#toString()
198         */
199        public String toString() { return m_name; }
200    }
201}