function xoonips_admin_maintenance_item_delete_item($iid)
{
    $factory = new XooNIpsLogicFactory();
    $remove_item_logic =& $factory->create('removeItem');
    $vars = array($_SESSION['XNPSID'], $iid, 'item_id');
    $response = new XooNIpsResponse();
    $remove_item_logic->execute($vars, $response);
    return $response->getResult();
}
 function doAction()
 {
     $factory =& XooNIpsLogicFactory::getInstance();
     $logic =& $factory->create($this->_get_logic_name());
     if (!is_object($logic)) {
         $this->_response->setResult(false);
         $this->_error->add(XNPERR_SERVER_ERROR, "can't create a logic:" . $this->_get_logic_name());
         return;
     }
     $logic->execute($this->_params, $this->_response);
 }
 /**
  * load and execute xoonips logic.
  *
  * @param[in] XooNIpsXmlRpcRequest $request
  * @param[out] XooNIpsXmlRpcResponse $response
  *  result of logic(success/fault, response, error)
  */
 function execute(&$request, &$response)
 {
     // load logic instance
     $factory =& XooNIpsLogicFactory::getInstance();
     $logic =& $factory->create($request->getMethodName());
     if (!is_object($logic)) {
         $response->setResult(false);
         $error =& $response->getError();
         $logic = $request->getMethodName();
         $error->add(XNPERR_SERVER_ERROR, "can't create a logic of {$logic}");
         return;
     }
     // execute logic
     $params =& $request->getParams();
     $xoonips_response = new XooNIpsResponse();
     if (count($params) < 2) {
         $response->setResult(false);
         $error =& $response->getError();
         $error->add(XNPERR_MISSING_PARAM);
         return false;
     } else {
         if (count($params) > 2) {
             $response->setResult(false);
             $error =& $response->getError();
             $error->add(XNPERR_EXTRA_PARAM);
             return false;
         }
     }
     $vars = array();
     $vars[0] = $params[0];
     $vars[1] = $params[1];
     $logic->execute($vars, $xoonips_response);
     //
     $response->setResult($xoonips_response->getResult());
     $response->setError($xoonips_response->getError());
     if ($xoonips_response->getResult()) {
         $result = array();
         foreach ($xoonips_response->getSuccess() as $index_compo) {
             $result[] = $this->convertIndexObjectToIndexStructure($index_compo, $response);
         }
         $response->setSuccess($result);
     }
 }
 /**
  * load and execute xoonips logic.
  *
  * @param[in] XooNIpsXmlRpcRequest $request
  * @param[out] XooNIpsXmlRpcResponse $response
  *  result of logic(success/fault, response, error)
  */
 function execute(&$request, &$response)
 {
     // load logic instance
     $factory =& XooNIpsLogicFactory::getInstance();
     $logic =& $factory->create($request->getMethodName());
     if (!is_object($logic)) {
         $response->setResult(false);
         $error =& $response->getError();
         $logic = $request->getMethodName();
         $error->add(XNPERR_SERVER_ERROR, "can't create a logic of {$logic}");
         return;
     }
     // execute logic
     $params =& $request->getParams();
     $xoonips_response = new XooNIpsResponse();
     if (count($params) < 3) {
         $response->setResult(false);
         $error =& $response->getError();
         $error->add(XNPERR_MISSING_PARAM);
         return false;
     } else {
         if (count($params) > 3) {
             $response->setResult(false);
             $error =& $response->getError();
             $error->add(XNPERR_EXTRA_PARAM);
             return false;
         }
     }
     $vars = array();
     $vars[0] = $params[0];
     $unicode =& xoonips_getutility('unicode');
     $vars[1] = array();
     foreach ($params[1] as $key => $val) {
         $vars[1][$key] = $unicode->decode_utf8($val, xoonips_get_server_charset(), 'h');
     }
     $vars[2] = $params[2];
     $logic->execute($vars, $xoonips_response);
     //
     $response->setResult($xoonips_response->getResult());
     $response->setError($xoonips_response->getError());
     $response->setSuccess($xoonips_response->getSuccess());
 }
 /**
  * load and execute xoonips logic. see [xoonips:00025]
  *
  * @param[in] XooNIpsXmlRpcRequest $request
  * @param[out] XooNIpsXmlRpcResponse $response result of logic(success/fault, response, error)
  */
 function execute(&$request, &$response)
 {
     // load logic instance
     $factory =& XooNIpsLogicFactory::getInstance();
     $logic =& $factory->create($request->getMethodName());
     if (!is_object($logic)) {
         $response->setResult(false);
         $error =& $response->getError();
         $logic = $request->getMethodName();
         $error->add(XNPERR_SERVER_ERROR, "can't create a logic of {$logic}");
         return;
     }
     // execute logic
     $vars =& $request->getParams();
     $xoonips_response = new XooNIpsResponse();
     $logic->execute($vars, $xoonips_response);
     //
     $response->setResult($xoonips_response->getResult());
     $response->setError($xoonips_response->getError());
     $response->setSuccess($xoonips_response->getSuccess());
 }
 /**
  *
  * @param[in] XooNIpsXmlRpcRequest $request
  * @param[out] XooNIpsXmlRpcResponse $response
  *  result of logic(success/fault, response, error)
  */
 function execute(&$request, &$response)
 {
     // load logic instance
     $factory =& XooNIpsLogicFactory::getInstance();
     $logic =& $factory->create($request->getMethodName());
     if (!is_object($logic)) {
         $response->setResult(false);
         $error =& $response->getError();
         $logic = $request->getMethodName();
         $error->add(XNPERR_SERVER_ERROR, "can't create a logic of {$logic}");
         return;
     }
     //
     $params =& $request->getParams();
     $vars = array();
     if (count($params) < 4) {
         $response->setResult(false);
         $error =& $response->getError();
         $error->add(XNPERR_MISSING_PARAM);
         return false;
     } else {
         if (count($params) > 4) {
             $response->setResult(false);
             $error =& $response->getError();
             $error->add(XNPERR_EXTRA_PARAM);
             return false;
         }
     }
     //
     // parameter 1(sessionid)
     $vars[0] = $params[0];
     //
     // transform array to object
     // parameter 2(item structure) to XooNIpsItemCompo object
     // using XooNIpsTransformCompo<itemtype>
     $item_type_id = intval($params[1]['itemtype']);
     $itemtype_handler =& xoonips_getormhandler('xoonips', 'item_type');
     $itemtype =& $itemtype_handler->get($item_type_id);
     if (!$itemtype) {
         $response->setResult(false);
         $response->setError(new XooNIpsError(XNPERR_INVALID_PARAM, "item type of {$item_type_id} is not found"));
         return false;
     }
     //
     $factory =& XooNIpsXmlRpcTransformCompoFactory::getInstance();
     $trans =& $factory->create($itemtype->get('name'));
     $missing = array();
     if (!$trans->isFilledRequired($params[1], $missing)) {
         $response->setResult(false);
         $err =& $response->getError();
         foreach ($missing as $m) {
             $err->add(XNPERR_INCOMPLETE_PARAM, $m);
         }
         return false;
     }
     // check mulitple of each variable
     $fields = array();
     if (!$trans->checkMultipleFields($params[1], $fields)) {
         $response->setResult(false);
         $err =& $response->getError();
         foreach ($fields as $m) {
             $err->add(XNPERR_INCOMPLETE_PARAM, $m);
         }
         return false;
     }
     // check fields
     if (!$trans->checkFields($params[1], $response->getError())) {
         // some fields have invalid value
         return false;
     }
     // transform array to item object, and set it to $vars.
     $vars[1] = $trans->getObject($params[1]);
     // transform array to object
     // parameter 3(file structure) to XooNIpsFile object
     // using XooNIpsTransformFile
     // and write file data to temporary file
     $factory =& XooNIpsXmlRpcTransformFactory::getInstance();
     $trans =& $factory->create('xoonips', 'file');
     if (is_array($params[2])) {
         $vars[2] = array();
         foreach ($params[2] as $p) {
             $fileobj = $trans->getObject($p);
             if (!$fileobj) {
                 $response->setResult(false);
                 $response->setError(new XooNIpsError(XNPERR_INVALID_PARAM, "can't get file from XML"));
                 return false;
             }
             $tmpfile = tempnam("/tmp", "FOO");
             $h = fopen($tmpfile, "wb");
             if ($h) {
                 $len = fwrite($h, $p['data']);
                 fclose($h);
             }
             if (!$h || $len != strlen($p['data'])) {
                 $response->setResult(false);
                 $response->setError(new XooNIpsError(XNPERR_SERVER_ERROR, "can't write to file {$tmpfile}"));
                 return false;
             }
             $fileobj->setFilepath($tmpfile);
             $vars[2][] = $fileobj;
         }
     }
     // parameter 4(array of remove file id)
     $vars[3] = $params[3];
     // execute logic
     $xoonips_response = new XooNIpsResponse();
     $logic->execute($vars, $xoonips_response);
     //
     $response->setResult($xoonips_response->getResult());
     $response->setError($xoonips_response->getError());
     $response->setSuccess($xoonips_response->getSuccess());
 }
function xoonips_delete_item($item_id)
{
    $params = array(session_id(), $item_id, 'item_id');
    $response = new XooNIpsResponse();
    $factory =& XooNIpsLogicFactory::getInstance();
    $logic =& $factory->create('removeItem');
    $logic->execute($params, $response);
    if ($response->getResult()) {
        redirect_header(XOOPS_URL . '/', 3, "Succeed");
    } else {
        redirect_header(XOOPS_URL . '/', 3, "ERROR");
    }
}
 /**
  *
  * @param[in] XooNIpsXmlRpcRequest $request
  * @param[out] XooNIpsXmlRpcResponse $response result of logic(success/fault, response, error)
  */
 function execute(&$request, &$response)
 {
     // load logic instance
     $factory =& XooNIpsLogicFactory::getInstance();
     $logic =& $factory->create($request->getMethodName());
     if (!is_object($logic)) {
         $response->setResult(false);
         $error =& $response->getError();
         $logic = $request->getMethodName();
         $error->add(XNPERR_SERVER_ERROR, "can't create a logic of {$logic}");
         return;
     }
     //
     $params =& $request->getParams();
     $vars = array();
     if (count($params) < 2) {
         $response->setResult(false);
         $error =& $response->getError();
         $error->add(XNPERR_MISSING_PARAM);
         return false;
     } else {
         if (count($params) > 2) {
             $response->setResult(false);
             $error =& $response->getError();
             $error->add(XNPERR_EXTRA_PARAM);
             return false;
         }
     }
     //
     // parameter 1(sessionid)
     $vars[0] = $params[0];
     //
     // transform array to object
     // parameter 2(item structure) to XooNIpsItemCompo object
     // using XooNIpsTransformCompo<itemtype>
     $item_type_id = intval($params[1]['itemtype']);
     $itemtype_handler =& xoonips_getormhandler('xoonips', 'item_type');
     $itemtype =& $itemtype_handler->get($item_type_id);
     if (!$itemtype) {
         $response->setResult(false);
         $response->setError(new XooNIpsError(XNPERR_INVALID_PARAM, "item type of {$item_type_id} is not found"));
         return false;
     }
     //
     $factory =& XooNIpsXmlRpcTransformCompoFactory::getInstance();
     $trans =& $factory->create($itemtype->get('name'));
     $missing = array();
     if (!$trans->isFilledRequired($params[1], $missing)) {
         $response->setResult(false);
         $err =& $response->getError();
         foreach ($missing as $m) {
             $err->add(XNPERR_INCOMPLETE_PARAM, $m);
         }
         return false;
     }
     // check mulitple of each variable
     $fields = array();
     if (!$trans->checkMultipleFields($params[1], $fields)) {
         $response->setResult(false);
         $err =& $response->getError();
         foreach ($fields as $m) {
             $err->add(XNPERR_INCOMPLETE_PARAM, $m);
         }
         return false;
     }
     // check fields
     if (!$trans->checkFields($params[1], $response->getError())) {
         // some fields have invalid value
         return false;
     }
     // transform array to item object, and set it to $vars.
     $vars[1] = $trans->getObject($params[1]);
     // execute logic
     $xoonips_response = new XooNIpsResponse();
     $logic->execute($vars, $xoonips_response);
     //
     $response->setResult($xoonips_response->getResult());
     $response->setError($xoonips_response->getError());
     $response->setSuccess($xoonips_response->getSuccess());
 }
 /**
  *
  * @param[in] XooNIpsXmlRpcRequest $request
  * @param[out] XooNIpsXmlRpcResponse $response result of logic(success/fault, response, error)
  */
 function execute(&$request, &$response)
 {
     $error =& $response->getError();
     // load logic instance
     $factory =& XooNIpsLogicFactory::getInstance();
     $logic =& $factory->create($request->getMethodName());
     if (!is_object($logic)) {
         $response->setResult(false);
         $error =& $response->getError();
         $logic = $request->getMethodName();
         $error->add(XNPERR_SERVER_ERROR, "can't create a logic of {$logic}");
         return false;
     }
     //
     $params =& $request->getParams();
     $vars = array();
     if (count($params) < 5) {
         $response->setResult(false);
         $error->add(XNPERR_MISSING_PARAM);
         return false;
     } else {
         if (count($params) > 5) {
             $response->setResult(false);
             $error->add(XNPERR_EXTRA_PARAM);
             return false;
         }
     }
     //
     // parameter 1(sessionid)
     $vars[0] = $params[0];
     //
     // parameter 2(itemid)
     $unicode =& xoonips_getutility('unicode');
     $vars[1] = $unicode->decode_utf8($params[1], xoonips_get_server_charset(), 'h');
     //
     // parameter 3(id_type)
     $vars[2] = $params[2];
     //
     // parameter 4(fieldName)
     $vars[3] = $params[3];
     //
     //
     // transform array to object
     // parameter 5(file structure) to XooNIpsFile object
     // using XooNIpsTransformFile
     // and write file data to temporary file
     $factory =& XooNIpsXmlRpcTransformFactory::getInstance();
     $trans =& $factory->create('xoonips', 'file');
     $fileobj = $trans->getObject($params[4]);
     if (!$fileobj) {
         $response->setResult(false);
         $error->add(XNPERR_INVALID_PARAM, 'can not get file from parameter #5');
         return false;
     }
     $tmpfile = tempnam("/tmp", "FOO");
     $h = fopen($tmpfile, "wb");
     if ($h) {
         $len = fwrite($h, $params[4]['data']);
         fclose($h);
     }
     if (!$h || $len != strlen($params[4]['data'])) {
         $response->setResult(false);
         $error->add(XNPERR_SERVER_ERROR, "can't write to file {$tmpfile}");
         return false;
     }
     $fileobj->setFilepath($tmpfile);
     $vars[4] = $fileobj;
     // execute logic
     $xoonips_response = new XooNIpsResponse();
     $logic->execute($vars, $xoonips_response);
     //
     $response->setResult($xoonips_response->getResult());
     $response->setError($xoonips_response->getError());
     $response->setSuccess($xoonips_response->getSuccess());
 }
 function doAction()
 {
     global $xoopsUser;
     include_once dirname(dirname(__DIR__)) . '/include/imexport.php';
     $filetype = $this->_formdata->getValue('post', 'filetype', 's', false);
     $remotefile = $this->_formdata->getValue('post', 'remotefile', 's', false);
     $zipfile = $this->_formdata->getFile('zipfile', false);
     if ($filetype == 'localfile' && (empty($zipfile['name']) || $zipfile['size'] == 0) || $filetype == 'remotefile' && empty($remotefile)) {
         redirect_header('import.php?action=default', 3, _MD_XOONIPS_IMPORT_FILE_NOT_SPECIFIED);
         exit;
     }
     //set path of import file
     if ($filetype == 'localfile') {
         $uploadfile = $this->_move_upload_file($zipfile['tmp_name']);
     } else {
         $uploadfile = $remotefile;
     }
     if (!file_exists($uploadfile)) {
         redirect_header('import.php?action=default', 3, _MD_XOONIPS_IMPORT_FILE_NOT_FOUND);
         exit;
     }
     if ($this->_is_index_xml_in_import_file($uploadfile)) {
         $this->_read_index_tree($uploadfile, $this->_formdata->getValue('post', 'error_check_only', 's', false), $this->_get_xoonips_checked_index_ids($this->_formdata->getValue('post', 'xoonipsCheckedXID', 's', false)));
         return;
     }
     $this->_params[] = $uploadfile;
     $this->_params[] = $this->_get_xoonips_checked_index_ids($this->_formdata->getValue('post', 'xoonipsCheckedXID', 's', false));
     $factory =& XooNIpsLogicFactory::getInstance();
     $logic =& $factory->create('importReadFile');
     $logic->execute($this->_params, $this->_response);
     @unlink($uploadfile);
     $success =& $this->_response->getSuccess();
     if (!$this->_response->getResult() || $this->_import_item_have_errors($success['import_items'])) {
         $this->_view_params['result'] = false;
         $success = $this->_response->getSuccess();
         $this->_view_params['import_items'] = $success['import_items'];
         $this->_view_params['uname'] = $xoopsUser->getVar('uname');
         $this->_view_params['filename'] = $filetype == 'localfile' ? $zipfile['name'] : $remotefile;
         $this->_view_params['errors'] = array();
         foreach ($success['import_items'] as $item) {
             foreach (array_unique($item->getErrorCodes()) as $code) {
                 $this->_view_params['errors'][] = array('code' => $code, 'extra' => $item->getPseudoId());
             }
         }
         $this->_view_name = "import_log";
         return;
     }
     $handler =& xoonips_gethandler('xoonips', 'import_item');
     $handler->setCertifyAutoOption($success['import_items'], !is_null($this->_formdata->getValue('post', 'certify_auto', 's', false)));
     $collection = new XooNIpsImportItemCollection();
     //
     // check conflict below
     //
     $this->_params = array($success['import_items']);
     $factory =& XooNIpsLogicFactory::getInstance();
     $logic =& $factory->create('importCheckConflict');
     $logic->execute($this->_params, $this->_response);
     $success =& $this->_response->getSuccess();
     $this->_set_errors_to_import_items($success['import_items']);
     if (!is_null($this->_formdata->getValue('post', 'error_check_only', 's', false)) || $this->_import_item_have_errors($success['import_items']) || !$this->_response->getResult()) {
         $this->_view_params['result'] = $this->_response->getResult() && !$this->_import_item_have_errors($success['import_items']);
         $this->_view_params['uname'] = $xoopsUser->getVar('uname');
         $this->_view_params['filename'] = $filetype == 'localfile' ? $zipfile['name'] : $remotefile;
         $this->_view_params['import_items'] = $success['import_items'];
         $this->_view_params['errors'] = array();
         foreach ($success['import_items'] as $item) {
             foreach (array_unique($item->getErrorCodes()) as $code) {
                 $this->_view_params['errors'][] = array('code' => $code, 'extra' => $item->getPseudoId());
             }
         }
         $this->_view_name = 'import_log';
         return;
     } else {
         if ($success['is_conflict']) {
             $this->_view_params['import_items'] = $success['import_items'];
             $this->_view_name = 'import_conflict';
         } else {
             // importCheckImport logic
             $this->_params = array($success['import_items'], $xoopsUser->getVar('uid'), false);
             $factory =& XooNIpsLogicFactory::getInstance();
             $logic =& $factory->create('importCheckImport');
             $logic->execute($this->_params, $this->_response);
             $success =& $this->_response->getSuccess();
             if ($success['private_item_number_limit_over'] || $success['private_item_storage_limit_over']) {
                 if ($success['private_item_number_limit_over']) {
                     $collection->addError('Private item number limit exceeds.');
                 } else {
                     if ($success['private_item_storage_limit_over']) {
                         $collection->addError('Too large file of item to import.');
                     }
                 }
                 $this->_view_params['result'] = false;
                 $this->_view_params['uname'] = $xoopsUser->getVar('uname');
                 $this->_view_params['filename'] = $filetype == 'localfile' ? $zipfile['name'] : $remotefile;
                 $this->_view_params['errors'] = array();
                 $this->_view_params['import_items'] = $success['import_items'];
                 foreach ($success['import_items'] as $item) {
                     foreach (array_unique($item->getErrorCodes()) as $code) {
                         $this->_view_params['errors'][] = array('code' => $code, 'extra' => $item->getPseudoId());
                     }
                 }
                 foreach ($collection->getErrors() as $err) {
                     $this->_view_params['errors'][] = array('extra' => $err);
                 }
                 $this->_view_name = 'import_log';
             } else {
                 $this->_view_params['ticket_html'] = $GLOBALS['xoopsGTicket']->getTicketHtml(__LINE__, 600, 'import');
                 $this->_view_name = 'import_confirm';
             }
         }
     }
     foreach ($success['import_items'] as $i) {
         $collection->addItem($i);
     }
     $collection->setLoggingOption(!is_null($this->_formdata->getValue('post', 'logging', 's', false)));
     if ($filetype == 'localfile') {
         $collection->setImportFileName($zipfile['name']);
     } else {
         $collection->setImportFileName($remotefile);
     }
     $sess_handler =& xoonips_getormhandler('xoonips', 'session');
     $sess =& $sess_handler->get(session_id());
     $session = unserialize($sess->get('sess_data'));
     $session['xoonips_import_items'] = base64_encode(gzcompress(serialize($collection)));
     $sess->set('sess_data', serialize($session));
     $sess_handler->insert($sess);
 }
 /**
  * execute searchItem
  *
  * @param[in]  $vars[0] session ID
  * @param[in]  $vars[1] query string
  * @param[in]  $vars[2] offset of the first row to return (The offset of the initial row is 0)
  * @param[in]  $vars[3] maximum number of rows to return (0:all rows)
  * @param[in]  $vars[4] sort key('title'|'ext_id'|'last_modified_date'|'registration_date'|'creation_date')
  * @param[in]  $vars[5] sort order('asc'|'desc')
  * @param[out] $response->result true:success, false:failed
  * @param[out] $response->error  error information
  * @param[out] $response->success['count'] number of matched item
  * @param[out] $response->success[n] search result
  * @param[out] $response->success[n]['id'] item id of matched item
  * @param[out] $response->success[n]['matchfor'] bit flag represents what part of item matched
  */
 function execute(&$vars, &$response)
 {
     // parameter check
     $error =& $response->getError();
     if (count($vars) > 6) {
         $error->add(XNPERR_EXTRA_PARAM);
     }
     if (count($vars) < 6) {
         $error->add(XNPERR_MISSING_PARAM);
     }
     //
     if (isset($vars[0]) && strlen($vars[0]) > 32) {
         $error->add(XNPERR_INVALID_PARAM, 'too long parameter 1');
     }
     $ar = explode(':', $vars[1]);
     if (count($ar) < 2 || !in_array($ar[0], array('index', 'keyword'))) {
         $error->add(XNPERR_INVALID_PARAM, 'bad query parameter 2');
     }
     if (!is_int($vars[2]) && !ctype_digit($vars[2])) {
         $error->add(XNPERR_INVALID_PARAM, 'not integer parameter 2');
     }
     if (!is_int($vars[3]) && !ctype_digit($vars[3])) {
         $error->add(XNPERR_INVALID_PARAM, 'not integer parameter 3');
     }
     if (!in_array($vars[4], array('title', 'ext_id', 'last_modified_date', 'registration_date', 'creation_date'))) {
         $error->add(XNPERR_INVALID_PARAM, 'unknown sort key parameter 4');
     }
     if (!in_array($vars[5], array('asc', 'desc'))) {
         $error->add(XNPERR_INVALID_PARAM, 'unknown sort order parameter 5');
     }
     //
     if ($error->get(0)) {
         // return if parameter error
         $response->setResult(false);
         return;
     } else {
         $sessionid = $vars[0];
         $query = $vars[1];
         $start = $vars[2];
         $limit = $vars[3];
         $sortkey = $vars[4];
         $ascdesc = $vars[5];
     }
     list($result, $uid, $session) = $this->restoreSession($sessionid);
     if (!$result) {
         $response->setResult(false);
         $error->add(XNPERR_INVALID_SESSION);
         return false;
     }
     $response->setResult(false);
     // convert ($start, $limit, $sortkey, $ascdesc) to ($criteria, $join_sort_table)
     $criteria = new CriteriaCompo();
     $criteria->setOrder($ascdesc);
     $criteria->setStart($start);
     $criteria->setLimit($limit);
     switch ($sortkey) {
         case 'title':
             $join_sort_table = 'xoonips_item_title';
             $criteria->add(new Criteria('title_id', 0));
             $criteria->setSort('title');
             break;
         case 'ext_id':
             $join_sort_table = false;
             $criteria->setSort('doi');
             break;
         case 'last_modified_date':
             $join_sort_table = false;
             $criteria->setSort('last_update_date');
             break;
         case 'registration_date':
             $join_sort_table = false;
             $criteria->setSort('creation_date');
             break;
         case 'creation_date':
             $join_sort_table = false;
             $criteria->setSort(array('publication_year', 'publication_month', 'publication_mday'));
             break;
         default:
             $error->add(XNPERR_INVALID_PARAM, 'unknown sort key parameter 4');
             $response->setResult(false);
             return false;
             break;
     }
     // get valid item_type_ids -> $criteria
     $factory =& XooNIpsLogicFactory::getInstance();
     $logic =& $factory->create("getItemTypes");
     $vars = array($sessionid);
     $logic->execute($vars, $response);
     if ($response->getResult() == false) {
         return false;
     }
     $itemtypes = $response->getSuccess();
     if (count($itemtypes) == 0) {
         // no itemtype found. return empty array.
         $ar = array();
         $response->setSuccess($ar);
         $response->setResult(true);
         return true;
     }
     $itemtype_ids = array();
     foreach ($itemtypes as $itemtype) {
         $itemtype_ids[] = $itemtype->get('item_type_id');
     }
     $criteria->add(new Criteria('item_type_id', '(' . implode(',', $itemtype_ids) . ')', 'IN'));
     if (substr($query, 0, 6) == 'index:') {
         // index id -> search_cache_items
         $index_id = substr($query, 6);
         if (!ctype_digit($index_id)) {
             $error->add(XNPERR_INVALID_PARAM, "bad index id(index_id={$index_id})");
             $response->setResult(false);
             return false;
         }
         $criteria->add(new Criteria('index_id', $index_id));
         $index_handler =& xoonips_getormhandler('xoonips', 'index');
         $index = $index_handler->get($index_id);
         if (false == $index) {
             $error->add(XNPERR_NOT_FOUND, "index not found(index_id={$index_id})");
             $response->setResult(false);
             return false;
         }
         if (!$index_handler->getPerm($index_id, $uid, 'read')) {
             $error->add(XNPERR_ACCESS_FORBIDDEN, "forbidden(index_id={$index_id})");
             $response->setResult(false);
             return false;
         }
         // xoonips_index_item_link <- $join(xoonips_item_basic) <- $join2($join_sort_table)
         $index_item_link_handler =& xoonips_getormhandler('xoonips', 'index_item_link');
         $join = new XooNIpsJoinCriteria('xoonips_item_basic', 'item_id', 'item_id');
         if ($join_sort_table) {
             $join2 = new XooNIpsJoinCriteria($join_sort_table, 'item_id', 'item_id');
             $join->cascade($join2);
         }
         $index_item_links =& $index_item_link_handler->getObjects($criteria, false, '', false, $join);
         $item_compo_handler =& xoonips_getormcompohandler('xoonips', 'item');
         $search_cache_item_handler =& xoonips_getormhandler('xoonips', 'search_cache_item');
         $search_cache_items = array();
         foreach ($index_item_links as $index_item_link) {
             if (!$item_compo_handler->getPerm($index_item_link->get('item_id'), $uid, 'read')) {
                 continue;
             }
             // no read permission
             $search_cache_item = $search_cache_item_handler->create();
             $search_cache_item->set('item_id', $index_item_link->get('item_id'));
             $search_cache_item->set('matchfor_index', 1);
             $search_cache_item->set('matchfor_item', 0);
             $search_cache_item->set('matchfor_file', 0);
             $search_cache_items[] = $search_cache_item;
         }
         $response->setSuccess($search_cache_items);
         $response->setResult(true);
         return true;
     } else {
         if (substr($query, 0, 8) == 'keyword:') {
             $search_cache_id = $this->getSearchCacheIdByQuery($query);
             $search_cache_handler =& xoonips_getormhandler('xoonips', 'search_cache');
             $eventlog_handler =& xoonips_getormhandler('xoonips', 'event_log');
             if ($search_cache_id) {
                 $search_cache = $search_cache_handler->get($search_cache_id);
                 if ($search_cache === false) {
                     // maybe invalidated.
                     $search_cache_id = false;
                 } else {
                     $c = new CriteriaCompo();
                     $event_type_ids = array(ETID_INSERT_ITEM, ETID_UPDATE_ITEM, ETID_DELETE_ITEM, ETID_DELETE_GROUP, ETID_INSERT_GROUP_MEMBER, ETID_DELETE_GROUP_MEMBER, ETID_DELETE_INDEX, ETID_CERTIFY_ITEM, ETID_REJECT_ITEM, ETID_TRANSFER_ITEM);
                     $c->add(new Criteria('event_type_id', '(' . implode(',', $event_type_ids) . ')', 'in'));
                     $c->add(new Criteria("timestamp - unix_timestamp('" . $search_cache->get('timestamp') . "')", 0, '>='));
                     $c->setSort('timestamp');
                     $c->setOrder('desc');
                     $c->setLimit(1);
                     $event_logs =& $eventlog_handler->getObjects($c);
                     if (false === $event_logs) {
                         $response->setResult(false);
                         $error->add(XNPERR_SERVER_ERROR, "cannot get event logs");
                         return false;
                     } else {
                         if (!empty($event_logs)) {
                             $search_cache_id = false;
                             // delete old search results from search cache
                             $c = new CriteriaCompo(new Criteria('sess_id', $sessionid));
                             $c->add(new Criteria('unix_timestamp(timestamp)', $event_logs[0]->get('timestamp'), '<'));
                             $search_caches =& $search_cache_handler->getObjects($c);
                             if (false === $search_caches) {
                                 $response->setResult(false);
                                 $error->add(XNPERR_SERVER_ERROR, "cannot get search cache ids");
                                 return false;
                             }
                             $search_cache_item_handler =& xoonips_getormhandler('xoonips', 'search_cache_item');
                             foreach ($search_caches as $search_cache) {
                                 $id = $search_cache->get('search_cache_id');
                                 $this->deleteSearchCache($id);
                                 $search_cache_handler->delete($search_cache);
                                 $search_cache_item_handler->deleteAll(new Criteria('search_cache_id', $id));
                             }
                         }
                     }
                 }
             }
             if (!$search_cache_id) {
                 $search_cache = $search_cache_handler->create();
                 $search_cache->setVar('sess_id', $sessionid, true);
                 if (!$search_cache_handler->insert($search_cache)) {
                     $response->setResult(false);
                     $error->add(XNPERR_SERVER_ERROR, "cannot create search_cache_id");
                     return false;
                 }
                 $search_cache_id = $search_cache->get('search_cache_id');
                 $keyword = substr($query, 8);
                 $this->keywordSearch($error, $search_cache_id, $uid, $keyword);
                 if (!$eventlog_handler->recordQuickSearchEvent('all', $keyword)) {
                     $error->add(XNPERR_SERVER_ERROR, "cannot insert event");
                     $response->setResult(false);
                     return false;
                 }
             }
             //
             // access permission: ol_public && ( is_moderator || certify_state=certified) || ol_group_only && gid=gulink.gid && ( is_admin || certify_state==certified) || ol_private && uid=uid // how to reuse?
             // -> criteria
             $c = new CriteriaCompo();
             $c->add(new Criteria('open_level', OL_PUBLIC));
             $member_handler =& xoonips_gethandler('xoonips', 'member');
             if (!$member_handler->isModerator($uid)) {
                 $c->add(new Criteria('certify_state', CERTIFIED));
             }
             $groups_users_link_handler =& xoonips_getormhandler('xoonips', 'groups_users_link');
             $links =& $groups_users_link_handler->getObjects(new Criteria('uid', $uid));
             foreach ($links as $link) {
                 $c->add(new Criteria('open_level', OL_GROUP_ONLY), 'OR');
                 $c->add(new Criteria('gid', $link->get('gid')));
                 if (!$link->get('is_admin')) {
                     $c->add(new Criteria('certify_state', CERTIFIED));
                 }
             }
             $c->add(new Criteria('open_level', OL_PRIVATE), 'OR');
             $c->add(new Criteria('tx.uid', $uid));
             $criteria->add($c);
             $criteria->add(new Criteria('search_cache_id', $search_cache_id));
             $criteria->setGroupby('search_cache_item_id');
             // join:
             //   xoonips_search_cache_item  <-  $join(xoonips_index_item_link)
             //                              <-  $join2(xoonips_index)
             //                              <-  $join3(xoonips_item_basic)
             //                              <-  $join4($join_sort_table)
             $join = new XooNIpsJoinCriteria('xoonips_index_item_link', 'item_id', 'item_id', 'LEFT', 'txil');
             $join2 = new XooNIpsJoinCriteria('xoonips_index', 'index_id', 'index_id', 'LEFT', 'tx');
             $join3 = new XooNIpsJoinCriteria('xoonips_item_basic', 'item_id', 'item_id');
             $join4 = new XooNIpsJoinCriteria($join_sort_table, 'item_id', 'item_id');
             $join->cascade($join2, 'txil', true);
             $join->cascade($join3, 'xoonips_search_cache_item');
             if ($join_sort_table) {
                 $join->cascade($join4, 'xoonips_search_cache_item');
             }
             $search_cache_item_handler =& xoonips_getormhandler('xoonips', 'search_cache_item');
             $search_cache_items =& $search_cache_item_handler->getObjects($criteria, false, '', false, $join);
             if ($search_cache_items === false) {
                 $error->add(XNPERR_INVALID_PARAM, 'cannot get searched item');
                 $response->setResult(false);
                 return false;
             }
             $this->putSearchCache($query, $search_cache_id);
             $response->setSuccess($search_cache_items);
             $response->setResult(true);
             return true;
         } else {
             $error->add(XNPERR_INVALID_PARAM, "query must begin with index: or keyword:");
         }
     }
     if ($error->get()) {
         $response->setResult(false);
         return false;
     }
 }