Overview

Namespaces

  • Mapbender
    • Component
      • HTTP
    • CoreBundle
      • Command
      • Component
        • Exception
      • Controller
      • DataFixtures
        • ORM
      • DependencyInjection
      • Element
        • Type
      • Entity
      • EventListener
      • Extension
      • Form
        • DataTransformer
        • EventListener
        • Type
      • Security
      • Template
    • DrupalIntegrationBundle
      • DependencyInjection
      • Security
        • Authentication
          • Provider
          • Token
        • Authorization
          • Voter
        • Factory
        • Firewall
        • User
      • Session
    • KmlBundle
      • Element
    • ManagerBundle
      • Controller
      • Form
        • DataTransformer
        • Type
    • MonitoringBundle
      • Command
      • Component
      • Controller
      • DependencyInjection
      • Entity
      • EventListener
      • Form
    • PrintBundle
      • Component
      • Controller
    • WmcBundle
      • Component
        • Exception
      • Element
        • Type
      • Entity
      • Form
        • EventListener
        • Type
    • WmsBundle
      • Component
        • Exception
      • Controller
      • DependencyInjection
      • Element
        • Type
      • Entity
      • Event
      • Form
        • EventListener
        • Type
    • WmtsBundle
      • Component
        • Exception
      • Controller
      • Entity
      • Form
        • Type
  • None
  • PHP

Classes

  • RepositoryController
  • Overview
  • Namespace
  • Class
  • Tree
  • Deprecated
  • Todo
  • Download
  1: <?php
  2: 
  3: namespace Mapbender\WmsBundle\Controller;
  4: 
  5: use FOM\ManagerBundle\Configuration\Route as ManagerRoute;
  6: use Mapbender\CoreBundle\Component\Utils;
  7: use Mapbender\CoreBundle\Component\Exception\NotSupportedVersionException;
  8: use Mapbender\WmsBundle\Component\Exception\WmsException;
  9: use Mapbender\CoreBundle\Component\Exception\XmlParseException;
 10: use Mapbender\WmsBundle\Component\WmsCapabilitiesParser;
 11: use Mapbender\WmsBundle\Entity\WmsInstance;
 12: use Mapbender\WmsBundle\Entity\WmsInstanceLayer;
 13: use Mapbender\WmsBundle\Entity\WmsLayerSource;
 14: use Mapbender\WmsBundle\Entity\WmsSource;
 15: use Mapbender\WmsBundle\Form\Type\WmsInstanceInstanceLayersType;
 16: use Mapbender\WmsBundle\Form\Type\WmsSourceSimpleType;
 17: use Mapbender\WmsBundle\Form\Type\WmsSourceType;
 18: use Mapbender\WmsBundle\Form\Type\WmsInstanceType;
 19: use OwsProxy3\CoreBundle\Component\ProxyQuery;
 20: use OwsProxy3\CoreBundle\Component\CommonProxy;
 21: use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
 22: use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
 23: use Symfony\Bundle\FrameworkBundle\Controller\Controller;
 24: use Symfony\Component\HttpFoundation\Response;
 25: use Symfony\Component\Security\Acl\Domain\ObjectIdentity;
 26: use Symfony\Component\Security\Acl\Domain\UserSecurityIdentity;
 27: use Symfony\Component\Security\Acl\Permission\MaskBuilder;
 28: use Symfony\Component\Security\Core\Exception\AccessDeniedException;
 29: 
 30: 
 31: /**
 32:  * @ManagerRoute("/repository/wms")
 33:  *
 34:  * @author Christian Wygoda
 35:  */
 36: class RepositoryController extends Controller
 37: {
 38: 
 39:     /**
 40:      * @ManagerRoute("/new")
 41:      * @Method({ "GET" })
 42:      * @Template
 43:      */
 44:     public function newAction()
 45:     {
 46:         $form = $this->get("form.factory")->create(new WmsSourceSimpleType(),
 47:                                                    new WmsSource());
 48:         return array(
 49:             "form" => $form->createView()
 50:         );
 51:     }
 52: 
 53:     /**
 54:      * @ManagerRoute("/start")
 55:      * @Method({ "GET" })
 56:      * @Template("MapbenderWmsBundle:Repository:form.html.twig")
 57:      */
 58:     public function startAction()
 59:     {
 60:         $form = $this->get("form.factory")->create(new WmsSourceSimpleType(),
 61:                                                    new WmsSource());
 62:         return array(
 63:             "form" => $form->createView()
 64:         );
 65:     }
 66: 
 67:     /**
 68:      * @ManagerRoute("{wms}")
 69:      * @Method({ "GET"})
 70:      * @Template
 71:      */
 72:     public function viewAction(WmsSource $wms)
 73:     {
 74:         if(!$this->get('security.context')->isGranted('OWNER', $wms)) {
 75:             throw new AccessDeniedException();
 76:         }
 77:         return array("wms" => $wms);
 78:     }
 79: 
 80:     /**
 81:      * @ManagerRoute("/new")
 82:      * @Method({ "POST" })
 83:      * @Template("MapbenderWmsBundle:Repository:new.html.twig")
 84:      */
 85:     public function createAction()
 86:     {
 87:         $request = $this->get('request');
 88:         $wmssource_req = new WmsSource();
 89: 
 90:         $securityContext = $this->get('security.context');
 91:         $oid = new ObjectIdentity('class', 'Mapbender\CoreBundle\Entity\Source');
 92:         if(false === $securityContext->isGranted('CREATE', $oid)) {
 93:             throw new AccessDeniedException();
 94:         }
 95: 
 96:         $form = $this->get("form.factory")->create(new WmsSourceSimpleType(),
 97:                                                    $wmssource_req);
 98:         $form->bindRequest($request);
 99:         if($form->isValid())
100:         {
101:             $purl = parse_url($wmssource_req->getOriginUrl());
102:             if(!isset($purl['scheme']) || !isset($purl['host'])){
103:                 $this->get("logger")->debug("The url is not valid.");
104:                 $this->get('session')->setFlash('error', "The url is not valid.");
105:                 return $this->redirect($this->generateUrl(
106:                                         "mapbender_manager_repository_new",
107:                                         array(), true));
108:             }
109:             $proxy_config = $this->container->getParameter("owsproxy.proxy");
110:             $proxy_query = ProxyQuery::createFromUrl(trim($wmssource_req->getOriginUrl()),
111:                                                           $wmssource_req->getUsername(),
112:                                                           $wmssource_req->getPassword());
113:             if($proxy_query->getGetPostParamValue("request", true) === null)
114:             {
115:                 $proxy_query->addQueryParameter("request", "GetCapabilities");
116:             }
117:             if($proxy_query->getGetPostParamValue("service", true) === null)
118:             {
119:                 $proxy_query->addQueryParameter("service", "WMS");
120:             }
121:             $wmssource_req->setOriginUrl($proxy_query->getGetUrl());
122:             $proxy = new CommonProxy($proxy_config, $proxy_query);
123: 
124:             $wmssource = null;
125:             try
126:             {
127:                 $browserResponse = $proxy->handle();
128:                 $content = $browserResponse->getContent();
129:                 $doc = WmsCapabilitiesParser::createDocument($content);
130:                 $wmsParser = WmsCapabilitiesParser::getParser($doc);
131:                 $wmssource = $wmsParser->parse();
132:             } catch(\Exception $e)
133:             {
134:                 $this->get("logger")->debug($e->getMessage());
135:                 $this->get('session')->setFlash('error', $e->getMessage());
136:                 return $this->redirect($this->generateUrl(
137:                                         "mapbender_manager_repository_new",
138:                                         array(), true));
139:             }
140: 
141:             if(!$wmssource)
142:             {
143:                 $this->get("logger")->debug('Could not parse data for url "'
144:                         . $wmssource_req->getOriginUrl() . '"');
145:                 $this->get('session')->setFlash('error',
146:                                                 'Could not parse data for url "'
147:                         . $wmssource_req->getOriginUrl() . '"');
148:                 return $this->redirect($this->generateUrl(
149:                                         "mapbender_manager_repository_new",
150:                                         array(), true));
151:             }
152:             $wmsWithSameTitle = $this->getDoctrine()
153:                     ->getEntityManager()
154:                     ->getRepository("MapbenderWmsBundle:WmsSource")
155:                     ->findByTitle($wmssource->getTitle());
156: 
157:             if(count($wmsWithSameTitle) > 0)
158:             {
159:                 $wmssource->setAlias(count($wmsWithSameTitle));
160:             }
161: 
162:             $wmssource->setOriginUrl($wmssource_req->getOriginUrl());
163:             $rootlayer = $wmssource->getLayers()->get(0);
164:             $this->getDoctrine()->getEntityManager()->persist($rootlayer);
165:             $this->saveLayer($this->getDoctrine()->getEntityManager(),
166:                              $rootlayer);
167:             $this->getDoctrine()->getEntityManager()->persist($wmssource);
168:             $this->getDoctrine()->getEntityManager()->flush();
169: 
170:             // ACL
171:             $aclProvider = $this->get('security.acl.provider');
172:             $objectIdentity = ObjectIdentity::fromDomainObject($wmssource);
173:             $acl = $aclProvider->createAcl($objectIdentity);
174: 
175:             $securityContext = $this->get('security.context');
176:             $user = $securityContext->getToken()->getUser();
177:             $securityIdentity = UserSecurityIdentity::fromAccount($user);
178: 
179:             $acl->insertObjectAce($securityIdentity, MaskBuilder::MASK_OWNER);
180:             $aclProvider->updateAcl($acl);
181: 
182: 
183:             return $this->redirect($this->generateUrl(
184:                                     "mapbender_manager_repository_view",
185:                                     array(
186:                                 "sourceId" => $wmssource->getId()), true));
187:         }
188: 
189:         return array(
190:             'form' => $form->createView(),
191:             'form_name' => $form->getName());
192:     }
193: 
194:     private function saveLayer($em, $layer)
195:     {
196:         foreach($layer->getSublayer() as $sublayer)
197:         {
198:             $em->persist($sublayer);
199:             $this->saveLayer($em, $sublayer);
200:         }
201:     }
202: 
203:     /**
204:      * Removes a WmsSource
205:      *
206:      * @ManagerRoute("/{sourceId}/delete")
207:      * @Method({"GET"})
208:      */
209:     public function deleteAction($sourceId)
210:     {
211:         $wmssource = $this->getDoctrine()
212:                 ->getRepository("MapbenderWmsBundle:WmsSource")
213:                 ->find($sourceId);
214:         $wmsinstances = $this->getDoctrine()
215:                 ->getRepository("MapbenderWmsBundle:WmsInstance")
216:                 ->findBySource($sourceId);
217:         $em = $this->getDoctrine()->getEntityManager();
218:         $em->getConnection()->beginTransaction();
219:         foreach($wmsinstances as $wmsinstance)
220:         {
221:             $wmsinstance->remove($em);
222:             $em->flush();
223:         }
224:         $wmssource->remove($em);
225:         $em->flush();
226:         $em->getConnection()->commit();
227:         $this->get('session')->setFlash('success', "Your service has been deleted");
228:         return $this->redirect($this->generateUrl("mapbender_manager_repository_index"));
229:     }
230: 
231:     /**
232:      * Removes a WmsInstance
233:      *
234:      * @ManagerRoute("/{slug}/instance/{instanceId}/delete")
235:      * @Method({"GET"})
236:      */
237:     public function deleteInstanceAction($slug, $instanceId)
238:     {
239:         $instance = $this->getDoctrine()
240:                 ->getRepository("MapbenderCoreBundle:SourceInstance")
241:                 ->find($instanceId);
242:         $em = $this->getDoctrine()->getEntityManager();
243:         $em->getConnection()->beginTransaction();
244:         $instance->remove($em);
245:         $em->flush();
246:         $em->getConnection()->commit();
247:         $this->get('session')->setFlash('success',
248:                                         'Your source instance has been deleted.');
249:         return new Response();
250:     }
251: 
252:     /**
253:      * Edits, saves the WmsInstance
254:      *
255:      * @ManagerRoute("/instance/{slug}/{instanceId}")
256:      * @Template("MapbenderWmsBundle:Repository:instance.html.twig")
257:      */
258:     public function instanceAction($slug, $instanceId)
259:     {
260:         $wmsinstance = $this->getDoctrine()
261:             ->getRepository("MapbenderWmsBundle:WmsInstance")
262:             ->find($instanceId);
263: 
264:         if($this->getRequest()->getMethod() == 'POST')
265:         { //save
266:             $wmsinstance_req = new WmsInstance();
267:             $wmsinstance_req->setSource($wmsinstance->getSource());
268:             $form_req = $this->createForm(
269:                     new WmsInstanceInstanceLayersType(), $wmsinstance_req);
270:             $form_req->bindRequest($this->get('request'));
271:             $form = $this->createForm(
272:                     new WmsInstanceInstanceLayersType(), $wmsinstance);
273:             $form->bindRequest($this->get('request'));
274:             $wmsinstance->setTransparency(
275:                     Utils::getBool($wmsinstance_req->getTransparency()));
276:             $wmsinstance->setVisible(
277:                     Utils::getBool($wmsinstance_req->getVisible()));
278:             $wmsinstance->setOpacity(
279:                     Utils::getBool($wmsinstance_req->getOpacity()));
280:             $wmsinstance->setProxy(
281:                     Utils::getBool($wmsinstance_req->getProxy()));
282:             $wmsinstance->setTiled(
283:                     Utils::getBool($wmsinstance_req->getTiled()));
284:             foreach($wmsinstance->getLayers() as $layer)
285:             {
286:                 foreach($wmsinstance_req->getLayers() as $layer_tmp)
287:                 {
288:                     if($layer_tmp->getId() === $layer->getId())
289:                     {
290:                         $layer->setActive(Utils::getBool(
291:                                         $layer_tmp->getActive()));
292:                         $layer->setSelected(Utils::getBool(
293:                                         $layer_tmp->getSelected()));
294:                         $layer->setSelectedDefault(Utils::getBool(
295:                                         $layer_tmp->getSelectedDefault()));
296:                         $layer->setInfo(Utils::getBool(
297:                                         $layer_tmp->getInfo(), true));
298:                         $layer->setAllowinfo(Utils::getBool(
299:                                         $layer_tmp->getAllowinfo(), true));
300:                         break;
301:                     }
302:                 }
303:             }
304:             if($form->isValid())
305:             { //save
306:                 $em = $this->getDoctrine()->getEntityManager();
307:                 $em->getConnection()->beginTransaction();
308:                 $wmsinstance->generateConfiguration();
309:                 $em->persist($wmsinstance);
310:                 $em->flush();
311: 
312:                 $em->getConnection()->commit();
313: 
314:                 $this->get('session')->setFlash(
315:                         'success', 'Your Wms Instance has been changed.');
316:                 return $this->redirect($this->generateUrl(
317:                                         'mapbender_manager_application_edit',
318:                                         array("slug" => $slug)) . '#layersets');
319:             } else
320:             { // edit
321:                 return array(
322:                     "form" => $form->createView(),
323:                     "slug" => $slug,
324:                     "instance" => $wmsinstance);
325:             }
326:         } else
327:         { // edit
328:             $form = $this->createForm(
329:                     new WmsInstanceInstanceLayersType(), $wmsinstance);
330:             $fv = $form->createView();
331:             return array(
332:                 "form" => $form->createView(),
333:                 "slug" => $slug,
334:                 "instance" => $wmsinstance);
335:         }
336:     }
337: 
338:     /**
339:      * Changes the priority of WmsInstanceLayers
340:      *
341:      * @ManagerRoute("/{slug}/instance/{instanceId}/priority/{instLayerId}")
342:      */
343:     public function instanceLayerPriorityAction($slug, $instanceId, $instLayerId)
344:     {
345:         $number = $this->get("request")->get("number");
346:         $instLay = $this->getDoctrine()
347:                 ->getRepository('MapbenderWmsBundle:WmsInstanceLayer')
348:                 ->findOneById($instLayerId);
349: 
350:         if(!$instLay)
351:         {
352:             return new Response(json_encode(array(
353:                                 'error' => 'The wms instance layer with'
354:                                 . ' the id "' . $instanceId . '" does not exist.',
355:                                 'result' => '')), 200,
356:                             array('Content-Type' => 'application/json'));
357:         }
358:         if(intval($number) === $instLay->getPriority())
359:         {
360:             return new Response(json_encode(array(
361:                                 'error' => '',
362:                                 'result' => 'ok')), 200,
363:                             array('Content-Type' => 'application/json'));
364:         }
365:         $em = $this->getDoctrine()->getEntityManager();
366:         $instLay->setPriority($number);
367:         $em->persist($instLay);
368:         $em->flush();
369:         $query = $em->createQuery(
370:                 "SELECT il FROM MapbenderWmsBundle:WmsInstanceLayer il"
371:                 . " WHERE il.wmsinstance=:wmsi ORDER BY il.priority ASC");
372:         $query->setParameters(array("wmsi" => $instanceId));
373:         $instList = $query->getResult();
374: 
375:         $num = 0;
376:         foreach($instList as $inst)
377:         {
378:             if($num === intval($instLay->getPriority()))
379:             {
380:                 if($instLay->getId() === $inst->getId())
381:                 {
382:                     $num++;
383:                 } else
384:                 {
385:                     $num++;
386:                     $inst->setPriority($num);
387:                     $num++;
388:                 }
389:             } else
390:             {
391:                 if($instLay->getId() !== $inst->getId())
392:                 {
393:                     $inst->setPriority($num);
394:                     $num++;
395:                 }
396:             }
397:         }
398:         $em->getConnection()->beginTransaction();
399:         foreach($instList as $inst)
400:         {
401:             $em->persist($inst);
402:         }
403:         $em->flush();
404:         $wmsinstance = $this->getDoctrine()
405:                 ->getRepository("MapbenderCoreBundle:SourceInstance")
406:                 ->find($instanceId);
407:         $wmsinstance->generateConfiguration();
408:         $em->persist($wmsinstance);
409:         $em->flush();
410:         $em->getConnection()->commit();
411:         return new Response(json_encode(array(
412:                             'error' => '',
413:                             'result' => 'ok')), 200, array(
414:                     'Content-Type' => 'application/json'));
415:     }
416: 
417:     /**
418:      * Sets enabled/disabled for the WmsInstance
419:      *
420:      * @ManagerRoute("/instance/{slug}/enabled/{instanceId}")
421:      */
422:     public function instanceEnabledAction($slug, $instanceId)
423:     {
424:         $enabled = $this->get("request")->get("enabled");
425:         $wmsinstance = $this->getDoctrine()
426:                 ->getRepository("MapbenderWmsBundle:WmsInstance")
427:                 ->find($instanceId);
428:         if(!$wmsinstance)
429:         {
430:             return new Response(
431:                             json_encode(array(
432:                                 'error' => 'The wms instance with the id "' . $instanceId . '" does not exist.',
433:                                 'result' => 'ok')),
434:                             200,
435:                             array('Content-Type' => 'application/json'));
436:         } else
437:         {
438:             $enabled = $enabled === "true" ? true : false;
439:             $wmsinstance->setEnabled($enabled);
440:             $em = $this->getDoctrine()->getEntityManager();
441:             $em->persist($wmsinstance);
442:             $em->flush();
443:             return new Response(
444:                             json_encode(array(
445:                                 'error' => '',
446:                                 'result' => 'ok')),
447:                             200,
448:                             array('Content-Type' => 'application/json'));
449:         }
450:     }
451: 
452: }
453: 
Mapbender3 API documenation API documentation generated by ApiGen 2.8.0