
	private class RefPackageAndName {
		public java.lang.String name = null;
		public java.lang.String qualifiedName = null;
		public boolean imported = false;
		public javax.jmi.reflect.RefPackage refPackage = null;
		public RefPackageAndName(java.lang.String name, java.lang.String qualifiedName, boolean imported, javax.jmi.reflect.RefPackage refPackage) {
			this.name = name;
			this.qualifiedName = qualifiedName;
			this.imported = imported;
			this.refPackage = refPackage;
		}
	}

	private class RefClassAndName {
		public java.lang.String name = null;
		public java.lang.String qualifiedName = null;
		public javax.jmi.reflect.RefClass refClass = null;
		public RefClassAndName(java.lang.String name, java.lang.String qualifiedName, javax.jmi.reflect.RefClass refClass) {
			this.name = name;
			this.qualifiedName = qualifiedName;
			this.refClass = refClass;
		}
	}

	private class RefAssociationAndName {
		public java.lang.String name = null;
		public java.lang.String qualifiedName = null;
		public javax.jmi.reflect.RefAssociation refAssociation = null;
		public RefAssociationAndName(
			java.lang.String name,
			java.lang.String qualifiedName,
			javax.jmi.reflect.RefAssociation refAssociation) {
			this.name = name;
			this.qualifiedName = qualifiedName;
			this.refAssociation = refAssociation;
		}
	}

	transient private java.util.List ___refPackages= null;
	transient private java.util.List ___refClasses = null;
	transient private java.util.List ___refAssociations = null;


	/**
	 * @see javax.jmi.reflect.RefPackage#refClass(RefObject)
	 */
	public RefClass refClass(RefObject type) {
		if (type instanceof javax.jmi.model.Classifier) {
			return refClass(((javax.jmi.model.Classifier) type).getName());
		} else {
			throw new javax.jmi.reflect.InvalidCallException(type,null,"refClass()");
		}
	}

	/**
	 * @see javax.jmi.reflect.RefPackage#refClass(String)
	 */
	public RefClass refClass(String typeName) {
		initialize();
		if (typeName == null) {
			throw new javax.jmi.reflect.InvalidCallException(typeName, null, "refClass()");
		}
		RefClass rc = null;
		RefClassAndName rcan = null;
		if (typeName.indexOf(IRepositoryConst.M2PackageDelimiter) > 0) {
			// search with qualified name
			Iterator i = ___refClasses.iterator();
			while (i.hasNext() && rcan == null) {
				RefClassAndName rcanTemp = (RefClassAndName) i.next();
				if (typeName.equals(rcanTemp.qualifiedName)) {
					rcan = rcanTemp;
				}
			}
		} else {
			// search with name 
			Iterator i = ___refClasses.iterator();
			while (i.hasNext() && rcan == null) {
				RefClassAndName rcanTemp = (RefClassAndName) i.next();
				if (typeName.equals(rcanTemp.name)) {
					rcan = rcanTemp;
				}
			}
		}
		if (rcan != null) {
			if (rcan.refClass == null) {
				rcan.refClass = ___repository.refClassM1(rcan.qualifiedName);
				if (rcan.refClass != null) {
					initInstance(rcan.refClass, rcan.qualifiedName);
				}
			}
			rc = rcan.refClass;
		}
		// not found -> search in packages below in case of qualified name
		if (rc == null) {
			// search with qualified name
			Iterator i = ___refPackages.iterator();
			while (i.hasNext() && rc == null) {
				RefPackageAndName rpanTemp = (RefPackageAndName) i.next();
				if (typeName.indexOf(rpanTemp.qualifiedName) == 0) {
					getRefPackage(rpanTemp);
					javax.jmi.reflect.RefClass rcTemp = rpanTemp.refPackage.refClass(typeName);
					if (rcTemp != null) {
						rc = rcTemp;
					}
				}
			}
		}	


		if (rc == null) {
			throw new javax.jmi.reflect.InvalidNameException(typeName, null);
		}
		return rc;
 	}

	private void initInstance(java.lang.Object instance, String qualifiedName) {
		if (instance != null && instance instanceof com.sap.ip.mmr.m1layer.IMMRObject) {
			com.sap.ip.mmr.m1layer.IMMRObject mmro = (com.sap.ip.mmr.m1layer.IMMRObject) instance;
			mmro.set___ImmediatePackage(this);
			mmro.set___QualifiedNameImmediatePackage(___qualifiedName);
			mmro.set___QualifiedName(qualifiedName);
			mmro.set___Instantiator(this);
			mmro.set___Repository(___repository);
			mmro.set___State(com.sap.ip.mmr.StateEnum.STATE_NEW);
		}
	}


	/**
	 * @see javax.jmi.reflect.RefPackage#refPackage(RefObject)
	 */
	public javax.jmi.reflect.RefPackage refPackage(RefObject ro) {
		final String method = "refPackage(RefObject ro)"; //$NON-NLS-1$
		javax.jmi.reflect.RefPackage rp = null;
		if (ro instanceof javax.jmi.model.ModelElement) {
			rp =
				refPackage(
					com.sap.ip.mmr.foundation.Utilities.getUtilities().encodeQualifiedName(
						((javax.jmi.model.ModelElement) ro).getQualifiedName()));
		} else {
			com.sap.ip.mmr.Repository.getCategory().errorT(___location, method, com.sap.ip.mmr.foundation.MMRResourceAccessor.getInstance().getMessageText(___repository.getConnection(), "0000")); //$NON-NLS-1$
			throw new javax.jmi.reflect.InvalidCallException(ro,null,"refPackage()");
		}
		return rp;
	}

	/**
	 * @see javax.jmi.reflect.RefPackage#refPackage(String)
	 */
	public javax.jmi.reflect.RefPackage refPackage(String packageName) {
		initialize();
		if (packageName == null) {
			throw new javax.jmi.reflect.InvalidCallException(packageName, null, "refPackage()");
		}

		javax.jmi.reflect.RefPackage rp = null;


		// search for match
		RefPackageAndName rpan = null;
		if (packageName.indexOf(IRepositoryConst.M2PackageDelimiter) > 0) {
			// search with qualified name
			Iterator i = ___refPackages.iterator();
			while (i.hasNext() && rpan == null) {
				RefPackageAndName rpanTemp = (RefPackageAndName) i.next();
				if (packageName.equals(rpanTemp.qualifiedName)) {
					rpan = rpanTemp;
				}
			}
		} else {
			// search with name 
			Iterator i = ___refPackages.iterator();
			while (i.hasNext() && rpan == null) {
				RefPackageAndName rpanTemp = (RefPackageAndName) i.next();
				if (packageName.equals(rpanTemp.name)) {
					rpan = rpanTemp;
				}
			}
		}
		if (rpan != null) {
			rp = getRefPackage(rpan);
		}

		// not found -> search in packages below in case of qualified name
		if (rp == null) {
			// search with qualified name
			Iterator i = ___refPackages.iterator();
			while (i.hasNext() && rp == null) {
				RefPackageAndName rpanTemp = (RefPackageAndName) i.next();
				if (packageName.indexOf(rpanTemp.qualifiedName) == 0) {
					getRefPackage(rpanTemp);
					javax.jmi.reflect.RefPackage rpTemp = rpanTemp.refPackage.refPackage(packageName);
					if (rpTemp != null) {
						rp = rpTemp;
					}
				}
			}
		}

        // check top level package
        if (rp == null && packageName.indexOf(IRepositoryConst.M2PackageDelimiter) > 0 && this != ___repository.getTopLevelPackageM1()) {
        	rp = ___repository.getTopLevelPackageM1().refPackage(packageName);
        }

		// THIS CODING IN RefPackageImpl ONLY !!!!
		if (rp == null) {
			// not generated package
			rp = new com.sap.ip.mmr.m1layer.RefPackageImpl(___repository);
			((com.sap.ip.mmr.m1layer.RefPackageImpl) rp).set___QualifiedName(packageName);
			javax.jmi.reflect.RefPackage ip = null;
			javax.jmi.model.MofPackage mp = (javax.jmi.model.MofPackage) refMetaObject();
			if (mp != null) {
				javax.jmi.model.Namespace container = mp.getContainer();
				if (container == null || container.equals(___repository.getMofPackageRootM2())) {
					ip = null;
				} else {
					ip = this;
				}
			}
			((com.sap.ip.mmr.m1layer.RefPackageImpl) rp).set___ImmediatePackage(ip);
		}

		if (rp == null) {
			throw new javax.jmi.reflect.InvalidNameException(packageName, null);
		}
		return rp;
	}

	private javax.jmi.reflect.RefPackage getRefPackage(RefPackageAndName rpan) {
		if (rpan.refPackage == null) {
			if (rpan.imported) {
				//rpan.refPackage = ___repository.getTopLevelPackageM1().refPackage(rpan.qualifiedName);
				rpan.refPackage = ___repository.refPackageM1(rpan.qualifiedName);
				initInstance(rpan.refPackage, rpan.qualifiedName);
			} else {
				// create new one
				rpan.refPackage = ___repository.refPackageM1(rpan.qualifiedName);
				initInstance(rpan.refPackage, rpan.qualifiedName);
			}
		}
		return rpan.refPackage;
	}


	/**
	 * @see javax.jmi.reflect.RefPackage#refAssociation(RefObject)
	 */
	public RefAssociation refAssociation(RefObject association) {
		if (association instanceof javax.jmi.model.Association) {
			return refAssociation(((javax.jmi.model.Association) association).getName());
		} else {
			throw new javax.jmi.reflect.InvalidCallException(association, null, "refAssociation()");
		}
	}

	/**
	 * @see javax.jmi.reflect.RefPackage#refAssociation(String)
	 */
	public RefAssociation refAssociation(String associationName) {
		initialize();
		if (associationName == null) {
			throw new javax.jmi.reflect.InvalidCallException(associationName, null, "refAssociation()");
		}
		RefAssociation ra = null;
		RefAssociationAndName raan = null;
		if (associationName.indexOf(IRepositoryConst.M2PackageDelimiter) > 0) {
			// search with qualified name
			Iterator i = ___refAssociations.iterator();
			while (i.hasNext() && raan == null) {
				RefAssociationAndName raanTemp = (RefAssociationAndName) i.next();
				if (associationName.equals(raanTemp.qualifiedName)) {
					raan = raanTemp;
				}
			}
		} else {
			// search with name 
			Iterator i = ___refAssociations.iterator();
			while (i.hasNext() && raan == null) {
				RefAssociationAndName raanTemp = (RefAssociationAndName) i.next();
				if (associationName.equals(raanTemp.name)) {
					raan = raanTemp;
				}
			}
		}
		if (raan != null) {
			if (raan.refAssociation == null) {
				raan.refAssociation = ___repository.refAssociationM1(raan.qualifiedName);
				if (raan.refAssociation != null) {
					initInstance(raan.refAssociation, raan.qualifiedName);
				}
			}
   		    ra = raan.refAssociation;

			// set the association
			if (raan.refAssociation instanceof IMMRAssociation) {
				((IMMRAssociation) raan.refAssociation).setAssociationImpl(get___AssociationsContainer());
			}
			// must be set AFTER the qualified name
			if (raan.refAssociation instanceof com.sap.ip.mmr.m2layer.model.RefAssociationImpl) {
				((com.sap.ip.mmr.m2layer.model.RefAssociationImpl) raan.refAssociation).setAssociationImpl(
					get___AssociationsContainer());
			}
		}
		// not found -> search in packages below in case of qualified name
		if (ra == null) {
			// search with qualified name
			Iterator i = ___refPackages.iterator();
			while (i.hasNext() && ra == null) {
				RefPackageAndName rpanTemp = (RefPackageAndName) i.next();
				if (associationName.indexOf(rpanTemp.qualifiedName) == 0) {
					getRefPackage(rpanTemp);
					javax.jmi.reflect.RefAssociation raTemp = rpanTemp.refPackage.refAssociation(associationName);
					if (raTemp != null) {
						ra = raTemp;
					}
				}
			}
		}	
		if (ra == null) {
			throw new javax.jmi.reflect.InvalidNameException(associationName, null);
		}
		return ra;
	}

	public com.sap.ip.mmr.foundation.AssociationsContainer get___AssociationsContainer() {
		return ((IMMRObject)(___repository
			.getTopLevelPackageM1()))
			.get___AssociationsContainer();
	}

	/**
	 * @see javax.jmi.reflect.RefPackage#refAllPackages()
	 */
	public Collection refAllPackages() {
		initialize();
		java.util.List list = new java.util.LinkedList();
		Iterator i = ___refPackages.iterator();
		while (i.hasNext()) {
			RefPackageAndName rpan = (RefPackageAndName) i.next();
			javax.jmi.reflect.RefPackage rp = rpan.refPackage;
			if (rp == null) {
				rp = refPackage(rpan.name);
			}
			list.add(rp);
		}
		return list;
	}

	/**
	 * @see javax.jmi.reflect.RefPackage#refAllClasses()
	 */
	public Collection refAllClasses() {
		initialize();
		java.util.List list = new java.util.LinkedList();
		Iterator i = ___refClasses.iterator();
		while (i.hasNext()) {
			RefClassAndName rcan = (RefClassAndName) i.next();
			javax.jmi.reflect.RefClass rc = rcan.refClass;
			if (rc == null) {
				rc = refClass(rcan.name);
			}
			list.add(rc);
		}
		return list;
	}

	/**
	 * @see javax.jmi.reflect.RefPackage#refAllAssociations()
	 */
	public Collection refAllAssociations() {
		initialize();
		java.util.List list = new java.util.LinkedList();
		Iterator i = ___refAssociations.iterator();
		while (i.hasNext()) {
			RefAssociationAndName raan = (RefAssociationAndName) i.next();
			javax.jmi.reflect.RefAssociation ra = raan.refAssociation;
			if (ra == null) {
				ra = refAssociation(raan.name);
			}
			list.add(ra);
		}
		return list;
	}

	/**
	 * @see javax.jmi.reflect.RefPackage#refCreateStruct(RefObject, List)
	 */
	public RefStruct refCreateStruct(RefObject struct, List params) throws javax.jmi.reflect.TypeMismatchException {
		if (struct instanceof javax.jmi.model.Classifier) {
			return refCreateStruct(((javax.jmi.model.Classifier) struct).getName(), params);
		} else {
			throw new javax.jmi.reflect.InvalidCallException(struct, null, "refCreateStruct()");
		}
	}

	/**
	 * @see javax.jmi.reflect.RefPackage#refCreateStruct(String, List)
	 */
	public RefStruct refCreateStruct(String structName, List params) throws javax.jmi.reflect.TypeMismatchException {
		String sn = structName;
		// create a new instance and run the appropriate constructor
		if (structName.indexOf(IRepositoryConst.M2PackageDelimiter) > 0) {
			sn = structName;
		} else {
			sn = ___qualifiedName + IRepositoryConst.M2PackageDelimiter + structName;
		}
		return ___repository.refCreateStructM1(sn, params);
	}

	/**
	 * @see javax.jmi.reflect.RefPackage#refGetEnum(RefObject, String)
	 */
	public RefEnum refGetEnum(RefObject enum, String name) {
		if (enum instanceof javax.jmi.model.EnumerationType) {
			return refGetEnum(((javax.jmi.model.EnumerationType) enum).getName(), name);
		} else {
			RefObject mo = enum.refMetaObject();
			if (mo != null && mo instanceof javax.jmi.model.ModelElement) {
				String nameEnum = ((javax.jmi.model.ModelElement) mo).getName();
				return refGetEnum(nameEnum, name);
			}
		}
		return null;
	}


	/**
	 * @see javax.jmi.reflect.RefPackage#refDelete()
	 */
	public void refDelete() {
		___repository.refDeleteM1(this);
		___refPackages.clear();
		___refClasses.clear();
		___refAssociations.clear();
	}
