/**
  * Populates relations, such as
  *
  * - runtime dependency packages
  * - build dependency packages
  * - provided packages
  * - obsoleted packages
  * - suggested packages
  * - conflicting packages
  *
  * @param object extinfo which is a Package object
  * @param object package which is a com_meego_package object
  *
  */
 public function addRelations($extinfo = null, $package = null)
 {
     // check if package is referred in a relation
     // and update the relation record's 'to' field unless
     // it has been set already
     $qc = new midgard_query_constraint_group('AND');
     $qc->add_constraint(new midgard_query_constraint(new midgard_query_property('toname'), '=', new midgard_query_value($package->filename)));
     $qc->add_constraint(new midgard_query_constraint(new midgard_query_property('version'), '=', new midgard_query_value($package->version)));
     $q = new midgard_query_select(new midgard_query_storage('com_meego_package_relation'));
     $q->set_constraint($qc);
     $q->execute();
     $relations = $q->list_objects();
     if (!count($relations)) {
         $this->log('           package is not required by others');
     } else {
         // repo of the current package
         $repository_a = new com_meego_repository();
         $repository_a->get_by_id($package->repository);
         foreach ($relations as $relation) {
             if ($relation->to != 0) {
                 $this->log('           package is in relation but "to" field is already set. relation id: ' . $relation->id);
                 continue;
             }
             // get the related package object
             $related_package = new com_meego_package();
             $related_package->get_by_id($relation->from);
             // repo of the related package
             $repository_b = new com_meego_repository();
             $repository_b->get_by_id($related_package->repository);
             if ($repository_a->arch == $repository_b->arch) {
                 // we can safely update the to field of this relation
                 $this->log('           package is in relation with ' . $relation->from . ', update "to" field. relation id:' . $relation->id);
                 $_relation = new com_meego_package_relation($relation->guid);
                 $_relation->to = $package->id;
                 $_relation->update();
             }
         }
         unset($relations, $_relation);
     }
     if (is_array($extinfo->depends)) {
         /* delete relations that are no longer needed */
         $this->cleanRelations('requires', $extinfo->depends, $package);
         foreach ($extinfo->depends as $dependency) {
             $this->createRelation('requires', $dependency, $package);
         }
     }
     if (is_array($extinfo->buildDepends)) {
         /* delete relations that are no longer needed */
         $this->cleanRelations('buildrequires', $extinfo->buildDepends, $package);
         foreach ($extinfo->buildDepends as $dependency) {
             $this->createRelation('buildrequires', $dependency, $package);
         }
     }
     if (is_array($extinfo->provides)) {
         /* delete relations that are no longer needed */
         $this->cleanRelations('provides', $extinfo->provides, $package);
         foreach ($extinfo->provides as $provided) {
             $this->createRelation('provides', $provided, $package);
         }
     }
     if (is_array($extinfo->obsoletes)) {
         /* delete relations that are no longer needed */
         $this->cleanRelations('obsoletes', $extinfo->obsoletes, $package);
         foreach ($extinfo->obsoletes as $obsoleted) {
             $this->createRelation('obsoletes', $obsoleted, $package);
         }
     }
     if (is_array($extinfo->suggests)) {
         /* delete relations that are no longer needed */
         $this->cleanRelations('suggests', $extinfo->suggests, $package);
         foreach ($extinfo->suggests as $suggested) {
             $this->createRelation('suggests', $suggested, $package);
         }
     }
     if (is_array($extinfo->conflicts)) {
         /* delete relations that are no longer needed */
         $this->cleanRelations('conflicts', $extinfo->conflicts, $package);
         foreach ($extinfo->conflicts as $conflicted) {
             $this->createRelation('conflicts', $conflicted, $package);
         }
     }
 }
 /**
  * @todo: docs
  */
 public function get_search(array $args)
 {
     $this->data['search'] = '';
     $query = $this->request->get_query();
     if (isset($query['q']) && !empty($query['q'])) {
         $this->data['search'] = $query['q'];
         $this->data['packages'] = array();
         $packages = $this->search_packages($query);
         if (count($packages) == 1) {
             $package = $packages[0];
             // Relocate to package directly
             $this->mvc->head->relocate($this->mvc->dispatcher->generate_url('apps_by_name', array('os' => $package->repoos, 'version' => $package->repoosversion, 'ux' => $package->repoosux, 'basecategory' => self::determine_base_category($package), 'packagename' => $package->packagename), $this->request));
         } else {
             if (count($packages) > 1) {
                 foreach ($packages as $package) {
                     if (isset($this->data['packages'][$package->packagename])) {
                         continue;
                     }
                     $package->localurl = $this->mvc->dispatcher->generate_url('apps_by_name', array('os' => $package->repoos, 'version' => $package->repoosversion, 'ux' => $package->repoosux, 'basecategory' => self::determine_base_category($package), 'packagename' => $package->packagename), $this->request);
                     $this->data['packages'][$package->packagename] = $package;
                 }
             }
         }
     }
     $qb = com_meego_repository::new_query_builder();
     //TODO: add constraints for arch or release.
     $this->data['repositories'] = $qb->execute();
 }
 /**
  *
  */
 public function get_repository(array $args)
 {
     $qb = com_meego_repository::new_query_builder();
     $qb->add_constraint('disabledownload', '=', false);
     if (isset($args['project'])) {
         $qbproject = com_meego_project::new_query_builder();
         $qbproject->add_constraint('name', '=', $args['project']);
         $projects = $qbproject->execute();
         if (count($projects)) {
             $qb->add_constraint('project', '=', $projects[0]->id);
         }
         $this->data['projectname'] = $args['project'];
     }
     if (isset($args['repository'])) {
         $qb->add_constraint('name', '=', $args['repository']);
     }
     if (isset($args['arch'])) {
         $qb->add_constraint('arch', '=', $args['arch']);
     }
     $repositories = $qb->execute();
     if (count($repositories) == 0) {
         throw new midgardmvc_exception_notfound("Repository not found");
     }
     $this->data['repository'] = $repositories[0];
     $this->data['packages'] = array();
     $storage = new midgard_query_storage('com_meego_package');
     $q = new midgard_query_select($storage);
     $qc = new midgard_query_constraint(new midgard_query_property('repository', $storage), '=', new midgard_query_value($this->data['repository']->id));
     $q->set_constraint($qc);
     $q->add_order(new midgard_query_property('name', $storage), SORT_ASC);
     $q->execute();
     $packages = $q->list_objects();
     // by default noone can manage workflows
     $this->request->set_data_item('manage_workflows', false);
     $cnt = 0;
     foreach ($packages as $package) {
         // by default there are no posted forms
         $package->posts = false;
         ++$cnt % 2 == 0 ? $package->rawclass = 'even' : ($package->rawclass = 'odd');
         if (empty($package->title)) {
             $package->title = $package->name;
         }
         $package->localurl = $this->mvc->dispatcher->generate_url('package_instance', array('package' => $package->name, 'version' => $package->version, 'project' => $args['project'], 'repository' => $this->data['repository']->name, 'arch' => $this->data['repository']->arch), $this->request);
         // see if packages in this repo have forms submitted
         $storage = new midgard_query_storage('com_meego_package_forms_posted');
         $q = new midgard_query_select($storage);
         $q->set_constraint(new midgard_query_constraint(new midgard_query_property('packageguid'), '=', new midgard_query_value($package->guid)));
         $q->execute();
         // todo: what happens if a package has posts from many different
         // or workflows
         if ($q->get_results_count()) {
             $_url = $this->mvc->dispatcher->generate_url('package_posted_forms', array('package' => $package->guid), 'com_meego_packages');
             $package->posts = $_url;
         }
         $this->data['packages'][] = $package;
     }
     $user = $this->mvc->authentication->get_user();
     if ($user) {
         if ($user->is_admin()) {
             // admins can manage and create new workflows
             $this->request->set_data_item('manage_workflows', true);
             $this->request->set_data_item('create_form_url', $this->mvc->dispatcher->generate_url('form_create', array('parent' => $this->data['repository']->guid), 'midgardmvc_ui_forms'));
         }
         // get a list of forms
         $forms = null;
         $storage = new midgard_query_storage('midgardmvc_ui_forms_form');
         $q = new midgard_query_select($storage);
         $q->set_constraint(new midgard_query_constraint(new midgard_query_property('parent'), '=', new midgard_query_value($this->data['repository']->guid)));
         $q->execute();
         $items = $q->list_objects();
         foreach ($items as $item) {
             $form = $item;
             $form->edit_url = $this->mvc->dispatcher->generate_url('form_update', array('form' => $item->guid), 'midgardmvc_ui_forms');
             $forms[] = $form;
         }
         $this->request->set_data_item('forms', $forms);
     }
 }