/Modelibra/src/org/modelibra/ModelMeta.java

https://github.com/DarioGT/Modelibra-Family · Java · 1499 lines · 975 code · 57 blank · 467 comment · 306 complexity · f00e4767f1ee76dc1b2f6249e0d4c286 MD5 · raw file

  1. /*
  2. * Modelibra
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  5. * use this file except in compliance with the License. You may obtain a copy of
  6. * the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  12. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
  13. * License for the specific language governing permissions and limitations under
  14. * the License.
  15. */
  16. package org.modelibra;
  17. import java.io.Serializable;
  18. import java.lang.reflect.Constructor;
  19. import java.net.URL;
  20. import java.util.ArrayList;
  21. import java.util.Date;
  22. import java.util.List;
  23. import org.apache.commons.logging.Log;
  24. import org.apache.commons.logging.LogFactory;
  25. import org.modelibra.config.CombinationConfig;
  26. import org.modelibra.config.ConceptConfig;
  27. import org.modelibra.config.DomainConfig;
  28. import org.modelibra.config.ModelConfig;
  29. import org.modelibra.config.NeighborConfig;
  30. import org.modelibra.config.NeighborsConfig;
  31. import org.modelibra.config.PropertiesConfig;
  32. import org.modelibra.config.PropertyConfig;
  33. import org.modelibra.exception.ConfigRuntimeException;
  34. import org.modelibra.exception.MetaRuntimeException;
  35. import org.modelibra.exception.TypeRuntimeException;
  36. import org.modelibra.type.Email;
  37. import org.modelibra.type.PropertyClass;
  38. import org.modelibra.type.ValidationType;
  39. import org.modelibra.util.Reflector;
  40. import org.modelibra.util.Transformer;
  41. /**
  42. * Meta handling of model entities.
  43. *
  44. * @author Dzenan Ridjanovic
  45. * @author Vedad Kirlic
  46. * @version 2008-10-28
  47. */
  48. @SuppressWarnings("serial")
  49. public class ModelMeta implements Serializable {
  50. private static Log log = LogFactory.getLog(ModelMeta.class);
  51. private DomainConfig domainConfig;
  52. private IDomain domain;
  53. private IDomainModel model;
  54. /**
  55. * Constructs the model meta object within the given domain configuration.
  56. *
  57. * @param domainConfig
  58. * domain configuration
  59. */
  60. public ModelMeta(DomainConfig domainConfig) {
  61. this.domainConfig = domainConfig;
  62. }
  63. /**
  64. * Constructs the model meta object within the given domain.
  65. *
  66. * @param domain
  67. * domain
  68. */
  69. public ModelMeta(IDomain domain) {
  70. this.domain = domain;
  71. }
  72. /**
  73. * Constructs the model meta object within the given domain model.
  74. *
  75. * @param model
  76. * model
  77. */
  78. public ModelMeta(IDomainModel model) {
  79. this.model = model;
  80. }
  81. /**
  82. * Creates a domain.
  83. *
  84. * @param domainClassName
  85. * domain class name
  86. * @return domain
  87. */
  88. public IDomain createDomain(String domainClassName) {
  89. Class<?> domainClass = Reflector.getClass(domainClassName);
  90. Constructor<?> constructor = Reflector.getConstructor(domainClass,
  91. DomainConfig.class);
  92. Object object = Reflector.getInstance(constructor, domainConfig);
  93. if (object == null) {
  94. domainClassName = "org.modelibra.Domain";
  95. domainClass = Reflector.getClass(domainClassName);
  96. constructor = Reflector.getConstructor(domainClass,
  97. DomainConfig.class);
  98. object = Reflector.getInstance(constructor, domainConfig);
  99. }
  100. domain = (IDomain) object;
  101. if (domain == null) {
  102. String error = "Error in ModelMeta.createDomain: "
  103. + domainClassName;
  104. throw new MetaRuntimeException(error);
  105. }
  106. return domain;
  107. }
  108. /**
  109. * Creates a domain model given a model class (complete) name.
  110. *
  111. * @param domainCode
  112. * domain code
  113. * @param modelClassName
  114. * model class name
  115. * @return model
  116. */
  117. public IDomainModel createModel(String domainCode, String modelClassName) {
  118. IDomainModel model = null;
  119. Class<?> modelClass = Reflector.getClass(modelClassName);
  120. Constructor<?> constructor = Reflector.getConstructor(modelClass,
  121. IDomain.class);
  122. Object object = Reflector.getInstance(constructor, domain);
  123. if (object == null) {
  124. modelClassName = "org.modelibra.Model";
  125. modelClass = Reflector.getClass(modelClassName);
  126. constructor = Reflector.getConstructor(modelClass, IDomain.class);
  127. object = Reflector.getInstance(constructor, domain);
  128. }
  129. model = (IDomainModel) object;
  130. if (model == null) {
  131. String error = "Error in ModelMeta.createModel: " + domainCode
  132. + "." + modelClassName;
  133. throw new MetaRuntimeException(error);
  134. }
  135. return model;
  136. }
  137. /**
  138. * Creates an entity given an entity class (complete) name, and sets default
  139. * values for those properties that have them.
  140. *
  141. * @param entityClassName
  142. * entity class name
  143. * @return entity
  144. */
  145. private IEntity<?> createEntity(String entityClassName) {
  146. IEntity<?> entity = null;
  147. Class<?> entityClass = Reflector.getClass(entityClassName);
  148. Constructor<?> constructor = Reflector.getConstructor(entityClass,
  149. IDomainModel.class);
  150. Object object = Reflector.getInstance(constructor, model);
  151. entity = (IEntity<?>) object;
  152. if (entity != null) {
  153. ConceptConfig conceptConfig = entity.getConceptConfig();
  154. if (conceptConfig != null) {
  155. PropertiesConfig propertiesConfig = conceptConfig
  156. .getPropertiesConfig();
  157. for (PropertyConfig propertyConfig : propertiesConfig) {
  158. if (!propertyConfig.isDerived()
  159. && propertyConfig.getDefaultValue() != null) {
  160. String propertyCode = propertyConfig.getCode();
  161. Object property = entity.getProperty(propertyCode);
  162. setPropertyDefaultValue(entity, propertyConfig,
  163. property);
  164. }
  165. }
  166. }
  167. }
  168. return entity;
  169. }
  170. /**
  171. * Creates an entity given another entity.
  172. *
  173. * @param entity
  174. * entity
  175. * @return created entity
  176. */
  177. public <T extends IEntity<T>> T createEntity(IEntity<T> entity) {
  178. ConceptConfig conceptConfig = entity.getConceptConfig();
  179. String entityClassName = conceptConfig.getEntityClass();
  180. T createdEntity = (T) createEntity(entityClassName);
  181. if (createdEntity == null) {
  182. String modelCode = model.getModelConfig().getCode();
  183. String error = "Error in ModelMeta.createEntity: " + modelCode
  184. + "." + entityClassName;
  185. throw new MetaRuntimeException(error);
  186. }
  187. setParents(createdEntity, entity);
  188. return createdEntity;
  189. }
  190. /**
  191. * Creates an entity given other entities.
  192. *
  193. * @param entities
  194. * entities
  195. * @return created entity
  196. */
  197. public <T extends IEntity<T>> T createEntity(IEntities<T> entities) {
  198. ConceptConfig conceptConfig = entities.getConceptConfig();
  199. String entityClassName = conceptConfig.getEntityClass();
  200. T createdEntity = (T) createEntity(entityClassName);
  201. if (createdEntity == null) {
  202. String modelCode = model.getModelConfig().getCode();
  203. String error = "Error in ModelMeta.createEntity(IEntities: "
  204. + modelCode + "." + entityClassName;
  205. throw new MetaRuntimeException(error);
  206. }
  207. setParents(createdEntity, entities);
  208. return createdEntity;
  209. }
  210. /**
  211. * Creates entities given entities class (complete) name. Parents are not
  212. * set.
  213. *
  214. * @param entitiesClassName
  215. * entities class name
  216. * @return created entities
  217. */
  218. public IEntities createEntities(String entitiesClassName) {
  219. Class<?> entitiesClass = Reflector.getClass(entitiesClassName);
  220. Constructor<?> constructor = Reflector.getConstructor(entitiesClass,
  221. IDomainModel.class);
  222. Object object = Reflector.getInstance(constructor, model);
  223. return (IEntities<?>) object;
  224. }
  225. /**
  226. * Creates entities given an entity.
  227. *
  228. * @param entity
  229. * entity
  230. * @return created entities
  231. */
  232. public <T extends IEntity<T>> IEntities<T> createEntities(IEntity<T> entity) {
  233. ConceptConfig conceptConfig = entity.getConceptConfig();
  234. String entitiesClassName = conceptConfig.getEntitiesClass();
  235. IEntities<T> createdEntities = createEntities(entitiesClassName);
  236. if (createdEntities == null) {
  237. String modelCode = model.getModelConfig().getCode();
  238. String error = "Error in ModelMeta.createEntities: " + modelCode
  239. + "." + entitiesClassName;
  240. throw new MetaRuntimeException(error);
  241. }
  242. setParents(createdEntities, entity);
  243. return createdEntities;
  244. }
  245. /**
  246. * Creates entities given other entities.
  247. *
  248. * @param entities
  249. * other entities
  250. * @return created entities
  251. */
  252. public <T extends IEntities<?>> T createEntities(T entities) {
  253. ConceptConfig conceptConfig = entities.getConceptConfig();
  254. String entitiesClassName = conceptConfig.getEntitiesClass();
  255. T createdEntities = (T) createEntities(entitiesClassName);
  256. if (createdEntities == null) {
  257. String modelCode = model.getModelConfig().getCode();
  258. String error = "Error in ModelMeta.createEntities: " + modelCode
  259. + "." + entitiesClassName;
  260. throw new MetaRuntimeException(error);
  261. }
  262. setParents(createdEntities, entities);
  263. return createdEntities;
  264. }
  265. /**
  266. * Gets the domain model entry given an entity.
  267. *
  268. * @param entity
  269. * entity
  270. * @return entry
  271. */
  272. public IEntities<? extends IEntity<?>> getEntry(
  273. IEntity<? extends IEntity<?>> entity) {
  274. IEntities<? extends IEntity<?>> entry = null;
  275. if (entity.getConceptConfig().isEntry()) {
  276. String entryCode = entity.getConceptConfig().getCode();
  277. entry = model.getEntry(entryCode);
  278. } else {
  279. IEntity<? extends IEntity<?>> parent = getInternalParent(entity);
  280. if (parent != null) {
  281. entry = getEntry(parent);
  282. } else {
  283. String modelCode = model.getModelConfig().getCode();
  284. String conceptCode = entity.getConceptConfig().getCode();
  285. String error = "Error in ModelMeta.getEntry -- the concept is not entry but the entities do not have the internal parent: "
  286. + modelCode + "." + conceptCode;
  287. throw new MetaRuntimeException(error);
  288. }
  289. }
  290. return entry;
  291. }
  292. /**
  293. * Gets the domain model entry given entities.
  294. *
  295. * @param entities
  296. * entities
  297. * @return entry
  298. */
  299. public IEntities<?> getEntry(IEntities<?> entities) {
  300. IEntities<?> entry = null;
  301. if (entities.getConceptConfig().isEntry()) {
  302. String entryCode = entities.getConceptConfig().getCode();
  303. entry = (IEntities<?>) model.getEntry(entryCode);
  304. } else {
  305. IEntity<?> parent = getInternalParent(entities);
  306. if (parent != null) {
  307. entry = getEntry(parent);
  308. } else {
  309. IEntity<?> firstEntity = entities.first();
  310. if (firstEntity != null) {
  311. parent = getInternalParent(firstEntity);
  312. if (parent != null) {
  313. entry = getEntry(parent);
  314. } else {
  315. String modelCode = model.getModelConfig().getCode();
  316. String conceptCode = entities.getConceptConfig()
  317. .getCode();
  318. String error = "Error in ModelMeta.getEntry -- the concept is not entry but the first entity does not have the internal parent: "
  319. + modelCode + "." + conceptCode;
  320. throw new MetaRuntimeException(error);
  321. }
  322. } else {
  323. String modelCode = model.getModelConfig().getCode();
  324. String conceptCode = entities.getConceptConfig().getCode();
  325. String error = "Error in ModelMeta.getEntry -- the concept is not entry but the entities do not have the internal parent: "
  326. + modelCode + "." + conceptCode;
  327. throw new MetaRuntimeException(error);
  328. }
  329. }
  330. }
  331. return entry;
  332. }
  333. /**
  334. * Gets the specific model entities given an entities code.
  335. *
  336. * @param entitiesCode
  337. * entities code
  338. * @return entities
  339. */
  340. public IEntities<?> getSpecificModelEntities(String entitiesCode) {
  341. IEntities<?> entities = null;
  342. if (model != null) {
  343. ConceptConfig conceptConfig = model.getModelConfig()
  344. .getConceptConfig(entitiesCode);
  345. if (conceptConfig != null) {
  346. String getEntitiesMethod = "get" + entitiesCode;
  347. entities = (IEntities<?>) Reflector.executeMethod(model,
  348. getEntitiesMethod);
  349. }
  350. }
  351. return entities;
  352. }
  353. /**
  354. * Sets an entity property.
  355. *
  356. * @param entity
  357. * entity
  358. * @param propertyCode
  359. * property code
  360. * @param propertyValue
  361. * property value
  362. */
  363. public void setProperty(IEntity<?> entity, String propertyCode,
  364. Object propertyValue) {
  365. PropertyConfig propertyConfig = entity.getConceptConfig()
  366. .getPropertyConfig(propertyCode);
  367. setProperty(entity, propertyConfig, propertyValue);
  368. }
  369. /**
  370. * Sets an entity property.
  371. *
  372. * @param entity
  373. * entity
  374. * @param propertyConfig
  375. * property config
  376. * @param propertyValue
  377. * property value
  378. */
  379. public void setProperty(IEntity<?> entity, PropertyConfig propertyConfig,
  380. Object propertyValue) {
  381. if (!propertyConfig.isDerived()) {
  382. String propertyCode = propertyConfig.getCode();
  383. if (propertyValue != null) {
  384. Reflector.setProperty(entity, propertyCode, propertyValue);
  385. } else {
  386. Class<?> propertyClassObject = propertyConfig
  387. .getPropertyClassObject();
  388. Reflector.setPropertyToNull(entity, propertyCode,
  389. propertyClassObject);
  390. }
  391. } else {
  392. String error = "Error in ModelMeta.setProperty -- derived property cannot be set: "
  393. + entity.getConceptConfig().getCode()
  394. + "."
  395. + propertyConfig.getCode();
  396. throw new MetaRuntimeException(error);
  397. }
  398. }
  399. /**
  400. * Gets the entity property given an entity and a property code.
  401. *
  402. * @param entity
  403. * entity
  404. * @param propertyCode
  405. * property code
  406. */
  407. public Object getProperty(IEntity<?> entity, String propertyCode) {
  408. return Reflector.getProperty(entity, propertyCode);
  409. }
  410. /**
  411. * Gets a list of property not null values.
  412. *
  413. * @param entities
  414. * entities
  415. * @param propertyCode
  416. * property code
  417. * @return list of property not null values
  418. */
  419. public List<Object> getPropertyList(IEntities<?> entities,
  420. String propertyCode) {
  421. List<Object> propertyList = new ArrayList<Object>();
  422. synchronized (entities) {
  423. for (IEntity<?> entity : entities) {
  424. Object propertyValue = getProperty(entity, propertyCode);
  425. if (propertyValue != null) {
  426. propertyList.add(propertyValue);
  427. }
  428. }
  429. }
  430. return propertyList;
  431. }
  432. /**
  433. * Sets the entity neighbor given an entity and a neighbor code.
  434. *
  435. * @param entity
  436. * entity
  437. * @param neighborCode
  438. * neighbor code
  439. * @param neighbor
  440. * neighbor object
  441. */
  442. public void setNeighbor(IEntity<?> entity, String neighborCode,
  443. Object neighbor) {
  444. NeighborConfig neighborConfig = entity.getConceptConfig()
  445. .getNeighborConfig(neighborCode);
  446. if (neighbor != null) {
  447. Reflector.setProperty(entity, neighborCode, neighbor);
  448. } else {
  449. String destinationConceptClass = neighborConfig
  450. .getDestinationConceptClass();
  451. if (destinationConceptClass != null) {
  452. Class<?> destinationConceptClassObject = Reflector
  453. .getClass(destinationConceptClass);
  454. Reflector.setPropertyToNull(entity, neighborCode,
  455. destinationConceptClassObject);
  456. }
  457. }
  458. }
  459. /**
  460. * Gets the entity neighbor given an entity and a neighbor code.
  461. *
  462. * @param entity
  463. * entity
  464. * @param neighborCode
  465. * neighbor code
  466. * @return neighbor object
  467. */
  468. public Object getNeighbor(IEntity<?> entity, String neighborCode) {
  469. if (entity.getConceptConfig().getCode().equals("Concept")
  470. && neighborCode.equals("model")) {
  471. // exception in the Concept/Concepts configuration class
  472. neighborCode = "domainModel";
  473. }
  474. return Reflector.getProperty(entity, neighborCode);
  475. }
  476. /**
  477. * Sets the parent neighbor given an entity and a neighbor code.
  478. *
  479. * @param entity
  480. * entity
  481. * @param neighborCode
  482. * neighbor code
  483. * @param neighborEntity
  484. * neighbor entity
  485. */
  486. public void setParentNeighbor(IEntity<?> entity, String neighborCode,
  487. IEntity<?> neighborEntity) {
  488. NeighborConfig neighborConfig = entity.getConceptConfig()
  489. .getNeighborConfig(neighborCode);
  490. if (neighborConfig.getType().equals("parent")
  491. && neighborConfig.getMax().equals("1")) {
  492. if (neighborEntity != null) {
  493. Reflector.setProperty(entity, neighborCode, neighborEntity);
  494. } else {
  495. String destinationConceptClass = neighborConfig
  496. .getDestinationConceptClass();
  497. if (destinationConceptClass != null) {
  498. Class<?> destinationConceptClassObject = Reflector
  499. .getClass(destinationConceptClass);
  500. Reflector.setPropertyToNull(entity, neighborCode,
  501. destinationConceptClassObject);
  502. }
  503. }
  504. }
  505. }
  506. /**
  507. * Gets the parent neighbor given an entity and a neighbor code.
  508. *
  509. * @param entity
  510. * entity
  511. * @param neighborCode
  512. * neighbor code
  513. */
  514. public IEntity<?> getParentNeighbor(IEntity<?> entity, String neighborCode) {
  515. NeighborConfig neighborConfig = entity.getConceptConfig()
  516. .getNeighborConfig(neighborCode);
  517. IEntity<?> neighborValue = null;
  518. if (neighborConfig.getType().equals("parent")
  519. && neighborConfig.getMax().equals("1")) {
  520. if (entity.getConceptConfig().getCode().equals("Concept")
  521. && neighborCode.equals("model")) {
  522. // exception in the Concept/Concepts configuration class
  523. neighborCode = "domainModel";
  524. }
  525. neighborValue = (IEntity<?>) Reflector.getProperty(entity,
  526. neighborCode);
  527. }
  528. return neighborValue;
  529. }
  530. /**
  531. * Sets the child neighbor given an entity and a neighbor code.
  532. *
  533. * @param entity
  534. * entity
  535. * @param neighborCode
  536. * neighbor code
  537. * @param neighborEntities
  538. * neighbor entities
  539. */
  540. public void setChildNeighbor(IEntity<?> entity, String neighborCode,
  541. IEntities<?> neighborEntities) {
  542. NeighborConfig neighborConfig = entity.getConceptConfig()
  543. .getNeighborConfig(neighborCode);
  544. if (neighborConfig.getType().equals("child")) {
  545. setNeighbor(entity, neighborCode, neighborEntities);
  546. }
  547. }
  548. /**
  549. * Gets the child neighbor given an entity and a neighbor code.
  550. *
  551. * @param entity
  552. * entity
  553. * @param neighborCode
  554. * neighbor code
  555. */
  556. public IEntities<?> getChildNeighbor(IEntity<?> entity, String neighborCode) {
  557. NeighborConfig neighborConfig = entity.getConceptConfig()
  558. .getNeighborConfig(neighborCode);
  559. IEntities<?> neighborValue = null;
  560. if (neighborConfig.getType().equals("child")) {
  561. neighborValue = (IEntities<?>) getNeighbor(entity, neighborCode);
  562. }
  563. return neighborValue;
  564. }
  565. /**
  566. * Gets the internal parent given an entity.
  567. *
  568. * @param entity
  569. * entity
  570. */
  571. public IEntity<?> getInternalParent(IEntity<?> entity) {
  572. IEntity<? extends IEntity<?>> parent = null;
  573. ConceptConfig conceptConfig = entity.getConceptConfig();
  574. NeighborsConfig neighborsConfig = conceptConfig.getNeighborsConfig();
  575. for (NeighborConfig neighborConfig : neighborsConfig) {
  576. if (neighborConfig.getType().equals("parent")
  577. && (neighborConfig.isInternal())) {
  578. String methodName;
  579. if (entity.getConceptConfig().getCode().equals("Concept")
  580. && neighborConfig.getCode().equals("model")) {
  581. // exception in the Concept/Concepts configuration class
  582. methodName = "getDomainModel";
  583. } else {
  584. methodName = "get"
  585. + neighborConfig.getCodeWithFirstLetterAsUpper();
  586. }
  587. parent = (IEntity<?>) Reflector.executeMethod(entity,
  588. methodName);
  589. }
  590. }
  591. return parent;
  592. }
  593. /**
  594. * Gets the internal parent given entities.
  595. *
  596. * @param entities
  597. * entities
  598. */
  599. public IEntity<?> getInternalParent(IEntities<?> entities) {
  600. IEntity<? extends IEntity<?>> parent = null;
  601. ConceptConfig conceptConfig = entities.getConceptConfig();
  602. NeighborsConfig neighborsConfig = conceptConfig.getNeighborsConfig();
  603. for (NeighborConfig neighborConfig : neighborsConfig) {
  604. if (neighborConfig.getType().equals("parent")
  605. && (neighborConfig.isInternal())) {
  606. String methodName;
  607. if (entities.getConceptConfig().getCode().equals("Concept")
  608. && neighborConfig.getCode().equals("model")) {
  609. // exception in the Concept/Concepts configuration class
  610. methodName = "getDomainModel";
  611. } else {
  612. methodName = "get"
  613. + neighborConfig.getCodeWithFirstLetterAsUpper();
  614. }
  615. parent = (IEntity<?>) Reflector.executeMethod(entities,
  616. methodName);
  617. }
  618. }
  619. return parent;
  620. }
  621. /**
  622. * Sets parents for destination entities using the parents of source
  623. * entities.
  624. *
  625. * @param destinationEntities
  626. * destination entities
  627. * @param sourceEntities
  628. * source entities
  629. */
  630. public void setParents(IEntities<?> destinationEntities,
  631. IEntities<?> sourceEntities) {
  632. ConceptConfig conceptConfig = sourceEntities.getConceptConfig();
  633. if (conceptConfig != null) {
  634. NeighborsConfig neighborsConfig = conceptConfig
  635. .getNeighborsConfig();
  636. for (NeighborConfig neighborConfig : neighborsConfig) {
  637. if (neighborConfig.isParent()) {
  638. String getParentMethodName = "get"
  639. + neighborConfig.getCodeWithFirstLetterAsUpper();
  640. if (conceptConfig.getCode().equals("Concept")
  641. && neighborConfig.getCode().equals("model")) {
  642. getParentMethodName = "getDomainModel";
  643. }
  644. IEntity<?> entitiesParentEntity = (IEntity<?>) Reflector
  645. .executeMethod(sourceEntities, getParentMethodName);
  646. if (entitiesParentEntity != null) {
  647. String setParentMethodName = "set"
  648. + neighborConfig
  649. .getCodeWithFirstLetterAsUpper();
  650. Reflector.executeMethod(destinationEntities,
  651. setParentMethodName, entitiesParentEntity);
  652. }
  653. }
  654. }
  655. }
  656. }
  657. /**
  658. * Sets parents for an entity using the parents of another entity.
  659. *
  660. * @param entity
  661. * entity
  662. * @param entity2
  663. * another entity
  664. */
  665. public void setParents(IEntity<?> entity, IEntity<?> entity2) {
  666. ConceptConfig conceptConfig = entity.getConceptConfig();
  667. if (conceptConfig != null) {
  668. NeighborsConfig neighborsConfig = conceptConfig
  669. .getNeighborsConfig();
  670. for (NeighborConfig neighborConfig : neighborsConfig) {
  671. if (neighborConfig.isParent()) {
  672. String getParentMethodName = "get"
  673. + neighborConfig.getCodeWithFirstLetterAsUpper();
  674. if (conceptConfig.getCode().equals("Concept")
  675. && neighborConfig.getCode().equals("model")) {
  676. getParentMethodName = "getDomainModel";
  677. }
  678. IEntity<?> entity2ParentEntity = (IEntity<?>) Reflector
  679. .executeMethod(entity2, getParentMethodName);
  680. if (entity2ParentEntity != null) {
  681. IEntity<?> entityParentEntity = (IEntity<?>) Reflector
  682. .executeMethod(entity, getParentMethodName);
  683. if (entityParentEntity == null) {
  684. String setParentMethodName = "set"
  685. + neighborConfig
  686. .getCodeWithFirstLetterAsUpper();
  687. Reflector.executeMethod(entity,
  688. setParentMethodName, entity2ParentEntity);
  689. } else if (!entity2ParentEntity
  690. .equals(entityParentEntity)) {
  691. String setParentMethodName = "set"
  692. + neighborConfig
  693. .getCodeWithFirstLetterAsUpper();
  694. Reflector.executeMethod(entity,
  695. setParentMethodName, entity2ParentEntity);
  696. }
  697. }
  698. }
  699. }
  700. }
  701. }
  702. /**
  703. * Sets parents for an entity using the parents of entities.
  704. *
  705. * @param entity
  706. * entity
  707. * @param entities
  708. * entities
  709. */
  710. public void setParents(IEntity<?> entity, IEntities<?> entities) {
  711. ConceptConfig conceptConfig = entity.getConceptConfig();
  712. if (conceptConfig != null) {
  713. NeighborsConfig neighborsConfig = conceptConfig
  714. .getNeighborsConfig();
  715. for (NeighborConfig neighborConfig : neighborsConfig) {
  716. if (neighborConfig.isParent()) {
  717. String getParentMethodName = "get"
  718. + neighborConfig.getCodeWithFirstLetterAsUpper();
  719. if (conceptConfig.getCode().equals("Concept")
  720. && neighborConfig.getCode().equals("model")) {
  721. getParentMethodName = "getDomainModel";
  722. }
  723. IEntity<?> entitiesParentEntity = (IEntity<?>) Reflector
  724. .executeMethod(entities, getParentMethodName);
  725. if (entitiesParentEntity != null) {
  726. IEntity<?> entityParentEntity = (IEntity<?>) Reflector
  727. .executeMethod(entity, getParentMethodName);
  728. if (entityParentEntity == null) {
  729. String setParentMethodName = "set"
  730. + neighborConfig
  731. .getCodeWithFirstLetterAsUpper();
  732. Reflector.executeMethod(entity,
  733. setParentMethodName, entitiesParentEntity);
  734. } else if ((entities.getSourceEntities() == null)
  735. && (!entitiesParentEntity
  736. .equals(entityParentEntity))) {
  737. String setParentMethodName = "set"
  738. + neighborConfig
  739. .getCodeWithFirstLetterAsUpper();
  740. Reflector.executeMethod(entity,
  741. setParentMethodName, entitiesParentEntity);
  742. }
  743. }
  744. }
  745. }
  746. }
  747. }
  748. /**
  749. * Sets parents for entities using the parents of an entity.
  750. *
  751. * @param entities
  752. * entities
  753. * @param entity
  754. * entity
  755. */
  756. public void setParents(IEntities<?> entities, IEntity<?> entity) {
  757. ConceptConfig conceptConfig = entity.getConceptConfig();
  758. if (conceptConfig != null) {
  759. NeighborsConfig neighborsConfig = conceptConfig
  760. .getNeighborsConfig();
  761. for (NeighborConfig neighborConfig : neighborsConfig) {
  762. if (neighborConfig.getType().equals("parent")) {
  763. String getParentMethodName = "get"
  764. + neighborConfig.getCodeWithFirstLetterAsUpper();
  765. if (conceptConfig.getCode().equals("Concept")
  766. && neighborConfig.getCode().equals("model")) {
  767. getParentMethodName = "getDomainModel";
  768. }
  769. IEntity<?> entityParentEntity = (IEntity<?>) Reflector
  770. .executeMethod(entity, getParentMethodName);
  771. if (entityParentEntity != null) {
  772. IEntity<?> entitiesParentEntity = (IEntity<?>) Reflector
  773. .executeMethod(entities, getParentMethodName);
  774. if (entitiesParentEntity == null) {
  775. String setParentMethodName = "set"
  776. + neighborConfig
  777. .getCodeWithFirstLetterAsUpper();
  778. Reflector.executeMethod(entities,
  779. setParentMethodName, entityParentEntity);
  780. } else if ((entities.getSourceEntities() == null)
  781. && (!entityParentEntity
  782. .equals(entitiesParentEntity))) {
  783. String setParentMethodName = "set"
  784. + neighborConfig
  785. .getCodeWithFirstLetterAsUpper();
  786. Reflector.executeMethod(entities,
  787. setParentMethodName, entityParentEntity);
  788. }
  789. }
  790. }
  791. }
  792. }
  793. }
  794. /**
  795. * Sets external parents for an entity using the parent oid unique numbers
  796. * of another entity.
  797. *
  798. * @param entity
  799. * entity
  800. * @param entity2
  801. * another entity
  802. */
  803. public void setExternalParentsByOids(IEntity<?> entity, IEntity<?> entity2) {
  804. ConceptConfig conceptConfig = entity.getConceptConfig();
  805. if (conceptConfig != null) {
  806. NeighborsConfig neighborsConfig = conceptConfig
  807. .getNeighborsConfig();
  808. for (NeighborConfig neighborConfig : neighborsConfig) {
  809. if (neighborConfig.isExternal() && neighborConfig.isParent()) {
  810. String getParentMethodName = "get"
  811. + neighborConfig.getCodeWithFirstLetterAsUpper()
  812. + "Oid";
  813. Long entity2ParentEntityOid = (Long) Reflector
  814. .executeMethod(entity2, getParentMethodName);
  815. if (entity2ParentEntityOid != null) {
  816. Long entityParentEntityOid = (Long) Reflector
  817. .executeMethod(entity, getParentMethodName);
  818. if (entityParentEntityOid == null) {
  819. String setParentMethodName = "set"
  820. + neighborConfig
  821. .getCodeWithFirstLetterAsUpper()
  822. + "Oid";
  823. Reflector
  824. .executeMethod(entity, setParentMethodName,
  825. entity2ParentEntityOid);
  826. } else if (!entity2ParentEntityOid
  827. .equals(entityParentEntityOid)) {
  828. String setParentMethodName = "set"
  829. + neighborConfig
  830. .getCodeWithFirstLetterAsUpper()
  831. + "Oid";
  832. Reflector
  833. .executeMethod(entity, setParentMethodName,
  834. entity2ParentEntityOid);
  835. }
  836. }
  837. }
  838. }
  839. }
  840. }
  841. /**
  842. * Checks if two entities have equal properties.
  843. *
  844. * @param entity1
  845. * entity1
  846. * @param entity2
  847. * entity2
  848. * @return <code>true</code> if two entities have equal properties
  849. */
  850. public boolean equalProperties(IEntity<?> entity1, IEntity<?> entity2) {
  851. if (entity1 == entity2) {
  852. return true;
  853. } else if (entity1 == null || entity2 == null) {
  854. return false;
  855. }
  856. PropertiesConfig propertiesConfig = entity1.getConceptConfig()
  857. .getPropertiesConfig();
  858. for (PropertyConfig propertyConfig : propertiesConfig) {
  859. String propertyCode = propertyConfig.getCode();
  860. Object entity1Property = entity1.getProperty(propertyCode);
  861. Object entity2Property = entity2.getProperty(propertyCode);
  862. if (entity1Property == null) {
  863. if (entity2Property != null) {
  864. return false;
  865. }
  866. } else if (entity2Property == null) {
  867. return false;
  868. } else if (!entity1Property.equals(entity2Property)) {
  869. return false;
  870. }
  871. }
  872. return true;
  873. }
  874. /**
  875. * Checks if two entities have equal parent neighbors.
  876. *
  877. * @param entity1
  878. * entity1
  879. * @param entity2
  880. * entity2
  881. * @return <code>true</code> if two entities have equal parent neighbors
  882. */
  883. public boolean equalParentNeighbors(IEntity<?> entityLeft,
  884. IEntity<?> entityRight) {
  885. if (entityLeft == entityRight) {
  886. return true;
  887. } else if (entityLeft == null || entityRight == null) {
  888. return false;
  889. }
  890. NeighborsConfig neighborsConfig = entityLeft.getConceptConfig()
  891. .getNeighborsConfig();
  892. for (NeighborConfig neighborConfig : neighborsConfig) {
  893. if (neighborConfig.isParent()) {
  894. String neighborCode = neighborConfig.getCode();
  895. IEntity<?> entityLeftParentNeighbor = entityLeft
  896. .getParentNeighbor(neighborCode);
  897. IEntity<?> entityRightParentNeighbor = entityRight
  898. .getParentNeighbor(neighborCode);
  899. if (entityLeftParentNeighbor == null) {
  900. if (entityRightParentNeighbor != null) {
  901. return false;
  902. }
  903. } else if (entityRightParentNeighbor == null) {
  904. return false;
  905. } else if (!entityLeftParentNeighbor
  906. .equals(entityRightParentNeighbor)) {
  907. return false;
  908. }
  909. }
  910. }
  911. return true;
  912. }
  913. /**
  914. * Checks if two entities have equal child neighbors.
  915. *
  916. * @param entity1
  917. * entity1
  918. * @param entity2
  919. * entity2
  920. * @return <code>true</code> if two entities have equal child neighbors
  921. */
  922. public boolean equalChildNeighbors(IEntity<?> entityLeft,
  923. IEntity<?> entityRight) {
  924. if (entityLeft == entityRight) {
  925. return true;
  926. } else if (entityLeft == null || entityRight == null) {
  927. return false;
  928. }
  929. NeighborsConfig neighborsConfig = entityLeft.getConceptConfig()
  930. .getNeighborsConfig();
  931. for (NeighborConfig neighborConfig : neighborsConfig) {
  932. if (neighborConfig.isChild()) {
  933. String neighborCode = neighborConfig.getCode();
  934. IEntities<?> entityLeftChildNeighbor = entityLeft
  935. .getChildNeighbor(neighborCode);
  936. IEntities<?> entityRightChildNeighbor = entityRight
  937. .getChildNeighbor(neighborCode);
  938. if (!entityLeftChildNeighbor.equals(entityRightChildNeighbor)) {
  939. return false;
  940. }
  941. }
  942. }
  943. return true;
  944. }
  945. /**
  946. * Updates properties and neighbors of the entity1 with the entity2.
  947. *
  948. * @param entity1
  949. * entity1
  950. * @param entity2
  951. * entity2
  952. * @return <code>true</code> if the entity1 is updated with the entity2
  953. */
  954. public boolean update(IEntity<?> entity1, IEntity<?> entity2) {
  955. return update(entity1, entity2, true);
  956. }
  957. /**
  958. * Updates properties and neighbors of the entity1 with the entity2.
  959. *
  960. * @param entity1
  961. * entity1
  962. * @param entity2
  963. * entity2
  964. * @param updateSensitive
  965. * <code>true</code> if the sensitive information will be updated
  966. * @return <code>true</code> if the entity1 is updated with the entity2
  967. */
  968. public boolean update(IEntity<?> entity1, IEntity<?> entity2,
  969. boolean updateSensitive) {
  970. boolean updated = updateProperties(entity1, entity2, updateSensitive);
  971. if (updated) {
  972. updated = updateNeighbors(entity1, entity2);
  973. }
  974. return updated;
  975. }
  976. /**
  977. * Updates entity1 properties with entity2 properties of the entity1 with
  978. * the entity2.
  979. *
  980. * @param entity1
  981. * entity1
  982. * @param entity2
  983. * entity2
  984. * @return <code>true</code> if the update is successful
  985. */
  986. public boolean updateProperties(IEntity<?> entity1, IEntity<?> entity2) {
  987. return updateProperties(entity1, entity2, true);
  988. }
  989. /**
  990. * Updates entity1 properties with entity2 properties.
  991. *
  992. * @param entity1
  993. * entity1
  994. * @param entity2
  995. * entity2
  996. * @param updateSensitive
  997. * <code>true</code> if the sensitive properties will be updated
  998. * @return <code>true</code> if the update is successful
  999. */
  1000. public boolean updateProperties(IEntity<?> entity1, IEntity<?> entity2,
  1001. boolean updateSensitive) {
  1002. // oid cannot be updated
  1003. PropertiesConfig propertiesConfig = entity1.getConceptConfig()
  1004. .getPropertiesConfig();
  1005. for (PropertyConfig propertyConfig : propertiesConfig) {
  1006. if (propertyConfig.isDerived()) {
  1007. continue;
  1008. }
  1009. if (updateSensitive || !propertyConfig.isSensitive()) {
  1010. String getMethodName = "get"
  1011. + propertyConfig.getCodeWithFirstLetterAsUpper();
  1012. String setMethodName = "set"
  1013. + propertyConfig.getCodeWithFirstLetterAsUpper();
  1014. Object entity1Property = Reflector.executeMethod(entity1,
  1015. getMethodName);
  1016. Object entity2Property = Reflector.executeMethod(entity2,
  1017. getMethodName);
  1018. if (entity1Property == null && entity2Property == null) {
  1019. // no property update
  1020. } else if (entity1Property != null && entity2Property == null) {
  1021. Class<?> paramClass = propertyConfig
  1022. .getPropertyClassObject();
  1023. Reflector.executeMethodWithNull(entity1, setMethodName,
  1024. paramClass);
  1025. } else if (entity1Property == null && entity2Property != null) {
  1026. Reflector.executeMethod(entity1, setMethodName,
  1027. entity2Property);
  1028. } else if (entity1Property != null && entity2Property != null
  1029. && !entity1Property.equals(entity2Property)) {
  1030. Reflector.executeMethod(entity1, setMethodName,
  1031. entity2Property);
  1032. }
  1033. }
  1034. }
  1035. return true;
  1036. }
  1037. /**
  1038. * Updates entity1 neighbors with entity2 neighbors.
  1039. *
  1040. * @param entity1
  1041. * entity1
  1042. * @param entity2
  1043. * entity2
  1044. * @return <code>true</code> if the update is successful
  1045. */
  1046. public boolean updateNeighbors(IEntity<?> entity1, IEntity<?> entity2) {
  1047. boolean updated = updateParentNeighbors(entity1, entity2);
  1048. if (updated) {
  1049. updated = updateChildNeighbors(entity1, entity2);
  1050. }
  1051. return updated;
  1052. }
  1053. /**
  1054. * Updates entity1 parent neighbors with entity2 parent neighbors.
  1055. *
  1056. * @param entity1
  1057. * entity1
  1058. * @param entity2
  1059. * entity2
  1060. * @return <code>true</code> if the update is successful
  1061. */
  1062. public boolean updateParentNeighbors(IEntity<?> entity1, IEntity<?> entity2) {
  1063. NeighborsConfig neighborsConfig = entity1.getConceptConfig()
  1064. .getNeighborsConfig();
  1065. for (NeighborConfig neighborConfig : neighborsConfig) {
  1066. if (neighborConfig.isParent()) {
  1067. String getMethodName = "get"
  1068. + neighborConfig.getCodeWithFirstLetterAsUpper();
  1069. String setMethodName = "set"
  1070. + neighborConfig.getCodeWithFirstLetterAsUpper();
  1071. IEntity<?> entity1Parent = (IEntity<?>) Reflector
  1072. .executeMethod(entity1, getMethodName);
  1073. IEntity<?> entity2Parent = (IEntity<?>) Reflector
  1074. .executeMethod(entity2, getMethodName);
  1075. if (entity1Parent == null && entity2Parent == null) {
  1076. // no neighbor update
  1077. } else if (entity1Parent != null && entity2Parent == null) {
  1078. String destination = neighborConfig.getDestinationConcept();
  1079. ModelConfig modelConfig = neighborConfig.getConceptConfig()
  1080. .getModelConfig();
  1081. ConceptConfig neighborConcept = modelConfig
  1082. .getConceptConfig(destination);
  1083. Class<?> paramClass = Reflector.getClass(neighborConcept
  1084. .getEntityClass());
  1085. Reflector.executeMethodWithNull(entity1, setMethodName,
  1086. paramClass);
  1087. } else if (entity1Parent == null && entity2Parent != null) {
  1088. Reflector.executeMethod(entity1, setMethodName,
  1089. entity2Parent);
  1090. } else if (entity1Parent != null && entity2Parent != null
  1091. && !entity1Parent.equals(entity2Parent)) {
  1092. Reflector.executeMethod(entity1, setMethodName,
  1093. entity2Parent);
  1094. }
  1095. }
  1096. }
  1097. return true;
  1098. }
  1099. /**
  1100. * Updates entity1 child neighbors with entity2 child neighbors.
  1101. *
  1102. * @param entity1
  1103. * entity1
  1104. * @param entity2
  1105. * entity2
  1106. * @return <code>true</code> if the update is successful
  1107. */
  1108. public boolean updateChildNeighbors(IEntity<?> entity1, IEntity<?> entity2) {
  1109. NeighborsConfig neighborsConfig = entity1.getConceptConfig()
  1110. .getNeighborsConfig();
  1111. for (NeighborConfig neighborConfig : neighborsConfig) {
  1112. if (neighborConfig.isChild()) {
  1113. String getMethodName = "get"
  1114. + neighborConfig.getCodeWithFirstLetterAsUpper();
  1115. String setMethodName = "set"
  1116. + neighborConfig.getCodeWithFirstLetterAsUpper();
  1117. IEntities<?> entity1Child = (IEntities<?>) Reflector
  1118. .executeMethod(entity1, getMethodName);
  1119. IEntities<?> entity2Child = (IEntities<?>) Reflector
  1120. .executeMethod(entity2, getMethodName);
  1121. if (entity1Child != entity2Child) {
  1122. Reflector.executeMethod(entity1, setMethodName,
  1123. entity2Child);
  1124. }
  1125. }
  1126. }
  1127. return true;
  1128. }
  1129. /**
  1130. * Checks if a string property length is within the maximal limit.
  1131. *
  1132. * @param entities
  1133. * entities
  1134. * @param entity
  1135. * entity
  1136. * @param propertyConfig
  1137. * property configuration
  1138. * @param property
  1139. * property
  1140. * @return <code>true</code> if the property length is valid
  1141. */
  1142. public boolean validMaxLength(IEntities<?> entities, IEntity<?> entity,
  1143. PropertyConfig propertyConfig, Object property) {
  1144. boolean validMaxLength = true;
  1145. int propertyMaxLength = propertyConfig.getMaxLengthInt();
  1146. if (propertyMaxLength > 0) {
  1147. if (property != null) {
  1148. if (propertyConfig.getPropertyClass().equals(
  1149. PropertyClass.getString())) {
  1150. String propertyValue = (String) property;
  1151. if (propertyValue.length() > propertyMaxLength) {
  1152. validMaxLength = false;
  1153. addPropertyMaxLengthError(entities, entity,
  1154. propertyConfig);
  1155. }
  1156. }
  1157. }
  1158. }
  1159. return validMaxLength;
  1160. }
  1161. /**
  1162. * Adds a property maximal length error.
  1163. *
  1164. * @param entities
  1165. * entities
  1166. * @param entity
  1167. * entity
  1168. * @param propertyConfig
  1169. * property configuration
  1170. */
  1171. public void addPropertyMaxLengthError(IEntities<?> entities,
  1172. IEntity<?> entity, PropertyConfig propertyConfig) {
  1173. String propertyCode = propertyConfig.getCode();
  1174. String propertyName = propertyConfig.getPropertyName();
  1175. String errorKey = entity.getConceptConfig().getCode() + "."
  1176. + propertyCode + "." + "length";
  1177. String error = "Property " + entity.getConceptConfig().getCode() + "."
  1178. + propertyCode + " (" + propertyName + ")" + " is longer than "
  1179. + propertyConfig.getMaxLengthInt() + ".";
  1180. entities.getErrors().add(errorKey, error);
  1181. }
  1182. /**
  1183. * Adds a property configuration error with respect to the validation type.
  1184. *
  1185. * @param entities
  1186. * entities
  1187. * @param entity
  1188. * entity
  1189. * @param propertyConfig
  1190. * property configuration
  1191. */
  1192. public void addPropertyConfigError(IEntities<?> entities,
  1193. IEntity<?> entity, PropertyConfig propertyConfig) {
  1194. String propertyCode = propertyConfig.getCode();
  1195. String propertyName = propertyConfig.getPropertyName();
  1196. String errorKey = entity.getConceptConfig().getCode() + "."
  1197. + propertyCode + "." + "validation";
  1198. String error = "Property " + entity.getConceptConfig().getCode() + "."
  1199. + propertyCode + " (" + propertyName + ")"
  1200. + " could not be validated since the property class is not "
  1201. + PropertyClass.getString() + ".";
  1202. entities.getErrors().add(errorKey, error);
  1203. }
  1204. /**
  1205. * Adds a validation type error.
  1206. *
  1207. * @param entities
  1208. * entities
  1209. * @param entity
  1210. * entity
  1211. * @param propertyConfig
  1212. * property configuration
  1213. */
  1214. public void addValidationTypeError(IEntities<?> entities,
  1215. IEntity<?> entity, PropertyConfig propertyConfig) {
  1216. String propertyCode = propertyConfig.getCode();
  1217. String propertyName = propertyConfig.getPropertyName();
  1218. String validationType = propertyConfig.getValidationType();
  1219. String errorKey = entity.getConceptConfig().getCode() + "."
  1220. + propertyCode + "." + "validation";
  1221. String error = "Property " + entity.getConceptConfig().getCode() + "."
  1222. + propertyCode + " (" + propertyName + ")"
  1223. + " could not be validated since the " + validationType
  1224. + " validation type is not valid.";
  1225. entities.getErrors().add(errorKey, error);
  1226. }
  1227. /**
  1228. * Adds a property type error.
  1229. *
  1230. * @param entities
  1231. * entities
  1232. * @param entity
  1233. * entity
  1234. * @param propertyConfig
  1235. * property configuration
  1236. */
  1237. public void addPropertyTypeError(IEntities<?> entities, IEntity<?> entity,
  1238. PropertyConfig propertyConfig) {
  1239. String propertyCode = propertyConfig.getCode();
  1240. String propertyName = propertyConfig.getPropertyName();
  1241. String validationType = propertyConfig.getValidationType();
  1242. String errorKey = entity.getConceptConfig().getCode() + "."
  1243. + propertyCode + "." + "validation";
  1244. String error = "Property " + entity.getConceptConfig().getCode() + "."
  1245. + propertyCode + " (" + propertyName + ")"
  1246. + " is not valid based on the " + validationType
  1247. + " validation type.";
  1248. entities.getErrors().add(errorKey, error);
  1249. }
  1250. /**
  1251. * Adds a required property error.
  1252. *
  1253. * @param entities
  1254. * entities
  1255. * @param entity
  1256. * entity
  1257. * @param propertyConfig
  1258. * property configuration
  1259. */
  1260. public void addRequiredPropertyError(IEntities<?> entities,
  1261. IEntity<?> entity, PropertyConfig propertyConfig) {
  1262. String propertyCode = propertyConfig.getCode();
  1263. String propertyName = propertyConfig.getPropertyName();
  1264. String errorKey = entity.getConceptConfig().getCode() + "."
  1265. + propertyCode + "." + "required";
  1266. String error = "Property " + entity.getConceptConfig().getCode() + "."
  1267. + propertyCode + " (" + propertyName + ")" + " is required.";
  1268. entities.getErrors().add(errorKey, error);
  1269. }
  1270. /**
  1271. * Adds a unique entity error.
  1272. *
  1273. * @param entities
  1274. * entities
  1275. * @param entity
  1276. * entity
  1277. */
  1278. public void addUniqueEntityError(IEntities<?> entities, IEntity<?> entity) {
  1279. String errorKey = entity.getConceptConfig().getCode() + "."
  1280. + "id.unique";
  1281. CombinationConfig idConfig = entity.getConceptConfig()
  1282. .getUniqueConfig();
  1283. String error = entity.getConceptConfig().getCode() + ".id "
  1284. + idConfig.getCodes() + " must be unique.";
  1285. entities.getErrors().add(errorKey, error);
  1286. }
  1287. /**
  1288. * Checks if a property validation type (not a property class) is valid.
  1289. * Used to validate a property value in addition to its class.
  1290. *
  1291. * @param entities
  1292. * entities
  1293. * @param entity
  1294. * entity
  1295. * @param propertyConfig
  1296. * property configuration
  1297. * @param property
  1298. * property
  1299. * @return <code>true</code> if the property validation type is valid
  1300. */
  1301. public boolean validPropertyType(IEntities<?> entities, IEntity<?> entity,
  1302. PropertyConfig propertyConfig, Object property) {
  1303. boolean validProperty = true;
  1304. if (propertyConfig.isValidateType()) {
  1305. String validationType = propertyConfig.getValidationType();
  1306. if (propertyConfig.isValidateClassType()) {
  1307. if (validationType.equals(ValidationType.getUrl())) {
  1308. String propertyValue = (String) property;
  1309. try {
  1310. Transformer.url(propertyValue);
  1311. } catch (TypeRuntimeException e) {
  1312. validProperty = false;
  1313. addPropertyTypeError(entities, entity, propertyConfig);
  1314. }
  1315. } else if (validationType.equals(ValidationType.getEmail())) {
  1316. String propertyValue = (String) property;
  1317. try {
  1318. Transformer.email(propertyValue);
  1319. } catch (TypeRuntimeException e) {
  1320. validProperty = false;
  1321. addPropertyTypeError(entities, entity, propertyConfig);
  1322. }
  1323. }
  1324. } else {
  1325. Entities<?> validationTypeEntities = (Entities<?>) model
  1326. .getEntry(validationType);
  1327. if (validationTypeEntities == null) {
  1328. IDomainModel referenceModel = model.getDomain()
  1329. .getReferenceModel();
  1330. if (referenceModel != null) {
  1331. if (referenceModel != model) {
  1332. validationTypeEntities = (Entities<?>) referenceModel
  1333. .getEntry(validationType);
  1334. }
  1335. } else {
  1336. String msg = "ModelMeta.validPropertyType -- domain does not have the reference model: "
  1337. + model.getDomain().getDomainConfig().getCode();
  1338. throw new ConfigRuntimeException(msg);
  1339. }
  1340. }
  1341. if (validationTypeEntities != null) {
  1342. String propertyValue = Transformer.string(property);
  1343. if (!validationTypeEntities.containCode(propertyValue)) {
  1344. validProperty = false;
  1345. addPropertyTypeError(entities, entity, propertyConfig);
  1346. }
  1347. } else {
  1348. addValidationTypeError(entities, entity, propertyConfig);
  1349. }
  1350. }
  1351. } // if (propertyConfig.isValidateType()) {
  1352. return validProperty;
  1353. }
  1354. /**
  1355. * Checks if a property has a default value and if it does, replaces null
  1356. * with the default value.
  1357. *
  1358. * @param entity
  1359. * entity
  1360. * @param propertyConfig
  1361. * property configuration
  1362. * @param property
  1363. * property
  1364. * @return <code>true</code> if the property is null and the property has a
  1365. * default value, sets the property default value
  1366. */
  1367. public boolean setPropertyDefaultValue(IEntity<?> entity,
  1368. PropertyConfig propertyConfig, Object property) {
  1369. boolean defaultValue = true;
  1370. try {
  1371. if (property == null) {
  1372. if (propertyConfig.getPropertyClass().equals(
  1373. PropertyClass.getDate())
  1374. && propertyConfig.getDefaultValue().equals("today")) {
  1375. Date propertyDefaultValue = new Date();
  1376. setProperty(entity, propertyConfig, propertyDefaultValue);
  1377. } else if (propertyConfig.getPropertyClass().equals(
  1378. PropertyClass.getDate())
  1379. && propertyConfig.getDefaultValue() != null
  1380. && !propertyConfig.getDefaultValue().equals("")) {
  1381. String propertyDefaultTextValue = propertyConfig
  1382. .getDefaultValue();
  1383. Date propertyDefaultValue = Transformer
  1384. .date(propertyDefaultTextValue);
  1385. if (propertyDefaultValue != null) {
  1386. setProperty(entity, propertyConfig,
  1387. propertyDefaultValue);
  1388. } else {
  1389. defaultValue = false;
  1390. }
  1391. } else if (propertyConfig.getPropertyClass().equals(
  1392. PropertyClass.getBoolean())
  1393. && propertyConfig.getDefaultValue() != null
  1394. && !propertyConfig.getDefaultValue().equals("")) {
  1395. String propertyDefaultTextValue = propertyConfig
  1396. .getDefaultValue();
  1397. Boolean propertyDefaultValue = Transformer
  1398. .logic(propertyDefaultTextValue);
  1399. if (propertyDefaultValue != null) {
  1400. setProperty(entity, propertyConfig,
  1401. propertyDefaultValue);
  1402. } else {
  1403. defaultValue = false;
  1404. }
  1405. } else if (propertyConfig.getPropertyClass().equals(
  1406. PropertyClass.getString())
  1407. && propertyConfig.getDefaultValue() != null
  1408. && !propertyConfig.getDefaultValue().equals("")) {
  1409. String propertyDefaultValue = propertyConfig
  1410. .getDefaultValue();
  1411. setProperty(entity, propertyConfig, propertyDefaultValue);
  1412. } else if (propertyConfig.getPropertyClass().equals(
  1413. PropertyClass.getInteger())
  1414. && propertyConfig.getDefaultValue() != null
  1415. && !propertyConfig.getDefaultValue().equals("")) {
  1416. String propertyDefaultTextValue = propertyConfig
  1417. .getDefaultValue();
  1418. Integer propertyDefaultValue = Transformer
  1419. .integer(propertyDefaultTextValue);
  1420. if (propertyDefaultValue != null) {
  1421. setProperty(entity, propertyConfig,
  1422. propertyDefaultValue);
  1423. } else {
  1424. defaultValue = false;
  1425. }
  1426. } else if (propertyConfig.getPropertyClass().equals(
  1427. PropertyClass.getLong())
  1428. && propertyConfig.getDefaultValue() != null
  1429. && !propertyConfig.getDefaultValue().equals("")) {
  1430. String propertyDefaultTextValue = propertyConfig
  1431. .getDefaultValue();
  1432. Long propertyDefaultValue = Transformer
  1433. .longInteger(propertyDefaultTextValue);
  1434. if (propertyDefaultValue != null) {
  1435. setProperty(entity, propertyConfig,
  1436. propertyDefaultValue);
  1437. } else {
  1438. defaultValue = false;
  1439. }
  1440. } else if (propertyConfig.getPropertyClass().equals(
  1441. PropertyClass.getFloat())
  1442. && propertyConfig.getDefaultValue() !=