INFRA-132 - CRM/Case - phpcbf
[civicrm-core.git] / CRM / Case / XMLRepository.php
index 61a504b062ea0546c971a168e2fc95a4ab47bae5..0be96d708bf9c6ff888ccbd6aad8dd9d02e39253 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 /*
  +--------------------------------------------------------------------+
- | CiviCRM version 4.5                                                |
+ | CiviCRM version 4.6                                                |
  +--------------------------------------------------------------------+
  | Copyright CiviCRM LLC (c) 2004-2014                                |
  +--------------------------------------------------------------------+
@@ -81,76 +81,118 @@ class CRM_Case_XMLRepository {
     $definition = CRM_Core_DAO::getFieldValue('CRM_Case_DAO_CaseType', $caseType, 'definition', 'name');
 
     if (!empty($definition)) {
-      return simplexml_load_string($definition);
+      list ($xml, $error) = CRM_Utils_XML::parseString($definition);
+      if (!$xml) {
+        throw new CRM_Core_Exception("Failed to parse CaseType XML: $error");
+      }
+      return $xml;
     }
 
-    $caseType = CRM_Case_XMLProcessor::mungeCaseType($caseType);
+    // TODO In 4.6 or 5.0, remove support for weird machine-names
+    //if (!CRM_Case_BAO_CaseType::isValidName($caseType)) {
+    //  // perhaps caller provider a the label instead of the name?
+    //  throw new CRM_Core_Exception("Cannot load caseType with malformed name [$caseType]");
+    //}
 
     if (!CRM_Utils_Array::value($caseType, $this->xml)) {
-      // first check custom templates directory
-      $fileName = NULL;
-
-      if (!$fileName || !file_exists($fileName)) {
-        $caseTypesViaHook = $this->getCaseTypesViaHook();
-        if (isset($caseTypesViaHook[$caseType], $caseTypesViaHook[$caseType]['file'])) {
-          $fileName = $caseTypesViaHook[$caseType]['file'];
-        }
+      $fileXml = $this->retrieveFile($caseType);
+      if ($fileXml) {
+        $this->xml[$caseType] = $fileXml;
+      } else {
+        return FALSE;
       }
+    }
+    return $this->xml[$caseType];
+  }
 
-      if (!$fileName || !file_exists($fileName)) {
-        $config = CRM_Core_Config::singleton();
-        if (isset($config->customTemplateDir) && $config->customTemplateDir) {
-          // check if the file exists in the custom templates directory
-          $fileName = implode(DIRECTORY_SEPARATOR,
-            array(
-              $config->customTemplateDir,
-              'CRM',
-              'Case',
-              'xml',
-              'configuration',
-              "$caseType.xml",
-            )
-          );
-        }
-      }
+  /**
+   * @param string $caseType
+   * @return SimpleXMLElement|FALSE
+   */
+  public function retrieveFile($caseType) {
+    $fileName = NULL;
+    $fileXml = NULL;
 
-      if (!$fileName || !file_exists($fileName)) {
-        if (!file_exists($fileName)) {
-          // check if file exists locally
-          $fileName = implode(DIRECTORY_SEPARATOR,
-            array(
-              dirname(__FILE__),
-              'xml',
-              'configuration',
-              "$caseType.xml",
-            )
-          );
-        }
-
-        if (!file_exists($fileName)) {
-          // check if file exists locally
-          $fileName = implode(DIRECTORY_SEPARATOR,
-            array(
-              dirname(__FILE__),
-              'xml',
-              'configuration.sample',
-              "$caseType.xml",
-            )
-          );
-        }
-
-        if (!file_exists($fileName)) {
-          return FALSE;
-        }
-      }
+    if (CRM_Case_BAO_CaseType::isValidName($caseType)) {
+      // Search for a file based directly on the $caseType name
+      $fileName = $this->findXmlFile($caseType);
+    }
+
+    // For backward compatibility, also search for double-munged file names
+    // TODO In 4.6 or 5.0, remove support for loading double-munged file names
+    if (!$fileName || !file_exists($fileName)) {
+      $fileName = $this->findXmlFile(CRM_Case_XMLProcessor::mungeCaseType($caseType));
+    }
 
+    if ($fileName && file_exists($fileName)) {
       // read xml file
       $dom = new DomDocument();
       $dom->load($fileName);
       $dom->xinclude();
-      $this->xml[$caseType] = simplexml_import_dom($dom);
+      $fileXml = simplexml_import_dom($dom);
     }
-    return $this->xml[$caseType];
+
+    return $fileXml;
+  }
+
+  /**
+   * @param string $caseType
+   * @return null|string file path
+   */
+  public function findXmlFile($caseType) {
+    // first check custom templates directory
+    $fileName = NULL;
+
+    if (!$fileName || !file_exists($fileName)) {
+      $caseTypesViaHook = $this->getCaseTypesViaHook();
+      if (isset($caseTypesViaHook[$caseType], $caseTypesViaHook[$caseType]['file'])) {
+        $fileName = $caseTypesViaHook[$caseType]['file'];
+      }
+    }
+
+    if (!$fileName || !file_exists($fileName)) {
+      $config = CRM_Core_Config::singleton();
+      if (isset($config->customTemplateDir) && $config->customTemplateDir) {
+        // check if the file exists in the custom templates directory
+        $fileName = implode(DIRECTORY_SEPARATOR,
+          array(
+            $config->customTemplateDir,
+            'CRM',
+            'Case',
+            'xml',
+            'configuration',
+            "$caseType.xml",
+          )
+        );
+      }
+    }
+
+    if (!$fileName || !file_exists($fileName)) {
+      if (!file_exists($fileName)) {
+        // check if file exists locally
+        $fileName = implode(DIRECTORY_SEPARATOR,
+          array(
+            dirname(__FILE__),
+            'xml',
+            'configuration',
+            "$caseType.xml",
+          )
+        );
+      }
+
+      if (!file_exists($fileName)) {
+        // check if file exists locally
+        $fileName = implode(DIRECTORY_SEPARATOR,
+          array(
+            dirname(__FILE__),
+            'xml',
+            'configuration.sample',
+            "$caseType.xml",
+          )
+        );
+      }
+    }
+    return file_exists($fileName) ? $fileName : NULL;
   }
 
   /**
@@ -213,10 +255,11 @@ class CRM_Case_XMLRepository {
    * Determine the number of times a particular activity-type is
    * referenced in CiviCase XML.
    *
-   * @param string $activityType symbolic-name of an activity type
+   * @param string $activityType
+   *   Symbolic-name of an activity type.
    * @return int
    */
-  function getActivityReferenceCount($activityType) {
+  public function getActivityReferenceCount($activityType) {
     $p = new CRM_Case_XMLProcessor_Process();
     $count = 0;
     foreach ($this->getAllCaseTypes() as $caseTypeName) {
@@ -232,10 +275,11 @@ class CRM_Case_XMLRepository {
    * Determine the number of times a particular activity-type is
    * referenced in CiviCase XML.
    *
-   * @param string $relationshipTypeName symbolic-name of a relationship-type
+   * @param string $relationshipTypeName
+   *   Symbolic-name of a relationship-type.
    * @return int
    */
-  function getRelationshipReferenceCount($relationshipTypeName) {
+  public function getRelationshipReferenceCount($relationshipTypeName) {
     $p = new CRM_Case_XMLProcessor_Process();
     $count = 0;
     foreach ($this->getAllCaseTypes() as $caseTypeName) {