2 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
3 /*********************************************************************************
4 * SugarCRM Community Edition is a customer relationship management program developed by
5 * SugarCRM, Inc. Copyright (C) 2004-2011 SugarCRM Inc.
7 * This program is free software; you can redistribute it and/or modify it under
8 * the terms of the GNU Affero General Public License version 3 as published by the
9 * Free Software Foundation with the addition of the following permission added
10 * to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED WORK
11 * IN WHICH THE COPYRIGHT IS OWNED BY SUGARCRM, SUGARCRM DISCLAIMS THE WARRANTY
12 * OF NON INFRINGEMENT OF THIRD PARTY RIGHTS.
14 * This program is distributed in the hope that it will be useful, but WITHOUT
15 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
16 * FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
19 * You should have received a copy of the GNU Affero General Public License along with
20 * this program; if not, see http://www.gnu.org/licenses or write to the Free
21 * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
24 * You can contact SugarCRM, Inc. headquarters at 10050 North Wolfe Road,
25 * SW2-130, Cupertino, CA 95014, USA. or at email address contact@sugarcrm.com.
27 * The interactive user interfaces in modified source and object code versions
28 * of this program must display Appropriate Legal Notices, as required under
29 * Section 5 of the GNU Affero General Public License version 3.
31 * In accordance with Section 7(b) of the GNU Affero General Public License version 3,
32 * these Appropriate Legal Notices must retain the display of the "Powered by
33 * SugarCRM" logo. If the display of the logo is not reasonably feasible for
34 * technical reasons, the Appropriate Legal Notices must display the words
35 * "Powered by SugarCRM".
36 ********************************************************************************/
40 require_once("data/Relationships/SugarRelationship.php");
42 class SugarRelationshipFactory {
45 protected $relationships;
47 protected function __construct(){
48 //Load the relationship definitions from the cache.
49 $this->loadRelationships();
54 * @return SugarRelationshipFactory
56 public static function getInstance()
58 if (is_null(self::$rfInstance))
59 self::$rfInstance = new SugarRelationshipFactory();
60 return self::$rfInstance;
63 public static function rebuildCache()
65 self::getInstance()->buildRelationshipCache();
68 public static function deleteCache()
70 $file = self::getInstance()->getCacheFile();
71 if(sugar_is_file($file))
78 * @param $relationshipName String name of relationship to load
84 public function getRelationship($relationshipName)
86 if (empty($this->relationships[$relationshipName])) {
87 $GLOBALS['log']->error("Unable to find relationship $relationshipName");
91 $def = $this->relationships[$relationshipName];
93 $type = isset($def['true_relationship_type']) ? $def['true_relationship_type'] : $def['relationship_type'];
97 if (isset($def['rhs_module']) && $def['rhs_module'] == 'EmailAddresses')
99 require_once("data/Relationships/EmailAddressRelationship.php");
100 return new EmailAddressRelationship($def);
102 require_once("data/Relationships/M2MRelationship.php");
103 return new M2MRelationship($def);
106 require_once("data/Relationships/One2MBeanRelationship.php");
107 //If a relationship has no table or join keys, it must be bean based
108 if (empty($def['true_relationship_type']) || (empty($def['table']) && empty($def['join_table'])) || empty($def['join_key_rhs'])){
109 return new One2MBeanRelationship($def);
112 return new One2MRelationship($def);
116 if (empty($def['true_relationship_type'])){
117 require_once("data/Relationships/One2OneBeanRelationship.php");
118 return new One2OneBeanRelationship($def);
121 require_once("data/Relationships/One2OneRelationship.php");
122 return new One2OneRelationship($def);
127 $GLOBALS['log']->fatal ("$relationshipName had an unknown type $type ");
132 public function getRelationshipDef($relationshipName)
134 if (empty($this->relationships[$relationshipName])) {
135 $GLOBALS['log']->error("Unable to find relationship $relationshipName");
139 return $this->relationships[$relationshipName];
143 protected function loadRelationships()
145 if(sugar_is_file($this->getCacheFile()))
147 include($this->getCacheFile());
148 $this->relationships = $relationships;
150 $this->buildRelationshipCache();
154 protected function buildRelationshipCache()
156 global $beanList, $dictionary, $buildingRelCache;
157 if ($buildingRelCache)
159 $buildingRelCache = true;
160 include_once("modules/TableDictionary.php");
162 if (empty($beanList))
163 include("include/modules.php");
164 //Reload ALL the module vardefs....
165 foreach($beanList as $moduleName => $beanName)
167 VardefManager::loadVardef($moduleName, BeanFactory::getObjectName($moduleName));
170 $relationships = array();
172 //Grab all the relationships from the dictionary.
173 foreach ($dictionary as $key => $def)
175 if (!empty($def['relationships']))
177 foreach($def['relationships'] as $relKey => $relDef)
179 if ($key == $relKey) //Relationship only entry, we need to capture everything
180 $relationships[$key] = array_merge(array('name' => $key), $def, $relDef);
182 $relationships[$relKey] = array_merge(array('name' => $relKey), $relDef);
183 if(!empty($relationships[$relKey]['join_table']) && empty($relationships[$relKey]['fields'])
184 && isset($dictionary[$relationships[$relKey]['join_table']]['fields'])) {
185 $relationships[$relKey]['fields'] = $dictionary[$relationships[$relKey]['join_table']]['fields'];
192 sugar_mkdir(dirname($this->getCacheFile()), null, true);
193 $out="<?php \n \$relationships=" . var_export($relationships, true) .";";
194 sugar_file_put_contents($this->getCacheFile(), $out);
196 $this->relationships = $relationships;
197 $buildingRelCache = false;
200 protected function getCacheFile() {
201 return "{$GLOBALS['sugar_config']['cache_dir']}Relationships/relationships.cache.php";