001/** 002 * Copyright 2005-2017 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.krms.impl.repository; 017 018import org.kuali.rice.krad.data.jpa.PortableSequenceGenerator; 019import org.kuali.rice.krms.api.repository.term.TermDefinition; 020import org.kuali.rice.krms.api.repository.term.TermDefinitionContract; 021import org.kuali.rice.krms.api.repository.term.TermParameterDefinition; 022 023import javax.persistence.CascadeType; 024import javax.persistence.Column; 025import javax.persistence.Entity; 026import javax.persistence.GeneratedValue; 027import javax.persistence.Id; 028import javax.persistence.JoinColumn; 029import javax.persistence.ManyToOne; 030import javax.persistence.OneToMany; 031import javax.persistence.Table; 032import javax.persistence.Transient; 033import javax.persistence.Version; 034import java.io.Serializable; 035import java.util.ArrayList; 036import java.util.HashMap; 037import java.util.List; 038import java.util.Map; 039import java.util.Map.Entry; 040 041@Entity 042@Table(name = "KRMS_TERM_T") 043public class TermBo implements TermDefinitionContract, Serializable { 044 045 private static final long serialVersionUID = 1l; 046 047 public static final String TERM_SEQ_NAME = "KRMS_TERM_S"; 048 049 @PortableSequenceGenerator(name = TERM_SEQ_NAME) @GeneratedValue(generator = TERM_SEQ_NAME) @Id @Column( 050 name = "TERM_ID") 051 private String id; 052 053 @Column(name = "TERM_SPEC_ID") 054 private String specificationId; 055 056 @Column(name = "DESC_TXT") 057 private String description; 058 059 @Version @Column(name = "VER_NBR", length = 8) 060 protected Long versionNumber; 061 062 // new-ing up an empty one allows the TermBo lookup to work on fields in the term specification: 063 @ManyToOne(targetEntity = TermSpecificationBo.class, cascade = {CascadeType.REFRESH}) 064 @JoinColumn(name = "TERM_SPEC_ID", referencedColumnName = "TERM_SPEC_ID", insertable = false, updatable = false) 065 private TermSpecificationBo specification = new TermSpecificationBo(); 066 067 @OneToMany(targetEntity = TermParameterBo.class, orphanRemoval = true, 068 cascade = {CascadeType.REFRESH, CascadeType.MERGE, CascadeType.REMOVE, CascadeType.PERSIST}, 069 mappedBy = "term" 070 ) 071 private List<TermParameterBo> parameters; 072 073 @Transient 074 private Map<String, String> parametersMap = new HashMap<String, String>(); 075 076 /** 077 * Converts a mutable bo to it's immutable counterpart 078 * 079 * @param bo the mutable business object 080 * @return the immutable object 081 */ 082 public static TermDefinition to(TermBo bo) { 083 if (bo == null) { 084 return null; 085 } 086 087 return TermDefinition.Builder.create(bo).build(); 088 } 089 090 /** 091 * Converts a immutable object to it's mutable bo counterpart 092 * 093 * @param im immutable object 094 * @return the mutable bo 095 */ 096 public static TermBo from(TermDefinition im) { 097 if (im == null) { 098 return null; 099 } 100 101 TermBo bo = new TermBo(); 102 bo.id = im.getId(); 103 bo.specificationId = im.getSpecification().getId(); 104 bo.description = im.getDescription(); 105 bo.specification = TermSpecificationBo.from(im.getSpecification()); 106 bo.parameters = new ArrayList<TermParameterBo>(); 107 108 for (TermParameterDefinition parm : im.getParameters()) { 109 TermParameterBo termParmBo = TermParameterBo.from(parm); 110 bo.parameters.add(termParmBo); 111 termParmBo.setTerm(bo); 112 } 113 114 bo.versionNumber = im.getVersionNumber(); 115 116 return bo; 117 } 118 119 public TermSpecificationBo getSpecification() { 120 return specification; 121 } 122 123 public void setSpecification(TermSpecificationBo specification) { 124 this.specification = specification; 125 } 126 127 public List<TermParameterBo> getParameters() { 128 return parameters; 129 } 130 131 public Map<String, String> getParametersMap() { 132 return parametersMap; 133 } 134 135 public void setParameters(List<TermParameterBo> parameters) { 136 this.parameters = parameters; 137 } 138 139 public void exportToParametersMap() { 140 // merge in TermParameterBo values 141 if (parameters != null) { 142 for (TermParameterBo param : parameters) { 143 parametersMap.put(param.getName(), param.getValue()); 144 } 145 } 146 } 147 148 public void importFromParametersMap() { 149 if (parameters == null) { 150 parameters = new ArrayList<TermParameterBo>(); 151 } else { 152 if (parametersMap == null || parametersMap.isEmpty()) { 153 for (TermParameterBo param : parameters) { 154 parametersMap.put(param.getName(), param.getValue()); 155 } 156 } 157 parameters.clear(); 158 } 159 160 for (Entry<String, String> paramEntry : parametersMap.entrySet()) { 161 TermParameterDefinition termDef = TermParameterDefinition.Builder.create(null, id, paramEntry.getKey(), 162 paramEntry.getValue()).build(); 163 parameters.add(TermParameterBo.from(termDef)); 164 } 165 } 166 167 public String getDescription() { 168 return description; 169 } 170 171 public void setDescription(String description) { 172 this.description = description; 173 } 174 175 public String getSpecificationId() { 176 return specificationId; 177 } 178 179 public void setSpecificationId(String specificationId) { 180 this.specificationId = specificationId; 181 } 182 183 public String getId() { 184 return id; 185 } 186 187 public void setId(String id) { 188 this.id = id; 189 } 190 191 public Long getVersionNumber() { 192 return versionNumber; 193 } 194 195 public void setVersionNumber(Long versionNumber) { 196 this.versionNumber = versionNumber; 197 } 198}