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: if(!$this->get('security.context')->isGranted('OWNER', $wms)) {
75: throw new AccessDeniedException();
76: }
77: return array("wms" => $wms);
78: }
79:
80: 81: 82: 83: 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:
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: 205: 206: 207: 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: 233: 234: 235: 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: 254: 255: 256: 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: {
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: {
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: {
321: return array(
322: "form" => $form->createView(),
323: "slug" => $slug,
324: "instance" => $wmsinstance);
325: }
326: } else
327: {
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: 340: 341: 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: 419: 420: 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: