private function _setLocation(Product &$product, $param)
 {
     if (isset($param->CallbackParameter->locations) && count($locations = $param->CallbackParameter->locations) > 0) {
         //delete all price first
         $deleteIds = array();
         foreach ($locations as $location) {
             if (trim($location->active) === '0' && isset($location->id)) {
                 $deleteIds[] = trim($location->id);
             }
         }
         if (count($deleteIds) > 0) {
             PreferredLocation::updateByCriteria('active = 0', 'id in (' . str_repeat('?', count($deleteIds)) . ')', $deleteIds);
         }
         //update or create new
         foreach ($locations as $location) {
             if (isset($location->id) && in_array(trim($location->id), $deleteIds)) {
                 continue;
             }
             if (!($type = PreferredLocationType::get(trim($location->typeId))) instanceof PreferredLocationType) {
                 continue;
             }
             $locationName = trim($location->value);
             $locs = Location::getAllByCriteria('name = ?', array($locationName), true, 1, 1);
             $loc = count($locs) > 0 ? $locs[0] : Location::create($locationName, $locationName);
             if (!isset($location->id) || ($id = trim($location->id)) === '') {
                 if (trim($location->active) === '1') {
                     PreferredLocation::create($loc, $product, $type);
                 }
                 //if it's deactivated one, ignore
             } else {
                 if (($preferredLocation = PreferredLocation::get($id)) instanceof PreferredLocation) {
                     $preferredLocation->setLocation($loc)->setActive(trim($location->active) === '1')->setProduct($product)->setType($type)->save();
                 }
             }
         }
     }
     return $this;
 }