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: 33: 34: 35:
36: class RepositoryController extends Controller
37: {
38:
39: 40: 41: 42: 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: 55: 56: 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: 69: 70: 71:
72: public function viewAction(WmsSource $wms)
73: {
74: return array("wms" => $wms);
75: }
76:
77: 78: 79: 80: 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:
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: 202: 203: 204: 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: 230: 231: 232: 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: 251: 252: 253: 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: {
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: {
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: {
318: return array(
319: "form" => $form->createView(),
320: "slug" => $slug,
321: "instance" => $wmsinstance);
322: }
323: } else
324: {
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: 337: 338: 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: 416: 417: 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: