/* * JBoss, Home of Professional Open Source. * * See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing. * * See the AUTHORS.txt file distributed with this work for a full listing of individual contributors. */ package org.teiid.designer.metadata.runtime.impl; import java.util.HashMap; import java.util.Map; import org.teiid.core.designer.CoreModelerPlugin; import org.teiid.core.designer.HashCodeUtil; import org.teiid.core.designer.id.ObjectID; import org.teiid.core.designer.id.UUID; import org.teiid.core.designer.util.CoreArgCheck; import org.teiid.core.designer.util.CoreStringUtil; import org.teiid.core.designer.util.EquivalenceUtil; import org.teiid.core.designer.util.FileUtils; import org.teiid.designer.core.container.EObjectFinder; import org.teiid.designer.core.index.IndexConstants; import org.teiid.designer.core.types.DatatypeConstants; import org.teiid.designer.metadata.runtime.MetadataRecord; /** * AbstractMetadataRecord * * @since 8.0 */ public abstract class AbstractMetadataRecord implements MetadataRecord { /** */ private static final long serialVersionUID = 1L; private static final int DEFAULT_INDEX_VERSION = 0; private String pathString; private String modelName; private String resourcePath; private int indexVersion = DEFAULT_INDEX_VERSION; private char recordType; private transient Map propValues; protected Object eObject; protected MetadataRecordDelegate delegate; private EObjectFinder finder; // ================================================================================== // C O N S T R U C T O R S // ================================================================================== public AbstractMetadataRecord() { } // ================================================================================== // I N T E R F A C E M E T H O D S // ================================================================================== /* (non-Javadoc) * @see org.teiid.designer.metadata.runtime.MetadataRecord#getUUID() */ @Override public String getUUID() { return this.delegate.getUUID(); } /* (non-Javadoc) * @see org.teiid.designer.metadata.runtime.MetadataRecord#getParentUUID() */ @Override public String getParentUUID() { return this.delegate.getParentUUID(); } /* (non-Javadoc) * @see org.teiid.designer.metadata.runtime.MetadataRecord#getNameInSource() */ @Override public String getNameInSource() { return this.delegate.getNameInSource(); } /** * @see org.teiid.designer.metadata.runtime.MetadataRecord#getModelName() */ @Override public String getModelName() { if (this.modelName == null) { int prntIdx = getFullName() != null ? getFullName().indexOf(IndexConstants.NAME_DELIM_CHAR) : -1; if (prntIdx <= 0) { this.modelName = getFullName(); } else { this.modelName = getFullName() != null ? getFullName().substring(0, prntIdx) : null; } } return this.modelName; } /* * @see org.teiid.designer.metadata.runtime.MetadataRecord#getFullName() */ @Override public String getFullName() { return this.delegate.getFullName(); } /* (non-Javadoc) * @see org.teiid.designer.metadata.runtime.MetadataRecord#getName() */ @Override public String getName() { return this.delegate.getName(); } /* * @see org.teiid.designer.metadata.runtime.MetadataRecord#getPathString() */ @Override public String getPathString() { if (this.pathString == null) { this.pathString = getFullName() != null ? getFullName().replace(IndexConstants.NAME_DELIM_CHAR, FileUtils.SEPARATOR) : null; } return this.pathString; } /* (non-Javadoc) * @see org.teiid.designer.metadata.runtime.MetadataRecord#getPath() */ @Override public String getPath() { return getPathString(); } /** * @see org.teiid.designer.metadata.runtime.MetadataRecord#getParentFullName() * @deprecated the returned value may be incorrect in the case of an XML element (see defects #11326 and #11362) */ @Override @Deprecated public String getParentFullName() { int prntIdx = getFullName() != null ? getFullName().lastIndexOf(IndexConstants.NAME_DELIM_CHAR + getName()) : -1; if (prntIdx <= 0) { return CoreStringUtil.Constants.EMPTY_STRING; } return getFullName().substring(0, prntIdx); } /** * @see org.teiid.designer.metadata.runtime.MetadataRecord#getParentPathString() * @deprecated the returned value may be incorrect in the case of an XML element (see defects #11326 and #11362) */ @Override @Deprecated public String getParentPathString() { String parentFullName = getParentFullName(); return parentFullName != null ? parentFullName.replace(IndexConstants.NAME_DELIM_CHAR, FileUtils.SEPARATOR) : null; } /* (non-Javadoc) * @see org.teiid.designer.metadata.runtime.MetadataRecord#getRecordType() */ @Override public char getRecordType() { return this.recordType; } // ================================================================================== // P U B L I C M E T H O D S // ================================================================================== /** * @param string */ public void setNameInSource( String string ) { this.delegate.setNameInSource(string); } /** * @param path */ public void setFullName( String fullName ) { this.delegate.setFullName(fullName); } /** * @param String */ public void setName( String name ) { this.delegate.setName(name); } /** * @param string */ public void setUUID( String string ) { this.delegate.setUUID(string); } /** * @param string */ public void setParentUUID( String string ) { this.delegate.setParentUUID(string); } /** * @return index version number */ public int getIndexVersion() { return this.indexVersion; } /** * @param int */ public void setIndexVersion( final int version ) { this.indexVersion = version; } /** * @param container The container to set. * @since 4.2 */ public void setEObjectFinder( EObjectFinder finder ) { this.finder = finder; } /* (non-Javadoc) * @see org.teiid.designer.metadata.runtime.MetadataRecord#getEObject() */ @Override public Object getEObject() { if (eObject != null) { return eObject; } CoreArgCheck.isNotNull(this.finder); try { // get the Object ID given a UUID String uuid = getUUID(); int delimitIndex = uuid.indexOf(ObjectID.DELIMITER); UUID objID = DatatypeConstants.stringToObject(uuid.substring(delimitIndex + 1)); // Return the EObject instance found in the ModelContainer ... return this.finder.find(objID); } catch (Exception e) { CoreModelerPlugin.Util.log(e); } return null; } /** * @return */ @Override public String getResourcePath() { return resourcePath; } /** * @param path */ public void setResourcePath( String path ) { resourcePath = path; } /** * @param c */ public void setRecordType( char c ) { recordType = c; } /* * @see org.teiid.designer.metadata.runtime.MetadataRecord#getPropertyValue(java.lang.String) */ @Override public Object getPropertyValue( String propertyName ) { CoreArgCheck.isNotNull(propertyName); if (propValues != null) { return propValues.get(propertyName); } return null; } /* * @see org.teiid.designer.metadata.runtime.MetadataRecord#setPropertyValue(java.lang.String, java.lang.Object) */ @Override public void setPropertyValue( String propertyName, Object propertyVame ) { if (propertyName != null && propertyVame != null) { if (propValues == null) { propValues = new HashMap(); } propValues.put(propertyName, propertyVame); } } @Override public String toString() { return getFullName(); } // ================================================================================== // P R O T E C T E D M E T H O D S // ================================================================================== /** * Compare two records for equality. */ @Override public boolean equals( Object obj ) { if (obj == this) { return true; } if (!(obj instanceof AbstractMetadataRecord)) { return false; } AbstractMetadataRecord other = (AbstractMetadataRecord)obj; if (this.getRecordType() != other.getRecordType()) { return false; } if (!EquivalenceUtil.areEqual(this.getUUID(), other.getUUID())) { return false; } if (!EquivalenceUtil.areEqual(this.getParentUUID(), other.getParentUUID())) { return false; } if (!EquivalenceUtil.areEqual(this.getFullName(), other.getFullName())) { return false; } if (!EquivalenceUtil.areEqual(this.getNameInSource(), other.getNameInSource())) { return false; } return true; } /** * Get hashcode for From. WARNING: The hash code relies on the variables in the record, so changing the variables will change * the hash code, causing a select to be lost in a hash structure. Do not hash a record if you plan to change it. */ @Override public int hashCode() { int myHash = 0; myHash = HashCodeUtil.hashCode(myHash, this.recordType); myHash = HashCodeUtil.hashCode(myHash, this.delegate.getFullName()); myHash = HashCodeUtil.hashCode(myHash, this.delegate.getUUID()); myHash = HashCodeUtil.hashCode(myHash, this.delegate.getParentUUID()); myHash = HashCodeUtil.hashCode(myHash, this.delegate.getNameInSource()); return myHash; } }