Overview

Namespaces

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