001/** 002 * Copyright 2005-2016 The Kuali Foundation 003 * 004 * Licensed under the Educational Community License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.opensource.org/licenses/ecl2.php 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016package org.kuali.rice.krad.data.metadata.impl; 017 018import java.util.Collections; 019import java.util.List; 020 021import org.apache.commons.lang.StringUtils; 022import org.kuali.rice.krad.data.metadata.DataObjectAttributeRelationship; 023import org.kuali.rice.krad.data.metadata.MetadataChild; 024 025/** 026 * {@inheritDoc} 027 */ 028public abstract class MetadataChildBase extends MetadataCommonBase implements MetadataChild { 029 private static final long serialVersionUID = 2244738385101424133L; 030 031 protected MetadataChild embeddedMetadataChild; 032 033 protected Class<?> relatedType; 034 protected List<DataObjectAttributeRelationship> attributeRelationships; 035 protected MetadataChild inverseRelationship; 036 037 protected Boolean savedWithParent; 038 protected Boolean deletedWithParent; 039 protected Boolean loadedAtParentLoadTime; 040 protected Boolean loadedDynamicallyUponUse; 041 042 /** 043 * {@inheritDoc} 044 */ 045 @Override 046 public boolean isSavedWithParent() { 047 if (savedWithParent != null) { 048 return savedWithParent; 049 } 050 if (embeddedMetadataChild != null) { 051 return embeddedMetadataChild.isSavedWithParent(); 052 } 053 return false; 054 } 055 056 public void setSavedWithParent(boolean savedWithParent) { 057 this.savedWithParent = savedWithParent; 058 } 059 060 /** 061 * {@inheritDoc} 062 */ 063 @Override 064 public boolean isDeletedWithParent() { 065 if (deletedWithParent != null) { 066 return deletedWithParent; 067 } 068 if (embeddedMetadataChild != null) { 069 return embeddedMetadataChild.isDeletedWithParent(); 070 } 071 return false; 072 } 073 074 public void setDeletedWithParent(boolean deletedWithParent) { 075 this.deletedWithParent = deletedWithParent; 076 } 077 078 /** 079 * {@inheritDoc} 080 */ 081 @Override 082 public boolean isLoadedAtParentLoadTime() { 083 if (loadedAtParentLoadTime != null) { 084 return loadedAtParentLoadTime; 085 } 086 if (embeddedMetadataChild != null) { 087 return embeddedMetadataChild.isLoadedAtParentLoadTime(); 088 } 089 return false; 090 } 091 092 public void setLoadedAtParentLoadTime(boolean loadedAtParentLoadTime) { 093 this.loadedAtParentLoadTime = loadedAtParentLoadTime; 094 } 095 096 /** 097 * {@inheritDoc} 098 */ 099 @Override 100 public boolean isLoadedDynamicallyUponUse() { 101 if (loadedDynamicallyUponUse != null) { 102 return loadedDynamicallyUponUse; 103 } 104 if (embeddedMetadataChild != null) { 105 return embeddedMetadataChild.isLoadedDynamicallyUponUse(); 106 } 107 return false; 108 } 109 110 public void setLoadedDynamicallyUponUse(boolean loadedDynamicallyUponUse) { 111 this.loadedDynamicallyUponUse = loadedDynamicallyUponUse; 112 } 113 114 /** 115 * {@inheritDoc} 116 */ 117 @Override 118 public List<DataObjectAttributeRelationship> getAttributeRelationships() { 119 if (attributeRelationships != null) { 120 return Collections.unmodifiableList(attributeRelationships); 121 } 122 if (embeddedMetadataChild != null) { 123 return embeddedMetadataChild.getAttributeRelationships(); 124 } 125 return Collections.emptyList(); 126 } 127 128 public void setAttributeRelationships(List<DataObjectAttributeRelationship> attributeRelationships) { 129 this.attributeRelationships = attributeRelationships; 130 } 131 132 /** 133 * {@inheritDoc} 134 */ 135 @Override 136 public MetadataChild getInverseRelationship() { 137 if (inverseRelationship != null) { 138 return inverseRelationship; 139 } 140 if (embeddedMetadataChild != null) { 141 return embeddedMetadataChild.getInverseRelationship(); 142 } 143 return null; 144 } 145 146 public void setInverseRelationship(MetadataChild inverseRelationship) { 147 this.inverseRelationship = inverseRelationship; 148 } 149 150 /** 151 * {@inheritDoc} 152 */ 153 @Override 154 public String getParentAttributeNameRelatedToChildAttributeName(String childAttribute) { 155 for(DataObjectAttributeRelationship dataObjectAttributeRelationship : attributeRelationships){ 156 if(StringUtils.equals(dataObjectAttributeRelationship.getChildAttributeName(),childAttribute)){ 157 return dataObjectAttributeRelationship.getParentAttributeName(); 158 } 159 } 160 return null; 161 } 162 163 /** 164 * {@inheritDoc} 165 */ 166 @Override 167 public String toString() { 168 StringBuilder builder = new StringBuilder(); 169 builder.append(this.getClass().getSimpleName()).append(" ["); 170 builder.append("name=").append(getName()).append(", "); 171 builder.append("relatedType=").append(getRelatedType()).append(", "); 172 builder.append("attributes=").append(getAttributeRelationships()).append(", "); 173 builder.append("backingObjectName=").append(getBackingObjectName()).append(", "); 174 builder.append("readOnly=").append(isReadOnly()); 175 builder.append(", savedWithParent="); 176 builder.append(savedWithParent); 177 builder.append(", deletedWithParent="); 178 builder.append(deletedWithParent); 179 builder.append(", loadedAtParentLoadTime="); 180 builder.append(loadedAtParentLoadTime); 181 builder.append(", loadedDynamicallyUponUse="); 182 builder.append(loadedDynamicallyUponUse); 183 if (embeddedMetadataChild != null) { 184 builder.append(", embedded=").append(embeddedMetadataChild); 185 } 186 builder.append("]"); 187 return builder.toString(); 188 } 189 190 /** 191 * {@inheritDoc} 192 */ 193 @Override 194 public Class<?> getRelatedType() { 195 return relatedType; 196 } 197 198 public void setRelatedType(Class<?> relatedType) { 199 this.relatedType = relatedType; 200 } 201 202 /** 203 * Gets the metadata from the child 204 * 205 * @return embedded metadata 206 */ 207 public MetadataChild getEmbeddedMetadataChild() { 208 return embeddedMetadataChild; 209 } 210 211 public void setEmbeddedMetadataChild(MetadataChild embeddedMetadataChild) { 212 this.embeddedMetadataChild = embeddedMetadataChild; 213 setEmbeddedCommonMetadata(embeddedMetadataChild); 214 } 215 216}