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']->fatal("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 require_once("data/Relationships/M2MRelationship.php");
98 return new M2MRelationship($def);
101 require_once("data/Relationships/One2MBeanRelationship.php");
102 if (empty($def['true_relationship_type'])){
103 return new One2MBeanRelationship($def);
106 return new One2MRelationship($def);
110 if (empty($def['true_relationship_type'])){
111 require_once("data/Relationships/One2OneBeanRelationship.php");
112 return new One2OneBeanRelationship($def);
115 require_once("data/Relationships/One2OneRelationship.php");
116 return new One2OneRelationship($def);
121 $GLOBALS['log']->fatal ("$relationshipName had an unknown type $type ");
126 protected function loadRelationships()
128 if(sugar_is_file($this->getCacheFile()))
130 include($this->getCacheFile());
131 $this->relationships = $relationships;
133 $this->buildRelationshipCache();
137 protected function buildRelationshipCache()
139 global $beanList, $dictionary;
140 include_once("modules/TableDictionary.php");
142 //Reload ALL the module vardefs....
143 foreach($beanList as $moduleName => $beanName)
145 VardefManager::loadVardef($moduleName, $beanName);
148 $relationships = array();
150 //Grab all the relationships from the dictionary.
151 foreach ($dictionary as $key => $def)
153 if (!empty($def['relationships']))
155 foreach($def['relationships'] as $relKey => $relDef)
157 if ($key == $relKey) //Relationship only entry, we need to capture everything
158 $relationships[$key] = array_merge(array('name' => $key), $def, $relDef);
160 $relationships[$relKey] = array_merge(array('name' => $relKey), $relDef);
161 if(!empty($relationships[$relKey]['join_table']) && empty($relationships[$relKey]['fields'])
162 && isset($dictionary[$relationships[$relKey]['join_table']]['fields'])) {
163 $relationships[$relKey]['fields'] = $dictionary[$relationships[$relKey]['join_table']]['fields'];
170 sugar_mkdir(dirname($this->getCacheFile()), null, true);
171 $out="<?php \n \$relationships=" . var_export($relationships, true) .";";
172 sugar_file_put_contents($this->getCacheFile(), $out);
174 $this->relationships = $relationships;
177 protected function getCacheFile() {
178 return "{$GLOBALS['sugar_config']['cache_dir']}Relationships/relationships.cache.php";